commit 877637f1e597e9f5ca0a5ea58416a65f420af94c Author: John Cardinal Date: Thu Jun 28 23:08:13 2018 +0000 diff --git a/.vscode/launch.json b/.vscode/launch.json new file mode 100644 index 0000000..d7d6a30 --- /dev/null +++ b/.vscode/launch.json @@ -0,0 +1,46 @@ +{ + // Use IntelliSense to find out which attributes exist for C# debugging + // Use hover for the description of the existing attributes + // For further information visit https://github.com/OmniSharp/omnisharp-vscode/blob/master/debugger-launchjson.md + "version": "0.2.0", + "configurations": [ + { + "name": ".NET Core Launch (web)", + "type": "coreclr", + "request": "launch", + "preLaunchTask": "build", + // If you have changed target frameworks, make sure to update the program path. + "program": "${workspaceRoot}/bin/Debug/netcoreapp2.1/pecklist.dll", + "args": [], + "cwd": "${workspaceRoot}", + "stopAtEntry": false, + "internalConsoleOptions": "openOnSessionStart", + "launchBrowser": { + "enabled": true, + "args": "${auto-detect-url}", + "windows": { + "command": "cmd.exe", + "args": "/C start http://localhost:3000/index.html" + }, + "osx": { + "command": "open" + }, + "linux": { + "command": "xdg-open" + } + }, + "env": { + "ASPNETCORE_ENVIRONMENT": "Development" + }, + "sourceFileMap": { + "/Views": "${workspaceRoot}/Views" + } + }, + { + "name": ".NET Core Attach", + "type": "coreclr", + "request": "attach", + "processId": "${command:pickProcess}" + } + ] +} \ No newline at end of file diff --git a/.vscode/tasks.json b/.vscode/tasks.json new file mode 100644 index 0000000..27797e7 --- /dev/null +++ b/.vscode/tasks.json @@ -0,0 +1,16 @@ +{ + "version": "0.1.0", + "command": "dotnet", + "isShellCommand": true, + "args": [], + "tasks": [ + { + "taskName": "build", + "args": [ + "${workspaceRoot}/pecklist.csproj" + ], + "isBuildCommand": true, + "problemMatcher": "$msCompile" + } + ] +} \ No newline at end of file diff --git a/Controllers/AuthController.cs b/Controllers/AuthController.cs new file mode 100644 index 0000000..35ec414 --- /dev/null +++ b/Controllers/AuthController.cs @@ -0,0 +1,115 @@ +using System.Collections.Generic; +using Microsoft.AspNetCore.Mvc; +using GZTW.Pecklist.Models; +using GZTW.Pecklist.Util; +using System.Linq; +using System; + +//required to inject configuration in constructor +using Microsoft.Extensions.Configuration; + +namespace GZTW.Pecklist.Controllers +{ + //Authentication controller + public class AuthController : Controller + { + private readonly PecklistContext _context; + private readonly IConfiguration _configuration; + public AuthController(PecklistContext context, IConfiguration configuration)//these two are injected, see startup.cs + { + + _context = context; + //_configuration = configuration; + //guard clause + _configuration = configuration ?? throw new ArgumentNullException(nameof(configuration)); + } + + //AUTHENTICATE CREDS + //RETURN JWT + + [HttpPost("/authenticate")] + public JsonResult PostCreds(string login, string password) + { + int nFailedAuthDelay = 10000; + + if (string.IsNullOrWhiteSpace(login) || string.IsNullOrWhiteSpace(password)) + { + //Make a failed pw wait + System.Threading.Thread.Sleep(nFailedAuthDelay); + return Json(new { msg = "authentication failed", error = 1 }); + } + + var user = _context.User.SingleOrDefault(m => m.Login == login); + + if (user == null) + { + //Make a failed pw wait + System.Threading.Thread.Sleep(nFailedAuthDelay); + return Json(new { msg = "authentication failed", error = 1 }); + } + + //TODO: do a test login from postman, login as john, then copy pw into db + //string pwnewJohn=Hasher.hash(user.Salt,"XXX"); + //then login as Joyce and copy pw into db + // string pwnewJoyce=Hasher.hash(user.Salt,"XXX"); + + string hashed = Hasher.hash(user.Salt, password); + if (hashed == user.Password) + { + //get teh secret from appsettings.json + var secret = _configuration.GetSection("JWT").GetValue("secret"); + byte[] secretKey = System.Text.Encoding.ASCII.GetBytes(secret); + + var iat = new DateTimeOffset(DateTime.Now).ToUnixTimeSeconds(); + //NOTE: pecklist is appropriate for a really long expiry + var exp = new DateTimeOffset(DateTime.Now.AddDays(365)).ToUnixTimeSeconds(); + + //Generate a download token and store it with the user account and return it for the client + Guid g = Guid.NewGuid(); + string dlkey = Convert.ToBase64String(g.ToByteArray()); + dlkey = dlkey.Replace("=", ""); + dlkey = dlkey.Replace("+", ""); + + user.DlKey = dlkey; + user.DlKeyExp = exp; + _context.User.Update(user); + _context.SaveChanges(); + + + var payload = new Dictionary() + { + { "iat", iat.ToString() }, + { "exp", exp.ToString() }, + { "iss", "GZTW_Pecklist" }, + { "id", user.Id.ToString() } + }; + + + //NOTE: probably don't need Jose.JWT as am using Microsoft jwt stuff to validate routes so it should also be able to + //issue tokens as well, but it looked cmplex and this works so unless need to remove in future keeping it. + string token = Jose.JWT.Encode(payload, secretKey, Jose.JwsAlgorithm.HS256); + //string jsonDecoded = Jose.JWT.Decode(token, secretKey); + + return Json(new + { + ok = 1, + issued = iat, + expires = exp, + token = token, + dlkey = dlkey, + name = user.Name, + id = user.Id + }); + } + else + { + //Make a failed pw wait + System.Threading.Thread.Sleep(nFailedAuthDelay); + return Json(new { msg = "authentication failed", error = 1 }); + } + } + + //------------------------------------------------------ + + }//eoc +}//eons \ No newline at end of file diff --git a/Controllers/SyncController.cs b/Controllers/SyncController.cs new file mode 100644 index 0000000..acf9a4f --- /dev/null +++ b/Controllers/SyncController.cs @@ -0,0 +1,456 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Threading.Tasks; +using Microsoft.AspNetCore.Http; +using Microsoft.AspNetCore.Mvc; +using Microsoft.AspNetCore.Authorization; +using Microsoft.EntityFrameworkCore; +using GZTW.Pecklist.Models; +using GZTW.Pecklist.Util; +using Newtonsoft.Json; +using Newtonsoft.Json.Linq; +using Microsoft.Extensions.Logging; + +namespace GZTW.Pecklist.Controllers +{ + [Produces("application/json")]//forces all responses to be json + [Route("api/sync")] + [Authorize] + public class SyncController : Controller + { + private readonly PecklistContext _ct; + private readonly ILogger _logger; + + public SyncController(PecklistContext context, ILogger logger) + { + _ct = context; + + //guard clause + _logger = logger ?? throw new ArgumentNullException(nameof(logger)); + } + + + + // POST: api/sync + [HttpPost] + public ActionResult PostList([FromBody] JArray jclient) + { + //TODO: Might need a lock flag in db here just in case of duelling updates + + + //Get list from server + ListData l = _ct.ListData.First(c=>c.Id == 1); + + //client has no data, send them the latest data + if (jclient == null) + { + return Ok(l.TheList); + } + + JArray jserver = JArray.Parse(l.TheList); + JArray jnew = doSync(jclient, jserver); + + l.TheList = jnew.ToString(); + _ct.ListData.Update(l); + _ct.SaveChanges(); + + return Ok(l.TheList); + } + + + + + //////////////////////////////////////////////////////////////////////// + // SYNCHRONIZE + //////////////////////////////////////////////////////////////////////// + + /* + SYNC STRATEGY + =-=-=-=-=-=-= + + NEW ITEMS: + client record is iterated looking for id that starts with the string "NEW_". If any are found the master rev is incremented and new items + are added with a proper ID. + + DELETED ITEMS: + Server record is itereated looking for deleted items (items with priority -1), if any are + found master rev is incremented (unless it was already) then they are removed from the master list. + + UPDATE + Compare client record to master record, compare list name for a change, then find all items that have the same ID but different user editable values, + if any found update master rev if not done already, make master changed items match client changed items, update master. + + RETURN: + Finally, if master list has changed, it is saved to db. Master list is then returned returned to client. + + */ + + + ///////////////////////////////////////////// + // Synchronize the two lists, return the new + // + private JArray doSync(JArray jclient, JArray jserver) + { + _logger.LogInformation(LoggingEvents.SyncList, "Synchronize list"); + + //Iterate the client's lists looking for changes + foreach (JObject l in jclient) + { + //track if master v is incremented (non zero) + long newListVersion = 0; + + var listId = (string)l["id"]; + + //Is this an entirely new list? + if (listId.StartsWith("NEW_")) + { + //yes this is a new list, add it and go to the next + addNewList(l, jserver); + continue; + } + + + //bugbug: this will bomb if client syncs with a list that was deleted (which should be entirely ignored) + + ListHeaderData oldListHeader = getListHeaderData(listId, jserver); + if (oldListHeader.v == -999) + { + //list isn't at the server, was deleted so go to next list and ignore it + continue; + } + + //Has this list been deleted? + long newListV = (long)l["v"]; + if (l["deleted"] != null && newListV == oldListHeader.v) + { + removeList(listId, jserver); + continue; + } + + + + //Has the name changed? + string newListName = (string)l["name"]; + long newListNameV = (long)l["name_v"]; + + //if names differ but name_v are the same then the client changed the name + if (newListName != oldListHeader.name && oldListHeader.name_v == newListNameV) + { + + if (0 == newListVersion) + newListVersion = incrementListVersion(listId, jserver); + renameList(listId, newListName, jserver); + + } + + + //Existing list, lets see if there are any changes required + + //iterate this client list's items + foreach (JObject citem in l["items"]) + { + string itemId = (string)citem["id"]; + int itemPriority = (int)citem["priority"]; + string itemText = (string)citem["text"]; + bool itemCompleted = (bool)citem["completed"]; + + + //New item and not deleted? + if (itemId.StartsWith("NEW_") && itemPriority != -1) + { + if (0 == newListVersion) + newListVersion = incrementListVersion(listId, jserver); + addNewListItem(listId, citem, jserver); + continue; + } + + //check if deleted + if (itemPriority == -1) + { + if (0 == newListVersion) + newListVersion = incrementListVersion(listId, jserver); + removeListItem(listId, itemId, jserver); + continue; + } + + + //check if changed or removed (sitem=null) + JObject sitem = getListItem(listId, itemId, jserver); + + if (sitem != null && ((string)sitem["text"] != itemText || (int)sitem["priority"] != itemPriority || (bool)sitem["completed"] != itemCompleted)) + { + //replace server item with client item + if (0 == newListVersion) + newListVersion = incrementListVersion(listId, jserver); + + //make a replacement item + JObject ritem = new JObject(); + ritem["id"] = itemId; + ritem["completed"] = itemCompleted; + ritem["text"] = itemText; + ritem["priority"] = itemPriority; + ritem["v"] = newListVersion; + + //replace it + replaceListItem(listId, itemId, ritem, jserver); + continue; + } + } + } + //completed, return the synced list + return jserver; + } + + + //////////////////////////////////////////////////////////////////////// + // SYNC UTILITIES + //////////////////////////////////////////////////////////////////////// + + + //////////////////////////////////////////// + // Increment a server list's version number + // + private long incrementListVersion(string listId, JArray jserver) + { + foreach (JObject slist in jserver) + { + if (((string)slist["id"]) == listId) + { + long listversion = (long)slist["v"]; + listversion++; + slist["v"] = listversion; + return listversion; + } + } + throw new System.ArgumentNullException("listId[" + listId + "]", "SyncController::incrementListVersion -> List id not found in server docs lists"); + } + + + //////////////////////////////////////////// + // Get a list item from the server + // + private JObject getListItem(string listId, string itemId, JArray jserver) + { + + foreach (JObject slist in jserver) + { + if (((string)slist["id"]) == listId) + { + foreach (JObject sitem in slist["items"]) + { + if ((string)sitem["id"] == itemId) + { + return sitem; + } + } + } + } + return null;//not exceptional, client has item that other user deleted + + //throw new System.ArgumentException("SyncController::getListItem -> List item[" + listId + "][" + itemId + "] not found in servers lists"); + } + + + //////////////////////////////////////////// + // Get a list "header" from the server + // + private ListHeaderData getListHeaderData(string listId, JArray jserver) + { + + foreach (JObject slist in jserver) + { + if (((string)slist["id"]) == listId) + { + ListHeaderData lnd = new ListHeaderData(); + lnd.name = (string)slist["name"]; + lnd.name_v = (long)slist["name_v"]; + lnd.v = (long)slist["v"]; + return lnd; + } + } + + //Doesn't exist, probably deleted previously and attempting to sync a deleted list + return new ListHeaderData() { v = -999 }; + } + + private class ListHeaderData + { + public long name_v { get; set; } + public string name { get; set; } + public long v { get; set; } + + } + + + //////////////////////////////////////////// + //Rename a list + // + private void renameList(string listId, string newName, JArray jserver) + { + _logger.LogInformation(LoggingEvents.RenameList, $"Rename list id {listId} to {newName}"); + foreach (JObject slist in jserver) + { + if (((string)slist["id"]) == listId) + { + slist["name"] = newName; + slist["name_v"] = slist["v"]; + } + } + + } + + //////////////////////////////////////////// + // Clean up and ID a client list item + // + private JObject createServerReadyListItemFromClientListItem(JObject citem) + { + JObject sitem = new JObject(); + sitem["id"] = Util.ShortId.Generate(); + sitem["completed"] = (bool)citem["completed"]; + sitem["text"] = (string)citem["text"]; + sitem["v"] = 1; + sitem["priority"] = (int)citem["priority"]; + return sitem; + } + + + //////////////////////////////////////////// + //Add a new list item from the client + // + private void addNewListItem(string listId, JObject citem, JArray jserver) + { + _logger.LogInformation(LoggingEvents.InsertItem, "addNewListItem"); + //NOTE: new list item should have starting version number equal to + //server list's master v value + JObject sitem = createServerReadyListItemFromClientListItem(citem); + foreach (JObject slist in jserver) + { + if (((string)slist["id"]) == listId) + { + ((JArray)slist["items"]).Add(sitem); + } + } + + } + + //////////////////////////////////////////// + // Replace a list item from the client + // + private void replaceListItem(string listId, string itemId, JObject citem, JArray jserver) + { + removeListItem(listId, itemId, jserver); + addNewListItem(listId, citem, jserver); + } + + + //////////////////////////////////////////// + //Remove list item + // + private void removeListItem(string listId, string listItemId, JArray jserver) + { + _logger.LogInformation(LoggingEvents.DeleteItem, $"Remove list item - list id {listId} listItemId {listItemId}"); + + foreach (JObject slist in jserver) + { + if (((string)slist["id"]) == listId) + { + int nRemoveAt = -1; + JArray sitems = (JArray)slist["items"]; + for (int i = 0; i < sitems.Count; i++) + { + if ((string)sitems[i]["id"] == listItemId) + { + nRemoveAt = i; + break; + } + } + if (nRemoveAt == -1) + { + _logger.LogWarning(LoggingEvents.DeleteItem, $"Remove list item NOT FOUND - list id {listId} listItemId {listItemId}"); + }else{ + sitems.RemoveAt(nRemoveAt); + } + return; + } + } + } + + + + /////////////////////////////////////////// + //Add a new list from the client + // + private void addNewList(JObject clist, JArray jserver) + { + _logger.LogInformation(LoggingEvents.AddList, "Add new list"); + + //NOTE: New lists start at version 1 for everything + + JObject slist = new JObject(); + + //set list headers + slist["id"] = Util.ShortId.Generate(); + slist["name"] = clist["name"]; + slist["name_v"] = 1; + slist["v"] = 1; + + //copy over the list data + JArray sitems = new JArray(); + foreach (JObject citem in clist["items"]) + { + sitems.Add(createServerReadyListItemFromClientListItem(citem)); + } + + slist["items"] = sitems; + jserver.Add(slist); + } + + + //////////////////////////////////////////// + // Remove list + // + private void removeList(string listId, JArray jserver) + { + _logger.LogInformation(LoggingEvents.DeleteList, $"Remove list {listId}"); + + int nRemoveAt = -1; + + for (int i = 0; i < jserver.Count; i++) + { + if ((string)jserver[i]["id"] == listId) + { + nRemoveAt = i; + break; + } + } + jserver.RemoveAt(nRemoveAt); + return; + } + + + + + //----------------- + + + #region LoggingEvents + public class LoggingEvents + { + public const int SyncList = 1000; + public const int RenameList = 1001; + public const int GetItem = 1002; + public const int InsertItem = 1003; + public const int UpdateItem = 1004; + public const int DeleteItem = 1005; + public const int AddList = 1006; + public const int DeleteList = 1007; + + public const int GetItemNotFound = 4000; + public const int UpdateItemNotFound = 4001; + } + #endregion + + //------------- + } +} \ No newline at end of file diff --git a/Controllers/ValuesController.cs b/Controllers/ValuesController.cs new file mode 100644 index 0000000..48aaf46 --- /dev/null +++ b/Controllers/ValuesController.cs @@ -0,0 +1,46 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Threading.Tasks; +using Microsoft.AspNetCore.Mvc; +using Microsoft.AspNetCore.Authorization; + +namespace GZTW.Pecklist.Controllers +{ + [Route("api/[controller]")] + public class ValuesController : Controller + { + // GET api/values + [HttpGet] + [Authorize] + public IEnumerable Get() + { + return new string[] { "value1", "value2" }; + } + + // GET api/values/5 + [HttpGet("{id}")] + public string Get(int id) + { + return "value"; + } + + // POST api/values + [HttpPost] + public void Post([FromBody]string value) + { + } + + // PUT api/values/5 + [HttpPut("{id}")] + public void Put(int id, [FromBody]string value) + { + } + + // DELETE api/values/5 + [HttpDelete("{id}")] + public void Delete(int id) + { + } + } +} diff --git a/Models/ApiError.cs b/Models/ApiError.cs new file mode 100644 index 0000000..b5da7ae --- /dev/null +++ b/Models/ApiError.cs @@ -0,0 +1,26 @@ +using System; + +namespace GZTW.Pecklist.Models +{ + public class ApiError + { + public int code { get; set; } + public string message { get; set; } + //public string type { get; set; } + public string source { get; set; } + public string helpurl { get; set; } + + + public static ApiError generalError(string msg, string src) + { + return new ApiError { code = 100, helpurl = "peck.ayanova.com", message = msg, source = src }; + } + } +} +/* + +codes +100 = general error until we have more specific ones + + + */ diff --git a/Models/ListData.cs b/Models/ListData.cs new file mode 100644 index 0000000..39a6f2e --- /dev/null +++ b/Models/ListData.cs @@ -0,0 +1,12 @@ +using System; +using System.Collections.Generic; + +namespace GZTW.Pecklist.Models +{ + public partial class ListData + { + public long Id { get; set; } + public string TheList { get; set; } + + } +} diff --git a/Models/PecklistContext.cs b/Models/PecklistContext.cs new file mode 100644 index 0000000..07cb6f4 --- /dev/null +++ b/Models/PecklistContext.cs @@ -0,0 +1,67 @@ +using System; +using Microsoft.EntityFrameworkCore; +using Microsoft.EntityFrameworkCore.Metadata; +//using pecklist.Util; +using Microsoft.Extensions.Logging; + +namespace GZTW.Pecklist.Models +{ + public partial class PecklistContext : DbContext + { + + + public virtual DbSet User { get; set; } + public virtual DbSet ListData { get; set; } + + public PecklistContext(DbContextOptions options) : base(options) + { } + + + protected override void OnModelCreating(ModelBuilder modelBuilder) + { + + modelBuilder.Entity(entity => + { + entity.ToTable("user"); + + entity.Property(e => e.Id).HasColumnName("id"); + + entity.Property(e => e.Login) + .IsRequired() + .HasColumnName("login") + .HasColumnType("text"); + + entity.Property(e => e.Name) + .IsRequired() + .HasColumnName("name") + .HasColumnType("text"); + + entity.Property(e => e.DlKey) + .HasColumnName("dlkey") + .HasColumnType("text"); + + entity.Property(e => e.DlKeyExp) + .HasColumnName("dlkeyexp") + .HasColumnType("integer"); + }); + + modelBuilder.Entity(entity => + { + entity.ToTable("listdata"); + + entity.Property(e => e.Id).HasColumnName("id"); + + entity.Property(e => e.TheList) + .IsRequired() + .HasColumnName("thelist") + .HasColumnType("text"); + + + }); + + + + //----------- + } + } +} \ No newline at end of file diff --git a/Models/User.cs b/Models/User.cs new file mode 100644 index 0000000..9b8bac7 --- /dev/null +++ b/Models/User.cs @@ -0,0 +1,17 @@ +using System; +using System.Collections.Generic; + +namespace GZTW.Pecklist.Models +{ + public partial class User + { + public long Id { get; set; } + public string Name { get; set; } + public string Login { get; set; } + public string Password { get; set; } + public string Salt { get; set; } + public string DlKey { get; set; } + public long? DlKeyExp { get; set; } + + } +} diff --git a/Program.cs b/Program.cs new file mode 100644 index 0000000..62ac0bb --- /dev/null +++ b/Program.cs @@ -0,0 +1,31 @@ +using System; +using System.Collections.Generic; +using System.IO; +using System.Linq; +using System.Threading.Tasks; +using Microsoft.AspNetCore; +using Microsoft.AspNetCore.Hosting; +using Microsoft.Extensions.Configuration; +using Microsoft.Extensions.Logging; + +namespace GZTW.Pecklist +{ + public class Program + { + public static void Main(string[] args) + { + BuildWebHost(args).Run(); + } + + public static IWebHost BuildWebHost(string[] args) => + WebHost.CreateDefaultBuilder(args) + .UseUrls("http://*:3000") + .CaptureStartupErrors(true) + .UseSetting("detailedErrors", "true") + .UseKestrel() + .UseContentRoot(System.IO.Directory.GetCurrentDirectory()) + .UseIISIntegration() + .UseStartup() + .Build(); + } +} diff --git a/Startup.cs b/Startup.cs new file mode 100644 index 0000000..d5ec55b --- /dev/null +++ b/Startup.cs @@ -0,0 +1,109 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Threading.Tasks; +using Microsoft.AspNetCore.Builder; +using Microsoft.AspNetCore.Hosting; +using Microsoft.Extensions.Configuration; +using Microsoft.Extensions.DependencyInjection; +using Microsoft.Extensions.Logging; +using Microsoft.Extensions.Options; + +using Microsoft.EntityFrameworkCore; +using GZTW.Pecklist.Models; +using GZTW.Pecklist.Util; +using Microsoft.AspNetCore.Authentication.JwtBearer; +using Microsoft.IdentityModel.Tokens; +using Microsoft.AspNetCore.Authentication; + +namespace GZTW.Pecklist +{ + public class Startup + { + public Startup(IHostingEnvironment env) + { + var builder = new ConfigurationBuilder() + .SetBasePath(env.ContentRootPath) + .AddJsonFile("appsettings.json", optional: false, reloadOnChange: true) + .AddJsonFile($"appsettings.{env.EnvironmentName}.json", optional: true) + .AddEnvironmentVariables(); + Configuration = builder.Build(); + } + + public IConfigurationRoot Configuration { get; } + + // This method gets called by the runtime. Use this method to add services to the container. + public void ConfigureServices(IServiceCollection services) + { + + services.AddDbContext(options => options.UseSqlite(Configuration.GetConnectionString("thedb"))); + + //Added this so that can access configuration from anywhere else + //See authcontroller for usage + services.AddSingleton(Configuration); + + services.AddMvc(); + + //get the key from the appsettings.json file + var secretKey = Configuration.GetSection("JWT").GetValue("secret"); + var signingKey = new SymmetricSecurityKey(System.Text.Encoding.ASCII.GetBytes(secretKey)); + + services.AddAuthentication(options => + { + options.DefaultAuthenticateScheme = JwtBearerDefaults.AuthenticationScheme; + options.DefaultChallengeScheme = JwtBearerDefaults.AuthenticationScheme; + }).AddJwtBearer(options => + { + // options.AutomaticAuthenticate = true; + // options.AutomaticChallenge = true; + options.TokenValidationParameters = new TokenValidationParameters + { + // Token signature will be verified using a private key. + ValidateIssuerSigningKey = true, + RequireSignedTokens = true, + IssuerSigningKey = signingKey, + ValidateIssuer = true, + ValidIssuer = "GZTW_Pecklist", + ValidateAudience = false, + // ValidAudience = "https://yourapplication.example.com", + + // Token will only be valid if not expired yet, with 5 minutes clock skew. + // ValidateLifetime = true, + // RequireExpirationTime = true, + // ClockSkew = new TimeSpan(0, 5, 0), + }; + }); + + } + + public void Configure(IApplicationBuilder app, IHostingEnvironment env, ILoggerFactory loggerFactory, PecklistContext dbContext) + { + if (env.IsDevelopment()) + { + app.UseDeveloperExceptionPage(); + } + + loggerFactory.AddConsole(Configuration.GetSection("Logging")); + loggerFactory.AddDebug(); + app.UseDefaultFiles(); + app.UseStaticFiles(new StaticFileOptions + { + OnPrepareResponse = context => + { + if (context.File.Name == "index.html") + { + context.Context.Response.Headers.Add("Cache-Control", "no-cache, no-store"); + context.Context.Response.Headers.Add("Expires", "-1"); + } + } + }); + app.UseAuthentication(); + app.UseMvc(); + + //Check schema + Schema.CheckAndUpdate(dbContext); + + + } + } +} diff --git a/appsettings.Development.json b/appsettings.Development.json new file mode 100644 index 0000000..d26d688 --- /dev/null +++ b/appsettings.Development.json @@ -0,0 +1,10 @@ +{ + "Logging": { + "IncludeScopes": false, + "LogLevel": { + "Default": "Warning", + "System": "Warning", + "Microsoft": "Warning" + } + } +} diff --git a/appsettings.json b/appsettings.json new file mode 100644 index 0000000..e463e30 --- /dev/null +++ b/appsettings.json @@ -0,0 +1,21 @@ +{ + "Logging": { + "IncludeScopes": false, + "Debug": { + "LogLevel": { + "Default": "Warning" + } + }, + "Console": { + "LogLevel": { + "Default": "Warning" + } + } + }, + "ConnectionStrings": { + "thedb": "Datasource=./db/pecklist.sqlite;" + }, + "JWT": { + "secret": "-------Nothing8utTheRain!-------" + } +} \ No newline at end of file diff --git a/db/pecklist.sqlite b/db/pecklist.sqlite new file mode 100644 index 0000000..057a863 Binary files /dev/null and b/db/pecklist.sqlite differ diff --git a/notes/algorithm b/notes/algorithm new file mode 100644 index 0000000..35dc16c --- /dev/null +++ b/notes/algorithm @@ -0,0 +1,107 @@ +OLD Backend algorithm: + + /* + SYNC STRATEGY + =-=-=-=-=-=-= + + NEW ITEMS: + client record is iterated looking for non id or versioned items meaning newly added. If any are found the master rev is incremented and new items + are added. + + DELETED ITEMS: + Server record is itereated looking for deleted items (not on the client's list and are older revision than the client version), if any are + found master rev is incremented (unless it was already) then they are removed from the master list. + + UPDATE + Compare client record to master record, compare list name for a change, then find all items that have the same ID but different user editable values, if any found update master rev + if not done already, make master changed items match client changed items, update master. + + RETURN: + Finally, if master list has changed, it is saved to db then it is returned to user otherwise {nochange:1} or something is returned. + */ + + + +NEW ALGORITHM +Basically the same, except it will sync all lists on the device at once, so the routes need to take a list of lists of listitems as a chunk, not just a single list + + + +OLD ROUTES +=-=-=-=-=-= + +//POST - GET AN AUTHENTICATION TOKEN +router.route('/authenticate') + + +//GET USERS LISTS +// get all the lists for username specified +router.route('/mylists') + + +//GET A LIST OBJECT +// get the list object for id specified . +router.route('/list/:listid') + + +//POST - CREATE / SYNC A LIST +router.route('/list') + + +//DELETE - REMOVE A LIST +router.route('/list') + + +//DOWNLOAD - download all data +router.route('/mylists/download_all') + + +NEW ROUTES +=-=-=-=-=- +Since there is so little data overall in these lists, we are just going to assume all lists on all devices. +A Sync operation just sends the whole graph and gets the whole graph back, it's stored in a single field in sqlite table + +If a user doesn't want to see a list maybe it's filtered out at the client view + +Authenticate - POST + + +/user - post get + Gets and sets the users list subscriptions + +/sync + POST - + client posts their entire subscribed list graph at once, + the return is the entire user's list graph after synced at server + new lists are also created via this mechanism (at client first) + If a client is just getting lists (for example in a first run scenario) they just post an empty list graph + GET - (no get? Post an empty list if you want to get all the user's lists) + + + + +NEW List data object graph: + +{ + + lists:[ + Name:listname, + id:ShortIdString, + name_v:integer, + v:integer, + items:[ + id: ShortIdString or empty if new and not assigned an id yet, + completed: bool, + text:, + v:incrementing_long, + priority:[int 0-3] + + ] +] +} + + +https://github.com/tastejs/todomvc/blob/gh-pages/examples/jquery/js/app.js +https://github.com/tastejs/todomvc/blob/master/examples/jquery/index.html + + diff --git a/notes/notes b/notes/notes new file mode 100644 index 0000000..0c03537 --- /dev/null +++ b/notes/notes @@ -0,0 +1,63 @@ + +8750e825f27d77a16755a7b14a9622fe6d4653ceaab2dd5645bbc89b5702fa1d +********************************************* +Updating Microsoft CODE editor +Download the .deb file for 64 bit +execute it +sudo dpkg -i code_1.8.1-1482159060_i386.deb + + + +HANDLEBARS +=-=-=-=-=- +Install: +sudo npm install -g handlebars + +Build handlebars template: +handlebars -m wwwroot/js/templates/> wwwroot/js/templates/templates.js + + + + +3rd party Packages used: +JWT JSON web token support using jose-jwt found here: +https://jwt.io/#libraries + +Mailkit (supposedly system.net.mail will be ported in v2.0 of .net core but for now mailkit is the shit): + + + + + +DEVICE METRICS LIST +https://material.io/devices/ + +John phone 411px wide (dp) +Joyce s7 360px wide (dp) + + +*********************** +HOW TO DEPLOY TO IIS +https://stackify.com/how-to-deploy-asp-net-core-to-iis/ + +1) SET VERSION + +RENAME ?plvx.x parameter in index.html to the new version so all files update on mobile + +2) PUBLISH +publish command line from rockfishCore folder: + +//this will build a release version which is what we use on the server now +dotnet publish -c Release -o ./../plpublish/ + +//This is what I have seen online, not sure why the -f is necessary or useful, the build is the exact same size as above, have a question in to stackoverflow about it +dotnet publish -f netcoreapp2.1 -c Release -o ./../plpublish/ + +//if need a debug version +dotnet publish -o ./../plpublish/ + +3) COPY +Copy over to production server, only need the .dll and the wwwroot folder contents, +remember not to delete the folders on the server only replace their contents because there are Windows file permissions set + + diff --git a/notes/todo b/notes/todo new file mode 100644 index 0000000..139597f --- /dev/null +++ b/notes/todo @@ -0,0 +1,2 @@ + + diff --git a/pecklist.csproj b/pecklist.csproj new file mode 100644 index 0000000..7db8281 --- /dev/null +++ b/pecklist.csproj @@ -0,0 +1,17 @@ + + + netcoreapp2.1 + + + + + + + + + + + + + + \ No newline at end of file diff --git a/util/FoodooImporter.cs b/util/FoodooImporter.cs new file mode 100644 index 0000000..9034405 --- /dev/null +++ b/util/FoodooImporter.cs @@ -0,0 +1,86 @@ +using System; +using System.Text; +using System.Threading.Tasks; +using System.Collections.Generic; +using System.Linq; +using Microsoft.EntityFrameworkCore; +using GZTW.Pecklist.Models; +using Newtonsoft.Json; +using Newtonsoft.Json.Linq; +using System.IO; + +namespace GZTW.Pecklist.Util +{ + public static class FoodooImporter + { + public static void Import(PecklistContext ct) + { + //open and read in the GZListServerBackup.bak file into a json object + //https://www.newtonsoft.com/json/help/html/LINQtoJSON.htm + string sfoo = GetBackupFile(); + JArray jin = JArray.Parse(sfoo); + JArray jout = new JArray(); + + foreach (JObject i in jin) + { + JObject o = new JObject(); + o["name"] = (string)i["name"]; + o["id"] = Util.ShortId.Generate(); + o["name_v"] = (long)i["name_v"]; + o["v"] = (long)i["v"]; + JArray oitems = new JArray(); + foreach (JObject l in i["items"]) + { + JObject oitem = new JObject(); + oitem["id"] = Util.ShortId.Generate(); + oitem["completed"] = (bool)l["completed"]; + oitem["text"] = (string)l["text"]; + oitem["v"] = (long)l["v"]; + var highlight = (bool?)l["highlight"]; + if (highlight == null) + { + oitem["priority"] = 1;//default priority + } + else + { + oitem["priority"] = 3;//highest priority + } + oitems.Add(oitem); + } + o["items"] = oitems; + jout.Add(o); + } + + //write it into the db + ListData ldat = new ListData(); + + //this is the most compact way to write the json out as text + ldat.TheList = JsonConvert.SerializeObject(jout); + + ct.ListData.Add(ldat); + ct.SaveChanges(); + } + + + + private static string GetBackupFile() + { + try + { // Open the text file using a stream reader. + using (StreamReader sr = new StreamReader("./db/GZListServerBackup.bak")) + { + // Read the stream to a string, and write the string to the console. + String line = sr.ReadToEnd(); + return line; + } + } + catch + { + return null; + } + + } + + //-------- + } +} \ No newline at end of file diff --git a/util/Hasher.cs b/util/Hasher.cs new file mode 100644 index 0000000..1112c2e --- /dev/null +++ b/util/Hasher.cs @@ -0,0 +1,50 @@ +using System; +using System.Security.Cryptography; +using Microsoft.AspNetCore.Cryptography.KeyDerivation; +namespace GZTW.Pecklist.Util +{ + //Authentication controller + public static class Hasher + { + + public static string hash(string Salt, string Password) + { + + //adapted from here: + //https://docs.microsoft.com/en-us/aspnet/core/security/data-protection/consumer-apis/password-hashing + string hashed = Convert.ToBase64String(KeyDerivation.Pbkdf2( + password: Password, + salt: Base64StringToByteArray(Salt), + prf: KeyDerivationPrf.HMACSHA512, + iterationCount: 10000, + numBytesRequested: 512 / 8)); + return hashed; + } + + + /////////////////////////////////// + // convert the salt to a byte array + public static byte[] Base64StringToByteArray(string b64) + { + return Convert.FromBase64String(b64); + } + + + /////////////////////////// + // Generate a random salt + // + public static string GenerateSalt() + { + // generate a 128-bit salt using a secure PRNG + byte[] salt = new byte[128 / 8]; + using (var rng = RandomNumberGenerator.Create()) + { + rng.GetBytes(salt); + } + return Convert.ToBase64String(salt); + + } + + }//eoc + +}//eons \ No newline at end of file diff --git a/util/Schema.cs b/util/Schema.cs new file mode 100644 index 0000000..649b4e0 --- /dev/null +++ b/util/Schema.cs @@ -0,0 +1,141 @@ +using System; +using System.Text; + +using Microsoft.EntityFrameworkCore; +using GZTW.Pecklist.Models; + +namespace GZTW.Pecklist.Util +{ + //Key generator controller + public static class Schema + { + private static PecklistContext ctx; + + ///////////////////////////////////////////////////////////////// + /////////// CHANGE THIS ON NEW SCHEMA UPDATE //////////////////// + public const int DESIRED_SCHEMA_LEVEL = 2; + ///////////////////////////////////////////////////////////////// + + + static int startingSchema = -1; + static int currentSchema = -1; + + //check and update schema + public static void CheckAndUpdate(PecklistContext context) + { + ctx = context; + bool AppSchemaExists = false; + // var ld=context.ListData; + + //update schema here? + using (var command = ctx.Database.GetDbConnection().CreateCommand()) + { + //first of all, do we have a schema table yet (v0?) + command.CommandText = "SELECT name FROM sqlite_master WHERE type='table' AND name='appschema';"; + ctx.Database.OpenConnection(); + using (var result = command.ExecuteReader()) + { + if (result.HasRows) + { + AppSchemaExists = true; + } + ctx.Database.CloseConnection(); + } + } + //Create schema table (v1) + if (!AppSchemaExists) + { + //nope, no schema table, add it now and set to v1 + using (var cmCreateappschema = ctx.Database.GetDbConnection().CreateCommand()) + { + context.Database.OpenConnection(); + //first of all, do we have a schema table yet (v0?) + cmCreateappschema.CommandText = "CREATE TABLE appschema (id INTEGER PRIMARY KEY, schema INTEGER NOT NULL);"; + cmCreateappschema.ExecuteNonQuery(); + + cmCreateappschema.CommandText = "insert into appschema (schema) values (1);"; + cmCreateappschema.ExecuteNonQuery(); + + context.Database.CloseConnection(); + startingSchema = 1; + currentSchema = 1; + } + } + else + { + //get current schema level + using (var cm = ctx.Database.GetDbConnection().CreateCommand()) + { + cm.CommandText = "SELECT schema FROM appschema WHERE id=1;"; + ctx.Database.OpenConnection(); + using (var result = cm.ExecuteReader()) + { + if (result.HasRows) + { + result.Read(); + currentSchema = startingSchema = result.GetInt32(0); + ctx.Database.CloseConnection(); + } + else + { + ctx.Database.CloseConnection(); + throw new System.Exception("Pecklist->RfSchema->CheckAndUpdate: Error reading schema version"); + } + } + } + } + + //Bail early no update? + if (currentSchema == DESIRED_SCHEMA_LEVEL) + return; + + + + //************* SCHEMA UPDATES ****************** + ////////////////////////////////////////////////// + //schema 2 import data from Foodoo + if (currentSchema < 2) + { + //empty out the listdata table + exec("delete from listdata"); + + //Trigger import of foodoo data + Util.FoodooImporter.Import(ctx); + + //open and read in the GZListServerBackup.bak file into a json object + //turn it into pecklist format + //write it into the db + //$profit$ + + currentSchema = 2; + setSchemaLevel(currentSchema); + } + + //************************************************************************************* + + + }//eofunction + + + + private static void setSchemaLevel(int nCurrentSchema) + { + exec("UPDATE appschema SET schema=" + nCurrentSchema.ToString()); + } + + //execute command query + private static void exec(string q) + { + using (var cmCreateappschema = ctx.Database.GetDbConnection().CreateCommand()) + { + ctx.Database.OpenConnection(); + cmCreateappschema.CommandText = q; + cmCreateappschema.ExecuteNonQuery(); + ctx.Database.CloseConnection(); + } + } + + //eoclass + } + //eons +} \ No newline at end of file diff --git a/util/ShortId.cs b/util/ShortId.cs new file mode 100644 index 0000000..f124b04 --- /dev/null +++ b/util/ShortId.cs @@ -0,0 +1,20 @@ +using System; + +namespace GZTW.Pecklist.Util +{ + //Authentication controller + public static class ShortId + { + + ///////////////////////////////// + // Generate a random shortId + // + // Based off this: https://stackoverflow.com/a/9279005/8939 + public static string Generate() + { + return Convert.ToBase64String(Guid.NewGuid().ToByteArray()).Replace("=","").Replace("/","").Replace("+",""); + } + + }//eoc + +}//eons \ No newline at end of file diff --git a/wwwroot/browserconfig.xml b/wwwroot/browserconfig.xml new file mode 100644 index 0000000..ce0807f --- /dev/null +++ b/wwwroot/browserconfig.xml @@ -0,0 +1,9 @@ + + + + + + #00a300 + + + diff --git a/wwwroot/css/app.css b/wwwroot/css/app.css new file mode 100644 index 0000000..4593ca6 --- /dev/null +++ b/wwwroot/css/app.css @@ -0,0 +1,74 @@ + +ul{ + padding:0; +} + +.gz-list, .list-unstyled{ + list-style: none; +} + +.gz-content{ + margin-top:64px; +} + +.gz-larger{ + font-size: larger; +} + +.gz-smaller{ + font-size: smaller; +} + +@media screen and (max-width: 576px){ /* bump up font on smaller screen */ + html{font-size: 20px} + + .gz-content{ + margin-top:80px; + } +} + +/*App specific styles*/ +/* .peck-list{ + max-width: 550px; + background-color: linen; +} */ + +.new-item{ + width:100%; +} + +.pl-toggle{ + font-size:36px; +} + +.pl-done > span{ + text-decoration: line-through; + font-weight: lighter; + font-size:12px; +} + +.pl-long-item{ + font-size:smaller; +} + +.pl-short-item{ + font-size:larger; +} + + +/* +MAKE SCREEN SIZE AVAILABLE TO JS +Large is considered above 768px wide +and is the Bootstrap 4 breakpoint for medium screens and up +*/ + +body::after { + content: 'app-small-mode'; + display: none; +} +@media screen and (min-width: 768px) { + body::after { + content: 'app-large-mode'; + display: none; + } +} \ No newline at end of file diff --git a/wwwroot/css/materialdesignicons.min.css b/wwwroot/css/materialdesignicons.min.css new file mode 100644 index 0000000..cf83760 --- /dev/null +++ b/wwwroot/css/materialdesignicons.min.css @@ -0,0 +1,2 @@ +/* MaterialDesignIcons.com */@font-face{font-family:"Material Design Icons";src:url("../fonts/materialdesignicons-webfont.eot?v=2.0.46");src:url("../fonts/materialdesignicons-webfont.eot?#iefix&v=2.0.46") format("embedded-opentype"),url("../fonts/materialdesignicons-webfont.woff2?v=2.0.46") format("woff2"),url("../fonts/materialdesignicons-webfont.woff?v=2.0.46") format("woff"),url("../fonts/materialdesignicons-webfont.ttf?v=2.0.46") format("truetype"),url("../fonts/materialdesignicons-webfont.svg?v=2.0.46#materialdesigniconsregular") format("svg");font-weight:normal;font-style:normal}.mdi:before,.mdi-set{display:inline-block;font:normal normal normal 24px/1 "Material Design Icons";font-size:inherit;text-rendering:auto;line-height:inherit;-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale}.mdi-access-point:before{content:"\F002"}.mdi-access-point-network:before{content:"\F003"}.mdi-account:before{content:"\F004"}.mdi-account-alert:before{content:"\F005"}.mdi-account-box:before{content:"\F006"}.mdi-account-box-outline:before{content:"\F007"}.mdi-account-card-details:before{content:"\F5D2"}.mdi-account-check:before{content:"\F008"}.mdi-account-circle:before{content:"\F009"}.mdi-account-convert:before{content:"\F00A"}.mdi-account-edit:before{content:"\F6BB"}.mdi-account-key:before{content:"\F00B"}.mdi-account-location:before{content:"\F00C"}.mdi-account-minus:before{content:"\F00D"}.mdi-account-multiple:before{content:"\F00E"}.mdi-account-multiple-minus:before{content:"\F5D3"}.mdi-account-multiple-outline:before{content:"\F00F"}.mdi-account-multiple-plus:before{content:"\F010"}.mdi-account-network:before{content:"\F011"}.mdi-account-off:before{content:"\F012"}.mdi-account-outline:before{content:"\F013"}.mdi-account-plus:before{content:"\F014"}.mdi-account-remove:before{content:"\F015"}.mdi-account-search:before{content:"\F016"}.mdi-account-settings:before{content:"\F630"}.mdi-account-settings-variant:before{content:"\F631"}.mdi-account-star:before{content:"\F017"}.mdi-account-switch:before{content:"\F019"}.mdi-adjust:before{content:"\F01A"}.mdi-air-conditioner:before{content:"\F01B"}.mdi-airballoon:before{content:"\F01C"}.mdi-airplane:before{content:"\F01D"}.mdi-airplane-landing:before{content:"\F5D4"}.mdi-airplane-off:before{content:"\F01E"}.mdi-airplane-takeoff:before{content:"\F5D5"}.mdi-airplay:before{content:"\F01F"}.mdi-alarm:before{content:"\F020"}.mdi-alarm-bell:before{content:"\F78D"}.mdi-alarm-check:before{content:"\F021"}.mdi-alarm-light:before{content:"\F78E"}.mdi-alarm-multiple:before{content:"\F022"}.mdi-alarm-off:before{content:"\F023"}.mdi-alarm-plus:before{content:"\F024"}.mdi-alarm-snooze:before{content:"\F68D"}.mdi-album:before{content:"\F025"}.mdi-alert:before{content:"\F026"}.mdi-alert-box:before{content:"\F027"}.mdi-alert-circle:before{content:"\F028"}.mdi-alert-circle-outline:before{content:"\F5D6"}.mdi-alert-decagram:before{content:"\F6BC"}.mdi-alert-octagon:before{content:"\F029"}.mdi-alert-octagram:before{content:"\F766"}.mdi-alert-outline:before{content:"\F02A"}.mdi-all-inclusive:before{content:"\F6BD"}.mdi-alpha:before{content:"\F02B"}.mdi-alphabetical:before{content:"\F02C"}.mdi-altimeter:before{content:"\F5D7"}.mdi-amazon:before{content:"\F02D"}.mdi-amazon-clouddrive:before{content:"\F02E"}.mdi-ambulance:before{content:"\F02F"}.mdi-amplifier:before{content:"\F030"}.mdi-anchor:before{content:"\F031"}.mdi-android:before{content:"\F032"}.mdi-android-debug-bridge:before{content:"\F033"}.mdi-android-head:before{content:"\F78F"}.mdi-android-studio:before{content:"\F034"}.mdi-angular:before{content:"\F6B1"}.mdi-angularjs:before{content:"\F6BE"}.mdi-animation:before{content:"\F5D8"}.mdi-apple:before{content:"\F035"}.mdi-apple-finder:before{content:"\F036"}.mdi-apple-ios:before{content:"\F037"}.mdi-apple-keyboard-caps:before{content:"\F632"}.mdi-apple-keyboard-command:before{content:"\F633"}.mdi-apple-keyboard-control:before{content:"\F634"}.mdi-apple-keyboard-option:before{content:"\F635"}.mdi-apple-keyboard-shift:before{content:"\F636"}.mdi-apple-mobileme:before{content:"\F038"}.mdi-apple-safari:before{content:"\F039"}.mdi-application:before{content:"\F614"}.mdi-approval:before{content:"\F790"}.mdi-apps:before{content:"\F03B"}.mdi-archive:before{content:"\F03C"}.mdi-arrange-bring-forward:before{content:"\F03D"}.mdi-arrange-bring-to-front:before{content:"\F03E"}.mdi-arrange-send-backward:before{content:"\F03F"}.mdi-arrange-send-to-back:before{content:"\F040"}.mdi-arrow-all:before{content:"\F041"}.mdi-arrow-bottom-left:before{content:"\F042"}.mdi-arrow-bottom-right:before{content:"\F043"}.mdi-arrow-collapse:before{content:"\F615"}.mdi-arrow-collapse-all:before{content:"\F044"}.mdi-arrow-collapse-down:before{content:"\F791"}.mdi-arrow-collapse-left:before{content:"\F792"}.mdi-arrow-collapse-right:before{content:"\F793"}.mdi-arrow-collapse-up:before{content:"\F794"}.mdi-arrow-down:before{content:"\F045"}.mdi-arrow-down-bold:before{content:"\F72D"}.mdi-arrow-down-bold-box:before{content:"\F72E"}.mdi-arrow-down-bold-box-outline:before{content:"\F72F"}.mdi-arrow-down-bold-circle:before{content:"\F047"}.mdi-arrow-down-bold-circle-outline:before{content:"\F048"}.mdi-arrow-down-bold-hexagon-outline:before{content:"\F049"}.mdi-arrow-down-box:before{content:"\F6BF"}.mdi-arrow-down-drop-circle:before{content:"\F04A"}.mdi-arrow-down-drop-circle-outline:before{content:"\F04B"}.mdi-arrow-down-thick:before{content:"\F046"}.mdi-arrow-expand:before{content:"\F616"}.mdi-arrow-expand-all:before{content:"\F04C"}.mdi-arrow-expand-down:before{content:"\F795"}.mdi-arrow-expand-left:before{content:"\F796"}.mdi-arrow-expand-right:before{content:"\F797"}.mdi-arrow-expand-up:before{content:"\F798"}.mdi-arrow-left:before{content:"\F04D"}.mdi-arrow-left-bold:before{content:"\F730"}.mdi-arrow-left-bold-box:before{content:"\F731"}.mdi-arrow-left-bold-box-outline:before{content:"\F732"}.mdi-arrow-left-bold-circle:before{content:"\F04F"}.mdi-arrow-left-bold-circle-outline:before{content:"\F050"}.mdi-arrow-left-bold-hexagon-outline:before{content:"\F051"}.mdi-arrow-left-box:before{content:"\F6C0"}.mdi-arrow-left-drop-circle:before{content:"\F052"}.mdi-arrow-left-drop-circle-outline:before{content:"\F053"}.mdi-arrow-left-thick:before{content:"\F04E"}.mdi-arrow-right:before{content:"\F054"}.mdi-arrow-right-bold:before{content:"\F733"}.mdi-arrow-right-bold-box:before{content:"\F734"}.mdi-arrow-right-bold-box-outline:before{content:"\F735"}.mdi-arrow-right-bold-circle:before{content:"\F056"}.mdi-arrow-right-bold-circle-outline:before{content:"\F057"}.mdi-arrow-right-bold-hexagon-outline:before{content:"\F058"}.mdi-arrow-right-box:before{content:"\F6C1"}.mdi-arrow-right-drop-circle:before{content:"\F059"}.mdi-arrow-right-drop-circle-outline:before{content:"\F05A"}.mdi-arrow-right-thick:before{content:"\F055"}.mdi-arrow-top-left:before{content:"\F05B"}.mdi-arrow-top-right:before{content:"\F05C"}.mdi-arrow-up:before{content:"\F05D"}.mdi-arrow-up-bold:before{content:"\F736"}.mdi-arrow-up-bold-box:before{content:"\F737"}.mdi-arrow-up-bold-box-outline:before{content:"\F738"}.mdi-arrow-up-bold-circle:before{content:"\F05F"}.mdi-arrow-up-bold-circle-outline:before{content:"\F060"}.mdi-arrow-up-bold-hexagon-outline:before{content:"\F061"}.mdi-arrow-up-box:before{content:"\F6C2"}.mdi-arrow-up-drop-circle:before{content:"\F062"}.mdi-arrow-up-drop-circle-outline:before{content:"\F063"}.mdi-arrow-up-thick:before{content:"\F05E"}.mdi-assistant:before{content:"\F064"}.mdi-asterisk:before{content:"\F6C3"}.mdi-at:before{content:"\F065"}.mdi-atom:before{content:"\F767"}.mdi-attachment:before{content:"\F066"}.mdi-audiobook:before{content:"\F067"}.mdi-auto-fix:before{content:"\F068"}.mdi-auto-upload:before{content:"\F069"}.mdi-autorenew:before{content:"\F06A"}.mdi-av-timer:before{content:"\F06B"}.mdi-baby:before{content:"\F06C"}.mdi-baby-buggy:before{content:"\F68E"}.mdi-backburger:before{content:"\F06D"}.mdi-backspace:before{content:"\F06E"}.mdi-backup-restore:before{content:"\F06F"}.mdi-bandcamp:before{content:"\F674"}.mdi-bank:before{content:"\F070"}.mdi-barcode:before{content:"\F071"}.mdi-barcode-scan:before{content:"\F072"}.mdi-barley:before{content:"\F073"}.mdi-barrel:before{content:"\F074"}.mdi-basecamp:before{content:"\F075"}.mdi-basket:before{content:"\F076"}.mdi-basket-fill:before{content:"\F077"}.mdi-basket-unfill:before{content:"\F078"}.mdi-battery:before{content:"\F079"}.mdi-battery-10:before{content:"\F07A"}.mdi-battery-20:before{content:"\F07B"}.mdi-battery-30:before{content:"\F07C"}.mdi-battery-40:before{content:"\F07D"}.mdi-battery-50:before{content:"\F07E"}.mdi-battery-60:before{content:"\F07F"}.mdi-battery-70:before{content:"\F080"}.mdi-battery-80:before{content:"\F081"}.mdi-battery-90:before{content:"\F082"}.mdi-battery-alert:before{content:"\F083"}.mdi-battery-charging:before{content:"\F084"}.mdi-battery-charging-100:before{content:"\F085"}.mdi-battery-charging-20:before{content:"\F086"}.mdi-battery-charging-30:before{content:"\F087"}.mdi-battery-charging-40:before{content:"\F088"}.mdi-battery-charging-60:before{content:"\F089"}.mdi-battery-charging-80:before{content:"\F08A"}.mdi-battery-charging-90:before{content:"\F08B"}.mdi-battery-minus:before{content:"\F08C"}.mdi-battery-negative:before{content:"\F08D"}.mdi-battery-outline:before{content:"\F08E"}.mdi-battery-plus:before{content:"\F08F"}.mdi-battery-positive:before{content:"\F090"}.mdi-battery-unknown:before{content:"\F091"}.mdi-beach:before{content:"\F092"}.mdi-beaker:before{content:"\F68F"}.mdi-beats:before{content:"\F097"}.mdi-beer:before{content:"\F098"}.mdi-behance:before{content:"\F099"}.mdi-bell:before{content:"\F09A"}.mdi-bell-off:before{content:"\F09B"}.mdi-bell-outline:before{content:"\F09C"}.mdi-bell-plus:before{content:"\F09D"}.mdi-bell-ring:before{content:"\F09E"}.mdi-bell-ring-outline:before{content:"\F09F"}.mdi-bell-sleep:before{content:"\F0A0"}.mdi-beta:before{content:"\F0A1"}.mdi-bible:before{content:"\F0A2"}.mdi-bike:before{content:"\F0A3"}.mdi-bing:before{content:"\F0A4"}.mdi-binoculars:before{content:"\F0A5"}.mdi-bio:before{content:"\F0A6"}.mdi-biohazard:before{content:"\F0A7"}.mdi-bitbucket:before{content:"\F0A8"}.mdi-black-mesa:before{content:"\F0A9"}.mdi-blackberry:before{content:"\F0AA"}.mdi-blender:before{content:"\F0AB"}.mdi-blinds:before{content:"\F0AC"}.mdi-block-helper:before{content:"\F0AD"}.mdi-blogger:before{content:"\F0AE"}.mdi-bluetooth:before{content:"\F0AF"}.mdi-bluetooth-audio:before{content:"\F0B0"}.mdi-bluetooth-connect:before{content:"\F0B1"}.mdi-bluetooth-off:before{content:"\F0B2"}.mdi-bluetooth-settings:before{content:"\F0B3"}.mdi-bluetooth-transfer:before{content:"\F0B4"}.mdi-blur:before{content:"\F0B5"}.mdi-blur-linear:before{content:"\F0B6"}.mdi-blur-off:before{content:"\F0B7"}.mdi-blur-radial:before{content:"\F0B8"}.mdi-bomb:before{content:"\F690"}.mdi-bomb-off:before{content:"\F6C4"}.mdi-bone:before{content:"\F0B9"}.mdi-book:before{content:"\F0BA"}.mdi-book-minus:before{content:"\F5D9"}.mdi-book-multiple:before{content:"\F0BB"}.mdi-book-multiple-variant:before{content:"\F0BC"}.mdi-book-open:before{content:"\F0BD"}.mdi-book-open-page-variant:before{content:"\F5DA"}.mdi-book-open-variant:before{content:"\F0BE"}.mdi-book-plus:before{content:"\F5DB"}.mdi-book-secure:before{content:"\F799"}.mdi-book-unsecure:before{content:"\F79A"}.mdi-book-variant:before{content:"\F0BF"}.mdi-bookmark:before{content:"\F0C0"}.mdi-bookmark-check:before{content:"\F0C1"}.mdi-bookmark-music:before{content:"\F0C2"}.mdi-bookmark-outline:before{content:"\F0C3"}.mdi-bookmark-plus:before{content:"\F0C5"}.mdi-bookmark-plus-outline:before{content:"\F0C4"}.mdi-bookmark-remove:before{content:"\F0C6"}.mdi-boombox:before{content:"\F5DC"}.mdi-bootstrap:before{content:"\F6C5"}.mdi-border-all:before{content:"\F0C7"}.mdi-border-bottom:before{content:"\F0C8"}.mdi-border-color:before{content:"\F0C9"}.mdi-border-horizontal:before{content:"\F0CA"}.mdi-border-inside:before{content:"\F0CB"}.mdi-border-left:before{content:"\F0CC"}.mdi-border-none:before{content:"\F0CD"}.mdi-border-outside:before{content:"\F0CE"}.mdi-border-right:before{content:"\F0CF"}.mdi-border-style:before{content:"\F0D0"}.mdi-border-top:before{content:"\F0D1"}.mdi-border-vertical:before{content:"\F0D2"}.mdi-bow-tie:before{content:"\F677"}.mdi-bowl:before{content:"\F617"}.mdi-bowling:before{content:"\F0D3"}.mdi-box:before{content:"\F0D4"}.mdi-box-cutter:before{content:"\F0D5"}.mdi-box-shadow:before{content:"\F637"}.mdi-bridge:before{content:"\F618"}.mdi-briefcase:before{content:"\F0D6"}.mdi-briefcase-check:before{content:"\F0D7"}.mdi-briefcase-download:before{content:"\F0D8"}.mdi-briefcase-upload:before{content:"\F0D9"}.mdi-brightness-1:before{content:"\F0DA"}.mdi-brightness-2:before{content:"\F0DB"}.mdi-brightness-3:before{content:"\F0DC"}.mdi-brightness-4:before{content:"\F0DD"}.mdi-brightness-5:before{content:"\F0DE"}.mdi-brightness-6:before{content:"\F0DF"}.mdi-brightness-7:before{content:"\F0E0"}.mdi-brightness-auto:before{content:"\F0E1"}.mdi-broom:before{content:"\F0E2"}.mdi-brush:before{content:"\F0E3"}.mdi-buffer:before{content:"\F619"}.mdi-bug:before{content:"\F0E4"}.mdi-bulletin-board:before{content:"\F0E5"}.mdi-bullhorn:before{content:"\F0E6"}.mdi-bullseye:before{content:"\F5DD"}.mdi-burst-mode:before{content:"\F5DE"}.mdi-bus:before{content:"\F0E7"}.mdi-bus-articulated-end:before{content:"\F79B"}.mdi-bus-articulated-front:before{content:"\F79C"}.mdi-bus-double-decker:before{content:"\F79D"}.mdi-bus-school:before{content:"\F79E"}.mdi-bus-side:before{content:"\F79F"}.mdi-cached:before{content:"\F0E8"}.mdi-cake:before{content:"\F0E9"}.mdi-cake-layered:before{content:"\F0EA"}.mdi-cake-variant:before{content:"\F0EB"}.mdi-calculator:before{content:"\F0EC"}.mdi-calendar:before{content:"\F0ED"}.mdi-calendar-blank:before{content:"\F0EE"}.mdi-calendar-check:before{content:"\F0EF"}.mdi-calendar-clock:before{content:"\F0F0"}.mdi-calendar-multiple:before{content:"\F0F1"}.mdi-calendar-multiple-check:before{content:"\F0F2"}.mdi-calendar-plus:before{content:"\F0F3"}.mdi-calendar-question:before{content:"\F691"}.mdi-calendar-range:before{content:"\F678"}.mdi-calendar-remove:before{content:"\F0F4"}.mdi-calendar-text:before{content:"\F0F5"}.mdi-calendar-today:before{content:"\F0F6"}.mdi-call-made:before{content:"\F0F7"}.mdi-call-merge:before{content:"\F0F8"}.mdi-call-missed:before{content:"\F0F9"}.mdi-call-received:before{content:"\F0FA"}.mdi-call-split:before{content:"\F0FB"}.mdi-camcorder:before{content:"\F0FC"}.mdi-camcorder-box:before{content:"\F0FD"}.mdi-camcorder-box-off:before{content:"\F0FE"}.mdi-camcorder-off:before{content:"\F0FF"}.mdi-camera:before{content:"\F100"}.mdi-camera-burst:before{content:"\F692"}.mdi-camera-enhance:before{content:"\F101"}.mdi-camera-front:before{content:"\F102"}.mdi-camera-front-variant:before{content:"\F103"}.mdi-camera-gopro:before{content:"\F7A0"}.mdi-camera-iris:before{content:"\F104"}.mdi-camera-metering-center:before{content:"\F7A1"}.mdi-camera-metering-matrix:before{content:"\F7A2"}.mdi-camera-metering-partial:before{content:"\F7A3"}.mdi-camera-metering-spot:before{content:"\F7A4"}.mdi-camera-off:before{content:"\F5DF"}.mdi-camera-party-mode:before{content:"\F105"}.mdi-camera-rear:before{content:"\F106"}.mdi-camera-rear-variant:before{content:"\F107"}.mdi-camera-switch:before{content:"\F108"}.mdi-camera-timer:before{content:"\F109"}.mdi-cancel:before{content:"\F739"}.mdi-candle:before{content:"\F5E2"}.mdi-candycane:before{content:"\F10A"}.mdi-cannabis:before{content:"\F7A5"}.mdi-car:before{content:"\F10B"}.mdi-car-battery:before{content:"\F10C"}.mdi-car-connected:before{content:"\F10D"}.mdi-car-convertable:before{content:"\F7A6"}.mdi-car-estate:before{content:"\F7A7"}.mdi-car-hatchback:before{content:"\F7A8"}.mdi-car-pickup:before{content:"\F7A9"}.mdi-car-side:before{content:"\F7AA"}.mdi-car-sports:before{content:"\F7AB"}.mdi-car-wash:before{content:"\F10E"}.mdi-caravan:before{content:"\F7AC"}.mdi-cards:before{content:"\F638"}.mdi-cards-outline:before{content:"\F639"}.mdi-cards-playing-outline:before{content:"\F63A"}.mdi-cards-variant:before{content:"\F6C6"}.mdi-carrot:before{content:"\F10F"}.mdi-cart:before{content:"\F110"}.mdi-cart-off:before{content:"\F66B"}.mdi-cart-outline:before{content:"\F111"}.mdi-cart-plus:before{content:"\F112"}.mdi-case-sensitive-alt:before{content:"\F113"}.mdi-cash:before{content:"\F114"}.mdi-cash-100:before{content:"\F115"}.mdi-cash-multiple:before{content:"\F116"}.mdi-cash-usd:before{content:"\F117"}.mdi-cast:before{content:"\F118"}.mdi-cast-connected:before{content:"\F119"}.mdi-cast-off:before{content:"\F789"}.mdi-castle:before{content:"\F11A"}.mdi-cat:before{content:"\F11B"}.mdi-cctv:before{content:"\F7AD"}.mdi-ceiling-light:before{content:"\F768"}.mdi-cellphone:before{content:"\F11C"}.mdi-cellphone-android:before{content:"\F11D"}.mdi-cellphone-basic:before{content:"\F11E"}.mdi-cellphone-dock:before{content:"\F11F"}.mdi-cellphone-iphone:before{content:"\F120"}.mdi-cellphone-link:before{content:"\F121"}.mdi-cellphone-link-off:before{content:"\F122"}.mdi-cellphone-settings:before{content:"\F123"}.mdi-certificate:before{content:"\F124"}.mdi-chair-school:before{content:"\F125"}.mdi-chart-arc:before{content:"\F126"}.mdi-chart-areaspline:before{content:"\F127"}.mdi-chart-bar:before{content:"\F128"}.mdi-chart-bar-stacked:before{content:"\F769"}.mdi-chart-bubble:before{content:"\F5E3"}.mdi-chart-donut:before{content:"\F7AE"}.mdi-chart-donut-variant:before{content:"\F7AF"}.mdi-chart-gantt:before{content:"\F66C"}.mdi-chart-histogram:before{content:"\F129"}.mdi-chart-line:before{content:"\F12A"}.mdi-chart-line-stacked:before{content:"\F76A"}.mdi-chart-line-variant:before{content:"\F7B0"}.mdi-chart-pie:before{content:"\F12B"}.mdi-chart-scatterplot-hexbin:before{content:"\F66D"}.mdi-chart-timeline:before{content:"\F66E"}.mdi-check:before{content:"\F12C"}.mdi-check-all:before{content:"\F12D"}.mdi-check-circle:before{content:"\F5E0"}.mdi-check-circle-outline:before{content:"\F5E1"}.mdi-checkbox-blank:before{content:"\F12E"}.mdi-checkbox-blank-circle:before{content:"\F12F"}.mdi-checkbox-blank-circle-outline:before{content:"\F130"}.mdi-checkbox-blank-outline:before{content:"\F131"}.mdi-checkbox-marked:before{content:"\F132"}.mdi-checkbox-marked-circle:before{content:"\F133"}.mdi-checkbox-marked-circle-outline:before{content:"\F134"}.mdi-checkbox-marked-outline:before{content:"\F135"}.mdi-checkbox-multiple-blank:before{content:"\F136"}.mdi-checkbox-multiple-blank-circle:before{content:"\F63B"}.mdi-checkbox-multiple-blank-circle-outline:before{content:"\F63C"}.mdi-checkbox-multiple-blank-outline:before{content:"\F137"}.mdi-checkbox-multiple-marked:before{content:"\F138"}.mdi-checkbox-multiple-marked-circle:before{content:"\F63D"}.mdi-checkbox-multiple-marked-circle-outline:before{content:"\F63E"}.mdi-checkbox-multiple-marked-outline:before{content:"\F139"}.mdi-checkerboard:before{content:"\F13A"}.mdi-chemical-weapon:before{content:"\F13B"}.mdi-chevron-double-down:before{content:"\F13C"}.mdi-chevron-double-left:before{content:"\F13D"}.mdi-chevron-double-right:before{content:"\F13E"}.mdi-chevron-double-up:before{content:"\F13F"}.mdi-chevron-down:before{content:"\F140"}.mdi-chevron-left:before{content:"\F141"}.mdi-chevron-right:before{content:"\F142"}.mdi-chevron-up:before{content:"\F143"}.mdi-chili-hot:before{content:"\F7B1"}.mdi-chili-medium:before{content:"\F7B2"}.mdi-chili-mild:before{content:"\F7B3"}.mdi-chip:before{content:"\F61A"}.mdi-church:before{content:"\F144"}.mdi-circle:before{content:"\F764"}.mdi-circle-outline:before{content:"\F765"}.mdi-cisco-webex:before{content:"\F145"}.mdi-city:before{content:"\F146"}.mdi-clipboard:before{content:"\F147"}.mdi-clipboard-account:before{content:"\F148"}.mdi-clipboard-alert:before{content:"\F149"}.mdi-clipboard-arrow-down:before{content:"\F14A"}.mdi-clipboard-arrow-left:before{content:"\F14B"}.mdi-clipboard-check:before{content:"\F14C"}.mdi-clipboard-flow:before{content:"\F6C7"}.mdi-clipboard-outline:before{content:"\F14D"}.mdi-clipboard-plus:before{content:"\F750"}.mdi-clipboard-text:before{content:"\F14E"}.mdi-clippy:before{content:"\F14F"}.mdi-clock:before{content:"\F150"}.mdi-clock-alert:before{content:"\F5CE"}.mdi-clock-end:before{content:"\F151"}.mdi-clock-fast:before{content:"\F152"}.mdi-clock-in:before{content:"\F153"}.mdi-clock-out:before{content:"\F154"}.mdi-clock-start:before{content:"\F155"}.mdi-close:before{content:"\F156"}.mdi-close-box:before{content:"\F157"}.mdi-close-box-outline:before{content:"\F158"}.mdi-close-circle:before{content:"\F159"}.mdi-close-circle-outline:before{content:"\F15A"}.mdi-close-network:before{content:"\F15B"}.mdi-close-octagon:before{content:"\F15C"}.mdi-close-octagon-outline:before{content:"\F15D"}.mdi-close-outline:before{content:"\F6C8"}.mdi-closed-caption:before{content:"\F15E"}.mdi-cloud:before{content:"\F15F"}.mdi-cloud-braces:before{content:"\F7B4"}.mdi-cloud-check:before{content:"\F160"}.mdi-cloud-circle:before{content:"\F161"}.mdi-cloud-download:before{content:"\F162"}.mdi-cloud-off-outline:before{content:"\F164"}.mdi-cloud-outline:before{content:"\F163"}.mdi-cloud-print:before{content:"\F165"}.mdi-cloud-print-outline:before{content:"\F166"}.mdi-cloud-sync:before{content:"\F63F"}.mdi-cloud-tags:before{content:"\F7B5"}.mdi-cloud-upload:before{content:"\F167"}.mdi-code-array:before{content:"\F168"}.mdi-code-braces:before{content:"\F169"}.mdi-code-brackets:before{content:"\F16A"}.mdi-code-equal:before{content:"\F16B"}.mdi-code-greater-than:before{content:"\F16C"}.mdi-code-greater-than-or-equal:before{content:"\F16D"}.mdi-code-less-than:before{content:"\F16E"}.mdi-code-less-than-or-equal:before{content:"\F16F"}.mdi-code-not-equal:before{content:"\F170"}.mdi-code-not-equal-variant:before{content:"\F171"}.mdi-code-parentheses:before{content:"\F172"}.mdi-code-string:before{content:"\F173"}.mdi-code-tags:before{content:"\F174"}.mdi-code-tags-check:before{content:"\F693"}.mdi-codepen:before{content:"\F175"}.mdi-coffee:before{content:"\F176"}.mdi-coffee-outline:before{content:"\F6C9"}.mdi-coffee-to-go:before{content:"\F177"}.mdi-coin:before{content:"\F178"}.mdi-coins:before{content:"\F694"}.mdi-collage:before{content:"\F640"}.mdi-color-helper:before{content:"\F179"}.mdi-comment:before{content:"\F17A"}.mdi-comment-account:before{content:"\F17B"}.mdi-comment-account-outline:before{content:"\F17C"}.mdi-comment-alert:before{content:"\F17D"}.mdi-comment-alert-outline:before{content:"\F17E"}.mdi-comment-check:before{content:"\F17F"}.mdi-comment-check-outline:before{content:"\F180"}.mdi-comment-multiple-outline:before{content:"\F181"}.mdi-comment-outline:before{content:"\F182"}.mdi-comment-plus-outline:before{content:"\F183"}.mdi-comment-processing:before{content:"\F184"}.mdi-comment-processing-outline:before{content:"\F185"}.mdi-comment-question-outline:before{content:"\F186"}.mdi-comment-remove-outline:before{content:"\F187"}.mdi-comment-text:before{content:"\F188"}.mdi-comment-text-outline:before{content:"\F189"}.mdi-compare:before{content:"\F18A"}.mdi-compass:before{content:"\F18B"}.mdi-compass-outline:before{content:"\F18C"}.mdi-console:before{content:"\F18D"}.mdi-console-line:before{content:"\F7B6"}.mdi-contact-mail:before{content:"\F18E"}.mdi-contacts:before{content:"\F6CA"}.mdi-content-copy:before{content:"\F18F"}.mdi-content-cut:before{content:"\F190"}.mdi-content-duplicate:before{content:"\F191"}.mdi-content-paste:before{content:"\F192"}.mdi-content-save:before{content:"\F193"}.mdi-content-save-all:before{content:"\F194"}.mdi-content-save-settings:before{content:"\F61B"}.mdi-contrast:before{content:"\F195"}.mdi-contrast-box:before{content:"\F196"}.mdi-contrast-circle:before{content:"\F197"}.mdi-cookie:before{content:"\F198"}.mdi-copyright:before{content:"\F5E6"}.mdi-corn:before{content:"\F7B7"}.mdi-counter:before{content:"\F199"}.mdi-cow:before{content:"\F19A"}.mdi-creation:before{content:"\F1C9"}.mdi-credit-card:before{content:"\F19B"}.mdi-credit-card-multiple:before{content:"\F19C"}.mdi-credit-card-off:before{content:"\F5E4"}.mdi-credit-card-plus:before{content:"\F675"}.mdi-credit-card-scan:before{content:"\F19D"}.mdi-crop:before{content:"\F19E"}.mdi-crop-free:before{content:"\F19F"}.mdi-crop-landscape:before{content:"\F1A0"}.mdi-crop-portrait:before{content:"\F1A1"}.mdi-crop-rotate:before{content:"\F695"}.mdi-crop-square:before{content:"\F1A2"}.mdi-crosshairs:before{content:"\F1A3"}.mdi-crosshairs-gps:before{content:"\F1A4"}.mdi-crown:before{content:"\F1A5"}.mdi-cube:before{content:"\F1A6"}.mdi-cube-outline:before{content:"\F1A7"}.mdi-cube-send:before{content:"\F1A8"}.mdi-cube-unfolded:before{content:"\F1A9"}.mdi-cup:before{content:"\F1AA"}.mdi-cup-off:before{content:"\F5E5"}.mdi-cup-water:before{content:"\F1AB"}.mdi-currency-btc:before{content:"\F1AC"}.mdi-currency-chf:before{content:"\F7B8"}.mdi-currency-cny:before{content:"\F7B9"}.mdi-currency-eth:before{content:"\F7BA"}.mdi-currency-eur:before{content:"\F1AD"}.mdi-currency-gbp:before{content:"\F1AE"}.mdi-currency-inr:before{content:"\F1AF"}.mdi-currency-jpy:before{content:"\F7BB"}.mdi-currency-krw:before{content:"\F7BC"}.mdi-currency-ngn:before{content:"\F1B0"}.mdi-currency-rub:before{content:"\F1B1"}.mdi-currency-sign:before{content:"\F7BD"}.mdi-currency-try:before{content:"\F1B2"}.mdi-currency-twd:before{content:"\F7BE"}.mdi-currency-usd:before{content:"\F1B3"}.mdi-currency-usd-off:before{content:"\F679"}.mdi-cursor-default:before{content:"\F1B4"}.mdi-cursor-default-outline:before{content:"\F1B5"}.mdi-cursor-move:before{content:"\F1B6"}.mdi-cursor-pointer:before{content:"\F1B7"}.mdi-cursor-text:before{content:"\F5E7"}.mdi-database:before{content:"\F1B8"}.mdi-database-minus:before{content:"\F1B9"}.mdi-database-plus:before{content:"\F1BA"}.mdi-debug-step-into:before{content:"\F1BB"}.mdi-debug-step-out:before{content:"\F1BC"}.mdi-debug-step-over:before{content:"\F1BD"}.mdi-decagram:before{content:"\F76B"}.mdi-decagram-outline:before{content:"\F76C"}.mdi-decimal-decrease:before{content:"\F1BE"}.mdi-decimal-increase:before{content:"\F1BF"}.mdi-delete:before{content:"\F1C0"}.mdi-delete-circle:before{content:"\F682"}.mdi-delete-empty:before{content:"\F6CB"}.mdi-delete-forever:before{content:"\F5E8"}.mdi-delete-sweep:before{content:"\F5E9"}.mdi-delete-variant:before{content:"\F1C1"}.mdi-delta:before{content:"\F1C2"}.mdi-deskphone:before{content:"\F1C3"}.mdi-desktop-classic:before{content:"\F7BF"}.mdi-desktop-mac:before{content:"\F1C4"}.mdi-desktop-tower:before{content:"\F1C5"}.mdi-details:before{content:"\F1C6"}.mdi-developer-board:before{content:"\F696"}.mdi-deviantart:before{content:"\F1C7"}.mdi-dialpad:before{content:"\F61C"}.mdi-diamond:before{content:"\F1C8"}.mdi-dice-1:before{content:"\F1CA"}.mdi-dice-2:before{content:"\F1CB"}.mdi-dice-3:before{content:"\F1CC"}.mdi-dice-4:before{content:"\F1CD"}.mdi-dice-5:before{content:"\F1CE"}.mdi-dice-6:before{content:"\F1CF"}.mdi-dice-d10:before{content:"\F76E"}.mdi-dice-d20:before{content:"\F5EA"}.mdi-dice-d4:before{content:"\F5EB"}.mdi-dice-d6:before{content:"\F5EC"}.mdi-dice-d8:before{content:"\F5ED"}.mdi-dice-multiple:before{content:"\F76D"}.mdi-dictionary:before{content:"\F61D"}.mdi-dip-switch:before{content:"\F7C0"}.mdi-directions:before{content:"\F1D0"}.mdi-directions-fork:before{content:"\F641"}.mdi-discord:before{content:"\F66F"}.mdi-disk:before{content:"\F5EE"}.mdi-disk-alert:before{content:"\F1D1"}.mdi-disqus:before{content:"\F1D2"}.mdi-disqus-outline:before{content:"\F1D3"}.mdi-division:before{content:"\F1D4"}.mdi-division-box:before{content:"\F1D5"}.mdi-dna:before{content:"\F683"}.mdi-dns:before{content:"\F1D6"}.mdi-do-not-disturb:before{content:"\F697"}.mdi-do-not-disturb-off:before{content:"\F698"}.mdi-dolby:before{content:"\F6B2"}.mdi-domain:before{content:"\F1D7"}.mdi-donkey:before{content:"\F7C1"}.mdi-dots-horizontal:before{content:"\F1D8"}.mdi-dots-horizontal-circle:before{content:"\F7C2"}.mdi-dots-vertical:before{content:"\F1D9"}.mdi-dots-vertical-circle:before{content:"\F7C3"}.mdi-douban:before{content:"\F699"}.mdi-download:before{content:"\F1DA"}.mdi-download-network:before{content:"\F6F3"}.mdi-drag:before{content:"\F1DB"}.mdi-drag-horizontal:before{content:"\F1DC"}.mdi-drag-vertical:before{content:"\F1DD"}.mdi-drawing:before{content:"\F1DE"}.mdi-drawing-box:before{content:"\F1DF"}.mdi-dribbble:before{content:"\F1E0"}.mdi-dribbble-box:before{content:"\F1E1"}.mdi-drone:before{content:"\F1E2"}.mdi-dropbox:before{content:"\F1E3"}.mdi-drupal:before{content:"\F1E4"}.mdi-duck:before{content:"\F1E5"}.mdi-dumbbell:before{content:"\F1E6"}.mdi-ear-hearing:before{content:"\F7C4"}.mdi-earth:before{content:"\F1E7"}.mdi-earth-box:before{content:"\F6CC"}.mdi-earth-box-off:before{content:"\F6CD"}.mdi-earth-off:before{content:"\F1E8"}.mdi-edge:before{content:"\F1E9"}.mdi-eject:before{content:"\F1EA"}.mdi-elephant:before{content:"\F7C5"}.mdi-elevation-decline:before{content:"\F1EB"}.mdi-elevation-rise:before{content:"\F1EC"}.mdi-elevator:before{content:"\F1ED"}.mdi-email:before{content:"\F1EE"}.mdi-email-alert:before{content:"\F6CE"}.mdi-email-open:before{content:"\F1EF"}.mdi-email-open-outline:before{content:"\F5EF"}.mdi-email-outline:before{content:"\F1F0"}.mdi-email-secure:before{content:"\F1F1"}.mdi-email-variant:before{content:"\F5F0"}.mdi-emby:before{content:"\F6B3"}.mdi-emoticon:before{content:"\F1F2"}.mdi-emoticon-cool:before{content:"\F1F3"}.mdi-emoticon-dead:before{content:"\F69A"}.mdi-emoticon-devil:before{content:"\F1F4"}.mdi-emoticon-excited:before{content:"\F69B"}.mdi-emoticon-happy:before{content:"\F1F5"}.mdi-emoticon-neutral:before{content:"\F1F6"}.mdi-emoticon-poop:before{content:"\F1F7"}.mdi-emoticon-sad:before{content:"\F1F8"}.mdi-emoticon-tongue:before{content:"\F1F9"}.mdi-engine:before{content:"\F1FA"}.mdi-engine-outline:before{content:"\F1FB"}.mdi-equal:before{content:"\F1FC"}.mdi-equal-box:before{content:"\F1FD"}.mdi-eraser:before{content:"\F1FE"}.mdi-eraser-variant:before{content:"\F642"}.mdi-escalator:before{content:"\F1FF"}.mdi-ethernet:before{content:"\F200"}.mdi-ethernet-cable:before{content:"\F201"}.mdi-ethernet-cable-off:before{content:"\F202"}.mdi-etsy:before{content:"\F203"}.mdi-ev-station:before{content:"\F5F1"}.mdi-eventbrite:before{content:"\F7C6"}.mdi-evernote:before{content:"\F204"}.mdi-exclamation:before{content:"\F205"}.mdi-exit-to-app:before{content:"\F206"}.mdi-export:before{content:"\F207"}.mdi-eye:before{content:"\F208"}.mdi-eye-off:before{content:"\F209"}.mdi-eye-off-outline:before{content:"\F6D0"}.mdi-eye-outline:before{content:"\F6CF"}.mdi-eyedropper:before{content:"\F20A"}.mdi-eyedropper-variant:before{content:"\F20B"}.mdi-face:before{content:"\F643"}.mdi-face-profile:before{content:"\F644"}.mdi-facebook:before{content:"\F20C"}.mdi-facebook-box:before{content:"\F20D"}.mdi-facebook-messenger:before{content:"\F20E"}.mdi-factory:before{content:"\F20F"}.mdi-fan:before{content:"\F210"}.mdi-fast-forward:before{content:"\F211"}.mdi-fast-forward-outline:before{content:"\F6D1"}.mdi-fax:before{content:"\F212"}.mdi-feather:before{content:"\F6D2"}.mdi-ferry:before{content:"\F213"}.mdi-file:before{content:"\F214"}.mdi-file-account:before{content:"\F73A"}.mdi-file-chart:before{content:"\F215"}.mdi-file-check:before{content:"\F216"}.mdi-file-cloud:before{content:"\F217"}.mdi-file-delimited:before{content:"\F218"}.mdi-file-document:before{content:"\F219"}.mdi-file-document-box:before{content:"\F21A"}.mdi-file-excel:before{content:"\F21B"}.mdi-file-excel-box:before{content:"\F21C"}.mdi-file-export:before{content:"\F21D"}.mdi-file-find:before{content:"\F21E"}.mdi-file-hidden:before{content:"\F613"}.mdi-file-image:before{content:"\F21F"}.mdi-file-import:before{content:"\F220"}.mdi-file-lock:before{content:"\F221"}.mdi-file-multiple:before{content:"\F222"}.mdi-file-music:before{content:"\F223"}.mdi-file-outline:before{content:"\F224"}.mdi-file-pdf:before{content:"\F225"}.mdi-file-pdf-box:before{content:"\F226"}.mdi-file-plus:before{content:"\F751"}.mdi-file-powerpoint:before{content:"\F227"}.mdi-file-powerpoint-box:before{content:"\F228"}.mdi-file-presentation-box:before{content:"\F229"}.mdi-file-restore:before{content:"\F670"}.mdi-file-send:before{content:"\F22A"}.mdi-file-tree:before{content:"\F645"}.mdi-file-video:before{content:"\F22B"}.mdi-file-word:before{content:"\F22C"}.mdi-file-word-box:before{content:"\F22D"}.mdi-file-xml:before{content:"\F22E"}.mdi-film:before{content:"\F22F"}.mdi-filmstrip:before{content:"\F230"}.mdi-filmstrip-off:before{content:"\F231"}.mdi-filter:before{content:"\F232"}.mdi-filter-outline:before{content:"\F233"}.mdi-filter-remove:before{content:"\F234"}.mdi-filter-remove-outline:before{content:"\F235"}.mdi-filter-variant:before{content:"\F236"}.mdi-find-replace:before{content:"\F6D3"}.mdi-fingerprint:before{content:"\F237"}.mdi-fire:before{content:"\F238"}.mdi-firefox:before{content:"\F239"}.mdi-fish:before{content:"\F23A"}.mdi-flag:before{content:"\F23B"}.mdi-flag-checkered:before{content:"\F23C"}.mdi-flag-outline:before{content:"\F23D"}.mdi-flag-outline-variant:before{content:"\F23E"}.mdi-flag-triangle:before{content:"\F23F"}.mdi-flag-variant:before{content:"\F240"}.mdi-flash:before{content:"\F241"}.mdi-flash-auto:before{content:"\F242"}.mdi-flash-off:before{content:"\F243"}.mdi-flash-outline:before{content:"\F6D4"}.mdi-flash-red-eye:before{content:"\F67A"}.mdi-flashlight:before{content:"\F244"}.mdi-flashlight-off:before{content:"\F245"}.mdi-flask:before{content:"\F093"}.mdi-flask-empty:before{content:"\F094"}.mdi-flask-empty-outline:before{content:"\F095"}.mdi-flask-outline:before{content:"\F096"}.mdi-flattr:before{content:"\F246"}.mdi-flip-to-back:before{content:"\F247"}.mdi-flip-to-front:before{content:"\F248"}.mdi-floppy:before{content:"\F249"}.mdi-flower:before{content:"\F24A"}.mdi-folder:before{content:"\F24B"}.mdi-folder-account:before{content:"\F24C"}.mdi-folder-download:before{content:"\F24D"}.mdi-folder-google-drive:before{content:"\F24E"}.mdi-folder-image:before{content:"\F24F"}.mdi-folder-lock:before{content:"\F250"}.mdi-folder-lock-open:before{content:"\F251"}.mdi-folder-move:before{content:"\F252"}.mdi-folder-multiple:before{content:"\F253"}.mdi-folder-multiple-image:before{content:"\F254"}.mdi-folder-multiple-outline:before{content:"\F255"}.mdi-folder-open:before{content:"\F76F"}.mdi-folder-outline:before{content:"\F256"}.mdi-folder-plus:before{content:"\F257"}.mdi-folder-remove:before{content:"\F258"}.mdi-folder-star:before{content:"\F69C"}.mdi-folder-upload:before{content:"\F259"}.mdi-font-awesome:before{content:"\F03A"}.mdi-food:before{content:"\F25A"}.mdi-food-apple:before{content:"\F25B"}.mdi-food-croissant:before{content:"\F7C7"}.mdi-food-fork-drink:before{content:"\F5F2"}.mdi-food-off:before{content:"\F5F3"}.mdi-food-variant:before{content:"\F25C"}.mdi-football:before{content:"\F25D"}.mdi-football-australian:before{content:"\F25E"}.mdi-football-helmet:before{content:"\F25F"}.mdi-forklift:before{content:"\F7C8"}.mdi-format-align-bottom:before{content:"\F752"}.mdi-format-align-center:before{content:"\F260"}.mdi-format-align-justify:before{content:"\F261"}.mdi-format-align-left:before{content:"\F262"}.mdi-format-align-middle:before{content:"\F753"}.mdi-format-align-right:before{content:"\F263"}.mdi-format-align-top:before{content:"\F754"}.mdi-format-annotation-plus:before{content:"\F646"}.mdi-format-bold:before{content:"\F264"}.mdi-format-clear:before{content:"\F265"}.mdi-format-color-fill:before{content:"\F266"}.mdi-format-color-text:before{content:"\F69D"}.mdi-format-float-center:before{content:"\F267"}.mdi-format-float-left:before{content:"\F268"}.mdi-format-float-none:before{content:"\F269"}.mdi-format-float-right:before{content:"\F26A"}.mdi-format-font:before{content:"\F6D5"}.mdi-format-header-1:before{content:"\F26B"}.mdi-format-header-2:before{content:"\F26C"}.mdi-format-header-3:before{content:"\F26D"}.mdi-format-header-4:before{content:"\F26E"}.mdi-format-header-5:before{content:"\F26F"}.mdi-format-header-6:before{content:"\F270"}.mdi-format-header-decrease:before{content:"\F271"}.mdi-format-header-equal:before{content:"\F272"}.mdi-format-header-increase:before{content:"\F273"}.mdi-format-header-pound:before{content:"\F274"}.mdi-format-horizontal-align-center:before{content:"\F61E"}.mdi-format-horizontal-align-left:before{content:"\F61F"}.mdi-format-horizontal-align-right:before{content:"\F620"}.mdi-format-indent-decrease:before{content:"\F275"}.mdi-format-indent-increase:before{content:"\F276"}.mdi-format-italic:before{content:"\F277"}.mdi-format-line-spacing:before{content:"\F278"}.mdi-format-line-style:before{content:"\F5C8"}.mdi-format-line-weight:before{content:"\F5C9"}.mdi-format-list-bulleted:before{content:"\F279"}.mdi-format-list-bulleted-type:before{content:"\F27A"}.mdi-format-list-checks:before{content:"\F755"}.mdi-format-list-numbers:before{content:"\F27B"}.mdi-format-page-break:before{content:"\F6D6"}.mdi-format-paint:before{content:"\F27C"}.mdi-format-paragraph:before{content:"\F27D"}.mdi-format-pilcrow:before{content:"\F6D7"}.mdi-format-quote-close:before{content:"\F27E"}.mdi-format-quote-open:before{content:"\F756"}.mdi-format-rotate-90:before{content:"\F6A9"}.mdi-format-section:before{content:"\F69E"}.mdi-format-size:before{content:"\F27F"}.mdi-format-strikethrough:before{content:"\F280"}.mdi-format-strikethrough-variant:before{content:"\F281"}.mdi-format-subscript:before{content:"\F282"}.mdi-format-superscript:before{content:"\F283"}.mdi-format-text:before{content:"\F284"}.mdi-format-textdirection-l-to-r:before{content:"\F285"}.mdi-format-textdirection-r-to-l:before{content:"\F286"}.mdi-format-title:before{content:"\F5F4"}.mdi-format-underline:before{content:"\F287"}.mdi-format-vertical-align-bottom:before{content:"\F621"}.mdi-format-vertical-align-center:before{content:"\F622"}.mdi-format-vertical-align-top:before{content:"\F623"}.mdi-format-wrap-inline:before{content:"\F288"}.mdi-format-wrap-square:before{content:"\F289"}.mdi-format-wrap-tight:before{content:"\F28A"}.mdi-format-wrap-top-bottom:before{content:"\F28B"}.mdi-forum:before{content:"\F28C"}.mdi-forward:before{content:"\F28D"}.mdi-foursquare:before{content:"\F28E"}.mdi-fridge:before{content:"\F28F"}.mdi-fridge-filled:before{content:"\F290"}.mdi-fridge-filled-bottom:before{content:"\F291"}.mdi-fridge-filled-top:before{content:"\F292"}.mdi-fuel:before{content:"\F7C9"}.mdi-fullscreen:before{content:"\F293"}.mdi-fullscreen-exit:before{content:"\F294"}.mdi-function:before{content:"\F295"}.mdi-gamepad:before{content:"\F296"}.mdi-gamepad-variant:before{content:"\F297"}.mdi-garage:before{content:"\F6D8"}.mdi-garage-open:before{content:"\F6D9"}.mdi-gas-cylinder:before{content:"\F647"}.mdi-gas-station:before{content:"\F298"}.mdi-gate:before{content:"\F299"}.mdi-gauge:before{content:"\F29A"}.mdi-gavel:before{content:"\F29B"}.mdi-gender-female:before{content:"\F29C"}.mdi-gender-male:before{content:"\F29D"}.mdi-gender-male-female:before{content:"\F29E"}.mdi-gender-transgender:before{content:"\F29F"}.mdi-gesture:before{content:"\F7CA"}.mdi-gesture-double-tap:before{content:"\F73B"}.mdi-gesture-swipe-down:before{content:"\F73C"}.mdi-gesture-swipe-left:before{content:"\F73D"}.mdi-gesture-swipe-right:before{content:"\F73E"}.mdi-gesture-swipe-up:before{content:"\F73F"}.mdi-gesture-tap:before{content:"\F740"}.mdi-gesture-two-double-tap:before{content:"\F741"}.mdi-gesture-two-tap:before{content:"\F742"}.mdi-ghost:before{content:"\F2A0"}.mdi-gift:before{content:"\F2A1"}.mdi-git:before{content:"\F2A2"}.mdi-github-box:before{content:"\F2A3"}.mdi-github-circle:before{content:"\F2A4"}.mdi-github-face:before{content:"\F6DA"}.mdi-glass-flute:before{content:"\F2A5"}.mdi-glass-mug:before{content:"\F2A6"}.mdi-glass-stange:before{content:"\F2A7"}.mdi-glass-tulip:before{content:"\F2A8"}.mdi-glassdoor:before{content:"\F2A9"}.mdi-glasses:before{content:"\F2AA"}.mdi-gmail:before{content:"\F2AB"}.mdi-gnome:before{content:"\F2AC"}.mdi-gondola:before{content:"\F685"}.mdi-google:before{content:"\F2AD"}.mdi-google-analytics:before{content:"\F7CB"}.mdi-google-assistant:before{content:"\F7CC"}.mdi-google-cardboard:before{content:"\F2AE"}.mdi-google-chrome:before{content:"\F2AF"}.mdi-google-circles:before{content:"\F2B0"}.mdi-google-circles-communities:before{content:"\F2B1"}.mdi-google-circles-extended:before{content:"\F2B2"}.mdi-google-circles-group:before{content:"\F2B3"}.mdi-google-controller:before{content:"\F2B4"}.mdi-google-controller-off:before{content:"\F2B5"}.mdi-google-drive:before{content:"\F2B6"}.mdi-google-earth:before{content:"\F2B7"}.mdi-google-glass:before{content:"\F2B8"}.mdi-google-keep:before{content:"\F6DB"}.mdi-google-maps:before{content:"\F5F5"}.mdi-google-nearby:before{content:"\F2B9"}.mdi-google-pages:before{content:"\F2BA"}.mdi-google-photos:before{content:"\F6DC"}.mdi-google-physical-web:before{content:"\F2BB"}.mdi-google-play:before{content:"\F2BC"}.mdi-google-plus:before{content:"\F2BD"}.mdi-google-plus-box:before{content:"\F2BE"}.mdi-google-translate:before{content:"\F2BF"}.mdi-google-wallet:before{content:"\F2C0"}.mdi-gradient:before{content:"\F69F"}.mdi-grease-pencil:before{content:"\F648"}.mdi-grid:before{content:"\F2C1"}.mdi-grid-large:before{content:"\F757"}.mdi-grid-off:before{content:"\F2C2"}.mdi-group:before{content:"\F2C3"}.mdi-guitar-acoustic:before{content:"\F770"}.mdi-guitar-electric:before{content:"\F2C4"}.mdi-guitar-pick:before{content:"\F2C5"}.mdi-guitar-pick-outline:before{content:"\F2C6"}.mdi-hackernews:before{content:"\F624"}.mdi-hamburger:before{content:"\F684"}.mdi-hand-pointing-right:before{content:"\F2C7"}.mdi-hanger:before{content:"\F2C8"}.mdi-hangouts:before{content:"\F2C9"}.mdi-harddisk:before{content:"\F2CA"}.mdi-headphones:before{content:"\F2CB"}.mdi-headphones-box:before{content:"\F2CC"}.mdi-headphones-off:before{content:"\F7CD"}.mdi-headphones-settings:before{content:"\F2CD"}.mdi-headset:before{content:"\F2CE"}.mdi-headset-dock:before{content:"\F2CF"}.mdi-headset-off:before{content:"\F2D0"}.mdi-heart:before{content:"\F2D1"}.mdi-heart-box:before{content:"\F2D2"}.mdi-heart-box-outline:before{content:"\F2D3"}.mdi-heart-broken:before{content:"\F2D4"}.mdi-heart-half:before{content:"\F6DE"}.mdi-heart-half-full:before{content:"\F6DD"}.mdi-heart-half-outline:before{content:"\F6DF"}.mdi-heart-off:before{content:"\F758"}.mdi-heart-outline:before{content:"\F2D5"}.mdi-heart-pulse:before{content:"\F5F6"}.mdi-help:before{content:"\F2D6"}.mdi-help-box:before{content:"\F78A"}.mdi-help-circle:before{content:"\F2D7"}.mdi-help-circle-outline:before{content:"\F625"}.mdi-help-network:before{content:"\F6F4"}.mdi-hexagon:before{content:"\F2D8"}.mdi-hexagon-multiple:before{content:"\F6E0"}.mdi-hexagon-outline:before{content:"\F2D9"}.mdi-high-definition:before{content:"\F7CE"}.mdi-highway:before{content:"\F5F7"}.mdi-history:before{content:"\F2DA"}.mdi-hololens:before{content:"\F2DB"}.mdi-home:before{content:"\F2DC"}.mdi-home-assistant:before{content:"\F7CF"}.mdi-home-automation:before{content:"\F7D0"}.mdi-home-circle:before{content:"\F7D1"}.mdi-home-map-marker:before{content:"\F5F8"}.mdi-home-modern:before{content:"\F2DD"}.mdi-home-outline:before{content:"\F6A0"}.mdi-home-variant:before{content:"\F2DE"}.mdi-hook:before{content:"\F6E1"}.mdi-hook-off:before{content:"\F6E2"}.mdi-hops:before{content:"\F2DF"}.mdi-hospital:before{content:"\F2E0"}.mdi-hospital-building:before{content:"\F2E1"}.mdi-hospital-marker:before{content:"\F2E2"}.mdi-hotel:before{content:"\F2E3"}.mdi-houzz:before{content:"\F2E4"}.mdi-houzz-box:before{content:"\F2E5"}.mdi-human:before{content:"\F2E6"}.mdi-human-child:before{content:"\F2E7"}.mdi-human-female:before{content:"\F649"}.mdi-human-greeting:before{content:"\F64A"}.mdi-human-handsdown:before{content:"\F64B"}.mdi-human-handsup:before{content:"\F64C"}.mdi-human-male:before{content:"\F64D"}.mdi-human-male-female:before{content:"\F2E8"}.mdi-human-pregnant:before{content:"\F5CF"}.mdi-humble-bundle:before{content:"\F743"}.mdi-image:before{content:"\F2E9"}.mdi-image-album:before{content:"\F2EA"}.mdi-image-area:before{content:"\F2EB"}.mdi-image-area-close:before{content:"\F2EC"}.mdi-image-broken:before{content:"\F2ED"}.mdi-image-broken-variant:before{content:"\F2EE"}.mdi-image-filter:before{content:"\F2EF"}.mdi-image-filter-black-white:before{content:"\F2F0"}.mdi-image-filter-center-focus:before{content:"\F2F1"}.mdi-image-filter-center-focus-weak:before{content:"\F2F2"}.mdi-image-filter-drama:before{content:"\F2F3"}.mdi-image-filter-frames:before{content:"\F2F4"}.mdi-image-filter-hdr:before{content:"\F2F5"}.mdi-image-filter-none:before{content:"\F2F6"}.mdi-image-filter-tilt-shift:before{content:"\F2F7"}.mdi-image-filter-vintage:before{content:"\F2F8"}.mdi-image-multiple:before{content:"\F2F9"}.mdi-import:before{content:"\F2FA"}.mdi-inbox:before{content:"\F686"}.mdi-inbox-arrow-down:before{content:"\F2FB"}.mdi-inbox-arrow-up:before{content:"\F3D1"}.mdi-incognito:before{content:"\F5F9"}.mdi-infinity:before{content:"\F6E3"}.mdi-information:before{content:"\F2FC"}.mdi-information-outline:before{content:"\F2FD"}.mdi-information-variant:before{content:"\F64E"}.mdi-instagram:before{content:"\F2FE"}.mdi-instapaper:before{content:"\F2FF"}.mdi-internet-explorer:before{content:"\F300"}.mdi-invert-colors:before{content:"\F301"}.mdi-itunes:before{content:"\F676"}.mdi-jeepney:before{content:"\F302"}.mdi-jira:before{content:"\F303"}.mdi-jsfiddle:before{content:"\F304"}.mdi-json:before{content:"\F626"}.mdi-keg:before{content:"\F305"}.mdi-kettle:before{content:"\F5FA"}.mdi-key:before{content:"\F306"}.mdi-key-change:before{content:"\F307"}.mdi-key-minus:before{content:"\F308"}.mdi-key-plus:before{content:"\F309"}.mdi-key-remove:before{content:"\F30A"}.mdi-key-variant:before{content:"\F30B"}.mdi-keyboard:before{content:"\F30C"}.mdi-keyboard-backspace:before{content:"\F30D"}.mdi-keyboard-caps:before{content:"\F30E"}.mdi-keyboard-close:before{content:"\F30F"}.mdi-keyboard-off:before{content:"\F310"}.mdi-keyboard-return:before{content:"\F311"}.mdi-keyboard-tab:before{content:"\F312"}.mdi-keyboard-variant:before{content:"\F313"}.mdi-kickstarter:before{content:"\F744"}.mdi-kodi:before{content:"\F314"}.mdi-label:before{content:"\F315"}.mdi-label-outline:before{content:"\F316"}.mdi-lambda:before{content:"\F627"}.mdi-lamp:before{content:"\F6B4"}.mdi-lan:before{content:"\F317"}.mdi-lan-connect:before{content:"\F318"}.mdi-lan-disconnect:before{content:"\F319"}.mdi-lan-pending:before{content:"\F31A"}.mdi-language-c:before{content:"\F671"}.mdi-language-cpp:before{content:"\F672"}.mdi-language-csharp:before{content:"\F31B"}.mdi-language-css3:before{content:"\F31C"}.mdi-language-go:before{content:"\F7D2"}.mdi-language-html5:before{content:"\F31D"}.mdi-language-javascript:before{content:"\F31E"}.mdi-language-php:before{content:"\F31F"}.mdi-language-python:before{content:"\F320"}.mdi-language-python-text:before{content:"\F321"}.mdi-language-r:before{content:"\F7D3"}.mdi-language-swift:before{content:"\F6E4"}.mdi-language-typescript:before{content:"\F6E5"}.mdi-laptop:before{content:"\F322"}.mdi-laptop-chromebook:before{content:"\F323"}.mdi-laptop-mac:before{content:"\F324"}.mdi-laptop-off:before{content:"\F6E6"}.mdi-laptop-windows:before{content:"\F325"}.mdi-lastfm:before{content:"\F326"}.mdi-launch:before{content:"\F327"}.mdi-lava-lamp:before{content:"\F7D4"}.mdi-layers:before{content:"\F328"}.mdi-layers-off:before{content:"\F329"}.mdi-lead-pencil:before{content:"\F64F"}.mdi-leaf:before{content:"\F32A"}.mdi-led-off:before{content:"\F32B"}.mdi-led-on:before{content:"\F32C"}.mdi-led-outline:before{content:"\F32D"}.mdi-led-strip:before{content:"\F7D5"}.mdi-led-variant-off:before{content:"\F32E"}.mdi-led-variant-on:before{content:"\F32F"}.mdi-led-variant-outline:before{content:"\F330"}.mdi-library:before{content:"\F331"}.mdi-library-books:before{content:"\F332"}.mdi-library-music:before{content:"\F333"}.mdi-library-plus:before{content:"\F334"}.mdi-lightbulb:before{content:"\F335"}.mdi-lightbulb-on:before{content:"\F6E7"}.mdi-lightbulb-on-outline:before{content:"\F6E8"}.mdi-lightbulb-outline:before{content:"\F336"}.mdi-link:before{content:"\F337"}.mdi-link-off:before{content:"\F338"}.mdi-link-variant:before{content:"\F339"}.mdi-link-variant-off:before{content:"\F33A"}.mdi-linkedin:before{content:"\F33B"}.mdi-linkedin-box:before{content:"\F33C"}.mdi-linux:before{content:"\F33D"}.mdi-loading:before{content:"\F771"}.mdi-lock:before{content:"\F33E"}.mdi-lock-open:before{content:"\F33F"}.mdi-lock-open-outline:before{content:"\F340"}.mdi-lock-outline:before{content:"\F341"}.mdi-lock-pattern:before{content:"\F6E9"}.mdi-lock-plus:before{content:"\F5FB"}.mdi-lock-reset:before{content:"\F772"}.mdi-locker:before{content:"\F7D6"}.mdi-locker-multiple:before{content:"\F7D7"}.mdi-login:before{content:"\F342"}.mdi-login-variant:before{content:"\F5FC"}.mdi-logout:before{content:"\F343"}.mdi-logout-variant:before{content:"\F5FD"}.mdi-looks:before{content:"\F344"}.mdi-loop:before{content:"\F6EA"}.mdi-loupe:before{content:"\F345"}.mdi-lumx:before{content:"\F346"}.mdi-magnet:before{content:"\F347"}.mdi-magnet-on:before{content:"\F348"}.mdi-magnify:before{content:"\F349"}.mdi-magnify-minus:before{content:"\F34A"}.mdi-magnify-minus-outline:before{content:"\F6EB"}.mdi-magnify-plus:before{content:"\F34B"}.mdi-magnify-plus-outline:before{content:"\F6EC"}.mdi-mail-ru:before{content:"\F34C"}.mdi-mailbox:before{content:"\F6ED"}.mdi-map:before{content:"\F34D"}.mdi-map-marker:before{content:"\F34E"}.mdi-map-marker-circle:before{content:"\F34F"}.mdi-map-marker-minus:before{content:"\F650"}.mdi-map-marker-multiple:before{content:"\F350"}.mdi-map-marker-off:before{content:"\F351"}.mdi-map-marker-outline:before{content:"\F7D8"}.mdi-map-marker-plus:before{content:"\F651"}.mdi-map-marker-radius:before{content:"\F352"}.mdi-margin:before{content:"\F353"}.mdi-markdown:before{content:"\F354"}.mdi-marker:before{content:"\F652"}.mdi-marker-check:before{content:"\F355"}.mdi-martini:before{content:"\F356"}.mdi-material-ui:before{content:"\F357"}.mdi-math-compass:before{content:"\F358"}.mdi-matrix:before{content:"\F628"}.mdi-maxcdn:before{content:"\F359"}.mdi-medical-bag:before{content:"\F6EE"}.mdi-medium:before{content:"\F35A"}.mdi-memory:before{content:"\F35B"}.mdi-menu:before{content:"\F35C"}.mdi-menu-down:before{content:"\F35D"}.mdi-menu-down-outline:before{content:"\F6B5"}.mdi-menu-left:before{content:"\F35E"}.mdi-menu-right:before{content:"\F35F"}.mdi-menu-up:before{content:"\F360"}.mdi-menu-up-outline:before{content:"\F6B6"}.mdi-message:before{content:"\F361"}.mdi-message-alert:before{content:"\F362"}.mdi-message-bulleted:before{content:"\F6A1"}.mdi-message-bulleted-off:before{content:"\F6A2"}.mdi-message-draw:before{content:"\F363"}.mdi-message-image:before{content:"\F364"}.mdi-message-outline:before{content:"\F365"}.mdi-message-plus:before{content:"\F653"}.mdi-message-processing:before{content:"\F366"}.mdi-message-reply:before{content:"\F367"}.mdi-message-reply-text:before{content:"\F368"}.mdi-message-settings:before{content:"\F6EF"}.mdi-message-settings-variant:before{content:"\F6F0"}.mdi-message-text:before{content:"\F369"}.mdi-message-text-outline:before{content:"\F36A"}.mdi-message-video:before{content:"\F36B"}.mdi-meteor:before{content:"\F629"}.mdi-metronome:before{content:"\F7D9"}.mdi-metronome-tick:before{content:"\F7DA"}.mdi-micro-sd:before{content:"\F7DB"}.mdi-microphone:before{content:"\F36C"}.mdi-microphone-off:before{content:"\F36D"}.mdi-microphone-outline:before{content:"\F36E"}.mdi-microphone-settings:before{content:"\F36F"}.mdi-microphone-variant:before{content:"\F370"}.mdi-microphone-variant-off:before{content:"\F371"}.mdi-microscope:before{content:"\F654"}.mdi-microsoft:before{content:"\F372"}.mdi-minecraft:before{content:"\F373"}.mdi-minus:before{content:"\F374"}.mdi-minus-box:before{content:"\F375"}.mdi-minus-box-outline:before{content:"\F6F1"}.mdi-minus-circle:before{content:"\F376"}.mdi-minus-circle-outline:before{content:"\F377"}.mdi-minus-network:before{content:"\F378"}.mdi-mixcloud:before{content:"\F62A"}.mdi-mixer:before{content:"\F7DC"}.mdi-monitor:before{content:"\F379"}.mdi-monitor-multiple:before{content:"\F37A"}.mdi-more:before{content:"\F37B"}.mdi-motorbike:before{content:"\F37C"}.mdi-mouse:before{content:"\F37D"}.mdi-mouse-off:before{content:"\F37E"}.mdi-mouse-variant:before{content:"\F37F"}.mdi-mouse-variant-off:before{content:"\F380"}.mdi-move-resize:before{content:"\F655"}.mdi-move-resize-variant:before{content:"\F656"}.mdi-movie:before{content:"\F381"}.mdi-movie-roll:before{content:"\F7DD"}.mdi-multiplication:before{content:"\F382"}.mdi-multiplication-box:before{content:"\F383"}.mdi-mushroom:before{content:"\F7DE"}.mdi-mushroom-outline:before{content:"\F7DF"}.mdi-music:before{content:"\F759"}.mdi-music-box:before{content:"\F384"}.mdi-music-box-outline:before{content:"\F385"}.mdi-music-circle:before{content:"\F386"}.mdi-music-note:before{content:"\F387"}.mdi-music-note-bluetooth:before{content:"\F5FE"}.mdi-music-note-bluetooth-off:before{content:"\F5FF"}.mdi-music-note-eighth:before{content:"\F388"}.mdi-music-note-half:before{content:"\F389"}.mdi-music-note-off:before{content:"\F38A"}.mdi-music-note-quarter:before{content:"\F38B"}.mdi-music-note-sixteenth:before{content:"\F38C"}.mdi-music-note-whole:before{content:"\F38D"}.mdi-music-off:before{content:"\F75A"}.mdi-nature:before{content:"\F38E"}.mdi-nature-people:before{content:"\F38F"}.mdi-navigation:before{content:"\F390"}.mdi-near-me:before{content:"\F5CD"}.mdi-needle:before{content:"\F391"}.mdi-nest-protect:before{content:"\F392"}.mdi-nest-thermostat:before{content:"\F393"}.mdi-netflix:before{content:"\F745"}.mdi-network:before{content:"\F6F2"}.mdi-new-box:before{content:"\F394"}.mdi-newspaper:before{content:"\F395"}.mdi-nfc:before{content:"\F396"}.mdi-nfc-tap:before{content:"\F397"}.mdi-nfc-variant:before{content:"\F398"}.mdi-ninja:before{content:"\F773"}.mdi-nintendo-switch:before{content:"\F7E0"}.mdi-nodejs:before{content:"\F399"}.mdi-note:before{content:"\F39A"}.mdi-note-multiple:before{content:"\F6B7"}.mdi-note-multiple-outline:before{content:"\F6B8"}.mdi-note-outline:before{content:"\F39B"}.mdi-note-plus:before{content:"\F39C"}.mdi-note-plus-outline:before{content:"\F39D"}.mdi-note-text:before{content:"\F39E"}.mdi-notification-clear-all:before{content:"\F39F"}.mdi-npm:before{content:"\F6F6"}.mdi-nuke:before{content:"\F6A3"}.mdi-null:before{content:"\F7E1"}.mdi-numeric:before{content:"\F3A0"}.mdi-numeric-0-box:before{content:"\F3A1"}.mdi-numeric-0-box-multiple-outline:before{content:"\F3A2"}.mdi-numeric-0-box-outline:before{content:"\F3A3"}.mdi-numeric-1-box:before{content:"\F3A4"}.mdi-numeric-1-box-multiple-outline:before{content:"\F3A5"}.mdi-numeric-1-box-outline:before{content:"\F3A6"}.mdi-numeric-2-box:before{content:"\F3A7"}.mdi-numeric-2-box-multiple-outline:before{content:"\F3A8"}.mdi-numeric-2-box-outline:before{content:"\F3A9"}.mdi-numeric-3-box:before{content:"\F3AA"}.mdi-numeric-3-box-multiple-outline:before{content:"\F3AB"}.mdi-numeric-3-box-outline:before{content:"\F3AC"}.mdi-numeric-4-box:before{content:"\F3AD"}.mdi-numeric-4-box-multiple-outline:before{content:"\F3AE"}.mdi-numeric-4-box-outline:before{content:"\F3AF"}.mdi-numeric-5-box:before{content:"\F3B0"}.mdi-numeric-5-box-multiple-outline:before{content:"\F3B1"}.mdi-numeric-5-box-outline:before{content:"\F3B2"}.mdi-numeric-6-box:before{content:"\F3B3"}.mdi-numeric-6-box-multiple-outline:before{content:"\F3B4"}.mdi-numeric-6-box-outline:before{content:"\F3B5"}.mdi-numeric-7-box:before{content:"\F3B6"}.mdi-numeric-7-box-multiple-outline:before{content:"\F3B7"}.mdi-numeric-7-box-outline:before{content:"\F3B8"}.mdi-numeric-8-box:before{content:"\F3B9"}.mdi-numeric-8-box-multiple-outline:before{content:"\F3BA"}.mdi-numeric-8-box-outline:before{content:"\F3BB"}.mdi-numeric-9-box:before{content:"\F3BC"}.mdi-numeric-9-box-multiple-outline:before{content:"\F3BD"}.mdi-numeric-9-box-outline:before{content:"\F3BE"}.mdi-numeric-9-plus-box:before{content:"\F3BF"}.mdi-numeric-9-plus-box-multiple-outline:before{content:"\F3C0"}.mdi-numeric-9-plus-box-outline:before{content:"\F3C1"}.mdi-nut:before{content:"\F6F7"}.mdi-nutrition:before{content:"\F3C2"}.mdi-oar:before{content:"\F67B"}.mdi-octagon:before{content:"\F3C3"}.mdi-octagon-outline:before{content:"\F3C4"}.mdi-octagram:before{content:"\F6F8"}.mdi-octagram-outline:before{content:"\F774"}.mdi-odnoklassniki:before{content:"\F3C5"}.mdi-office:before{content:"\F3C6"}.mdi-oil:before{content:"\F3C7"}.mdi-oil-temperature:before{content:"\F3C8"}.mdi-omega:before{content:"\F3C9"}.mdi-onedrive:before{content:"\F3CA"}.mdi-onenote:before{content:"\F746"}.mdi-opacity:before{content:"\F5CC"}.mdi-open-in-app:before{content:"\F3CB"}.mdi-open-in-new:before{content:"\F3CC"}.mdi-openid:before{content:"\F3CD"}.mdi-opera:before{content:"\F3CE"}.mdi-orbit:before{content:"\F018"}.mdi-ornament:before{content:"\F3CF"}.mdi-ornament-variant:before{content:"\F3D0"}.mdi-owl:before{content:"\F3D2"}.mdi-package:before{content:"\F3D3"}.mdi-package-down:before{content:"\F3D4"}.mdi-package-up:before{content:"\F3D5"}.mdi-package-variant:before{content:"\F3D6"}.mdi-package-variant-closed:before{content:"\F3D7"}.mdi-page-first:before{content:"\F600"}.mdi-page-last:before{content:"\F601"}.mdi-page-layout-body:before{content:"\F6F9"}.mdi-page-layout-footer:before{content:"\F6FA"}.mdi-page-layout-header:before{content:"\F6FB"}.mdi-page-layout-sidebar-left:before{content:"\F6FC"}.mdi-page-layout-sidebar-right:before{content:"\F6FD"}.mdi-palette:before{content:"\F3D8"}.mdi-palette-advanced:before{content:"\F3D9"}.mdi-panda:before{content:"\F3DA"}.mdi-pandora:before{content:"\F3DB"}.mdi-panorama:before{content:"\F3DC"}.mdi-panorama-fisheye:before{content:"\F3DD"}.mdi-panorama-horizontal:before{content:"\F3DE"}.mdi-panorama-vertical:before{content:"\F3DF"}.mdi-panorama-wide-angle:before{content:"\F3E0"}.mdi-paper-cut-vertical:before{content:"\F3E1"}.mdi-paperclip:before{content:"\F3E2"}.mdi-parking:before{content:"\F3E3"}.mdi-passport:before{content:"\F7E2"}.mdi-pause:before{content:"\F3E4"}.mdi-pause-circle:before{content:"\F3E5"}.mdi-pause-circle-outline:before{content:"\F3E6"}.mdi-pause-octagon:before{content:"\F3E7"}.mdi-pause-octagon-outline:before{content:"\F3E8"}.mdi-paw:before{content:"\F3E9"}.mdi-paw-off:before{content:"\F657"}.mdi-pen:before{content:"\F3EA"}.mdi-pencil:before{content:"\F3EB"}.mdi-pencil-box:before{content:"\F3EC"}.mdi-pencil-box-outline:before{content:"\F3ED"}.mdi-pencil-circle:before{content:"\F6FE"}.mdi-pencil-circle-outline:before{content:"\F775"}.mdi-pencil-lock:before{content:"\F3EE"}.mdi-pencil-off:before{content:"\F3EF"}.mdi-pentagon:before{content:"\F6FF"}.mdi-pentagon-outline:before{content:"\F700"}.mdi-percent:before{content:"\F3F0"}.mdi-periodic-table-co2:before{content:"\F7E3"}.mdi-periscope:before{content:"\F747"}.mdi-pharmacy:before{content:"\F3F1"}.mdi-phone:before{content:"\F3F2"}.mdi-phone-bluetooth:before{content:"\F3F3"}.mdi-phone-classic:before{content:"\F602"}.mdi-phone-forward:before{content:"\F3F4"}.mdi-phone-hangup:before{content:"\F3F5"}.mdi-phone-in-talk:before{content:"\F3F6"}.mdi-phone-incoming:before{content:"\F3F7"}.mdi-phone-locked:before{content:"\F3F8"}.mdi-phone-log:before{content:"\F3F9"}.mdi-phone-minus:before{content:"\F658"}.mdi-phone-missed:before{content:"\F3FA"}.mdi-phone-outgoing:before{content:"\F3FB"}.mdi-phone-paused:before{content:"\F3FC"}.mdi-phone-plus:before{content:"\F659"}.mdi-phone-settings:before{content:"\F3FD"}.mdi-phone-voip:before{content:"\F3FE"}.mdi-pi:before{content:"\F3FF"}.mdi-pi-box:before{content:"\F400"}.mdi-piano:before{content:"\F67C"}.mdi-pig:before{content:"\F401"}.mdi-pill:before{content:"\F402"}.mdi-pillar:before{content:"\F701"}.mdi-pin:before{content:"\F403"}.mdi-pin-off:before{content:"\F404"}.mdi-pine-tree:before{content:"\F405"}.mdi-pine-tree-box:before{content:"\F406"}.mdi-pinterest:before{content:"\F407"}.mdi-pinterest-box:before{content:"\F408"}.mdi-pipe:before{content:"\F7E4"}.mdi-pipe-disconnected:before{content:"\F7E5"}.mdi-pistol:before{content:"\F702"}.mdi-pizza:before{content:"\F409"}.mdi-plane-shield:before{content:"\F6BA"}.mdi-play:before{content:"\F40A"}.mdi-play-box-outline:before{content:"\F40B"}.mdi-play-circle:before{content:"\F40C"}.mdi-play-circle-outline:before{content:"\F40D"}.mdi-play-pause:before{content:"\F40E"}.mdi-play-protected-content:before{content:"\F40F"}.mdi-playlist-check:before{content:"\F5C7"}.mdi-playlist-minus:before{content:"\F410"}.mdi-playlist-play:before{content:"\F411"}.mdi-playlist-plus:before{content:"\F412"}.mdi-playlist-remove:before{content:"\F413"}.mdi-playstation:before{content:"\F414"}.mdi-plex:before{content:"\F6B9"}.mdi-plus:before{content:"\F415"}.mdi-plus-box:before{content:"\F416"}.mdi-plus-box-outline:before{content:"\F703"}.mdi-plus-circle:before{content:"\F417"}.mdi-plus-circle-multiple-outline:before{content:"\F418"}.mdi-plus-circle-outline:before{content:"\F419"}.mdi-plus-network:before{content:"\F41A"}.mdi-plus-one:before{content:"\F41B"}.mdi-plus-outline:before{content:"\F704"}.mdi-pocket:before{content:"\F41C"}.mdi-pokeball:before{content:"\F41D"}.mdi-polaroid:before{content:"\F41E"}.mdi-poll:before{content:"\F41F"}.mdi-poll-box:before{content:"\F420"}.mdi-polymer:before{content:"\F421"}.mdi-pool:before{content:"\F606"}.mdi-popcorn:before{content:"\F422"}.mdi-pot:before{content:"\F65A"}.mdi-pot-mix:before{content:"\F65B"}.mdi-pound:before{content:"\F423"}.mdi-pound-box:before{content:"\F424"}.mdi-power:before{content:"\F425"}.mdi-power-plug:before{content:"\F6A4"}.mdi-power-plug-off:before{content:"\F6A5"}.mdi-power-settings:before{content:"\F426"}.mdi-power-socket:before{content:"\F427"}.mdi-power-socket-eu:before{content:"\F7E6"}.mdi-power-socket-uk:before{content:"\F7E7"}.mdi-power-socket-us:before{content:"\F7E8"}.mdi-prescription:before{content:"\F705"}.mdi-presentation:before{content:"\F428"}.mdi-presentation-play:before{content:"\F429"}.mdi-printer:before{content:"\F42A"}.mdi-printer-3d:before{content:"\F42B"}.mdi-printer-alert:before{content:"\F42C"}.mdi-printer-settings:before{content:"\F706"}.mdi-priority-high:before{content:"\F603"}.mdi-priority-low:before{content:"\F604"}.mdi-professional-hexagon:before{content:"\F42D"}.mdi-projector:before{content:"\F42E"}.mdi-projector-screen:before{content:"\F42F"}.mdi-publish:before{content:"\F6A6"}.mdi-pulse:before{content:"\F430"}.mdi-puzzle:before{content:"\F431"}.mdi-qqchat:before{content:"\F605"}.mdi-qrcode:before{content:"\F432"}.mdi-qrcode-scan:before{content:"\F433"}.mdi-quadcopter:before{content:"\F434"}.mdi-quality-high:before{content:"\F435"}.mdi-quicktime:before{content:"\F436"}.mdi-radar:before{content:"\F437"}.mdi-radiator:before{content:"\F438"}.mdi-radio:before{content:"\F439"}.mdi-radio-handheld:before{content:"\F43A"}.mdi-radio-tower:before{content:"\F43B"}.mdi-radioactive:before{content:"\F43C"}.mdi-radiobox-blank:before{content:"\F43D"}.mdi-radiobox-marked:before{content:"\F43E"}.mdi-raspberrypi:before{content:"\F43F"}.mdi-ray-end:before{content:"\F440"}.mdi-ray-end-arrow:before{content:"\F441"}.mdi-ray-start:before{content:"\F442"}.mdi-ray-start-arrow:before{content:"\F443"}.mdi-ray-start-end:before{content:"\F444"}.mdi-ray-vertex:before{content:"\F445"}.mdi-rdio:before{content:"\F446"}.mdi-react:before{content:"\F707"}.mdi-read:before{content:"\F447"}.mdi-readability:before{content:"\F448"}.mdi-receipt:before{content:"\F449"}.mdi-record:before{content:"\F44A"}.mdi-record-rec:before{content:"\F44B"}.mdi-recycle:before{content:"\F44C"}.mdi-reddit:before{content:"\F44D"}.mdi-redo:before{content:"\F44E"}.mdi-redo-variant:before{content:"\F44F"}.mdi-refresh:before{content:"\F450"}.mdi-regex:before{content:"\F451"}.mdi-relative-scale:before{content:"\F452"}.mdi-reload:before{content:"\F453"}.mdi-remote:before{content:"\F454"}.mdi-rename-box:before{content:"\F455"}.mdi-reorder-horizontal:before{content:"\F687"}.mdi-reorder-vertical:before{content:"\F688"}.mdi-repeat:before{content:"\F456"}.mdi-repeat-off:before{content:"\F457"}.mdi-repeat-once:before{content:"\F458"}.mdi-replay:before{content:"\F459"}.mdi-reply:before{content:"\F45A"}.mdi-reply-all:before{content:"\F45B"}.mdi-reproduction:before{content:"\F45C"}.mdi-resize-bottom-right:before{content:"\F45D"}.mdi-responsive:before{content:"\F45E"}.mdi-restart:before{content:"\F708"}.mdi-restore:before{content:"\F6A7"}.mdi-rewind:before{content:"\F45F"}.mdi-rewind-outline:before{content:"\F709"}.mdi-rhombus:before{content:"\F70A"}.mdi-rhombus-outline:before{content:"\F70B"}.mdi-ribbon:before{content:"\F460"}.mdi-rice:before{content:"\F7E9"}.mdi-ring:before{content:"\F7EA"}.mdi-road:before{content:"\F461"}.mdi-road-variant:before{content:"\F462"}.mdi-robot:before{content:"\F6A8"}.mdi-rocket:before{content:"\F463"}.mdi-roomba:before{content:"\F70C"}.mdi-rotate-3d:before{content:"\F464"}.mdi-rotate-left:before{content:"\F465"}.mdi-rotate-left-variant:before{content:"\F466"}.mdi-rotate-right:before{content:"\F467"}.mdi-rotate-right-variant:before{content:"\F468"}.mdi-rounded-corner:before{content:"\F607"}.mdi-router-wireless:before{content:"\F469"}.mdi-routes:before{content:"\F46A"}.mdi-rowing:before{content:"\F608"}.mdi-rss:before{content:"\F46B"}.mdi-rss-box:before{content:"\F46C"}.mdi-ruler:before{content:"\F46D"}.mdi-run:before{content:"\F70D"}.mdi-run-fast:before{content:"\F46E"}.mdi-sale:before{content:"\F46F"}.mdi-sass:before{content:"\F7EB"}.mdi-satellite:before{content:"\F470"}.mdi-satellite-variant:before{content:"\F471"}.mdi-saxophone:before{content:"\F609"}.mdi-scale:before{content:"\F472"}.mdi-scale-balance:before{content:"\F5D1"}.mdi-scale-bathroom:before{content:"\F473"}.mdi-scanner:before{content:"\F6AA"}.mdi-school:before{content:"\F474"}.mdi-screen-rotation:before{content:"\F475"}.mdi-screen-rotation-lock:before{content:"\F476"}.mdi-screwdriver:before{content:"\F477"}.mdi-script:before{content:"\F478"}.mdi-sd:before{content:"\F479"}.mdi-seal:before{content:"\F47A"}.mdi-search-web:before{content:"\F70E"}.mdi-seat-flat:before{content:"\F47B"}.mdi-seat-flat-angled:before{content:"\F47C"}.mdi-seat-individual-suite:before{content:"\F47D"}.mdi-seat-legroom-extra:before{content:"\F47E"}.mdi-seat-legroom-normal:before{content:"\F47F"}.mdi-seat-legroom-reduced:before{content:"\F480"}.mdi-seat-recline-extra:before{content:"\F481"}.mdi-seat-recline-normal:before{content:"\F482"}.mdi-security:before{content:"\F483"}.mdi-security-home:before{content:"\F689"}.mdi-security-network:before{content:"\F484"}.mdi-select:before{content:"\F485"}.mdi-select-all:before{content:"\F486"}.mdi-select-inverse:before{content:"\F487"}.mdi-select-off:before{content:"\F488"}.mdi-selection:before{content:"\F489"}.mdi-selection-off:before{content:"\F776"}.mdi-send:before{content:"\F48A"}.mdi-send-secure:before{content:"\F7EC"}.mdi-serial-port:before{content:"\F65C"}.mdi-server:before{content:"\F48B"}.mdi-server-minus:before{content:"\F48C"}.mdi-server-network:before{content:"\F48D"}.mdi-server-network-off:before{content:"\F48E"}.mdi-server-off:before{content:"\F48F"}.mdi-server-plus:before{content:"\F490"}.mdi-server-remove:before{content:"\F491"}.mdi-server-security:before{content:"\F492"}.mdi-set-all:before{content:"\F777"}.mdi-set-center:before{content:"\F778"}.mdi-set-center-right:before{content:"\F779"}.mdi-set-left:before{content:"\F77A"}.mdi-set-left-center:before{content:"\F77B"}.mdi-set-left-right:before{content:"\F77C"}.mdi-set-none:before{content:"\F77D"}.mdi-set-right:before{content:"\F77E"}.mdi-settings:before{content:"\F493"}.mdi-settings-box:before{content:"\F494"}.mdi-shape-circle-plus:before{content:"\F65D"}.mdi-shape-plus:before{content:"\F495"}.mdi-shape-polygon-plus:before{content:"\F65E"}.mdi-shape-rectangle-plus:before{content:"\F65F"}.mdi-shape-square-plus:before{content:"\F660"}.mdi-share:before{content:"\F496"}.mdi-share-variant:before{content:"\F497"}.mdi-shield:before{content:"\F498"}.mdi-shield-half-full:before{content:"\F77F"}.mdi-shield-outline:before{content:"\F499"}.mdi-shopping:before{content:"\F49A"}.mdi-shopping-music:before{content:"\F49B"}.mdi-shovel:before{content:"\F70F"}.mdi-shovel-off:before{content:"\F710"}.mdi-shredder:before{content:"\F49C"}.mdi-shuffle:before{content:"\F49D"}.mdi-shuffle-disabled:before{content:"\F49E"}.mdi-shuffle-variant:before{content:"\F49F"}.mdi-sigma:before{content:"\F4A0"}.mdi-sigma-lower:before{content:"\F62B"}.mdi-sign-caution:before{content:"\F4A1"}.mdi-sign-direction:before{content:"\F780"}.mdi-sign-text:before{content:"\F781"}.mdi-signal:before{content:"\F4A2"}.mdi-signal-2g:before{content:"\F711"}.mdi-signal-3g:before{content:"\F712"}.mdi-signal-4g:before{content:"\F713"}.mdi-signal-hspa:before{content:"\F714"}.mdi-signal-hspa-plus:before{content:"\F715"}.mdi-signal-off:before{content:"\F782"}.mdi-signal-variant:before{content:"\F60A"}.mdi-silverware:before{content:"\F4A3"}.mdi-silverware-fork:before{content:"\F4A4"}.mdi-silverware-spoon:before{content:"\F4A5"}.mdi-silverware-variant:before{content:"\F4A6"}.mdi-sim:before{content:"\F4A7"}.mdi-sim-alert:before{content:"\F4A8"}.mdi-sim-off:before{content:"\F4A9"}.mdi-sitemap:before{content:"\F4AA"}.mdi-skip-backward:before{content:"\F4AB"}.mdi-skip-forward:before{content:"\F4AC"}.mdi-skip-next:before{content:"\F4AD"}.mdi-skip-next-circle:before{content:"\F661"}.mdi-skip-next-circle-outline:before{content:"\F662"}.mdi-skip-previous:before{content:"\F4AE"}.mdi-skip-previous-circle:before{content:"\F663"}.mdi-skip-previous-circle-outline:before{content:"\F664"}.mdi-skull:before{content:"\F68B"}.mdi-skype:before{content:"\F4AF"}.mdi-skype-business:before{content:"\F4B0"}.mdi-slack:before{content:"\F4B1"}.mdi-sleep:before{content:"\F4B2"}.mdi-sleep-off:before{content:"\F4B3"}.mdi-smoking:before{content:"\F4B4"}.mdi-smoking-off:before{content:"\F4B5"}.mdi-snapchat:before{content:"\F4B6"}.mdi-snowflake:before{content:"\F716"}.mdi-snowman:before{content:"\F4B7"}.mdi-soccer:before{content:"\F4B8"}.mdi-sofa:before{content:"\F4B9"}.mdi-solid:before{content:"\F68C"}.mdi-sort:before{content:"\F4BA"}.mdi-sort-alphabetical:before{content:"\F4BB"}.mdi-sort-ascending:before{content:"\F4BC"}.mdi-sort-descending:before{content:"\F4BD"}.mdi-sort-numeric:before{content:"\F4BE"}.mdi-sort-variant:before{content:"\F4BF"}.mdi-soundcloud:before{content:"\F4C0"}.mdi-source-branch:before{content:"\F62C"}.mdi-source-commit:before{content:"\F717"}.mdi-source-commit-end:before{content:"\F718"}.mdi-source-commit-end-local:before{content:"\F719"}.mdi-source-commit-local:before{content:"\F71A"}.mdi-source-commit-next-local:before{content:"\F71B"}.mdi-source-commit-start:before{content:"\F71C"}.mdi-source-commit-start-next-local:before{content:"\F71D"}.mdi-source-fork:before{content:"\F4C1"}.mdi-source-merge:before{content:"\F62D"}.mdi-source-pull:before{content:"\F4C2"}.mdi-soy-sauce:before{content:"\F7ED"}.mdi-speaker:before{content:"\F4C3"}.mdi-speaker-off:before{content:"\F4C4"}.mdi-speaker-wireless:before{content:"\F71E"}.mdi-speedometer:before{content:"\F4C5"}.mdi-spellcheck:before{content:"\F4C6"}.mdi-spotify:before{content:"\F4C7"}.mdi-spotlight:before{content:"\F4C8"}.mdi-spotlight-beam:before{content:"\F4C9"}.mdi-spray:before{content:"\F665"}.mdi-square:before{content:"\F763"}.mdi-square-inc:before{content:"\F4CA"}.mdi-square-inc-cash:before{content:"\F4CB"}.mdi-square-outline:before{content:"\F762"}.mdi-square-root:before{content:"\F783"}.mdi-stackexchange:before{content:"\F60B"}.mdi-stackoverflow:before{content:"\F4CC"}.mdi-stadium:before{content:"\F71F"}.mdi-stairs:before{content:"\F4CD"}.mdi-standard-definition:before{content:"\F7EE"}.mdi-star:before{content:"\F4CE"}.mdi-star-circle:before{content:"\F4CF"}.mdi-star-half:before{content:"\F4D0"}.mdi-star-off:before{content:"\F4D1"}.mdi-star-outline:before{content:"\F4D2"}.mdi-steam:before{content:"\F4D3"}.mdi-steering:before{content:"\F4D4"}.mdi-step-backward:before{content:"\F4D5"}.mdi-step-backward-2:before{content:"\F4D6"}.mdi-step-forward:before{content:"\F4D7"}.mdi-step-forward-2:before{content:"\F4D8"}.mdi-stethoscope:before{content:"\F4D9"}.mdi-sticker:before{content:"\F5D0"}.mdi-sticker-emoji:before{content:"\F784"}.mdi-stocking:before{content:"\F4DA"}.mdi-stop:before{content:"\F4DB"}.mdi-stop-circle:before{content:"\F666"}.mdi-stop-circle-outline:before{content:"\F667"}.mdi-store:before{content:"\F4DC"}.mdi-store-24-hour:before{content:"\F4DD"}.mdi-stove:before{content:"\F4DE"}.mdi-subdirectory-arrow-left:before{content:"\F60C"}.mdi-subdirectory-arrow-right:before{content:"\F60D"}.mdi-subway:before{content:"\F6AB"}.mdi-subway-variant:before{content:"\F4DF"}.mdi-summit:before{content:"\F785"}.mdi-sunglasses:before{content:"\F4E0"}.mdi-surround-sound:before{content:"\F5C5"}.mdi-surround-sound-2-0:before{content:"\F7EF"}.mdi-surround-sound-3-1:before{content:"\F7F0"}.mdi-surround-sound-5-1:before{content:"\F7F1"}.mdi-surround-sound-7-1:before{content:"\F7F2"}.mdi-svg:before{content:"\F720"}.mdi-swap-horizontal:before{content:"\F4E1"}.mdi-swap-vertical:before{content:"\F4E2"}.mdi-swim:before{content:"\F4E3"}.mdi-switch:before{content:"\F4E4"}.mdi-sword:before{content:"\F4E5"}.mdi-sword-cross:before{content:"\F786"}.mdi-sync:before{content:"\F4E6"}.mdi-sync-alert:before{content:"\F4E7"}.mdi-sync-off:before{content:"\F4E8"}.mdi-tab:before{content:"\F4E9"}.mdi-tab-plus:before{content:"\F75B"}.mdi-tab-unselected:before{content:"\F4EA"}.mdi-table:before{content:"\F4EB"}.mdi-table-column-plus-after:before{content:"\F4EC"}.mdi-table-column-plus-before:before{content:"\F4ED"}.mdi-table-column-remove:before{content:"\F4EE"}.mdi-table-column-width:before{content:"\F4EF"}.mdi-table-edit:before{content:"\F4F0"}.mdi-table-large:before{content:"\F4F1"}.mdi-table-row-height:before{content:"\F4F2"}.mdi-table-row-plus-after:before{content:"\F4F3"}.mdi-table-row-plus-before:before{content:"\F4F4"}.mdi-table-row-remove:before{content:"\F4F5"}.mdi-tablet:before{content:"\F4F6"}.mdi-tablet-android:before{content:"\F4F7"}.mdi-tablet-ipad:before{content:"\F4F8"}.mdi-taco:before{content:"\F761"}.mdi-tag:before{content:"\F4F9"}.mdi-tag-faces:before{content:"\F4FA"}.mdi-tag-heart:before{content:"\F68A"}.mdi-tag-multiple:before{content:"\F4FB"}.mdi-tag-outline:before{content:"\F4FC"}.mdi-tag-plus:before{content:"\F721"}.mdi-tag-remove:before{content:"\F722"}.mdi-tag-text-outline:before{content:"\F4FD"}.mdi-target:before{content:"\F4FE"}.mdi-taxi:before{content:"\F4FF"}.mdi-teamviewer:before{content:"\F500"}.mdi-telegram:before{content:"\F501"}.mdi-television:before{content:"\F502"}.mdi-television-classic:before{content:"\F7F3"}.mdi-television-guide:before{content:"\F503"}.mdi-temperature-celsius:before{content:"\F504"}.mdi-temperature-fahrenheit:before{content:"\F505"}.mdi-temperature-kelvin:before{content:"\F506"}.mdi-tennis:before{content:"\F507"}.mdi-tent:before{content:"\F508"}.mdi-terrain:before{content:"\F509"}.mdi-test-tube:before{content:"\F668"}.mdi-text-shadow:before{content:"\F669"}.mdi-text-to-speech:before{content:"\F50A"}.mdi-text-to-speech-off:before{content:"\F50B"}.mdi-textbox:before{content:"\F60E"}.mdi-textbox-password:before{content:"\F7F4"}.mdi-texture:before{content:"\F50C"}.mdi-theater:before{content:"\F50D"}.mdi-theme-light-dark:before{content:"\F50E"}.mdi-thermometer:before{content:"\F50F"}.mdi-thermometer-lines:before{content:"\F510"}.mdi-thought-bubble:before{content:"\F7F5"}.mdi-thought-bubble-outline:before{content:"\F7F6"}.mdi-thumb-down:before{content:"\F511"}.mdi-thumb-down-outline:before{content:"\F512"}.mdi-thumb-up:before{content:"\F513"}.mdi-thumb-up-outline:before{content:"\F514"}.mdi-thumbs-up-down:before{content:"\F515"}.mdi-ticket:before{content:"\F516"}.mdi-ticket-account:before{content:"\F517"}.mdi-ticket-confirmation:before{content:"\F518"}.mdi-ticket-percent:before{content:"\F723"}.mdi-tie:before{content:"\F519"}.mdi-tilde:before{content:"\F724"}.mdi-timelapse:before{content:"\F51A"}.mdi-timer:before{content:"\F51B"}.mdi-timer-10:before{content:"\F51C"}.mdi-timer-3:before{content:"\F51D"}.mdi-timer-off:before{content:"\F51E"}.mdi-timer-sand:before{content:"\F51F"}.mdi-timer-sand-empty:before{content:"\F6AC"}.mdi-timer-sand-full:before{content:"\F78B"}.mdi-timetable:before{content:"\F520"}.mdi-toggle-switch:before{content:"\F521"}.mdi-toggle-switch-off:before{content:"\F522"}.mdi-tooltip:before{content:"\F523"}.mdi-tooltip-edit:before{content:"\F524"}.mdi-tooltip-image:before{content:"\F525"}.mdi-tooltip-outline:before{content:"\F526"}.mdi-tooltip-outline-plus:before{content:"\F527"}.mdi-tooltip-text:before{content:"\F528"}.mdi-tooth:before{content:"\F529"}.mdi-tor:before{content:"\F52A"}.mdi-tower-beach:before{content:"\F680"}.mdi-tower-fire:before{content:"\F681"}.mdi-trackpad:before{content:"\F7F7"}.mdi-traffic-light:before{content:"\F52B"}.mdi-train:before{content:"\F52C"}.mdi-tram:before{content:"\F52D"}.mdi-transcribe:before{content:"\F52E"}.mdi-transcribe-close:before{content:"\F52F"}.mdi-transfer:before{content:"\F530"}.mdi-transit-transfer:before{content:"\F6AD"}.mdi-translate:before{content:"\F5CA"}.mdi-treasure-chest:before{content:"\F725"}.mdi-tree:before{content:"\F531"}.mdi-trello:before{content:"\F532"}.mdi-trending-down:before{content:"\F533"}.mdi-trending-neutral:before{content:"\F534"}.mdi-trending-up:before{content:"\F535"}.mdi-triangle:before{content:"\F536"}.mdi-triangle-outline:before{content:"\F537"}.mdi-trophy:before{content:"\F538"}.mdi-trophy-award:before{content:"\F539"}.mdi-trophy-outline:before{content:"\F53A"}.mdi-trophy-variant:before{content:"\F53B"}.mdi-trophy-variant-outline:before{content:"\F53C"}.mdi-truck:before{content:"\F53D"}.mdi-truck-delivery:before{content:"\F53E"}.mdi-truck-fast:before{content:"\F787"}.mdi-truck-trailer:before{content:"\F726"}.mdi-tshirt-crew:before{content:"\F53F"}.mdi-tshirt-v:before{content:"\F540"}.mdi-tumblr:before{content:"\F541"}.mdi-tumblr-reblog:before{content:"\F542"}.mdi-tune:before{content:"\F62E"}.mdi-tune-vertical:before{content:"\F66A"}.mdi-twitch:before{content:"\F543"}.mdi-twitter:before{content:"\F544"}.mdi-twitter-box:before{content:"\F545"}.mdi-twitter-circle:before{content:"\F546"}.mdi-twitter-retweet:before{content:"\F547"}.mdi-uber:before{content:"\F748"}.mdi-ubuntu:before{content:"\F548"}.mdi-ultra-high-definition:before{content:"\F7F8"}.mdi-umbraco:before{content:"\F549"}.mdi-umbrella:before{content:"\F54A"}.mdi-umbrella-outline:before{content:"\F54B"}.mdi-undo:before{content:"\F54C"}.mdi-undo-variant:before{content:"\F54D"}.mdi-unfold-less-horizontal:before{content:"\F54E"}.mdi-unfold-less-vertical:before{content:"\F75F"}.mdi-unfold-more-horizontal:before{content:"\F54F"}.mdi-unfold-more-vertical:before{content:"\F760"}.mdi-ungroup:before{content:"\F550"}.mdi-unity:before{content:"\F6AE"}.mdi-untappd:before{content:"\F551"}.mdi-update:before{content:"\F6AF"}.mdi-upload:before{content:"\F552"}.mdi-upload-network:before{content:"\F6F5"}.mdi-usb:before{content:"\F553"}.mdi-van-passenger:before{content:"\F7F9"}.mdi-van-utility:before{content:"\F7FA"}.mdi-vanish:before{content:"\F7FB"}.mdi-vector-arrange-above:before{content:"\F554"}.mdi-vector-arrange-below:before{content:"\F555"}.mdi-vector-circle:before{content:"\F556"}.mdi-vector-circle-variant:before{content:"\F557"}.mdi-vector-combine:before{content:"\F558"}.mdi-vector-curve:before{content:"\F559"}.mdi-vector-difference:before{content:"\F55A"}.mdi-vector-difference-ab:before{content:"\F55B"}.mdi-vector-difference-ba:before{content:"\F55C"}.mdi-vector-intersection:before{content:"\F55D"}.mdi-vector-line:before{content:"\F55E"}.mdi-vector-point:before{content:"\F55F"}.mdi-vector-polygon:before{content:"\F560"}.mdi-vector-polyline:before{content:"\F561"}.mdi-vector-radius:before{content:"\F749"}.mdi-vector-rectangle:before{content:"\F5C6"}.mdi-vector-selection:before{content:"\F562"}.mdi-vector-square:before{content:"\F001"}.mdi-vector-triangle:before{content:"\F563"}.mdi-vector-union:before{content:"\F564"}.mdi-verified:before{content:"\F565"}.mdi-vibrate:before{content:"\F566"}.mdi-video:before{content:"\F567"}.mdi-video-3d:before{content:"\F7FC"}.mdi-video-off:before{content:"\F568"}.mdi-video-switch:before{content:"\F569"}.mdi-view-agenda:before{content:"\F56A"}.mdi-view-array:before{content:"\F56B"}.mdi-view-carousel:before{content:"\F56C"}.mdi-view-column:before{content:"\F56D"}.mdi-view-dashboard:before{content:"\F56E"}.mdi-view-day:before{content:"\F56F"}.mdi-view-grid:before{content:"\F570"}.mdi-view-headline:before{content:"\F571"}.mdi-view-list:before{content:"\F572"}.mdi-view-module:before{content:"\F573"}.mdi-view-parallel:before{content:"\F727"}.mdi-view-quilt:before{content:"\F574"}.mdi-view-sequential:before{content:"\F728"}.mdi-view-stream:before{content:"\F575"}.mdi-view-week:before{content:"\F576"}.mdi-vimeo:before{content:"\F577"}.mdi-vine:before{content:"\F578"}.mdi-violin:before{content:"\F60F"}.mdi-visualstudio:before{content:"\F610"}.mdi-vk:before{content:"\F579"}.mdi-vk-box:before{content:"\F57A"}.mdi-vk-circle:before{content:"\F57B"}.mdi-vlc:before{content:"\F57C"}.mdi-voice:before{content:"\F5CB"}.mdi-voicemail:before{content:"\F57D"}.mdi-volume-high:before{content:"\F57E"}.mdi-volume-low:before{content:"\F57F"}.mdi-volume-medium:before{content:"\F580"}.mdi-volume-minus:before{content:"\F75D"}.mdi-volume-mute:before{content:"\F75E"}.mdi-volume-off:before{content:"\F581"}.mdi-volume-plus:before{content:"\F75C"}.mdi-vpn:before{content:"\F582"}.mdi-walk:before{content:"\F583"}.mdi-wall:before{content:"\F7FD"}.mdi-wallet:before{content:"\F584"}.mdi-wallet-giftcard:before{content:"\F585"}.mdi-wallet-membership:before{content:"\F586"}.mdi-wallet-travel:before{content:"\F587"}.mdi-wan:before{content:"\F588"}.mdi-washing-machine:before{content:"\F729"}.mdi-watch:before{content:"\F589"}.mdi-watch-export:before{content:"\F58A"}.mdi-watch-import:before{content:"\F58B"}.mdi-watch-vibrate:before{content:"\F6B0"}.mdi-water:before{content:"\F58C"}.mdi-water-off:before{content:"\F58D"}.mdi-water-percent:before{content:"\F58E"}.mdi-water-pump:before{content:"\F58F"}.mdi-watermark:before{content:"\F612"}.mdi-waves:before{content:"\F78C"}.mdi-weather-cloudy:before{content:"\F590"}.mdi-weather-fog:before{content:"\F591"}.mdi-weather-hail:before{content:"\F592"}.mdi-weather-lightning:before{content:"\F593"}.mdi-weather-lightning-rainy:before{content:"\F67D"}.mdi-weather-night:before{content:"\F594"}.mdi-weather-partlycloudy:before{content:"\F595"}.mdi-weather-pouring:before{content:"\F596"}.mdi-weather-rainy:before{content:"\F597"}.mdi-weather-snowy:before{content:"\F598"}.mdi-weather-snowy-rainy:before{content:"\F67E"}.mdi-weather-sunny:before{content:"\F599"}.mdi-weather-sunset:before{content:"\F59A"}.mdi-weather-sunset-down:before{content:"\F59B"}.mdi-weather-sunset-up:before{content:"\F59C"}.mdi-weather-windy:before{content:"\F59D"}.mdi-weather-windy-variant:before{content:"\F59E"}.mdi-web:before{content:"\F59F"}.mdi-webcam:before{content:"\F5A0"}.mdi-webhook:before{content:"\F62F"}.mdi-webpack:before{content:"\F72A"}.mdi-wechat:before{content:"\F611"}.mdi-weight:before{content:"\F5A1"}.mdi-weight-kilogram:before{content:"\F5A2"}.mdi-whatsapp:before{content:"\F5A3"}.mdi-wheelchair-accessibility:before{content:"\F5A4"}.mdi-white-balance-auto:before{content:"\F5A5"}.mdi-white-balance-incandescent:before{content:"\F5A6"}.mdi-white-balance-iridescent:before{content:"\F5A7"}.mdi-white-balance-sunny:before{content:"\F5A8"}.mdi-widgets:before{content:"\F72B"}.mdi-wifi:before{content:"\F5A9"}.mdi-wifi-off:before{content:"\F5AA"}.mdi-wii:before{content:"\F5AB"}.mdi-wiiu:before{content:"\F72C"}.mdi-wikipedia:before{content:"\F5AC"}.mdi-window-close:before{content:"\F5AD"}.mdi-window-closed:before{content:"\F5AE"}.mdi-window-maximize:before{content:"\F5AF"}.mdi-window-minimize:before{content:"\F5B0"}.mdi-window-open:before{content:"\F5B1"}.mdi-window-restore:before{content:"\F5B2"}.mdi-windows:before{content:"\F5B3"}.mdi-wordpress:before{content:"\F5B4"}.mdi-worker:before{content:"\F5B5"}.mdi-wrap:before{content:"\F5B6"}.mdi-wrench:before{content:"\F5B7"}.mdi-wunderlist:before{content:"\F5B8"}.mdi-xaml:before{content:"\F673"}.mdi-xbox:before{content:"\F5B9"}.mdi-xbox-controller:before{content:"\F5BA"}.mdi-xbox-controller-battery-alert:before{content:"\F74A"}.mdi-xbox-controller-battery-empty:before{content:"\F74B"}.mdi-xbox-controller-battery-full:before{content:"\F74C"}.mdi-xbox-controller-battery-low:before{content:"\F74D"}.mdi-xbox-controller-battery-medium:before{content:"\F74E"}.mdi-xbox-controller-battery-unknown:before{content:"\F74F"}.mdi-xbox-controller-off:before{content:"\F5BB"}.mdi-xda:before{content:"\F5BC"}.mdi-xing:before{content:"\F5BD"}.mdi-xing-box:before{content:"\F5BE"}.mdi-xing-circle:before{content:"\F5BF"}.mdi-xml:before{content:"\F5C0"}.mdi-xmpp:before{content:"\F7FE"}.mdi-yammer:before{content:"\F788"}.mdi-yeast:before{content:"\F5C1"}.mdi-yelp:before{content:"\F5C2"}.mdi-yin-yang:before{content:"\F67F"}.mdi-youtube-play:before{content:"\F5C3"}.mdi-zip-box:before{content:"\F5C4"}.mdi-blank:before{content:"\F68C";visibility:hidden}.mdi-18px.mdi-set,.mdi-18px.mdi:before{font-size:18px}.mdi-24px.mdi-set,.mdi-24px.mdi:before{font-size:24px}.mdi-36px.mdi-set,.mdi-36px.mdi:before{font-size:36px}.mdi-48px.mdi-set,.mdi-48px.mdi:before{font-size:48px}.mdi-dark:before{color:rgba(0,0,0,0.54)}.mdi-dark.mdi-inactive:before{color:rgba(0,0,0,0.26)}.mdi-light:before{color:#fff}.mdi-light.mdi-inactive:before{color:rgba(255,255,255,0.3)}.mdi-rotate-45:before{-webkit-transform:rotate(45deg);-ms-transform:rotate(45deg);transform:rotate(45deg)}.mdi-rotate-90:before{-webkit-transform:rotate(90deg);-ms-transform:rotate(90deg);transform:rotate(90deg)}.mdi-rotate-135:before{-webkit-transform:rotate(135deg);-ms-transform:rotate(135deg);transform:rotate(135deg)}.mdi-rotate-180:before{-webkit-transform:rotate(180deg);-ms-transform:rotate(180deg);transform:rotate(180deg)}.mdi-rotate-225:before{-webkit-transform:rotate(225deg);-ms-transform:rotate(225deg);transform:rotate(225deg)}.mdi-rotate-270:before{-webkit-transform:rotate(270deg);-ms-transform:rotate(270deg);transform:rotate(270deg)}.mdi-rotate-315:before{-webkit-transform:rotate(315deg);-ms-transform:rotate(315deg);transform:rotate(315deg)}.mdi-flip-h:before{-webkit-transform:scaleX(-1);transform:scaleX(-1);filter:FlipH;-ms-filter:"FlipH"}.mdi-flip-v:before{-webkit-transform:scaleY(-1);transform:scaleY(-1);filter:FlipV;-ms-filter:"FlipV"}.mdi-spin:before{-webkit-animation:mdi-spin 2s infinite linear;animation:mdi-spin 2s infinite linear}@-webkit-keyframes mdi-spin{0%{-webkit-transform:rotate(0deg);transform:rotate(0deg)}100%{-webkit-transform:rotate(359deg);transform:rotate(359deg)}}@keyframes mdi-spin{0%{-webkit-transform:rotate(0deg);transform:rotate(0deg)}100%{-webkit-transform:rotate(359deg);transform:rotate(359deg)}} +/*# sourceMappingURL=materialdesignicons.min.css.map */ diff --git a/wwwroot/css/materialdesignicons.min.css.map b/wwwroot/css/materialdesignicons.min.css.map new file mode 100644 index 0000000..21c4574 --- /dev/null +++ b/wwwroot/css/materialdesignicons.min.css.map @@ -0,0 +1,7 @@ +{ +"version": 3, +"mappings": "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", +"sources": ["../scss/_path.scss","../scss/_core.scss","../scss/_icons.scss","../scss/_extras.scss","_animated.scss"], +"names": [], +"file": "materialdesignicons.min.css" +} diff --git a/wwwroot/css/mdi-bs4-compat.css b/wwwroot/css/mdi-bs4-compat.css new file mode 100644 index 0000000..9162ed0 --- /dev/null +++ b/wwwroot/css/mdi-bs4-compat.css @@ -0,0 +1,40 @@ +.alert.mdi::before { + margin: 0 3px 0 -3px; + } + + .btn.mdi:not(:empty)::before { + margin: 0 3px 0 -3px; + } + + .breadcrumb-item a.mdi::before, .breadcrumb-item span.mdi::before { + margin: 0 2px 0 -2px; + } + + .dropdown-item.mdi::before { + margin: 0 8px 0 -10px; + } + + .list-group-item.mdi::before { + margin: 0 6px 0 -6px; + } + + .modal-title.mdi::before { + margin: 0 4px 0 0; + } + + .nav-link.mdi::before { + margin: 0 4px 0 -4px; + } + + .navbar-brand.mdi::before { + margin: 0 4px 0 0; + } + + .popover-title.mdi::before { + margin: 0 4px 0 -4px; + } + + .btn.mdi-chevron-up.collapsed::before { + content: '\f140'; + } + \ No newline at end of file diff --git a/wwwroot/fonts/materialdesignicons-webfont.eot b/wwwroot/fonts/materialdesignicons-webfont.eot new file mode 100644 index 0000000..df4d452 Binary files /dev/null and b/wwwroot/fonts/materialdesignicons-webfont.eot differ diff --git a/wwwroot/fonts/materialdesignicons-webfont.svg b/wwwroot/fonts/materialdesignicons-webfont.svg new file mode 100644 index 0000000..41d0359 --- /dev/null +++ b/wwwroot/fonts/materialdesignicons-webfont.svg @@ -0,0 +1,6150 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/wwwroot/fonts/materialdesignicons-webfont.ttf b/wwwroot/fonts/materialdesignicons-webfont.ttf new file mode 100644 index 0000000..69404e3 Binary files /dev/null and b/wwwroot/fonts/materialdesignicons-webfont.ttf differ diff --git a/wwwroot/fonts/materialdesignicons-webfont.woff b/wwwroot/fonts/materialdesignicons-webfont.woff new file mode 100644 index 0000000..56b9a35 Binary files /dev/null and b/wwwroot/fonts/materialdesignicons-webfont.woff differ diff --git a/wwwroot/fonts/materialdesignicons-webfont.woff2 b/wwwroot/fonts/materialdesignicons-webfont.woff2 new file mode 100644 index 0000000..9f0cc36 Binary files /dev/null and b/wwwroot/fonts/materialdesignicons-webfont.woff2 differ diff --git a/wwwroot/img/android-chrome-192x192.png b/wwwroot/img/android-chrome-192x192.png new file mode 100644 index 0000000..aaea576 Binary files /dev/null and b/wwwroot/img/android-chrome-192x192.png differ diff --git a/wwwroot/img/android-chrome-512x512.png b/wwwroot/img/android-chrome-512x512.png new file mode 100644 index 0000000..8fc9e8e Binary files /dev/null and b/wwwroot/img/android-chrome-512x512.png differ diff --git a/wwwroot/img/apple-touch-icon.png b/wwwroot/img/apple-touch-icon.png new file mode 100644 index 0000000..c575576 Binary files /dev/null and b/wwwroot/img/apple-touch-icon.png differ diff --git a/wwwroot/img/favicon-16x16.png b/wwwroot/img/favicon-16x16.png new file mode 100644 index 0000000..7911f5f Binary files /dev/null and b/wwwroot/img/favicon-16x16.png differ diff --git a/wwwroot/img/favicon-32x32.png b/wwwroot/img/favicon-32x32.png new file mode 100644 index 0000000..b60214d Binary files /dev/null and b/wwwroot/img/favicon-32x32.png differ diff --git a/wwwroot/img/favicon.ico b/wwwroot/img/favicon.ico new file mode 100644 index 0000000..bc00b84 Binary files /dev/null and b/wwwroot/img/favicon.ico differ diff --git a/wwwroot/img/mstile-150x150.png b/wwwroot/img/mstile-150x150.png new file mode 100644 index 0000000..f332f6c Binary files /dev/null and b/wwwroot/img/mstile-150x150.png differ diff --git a/wwwroot/img/safari-pinned-tab.svg b/wwwroot/img/safari-pinned-tab.svg new file mode 100644 index 0000000..2567394 --- /dev/null +++ b/wwwroot/img/safari-pinned-tab.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/wwwroot/index.html b/wwwroot/index.html new file mode 100644 index 0000000..3a8eeff --- /dev/null +++ b/wwwroot/index.html @@ -0,0 +1,74 @@ + + + + + + + + + + + Pecklist loading.... + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + + + + \ No newline at end of file diff --git a/wwwroot/js/app.api.js b/wwwroot/js/app.api.js new file mode 100644 index 0000000..441e15e --- /dev/null +++ b/wwwroot/js/app.api.js @@ -0,0 +1,529 @@ +/* + * app.api.js + * Ajax api helper module + */ + +/*jslint browser : true, continue : true, + devel : true, indent : 2, maxerr : 50, + newcap : true, nomen : true, plusplus : true, + regexp : true, sloppy : true, vars : false, + white : true +*/ +/*global $, io, app */ + +app.api = (function () { + 'use strict'; + var + initModule, getAuthHeaderObject, + GZAppVersion, + get, remove, create, update, uploadFile, + doSync, getListFromStore, putListInStore, + goToNextList, getActiveList, replaceActiveList, renameActiveList, toggleDeleteActiveList, + getActiveListIndex, replaceRecordInStore, insertRecordInStore, getRecordFromStore, + getListItemCoordinates, setActiveListId, getActiveListId, newList + ; + + + GZAppVersion = "1.3"; + + + + + ////////////////////////////////////////////////////////////////////////////////////// + // NOT AUTHORIZED ERROR HANDLER + + + $(document).ajaxError(function (event, jqxhr, settings, thrownError) { + //unauthorized? Trigger logout which will trigger login after clearing creds + if (jqxhr.status == 401) { + window.location.replace('#!/logout'); + } + }); + + ////////////////////////////////////////////////////////////////////////////////////// + // UTILITY + + /////////////////////////////////////////////////////////// + // Return the auth token header + // + // + getAuthHeaderObject = function () { + return { + "Authorization": "Bearer " + app.shell.stateMap.user.token + }; + } + + + /////////////////////////////////////////////////////////// + // Fetch the list from local storage + // + // + getListFromStore = function () { + return store.get('pecklist.list'); + } + + /////////////////////////////////////////////////////////// + // Replace the list in local store + // + // + putListInStore = function (theList) { + store.set('pecklist.list', theList); + } + + /////////////////////////////////////////////////////////// + // Get the active list id or first if active not found + // + getActiveListId = function (theId) { + var ret = store.get('pecklist.activeListId'); + + //validate it's ok + var l = app.api.getListFromStore(); + var firstListId = l[0].id;//get a default in case it's not found + + var len = l.length, i = 0; + for (i; i < len; i++) { + if (l[i].id == ret) { + return ret; + } + } + + //if we're here then it's not a valid id so use the first one instead and set it + store.set('pecklist.activeListId', firstListId); + return firstListId; + + } + + /////////////////////////////////////////////////////////// + // Set the active list id + // + // + setActiveListId = function (theId) { + if (theId) { + store.set('pecklist.activeListId', theId); + } + } + + + /////////////////////////////////////////////////////////// + // ADVANCE ACTIVE LIST ID TO NEXT LIST + // + // + goToNextList = function () { + var l = getListFromStore(); + var allLength = l.length; + //is there more than one list? + if (allLength < 2) { + //Nope + return; + } + + //figure out what the next list id should be + var currentIndex = getActiveListIndex(); + var highestPossibleIndex = allLength - 1; + + //are we already at the last list? + if (currentIndex == highestPossibleIndex) { + //go to first list (wrap) + setActiveListId(l[0].id); + return; + } + + //advance to the next list + setActiveListId(l[currentIndex + 1].id); + return; + } + + + + ////////////////////////////// + // GET LIST INDEX + // + getActiveListIndex = function () { + var activeListId = getActiveListId(); + var l = app.api.getListFromStore(); + var len = l.length, i = 0; + for (i; i < len; i++) { + if (l[i].id == activeListId) { + return i; + } + } + //This should never happen, if it does something is very wrong: + throw new Error("Error: app.main.js::getActiveListIndex - active list ID not found in list store"); + } + + /////////////////////////// + // GET ACTIVE LIST + // + getActiveList = function () { + var activeListId = getActiveListId(); + var l = app.api.getListFromStore(); + var len = l.length, i = 0; + for (i; i < len; i++) { + if (l[i].id == activeListId) { + return l[i]; + } + } + //This should never happen, if it does something is very wrong: + throw new Error("Error: app.main.js::getActiveList - activeListId not found in list store"); + } + + + /////////////////////////// + // CREATE NEW LIST + // + newList = function () { + + var l = app.api.getListFromStore(); + var newListRecord={ + id:"NEW_"+ _.now(), + name: "New list "+Date(), + v:1, + name_v:1, + items:[] + } + + l.push(newListRecord); + app.api.putListInStore(l); + setActiveListId(newListRecord.id); + } + + + + + /////////////////////////// + // RENAME ACTIVE LIST + // + renameActiveList = function (newName) { + var activeListId = getActiveListId(); + var l = app.api.getListFromStore(); + var len = l.length, i = 0; + for (i; i < len; i++) { + if (l[i].id == activeListId) { + l[i].name = newName; + putListInStore(l); + return; + } + } + //This should never happen, if it does something is very wrong: + throw new Error("Error: app.main.js::renameActiveList - activeListId not found in list store"); + } + + + /////////////////////////// + // DELETE ACTIVE LIST + // + toggleDeleteActiveList = function () { + var activeListId = getActiveListId(); + var l = app.api.getListFromStore(); + var len = l.length, i = 0; + for (i; i < len; i++) { + if (l[i].id == activeListId) { + if (l[i].deleted) { + delete l[i].deleted; + } else { + l[i].deleted = true;//tag it as deleted + } + putListInStore(l); + return; + } + } + //This should never happen, if it does something is very wrong: + throw new Error("Error: app.main.js::toggleDeleteActiveList - activeListId not found in list store"); + } + + + /////////////////////////// + // REPLACE ACTIVE LIST + // + replaceActiveList = function (replacementList) { + var activeListId = getActiveListId(); + var l = app.api.getListFromStore(); + var len = l.length, i = 0; + for (i; i < len; i++) { + if (l[i].id == activeListId) { + l[i] = replacementList; + putListInStore(l); + return; + } + } + //This should never happen, if it does something is very wrong: + throw new Error("Error: app.main.js::replaceActiveList - activeListId not found in list store"); + } + + + ////////////////////////////// + // GET LIST ITEM CO-ORDINATES + // + getListItemCoordinates = function (itemId) { + var allLists = app.api.getListFromStore(); + var allLength = allLists.length, j = 0; + for (j; j < allLength; j++) { + //iterate the list and find it + var len = allLists[j].items.length, i = 0; + for (i; i < len; i++) { + if (allLists[j].items[i].id == itemId) { + return { listIndex: j, itemIndex: i }; + } + } + } + //This should never happen, if it does something is very wrong: + throw new Error("Error: app.main.js::getListItemCoordinates - List item ID not found in list store"); + } + + + + /////////////////////////// + // GET RECORD FROM STORE + // + getRecordFromStore = function (itemId) { + var co = getListItemCoordinates(itemId); + var allLists = app.api.getListFromStore(); + return allLists[co.listIndex].items[co.itemIndex]; + } + + + + + + /////////////////////////// + // REPLACE RECORD IN STORE + // + replaceRecordInStore = function (itemId, replacementRecord) { + var co = getListItemCoordinates(itemId); + var l = app.api.getListFromStore(); + //Todo: is this the proper way to do it? + l[co.listIndex].items[co.itemIndex] = replacementRecord; + app.api.putListInStore(l); + } + + + /////////////////////////// + // INSERT RECORD IN STORE + // + insertRecordInStore = function (newRecord) { + var activeListIndex = getActiveListIndex(); + var l = app.api.getListFromStore(); + l[activeListIndex].items.push(newRecord); + app.api.putListInStore(l); + } + + + + + ////////////////////////////////////////////////////////////////////////////////////// + // PECKLIST SPECIFIC ROUTES + ////////////////////////////////////////////////////////////////////////////////////// + + + /////////////////////////////////////////////////////////// + // + // DOSYNC - Synchronize the stored data + // + doSync = function (callback) { + //get the list from the store + var theList = getListFromStore(); + + $.ajax({ + method: "post", + dataType: "json", + url: app.shell.stateMap.apiUrl + 'sync', + headers: getAuthHeaderObject(), + contentType: 'application/json; charset=utf-8', + data: JSON.stringify(theList), + success: function (ret, textStatus) { + //Put the new list in the store + putListInStore(JSON.parse(ret)); + callback({ ok: 1 }); + }, + error: function (jqXHR, textStatus, errorThrown) { + callback({ + error: 1, + msg: textStatus + '\n' + errorThrown, + error_detail: {} + }); + } + }); + } + + + + + //////////////////////////////////////////////////////////////////////////////////////////////////////// + // STANDARD API CORE ROUTES + // + //////////////////////////////////////////////////////////////////////////////////////////////////////// + + + /////////////////////////////////////////////////////////// + //Create + //Route app.post('/api/:obj_type/create', function (req, res) { + // + create = function (apiRoute, objData, callback) { + $.ajax({ + method: "post", + dataType: "json", + url: app.shell.stateMap.apiUrl + apiRoute, + headers: getAuthHeaderObject(), + contentType: 'application/json; charset=utf-8', + data: JSON.stringify(objData), + success: function (data, textStatus) { + callback(data); + }, + error: function (jqXHR, textStatus, errorThrown) { + callback({ + error: 1, + msg: textStatus + '\n' + errorThrown, + error_detail: {} + }); + } + }); + } + + ///////////////// + //Get - get anything, the caller provides the route, this should replace most legacy get + // + get = function (apiRoute, callback) { + $.ajax({ + method: "GET", + dataType: "json", + url: app.shell.stateMap.apiUrl + apiRoute, + headers: getAuthHeaderObject(), + + success: function (data, textStatus) { + callback(data); + }, + error: function (jqXHR, textStatus, errorThrown) { + callback({ + error: 1, + msg: textStatus + '\n' + errorThrown, + error_detail: {} + }); + } + }); + } + //////////////////// + + /////////////////////////////////////////////////////////// + //Update + //route: app.post('/api/:obj_type/update/:id', function (req, res) { + // + update = function (objType, objData, callback) { + var theId; + if (!objData.id) { + return callback({ + error: 1, + msg: 'app.api.js::update->Error: missing id field in update document', + error_detail: objData + }); + } + theId = objData.id; + $.ajax({ + method: "put", + dataType: "json", + url: app.shell.stateMap.apiUrl + objType + '/' + theId, + headers: getAuthHeaderObject(), + contentType: 'application/json; charset=utf-8', + data: JSON.stringify(objData), + success: function (data, textStatus) { + if (data == null) { + data = { ok: 1 }; + } + + callback(data); + }, + error: function (jqXHR, textStatus, errorThrown) { + callback({ + error: 1, + msg: textStatus + '\n' + errorThrown, + error_detail: {} + }); + } + }); + } + + + + /////////////////////////////////////////////////////////// + //remove Item + remove = function (apiRoute, callback) { + $.ajax({ + method: "DELETE", + dataType: "json", + url: app.shell.stateMap.apiUrl + apiRoute, + headers: getAuthHeaderObject(), + success: function (data, textStatus) { + callback(data); + }, + error: function (jqXHR, textStatus, errorThrown) { + callback({ + error: 1, + msg: textStatus + '\n' + errorThrown, + error_detail: {} + }); + } + }); + } + + + + /////////////////////////////////////////////////////////// + // uploadFile + // (ajax route to upload a file) + // + uploadFile = function (apiRoute, objData, callback) { + $.ajax({ + method: "post", + dataType: "json", + url: app.shell.stateMap.apiUrl + apiRoute, + headers: getAuthHeaderObject(), + contentType: false, + processData: false, + data: objData, + success: function (data, textStatus) { + callback(data); + }, + error: function (jqXHR, textStatus, errorThrown) { + callback({ + error: 1, + msg: textStatus + '\n' + errorThrown, + error_detail: {} + }); + } + }); + } + + ///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// + + + + + + initModule = function () { }; + + return { + initModule: initModule, + getAuthHeaderObject: getAuthHeaderObject, + GZAppVersion: GZAppVersion, + get: get, + remove: remove, + create: create, + update: update, + uploadFile: uploadFile, + doSync: doSync, + getListFromStore: getListFromStore, + putListInStore: putListInStore, + goToNextList: goToNextList, + getActiveList: getActiveList, + replaceActiveList: replaceActiveList, + getActiveListIndex: getActiveListIndex, + replaceRecordInStore: replaceRecordInStore, + insertRecordInStore: insertRecordInStore, + getRecordFromStore: getRecordFromStore, + getListItemCoordinates: getListItemCoordinates, + renameActiveList: renameActiveList, + toggleDeleteActiveList: toggleDeleteActiveList, + newList: newList + + + }; +}()); \ No newline at end of file diff --git a/wwwroot/js/app.authenticate.js b/wwwroot/js/app.authenticate.js new file mode 100644 index 0000000..e281a2b --- /dev/null +++ b/wwwroot/js/app.authenticate.js @@ -0,0 +1,104 @@ +/*jslint browser : true, continue : true, + devel : true, indent : 2, maxerr : 50, + newcap : true, nomen : true, plusplus : true, + regexp : true, sloppy : true, vars : false, + white : true +*/ + +/*global $, app */ + +app.authenticate = (function() { + 'use strict'; + //---------------- BEGIN MODULE SCOPE VARIABLES -------------- + var + stateMap = {}, + onSubmit, + configModule, + initModule; + //----------------- END MODULE SCOPE VARIABLES --------------- + + //------------------- BEGIN UTILITY METHODS ------------------ + //-------------------- END UTILITY METHODS ------------------- + + //------------------- BEGIN EVENT HANDLERS ------------------- + onSubmit = function(event) { + event.preventDefault(); + + //get creds + var login = $('#login').val(); + var password = $('#password').val(); + + + $.ajax({ + method: "post", + dataType: "json", + url: app.shell.stateMap.apiUrl.replace('/api/', '/authenticate'), + data: { + login: login, + password: password + }, + success: function(data, textStatus, jqXHR) { + if (data.ok == 1) { + app.shell.stateMap.user.authenticated = true; + app.shell.stateMap.user.token = data.token; + app.shell.stateMap.user.name = data.name; + app.shell.stateMap.user.dlkey=data.dlkey; + app.shell.stateMap.user.id=data.id; + //token expiry date + app.shell.stateMap.user.expires = data.expires; + + //tell the shell we've logged in successfully + $.gevent.publish('app-login', { + name: login + }); + } else { + if (data.error) { + $.gevent.publish('app-show-error',data.error); + } + app.shell.stateMap.user.authenticated = false; + app.shell.stateMap.user.token = ''; + app.shell.stateMap.user.name = 'please sign in'; + $.gevent.publish('app-logout'); + } + }, + error: function(jqXHR, textStatus, errorThrown) { + app.shell.stateMap.user.authenticated = false; + app.shell.stateMap.user.token = ''; + app.shell.stateMap.user.name = 'please sign in'; + $.gevent.publish('app-logout'); + $.gevent.publish('app-show-error',textStatus + " " + errorThrown); + } + }); + return false; //prevent default? + }; + + //-------------------- END EVENT HANDLERS -------------------- + + //------------------- BEGIN PUBLIC METHODS ------------------- + //CONFIGMODULE + // + configModule = function(context) { + stateMap.context = context.context; + if (stateMap.context.params.id) { + stateMap.id = stateMap.context.params.id; + } + }; + + //INITMODULE + // + initModule = function($container) { + if (typeof $container === 'undefined') { + $container = $('#app-shell-main-content'); + } + $container.html(Handlebars.templates['app.authenticate']({})); + $('#btnSubmit').bind('click', onSubmit); + }; + + + // return public methods + return { + configModule: configModule, + initModule: initModule + }; + //------------------- END PUBLIC METHODS --------------------- +}()); \ No newline at end of file diff --git a/wwwroot/js/app.fourohfour.js b/wwwroot/js/app.fourohfour.js new file mode 100644 index 0000000..8a2bfd9 --- /dev/null +++ b/wwwroot/js/app.fourohfour.js @@ -0,0 +1,56 @@ +/*jslint browser : true, continue : true, + devel : true, indent : 2, maxerr : 50, + newcap : true, nomen : true, plusplus : true, + regexp : true, sloppy : true, vars : false, + white : true +*/ + +/*global $, app */ + +app.fourohfour = (function() { + 'use strict'; + //---------------- BEGIN MODULE SCOPE VARIABLES -------------- + var + + stateMap = {}, + configModule, + initModule; + //----------------- END MODULE SCOPE VARIABLES --------------- + + //------------------- BEGIN UTILITY METHODS ------------------ + //-------------------- END UTILITY METHODS ------------------- + + //------------------- BEGIN EVENT HANDLERS ------------------- + + //-------------------- END EVENT HANDLERS -------------------- + + //------------------- BEGIN PUBLIC METHODS ------------------- + //CONFIGMODULE + // + configModule = function(context) { + stateMap.context = context.context; + if (stateMap.context.params.id) { + stateMap.id = stateMap.context.params.id; + } + }; + + //INITMODULE + // + initModule = function($container) { + if (typeof $container === 'undefined') { + $container = $('#app-shell-main-content'); + } + $container.html(Handlebars.templates['app.fourohfour']({})); + + + + }; + + //PUBLIC METHODS + // + return { + configModule: configModule, + initModule: initModule + }; + //------------------- END PUBLIC METHODS --------------------- +}()); \ No newline at end of file diff --git a/wwwroot/js/app.main.js b/wwwroot/js/app.main.js new file mode 100644 index 0000000..13e9a61 --- /dev/null +++ b/wwwroot/js/app.main.js @@ -0,0 +1,400 @@ +/* + * app.main.js + * License key generator + */ + +/*jslint browser : true, continue : true, + devel : true, indent : 2, maxerr : 50, + newcap : true, nomen : true, plusplus : true, + regexp : true, sloppy : true, vars : false, + white : true +*/ + +/*global $, app */ + +app.main = (function () { + 'use strict'; + //---------------- BEGIN MODULE SCOPE VARIABLES -------------- + var + + stateMap = {}, + configModule, initModule, + ENTER_KEY = 13, ESCAPE_KEY = 27, + render, + onSync, onNextList, onClearDone, + onInsert, onShowContextMenu, onShowListContextMenu, onNewPriority, onDoneChanged, + onNewText, onNewListName, onDeleteList; + + //----------------- END MODULE SCOPE VARIABLES --------------- + + //------------------- BEGIN UTILITY METHODS ------------------ + /////////////////////////// + // RENDER - DRAW THE LIST + // + render = function () { + + var smallScreen = app.utilB.getMediaSize() == "app-small-mode"; + + + var $l = $('#peck-list'); + var $title = $('#peck-title'); + var $listContextDiv = $('#list-context-div'); + var $newItem = + $listContextDiv.empty(); + $l.empty(); + $title.text(''); + + var rawList = app.api.getActiveList(); + if (rawList == null) { + $title.text('?? NO LIST ??'); + $l.append('
  • NO LIST
  • '); + return; + } + + var deletedList = rawList.deleted; + var listDisplayName = rawList.name; + if (deletedList) { + listDisplayName = "[" + rawList.name + "] - DELETE NEXT SYNC "; + $('#new-item').hide(); + $title.addClass('text-danger'); + } else { + $title.removeClass('text-danger'); + } + + $title.text(listDisplayName); + + // Sort by `user` in ascending order and by `age` in descending order. + var l = _.orderBy(rawList.items, ['priority', 'text'], ['desc', 'asc']); + + //draw the list + //{"id":"FmcIT283XkSFxvoyBGCmw","completed":false,"text":"Paper towel","v":3706,"priority":2} + var len = l.length, i = 0; + for (i; i < len; i++) { + var o = l[i]; + if (o.priority > -1) { + var itemTextSpanClass = ''; + if (!o.text) { + o.text = "## EMPTY ITEM ###"; + } + + //3 = old highlight (orangey red) and 2 is default dark green, 1 is black and 0 is faded gray + switch (o.priority) { + case 3: + itemTextSpanClass = 'text-danger'; + break; + case 2: + itemTextSpanClass = 'text-primary'; + break; + case 1: + itemTextSpanClass = 'text-dark'; + break; + default: + itemTextSpanClass = 'text-secondary'; + } + + if (deletedList) { + itemTextSpanClass = 'text-warning'; + } + + if (smallScreen && o.text.length > 30) { + itemTextSpanClass += ' pl-long-item'; + } else { + itemTextSpanClass += ' pl-short-item'; + } + + var listItem; + if (o.completed || deletedList) { + + listItem = '
  • ' + + '' + o.text + '' + + '
  • ' + } else { + + listItem = '
  • ' + + '' + o.text + '' + + '
  • ' + } + + $l.append(listItem); + if (!deletedList) { + $('#b' + i).bind('click', o, onShowContextMenu); + } + } + } + } + + + + //-------------------- END UTILITY METHODS ------------------- + + + //------------------- BEGIN EVENT HANDLERS ------------------- + ////////////////////////////////////////////////// + // + onSync = function () { + $.gevent.publish('app-clear-error'); + + app.api.doSync(function (res) { + if (res.error) { + $.gevent.publish('app-show-error', res.msg); + } else { + render(); + //alert("Stub: onSync success "); + return false; + } + }); + }; + + ////////////////////////////////////////////////// + // ADVANCE TO NEXT LIST + // + onNextList = function (e) { + app.api.goToNextList(); + render(); + }; + + ////////////////////////////////////////////////// + // Clear completed items + // + onClearDone = function (e) { + var l = app.api.getActiveList(); + if (l == null) { + return; + } + var len = l.items.length, i = 0; + for (i; i < len; i++) { + if (l.items[i].completed) { + l.items[i].priority = -1; + } + } + app.api.replaceActiveList(l); + render(); + }; + + ////////////////////////////////////////////////// + // + onInsert = function (e) { + e.preventDefault(); + + var $input = $(e.target); + var val = $input.val().trim(); + + if (e.which !== ENTER_KEY || !val) { + return; + } + + //{id: "3GtklnXES0Ox7QrOJpEFRQ", completed: false, text: "No need for lock feature if it's not used", v: 49, priority: 2} + var newRecord = { + id: "NEW_" + _.now(), + completed: false, + text: val, + v: 0, + priority: 1 + }; + + app.api.insertRecordInStore(newRecord); + $input.val(''); + render(); + return false; //prevent default + }; + + + ////////////////////////////////////////////////// + // Show context menu + // + onShowContextMenu = function (e) { + e.preventDefault(); + $('.pl-mnu').remove(); + + + var li = $('li[data-id="' + e.data.id + '"]'); + li.append(Handlebars.templates['app.main.context']({})); + + var edTxt = $('#edtxt'); + var btnToggleDone = $("#btn-toggle-done"); + + edTxt.val(e.data.text); + edTxt.keyup(e.data, onNewText); + btnToggleDone.focus(); + + if (e.data.completed) { + btnToggleDone.addClass("mdi-checkbox-blank-outline"); + } else { + btnToggleDone.addClass("mdi-checkbox-marked"); + } + btnToggleDone.click(e.data, onDoneChanged); + + $('.ct-btn-priority').click(e.data, onNewPriority); + + return false; + }; + + + ////////////////////////////////////////////////// + // Show LIST context menu + // + onShowListContextMenu = function (e) { + //rename or delete + e.preventDefault(); + var listContextDiv = $('#list-context-div'); + + //is it already displayed? + if (listContextDiv.children().length > 0) { + //div has tags in it, so clear it and return, it's a dismissal + listContextDiv.empty(); + return false; + } + + + listContextDiv.append(Handlebars.templates['app.main.list-context']({})); + + var edTxt = $('#edtxt'); + var btnDeleteList = $("#btn-delete-list"); + + var rawList = app.api.getActiveList(); + var deletedList = rawList.deleted; + var $title = $('#peck-title'); + + if (deletedList) { + btnDeleteList.removeClass('btn-danger').addClass('btn-success'); + btnDeleteList.text('UNDELETE LIST'); + edTxt.hide(); + } else { + edTxt.val($title.text()); + edTxt.keyup(onNewListName); + edTxt.focus(); + } + btnDeleteList.click(onDeleteList); + + return false; + }; + + + + //////////////////////////////////////////////////////////////////////////////////////////////////// + //CONTEXT FUNCTIONS HERE + //////////////////////////////////////////////////////////////////////////////////////////////////// + + + ////////////////////////////////////////////////// + // CHANGE PRIORITY + // + onNewPriority = function (e) { + //List item id: e.data + //priority value: e.target.value + var rec = app.api.getRecordFromStore(e.data.id); + rec.priority = _.toNumber(e.target.value); + app.api.replaceRecordInStore(e.data.id, rec); + render(); + return false; + }; + + ////////////////////////////////////////////////// + // CHANGE TEXT + // + onNewText = function (e) { + + var newText = e.target.value.trim(); + if (e.which !== ENTER_KEY || !newText) { + return; + } + + var rec = app.api.getRecordFromStore(e.data.id); + rec.text = newText; + app.api.replaceRecordInStore(e.data.id, rec); + render(); + return false; + }; + + ////////////////////////////////////////////////// + // CHANGE COMPLETED + // + onDoneChanged = function (e) { + //List item id: e.data + //priority value: e.target.value + var rec = app.api.getRecordFromStore(e.data.id); + rec.completed = !rec.completed; + app.api.replaceRecordInStore(e.data.id, rec); + render(); + return false; + }; + + + ////////////////////////////////////////////////// + // CHANGE TEXT + // + onNewListName = function (e) { + var newText = e.target.value.trim(); + if (e.which !== ENTER_KEY || !newText) { + return; + } + app.api.renameActiveList(newText); + render(); + return false; + }; + + + ////////////////////////////////////////////////// + // CHANGE TEXT + // + onDeleteList = function (e) { + e.preventDefault(); + app.api.toggleDeleteActiveList(); + render(); + return false; + }; + + + + //-------------------- END EVENT HANDLERS -------------------- + + //------------------- BEGIN PUBLIC METHODS ------------------- + //CONFIGMODULE + // + configModule = function (context) { + stateMap.context = context.context; + if (stateMap.context.params.id) { + stateMap.id = stateMap.context.params.id; + } + }; + + //INITMODULE + // + initModule = function ($container) { + if (typeof $container === 'undefined') { + $container = $('#app-shell-main-content'); + } + $container.html(Handlebars.templates['app.main']({})); + //Context menu + app.nav.contextClear(); + ////app.nav.setContextTitle("License"); + + //make context menu + + + //Context menu + app.nav.contextClear(); + app.nav.contextAddButton('btn-sync', 'Sync', 'sync', onSync); + app.nav.contextAddButton('btn-clear-done', 'Clear done', 'nuke', onClearDone); + app.nav.contextAddButton('btn-next', 'List', 'skip-next', onNextList); + + //bind event handlers + $('#new-item').keyup(onInsert); + $('#btn-test').click(onNewPriority); + + $('#peck-title').bind('click', onShowListContextMenu); + + + //display the cached data + render(); + + + }; + + // return public methods + return { + configModule: configModule, + initModule: initModule + }; + //------------------- END PUBLIC METHODS --------------------- +}()); \ No newline at end of file diff --git a/wwwroot/js/app.nav.js b/wwwroot/js/app.nav.js new file mode 100644 index 0000000..ecbc162 --- /dev/null +++ b/wwwroot/js/app.nav.js @@ -0,0 +1,102 @@ +/* + * app.nav.js + * Handle dynamic navigation related operations + * toobar, menu, fab etc + * +*/ + +/*jslint browser : true, continue : true, + devel : true, indent : 2, maxerr : 50, + newcap : true, nomen : true, plusplus : true, + regexp : true, sloppy : true, vars : false, + white : true +*/ +/*global $, app */ + +app.nav = (function () { + var contextClear, contextAddButton, contextAddLink, backUrl, backRemove, moreMenuInitialized, + setContextTitle, setSelectedMenuItem; + + + + // /////////////////////////////////////////// + // //Set context menu title + // // + // var setContextTitle = function (title) { + // $("#gz-context-title").html(title + "..."); + // } + + //////////////////////////////////////////////// + //Clear the contents of the context menu (reset it) + // + contextClear = function () { + $("#gz-context-group").empty(); + $("#gz-context-group").addClass("invisible"); + + }; + + + + //////////////////////////////////////////////// + //Add a non nav button item to the context menu + // + contextAddButton = function (id, title, icon, clickHandler) { + var $group=$("#gz-context-group"); + $group.removeClass("invisible"); + + var iconClass = ''; + if (icon) { + iconClass = "mdi mdi-" + icon; + } + $group.append( + ' + + //////////////////////////////////////////////// + //Add an url item to the context menu handling + //phone vs larger sizes + // + contextAddLink = function (url, title, icon) { + var $group=$("#gz-context-group"); + $group.removeClass("invisible"); + var iconClass = ''; + if (icon) { + iconClass = "mdi mdi-" + icon; + } + $group.append( + '' + title + '' + ); + }; + + + //////////////////////////////////////////////// + //Set the active class on the selected menu item + // + setSelectedMenuItem = function (selectedMenuItem) { + $(".nav-item").removeClass("active"); + if (selectedMenuItem) { + $("#" + selectedMenuItem).addClass("active"); + } + + + }; + + + + + + return { + contextClear: contextClear, + contextAddButton: contextAddButton, + contextAddLink: contextAddLink, + setContextTitle: setContextTitle, + setSelectedMenuItem: setSelectedMenuItem + + }; +}()); diff --git a/wwwroot/js/app.settings.js b/wwwroot/js/app.settings.js new file mode 100644 index 0000000..3e9f075 --- /dev/null +++ b/wwwroot/js/app.settings.js @@ -0,0 +1,103 @@ +/*jslint browser : true, continue : true, + devel : true, indent : 2, maxerr : 50, + newcap : true, nomen : true, plusplus : true, + regexp : true, sloppy : true, vars : false, + white : true +*/ + +/*global $, app */ + +app.settings = (function () { + 'use strict'; + //---------------- BEGIN MODULE SCOPE VARIABLES -------------- + var + + stateMap = {}, + configModule, + onChangePassword, onNewList, + initModule; + //----------------- END MODULE SCOPE VARIABLES --------------- + + //------------------- BEGIN UTILITY METHODS ------------------ + //-------------------- END UTILITY METHODS ------------------- + + //------------------- BEGIN EVENT HANDLERS ------------------- + + /////////////////////////////// + //ONUPDATE + // + onChangePassword = function (event) { + event.preventDefault(); + $.gevent.publish('app-clear-error'); + //get form data + var formData = $("form").serializeArray({ + checkboxesAsBools: true + }); + + var submitData = app.utilB.objectifyFormDataArray(formData); + + + + + app.api.create('user/' + app.shell.stateMap.user.id + '/changepassword', + submitData, function (res) { + if (res.error) { + $.gevent.publish('app-show-error', res.msg); + } else { + page('#!/logout'); + } + }); + + + + return false; //prevent default? + }; + + + + /////////////////////////////// + // NEW LIST + // + onNewList = function (e) { + e.preventDefault(); + app.api.newList(); + page('#!/'); + }; + //-------------------- END EVENT HANDLERS -------------------- + + //------------------- BEGIN PUBLIC METHODS ------------------- + //CONFIGMODULE + // + configModule = function (context) { + stateMap.context = context.context; + if (stateMap.context.params.id) { + stateMap.id = stateMap.context.params.id; + } + }; + + //INITMODULE + // + initModule = function ($container) { + if (typeof $container === 'undefined') { + $container = $('#app-shell-main-content'); + } + $container.html(Handlebars.templates['app.settings']({})); + + // bind actions + $('#btn-change-password').bind('click', onChangePassword); + $('#btn-new-list').bind('click', onNewList); + + //Context menu + app.nav.contextClear(); + ////app.nav.setContextTitle("Search"); + + }; + + //PUBLIC METHODS + // + return { + configModule: configModule, + initModule: initModule + }; + //------------------- END PUBLIC METHODS --------------------- +}()); \ No newline at end of file diff --git a/wwwroot/js/app.shell.js b/wwwroot/js/app.shell.js new file mode 100644 index 0000000..9cde2d4 --- /dev/null +++ b/wwwroot/js/app.shell.js @@ -0,0 +1,310 @@ +/* + * app.shell.js + * Shell module for SPA + */ + +/*jslint browser : true, continue : true, + devel : true, indent : 2, maxerr : 50, + newcap : true, nomen : true, plusplus : true, + regexp : true, sloppy : true, vars : false, + white : true +*/ +/*global $, app */ + +app.shell = (function () { + 'use strict'; + //---------------- BEGIN MODULE SCOPE VARIABLES -------------- + + var + + stateMap = { + $container: undefined, + anchor_map: {}, + user: { + authenticated: false, + token: '', + name: '', + id:0 + }, + apiUrl: '', + search_cache: { + has_cache: false + } + }, + tokenExpired, + //onUPdate, + onLogin, onLogout, onShowError, onClearError, + initModule; + //----------------- END MODULE SCOPE VARIABLES --------------- + + //------------------- BEGIN UTILITY METHODS ------------------ + + tokenExpired = function () { + //fetch stored creds if available + var creds = store.get('pecklist.usercreds'); + if (creds) { + //check if token has expired + //is the date greater than the expires date + var rightNowUtc = new Date(); + var expDate = new Date(creds.expires * 1000); + if (rightNowUtc > expDate) { + return true; + } else { + return false; + } + } else { + return true; + } + } + //-------------------- END UTILITY METHODS ------------------- + + + //------------------- BEGIN EVENT HANDLERS ------------------- + + onLogin = function (event, login_user) { + //store creds + store.set('pecklist.usercreds', stateMap.user); + //New token needs to reset lastNav + stateMap.lastNav = new Date(); + //Go to the home page + page('#!/main/'); + return false; + }; + + onLogout = function (event) { + store.clear(); + stateMap.user.authenticated = false; + stateMap.user.name = ''; + stateMap.user.token = ''; + stateMap.user.id=0; + page('#!/authenticate/'); + return false; + }; + + // onUpdate = function (event) { + + // window.location.reload(true); + // return false; + // }; + + + onShowError = function (event, msg) { + $("#app-error-div").removeClass("d-none"); + $('#app-error-message').text(msg); + return false; + }; + + onClearError = function (event) { + $("#app-error-div").addClass("d-none"); + return false; + }; + + + //-------------------- END EVENT HANDLERS -------------------- + + + + //------------------- BEGIN PUBLIC METHODS ------------------- + initModule = function ($container) { + + document.title = 'Pecklist ' + app.api.GZAppVersion; + + + //PRE FLIGHT CHECK + //================ + + //local storage required + if (!store.enabled) { + alert('Local storage is not supported by your browser. Please disable "Private Mode", or upgrade to a modern browser.'); + return; + } + + //wait indicator for ajax functions + $(document).ajaxStart(function () { + + //disable all buttons + $('.app-frm-buttons button').prop('disabled', true).addClass('disabled'); + //$('.app-frm-buttons button').attr('disabled', 'disabled'); + $("body").css("cursor", "progress"); + //add app-ajax-busy style to buttons div where user clicked + $('.app-frm-buttons').addClass('app-ajax-busy'); + + }).ajaxStop(function () { + + //with delay in case it's too fast to see + setTimeout(function () { + $('.app-frm-buttons button').prop('disabled', false).removeClass('disabled'); + //$('.app-frm-buttons button').removeAttr('disabled'); + $("body").css("cursor", "default"); + $('.app-frm-buttons').removeClass('app-ajax-busy'); + }, 250); + + }); + + + // load HTML and map jQuery collections + stateMap.$container = $container; + $container.html(Handlebars.templates['app.shell']({})); + + //auto hide navbar on click of nav link item + $('.nav-link').on('click',function() { + $('.navbar-collapse').collapse('hide'); + }); + + //determine API url and save it + stateMap.apiUrl = app.utilB.getApiUrl(); + + + //fetch stored creds if available + var creds = store.get('pecklist.usercreds'); + + + //check if token has expired + + if (tokenExpired()) { + stateMap.user.authenticated = false; + stateMap.user.name = ''; + stateMap.user.token = ''; + stateMap.user.id=0; + + } else { + //Show the logout item in the menu + $(".app-mnu-logout").removeClass("app-hidden"); + stateMap.user.authenticated = true; + stateMap.user.name = creds.name; + stateMap.user.token = creds.token; + stateMap.user.dlkey=creds.dlkey; + stateMap.user.id=creds.id; + } + //} + + + //EVENT SUBSCRIPTIONS + $.gevent.subscribe($container, 'app-login', onLogin); + $.gevent.subscribe($container, 'app-logout', onLogout); + //$.gevent.subscribe($container, 'gz-update', onUpdate); + $.gevent.subscribe($container, 'app-show-error', onShowError); + $.gevent.subscribe($container, 'app-clear-error', onClearError); + + + //ROUTES + // + page.base('/index.html'); + + page('*', beforeUrlChange); + page('/authenticate', authenticate); + page('/', main); + page('/logout', function () { + $.gevent.publish('app-logout'); + }); + page('/main', main); + page('/settings', settings); + page('*', notFound); + page({ + hashbang: true + }); + // /ROUTES + }; + // End PUBLIC method /initModule/ + + var beforeUrlChange = function (ctx, next) { + $.gevent.publish('app-clear-error'); + app.shell.stateMap.mediaSize = app.utilB.getMediaSize(); + + //bypass stuff below if about to logout + if (ctx.path == '/logout') { + return next(); + } + + + //================================================================ + //Check authentication token to see if expired, but only if it's been a few minutes since last navigation + if (stateMap.user.authenticated) { + //This first bit sets the last nav in cases where it's never been set before + //default to one hour ago in case it hasn't ever been set yet or isn't in statemap + if (!stateMap.lastNav) { + //Isn't this sketchy? Is this a date or a moment being set here + stateMap.lastNav = moment().subtract(3600, 's').toDate();//60 minutes ago + } + + + var mNow = moment(new Date()); //todays date + var mLastNav = moment(stateMap.lastNav); // another date + var duration = moment.duration(mNow.diff(mLastNav)); + var secondsSinceLastNav = duration.asSeconds(); + + if (secondsSinceLastNav > 300)//have we checked in the last 5 minutes? + { + if (tokenExpired()) { + stateMap.user.authenticated = false; + } + + } + stateMap.lastNav = new Date(); + } + //=============================================================== + + //Not logged in and trying to go somewhere but authenticate? + if (!stateMap.user.authenticated) { + //hide nav + $("#gz-nav").hide({ + duration: 200 + }); + + + //page nav to authenticate + if (ctx.path != '/authenticate/') + return page('#!/authenticate/'); + + } else { + //logged in so make sure to show toolbar here + $("#gz-nav").show({ + duration: 200 + }); + } + + next(); + } + + + var authenticate = function (ctx) { + + app.authenticate.configModule({ + context: ctx + }); + app.authenticate.initModule(); + } + + var main = function (ctx) { + app.nav.setSelectedMenuItem('main'); + app.main.configModule({ + context: ctx + }); + app.main.initModule(); + } + + var settings = function (ctx) { + app.nav.setSelectedMenuItem('settings'); + app.settings.configModule({ + context: ctx + }); + app.settings.initModule(); + } + + var notFound = function (ctx) { + app.fourohfour.configModule({ + context: ctx + }); + app.fourohfour.initModule(); + } + + + + + + return { + initModule: initModule, + stateMap: stateMap + }; + //------------------- END PUBLIC METHODS --------------------- +}()); \ No newline at end of file diff --git a/wwwroot/js/app.util.js b/wwwroot/js/app.util.js new file mode 100644 index 0000000..59197db --- /dev/null +++ b/wwwroot/js/app.util.js @@ -0,0 +1,80 @@ +/* + * app.util.js + * General JavaScript utilities + * + * Michael S. Mikowski - mmikowski at gmail dot com + * These are routines I have created, compiled, and updated + * since 1998, with inspiration from around the web. + * + * MIT License + * +*/ + +/*jslint browser : true, continue : true, + devel : true, indent : 2, maxerr : 50, + newcap : true, nomen : true, plusplus : true, + regexp : true, sloppy : true, vars : false, + white : true +*/ +/*global $, app */ + +app.util = (function () { + var makeError, setConfigMap; + + // Begin Public constructor /makeError/ + // Purpose: a convenience wrapper to create an error object + // Arguments: + // * name_text - the error name + // * msg_text - long error message + // * data - optional data attached to error object + // Returns : newly constructed error object + // Throws : none + // + makeError = function ( name_text, msg_text, data ) { + var error = new Error(); + error.name = name_text; + error.message = msg_text; + + if ( data ){ error.data = data; } + + return error; + }; + // End Public constructor /makeError/ + + // Begin Public method /setConfigMap/ + // Purpose: Common code to set configs in feature modules + // Arguments: + // * input_map - map of key-values to set in config + // * settable_map - map of allowable keys to set + // * config_map - map to apply settings to + // Returns: true + // Throws : Exception if input key not allowed + // + setConfigMap = function ( arg_map ){ + var + input_map = arg_map.input_map, + settable_map = arg_map.settable_map, + config_map = arg_map.config_map, + key_name, error; + + for ( key_name in input_map ){ + if ( input_map.hasOwnProperty( key_name ) ){ + if ( settable_map.hasOwnProperty( key_name ) ){ + config_map[key_name] = input_map[key_name]; + } + else { + error = makeError( 'Bad Input', + 'Setting config key |' + key_name + '| is not supported' + ); + throw error; + } + } + } + }; + // End Public method /setConfigMap/ + + return { + makeError : makeError, + setConfigMap : setConfigMap + }; +}()); diff --git a/wwwroot/js/app.utilB.js b/wwwroot/js/app.utilB.js new file mode 100644 index 0000000..1ee9f8a --- /dev/null +++ b/wwwroot/js/app.utilB.js @@ -0,0 +1,334 @@ +/** + * app.utilB.js + * JavaScript browser utilities + * + */ + +/*jslint browser : true, continue : true, + devel : true, indent : 2, maxerr : 50, + newcap : true, nomen : true, plusplus : true, + regexp : true, sloppy : true, vars : false, + white : true +*/ +/*global $, app, getComputedStyle */ + +app.utilB = (function () { + 'use strict'; + //---------------- BEGIN MODULE SCOPE VARIABLES -------------- + var + configMap = { + regex_encode_html: /[&"'><]/g, + regex_encode_noamp: /["'><]/g, + html_encode_map: { + '&': '&', + '"': '"', + "'": ''', + '>': '>', + '<': '<' + } + }, + + decodeHtml, encodeHtml, getEmSize, getApiUrl, getUrlParams, formData, objectifyFormDataArray, + getMediaSize, prepareObjectForClient, fixDatesToStrings, + epochToShortDate, epochToLocalShortDate, epochToLocalShortDateTime, getCurrentDateTimeAsEpoch, + genListColumn, + genListColumnNoLink, autoComplete, prepareObjectDatesForServer, + fixStringToServerDate; + + configMap.encode_noamp_map = $.extend({}, configMap.html_encode_map); + delete configMap.encode_noamp_map['&']; + //----------------- END MODULE SCOPE VARIABLES --------------- + + //------------------- BEGIN UTILITY METHODS ------------------ + + + // Begin decodeHtml + // Decodes HTML entities in a browser-friendly way + // See http://stackoverflow.com/questions/1912501/\ + // unescape-html-entities-in-javascript + // + decodeHtml = function (str) { + return $('
    ').html(str || '').text(); + }; + // End decodeHtml + + + // Begin encodeHtml + // This is single pass encoder for html entities and handles + // an arbitrary number of characters + // + encodeHtml = function (input_arg_str, exclude_amp) { + var + input_str = String(input_arg_str), + regex, lookup_map; + + if (exclude_amp) { + lookup_map = configMap.encode_noamp_map; + regex = configMap.regex_encode_noamp; + } else { + lookup_map = configMap.html_encode_map; + regex = configMap.regex_encode_html; + } + return input_str.replace(regex, + function (match, name) { + return lookup_map[match] || ''; + } + ); + }; + // End encodeHtml + + // Begin getEmSize + // returns size of ems in pixels + // + getEmSize = function (elem) { + return Number( + getComputedStyle(elem, '').fontSize.match(/\d*\.?\d*/)[0] + ); + }; + // End getEmSize + + + //Begin getApiUrl + //returns url for api methods by parsing current window location url + // + getApiUrl = function () { + var u = window.location.href.replace(window.location.hash, "").replace('index.html', '') + "api/"; + //is it a dev local url? + if (u.indexOf("localhost:8080") != -1) { + u = u.replace("8080", "8081"); + } + // End getApiUrl + + //fix for random recurrence of extraneous ? on iPhone when using api + //(Cannot post to http://gl-gztw.rhcloud.com/?api/list (404)) + u = u.replace("?", ""); + + return u; + } + + + + + + // Begin formData + // Get or set all form fields + // + formData = function (data) { + + //fix dates into strings + prepareObjectForClient(data); + + + var inps = $(":input").get(); + + if (typeof data != "object") { + // return all data + data = {}; + + $.each(inps, function () { + if (this.name && (this.checked || /select|textarea/i.test(this.nodeName) || /text|hidden|password/i.test(this.type))) { + data[this.name] = $(this).val(); + } + }); + return data; + } else { + $.each(inps, function () { + if (this.name && data[this.name]) { + if (this.type == "checkbox" || this.type == "radio") { + $(this).prop("checked", (data[this.name])); + } else { + $(this).val(data[this.name]); + } + } else if (this.type == "checkbox") { + $(this).prop("checked", false); + } + }); + return $(this); + } + }; + // End formdata + + // Begin getMediaSize + // Retrieves results of css media query in hidden pseudo element + // :after body element + //objectifyFormDataArray + getMediaSize = function () { + return window.getComputedStyle(document.querySelector('body'), ':after').getPropertyValue('content').replace(/\"/g, ''); + }; + // End getMediaSize + + + + + + //Begin objectifyFormDataArray + //takes name value form input pairs in array and turns into a keyed object + //suitable for sending as json object + // + objectifyFormDataArray = function (arr) { + var rv = {}; + for (var i = 0; i < arr.length; ++i) + if (arr[i] !== undefined) { + rv[arr[i].name] = arr[i].value.trim();//case 3205 added trim + } + return prepareObjectDatesForServer(rv); + } + + + + + + //Prepare an object for server needed format before submission + //called by objectifyFormDataArray + prepareObjectDatesForServer = function (obj) { + if (Array.isArray(obj)) { + for (var i = 0; i < obj.length; i++) { + fixStringToServerDate(obj[i]); + } + } else { + fixStringToServerDate(obj); + } + return obj; + } + // + + //Turn string date fields from client into server compatible format (Unix epoch like this: 1498262400 1499904000) + fixStringToServerDate = function (obj) { + var keys = Object.keys(obj); + keys.forEach(function (key) { + if (key.endsWith('Date') || key.startsWith('dt')) { + var value = obj[key]; + if (value == null) { + obj[key] = ''; + } else { + //this is the sample format we will see: 2017-07-13 + //TODO: is this assuming UTC? + obj[key] = moment.utc(value, "YYYY-MM-DD").unix(); + } + } + }); + } + + + + //This function exists to change the properties of the passed in object + //to values compatible with jquery form filling functions (mostly dates to strings for now) + // + prepareObjectForClient = function (obj) { + if (Array.isArray(obj)) { + for (var i = 0; i < obj.length; i++) { + fixDatesToStrings(obj[i]); + } + } else { + fixDatesToStrings(obj); + } + return obj; + } + // + + //Turn date fields of object coming from db into stringified values for consumption by client + //turn null dates into empty strings and iso date values into strings in iso format + fixDatesToStrings = function (obj) { + var keys = Object.keys(obj); + keys.forEach(function (key) { + if (key.endsWith('Date') || key.startsWith('dt')) { + var value = obj[key]; + if (value == null) { + obj[key] = ''; + } else { + //Now with sqlite they come and go as unix epoch seconds + //needs to be yyyy-MM-dd + obj[key] = moment.utc(new Date(value * 1000)).format("YYYY-MM-DD"); + } + } + }); + } + // + + //Turn date values coming in from server into displayable short date format + //used to display dates in various lists (where the source epoch is already localized) + epochToShortDate = function (epoch) { + if (epoch == null || epoch == 0) return ''; + return moment.utc(new Date(epoch * 1000)).format("YYYY-MM-DD"); + } + // + + //LOCAL VERSION: Turn date values coming in from server into displayable short date format + //used to display dates in various lists where the source epoch is in UTC + epochToLocalShortDate = function (epoch) { + if (epoch == null || epoch == 0) return ''; + var utdate = moment.utc(new Date(epoch * 1000)); + var localdate = moment(utdate).local(); + return localdate.format("YYYY-MM-DD"); + } + + //LOCAL VERSION: Turn date values coming in from server into displayable short date AND TIME format + //used to display dates in various lists where the source epoch is in UTC + epochToLocalShortDateTime = function (epoch) { + if (epoch == null || epoch == 0) return ''; + var utdate = moment.utc(new Date(epoch * 1000)); + var localdate = moment(utdate).local(); + return localdate.format("YYYY-MM-DD LT"); + } + + ////////////////////////// + //Get current date and time as a utc unix epoch + getCurrentDateTimeAsEpoch = function () { + return moment().utc().unix(); + } + + // Begin genListColumn + // This function is used to demarcate 'columns' of fields in basic list forms by wrapping each column field in html + // + genListColumn = function (val) { + return '' + val + '' + }; + // End genListColumn + + // Begin genListColumnNoLink + // This function is used to demarcate and style 'columns' of fields in basic list forms by wrapping each column field in html + // that are not link columns + genListColumnNoLink = function (val) { + return '' + val + '' + }; + // End genListColumn + + + // Begin autoComplete + // This function is used to attach an autocomplete method to an input + // + autoComplete = function (controlId, acGetToken) { + $('#' + controlId).autocomplete({ + serviceUrl: app.shell.stateMap.apiUrl + 'autocomplete', + params: { + acget: acGetToken + }, + ajaxSettings: { + headers: app.api.getAuthHeaderObject() + } + }); + }; + // End autoComplete + + + + // export methods + return { + decodeHtml: decodeHtml, + encodeHtml: encodeHtml, + getEmSize: getEmSize, + getApiUrl: getApiUrl, + getUrlParams: getUrlParams, + formData: formData, + getMediaSize: getMediaSize, + objectifyFormDataArray: objectifyFormDataArray, + epochToShortDate: epochToShortDate, + epochToLocalShortDate: epochToLocalShortDate, + epochToLocalShortDateTime: epochToLocalShortDateTime, + getCurrentDateTimeAsEpoch: getCurrentDateTimeAsEpoch, + genListColumn: genListColumn, + genListColumnNoLink: genListColumnNoLink, + autoComplete: autoComplete + }; + //------------------- END PUBLIC METHODS --------------------- +}()); \ No newline at end of file diff --git a/wwwroot/js/index.js b/wwwroot/js/index.js new file mode 100644 index 0000000..81ecd6e --- /dev/null +++ b/wwwroot/js/index.js @@ -0,0 +1,22 @@ +/* + * app.js + * Root namespace module +*/ + +/*jslint browser : true, continue : true, + devel : true, indent : 2, maxerr : 50, + newcap : true, nomen : true, plusplus : true, + regexp : true, sloppy : true, vars : false, + white : true +*/ +/*global $, app */ + +var app = (function () { + 'use strict'; + var initModule = function ( $container ) { + app.api.initModule(); + app.shell.initModule( $container ); + }; + + return { initModule: initModule }; +}()); \ No newline at end of file diff --git a/wwwroot/js/lib/handlebars.runtime-v4.0.5.js b/wwwroot/js/lib/handlebars.runtime-v4.0.5.js new file mode 100644 index 0000000..95049f3 --- /dev/null +++ b/wwwroot/js/lib/handlebars.runtime-v4.0.5.js @@ -0,0 +1,1240 @@ +/*! + + handlebars v4.0.5 + +Copyright (C) 2011-2015 by Yehuda Katz + +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. + +@license +*/ +(function webpackUniversalModuleDefinition(root, factory) { + if(typeof exports === 'object' && typeof module === 'object') + module.exports = factory(); + else if(typeof define === 'function' && define.amd) + define([], factory); + else if(typeof exports === 'object') + exports["Handlebars"] = factory(); + else + root["Handlebars"] = factory(); +})(this, function() { +return /******/ (function(modules) { // webpackBootstrap +/******/ // The module cache +/******/ var installedModules = {}; + +/******/ // The require function +/******/ function __webpack_require__(moduleId) { + +/******/ // Check if module is in cache +/******/ if(installedModules[moduleId]) +/******/ return installedModules[moduleId].exports; + +/******/ // Create a new module (and put it into the cache) +/******/ var module = installedModules[moduleId] = { +/******/ exports: {}, +/******/ id: moduleId, +/******/ loaded: false +/******/ }; + +/******/ // Execute the module function +/******/ modules[moduleId].call(module.exports, module, module.exports, __webpack_require__); + +/******/ // Flag the module as loaded +/******/ module.loaded = true; + +/******/ // Return the exports of the module +/******/ return module.exports; +/******/ } + + +/******/ // expose the modules object (__webpack_modules__) +/******/ __webpack_require__.m = modules; + +/******/ // expose the module cache +/******/ __webpack_require__.c = installedModules; + +/******/ // __webpack_public_path__ +/******/ __webpack_require__.p = ""; + +/******/ // Load entry module and return exports +/******/ return __webpack_require__(0); +/******/ }) +/************************************************************************/ +/******/ ([ +/* 0 */ +/***/ function(module, exports, __webpack_require__) { + + 'use strict'; + + var _interopRequireWildcard = __webpack_require__(1)['default']; + + var _interopRequireDefault = __webpack_require__(2)['default']; + + exports.__esModule = true; + + var _handlebarsBase = __webpack_require__(3); + + var base = _interopRequireWildcard(_handlebarsBase); + + // Each of these augment the Handlebars object. No need to setup here. + // (This is done to easily share code between commonjs and browse envs) + + var _handlebarsSafeString = __webpack_require__(17); + + var _handlebarsSafeString2 = _interopRequireDefault(_handlebarsSafeString); + + var _handlebarsException = __webpack_require__(5); + + var _handlebarsException2 = _interopRequireDefault(_handlebarsException); + + var _handlebarsUtils = __webpack_require__(4); + + var Utils = _interopRequireWildcard(_handlebarsUtils); + + var _handlebarsRuntime = __webpack_require__(18); + + var runtime = _interopRequireWildcard(_handlebarsRuntime); + + var _handlebarsNoConflict = __webpack_require__(19); + + var _handlebarsNoConflict2 = _interopRequireDefault(_handlebarsNoConflict); + + // For compatibility and usage outside of module systems, make the Handlebars object a namespace + function create() { + var hb = new base.HandlebarsEnvironment(); + + Utils.extend(hb, base); + hb.SafeString = _handlebarsSafeString2['default']; + hb.Exception = _handlebarsException2['default']; + hb.Utils = Utils; + hb.escapeExpression = Utils.escapeExpression; + + hb.VM = runtime; + hb.template = function (spec) { + return runtime.template(spec, hb); + }; + + return hb; + } + + var inst = create(); + inst.create = create; + + _handlebarsNoConflict2['default'](inst); + + inst['default'] = inst; + + exports['default'] = inst; + module.exports = exports['default']; + +/***/ }, +/* 1 */ +/***/ function(module, exports) { + + "use strict"; + + exports["default"] = function (obj) { + if (obj && obj.__esModule) { + return obj; + } else { + var newObj = {}; + + if (obj != null) { + for (var key in obj) { + if (Object.prototype.hasOwnProperty.call(obj, key)) newObj[key] = obj[key]; + } + } + + newObj["default"] = obj; + return newObj; + } + }; + + exports.__esModule = true; + +/***/ }, +/* 2 */ +/***/ function(module, exports) { + + "use strict"; + + exports["default"] = function (obj) { + return obj && obj.__esModule ? obj : { + "default": obj + }; + }; + + exports.__esModule = true; + +/***/ }, +/* 3 */ +/***/ function(module, exports, __webpack_require__) { + + 'use strict'; + + var _interopRequireDefault = __webpack_require__(2)['default']; + + exports.__esModule = true; + exports.HandlebarsEnvironment = HandlebarsEnvironment; + + var _utils = __webpack_require__(4); + + var _exception = __webpack_require__(5); + + var _exception2 = _interopRequireDefault(_exception); + + var _helpers = __webpack_require__(6); + + var _decorators = __webpack_require__(14); + + var _logger = __webpack_require__(16); + + var _logger2 = _interopRequireDefault(_logger); + + var VERSION = '4.0.5'; + exports.VERSION = VERSION; + var COMPILER_REVISION = 7; + + exports.COMPILER_REVISION = COMPILER_REVISION; + var REVISION_CHANGES = { + 1: '<= 1.0.rc.2', // 1.0.rc.2 is actually rev2 but doesn't report it + 2: '== 1.0.0-rc.3', + 3: '== 1.0.0-rc.4', + 4: '== 1.x.x', + 5: '== 2.0.0-alpha.x', + 6: '>= 2.0.0-beta.1', + 7: '>= 4.0.0' + }; + + exports.REVISION_CHANGES = REVISION_CHANGES; + var objectType = '[object Object]'; + + function HandlebarsEnvironment(helpers, partials, decorators) { + this.helpers = helpers || {}; + this.partials = partials || {}; + this.decorators = decorators || {}; + + _helpers.registerDefaultHelpers(this); + _decorators.registerDefaultDecorators(this); + } + + HandlebarsEnvironment.prototype = { + constructor: HandlebarsEnvironment, + + logger: _logger2['default'], + log: _logger2['default'].log, + + registerHelper: function registerHelper(name, fn) { + if (_utils.toString.call(name) === objectType) { + if (fn) { + throw new _exception2['default']('Arg not supported with multiple helpers'); + } + _utils.extend(this.helpers, name); + } else { + this.helpers[name] = fn; + } + }, + unregisterHelper: function unregisterHelper(name) { + delete this.helpers[name]; + }, + + registerPartial: function registerPartial(name, partial) { + if (_utils.toString.call(name) === objectType) { + _utils.extend(this.partials, name); + } else { + if (typeof partial === 'undefined') { + throw new _exception2['default']('Attempting to register a partial called "' + name + '" as undefined'); + } + this.partials[name] = partial; + } + }, + unregisterPartial: function unregisterPartial(name) { + delete this.partials[name]; + }, + + registerDecorator: function registerDecorator(name, fn) { + if (_utils.toString.call(name) === objectType) { + if (fn) { + throw new _exception2['default']('Arg not supported with multiple decorators'); + } + _utils.extend(this.decorators, name); + } else { + this.decorators[name] = fn; + } + }, + unregisterDecorator: function unregisterDecorator(name) { + delete this.decorators[name]; + } + }; + + var log = _logger2['default'].log; + + exports.log = log; + exports.createFrame = _utils.createFrame; + exports.logger = _logger2['default']; + +/***/ }, +/* 4 */ +/***/ function(module, exports) { + + 'use strict'; + + exports.__esModule = true; + exports.extend = extend; + exports.indexOf = indexOf; + exports.escapeExpression = escapeExpression; + exports.isEmpty = isEmpty; + exports.createFrame = createFrame; + exports.blockParams = blockParams; + exports.appendContextPath = appendContextPath; + var escape = { + '&': '&', + '<': '<', + '>': '>', + '"': '"', + "'": ''', + '`': '`', + '=': '=' + }; + + var badChars = /[&<>"'`=]/g, + possible = /[&<>"'`=]/; + + function escapeChar(chr) { + return escape[chr]; + } + + function extend(obj /* , ...source */) { + for (var i = 1; i < arguments.length; i++) { + for (var key in arguments[i]) { + if (Object.prototype.hasOwnProperty.call(arguments[i], key)) { + obj[key] = arguments[i][key]; + } + } + } + + return obj; + } + + var toString = Object.prototype.toString; + + exports.toString = toString; + // Sourced from lodash + // https://github.com/bestiejs/lodash/blob/master/LICENSE.txt + /* eslint-disable func-style */ + var isFunction = function isFunction(value) { + return typeof value === 'function'; + }; + // fallback for older versions of Chrome and Safari + /* istanbul ignore next */ + if (isFunction(/x/)) { + exports.isFunction = isFunction = function (value) { + return typeof value === 'function' && toString.call(value) === '[object Function]'; + }; + } + exports.isFunction = isFunction; + + /* eslint-enable func-style */ + + /* istanbul ignore next */ + var isArray = Array.isArray || function (value) { + return value && typeof value === 'object' ? toString.call(value) === '[object Array]' : false; + }; + + exports.isArray = isArray; + // Older IE versions do not directly support indexOf so we must implement our own, sadly. + + function indexOf(array, value) { + for (var i = 0, len = array.length; i < len; i++) { + if (array[i] === value) { + return i; + } + } + return -1; + } + + function escapeExpression(string) { + if (typeof string !== 'string') { + // don't escape SafeStrings, since they're already safe + if (string && string.toHTML) { + return string.toHTML(); + } else if (string == null) { + return ''; + } else if (!string) { + return string + ''; + } + + // Force a string conversion as this will be done by the append regardless and + // the regex test will do this transparently behind the scenes, causing issues if + // an object's to string has escaped characters in it. + string = '' + string; + } + + if (!possible.test(string)) { + return string; + } + return string.replace(badChars, escapeChar); + } + + function isEmpty(value) { + if (!value && value !== 0) { + return true; + } else if (isArray(value) && value.length === 0) { + return true; + } else { + return false; + } + } + + function createFrame(object) { + var frame = extend({}, object); + frame._parent = object; + return frame; + } + + function blockParams(params, ids) { + params.path = ids; + return params; + } + + function appendContextPath(contextPath, id) { + return (contextPath ? contextPath + '.' : '') + id; + } + +/***/ }, +/* 5 */ +/***/ function(module, exports) { + + 'use strict'; + + exports.__esModule = true; + + var errorProps = ['description', 'fileName', 'lineNumber', 'message', 'name', 'number', 'stack']; + + function Exception(message, node) { + var loc = node && node.loc, + line = undefined, + column = undefined; + if (loc) { + line = loc.start.line; + column = loc.start.column; + + message += ' - ' + line + ':' + column; + } + + var tmp = Error.prototype.constructor.call(this, message); + + // Unfortunately errors are not enumerable in Chrome (at least), so `for prop in tmp` doesn't work. + for (var idx = 0; idx < errorProps.length; idx++) { + this[errorProps[idx]] = tmp[errorProps[idx]]; + } + + /* istanbul ignore else */ + if (Error.captureStackTrace) { + Error.captureStackTrace(this, Exception); + } + + if (loc) { + this.lineNumber = line; + this.column = column; + } + } + + Exception.prototype = new Error(); + + exports['default'] = Exception; + module.exports = exports['default']; + +/***/ }, +/* 6 */ +/***/ function(module, exports, __webpack_require__) { + + 'use strict'; + + var _interopRequireDefault = __webpack_require__(2)['default']; + + exports.__esModule = true; + exports.registerDefaultHelpers = registerDefaultHelpers; + + var _helpersBlockHelperMissing = __webpack_require__(7); + + var _helpersBlockHelperMissing2 = _interopRequireDefault(_helpersBlockHelperMissing); + + var _helpersEach = __webpack_require__(8); + + var _helpersEach2 = _interopRequireDefault(_helpersEach); + + var _helpersHelperMissing = __webpack_require__(9); + + var _helpersHelperMissing2 = _interopRequireDefault(_helpersHelperMissing); + + var _helpersIf = __webpack_require__(10); + + var _helpersIf2 = _interopRequireDefault(_helpersIf); + + var _helpersLog = __webpack_require__(11); + + var _helpersLog2 = _interopRequireDefault(_helpersLog); + + var _helpersLookup = __webpack_require__(12); + + var _helpersLookup2 = _interopRequireDefault(_helpersLookup); + + var _helpersWith = __webpack_require__(13); + + var _helpersWith2 = _interopRequireDefault(_helpersWith); + + function registerDefaultHelpers(instance) { + _helpersBlockHelperMissing2['default'](instance); + _helpersEach2['default'](instance); + _helpersHelperMissing2['default'](instance); + _helpersIf2['default'](instance); + _helpersLog2['default'](instance); + _helpersLookup2['default'](instance); + _helpersWith2['default'](instance); + } + +/***/ }, +/* 7 */ +/***/ function(module, exports, __webpack_require__) { + + 'use strict'; + + exports.__esModule = true; + + var _utils = __webpack_require__(4); + + exports['default'] = function (instance) { + instance.registerHelper('blockHelperMissing', function (context, options) { + var inverse = options.inverse, + fn = options.fn; + + if (context === true) { + return fn(this); + } else if (context === false || context == null) { + return inverse(this); + } else if (_utils.isArray(context)) { + if (context.length > 0) { + if (options.ids) { + options.ids = [options.name]; + } + + return instance.helpers.each(context, options); + } else { + return inverse(this); + } + } else { + if (options.data && options.ids) { + var data = _utils.createFrame(options.data); + data.contextPath = _utils.appendContextPath(options.data.contextPath, options.name); + options = { data: data }; + } + + return fn(context, options); + } + }); + }; + + module.exports = exports['default']; + +/***/ }, +/* 8 */ +/***/ function(module, exports, __webpack_require__) { + + 'use strict'; + + var _interopRequireDefault = __webpack_require__(2)['default']; + + exports.__esModule = true; + + var _utils = __webpack_require__(4); + + var _exception = __webpack_require__(5); + + var _exception2 = _interopRequireDefault(_exception); + + exports['default'] = function (instance) { + instance.registerHelper('each', function (context, options) { + if (!options) { + throw new _exception2['default']('Must pass iterator to #each'); + } + + var fn = options.fn, + inverse = options.inverse, + i = 0, + ret = '', + data = undefined, + contextPath = undefined; + + if (options.data && options.ids) { + contextPath = _utils.appendContextPath(options.data.contextPath, options.ids[0]) + '.'; + } + + if (_utils.isFunction(context)) { + context = context.call(this); + } + + if (options.data) { + data = _utils.createFrame(options.data); + } + + function execIteration(field, index, last) { + if (data) { + data.key = field; + data.index = index; + data.first = index === 0; + data.last = !!last; + + if (contextPath) { + data.contextPath = contextPath + field; + } + } + + ret = ret + fn(context[field], { + data: data, + blockParams: _utils.blockParams([context[field], field], [contextPath + field, null]) + }); + } + + if (context && typeof context === 'object') { + if (_utils.isArray(context)) { + for (var j = context.length; i < j; i++) { + if (i in context) { + execIteration(i, i, i === context.length - 1); + } + } + } else { + var priorKey = undefined; + + for (var key in context) { + if (context.hasOwnProperty(key)) { + // We're running the iterations one step out of sync so we can detect + // the last iteration without have to scan the object twice and create + // an itermediate keys array. + if (priorKey !== undefined) { + execIteration(priorKey, i - 1); + } + priorKey = key; + i++; + } + } + if (priorKey !== undefined) { + execIteration(priorKey, i - 1, true); + } + } + } + + if (i === 0) { + ret = inverse(this); + } + + return ret; + }); + }; + + module.exports = exports['default']; + +/***/ }, +/* 9 */ +/***/ function(module, exports, __webpack_require__) { + + 'use strict'; + + var _interopRequireDefault = __webpack_require__(2)['default']; + + exports.__esModule = true; + + var _exception = __webpack_require__(5); + + var _exception2 = _interopRequireDefault(_exception); + + exports['default'] = function (instance) { + instance.registerHelper('helperMissing', function () /* [args, ]options */{ + if (arguments.length === 1) { + // A missing field in a {{foo}} construct. + return undefined; + } else { + // Someone is actually trying to call something, blow up. + throw new _exception2['default']('Missing helper: "' + arguments[arguments.length - 1].name + '"'); + } + }); + }; + + module.exports = exports['default']; + +/***/ }, +/* 10 */ +/***/ function(module, exports, __webpack_require__) { + + 'use strict'; + + exports.__esModule = true; + + var _utils = __webpack_require__(4); + + exports['default'] = function (instance) { + instance.registerHelper('if', function (conditional, options) { + if (_utils.isFunction(conditional)) { + conditional = conditional.call(this); + } + + // Default behavior is to render the positive path if the value is truthy and not empty. + // The `includeZero` option may be set to treat the condtional as purely not empty based on the + // behavior of isEmpty. Effectively this determines if 0 is handled by the positive path or negative. + if (!options.hash.includeZero && !conditional || _utils.isEmpty(conditional)) { + return options.inverse(this); + } else { + return options.fn(this); + } + }); + + instance.registerHelper('unless', function (conditional, options) { + return instance.helpers['if'].call(this, conditional, { fn: options.inverse, inverse: options.fn, hash: options.hash }); + }); + }; + + module.exports = exports['default']; + +/***/ }, +/* 11 */ +/***/ function(module, exports) { + + 'use strict'; + + exports.__esModule = true; + + exports['default'] = function (instance) { + instance.registerHelper('log', function () /* message, options */{ + var args = [undefined], + options = arguments[arguments.length - 1]; + for (var i = 0; i < arguments.length - 1; i++) { + args.push(arguments[i]); + } + + var level = 1; + if (options.hash.level != null) { + level = options.hash.level; + } else if (options.data && options.data.level != null) { + level = options.data.level; + } + args[0] = level; + + instance.log.apply(instance, args); + }); + }; + + module.exports = exports['default']; + +/***/ }, +/* 12 */ +/***/ function(module, exports) { + + 'use strict'; + + exports.__esModule = true; + + exports['default'] = function (instance) { + instance.registerHelper('lookup', function (obj, field) { + return obj && obj[field]; + }); + }; + + module.exports = exports['default']; + +/***/ }, +/* 13 */ +/***/ function(module, exports, __webpack_require__) { + + 'use strict'; + + exports.__esModule = true; + + var _utils = __webpack_require__(4); + + exports['default'] = function (instance) { + instance.registerHelper('with', function (context, options) { + if (_utils.isFunction(context)) { + context = context.call(this); + } + + var fn = options.fn; + + if (!_utils.isEmpty(context)) { + var data = options.data; + if (options.data && options.ids) { + data = _utils.createFrame(options.data); + data.contextPath = _utils.appendContextPath(options.data.contextPath, options.ids[0]); + } + + return fn(context, { + data: data, + blockParams: _utils.blockParams([context], [data && data.contextPath]) + }); + } else { + return options.inverse(this); + } + }); + }; + + module.exports = exports['default']; + +/***/ }, +/* 14 */ +/***/ function(module, exports, __webpack_require__) { + + 'use strict'; + + var _interopRequireDefault = __webpack_require__(2)['default']; + + exports.__esModule = true; + exports.registerDefaultDecorators = registerDefaultDecorators; + + var _decoratorsInline = __webpack_require__(15); + + var _decoratorsInline2 = _interopRequireDefault(_decoratorsInline); + + function registerDefaultDecorators(instance) { + _decoratorsInline2['default'](instance); + } + +/***/ }, +/* 15 */ +/***/ function(module, exports, __webpack_require__) { + + 'use strict'; + + exports.__esModule = true; + + var _utils = __webpack_require__(4); + + exports['default'] = function (instance) { + instance.registerDecorator('inline', function (fn, props, container, options) { + var ret = fn; + if (!props.partials) { + props.partials = {}; + ret = function (context, options) { + // Create a new partials stack frame prior to exec. + var original = container.partials; + container.partials = _utils.extend({}, original, props.partials); + var ret = fn(context, options); + container.partials = original; + return ret; + }; + } + + props.partials[options.args[0]] = options.fn; + + return ret; + }); + }; + + module.exports = exports['default']; + +/***/ }, +/* 16 */ +/***/ function(module, exports, __webpack_require__) { + + 'use strict'; + + exports.__esModule = true; + + var _utils = __webpack_require__(4); + + var logger = { + methodMap: ['debug', 'info', 'warn', 'error'], + level: 'info', + + // Maps a given level value to the `methodMap` indexes above. + lookupLevel: function lookupLevel(level) { + if (typeof level === 'string') { + var levelMap = _utils.indexOf(logger.methodMap, level.toLowerCase()); + if (levelMap >= 0) { + level = levelMap; + } else { + level = parseInt(level, 10); + } + } + + return level; + }, + + // Can be overridden in the host environment + log: function log(level) { + level = logger.lookupLevel(level); + + if (typeof console !== 'undefined' && logger.lookupLevel(logger.level) <= level) { + var method = logger.methodMap[level]; + if (!console[method]) { + // eslint-disable-line no-console + method = 'log'; + } + + for (var _len = arguments.length, message = Array(_len > 1 ? _len - 1 : 0), _key = 1; _key < _len; _key++) { + message[_key - 1] = arguments[_key]; + } + + console[method].apply(console, message); // eslint-disable-line no-console + } + } + }; + + exports['default'] = logger; + module.exports = exports['default']; + +/***/ }, +/* 17 */ +/***/ function(module, exports) { + + // Build out our basic SafeString type + 'use strict'; + + exports.__esModule = true; + function SafeString(string) { + this.string = string; + } + + SafeString.prototype.toString = SafeString.prototype.toHTML = function () { + return '' + this.string; + }; + + exports['default'] = SafeString; + module.exports = exports['default']; + +/***/ }, +/* 18 */ +/***/ function(module, exports, __webpack_require__) { + + 'use strict'; + + var _interopRequireWildcard = __webpack_require__(1)['default']; + + var _interopRequireDefault = __webpack_require__(2)['default']; + + exports.__esModule = true; + exports.checkRevision = checkRevision; + exports.template = template; + exports.wrapProgram = wrapProgram; + exports.resolvePartial = resolvePartial; + exports.invokePartial = invokePartial; + exports.noop = noop; + + var _utils = __webpack_require__(4); + + var Utils = _interopRequireWildcard(_utils); + + var _exception = __webpack_require__(5); + + var _exception2 = _interopRequireDefault(_exception); + + var _base = __webpack_require__(3); + + function checkRevision(compilerInfo) { + var compilerRevision = compilerInfo && compilerInfo[0] || 1, + currentRevision = _base.COMPILER_REVISION; + + if (compilerRevision !== currentRevision) { + if (compilerRevision < currentRevision) { + var runtimeVersions = _base.REVISION_CHANGES[currentRevision], + compilerVersions = _base.REVISION_CHANGES[compilerRevision]; + throw new _exception2['default']('Template was precompiled with an older version of Handlebars than the current runtime. ' + 'Please update your precompiler to a newer version (' + runtimeVersions + ') or downgrade your runtime to an older version (' + compilerVersions + ').'); + } else { + // Use the embedded version info since the runtime doesn't know about this revision yet + throw new _exception2['default']('Template was precompiled with a newer version of Handlebars than the current runtime. ' + 'Please update your runtime to a newer version (' + compilerInfo[1] + ').'); + } + } + } + + function template(templateSpec, env) { + /* istanbul ignore next */ + if (!env) { + throw new _exception2['default']('No environment passed to template'); + } + if (!templateSpec || !templateSpec.main) { + throw new _exception2['default']('Unknown template object: ' + typeof templateSpec); + } + + templateSpec.main.decorator = templateSpec.main_d; + + // Note: Using env.VM references rather than local var references throughout this section to allow + // for external users to override these as psuedo-supported APIs. + env.VM.checkRevision(templateSpec.compiler); + + function invokePartialWrapper(partial, context, options) { + if (options.hash) { + context = Utils.extend({}, context, options.hash); + if (options.ids) { + options.ids[0] = true; + } + } + + partial = env.VM.resolvePartial.call(this, partial, context, options); + var result = env.VM.invokePartial.call(this, partial, context, options); + + if (result == null && env.compile) { + options.partials[options.name] = env.compile(partial, templateSpec.compilerOptions, env); + result = options.partials[options.name](context, options); + } + if (result != null) { + if (options.indent) { + var lines = result.split('\n'); + for (var i = 0, l = lines.length; i < l; i++) { + if (!lines[i] && i + 1 === l) { + break; + } + + lines[i] = options.indent + lines[i]; + } + result = lines.join('\n'); + } + return result; + } else { + throw new _exception2['default']('The partial ' + options.name + ' could not be compiled when running in runtime-only mode'); + } + } + + // Just add water + var container = { + strict: function strict(obj, name) { + if (!(name in obj)) { + throw new _exception2['default']('"' + name + '" not defined in ' + obj); + } + return obj[name]; + }, + lookup: function lookup(depths, name) { + var len = depths.length; + for (var i = 0; i < len; i++) { + if (depths[i] && depths[i][name] != null) { + return depths[i][name]; + } + } + }, + lambda: function lambda(current, context) { + return typeof current === 'function' ? current.call(context) : current; + }, + + escapeExpression: Utils.escapeExpression, + invokePartial: invokePartialWrapper, + + fn: function fn(i) { + var ret = templateSpec[i]; + ret.decorator = templateSpec[i + '_d']; + return ret; + }, + + programs: [], + program: function program(i, data, declaredBlockParams, blockParams, depths) { + var programWrapper = this.programs[i], + fn = this.fn(i); + if (data || depths || blockParams || declaredBlockParams) { + programWrapper = wrapProgram(this, i, fn, data, declaredBlockParams, blockParams, depths); + } else if (!programWrapper) { + programWrapper = this.programs[i] = wrapProgram(this, i, fn); + } + return programWrapper; + }, + + data: function data(value, depth) { + while (value && depth--) { + value = value._parent; + } + return value; + }, + merge: function merge(param, common) { + var obj = param || common; + + if (param && common && param !== common) { + obj = Utils.extend({}, common, param); + } + + return obj; + }, + + noop: env.VM.noop, + compilerInfo: templateSpec.compiler + }; + + function ret(context) { + var options = arguments.length <= 1 || arguments[1] === undefined ? {} : arguments[1]; + + var data = options.data; + + ret._setup(options); + if (!options.partial && templateSpec.useData) { + data = initData(context, data); + } + var depths = undefined, + blockParams = templateSpec.useBlockParams ? [] : undefined; + if (templateSpec.useDepths) { + if (options.depths) { + depths = context !== options.depths[0] ? [context].concat(options.depths) : options.depths; + } else { + depths = [context]; + } + } + + function main(context /*, options*/) { + return '' + templateSpec.main(container, context, container.helpers, container.partials, data, blockParams, depths); + } + main = executeDecorators(templateSpec.main, main, container, options.depths || [], data, blockParams); + return main(context, options); + } + ret.isTop = true; + + ret._setup = function (options) { + if (!options.partial) { + container.helpers = container.merge(options.helpers, env.helpers); + + if (templateSpec.usePartial) { + container.partials = container.merge(options.partials, env.partials); + } + if (templateSpec.usePartial || templateSpec.useDecorators) { + container.decorators = container.merge(options.decorators, env.decorators); + } + } else { + container.helpers = options.helpers; + container.partials = options.partials; + container.decorators = options.decorators; + } + }; + + ret._child = function (i, data, blockParams, depths) { + if (templateSpec.useBlockParams && !blockParams) { + throw new _exception2['default']('must pass block params'); + } + if (templateSpec.useDepths && !depths) { + throw new _exception2['default']('must pass parent depths'); + } + + return wrapProgram(container, i, templateSpec[i], data, 0, blockParams, depths); + }; + return ret; + } + + function wrapProgram(container, i, fn, data, declaredBlockParams, blockParams, depths) { + function prog(context) { + var options = arguments.length <= 1 || arguments[1] === undefined ? {} : arguments[1]; + + var currentDepths = depths; + if (depths && context !== depths[0]) { + currentDepths = [context].concat(depths); + } + + return fn(container, context, container.helpers, container.partials, options.data || data, blockParams && [options.blockParams].concat(blockParams), currentDepths); + } + + prog = executeDecorators(fn, prog, container, depths, data, blockParams); + + prog.program = i; + prog.depth = depths ? depths.length : 0; + prog.blockParams = declaredBlockParams || 0; + return prog; + } + + function resolvePartial(partial, context, options) { + if (!partial) { + if (options.name === '@partial-block') { + partial = options.data['partial-block']; + } else { + partial = options.partials[options.name]; + } + } else if (!partial.call && !options.name) { + // This is a dynamic partial that returned a string + options.name = partial; + partial = options.partials[partial]; + } + return partial; + } + + function invokePartial(partial, context, options) { + options.partial = true; + if (options.ids) { + options.data.contextPath = options.ids[0] || options.data.contextPath; + } + + var partialBlock = undefined; + if (options.fn && options.fn !== noop) { + options.data = _base.createFrame(options.data); + partialBlock = options.data['partial-block'] = options.fn; + + if (partialBlock.partials) { + options.partials = Utils.extend({}, options.partials, partialBlock.partials); + } + } + + if (partial === undefined && partialBlock) { + partial = partialBlock; + } + + if (partial === undefined) { + throw new _exception2['default']('The partial ' + options.name + ' could not be found'); + } else if (partial instanceof Function) { + return partial(context, options); + } + } + + function noop() { + return ''; + } + + function initData(context, data) { + if (!data || !('root' in data)) { + data = data ? _base.createFrame(data) : {}; + data.root = context; + } + return data; + } + + function executeDecorators(fn, prog, container, depths, data, blockParams) { + if (fn.decorator) { + var props = {}; + prog = fn.decorator(prog, props, container, depths && depths[0], data, blockParams, depths); + Utils.extend(prog, props); + } + return prog; + } + +/***/ }, +/* 19 */ +/***/ function(module, exports) { + + /* WEBPACK VAR INJECTION */(function(global) {/* global window */ + 'use strict'; + + exports.__esModule = true; + + exports['default'] = function (Handlebars) { + /* istanbul ignore next */ + var root = typeof global !== 'undefined' ? global : window, + $Handlebars = root.Handlebars; + /* istanbul ignore next */ + Handlebars.noConflict = function () { + if (root.Handlebars === Handlebars) { + root.Handlebars = $Handlebars; + } + return Handlebars; + }; + }; + + module.exports = exports['default']; + /* WEBPACK VAR INJECTION */}.call(exports, (function() { return this; }()))) + +/***/ } +/******/ ]) +}); +; \ No newline at end of file diff --git a/wwwroot/js/lib/jquery-3.2.1.min.js b/wwwroot/js/lib/jquery-3.2.1.min.js new file mode 100644 index 0000000..644d35e --- /dev/null +++ b/wwwroot/js/lib/jquery-3.2.1.min.js @@ -0,0 +1,4 @@ +/*! jQuery v3.2.1 | (c) JS Foundation and other contributors | jquery.org/license */ +!function(a,b){"use strict";"object"==typeof module&&"object"==typeof module.exports?module.exports=a.document?b(a,!0):function(a){if(!a.document)throw new Error("jQuery requires a window with a document");return b(a)}:b(a)}("undefined"!=typeof window?window:this,function(a,b){"use strict";var c=[],d=a.document,e=Object.getPrototypeOf,f=c.slice,g=c.concat,h=c.push,i=c.indexOf,j={},k=j.toString,l=j.hasOwnProperty,m=l.toString,n=m.call(Object),o={};function p(a,b){b=b||d;var c=b.createElement("script");c.text=a,b.head.appendChild(c).parentNode.removeChild(c)}var q="3.2.1",r=function(a,b){return new r.fn.init(a,b)},s=/^[\s\uFEFF\xA0]+|[\s\uFEFF\xA0]+$/g,t=/^-ms-/,u=/-([a-z])/g,v=function(a,b){return b.toUpperCase()};r.fn=r.prototype={jquery:q,constructor:r,length:0,toArray:function(){return f.call(this)},get:function(a){return null==a?f.call(this):a<0?this[a+this.length]:this[a]},pushStack:function(a){var b=r.merge(this.constructor(),a);return b.prevObject=this,b},each:function(a){return r.each(this,a)},map:function(a){return this.pushStack(r.map(this,function(b,c){return a.call(b,c,b)}))},slice:function(){return this.pushStack(f.apply(this,arguments))},first:function(){return this.eq(0)},last:function(){return this.eq(-1)},eq:function(a){var b=this.length,c=+a+(a<0?b:0);return this.pushStack(c>=0&&c0&&b-1 in a)}var x=function(a){var b,c,d,e,f,g,h,i,j,k,l,m,n,o,p,q,r,s,t,u="sizzle"+1*new Date,v=a.document,w=0,x=0,y=ha(),z=ha(),A=ha(),B=function(a,b){return a===b&&(l=!0),0},C={}.hasOwnProperty,D=[],E=D.pop,F=D.push,G=D.push,H=D.slice,I=function(a,b){for(var c=0,d=a.length;c+~]|"+K+")"+K+"*"),S=new RegExp("="+K+"*([^\\]'\"]*?)"+K+"*\\]","g"),T=new RegExp(N),U=new RegExp("^"+L+"$"),V={ID:new RegExp("^#("+L+")"),CLASS:new RegExp("^\\.("+L+")"),TAG:new RegExp("^("+L+"|[*])"),ATTR:new RegExp("^"+M),PSEUDO:new RegExp("^"+N),CHILD:new RegExp("^:(only|first|last|nth|nth-last)-(child|of-type)(?:\\("+K+"*(even|odd|(([+-]|)(\\d*)n|)"+K+"*(?:([+-]|)"+K+"*(\\d+)|))"+K+"*\\)|)","i"),bool:new RegExp("^(?:"+J+")$","i"),needsContext:new RegExp("^"+K+"*[>+~]|:(even|odd|eq|gt|lt|nth|first|last)(?:\\("+K+"*((?:-\\d)?\\d*)"+K+"*\\)|)(?=[^-]|$)","i")},W=/^(?:input|select|textarea|button)$/i,X=/^h\d$/i,Y=/^[^{]+\{\s*\[native \w/,Z=/^(?:#([\w-]+)|(\w+)|\.([\w-]+))$/,$=/[+~]/,_=new RegExp("\\\\([\\da-f]{1,6}"+K+"?|("+K+")|.)","ig"),aa=function(a,b,c){var d="0x"+b-65536;return d!==d||c?b:d<0?String.fromCharCode(d+65536):String.fromCharCode(d>>10|55296,1023&d|56320)},ba=/([\0-\x1f\x7f]|^-?\d)|^-$|[^\0-\x1f\x7f-\uFFFF\w-]/g,ca=function(a,b){return b?"\0"===a?"\ufffd":a.slice(0,-1)+"\\"+a.charCodeAt(a.length-1).toString(16)+" ":"\\"+a},da=function(){m()},ea=ta(function(a){return a.disabled===!0&&("form"in a||"label"in a)},{dir:"parentNode",next:"legend"});try{G.apply(D=H.call(v.childNodes),v.childNodes),D[v.childNodes.length].nodeType}catch(fa){G={apply:D.length?function(a,b){F.apply(a,H.call(b))}:function(a,b){var c=a.length,d=0;while(a[c++]=b[d++]);a.length=c-1}}}function ga(a,b,d,e){var f,h,j,k,l,o,r,s=b&&b.ownerDocument,w=b?b.nodeType:9;if(d=d||[],"string"!=typeof a||!a||1!==w&&9!==w&&11!==w)return d;if(!e&&((b?b.ownerDocument||b:v)!==n&&m(b),b=b||n,p)){if(11!==w&&(l=Z.exec(a)))if(f=l[1]){if(9===w){if(!(j=b.getElementById(f)))return d;if(j.id===f)return d.push(j),d}else if(s&&(j=s.getElementById(f))&&t(b,j)&&j.id===f)return d.push(j),d}else{if(l[2])return G.apply(d,b.getElementsByTagName(a)),d;if((f=l[3])&&c.getElementsByClassName&&b.getElementsByClassName)return G.apply(d,b.getElementsByClassName(f)),d}if(c.qsa&&!A[a+" "]&&(!q||!q.test(a))){if(1!==w)s=b,r=a;else if("object"!==b.nodeName.toLowerCase()){(k=b.getAttribute("id"))?k=k.replace(ba,ca):b.setAttribute("id",k=u),o=g(a),h=o.length;while(h--)o[h]="#"+k+" "+sa(o[h]);r=o.join(","),s=$.test(a)&&qa(b.parentNode)||b}if(r)try{return G.apply(d,s.querySelectorAll(r)),d}catch(x){}finally{k===u&&b.removeAttribute("id")}}}return i(a.replace(P,"$1"),b,d,e)}function ha(){var a=[];function b(c,e){return a.push(c+" ")>d.cacheLength&&delete b[a.shift()],b[c+" "]=e}return b}function ia(a){return a[u]=!0,a}function ja(a){var b=n.createElement("fieldset");try{return!!a(b)}catch(c){return!1}finally{b.parentNode&&b.parentNode.removeChild(b),b=null}}function ka(a,b){var c=a.split("|"),e=c.length;while(e--)d.attrHandle[c[e]]=b}function la(a,b){var c=b&&a,d=c&&1===a.nodeType&&1===b.nodeType&&a.sourceIndex-b.sourceIndex;if(d)return d;if(c)while(c=c.nextSibling)if(c===b)return-1;return a?1:-1}function ma(a){return function(b){var c=b.nodeName.toLowerCase();return"input"===c&&b.type===a}}function na(a){return function(b){var c=b.nodeName.toLowerCase();return("input"===c||"button"===c)&&b.type===a}}function oa(a){return function(b){return"form"in b?b.parentNode&&b.disabled===!1?"label"in b?"label"in b.parentNode?b.parentNode.disabled===a:b.disabled===a:b.isDisabled===a||b.isDisabled!==!a&&ea(b)===a:b.disabled===a:"label"in b&&b.disabled===a}}function pa(a){return ia(function(b){return b=+b,ia(function(c,d){var e,f=a([],c.length,b),g=f.length;while(g--)c[e=f[g]]&&(c[e]=!(d[e]=c[e]))})})}function qa(a){return a&&"undefined"!=typeof a.getElementsByTagName&&a}c=ga.support={},f=ga.isXML=function(a){var b=a&&(a.ownerDocument||a).documentElement;return!!b&&"HTML"!==b.nodeName},m=ga.setDocument=function(a){var b,e,g=a?a.ownerDocument||a:v;return g!==n&&9===g.nodeType&&g.documentElement?(n=g,o=n.documentElement,p=!f(n),v!==n&&(e=n.defaultView)&&e.top!==e&&(e.addEventListener?e.addEventListener("unload",da,!1):e.attachEvent&&e.attachEvent("onunload",da)),c.attributes=ja(function(a){return a.className="i",!a.getAttribute("className")}),c.getElementsByTagName=ja(function(a){return a.appendChild(n.createComment("")),!a.getElementsByTagName("*").length}),c.getElementsByClassName=Y.test(n.getElementsByClassName),c.getById=ja(function(a){return o.appendChild(a).id=u,!n.getElementsByName||!n.getElementsByName(u).length}),c.getById?(d.filter.ID=function(a){var b=a.replace(_,aa);return function(a){return a.getAttribute("id")===b}},d.find.ID=function(a,b){if("undefined"!=typeof b.getElementById&&p){var c=b.getElementById(a);return c?[c]:[]}}):(d.filter.ID=function(a){var b=a.replace(_,aa);return function(a){var c="undefined"!=typeof a.getAttributeNode&&a.getAttributeNode("id");return c&&c.value===b}},d.find.ID=function(a,b){if("undefined"!=typeof b.getElementById&&p){var c,d,e,f=b.getElementById(a);if(f){if(c=f.getAttributeNode("id"),c&&c.value===a)return[f];e=b.getElementsByName(a),d=0;while(f=e[d++])if(c=f.getAttributeNode("id"),c&&c.value===a)return[f]}return[]}}),d.find.TAG=c.getElementsByTagName?function(a,b){return"undefined"!=typeof b.getElementsByTagName?b.getElementsByTagName(a):c.qsa?b.querySelectorAll(a):void 0}:function(a,b){var c,d=[],e=0,f=b.getElementsByTagName(a);if("*"===a){while(c=f[e++])1===c.nodeType&&d.push(c);return d}return f},d.find.CLASS=c.getElementsByClassName&&function(a,b){if("undefined"!=typeof b.getElementsByClassName&&p)return b.getElementsByClassName(a)},r=[],q=[],(c.qsa=Y.test(n.querySelectorAll))&&(ja(function(a){o.appendChild(a).innerHTML="",a.querySelectorAll("[msallowcapture^='']").length&&q.push("[*^$]="+K+"*(?:''|\"\")"),a.querySelectorAll("[selected]").length||q.push("\\["+K+"*(?:value|"+J+")"),a.querySelectorAll("[id~="+u+"-]").length||q.push("~="),a.querySelectorAll(":checked").length||q.push(":checked"),a.querySelectorAll("a#"+u+"+*").length||q.push(".#.+[+~]")}),ja(function(a){a.innerHTML="";var b=n.createElement("input");b.setAttribute("type","hidden"),a.appendChild(b).setAttribute("name","D"),a.querySelectorAll("[name=d]").length&&q.push("name"+K+"*[*^$|!~]?="),2!==a.querySelectorAll(":enabled").length&&q.push(":enabled",":disabled"),o.appendChild(a).disabled=!0,2!==a.querySelectorAll(":disabled").length&&q.push(":enabled",":disabled"),a.querySelectorAll("*,:x"),q.push(",.*:")})),(c.matchesSelector=Y.test(s=o.matches||o.webkitMatchesSelector||o.mozMatchesSelector||o.oMatchesSelector||o.msMatchesSelector))&&ja(function(a){c.disconnectedMatch=s.call(a,"*"),s.call(a,"[s!='']:x"),r.push("!=",N)}),q=q.length&&new RegExp(q.join("|")),r=r.length&&new RegExp(r.join("|")),b=Y.test(o.compareDocumentPosition),t=b||Y.test(o.contains)?function(a,b){var c=9===a.nodeType?a.documentElement:a,d=b&&b.parentNode;return a===d||!(!d||1!==d.nodeType||!(c.contains?c.contains(d):a.compareDocumentPosition&&16&a.compareDocumentPosition(d)))}:function(a,b){if(b)while(b=b.parentNode)if(b===a)return!0;return!1},B=b?function(a,b){if(a===b)return l=!0,0;var d=!a.compareDocumentPosition-!b.compareDocumentPosition;return d?d:(d=(a.ownerDocument||a)===(b.ownerDocument||b)?a.compareDocumentPosition(b):1,1&d||!c.sortDetached&&b.compareDocumentPosition(a)===d?a===n||a.ownerDocument===v&&t(v,a)?-1:b===n||b.ownerDocument===v&&t(v,b)?1:k?I(k,a)-I(k,b):0:4&d?-1:1)}:function(a,b){if(a===b)return l=!0,0;var c,d=0,e=a.parentNode,f=b.parentNode,g=[a],h=[b];if(!e||!f)return a===n?-1:b===n?1:e?-1:f?1:k?I(k,a)-I(k,b):0;if(e===f)return la(a,b);c=a;while(c=c.parentNode)g.unshift(c);c=b;while(c=c.parentNode)h.unshift(c);while(g[d]===h[d])d++;return d?la(g[d],h[d]):g[d]===v?-1:h[d]===v?1:0},n):n},ga.matches=function(a,b){return ga(a,null,null,b)},ga.matchesSelector=function(a,b){if((a.ownerDocument||a)!==n&&m(a),b=b.replace(S,"='$1']"),c.matchesSelector&&p&&!A[b+" "]&&(!r||!r.test(b))&&(!q||!q.test(b)))try{var d=s.call(a,b);if(d||c.disconnectedMatch||a.document&&11!==a.document.nodeType)return d}catch(e){}return ga(b,n,null,[a]).length>0},ga.contains=function(a,b){return(a.ownerDocument||a)!==n&&m(a),t(a,b)},ga.attr=function(a,b){(a.ownerDocument||a)!==n&&m(a);var e=d.attrHandle[b.toLowerCase()],f=e&&C.call(d.attrHandle,b.toLowerCase())?e(a,b,!p):void 0;return void 0!==f?f:c.attributes||!p?a.getAttribute(b):(f=a.getAttributeNode(b))&&f.specified?f.value:null},ga.escape=function(a){return(a+"").replace(ba,ca)},ga.error=function(a){throw new Error("Syntax error, unrecognized expression: "+a)},ga.uniqueSort=function(a){var b,d=[],e=0,f=0;if(l=!c.detectDuplicates,k=!c.sortStable&&a.slice(0),a.sort(B),l){while(b=a[f++])b===a[f]&&(e=d.push(f));while(e--)a.splice(d[e],1)}return k=null,a},e=ga.getText=function(a){var b,c="",d=0,f=a.nodeType;if(f){if(1===f||9===f||11===f){if("string"==typeof a.textContent)return a.textContent;for(a=a.firstChild;a;a=a.nextSibling)c+=e(a)}else if(3===f||4===f)return a.nodeValue}else while(b=a[d++])c+=e(b);return c},d=ga.selectors={cacheLength:50,createPseudo:ia,match:V,attrHandle:{},find:{},relative:{">":{dir:"parentNode",first:!0}," ":{dir:"parentNode"},"+":{dir:"previousSibling",first:!0},"~":{dir:"previousSibling"}},preFilter:{ATTR:function(a){return a[1]=a[1].replace(_,aa),a[3]=(a[3]||a[4]||a[5]||"").replace(_,aa),"~="===a[2]&&(a[3]=" "+a[3]+" "),a.slice(0,4)},CHILD:function(a){return a[1]=a[1].toLowerCase(),"nth"===a[1].slice(0,3)?(a[3]||ga.error(a[0]),a[4]=+(a[4]?a[5]+(a[6]||1):2*("even"===a[3]||"odd"===a[3])),a[5]=+(a[7]+a[8]||"odd"===a[3])):a[3]&&ga.error(a[0]),a},PSEUDO:function(a){var b,c=!a[6]&&a[2];return V.CHILD.test(a[0])?null:(a[3]?a[2]=a[4]||a[5]||"":c&&T.test(c)&&(b=g(c,!0))&&(b=c.indexOf(")",c.length-b)-c.length)&&(a[0]=a[0].slice(0,b),a[2]=c.slice(0,b)),a.slice(0,3))}},filter:{TAG:function(a){var b=a.replace(_,aa).toLowerCase();return"*"===a?function(){return!0}:function(a){return a.nodeName&&a.nodeName.toLowerCase()===b}},CLASS:function(a){var b=y[a+" "];return b||(b=new RegExp("(^|"+K+")"+a+"("+K+"|$)"))&&y(a,function(a){return b.test("string"==typeof a.className&&a.className||"undefined"!=typeof a.getAttribute&&a.getAttribute("class")||"")})},ATTR:function(a,b,c){return function(d){var e=ga.attr(d,a);return null==e?"!="===b:!b||(e+="","="===b?e===c:"!="===b?e!==c:"^="===b?c&&0===e.indexOf(c):"*="===b?c&&e.indexOf(c)>-1:"$="===b?c&&e.slice(-c.length)===c:"~="===b?(" "+e.replace(O," ")+" ").indexOf(c)>-1:"|="===b&&(e===c||e.slice(0,c.length+1)===c+"-"))}},CHILD:function(a,b,c,d,e){var f="nth"!==a.slice(0,3),g="last"!==a.slice(-4),h="of-type"===b;return 1===d&&0===e?function(a){return!!a.parentNode}:function(b,c,i){var j,k,l,m,n,o,p=f!==g?"nextSibling":"previousSibling",q=b.parentNode,r=h&&b.nodeName.toLowerCase(),s=!i&&!h,t=!1;if(q){if(f){while(p){m=b;while(m=m[p])if(h?m.nodeName.toLowerCase()===r:1===m.nodeType)return!1;o=p="only"===a&&!o&&"nextSibling"}return!0}if(o=[g?q.firstChild:q.lastChild],g&&s){m=q,l=m[u]||(m[u]={}),k=l[m.uniqueID]||(l[m.uniqueID]={}),j=k[a]||[],n=j[0]===w&&j[1],t=n&&j[2],m=n&&q.childNodes[n];while(m=++n&&m&&m[p]||(t=n=0)||o.pop())if(1===m.nodeType&&++t&&m===b){k[a]=[w,n,t];break}}else if(s&&(m=b,l=m[u]||(m[u]={}),k=l[m.uniqueID]||(l[m.uniqueID]={}),j=k[a]||[],n=j[0]===w&&j[1],t=n),t===!1)while(m=++n&&m&&m[p]||(t=n=0)||o.pop())if((h?m.nodeName.toLowerCase()===r:1===m.nodeType)&&++t&&(s&&(l=m[u]||(m[u]={}),k=l[m.uniqueID]||(l[m.uniqueID]={}),k[a]=[w,t]),m===b))break;return t-=e,t===d||t%d===0&&t/d>=0}}},PSEUDO:function(a,b){var c,e=d.pseudos[a]||d.setFilters[a.toLowerCase()]||ga.error("unsupported pseudo: "+a);return e[u]?e(b):e.length>1?(c=[a,a,"",b],d.setFilters.hasOwnProperty(a.toLowerCase())?ia(function(a,c){var d,f=e(a,b),g=f.length;while(g--)d=I(a,f[g]),a[d]=!(c[d]=f[g])}):function(a){return e(a,0,c)}):e}},pseudos:{not:ia(function(a){var b=[],c=[],d=h(a.replace(P,"$1"));return d[u]?ia(function(a,b,c,e){var f,g=d(a,null,e,[]),h=a.length;while(h--)(f=g[h])&&(a[h]=!(b[h]=f))}):function(a,e,f){return b[0]=a,d(b,null,f,c),b[0]=null,!c.pop()}}),has:ia(function(a){return function(b){return ga(a,b).length>0}}),contains:ia(function(a){return a=a.replace(_,aa),function(b){return(b.textContent||b.innerText||e(b)).indexOf(a)>-1}}),lang:ia(function(a){return U.test(a||"")||ga.error("unsupported lang: "+a),a=a.replace(_,aa).toLowerCase(),function(b){var c;do if(c=p?b.lang:b.getAttribute("xml:lang")||b.getAttribute("lang"))return c=c.toLowerCase(),c===a||0===c.indexOf(a+"-");while((b=b.parentNode)&&1===b.nodeType);return!1}}),target:function(b){var c=a.location&&a.location.hash;return c&&c.slice(1)===b.id},root:function(a){return a===o},focus:function(a){return a===n.activeElement&&(!n.hasFocus||n.hasFocus())&&!!(a.type||a.href||~a.tabIndex)},enabled:oa(!1),disabled:oa(!0),checked:function(a){var b=a.nodeName.toLowerCase();return"input"===b&&!!a.checked||"option"===b&&!!a.selected},selected:function(a){return a.parentNode&&a.parentNode.selectedIndex,a.selected===!0},empty:function(a){for(a=a.firstChild;a;a=a.nextSibling)if(a.nodeType<6)return!1;return!0},parent:function(a){return!d.pseudos.empty(a)},header:function(a){return X.test(a.nodeName)},input:function(a){return W.test(a.nodeName)},button:function(a){var b=a.nodeName.toLowerCase();return"input"===b&&"button"===a.type||"button"===b},text:function(a){var b;return"input"===a.nodeName.toLowerCase()&&"text"===a.type&&(null==(b=a.getAttribute("type"))||"text"===b.toLowerCase())},first:pa(function(){return[0]}),last:pa(function(a,b){return[b-1]}),eq:pa(function(a,b,c){return[c<0?c+b:c]}),even:pa(function(a,b){for(var c=0;c=0;)a.push(d);return a}),gt:pa(function(a,b,c){for(var d=c<0?c+b:c;++d1?function(b,c,d){var e=a.length;while(e--)if(!a[e](b,c,d))return!1;return!0}:a[0]}function va(a,b,c){for(var d=0,e=b.length;d-1&&(f[j]=!(g[j]=l))}}else r=wa(r===g?r.splice(o,r.length):r),e?e(null,g,r,i):G.apply(g,r)})}function ya(a){for(var b,c,e,f=a.length,g=d.relative[a[0].type],h=g||d.relative[" "],i=g?1:0,k=ta(function(a){return a===b},h,!0),l=ta(function(a){return I(b,a)>-1},h,!0),m=[function(a,c,d){var e=!g&&(d||c!==j)||((b=c).nodeType?k(a,c,d):l(a,c,d));return b=null,e}];i1&&ua(m),i>1&&sa(a.slice(0,i-1).concat({value:" "===a[i-2].type?"*":""})).replace(P,"$1"),c,i0,e=a.length>0,f=function(f,g,h,i,k){var l,o,q,r=0,s="0",t=f&&[],u=[],v=j,x=f||e&&d.find.TAG("*",k),y=w+=null==v?1:Math.random()||.1,z=x.length;for(k&&(j=g===n||g||k);s!==z&&null!=(l=x[s]);s++){if(e&&l){o=0,g||l.ownerDocument===n||(m(l),h=!p);while(q=a[o++])if(q(l,g||n,h)){i.push(l);break}k&&(w=y)}c&&((l=!q&&l)&&r--,f&&t.push(l))}if(r+=s,c&&s!==r){o=0;while(q=b[o++])q(t,u,g,h);if(f){if(r>0)while(s--)t[s]||u[s]||(u[s]=E.call(i));u=wa(u)}G.apply(i,u),k&&!f&&u.length>0&&r+b.length>1&&ga.uniqueSort(i)}return k&&(w=y,j=v),t};return c?ia(f):f}return h=ga.compile=function(a,b){var c,d=[],e=[],f=A[a+" "];if(!f){b||(b=g(a)),c=b.length;while(c--)f=ya(b[c]),f[u]?d.push(f):e.push(f);f=A(a,za(e,d)),f.selector=a}return f},i=ga.select=function(a,b,c,e){var f,i,j,k,l,m="function"==typeof a&&a,n=!e&&g(a=m.selector||a);if(c=c||[],1===n.length){if(i=n[0]=n[0].slice(0),i.length>2&&"ID"===(j=i[0]).type&&9===b.nodeType&&p&&d.relative[i[1].type]){if(b=(d.find.ID(j.matches[0].replace(_,aa),b)||[])[0],!b)return c;m&&(b=b.parentNode),a=a.slice(i.shift().value.length)}f=V.needsContext.test(a)?0:i.length;while(f--){if(j=i[f],d.relative[k=j.type])break;if((l=d.find[k])&&(e=l(j.matches[0].replace(_,aa),$.test(i[0].type)&&qa(b.parentNode)||b))){if(i.splice(f,1),a=e.length&&sa(i),!a)return G.apply(c,e),c;break}}}return(m||h(a,n))(e,b,!p,c,!b||$.test(a)&&qa(b.parentNode)||b),c},c.sortStable=u.split("").sort(B).join("")===u,c.detectDuplicates=!!l,m(),c.sortDetached=ja(function(a){return 1&a.compareDocumentPosition(n.createElement("fieldset"))}),ja(function(a){return a.innerHTML="","#"===a.firstChild.getAttribute("href")})||ka("type|href|height|width",function(a,b,c){if(!c)return a.getAttribute(b,"type"===b.toLowerCase()?1:2)}),c.attributes&&ja(function(a){return a.innerHTML="",a.firstChild.setAttribute("value",""),""===a.firstChild.getAttribute("value")})||ka("value",function(a,b,c){if(!c&&"input"===a.nodeName.toLowerCase())return a.defaultValue}),ja(function(a){return null==a.getAttribute("disabled")})||ka(J,function(a,b,c){var d;if(!c)return a[b]===!0?b.toLowerCase():(d=a.getAttributeNode(b))&&d.specified?d.value:null}),ga}(a);r.find=x,r.expr=x.selectors,r.expr[":"]=r.expr.pseudos,r.uniqueSort=r.unique=x.uniqueSort,r.text=x.getText,r.isXMLDoc=x.isXML,r.contains=x.contains,r.escapeSelector=x.escape;var y=function(a,b,c){var d=[],e=void 0!==c;while((a=a[b])&&9!==a.nodeType)if(1===a.nodeType){if(e&&r(a).is(c))break;d.push(a)}return d},z=function(a,b){for(var c=[];a;a=a.nextSibling)1===a.nodeType&&a!==b&&c.push(a);return c},A=r.expr.match.needsContext;function B(a,b){return a.nodeName&&a.nodeName.toLowerCase()===b.toLowerCase()}var C=/^<([a-z][^\/\0>:\x20\t\r\n\f]*)[\x20\t\r\n\f]*\/?>(?:<\/\1>|)$/i,D=/^.[^:#\[\.,]*$/;function E(a,b,c){return r.isFunction(b)?r.grep(a,function(a,d){return!!b.call(a,d,a)!==c}):b.nodeType?r.grep(a,function(a){return a===b!==c}):"string"!=typeof b?r.grep(a,function(a){return i.call(b,a)>-1!==c}):D.test(b)?r.filter(b,a,c):(b=r.filter(b,a),r.grep(a,function(a){return i.call(b,a)>-1!==c&&1===a.nodeType}))}r.filter=function(a,b,c){var d=b[0];return c&&(a=":not("+a+")"),1===b.length&&1===d.nodeType?r.find.matchesSelector(d,a)?[d]:[]:r.find.matches(a,r.grep(b,function(a){return 1===a.nodeType}))},r.fn.extend({find:function(a){var b,c,d=this.length,e=this;if("string"!=typeof a)return this.pushStack(r(a).filter(function(){for(b=0;b1?r.uniqueSort(c):c},filter:function(a){return this.pushStack(E(this,a||[],!1))},not:function(a){return this.pushStack(E(this,a||[],!0))},is:function(a){return!!E(this,"string"==typeof a&&A.test(a)?r(a):a||[],!1).length}});var F,G=/^(?:\s*(<[\w\W]+>)[^>]*|#([\w-]+))$/,H=r.fn.init=function(a,b,c){var e,f;if(!a)return this;if(c=c||F,"string"==typeof a){if(e="<"===a[0]&&">"===a[a.length-1]&&a.length>=3?[null,a,null]:G.exec(a),!e||!e[1]&&b)return!b||b.jquery?(b||c).find(a):this.constructor(b).find(a);if(e[1]){if(b=b instanceof r?b[0]:b,r.merge(this,r.parseHTML(e[1],b&&b.nodeType?b.ownerDocument||b:d,!0)),C.test(e[1])&&r.isPlainObject(b))for(e in b)r.isFunction(this[e])?this[e](b[e]):this.attr(e,b[e]);return this}return f=d.getElementById(e[2]),f&&(this[0]=f,this.length=1),this}return a.nodeType?(this[0]=a,this.length=1,this):r.isFunction(a)?void 0!==c.ready?c.ready(a):a(r):r.makeArray(a,this)};H.prototype=r.fn,F=r(d);var I=/^(?:parents|prev(?:Until|All))/,J={children:!0,contents:!0,next:!0,prev:!0};r.fn.extend({has:function(a){var b=r(a,this),c=b.length;return this.filter(function(){for(var a=0;a-1:1===c.nodeType&&r.find.matchesSelector(c,a))){f.push(c);break}return this.pushStack(f.length>1?r.uniqueSort(f):f)},index:function(a){return a?"string"==typeof a?i.call(r(a),this[0]):i.call(this,a.jquery?a[0]:a):this[0]&&this[0].parentNode?this.first().prevAll().length:-1},add:function(a,b){return this.pushStack(r.uniqueSort(r.merge(this.get(),r(a,b))))},addBack:function(a){return this.add(null==a?this.prevObject:this.prevObject.filter(a))}});function K(a,b){while((a=a[b])&&1!==a.nodeType);return a}r.each({parent:function(a){var b=a.parentNode;return b&&11!==b.nodeType?b:null},parents:function(a){return y(a,"parentNode")},parentsUntil:function(a,b,c){return y(a,"parentNode",c)},next:function(a){return K(a,"nextSibling")},prev:function(a){return K(a,"previousSibling")},nextAll:function(a){return y(a,"nextSibling")},prevAll:function(a){return y(a,"previousSibling")},nextUntil:function(a,b,c){return y(a,"nextSibling",c)},prevUntil:function(a,b,c){return y(a,"previousSibling",c)},siblings:function(a){return z((a.parentNode||{}).firstChild,a)},children:function(a){return z(a.firstChild)},contents:function(a){return B(a,"iframe")?a.contentDocument:(B(a,"template")&&(a=a.content||a),r.merge([],a.childNodes))}},function(a,b){r.fn[a]=function(c,d){var e=r.map(this,b,c);return"Until"!==a.slice(-5)&&(d=c),d&&"string"==typeof d&&(e=r.filter(d,e)),this.length>1&&(J[a]||r.uniqueSort(e),I.test(a)&&e.reverse()),this.pushStack(e)}});var L=/[^\x20\t\r\n\f]+/g;function M(a){var b={};return r.each(a.match(L)||[],function(a,c){b[c]=!0}),b}r.Callbacks=function(a){a="string"==typeof a?M(a):r.extend({},a);var b,c,d,e,f=[],g=[],h=-1,i=function(){for(e=e||a.once,d=b=!0;g.length;h=-1){c=g.shift();while(++h-1)f.splice(c,1),c<=h&&h--}),this},has:function(a){return a?r.inArray(a,f)>-1:f.length>0},empty:function(){return f&&(f=[]),this},disable:function(){return e=g=[],f=c="",this},disabled:function(){return!f},lock:function(){return e=g=[],c||b||(f=c=""),this},locked:function(){return!!e},fireWith:function(a,c){return e||(c=c||[],c=[a,c.slice?c.slice():c],g.push(c),b||i()),this},fire:function(){return j.fireWith(this,arguments),this},fired:function(){return!!d}};return j};function N(a){return a}function O(a){throw a}function P(a,b,c,d){var e;try{a&&r.isFunction(e=a.promise)?e.call(a).done(b).fail(c):a&&r.isFunction(e=a.then)?e.call(a,b,c):b.apply(void 0,[a].slice(d))}catch(a){c.apply(void 0,[a])}}r.extend({Deferred:function(b){var c=[["notify","progress",r.Callbacks("memory"),r.Callbacks("memory"),2],["resolve","done",r.Callbacks("once memory"),r.Callbacks("once memory"),0,"resolved"],["reject","fail",r.Callbacks("once memory"),r.Callbacks("once memory"),1,"rejected"]],d="pending",e={state:function(){return d},always:function(){return f.done(arguments).fail(arguments),this},"catch":function(a){return e.then(null,a)},pipe:function(){var a=arguments;return r.Deferred(function(b){r.each(c,function(c,d){var e=r.isFunction(a[d[4]])&&a[d[4]];f[d[1]](function(){var a=e&&e.apply(this,arguments);a&&r.isFunction(a.promise)?a.promise().progress(b.notify).done(b.resolve).fail(b.reject):b[d[0]+"With"](this,e?[a]:arguments)})}),a=null}).promise()},then:function(b,d,e){var f=0;function g(b,c,d,e){return function(){var h=this,i=arguments,j=function(){var a,j;if(!(b=f&&(d!==O&&(h=void 0,i=[a]),c.rejectWith(h,i))}};b?k():(r.Deferred.getStackHook&&(k.stackTrace=r.Deferred.getStackHook()),a.setTimeout(k))}}return r.Deferred(function(a){c[0][3].add(g(0,a,r.isFunction(e)?e:N,a.notifyWith)),c[1][3].add(g(0,a,r.isFunction(b)?b:N)),c[2][3].add(g(0,a,r.isFunction(d)?d:O))}).promise()},promise:function(a){return null!=a?r.extend(a,e):e}},f={};return r.each(c,function(a,b){var g=b[2],h=b[5];e[b[1]]=g.add,h&&g.add(function(){d=h},c[3-a][2].disable,c[0][2].lock),g.add(b[3].fire),f[b[0]]=function(){return f[b[0]+"With"](this===f?void 0:this,arguments),this},f[b[0]+"With"]=g.fireWith}),e.promise(f),b&&b.call(f,f),f},when:function(a){var b=arguments.length,c=b,d=Array(c),e=f.call(arguments),g=r.Deferred(),h=function(a){return function(c){d[a]=this,e[a]=arguments.length>1?f.call(arguments):c,--b||g.resolveWith(d,e)}};if(b<=1&&(P(a,g.done(h(c)).resolve,g.reject,!b),"pending"===g.state()||r.isFunction(e[c]&&e[c].then)))return g.then();while(c--)P(e[c],h(c),g.reject);return g.promise()}});var Q=/^(Eval|Internal|Range|Reference|Syntax|Type|URI)Error$/;r.Deferred.exceptionHook=function(b,c){a.console&&a.console.warn&&b&&Q.test(b.name)&&a.console.warn("jQuery.Deferred exception: "+b.message,b.stack,c)},r.readyException=function(b){a.setTimeout(function(){throw b})};var R=r.Deferred();r.fn.ready=function(a){return R.then(a)["catch"](function(a){r.readyException(a)}),this},r.extend({isReady:!1,readyWait:1,ready:function(a){(a===!0?--r.readyWait:r.isReady)||(r.isReady=!0,a!==!0&&--r.readyWait>0||R.resolveWith(d,[r]))}}),r.ready.then=R.then;function S(){d.removeEventListener("DOMContentLoaded",S), +a.removeEventListener("load",S),r.ready()}"complete"===d.readyState||"loading"!==d.readyState&&!d.documentElement.doScroll?a.setTimeout(r.ready):(d.addEventListener("DOMContentLoaded",S),a.addEventListener("load",S));var T=function(a,b,c,d,e,f,g){var h=0,i=a.length,j=null==c;if("object"===r.type(c)){e=!0;for(h in c)T(a,b,h,c[h],!0,f,g)}else if(void 0!==d&&(e=!0,r.isFunction(d)||(g=!0),j&&(g?(b.call(a,d),b=null):(j=b,b=function(a,b,c){return j.call(r(a),c)})),b))for(;h1,null,!0)},removeData:function(a){return this.each(function(){X.remove(this,a)})}}),r.extend({queue:function(a,b,c){var d;if(a)return b=(b||"fx")+"queue",d=W.get(a,b),c&&(!d||Array.isArray(c)?d=W.access(a,b,r.makeArray(c)):d.push(c)),d||[]},dequeue:function(a,b){b=b||"fx";var c=r.queue(a,b),d=c.length,e=c.shift(),f=r._queueHooks(a,b),g=function(){r.dequeue(a,b)};"inprogress"===e&&(e=c.shift(),d--),e&&("fx"===b&&c.unshift("inprogress"),delete f.stop,e.call(a,g,f)),!d&&f&&f.empty.fire()},_queueHooks:function(a,b){var c=b+"queueHooks";return W.get(a,c)||W.access(a,c,{empty:r.Callbacks("once memory").add(function(){W.remove(a,[b+"queue",c])})})}}),r.fn.extend({queue:function(a,b){var c=2;return"string"!=typeof a&&(b=a,a="fx",c--),arguments.length\x20\t\r\n\f]+)/i,la=/^$|\/(?:java|ecma)script/i,ma={option:[1,""],thead:[1,"","
    "],col:[2,"","
    "],tr:[2,"","
    "],td:[3,"","
    "],_default:[0,"",""]};ma.optgroup=ma.option,ma.tbody=ma.tfoot=ma.colgroup=ma.caption=ma.thead,ma.th=ma.td;function na(a,b){var c;return c="undefined"!=typeof a.getElementsByTagName?a.getElementsByTagName(b||"*"):"undefined"!=typeof a.querySelectorAll?a.querySelectorAll(b||"*"):[],void 0===b||b&&B(a,b)?r.merge([a],c):c}function oa(a,b){for(var c=0,d=a.length;c-1)e&&e.push(f);else if(j=r.contains(f.ownerDocument,f),g=na(l.appendChild(f),"script"),j&&oa(g),c){k=0;while(f=g[k++])la.test(f.type||"")&&c.push(f)}return l}!function(){var a=d.createDocumentFragment(),b=a.appendChild(d.createElement("div")),c=d.createElement("input");c.setAttribute("type","radio"),c.setAttribute("checked","checked"),c.setAttribute("name","t"),b.appendChild(c),o.checkClone=b.cloneNode(!0).cloneNode(!0).lastChild.checked,b.innerHTML="",o.noCloneChecked=!!b.cloneNode(!0).lastChild.defaultValue}();var ra=d.documentElement,sa=/^key/,ta=/^(?:mouse|pointer|contextmenu|drag|drop)|click/,ua=/^([^.]*)(?:\.(.+)|)/;function va(){return!0}function wa(){return!1}function xa(){try{return d.activeElement}catch(a){}}function ya(a,b,c,d,e,f){var g,h;if("object"==typeof b){"string"!=typeof c&&(d=d||c,c=void 0);for(h in b)ya(a,h,c,d,b[h],f);return a}if(null==d&&null==e?(e=c,d=c=void 0):null==e&&("string"==typeof c?(e=d,d=void 0):(e=d,d=c,c=void 0)),e===!1)e=wa;else if(!e)return a;return 1===f&&(g=e,e=function(a){return r().off(a),g.apply(this,arguments)},e.guid=g.guid||(g.guid=r.guid++)),a.each(function(){r.event.add(this,b,e,d,c)})}r.event={global:{},add:function(a,b,c,d,e){var f,g,h,i,j,k,l,m,n,o,p,q=W.get(a);if(q){c.handler&&(f=c,c=f.handler,e=f.selector),e&&r.find.matchesSelector(ra,e),c.guid||(c.guid=r.guid++),(i=q.events)||(i=q.events={}),(g=q.handle)||(g=q.handle=function(b){return"undefined"!=typeof r&&r.event.triggered!==b.type?r.event.dispatch.apply(a,arguments):void 0}),b=(b||"").match(L)||[""],j=b.length;while(j--)h=ua.exec(b[j])||[],n=p=h[1],o=(h[2]||"").split(".").sort(),n&&(l=r.event.special[n]||{},n=(e?l.delegateType:l.bindType)||n,l=r.event.special[n]||{},k=r.extend({type:n,origType:p,data:d,handler:c,guid:c.guid,selector:e,needsContext:e&&r.expr.match.needsContext.test(e),namespace:o.join(".")},f),(m=i[n])||(m=i[n]=[],m.delegateCount=0,l.setup&&l.setup.call(a,d,o,g)!==!1||a.addEventListener&&a.addEventListener(n,g)),l.add&&(l.add.call(a,k),k.handler.guid||(k.handler.guid=c.guid)),e?m.splice(m.delegateCount++,0,k):m.push(k),r.event.global[n]=!0)}},remove:function(a,b,c,d,e){var f,g,h,i,j,k,l,m,n,o,p,q=W.hasData(a)&&W.get(a);if(q&&(i=q.events)){b=(b||"").match(L)||[""],j=b.length;while(j--)if(h=ua.exec(b[j])||[],n=p=h[1],o=(h[2]||"").split(".").sort(),n){l=r.event.special[n]||{},n=(d?l.delegateType:l.bindType)||n,m=i[n]||[],h=h[2]&&new RegExp("(^|\\.)"+o.join("\\.(?:.*\\.|)")+"(\\.|$)"),g=f=m.length;while(f--)k=m[f],!e&&p!==k.origType||c&&c.guid!==k.guid||h&&!h.test(k.namespace)||d&&d!==k.selector&&("**"!==d||!k.selector)||(m.splice(f,1),k.selector&&m.delegateCount--,l.remove&&l.remove.call(a,k));g&&!m.length&&(l.teardown&&l.teardown.call(a,o,q.handle)!==!1||r.removeEvent(a,n,q.handle),delete i[n])}else for(n in i)r.event.remove(a,n+b[j],c,d,!0);r.isEmptyObject(i)&&W.remove(a,"handle events")}},dispatch:function(a){var b=r.event.fix(a),c,d,e,f,g,h,i=new Array(arguments.length),j=(W.get(this,"events")||{})[b.type]||[],k=r.event.special[b.type]||{};for(i[0]=b,c=1;c=1))for(;j!==this;j=j.parentNode||this)if(1===j.nodeType&&("click"!==a.type||j.disabled!==!0)){for(f=[],g={},c=0;c-1:r.find(e,this,null,[j]).length),g[e]&&f.push(d);f.length&&h.push({elem:j,handlers:f})}return j=this,i\x20\t\r\n\f]*)[^>]*)\/>/gi,Aa=/\s*$/g;function Ea(a,b){return B(a,"table")&&B(11!==b.nodeType?b:b.firstChild,"tr")?r(">tbody",a)[0]||a:a}function Fa(a){return a.type=(null!==a.getAttribute("type"))+"/"+a.type,a}function Ga(a){var b=Ca.exec(a.type);return b?a.type=b[1]:a.removeAttribute("type"),a}function Ha(a,b){var c,d,e,f,g,h,i,j;if(1===b.nodeType){if(W.hasData(a)&&(f=W.access(a),g=W.set(b,f),j=f.events)){delete g.handle,g.events={};for(e in j)for(c=0,d=j[e].length;c1&&"string"==typeof q&&!o.checkClone&&Ba.test(q))return a.each(function(e){var f=a.eq(e);s&&(b[0]=q.call(this,e,f.html())),Ja(f,b,c,d)});if(m&&(e=qa(b,a[0].ownerDocument,!1,a,d),f=e.firstChild,1===e.childNodes.length&&(e=f),f||d)){for(h=r.map(na(e,"script"),Fa),i=h.length;l")},clone:function(a,b,c){var d,e,f,g,h=a.cloneNode(!0),i=r.contains(a.ownerDocument,a);if(!(o.noCloneChecked||1!==a.nodeType&&11!==a.nodeType||r.isXMLDoc(a)))for(g=na(h),f=na(a),d=0,e=f.length;d0&&oa(g,!i&&na(a,"script")),h},cleanData:function(a){for(var b,c,d,e=r.event.special,f=0;void 0!==(c=a[f]);f++)if(U(c)){if(b=c[W.expando]){if(b.events)for(d in b.events)e[d]?r.event.remove(c,d):r.removeEvent(c,d,b.handle);c[W.expando]=void 0}c[X.expando]&&(c[X.expando]=void 0)}}}),r.fn.extend({detach:function(a){return Ka(this,a,!0)},remove:function(a){return Ka(this,a)},text:function(a){return T(this,function(a){return void 0===a?r.text(this):this.empty().each(function(){1!==this.nodeType&&11!==this.nodeType&&9!==this.nodeType||(this.textContent=a)})},null,a,arguments.length)},append:function(){return Ja(this,arguments,function(a){if(1===this.nodeType||11===this.nodeType||9===this.nodeType){var b=Ea(this,a);b.appendChild(a)}})},prepend:function(){return Ja(this,arguments,function(a){if(1===this.nodeType||11===this.nodeType||9===this.nodeType){var b=Ea(this,a);b.insertBefore(a,b.firstChild)}})},before:function(){return Ja(this,arguments,function(a){this.parentNode&&this.parentNode.insertBefore(a,this)})},after:function(){return Ja(this,arguments,function(a){this.parentNode&&this.parentNode.insertBefore(a,this.nextSibling)})},empty:function(){for(var a,b=0;null!=(a=this[b]);b++)1===a.nodeType&&(r.cleanData(na(a,!1)),a.textContent="");return this},clone:function(a,b){return a=null!=a&&a,b=null==b?a:b,this.map(function(){return r.clone(this,a,b)})},html:function(a){return T(this,function(a){var b=this[0]||{},c=0,d=this.length;if(void 0===a&&1===b.nodeType)return b.innerHTML;if("string"==typeof a&&!Aa.test(a)&&!ma[(ka.exec(a)||["",""])[1].toLowerCase()]){a=r.htmlPrefilter(a);try{for(;c1)}});function _a(a,b,c,d,e){return new _a.prototype.init(a,b,c,d,e)}r.Tween=_a,_a.prototype={constructor:_a,init:function(a,b,c,d,e,f){this.elem=a,this.prop=c,this.easing=e||r.easing._default,this.options=b,this.start=this.now=this.cur(),this.end=d,this.unit=f||(r.cssNumber[c]?"":"px")},cur:function(){var a=_a.propHooks[this.prop];return a&&a.get?a.get(this):_a.propHooks._default.get(this)},run:function(a){var b,c=_a.propHooks[this.prop];return this.options.duration?this.pos=b=r.easing[this.easing](a,this.options.duration*a,0,1,this.options.duration):this.pos=b=a,this.now=(this.end-this.start)*b+this.start,this.options.step&&this.options.step.call(this.elem,this.now,this),c&&c.set?c.set(this):_a.propHooks._default.set(this),this}},_a.prototype.init.prototype=_a.prototype,_a.propHooks={_default:{get:function(a){var b;return 1!==a.elem.nodeType||null!=a.elem[a.prop]&&null==a.elem.style[a.prop]?a.elem[a.prop]:(b=r.css(a.elem,a.prop,""),b&&"auto"!==b?b:0)},set:function(a){r.fx.step[a.prop]?r.fx.step[a.prop](a):1!==a.elem.nodeType||null==a.elem.style[r.cssProps[a.prop]]&&!r.cssHooks[a.prop]?a.elem[a.prop]=a.now:r.style(a.elem,a.prop,a.now+a.unit)}}},_a.propHooks.scrollTop=_a.propHooks.scrollLeft={set:function(a){a.elem.nodeType&&a.elem.parentNode&&(a.elem[a.prop]=a.now)}},r.easing={linear:function(a){return a},swing:function(a){return.5-Math.cos(a*Math.PI)/2},_default:"swing"},r.fx=_a.prototype.init,r.fx.step={};var ab,bb,cb=/^(?:toggle|show|hide)$/,db=/queueHooks$/;function eb(){bb&&(d.hidden===!1&&a.requestAnimationFrame?a.requestAnimationFrame(eb):a.setTimeout(eb,r.fx.interval),r.fx.tick())}function fb(){return a.setTimeout(function(){ab=void 0}),ab=r.now()}function gb(a,b){var c,d=0,e={height:a};for(b=b?1:0;d<4;d+=2-b)c=ca[d],e["margin"+c]=e["padding"+c]=a;return b&&(e.opacity=e.width=a),e}function hb(a,b,c){for(var d,e=(kb.tweeners[b]||[]).concat(kb.tweeners["*"]),f=0,g=e.length;f1)},removeAttr:function(a){return this.each(function(){r.removeAttr(this,a)})}}),r.extend({attr:function(a,b,c){var d,e,f=a.nodeType;if(3!==f&&8!==f&&2!==f)return"undefined"==typeof a.getAttribute?r.prop(a,b,c):(1===f&&r.isXMLDoc(a)||(e=r.attrHooks[b.toLowerCase()]||(r.expr.match.bool.test(b)?lb:void 0)),void 0!==c?null===c?void r.removeAttr(a,b):e&&"set"in e&&void 0!==(d=e.set(a,c,b))?d:(a.setAttribute(b,c+""),c):e&&"get"in e&&null!==(d=e.get(a,b))?d:(d=r.find.attr(a,b), +null==d?void 0:d))},attrHooks:{type:{set:function(a,b){if(!o.radioValue&&"radio"===b&&B(a,"input")){var c=a.value;return a.setAttribute("type",b),c&&(a.value=c),b}}}},removeAttr:function(a,b){var c,d=0,e=b&&b.match(L);if(e&&1===a.nodeType)while(c=e[d++])a.removeAttribute(c)}}),lb={set:function(a,b,c){return b===!1?r.removeAttr(a,c):a.setAttribute(c,c),c}},r.each(r.expr.match.bool.source.match(/\w+/g),function(a,b){var c=mb[b]||r.find.attr;mb[b]=function(a,b,d){var e,f,g=b.toLowerCase();return d||(f=mb[g],mb[g]=e,e=null!=c(a,b,d)?g:null,mb[g]=f),e}});var nb=/^(?:input|select|textarea|button)$/i,ob=/^(?:a|area)$/i;r.fn.extend({prop:function(a,b){return T(this,r.prop,a,b,arguments.length>1)},removeProp:function(a){return this.each(function(){delete this[r.propFix[a]||a]})}}),r.extend({prop:function(a,b,c){var d,e,f=a.nodeType;if(3!==f&&8!==f&&2!==f)return 1===f&&r.isXMLDoc(a)||(b=r.propFix[b]||b,e=r.propHooks[b]),void 0!==c?e&&"set"in e&&void 0!==(d=e.set(a,c,b))?d:a[b]=c:e&&"get"in e&&null!==(d=e.get(a,b))?d:a[b]},propHooks:{tabIndex:{get:function(a){var b=r.find.attr(a,"tabindex");return b?parseInt(b,10):nb.test(a.nodeName)||ob.test(a.nodeName)&&a.href?0:-1}}},propFix:{"for":"htmlFor","class":"className"}}),o.optSelected||(r.propHooks.selected={get:function(a){var b=a.parentNode;return b&&b.parentNode&&b.parentNode.selectedIndex,null},set:function(a){var b=a.parentNode;b&&(b.selectedIndex,b.parentNode&&b.parentNode.selectedIndex)}}),r.each(["tabIndex","readOnly","maxLength","cellSpacing","cellPadding","rowSpan","colSpan","useMap","frameBorder","contentEditable"],function(){r.propFix[this.toLowerCase()]=this});function pb(a){var b=a.match(L)||[];return b.join(" ")}function qb(a){return a.getAttribute&&a.getAttribute("class")||""}r.fn.extend({addClass:function(a){var b,c,d,e,f,g,h,i=0;if(r.isFunction(a))return this.each(function(b){r(this).addClass(a.call(this,b,qb(this)))});if("string"==typeof a&&a){b=a.match(L)||[];while(c=this[i++])if(e=qb(c),d=1===c.nodeType&&" "+pb(e)+" "){g=0;while(f=b[g++])d.indexOf(" "+f+" ")<0&&(d+=f+" ");h=pb(d),e!==h&&c.setAttribute("class",h)}}return this},removeClass:function(a){var b,c,d,e,f,g,h,i=0;if(r.isFunction(a))return this.each(function(b){r(this).removeClass(a.call(this,b,qb(this)))});if(!arguments.length)return this.attr("class","");if("string"==typeof a&&a){b=a.match(L)||[];while(c=this[i++])if(e=qb(c),d=1===c.nodeType&&" "+pb(e)+" "){g=0;while(f=b[g++])while(d.indexOf(" "+f+" ")>-1)d=d.replace(" "+f+" "," ");h=pb(d),e!==h&&c.setAttribute("class",h)}}return this},toggleClass:function(a,b){var c=typeof a;return"boolean"==typeof b&&"string"===c?b?this.addClass(a):this.removeClass(a):r.isFunction(a)?this.each(function(c){r(this).toggleClass(a.call(this,c,qb(this),b),b)}):this.each(function(){var b,d,e,f;if("string"===c){d=0,e=r(this),f=a.match(L)||[];while(b=f[d++])e.hasClass(b)?e.removeClass(b):e.addClass(b)}else void 0!==a&&"boolean"!==c||(b=qb(this),b&&W.set(this,"__className__",b),this.setAttribute&&this.setAttribute("class",b||a===!1?"":W.get(this,"__className__")||""))})},hasClass:function(a){var b,c,d=0;b=" "+a+" ";while(c=this[d++])if(1===c.nodeType&&(" "+pb(qb(c))+" ").indexOf(b)>-1)return!0;return!1}});var rb=/\r/g;r.fn.extend({val:function(a){var b,c,d,e=this[0];{if(arguments.length)return d=r.isFunction(a),this.each(function(c){var e;1===this.nodeType&&(e=d?a.call(this,c,r(this).val()):a,null==e?e="":"number"==typeof e?e+="":Array.isArray(e)&&(e=r.map(e,function(a){return null==a?"":a+""})),b=r.valHooks[this.type]||r.valHooks[this.nodeName.toLowerCase()],b&&"set"in b&&void 0!==b.set(this,e,"value")||(this.value=e))});if(e)return b=r.valHooks[e.type]||r.valHooks[e.nodeName.toLowerCase()],b&&"get"in b&&void 0!==(c=b.get(e,"value"))?c:(c=e.value,"string"==typeof c?c.replace(rb,""):null==c?"":c)}}}),r.extend({valHooks:{option:{get:function(a){var b=r.find.attr(a,"value");return null!=b?b:pb(r.text(a))}},select:{get:function(a){var b,c,d,e=a.options,f=a.selectedIndex,g="select-one"===a.type,h=g?null:[],i=g?f+1:e.length;for(d=f<0?i:g?f:0;d-1)&&(c=!0);return c||(a.selectedIndex=-1),f}}}}),r.each(["radio","checkbox"],function(){r.valHooks[this]={set:function(a,b){if(Array.isArray(b))return a.checked=r.inArray(r(a).val(),b)>-1}},o.checkOn||(r.valHooks[this].get=function(a){return null===a.getAttribute("value")?"on":a.value})});var sb=/^(?:focusinfocus|focusoutblur)$/;r.extend(r.event,{trigger:function(b,c,e,f){var g,h,i,j,k,m,n,o=[e||d],p=l.call(b,"type")?b.type:b,q=l.call(b,"namespace")?b.namespace.split("."):[];if(h=i=e=e||d,3!==e.nodeType&&8!==e.nodeType&&!sb.test(p+r.event.triggered)&&(p.indexOf(".")>-1&&(q=p.split("."),p=q.shift(),q.sort()),k=p.indexOf(":")<0&&"on"+p,b=b[r.expando]?b:new r.Event(p,"object"==typeof b&&b),b.isTrigger=f?2:3,b.namespace=q.join("."),b.rnamespace=b.namespace?new RegExp("(^|\\.)"+q.join("\\.(?:.*\\.|)")+"(\\.|$)"):null,b.result=void 0,b.target||(b.target=e),c=null==c?[b]:r.makeArray(c,[b]),n=r.event.special[p]||{},f||!n.trigger||n.trigger.apply(e,c)!==!1)){if(!f&&!n.noBubble&&!r.isWindow(e)){for(j=n.delegateType||p,sb.test(j+p)||(h=h.parentNode);h;h=h.parentNode)o.push(h),i=h;i===(e.ownerDocument||d)&&o.push(i.defaultView||i.parentWindow||a)}g=0;while((h=o[g++])&&!b.isPropagationStopped())b.type=g>1?j:n.bindType||p,m=(W.get(h,"events")||{})[b.type]&&W.get(h,"handle"),m&&m.apply(h,c),m=k&&h[k],m&&m.apply&&U(h)&&(b.result=m.apply(h,c),b.result===!1&&b.preventDefault());return b.type=p,f||b.isDefaultPrevented()||n._default&&n._default.apply(o.pop(),c)!==!1||!U(e)||k&&r.isFunction(e[p])&&!r.isWindow(e)&&(i=e[k],i&&(e[k]=null),r.event.triggered=p,e[p](),r.event.triggered=void 0,i&&(e[k]=i)),b.result}},simulate:function(a,b,c){var d=r.extend(new r.Event,c,{type:a,isSimulated:!0});r.event.trigger(d,null,b)}}),r.fn.extend({trigger:function(a,b){return this.each(function(){r.event.trigger(a,b,this)})},triggerHandler:function(a,b){var c=this[0];if(c)return r.event.trigger(a,b,c,!0)}}),r.each("blur focus focusin focusout resize scroll click dblclick mousedown mouseup mousemove mouseover mouseout mouseenter mouseleave change select submit keydown keypress keyup contextmenu".split(" "),function(a,b){r.fn[b]=function(a,c){return arguments.length>0?this.on(b,null,a,c):this.trigger(b)}}),r.fn.extend({hover:function(a,b){return this.mouseenter(a).mouseleave(b||a)}}),o.focusin="onfocusin"in a,o.focusin||r.each({focus:"focusin",blur:"focusout"},function(a,b){var c=function(a){r.event.simulate(b,a.target,r.event.fix(a))};r.event.special[b]={setup:function(){var d=this.ownerDocument||this,e=W.access(d,b);e||d.addEventListener(a,c,!0),W.access(d,b,(e||0)+1)},teardown:function(){var d=this.ownerDocument||this,e=W.access(d,b)-1;e?W.access(d,b,e):(d.removeEventListener(a,c,!0),W.remove(d,b))}}});var tb=a.location,ub=r.now(),vb=/\?/;r.parseXML=function(b){var c;if(!b||"string"!=typeof b)return null;try{c=(new a.DOMParser).parseFromString(b,"text/xml")}catch(d){c=void 0}return c&&!c.getElementsByTagName("parsererror").length||r.error("Invalid XML: "+b),c};var wb=/\[\]$/,xb=/\r?\n/g,yb=/^(?:submit|button|image|reset|file)$/i,zb=/^(?:input|select|textarea|keygen)/i;function Ab(a,b,c,d){var e;if(Array.isArray(b))r.each(b,function(b,e){c||wb.test(a)?d(a,e):Ab(a+"["+("object"==typeof e&&null!=e?b:"")+"]",e,c,d)});else if(c||"object"!==r.type(b))d(a,b);else for(e in b)Ab(a+"["+e+"]",b[e],c,d)}r.param=function(a,b){var c,d=[],e=function(a,b){var c=r.isFunction(b)?b():b;d[d.length]=encodeURIComponent(a)+"="+encodeURIComponent(null==c?"":c)};if(Array.isArray(a)||a.jquery&&!r.isPlainObject(a))r.each(a,function(){e(this.name,this.value)});else for(c in a)Ab(c,a[c],b,e);return d.join("&")},r.fn.extend({serialize:function(){return r.param(this.serializeArray())},serializeArray:function(){return this.map(function(){var a=r.prop(this,"elements");return a?r.makeArray(a):this}).filter(function(){var a=this.type;return this.name&&!r(this).is(":disabled")&&zb.test(this.nodeName)&&!yb.test(a)&&(this.checked||!ja.test(a))}).map(function(a,b){var c=r(this).val();return null==c?null:Array.isArray(c)?r.map(c,function(a){return{name:b.name,value:a.replace(xb,"\r\n")}}):{name:b.name,value:c.replace(xb,"\r\n")}}).get()}});var Bb=/%20/g,Cb=/#.*$/,Db=/([?&])_=[^&]*/,Eb=/^(.*?):[ \t]*([^\r\n]*)$/gm,Fb=/^(?:about|app|app-storage|.+-extension|file|res|widget):$/,Gb=/^(?:GET|HEAD)$/,Hb=/^\/\//,Ib={},Jb={},Kb="*/".concat("*"),Lb=d.createElement("a");Lb.href=tb.href;function Mb(a){return function(b,c){"string"!=typeof b&&(c=b,b="*");var d,e=0,f=b.toLowerCase().match(L)||[];if(r.isFunction(c))while(d=f[e++])"+"===d[0]?(d=d.slice(1)||"*",(a[d]=a[d]||[]).unshift(c)):(a[d]=a[d]||[]).push(c)}}function Nb(a,b,c,d){var e={},f=a===Jb;function g(h){var i;return e[h]=!0,r.each(a[h]||[],function(a,h){var j=h(b,c,d);return"string"!=typeof j||f||e[j]?f?!(i=j):void 0:(b.dataTypes.unshift(j),g(j),!1)}),i}return g(b.dataTypes[0])||!e["*"]&&g("*")}function Ob(a,b){var c,d,e=r.ajaxSettings.flatOptions||{};for(c in b)void 0!==b[c]&&((e[c]?a:d||(d={}))[c]=b[c]);return d&&r.extend(!0,a,d),a}function Pb(a,b,c){var d,e,f,g,h=a.contents,i=a.dataTypes;while("*"===i[0])i.shift(),void 0===d&&(d=a.mimeType||b.getResponseHeader("Content-Type"));if(d)for(e in h)if(h[e]&&h[e].test(d)){i.unshift(e);break}if(i[0]in c)f=i[0];else{for(e in c){if(!i[0]||a.converters[e+" "+i[0]]){f=e;break}g||(g=e)}f=f||g}if(f)return f!==i[0]&&i.unshift(f),c[f]}function Qb(a,b,c,d){var e,f,g,h,i,j={},k=a.dataTypes.slice();if(k[1])for(g in a.converters)j[g.toLowerCase()]=a.converters[g];f=k.shift();while(f)if(a.responseFields[f]&&(c[a.responseFields[f]]=b),!i&&d&&a.dataFilter&&(b=a.dataFilter(b,a.dataType)),i=f,f=k.shift())if("*"===f)f=i;else if("*"!==i&&i!==f){if(g=j[i+" "+f]||j["* "+f],!g)for(e in j)if(h=e.split(" "),h[1]===f&&(g=j[i+" "+h[0]]||j["* "+h[0]])){g===!0?g=j[e]:j[e]!==!0&&(f=h[0],k.unshift(h[1]));break}if(g!==!0)if(g&&a["throws"])b=g(b);else try{b=g(b)}catch(l){return{state:"parsererror",error:g?l:"No conversion from "+i+" to "+f}}}return{state:"success",data:b}}r.extend({active:0,lastModified:{},etag:{},ajaxSettings:{url:tb.href,type:"GET",isLocal:Fb.test(tb.protocol),global:!0,processData:!0,async:!0,contentType:"application/x-www-form-urlencoded; charset=UTF-8",accepts:{"*":Kb,text:"text/plain",html:"text/html",xml:"application/xml, text/xml",json:"application/json, text/javascript"},contents:{xml:/\bxml\b/,html:/\bhtml/,json:/\bjson\b/},responseFields:{xml:"responseXML",text:"responseText",json:"responseJSON"},converters:{"* text":String,"text html":!0,"text json":JSON.parse,"text xml":r.parseXML},flatOptions:{url:!0,context:!0}},ajaxSetup:function(a,b){return b?Ob(Ob(a,r.ajaxSettings),b):Ob(r.ajaxSettings,a)},ajaxPrefilter:Mb(Ib),ajaxTransport:Mb(Jb),ajax:function(b,c){"object"==typeof b&&(c=b,b=void 0),c=c||{};var e,f,g,h,i,j,k,l,m,n,o=r.ajaxSetup({},c),p=o.context||o,q=o.context&&(p.nodeType||p.jquery)?r(p):r.event,s=r.Deferred(),t=r.Callbacks("once memory"),u=o.statusCode||{},v={},w={},x="canceled",y={readyState:0,getResponseHeader:function(a){var b;if(k){if(!h){h={};while(b=Eb.exec(g))h[b[1].toLowerCase()]=b[2]}b=h[a.toLowerCase()]}return null==b?null:b},getAllResponseHeaders:function(){return k?g:null},setRequestHeader:function(a,b){return null==k&&(a=w[a.toLowerCase()]=w[a.toLowerCase()]||a,v[a]=b),this},overrideMimeType:function(a){return null==k&&(o.mimeType=a),this},statusCode:function(a){var b;if(a)if(k)y.always(a[y.status]);else for(b in a)u[b]=[u[b],a[b]];return this},abort:function(a){var b=a||x;return e&&e.abort(b),A(0,b),this}};if(s.promise(y),o.url=((b||o.url||tb.href)+"").replace(Hb,tb.protocol+"//"),o.type=c.method||c.type||o.method||o.type,o.dataTypes=(o.dataType||"*").toLowerCase().match(L)||[""],null==o.crossDomain){j=d.createElement("a");try{j.href=o.url,j.href=j.href,o.crossDomain=Lb.protocol+"//"+Lb.host!=j.protocol+"//"+j.host}catch(z){o.crossDomain=!0}}if(o.data&&o.processData&&"string"!=typeof o.data&&(o.data=r.param(o.data,o.traditional)),Nb(Ib,o,c,y),k)return y;l=r.event&&o.global,l&&0===r.active++&&r.event.trigger("ajaxStart"),o.type=o.type.toUpperCase(),o.hasContent=!Gb.test(o.type),f=o.url.replace(Cb,""),o.hasContent?o.data&&o.processData&&0===(o.contentType||"").indexOf("application/x-www-form-urlencoded")&&(o.data=o.data.replace(Bb,"+")):(n=o.url.slice(f.length),o.data&&(f+=(vb.test(f)?"&":"?")+o.data,delete o.data),o.cache===!1&&(f=f.replace(Db,"$1"),n=(vb.test(f)?"&":"?")+"_="+ub++ +n),o.url=f+n),o.ifModified&&(r.lastModified[f]&&y.setRequestHeader("If-Modified-Since",r.lastModified[f]),r.etag[f]&&y.setRequestHeader("If-None-Match",r.etag[f])),(o.data&&o.hasContent&&o.contentType!==!1||c.contentType)&&y.setRequestHeader("Content-Type",o.contentType),y.setRequestHeader("Accept",o.dataTypes[0]&&o.accepts[o.dataTypes[0]]?o.accepts[o.dataTypes[0]]+("*"!==o.dataTypes[0]?", "+Kb+"; q=0.01":""):o.accepts["*"]);for(m in o.headers)y.setRequestHeader(m,o.headers[m]);if(o.beforeSend&&(o.beforeSend.call(p,y,o)===!1||k))return y.abort();if(x="abort",t.add(o.complete),y.done(o.success),y.fail(o.error),e=Nb(Jb,o,c,y)){if(y.readyState=1,l&&q.trigger("ajaxSend",[y,o]),k)return y;o.async&&o.timeout>0&&(i=a.setTimeout(function(){y.abort("timeout")},o.timeout));try{k=!1,e.send(v,A)}catch(z){if(k)throw z;A(-1,z)}}else A(-1,"No Transport");function A(b,c,d,h){var j,m,n,v,w,x=c;k||(k=!0,i&&a.clearTimeout(i),e=void 0,g=h||"",y.readyState=b>0?4:0,j=b>=200&&b<300||304===b,d&&(v=Pb(o,y,d)),v=Qb(o,v,y,j),j?(o.ifModified&&(w=y.getResponseHeader("Last-Modified"),w&&(r.lastModified[f]=w),w=y.getResponseHeader("etag"),w&&(r.etag[f]=w)),204===b||"HEAD"===o.type?x="nocontent":304===b?x="notmodified":(x=v.state,m=v.data,n=v.error,j=!n)):(n=x,!b&&x||(x="error",b<0&&(b=0))),y.status=b,y.statusText=(c||x)+"",j?s.resolveWith(p,[m,x,y]):s.rejectWith(p,[y,x,n]),y.statusCode(u),u=void 0,l&&q.trigger(j?"ajaxSuccess":"ajaxError",[y,o,j?m:n]),t.fireWith(p,[y,x]),l&&(q.trigger("ajaxComplete",[y,o]),--r.active||r.event.trigger("ajaxStop")))}return y},getJSON:function(a,b,c){return r.get(a,b,c,"json")},getScript:function(a,b){return r.get(a,void 0,b,"script")}}),r.each(["get","post"],function(a,b){r[b]=function(a,c,d,e){return r.isFunction(c)&&(e=e||d,d=c,c=void 0),r.ajax(r.extend({url:a,type:b,dataType:e,data:c,success:d},r.isPlainObject(a)&&a))}}),r._evalUrl=function(a){return r.ajax({url:a,type:"GET",dataType:"script",cache:!0,async:!1,global:!1,"throws":!0})},r.fn.extend({wrapAll:function(a){var b;return this[0]&&(r.isFunction(a)&&(a=a.call(this[0])),b=r(a,this[0].ownerDocument).eq(0).clone(!0),this[0].parentNode&&b.insertBefore(this[0]),b.map(function(){var a=this;while(a.firstElementChild)a=a.firstElementChild;return a}).append(this)),this},wrapInner:function(a){return r.isFunction(a)?this.each(function(b){r(this).wrapInner(a.call(this,b))}):this.each(function(){var b=r(this),c=b.contents();c.length?c.wrapAll(a):b.append(a)})},wrap:function(a){var b=r.isFunction(a);return this.each(function(c){r(this).wrapAll(b?a.call(this,c):a)})},unwrap:function(a){return this.parent(a).not("body").each(function(){r(this).replaceWith(this.childNodes)}),this}}),r.expr.pseudos.hidden=function(a){return!r.expr.pseudos.visible(a)},r.expr.pseudos.visible=function(a){return!!(a.offsetWidth||a.offsetHeight||a.getClientRects().length)},r.ajaxSettings.xhr=function(){try{return new a.XMLHttpRequest}catch(b){}};var Rb={0:200,1223:204},Sb=r.ajaxSettings.xhr();o.cors=!!Sb&&"withCredentials"in Sb,o.ajax=Sb=!!Sb,r.ajaxTransport(function(b){var c,d;if(o.cors||Sb&&!b.crossDomain)return{send:function(e,f){var g,h=b.xhr();if(h.open(b.type,b.url,b.async,b.username,b.password),b.xhrFields)for(g in b.xhrFields)h[g]=b.xhrFields[g];b.mimeType&&h.overrideMimeType&&h.overrideMimeType(b.mimeType),b.crossDomain||e["X-Requested-With"]||(e["X-Requested-With"]="XMLHttpRequest");for(g in e)h.setRequestHeader(g,e[g]);c=function(a){return function(){c&&(c=d=h.onload=h.onerror=h.onabort=h.onreadystatechange=null,"abort"===a?h.abort():"error"===a?"number"!=typeof h.status?f(0,"error"):f(h.status,h.statusText):f(Rb[h.status]||h.status,h.statusText,"text"!==(h.responseType||"text")||"string"!=typeof h.responseText?{binary:h.response}:{text:h.responseText},h.getAllResponseHeaders()))}},h.onload=c(),d=h.onerror=c("error"),void 0!==h.onabort?h.onabort=d:h.onreadystatechange=function(){4===h.readyState&&a.setTimeout(function(){c&&d()})},c=c("abort");try{h.send(b.hasContent&&b.data||null)}catch(i){if(c)throw i}},abort:function(){c&&c()}}}),r.ajaxPrefilter(function(a){a.crossDomain&&(a.contents.script=!1)}),r.ajaxSetup({accepts:{script:"text/javascript, application/javascript, application/ecmascript, application/x-ecmascript"},contents:{script:/\b(?:java|ecma)script\b/},converters:{"text script":function(a){return r.globalEval(a),a}}}),r.ajaxPrefilter("script",function(a){void 0===a.cache&&(a.cache=!1),a.crossDomain&&(a.type="GET")}),r.ajaxTransport("script",function(a){if(a.crossDomain){var b,c;return{send:function(e,f){b=r("