@ -0,0 +1,15 @@ | |||||
@{ | |||||
Page.Title = "The page does not exist"; | |||||
Layout = "~/themes/" + Blog.Theme + "/_Layout.cshtml"; | |||||
Response.StatusCode = 404; | |||||
} | |||||
<article> | |||||
<h1>The page doesn't exist</h1> | |||||
<p>Sorry about that. </p> | |||||
<p> | |||||
<a href="~/">Go to the front page</a> | |||||
</p> | |||||
</article> |
@ -0,0 +1,23 @@ | |||||
<%@ Application Language="C#" %> | |||||
<script RunAt="server"> | |||||
public override string GetVaryByCustomString(HttpContext context, string arg) | |||||
{ | |||||
if (arg == "authenticated") | |||||
{ | |||||
HttpCookie cookie = context.Request.Cookies[FormsAuthentication.FormsCookieName]; | |||||
if (cookie != null) | |||||
return cookie.Value; | |||||
} | |||||
return base.GetVaryByCustomString(context, arg); | |||||
} | |||||
public void Application_BeginRequest(object sender, EventArgs e) | |||||
{ | |||||
Context.Items["IIS_WasUrlRewritten"] = "false"; | |||||
} | |||||
</script> |
@ -0,0 +1,59 @@ | |||||
@using System.Web.Caching; | |||||
@{ | |||||
Page.Title = Blog.Title; | |||||
Layout = "~/themes/" + Blog.Theme + "/_Layout.cshtml"; | |||||
DateTime lastModified = DateTime.MinValue; | |||||
if (string.IsNullOrEmpty(Blog.CurrentSlug)) | |||||
{ | |||||
Page.ShowPaging = true; | |||||
var posts = Blog.GetPosts(Blog.PostsPerPage); | |||||
foreach (var post in posts) | |||||
{ | |||||
@RenderPage("~/themes/" + Blog.Theme + "/Post.cshtml", post); | |||||
} | |||||
if (posts.Any()) | |||||
{ | |||||
lastModified = posts.Max(p => p.LastModified); | |||||
} | |||||
Response.AddCacheItemDependency("posts"); | |||||
Response.Cache.VaryByParams["page"] = true; | |||||
Response.Cache.VaryByParams["category"] = true; | |||||
} | |||||
else | |||||
{ | |||||
Post post = Blog.IsNewPost ? new Post() : Blog.CurrentPost; | |||||
if (Blog.IsNewPost && !User.Identity.IsAuthenticated) | |||||
{ | |||||
FormsAuthentication.RedirectToLoginPage(); | |||||
} | |||||
if (post == null) { throw new HttpException(404, "Post not found"); } | |||||
Page.Title = post.Title; | |||||
lastModified = post.LastModified; | |||||
Response.AddCacheDependency(new CacheDependency(Server.MapPath("~/posts/" + post.ID + ".xml"))); | |||||
@RenderPage("~/themes/" + Blog.Theme + "/Post.cshtml", post) | |||||
} | |||||
if (!Request.IsLocal) | |||||
{ | |||||
Response.Cache.AppendCacheExtension("max-age=0"); | |||||
Response.Cache.SetValidUntilExpires(true); | |||||
Response.Cache.SetCacheability(HttpCacheability.ServerAndPrivate); | |||||
Response.Cache.SetVaryByCustom("authenticated"); | |||||
Response.Cache.VaryByParams["slug"] = true; | |||||
Response.AddCacheDependency(new CacheDependency(Server.MapPath("~/"))); | |||||
Response.AddCacheDependency(new CacheDependency(Server.MapPath("~/scripts"))); | |||||
Response.AddCacheDependency(new CacheDependency(Server.MapPath("~/css"))); | |||||
Response.AddCacheDependency(new CacheDependency(Server.MapPath("~/themes/" + Blog.Theme))); | |||||
Blog.SetConditionalGetHeaders(lastModified, Context); | |||||
} | |||||
} |
@ -0,0 +1,121 @@ | |||||
<?xml version="1.0"?> | |||||
<configuration> | |||||
<appSettings> | |||||
<add key="blog:theme" value="Sevomin"/> | |||||
<add key="blog:name" value="اخبار سومین"/> | |||||
<add key="blog:description" value="آخرین اخبار توسعه وب سایت سومین"/> | |||||
<add key="blog:image" value="http://www.sevom.in/content/images/logo.png"/> | |||||
<add key="blog:postsPerPage" value="12"/> | |||||
<add key="blog:daysToComment" value="20"/> | |||||
<add key="blog:moderateComments" value="true"/> | |||||
<add key="blog:email" value="[email protected]"/> | |||||
<add key="PreserveLoginUrl" value="true"/> | |||||
<add key="webpages:Enabled" value="true"/> | |||||
<add key="webpages:Version" value="3.0.0.0"/> | |||||
</appSettings> | |||||
<system.web> | |||||
<compilation debug="true" targetFramework="4.5"/> | |||||
<httpRuntime targetFramework="4.5" enableVersionHeader="false" requestValidationMode="2.0"/> | |||||
<pages validateRequest="false"/> | |||||
<customErrors mode="RemoteOnly" defaultRedirect="~/"> | |||||
<error statusCode="404" redirect="~/404/"/> | |||||
</customErrors> | |||||
<authentication mode="Forms"> | |||||
<forms defaultUrl="~/" loginUrl="~/views/login.cshtml" name="miniblog" timeout="10080"> | |||||
<credentials passwordFormat="SHA1"> | |||||
<!-- Password is "demo". Generate your hash password here http://www.stringfunction.com/sha1-hash.html --> | |||||
<user name="sevomin" password="b7986da6e43a61189f546cc51a0b37dcad99e079"/> | |||||
</credentials> | |||||
</forms> | |||||
</authentication> | |||||
<machineKey decryption="AES" validation="SHA1" decryptionKey="435D9CC99471D1E7C70FFEBA5EC71F28048BF9016605B82CC69B091FD317B294" validationKey="25C5D98CE093E77C2F886A6D8C6DA8FBC77CD764A1BF49E5D30CD123C5E19553"/> | |||||
</system.web> | |||||
<system.net> | |||||
<mailSettings> | |||||
<smtp> | |||||
<network host="ml01.anaxanet.com" port="25" enableSsl="false"/> | |||||
</smtp> | |||||
</mailSettings> | |||||
</system.net> | |||||
<system.webServer> | |||||
<urlCompression doDynamicCompression="true" doStaticCompression="true"/> | |||||
<handlers> | |||||
<add name="CommentHandler" verb="*" type="CommentHandler" path="/comment.ashx"/> | |||||
<add name="PostHandler" verb="POST" type="PostHandler" path="/post.ashx"/> | |||||
<add name="MetaWebLogHandler" verb="POST,GET" type="MetaWeblogHandler" path="/metaweblog"/> | |||||
<add name="FeedHandler" verb="GET" type="FeedHandler" path="/feed/*"/> | |||||
<add name="CssHandler" verb="GET" type="MinifyHandler" path="*.css"/> | |||||
<add name="JsHandler" verb="GET" type="MinifyHandler" path="*.js"/> | |||||
</handlers> | |||||
<httpErrors> | |||||
<remove statusCode="404"/> | |||||
<error statusCode="404" responseMode="ExecuteURL" path="/404.cshtml"/> | |||||
</httpErrors> | |||||
<staticContent> | |||||
<clientCache cacheControlMode="UseMaxAge" cacheControlMaxAge="365:00:00"/> | |||||
</staticContent> | |||||
<security> | |||||
<requestFiltering allowDoubleEscaping="true"> | |||||
<fileExtensions> | |||||
<remove fileExtension=".cshtml"/> | |||||
<add fileExtension=".cshtml" allowed="true"/> | |||||
</fileExtensions> | |||||
</requestFiltering> | |||||
</security> | |||||
<defaultDocument> | |||||
<files> | |||||
<remove value="index.cshtml"/> | |||||
<add value="index.cshtml"/> | |||||
</files> | |||||
</defaultDocument> | |||||
<rewrite> | |||||
<rules> | |||||
<rule name="Remove WWW" patternSyntax="Wildcard" stopProcessing="true"> | |||||
<match url="*"/> | |||||
<conditions> | |||||
<add input="{CACHE_URL}" pattern="*://www.*"/> | |||||
</conditions> | |||||
<action type="Redirect" url="{C:1}://{C:2}" redirectType="Permanent"/> | |||||
</rule> | |||||
<rule name="BlogEngine slug" stopProcessing="true"> | |||||
<match url="^post/(.*)\.aspx" ignoreCase="true"/> | |||||
<action type="Redirect" redirectType="Permanent" url="/post/{R:1}"/> | |||||
</rule> | |||||
<rule name="slug" stopProcessing="true"> | |||||
<match url="^post/(.*)" ignoreCase="true"/> | |||||
<action type="Rewrite" url="/?slug={R:1}"/> | |||||
</rule> | |||||
<rule name="paging" stopProcessing="true"> | |||||
<match url="^(page/)([\d]{0,})" ignoreCase="true"/> | |||||
<action type="Rewrite" url="/?page={R:2}"/> | |||||
</rule> | |||||
<rule name="category" stopProcessing="true"> | |||||
<match url="^category/([^/]+)(/page/)?([\d]+)?" ignoreCase="true"/> | |||||
<action type="Rewrite" url="/?category={R:1}&page={R:3}"/> | |||||
</rule> | |||||
<rule name="robots.txt" stopProcessing="true"> | |||||
<match url="robots.txt"/> | |||||
<action type="Rewrite" url="views/robots/robots.cshtml"/> | |||||
</rule> | |||||
<rule name="sitemap" stopProcessing="true"> | |||||
<match url="sitemap.xml"/> | |||||
<action type="Rewrite" url="views/robots/sitemap.cshtml"/> | |||||
</rule> | |||||
<rule name="fingerprint" stopProcessing="true"> | |||||
<match url="(.*)(v-[0-9]+/)([\S]+)"/> | |||||
<action type="Rewrite" url="{R:1}/{R:3}"/> | |||||
</rule> | |||||
</rules> | |||||
<outboundRules> | |||||
<rule name="Remove ETag"> | |||||
<match serverVariable="RESPONSE_ETag" pattern=".+"/> | |||||
<action type="Rewrite" value=""/> | |||||
</rule> | |||||
<rule name="Send correct Vary"> | |||||
<match serverVariable="RESPONSE_Vary" pattern=".+"/> | |||||
<action type="Rewrite" value="Accept-Encoding, If-Modified-Since"/> | |||||
</rule> | |||||
</outboundRules> | |||||
</rewrite> | |||||
</system.webServer> | |||||
</configuration> |
@ -0,0 +1,212 @@ | |||||
using System; | |||||
using System.Collections.Generic; | |||||
using System.Configuration; | |||||
using System.IO; | |||||
using System.Linq; | |||||
using System.Web; | |||||
using System.Web.Caching; | |||||
using System.Web.Hosting; | |||||
public static class Blog | |||||
{ | |||||
static Blog() | |||||
{ | |||||
Theme = ConfigurationManager.AppSettings.Get("blog:theme"); | |||||
Title = ConfigurationManager.AppSettings.Get("blog:name"); | |||||
Description = ConfigurationManager.AppSettings.Get("blog:description"); | |||||
PostsPerPage = int.Parse(ConfigurationManager.AppSettings.Get("blog:postsPerPage")); | |||||
DaysToComment = int.Parse(ConfigurationManager.AppSettings.Get("blog:daysToComment")); | |||||
Image = ConfigurationManager.AppSettings.Get("blog:image"); | |||||
ModerateComments = bool.Parse(ConfigurationManager.AppSettings.Get("blog:moderateComments")); | |||||
} | |||||
public static string Title { get; private set; } | |||||
public static string Description { get; private set; } | |||||
public static string Theme { get; private set; } | |||||
public static string Image { get; private set; } | |||||
public static int PostsPerPage { get; private set; } | |||||
public static int DaysToComment { get; private set; } | |||||
public static bool ModerateComments { get; private set; } | |||||
public static int UniqueId | |||||
{ | |||||
get { return FingerPrint("/web.config").GetHashCode(); } | |||||
} | |||||
public static string CurrentSlug | |||||
{ | |||||
get { return (HttpContext.Current.Request.QueryString["slug"] ?? string.Empty).Trim().ToLowerInvariant(); } | |||||
} | |||||
public static string CurrentCategory | |||||
{ | |||||
get { return (HttpContext.Current.Request.QueryString["category"] ?? string.Empty).Trim().ToLowerInvariant(); } | |||||
} | |||||
public static bool IsNewPost | |||||
{ | |||||
get { return HttpContext.Current.Request.RawUrl.Trim('/') == "post/new"; } | |||||
} | |||||
public static Post CurrentPost | |||||
{ | |||||
get | |||||
{ | |||||
if (HttpContext.Current.Items["currentpost"] == null && !string.IsNullOrEmpty(CurrentSlug)) | |||||
{ | |||||
var post = Storage.GetAllPosts().FirstOrDefault(p => p.Slug == CurrentSlug); | |||||
if (post != null && (post.IsPublished || HttpContext.Current.User.Identity.IsAuthenticated)) | |||||
HttpContext.Current.Items["currentpost"] = Storage.GetAllPosts().FirstOrDefault(p => p.Slug == CurrentSlug); | |||||
} | |||||
return HttpContext.Current.Items["currentpost"] as Post; | |||||
} | |||||
} | |||||
public static string GetNextPage() | |||||
{ | |||||
if (!string.IsNullOrEmpty(CurrentSlug)) | |||||
{ | |||||
var current = Storage.GetAllPosts().IndexOf(CurrentPost); | |||||
if (current > 0) | |||||
return Storage.GetAllPosts()[current - 1].Url.ToString(); | |||||
} | |||||
else if (CurrentPage > 1) | |||||
{ | |||||
return GetPagingUrl(-1); | |||||
} | |||||
return null; | |||||
} | |||||
public static string GetPrevPage() | |||||
{ | |||||
if (!string.IsNullOrEmpty(CurrentSlug)) | |||||
{ | |||||
var current = Storage.GetAllPosts().IndexOf(CurrentPost); | |||||
if (current > -1) | |||||
return Storage.GetAllPosts()[current + 1].Url.ToString(); | |||||
} | |||||
else | |||||
{ | |||||
return GetPagingUrl(1); | |||||
} | |||||
return null; | |||||
} | |||||
public static int CurrentPage | |||||
{ | |||||
get | |||||
{ | |||||
int page = 0; | |||||
if (int.TryParse(HttpContext.Current.Request.QueryString["page"], out page)) | |||||
return page; | |||||
return 1; | |||||
} | |||||
} | |||||
public static IEnumerable<Post> GetPosts(int postsPerPage = 0) | |||||
{ | |||||
var posts = from p in Storage.GetAllPosts() | |||||
where (p.IsPublished && p.PubDate <= DateTime.UtcNow) || HttpContext.Current.User.Identity.IsAuthenticated | |||||
select p; | |||||
string category = HttpContext.Current.Request.QueryString["category"]; | |||||
if (!string.IsNullOrEmpty(category)) | |||||
{ | |||||
posts = posts.Where(p => p.Categories.Any(c => string.Equals(c, category, StringComparison.OrdinalIgnoreCase))); | |||||
} | |||||
if (postsPerPage > 0) | |||||
{ | |||||
posts = posts.Skip(postsPerPage * (CurrentPage - 1)).Take(postsPerPage); | |||||
} | |||||
return posts; | |||||
} | |||||
public static bool MatchesUniqueId(HttpContext context) | |||||
{ | |||||
int token; | |||||
return int.TryParse(context.Request.Form["token"], out token) && token == Blog.UniqueId; | |||||
} | |||||
public static string SaveFileToDisk(byte[] bytes, string extension) | |||||
{ | |||||
string relative = "~/posts/files/" + Guid.NewGuid() + "." + extension.Trim('.'); | |||||
string file = HostingEnvironment.MapPath(relative); | |||||
File.WriteAllBytes(file, bytes); | |||||
var cruncher = new ImageCruncher.Cruncher(); | |||||
cruncher.CrunchImages(file); | |||||
return VirtualPathUtility.ToAbsolute(relative); | |||||
} | |||||
public static string GetPagingUrl(int move) | |||||
{ | |||||
string url = "/page/{0}/"; | |||||
string category = HttpContext.Current.Request.QueryString["category"]; | |||||
if (!string.IsNullOrEmpty(category)) | |||||
{ | |||||
url = "/category/" + HttpUtility.UrlEncode(category.ToLowerInvariant()) + "/" + url; | |||||
} | |||||
string relative = string.Format("~" + url, Blog.CurrentPage + move); | |||||
return VirtualPathUtility.ToAbsolute(relative); | |||||
} | |||||
public static string FingerPrint(string rootRelativePath, string cdnPath = "") | |||||
{ | |||||
if (!string.IsNullOrEmpty(cdnPath) && !HttpContext.Current.IsDebuggingEnabled) | |||||
{ | |||||
return cdnPath; | |||||
} | |||||
if (HttpRuntime.Cache[rootRelativePath] == null) | |||||
{ | |||||
string relative = VirtualPathUtility.ToAbsolute("~" + rootRelativePath); | |||||
string absolute = HostingEnvironment.MapPath(relative); | |||||
if (!File.Exists(absolute)) | |||||
{ | |||||
throw new FileNotFoundException("File not found", absolute); | |||||
} | |||||
DateTime date = File.GetLastWriteTime(absolute); | |||||
int index = relative.LastIndexOf('/'); | |||||
string result = relative.Insert(index, "/v-" + date.Ticks); | |||||
HttpRuntime.Cache.Insert(rootRelativePath, result, new CacheDependency(absolute)); | |||||
} | |||||
return HttpRuntime.Cache[rootRelativePath] as string; | |||||
} | |||||
public static void SetConditionalGetHeaders(DateTime lastModified, HttpContextBase context) | |||||
{ | |||||
HttpResponseBase response = context.Response; | |||||
HttpRequestBase request = context.Request; | |||||
lastModified = new DateTime(lastModified.Year, lastModified.Month, lastModified.Day, lastModified.Hour, lastModified.Minute, lastModified.Second); | |||||
string incomingDate = request.Headers["If-Modified-Since"]; | |||||
response.Cache.SetLastModified(lastModified); | |||||
DateTime testDate = DateTime.MinValue; | |||||
if (DateTime.TryParse(incomingDate, out testDate) && testDate == lastModified) | |||||
{ | |||||
response.ClearContent(); | |||||
response.StatusCode = (int)System.Net.HttpStatusCode.NotModified; | |||||
response.SuppressContent = true; | |||||
} | |||||
} | |||||
} |
@ -0,0 +1,118 @@ | |||||
using System; | |||||
using System.Globalization; | |||||
using System.Text.RegularExpressions; | |||||
using System.Web.Security; | |||||
public class Comment | |||||
{ | |||||
private static readonly Regex _linkRegex = new Regex("((http://|https://|www\\.)([A-Z0-9.\\-]{1,})\\.[0-9A-Z?;~&%\\(\\)#,=\\-_\\./\\+]{2,}[0-9A-Z?~&%#=\\-_/\\+])", RegexOptions.Compiled | RegexOptions.IgnoreCase); | |||||
private const string Link = "<a href=\"{0}{1}\" rel=\"nofollow\">{2}</a>"; | |||||
public Comment() | |||||
{ | |||||
ID = Guid.NewGuid().ToString(); | |||||
PubDate = DateTime.UtcNow; | |||||
} | |||||
public string ID { get; set; } | |||||
public string Author { get; set; } | |||||
public string Email { get; set; } | |||||
public string Website { get; set; } | |||||
public string Content { get; set; } | |||||
public DateTime PubDate { get; set; } | |||||
public string Ip { get; set; } | |||||
public string UserAgent { get; set; } | |||||
public bool IsAdmin { get; set; } | |||||
public bool IsApproved { get; set; } | |||||
public string GravatarUrl(int size) | |||||
{ | |||||
var hash = FormsAuthentication.HashPasswordForStoringInConfigFile(Email.ToLowerInvariant(), "MD5").ToLower(); | |||||
return string.Format("http://gravatar.com/avatar/{0}?s={1}&d=mm", hash, size); | |||||
} | |||||
public string ContentWithLinks() | |||||
{ | |||||
return _linkRegex.Replace(Content, new MatchEvaluator(Evaluator)); | |||||
} | |||||
private static string Evaluator(Match match) | |||||
{ | |||||
var info = CultureInfo.InvariantCulture; | |||||
return string.Format(info, Link, !match.Value.Contains("://") ? "http://" : string.Empty, match.Value, ShortenUrl(match.Value, 50)); | |||||
} | |||||
private static string ShortenUrl(string url, int max) | |||||
{ | |||||
if (url.Length <= max) | |||||
{ | |||||
return url; | |||||
} | |||||
// Remove the protocal | |||||
var startIndex = url.IndexOf("://"); | |||||
if (startIndex > -1) | |||||
{ | |||||
url = url.Substring(startIndex + 3); | |||||
} | |||||
if (url.Length <= max) | |||||
{ | |||||
return url; | |||||
} | |||||
// Compress folder structure | |||||
var firstIndex = url.IndexOf("/") + 1; | |||||
var lastIndex = url.LastIndexOf("/"); | |||||
if (firstIndex < lastIndex) | |||||
{ | |||||
url = url.Remove(firstIndex, lastIndex - firstIndex); | |||||
url = url.Insert(firstIndex, "..."); | |||||
} | |||||
if (url.Length <= max) | |||||
{ | |||||
return url; | |||||
} | |||||
// Remove URL parameters | |||||
var queryIndex = url.IndexOf("?"); | |||||
if (queryIndex > -1) | |||||
{ | |||||
url = url.Substring(0, queryIndex); | |||||
} | |||||
if (url.Length <= max) | |||||
{ | |||||
return url; | |||||
} | |||||
// Remove URL fragment | |||||
var fragmentIndex = url.IndexOf("#"); | |||||
if (fragmentIndex > -1) | |||||
{ | |||||
url = url.Substring(0, fragmentIndex); | |||||
} | |||||
if (url.Length <= max) | |||||
{ | |||||
return url; | |||||
} | |||||
// Compress page | |||||
firstIndex = url.LastIndexOf("/") + 1; | |||||
lastIndex = url.LastIndexOf("."); | |||||
if (lastIndex - firstIndex > 10) | |||||
{ | |||||
var page = url.Substring(firstIndex, lastIndex - firstIndex); | |||||
var length = url.Length - max + 3; | |||||
if (page.Length > length) | |||||
{ | |||||
url = url.Replace(page, string.Format("...{0}", page.Substring(length))); | |||||
} | |||||
} | |||||
return url; | |||||
} | |||||
} |
@ -0,0 +1,76 @@ | |||||
using CookComputing.XmlRpc; | |||||
using System; | |||||
using System.Linq; | |||||
using System.Collections.Generic; | |||||
using System.Web; | |||||
[XmlRpcMissingMapping(MappingAction.Ignore)] | |||||
public class Post | |||||
{ | |||||
public Post() | |||||
{ | |||||
ID = Guid.NewGuid().ToString(); | |||||
Title = "My new post"; | |||||
Author = HttpContext.Current.User.Identity.Name; | |||||
Content = "the content"; | |||||
PubDate = DateTime.UtcNow; | |||||
LastModified = DateTime.UtcNow; | |||||
Categories = new string[0]; | |||||
Comments = new List<Comment>(); | |||||
IsPublished = true; | |||||
} | |||||
[XmlRpcMember("postid")] | |||||
public string ID { get; set; } | |||||
[XmlRpcMember("title")] | |||||
public string Title { get; set; } | |||||
[XmlRpcMember("author")] | |||||
public string Author { get; set; } | |||||
[XmlRpcMember("wp_slug")] | |||||
public string Slug { get; set; } | |||||
[XmlRpcMember("description")] | |||||
public string Content { get; set; } | |||||
[XmlRpcMember("dateCreated")] | |||||
public DateTime PubDate { get; set; } | |||||
[XmlRpcMember("dateModified")] | |||||
public DateTime LastModified { get; set; } | |||||
public bool IsPublished { get; set; } | |||||
[XmlRpcMember("categories")] | |||||
public string[] Categories { get; set; } | |||||
public List<Comment> Comments { get; private set; } | |||||
public Uri AbsoluteUrl | |||||
{ | |||||
get | |||||
{ | |||||
Uri requestUrl = HttpContext.Current.Request.Url; | |||||
return new Uri(requestUrl.Scheme + "://" + requestUrl.Authority + Url, UriKind.Absolute); | |||||
} | |||||
} | |||||
public Uri Url | |||||
{ | |||||
get | |||||
{ | |||||
return new Uri(VirtualPathUtility.ToAbsolute("~/post/" + Slug), UriKind.Relative); | |||||
} | |||||
} | |||||
public bool AreCommentsOpen(HttpContextBase context) | |||||
{ | |||||
return PubDate > DateTime.UtcNow.AddDays(-Blog.DaysToComment) || context.User.Identity.IsAuthenticated; | |||||
} | |||||
public int CountApprovedComments(HttpContextBase context) | |||||
{ | |||||
return (Blog.ModerateComments && !context.User.Identity.IsAuthenticated) ? this.Comments.Count(c => c.IsApproved) : this.Comments.Count; | |||||
} | |||||
} |
@ -0,0 +1,178 @@ | |||||
using System; | |||||
using System.Collections.Generic; | |||||
using System.IO; | |||||
using System.Web; | |||||
using System.Web.Hosting; | |||||
using System.Xml.Linq; | |||||
using System.Xml.XPath; | |||||
public static class Storage | |||||
{ | |||||
private static string _folder = HostingEnvironment.MapPath("~/posts/"); | |||||
public static List<Post> GetAllPosts() | |||||
{ | |||||
if (HttpRuntime.Cache["posts"] == null) | |||||
LoadPosts(); | |||||
if (HttpRuntime.Cache["posts"] != null) | |||||
{ | |||||
return (List<Post>)HttpRuntime.Cache["posts"]; | |||||
} | |||||
return new List<Post>(); | |||||
} | |||||
public static void Save(Post post) | |||||
{ | |||||
string file = Path.Combine(_folder, post.ID + ".xml"); | |||||
post.LastModified = DateTime.UtcNow; | |||||
XDocument doc = new XDocument( | |||||
new XElement("post", | |||||
new XElement("title", post.Title), | |||||
new XElement("slug", post.Slug), | |||||
new XElement("author", post.Author), | |||||
new XElement("pubDate", post.PubDate.ToString("yyyy-MM-dd HH:mm:ss")), | |||||
new XElement("lastModified", post.LastModified.ToString("yyyy-MM-dd HH:mm:ss")), | |||||
new XElement("content", post.Content), | |||||
new XElement("ispublished", post.IsPublished), | |||||
new XElement("categories", string.Empty), | |||||
new XElement("comments", string.Empty) | |||||
)); | |||||
XElement categories = doc.XPathSelectElement("post/categories"); | |||||
foreach (string category in post.Categories) | |||||
{ | |||||
categories.Add(new XElement("category", category)); | |||||
} | |||||
XElement comments = doc.XPathSelectElement("post/comments"); | |||||
foreach (Comment comment in post.Comments) | |||||
{ | |||||
comments.Add( | |||||
new XElement("comment", | |||||
new XElement("author", comment.Author), | |||||
new XElement("email", comment.Email), | |||||
new XElement("website", comment.Website), | |||||
new XElement("ip", comment.Ip), | |||||
new XElement("userAgent", comment.UserAgent), | |||||
new XElement("date", comment.PubDate.ToString("yyyy-MM-dd HH:m:ss")), | |||||
new XElement("content", comment.Content), | |||||
new XAttribute("isAdmin", comment.IsAdmin), | |||||
new XAttribute("isApproved", comment.IsApproved), | |||||
new XAttribute("id", comment.ID) | |||||
)); | |||||
} | |||||
if (!File.Exists(file)) // New post | |||||
{ | |||||
var posts = GetAllPosts(); | |||||
posts.Insert(0, post); | |||||
posts.Sort((p1, p2) => p2.PubDate.CompareTo(p1.PubDate)); | |||||
HttpRuntime.Cache.Insert("posts", posts); | |||||
} | |||||
doc.Save(file); | |||||
} | |||||
public static void Delete(Post post) | |||||
{ | |||||
var posts = GetAllPosts(); | |||||
string file = Path.Combine(_folder, post.ID + ".xml"); | |||||
File.Delete(file); | |||||
posts.Remove(post); | |||||
} | |||||
private static void LoadPosts() | |||||
{ | |||||
if (!Directory.Exists(_folder)) | |||||
Directory.CreateDirectory(_folder); | |||||
List<Post> list = new List<Post>(); | |||||
foreach (string file in Directory.GetFiles(_folder, "*.xml", SearchOption.TopDirectoryOnly)) | |||||
{ | |||||
XElement doc = XElement.Load(file); | |||||
Post post = new Post() | |||||
{ | |||||
ID = Path.GetFileNameWithoutExtension(file), | |||||
Title = ReadValue(doc, "title"), | |||||
Author = ReadValue(doc, "author"), | |||||
Content = ReadValue(doc, "content"), | |||||
Slug = ReadValue(doc, "slug").ToLowerInvariant(), | |||||
PubDate = DateTime.Parse(ReadValue(doc, "pubDate")), | |||||
LastModified = DateTime.Parse(ReadValue(doc, "lastModified", DateTime.Now.ToString())), | |||||
IsPublished = bool.Parse(ReadValue(doc, "ispublished", "true")), | |||||
}; | |||||
LoadCategories(post, doc); | |||||
LoadComments(post, doc); | |||||
list.Add(post); | |||||
} | |||||
if (list.Count > 0) | |||||
{ | |||||
list.Sort((p1, p2) => p2.PubDate.CompareTo(p1.PubDate)); | |||||
HttpRuntime.Cache.Insert("posts", list); | |||||
} | |||||
} | |||||
private static void LoadCategories(Post post, XElement doc) | |||||
{ | |||||
XElement categories = doc.Element("categories"); | |||||
if (categories == null) | |||||
return; | |||||
List<string> list = new List<string>(); | |||||
foreach (var node in categories.Elements("category")) | |||||
{ | |||||
list.Add(node.Value); | |||||
} | |||||
post.Categories = list.ToArray(); | |||||
} | |||||
private static void LoadComments(Post post, XElement doc) | |||||
{ | |||||
var comments = doc.Element("comments"); | |||||
if (comments == null) | |||||
return; | |||||
foreach (var node in comments.Elements("comment")) | |||||
{ | |||||
Comment comment = new Comment() | |||||
{ | |||||
ID = ReadAttribute(node, "id"), | |||||
Author = ReadValue(node, "author"), | |||||
Email = ReadValue(node, "email"), | |||||
Website = ReadValue(node, "website"), | |||||
Ip = ReadValue(node, "ip"), | |||||
UserAgent = ReadValue(node, "userAgent"), | |||||
IsAdmin = bool.Parse(ReadAttribute(node, "isAdmin", "false")), | |||||
IsApproved = bool.Parse(ReadAttribute(node, "isApproved", "true")), | |||||
Content = ReadValue(node, "content").Replace("\n", "<br />"), | |||||
PubDate = DateTime.Parse(ReadValue(node, "date", "2000-01-01")), | |||||
}; | |||||
post.Comments.Add(comment); | |||||
} | |||||
} | |||||
private static string ReadValue(XElement doc, XName name, string defaultValue = "") | |||||
{ | |||||
if (doc.Element(name) != null) | |||||
return doc.Element(name).Value; | |||||
return defaultValue; | |||||
} | |||||
private static string ReadAttribute(XElement element, XName name, string defaultValue = "") | |||||
{ | |||||
if (element.Attribute(name) != null) | |||||
return element.Attribute(name).Value; | |||||
return defaultValue; | |||||
} | |||||
} |
@ -0,0 +1,187 @@ | |||||
using System; | |||||
using System.Configuration; | |||||
using System.Linq; | |||||
using System.Net.Mail; | |||||
using System.Text.RegularExpressions; | |||||
using System.Web; | |||||
using System.Web.WebPages; | |||||
public class CommentHandler : IHttpHandler | |||||
{ | |||||
public void ProcessRequest(HttpContext context) | |||||
{ | |||||
Post post = Storage.GetAllPosts().SingleOrDefault(p => p.ID == context.Request["postId"]); | |||||
if (post == null) | |||||
throw new HttpException(404, "The post does not exist"); | |||||
string mode = context.Request["mode"]; | |||||
if (mode == "save" && context.Request.HttpMethod == "POST" && post.AreCommentsOpen(new HttpContextWrapper(context)) && Blog.MatchesUniqueId(context)) | |||||
{ | |||||
Save(context, post); | |||||
} | |||||
else if (mode == "delete") | |||||
{ | |||||
Delete(context, post); | |||||
} | |||||
else if (mode == "approve") | |||||
{ | |||||
Approve(context, post); | |||||
} | |||||
} | |||||
private static void Save(HttpContext context, Post post) | |||||
{ | |||||
string name = context.Request.Form["name"]; | |||||
string email = context.Request.Form["email"]; | |||||
string website = context.Request.Form["website"]; | |||||
string content = context.Request.Form["content"]; | |||||
Validate(name, email, content); | |||||
Comment comment = new Comment() | |||||
{ | |||||
Author = name.Trim(), | |||||
Email = email.Trim(), | |||||
Website = GetUrl(website), | |||||
Ip = context.Request.UserHostAddress, | |||||
UserAgent = context.Request.UserAgent, | |||||
IsAdmin = context.User.Identity.IsAuthenticated, | |||||
Content = HttpUtility.HtmlEncode(content.Trim()).Replace("\n", "<br />"), | |||||
IsApproved = !Blog.ModerateComments, | |||||
}; | |||||
post.Comments.Add(comment); | |||||
Storage.Save(post); | |||||
if (!context.User.Identity.IsAuthenticated) | |||||
System.Threading.ThreadPool.QueueUserWorkItem((s) => SendEmail(comment, post, context.Request)); | |||||
RenderComment(context, comment); | |||||
} | |||||
private static void RenderComment(HttpContext context, Comment comment) | |||||
{ | |||||
var page = (WebPage)WebPageBase.CreateInstanceFromVirtualPath("~/themes/" + Blog.Theme + "/comment.cshtml"); | |||||
page.Context = new HttpContextWrapper(context); | |||||
page.ExecutePageHierarchy(new WebPageContext(page.Context, page: null, model: comment), context.Response.Output); | |||||
} | |||||
private static void SendEmail(Comment comment, Post post, HttpRequest request) | |||||
{ | |||||
try | |||||
{ | |||||
MailMessage mail = new MailMessage(); | |||||
mail.From = new MailAddress(comment.Email, comment.Author); | |||||
mail.ReplyToList.Add(comment.Email); | |||||
mail.To.Add(ConfigurationManager.AppSettings.Get("blog:email")); | |||||
mail.Subject = "Blog comment: " + post.Title; | |||||
mail.IsBodyHtml = true; | |||||
string absoluteUrl = request.Url.Scheme + "://" + request.Url.Authority; | |||||
string deleteUrl = absoluteUrl + request.RawUrl + "?postId=" + post.ID + "&commentId=" + comment.ID + "&mode=delete"; | |||||
string approveUrl = absoluteUrl + request.RawUrl + "?postId=" + post.ID + "&commentId=" + comment.ID + "&mode=approve"; | |||||
mail.Body = "<div style=\"font: 11pt/1.5 calibri, arial;\">" + | |||||
comment.Author + " on <a href=\"" + absoluteUrl + post.Url + "\">" + post.Title + "</a>:<br /><br />" + | |||||
comment.Content + "<br /><br />" + | |||||
(Blog.ModerateComments ? "<a href=\"" + approveUrl + "\">Approve comment</a> | " : string.Empty) + | |||||
"<a href=\"" + deleteUrl + "\">Delete comment</a>" + | |||||
"<br /><br /><hr />" + | |||||
"Website: " + comment.Website + "<br />" + | |||||
"E-mail: " + comment.Email + "<br />" + | |||||
"IP-address: " + comment.Ip + | |||||
"</div>"; | |||||
SmtpClient client = new SmtpClient(); | |||||
client.Send(mail); | |||||
} | |||||
catch | |||||
{ } | |||||
} | |||||
private static void Validate(string name, string email, string content) | |||||
{ | |||||
bool isName = !string.IsNullOrEmpty(name); | |||||
bool isMail = !string.IsNullOrEmpty(email) && Regex.IsMatch(email, @"^([\w\.\-]+)@([\w\-]+)((\.(\w){2,3})+)$"); | |||||
bool isContent = !string.IsNullOrEmpty(content); | |||||
if (!isName || !isMail || !isContent) | |||||
{ | |||||
if (!isName) | |||||
HttpContext.Current.Response.Status = "403 Please enter a valid name"; | |||||
else if (!isMail) | |||||
HttpContext.Current.Response.Status = "403 Please enter a valid e-mail address"; | |||||
else if (!isContent) | |||||
HttpContext.Current.Response.Status = "403 Please enter a valid comment"; | |||||
HttpContext.Current.Response.End(); | |||||
} | |||||
} | |||||
private static string GetUrl(string website) | |||||
{ | |||||
if (!website.Contains("://")) | |||||
website = "http://" + website; | |||||
Uri url; | |||||
if (Uri.TryCreate(website, UriKind.Absolute, out url)) | |||||
return url.ToString(); | |||||
return string.Empty; | |||||
} | |||||
private static void Delete(HttpContext context, Post post) | |||||
{ | |||||
if (!context.User.Identity.IsAuthenticated) | |||||
throw new HttpException(403, "No access"); | |||||
string commentId = context.Request["commentId"]; | |||||
Comment comment = post.Comments.SingleOrDefault(c => c.ID == commentId); | |||||
if (comment != null) | |||||
{ | |||||
post.Comments.Remove(comment); | |||||
Storage.Save(post); | |||||
} | |||||
else | |||||
{ | |||||
throw new HttpException(404, "Comment could not be found"); | |||||
} | |||||
if (context.Request.HttpMethod == "GET") | |||||
{ | |||||
context.Response.Redirect(post.AbsoluteUrl.ToString() + "#comments", true); | |||||
} | |||||
} | |||||
private static void Approve(HttpContext context, Post post) | |||||
{ | |||||
if (!context.User.Identity.IsAuthenticated) | |||||
throw new HttpException(403, "No access"); | |||||
string commentId = context.Request["commentId"]; | |||||
Comment comment = post.Comments.SingleOrDefault(c => c.ID == commentId); | |||||
if (comment != null) | |||||
{ | |||||
comment.IsApproved = true; | |||||
Storage.Save(post); | |||||
} | |||||
else | |||||
{ | |||||
throw new HttpException(404, "Comment could not be found"); | |||||
} | |||||
if (context.Request.HttpMethod == "GET") | |||||
{ | |||||
context.Response.Redirect(post.AbsoluteUrl.ToString() + "#comments", true); | |||||
} | |||||
} | |||||
public bool IsReusable | |||||
{ | |||||
get { return false; } | |||||
} | |||||
} |
@ -0,0 +1,59 @@ | |||||
using System; | |||||
using System.Collections.Generic; | |||||
using System.ServiceModel.Syndication; | |||||
using System.Web; | |||||
using System.Xml; | |||||
public class FeedHandler : IHttpHandler | |||||
{ | |||||
public void ProcessRequest(HttpContext context) | |||||
{ | |||||
SyndicationFeed feed = new SyndicationFeed() | |||||
{ | |||||
Title = new TextSyndicationContent(Blog.Title), | |||||
Description = new TextSyndicationContent("Latest blog posts"), | |||||
BaseUri = new Uri(context.Request.Url.Scheme + "://" + context.Request.Url.Authority), | |||||
Items = GetItems(), | |||||
}; | |||||
feed.Links.Add(new SyndicationLink(feed.BaseUri)); | |||||
using (var writer = new XmlTextWriter(context.Response.Output)) | |||||
{ | |||||
var formatter = GetFormatter(context, feed); | |||||
formatter.WriteTo(writer); | |||||
} | |||||
context.Response.ContentType = "text/xml"; | |||||
} | |||||
private IEnumerable<SyndicationItem> GetItems() | |||||
{ | |||||
foreach (Post p in Blog.GetPosts(10)) | |||||
{ | |||||
var item = new SyndicationItem(p.Title, p.Content, p.AbsoluteUrl, p.AbsoluteUrl.ToString(), p.LastModified); | |||||
item.Authors.Add(new SyndicationPerson("", p.Author, "")); | |||||
yield return item; | |||||
} | |||||
} | |||||
private SyndicationFeedFormatter GetFormatter(HttpContext context, SyndicationFeed feed) | |||||
{ | |||||
string path = context.Request.Path.Trim('/'); | |||||
int index = path.LastIndexOf('/'); | |||||
if (index > -1 && path.Substring(index + 1) == "atom") | |||||
{ | |||||
context.Response.ContentType = "application/atom+xml"; | |||||
return new Atom10FeedFormatter(feed); | |||||
} | |||||
context.Response.ContentType = "application/rss+xml"; | |||||
return new Rss20FeedFormatter(feed); | |||||
} | |||||
public bool IsReusable | |||||
{ | |||||
get { return false; } | |||||
} | |||||
} |
@ -0,0 +1,188 @@ | |||||
using CookComputing.XmlRpc; | |||||
using System.Collections.Generic; | |||||
using System.Configuration; | |||||
using System.IO; | |||||
using System.Linq; | |||||
using System.Web.Security; | |||||
public interface IMetaWeblog | |||||
{ | |||||
#region MetaWeblog API | |||||
[XmlRpcMethod("metaWeblog.newPost")] | |||||
string AddPost(string blogid, string username, string password, Post post, bool publish); | |||||
[XmlRpcMethod("metaWeblog.editPost")] | |||||
bool UpdatePost(string postid, string username, string password, Post post, bool publish); | |||||
[XmlRpcMethod("metaWeblog.getPost")] | |||||
object GetPost(string postid, string username, string password); | |||||
[XmlRpcMethod("metaWeblog.getCategories")] | |||||
object[] GetCategories(string blogid, string username, string password); | |||||
[XmlRpcMethod("metaWeblog.getRecentPosts")] | |||||
object[] GetRecentPosts(string blogid, string username, string password, int numberOfPosts); | |||||
[XmlRpcMethod("metaWeblog.newMediaObject")] | |||||
object NewMediaObject(string blogid, string username, string password, MediaObject mediaObject); | |||||
#endregion | |||||
#region Blogger API | |||||
[XmlRpcMethod("blogger.deletePost")] | |||||
[return: XmlRpcReturnValue(Description = "Returns true.")] | |||||
bool DeletePost(string key, string postid, string username, string password, bool publish); | |||||
[XmlRpcMethod("blogger.getUsersBlogs")] | |||||
object[] GetUsersBlogs(string key, string username, string password); | |||||
#endregion | |||||
} | |||||
public class MetaWeblogHandler : XmlRpcService, IMetaWeblog | |||||
{ | |||||
string IMetaWeblog.AddPost(string blogid, string username, string password, Post post, bool publish) | |||||
{ | |||||
ValidateUser(username, password); | |||||
post.Slug = PostHandler.CreateSlug(post.Title); | |||||
post.IsPublished = publish; | |||||
Storage.Save(post); | |||||
return post.ID; | |||||
} | |||||
bool IMetaWeblog.UpdatePost(string postid, string username, string password, Post post, bool publish) | |||||
{ | |||||
ValidateUser(username, password); | |||||
Post match = Storage.GetAllPosts().FirstOrDefault(p => p.ID == postid); | |||||
if (match != null) | |||||
{ | |||||
match.Title = post.Title; | |||||
match.Content = post.Content; | |||||
match.Slug = post.Slug; | |||||
match.Categories = post.Categories; | |||||
match.IsPublished = publish; | |||||
match.PubDate = post.PubDate; | |||||
Storage.Save(match); | |||||
} | |||||
return match != null; | |||||
} | |||||
bool IMetaWeblog.DeletePost(string key, string postid, string username, string password, bool publish) | |||||
{ | |||||
ValidateUser(username, password); | |||||
Post post = Storage.GetAllPosts().FirstOrDefault(p => p.ID == postid); | |||||
if (post != null) | |||||
{ | |||||
Storage.Delete(post); | |||||
} | |||||
return post != null; | |||||
} | |||||
object IMetaWeblog.GetPost(string postid, string username, string password) | |||||
{ | |||||
ValidateUser(username, password); | |||||
Post post = Storage.GetAllPosts().FirstOrDefault(p => p.ID == postid); | |||||
if (post == null) | |||||
throw new XmlRpcFaultException(0, "Post does not exist"); | |||||
return new | |||||
{ | |||||
description = post.Content, | |||||
title = post.Title, | |||||
dateCreated = post.PubDate, | |||||
wp_slug = post.Slug, | |||||
categories = post.Categories.ToArray(), | |||||
postid = post.ID | |||||
}; | |||||
} | |||||
object[] IMetaWeblog.GetRecentPosts(string blogid, string username, string password, int numberOfPosts) | |||||
{ | |||||
ValidateUser(username, password); | |||||
List<object> list = new List<object>(); | |||||
foreach (var post in Storage.GetAllPosts().Take(numberOfPosts)) | |||||
{ | |||||
var info = new | |||||
{ | |||||
description = post.Content, | |||||
title = post.Title, | |||||
dateCreated = post.PubDate, | |||||
wp_slug = post.Slug, | |||||
postid = post.ID | |||||
}; | |||||
list.Add(info); | |||||
} | |||||
return list.ToArray(); | |||||
} | |||||
object[] IMetaWeblog.GetCategories(string blogid, string username, string password) | |||||
{ | |||||
ValidateUser(username, password); | |||||
var list = new List<object>(); | |||||
var categories = Storage.GetAllPosts().SelectMany(p => p.Categories); | |||||
foreach (string category in categories.Distinct()) | |||||
{ | |||||
list.Add(new { title = category }); | |||||
} | |||||
return list.ToArray(); | |||||
} | |||||
object IMetaWeblog.NewMediaObject(string blogid, string username, string password, MediaObject media) | |||||
{ | |||||
ValidateUser(username, password); | |||||
string path = Blog.SaveFileToDisk(media.bits, Path.GetExtension(media.name)); | |||||
return new { url = path }; | |||||
} | |||||
object[] IMetaWeblog.GetUsersBlogs(string key, string username, string password) | |||||
{ | |||||
ValidateUser(username, password); | |||||
return new[] | |||||
{ | |||||
new | |||||
{ | |||||
blogid = "1", | |||||
blogName = ConfigurationManager.AppSettings.Get("blog:name"), | |||||
url = Context.Request.Url.Scheme + "://" + Context.Request.Url.Authority | |||||
} | |||||
}; | |||||
} | |||||
private void ValidateUser(string username, string password) | |||||
{ | |||||
if (!FormsAuthentication.Authenticate(username, password)) | |||||
{ | |||||
throw new XmlRpcFaultException(0, "User is not valid!"); | |||||
} | |||||
} | |||||
} | |||||
[XmlRpcMissingMapping(MappingAction.Ignore)] | |||||
public struct MediaObject | |||||
{ | |||||
public string name; | |||||
public string type; | |||||
public byte[] bits; | |||||
} |
@ -0,0 +1,60 @@ | |||||
using Microsoft.Ajax.Utilities; | |||||
using System; | |||||
using System.IO; | |||||
using System.Web; | |||||
using System.Web.Caching; | |||||
public class MinifyHandler : IHttpHandler | |||||
{ | |||||
public void ProcessRequest(HttpContext context) | |||||
{ | |||||
string file = context.Server.MapPath(context.Request.CurrentExecutionFilePath); | |||||
string ext = Path.GetExtension(file); | |||||
if (context.IsDebuggingEnabled) | |||||
{ | |||||
context.Response.TransmitFile(file); | |||||
} | |||||
else | |||||
{ | |||||
Minify(context.Response, file, ext); | |||||
} | |||||
SetHeaders(context.Response, file, ext); | |||||
} | |||||
private static void SetHeaders(HttpResponse response, string file, string ext) | |||||
{ | |||||
response.ContentType = ext == ".css" ? "text/css" : "text/javascript"; | |||||
response.Cache.SetLastModified(File.GetLastWriteTimeUtc(file)); | |||||
response.Cache.SetValidUntilExpires(true); | |||||
response.Cache.SetExpires(DateTime.Now.AddYears(1)); | |||||
response.Cache.SetCacheability(HttpCacheability.ServerAndPrivate); | |||||
response.Cache.SetVaryByCustom("Accept-Encoding"); | |||||
response.AddCacheDependency(new CacheDependency(file)); | |||||
} | |||||
private static void Minify(HttpResponse response, string file, string ext) | |||||
{ | |||||
string content = File.ReadAllText(file); | |||||
Minifier minifier = new Minifier(); | |||||
if (ext == ".css") | |||||
{ | |||||
CssSettings settings = new CssSettings() { CommentMode = CssComment.None }; | |||||
response.Write(minifier.MinifyStyleSheet(content, settings)); | |||||
} | |||||
else if (ext == ".js") | |||||
{ | |||||
CodeSettings settings = new CodeSettings() { PreserveImportantComments = false }; | |||||
response.Write(minifier.MinifyJavaScript(content, settings)); | |||||
} | |||||
} | |||||
public bool IsReusable | |||||
{ | |||||
get { return false; } | |||||
} | |||||
} |
@ -0,0 +1,117 @@ | |||||
using System; | |||||
using System.Globalization; | |||||
using System.Linq; | |||||
using System.Text; | |||||
using System.Text.RegularExpressions; | |||||
using System.Web; | |||||
public class PostHandler : IHttpHandler | |||||
{ | |||||
public void ProcessRequest(HttpContext context) | |||||
{ | |||||
if (!context.User.Identity.IsAuthenticated || Blog.MatchesUniqueId(context)) | |||||
throw new HttpException(403, "No access"); | |||||
string mode = context.Request.QueryString["mode"]; | |||||
string id = context.Request.Form["id"]; | |||||
if (mode == "delete") | |||||
{ | |||||
DeletePost(id); | |||||
} | |||||
else if (mode == "save") | |||||
{ | |||||
EditPost(id, context.Request.Form["title"], context.Request.Form["content"], bool.Parse(context.Request.Form["isPublished"]), context.Request.Form["categories"].Split(',')); | |||||
} | |||||
} | |||||
private void DeletePost(string id) | |||||
{ | |||||
Post post = Storage.GetAllPosts().FirstOrDefault(p => p.ID == id); | |||||
if (post == null) | |||||
throw new HttpException(404, "The post does not exist"); | |||||
Storage.Delete(post); | |||||
} | |||||
private void EditPost(string id, string title, string content, bool isPublished, string[] categories) | |||||
{ | |||||
Post post = Storage.GetAllPosts().FirstOrDefault(p => p.ID == id); | |||||
if (post != null) | |||||
{ | |||||
post.Title = title; | |||||
post.Content = content; | |||||
post.Categories = categories; | |||||
} | |||||
else | |||||
{ | |||||
post = new Post() { Title = title, Content = content, Slug = CreateSlug(title), Categories = categories }; | |||||
HttpContext.Current.Response.Write(post.Url); | |||||
} | |||||
SaveFilesToDisk(post); | |||||
post.IsPublished = isPublished; | |||||
Storage.Save(post); | |||||
} | |||||
private void SaveFilesToDisk(Post post) | |||||
{ | |||||
foreach (Match match in Regex.Matches(post.Content, "(src|href)=\"(data:([^\"]+))\"")) | |||||
{ | |||||
string extension = Regex.Match(match.Value, "data:([^/]+)/([a-z]+);base64").Groups[2].Value; | |||||
byte[] bytes = ConvertToBytes(match.Groups[2].Value); | |||||
string path = Blog.SaveFileToDisk(bytes, extension); | |||||
string value = string.Format("src=\"{0}\" alt=\"\" /", path); | |||||
if (match.Groups[1].Value == "href") | |||||
value = string.Format("href=\"{0}\"", path); | |||||
post.Content = post.Content.Replace(match.Value, value); | |||||
} | |||||
} | |||||
private byte[] ConvertToBytes(string base64) | |||||
{ | |||||
int index = base64.IndexOf("base64,", StringComparison.Ordinal) + 7; | |||||
return Convert.FromBase64String(base64.Substring(index)); | |||||
} | |||||
public static string CreateSlug(string title) | |||||
{ | |||||
title = title.ToLowerInvariant().Replace(" ", "-"); | |||||
title = RemoveDiacritics(title); | |||||
title = Regex.Replace(title, @"([^0-9a-z-])", string.Empty); | |||||
if (Storage.GetAllPosts().Any(p => string.Equals(p.Slug, title))) | |||||
throw new HttpException(409, "Already in use"); | |||||
return title.ToLowerInvariant(); | |||||
} | |||||
static string RemoveDiacritics(string text) | |||||
{ | |||||
var normalizedString = text.Normalize(NormalizationForm.FormD); | |||||
var stringBuilder = new StringBuilder(); | |||||
foreach (var c in normalizedString) | |||||
{ | |||||
var unicodeCategory = CharUnicodeInfo.GetUnicodeCategory(c); | |||||
if (unicodeCategory != UnicodeCategory.NonSpacingMark) | |||||
{ | |||||
stringBuilder.Append(c); | |||||
} | |||||
} | |||||
return stringBuilder.ToString().Normalize(NormalizationForm.FormC); | |||||
} | |||||
public bool IsReusable | |||||
{ | |||||
get { return false; } | |||||
} | |||||
} |
@ -0,0 +1,94 @@ | |||||
@media (max-width: 1024px) { | |||||
.nav > li { | |||||
display: inline-block; | |||||
} | |||||
.nav > li button, #ispublished { | |||||
padding-left: 8px; | |||||
padding-right: 8px; | |||||
} | |||||
} | |||||
.admin { | |||||
margin-top: 50px; | |||||
} | |||||
#admin { | |||||
font: 12pt arial; | |||||
} | |||||
#admin .navbar-inner { | |||||
min-height: 0; | |||||
padding-top: 8px; | |||||
} | |||||
#admin form { | |||||
position: absolute; | |||||
top: 8px; | |||||
right: 1em; | |||||
margin: 0; | |||||
} | |||||
#admin .nav { | |||||
margin-left: 1em; | |||||
} | |||||
#admin button:focus { | |||||
outline: 0; | |||||
white-space: nowrap; | |||||
} | |||||
#ispublished { | |||||
display: none; | |||||
position: relative; | |||||
top: 7px; | |||||
left: 10px; | |||||
} | |||||
#ispublished label { | |||||
display: inline; | |||||
position: relative; | |||||
left: 4px; | |||||
font-weight: normal; | |||||
} | |||||
#admin #tools { | |||||
position: relative; | |||||
top: 5px; | |||||
left: 10px; | |||||
margin: 0 1em; | |||||
display: none; | |||||
} | |||||
#admin #tools a { | |||||
font-size: 14px; | |||||
font-weight: bold; | |||||
padding: 0 9px; | |||||
} | |||||
#admin #tools div:not(:last-child) { | |||||
border-right: 1px solid gray; | |||||
} | |||||
#admin aside { | |||||
position: absolute; | |||||
top: 4em; | |||||
text-align: center; | |||||
width: 100%; | |||||
display: none; | |||||
} | |||||
#admin aside .alert { | |||||
display: inline-block; | |||||
padding: 8px 1em; | |||||
} | |||||
[contenteditable] { | |||||
outline: thin dashed #ccc; | |||||
width: 100%; | |||||
display: inline-block; | |||||
} | |||||
[contenteditable] img { | |||||
cursor: move; | |||||
} |
@ -0,0 +1,612 @@ | |||||
<?xml version="1.0" standalone="no"?> | |||||
<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd" > | |||||
<svg> | |||||
<metadata> | |||||
Created by FontForge 1853326994 at Sun Oct 13 04:53:50 2013 | |||||
By U-zoghal-god\zoghal,S-1-5-21-2758449068-1321902542-3097588897-1003 | |||||
(c) 1392 Rita Development Corpertion(RitaCo) | |||||
</metadata> | |||||
<defs> | |||||
<font id="WebYekan" horiz-adv-x="0" > | |||||
<font-face | |||||
font-family="Web Yekan" | |||||
font-weight="400" | |||||
font-stretch="normal" | |||||
units-per-em="2048" | |||||
panose-1="0 0 4 0 0 0 0 0 0 0" | |||||
ascent="1638" | |||||
descent="-410" | |||||
bbox="-288 -1044 2334 2090" | |||||
underline-thickness="100" | |||||
underline-position="-850" | |||||
unicode-range="U+0020-FEFC" | |||||
/> | |||||
<missing-glyph horiz-adv-x="1024" | |||||
d="M256 128h512v1834h-512v-1834zM128 0v2090h768v-2090h-768z" /> | |||||
<glyph glyph-name="uFC60" unicode="َّ" arabic-form="isolated" | |||||
d="M-6 1475v7h45q0 -100 80 -100t84 100h50q0 -100 82 -100t83 100h48q-1 -62 -37 -107t-88 -45t-117 57q-47 -57 -107 -57h-3q-58 0 -89 45t-31 100zM383 1755l-315 -168l-28 47l315 176z" /> | |||||
<glyph glyph-name="uFC61" unicode="ُّ" arabic-form="isolated" | |||||
d="M15 1486v7h45q0 -100 80 -100t84 100h50q0 -100 82 -100t83 100h48q-1 -62 -37 -107t-88 -45t-117 57q-47 -57 -107 -57h-3q-58 0 -89 45t-31 100zM322.5 1813q26.5 30 26.5 60t-26.5 52.5t-60.5 22.5q-78 0 -78 -86q0 -79 86 -79q26 0 52.5 30zM396 1868q0 -89 -50 -116 | |||||
l-227 -121l-28 47l126 70q-78 45 -78 113q0 91 90 125q26 10 33 10q55 0 94.5 -37t39.5 -91z" /> | |||||
<glyph glyph-name="uE818" unicode="ًّ" | |||||
d="M-26 1516v7h45q0 -100 80 -100t84 100h50q0 -100 82 -100t83 100h48q-1 -62 -37 -107t-88 -45t-117 57q-47 -57 -107 -57h-3q-58 0 -89 45t-31 100zM382 1810l-315 -168l-28 47l315 173zM383 1927l-316 -172l-27 50l315 174z" /> | |||||
<glyph glyph-name="uFC5E" unicode="ٌّ" arabic-form="isolated" | |||||
d="M5 1509v7h45q0 -100 80 -100t84 100h50q0 -100 82 -100t83 100h48q-1 -62 -37 -107t-88 -45t-117 57q-47 -57 -107 -57h-3q-58 0 -89 45t-31 100zM375 1881.5q27 29.5 27 59.5t-26.5 53t-59.5 23q-79 0 -79 -87q0 -78 85 -78q26 0 53 29.5zM448 1937q0 -91 -49 -117 | |||||
l-283 -151l-28 48q51 33 63 53q0 34 -37 34t-57 -11l-20 36q56 19 85 19q57 0 72 -78l77 45q-79 45 -79 124.5t87 113.5q29 11 37 11q54 0 93 -37t39 -90z" /> | |||||
<glyph glyph-name="uFC62" unicode="ِّ" arabic-form="isolated" | |||||
d="M-16 1782v7h45q0 -100 80 -100t84 100h50q0 -100 82 -100t83 100h48q-1 -62 -37 -107t-88 -45t-117 57q-47 -57 -107 -57h-3q-58 0 -89 45t-31 100zM378 1534l-314 -169l-29 48l315 175z" /> | |||||
<glyph glyph-name="uFC5F" unicode="ٍّ" arabic-form="isolated" | |||||
d="M-6 2039v7h45q0 -100 80 -100t84 100h50q0 -100 82 -100t83 100h48q-1 -62 -37 -107t-88 -45t-117 57q-47 -57 -107 -57h-3q-58 0 -89 45t-31 100zM372 1626l-315 -169l-27 48l315 175zM372 1770l-315 -169l-27 47l315 174z" /> | |||||
<glyph glyph-name="uFEF5" unicode="ﻟﺂ" horiz-adv-x="1054" arabic-form="isolated" | |||||
d="M621 1360h-451q-30 0 -88 -7t-80 -24t-59 -98l-164 64q65 139 121 184t231 57q53 4 193 4t297 -3v-177zM935 275q0 -130 -77.5 -202.5t-208.5 -72.5h-169q-351 0 -351 275v879h180v-800q0 -111 30.5 -142.5t140.5 -31.5h158q79 0 106 43q15 24 15 131v800h176v-879z" /> | |||||
<glyph glyph-name="uFEF6" unicode="ﻠﺂ" horiz-adv-x="1054" arabic-form="final" | |||||
d="M555 1426h-451q-134 0 -169 -30q-21 -17 -59 -99l-164 64q66 139 122 184t231 57q52 4 192 4t298 -2v-178zM1084 0q-157 0 -246 118q-90 -118 -243 -118h-165q-351 0 -351 275v879h176v-800q0 -121 34 -154q20 -20 141 -20h154q78 0 105 43q16 26 16 131v800h180v-818 | |||||
q0 -156 199 -156v-180z" /> | |||||
<glyph glyph-name="uFEF7" unicode="ﻟﺄ" horiz-adv-x="1054" arabic-form="isolated" | |||||
d="M347 1419l-246 -124l-20 40l84 48q-75 38 -75 110q0 49 35 85t70 36h1q36 0 81 -20l-17 -36q-22 13 -54 13q-70 0 -70 -75t67 -75q54 0 122 42zM935 275q0 -130 -77.5 -202.5t-208.5 -72.5h-169q-351 0 -351 275v879h180v-800q0 -111 30.5 -142.5t140.5 -31.5h158 | |||||
q79 0 106 43q15 24 15 131v800h176v-879z" /> | |||||
<glyph glyph-name="uFEF8" unicode="ﻠﺄ" horiz-adv-x="1054" arabic-form="final" | |||||
d="M311 1412l-247 -124l-20 40l84 48q-75 38 -75 110q0 48 35 84q36 36 72 36t81 -19l-18 -36q-21 13 -54 13q-70 0 -70 -75t68 -75q54 0 121 42zM1084 0q-157 0 -246 118q-90 -118 -243 -118h-165q-351 0 -351 275v879h176v-800q0 -121 34 -154q20 -20 141 -20h154 | |||||
q78 0 105 43q16 26 16 131v800h180v-818q0 -156 199 -156v-180z" /> | |||||
<glyph glyph-name="uFEF9" unicode="ﻟﺈ" horiz-adv-x="1054" arabic-form="isolated" | |||||
d="M443 -330l-246 -124l-20 40l84 47q-75 39 -75 110q0 50 34 85q36 35 72 35t81 -18l-17 -37q-22 14 -54 14q-70 0 -70 -75t67 -75q54 0 122 41zM935 275q0 -130 -77.5 -202.5t-208.5 -72.5h-169q-351 0 -351 275v879h180v-800q0 -111 30.5 -142.5t140.5 -31.5h158 | |||||
q79 0 106 43q15 24 15 131v800h176v-879z" /> | |||||
<glyph glyph-name="uFEFA" unicode="ﻠﺈ" horiz-adv-x="1054" arabic-form="final" | |||||
d="M369 -323l-246 -124l-20 40l84 48q-75 39 -75 110q0 49 35 84.5t71 35.5t81 -19l-17 -36q-21 14 -54 14q-70 0 -70 -75t68 -75q53 0 121 41zM1084 0q-157 0 -246 118q-90 -118 -243 -118h-165q-351 0 -351 275v879h176v-800q0 -121 34 -154q20 -20 141 -20h154 | |||||
q78 0 105 43q16 26 16 131v800h180v-818q0 -156 199 -156v-180z" /> | |||||
<glyph glyph-name="uFEFB" unicode="ﻟﺎ" horiz-adv-x="1054" arabic-form="isolated" | |||||
d="M935 275q0 -130 -77.5 -202.5t-208.5 -72.5h-169q-351 0 -351 275v879h180v-800q0 -111 30.5 -142.5t140.5 -31.5h158q79 0 106 43q15 24 15 131v800h176v-879z" /> | |||||
<glyph glyph-name="uFEFC" unicode="ﻠﺎ" horiz-adv-x="1054" arabic-form="final" | |||||
d="M1084 0q-157 0 -246 118q-90 -118 -243 -118h-165q-351 0 -351 275v879h176v-800q0 -121 34 -154q20 -20 141 -20h154q78 0 105 43q16 26 16 131v800h180v-818q0 -156 199 -156v-180z" /> | |||||
<glyph glyph-name="uFDF2" unicode="ﻟﻠﻪ" horiz-adv-x="2253" arabic-form="isolated" | |||||
d="M501.5 198.5q51.5 44.5 51.5 111.5t-34 100l-145 144q-84 -79 -105 -106q-53 -68 -53 -137.5t47 -113t117 -43.5t121.5 44.5zM2123 275q0 -130 -77.5 -202.5t-209.5 -72.5h-173q-176 0 -262 70q-65 -54 -107.5 -62t-193 -8t-204.5 31q-27 16 -188 165 | |||||
q-102 -216 -329 -216q-149 0 -246 97t-97 249.5t209 361.5l-51 58l121 122l539 -573q68 -72 92 -87q49 -30 230 -30q87 0 114 48q19 34 19 128v800h180v-836q0 -98 59 -122q40 -16 277 -16q80 0 106 43q15 24 15 131v800h177v-879zM1638 1415q0 -62 -36.5 -106.5t-89 -44.5 | |||||
t-117.5 56q-46 -56 -104 -56q-117 0 -126 151h45q0 -100 80.5 -100t83.5 100h50q0 -100 82.5 -100t82.5 100h49z" /> | |||||
<glyph glyph-name="u0622" unicode="آ" horiz-adv-x="669" arabic-form="isolated" | |||||
d="M430 0h-175v1154h175v-1154zM676 1253h-451q-31 0 -89 -7t-80 -24t-59 -98l-163 64q65 140 121 184t231 57q53 4 193 4t297 -3v-177z" /> | |||||
<glyph glyph-name="Hcircumflex" unicode="آ" horiz-adv-x="575" arabic-form="final" | |||||
d="M604 0q-182 0 -266 46q-117 64 -117 229v851h180v-772q0 -122 36 -148t167 -26v-180zM725 1258h-450q-11 -2 -79 -8t-90 -25t-58 -96l-166 62q65 141 112 177q74 56 206 60t385 5h140v-175z" /> | |||||
<glyph glyph-name="u0623" unicode="أ" horiz-adv-x="575" arabic-form="isolated" | |||||
d="M419 1389l-246 -123l-20 40l83 47q-75 39 -75 110q0 49 35 85q36 36 71 36h1q36 0 81 -20l-18 -36q-21 14 -53 14q-70 0 -70 -75t67 -75q54 0 121 41zM374 0h-175v1154h175v-1154z" /> | |||||
<glyph glyph-name="uFE84" unicode="أ" horiz-adv-x="469" arabic-form="final" | |||||
d="M345 1382l-246 -124l-20 40l84 48q-75 38 -75 110q0 48 34 84q36 36 72 36t81 -19l-17 -36q-22 13 -54 13q-70 0 -70 -75t67 -75q54 0 122 42zM509 0q-228 0 -321 88q-62 57 -62 187v851h180v-772q0 -125 42 -153q26 -17 161 -21v-180z" /> | |||||
<glyph glyph-name="u0624" unicode="ؤ" horiz-adv-x="893" arabic-form="isolated" | |||||
d="M621 180v185q0 176 -139 176t-139 -185q0 -122 86 -157q46 -19 192 -19zM803 -23q0 -186 -134 -309t-321 -123h-233l-22 180h227q124 1 212 77t88 198q-218 0 -322 59q-140 77 -140 271t61 283q74 108 252 108q216 0 288 -165q44 -101 44 -353v-226zM453 890l-304 -154 | |||||
l-25 50l104 57q-93 47 -93 121t41.5 119.5t104.5 45.5q25 0 87 -23l-23 -47q-25 19 -61 19t-64.5 -30t-28.5 -73q0 -81 79 -81q56 0 156 52z" /> | |||||
<glyph glyph-name="uFE86" unicode="ؤ" horiz-adv-x="893" arabic-form="final" | |||||
d="M615 180v171q0 112 -53 151t-96 39q-137 0 -137 -185q0 -122 90 -157q48 -19 196 -19zM919 0h-119q0 -201 -132.5 -328t-333.5 -127h-233l-22 180h227q125 1 214 77t89 198q-221 0 -325 58q-140 77 -140 271t62 283q75 107 253 107q221 0 295 -174q46 -109 46 -365h119 | |||||
v-180zM484 890l-304 -154l-25 50l104 57q-90 49 -90 123t39.5 118.5t105.5 44.5q23 0 85 -23l-23 -47q-30 16 -62 16t-60.5 -29t-28.5 -72q0 -81 79 -81q59 0 156 51z" /> | |||||
<glyph glyph-name="u0625" unicode="إ" horiz-adv-x="575" arabic-form="isolated" | |||||
d="M448 -345l-246 -124l-20 40l84 48q-75 38 -75 110q0 49 35 84.5t71 35.5t81 -19l-17 -36q-21 13 -54 13q-70 0 -70 -75t68 -75q53 0 121 42zM374 0h-175v1154h175v-1154z" /> | |||||
<glyph glyph-name="uFE88" unicode="إ" horiz-adv-x="469" arabic-form="final" | |||||
d="M434 -367l-247 -124l-20 40l84 48q-75 38 -75 110q0 49 35 84.5t71 35.5t82 -19l-18 -36q-21 13 -54 13q-70 0 -70 -75t68 -75q54 0 121 42zM509 0q-228 0 -321 88q-62 57 -62 187v851h180v-772q0 -125 42 -153q26 -17 161 -21v-180z" /> | |||||
<glyph glyph-name="u0626" unicode="ئ" horiz-adv-x="1289" arabic-form="isolated" | |||||
d="M1225 9v-3q0 -203 -119 -332t-319 -129h-282q-188 1 -307 137t-119 327v372h169v-392q0 -122 84 -195t209 -73h232q99 0 189 72.5t91 164.5q0 92 -60 110t-358 20v308q0 137 90.5 230t227.5 93h216l7 -169h-216q-105 0 -139 -101q-17 -53 -17 -190q262 -5 327 -43 | |||||
q94 -53 94 -207zM444 778l-304 -154l-25 50l104 56q-90 50 -90 123t39 118t105 45q24 0 86 -22l-23 -48q-30 17 -64 17t-61.5 -30t-27.5 -73q0 -80 76 -80q62 0 160 51z" /> | |||||
<glyph glyph-name="uFE8A" unicode="ئ" horiz-adv-x="1289" arabic-form="final" | |||||
d="M1318 0h-167q9 -31 9 -88q0 -159 -116 -263t-278 -104h-280q-215 0 -328.5 147.5t-114.5 370.5v322h180v-391q1 -129 87 -199t218 -70h231q95 0 159 54t65 147q0 46 -53 58q-58 12 -321 16l-16 180h725v-180zM450 781l-304 -152l-25 49l104 57q-92 49 -92 121t41.5 117.5 | |||||
t91.5 45.5t99 -21l-22 -47q-29 15 -63 15t-62.5 -29t-28.5 -72q0 -81 79 -81q56 0 156 52z" /> | |||||
<glyph glyph-name="uFE8B" unicode="ئ" horiz-adv-x="609" arabic-form="initial" | |||||
d="M339 353l-3 212h184v-272q0 -116 -74 -204.5t-187 -88.5h-295v180q283 0 315 11q60 22 60 162zM446 773l-303 -153l-25 49l103 56q-92 52 -92 124.5t41.5 117t104.5 44.5q24 0 85 -22l-22 -48q-26 19 -54 19q-99 0 -99 -101q0 -81 79 -81q57 0 155 51z" /> | |||||
<glyph glyph-name="uFE8C" unicode="ئ" horiz-adv-x="703" arabic-form="medial" | |||||
d="M441 780l-303 -154l-25 50l103 57q-92 48 -92 120.5t41.5 119t104.5 46.5q25 0 86 -23l-22 -47q-28 15 -62.5 15t-63 -29.5t-28.5 -71.5q0 -82 79 -82q56 0 156 53zM728 0h-29q-93 0 -128.5 9.5t-95.5 60.5q-90 -70 -169 -70h-326v180q29 0 123 -1l93 -1h12q106 0 139 35 | |||||
t33 153v199h184v-247q0 -90 33.5 -112t130.5 -26v-180z" /> | |||||
<glyph glyph-name="u0627" unicode="ا" horiz-adv-x="575" arabic-form="isolated" | |||||
d="M374 0h-175v1154h175v-1154z" /> | |||||
<glyph glyph-name="uFE8E" unicode="ا" horiz-adv-x="469" arabic-form="final" | |||||
d="M509 0q-228 0 -321 88q-62 57 -62 187v851h180v-772q0 -125 42 -153q26 -17 161 -21v-180z" /> | |||||
<glyph glyph-name="u0628" unicode="ب" horiz-adv-x="1606" arabic-form="isolated" | |||||
d="M978 -326q0 -52 -37 -89.5t-88 -37.5q-134 0 -134 127v2q0 103 129.5 103t129.5 -105zM1541 293q0 -113 -74 -203t-186 -90h-950q-115 0 -186.5 86.5t-71.5 203.5v275h180v-247q0 -76 28.5 -107t103.5 -31h840q75 0 104.5 31t29.5 107v247h182v-272z" /> | |||||
<glyph glyph-name="uFE90" unicode="ب" horiz-adv-x="1713" arabic-form="final" | |||||
d="M938 -334q0 -53 -36.5 -88.5t-88.5 -35.5q-135 0 -135 124q0 109 130 109t130 -109zM1746 0q-214 0 -286 70q-92 -70 -174 -70h-948q-112 0 -184 89t-73 204v272h180v-247q0 -77 30 -107.5t105 -30.5h837q75 0 103.5 30.5t28.5 107.5v247h183v-247q0 -138 198 -138v-180z | |||||
" /> | |||||
<glyph glyph-name="uFE91" unicode="ب" horiz-adv-x="586" arabic-form="initial" | |||||
d="M308 -336q0 -53 -36.5 -88.5t-88.5 -35.5q-134 0 -134 124q0 108 129.5 108t129.5 -108zM339 353l-3 212h184v-272q0 -116 -74 -204.5t-187 -88.5h-295v180q283 0 315 11q60 22 60 162z" /> | |||||
<glyph glyph-name="uFE92" unicode="ب" horiz-adv-x="703" arabic-form="medial" | |||||
d="M314 -326q0 -53 -36 -89t-89 -36q-135 0 -135 125q0 107 130 107t130 -107zM356 354l-2 211h185v-247q0 -88 60 -117q36 -17 140 -21v-180h-56q-153 0 -233 70q-90 -70 -172 -70h-296v180q279 0 314 13q60 21 60 161z" /> | |||||
<glyph glyph-name="u067E" unicode="پ" horiz-adv-x="1606" arabic-form="isolated" | |||||
d="M951 -598q-1 -98 -121 -98t-120 98q0 109 114 109q52 0 89.5 -28.5t37.5 -77.5v-3zM786 -343q0 -96 -120 -96t-121 96q0 46 34 77.5t82.5 31.5t86.5 -29t38 -80zM1131 -343q-1 -96 -121 -96t-120 96q0 46 34 77.5t83 31.5t86.5 -28.5t37.5 -77.5v-3zM1541 293 | |||||
q0 -113 -74 -203t-186 -90h-950q-115 0 -186.5 86.5t-71.5 203.5v275h180v-247q0 -76 28.5 -107t103.5 -31h840q75 0 104.5 31t29.5 107v247h182v-272z" /> | |||||
<glyph glyph-name="uFB57" unicode="پ" horiz-adv-x="1713" arabic-form="final" | |||||
d="M719 -572v4q0 48 31.5 79t81.5 31t88 -30t38 -80q0 -97 -119.5 -97t-119.5 93zM793 -314v-4q0 -90 -119.5 -90t-119.5 94q0 47 32 79t79 32q128 0 128 -111zM899 -318v4q0 47 32 79t79 32q128 0 128 -111q0 -94 -119.5 -94t-119.5 90zM1746 0q-214 0 -286 70 | |||||
q-92 -70 -174 -70h-948q-112 0 -184 89t-73 204v272h180v-247q0 -77 30 -107.5t105 -30.5h837q75 0 103.5 30.5t28.5 107.5v247h183v-247q0 -138 198 -138v-180z" /> | |||||
<glyph glyph-name="uFB58" unicode="پ" horiz-adv-x="703" arabic-form="initial" | |||||
d="M419 -568q-1 -98 -121 -98t-120 98q0 110 112 110q52 0 90 -30t39 -80zM254 -314q0 -96 -120 -96t-121 96q0 48 32.5 79.5t80.5 31.5q128 0 128 -111zM599 -314q-1 -96 -121 -96t-120 96q0 48 32.5 79.5t80.5 31.5q128 0 128 -111zM621 293q0 -117 -71 -205t-185 -88 | |||||
h-385v180h329q75 0 103.5 30.5t28.5 107.5v247h180v-272z" /> | |||||
<glyph glyph-name="uFB59" unicode="پ" horiz-adv-x="739" arabic-form="medial" | |||||
d="M389 -568q0 -98 -120.5 -98t-120.5 98q0 110 112 110q52 0 90.5 -29.5t38.5 -80.5zM224 -314q0 -96 -121 -96t-121 96q0 48 33 79.5t81 31.5q128 0 128 -111zM569 -314q0 -96 -120.5 -96t-120.5 96q0 48 32.5 79.5t80.5 31.5q128 0 128 -111zM778 0h-63q-53 0 -102 9 | |||||
q-46 19 -93 61q-86 -70 -171 -70h-388v180h334q75 0 104 30.5t29 107.5v247h181v-247q0 -89 36.5 -113.5t132.5 -24.5v-180z" /> | |||||
<glyph glyph-name="u062A" unicode="ت" horiz-adv-x="1606" arabic-form="isolated" | |||||
d="M1541 293q0 -113 -74 -203t-186 -90h-950q-115 0 -186.5 86.5t-71.5 203.5v275h180v-247q0 -76 28.5 -107t103.5 -31h840q75 0 104.5 31t29.5 107v247h182v-272zM719 865q0 -46 -33 -77.5t-80 -31.5q-126 0 -126 109q0 98 119.5 98t119.5 -96v-2zM1064 865 | |||||
q0 -46 -33.5 -77.5t-80.5 -31.5q-125 0 -125 109v2q0 96 119.5 96t119.5 -98z" /> | |||||
<glyph glyph-name="uFE96" unicode="ت" horiz-adv-x="1713" arabic-form="final" | |||||
d="M1746 0q-214 0 -286 70q-92 -70 -174 -70h-948q-112 0 -184 89t-73 204v272h180v-247q0 -77 30 -107.5t105 -30.5h837q75 0 103.5 30.5t28.5 107.5v247h183v-247q0 -138 198 -138v-180zM766 865q0 -46 -33.5 -76t-79.5 -30q-128 0 -128 106q1 99 121 99t120 -99z | |||||
M1113 865q0 -46 -33.5 -76t-80.5 -30q-128 0 -128 106q0 99 121 99t121 -99z" /> | |||||
<glyph glyph-name="uFE97" unicode="ت" horiz-adv-x="680" arabic-form="initial" | |||||
d="M606 293q0 -117 -72 -205t-185 -88h-385v180h329q75 0 104 30.5t29 107.5v247h180v-272zM123 851v5q1 99 121 99t120 -99q0 -46 -33 -77t-83 -31t-87.5 27.5t-37.5 75.5zM709 856q0 -46 -33.5 -77t-83.5 -31t-87 29t-37 79q0 99 120 99t121 -99z" /> | |||||
<glyph glyph-name="uFE98" unicode="ت" horiz-adv-x="739" arabic-form="medial" | |||||
d="M778 0h-63q-53 0 -102 9q-46 19 -93 61q-86 -70 -171 -70h-388v180h334q75 0 104 30.5t29 107.5v247h181v-247q0 -89 36.5 -113.5t132.5 -24.5v-180zM380 863q0 -47 -33 -77t-79 -30q-127 0 -127 107q0 100 119.5 100t119.5 -100zM725 863q0 -47 -33 -77t-79 -30 | |||||
q-127 0 -127 107q0 100 119.5 100t119.5 -100z" /> | |||||
<glyph glyph-name="u062B" unicode="ث" horiz-adv-x="1606" arabic-form="isolated" | |||||
d="M1541 293q0 -113 -74 -203t-186 -90h-950q-115 0 -186.5 86.5t-71.5 203.5v275h180v-247q0 -76 28.5 -107t103.5 -31h840q75 0 104.5 31t29.5 107v247h182v-272zM491 798v4q0 97 119.5 97t119.5 -99q0 -45 -34 -77t-82 -32t-85.5 29.5t-37.5 77.5zM1076 800 | |||||
q0 -46 -34 -77.5t-82 -31.5t-86 30t-38 79q0 99 120 99t120 -99zM901 1054q0 -47 -34.5 -77.5t-82.5 -30.5t-86 30t-38 78q0 100 120 100t121 -100z" /> | |||||
<glyph glyph-name="uFE9A" unicode="ث" horiz-adv-x="1713" arabic-form="final" | |||||
d="M1746 0q-214 0 -286 70q-92 -70 -174 -70h-948q-112 0 -184 89t-73 204v272h180v-247q0 -77 30 -107.5t105 -30.5h837q75 0 103.5 30.5t28.5 107.5v247h183v-247q0 -138 198 -138v-180zM759 800q0 -45 -33.5 -77t-81.5 -32t-86 30t-38 79q0 99 119.5 99t119.5 -97v-2z | |||||
M1106 800q0 -46 -34 -78t-83 -32h-1q-48 0 -85.5 30t-37.5 78v2q1 99 121 99t120 -99zM930 1054q0 -47 -34 -77.5t-81 -30.5q-126 0 -126 108q1 100 121 100t120 -100z" /> | |||||
<glyph glyph-name="uFE9B" unicode="ث" horiz-adv-x="680" arabic-form="initial" | |||||
d="M606 293q0 -117 -72 -205t-185 -88h-385v180h329q75 0 104 30.5t29 107.5v247h180v-272zM358 800q0 -46 -34 -78.5t-82 -32.5t-88 31q-38 31 -38 80q0 99 121 99t121 -99zM704 800q0 -46 -35 -78t-83 -32l-2 -1q-46 0 -84 31t-39 80v2q0 97 121.5 97t121.5 -99zM529 1054 | |||||
q0 -48 -34 -79t-84 -31t-88 30t-38 80q0 100 122 100t122 -100z" /> | |||||
<glyph glyph-name="uFE9C" unicode="ث" horiz-adv-x="739" arabic-form="medial" | |||||
d="M778 0h-63q-53 0 -102 9q-46 19 -93 61q-86 -70 -171 -70h-388v180h334q75 0 104 30.5t29 107.5v247h181v-247q0 -89 36.5 -113.5t132.5 -24.5v-180zM428 800q0 -46 -34 -78.5t-82.5 -32.5t-87 31t-38.5 80q0 99 121 99t121 -99zM774 800q0 -46 -34.5 -78.5t-83 -32.5 | |||||
t-87 31t-38.5 80q0 99 121.5 99t121.5 -99zM599 1054q0 -48 -34 -79t-84 -31t-88 30t-38 80q0 100 122 100t122 -100z" /> | |||||
<glyph glyph-name="u062C" unicode="ج" horiz-adv-x="1104" arabic-form="isolated" | |||||
d="M815 -336q0 -53 -35.5 -90t-91.5 -37t-95 33t-39 90q0 112 130 112t131 -108zM43 -310v6q0 296 263 442l550 303q-40 75 -118 88t-479 14l-23 176h435q376 0 377 -371l-593 -332q-241 -135 -241 -334q0 -145 114 -259t260 -114h525l16 -177h-494q-253 0 -422.5 155.5 | |||||
t-169.5 402.5z" /> | |||||
<glyph glyph-name="uFE9E" unicode="ج" horiz-adv-x="1104" arabic-form="final" | |||||
d="M350 547h-19c-22 0 -43 -1 -65 -2l-22 174h434c126 0 215 -26 282 -93c62 -61 97 -149 97 -236c0 -14 -1 -28 -3 -42l-164 -93c34 -69 122 -75 221 -75h38v-180c-135 0 -273 25 -311 126c-10 27 -15 57 -24 85l-353 -195c-116 -64 -240 -166 -240 -338 | |||||
c0 -110 54 -198 114 -256c64 -63 138 -113 260 -113h525l15 -177h-492c-181 0 -322 64 -423 156c-97 88 -170 223 -170 395v13c3 146 62 287 150 366c34 31 74 54 114 76l551 303c-71 90 -204 106 -357 110h-17c-47 0 -94 -4 -141 -4zM691 -220c77 0 133 -33 133 -106 | |||||
c0 -74 -60 -127 -131 -127c-74 0 -133 50 -133 122c0 75 56 111 131 111z" /> | |||||
<glyph glyph-name="uFE9F" unicode="ج" horiz-adv-x="1031" arabic-form="initial" | |||||
d="M349 -323q0 -52 -35.5 -89t-91 -37t-95 33t-39.5 90q0 112 130.5 112t130.5 -109zM996 348l-412 -235q-145 -83 -304 -103q-79 -10 -323 -10v180q349 0 493 68q70 32 350 191q-35 74 -116 94q-35 8 -159 8l-315 2l-25 176h444q367 0 367 -371z" /> | |||||
<glyph glyph-name="uFEA0" unicode="ج" horiz-adv-x="1031" arabic-form="medial" | |||||
d="M519 -334q-1 -50 -37 -88t-90 -38t-94 33t-40 89q0 110 130 110t131 -106zM1059 0q-254 6 -281 118q-12 45 -23 93q-259 -155 -371 -183t-427 -28v180q348 0 493 68q30 13 350 191q-35 73 -116 94q-33 8 -159 8l-315 2l-25 176h444q367 0 367 -371l-167 -92 | |||||
q0 -76 230 -76v-180z" /> | |||||
<glyph glyph-name="u0686" unicode="چ" horiz-adv-x="1104" arabic-form="isolated" | |||||
d="M834 -478q0 -97 -120 -97t-121 97q0 110 112 110q53 0 91 -30t38 -80zM544 -113h6q45 0 82.5 -29.5t38.5 -80.5q-1 -95 -121 -95t-120 95q0 48 32 79t82 31zM39 -310v6q0 297 262 442l550 303q-39 75 -117 88t-479 14l-22 176h433q376 0 377 -371l-593 -332 | |||||
q-240 -134 -240 -334q0 -146 113.5 -259.5t260.5 -113.5h525l15 -177h-493q-253 0 -422.5 155.5t-169.5 402.5zM892 -113h6q45 0 82.5 -29.5t38.5 -80.5q-1 -95 -121 -95t-120 95q0 48 32 79t82 31z" /> | |||||
<glyph glyph-name="uFB7B" unicode="چ" horiz-adv-x="1104" arabic-form="final" | |||||
d="M826 -478q0 -97 -120 -97t-120 97q0 110 112 110q51 0 89.5 -29.5t38.5 -80.5zM665 -223q0 -95 -120.5 -95t-120.5 95q0 48 32 79t82 31t88.5 -29.5t38.5 -80.5zM519 551q-82 0 -241 -6l-23 174h434q376 0 376 -371l-164 -93q23 -55 114 -70q30 -5 145 -5v-180 | |||||
q-163 5 -230 42t-81 84q-10 33 -24 85l-352 -195q-240 -133 -240 -334q0 -146 113.5 -259.5t259.5 -113.5h525l15 -177h-492q-253 0 -423 156.5t-170 407.5q0 296 264 442l551 303q-71 110 -357 110zM1011 -223q0 -95 -120.5 -95t-120.5 95q0 48 33 79t82.5 31t87.5 -29.5 | |||||
t38 -80.5zM278 543l-14 1q14 0 14 -1z" /> | |||||
<glyph glyph-name="uFB7C" unicode="چ" horiz-adv-x="1031" arabic-form="initial" | |||||
d="M503 -568q0 -97 -121 -97t-121 97q0 110 113 110q51 0 90 -29.5t39 -80.5zM339 -314q0 -94 -120.5 -94t-120.5 94q0 48 32 79.5t82.5 31.5t88.5 -29.5t38 -81.5zM683 -314q0 -94 -120 -94t-120 94q0 48 32 79.5t80 31.5q128 0 128 -111zM996 348l-412 -235 | |||||
q-145 -83 -304 -103q-79 -10 -323 -10v180q349 0 493 68q70 32 350 191q-35 74 -116 94q-35 8 -159 8l-315 2l-25 176h444q367 0 367 -371z" /> | |||||
<glyph glyph-name="uFB7D" unicode="چ" horiz-adv-x="1031" arabic-form="medial" | |||||
d="M525 -568q-1 -98 -121 -98t-120 98q0 108 120 108t121 -108zM360 -314q0 -96 -120 -96t-120 96q0 45 34 77t80 32q126 0 126 -109zM705 -314q-1 -96 -121 -96t-120 96q0 45 34 77t83 32t86.5 -29t37.5 -80zM1059 0q-254 6 -281 118q-12 45 -23 93q-259 -155 -371 -183 | |||||
t-427 -28v180q348 0 493 68q30 13 350 191q-35 73 -116 94q-33 8 -159 8l-315 2l-25 176h444q367 0 367 -371l-167 -92q0 -76 230 -76v-180z" /> | |||||
<glyph glyph-name="u062D" unicode="ح" horiz-adv-x="1104" arabic-form="isolated" | |||||
d="M1131 -868h-493q-288 0 -460 203q-133 155 -133 351v39q1 4 5 39q28 247 259 374l551 303q-61 109 -344 109h-56l-196 -4l-25 173h435q370 0 376 -371l-592 -332q-242 -136 -242 -334q0 -143 115 -258t259 -115h525z" /> | |||||
<glyph glyph-name="uFEA2" unicode="ح" horiz-adv-x="1104" arabic-form="final" | |||||
d="M1151 0q-272 0 -311 126q-8 25 -25 85l-351 -195q-241 -134 -241 -334q0 -145 114.5 -259t260.5 -114h525l15 -177h-494q-286 0 -459 203q-134 157 -134 351v39q1 1 5 39q31 249 259 374l555 303q-38 71 -106 85t-494 17l-25 176h435q370 0 376 -371l-163 -93 | |||||
q11 -75 258 -75v-180z" /> | |||||
<glyph glyph-name="uFEA3" unicode="ح" horiz-adv-x="1031" arabic-form="initial" | |||||
d="M996 348l-412 -235q-138 -79 -304 -100q-68 -9 -323 -13v180h144q198 0 367 76q29 14 332 183q-29 67 -122 92q-24 6 -468 12l-25 176h444q365 0 367 -371z" /> | |||||
<glyph glyph-name="uFEA4" unicode="ح" horiz-adv-x="1031" arabic-form="medial" | |||||
d="M1059 0q-249 0 -281 118q-6 21 -13 50l-10 43q-243 -147 -363 -177t-435 -34v180h144q192 0 367 76q50 22 332 183q-30 69 -122 92q-23 6 -468 12l-25 176h444q361 0 367 -374l-167 -90q0 -75 230 -75v-180z" /> | |||||
<glyph glyph-name="u062E" unicode="خ" horiz-adv-x="1104" arabic-form="isolated" | |||||
d="M43 -310v6q0 296 263 442l550 303q-40 75 -118 88t-479 14l-23 176h435q376 0 377 -371l-593 -332q-241 -135 -241 -334q0 -145 114 -259t260 -114h525l16 -177h-494q-253 0 -422.5 155.5t-169.5 402.5zM495 1045v4q0 102 131.5 102t131.5 -106q0 -53 -36.5 -89.5 | |||||
t-88.5 -36.5q-138 0 -138 126z" /> | |||||
<glyph glyph-name="uFEA6" unicode="خ" horiz-adv-x="1104" arabic-form="final" | |||||
d="M508 551q-83 0 -242 -6l-22 174h434q376 0 376 -371l-164 -93q22 -55 114 -70q30 -5 145 -5v-180q-164 5 -231 42t-80 84q-10 33 -24 85l-353 -195q-240 -133 -240 -334q0 -146 114 -259.5t260 -113.5h525l15 -177h-492q-254 0 -423.5 156.5t-169.5 407.5q0 296 264 442 | |||||
l551 303q-71 110 -357 110z" /> | |||||
<glyph glyph-name="uFEA7" unicode="خ" horiz-adv-x="1031" arabic-form="initial" | |||||
d="M996 348l-412 -235q-145 -83 -304 -103q-79 -10 -323 -10v180q349 0 493 68q70 32 350 191q-35 74 -116 94q-35 8 -159 8l-315 2l-25 176h444q367 0 367 -371zM649 1041q0 -51 -37 -88t-88 -37q-136 0 -136 125q0 108 130.5 108t130.5 -108z" /> | |||||
<glyph glyph-name="uFEA8" unicode="خ" horiz-adv-x="1031" arabic-form="medial" | |||||
d="M1059 0q-254 6 -281 118q-12 45 -23 93q-259 -155 -371 -183t-427 -28v180q348 0 493 68q30 13 350 191q-35 73 -116 94q-33 8 -159 8l-315 2l-25 176h444q367 0 367 -371l-167 -92q0 -76 230 -76v-180zM609 1070v-3q0.0270386 -1.37842 0.0270386 -2.74585 | |||||
q0 -49.2272 -35.027 -84.2542q-36 -36 -92 -36t-94.5 34.5t-38.5 91.5q0 106 130 106t130 -106z" /> | |||||
<glyph glyph-name="u062F" unicode="د" horiz-adv-x="986" arabic-form="isolated" | |||||
d="M860 439q84 -89 84 -200.5t-78 -175t-188 -63.5h-558l-25 180h571q100 0 100 70q0 36 -27 65l-405 431l121 122z" /> | |||||
<glyph glyph-name="uFEAA" unicode="د" horiz-adv-x="1171" arabic-form="final" | |||||
d="M1225 0h-82q-102 0 -228 124q-81 -124 -239 -124h-558l-25 180h572q99 0 99 68q0 38 -28 67l-405 431l122 122l541 -573q70 -75 106 -95t125 -20v-180z" /> | |||||
<glyph glyph-name="u0630" unicode="ذ" horiz-adv-x="986" arabic-form="isolated" | |||||
d="M859 439q82 -87 82 -199t-75 -176t-190 -64h-558l-25 180h572q99 0 99 70q0 36 -28 65l-405 431l122 122zM590 1169q0 -53 -36 -89.5t-89 -36.5q-136 0 -136 126q0 106 130.5 106t130.5 -106z" /> | |||||
<glyph glyph-name="uFEAC" unicode="ذ" horiz-adv-x="1171" arabic-form="final" | |||||
d="M1224 0h-84q-101 0 -225 124q-50 -72 -100.5 -98t-138.5 -26h-561l-25 180h573q98 0 98 68q0 39 -26 67l-406 431l121 122l541 -573q67 -71 105 -93t128 -22v-180zM475 1076q0 -51 -36.5 -87t-88.5 -36q-136 0 -136 123q0 109 130 109t131 -109z" /> | |||||
<glyph glyph-name="u0631" unicode="ر" horiz-adv-x="870" arabic-form="isolated" | |||||
d="M764 31q0 -199 -125.5 -342.5t-321.5 -143.5h-243l-29 185h203q130 0 230 67t101 192v576h185v-534z" /> | |||||
<glyph glyph-name="uFEAE" unicode="ر" horiz-adv-x="915" arabic-form="final" | |||||
d="M753 85v-8q0 -222 -117.5 -377t-337.5 -155h-233l-29 180h248q116 1 201 75t85 189v576h180v-259q0 -122 196 -126v-180q-136 0 -193 85z" /> | |||||
<glyph glyph-name="u0632" unicode="ز" horiz-adv-x="870" arabic-form="isolated" | |||||
d="M761 31q0 -198 -127 -342t-323 -144h-238l-30 185h202q131 0 231 67t100 192v576h185v-534zM491 1054v4q0 105 131.5 105t131.5 -109q0 -53 -36 -89.5t-89 -36.5q-138 0 -138 126z" /> | |||||
<glyph glyph-name="uFEB0" unicode="ز" horiz-adv-x="915" arabic-form="final" | |||||
d="M753 85v-8q0 -222 -117.5 -377t-337.5 -155h-233l-29 180h248q112 1 199 77t87 187v576h180v-259q0 -126 196 -126v-180q-142 2 -193 85zM481 1045v4q0 102 131.5 102t131.5 -106q0 -53 -36 -89.5t-89 -36.5q-138 0 -138 126z" /> | |||||
<glyph glyph-name="u0698" unicode="ژ" horiz-adv-x="922" arabic-form="isolated" | |||||
d="M766 31q0 -199 -127 -342.5t-324 -143.5h-239l-28 185h202q130 0 230.5 67t100.5 192v576h185v-534zM604 800q0 -47 -33 -79t-81.5 -32t-87.5 31t-39 80q0 96 120.5 96t120.5 -96zM954 800q0 -48 -33.5 -79.5t-83.5 -31.5t-88.5 30.5t-38.5 80.5q0 96 122 96t122 -96z | |||||
M747 977q-33 -33 -83.5 -33t-89 29.5t-38.5 80.5q0 97 122 97t122 -92q0 -49 -33 -82z" /> | |||||
<glyph glyph-name="uFB8B" unicode="ژ" horiz-adv-x="915" arabic-form="final" | |||||
d="M753 85v-8q0 -222 -117.5 -377t-337.5 -155h-233l-29 180h248q112 1 199 77t87 187v576h180v-259q0 -126 196 -126v-180q-142 2 -193 85zM573 808v-4q-1 -46 -35 -78t-82 -32t-85 30.5t-37 79.5q0 97 119.5 97t119.5 -93zM920 804q0 -48 -34 -79t-82 -31t-86 31t-39 79 | |||||
q1 97 121 97t120 -97zM744 1059q0 -48 -33.5 -79t-82.5 -31t-87 31t-38 79q1 97 121 97t120 -97z" /> | |||||
<glyph glyph-name="u0633" unicode="س" horiz-adv-x="2253" arabic-form="isolated" | |||||
d="M2163 289q-1 -127 -63 -217t-184 -90t-251 122q-87 -122 -212 -122q-98 0 -203 72q0 -215 -118 -362t-328 -147h-274q-195 0 -320 135t-125 331v374h176v-385q0 -124 81.5 -199.5t207.5 -75.5h234q126 0 205 76t79 202v562h180v-267q0 -62 46.5 -103t109.5 -41 | |||||
q124 0 124 112v299h177v-265q0 -62 45.5 -104t108.5 -42q126 0 126 112v299h178v-276z" /> | |||||
<glyph glyph-name="uFEB2" unicode="س" horiz-adv-x="2298" arabic-form="final" | |||||
d="M2334 0q-105 2 -141 13q-69 18 -109 83q-80 -114 -218 -114t-243 122q-97 -127 -229 -127q-95 0 -180 77q0 -212 -120 -360t-325 -149h-280q-194 0 -319 135t-125 331v374h180v-382q0 -123 81.5 -200.5t204.5 -77.5h235q126 0 207 76t81 202v562h180v-267q0 -64 45 -104 | |||||
t109 -40q121 0 121 112v299h180v-265q0 -62 45.5 -104t108.5 -42q123 0 123 112v299h178v-276q0 -62 66 -93q19 -8 144 -16v-180z" /> | |||||
<glyph glyph-name="uFEB3" unicode="س" horiz-adv-x="1455" arabic-form="initial" | |||||
d="M1390 289q0 -133 -64 -221t-193 -88t-245 121q-103 -119 -222 -119t-242 142q-108 -124 -235 -124h-229v180h216q125 0 125 134v251h177v-265q0 -64 46 -105t111 -41q123 0 123 112v299h175v-265q0 -63 45.5 -104.5t109.5 -41.5q126 0 126 112v299h176v-276z" /> | |||||
<glyph glyph-name="uFEB4" unicode="س" horiz-adv-x="1561" arabic-form="medial" | |||||
d="M1589 0q-105 2 -140 13q-70 19 -106 83q-83 -116 -209 -116t-246 119q-104 -119 -256 -119t-247 126q-59 -77 -201 -97q-63 -9 -234 -9v180h151q99 0 144 29t45 127v229h176v-267q0 -63 46 -103.5t109 -40.5q123 0 123 112v299h177v-268q0 -60 45.5 -101.5t109.5 -41.5 | |||||
q125 0 125 112v299h178v-276q0 -63 65 -93q19 -9 145 -16v-180z" /> | |||||
<glyph glyph-name="u0634" unicode="ش" horiz-adv-x="2253" arabic-form="isolated" | |||||
d="M2163 289q-1 -127 -63 -217t-188 -90t-247 122q-97 -122 -201 -122t-214 72q-3 -212 -122 -360t-324 -149h-274q-192 0 -318 136t-127 330v374h176v-382q1 -127 80.5 -202.5t205.5 -75.5h237q123 0 203.5 77.5t80.5 200.5v562h180v-267q0 -62 46.5 -103t109.5 -41 | |||||
q124 0 124 112v299h177v-265q0 -64 44.5 -105t109.5 -41q126 0 126 112v299h178v-276zM1311 798v4q0 97 119.5 97t119.5 -99q0 -45 -34 -77t-82 -32t-85.5 29.5t-37.5 77.5zM1896 800q0 -46 -34 -77.5t-82 -31.5t-86 30t-38 79q0 99 120 99t120 -99zM1721 1054 | |||||
q0 -47 -34.5 -77.5t-82.5 -30.5t-86 30t-38 78q0 100 120 100t121 -100z" /> | |||||
<glyph glyph-name="uFEB6" unicode="ش" horiz-adv-x="2298" arabic-form="final" | |||||
d="M2328 0h-64q-125 0 -189 99q-81 -115 -223 -115t-237 122q-96 -126 -225 -126q-98 0 -182 74q-3 -212 -122 -360.5t-325 -148.5h-278q-192 0 -318 136.5t-126 329.5v374h180v-382q0 -126 80 -202t206 -76h234q123 0 206 77.5t83 200.5v562h180v-267q0 -62 43 -103 | |||||
t105 -41q127 0 127 112v299h180v-265q0 -65 44 -105.5t109 -40.5q124 0 124 112v299h178v-276q0 -109 210 -109v-180zM1508 795q0 -45 -34.5 -76t-83 -31t-86.5 28.5t-38 78.5q0 100 121 100t121 -100zM1856 795q0 -46 -34 -76.5t-83.5 -30.5t-87.5 28.5t-38 78.5 | |||||
q0 100 121.5 100t121.5 -100zM1649 974.5q-34 -33.5 -84 -33.5t-87.5 29t-37.5 80q0 99 121 99q45 0 83.5 -25.5t38.5 -70.5t-34 -78.5z" /> | |||||
<glyph glyph-name="uFEB7" unicode="ش" horiz-adv-x="1455" arabic-form="initial" | |||||
d="M1390 289q0 -131 -64 -219t-198 -88t-238 122q-104 -120 -226 -120t-238 142q-121 -126 -237 -126h-229v180h216q125 0 125 131v253l177 1v-265q0 -65 44 -105.5t109 -40.5q127 0 127 112v299h175v-265q0 -64 45 -105t110 -41q126 0 126 112v299h176v-276zM761 800 | |||||
q0 -46 -33.5 -78.5t-81.5 -32.5t-85.5 31t-37.5 80q0 96 119 96t119 -96zM1109 800q0 -48 -33.5 -79.5t-82.5 -31.5t-87 31t-38 80q0 96 120 96t121 -96zM933 1054q-1 -48 -35 -79t-82 -31t-86 31t-39 79q0 97 121 97t121 -97z" /> | |||||
<glyph glyph-name="uFEB8" unicode="ش" horiz-adv-x="1561" arabic-form="medial" | |||||
d="M1589 0h-69l-65 11q-73 13 -116 88q-83 -117 -208 -117t-246 122q-108 -122 -256 -122t-244 127q-69 -78 -202 -99q-63 -10 -233 -10v180h165q93 0 124 23q51 37 51 133v229h176v-267q0 -64 45.5 -104t109.5 -40q123 0 123 112v299h177v-265q0 -64 45.5 -105t109.5 -41 | |||||
q125 0 125 112v299h178v-276q0 -109 210 -109v-180zM716 851q0 -46 -33.5 -78t-82 -32t-87 30.5t-38.5 79.5q0 98 120.5 98t120.5 -98zM1065 851q0 -47 -33.5 -78.5t-83 -31.5t-87.5 30t-38 80q0 98 121 98t121 -98zM860 1028.5q-33 -33.5 -83.5 -33.5t-89 30.5t-38.5 80.5 | |||||
q0 97 121 97q46 0 84.5 -24.5t38.5 -70.5t-33 -79.5z" /> | |||||
<glyph glyph-name="u0635" unicode="ص" horiz-adv-x="2275" arabic-form="isolated" | |||||
d="M2050 346q0 54 -32 124t-78 71q-89 0 -194 -124t-157 -237h346q115 0 115 166zM2224 318q0 -147 -85.5 -232.5t-232.5 -85.5h-488q-154 0 -188 95q0 -219 -119 -384.5t-327 -165.5h-279q-194 1 -319 145t-125 341v354h180v-396q1 -101 89 -180t190 -79h250q106 0 192 77 | |||||
t86 182v576h185v-267q0 -114 168 -118q79 204 189 345q152 194 306 194t245 -134q14 -21 33 -55q6 -20 28 -82t22 -130z" /> | |||||
<glyph glyph-name="uFEBA" unicode="ص" horiz-adv-x="2253" arabic-form="final" | |||||
d="M1926 180q99 0 99 179.5t-107 179.5q-157 0 -339 -359h347zM2284 0h-818q-202 0 -241 95q0 -238 -112 -394t-340 -156h-278q-201 0 -317.5 140.5t-116.5 345.5v354h175v-396q0 -110 81 -187t192 -77h252q105 0 193.5 80t88.5 184v576h181v-267q0 -117 171 -118 | |||||
q214 541 495 541q184 0 278 -180q42 -81 42 -176.5t-27 -184.5h101v-180z" /> | |||||
<glyph glyph-name="uFEBB" unicode="ص" horiz-adv-x="1548" arabic-form="initial" | |||||
d="M1269 354q0 121 -55 166q-23 19 -54 19q-159 0 -345 -359h353q101 0 101 174zM1449 349q0 -76 -23 -158q-34 -123 -98 -157t-194 -34h-456q-187 0 -257 146q-107 -146 -243 -146h-218v180h200q126 0 126 134v251h178v-231q0 -153 174 -154q208 539 497 539q66 0 140 -41 | |||||
q174 -98 174 -329z" /> | |||||
<glyph glyph-name="uFEBC" unicode="ص" horiz-adv-x="1561" arabic-form="medial" | |||||
d="M1269 354q0 121 -55 166q-23 19 -54 19q-159 0 -345 -359h353q101 0 101 174zM1589 0h-911q-187 0 -257 146q-107 -146 -243 -146h-218v180h200q126 0 126 134v251h178v-231q0 -153 174 -154q208 539 497 539q72 0 143 -41q171 -100 171 -330q0 -69 -28 -168h168v-180z | |||||
" /> | |||||
<glyph glyph-name="u0636" unicode="ض" horiz-adv-x="2275" arabic-form="isolated" | |||||
d="M2053 340q0 60 -31.5 130.5t-81.5 70.5q-89 0 -195 -125.5t-156 -235.5h349q115 0 115 160zM1908 719q143 0 229.5 -125.5t86.5 -274.5t-85 -234t-233 -85h-488q-163 0 -188 95q-2 -217 -122 -383.5t-327 -166.5h-276q-196 0 -320 143.5t-124 342.5v354h180v-396 | |||||
q0 -103 87.5 -181t191.5 -78h250q99 0 188.5 80.5t89.5 178.5v576h185v-267q0 -118 171 -118q225 539 504 539zM1879 1053q0 -52 -37 -88.5t-88 -36.5q-136 0 -136 125q0 107 130.5 107t130.5 -107z" /> | |||||
<glyph glyph-name="uFEBE" unicode="ض" horiz-adv-x="2253" arabic-form="final" | |||||
d="M1924 180q99 0 99 179.5t-108 179.5q-87 0 -200 -139q-86 -106 -137 -220h346zM2283 0h-819q-213 0 -240 95q-4 -240 -106 -384q-118 -166 -348 -166h-276q-197 0 -316 143t-119 343v354h175v-396q0 -107 82.5 -185.5t189.5 -78.5h253q101 0 191.5 82t90.5 182v576h180 | |||||
v-267q0 -118 172 -118q222 541 495 541q70 0 146 -43q171 -99 171 -333q0 -86 -26 -165h104v-180zM1863 1039q0 -52 -37 -88t-88 -36q-137 0 -137 124q0 107 131 107t131 -107z" /> | |||||
<glyph glyph-name="uFEBF" unicode="ض" horiz-adv-x="1548" arabic-form="initial" | |||||
d="M1162 539h-2q-90 0 -204 -138q-86 -104 -141 -221h350q101 0 101 179.5t-104 179.5zM1449 351q0 -79 -23 -160q-33 -121 -106 -161q-55 -30 -186 -30h-456q-180 0 -259 146q-105 -146 -243 -146h-216v180h200q126 0 126 131v253l178 1v-231q0 -154 176 -154 | |||||
q222 539 498 539q71 0 140 -41q171 -103 171 -327zM1023 1068v-4q0 -52 -37 -88.5t-88 -36.5q-134 0 -134 125q0 107 129.5 107t129.5 -103z" /> | |||||
<glyph glyph-name="uFEC0" unicode="ض" horiz-adv-x="1561" arabic-form="medial" | |||||
d="M1162 539h-2q-90 0 -204 -138q-86 -104 -141 -221h350q101 0 101 179.5t-104 179.5zM1589 0h-911q-180 0 -259 146q-105 -146 -243 -146h-216v180h200q126 0 126 131v253l178 1v-231q0 -154 176 -154q222 539 498 539q72 0 140 -41q168 -104 168 -330q0 -85 -27 -168h170 | |||||
v-180zM1028 1068q0 -52 -37.5 -88t-89.5 -36q-135 0 -135 124q0 108 131 108t131 -108z" /> | |||||
<glyph glyph-name="u0637" unicode="ط" horiz-adv-x="1054" arabic-form="isolated" | |||||
d="M809 369q0 170 -109 170q-89 0 -202 -139q-84 -102 -139 -220h346q44 0 74 48t30 141zM371 511q172 208 311 208t225.5 -126.5t86.5 -266.5t-78.5 -233t-210.5 -93h-624l-36 180h151v974h175v-643z" /> | |||||
<glyph glyph-name="uFEC2" unicode="ط" horiz-adv-x="1043" arabic-form="final" | |||||
d="M809 369q0 170 -109 170q-89 0 -202 -139q-84 -102 -139 -220h346q44 0 74 48t30 141zM1061 0h-985l-36 180h154v974h176v-643q171 208 313 208q57 0 132 -41q174 -97 174 -367q0 -58 -25 -131h97v-180z" /> | |||||
<glyph glyph-name="uFEC3" unicode="ط" horiz-adv-x="986" arabic-form="initial" | |||||
d="M621 536q-87 0 -191 -123t-151 -235h350q104 0 104 163q0 195 -112 195zM629 0h-665v180h154v974h180v-643q172 205 310 205t224 -117t86 -263t-74 -241t-215 -95z" /> | |||||
<glyph glyph-name="uFEC4" unicode="ط" horiz-adv-x="949" arabic-form="medial" | |||||
d="M696 369q0 170 -108 170q-89 0 -203 -139q-85 -104 -140 -220h348q43 0 73 48t30 141zM966 0h-1016v180h131v974h175v-643q172 208 314 208q58 0 133 -41q168 -94 168 -338q0 -95 -23 -160h118v-180z" /> | |||||
<glyph glyph-name="u0638" unicode="ظ" horiz-adv-x="1054" arabic-form="isolated" | |||||
d="M703 180q103 0 103 179.5t-107 179.5q-89 0 -192 -123.5t-151 -235.5h347zM703 0h-624l-36 180h151v974h176v-643q166 208 305.5 208t227.5 -121.5t88 -263t-74.5 -238t-213.5 -96.5zM838 1054q0 -53 -36 -89.5t-88 -36.5q-138 0 -138 126q0 109 131 109t131 -109z" /> | |||||
<glyph glyph-name="uFEC6" unicode="ظ" horiz-adv-x="1043" arabic-form="final" | |||||
d="M703 180q103 0 103 179.5t-107 179.5q-89 0 -192 -123.5t-151 -235.5h347zM1061 0h-987l-34 180h154v974h176v-643q166 208 310 208q64 0 134 -41q175 -104 175 -304q0 -118 -26 -194h98v-180zM829 1053q0 -52 -37 -88.5t-88 -36.5q-134 0 -134 125q0 107 129.5 107 | |||||
t129.5 -107z" /> | |||||
<glyph glyph-name="uFEC7" unicode="ظ" horiz-adv-x="986" arabic-form="initial" | |||||
d="M621 536q-87 0 -191 -123t-151 -235h350q104 0 104 163q0 195 -112 195zM629 0h-665v180h154v974h180v-643q172 205 310 205t224 -117t86 -263t-74 -241t-215 -95zM744 1036q0 -53 -36 -89.5t-89 -36.5q-136 0 -136 126q1 107 131 107t130 -107z" /> | |||||
<glyph glyph-name="uFEC8" unicode="ظ" horiz-adv-x="949" arabic-form="medial" | |||||
d="M590 180q104 0 104 179.5t-108 179.5q-88 0 -203 -138q-92 -109 -139 -221h346zM966 0h-1017l1 180h131v974h175v-643q166 208 312 208q66 0 132 -41q171 -108 171 -302q0 -117 -26 -196h121v-180zM753 1068q0 -53 -36.5 -90t-88.5 -37q-137 0 -137 127q0 106 131 106 | |||||
t131 -106z" /> | |||||
<glyph glyph-name="u0639" unicode="ع" horiz-adv-x="1090" arabic-form="isolated" | |||||
d="M663 719h7q144 0 305 -135l-85 -138q-153 104 -250 104t-124 -97q-1 -3 -4.5 -16.5t-6.5 -23.5v-30q0 -73 40 -138t109 -65h357l25 -180h-595q-122 0 -187 -95t-65 -241t100 -250.5t264 -104.5h488l24 -177h-472q-247 0 -417 154t-170 399q0 342 379 509q-59 107 -59 216 | |||||
q0 150 99.5 229.5t237.5 79.5z" /> | |||||
<glyph glyph-name="uFECA" unicode="ع" horiz-adv-x="1115" arabic-form="final" | |||||
d="M860 491q0 25 -30 39t-57 15h-284l199 -209q172 95 172 155zM1026 588q17 -42 17 -58v-18q0 -103 -55.5 -168.5t-173.5 -129.5q80 -34 340 -34v-180q-184 0 -266 15q-152 27 -233 118q-432 -183 -432 -456q0 -138 115 -253t250 -115h525l18 -177h-496q-240 0 -412 163 | |||||
t-172 402q0 357 472 559l-239 235q58 104 121 228h384q185 0 237 -131z" /> | |||||
<glyph glyph-name="uFECB" unicode="ع" horiz-adv-x="904" arabic-form="initial" | |||||
d="M865 0h-905v180h256q-56 129 -56 231t59.5 182t141.5 103t165 23q144 0 277 -133l-89 -140q-142 108 -241 108q-142 0 -142 -173q0 -75 38 -138t109 -63h358z" /> | |||||
<glyph glyph-name="uFECC" unicode="ع" horiz-adv-x="831" arabic-form="medial" | |||||
d="M586 489q0 24 -28 40t-55 16h-287l197 -207q173 88 173 151zM860 0q-168 0 -248 20t-191 111q-113 -93 -225 -120q-26 -6 -239 -11v180q251 0 316 65l-250 246q58 104 121 228h386q185 0 235 -130q16 -43 16 -69q0 -110 -61 -181q-39 -45 -155 -118q107 -41 295 -41v-180 | |||||
z" /> | |||||
<glyph glyph-name="u063A" unicode="غ" horiz-adv-x="1090" arabic-form="isolated" | |||||
d="M1064 -868h-471q-243 0 -415 156t-172 397q0 340 379 509q-61 113 -61 202q0 146 90 236t244 90h2q156 0 314 -138l-86 -138q-147 104 -244 104q-141 0 -141 -162q0 -80 37 -144t111 -64h358l25 -180h-595q-121 0 -186 -96t-65 -222q0 -166 98 -269.5t264 -103.5h489z | |||||
M826 1050q0 -53 -36 -89.5t-89 -36.5q-136 0 -136 126q1 108 131 108t130 -108z" /> | |||||
<glyph glyph-name="uFECE" unicode="غ" horiz-adv-x="1115" arabic-form="final" | |||||
d="M860 494l-9 22q-31 29 -78 29h-284l199 -207q172 91 172 156zM51 -315v6q0 379 472 565l-239 235q58 104 121 228h384q192 0 240 -131q14 -38 14 -67t-9 -91q-14 -98 -219 -216q89 -34 341 -34l-2 -180l-163 5q-227 8 -337 128q-433 -193 -433 -456q0 -141 112 -254.5 | |||||
t253 -113.5h527l18 -177h-496q-241 0 -412.5 159.5t-171.5 393.5zM838 1045q0 -53 -36 -89.5t-88 -36.5q-138 0 -138 126q0 106 131 106t131 -106z" /> | |||||
<glyph glyph-name="uFECF" unicode="غ" horiz-adv-x="904" arabic-form="initial" | |||||
d="M865 0h-905v180h256q-58 117 -58 221q0 144 92 232t252 88t301 -135l-89 -140q-148 108 -239 108q-144 0 -144 -169q0 -77 37 -141t110 -64h358zM599 1041q0 -51 -37 -88t-88 -37q-136 0 -136 125q0 108 130 108t131 -108z" /> | |||||
<glyph glyph-name="uFED0" unicode="غ" horiz-adv-x="831" arabic-form="medial" | |||||
d="M586 489l-10 27q-10 29 -73 29h-287l197 -207q173 90 173 151zM860 0h-13q-145 0 -233 22t-195 109q-143 -119 -276 -128q-34 -3 -82 -3h-106l2 180q254 5 316 65q-161 163 -250 246q66 115 120 228h387q190 0 240 -130q16 -43 16 -64.5t-8 -94.5q-12 -94 -210 -209 | |||||
q114 -41 292 -41v-180zM503 1068q0 -52 -37 -88t-88 -36q-134 0 -134 124q0 108 129.5 108t129.5 -108z" /> | |||||
<glyph glyph-name="u0641" unicode="ف" horiz-adv-x="1606" arabic-form="isolated" | |||||
d="M1359 483q0 87 -46 147t-129 60q-131 0 -131 -117q0 -88 138 -89q42 0 168 -1zM899 586v6q0 129 87.5 202.5t226.5 73.5t227 -98t92 -242t4 -213q0 -129 -76 -222t-202 -93h-938q-116 0 -186 87t-71 206v272h181v-247q0 -77 28.5 -107.5t103.5 -30.5h860q82 0 103 31 | |||||
q10 15 24 104q-254 0 -318 23q-146 51 -146 248zM1334 1076q0 -51 -37.5 -87t-88.5 -36q-135 0 -135 123q1 109 131 109t130 -109z" /> | |||||
<glyph glyph-name="uFED2" unicode="ف" horiz-adv-x="1618" arabic-form="final" | |||||
d="M1370 385q0 66 -43.5 113t-103.5 47t-102 -40.5t-42 -94.5q0 -105 182 -191q109 67 109 166zM1230 719h6q138 -1 218 -97t80 -222t-65 -220h174v-180q-314 0 -388 40q-25 -37 -342 -37q-45 -1 -300 -2l-299 -1q-108 0 -174 90t-66 203v272h181v-247q0 -138 133 -138h623 | |||||
q-101 112 -101 246t93.5 213.5t226.5 79.5zM1359 1054q0 -53 -36 -89.5t-89 -36.5q-136 0 -136 126q0 106 130 106t131 -106z" /> | |||||
<glyph glyph-name="uFED3" unicode="ف" horiz-adv-x="915" arabic-form="initial" | |||||
d="M599 484q-7 199 -169 199q-119 0 -119 -95q0 -76 45 -94q19 -8 112 -9zM800 284v-14q0 -106 -87 -188t-204 -82h-540v180h542q99 0 99 134q-140 1 -317 17q-149 55 -149 245q0 131 82 211.5t201 80.5t208 -57q143 -90 154 -302zM573 1098q0 -52 -37.5 -88.5t-89.5 -36.5 | |||||
q-132 0 -132 125q0 107 129.5 107t129.5 -107z" /> | |||||
<glyph glyph-name="uFED4" unicode="ف" horiz-adv-x="856" arabic-form="medial" | |||||
d="M564 385q0 60 -44 110t-104 50t-101.5 -39.5t-41.5 -97.5q0 -111 182 -189q109 81 109 166zM904 0q-20 4 -106 5l-178 3q-93 1 -171 40q-83 -48 -512 -48v180h266q-99 111 -99 245t90 214t227 80l2 -1q139 0 222 -92t83 -222t-65 -224h241v-180zM556 1041 | |||||
q0 -51 -36.5 -88t-88.5 -37q-133 0 -133 125q0 108 129 108t129 -108z" /> | |||||
<glyph glyph-name="u0642" unicode="ق" horiz-adv-x="1339" arabic-form="isolated" | |||||
d="M1079 165v3q0 83 -47.5 142.5t-130.5 59.5q-126 0 -126 -102q0 -108 169 -108q91 0 135 5zM1253 35q0 -39 -9 -143q-14 -164 -141.5 -267.5t-293.5 -103.5h-275q-200 0 -319 135t-119 338v359h170v-366q0 -125 77.5 -211t201.5 -86h250q127 0 205 90t81 219 | |||||
q-254 0 -320 22q-146 50 -146 247q0 130 86 204t228 74t233 -100t91 -253v-158zM849 741q0 -47 -33.5 -76t-80.5 -29q-126 0 -126 105q0 100 120 100t120 -100zM1196 741q0 -47 -33 -76t-80 -29q-128 0 -128 105q1 100 121 100t120 -100z" /> | |||||
<glyph glyph-name="uFED6" unicode="ق" horiz-adv-x="1350" arabic-form="final" | |||||
d="M1061 180q0 86 -52.5 143.5t-138.5 57.5q-124 0 -124 -91q0 -70 60 -96q32 -14 255 -14zM1385 0h-149q0 -189 -133.5 -322t-322.5 -133h-283q-180 0 -303.5 139.5t-123.5 324.5v376h180v-396q0 -103 95 -181t191 -78h234q116 0 196.5 77t89.5 193q-258 0 -326 25 | |||||
q-160 59 -160 259q0 131 94 206t241.5 75t240.5 -111t95 -274h144v-180zM809 773q0 -47 -33.5 -77t-80.5 -30q-127 0 -127 107q0 98 120 98t121 -98zM1156 773q0 -47 -33.5 -77t-79.5 -30q-128 0 -128 107q1 98 121 98t120 -98z" /> | |||||
<glyph glyph-name="uFED7" unicode="ق" horiz-adv-x="915" arabic-form="initial" | |||||
d="M599 484q-7 199 -169 199q-119 0 -119 -95q0 -76 45 -94q19 -8 112 -9zM800 284v-14q0 -106 -87 -188t-204 -82h-540v180h542q99 0 99 134q-140 1 -317 17q-149 55 -149 245q0 131 82 211.5t201 80.5t208 -57q143 -90 154 -302zM388 1061q0 -46 -33.5 -76t-80.5 -30 | |||||
q-125 0 -125 106q0 99 119.5 99t119.5 -99zM733 1061q0 -46 -33.5 -76t-80.5 -30q-125 0 -125 106q0 99 119.5 99t119.5 -99z" /> | |||||
<glyph glyph-name="uFED8" unicode="ق" horiz-adv-x="856" arabic-form="medial" | |||||
d="M564 385q0 60 -44 110t-104 50t-101.5 -39.5t-41.5 -97.5q0 -111 182 -189q109 81 109 166zM904 0q-20 4 -106 5l-178 3q-93 1 -171 40q-83 -48 -512 -48v180h266q-99 111 -99 245t90 214t227 80l2 -1q139 0 222 -92t83 -222t-65 -224h241v-180zM348 1064 | |||||
q0 -47 -33.5 -76.5t-80.5 -29.5q-125 0 -125 106v2q0 97 119.5 97t119.5 -99zM691 1064q0 -47 -32.5 -76.5t-79.5 -29.5q-126 0 -126 106q0 99 119 99t119 -99z" /> | |||||
<glyph glyph-name="u0643" unicode="ك" horiz-adv-x="1606" arabic-form="isolated" | |||||
d="M1446 450q87 -91 87 -204.5t-82 -179.5t-196 -66h-926q-115 0 -185.5 88t-70.5 205v272h180v-247q0 -76 28.5 -107t103.5 -31h863q95 0 95 84q0 38 -29 67l-471 487l-25 205l656 236l24 -180l-473 -183z" /> | |||||
<glyph glyph-name="uFEDA" unicode="ک" horiz-adv-x="1760" arabic-form="final" | |||||
d="M1806 0q-202 0 -297 129q-48 -129 -231 -129h-944q-114 0 -186 88t-72 205v272h180v-247q0 -76 29.5 -107t104.5 -31h879q90 0 90 65q0 35 -44 81l-467 492l-34 202l664 239l25 -180l-469 -175l500 -555l129 -130q33 -34 143 -39v-180z" /> | |||||
<glyph glyph-name="uFEDB" unicode="ک" horiz-adv-x="843" arabic-form="initial" | |||||
d="M803 249v-4q0 -245 -275 -245h-562v180h562q71 0 71 84q0 39 -23 62l-467 492l-30 201l660 240l27 -180l-466 -175l369 -413q39 -45 86.5 -119t47.5 -123z" /> | |||||
<glyph glyph-name="uFEDC" unicode="ک" horiz-adv-x="1009" arabic-form="medial" | |||||
d="M1064 0q-230 0 -325 131q-53 -131 -248 -131h-534v180h537q71 0 71 93q0 32 -20 53l-469 492l-33 202l662 239l25 -180l-469 -175l497 -550q84 -94 144 -132t162 -42v-180z" /> | |||||
<glyph glyph-name="u06AF" unicode="گ" horiz-adv-x="1606" arabic-form="isolated" | |||||
d="M1466 441q89 -98 89 -209t-79.5 -171.5t-202.5 -60.5h-925q-114 0 -186 88t-72 205v272h180v-247q0 -78 30 -108t108 -30h876q34 0 63 24t29 53t-17 47l-499 514l-34 202l665 239l25 -180l-466 -178zM1446 1361l-628 -227l-9 69l632 227z" /> | |||||
<glyph glyph-name="uFB93" unicode="گ" horiz-adv-x="1760" arabic-form="final" | |||||
d="M1794 0q-203 0 -298 129q-47 -129 -232 -129h-944q-116 0 -186 87t-71 206v272h181v-247q0 -77 28.5 -107.5t103.5 -30.5h879q90 0 90 68q0 34 -42 78l-472 492l-31 202l664 239l25 -180l-469 -175l499 -555q0 -1 127 -130q33 -34 148 -39v-180zM1419 1361l-626 -227 | |||||
l-9 69l631 227z" /> | |||||
<glyph glyph-name="uFB94" unicode="گ" horiz-adv-x="856" arabic-form="initial" | |||||
d="M719 388q50 -56 50 -160t-84 -166t-202 -62h-526v180h526q103 0 103 68q0 37 -33 72l-479 498l-34 202l665 239l25 -180l-474 -180zM660 1361l-629 -227l-8 69l632 227z" /> | |||||
<glyph glyph-name="uFB95" unicode="گ" horiz-adv-x="1031" arabic-form="medial" | |||||
d="M1054 0q-222 0 -315 144q-61 -144 -228 -144h-536v180h539q92 0 92 68q0 34 -42 78l-471 492l-30 202l661 239l29 -180l-480 -180l502 -550q53 -59 158 -150q39 -19 75 -19h46v-180zM680 1361l-629 -227l-8 69l633 227z" /> | |||||
<glyph glyph-name="u0644" unicode="ل" horiz-adv-x="1361" arabic-form="isolated" | |||||
d="M1264 23q0 -204 -124 -341t-326 -137h-278q-178 0 -309.5 141.5t-131.5 322.5v376h180v-396q1 -111 91 -185t204 -74h233q109 0 195 76t86 183v1165h180v-1131z" /> | |||||
<glyph glyph-name="uFEDE" unicode="ل" horiz-adv-x="1408" arabic-form="final" | |||||
d="M1446 0q-145 0 -202 85q0 -226 -118 -383t-337 -157h-278q-185 1 -308.5 138.5t-123.5 322.5v379h176v-396q0 -116 86 -190t204 -74h233q117 0 200 74t83 190v1165h180v-848q0 -124 205 -126v-180z" /> | |||||
<glyph glyph-name="uFEDF" unicode="ل" horiz-adv-x="516" arabic-form="initial" | |||||
d="M388 275q0 -130 -77.5 -202.5t-209.5 -72.5h-137v180l123 -1q86 6 109 44q15 23 15 131v800h177v-879z" /> | |||||
<glyph glyph-name="uFEE0" unicode="ل" horiz-adv-x="598" arabic-form="medial" | |||||
d="M635 0h-54q-175 0 -261 70q-65 -54 -108 -62t-246 -8v180q54 -2 134 -2t104 40t24 136v800h180v-836q0 -98 58 -122q28 -11 169 -16v-180z" /> | |||||
<glyph glyph-name="u0645" unicode="م" horiz-adv-x="1149" arabic-form="isolated" | |||||
d="M778 176q132 0 132 151.5t-31 180.5t-250 35v-250q0 -52 47.5 -84.5t101.5 -32.5zM1086 295q0 -136 -91.5 -218t-229.5 -82t-224 93.5t-86 234.5v220q-31 2 -37 2q-70 0 -117.5 -55t-47.5 -125v-820h-177v798q0 173 92.5 274.5t264.5 101.5h365q180 0 245 -131 | |||||
q43 -89 43 -293z" /> | |||||
<glyph glyph-name="uFEE2" unicode="م" horiz-adv-x="1233" arabic-form="final" | |||||
d="M906 331q0 137 -34 173t-248 39v-253q0 -57 43 -89t102 -32q137 0 137 162zM1281 0q-113 0 -165 22t-107 109q-56 -142 -228 -142q-147 0 -239 93t-92 241v220q-82 0 -141 -49t-59 -129v-820h-176v798q0 175 90 275t264 101h365q288 0 288 -421q0 -116 200 -118v-180z | |||||
" /> | |||||
<glyph glyph-name="uFEE3" unicode="م" horiz-adv-x="843" arabic-form="initial" | |||||
d="M624 348.5q0 194.5 -156.5 194.5t-156.5 -194.5t156.5 -194.5t156.5 194.5zM474 719q150 0 228.5 -112.5t78.5 -268t-80.5 -259.5t-231.5 -104q-115 0 -203 68q-87 -38 -305 -43v180q153 0 179 30q8 10 11 138q9 371 323 371z" /> | |||||
<glyph glyph-name="uFEE4" unicode="م" horiz-adv-x="904" arabic-form="medial" | |||||
d="M458 154q152 0 152 194.5t-152 194.5q-158 0 -158 -194.5t158 -194.5zM930 0q-89 0 -135 19t-87 85q-77 -129 -248 -129q-63 0 -131.5 38t-103.5 91q-20 -102 -273 -104v180q150 0 177 30q14 15 14 158.5t81 247t234 103.5t232.5 -109.5t82.5 -261.5q1 -57 2 -73 | |||||
q6 -65 48 -82q20 -9 107 -13v-180z" /> | |||||
<glyph glyph-name="u0646" unicode="ن" horiz-adv-x="1339" arabic-form="isolated" | |||||
d="M1239 29q-1 -211 -123 -347t-330 -137h-277q-185 1 -309 139t-124 325v376h177v-396q0 -114 87 -189t203 -75h232q117 0 200.5 74t83.5 190v576h180v-536zM471 606v4q0 104 129.5 104t129.5 -108q0 -51 -36.5 -87t-88.5 -36q-134 0 -134 123z" /> | |||||
<glyph glyph-name="uFEE6" unicode="ن" horiz-adv-x="1361" arabic-form="final" | |||||
d="M1440 0q-148 0 -199 85q0 -226 -117 -383t-338 -157h-277q-185 1 -309 139t-124 325v376h177v-396q0 -116 86 -190t204 -74h232q117 0 200.5 74t83.5 190v576h180v-259q0 -124 201 -126v-180zM736 606q0 -51 -36.5 -87t-88.5 -36q-136 0 -136 123q1 108 131 108t130 -108 | |||||
z" /> | |||||
<glyph glyph-name="uFEE7" unicode="ن" horiz-adv-x="586" arabic-form="initial" | |||||
d="M339 353l-3 212h184v-272q0 -116 -74 -204.5t-187 -88.5h-295v180q283 0 315 11q60 22 60 162zM343 848q0 -53 -36.5 -90t-88.5 -37q-137 0 -137 127q0 107 131 107t131 -107z" /> | |||||
<glyph glyph-name="uFEE8" unicode="ن" horiz-adv-x="703" arabic-form="medial" | |||||
d="M331 353l-2 212h182v-247q0 -133 224 -138v-180h-59q-170 0 -250 70q-90 -70 -173 -70h-296v180q279 0 314 13q60 21 60 160zM343 848q0 -53 -36.5 -90t-88.5 -37q-137 0 -137 127q0 107 131 107t131 -107z" /> | |||||
<glyph glyph-name="u0648" unicode="و" horiz-adv-x="893" arabic-form="isolated" | |||||
d="M601 180v185q0 176 -141 176q-86 0 -116 -58q-21 -41 -21 -147t91 -138q49 -18 187 -18zM781 -23q0 -180 -135.5 -306t-316.5 -126h-233l-23 180h227q128 0 212 74t89 201q-225 0 -327 60q-136 80 -136 297t107 308q66 56 220 56q205 0 274 -172q42 -107 42 -346v-226z | |||||
" /> | |||||
<glyph glyph-name="uFEEE" unicode="و" horiz-adv-x="893" arabic-form="final" | |||||
d="M329 351v-15q0 -106 95 -138q51 -18 191 -18v171q-1 75 -38.5 132.5t-111.5 57.5h-6q-79 -1 -104.5 -48t-25.5 -142zM919 0h-119q0 -198 -132.5 -326.5t-331.5 -128.5h-232l-25 180h227q128 0 213 74t90 201q-223 0 -328 61q-137 81 -137 297t109 307q63 54 213 54 | |||||
q215 0 288 -178q42 -104 46 -361h119v-180z" /> | |||||
<glyph glyph-name="u0647" unicode="ه" horiz-adv-x="809" arabic-form="isolated" | |||||
d="M534.5 199q44.5 46 44.5 109t-29 93l-145 153q-161 -153 -161 -243q0 -69 52 -113.5t123 -44.5t115.5 46zM674 528q84 -87 84 -225t-105 -230.5t-249.5 -92.5t-239 100.5t-94.5 251.5t205 356l-52 58l122 122z" /> | |||||
<glyph glyph-name="uFEEA" unicode="ه" horiz-adv-x="1031" arabic-form="final" | |||||
d="M501.5 198.5q51.5 44.5 51.5 111.5t-34 100l-145 144q-84 -79 -105 -106q-53 -68 -53 -137.5t47 -113t117 -43.5t121.5 44.5zM1068 0q-118 0 -158.5 23.5t-201.5 172.5q-102 -216 -329 -216q-149 0 -246 97t-97 249.5t209 361.5l-51 58l121 122l539 -573 | |||||
q71 -75 100 -92.5t114 -22.5v-180z" /> | |||||
<glyph glyph-name="uFEEB" unicode="ه" horiz-adv-x="1171" arabic-form="initial" | |||||
d="M548 415q0 61 -45 101t-100.5 40t-84.5 -39t-29 -89q0 -117 144 -173q115 51 115 160zM786 115q118 0 118 110.5t-238 350.5q55 -62 55 -171q0 -172 -111 -229q102 -61 176 -61zM1093 239q0 -119 -89 -214t-219 -95t-357 133q-116 -59 -259 -60l-200 -3v180h250 | |||||
q-99 130 -99 253t82 205.5t204.5 82.5t222.5 -97l-118 122l135 122q447 -427 447 -629z" /> | |||||
<glyph glyph-name="uFEEC" unicode="ه" horiz-adv-x="798" arabic-form="medial" | |||||
d="M586 -208q0 104 -102.5 163t-215.5 59q0 -334 183 -334q135 0 135 112zM264 180q115 0 200.5 70t85.5 185t-120 115q-171 0 -171 -229q0 -14 5 -141zM831 0h-227q132 -91 132 -264q0 -209 -265 -209q-322 0 -350 277l-20 196h-155v180h147q-14 184 -14 201q0 335 336 335 | |||||
q136 0 220 -76t84 -219t-120 -241h232v-180z" /> | |||||
<glyph glyph-name="u0629" unicode="ة" horiz-adv-x="809" arabic-form="isolated" | |||||
d="M534.5 199q44.5 46 44.5 109t-29 93l-145 153q-161 -153 -161 -243q0 -69 52 -113.5t123 -44.5t115.5 46zM674 528q84 -87 84 -225t-105 -230.5t-249.5 -92.5t-239 100.5t-94.5 251.5t205 356l-52 58l122 122zM466 1093l-303 -153l-25 49l103 56q-90 50 -90 124t39.5 118 | |||||
t104.5 44q25 0 86 -22l-22 -48q-30 17 -55 17q-99 0 -99 -102q0 -81 76 -81q63 0 160 51z" /> | |||||
<glyph glyph-name="uFE94" unicode="ۀ" horiz-adv-x="1031" arabic-form="final" | |||||
d="M501.5 198.5q51.5 44.5 51.5 111.5t-34 100l-145 144q-84 -79 -105 -106q-53 -68 -53 -137.5t47 -113t117 -43.5t121.5 44.5zM1068 0q-118 0 -158.5 23.5t-201.5 172.5q-102 -216 -329 -216q-149 0 -246 97t-97 249.5t209 361.5l-51 58l121 122l539 -573 | |||||
q71 -75 100 -92.5t114 -22.5v-180zM450 1143l-304 -154l-25 50l104 56q-92 49 -92 121t41.5 117.5t93 45.5t97.5 -20l-22 -48q-31 17 -64 17t-61.5 -30t-28.5 -73q0 -80 79 -80q58 0 156 51z" /> | |||||
<glyph glyph-name="u064A" unicode="ي" horiz-adv-x="1289" arabic-form="isolated" | |||||
d="M1225 9q0 -265 -191 -390q-113 -74 -250 -74h-279q-185 0 -305 138t-121 326v372h169v-392q0 -120 86 -194t207 -74h232q106 1 193 71t87 166t-123 125q-33 7 -45 7h-250v309q0 139 89 229.5t229 90.5h216l7 -169h-216q-97 0 -134 -86q-17 -42 -22 -205q213 0 284 -26 | |||||
q137 -52 137 -224z" /> | |||||
<glyph glyph-name="uFEF2" unicode="ی" horiz-adv-x="1289" arabic-form="final" | |||||
d="M1318 0h-167l9 -88q0 -157 -118 -262t-276 -105h-280q-211 0 -326.5 149.5t-116.5 368.5v322h180v-391q1 -129 87 -199t218 -70h231q96 0 160 53t64 148q0 58 -165 71q-30 3 -209 3l-16 180h725v-180z" /> | |||||
<glyph glyph-name="uFEF3" unicode="ی" horiz-adv-x="680" arabic-form="initial" | |||||
d="M-9 -347v4q0 98 119.5 98t119.5 -100q0 -46 -33.5 -76t-80.5 -30q-1 1 -2 1q-48 0 -85.5 27.5t-37.5 75.5zM575 -343v-5q0 -44 -33 -73.5t-80 -29.5q-1 1 -2 1q-48 0 -86 28t-38 77q0 100 119.5 100t119.5 -98zM606 293q0 -117 -72 -205t-185 -88h-385v180h329 | |||||
q75 0 104 30.5t29 107.5v247h180v-272z" /> | |||||
<glyph glyph-name="uFEF4" unicode="ی" horiz-adv-x="739" arabic-form="medial" | |||||
d="M270 -343q0 -46 -33 -76t-81.5 -30t-86.5 29t-38 77q0 99 119.5 99t119.5 -99zM615 -343q0 -46 -33 -76t-81.5 -30t-86.5 29t-38 77q0 99 119.5 99t119.5 -99zM775 0h-63q-52 0 -102 9q-43 17 -91 61q-86 -70 -171 -70h-388v180h333q75 0 104 30.5t29 107.5v247h180v-247 | |||||
q0 -89 37 -113.5t132 -24.5v-180z" /> | |||||
<glyph glyph-name="u0649" unicode="ى" horiz-adv-x="1289" arabic-form="isolated" | |||||
d="M1225 9q0 -265 -191 -390q-113 -74 -250 -74h-279q-185 0 -305 138t-121 326v372h169v-392q0 -120 86 -194t207 -74h232q106 1 193 71t87 166t-123 125q-33 7 -45 7h-250v309q0 139 89 229.5t229 90.5h216l7 -169h-216q-97 0 -134 -86q-17 -42 -22 -205q213 0 284 -26 | |||||
q137 -52 137 -224z" /> | |||||
<glyph glyph-name="uFEF0" unicode="ى" horiz-adv-x="1289" arabic-form="final" | |||||
d="M1318 0h-167l9 -88q0 -157 -118 -262t-276 -105h-280q-211 0 -326.5 149.5t-116.5 368.5v322h180v-391q1 -129 87 -199t218 -70h231q96 0 160 53t64 148q0 58 -165 71q-30 3 -209 3l-16 180h725v-180z" /> | |||||
<glyph glyph-name=".notdef" horiz-adv-x="1024" | |||||
d="M256 128h512v1834h-512v-1834zM128 0v2090h768v-2090h-768z" /> | |||||
<glyph glyph-name=".null" | |||||
/> | |||||
<glyph glyph-name="nonmarkingreturn" horiz-adv-x="469" | |||||
/> | |||||
<glyph glyph-name="space" unicode=" " horiz-adv-x="469" | |||||
/> | |||||
<glyph glyph-name="exclam" unicode="!" horiz-adv-x="469" | |||||
d="M371 120q0 -120 -131 -120t-131 120q0 110 131 110t131 -110zM326 759q-12 -12 -12 -136l-28 -274h-95l-42 410v395h177v-395z" /> | |||||
<glyph glyph-name="percent" unicode="%" horiz-adv-x="469" | |||||
d="M469 552.5q47 47.5 47 110.5t-53 110t-117.5 47t-110.5 -51t-46 -115.5t52 -106.5t116.5 -42t111.5 47.5zM553.5 853q89.5 -88 89.5 -196.5t-92.5 -187.5t-203.5 -79t-195 81.5t-84 192t88 194t198 83.5t199.5 -88zM1129 930l-646 -1174h-174l640 1174h180zM1228.5 -55 | |||||
q49.5 49 49.5 110t-50.5 110t-113 49t-114 -51.5t-51.5 -121t76 -117.5q43 -28 98.5 -28t105 49zM1316 247.5q85 -88.5 85 -200t-89.5 -189t-199 -77.5t-198 80.5t-88.5 188.5t91.5 197t202.5 89t196 -88.5z" /> | |||||
<glyph glyph-name="parenleft" unicode="(" horiz-adv-x="721" | |||||
d="M643 1399q-162 -313 -229 -511q-94 -276 -94 -586t74 -580t246 -576h-99q-205 295 -305 560t-101 574q0 309 120 595q82 197 293 524h95z" /> | |||||
<glyph glyph-name="parenright" unicode=")" horiz-adv-x="721" | |||||
d="M178 1399q204 -303 305 -562t101 -568.5t-118 -593.5q-82 -199 -295 -529h-95q323 599 323 1062q0 371 -65.5 595.5t-254.5 595.5h99z" /> | |||||
<glyph glyph-name="asterisk" unicode="*" horiz-adv-x="680" | |||||
/> | |||||
<glyph glyph-name="plus" unicode="+" horiz-adv-x="1275" | |||||
d="M1191 239h-466v-464h-171v464h-464v176h464v464h171v-464h466v-176z" /> | |||||
<glyph glyph-name="comma" unicode="," horiz-adv-x="264" | |||||
d="M4 34q0 110 136 110q82 0 105 -36t23 -161t-25 -191q-43 -111 -177 -124v65q79 8 107 75q14 38 18 138q-187 0 -187 124z" /> | |||||
<glyph glyph-name="hyphen" unicode="-" horiz-adv-x="1149" | |||||
d="M1076 239h-981v177h981v-177z" /> | |||||
<glyph glyph-name="period" unicode="." horiz-adv-x="564" | |||||
d="M416 96q0 -119 -132 -119t-133 119q1 112 133 112t132 -112z" /> | |||||
<glyph glyph-name="slash" unicode="/" horiz-adv-x="971" | |||||
d="M904 930l-648 -1174h-172l640 1174h180z" /> | |||||
<glyph glyph-name="zero" unicode="0" horiz-adv-x="1210" | |||||
d="M729.5 204.5q51.5 51.5 51.5 120.5t-54 122t-125.5 53t-124.5 -56t-53 -126.5t58 -117.5t127 -47t120.5 51.5zM829.5 542q96.5 -102 96.5 -222t-100.5 -208.5t-222 -88.5t-220.5 88.5t-99 213t100.5 222t224.5 97.5t220.5 -102z" /> | |||||
<glyph glyph-name="zero" unicode="۰" horiz-adv-x="1210" | |||||
d="M729.5 204.5q51.5 51.5 51.5 120.5t-54 122t-125.5 53t-124.5 -56t-53 -126.5t58 -117.5t127 -47t120.5 51.5zM829.5 542q96.5 -102 96.5 -222t-100.5 -208.5t-222 -88.5t-220.5 88.5t-99 213t100.5 222t224.5 97.5t220.5 -102z" /> | |||||
<glyph glyph-name="zero" unicode="٠" horiz-adv-x="1210" | |||||
d="M729.5 204.5q51.5 51.5 51.5 120.5t-54 122t-125.5 53t-124.5 -56t-53 -126.5t58 -117.5t127 -47t120.5 51.5zM829.5 542q96.5 -102 96.5 -222t-100.5 -208.5t-222 -88.5t-220.5 88.5t-99 213t100.5 222t224.5 97.5t220.5 -102z" /> | |||||
<glyph glyph-name="one" unicode="1" horiz-adv-x="1210" | |||||
d="M736 -200h-175v551q0 276 -86 562l171 56l62 -241q0 -6 14 -116t14 -261v-551z" /> | |||||
<glyph glyph-name="one" unicode="۱" horiz-adv-x="1210" | |||||
d="M736 -200h-175v551q0 276 -86 562l171 56l62 -241q0 -6 14 -116t14 -261v-551z" /> | |||||
<glyph glyph-name="one" unicode="١" horiz-adv-x="1210" | |||||
d="M736 -200h-175v551q0 276 -86 562l171 56l62 -241q0 -6 14 -116t14 -261v-551z" /> | |||||
<glyph glyph-name="two" unicode="2" horiz-adv-x="1210" | |||||
d="M908 971q50 -246 50 -338t-86 -160t-175.5 -68t-180.5 59l3 -664h-181v525q0 357 -85 588l173 56l72 -295q27 -113 133 -113q74 1 107 48t33 84q0 5 -1 10l-29 215q55 18 167 53z" /> | |||||
<glyph glyph-name="two" unicode="۲" horiz-adv-x="1210" | |||||
d="M908 971q50 -246 50 -338t-86 -160t-175.5 -68t-180.5 59l3 -664h-181v525q0 357 -85 588l173 56l72 -295q27 -113 133 -113q74 1 107 48t33 84q0 5 -1 10l-29 215q55 18 167 53z" /> | |||||
<glyph glyph-name="two" unicode="٢" horiz-adv-x="1210" | |||||
d="M908 971q50 -246 50 -338t-86 -160t-175.5 -68t-180.5 59l3 -664h-181v525q0 357 -85 588l173 56l72 -295q27 -113 133 -113q74 1 107 48t33 84q0 5 -1 10l-29 215q55 18 167 53z" /> | |||||
<glyph glyph-name="three" unicode="3" horiz-adv-x="1210" | |||||
d="M1161 654q0 -98 -80 -165.5t-185.5 -67.5t-215.5 124q0 -130 -189 -130q-94 0 -177 46l1 -661h-175v525q0 334 -90 588l178 56l67 -295q26 -113 140 -113q59 1 99 42t40 84q0 8 -1 16l-34 215l169 62q41 -213 41 -304q0 -11 -3 -63q46 -57 106.5 -57t99 37.5t38.5 89.5 | |||||
q0 10 -1 20l-29 215l166 51l34 -291q1 -11 1 -24z" /> | |||||
<glyph glyph-name="three" unicode="۳" horiz-adv-x="1210" | |||||
d="M1161 654q0 -98 -80 -165.5t-185.5 -67.5t-215.5 124q0 -130 -189 -130q-94 0 -177 46l1 -661h-175v525q0 334 -90 588l178 56l67 -295q26 -113 140 -113q59 1 99 42t40 84q0 8 -1 16l-34 215l169 62q41 -213 41 -304q0 -11 -3 -63q46 -57 106.5 -57t99 37.5t38.5 89.5 | |||||
q0 10 -1 20l-29 215l166 51l34 -291q1 -11 1 -24z" /> | |||||
<glyph glyph-name="three" unicode="٣" horiz-adv-x="1210" | |||||
d="M1161 654q0 -98 -80 -165.5t-185.5 -67.5t-215.5 124q0 -130 -189 -130q-94 0 -177 46l1 -661h-175v525q0 334 -90 588l178 56l67 -295q26 -113 140 -113q59 1 99 42t40 84q0 8 -1 16l-34 215l169 62q41 -213 41 -304q0 -11 -3 -63q46 -57 106.5 -57t99 37.5t38.5 89.5 | |||||
q0 10 -1 20l-29 215l166 51l34 -291q1 -11 1 -24z" /> | |||||
<glyph glyph-name="four" unicode="4" horiz-adv-x="1210" | |||||
d="M1075 466q-194 -90 -357 -90t-324 70l2 -646h-175v538q0 264 -86 575l169 56q51 -188 79 -351l92 -43q0 403 328 403q102 0 217 -57l-60 -155q-74 54 -148 54t-128.5 -48.5t-54.5 -120.5q0 -117 135 -117q102 0 255 76z" /> | |||||
<glyph glyph-name="four" unicode="۴" horiz-adv-x="1210" | |||||
d="M1075 466q-194 -90 -357 -90t-324 70l2 -646h-175v538q0 264 -86 575l169 56q51 -188 79 -351l92 -43q0 403 328 403q102 0 217 -57l-60 -155q-74 54 -148 54t-128.5 -48.5t-54.5 -120.5q0 -117 135 -117q102 0 255 76z" /> | |||||
<glyph glyph-name="four" unicode="٤" horiz-adv-x="1210" | |||||
d="M1075 466q-194 -90 -357 -90t-324 70l2 -646h-175v538q0 264 -86 575l169 56q51 -188 79 -351l92 -43q0 403 328 403q102 0 217 -57l-60 -155q-74 54 -148 54t-128.5 -48.5t-54.5 -120.5q0 -117 135 -117q102 0 255 76z" /> | |||||
<glyph glyph-name="five" unicode="5" horiz-adv-x="1210" | |||||
d="M974 118q0 212 -420 560q-318 -334 -318 -557q0 -169 152 -169q139 0 140 158q-2 11 -9 68h177q12 -24 12 -89t-19 -100q53 -34 117 -34q168 0 168 163zM1163 74q-1 -145 -103 -230t-242 -85t-232 70q-126 -73 -254 -73t-206 104t-78 244q0 220 177 439l196 241l-70 50 | |||||
l115 137q697 -520 697 -897z" /> | |||||
<glyph glyph-name="five" unicode="۵" horiz-adv-x="1210" | |||||
d="M974 118q0 212 -420 560q-318 -334 -318 -557q0 -169 152 -169q139 0 140 158q-2 11 -9 68h177q12 -24 12 -89t-19 -100q53 -34 117 -34q168 0 168 163zM1163 74q-1 -145 -103 -230t-242 -85t-232 70q-126 -73 -254 -73t-206 104t-78 244q0 220 177 439l196 241l-70 50 | |||||
l115 137q697 -520 697 -897z" /> | |||||
<glyph glyph-name="five" unicode="٥" horiz-adv-x="1210" | |||||
d="M974 118q0 212 -420 560q-318 -334 -318 -557q0 -169 152 -169q139 0 140 158q-2 11 -9 68h177q12 -24 12 -89t-19 -100q53 -34 117 -34q168 0 168 163zM1163 74q-1 -145 -103 -230t-242 -85t-232 70q-126 -73 -254 -73t-206 104t-78 244q0 220 177 439l196 241l-70 50 | |||||
l115 137q697 -520 697 -897z" /> | |||||
<glyph glyph-name="six" unicode="6" horiz-adv-x="1210" | |||||
d="M971 483q-72 -64 -140 -147l-151 -185q-117 -143 -261 -396l-158 96q85 163 327 480q-157 1 -253 85t-96 232t88.5 241.5t228.5 93.5q99 0 225 -65l-57 -160q-76 40 -144 40t-114.5 -42t-46.5 -107q0 -144 164 -144q111 0 243 85z" /> | |||||
<glyph glyph-name="six" unicode="۶" horiz-adv-x="1210" | |||||
d="M971 483q-72 -64 -140 -147l-151 -185q-117 -143 -261 -396l-158 96q85 163 327 480q-157 1 -253 85t-96 232t88.5 241.5t228.5 93.5q99 0 225 -65l-57 -160q-76 40 -144 40t-114.5 -42t-46.5 -107q0 -144 164 -144q111 0 243 85z" /> | |||||
<glyph glyph-name="six" unicode="٦" horiz-adv-x="1210" | |||||
d="M971 483q-72 -64 -140 -147l-151 -185q-117 -143 -261 -396l-158 96q85 163 327 480q-157 1 -253 85t-96 232t88.5 241.5t228.5 93.5q99 0 225 -65l-57 -160q-76 40 -144 40t-114.5 -42t-46.5 -107q0 -144 164 -144q111 0 243 85z" /> | |||||
<glyph glyph-name="seven" unicode="7" horiz-adv-x="1210" | |||||
d="M1109 893l-149 -255q-72 -122 -146 -304t-140 -534h-140q-45 306 -142 539t-288 551l157 81q166 -283 233 -462q6 -16 34 -119l70 -259l20 -2q73 363 193 581l144 261q70 -37 154 -78z" /> | |||||
<glyph glyph-name="seven" unicode="۷" horiz-adv-x="1210" | |||||
d="M1109 893l-149 -255q-72 -122 -146 -304t-140 -534h-140q-45 306 -142 539t-288 551l157 81q166 -283 233 -462q6 -16 34 -119l70 -259l20 -2q73 363 193 581l144 261q70 -37 154 -78z" /> | |||||
<glyph glyph-name="seven" unicode="٧" horiz-adv-x="1210" | |||||
d="M1109 893l-149 -255q-72 -122 -146 -304t-140 -534h-140q-45 306 -142 539t-288 551l157 81q166 -283 233 -462q6 -16 34 -119l70 -259l20 -2q73 363 193 581l144 261q70 -37 154 -78z" /> | |||||
<glyph glyph-name="eight" unicode="8" horiz-adv-x="1210" | |||||
d="M1109 -113q-83 -37 -156 -81q-165 282 -232 464q-12 32 -38 134l-65 245l-20 2q-36 -165 -96 -353t-243 -492q-88 49 -158 84q199 332 289 548t146 542l140 -2q73 -446 262 -793q56 -104 171 -298z" /> | |||||
<glyph glyph-name="eight" unicode="۸" horiz-adv-x="1210" | |||||
d="M1109 -113q-83 -37 -156 -81q-165 282 -232 464q-12 32 -38 134l-65 245l-20 2q-36 -165 -96 -353t-243 -492q-88 49 -158 84q199 332 289 548t146 542l140 -2q73 -446 262 -793q56 -104 171 -298z" /> | |||||
<glyph glyph-name="eight" unicode="٨" horiz-adv-x="1210" | |||||
d="M1109 -113q-83 -37 -156 -81q-165 282 -232 464q-12 32 -38 134l-65 245l-20 2q-36 -165 -96 -353t-243 -492q-88 49 -158 84q199 332 289 548t146 542l140 -2q73 -446 262 -793q56 -104 171 -298z" /> | |||||
<glyph glyph-name="nine" unicode="9" horiz-adv-x="1210" | |||||
d="M739 599q-7 46 -26 134q-24 64 -73 76q-4 1 -59 11q-68 0 -108 -48t-40 -117q0 -119 121 -119q76 0 185 63zM933 -200h-175v615q-109 -36 -220 -36t-185 71t-74 205q1 134 87 231t224 97q85 0 185 -59q158 -93 158 -539v-585z" /> | |||||
<glyph glyph-name="nine" unicode="۹" horiz-adv-x="1210" | |||||
d="M739 599q-7 46 -26 134q-24 64 -73 76q-4 1 -59 11q-68 0 -108 -48t-40 -117q0 -119 121 -119q76 0 185 63zM933 -200h-175v615q-109 -36 -220 -36t-185 71t-74 205q1 134 87 231t224 97q85 0 185 -59q158 -93 158 -539v-585z" /> | |||||
<glyph glyph-name="nine" unicode="٩" horiz-adv-x="1210" | |||||
d="M739 599q-7 46 -26 134q-24 64 -73 76q-4 1 -59 11q-68 0 -108 -48t-40 -117q0 -119 121 -119q76 0 185 63zM933 -200h-175v615q-109 -36 -220 -36t-185 71t-74 205q1 134 87 231t224 97q85 0 185 -59q158 -93 158 -539v-585z" /> | |||||
<glyph glyph-name="colon" unicode=":" horiz-adv-x="564" | |||||
d="M428 120q0 -120 -138 -120q-54 0 -90.5 33t-36.5 87q1 110 133 110t132 -110zM426 543q0 -119 -133 -119t-133 119q0 111 133 111t133 -111z" /> | |||||
<glyph glyph-name="equal" unicode="=" horiz-adv-x="1225" | |||||
d="M1110 0h-989v176h989v-176zM1110 374h-989v176h989v-176z" /> | |||||
<glyph glyph-name="bracketleft" unicode="[" horiz-adv-x="770" | |||||
d="M696 -834h-537l2 2603h535v-169h-350l-3 -2265h353v-169z" /> | |||||
<glyph glyph-name="bracketright" unicode="]" horiz-adv-x="783" | |||||
d="M157 -845v169h352l-2 2267h-350v169h534l2 -2605h-536z" /> | |||||
<glyph glyph-name="braceleft" unicode="{" horiz-adv-x="1050" | |||||
d="M393 54q32 138 32 156v21q0 128 -95.5 215.5t-232.5 103.5v51q328 72 328 302v35q0 32 -29.5 166t-29.5 224q0 210 134 352t347 175v-53q-131 -18 -219 -103t-88 -212q0 -61 29.5 -212.5q29.5 -152.5 29.5 -172.5v-61q0 -309 -392 -463q387 -159 387 -481 | |||||
q0 -67 -29.5 -208.5t-29.5 -161.5v-60q0 -249 312 -320v-52q-212 39 -349 181t-137 352q0 88 32 226z" /> | |||||
<glyph glyph-name="braceright" unicode="}" horiz-adv-x="970" | |||||
d="M612 1331q0 -80 -29.5 -215t-29.5 -170v-40q0 -231 328 -302v-52q-136 -15 -232 -103t-96 -222q1 -27 31 -165t30 -232q0 -209 -136 -351t-347 -179v49q312 72 312 320q0 77 -31 223t-31 210q0 320 390 481q-395 154 -395 461q0 57 29.5 211.5t29.5 192.5v44 | |||||
q0 127 -86 209t-218 103v57q213 -37 347 -178t134 -352z" /> | |||||
<glyph glyph-name="guillemotleft" unicode="«" horiz-adv-x="926" | |||||
d="M419 5l-323 250v194l323 250v-145l-264 -200l264 -203v-146zM829 5l-320 250v194l320 250v-145l-259 -200l259 -203v-146z" /> | |||||
<glyph glyph-name="guillemotright" unicode="»" horiz-adv-x="926" | |||||
d="M415 255l-320 -250v144l259 200l-259 204v146l320 -250v-194zM826 255l-321 -250v144l264 200l-264 204v146l321 -250v-194z" /> | |||||
<glyph glyph-name="multiply" unicode="×" horiz-adv-x="1275" | |||||
d="M1180 -90l-126 -126l-410 416l-419 -416l-124 123l419 418l-421 419l124 124l417 -418l419 420l121 -126l-414 -419z" /> | |||||
<glyph glyph-name="divide" unicode="÷" horiz-adv-x="1171" | |||||
d="M663 -25q37 -41 37 -95.5t-42 -93.5t-96.5 -39t-90.5 42.5t-36 98.5t40 92t95.5 36t92.5 -41zM1095 225h-1022v179h1022v-179zM669.5 836.5q40.5 -39.5 40.5 -93.5t-42.5 -96.5t-97.5 -42.5t-90.5 43.5t-35.5 98.5t39.5 92.5t92.5 37.5t93.5 -39.5z" /> | |||||
<glyph glyph-name="zeronojoin" unicode="‌" horiz-adv-x="45" | |||||
/> | |||||
<glyph glyph-name="zerojoin" unicode="‍" horiz-adv-x="45" | |||||
/> | |||||
<glyph glyph-name="lefttoright" unicode="‎" horiz-adv-x="41" | |||||
d="M271 1444l-120 -123l-31 26l80 79h-159v-1426h-41v1464h195l-75 75l31 28z" /> | |||||
<glyph glyph-name="righttoleft" unicode="‏" horiz-adv-x="41" | |||||
d="M41 0h-41v1426h-159l77 -79l-26 -26l-125 123l125 123l26 -28l-74 -75h197v-1464z" /> | |||||
<glyph glyph-name="quoteleft" unicode="‘" horiz-adv-x="662" | |||||
d="M467 976q0 -110 -137 -110q-81 0 -104 38t-23 161t25 189q43 111 176 124v-65q-77 -9 -105 -77q-16 -40 -20 -136q188 0 188 -124z" /> | |||||
<glyph glyph-name="quoteright" unicode="’" horiz-adv-x="570" | |||||
d="M153 1268q0 110 136 110q83 0 105 -36t22 -162t-25 -191q-42 -111 -176 -123v65q79 8 106 75q15 37 19 138q-187 0 -187 124z" /> | |||||
<glyph glyph-name="quotedblleft" unicode="“" horiz-adv-x="618" | |||||
d="M604 976q0 -110 -136 -110q-82 0 -105 38t-23 161t25 189q43 111 176 124v-65q-77 -9 -105 -77q-16 -40 -20 -136q188 0 188 -124zM303 971q0 -110 -137 -110q-82 0 -108 43q-19 30 -19 155t25 191q42 111 176 123v-65q-79 -8 -106 -75q-15 -38 -19 -138q188 0 188 -124z | |||||
" /> | |||||
<glyph glyph-name="quotedblright" unicode="”" horiz-adv-x="618" | |||||
d="M303 1193v-19q0 -124 -25 -189q-43 -111 -177 -124v65q78 9 105 77q16 39 20 136q-187 0 -187 124q0 110 136 110h4q77 -1 100.5 -36.5t23.5 -143.5zM340 1268q0 110 136 110q83 0 109 -43q19 -29 19 -155t-25 -191q-43 -111 -176 -123v65q78 8 106 75q15 37 19 138 | |||||
q-188 0 -188 124z" /> | |||||
<glyph glyph-name="guilsinglleft" unicode="‹" horiz-adv-x="631" | |||||
d="M490 5l-320 250v194l320 250v-145l-259 -200l259 -203v-146z" /> | |||||
<glyph glyph-name="guilsinglright" unicode="›" horiz-adv-x="573" | |||||
d="M473 255l-321 -250v144l263 200l-263 204v146l321 -250v-194z" /> | |||||
<glyph glyph-name="u060C" unicode="،" horiz-adv-x="516" | |||||
d="M388 110q0 -110 -137 -110q-81 0 -104 38t-23 161t25 189q42 111 176 123v-65q-79 -7 -106 -75q-15 -37 -19 -137q188 0 188 -124z" /> | |||||
<glyph glyph-name="u061B" unicode="؛" horiz-adv-x="564" | |||||
d="M426 110q0 -110 -133 -110t-133 110q0 120 133 120t133 -120zM155 583v19q0 124 25 188q41 105 176 123v-62q-80 -17 -105 -77q-15 -36 -18 -134q191 0 191 -124q0 -111 -136 -111q-86 0 -109.5 35.5t-23.5 142.5z" /> | |||||
<glyph glyph-name="u061F" unicode="؟" horiz-adv-x="809" | |||||
d="M534 109q0 -49 -38 -79t-86 -30t-82.5 32t-34.5 77q1 101 121 101t120 -101zM741 775h-176q0 223 -157 223q-147 0 -147 -138q0 -51 23 -76l87 -96q85 -92 105 -146t29 -204h-171q0 106 -26 158t-99 122t-103 117t-30 131q0 142 94 216t218 74t211 -50t113 -127t29 -204z | |||||
" /> | |||||
<glyph glyph-name="u0640" unicode="ـ" horiz-adv-x="469" | |||||
d="M505 0h-525v180h525v-180z" /> | |||||
<glyph glyph-name="u064B" unicode="ً" | |||||
d="M343 1461l-315 -168l-28 47l315 173zM344 1578l-316 -172l-27 50l315 174z" /> | |||||
<glyph glyph-name="u064C" unicode="ٌ" | |||||
d="M287 1452.5q27 29.5 27 59.5t-26.5 53t-59.5 23q-79 0 -79 -87q0 -78 85 -78q26 0 53 29.5zM360 1508q0 -91 -49 -117l-283 -151l-28 48q51 33 63 53q0 34 -37 34t-57 -11l-20 36q56 19 85 19q57 0 72 -78l77 45q-79 45 -79 124.5t87 113.5q29 11 37 11q54 0 93 -37 | |||||
t39 -90z" /> | |||||
<glyph glyph-name="u064D" unicode="ٍ" | |||||
d="M226 -875l-315 -169l-27 48l315 175zM226 -731l-315 -169l-27 47l315 174z" /> | |||||
<glyph glyph-name="u064E" unicode="َ" | |||||
d="M343 1456l-315 -168l-28 47l315 176z" /> | |||||
<glyph glyph-name="u064F" unicode="ُ" | |||||
d="M231.5 1446q26.5 30 26.5 60t-26.5 52.5t-60.5 22.5q-78 0 -78 -86q0 -79 86 -79q26 0 52.5 30zM305 1501q0 -89 -50 -116l-227 -121l-28 47l126 70q-78 45 -78 113q0 91 90 125q26 10 33 10q55 0 94.5 -37t39.5 -91z" /> | |||||
<glyph glyph-name="u0650" unicode="ِ" | |||||
d="M218 -754l-314 -169l-29 48l315 175z" /> | |||||
<glyph glyph-name="u0651" unicode="ّ" | |||||
d="M-31 1516v7h45q0 -100 80 -100t84 100h50q0 -100 82 -100t83 100h48q-1 -62 -37 -107t-88 -45t-117 57q-47 -57 -107 -57h-3q-58 0 -89 45t-31 100z" /> | |||||
<glyph glyph-name="u0652" unicode="ْ" | |||||
d="M241 1441q0 60 -60 80q-18 7 -22 7q-34 0 -60 -26.5t-26 -60.5t26 -59.5t58 -25.5t58 27.5t26 57.5zM288 1438q0 -54 -40 -90q-41 -35 -91 -35h-3q-52 1 -88 41t-36 94t40 88t94 34t89 -39t35 -93z" /> | |||||
<glyph glyph-name="uE820" unicode="" | |||||
d="M353 947l-315 -168l-28 47l315 176z" /> | |||||
<glyph glyph-name="uE821" unicode="" | |||||
d="M251.5 983q26.5 30 26.5 60t-26.5 52.5t-60.5 22.5q-78 0 -78 -86q0 -79 86 -79q26 0 52.5 30zM325 1038q0 -89 -50 -116l-227 -121l-28 47l126 70q-78 45 -78 113q0 91 90 125q26 10 33 10q55 0 94.5 -37t39.5 -91z" /> | |||||
<glyph glyph-name="uE822" unicode="" | |||||
d="M210 957q0 60 -60 80q-18 7 -22 7q-34 0 -60 -26.5t-26 -60.5t26 -59.5t58 -25.5t58 27.5t26 57.5zM257 954q0 -54 -40 -90q-41 -35 -91 -35h-3q-52 1 -88 41t-36 94t40 88t94 34t89 -39t35 -93z" /> | |||||
<glyph glyph-name="uE823" unicode="" | |||||
d="M333 972l-315 -168l-28 47l315 173zM334 1089l-316 -172l-27 50l315 174z" /> | |||||
<glyph glyph-name="uE824" unicode="" | |||||
d="M348 984.5q27 29.5 27 59.5t-26.5 53t-59.5 23q-79 0 -79 -87q0 -78 85 -78q26 0 53 29.5zM421 1040q0 -91 -49 -117l-283 -151l-28 48q51 33 63 53q0 34 -37 34t-57 -11l-20 36q56 19 85 19q57 0 72 -78l77 45q-79 45 -79 124.5t87 113.5q29 11 37 11q54 0 93 -37 | |||||
t39 -90z" /> | |||||
<glyph glyph-name="uE825" unicode="" | |||||
d="M-31 1012v7h45q0 -100 80 -100t84 100h50q0 -100 82 -100t83 100h48q-1 -62 -37 -107t-88 -45t-117 57q-47 -57 -107 -57h-3q-58 0 -89 45t-31 100z" /> | |||||
<glyph glyph-name="uE826" unicode="" | |||||
d="M138 -367l-314 -169l-29 48l315 175z" /> | |||||
<glyph glyph-name="uE827" unicode="" | |||||
d="M101 -605l-315 -169l-27 48l315 175zM101 -461l-315 -169l-27 47l315 174z" /> | |||||
<glyph glyph-name="uE828" unicode="" | |||||
d="M-16 1035v7h45q0 -100 80 -100t84 100h50q0 -100 82 -100t83 100h48q-1 -62 -37 -107t-88 -45t-117 57q-47 -57 -107 -57h-3q-58 0 -89 45t-31 100zM373 1315l-315 -168l-28 47l315 176z" /> | |||||
<glyph glyph-name="uE829" unicode="" | |||||
d="M-16 1035v7h45q0 -100 80 -100t84 100h50q0 -100 82 -100t83 100h48q-1 -62 -37 -107t-88 -45t-117 57q-47 -57 -107 -57h-3q-58 0 -89 45t-31 100zM291.5 1362q26.5 30 26.5 60t-26.5 52.5t-60.5 22.5q-78 0 -78 -86q0 -79 86 -79q26 0 52.5 30zM365 1417 | |||||
q0 -89 -50 -116l-227 -121l-28 47l126 70q-78 45 -78 113q0 91 90 125q26 10 33 10q55 0 94.5 -37t39.5 -91z" /> | |||||
<glyph glyph-name="uE82A" unicode="" | |||||
d="M-16 1035v7h45q0 -100 80 -100t84 100h50q0 -100 82 -100t83 100h48q-1 -62 -37 -107t-88 -45t-117 57q-47 -57 -107 -57h-3q-58 0 -89 45t-31 100zM392 1329l-315 -168l-28 47l315 173zM393 1446l-316 -172l-27 50l315 174z" /> | |||||
<glyph glyph-name="uE82B" unicode="" | |||||
d="M5 1017v7h45q0 -100 80 -100t84 100h50q0 -100 82 -100t83 100h48q-1 -62 -37 -107t-88 -45t-117 57q-47 -57 -107 -57h-3q-58 0 -89 45t-31 100zM375 1389.5q27 29.5 27 59.5t-26.5 53t-59.5 23q-79 0 -79 -87q0 -78 85 -78q26 0 53 29.5zM448 1445q0 -91 -49 -117 | |||||
l-283 -151l-28 48q51 33 63 53q0 34 -37 34t-57 -11l-20 36q56 19 85 19q57 0 72 -78l77 45q-79 45 -79 124.5t87 113.5q29 11 37 11q54 0 93 -37t39 -90z" /> | |||||
<glyph glyph-name="uE82C" unicode="" | |||||
d="M-16 1280v7h45q0 -100 80 -100t84 100h50q0 -100 82 -100t83 100h48q-1 -62 -37 -107t-88 -45t-117 57q-47 -57 -107 -57h-3q-58 0 -89 45t-31 100zM378 1032l-314 -169l-29 48l315 175z" /> | |||||
<glyph glyph-name="uE82D" unicode="" | |||||
d="M-16 1496v7h45q0 -100 80 -100t84 100h50q0 -100 82 -100t83 100h48q-1 -62 -37 -107t-88 -45t-117 57q-47 -57 -107 -57h-3q-58 0 -89 45t-31 100zM362 1083l-315 -169l-27 48l315 175zM362 1227l-315 -169l-27 47l315 174z" /> | |||||
<glyph glyph-name="u0621" unicode="ء" horiz-adv-x="530" | |||||
d="M471 194l-376 -194l-32 61l131 70q-115 61 -115 169q0 82 51 134q52 52 118 52t117 -22l-27 -59q-36 21 -74 21q-121 0 -121 -126q0 -106 102 -106q79 0 193 62z" /> | |||||
<glyph glyph-name="periodcentered" unicode="·" horiz-adv-x="512" | |||||
d="M253 653q-97 0 -97 106t96 106t96 -107q0 -43 -26 -74t-69 -31z" /> | |||||
<glyph glyph-name="periodcentered" unicode="∙" horiz-adv-x="512" | |||||
d="M253 653q-97 0 -97 106t96 106t96 -107q0 -43 -26 -74t-69 -31z" /> | |||||
<glyph glyph-name="periodcentered" unicode="˙" horiz-adv-x="512" | |||||
d="M253 653q-97 0 -97 106t96 106t96 -107q0 -43 -26 -74t-69 -31z" /> | |||||
</font> | |||||
</defs></svg> |
@ -0,0 +1,229 @@ | |||||
<?xml version="1.0" standalone="no"?> | |||||
<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd" > | |||||
<svg xmlns="http://www.w3.org/2000/svg"> | |||||
<metadata></metadata> | |||||
<defs> | |||||
<font id="glyphicons_halflingsregular" horiz-adv-x="1200" > | |||||
<font-face units-per-em="1200" ascent="960" descent="-240" /> | |||||
<missing-glyph horiz-adv-x="500" /> | |||||
<glyph /> | |||||
<glyph /> | |||||
<glyph unicode="
" /> | |||||
<glyph unicode=" " /> | |||||
<glyph unicode="*" d="M100 500v200h259l-183 183l141 141l183 -183v259h200v-259l183 183l141 -141l-183 -183h259v-200h-259l183 -183l-141 -141l-183 183v-259h-200v259l-183 -183l-141 141l183 183h-259z" /> | |||||
<glyph unicode="+" d="M0 400v300h400v400h300v-400h400v-300h-400v-400h-300v400h-400z" /> | |||||
<glyph unicode=" " /> | |||||
<glyph unicode=" " horiz-adv-x="652" /> | |||||
<glyph unicode=" " horiz-adv-x="1304" /> | |||||
<glyph unicode=" " horiz-adv-x="652" /> | |||||
<glyph unicode=" " horiz-adv-x="1304" /> | |||||
<glyph unicode=" " horiz-adv-x="434" /> | |||||
<glyph unicode=" " horiz-adv-x="326" /> | |||||
<glyph unicode=" " horiz-adv-x="217" /> | |||||
<glyph unicode=" " horiz-adv-x="217" /> | |||||
<glyph unicode=" " horiz-adv-x="163" /> | |||||
<glyph unicode=" " horiz-adv-x="260" /> | |||||
<glyph unicode=" " horiz-adv-x="72" /> | |||||
<glyph unicode=" " horiz-adv-x="260" /> | |||||
<glyph unicode=" " horiz-adv-x="326" /> | |||||
<glyph unicode="€" d="M100 500l100 100h113q0 47 5 100h-218l100 100h135q37 167 112 257q117 141 297 141q242 0 354 -189q60 -103 66 -209h-181q0 55 -25.5 99t-63.5 68t-75 36.5t-67 12.5q-24 0 -52.5 -10t-62.5 -32t-65.5 -67t-50.5 -107h379l-100 -100h-300q-6 -46 -6 -100h406l-100 -100 h-300q9 -74 33 -132t52.5 -91t62 -54.5t59 -29t46.5 -7.5q29 0 66 13t75 37t63.5 67.5t25.5 96.5h174q-31 -172 -128 -278q-107 -117 -274 -117q-205 0 -324 158q-36 46 -69 131.5t-45 205.5h-217z" /> | |||||
<glyph unicode="−" d="M200 400h900v300h-900v-300z" /> | |||||
<glyph unicode="◼" horiz-adv-x="500" d="M0 0z" /> | |||||
<glyph unicode="☁" d="M-14 494q0 -80 56.5 -137t135.5 -57h750q120 0 205 86.5t85 207.5t-85 207t-205 86q-46 0 -90 -14q-44 97 -134.5 156.5t-200.5 59.5q-152 0 -260 -107.5t-108 -260.5q0 -25 2 -37q-66 -14 -108.5 -67.5t-42.5 -122.5z" /> | |||||
<glyph unicode="✉" d="M0 100l400 400l200 -200l200 200l400 -400h-1200zM0 300v600l300 -300zM0 1100l600 -603l600 603h-1200zM900 600l300 300v-600z" /> | |||||
<glyph unicode="✏" d="M-13 -13l333 112l-223 223zM187 403l214 -214l614 614l-214 214zM887 1103l214 -214l99 92q13 13 13 32.5t-13 33.5l-153 153q-15 13 -33 13t-33 -13z" /> | |||||
<glyph unicode="" d="M0 1200h1200l-500 -550v-550h300v-100h-800v100h300v550z" /> | |||||
<glyph unicode="" d="M14 84q18 -55 86 -75.5t147 5.5q65 21 109 69t44 90v606l600 155v-521q-64 16 -138 -7q-79 -26 -122.5 -83t-25.5 -111q18 -55 86 -75.5t147 4.5q70 23 111.5 63.5t41.5 95.5v881q0 10 -7 15.5t-17 2.5l-752 -193q-10 -3 -17 -12.5t-7 -19.5v-689q-64 17 -138 -7 q-79 -25 -122.5 -82t-25.5 -112z" /> | |||||
<glyph unicode="" d="M23 693q0 200 142 342t342 142t342 -142t142 -342q0 -142 -78 -261l300 -300q7 -8 7 -18t-7 -18l-109 -109q-8 -7 -18 -7t-18 7l-300 300q-119 -78 -261 -78q-200 0 -342 142t-142 342zM176 693q0 -136 97 -233t234 -97t233.5 96.5t96.5 233.5t-96.5 233.5t-233.5 96.5 t-234 -97t-97 -233z" /> | |||||
<glyph unicode="" d="M100 784q0 64 28 123t73 100.5t104.5 64t119 20.5t120 -38.5t104.5 -104.5q48 69 109.5 105t121.5 38t118.5 -20.5t102.5 -64t71 -100.5t27 -123q0 -57 -33.5 -117.5t-94 -124.5t-126.5 -127.5t-150 -152.5t-146 -174q-62 85 -145.5 174t-149.5 152.5t-126.5 127.5 t-94 124.5t-33.5 117.5z" /> | |||||
<glyph unicode="" d="M-72 800h479l146 400h2l146 -400h472l-382 -278l145 -449l-384 275l-382 -275l146 447zM168 71l2 1z" /> | |||||
<glyph unicode="" d="M-72 800h479l146 400h2l146 -400h472l-382 -278l145 -449l-384 275l-382 -275l146 447zM168 71l2 1zM237 700l196 -142l-73 -226l192 140l195 -141l-74 229l193 140h-235l-77 211l-78 -211h-239z" /> | |||||
<glyph unicode="" d="M0 0v143l400 257v100q-37 0 -68.5 74.5t-31.5 125.5v200q0 124 88 212t212 88t212 -88t88 -212v-200q0 -51 -31.5 -125.5t-68.5 -74.5v-100l400 -257v-143h-1200z" /> | |||||
<glyph unicode="" d="M0 0v1100h1200v-1100h-1200zM100 100h100v100h-100v-100zM100 300h100v100h-100v-100zM100 500h100v100h-100v-100zM100 700h100v100h-100v-100zM100 900h100v100h-100v-100zM300 100h600v400h-600v-400zM300 600h600v400h-600v-400zM1000 100h100v100h-100v-100z M1000 300h100v100h-100v-100zM1000 500h100v100h-100v-100zM1000 700h100v100h-100v-100zM1000 900h100v100h-100v-100z" /> | |||||
<glyph unicode="" d="M0 50v400q0 21 14.5 35.5t35.5 14.5h400q21 0 35.5 -14.5t14.5 -35.5v-400q0 -21 -14.5 -35.5t-35.5 -14.5h-400q-21 0 -35.5 14.5t-14.5 35.5zM0 650v400q0 21 14.5 35.5t35.5 14.5h400q21 0 35.5 -14.5t14.5 -35.5v-400q0 -21 -14.5 -35.5t-35.5 -14.5h-400 q-21 0 -35.5 14.5t-14.5 35.5zM600 50v400q0 21 14.5 35.5t35.5 14.5h400q21 0 35.5 -14.5t14.5 -35.5v-400q0 -21 -14.5 -35.5t-35.5 -14.5h-400q-21 0 -35.5 14.5t-14.5 35.5zM600 650v400q0 21 14.5 35.5t35.5 14.5h400q21 0 35.5 -14.5t14.5 -35.5v-400 q0 -21 -14.5 -35.5t-35.5 -14.5h-400q-21 0 -35.5 14.5t-14.5 35.5z" /> | |||||
<glyph unicode="" d="M0 50v200q0 21 14.5 35.5t35.5 14.5h200q21 0 35.5 -14.5t14.5 -35.5v-200q0 -21 -14.5 -35.5t-35.5 -14.5h-200q-21 0 -35.5 14.5t-14.5 35.5zM0 450v200q0 21 14.5 35.5t35.5 14.5h200q21 0 35.5 -14.5t14.5 -35.5v-200q0 -21 -14.5 -35.5t-35.5 -14.5h-200 q-21 0 -35.5 14.5t-14.5 35.5zM0 850v200q0 21 14.5 35.5t35.5 14.5h200q21 0 35.5 -14.5t14.5 -35.5v-200q0 -21 -14.5 -35.5t-35.5 -14.5h-200q-21 0 -35.5 14.5t-14.5 35.5zM400 50v200q0 21 14.5 35.5t35.5 14.5h200q21 0 35.5 -14.5t14.5 -35.5v-200q0 -21 -14.5 -35.5 t-35.5 -14.5h-200q-21 0 -35.5 14.5t-14.5 35.5zM400 450v200q0 21 14.5 35.5t35.5 14.5h200q21 0 35.5 -14.5t14.5 -35.5v-200q0 -21 -14.5 -35.5t-35.5 -14.5h-200q-21 0 -35.5 14.5t-14.5 35.5zM400 850v200q0 21 14.5 35.5t35.5 14.5h200q21 0 35.5 -14.5t14.5 -35.5 v-200q0 -21 -14.5 -35.5t-35.5 -14.5h-200q-21 0 -35.5 14.5t-14.5 35.5zM800 50v200q0 21 14.5 35.5t35.5 14.5h200q21 0 35.5 -14.5t14.5 -35.5v-200q0 -21 -14.5 -35.5t-35.5 -14.5h-200q-21 0 -35.5 14.5t-14.5 35.5zM800 450v200q0 21 14.5 35.5t35.5 14.5h200 q21 0 35.5 -14.5t14.5 -35.5v-200q0 -21 -14.5 -35.5t-35.5 -14.5h-200q-21 0 -35.5 14.5t-14.5 35.5zM800 850v200q0 21 14.5 35.5t35.5 14.5h200q21 0 35.5 -14.5t14.5 -35.5v-200q0 -21 -14.5 -35.5t-35.5 -14.5h-200q-21 0 -35.5 14.5t-14.5 35.5z" /> | |||||
<glyph unicode="" d="M0 50v200q0 21 14.5 35.5t35.5 14.5h200q21 0 35.5 -14.5t14.5 -35.5v-200q0 -21 -14.5 -35.5t-35.5 -14.5h-200q-21 0 -35.5 14.5t-14.5 35.5zM0 450q0 -21 14.5 -35.5t35.5 -14.5h200q21 0 35.5 14.5t14.5 35.5v200q0 21 -14.5 35.5t-35.5 14.5h-200q-21 0 -35.5 -14.5 t-14.5 -35.5v-200zM0 850v200q0 21 14.5 35.5t35.5 14.5h200q21 0 35.5 -14.5t14.5 -35.5v-200q0 -21 -14.5 -35.5t-35.5 -14.5h-200q-21 0 -35.5 14.5t-14.5 35.5zM400 50v200q0 21 14.5 35.5t35.5 14.5h700q21 0 35.5 -14.5t14.5 -35.5v-200q0 -21 -14.5 -35.5 t-35.5 -14.5h-700q-21 0 -35.5 14.5t-14.5 35.5zM400 450v200q0 21 14.5 35.5t35.5 14.5h700q21 0 35.5 -14.5t14.5 -35.5v-200q0 -21 -14.5 -35.5t-35.5 -14.5h-700q-21 0 -35.5 14.5t-14.5 35.5zM400 850v200q0 21 14.5 35.5t35.5 14.5h700q21 0 35.5 -14.5t14.5 -35.5 v-200q0 -21 -14.5 -35.5t-35.5 -14.5h-700q-21 0 -35.5 14.5t-14.5 35.5z" /> | |||||
<glyph unicode="" d="M29 454l419 -420l818 820l-212 212l-607 -607l-206 207z" /> | |||||
<glyph unicode="" d="M106 318l282 282l-282 282l212 212l282 -282l282 282l212 -212l-282 -282l282 -282l-212 -212l-282 282l-282 -282z" /> | |||||
<glyph unicode="" d="M23 693q0 200 142 342t342 142t342 -142t142 -342q0 -142 -78 -261l300 -300q7 -8 7 -18t-7 -18l-109 -109q-8 -7 -18 -7t-18 7l-300 300q-119 -78 -261 -78q-200 0 -342 142t-142 342zM176 693q0 -136 97 -233t234 -97t233.5 96.5t96.5 233.5t-96.5 233.5t-233.5 96.5 t-234 -97t-97 -233zM300 600v200h100v100h200v-100h100v-200h-100v-100h-200v100h-100z" /> | |||||
<glyph unicode="" d="M23 694q0 200 142 342t342 142t342 -142t142 -342q0 -141 -78 -262l300 -299q7 -7 7 -18t-7 -18l-109 -109q-8 -8 -18 -8t-18 8l-300 300q-119 -78 -261 -78q-200 0 -342 142t-142 342zM176 694q0 -136 97 -233t234 -97t233.5 97t96.5 233t-96.5 233t-233.5 97t-234 -97 t-97 -233zM300 601h400v200h-400v-200z" /> | |||||
<glyph unicode="" d="M23 600q0 183 105 331t272 210v-166q-103 -55 -165 -155t-62 -220q0 -177 125 -302t302 -125t302 125t125 302q0 120 -62 220t-165 155v166q167 -62 272 -210t105 -331q0 -118 -45.5 -224.5t-123 -184t-184 -123t-224.5 -45.5t-224.5 45.5t-184 123t-123 184t-45.5 224.5 zM500 750q0 -21 14.5 -35.5t35.5 -14.5h100q21 0 35.5 14.5t14.5 35.5v400q0 21 -14.5 35.5t-35.5 14.5h-100q-21 0 -35.5 -14.5t-14.5 -35.5v-400z" /> | |||||
<glyph unicode="" d="M100 1h200v300h-200v-300zM400 1v500h200v-500h-200zM700 1v800h200v-800h-200zM1000 1v1200h200v-1200h-200z" /> | |||||
<glyph unicode="" d="M26 601q0 -33 6 -74l151 -38l2 -6q14 -49 38 -93l3 -5l-80 -134q45 -59 105 -105l133 81l5 -3q45 -26 94 -39l5 -2l38 -151q40 -5 74 -5q27 0 74 5l38 151l6 2q46 13 93 39l5 3l134 -81q56 44 104 105l-80 134l3 5q24 44 39 93l1 6l152 38q5 40 5 74q0 28 -5 73l-152 38 l-1 6q-16 51 -39 93l-3 5l80 134q-44 58 -104 105l-134 -81l-5 3q-45 25 -93 39l-6 1l-38 152q-40 5 -74 5q-27 0 -74 -5l-38 -152l-5 -1q-50 -14 -94 -39l-5 -3l-133 81q-59 -47 -105 -105l80 -134l-3 -5q-25 -47 -38 -93l-2 -6l-151 -38q-6 -48 -6 -73zM385 601 q0 88 63 151t152 63t152 -63t63 -151q0 -89 -63 -152t-152 -63t-152 63t-63 152z" /> | |||||
<glyph unicode="" d="M100 1025v50q0 10 7.5 17.5t17.5 7.5h275v100q0 41 29.5 70.5t70.5 29.5h300q41 0 70.5 -29.5t29.5 -70.5v-100h275q10 0 17.5 -7.5t7.5 -17.5v-50q0 -11 -7 -18t-18 -7h-1050q-11 0 -18 7t-7 18zM200 100v800h900v-800q0 -41 -29.5 -71t-70.5 -30h-700q-41 0 -70.5 30 t-29.5 71zM300 100h100v700h-100v-700zM500 100h100v700h-100v-700zM500 1100h300v100h-300v-100zM700 100h100v700h-100v-700zM900 100h100v700h-100v-700z" /> | |||||
<glyph unicode="" d="M1 601l656 644l644 -644h-200v-600h-300v400h-300v-400h-300v600h-200z" /> | |||||
<glyph unicode="" d="M100 25v1150q0 11 7 18t18 7h475v-500h400v-675q0 -11 -7 -18t-18 -7h-850q-11 0 -18 7t-7 18zM700 800v300l300 -300h-300z" /> | |||||
<glyph unicode="" d="M4 600q0 162 80 299t217 217t299 80t299 -80t217 -217t80 -299t-80 -299t-217 -217t-299 -80t-299 80t-217 217t-80 299zM186 600q0 -171 121.5 -292.5t292.5 -121.5t292.5 121.5t121.5 292.5t-121.5 292.5t-292.5 121.5t-292.5 -121.5t-121.5 -292.5zM500 500v400h100 v-300h200v-100h-300z" /> | |||||
<glyph unicode="" d="M-100 0l431 1200h209l-21 -300h162l-20 300h208l431 -1200h-538l-41 400h-242l-40 -400h-539zM488 500h224l-27 300h-170z" /> | |||||
<glyph unicode="" d="M0 0v400h490l-290 300h200v500h300v-500h200l-290 -300h490v-400h-1100zM813 200h175v100h-175v-100z" /> | |||||
<glyph unicode="" d="M1 600q0 122 47.5 233t127.5 191t191 127.5t233 47.5t233 -47.5t191 -127.5t127.5 -191t47.5 -233t-47.5 -233t-127.5 -191t-191 -127.5t-233 -47.5t-233 47.5t-191 127.5t-127.5 191t-47.5 233zM188 600q0 -170 121 -291t291 -121t291 121t121 291t-121 291t-291 121 t-291 -121t-121 -291zM350 600h150v300h200v-300h150l-250 -300z" /> | |||||
<glyph unicode="" d="M4 600q0 162 80 299t217 217t299 80t299 -80t217 -217t80 -299t-80 -299t-217 -217t-299 -80t-299 80t-217 217t-80 299zM186 600q0 -171 121.5 -292.5t292.5 -121.5t292.5 121.5t121.5 292.5t-121.5 292.5t-292.5 121.5t-292.5 -121.5t-121.5 -292.5zM350 600l250 300 l250 -300h-150v-300h-200v300h-150z" /> | |||||
<glyph unicode="" d="M0 25v475l200 700h800l199 -700l1 -475q0 -11 -7 -18t-18 -7h-1150q-11 0 -18 7t-7 18zM200 500h200l50 -200h300l50 200h200l-97 500h-606z" /> | |||||
<glyph unicode="" d="M4 600q0 162 80 299t217 217t299 80t299 -80t217 -217t80 -299t-80 -299t-217 -217t-299 -80t-299 80t-217 217t-80 299zM186 600q0 -172 121.5 -293t292.5 -121t292.5 121t121.5 293q0 171 -121.5 292.5t-292.5 121.5t-292.5 -121.5t-121.5 -292.5zM500 397v401 l297 -200z" /> | |||||
<glyph unicode="" d="M23 600q0 -118 45.5 -224.5t123 -184t184 -123t224.5 -45.5t224.5 45.5t184 123t123 184t45.5 224.5h-150q0 -177 -125 -302t-302 -125t-302 125t-125 302t125 302t302 125q136 0 246 -81l-146 -146h400v400l-145 -145q-157 122 -355 122q-118 0 -224.5 -45.5t-184 -123 t-123 -184t-45.5 -224.5z" /> | |||||
<glyph unicode="" d="M23 600q0 118 45.5 224.5t123 184t184 123t224.5 45.5q198 0 355 -122l145 145v-400h-400l147 147q-112 80 -247 80q-177 0 -302 -125t-125 -302h-150zM100 0v400h400l-147 -147q112 -80 247 -80q177 0 302 125t125 302h150q0 -118 -45.5 -224.5t-123 -184t-184 -123 t-224.5 -45.5q-198 0 -355 122z" /> | |||||
<glyph unicode="" d="M100 0h1100v1200h-1100v-1200zM200 100v900h900v-900h-900zM300 200v100h100v-100h-100zM300 400v100h100v-100h-100zM300 600v100h100v-100h-100zM300 800v100h100v-100h-100zM500 200h500v100h-500v-100zM500 400v100h500v-100h-500zM500 600v100h500v-100h-500z M500 800v100h500v-100h-500z" /> | |||||
<glyph unicode="" d="M0 100v600q0 41 29.5 70.5t70.5 29.5h100v200q0 82 59 141t141 59h300q82 0 141 -59t59 -141v-200h100q41 0 70.5 -29.5t29.5 -70.5v-600q0 -41 -29.5 -70.5t-70.5 -29.5h-900q-41 0 -70.5 29.5t-29.5 70.5zM400 800h300v150q0 21 -14.5 35.5t-35.5 14.5h-200 q-21 0 -35.5 -14.5t-14.5 -35.5v-150z" /> | |||||
<glyph unicode="" d="M100 0v1100h100v-1100h-100zM300 400q60 60 127.5 84t127.5 17.5t122 -23t119 -30t110 -11t103 42t91 120.5v500q-40 -81 -101.5 -115.5t-127.5 -29.5t-138 25t-139.5 40t-125.5 25t-103 -29.5t-65 -115.5v-500z" /> | |||||
<glyph unicode="" d="M0 275q0 -11 7 -18t18 -7h50q11 0 18 7t7 18v300q0 127 70.5 231.5t184.5 161.5t245 57t245 -57t184.5 -161.5t70.5 -231.5v-300q0 -11 7 -18t18 -7h50q11 0 18 7t7 18v300q0 116 -49.5 227t-131 192.5t-192.5 131t-227 49.5t-227 -49.5t-192.5 -131t-131 -192.5 t-49.5 -227v-300zM200 20v460q0 8 6 14t14 6h160q8 0 14 -6t6 -14v-460q0 -8 -6 -14t-14 -6h-160q-8 0 -14 6t-6 14zM800 20v460q0 8 6 14t14 6h160q8 0 14 -6t6 -14v-460q0 -8 -6 -14t-14 -6h-160q-8 0 -14 6t-6 14z" /> | |||||
<glyph unicode="" d="M0 400h300l300 -200v800l-300 -200h-300v-400zM688 459l141 141l-141 141l71 71l141 -141l141 141l71 -71l-141 -141l141 -141l-71 -71l-141 141l-141 -141z" /> | |||||
<glyph unicode="" d="M0 400h300l300 -200v800l-300 -200h-300v-400zM700 857l69 53q111 -135 111 -310q0 -169 -106 -302l-67 54q86 110 86 248q0 146 -93 257z" /> | |||||
<glyph unicode="" d="M0 401v400h300l300 200v-800l-300 200h-300zM702 858l69 53q111 -135 111 -310q0 -170 -106 -303l-67 55q86 110 86 248q0 145 -93 257zM889 951l7 -8q123 -151 123 -344q0 -189 -119 -339l-7 -8l81 -66l6 8q142 178 142 405q0 230 -144 408l-6 8z" /> | |||||
<glyph unicode="" d="M0 0h500v500h-200v100h-100v-100h-200v-500zM0 600h100v100h400v100h100v100h-100v300h-500v-600zM100 100v300h300v-300h-300zM100 800v300h300v-300h-300zM200 200v100h100v-100h-100zM200 900h100v100h-100v-100zM500 500v100h300v-300h200v-100h-100v-100h-200v100 h-100v100h100v200h-200zM600 0v100h100v-100h-100zM600 1000h100v-300h200v-300h300v200h-200v100h200v500h-600v-200zM800 800v300h300v-300h-300zM900 0v100h300v-100h-300zM900 900v100h100v-100h-100zM1100 200v100h100v-100h-100z" /> | |||||
<glyph unicode="" d="M0 200h100v1000h-100v-1000zM100 0v100h300v-100h-300zM200 200v1000h100v-1000h-100zM500 0v91h100v-91h-100zM500 200v1000h200v-1000h-200zM700 0v91h100v-91h-100zM800 200v1000h100v-1000h-100zM900 0v91h200v-91h-200zM1000 200v1000h200v-1000h-200z" /> | |||||
<glyph unicode="" d="M0 700l1 475q0 10 7.5 17.5t17.5 7.5h474l700 -700l-500 -500zM148 953q0 -42 29 -71q30 -30 71.5 -30t71.5 30q29 29 29 71t-29 71q-30 30 -71.5 30t-71.5 -30q-29 -29 -29 -71z" /> | |||||
<glyph unicode="" d="M1 700l1 475q0 11 7 18t18 7h474l700 -700l-500 -500zM148 953q0 -42 30 -71q29 -30 71 -30t71 30q30 29 30 71t-30 71q-29 30 -71 30t-71 -30q-30 -29 -30 -71zM701 1200h100l700 -700l-500 -500l-50 50l450 450z" /> | |||||
<glyph unicode="" d="M100 0v1025l175 175h925v-1000l-100 -100v1000h-750l-100 -100h750v-1000h-900z" /> | |||||
<glyph unicode="" d="M200 0l450 444l450 -443v1150q0 20 -14.5 35t-35.5 15h-800q-21 0 -35.5 -15t-14.5 -35v-1151z" /> | |||||
<glyph unicode="" d="M0 100v700h200l100 -200h600l100 200h200v-700h-200v200h-800v-200h-200zM253 829l40 -124h592l62 124l-94 346q-2 11 -10 18t-18 7h-450q-10 0 -18 -7t-10 -18zM281 24l38 152q2 10 11.5 17t19.5 7h500q10 0 19.5 -7t11.5 -17l38 -152q2 -10 -3.5 -17t-15.5 -7h-600 q-10 0 -15.5 7t-3.5 17z" /> | |||||
<glyph unicode="" d="M0 200q0 -41 29.5 -70.5t70.5 -29.5h1000q41 0 70.5 29.5t29.5 70.5v600q0 41 -29.5 70.5t-70.5 29.5h-150q-4 8 -11.5 21.5t-33 48t-53 61t-69 48t-83.5 21.5h-200q-41 0 -82 -20.5t-70 -50t-52 -59t-34 -50.5l-12 -20h-150q-41 0 -70.5 -29.5t-29.5 -70.5v-600z M356 500q0 100 72 172t172 72t172 -72t72 -172t-72 -172t-172 -72t-172 72t-72 172zM494 500q0 -44 31 -75t75 -31t75 31t31 75t-31 75t-75 31t-75 -31t-31 -75zM900 700v100h100v-100h-100z" /> | |||||
<glyph unicode="" d="M53 0h365v66q-41 0 -72 11t-49 38t1 71l92 234h391l82 -222q16 -45 -5.5 -88.5t-74.5 -43.5v-66h417v66q-34 1 -74 43q-18 19 -33 42t-21 37l-6 13l-385 998h-93l-399 -1006q-24 -48 -52 -75q-12 -12 -33 -25t-36 -20l-15 -7v-66zM416 521l178 457l46 -140l116 -317h-340 z" /> | |||||
<glyph unicode="" d="M100 0v89q41 7 70.5 32.5t29.5 65.5v827q0 28 -1 39.5t-5.5 26t-15.5 21t-29 14t-49 14.5v71l471 -1q120 0 213 -88t93 -228q0 -55 -11.5 -101.5t-28 -74t-33.5 -47.5t-28 -28l-12 -7q8 -3 21.5 -9t48 -31.5t60.5 -58t47.5 -91.5t21.5 -129q0 -84 -59 -156.5t-142 -111 t-162 -38.5h-500zM400 200h161q89 0 153 48.5t64 132.5q0 90 -62.5 154.5t-156.5 64.5h-159v-400zM400 700h139q76 0 130 61.5t54 138.5q0 82 -84 130.5t-239 48.5v-379z" /> | |||||
<glyph unicode="" d="M200 0v57q77 7 134.5 40.5t65.5 80.5l173 849q10 56 -10 74t-91 37q-6 1 -10.5 2.5t-9.5 2.5v57h425l2 -57q-33 -8 -62 -25.5t-46 -37t-29.5 -38t-17.5 -30.5l-5 -12l-128 -825q-10 -52 14 -82t95 -36v-57h-500z" /> | |||||
<glyph unicode="" d="M-75 200h75v800h-75l125 167l125 -167h-75v-800h75l-125 -167zM300 900v300h150h700h150v-300h-50q0 29 -8 48.5t-18.5 30t-33.5 15t-39.5 5.5t-50.5 1h-200v-850l100 -50v-100h-400v100l100 50v850h-200q-34 0 -50.5 -1t-40 -5.5t-33.5 -15t-18.5 -30t-8.5 -48.5h-49z " /> | |||||
<glyph unicode="" d="M33 51l167 125v-75h800v75l167 -125l-167 -125v75h-800v-75zM100 901v300h150h700h150v-300h-50q0 29 -8 48.5t-18 30t-33.5 15t-40 5.5t-50.5 1h-200v-650l100 -50v-100h-400v100l100 50v650h-200q-34 0 -50.5 -1t-39.5 -5.5t-33.5 -15t-18.5 -30t-8 -48.5h-50z" /> | |||||
<glyph unicode="" d="M0 50q0 -20 14.5 -35t35.5 -15h1100q21 0 35.5 15t14.5 35v100q0 21 -14.5 35.5t-35.5 14.5h-1100q-21 0 -35.5 -14.5t-14.5 -35.5v-100zM0 350q0 -20 14.5 -35t35.5 -15h800q21 0 35.5 15t14.5 35v100q0 21 -14.5 35.5t-35.5 14.5h-800q-21 0 -35.5 -14.5t-14.5 -35.5 v-100zM0 650q0 -20 14.5 -35t35.5 -15h1000q21 0 35.5 15t14.5 35v100q0 21 -14.5 35.5t-35.5 14.5h-1000q-21 0 -35.5 -14.5t-14.5 -35.5v-100zM0 950q0 -20 14.5 -35t35.5 -15h600q21 0 35.5 15t14.5 35v100q0 21 -14.5 35.5t-35.5 14.5h-600q-21 0 -35.5 -14.5 t-14.5 -35.5v-100z" /> | |||||
<glyph unicode="" d="M0 50q0 -20 14.5 -35t35.5 -15h1100q21 0 35.5 15t14.5 35v100q0 21 -14.5 35.5t-35.5 14.5h-1100q-21 0 -35.5 -14.5t-14.5 -35.5v-100zM0 650q0 -20 14.5 -35t35.5 -15h1100q21 0 35.5 15t14.5 35v100q0 21 -14.5 35.5t-35.5 14.5h-1100q-21 0 -35.5 -14.5t-14.5 -35.5 v-100zM200 350q0 -20 14.5 -35t35.5 -15h700q21 0 35.5 15t14.5 35v100q0 21 -14.5 35.5t-35.5 14.5h-700q-21 0 -35.5 -14.5t-14.5 -35.5v-100zM200 950q0 -20 14.5 -35t35.5 -15h700q21 0 35.5 15t14.5 35v100q0 21 -14.5 35.5t-35.5 14.5h-700q-21 0 -35.5 -14.5 t-14.5 -35.5v-100z" /> | |||||
<glyph unicode="" d="M0 50v100q0 21 14.5 35.5t35.5 14.5h1100q21 0 35.5 -14.5t14.5 -35.5v-100q0 -20 -14.5 -35t-35.5 -15h-1100q-21 0 -35.5 15t-14.5 35zM100 650v100q0 21 14.5 35.5t35.5 14.5h1000q21 0 35.5 -14.5t14.5 -35.5v-100q0 -20 -14.5 -35t-35.5 -15h-1000q-21 0 -35.5 15 t-14.5 35zM300 350v100q0 21 14.5 35.5t35.5 14.5h800q21 0 35.5 -14.5t14.5 -35.5v-100q0 -20 -14.5 -35t-35.5 -15h-800q-21 0 -35.5 15t-14.5 35zM500 950v100q0 21 14.5 35.5t35.5 14.5h600q21 0 35.5 -14.5t14.5 -35.5v-100q0 -20 -14.5 -35t-35.5 -15h-600 q-21 0 -35.5 15t-14.5 35z" /> | |||||
<glyph unicode="" d="M0 50v100q0 21 14.5 35.5t35.5 14.5h1100q21 0 35.5 -14.5t14.5 -35.5v-100q0 -20 -14.5 -35t-35.5 -15h-1100q-21 0 -35.5 15t-14.5 35zM0 350v100q0 21 14.5 35.5t35.5 14.5h1100q21 0 35.5 -14.5t14.5 -35.5v-100q0 -20 -14.5 -35t-35.5 -15h-1100q-21 0 -35.5 15 t-14.5 35zM0 650v100q0 21 14.5 35.5t35.5 14.5h1100q21 0 35.5 -14.5t14.5 -35.5v-100q0 -20 -14.5 -35t-35.5 -15h-1100q-21 0 -35.5 15t-14.5 35zM0 950v100q0 21 14.5 35.5t35.5 14.5h1100q21 0 35.5 -14.5t14.5 -35.5v-100q0 -20 -14.5 -35t-35.5 -15h-1100 q-21 0 -35.5 15t-14.5 35z" /> | |||||
<glyph unicode="" d="M0 50v100q0 21 14.5 35.5t35.5 14.5h100q21 0 35.5 -14.5t14.5 -35.5v-100q0 -20 -14.5 -35t-35.5 -15h-100q-21 0 -35.5 15t-14.5 35zM0 350v100q0 21 14.5 35.5t35.5 14.5h100q21 0 35.5 -14.5t14.5 -35.5v-100q0 -20 -14.5 -35t-35.5 -15h-100q-21 0 -35.5 15 t-14.5 35zM0 650v100q0 21 14.5 35.5t35.5 14.5h100q21 0 35.5 -14.5t14.5 -35.5v-100q0 -20 -14.5 -35t-35.5 -15h-100q-21 0 -35.5 15t-14.5 35zM0 950v100q0 21 14.5 35.5t35.5 14.5h100q21 0 35.5 -14.5t14.5 -35.5v-100q0 -20 -14.5 -35t-35.5 -15h-100q-21 0 -35.5 15 t-14.5 35zM300 50v100q0 21 14.5 35.5t35.5 14.5h800q21 0 35.5 -14.5t14.5 -35.5v-100q0 -20 -14.5 -35t-35.5 -15h-800q-21 0 -35.5 15t-14.5 35zM300 350v100q0 21 14.5 35.5t35.5 14.5h800q21 0 35.5 -14.5t14.5 -35.5v-100q0 -20 -14.5 -35t-35.5 -15h-800 q-21 0 -35.5 15t-14.5 35zM300 650v100q0 21 14.5 35.5t35.5 14.5h800q21 0 35.5 -14.5t14.5 -35.5v-100q0 -20 -14.5 -35t-35.5 -15h-800q-21 0 -35.5 15t-14.5 35zM300 950v100q0 21 14.5 35.5t35.5 14.5h800q21 0 35.5 -14.5t14.5 -35.5v-100q0 -20 -14.5 -35t-35.5 -15 h-800q-21 0 -35.5 15t-14.5 35z" /> | |||||
<glyph unicode="" d="M-101 500v100h201v75l166 -125l-166 -125v75h-201zM300 0h100v1100h-100v-1100zM500 50q0 -20 14.5 -35t35.5 -15h600q20 0 35 15t15 35v100q0 21 -15 35.5t-35 14.5h-600q-21 0 -35.5 -14.5t-14.5 -35.5v-100zM500 350q0 -20 14.5 -35t35.5 -15h300q20 0 35 15t15 35 v100q0 21 -15 35.5t-35 14.5h-300q-21 0 -35.5 -14.5t-14.5 -35.5v-100zM500 650q0 -20 14.5 -35t35.5 -15h500q20 0 35 15t15 35v100q0 21 -15 35.5t-35 14.5h-500q-21 0 -35.5 -14.5t-14.5 -35.5v-100zM500 950q0 -20 14.5 -35t35.5 -15h100q20 0 35 15t15 35v100 q0 21 -15 35.5t-35 14.5h-100q-21 0 -35.5 -14.5t-14.5 -35.5v-100z" /> | |||||
<glyph unicode="" d="M1 50q0 -20 14.5 -35t35.5 -15h600q20 0 35 15t15 35v100q0 21 -15 35.5t-35 14.5h-600q-21 0 -35.5 -14.5t-14.5 -35.5v-100zM1 350q0 -20 14.5 -35t35.5 -15h300q20 0 35 15t15 35v100q0 21 -15 35.5t-35 14.5h-300q-21 0 -35.5 -14.5t-14.5 -35.5v-100zM1 650 q0 -20 14.5 -35t35.5 -15h500q20 0 35 15t15 35v100q0 21 -15 35.5t-35 14.5h-500q-21 0 -35.5 -14.5t-14.5 -35.5v-100zM1 950q0 -20 14.5 -35t35.5 -15h100q20 0 35 15t15 35v100q0 21 -15 35.5t-35 14.5h-100q-21 0 -35.5 -14.5t-14.5 -35.5v-100zM801 0v1100h100v-1100 h-100zM934 550l167 -125v75h200v100h-200v75z" /> | |||||
<glyph unicode="" d="M0 275v650q0 31 22 53t53 22h750q31 0 53 -22t22 -53v-650q0 -31 -22 -53t-53 -22h-750q-31 0 -53 22t-22 53zM900 600l300 300v-600z" /> | |||||
<glyph unicode="" d="M0 44v1012q0 18 13 31t31 13h1112q19 0 31.5 -13t12.5 -31v-1012q0 -18 -12.5 -31t-31.5 -13h-1112q-18 0 -31 13t-13 31zM100 263l247 182l298 -131l-74 156l293 318l236 -288v500h-1000v-737zM208 750q0 56 39 95t95 39t95 -39t39 -95t-39 -95t-95 -39t-95 39t-39 95z " /> | |||||
<glyph unicode="" d="M148 745q0 124 60.5 231.5t165 172t226.5 64.5q123 0 227 -63t164.5 -169.5t60.5 -229.5t-73 -272q-73 -114 -166.5 -237t-150.5 -189l-57 -66q-10 9 -27 26t-66.5 70.5t-96 109t-104 135.5t-100.5 155q-63 139 -63 262zM342 772q0 -107 75.5 -182.5t181.5 -75.5 q107 0 182.5 75.5t75.5 182.5t-75.5 182t-182.5 75t-182 -75.5t-75 -181.5z" /> | |||||
<glyph unicode="" d="M1 600q0 122 47.5 233t127.5 191t191 127.5t233 47.5t233 -47.5t191 -127.5t127.5 -191t47.5 -233t-47.5 -233t-127.5 -191t-191 -127.5t-233 -47.5t-233 47.5t-191 127.5t-127.5 191t-47.5 233zM173 600q0 -177 125.5 -302t301.5 -125v854q-176 0 -301.5 -125 t-125.5 -302z" /> | |||||
<glyph unicode="" d="M117 406q0 94 34 186t88.5 172.5t112 159t115 177t87.5 194.5q21 -71 57.5 -142.5t76 -130.5t83 -118.5t82 -117t70 -116t50 -125.5t18.5 -136q0 -89 -39 -165.5t-102 -126.5t-140 -79.5t-156 -33.5q-114 6 -211.5 53t-161.5 139t-64 210zM243 414q14 -82 59.5 -136 t136.5 -80l16 98q-7 6 -18 17t-34 48t-33 77q-15 73 -14 143.5t10 122.5l9 51q-92 -110 -119.5 -185t-12.5 -156z" /> | |||||
<glyph unicode="" d="M0 400v300q0 165 117.5 282.5t282.5 117.5q366 -6 397 -14l-186 -186h-311q-41 0 -70.5 -29.5t-29.5 -70.5v-500q0 -41 29.5 -70.5t70.5 -29.5h500q41 0 70.5 29.5t29.5 70.5v125l200 200v-225q0 -165 -117.5 -282.5t-282.5 -117.5h-300q-165 0 -282.5 117.5 t-117.5 282.5zM436 341l161 50l412 412l-114 113l-405 -405zM995 1015l113 -113l113 113l-21 85l-92 28z" /> | |||||
<glyph unicode="" d="M0 400v300q0 165 117.5 282.5t282.5 117.5h261l2 -80q-133 -32 -218 -120h-145q-41 0 -70.5 -29.5t-29.5 -70.5v-500q0 -41 29.5 -70.5t70.5 -29.5h500q41 0 70.5 29.5t29.5 70.5l200 153v-53q0 -165 -117.5 -282.5t-282.5 -117.5h-300q-165 0 -282.5 117.5t-117.5 282.5 zM423 524q30 38 81.5 64t103 35.5t99 14t77.5 3.5l29 -1v-209l360 324l-359 318v-216q-7 0 -19 -1t-48 -8t-69.5 -18.5t-76.5 -37t-76.5 -59t-62 -88t-39.5 -121.5z" /> | |||||
<glyph unicode="" d="M0 400v300q0 165 117.5 282.5t282.5 117.5h300q61 0 127 -23l-178 -177h-349q-41 0 -70.5 -29.5t-29.5 -70.5v-500q0 -41 29.5 -70.5t70.5 -29.5h500q41 0 70.5 29.5t29.5 70.5v69l200 200v-169q0 -165 -117.5 -282.5t-282.5 -117.5h-300q-165 0 -282.5 117.5 t-117.5 282.5zM342 632l283 -284l567 567l-137 137l-430 -431l-146 147z" /> | |||||
<glyph unicode="" d="M0 603l300 296v-198h200v200h-200l300 300l295 -300h-195v-200h200v198l300 -296l-300 -300v198h-200v-200h195l-295 -300l-300 300h200v200h-200v-198z" /> | |||||
<glyph unicode="" d="M200 50v1000q0 21 14.5 35.5t35.5 14.5h100q21 0 35.5 -14.5t14.5 -35.5v-437l500 487v-1100l-500 488v-438q0 -21 -14.5 -35.5t-35.5 -14.5h-100q-21 0 -35.5 14.5t-14.5 35.5z" /> | |||||
<glyph unicode="" d="M0 50v1000q0 21 14.5 35.5t35.5 14.5h100q21 0 35.5 -14.5t14.5 -35.5v-437l500 487v-487l500 487v-1100l-500 488v-488l-500 488v-438q0 -21 -14.5 -35.5t-35.5 -14.5h-100q-21 0 -35.5 14.5t-14.5 35.5z" /> | |||||
<glyph unicode="" d="M136 550l564 550v-487l500 487v-1100l-500 488v-488z" /> | |||||
<glyph unicode="" d="M200 0l900 550l-900 550v-1100z" /> | |||||
<glyph unicode="" d="M200 150q0 -21 14.5 -35.5t35.5 -14.5h200q21 0 35.5 14.5t14.5 35.5v800q0 21 -14.5 35.5t-35.5 14.5h-200q-21 0 -35.5 -14.5t-14.5 -35.5v-800zM600 150q0 -21 14.5 -35.5t35.5 -14.5h200q21 0 35.5 14.5t14.5 35.5v800q0 21 -14.5 35.5t-35.5 14.5h-200 q-21 0 -35.5 -14.5t-14.5 -35.5v-800z" /> | |||||
<glyph unicode="" d="M200 150q0 -20 14.5 -35t35.5 -15h800q21 0 35.5 15t14.5 35v800q0 21 -14.5 35.5t-35.5 14.5h-800q-21 0 -35.5 -14.5t-14.5 -35.5v-800z" /> | |||||
<glyph unicode="" d="M0 0v1100l500 -487v487l564 -550l-564 -550v488z" /> | |||||
<glyph unicode="" d="M0 0v1100l500 -487v487l500 -487v437q0 21 14.5 35.5t35.5 14.5h100q21 0 35.5 -14.5t14.5 -35.5v-1000q0 -21 -14.5 -35.5t-35.5 -14.5h-100q-21 0 -35.5 14.5t-14.5 35.5v438l-500 -488v488z" /> | |||||
<glyph unicode="" d="M300 0v1100l500 -487v437q0 21 14.5 35.5t35.5 14.5h100q21 0 35.5 -14.5t14.5 -35.5v-1000q0 -21 -14.5 -35.5t-35.5 -14.5h-100q-21 0 -35.5 14.5t-14.5 35.5v438z" /> | |||||
<glyph unicode="" d="M100 250v100q0 21 14.5 35.5t35.5 14.5h1000q21 0 35.5 -14.5t14.5 -35.5v-100q0 -21 -14.5 -35.5t-35.5 -14.5h-1000q-21 0 -35.5 14.5t-14.5 35.5zM100 500h1100l-550 564z" /> | |||||
<glyph unicode="" d="M185 599l592 -592l240 240l-353 353l353 353l-240 240z" /> | |||||
<glyph unicode="" d="M272 194l353 353l-353 353l241 240l572 -571l21 -22l-1 -1v-1l-592 -591z" /> | |||||
<glyph unicode="" d="M3 600q0 162 80 299.5t217.5 217.5t299.5 80t299.5 -80t217.5 -217.5t80 -299.5t-80 -299.5t-217.5 -217.5t-299.5 -80t-299.5 80t-217.5 217.5t-80 299.5zM300 500h200v-200h200v200h200v200h-200v200h-200v-200h-200v-200z" /> | |||||
<glyph unicode="" d="M3 600q0 162 80 299.5t217.5 217.5t299.5 80t299.5 -80t217.5 -217.5t80 -299.5t-80 -299.5t-217.5 -217.5t-299.5 -80t-299.5 80t-217.5 217.5t-80 299.5zM300 500h600v200h-600v-200z" /> | |||||
<glyph unicode="" d="M3 600q0 162 80 299.5t217.5 217.5t299.5 80t299.5 -80t217.5 -217.5t80 -299.5t-80 -299.5t-217.5 -217.5t-299.5 -80t-299.5 80t-217.5 217.5t-80 299.5zM246 459l213 -213l141 142l141 -142l213 213l-142 141l142 141l-213 212l-141 -141l-141 142l-212 -213l141 -141 z" /> | |||||
<glyph unicode="" d="M3 600q0 162 80 299.5t217.5 217.5t299.5 80t299.5 -80t217.5 -217.5t80 -299.5t-80 -299.5t-217.5 -217.5t-299.5 -80t-299.5 80t-217.5 217.5t-80 299.5zM270 551l276 -277l411 411l-175 174l-236 -236l-102 102z" /> | |||||
<glyph unicode="" d="M3 600q0 162 80 299.5t217.5 217.5t299.5 80t299.5 -80t217.5 -217.5t80 -299.5t-80 -299.5t-217.5 -217.5t-299.5 -80t-299.5 80t-217.5 217.5t-80 299.5zM364 700h143q4 0 11.5 -1t11 -1t6.5 3t3 9t1 11t3.5 8.5t3.5 6t5.5 4t6.5 2.5t9 1.5t9 0.5h11.5h12.5 q19 0 30 -10t11 -26q0 -22 -4 -28t-27 -22q-5 -1 -12.5 -3t-27 -13.5t-34 -27t-26.5 -46t-11 -68.5h200q5 3 14 8t31.5 25.5t39.5 45.5t31 69t14 94q0 51 -17.5 89t-42 58t-58.5 32t-58.5 15t-51.5 3q-50 0 -90.5 -12t-75 -38.5t-53.5 -74.5t-19 -114zM500 300h200v100h-200 v-100z" /> | |||||
<glyph unicode="" d="M3 600q0 162 80 299.5t217.5 217.5t299.5 80t299.5 -80t217.5 -217.5t80 -299.5t-80 -299.5t-217.5 -217.5t-299.5 -80t-299.5 80t-217.5 217.5t-80 299.5zM400 300h400v100h-100v300h-300v-100h100v-200h-100v-100zM500 800h200v100h-200v-100z" /> | |||||
<glyph unicode="" d="M0 500v200h195q31 125 98.5 199.5t206.5 100.5v200h200v-200q54 -20 113 -60t112.5 -105.5t71.5 -134.5h203v-200h-203q-25 -102 -116.5 -186t-180.5 -117v-197h-200v197q-140 27 -208 102.5t-98 200.5h-194zM290 500q24 -73 79.5 -127.5t130.5 -78.5v206h200v-206 q149 48 201 206h-201v200h200q-25 74 -75.5 127t-124.5 77v-204h-200v203q-75 -23 -130 -77t-79 -126h209v-200h-210z" /> | |||||
<glyph unicode="" d="M4 600q0 162 80 299t217 217t299 80t299 -80t217 -217t80 -299t-80 -299t-217 -217t-299 -80t-299 80t-217 217t-80 299zM186 600q0 -171 121.5 -292.5t292.5 -121.5t292.5 121.5t121.5 292.5t-121.5 292.5t-292.5 121.5t-292.5 -121.5t-121.5 -292.5zM356 465l135 135 l-135 135l109 109l135 -135l135 135l109 -109l-135 -135l135 -135l-109 -109l-135 135l-135 -135z" /> | |||||
<glyph unicode="" d="M4 600q0 162 80 299t217 217t299 80t299 -80t217 -217t80 -299t-80 -299t-217 -217t-299 -80t-299 80t-217 217t-80 299zM186 600q0 -171 121.5 -292.5t292.5 -121.5t292.5 121.5t121.5 292.5t-121.5 292.5t-292.5 121.5t-292.5 -121.5t-121.5 -292.5zM322 537l141 141 l87 -87l204 205l142 -142l-346 -345z" /> | |||||
<glyph unicode="" d="M4 600q0 162 80 299t217 217t299 80t299 -80t217 -217t80 -299t-80 -299t-217 -217t-299 -80t-299 80t-217 217t-80 299zM186 600q0 -115 62 -215l568 567q-100 62 -216 62q-171 0 -292.5 -121.5t-121.5 -292.5zM391 245q97 -59 209 -59q171 0 292.5 121.5t121.5 292.5 q0 112 -59 209z" /> | |||||
<glyph unicode="" d="M0 547l600 453v-300h600v-300h-600v-301z" /> | |||||
<glyph unicode="" d="M0 400v300h600v300l600 -453l-600 -448v301h-600z" /> | |||||
<glyph unicode="" d="M204 600l450 600l444 -600h-298v-600h-300v600h-296z" /> | |||||
<glyph unicode="" d="M104 600h296v600h300v-600h298l-449 -600z" /> | |||||
<glyph unicode="" d="M0 200q6 132 41 238.5t103.5 193t184 138t271.5 59.5v271l600 -453l-600 -448v301q-95 -2 -183 -20t-170 -52t-147 -92.5t-100 -135.5z" /> | |||||
<glyph unicode="" d="M0 0v400l129 -129l294 294l142 -142l-294 -294l129 -129h-400zM635 777l142 -142l294 294l129 -129v400h-400l129 -129z" /> | |||||
<glyph unicode="" d="M34 176l295 295l-129 129h400v-400l-129 130l-295 -295zM600 600v400l129 -129l295 295l142 -141l-295 -295l129 -130h-400z" /> | |||||
<glyph unicode="" d="M23 600q0 118 45.5 224.5t123 184t184 123t224.5 45.5t224.5 -45.5t184 -123t123 -184t45.5 -224.5t-45.5 -224.5t-123 -184t-184 -123t-224.5 -45.5t-224.5 45.5t-184 123t-123 184t-45.5 224.5zM456 851l58 -302q4 -20 21.5 -34.5t37.5 -14.5h54q20 0 37.5 14.5 t21.5 34.5l58 302q4 20 -8 34.5t-32 14.5h-207q-21 0 -33 -14.5t-8 -34.5zM500 300h200v100h-200v-100z" /> | |||||
<glyph unicode="" d="M0 800h100v-200h400v300h200v-300h400v200h100v100h-111q1 1 1 6.5t-1.5 15t-3.5 17.5l-34 172q-11 39 -41.5 63t-69.5 24q-32 0 -61 -17l-239 -144q-22 -13 -40 -35q-19 24 -40 36l-238 144q-33 18 -62 18q-39 0 -69.5 -23t-40.5 -61l-35 -177q-2 -8 -3 -18t-1 -15v-6 h-111v-100zM100 0h400v400h-400v-400zM200 900q-3 0 14 48t36 96l18 47l213 -191h-281zM700 0v400h400v-400h-400zM731 900l202 197q5 -12 12 -32.5t23 -64t25 -72t7 -28.5h-269z" /> | |||||
<glyph unicode="" d="M0 -22v143l216 193q-9 53 -13 83t-5.5 94t9 113t38.5 114t74 124q47 60 99.5 102.5t103 68t127.5 48t145.5 37.5t184.5 43.5t220 58.5q0 -189 -22 -343t-59 -258t-89 -181.5t-108.5 -120t-122 -68t-125.5 -30t-121.5 -1.5t-107.5 12.5t-87.5 17t-56.5 7.5l-99 -55z M238.5 300.5q19.5 -6.5 86.5 76.5q55 66 367 234q70 38 118.5 69.5t102 79t99 111.5t86.5 148q22 50 24 60t-6 19q-7 5 -17 5t-26.5 -14.5t-33.5 -39.5q-35 -51 -113.5 -108.5t-139.5 -89.5l-61 -32q-369 -197 -458 -401q-48 -111 -28.5 -117.5z" /> | |||||
<glyph unicode="" d="M111 408q0 -33 5 -63q9 -56 44 -119.5t105 -108.5q31 -21 64 -16t62 23.5t57 49.5t48 61.5t35 60.5q32 66 39 184.5t-13 157.5q79 -80 122 -164t26 -184q-5 -33 -20.5 -69.5t-37.5 -80.5q-10 -19 -14.5 -29t-12 -26t-9 -23.5t-3 -19t2.5 -15.5t11 -9.5t19.5 -5t30.5 2.5 t42 8q57 20 91 34t87.5 44.5t87 64t65.5 88.5t47 122q38 172 -44.5 341.5t-246.5 278.5q22 -44 43 -129q39 -159 -32 -154q-15 2 -33 9q-79 33 -120.5 100t-44 175.5t48.5 257.5q-13 -8 -34 -23.5t-72.5 -66.5t-88.5 -105.5t-60 -138t-8 -166.5q2 -12 8 -41.5t8 -43t6 -39.5 t3.5 -39.5t-1 -33.5t-6 -31.5t-13.5 -24t-21 -20.5t-31 -12q-38 -10 -67 13t-40.5 61.5t-15 81.5t10.5 75q-52 -46 -83.5 -101t-39 -107t-7.5 -85z" /> | |||||
<glyph unicode="" d="M-61 600l26 40q6 10 20 30t49 63.5t74.5 85.5t97 90t116.5 83.5t132.5 59t145.5 23.5t145.5 -23.5t132.5 -59t116.5 -83.5t97 -90t74.5 -85.5t49 -63.5t20 -30l26 -40l-26 -40q-6 -10 -20 -30t-49 -63.5t-74.5 -85.5t-97 -90t-116.5 -83.5t-132.5 -59t-145.5 -23.5 t-145.5 23.5t-132.5 59t-116.5 83.5t-97 90t-74.5 85.5t-49 63.5t-20 30zM120 600q7 -10 40.5 -58t56 -78.5t68 -77.5t87.5 -75t103 -49.5t125 -21.5t123.5 20t100.5 45.5t85.5 71.5t66.5 75.5t58 81.5t47 66q-1 1 -28.5 37.5t-42 55t-43.5 53t-57.5 63.5t-58.5 54 q49 -74 49 -163q0 -124 -88 -212t-212 -88t-212 88t-88 212q0 85 46 158q-102 -87 -226 -258zM377 656q49 -124 154 -191l105 105q-37 24 -75 72t-57 84l-20 36z" /> | |||||
<glyph unicode="" d="M-61 600l26 40q6 10 20 30t49 63.5t74.5 85.5t97 90t116.5 83.5t132.5 59t145.5 23.5q61 0 121 -17l37 142h148l-314 -1200h-148l37 143q-82 21 -165 71.5t-140 102t-109.5 112t-72 88.5t-29.5 43zM120 600q210 -282 393 -336l37 141q-107 18 -178.5 101.5t-71.5 193.5 q0 85 46 158q-102 -87 -226 -258zM377 656q49 -124 154 -191l47 47l23 87q-30 28 -59 69t-44 68l-14 26zM780 161l38 145q22 15 44.5 34t46 44t40.5 44t41 50.5t33.5 43.5t33 44t24.5 34q-97 127 -140 175l39 146q67 -54 131.5 -125.5t87.5 -103.5t36 -52l26 -40l-26 -40 q-7 -12 -25.5 -38t-63.5 -79.5t-95.5 -102.5t-124 -100t-146.5 -79z" /> | |||||
<glyph unicode="" d="M-97.5 34q13.5 -34 50.5 -34h1294q37 0 50.5 35.5t-7.5 67.5l-642 1056q-20 34 -48 36.5t-48 -29.5l-642 -1066q-21 -32 -7.5 -66zM155 200l445 723l445 -723h-345v100h-200v-100h-345zM500 600l100 -300l100 300v100h-200v-100z" /> | |||||
<glyph unicode="" d="M100 262v41q0 20 11 44.5t26 38.5l363 325v339q0 62 44 106t106 44t106 -44t44 -106v-339l363 -325q15 -14 26 -38.5t11 -44.5v-41q0 -20 -12 -26.5t-29 5.5l-359 249v-263q100 -91 100 -113v-64q0 -20 -13 -28.5t-32 0.5l-94 78h-222l-94 -78q-19 -9 -32 -0.5t-13 28.5 v64q0 22 100 113v263l-359 -249q-17 -12 -29 -5.5t-12 26.5z" /> | |||||
<glyph unicode="" d="M0 50q0 -20 14.5 -35t35.5 -15h1000q21 0 35.5 15t14.5 35v750h-1100v-750zM0 900h1100v150q0 21 -14.5 35.5t-35.5 14.5h-150v100h-100v-100h-500v100h-100v-100h-150q-21 0 -35.5 -14.5t-14.5 -35.5v-150zM100 100v100h100v-100h-100zM100 300v100h100v-100h-100z M100 500v100h100v-100h-100zM300 100v100h100v-100h-100zM300 300v100h100v-100h-100zM300 500v100h100v-100h-100zM500 100v100h100v-100h-100zM500 300v100h100v-100h-100zM500 500v100h100v-100h-100zM700 100v100h100v-100h-100zM700 300v100h100v-100h-100zM700 500 v100h100v-100h-100zM900 100v100h100v-100h-100zM900 300v100h100v-100h-100zM900 500v100h100v-100h-100z" /> | |||||
<glyph unicode="" d="M0 200v200h259l600 600h241v198l300 -295l-300 -300v197h-159l-600 -600h-341zM0 800h259l122 -122l141 142l-181 180h-341v-200zM678 381l141 142l122 -123h159v198l300 -295l-300 -300v197h-241z" /> | |||||
<glyph unicode="" d="M0 400v600q0 41 29.5 70.5t70.5 29.5h1000q41 0 70.5 -29.5t29.5 -70.5v-600q0 -41 -29.5 -70.5t-70.5 -29.5h-596l-304 -300v300h-100q-41 0 -70.5 29.5t-29.5 70.5z" /> | |||||
<glyph unicode="" d="M100 600v200h300v-250q0 -113 6 -145q17 -92 102 -117q39 -11 92 -11q37 0 66.5 5.5t50 15.5t36 24t24 31.5t14 37.5t7 42t2.5 45t0 47v25v250h300v-200q0 -42 -3 -83t-15 -104t-31.5 -116t-58 -109.5t-89 -96.5t-129 -65.5t-174.5 -25.5t-174.5 25.5t-129 65.5t-89 96.5 t-58 109.5t-31.5 116t-15 104t-3 83zM100 900v300h300v-300h-300zM800 900v300h300v-300h-300z" /> | |||||
<glyph unicode="" d="M-30 411l227 -227l352 353l353 -353l226 227l-578 579z" /> | |||||
<glyph unicode="" d="M70 797l580 -579l578 579l-226 227l-353 -353l-352 353z" /> | |||||
<glyph unicode="" d="M-198 700l299 283l300 -283h-203v-400h385l215 -200h-800v600h-196zM402 1000l215 -200h381v-400h-198l299 -283l299 283h-200v600h-796z" /> | |||||
<glyph unicode="" d="M18 939q-5 24 10 42q14 19 39 19h896l38 162q5 17 18.5 27.5t30.5 10.5h94q20 0 35 -14.5t15 -35.5t-15 -35.5t-35 -14.5h-54l-201 -961q-2 -4 -6 -10.5t-19 -17.5t-33 -11h-31v-50q0 -20 -14.5 -35t-35.5 -15t-35.5 15t-14.5 35v50h-300v-50q0 -20 -14.5 -35t-35.5 -15 t-35.5 15t-14.5 35v50h-50q-21 0 -35.5 15t-14.5 35q0 21 14.5 35.5t35.5 14.5h535l48 200h-633q-32 0 -54.5 21t-27.5 43z" /> | |||||
<glyph unicode="" d="M0 0v800h1200v-800h-1200zM0 900v100h200q0 41 29.5 70.5t70.5 29.5h300q41 0 70.5 -29.5t29.5 -70.5h500v-100h-1200z" /> | |||||
<glyph unicode="" d="M1 0l300 700h1200l-300 -700h-1200zM1 400v600h200q0 41 29.5 70.5t70.5 29.5h300q41 0 70.5 -29.5t29.5 -70.5h500v-200h-1000z" /> | |||||
<glyph unicode="" d="M302 300h198v600h-198l298 300l298 -300h-198v-600h198l-298 -300z" /> | |||||
<glyph unicode="" d="M0 600l300 298v-198h600v198l300 -298l-300 -297v197h-600v-197z" /> | |||||
<glyph unicode="" d="M0 100v100q0 41 29.5 70.5t70.5 29.5h1000q41 0 70.5 -29.5t29.5 -70.5v-100q0 -41 -29.5 -70.5t-70.5 -29.5h-1000q-41 0 -70.5 29.5t-29.5 70.5zM31 400l172 739q5 22 23 41.5t38 19.5h672q19 0 37.5 -22.5t23.5 -45.5l172 -732h-1138zM800 100h100v100h-100v-100z M1000 100h100v100h-100v-100z" /> | |||||
<glyph unicode="" d="M-101 600v50q0 24 25 49t50 38l25 13v-250l-11 5.5t-24 14t-30 21.5t-24 27.5t-11 31.5zM100 500v250v8v8v7t0.5 7t1.5 5.5t2 5t3 4t4.5 3.5t6 1.5t7.5 0.5h200l675 250v-850l-675 200h-38l47 -276q2 -12 -3 -17.5t-11 -6t-21 -0.5h-8h-83q-20 0 -34.5 14t-18.5 35 q-55 337 -55 351zM1100 200v850q0 21 14.5 35.5t35.5 14.5q20 0 35 -14.5t15 -35.5v-850q0 -20 -15 -35t-35 -15q-21 0 -35.5 15t-14.5 35z" /> | |||||
<glyph unicode="" d="M74 350q0 21 13.5 35.5t33.5 14.5h18l117 173l63 327q15 77 76 140t144 83l-18 32q-6 19 3 32t29 13h94q20 0 29 -10.5t3 -29.5q-18 -36 -18 -37q83 -19 144 -82.5t76 -140.5l63 -327l118 -173h17q20 0 33.5 -14.5t13.5 -35.5q0 -20 -13 -40t-31 -27q-8 -3 -23 -8.5 t-65 -20t-103 -25t-132.5 -19.5t-158.5 -9q-125 0 -245.5 20.5t-178.5 40.5l-58 20q-18 7 -31 27.5t-13 40.5zM497 110q12 -49 40 -79.5t63 -30.5t63 30.5t39 79.5q-48 -6 -102 -6t-103 6z" /> | |||||
<glyph unicode="" d="M21 445l233 -45l-78 -224l224 78l45 -233l155 179l155 -179l45 233l224 -78l-78 224l234 45l-180 155l180 156l-234 44l78 225l-224 -78l-45 233l-155 -180l-155 180l-45 -233l-224 78l78 -225l-233 -44l179 -156z" /> | |||||
<glyph unicode="" d="M0 200h200v600h-200v-600zM300 275q0 -75 100 -75h61q124 -100 139 -100h250q46 0 83 57l238 344q29 31 29 74v100q0 44 -30.5 84.5t-69.5 40.5h-328q28 118 28 125v150q0 44 -30.5 84.5t-69.5 40.5h-50q-27 0 -51 -20t-38 -48l-96 -198l-145 -196q-20 -26 -20 -63v-400z M400 300v375l150 213l100 212h50v-175l-50 -225h450v-125l-250 -375h-214l-136 100h-100z" /> | |||||
<glyph unicode="" d="M0 400v600h200v-600h-200zM300 525v400q0 75 100 75h61q124 100 139 100h250q46 0 83 -57l238 -344q29 -31 29 -74v-100q0 -44 -30.5 -84.5t-69.5 -40.5h-328q28 -118 28 -125v-150q0 -44 -30.5 -84.5t-69.5 -40.5h-50q-27 0 -51 20t-38 48l-96 198l-145 196 q-20 26 -20 63zM400 525l150 -212l100 -213h50v175l-50 225h450v125l-250 375h-214l-136 -100h-100v-375z" /> | |||||
<glyph unicode="" d="M8 200v600h200v-600h-200zM308 275v525q0 17 14 35.5t28 28.5l14 9l362 230q14 6 25 6q17 0 29 -12l109 -112q14 -14 14 -34q0 -18 -11 -32l-85 -121h302q85 0 138.5 -38t53.5 -110t-54.5 -111t-138.5 -39h-107l-130 -339q-7 -22 -20.5 -41.5t-28.5 -19.5h-341 q-7 0 -90 81t-83 94zM408 289l100 -89h293l131 339q6 21 19.5 41t28.5 20h203q16 0 25 15t9 36q0 20 -9 34.5t-25 14.5h-457h-6.5h-7.5t-6.5 0.5t-6 1t-5 1.5t-5.5 2.5t-4 4t-4 5.5q-5 12 -5 20q0 14 10 27l147 183l-86 83l-339 -236v-503z" /> | |||||
<glyph unicode="" d="M-101 651q0 72 54 110t139 38l302 -1l-85 121q-11 16 -11 32q0 21 14 34l109 113q13 12 29 12q11 0 25 -6l365 -230q7 -4 17 -10.5t26.5 -26t16.5 -36.5v-526q0 -13 -86 -93.5t-94 -80.5h-341q-16 0 -29.5 20t-19.5 41l-130 339h-107q-84 0 -139 39t-55 111zM-1 601h222 q15 0 28.5 -20.5t19.5 -40.5l131 -339h293l107 89v502l-343 237l-87 -83l145 -184q10 -11 10 -26q0 -11 -5 -20q-1 -3 -3.5 -5.5l-4 -4t-5 -2.5t-5.5 -1.5t-6.5 -1t-6.5 -0.5h-7.5h-6.5h-476v-100zM1000 201v600h200v-600h-200z" /> | |||||
<glyph unicode="" d="M97 719l230 -363q4 -6 10.5 -15.5t26 -25t36.5 -15.5h525q13 0 94 83t81 90v342q0 15 -20 28.5t-41 19.5l-339 131v106q0 84 -39 139t-111 55t-110 -53.5t-38 -138.5v-302l-121 84q-15 12 -33.5 11.5t-32.5 -13.5l-112 -110q-22 -22 -6 -53zM172 739l83 86l183 -146 q22 -18 47 -5q3 1 5.5 3.5l4 4t2.5 5t1.5 5.5t1 6.5t0.5 6.5v7.5v6.5v456q0 22 25 31t50 -0.5t25 -30.5v-202q0 -16 20 -29.5t41 -19.5l339 -130v-294l-89 -100h-503zM400 0v200h600v-200h-600z" /> | |||||
<glyph unicode="" d="M2 585q-16 -31 6 -53l112 -110q13 -13 32 -13.5t34 10.5l121 85q0 -51 -0.5 -153.5t-0.5 -148.5q0 -84 38.5 -138t110.5 -54t111 55t39 139v106l339 131q20 6 40.5 19.5t20.5 28.5v342q0 7 -81 90t-94 83h-525q-17 0 -35.5 -14t-28.5 -28l-10 -15zM77 565l236 339h503 l89 -100v-294l-340 -130q-20 -6 -40 -20t-20 -29v-202q0 -22 -25 -31t-50 0t-25 31v456v14.5t-1.5 11.5t-5 12t-9.5 7q-24 13 -46 -5l-184 -146zM305 1104v200h600v-200h-600z" /> | |||||
<glyph unicode="" d="M5 597q0 122 47.5 232.5t127.5 190.5t190.5 127.5t232.5 47.5q162 0 299.5 -80t217.5 -218t80 -300t-80 -299.5t-217.5 -217.5t-299.5 -80t-300 80t-218 217.5t-80 299.5zM298 701l2 -201h300l-2 -194l402 294l-402 298v-197h-300z" /> | |||||
<glyph unicode="" d="M0 597q0 122 47.5 232.5t127.5 190.5t190.5 127.5t231.5 47.5q122 0 232.5 -47.5t190.5 -127.5t127.5 -190.5t47.5 -232.5q0 -162 -80 -299.5t-218 -217.5t-300 -80t-299.5 80t-217.5 217.5t-80 299.5zM200 600l402 -294l-2 194h300l2 201h-300v197z" /> | |||||
<glyph unicode="" d="M5 597q0 122 47.5 232.5t127.5 190.5t190.5 127.5t232.5 47.5q162 0 299.5 -80t217.5 -218t80 -300t-80 -299.5t-217.5 -217.5t-299.5 -80t-300 80t-218 217.5t-80 299.5zM300 600h200v-300h200v300h200l-300 400z" /> | |||||
<glyph unicode="" d="M5 597q0 122 47.5 232.5t127.5 190.5t190.5 127.5t232.5 47.5q162 0 299.5 -80t217.5 -218t80 -300t-80 -299.5t-217.5 -217.5t-299.5 -80t-300 80t-218 217.5t-80 299.5zM300 600l300 -400l300 400h-200v300h-200v-300h-200z" /> | |||||
<glyph unicode="" d="M5 597q0 122 47.5 232.5t127.5 190.5t190.5 127.5t232.5 47.5q121 0 231.5 -47.5t190.5 -127.5t127.5 -190.5t47.5 -232.5q0 -162 -80 -299.5t-217.5 -217.5t-299.5 -80t-300 80t-218 217.5t-80 299.5zM254 780q-8 -33 5.5 -92.5t7.5 -87.5q0 -9 17 -44t16 -60 q12 0 23 -5.5t23 -15t20 -13.5q24 -12 108 -42q22 -8 53 -31.5t59.5 -38.5t57.5 -11q8 -18 -15 -55t-20 -57q42 -71 87 -80q0 -6 -3 -15.5t-3.5 -14.5t4.5 -17q104 -3 221 112q30 29 47 47t34.5 49t20.5 62q-14 9 -37 9.5t-36 7.5q-14 7 -49 15t-52 19q-9 0 -39.5 -0.5 t-46.5 -1.5t-39 -6.5t-39 -16.5q-50 -35 -66 -12q-4 2 -3.5 25.5t0.5 25.5q-6 13 -26.5 17t-24.5 7q2 22 -2 41t-16.5 28t-38.5 -20q-23 -25 -42 4q-19 28 -8 58q6 16 22 22q6 -1 26 -1.5t33.5 -4t19.5 -13.5q12 -19 32 -37.5t34 -27.5l14 -8q0 3 9.5 39.5t5.5 57.5 q-4 23 14.5 44.5t22.5 31.5q5 14 10 35t8.5 31t15.5 22.5t34 21.5q-6 18 10 37q8 0 23.5 -1.5t24.5 -1.5t20.5 4.5t20.5 15.5q-10 23 -30.5 42.5t-38 30t-49 26.5t-43.5 23q11 39 2 44q31 -13 58 -14.5t39 3.5l11 4q7 36 -16.5 53.5t-64.5 28.5t-56 23q-19 -3 -37 0 q-15 -12 -36.5 -21t-34.5 -12t-44 -8t-39 -6q-15 -3 -45.5 0.5t-45.5 -2.5q-21 -7 -52 -26.5t-34 -34.5q-3 -11 6.5 -22.5t8.5 -18.5q-3 -34 -27.5 -90.5t-29.5 -79.5zM518 916q3 12 16 30t16 25q10 -10 18.5 -10t14 6t14.5 14.5t16 12.5q0 -24 17 -66.5t17 -43.5 q-9 2 -31 5t-36 5t-32 8t-30 14zM692 1003h1h-1z" /> | |||||
<glyph unicode="" d="M0 164.5q0 21.5 15 37.5l600 599q-33 101 6 201.5t135 154.5q164 92 306 -9l-259 -138l145 -232l251 126q13 -175 -151 -267q-123 -70 -253 -23l-596 -596q-15 -16 -36.5 -16t-36.5 16l-111 110q-15 15 -15 36.5z" /> | |||||
<glyph unicode="" horiz-adv-x="1220" d="M0 196v100q0 41 29.5 70.5t70.5 29.5h1000q41 0 70.5 -29.5t29.5 -70.5v-100q0 -41 -29.5 -70.5t-70.5 -29.5h-1000q-41 0 -70.5 29.5t-29.5 70.5zM0 596v100q0 41 29.5 70.5t70.5 29.5h1000q41 0 70.5 -29.5t29.5 -70.5v-100q0 -41 -29.5 -70.5t-70.5 -29.5h-1000 q-41 0 -70.5 29.5t-29.5 70.5zM0 996v100q0 41 29.5 70.5t70.5 29.5h1000q41 0 70.5 -29.5t29.5 -70.5v-100q0 -41 -29.5 -70.5t-70.5 -29.5h-1000q-41 0 -70.5 29.5t-29.5 70.5zM600 596h500v100h-500v-100zM800 196h300v100h-300v-100zM900 996h200v100h-200v-100z" /> | |||||
<glyph unicode="" d="M100 1100v100h1000v-100h-1000zM150 1000h900l-350 -500v-300l-200 -200v500z" /> | |||||
<glyph unicode="" d="M0 200v200h1200v-200q0 -41 -29.5 -70.5t-70.5 -29.5h-1000q-41 0 -70.5 29.5t-29.5 70.5zM0 500v400q0 41 29.5 70.5t70.5 29.5h300v100q0 41 29.5 70.5t70.5 29.5h200q41 0 70.5 -29.5t29.5 -70.5v-100h300q41 0 70.5 -29.5t29.5 -70.5v-400h-500v100h-200v-100h-500z M500 1000h200v100h-200v-100z" /> | |||||
<glyph unicode="" d="M0 0v400l129 -129l200 200l142 -142l-200 -200l129 -129h-400zM0 800l129 129l200 -200l142 142l-200 200l129 129h-400v-400zM729 329l142 142l200 -200l129 129v-400h-400l129 129zM729 871l200 200l-129 129h400v-400l-129 129l-200 -200z" /> | |||||
<glyph unicode="" d="M0 596q0 162 80 299t217 217t299 80t299 -80t217 -217t80 -299t-80 -299t-217 -217t-299 -80t-299 80t-217 217t-80 299zM182 596q0 -172 121.5 -293t292.5 -121t292.5 121t121.5 293q0 171 -121.5 292.5t-292.5 121.5t-292.5 -121.5t-121.5 -292.5zM291 655 q0 23 15.5 38.5t38.5 15.5t39 -16t16 -38q0 -23 -16 -39t-39 -16q-22 0 -38 16t-16 39zM400 850q0 22 16 38.5t39 16.5q22 0 38 -16t16 -39t-16 -39t-38 -16q-23 0 -39 16.5t-16 38.5zM514 609q0 32 20.5 56.5t51.5 29.5l122 126l1 1q-9 14 -9 28q0 22 16 38.5t39 16.5 q22 0 38 -16t16 -39t-16 -39t-38 -16q-14 0 -29 10l-55 -145q17 -22 17 -51q0 -36 -25.5 -61.5t-61.5 -25.5t-61.5 25.5t-25.5 61.5zM800 655q0 22 16 38t39 16t38.5 -15.5t15.5 -38.5t-16 -39t-38 -16q-23 0 -39 16t-16 39z" /> | |||||
<glyph unicode="" d="M-40 375q-13 -95 35 -173q35 -57 94 -89t129 -32q63 0 119 28q33 16 65 40.5t52.5 45.5t59.5 64q40 44 57 61l394 394q35 35 47 84t-3 96q-27 87 -117 104q-20 2 -29 2q-46 0 -78.5 -16.5t-67.5 -51.5l-389 -396l-7 -7l69 -67l377 373q20 22 39 38q23 23 50 23 q38 0 53 -36q16 -39 -20 -75l-547 -547q-52 -52 -125 -52q-55 0 -100 33t-54 96q-5 35 2.5 66t31.5 63t42 50t56 54q24 21 44 41l348 348q52 52 82.5 79.5t84 54t107.5 26.5q25 0 48 -4q95 -17 154 -94.5t51 -175.5q-7 -101 -98 -192l-252 -249l-253 -256l7 -7l69 -60 l517 511q67 67 95 157t11 183q-16 87 -67 154t-130 103q-69 33 -152 33q-107 0 -197 -55q-40 -24 -111 -95l-512 -512q-68 -68 -81 -163z" /> | |||||
<glyph unicode="" d="M80 784q0 131 98.5 229.5t230.5 98.5q143 0 241 -129q103 129 246 129q129 0 226 -98.5t97 -229.5q0 -46 -17.5 -91t-61 -99t-77 -89.5t-104.5 -105.5q-197 -191 -293 -322l-17 -23l-16 23q-43 58 -100 122.5t-92 99.5t-101 100q-71 70 -104.5 105.5t-77 89.5t-61 99 t-17.5 91zM250 784q0 -27 30.5 -70t61.5 -75.5t95 -94.5l22 -22q93 -90 190 -201q82 92 195 203l12 12q64 62 97.5 97t64.5 79t31 72q0 71 -48 119.5t-105 48.5q-74 0 -132 -83l-118 -171l-114 174q-51 80 -123 80q-60 0 -109.5 -49.5t-49.5 -118.5z" /> | |||||
<glyph unicode="" d="M57 353q0 -95 66 -159l141 -142q68 -66 159 -66q93 0 159 66l283 283q66 66 66 159t-66 159l-141 141q-8 9 -19 17l-105 -105l212 -212l-389 -389l-247 248l95 95l-18 18q-46 45 -75 101l-55 -55q-66 -66 -66 -159zM269 706q0 -93 66 -159l141 -141q7 -7 19 -17l105 105 l-212 212l389 389l247 -247l-95 -96l18 -17q47 -49 77 -100l29 29q35 35 62.5 88t27.5 96q0 93 -66 159l-141 141q-66 66 -159 66q-95 0 -159 -66l-283 -283q-66 -64 -66 -159z" /> | |||||
<glyph unicode="" d="M200 100v953q0 21 30 46t81 48t129 38t163 15t162 -15t127 -38t79 -48t29 -46v-953q0 -41 -29.5 -70.5t-70.5 -29.5h-600q-41 0 -70.5 29.5t-29.5 70.5zM300 300h600v700h-600v-700zM496 150q0 -43 30.5 -73.5t73.5 -30.5t73.5 30.5t30.5 73.5t-30.5 73.5t-73.5 30.5 t-73.5 -30.5t-30.5 -73.5z" /> | |||||
<glyph unicode="" d="M0 0l303 380l207 208l-210 212h300l267 279l-35 36q-15 14 -15 35t15 35q14 15 35 15t35 -15l283 -282q15 -15 15 -36t-15 -35q-14 -15 -35 -15t-35 15l-36 35l-279 -267v-300l-212 210l-208 -207z" /> | |||||
<glyph unicode="" d="M295 433h139q5 -77 48.5 -126.5t117.5 -64.5v335q-6 1 -15.5 4t-11.5 3q-46 14 -79 26.5t-72 36t-62.5 52t-40 72.5t-16.5 99q0 92 44 159.5t109 101t144 40.5v78h100v-79q38 -4 72.5 -13.5t75.5 -31.5t71 -53.5t51.5 -84t24.5 -118.5h-159q-8 72 -35 109.5t-101 50.5 v-307l64 -14q34 -7 64 -16.5t70 -31.5t67.5 -52t47.5 -80.5t20 -112.5q0 -139 -89 -224t-244 -96v-77h-100v78q-152 17 -237 104q-40 40 -52.5 93.5t-15.5 139.5zM466 889q0 -29 8 -51t16.5 -34t29.5 -22.5t31 -13.5t38 -10q7 -2 11 -3v274q-61 -8 -97.5 -37.5t-36.5 -102.5 zM700 237q170 18 170 151q0 64 -44 99.5t-126 60.5v-311z" /> | |||||
<glyph unicode="" d="M100 600v100h166q-24 49 -44 104q-10 26 -14.5 55.5t-3 72.5t25 90t68.5 87q97 88 263 88q129 0 230 -89t101 -208h-153q0 52 -34 89.5t-74 51.5t-76 14q-37 0 -79 -14.5t-62 -35.5q-41 -44 -41 -101q0 -28 16.5 -69.5t28 -62.5t41.5 -72h241v-100h-197q8 -50 -2.5 -115 t-31.5 -94q-41 -59 -99 -113q35 11 84 18t70 7q33 1 103 -16t103 -17q76 0 136 30l50 -147q-41 -25 -80.5 -36.5t-59 -13t-61.5 -1.5q-23 0 -128 33t-155 29q-39 -4 -82 -17t-66 -25l-24 -11l-55 145l16.5 11t15.5 10t13.5 9.5t14.5 12t14.5 14t17.5 18.5q48 55 54 126.5 t-30 142.5h-221z" /> | |||||
<glyph unicode="" d="M2 300l298 -300l298 300h-198v900h-200v-900h-198zM602 900l298 300l298 -300h-198v-900h-200v900h-198z" /> | |||||
<glyph unicode="" d="M2 300h198v900h200v-900h198l-298 -300zM700 0v200h100v-100h200v-100h-300zM700 400v100h300v-200h-99v-100h-100v100h99v100h-200zM700 700v500h300v-500h-100v100h-100v-100h-100zM801 900h100v200h-100v-200z" /> | |||||
<glyph unicode="" d="M2 300h198v900h200v-900h198l-298 -300zM700 0v500h300v-500h-100v100h-100v-100h-100zM700 700v200h100v-100h200v-100h-300zM700 1100v100h300v-200h-99v-100h-100v100h99v100h-200zM801 200h100v200h-100v-200z" /> | |||||
<glyph unicode="" d="M2 300l298 -300l298 300h-198v900h-200v-900h-198zM800 100v400h300v-500h-100v100h-200zM800 1100v100h200v-500h-100v400h-100zM901 200h100v200h-100v-200z" /> | |||||
<glyph unicode="" d="M2 300l298 -300l298 300h-198v900h-200v-900h-198zM800 400v100h200v-500h-100v400h-100zM800 800v400h300v-500h-100v100h-200zM901 900h100v200h-100v-200z" /> | |||||
<glyph unicode="" d="M2 300l298 -300l298 300h-198v900h-200v-900h-198zM700 100v200h500v-200h-500zM700 400v200h400v-200h-400zM700 700v200h300v-200h-300zM700 1000v200h200v-200h-200z" /> | |||||
<glyph unicode="" d="M2 300l298 -300l298 300h-198v900h-200v-900h-198zM700 100v200h200v-200h-200zM700 400v200h300v-200h-300zM700 700v200h400v-200h-400zM700 1000v200h500v-200h-500z" /> | |||||
<glyph unicode="" d="M0 400v300q0 165 117.5 282.5t282.5 117.5h300q162 0 281 -118.5t119 -281.5v-300q0 -165 -118.5 -282.5t-281.5 -117.5h-300q-165 0 -282.5 117.5t-117.5 282.5zM200 300q0 -41 29.5 -70.5t70.5 -29.5h500q41 0 70.5 29.5t29.5 70.5v500q0 41 -29.5 70.5t-70.5 29.5 h-500q-41 0 -70.5 -29.5t-29.5 -70.5v-500z" /> | |||||
<glyph unicode="" d="M0 400v300q0 163 119 281.5t281 118.5h300q165 0 282.5 -117.5t117.5 -282.5v-300q0 -165 -117.5 -282.5t-282.5 -117.5h-300q-163 0 -281.5 117.5t-118.5 282.5zM200 300q0 -41 29.5 -70.5t70.5 -29.5h500q41 0 70.5 29.5t29.5 70.5v500q0 41 -29.5 70.5t-70.5 29.5 h-500q-41 0 -70.5 -29.5t-29.5 -70.5v-500zM400 300l333 250l-333 250v-500z" /> | |||||
<glyph unicode="" d="M0 400v300q0 163 117.5 281.5t282.5 118.5h300q163 0 281.5 -119t118.5 -281v-300q0 -165 -117.5 -282.5t-282.5 -117.5h-300q-165 0 -282.5 117.5t-117.5 282.5zM200 300q0 -41 29.5 -70.5t70.5 -29.5h500q41 0 70.5 29.5t29.5 70.5v500q0 41 -29.5 70.5t-70.5 29.5 h-500q-41 0 -70.5 -29.5t-29.5 -70.5v-500zM300 700l250 -333l250 333h-500z" /> | |||||
<glyph unicode="" d="M0 400v300q0 165 117.5 282.5t282.5 117.5h300q165 0 282.5 -117.5t117.5 -282.5v-300q0 -162 -118.5 -281t-281.5 -119h-300q-165 0 -282.5 118.5t-117.5 281.5zM200 300q0 -41 29.5 -70.5t70.5 -29.5h500q41 0 70.5 29.5t29.5 70.5v500q0 41 -29.5 70.5t-70.5 29.5 h-500q-41 0 -70.5 -29.5t-29.5 -70.5v-500zM300 400h500l-250 333z" /> | |||||
<glyph unicode="" d="M0 400v300h300v200l400 -350l-400 -350v200h-300zM500 0v200h500q41 0 70.5 29.5t29.5 70.5v500q0 41 -29.5 70.5t-70.5 29.5h-500v200h400q165 0 282.5 -117.5t117.5 -282.5v-300q0 -165 -117.5 -282.5t-282.5 -117.5h-400z" /> | |||||
<glyph unicode="" d="M217 519q8 -19 31 -19h302q-155 -438 -160 -458q-5 -21 4 -32l9 -8h9q14 0 26 15q11 13 274.5 321.5t264.5 308.5q14 19 5 36q-8 17 -31 17l-301 -1q1 4 78 219.5t79 227.5q2 15 -5 27l-9 9h-9q-15 0 -25 -16q-4 -6 -98 -111.5t-228.5 -257t-209.5 -237.5q-16 -19 -6 -41 z" /> | |||||
<glyph unicode="" d="M0 400q0 -165 117.5 -282.5t282.5 -117.5h300q47 0 100 15v185h-500q-41 0 -70.5 29.5t-29.5 70.5v500q0 41 29.5 70.5t70.5 29.5h500v185q-14 4 -114 7.5t-193 5.5l-93 2q-165 0 -282.5 -117.5t-117.5 -282.5v-300zM600 400v300h300v200l400 -350l-400 -350v200h-300z " /> | |||||
<glyph unicode="" d="M0 400q0 -165 117.5 -282.5t282.5 -117.5h300q163 0 281.5 117.5t118.5 282.5v98l-78 73l-122 -123v-148q0 -41 -29.5 -70.5t-70.5 -29.5h-500q-41 0 -70.5 29.5t-29.5 70.5v500q0 41 29.5 70.5t70.5 29.5h156l118 122l-74 78h-100q-165 0 -282.5 -117.5t-117.5 -282.5 v-300zM496 709l353 342l-149 149h500v-500l-149 149l-342 -353z" /> | |||||
<glyph unicode="" d="M4 600q0 162 80 299t217 217t299 80t299 -80t217 -217t80 -299t-80 -299t-217 -217t-299 -80t-299 80t-217 217t-80 299zM186 600q0 -171 121.5 -292.5t292.5 -121.5t292.5 121.5t121.5 292.5t-121.5 292.5t-292.5 121.5t-292.5 -121.5t-121.5 -292.5zM406 600 q0 80 57 137t137 57t137 -57t57 -137t-57 -137t-137 -57t-137 57t-57 137z" /> | |||||
<glyph unicode="" d="M0 0v275q0 11 7 18t18 7h1048q11 0 19 -7.5t8 -17.5v-275h-1100zM100 800l445 -500l450 500h-295v400h-300v-400h-300zM900 150h100v50h-100v-50z" /> | |||||
<glyph unicode="" d="M0 0v275q0 11 7 18t18 7h1048q11 0 19 -7.5t8 -17.5v-275h-1100zM100 700h300v-300h300v300h295l-445 500zM900 150h100v50h-100v-50z" /> | |||||
<glyph unicode="" d="M0 0v275q0 11 7 18t18 7h1048q11 0 19 -7.5t8 -17.5v-275h-1100zM100 705l305 -305l596 596l-154 155l-442 -442l-150 151zM900 150h100v50h-100v-50z" /> | |||||
<glyph unicode="" d="M0 0v275q0 11 7 18t18 7h1048q11 0 19 -7.5t8 -17.5v-275h-1100zM100 988l97 -98l212 213l-97 97zM200 400l697 1l3 699l-250 -239l-149 149l-212 -212l149 -149zM900 150h100v50h-100v-50z" /> | |||||
<glyph unicode="" d="M0 0v275q0 11 7 18t18 7h1048q11 0 19 -7.5t8 -17.5v-275h-1100zM200 612l212 -212l98 97l-213 212zM300 1200l239 -250l-149 -149l212 -212l149 148l249 -237l-1 697zM900 150h100v50h-100v-50z" /> | |||||
<glyph unicode="" d="M23 415l1177 784v-1079l-475 272l-310 -393v416h-392zM494 210l672 938l-672 -712v-226z" /> | |||||
<glyph unicode="" d="M0 150v1000q0 20 14.5 35t35.5 15h250v-300h500v300h100l200 -200v-850q0 -21 -15 -35.5t-35 -14.5h-150v400h-700v-400h-150q-21 0 -35.5 14.5t-14.5 35.5zM600 1000h100v200h-100v-200z" /> | |||||
<glyph unicode="" d="M0 150v1000q0 20 14.5 35t35.5 15h250v-300h500v300h100l200 -200v-218l-276 -275l-120 120l-126 -127h-378v-400h-150q-21 0 -35.5 14.5t-14.5 35.5zM581 306l123 123l120 -120l353 352l123 -123l-475 -476zM600 1000h100v200h-100v-200z" /> | |||||
<glyph unicode="" d="M0 150v1000q0 20 14.5 35t35.5 15h250v-300h500v300h100l200 -200v-269l-103 -103l-170 170l-298 -298h-329v-400h-150q-21 0 -35.5 14.5t-14.5 35.5zM600 1000h100v200h-100v-200zM700 133l170 170l-170 170l127 127l170 -170l170 170l127 -128l-170 -169l170 -170 l-127 -127l-170 170l-170 -170z" /> | |||||
<glyph unicode="" d="M0 150v1000q0 20 14.5 35t35.5 15h250v-300h500v300h100l200 -200v-300h-400v-200h-500v-400h-150q-21 0 -35.5 14.5t-14.5 35.5zM600 300l300 -300l300 300h-200v300h-200v-300h-200zM600 1000v200h100v-200h-100z" /> | |||||
<glyph unicode="" d="M0 150v1000q0 20 14.5 35t35.5 15h250v-300h500v300h100l200 -200v-402l-200 200l-298 -298h-402v-400h-150q-21 0 -35.5 14.5t-14.5 35.5zM600 300h200v-300h200v300h200l-300 300zM600 1000v200h100v-200h-100z" /> | |||||
<glyph unicode="" d="M0 250q0 -21 14.5 -35.5t35.5 -14.5h1100q21 0 35.5 14.5t14.5 35.5v550h-1200v-550zM0 900h1200v150q0 21 -14.5 35.5t-35.5 14.5h-1100q-21 0 -35.5 -14.5t-14.5 -35.5v-150zM100 300v200h400v-200h-400z" /> | |||||
<glyph unicode="" d="M0 400l300 298v-198h400v-200h-400v-198zM100 800v200h100v-200h-100zM300 800v200h100v-200h-100zM500 800v200h400v198l300 -298l-300 -298v198h-400zM800 300v200h100v-200h-100zM1000 300h100v200h-100v-200z" /> | |||||
<glyph unicode="" d="M100 700v400l50 100l50 -100v-300h100v300l50 100l50 -100v-300h100v300l50 100l50 -100v-400l-100 -203v-447q0 -21 -14.5 -35.5t-35.5 -14.5h-200q-21 0 -35.5 14.5t-14.5 35.5v447zM800 597q0 -29 10.5 -55.5t25 -43t29 -28.5t25.5 -18l10 -5v-397q0 -21 14.5 -35.5 t35.5 -14.5h200q21 0 35.5 14.5t14.5 35.5v1106q0 31 -18 40.5t-44 -7.5l-276 -116q-25 -17 -43.5 -51.5t-18.5 -65.5v-359z" /> | |||||
<glyph unicode="" d="M100 0h400v56q-75 0 -87.5 6t-12.5 44v394h500v-394q0 -38 -12.5 -44t-87.5 -6v-56h400v56q-4 0 -11 0.5t-24 3t-30 7t-24 15t-11 24.5v888q0 22 25 34.5t50 13.5l25 2v56h-400v-56q75 0 87.5 -6t12.5 -44v-394h-500v394q0 38 12.5 44t87.5 6v56h-400v-56q4 0 11 -0.5 t24 -3t30 -7t24 -15t11 -24.5v-888q0 -22 -25 -34.5t-50 -13.5l-25 -2v-56z" /> | |||||
<glyph unicode="" d="M0 300q0 -41 29.5 -70.5t70.5 -29.5h300q41 0 70.5 29.5t29.5 70.5v500q0 41 -29.5 70.5t-70.5 29.5h-300q-41 0 -70.5 -29.5t-29.5 -70.5v-500zM100 100h400l200 200h105l295 98v-298h-425l-100 -100h-375zM100 300v200h300v-200h-300zM100 600v200h300v-200h-300z M100 1000h400l200 -200v-98l295 98h105v200h-425l-100 100h-375zM700 402v163l400 133v-163z" /> | |||||
<glyph unicode="" d="M16.5 974.5q0.5 -21.5 16 -90t46.5 -140t104 -177.5t175 -208q103 -103 207.5 -176t180 -103.5t137 -47t92.5 -16.5l31 1l163 162q17 18 13.5 41t-22.5 37l-192 136q-19 14 -45 12t-42 -19l-118 -118q-142 101 -268 227t-227 268l118 118q17 17 20 41.5t-11 44.5 l-139 194q-14 19 -36.5 22t-40.5 -14l-162 -162q-1 -11 -0.5 -32.5z" /> | |||||
<glyph unicode="" d="M0 50v212q0 20 10.5 45.5t24.5 39.5l365 303v50q0 4 1 10.5t12 22.5t30 28.5t60 23t97 10.5t97 -10t60 -23.5t30 -27.5t12 -24l1 -10v-50l365 -303q14 -14 24.5 -39.5t10.5 -45.5v-212q0 -21 -14.5 -35.5t-35.5 -14.5h-1100q-20 0 -35 14.5t-15 35.5zM0 712 q0 -21 14.5 -33.5t34.5 -8.5l202 33q20 4 34.5 21t14.5 38v146q141 24 300 24t300 -24v-146q0 -21 14.5 -38t34.5 -21l202 -33q20 -4 34.5 8.5t14.5 33.5v200q-6 8 -19 20.5t-63 45t-112 57t-171 45t-235 20.5q-92 0 -175 -10.5t-141.5 -27t-108.5 -36.5t-81.5 -40 t-53.5 -36.5t-31 -27.5l-9 -10v-200z" /> | |||||
<glyph unicode="" d="M100 0v100h1100v-100h-1100zM175 200h950l-125 150v250l100 100v400h-100v-200h-100v200h-200v-200h-100v200h-200v-200h-100v200h-100v-400l100 -100v-250z" /> | |||||
<glyph unicode="" d="M100 0h300v400q0 41 -29.5 70.5t-70.5 29.5h-100q-41 0 -70.5 -29.5t-29.5 -70.5v-400zM500 0v1000q0 41 29.5 70.5t70.5 29.5h100q41 0 70.5 -29.5t29.5 -70.5v-1000h-300zM900 0v700q0 41 29.5 70.5t70.5 29.5h100q41 0 70.5 -29.5t29.5 -70.5v-700h-300z" /> | |||||
<glyph unicode="" d="M-100 300v500q0 124 88 212t212 88h700q124 0 212 -88t88 -212v-500q0 -124 -88 -212t-212 -88h-700q-124 0 -212 88t-88 212zM100 200h900v700h-900v-700zM200 300h300v300h-200v100h200v100h-300v-300h200v-100h-200v-100zM600 300h200v100h100v300h-100v100h-200v-500 zM700 400v300h100v-300h-100z" /> | |||||
<glyph unicode="" d="M-100 300v500q0 124 88 212t212 88h700q124 0 212 -88t88 -212v-500q0 -124 -88 -212t-212 -88h-700q-124 0 -212 88t-88 212zM100 200h900v700h-900v-700zM200 300h100v200h100v-200h100v500h-100v-200h-100v200h-100v-500zM600 300h200v100h100v300h-100v100h-200v-500 zM700 400v300h100v-300h-100z" /> | |||||
<glyph unicode="" d="M-100 300v500q0 124 88 212t212 88h700q124 0 212 -88t88 -212v-500q0 -124 -88 -212t-212 -88h-700q-124 0 -212 88t-88 212zM100 200h900v700h-900v-700zM200 300h300v100h-200v300h200v100h-300v-500zM600 300h300v100h-200v300h200v100h-300v-500z" /> | |||||
<glyph unicode="" d="M-100 300v500q0 124 88 212t212 88h700q124 0 212 -88t88 -212v-500q0 -124 -88 -212t-212 -88h-700q-124 0 -212 88t-88 212zM100 200h900v700h-900v-700zM200 550l300 -150v300zM600 400l300 150l-300 150v-300z" /> | |||||
<glyph unicode="" d="M-100 300v500q0 124 88 212t212 88h700q124 0 212 -88t88 -212v-500q0 -124 -88 -212t-212 -88h-700q-124 0 -212 88t-88 212zM100 200h900v700h-900v-700zM200 300v500h700v-500h-700zM300 400h130q41 0 68 42t27 107t-28.5 108t-66.5 43h-130v-300zM575 549 q0 -65 27 -107t68 -42h130v300h-130q-38 0 -66.5 -43t-28.5 -108z" /> | |||||
<glyph unicode="" d="M-100 300v500q0 124 88 212t212 88h700q124 0 212 -88t88 -212v-500q0 -124 -88 -212t-212 -88h-700q-124 0 -212 88t-88 212zM100 200h900v700h-900v-700zM200 300h300v300h-200v100h200v100h-300v-300h200v-100h-200v-100zM601 300h100v100h-100v-100zM700 700h100 v-400h100v500h-200v-100z" /> | |||||
<glyph unicode="" d="M-100 300v500q0 124 88 212t212 88h700q124 0 212 -88t88 -212v-500q0 -124 -88 -212t-212 -88h-700q-124 0 -212 88t-88 212zM100 200h900v700h-900v-700zM200 300h300v400h-200v100h-100v-500zM301 400v200h100v-200h-100zM601 300h100v100h-100v-100zM700 700h100 v-400h100v500h-200v-100z" /> | |||||
<glyph unicode="" d="M-100 300v500q0 124 88 212t212 88h700q124 0 212 -88t88 -212v-500q0 -124 -88 -212t-212 -88h-700q-124 0 -212 88t-88 212zM100 200h900v700h-900v-700zM200 700v100h300v-300h-99v-100h-100v100h99v200h-200zM201 300v100h100v-100h-100zM601 300v100h100v-100h-100z M700 700v100h200v-500h-100v400h-100z" /> | |||||
<glyph unicode="" d="M4 600q0 162 80 299t217 217t299 80t299 -80t217 -217t80 -299t-80 -299t-217 -217t-299 -80t-299 80t-217 217t-80 299zM186 600q0 -171 121.5 -292.5t292.5 -121.5t292.5 121.5t121.5 292.5t-121.5 292.5t-292.5 121.5t-292.5 -121.5t-121.5 -292.5zM400 500v200 l100 100h300v-100h-300v-200h300v-100h-300z" /> | |||||
<glyph unicode="" d="M0 600q0 162 80 299t217 217t299 80t299 -80t217 -217t80 -299t-80 -299t-217 -217t-299 -80t-299 80t-217 217t-80 299zM182 600q0 -171 121.5 -292.5t292.5 -121.5t292.5 121.5t121.5 292.5t-121.5 292.5t-292.5 121.5t-292.5 -121.5t-121.5 -292.5zM400 400v400h300 l100 -100v-100h-100v100h-200v-100h200v-100h-200v-100h-100zM700 400v100h100v-100h-100z" /> | |||||
<glyph unicode="" d="M-14 494q0 -80 56.5 -137t135.5 -57h222v300h400v-300h128q120 0 205 86.5t85 207.5t-85 207t-205 86q-46 0 -90 -14q-44 97 -134.5 156.5t-200.5 59.5q-152 0 -260 -107.5t-108 -260.5q0 -25 2 -37q-66 -14 -108.5 -67.5t-42.5 -122.5zM300 200h200v300h200v-300h200 l-300 -300z" /> | |||||
<glyph unicode="" d="M-14 494q0 -80 56.5 -137t135.5 -57h8l414 414l403 -403q94 26 154.5 104.5t60.5 178.5q0 120 -85 206.5t-205 86.5q-46 0 -90 -14q-44 97 -134.5 156.5t-200.5 59.5q-152 0 -260 -107.5t-108 -260.5q0 -25 2 -37q-66 -14 -108.5 -67.5t-42.5 -122.5zM300 200l300 300 l300 -300h-200v-300h-200v300h-200z" /> | |||||
<glyph unicode="" d="M100 200h400v-155l-75 -45h350l-75 45v155h400l-270 300h170l-270 300h170l-300 333l-300 -333h170l-270 -300h170z" /> | |||||
<glyph unicode="" d="M121 700q0 -53 28.5 -97t75.5 -65q-4 -16 -4 -38q0 -74 52.5 -126.5t126.5 -52.5q56 0 100 30v-306l-75 -45h350l-75 45v306q46 -30 100 -30q74 0 126.5 52.5t52.5 126.5q0 24 -9 55q50 32 79.5 83t29.5 112q0 90 -61.5 155.5t-150.5 71.5q-26 89 -99.5 145.5 t-167.5 56.5q-116 0 -197.5 -81.5t-81.5 -197.5q0 -4 1 -11.5t1 -11.5q-14 2 -23 2q-74 0 -126.5 -52.5t-52.5 -126.5z" /> | |||||
</font> | |||||
</defs></svg> |
@ -0,0 +1,10 @@ | |||||
<?xml version="1.0" encoding="utf-8"?> | |||||
<packages> | |||||
<package id="AjaxMin" version="5.8.5172.27710" targetFramework="net45" /> | |||||
<package id="AjaxMin" version="5.9.5229.26438" targetFramework="net451" /> | |||||
<package id="Microsoft.AspNet.Razor" version="3.1.2" targetFramework="net45" /> | |||||
<package id="Microsoft.AspNet.WebPages" version="3.1.2" targetFramework="net45" /> | |||||
<package id="Microsoft.Web.Infrastructure" version="1.0.0.0" targetFramework="net45" /> | |||||
<package id="xmlrpcnet" version="3.0.0.266" targetFramework="net45" /> | |||||
<package id="xmlrpcnet-server" version="3.0.0.266" targetFramework="net45" /> | |||||
</packages> |
@ -0,0 +1,14 @@ | |||||
<?xml version="1.0" encoding="utf-8"?> | |||||
<post> | |||||
<title>این یک پست جدید است</title> | |||||
<slug>----</slug> | |||||
<author>sevomin</author> | |||||
<pubDate>2014-04-30 12:54:13</pubDate> | |||||
<lastModified>2014-04-30 12:54:13</lastModified> | |||||
<content>بله این پست بسیار خوب و وزین است</content> | |||||
<ispublished>true</ispublished> | |||||
<categories> | |||||
<category></category> | |||||
</categories> | |||||
<comments></comments> | |||||
</post> |
@ -0,0 +1,14 @@ | |||||
<?xml version="1.0" encoding="utf-8"?> | |||||
<post> | |||||
<title>پستی در پستهای موجود</title> | |||||
<slug>---</slug> | |||||
<author>sevomin</author> | |||||
<pubDate>2014-04-30 12:52:38</pubDate> | |||||
<lastModified>2014-04-30 12:52:38</lastModified> | |||||
<content><div style="text-align: right;direction:rtl"><span style="line-height: 1.428571429;">این پست شامل کلیه پستهایی میباشد که در وب سایت نمایش داده خواهد شد.</span></div><div style="text-align: right;"></div></content> | |||||
<ispublished>true</ispublished> | |||||
<categories> | |||||
<category></category> | |||||
</categories> | |||||
<comments></comments> | |||||
</post> |
@ -0,0 +1,61 @@ | |||||
<?xml version="1.0" encoding="utf-8"?> | |||||
<post> | |||||
<title>Web Developer Checklist</title> | |||||
<slug>chrome-extension-web-developer-checklist</slug> | |||||
<author></author> | |||||
<pubDate>2013-06-06 11:44:23</pubDate> | |||||
<lastModified>2014-04-16 19:00:53</lastModified> | |||||
<content><p>Earlier this year, <a href="http://sedodream.com/" target="_blank">Sayed</a> and I released <a href="http://webdevchecklist.com/" target="_blank">Web Developer Checklist</a> to help web developer adhere to best practices. Checklists like these can be really helpful to make sure we don’t forget anything before releasing new or updated websites. </p> <p><img width="279" height="580" title="image" style="padding-left: 10px; float: right;" alt="image" src="/posts/files/image.png" />Now we’re introducing Web Developer Checklist as a <a href="https://chrome.google.com/webstore/detail/web-developer-checklist/iahamcpedabephpcgkeikbclmaljebjp" target="_blank">Chrome extension</a> that can automate a big portion of the checklist. The extension let’s you run checks for various best practices on any website - including your own running from localhost.</p> <p>It performs a series of checks by analyzing the DOM as well as integrating with 3<sup>rd</sup>-party services like <a href="https://developers.google.com/speed/pagespeed/" target="_blank">Google PageSpeed</a>.</p> <h2>Next steps</h2> <p>This first version of the <a href="https://chrome.google.com/webstore/detail/web-developer-checklist/iahamcpedabephpcgkeikbclmaljebjp" target="_blank">Web Developer Checklist Chrome extension</a> does a series of really valuable checks. The next releases will have even more.</p> <p>Specifically, we’re looking at adding:</p> <ul> <li>HTML validation </li><li>CSS validation </li><li>Accessibility validation </li><li>JSHint </li><li>CssLint </li><li>Guidance for each item</li></ul> <p>We think these checks would be hugely beneficial. If you have ideas for other checks that can be automated, please let us know in the comments below.</p> <h2>Open source</h2> <p>The Web Developer Checklist Chrome extension is open source and hosted on our <a href="https://github.com/ligershark/BestPracticesChromeExtension" target="_blank">GitHub org</a>. As always, pull requests are more than welcome.</p></content> | |||||
<ispublished>true</ispublished> | |||||
<categories> | |||||
<category>Chrome</category> | |||||
<category>Best Practices</category> | |||||
</categories> | |||||
<comments> | |||||
<comment isAdmin="false" isApproved="true" id="0a524d41-f95e-4746-a22d-59525d7ea475"> | |||||
<author>Jason</author> | |||||
<email>[email protected]</email> | |||||
<website></website> | |||||
<ip></ip> | |||||
<userAgent></userAgent> | |||||
<date>2013-06-06 12:14:47</date> | |||||
<content>Very useful extension. In the few minutes I&#39;ve played with it so far I&#39;ve found a few items that can be improved on my site. I&#39;d love to see some guidance baked into the tool. For example, for &quot;Add meaning with Microdata&quot; it would be beneficial to provide a link for further reading/some rudimentary tips, etc. <br /><br />Great work - I look forward to seeing this extension evolving!</content> | |||||
</comment> | |||||
<comment isAdmin="true" isApproved="true" id="5edbaac8-eddf-4e52-90fb-c6cc40e3dad8"> | |||||
<author>Mads Kristensen</author> | |||||
<email>[email protected]</email> | |||||
<website></website> | |||||
<ip></ip> | |||||
<userAgent></userAgent> | |||||
<date>2013-06-06 12:23:46</date> | |||||
<content>Yes, I should update the roadmap because that is exactly what we are planning for as well. Thanks for the heads up!</content> | |||||
</comment> | |||||
<comment isAdmin="false" isApproved="true" id="cb6f1e5f-d42c-444f-aa47-4ad7b2bd91fa"> | |||||
<author>Maiis</author> | |||||
<email>[email protected]</email> | |||||
<website></website> | |||||
<ip></ip> | |||||
<userAgent></userAgent> | |||||
<date>2013-06-06 12:55:53</date> | |||||
<content>This page dosen&#39;t get a green status :p</content> | |||||
</comment> | |||||
<comment isAdmin="true" isApproved="true" id="ec20fc8c-f2e5-43ec-81d7-f66fcc35e7ee"> | |||||
<author>Mads Kristensen</author> | |||||
<email>[email protected]</email> | |||||
<website></website> | |||||
<ip></ip> | |||||
<userAgent></userAgent> | |||||
<date>2013-06-06 13:12:43</date> | |||||
<content>Yeah, that is rather ironic :)</content> | |||||
</comment> | |||||
<comment isAdmin="false" isApproved="false" id="c9005981-89f1-498a-9684-afa05b2448a9"> | |||||
<author>Maiis</author> | |||||
<email>[email protected]</email> | |||||
<website></website> | |||||
<ip></ip> | |||||
<userAgent></userAgent> | |||||
<date>2013-06-06 14:55:53</date> | |||||
<content>A new not yet approved comment.</content> | |||||
</comment> | |||||
</comments> | |||||
</post> |
@ -0,0 +1,5 @@ | |||||
/// <autosync enabled="true" /> | |||||
/// <reference path="admin.js" /> | |||||
/// <reference path="bootstrap-wysiwyg.js" /> | |||||
/// <reference path="comments.js" /> | |||||
/// <reference path="jquery-2.0.2.js" /> |
@ -0,0 +1,226 @@ | |||||
(function ($) { | |||||
// #region Helpers | |||||
function ConvertMarkupToValidXhtml(markup) { | |||||
var docImplementation = document.implementation; | |||||
var htmlDocument = docImplementation.createHTMLDocument("temp"); | |||||
var xHtmlDocument = docImplementation.createDocument('http://www.w3.org/1999/xhtml', 'html', null); | |||||
var xhtmlBody = xHtmlDocument.createElementNS('http://www.w3.org/1999/xhtml', 'body'); | |||||
htmlDocument.body.innerHTML = "<div>" + markup + "</div>"; | |||||
xHtmlDocument.documentElement.appendChild(xhtmlBody); | |||||
xHtmlDocument.importNode(htmlDocument.body, true); | |||||
xhtmlBody.appendChild(htmlDocument.body.firstChild); | |||||
/<body.*?><div>(.*?)<\/div><\/body>/im.exec(xHtmlDocument.documentElement.innerHTML); | |||||
return RegExp.$1; | |||||
} | |||||
// #endregion | |||||
var postId, isNew, | |||||
txtTitle, txtContent, txtMessage, txtImage, chkPublish, | |||||
btnNew, btnEdit, btnDelete, btnSave, btnCancel, | |||||
editPost = function () { | |||||
txtTitle.attr('contentEditable', true); | |||||
txtContent.wysiwyg({ hotKeys: {}, activeToolbarClass: "active" }); | |||||
txtContent.css({ minHeight: "400px" }); | |||||
txtContent.focus(); | |||||
btnNew.attr("disabled", true); | |||||
btnEdit.attr("disabled", true); | |||||
btnSave.removeAttr("disabled"); | |||||
btnCancel.removeAttr("disabled"); | |||||
chkPublish.removeAttr("disabled"); | |||||
showCategoriesForEditing(); | |||||
toggleSourceView(); | |||||
$("#tools").fadeIn().css("display", "inline-block"); | |||||
}, | |||||
cancelEdit = function () { | |||||
if (isNew) { | |||||
if (confirm("Do you want to leave this page?")) { | |||||
history.back(); | |||||
} | |||||
} else { | |||||
txtTitle.removeAttr('contentEditable'); | |||||
txtContent.removeAttr('contentEditable'); | |||||
btnCancel.focus(); | |||||
btnNew.removeAttr("disabled"); | |||||
btnEdit.removeAttr("disabled"); | |||||
btnSave.attr("disabled", true); | |||||
btnCancel.attr("disabled", true); | |||||
chkPublish.attr("disabled", true); | |||||
showCategoriesForDisplay(); | |||||
$("#tools").fadeOut(); | |||||
} | |||||
}, | |||||
toggleSourceView = function () { | |||||
$(".source").bind("click", function () { | |||||
var self = $(this); | |||||
if (self.attr("data-cmd") === "source") { | |||||
self.attr("data-cmd", "design"); | |||||
self.addClass("active"); | |||||
txtContent.text(txtContent.html()); | |||||
} else { | |||||
self.attr("data-cmd", "source"); | |||||
self.removeClass("active"); | |||||
txtContent.html(txtContent.text()); | |||||
} | |||||
}); | |||||
}, | |||||
savePost = function (e) { | |||||
if ($(".source").attr("data-cmd") === "design") { | |||||
$(".source").click(); | |||||
} | |||||
txtContent.cleanHtml(); | |||||
var parsedDOM; | |||||
/* IE9 doesn't support text/html MimeType https://github.com/madskristensen/MiniBlog/issues/35 | |||||
parsedDOM = new DOMParser().parseFromString(txtContent.html(), 'text/html'); | |||||
parsedDOM = new XMLSerializer().serializeToString(parsedDOM); | |||||
/<body>(.*)<\/body>/im.exec(parsedDOM); | |||||
parsedDOM = RegExp.$1; | |||||
*/ | |||||
/* When its time to drop IE9 support toggle commented region with | |||||
the following statement and ConvertMarkupToXhtml function */ | |||||
parsedDOM = ConvertMarkupToValidXhtml(txtContent.html()); | |||||
$.post("/post.ashx?mode=save", { | |||||
id: postId, | |||||
isPublished: chkPublish[0].checked, | |||||
title: txtTitle.text().trim(), | |||||
content: parsedDOM, | |||||
categories: getPostCategories(), | |||||
token: document.querySelector("[data-token]").getAttribute("data-token") | |||||
}) | |||||
.success(function (data) { | |||||
if (isNew) { | |||||
location.href = data; | |||||
return; | |||||
} | |||||
showMessage(true, "The post was saved successfully"); | |||||
cancelEdit(e); | |||||
}) | |||||
.fail(function (data) { | |||||
if (data.status === 409) { | |||||
showMessage(false, "The title is already in use"); | |||||
} else { | |||||
showMessage(false, "Something bad happened. Server reported " + data.status + " " + data.statusText); | |||||
} | |||||
}); | |||||
}, | |||||
deletePost = function () { | |||||
if (confirm("Are you sure you want to delete this post?")) { | |||||
$.post("/post.ashx?mode=delete", { id: postId, token: document.querySelector("[data-token]").getAttribute("data-token") }) | |||||
.success(function () { location.href = "/"; }) | |||||
.fail(function () { showMessage(false, "Something went wrong. Please try again"); }); | |||||
} | |||||
}, | |||||
showMessage = function (success, message) { | |||||
var className = success ? "alert-success" : "alert-error"; | |||||
txtMessage.addClass(className); | |||||
txtMessage.text(message); | |||||
txtMessage.parent().fadeIn(); | |||||
setTimeout(function () { | |||||
txtMessage.parent().fadeOut("slow", function () { | |||||
txtMessage.removeClass(className); | |||||
}); | |||||
}, 4000); | |||||
}, | |||||
getPostCategories = function () { | |||||
var categories = ''; | |||||
if ($("#txtCategories").length > 0) { | |||||
categories = $("#txtCategories").val(); | |||||
} else { | |||||
$("ul.categories li a").each(function (index, item) { | |||||
if (categories.length > 0) { | |||||
categories += ","; | |||||
} | |||||
categories += $(item).html(); | |||||
}); | |||||
} | |||||
return categories; | |||||
}, | |||||
showCategoriesForEditing = function () { | |||||
var firstItemPassed = false; | |||||
var categoriesString = getPostCategories(); | |||||
$("ul.categories li").each(function (index, item) { | |||||
if (!firstItemPassed) { | |||||
firstItemPassed = true; | |||||
} else { | |||||
$(item).remove(); | |||||
} | |||||
}); | |||||
$("ul.categories").append("<li><input id='txtCategories' class='form-control' /></li>"); | |||||
$("#txtCategories").val(categoriesString); | |||||
}, | |||||
showCategoriesForDisplay = function () { | |||||
if ($("#txtCategories").length > 0) { | |||||
var categoriesArray = $("#txtCategories").val().split(','); | |||||
$("#txtCategories").parent().remove(); | |||||
$.each(categoriesArray, function (index, category) { | |||||
$("ul.categories").append(' <li itemprop="articleSection" title="' + category + '"> <a href="/category/' + encodeURIComponent(category.toLowerCase()) + '">' + category + '</a> </li> '); | |||||
}); | |||||
} | |||||
}; | |||||
isNew = location.pathname.replace(/\//g, "") === "postnew"; | |||||
postId = $("[itemprop~='blogPost']").attr("data-id"); | |||||
txtTitle = $("[itemprop~='blogPost'] [itemprop~='name']"); | |||||
txtContent = $("[itemprop~='articleBody']"); | |||||
txtMessage = $("#admin .alert"); | |||||
txtImage = $("#admin #txtImage"); | |||||
btnNew = $("#btnNew"); | |||||
btnEdit = $("#btnEdit").bind("click", editPost); | |||||
btnDelete = $("#btnDelete").bind("click", deletePost); | |||||
btnSave = $("#btnSave").bind("click", savePost); | |||||
btnCancel = $("#btnCancel").bind("click", cancelEdit); | |||||
chkPublish = $("#ispublished").find("input[type=checkbox]"); | |||||
$(document).keyup(function (e) { | |||||
if (!document.activeElement.isContentEditable) { | |||||
if (e.keyCode === 46) { // Delete key | |||||
deletePost(); | |||||
} else if (e.keyCode === 27) { // ESC key | |||||
cancelEdit(); | |||||
} | |||||
} | |||||
}); | |||||
$('.uploadimage').click(function (e) { | |||||
e.preventDefault(); | |||||
$('#txtImage').click(); | |||||
}); | |||||
if (isNew) { | |||||
editPost(); | |||||
$("#ispublished").fadeIn(); | |||||
chkPublish[0].checked = true; | |||||
} else if (txtTitle !== null && txtTitle.length === 1 && location.pathname.length > 1) { | |||||
btnEdit.removeAttr("disabled"); | |||||
btnDelete.removeAttr("disabled"); | |||||
$("#ispublished").css({ "display": "inline" }); | |||||
} | |||||
})(jQuery); |
@ -0,0 +1,217 @@ | |||||
/* http://github.com/mindmup/bootstrap-wysiwyg */ | |||||
/*global jQuery, $, FileReader*/ | |||||
/*jslint browser:true*/ | |||||
(function ($) { | |||||
'use strict'; | |||||
var readFileIntoDataUrl = function (fileInfo) { | |||||
var loader = $.Deferred(), | |||||
fReader = new FileReader(); | |||||
fReader.onload = function (e) { | |||||
loader.resolve(e.target.result); | |||||
}; | |||||
fReader.onerror = loader.reject; | |||||
fReader.onprogress = loader.notify; | |||||
fReader.readAsDataURL(fileInfo); | |||||
return loader.promise(); | |||||
}; | |||||
$.fn.cleanHtml = function () { | |||||
var html = $(this).html(); | |||||
return html && html.replace(/(<br>|\s|<div><br><\/div>| )*$/, ''); | |||||
}; | |||||
$.fn.wysiwyg = function (userOptions) { | |||||
var editor = this, | |||||
selectedRange, | |||||
options, | |||||
toolbarBtnSelector, | |||||
updateToolbar = function () { | |||||
if (options.activeToolbarClass) { | |||||
$(options.toolbarSelector).find(toolbarBtnSelector).each(function () { | |||||
var command = $(this).data(options.commandRole); | |||||
try { | |||||
if (document.queryCommandState(command)) { | |||||
$(this).addClass(options.activeToolbarClass); | |||||
} else { | |||||
$(this).removeClass(options.activeToolbarClass); | |||||
} | |||||
} | |||||
catch (ex) { }; | |||||
}); | |||||
} | |||||
}, | |||||
execCommand = function (commandWithArgs, valueArg) { | |||||
var commandArr = commandWithArgs.split(' '), | |||||
command = commandArr.shift(), | |||||
args = commandArr.join(' ') + (valueArg || ''); | |||||
if (commandWithArgs === "createLink") | |||||
args = prompt("Enter the URL for this link:", "http://"); | |||||
document.execCommand(command, 0, args); | |||||
updateToolbar(); | |||||
}, | |||||
bindHotkeys = function (hotKeys) { | |||||
$.each(hotKeys, function (hotkey, command) { | |||||
editor.keydown(hotkey, function (e) { | |||||
if (editor.attr('contenteditable') && editor.is(':visible')) { | |||||
e.preventDefault(); | |||||
e.stopPropagation(); | |||||
execCommand(command); | |||||
} | |||||
}).keyup(hotkey, function (e) { | |||||
if (editor.attr('contenteditable') && editor.is(':visible')) { | |||||
e.preventDefault(); | |||||
e.stopPropagation(); | |||||
} | |||||
}); | |||||
}); | |||||
}, | |||||
getCurrentRange = function () { | |||||
var sel = window.getSelection(); | |||||
if (sel.getRangeAt && sel.rangeCount) { | |||||
return sel.getRangeAt(0); | |||||
} | |||||
}, | |||||
saveSelection = function () { | |||||
selectedRange = getCurrentRange(); | |||||
}, | |||||
restoreSelection = function () { | |||||
var selection = window.getSelection(); | |||||
if (selectedRange) { | |||||
try { | |||||
selection.removeAllRanges(); | |||||
} catch (ex) { | |||||
document.body.createTextRange().select(); | |||||
document.selection.empty(); | |||||
} | |||||
selection.addRange(selectedRange); | |||||
} | |||||
}, | |||||
insertFiles = function (files) { | |||||
editor.focus(); | |||||
$.each(files, function (idx, fileInfo) { | |||||
if (/^image\//.test(fileInfo.type)) { | |||||
$.when(options.readFileIntoUrl(fileInfo)).done(function (dataUrl) { | |||||
execCommand('insertimage', dataUrl); | |||||
}).fail(function (e) { | |||||
options.fileUploadError("file-reader", e); | |||||
}); | |||||
} else { | |||||
$.when(options.readFileIntoUrl(fileInfo)).done(function (dataUrl) { | |||||
//execCommand('inserthtml', '<a href="' + dataUrl + '">Download</a>'); | |||||
var frag = document.createDocumentFragment(); | |||||
var node = document.createElement("a"); | |||||
node.innerText = fileInfo.name; | |||||
node.href = dataUrl; | |||||
frag.appendChild(node); | |||||
window.getSelection().getRangeAt(0).insertNode(node); | |||||
}).fail(function (e) { | |||||
options.fileUploadError("file-reader", e); | |||||
}); | |||||
//options.fileUploadError("unsupported-file-type", fileInfo.type); | |||||
} | |||||
}); | |||||
}, | |||||
markSelection = function (input, color) { | |||||
restoreSelection(); | |||||
if (document.queryCommandSupported('hiliteColor')) { | |||||
document.execCommand('hiliteColor', 0, color || 'transparent'); | |||||
} | |||||
saveSelection(); | |||||
input.data(options.selectionMarker, color); | |||||
}, | |||||
bindToolbar = function (toolbar, options) { | |||||
toolbar.find(toolbarBtnSelector).click(function () { | |||||
restoreSelection(); | |||||
editor.focus(); | |||||
execCommand($(this).data(options.commandRole)); | |||||
saveSelection(); | |||||
}); | |||||
toolbar.find('[data-toggle=dropdown]').click(restoreSelection); | |||||
toolbar.find('input[type=text][data-' + options.commandRole + ']').on('webkitspeechchange change', function () { | |||||
var newValue = this.value; /* ugly but prevents fake double-calls due to selection restoration */ | |||||
this.value = ''; | |||||
restoreSelection(); | |||||
if (newValue) { | |||||
editor.focus(); | |||||
execCommand($(this).data(options.commandRole), newValue); | |||||
} | |||||
saveSelection(); | |||||
}).on('focus', function () { | |||||
var input = $(this); | |||||
if (!input.data(options.selectionMarker)) { | |||||
markSelection(input, options.selectionColor); | |||||
input.focus(); | |||||
} | |||||
}).on('blur', function () { | |||||
var input = $(this); | |||||
if (input.data(options.selectionMarker)) { | |||||
markSelection(input, false); | |||||
} | |||||
}); | |||||
toolbar.find('input[type=file][data-' + options.commandRole + ']').change(function () { | |||||
restoreSelection(); | |||||
if (this.type === 'file' && this.files && this.files.length > 0) { | |||||
insertFiles(this.files); | |||||
} | |||||
saveSelection(); | |||||
this.value = ''; | |||||
}); | |||||
}, | |||||
initFileDrops = function () { | |||||
editor.on('dragenter dragover', false) | |||||
.on('drop', function (e) { | |||||
var dataTransfer = e.originalEvent.dataTransfer; | |||||
e.stopPropagation(); | |||||
e.preventDefault(); | |||||
if (dataTransfer && dataTransfer.files && dataTransfer.files.length > 0) { | |||||
insertFiles(dataTransfer.files); | |||||
} | |||||
}); | |||||
}; | |||||
options = $.extend({}, $.fn.wysiwyg.defaults, userOptions); | |||||
toolbarBtnSelector = 'a[data-' + options.commandRole + '],button[data-' + options.commandRole + '],input[type=button][data-' + options.commandRole + ']'; | |||||
bindHotkeys(options.hotKeys); | |||||
if (options.dragAndDropImages) { | |||||
initFileDrops(); | |||||
} | |||||
bindToolbar($(options.toolbarSelector), options); | |||||
editor.attr('contenteditable', true) | |||||
.on('mouseup keyup mouseout', function () { | |||||
saveSelection(); | |||||
updateToolbar(); | |||||
}); | |||||
$(window).bind('touchend', function (e) { | |||||
var isInside = (editor.is(e.target) || editor.has(e.target).length > 0), | |||||
currentRange = getCurrentRange(), | |||||
clear = currentRange && (currentRange.startContainer === currentRange.endContainer && currentRange.startOffset === currentRange.endOffset); | |||||
if (!clear || isInside) { | |||||
saveSelection(); | |||||
updateToolbar(); | |||||
} | |||||
}); | |||||
return this; | |||||
}; | |||||
$.fn.wysiwyg.defaults = { | |||||
hotKeys: { | |||||
'ctrl+b meta+b': 'bold', | |||||
'ctrl+i meta+i': 'italic', | |||||
'ctrl+u meta+u': 'underline', | |||||
'ctrl+z meta+z': 'undo', | |||||
'ctrl+y meta+y meta+shift+z': 'redo', | |||||
'ctrl+l meta+l': 'justifyleft', | |||||
'ctrl+r meta+r': 'justifyright', | |||||
'ctrl+e meta+e': 'justifycenter', | |||||
'ctrl+j meta+j': 'justifyfull', | |||||
'shift+tab': 'outdent', | |||||
'tab': 'indent' | |||||
}, | |||||
toolbarSelector: '[data-role=editor-toolbar]', | |||||
commandRole: 'edit', | |||||
activeToolbarClass: 'btn-info', | |||||
selectionMarker: 'edit-focus-marker', | |||||
selectionColor: 'darkgrey', | |||||
dragAndDropImages: true, | |||||
fileUploadError: function (reason, detail) { console.log("File upload error", reason, detail); }, | |||||
readFileIntoUrl: readFileIntoDataUrl | |||||
}; | |||||
}(window.jQuery)); |
@ -0,0 +1,271 @@ | |||||
/* globals NodeList, HTMLCollection */ | |||||
(function () { | |||||
var postId = null; | |||||
//#region Helpers | |||||
function objectToUrl(obj) { | |||||
var string = ''; | |||||
for (var prop in obj) { | |||||
if (obj.hasOwnProperty(prop)) { | |||||
string += prop + '=' + obj[prop].replace(/ /g, '+') + '&'; | |||||
} | |||||
} | |||||
return string.substring(0, string.length - 1); | |||||
} | |||||
var AsynObject = AsynObject ? AsynObject : {}; | |||||
AsynObject.ajax = function (url, callback) { | |||||
var ajaxRequest = AsynObject.getAjaxRequest(callback); | |||||
ajaxRequest.open("GET", url, true); | |||||
ajaxRequest.setRequestHeader('X-Requested-With', 'XMLHttpRequest'); | |||||
ajaxRequest.send(null); | |||||
}; | |||||
AsynObject.postAjax = function (url, callback, data) { | |||||
var ajaxRequest = AsynObject.getAjaxRequest(callback); | |||||
ajaxRequest.open("POST", url, true); | |||||
ajaxRequest.setRequestHeader("Content-Type", "application/x-www-form-urlencoded"); | |||||
ajaxRequest.send(objectToUrl(data)); | |||||
}; | |||||
AsynObject.getAjaxRequest = function (callback) { | |||||
var ajaxRequest = new XMLHttpRequest(); | |||||
ajaxRequest.onreadystatechange = function () { | |||||
if (ajaxRequest.readyState > 1 && ajaxRequest.status > 0) { | |||||
callback(ajaxRequest.readyState, ajaxRequest.status, ajaxRequest.responseText); | |||||
} | |||||
}; | |||||
return ajaxRequest; | |||||
}; | |||||
function hasClass(elem, className) { | |||||
return new RegExp(' ' + className + ' ').test(' ' + elem.className + ' '); | |||||
} | |||||
function addClass(elem, className) { | |||||
if (!hasClass(elem, className)) { | |||||
elem.className += ' ' + className; | |||||
} | |||||
} | |||||
function removeClass(elem, className) { | |||||
var newClass = ' ' + elem.className.replace(/[\t\r\n]/g, ' ') + ' '; | |||||
if (hasClass(elem, className)) { | |||||
while (newClass.indexOf(' ' + className + ' ') >= 0) { | |||||
newClass = newClass.replace(' ' + className + ' ', ' '); | |||||
} | |||||
elem.className = newClass.replace(/^\s+|\s+$/g, ''); | |||||
} | |||||
} | |||||
function toDOM(htmlString) { | |||||
var wrapper = document.createElement('div'); | |||||
wrapper.innerHTML = htmlString; | |||||
return wrapper.children; | |||||
} | |||||
function getParentsByAttribute(element, attr, value) { | |||||
var arr = []; | |||||
while (element) { | |||||
element = element.parentNode; | |||||
if (element.hasAttribute(attr) && element.getAttribute(attr) === value) { | |||||
arr.push(element); | |||||
} | |||||
if (!element.parentNode.parentNode) { | |||||
break; | |||||
} | |||||
} | |||||
return arr; | |||||
} | |||||
Element.prototype.remove = function () { | |||||
this.parentElement.removeChild(this); | |||||
}; | |||||
NodeList.prototype.remove = HTMLCollection.prototype.remove = function () { | |||||
for (var i = 0, len = this.length; i < len; i++) { | |||||
if (this[i] && this[i].parentElement) { | |||||
this[i].parentElement.removeChild(this[i]); | |||||
} | |||||
} | |||||
}; | |||||
function slide(thisObj, direction, callback) { | |||||
if (direction === "Up") { | |||||
thisObj.style.height = '0px'; | |||||
} else { | |||||
var clone = thisObj.cloneNode(true); | |||||
clone.style.position = 'absolute'; | |||||
clone.style.visibility = 'hidden'; | |||||
clone.style.height = 'auto'; | |||||
addClass(clone, 'slideClone col-md-6 col-md-offset-3'); | |||||
document.body.appendChild(clone); | |||||
var slideClone = document.getElementsByClassName("slideClone")[0]; | |||||
var newHeight = slideClone.clientHeight; | |||||
slideClone.remove(); | |||||
thisObj.style.height = newHeight + 'px'; | |||||
if (callback) { | |||||
setTimeout(function () { | |||||
callback(); | |||||
}, 500); | |||||
} | |||||
} | |||||
} | |||||
//#endregion | |||||
var endpoint = "/comment.ashx"; | |||||
function deleteComment(commentId, element) { | |||||
if (confirm("Do you want to delete this comment?")) { | |||||
AsynObject.postAjax(endpoint, function (state, status) { | |||||
if (state === 4 && status === 200) { | |||||
slide(element, "Up", function () { | |||||
element.remove(); | |||||
}); | |||||
return; | |||||
} else if (status !== 200) { | |||||
alert("Something went wrong. Please try again"); | |||||
} | |||||
}, { | |||||
mode: "delete", | |||||
postId: postId, | |||||
commentId: commentId, | |||||
token: document.querySelector("[data-token]").getAttribute("data-token") | |||||
}); | |||||
} | |||||
} | |||||
function approveComment(commentId, element) { | |||||
AsynObject.postAjax(endpoint, function (state, status) { | |||||
if (state === 4 && status === 200) { | |||||
element.remove(); | |||||
return; | |||||
} else if (status !== 200) { | |||||
alert("Something went wrong. Please try again"); | |||||
} | |||||
}, { | |||||
mode: "approve", | |||||
postId: postId, | |||||
commentId: commentId, | |||||
token: document.querySelector("[data-token]").getAttribute("data-token") | |||||
}); | |||||
} | |||||
function saveComment(name, email, website, content, callback) { | |||||
if (localStorage) { | |||||
localStorage.setItem("name", name); | |||||
localStorage.setItem("email", email); | |||||
localStorage.setItem("website", website); | |||||
} | |||||
AsynObject.postAjax(endpoint, function (state, status, data) { | |||||
var elemStatus = document.getElementById("status"); | |||||
if (state === 4 && status === 200) { | |||||
elemStatus.innerHTML = "Your comment has been added"; | |||||
removeClass(elemStatus, "alert-danger"); | |||||
addClass(elemStatus, "alert-success"); | |||||
document.getElementById("commentcontent").value = ""; | |||||
var comment = toDOM(data)[0]; | |||||
comment.style.height = "0px"; | |||||
var elemComments = document.getElementById("comments"); | |||||
elemComments.appendChild(comment); | |||||
slide(comment, "Down"); | |||||
callback(true); | |||||
return; | |||||
} else if (status !== 200) { | |||||
addClass(elemStatus, "alert-danger"); | |||||
elemStatus.innerText = "Unable to add comment"; | |||||
callback(false); | |||||
} | |||||
}, { | |||||
mode: "save", | |||||
postId: postId, | |||||
name: name, | |||||
email: email, | |||||
website: website, | |||||
content: content, | |||||
token: document.querySelector("[data-token]").getAttribute("data-token"), | |||||
}); | |||||
} | |||||
function initialize() { | |||||
postId = document.querySelector("[itemprop=blogPost]").getAttribute("data-id"); | |||||
var email = document.getElementById("commentemail"); | |||||
var name = document.getElementById("commentname"); | |||||
var website = document.getElementById("commenturl"); | |||||
var content = document.getElementById("commentcontent"); | |||||
var commentForm = document.getElementById("commentform"); | |||||
var allComments = document.querySelectorAll("[itemprop=comment]"); | |||||
for (var i = 0; i < allComments.length; ++i) { | |||||
allComments[i].style.height = allComments[i].clientHeight + 'px'; | |||||
} | |||||
commentForm.onsubmit = function (e) { | |||||
e.preventDefault(); | |||||
var button = e.target; | |||||
button.setAttribute("disabled", true); | |||||
saveComment(name.value, email.value, website.value, content.value, function () { | |||||
button.removeAttribute("disabled"); | |||||
}); | |||||
}; | |||||
website.addEventListener("keyup", function (e) { | |||||
var w = e.target; | |||||
if (w.value.trim().length >= 4 && w.value.indexOf("http") === -1) { | |||||
w.value = "http://" + w.value; | |||||
} | |||||
}); | |||||
window.addEventListener("click", function (e) { | |||||
var tag = e.target; | |||||
if (hasClass(tag, "deletecomment")) { | |||||
var comment = getParentsByAttribute(tag, "itemprop", "comment")[0]; | |||||
deleteComment(comment.getAttribute("data-id"), comment); | |||||
} | |||||
if (hasClass(tag, "approvecomment")) { | |||||
var comment = getParentsByAttribute(tag, "itemprop", "comment")[0]; | |||||
approveComment(comment.getAttribute("data-id"), tag); | |||||
} | |||||
}); | |||||
if (localStorage) { | |||||
email.value = localStorage.getItem("email"); | |||||
website.value = localStorage.getItem("website"); | |||||
if (name.value.length === 0) { | |||||
name.value = localStorage.getItem("name"); | |||||
} | |||||
} | |||||
} | |||||
if (document.getElementById("commentform")) { | |||||
initialize(); | |||||
} | |||||
})(); |
@ -0,0 +1,46 @@ | |||||
<article data-id="@Model.ID" itemscope itemtype="http://schema.org/UserComments" itemprop="comment" class="@(Model.IsAdmin ? "self" : null)"> | |||||
<img src="@Model.GravatarUrl(50)" width="50" height="50" alt="Comment by @Model.Author" /> | |||||
<div> | |||||
@Date() | |||||
<p itemprop="commentText">@Html.Raw(Model.ContentWithLinks())</p> | |||||
@Author() | |||||
@DeleteAndApproveButton() | |||||
</div> | |||||
@ApprovalMessage() | |||||
</article> | |||||
@helper Date() | |||||
{ | |||||
var title = Model.PubDate.ToString("yyyy-MM-ddTHH:mm"); | |||||
var display = Model.PubDate.ToString("MMMM d. yyyy HH:mm"); | |||||
<time datetime="@title" itemprop="commentTime">@display</time> | |||||
} | |||||
@helper Author() | |||||
{ | |||||
if (string.IsNullOrEmpty(Model.Website)) | |||||
{ | |||||
<strong itemprop="creator">@Model.Author</strong> | |||||
} | |||||
else | |||||
{ | |||||
<strong itemprop="creator"><a href="@Model.Website" itemprop="url" rel="nofollow">@Model.Author</a></strong> | |||||
} | |||||
} | |||||
@helper DeleteAndApproveButton() | |||||
{ | |||||
if (User.Identity.IsAuthenticated) | |||||
{ | |||||
<button class="deletecomment btn btn-link">Delete</button> | |||||
if (Blog.ModerateComments && !Model.IsApproved) | |||||
{ | |||||
<button class="approvecomment btn btn-link">Approve</button> | |||||
} | |||||
} | |||||
} | |||||
@helper ApprovalMessage() | |||||
{ | |||||
if (Blog.ModerateComments && !Model.IsApproved && !User.Identity.IsAuthenticated) | |||||
{ | |||||
<div itemprop="approvalWarning">! The comment will not be visible until a moderator approves it !</div> | |||||
} | |||||
} |
@ -0,0 +1,109 @@ | |||||
@if (Page.ShowPaging == true) | |||||
{ | |||||
<div class="col-6 col-sm-6 col-lg-4 rtl pull-right"> | |||||
<h2>@Model.Title</h2> | |||||
<p class="excerpt">@MarkupHelper.GetDescription(Model.Content, 235, "...")</p> | |||||
<p><a class="btn btn-primary" href="@Model.Url" role="button">بیشتر بخوانید »</a></p> | |||||
</div> | |||||
} | |||||
else | |||||
{ | |||||
<article class="post" data-id="@Model.ID" itemscope itemtype="http://schema.org/BlogPosting" itemprop="blogPost"> | |||||
<header class="jumbotron"> | |||||
<h1 itemprop="headline name"> | |||||
<a href="@Model.Url" itemprop="url">@Model.Title</a> | |||||
</h1> | |||||
<div> | |||||
<abbr title="@Model.PubDate.ToLocalTime()" itemprop="datePublished">@Model.PubDate.ToLocalTime().ToString("MMMM d. yyyy")</abbr> | |||||
<a href="@Model.Url#comments"> | |||||
<em class="glyphicon glyphicon-comment"></em> | |||||
@Model.CountApprovedComments(Context) Comments | |||||
</a> | |||||
@Categories() | |||||
</div> | |||||
</header> | |||||
<div itemprop="articleBody">@Html.Raw(Model.Content)</div> | |||||
@if (Blog.CurrentPost != null) | |||||
{ | |||||
<section id="comments" aria-label="Comments"> | |||||
@if (Model.CountApprovedComments(Context) > 0) | |||||
{ | |||||
<h2>Comments</h2> | |||||
} | |||||
@foreach (Comment comment in Model.Comments) | |||||
{ | |||||
if (comment.IsApproved || !Blog.ModerateComments || Context.User.Identity.IsAuthenticated) | |||||
{ | |||||
@RenderPage("Comment.cshtml", comment) | |||||
} | |||||
} | |||||
</section> | |||||
if (Model.AreCommentsOpen(Context)) | |||||
{ | |||||
@RenderPage("~/views/CommentForm.cshtml") | |||||
} | |||||
} | |||||
</article> | |||||
@helper Categories() | |||||
{ | |||||
if (Model.Categories.Length > 0) | |||||
{ | |||||
<ul class="categories"> | |||||
<li><em class="glyphicon glyphicon-bookmark"></em> Posted in: </li> | |||||
@foreach (string cat in Model.Categories) | |||||
{ | |||||
<li itemprop="articleSection"> | |||||
<a href="~/category/@HttpUtility.UrlEncode(cat.ToLowerInvariant())">@cat</a> | |||||
</li> | |||||
} | |||||
</ul> | |||||
} | |||||
} | |||||
} | |||||
@functions{ | |||||
public class MarkupHelper | |||||
{ | |||||
#region excerpt generation | |||||
public static string GetDescription(string content, int length = 300, string ommission = "...") | |||||
{ | |||||
return TruncateHtml(StripTags(content), 235, ommission); | |||||
} | |||||
public static string TruncateHtml(string input, int length = 300, string ommission = "...") | |||||
{ | |||||
if (input == null || input.Length < length) | |||||
return input; | |||||
int nextSpace = input.LastIndexOf(" ", length); | |||||
return string.Format("{0}" + ommission, | |||||
input.Substring(0, (nextSpace > 0) ? nextSpace : length).Trim()); | |||||
} | |||||
public static string StripTags(string markup) | |||||
{ | |||||
try | |||||
{ | |||||
StringReader stringReader = new StringReader(markup); | |||||
System.Xml.XPath.XPathDocument xPathdocument; | |||||
using (System.Xml.XmlReader xmlReader = System.Xml.XmlReader.Create(stringReader, | |||||
new System.Xml.XmlReaderSettings() { ConformanceLevel = System.Xml.ConformanceLevel.Fragment })) | |||||
{ | |||||
xPathdocument = new System.Xml.XPath.XPathDocument(xmlReader); | |||||
} | |||||
return xPathdocument.CreateNavigator().Value; | |||||
} | |||||
catch | |||||
{ | |||||
return string.Empty; | |||||
} | |||||
} | |||||
#endregion | |||||
} | |||||
} |
@ -0,0 +1,119 @@ | |||||
@{ | |||||
string next = Blog.GetNextPage(); | |||||
string prev = Blog.GetPrevPage(); | |||||
} | |||||
<!doctype html> | |||||
<html lang="en-us"> | |||||
<head prefix="og: http://ogp.me/ns#"> | |||||
<meta charset="utf-8" /> | |||||
<title>@Page.Title</title> | |||||
<meta name="description" content="@Blog.Description" /> | |||||
<meta name="viewport" content="width=device-width, initial-scale=1.0, maximum-scale=1" /> | |||||
<link type="application/rsd+xml" rel="edituri" title="RSD" href="~/views/robots/rsd" /> | |||||
<link type="application/rss+xml" rel="alternate" title="@Blog.Title" href="~/feed/rss/" /> | |||||
<link type="application/atom+xml" rel="alternate" title="@Blog.Title" href="~/feed/atom/" /> | |||||
<link rel="stylesheet" href="@Blog.FingerPrint("/css/bootstrap.min.css")" /> | |||||
@*<link rel="stylesheet" href="@Blog.FingerPrint("/themes/" + Blog.Theme + "/site.css")" />*@ | |||||
<link rel="stylesheet" href="@Blog.FingerPrint("/themes/" + Blog.Theme + "/common.css")" /> | |||||
<link rel="shortcut icon" href="@Blog.FingerPrint("/favicon.ico")" type="image/x-icon" /> | |||||
<link rel="dns-prefetch" href="http://gravatar.com/" /> | |||||
@AdminCss() | |||||
<meta name="application-name" content="@Blog.Title" /> | |||||
<meta name="msapplication-TileColor" content="#ffffff" /> | |||||
<meta property="og:title" content="@Page.Title" /> | |||||
<meta property="og:type" content="website" /> | |||||
<meta property="og:image" content="@Blog.Image" /> | |||||
<meta property="og:url" content="@(Request.Url.Scheme +"://" + Request.Url.Authority + Request.RawUrl)" /> | |||||
@if (!string.IsNullOrEmpty(prev)) | |||||
{ | |||||
<link rel="prev" href="@prev" /> | |||||
} | |||||
@if (!string.IsNullOrEmpty(next)) | |||||
{ | |||||
<link rel="next" href="@next" /> | |||||
} | |||||
</head> | |||||
<body itemscope itemtype="http://schema.org/Blog" class="@(User.Identity.IsAuthenticated ? "admin" : null)"> | |||||
<nav class="navbar navbar-default navbar-fixed-top" role="navigation"> | |||||
<div class="container"> | |||||
<div class="navbar-header navbar-right"> | |||||
@*<button type="button" class="navbar-toggle" data-toggle="collapse" data-target="#collapse"> | |||||
<span class="sr-only">Toggle navigation</span> | |||||
<span class="icon-bar"></span> | |||||
<span class="icon-bar"></span> | |||||
<span class="icon-bar"></span> | |||||
</button>*@ | |||||
<a class="navbar-brand" href="#"> | |||||
<small>اخبار سومین</small> | |||||
<img src="@Blog.FingerPrint("/images/revert-logo.png")"> | |||||
</a> | |||||
</div> | |||||
@*<div class="collapse navbar-collapse navbar-right" id="collapse"> | |||||
<ul class="nav navbar-nav navbar-right"> | |||||
<li class="rtl"><a href="/"><span class="glyphicon glyphicon-home"></span>خانه</a></li> | |||||
<li class="rtl"><a href="/jobs">آگهیهای استخدام</a></li> | |||||
<li class="rtl"><a href="/login">ورود به سایت</a></li> | |||||
</ul> | |||||
</div>*@ | |||||
</div> | |||||
</nav> | |||||
<div class="container"> | |||||
<div class="row row-offcanvas row-offcanvas-right"> | |||||
@*<header role="banner"> | |||||
<h1 class="rtl" itemprop="name">@Blog.Title</h1> | |||||
</header>*@ | |||||
<div role="main" class="col-md-12"> | |||||
@RenderBody() | |||||
@if (Page.ShowPaging != null) | |||||
{ | |||||
<ul class="pager"> | |||||
@if (Blog.GetPosts().Count() > Blog.PostsPerPage * Blog.CurrentPage) | |||||
{ | |||||
<li class="previous"><a href="@Blog.GetPagingUrl(1)" rel="prev">← Older</a></li> | |||||
} | |||||
@if (Blog.CurrentPage > 1) | |||||
{ | |||||
<li class="next"><a href="@Blog.GetPagingUrl(-1)" rel="next">Newer →</a></li> | |||||
} | |||||
</ul> | |||||
} | |||||
</div> | |||||
</div> | |||||
</div> | |||||
<footer class="text-center" role="contentinfo" itemscope itemtype="http://schema.org/Person" itemprop="author"> | |||||
<span> | |||||
Copyright © @DateTime.Now.Year | |||||
<a href="http://www.sevom.in" itemprop="url name">Sevomin</a> | |||||
</span> | |||||
</footer> | |||||
@if ((Blog.CurrentPost != null && Blog.CurrentPost.AreCommentsOpen(Context)) || Blog.IsNewPost) | |||||
{ | |||||
<script src="@Blog.FingerPrint("/scripts/comments.js")" async defer></script> | |||||
} | |||||
@if (User.Identity.IsAuthenticated) | |||||
{ | |||||
@RenderPage("~/views/AdminMenu.cshtml") | |||||
} | |||||
</body> | |||||
</html> | |||||
@helper AdminCss() | |||||
{ | |||||
if (User.Identity.IsAuthenticated) | |||||
{ | |||||
<link href="@Blog.FingerPrint("/css/admin.css")" rel="stylesheet" /> | |||||
} | |||||
} |
@ -0,0 +1,106 @@ | |||||
@font-face { | |||||
font-family: 'Koodak'; | |||||
src: url('/fonts/BKoodakBold.eot?#') format('eot'), /* IE6–8 */ | |||||
url('/fonts/BKoodakBold.woff') format('woff'), /* FF3.6+, IE9, Chrome6+, Saf5.1+*/ | |||||
url('/fonts/BKoodakBold.ttf') format('truetype'); /* Saf3—5, Chrome4+, FF3.5, Opera 10+ */ | |||||
} | |||||
@font-face { | |||||
font-family: 'Yekan'; | |||||
src: url('/fonts/WebYekan.eot'); | |||||
src: url('/fonts/WebYekan.eot?#iefix') format('embedded-opentype'), | |||||
url('/fonts/WebYekan.woff') format('woff'), | |||||
url('/fonts/WebYekan.ttf') format('truetype'), | |||||
url('/fonts/WebYekan.svg#WebYekan') format('svg'); | |||||
font-weight: normal; | |||||
font-style: normal; | |||||
unicode-range: U+0600–06FF; | |||||
} | |||||
body{ | |||||
font-family: Yekan, "Helvetica Neue",Helvetica,Arial,sans-serif; | |||||
padding: 60px; | |||||
} | |||||
h1, h2, h3, h4, h5, h6{ | |||||
font-family: Koodak, "Helvetica Neue",Helvetica,Arial,sans-serif; | |||||
} | |||||
.rtl{ | |||||
direction: rtl !important; | |||||
text-align: right !important; | |||||
} | |||||
.ltr{ | |||||
direction: ltr !important; | |||||
text-align: left !important; | |||||
} | |||||
.center-text{ | |||||
text-align: center !important; | |||||
} | |||||
th{ | |||||
text-align: right; | |||||
} | |||||
/*.navbar{ | |||||
height: 30px; | |||||
background: #5B9BD5; | |||||
border-radius: 0px !important; | |||||
} | |||||
.navbar .navbar-nav>li>a{ | |||||
color: white; | |||||
} | |||||
.navbar .navbar-nav>li>a:hover{ | |||||
color: #E0E0E0; | |||||
background: #69B0EA; | |||||
} | |||||
.navbar-brand{ | |||||
padding: 10px 15px 0px 15px !important; | |||||
}*/ | |||||
.navbar-brand img{ | |||||
height: 25px; | |||||
} | |||||
.job-list-top-toolbar, .job-list-bottom-toolbar{ | |||||
text-align: left !important; | |||||
} | |||||
.job-list-top-toolbar{ | |||||
padding: 0px 10px 10px 0px; | |||||
margin-bottom: 5px; | |||||
} | |||||
.job-list-bottom-toolbar{ | |||||
padding: 10px 10px 0px 0px; | |||||
} | |||||
.job-list-bottom-toolbar .date{ | |||||
float: right; | |||||
} | |||||
#login-intro-text{ | |||||
line-height: 1.5em; | |||||
font-size: 1.3em; | |||||
} | |||||
#login-intro-box{ | |||||
border-radius: 5px; | |||||
border: 1px solid #808080; | |||||
margin: 10px; | |||||
padding: 5px; | |||||
background: #dcdcdc; | |||||
} | |||||
.footer{ | |||||
padding-top: 40px; | |||||
padding-bottom: 40px; | |||||
margin-top: 100px; | |||||
color: #777; | |||||
text-align: center; | |||||
border-top: 1px solid #e5e5e5; | |||||
} |
@ -0,0 +1,247 @@ | |||||
@media only screen and (max-width: 1280px) { | |||||
@-ms-viewport { | |||||
width: 800px; | |||||
} | |||||
} | |||||
@media only screen and (max-width: 768px) { | |||||
@-ms-viewport { | |||||
width: 600px; | |||||
} | |||||
} | |||||
html, body { | |||||
height: 100%; | |||||
} | |||||
body { | |||||
font: 1.8em/1.5 'Century Gothic', Verdana, Geneva, 'DejaVu Sans', sans-serif; | |||||
margin: 0; | |||||
} | |||||
img, video, iframe { | |||||
max-width: 100%; | |||||
} | |||||
a { | |||||
color: #3277b3; | |||||
} | |||||
.container { | |||||
min-height: 100%; | |||||
padding-bottom: 35px; | |||||
} | |||||
.container > div > header { | |||||
border: none; | |||||
text-align: center; | |||||
margin: 0 0 3em 0; | |||||
} | |||||
.container > div > header a { | |||||
font-size: 4em; | |||||
color: #000; | |||||
} | |||||
div[role=main] { | |||||
margin-bottom: 2em; | |||||
overflow: auto; | |||||
} | |||||
.pager { | |||||
margin-top: 2em; | |||||
} | |||||
input[type], button, textarea { | |||||
font: inherit !important; | |||||
} | |||||
/*#region Post */ | |||||
.post header h1 { | |||||
margin: 0 0 3px 0; | |||||
} | |||||
.post header a { | |||||
color: #000; | |||||
} | |||||
.post header div { | |||||
font-size: .75em; | |||||
opacity: .8; | |||||
margin-bottom: 1em; | |||||
} | |||||
.post header div a { | |||||
margin-left: 10px; | |||||
} | |||||
.post header div .categories { | |||||
margin: 0; | |||||
padding: 10px; | |||||
display: inline; | |||||
} | |||||
.post header div .categories a { | |||||
margin: 0; | |||||
} | |||||
.post header div .categories li { | |||||
display: inline; | |||||
} | |||||
.post header div .categories li:not(:first-child):not(:last-child):after { | |||||
content: ", "; | |||||
} | |||||
.post abbr { | |||||
border: none; | |||||
} | |||||
.post h2 { | |||||
margin-bottom: 0; | |||||
font-size: 1.3em; | |||||
} | |||||
.post h3 { | |||||
margin-bottom: 0; | |||||
font-size: 1.1em; | |||||
} | |||||
.post div[itemprop='articleBody'] { | |||||
border-bottom: 1px solid #d3d3d3; | |||||
padding-bottom: .5em; | |||||
margin-bottom: 2em; | |||||
-ms-text-size-adjust: 150%; | |||||
} | |||||
.post p { | |||||
padding: .2em 0; | |||||
} | |||||
/*#endregion */ | |||||
/*#region Comments */ | |||||
#comments article { | |||||
position: relative; | |||||
max-height: 9999px; | |||||
overflow: hidden; | |||||
-webkit-transition: height .5s ease-in-out; | |||||
-moz-transition: height .5s ease-in-out; | |||||
-o-transition: height .5s ease-in-out; | |||||
transition: height .5s ease-in-out; | |||||
} | |||||
#comments article div { | |||||
padding-left: 70px; | |||||
} | |||||
#comments article div p { | |||||
border: 1px solid #d3d3d3; | |||||
border-radius: 5px; | |||||
padding: 7px; | |||||
position: relative; | |||||
} | |||||
#comments article div p:before { | |||||
content: ""; | |||||
position: absolute; | |||||
top: 10px; | |||||
left: -10px; | |||||
border-style: solid; | |||||
border-width: 9px 9px 9px 0; | |||||
border-color: transparent #d3d3d3; | |||||
} | |||||
#comments article div p:after { | |||||
content: ""; | |||||
position: absolute; | |||||
top: 10px; | |||||
left: -9px; | |||||
border-style: solid; | |||||
border-width: 9px 9px 9px 0; | |||||
border-color: transparent #ffffff; | |||||
} | |||||
#comments article.self div p { | |||||
background: #f7f7f7; | |||||
} | |||||
#comments article.self div p:after { | |||||
border-color: transparent #f7f7f7; | |||||
} | |||||
#comments article [itemprop='commentText'] { | |||||
margin: 0; | |||||
} | |||||
#comments article img { | |||||
border-radius: 5px; | |||||
position: absolute; | |||||
top: 19px; | |||||
} | |||||
#comments article [itemprop='commentTime'] { | |||||
display: block; | |||||
text-align: right; | |||||
font-size: .7em; | |||||
} | |||||
#comments article [itemprop='creator'] { | |||||
font-size: .8em; | |||||
margin-left: 7px; | |||||
} | |||||
#comments article [itemprop='approvalWarning'] { | |||||
margin-left: 70px; | |||||
font-size: 0.6em; | |||||
background-color: rgba(255, 255, 0, 0.50); | |||||
padding: 5px; | |||||
} | |||||
/*#endregion */ | |||||
/*#region Comment form */ | |||||
#commentform { | |||||
margin-top: 2em; | |||||
} | |||||
#status { | |||||
margin-left: 1em; | |||||
} | |||||
/*#endregion */ | |||||
/*#region Footer */ | |||||
footer { | |||||
background-color: #181818; | |||||
color: #fff; | |||||
font-size: .85em; | |||||
padding: 5px; | |||||
clear: both; | |||||
position: relative; | |||||
margin: -35px 0 0 0; | |||||
height: 35px; | |||||
} | |||||
footer p { | |||||
padding: 1em 0; | |||||
text-align: center; | |||||
} | |||||
footer a { | |||||
color: #a9d2e1; | |||||
} | |||||
/*#endregion */ | |||||
.slideClone img { | |||||
float: left; | |||||
} | |||||
.excerpt { | |||||
font-size: 14px; | |||||
} |
@ -0,0 +1,78 @@ | |||||
@{ | |||||
var isPublished = Blog.CurrentPost != null && Blog.CurrentPost.IsPublished; | |||||
} | |||||
<nav id="admin" data-role="editor-toolbar" class="navbar navbar-default navbar-fixed-top" data-ispublished="@isPublished" data-token="@Blog.UniqueId"> | |||||
<div class="navbar-inner"> | |||||
<ul class="nav navbar-nav"> | |||||
<li><button onclick="location.href='/post/new/'" class="btn btn-link" id="btnNew">New post</button></li> | |||||
<li><button class="btn btn-link" id="btnEdit" disabled>Edit</button></li> | |||||
<li><button class="btn btn-link" id="btnDelete" disabled>Delete</button></li> | |||||
<li><button class="btn btn-link" id="btnSave" disabled>Save</button></li> | |||||
<li><button class="btn btn-link" id="btnCancel" disabled>Cancel</button></li> | |||||
<li id="ispublished"> | |||||
<input type="checkbox" id="chkispublished" checked="@(isPublished ? "checked" : null)" disabled /> | |||||
<label for="chkispublished">Publish</label> | |||||
</li> | |||||
</ul> | |||||
<div id="tools"> | |||||
<div class="btn-group"> | |||||
<a class="btn btn-mini" data-edit="formatBlock <h1>">H1</a> | |||||
<a class="btn btn-mini" data-edit="formatBlock <h2>">H2</a> | |||||
<a class="btn btn-mini" data-edit="formatBlock <h3>">H3</a> | |||||
</div> | |||||
<div class="btn-group"> | |||||
<a class="btn btn-mini" data-edit="italic"><em>I</em></a> | |||||
<a class="btn btn-mini" data-edit="bold"><strong>B</strong></a> | |||||
<a class="btn btn-mini" data-edit="underline"><ins>U</ins></a> | |||||
<a class="btn btn-mini" data-edit="strikethrough"><s>S</s></a> | |||||
</div> | |||||
<div class="btn-group"> | |||||
<a class="btn btn-mini" data-edit="justifyleft" title="Justify left"><i class="glyphicon glyphicon-align-left"></i></a> | |||||
<a class="btn btn-mini" data-edit="justifycenter" title="Justify center"><i class="glyphicon glyphicon-align-center"></i></a> | |||||
<a class="btn btn-mini" data-edit="justifyright" title="Justify right"><i class="glyphicon glyphicon-align-right"></i></a> | |||||
<a class="btn btn-mini" data-edit="justifyfull" title="Justify full"><i class="glyphicon glyphicon-align-justify"></i></a> | |||||
</div> | |||||
<div class="btn-group"> | |||||
<a class="btn btn-mini" data-edit="insertunorderedlist" title="Bullet points"><i class="glyphicon glyphicon-list"></i></a> | |||||
<a class="btn btn-mini" data-edit="insertorderedlist" title="Numbered bullet points"><i class="glyphicon glyphicon-th-list"></i></a> | |||||
<a class="btn btn-mini" data-edit="outdent" title="Indent left"><i class="glyphicon glyphicon-indent-left"></i></a> | |||||
<a class="btn btn-mini" data-edit="indent" title="Indent right"><i class="glyphicon glyphicon-indent-right"></i></a> | |||||
</div> | |||||
<div class="btn-group"> | |||||
<a class="btn btn-mini" data-edit="createLink" title="Hyperlink"><i class="glyphicon glyphicon-globe"></i></a> | |||||
<a class="btn btn-mini" data-edit="unlink" title="Remove hyperlink"><i class="glyphicon glyphicon-remove"></i></a> | |||||
<a class="btn btn-mini uploadimage"><i class="glyphicon glyphicon-picture"></i></a> | |||||
</div> | |||||
<input type="file" id="txtImage" data-edit="insertImage" style="width:0; height: 0;position:absolute" /> | |||||
<div class="btn-group"> | |||||
<a class="btn btn-mini source" data-cmd="source" title="Toggle source/design view"><i class="glyphicon glyphicon-eye-open"></i></a> | |||||
</div> | |||||
</div> | |||||
</div> | |||||
<form action="@FormsAuthentication.LoginUrl?signout=true&[email protected]" method="post"> | |||||
<button type="submit" title="Signed in as @User.Identity.Name" class="btn btn-link pull-right"> | |||||
Sign out <span class="glyphicon glyphicon-lock"></span> | |||||
</button> | |||||
</form> | |||||
<aside> | |||||
<p class="alert"></p> | |||||
</aside> | |||||
</nav> | |||||
@if (!string.IsNullOrEmpty(Blog.CurrentSlug)) | |||||
{ | |||||
<script src="@Blog.FingerPrint("/scripts/jquery-2.0.2.js", "//ajax.googleapis.com/ajax/libs/jquery/2.0.2/jquery.min.js")"></script> | |||||
<script src="@Blog.FingerPrint("/scripts/bootstrap-wysiwyg.js")" defer></script> | |||||
<script src="@Blog.FingerPrint("/scripts/admin.js")" defer></script> | |||||
} |
@ -0,0 +1,38 @@ | |||||
<form id="commentform" role="form" class="form-horizontal" data-token="@Blog.UniqueId"> | |||||
<fieldset> | |||||
<legend>Post comment</legend> | |||||
<div class="form-group"> | |||||
<label for="commentname" class="control-label col-sm-2">Name</label> | |||||
<div class="col-sm-7"> | |||||
<input id="commentname" class="form-control" type="text" placeholder="Name" required /> | |||||
</div> | |||||
</div> | |||||
<div class="form-group"> | |||||
<label for="commentemail" class="control-label col-sm-2">Email</label> | |||||
<div class="col-sm-7"> | |||||
<input id="commentemail" class="form-control" type="email" placeholder="Email" required /> | |||||
</div> | |||||
</div> | |||||
<div class="form-group"> | |||||
<label for="commenturl" class="control-label col-sm-2">Website</label> | |||||
<div class="col-sm-7"> | |||||
<input id="commenturl" class="form-control" type="url" placeholder="Website URL" /> | |||||
</div> | |||||
</div> | |||||
<div class="form-group"> | |||||
<div class="col-sm-12"> | |||||
<label for="commentcontent" class="control-label">Comment (no HTML allowed)</label> | |||||
<textarea id="commentcontent" class="form-control" rows="4" placeholder="Comment" required></textarea> | |||||
</div> | |||||
</div> | |||||
<div class="form-group col-sm-12"> | |||||
<button class="btn btn-primary">Post comment</button> | |||||
<span id="status" class="alert" role="status" aria-live="polite"></span> | |||||
</div> | |||||
</fieldset> | |||||
</form> |
@ -0,0 +1,59 @@ | |||||
@{ | |||||
Page.Title = "Sign in"; | |||||
Layout = "~/themes/" + Blog.Theme + "/_Layout.cshtml"; | |||||
Response.Cache.SetCacheability(HttpCacheability.NoCache); | |||||
if (Request.HttpMethod == "POST") | |||||
{ | |||||
string username = Request.Form["username"]; | |||||
string password = Request.Form["password"]; | |||||
string remember = Request.Form["remember"]; | |||||
if (!string.IsNullOrEmpty(username) && !string.IsNullOrEmpty(password)) | |||||
{ | |||||
if (FormsAuthentication.Authenticate(username, password)) | |||||
{ | |||||
FormsAuthentication.RedirectFromLoginPage(username, remember == "on"); | |||||
} | |||||
} | |||||
else if (!string.IsNullOrEmpty(Request.QueryString["signout"])) | |||||
{ | |||||
FormsAuthentication.SignOut(); | |||||
Response.Redirect(Request.QueryString["ReturnUrl"], true); | |||||
} | |||||
} | |||||
} | |||||
@if (!User.Identity.IsAuthenticated) | |||||
{ | |||||
<form action="@Request.RawUrl" method="post" role="form" class="col-md-5 col-md-offset-3" id="login"> | |||||
<fieldset> | |||||
<h1 class="text-center">Sign in</h1> | |||||
@if (Request.HttpMethod == "POST") | |||||
{ | |||||
<p class="alert-danger">Username or password is incorrect</p> | |||||
} | |||||
<div class="form-group"> | |||||
<label for="username">Username</label> | |||||
<input type="text" class="form-control" id="username" name="username" placeholder="Username" required autofocus /> | |||||
</div> | |||||
<div class="form-group"> | |||||
<label for="password">Password</label> | |||||
<input type="password" class="form-control" id="password" name="password" placeholder="Password" required /> | |||||
</div> | |||||
<div class="form-group"> | |||||
<input type="checkbox" id="remember" name="remember" /> | |||||
<label for="remember"> Remember me</label> | |||||
</div> | |||||
<button type="submit" class="btn btn-primary">Sign in</button> | |||||
</fieldset> | |||||
</form> | |||||
} | |||||
else | |||||
{ | |||||
<h3>You are already signed in</h3> | |||||
} |
@ -0,0 +1,14 @@ | |||||
@{ | |||||
Response.ContentType = "text/xml"; | |||||
} | |||||
<rsd version="1.0"> | |||||
<service> | |||||
<enginename>MiniBlog</enginename> | |||||
<enginelink>http://github.com/madskristensen/miniblog/</enginelink> | |||||
<homepagelink>@Request.Url.Scheme://@Request.Url.Authority</homepagelink> | |||||
<apis> | |||||
<api name="MetaWeblog" preferred="true" apilink="@Request.Url.Scheme://@Request.Url.Authority/metaweblog" blogid="1" /> | |||||
</apis> | |||||
</service> | |||||
</rsd> |
@ -0,0 +1,8 @@ | |||||
User-agent: * | |||||
Disallow: /views/ | |||||
sitemap: @(Request.Url.Scheme + "://" + Request.Url.Authority)/sitemap.xml | |||||
@{ | |||||
Response.ContentType = "text/plain"; | |||||
} |
@ -0,0 +1,15 @@ | |||||
<?xml version="1.0" encoding="UTF-8" ?> | |||||
<urlset xmlns="http://www.sitemaps.org/schemas/sitemap/0.9"> | |||||
@foreach (Post post in Storage.GetAllPosts()) | |||||
{ | |||||
<url> | |||||
<loc>@post.AbsoluteUrl</loc> | |||||
<lastmod>@post.LastModified.ToString("yyyy-MM-ddThh:mmzzz")</lastmod> | |||||
</url> | |||||
} | |||||
</urlset> | |||||
@{ | |||||
Response.ContentType = "text/xml"; | |||||
} |
@ -0,0 +1,28 @@ | |||||
<?xml version="1.0" encoding="utf-8" ?> | |||||
<manifest xmlns="http://schemas.microsoft.com/wlw/manifest/weblog"> | |||||
<options> | |||||
<clientType>Metaweblog</clientType> | |||||
<supportsEmbeds>Yes</supportsEmbeds> | |||||
<supportsKeywords>No</supportsKeywords> | |||||
<supportsNewCategories>Yes</supportsNewCategories> | |||||
<supportsNewCategoriesInline>Yes</supportsNewCategoriesInline> | |||||
<supportsCommentPolicy>No</supportsCommentPolicy> | |||||
<supportsSlug>Yes</supportsSlug> | |||||
<supportsExcerpt>No</supportsExcerpt> | |||||
<supportsPages>No</supportsPages> | |||||
<supportsPageParent>No</supportsPageParent> | |||||
<supportsAuthor>No</supportsAuthor> | |||||
<supportsGetTags>No</supportsGetTags> | |||||
<requiresHtmlTitles>No</requiresHtmlTitles> | |||||
<supportsEmptyTitles>No</supportsEmptyTitles> | |||||
<fileUploadNameFormat>{FileName}</fileUploadNameFormat> | |||||
</options> | |||||
<weblog> | |||||
<ServiceName>MiniBlog</ServiceName> | |||||
<imageUrl>favicon.ico</imageUrl> | |||||
<watermarkImageUrl>favicon.ico</watermarkImageUrl> | |||||
<homepageLinkText>View your blog</homepageLinkText> | |||||
<adminLinkText>Manage your blog</adminLinkText> | |||||
<adminUrl><![CDATA[{blog-homepage-url}login/]]></adminUrl> | |||||
</weblog> | |||||
</manifest> |
@ -0,0 +1,38 @@ | |||||
<?xml version="1.0" encoding="utf-8"?> | |||||
<Project xmlns="http://schemas.microsoft.com/developer/msbuild/2003"> | |||||
<UsingTask AssemblyFile="AjaxMinTask.dll" TaskName="AjaxMin" /> | |||||
<UsingTask AssemblyFile="AjaxMinTask.dll" TaskName="AjaxMinBundleTask" /> | |||||
<UsingTask AssemblyFile="AjaxMinTask.dll" TaskName="AjaxMinManifestTask" /> | |||||
<UsingTask AssemblyFile="AjaxMinTask.dll" TaskName="AjaxMinManifestCleanTask" /> | |||||
<PropertyGroup> | |||||
<!-- if the project has a Content folder, we want that to be the root output; otherwise just dump everything relative to the project root --> | |||||
<AjaxMinOutputFolder Condition="$(AjaxMinOutputFolder)=='' and Exists('$(ProjectDir)Content\')">$(ProjectDir)Content\</AjaxMinOutputFolder> | |||||
<AjaxMinOutputFolder Condition="$(AjaxMinOutputFolder)==''">$(ProjectDir)</AjaxMinOutputFolder> | |||||
<!-- default is to NOT treat warnings as errors --> | |||||
<AjaxMinTreatWarningsAsErrors Condition="$(AjaxMinTreatWarningsAsErrors)==''">false</AjaxMinTreatWarningsAsErrors> | |||||
</PropertyGroup> | |||||
<ItemGroup> | |||||
<AjaxMinManifests Include="**/*.ajaxmin"/> | |||||
</ItemGroup> | |||||
<!-- target to clean output for all ajaxmin manifest files in the project --> | |||||
<Target Name="CleanAjaxMinManifests" AfterTargets="Clean" Inputs="@AjaxMinManifests" Outputs="@(AjaxMinManifests->'%(FullPath).cleantrigger')"> | |||||
<Message Text="Cleaning AjaxMin Manifests" Importance="high" /> | |||||
<AjaxMinManifestCleanTask OutputFolder="$(AjaxMinOutputFolder)" Manifests="@(AjaxMinManifests)" /> | |||||
</Target> | |||||
<!-- target to build all ajaxmin manifest files in the project --> | |||||
<Target Name="BuildAjaxMinManifests" AfterTargets="Build" Inputs="@AjaxMinManifests" Outputs="@(AjaxMinManifests->'%(FullPath).buildtrigger')"> | |||||
<Message Text="Processing AjaxMin Manifests" Importance="high" /> | |||||
<AjaxMinManifestTask ProjectDefaultSwitches="-define:$(DefineConstants) $(AjaxMinProjectDefaultSwitches)" | |||||
Configuration="$(Configuration)" | |||||
TreatWarningsAsErrors="$(AjaxMinTreatWarningsAsErrors)" | |||||
InputFolder="$(ProjectDir)" | |||||
OutputFolder="$(AjaxMinOutputFolder)" | |||||
Manifests="@(AjaxMinManifests)" /> | |||||
</Target> | |||||
</Project> |
@ -0,0 +1,38 @@ | |||||
<?xml version="1.0" encoding="utf-8"?> | |||||
<Project xmlns="http://schemas.microsoft.com/developer/msbuild/2003"> | |||||
<UsingTask AssemblyFile="AjaxMinTask.dll" TaskName="AjaxMin" /> | |||||
<UsingTask AssemblyFile="AjaxMinTask.dll" TaskName="AjaxMinBundleTask" /> | |||||
<UsingTask AssemblyFile="AjaxMinTask.dll" TaskName="AjaxMinManifestTask" /> | |||||
<UsingTask AssemblyFile="AjaxMinTask.dll" TaskName="AjaxMinManifestCleanTask" /> | |||||
<PropertyGroup> | |||||
<!-- if the project has a Content folder, we want that to be the root output; otherwise just dump everything relative to the project root --> | |||||
<AjaxMinOutputFolder Condition="$(AjaxMinOutputFolder)=='' and Exists('$(ProjectDir)Content\')">$(ProjectDir)Content\</AjaxMinOutputFolder> | |||||
<AjaxMinOutputFolder Condition="$(AjaxMinOutputFolder)==''">$(ProjectDir)</AjaxMinOutputFolder> | |||||
<!-- default is to NOT treat warnings as errors --> | |||||
<AjaxMinTreatWarningsAsErrors Condition="$(AjaxMinTreatWarningsAsErrors)==''">false</AjaxMinTreatWarningsAsErrors> | |||||
</PropertyGroup> | |||||
<ItemGroup> | |||||
<AjaxMinManifests Include="**/*.ajaxmin"/> | |||||
</ItemGroup> | |||||
<!-- target to clean output for all ajaxmin manifest files in the project --> | |||||
<Target Name="CleanAjaxMinManifests" AfterTargets="Clean" Inputs="@AjaxMinManifests" Outputs="@(AjaxMinManifests->'%(FullPath).cleantrigger')"> | |||||
<Message Text="Cleaning AjaxMin Manifests" Importance="high" /> | |||||
<AjaxMinManifestCleanTask OutputFolder="$(AjaxMinOutputFolder)" Manifests="@(AjaxMinManifests)" /> | |||||
</Target> | |||||
<!-- target to build all ajaxmin manifest files in the project --> | |||||
<Target Name="BuildAjaxMinManifests" AfterTargets="Build" Inputs="@AjaxMinManifests" Outputs="@(AjaxMinManifests->'%(FullPath).buildtrigger')"> | |||||
<Message Text="Processing AjaxMin Manifests" Importance="high" /> | |||||
<AjaxMinManifestTask ProjectDefaultSwitches="-define:$(DefineConstants) $(AjaxMinProjectDefaultSwitches)" | |||||
Configuration="$(Configuration)" | |||||
TreatWarningsAsErrors="$(AjaxMinTreatWarningsAsErrors)" | |||||
InputFolder="$(ProjectDir)" | |||||
OutputFolder="$(AjaxMinOutputFolder)" | |||||
Manifests="@(AjaxMinManifests)" /> | |||||
</Target> | |||||
</Project> |
@ -0,0 +1,38 @@ | |||||
<?xml version="1.0" encoding="utf-8"?> | |||||
<Project xmlns="http://schemas.microsoft.com/developer/msbuild/2003"> | |||||
<UsingTask AssemblyFile="AjaxMinTask.dll" TaskName="AjaxMin" /> | |||||
<UsingTask AssemblyFile="AjaxMinTask.dll" TaskName="AjaxMinBundleTask" /> | |||||
<UsingTask AssemblyFile="AjaxMinTask.dll" TaskName="AjaxMinManifestTask" /> | |||||
<UsingTask AssemblyFile="AjaxMinTask.dll" TaskName="AjaxMinManifestCleanTask" /> | |||||
<PropertyGroup> | |||||
<!-- if the project has a Content folder, we want that to be the root output; otherwise just dump everything relative to the project root --> | |||||
<AjaxMinOutputFolder Condition="$(AjaxMinOutputFolder)=='' and Exists('$(ProjectDir)Content\')">$(ProjectDir)Content\</AjaxMinOutputFolder> | |||||
<AjaxMinOutputFolder Condition="$(AjaxMinOutputFolder)==''">$(ProjectDir)</AjaxMinOutputFolder> | |||||
<!-- default is to NOT treat warnings as errors --> | |||||
<AjaxMinTreatWarningsAsErrors Condition="$(AjaxMinTreatWarningsAsErrors)==''">false</AjaxMinTreatWarningsAsErrors> | |||||
</PropertyGroup> | |||||
<ItemGroup> | |||||
<AjaxMinManifests Include="**/*.ajaxmin"/> | |||||
</ItemGroup> | |||||
<!-- target to clean output for all ajaxmin manifest files in the project --> | |||||
<Target Name="CleanAjaxMinManifests" AfterTargets="Clean" Inputs="@AjaxMinManifests" Outputs="@(AjaxMinManifests->'%(FullPath).cleantrigger')"> | |||||
<Message Text="Cleaning AjaxMin Manifests" Importance="high" /> | |||||
<AjaxMinManifestCleanTask OutputFolder="$(AjaxMinOutputFolder)" Manifests="@(AjaxMinManifests)" /> | |||||
</Target> | |||||
<!-- target to build all ajaxmin manifest files in the project --> | |||||
<Target Name="BuildAjaxMinManifests" AfterTargets="Build" Inputs="@AjaxMinManifests" Outputs="@(AjaxMinManifests->'%(FullPath).buildtrigger')"> | |||||
<Message Text="Processing AjaxMin Manifests" Importance="high" /> | |||||
<AjaxMinManifestTask ProjectDefaultSwitches="-define:$(DefineConstants) $(AjaxMinProjectDefaultSwitches)" | |||||
Configuration="$(Configuration)" | |||||
TreatWarningsAsErrors="$(AjaxMinTreatWarningsAsErrors)" | |||||
InputFolder="$(ProjectDir)" | |||||
OutputFolder="$(AjaxMinOutputFolder)" | |||||
Manifests="@(AjaxMinManifests)" /> | |||||
</Target> | |||||
</Project> |
@ -0,0 +1,38 @@ | |||||
<?xml version="1.0" encoding="utf-8"?> | |||||
<Project xmlns="http://schemas.microsoft.com/developer/msbuild/2003"> | |||||
<UsingTask AssemblyFile="AjaxMinTask.dll" TaskName="AjaxMin" /> | |||||
<UsingTask AssemblyFile="AjaxMinTask.dll" TaskName="AjaxMinBundleTask" /> | |||||
<UsingTask AssemblyFile="AjaxMinTask.dll" TaskName="AjaxMinManifestTask" /> | |||||
<UsingTask AssemblyFile="AjaxMinTask.dll" TaskName="AjaxMinManifestCleanTask" /> | |||||
<PropertyGroup> | |||||
<!-- if the project has a Content folder, we want that to be the root output; otherwise just dump everything relative to the project root --> | |||||
<AjaxMinOutputFolder Condition="$(AjaxMinOutputFolder)=='' and Exists('$(ProjectDir)Content\')">$(ProjectDir)Content\</AjaxMinOutputFolder> | |||||
<AjaxMinOutputFolder Condition="$(AjaxMinOutputFolder)==''">$(ProjectDir)</AjaxMinOutputFolder> | |||||
<!-- default is to NOT treat warnings as errors --> | |||||
<AjaxMinTreatWarningsAsErrors Condition="$(AjaxMinTreatWarningsAsErrors)==''">false</AjaxMinTreatWarningsAsErrors> | |||||
</PropertyGroup> | |||||
<ItemGroup> | |||||
<AjaxMinManifests Include="**/*.ajaxmin"/> | |||||
</ItemGroup> | |||||
<!-- target to clean output for all ajaxmin manifest files in the project --> | |||||
<Target Name="CleanAjaxMinManifests" AfterTargets="Clean" Inputs="@AjaxMinManifests" Outputs="@(AjaxMinManifests->'%(FullPath).cleantrigger')"> | |||||
<Message Text="Cleaning AjaxMin Manifests" Importance="high" /> | |||||
<AjaxMinManifestCleanTask OutputFolder="$(AjaxMinOutputFolder)" Manifests="@(AjaxMinManifests)" /> | |||||
</Target> | |||||
<!-- target to build all ajaxmin manifest files in the project --> | |||||
<Target Name="BuildAjaxMinManifests" AfterTargets="Build" Inputs="@AjaxMinManifests" Outputs="@(AjaxMinManifests->'%(FullPath).buildtrigger')"> | |||||
<Message Text="Processing AjaxMin Manifests" Importance="high" /> | |||||
<AjaxMinManifestTask ProjectDefaultSwitches="-define:$(DefineConstants) $(AjaxMinProjectDefaultSwitches)" | |||||
Configuration="$(Configuration)" | |||||
TreatWarningsAsErrors="$(AjaxMinTreatWarningsAsErrors)" | |||||
InputFolder="$(ProjectDir)" | |||||
OutputFolder="$(AjaxMinOutputFolder)" | |||||
Manifests="@(AjaxMinManifests)" /> | |||||
</Target> | |||||
</Project> |
@ -0,0 +1,397 @@ | |||||
<?xml version="1.0"?> | |||||
<doc> | |||||
<assembly> | |||||
<name>DotNetOpenAuth.OAuth.Consumer</name> | |||||
</assembly> | |||||
<members> | |||||
<member name="T:DotNetOpenAuth.OAuth.ChannelElements.IConsumerTokenManager"> | |||||
<summary> | |||||
A token manager for use by a web site in its role as a consumer of | |||||
an individual ServiceProvider. | |||||
</summary> | |||||
</member> | |||||
<member name="P:DotNetOpenAuth.OAuth.ChannelElements.IConsumerTokenManager.ConsumerKey"> | |||||
<summary> | |||||
Gets the consumer key. | |||||
</summary> | |||||
<value>The consumer key.</value> | |||||
</member> | |||||
<member name="P:DotNetOpenAuth.OAuth.ChannelElements.IConsumerTokenManager.ConsumerSecret"> | |||||
<summary> | |||||
Gets the consumer secret. | |||||
</summary> | |||||
<value>The consumer secret.</value> | |||||
</member> | |||||
<member name="T:DotNetOpenAuth.OAuth.ChannelElements.OAuthConsumerChannel"> | |||||
<summary> | |||||
The messaging channel for OAuth 1.0(a) Consumers. | |||||
</summary> | |||||
</member> | |||||
<member name="M:DotNetOpenAuth.OAuth.ChannelElements.OAuthConsumerChannel.#ctor(DotNetOpenAuth.Messaging.ITamperProtectionChannelBindingElement,DotNetOpenAuth.Messaging.Bindings.INonceStore,DotNetOpenAuth.OAuth.ChannelElements.IConsumerTokenManager,DotNetOpenAuth.OAuth.ConsumerSecuritySettings,DotNetOpenAuth.Messaging.IMessageFactory)"> | |||||
<summary> | |||||
Initializes a new instance of the <see cref="T:DotNetOpenAuth.OAuth.ChannelElements.OAuthConsumerChannel"/> class. | |||||
</summary> | |||||
<param name="signingBindingElement">The binding element to use for signing.</param> | |||||
<param name="store">The web application store to use for nonces.</param> | |||||
<param name="tokenManager">The token manager instance to use.</param> | |||||
<param name="securitySettings">The security settings.</param> | |||||
<param name="messageFactory">The message factory.</param> | |||||
</member> | |||||
<member name="M:DotNetOpenAuth.OAuth.ChannelElements.OAuthConsumerChannel.GetConsumerSecret(System.String)"> | |||||
<summary> | |||||
Gets the consumer secret for a given consumer key. | |||||
</summary> | |||||
<param name="consumerKey">The consumer key.</param> | |||||
<returns>The consumer secret.</returns> | |||||
</member> | |||||
<member name="M:DotNetOpenAuth.OAuth.ChannelElements.OAuthConsumerChannel.InitializeBindingElements(DotNetOpenAuth.Messaging.ITamperProtectionChannelBindingElement,DotNetOpenAuth.Messaging.Bindings.INonceStore)"> | |||||
<summary> | |||||
Initializes the binding elements for the OAuth channel. | |||||
</summary> | |||||
<param name="signingBindingElement">The signing binding element.</param> | |||||
<param name="store">The nonce store.</param> | |||||
<returns> | |||||
An array of binding elements used to initialize the channel. | |||||
</returns> | |||||
</member> | |||||
<member name="T:DotNetOpenAuth.OAuth.ChannelElements.OAuthConsumerMessageFactory"> | |||||
<summary> | |||||
An OAuth-protocol specific implementation of the <see cref="T:DotNetOpenAuth.Messaging.IMessageFactory"/> | |||||
interface. | |||||
</summary> | |||||
</member> | |||||
<member name="M:DotNetOpenAuth.OAuth.ChannelElements.OAuthConsumerMessageFactory.#ctor"> | |||||
<summary> | |||||
Initializes a new instance of the <see cref="T:DotNetOpenAuth.OAuth.ChannelElements.OAuthConsumerMessageFactory"/> class. | |||||
</summary> | |||||
</member> | |||||
<member name="M:DotNetOpenAuth.OAuth.ChannelElements.OAuthConsumerMessageFactory.GetNewRequestMessage(DotNetOpenAuth.Messaging.MessageReceivingEndpoint,System.Collections.Generic.IDictionary{System.String,System.String})"> | |||||
<summary> | |||||
Analyzes an incoming request message payload to discover what kind of | |||||
message is embedded in it and returns the type, or null if no match is found. | |||||
</summary> | |||||
<param name="recipient">The intended or actual recipient of the request message.</param> | |||||
<param name="fields">The name/value pairs that make up the message payload.</param> | |||||
<returns> | |||||
A newly instantiated <see cref="T:DotNetOpenAuth.Messaging.IProtocolMessage"/>-derived object that this message can | |||||
deserialize to. Null if the request isn't recognized as a valid protocol message. | |||||
</returns> | |||||
<remarks> | |||||
The request messages are: | |||||
UserAuthorizationResponse | |||||
</remarks> | |||||
</member> | |||||
<member name="M:DotNetOpenAuth.OAuth.ChannelElements.OAuthConsumerMessageFactory.GetNewResponseMessage(DotNetOpenAuth.Messaging.IDirectedProtocolMessage,System.Collections.Generic.IDictionary{System.String,System.String})"> | |||||
<summary> | |||||
Analyzes an incoming request message payload to discover what kind of | |||||
message is embedded in it and returns the type, or null if no match is found. | |||||
</summary> | |||||
<param name="request"> | |||||
The message that was sent as a request that resulted in the response. | |||||
Null on a Consumer site that is receiving an indirect message from the Service Provider. | |||||
</param> | |||||
<param name="fields">The name/value pairs that make up the message payload.</param> | |||||
<returns> | |||||
A newly instantiated <see cref="T:DotNetOpenAuth.Messaging.IProtocolMessage"/>-derived object that this message can | |||||
deserialize to. Null if the request isn't recognized as a valid protocol message. | |||||
</returns> | |||||
<remarks> | |||||
The response messages are: | |||||
UnauthorizedTokenResponse | |||||
AuthorizedTokenResponse | |||||
</remarks> | |||||
</member> | |||||
<member name="T:DotNetOpenAuth.OAuth.ChannelElements.RsaSha1ConsumerSigningBindingElement"> | |||||
<summary> | |||||
A binding element that signs outgoing messages and verifies the signature on incoming messages. | |||||
</summary> | |||||
</member> | |||||
<member name="M:DotNetOpenAuth.OAuth.ChannelElements.RsaSha1ConsumerSigningBindingElement.#ctor(System.Security.Cryptography.X509Certificates.X509Certificate2)"> | |||||
<summary> | |||||
Initializes a new instance of the <see cref="T:DotNetOpenAuth.OAuth.ChannelElements.RsaSha1ConsumerSigningBindingElement"/> class. | |||||
</summary> | |||||
<param name="signingCertificate">The certificate used to sign outgoing messages.</param> | |||||
</member> | |||||
<member name="M:DotNetOpenAuth.OAuth.ChannelElements.RsaSha1ConsumerSigningBindingElement.IsSignatureValid(DotNetOpenAuth.OAuth.ChannelElements.ITamperResistantOAuthMessage)"> | |||||
<summary> | |||||
Determines whether the signature on some message is valid. | |||||
</summary> | |||||
<param name="message">The message to check the signature on.</param> | |||||
<returns> | |||||
<c>true</c> if the signature on the message is valid; otherwise, <c>false</c>. | |||||
</returns> | |||||
</member> | |||||
<member name="M:DotNetOpenAuth.OAuth.ChannelElements.RsaSha1ConsumerSigningBindingElement.GetSignature(DotNetOpenAuth.OAuth.ChannelElements.ITamperResistantOAuthMessage)"> | |||||
<summary> | |||||
Calculates a signature for a given message. | |||||
</summary> | |||||
<param name="message">The message to sign.</param> | |||||
<returns>The signature for the message.</returns> | |||||
<remarks> | |||||
This method signs the message per OAuth 1.0 section 9.3. | |||||
</remarks> | |||||
</member> | |||||
<member name="M:DotNetOpenAuth.OAuth.ChannelElements.RsaSha1ConsumerSigningBindingElement.Clone"> | |||||
<summary> | |||||
Creates a new object that is a copy of the current instance. | |||||
</summary> | |||||
<returns> | |||||
A new object that is a copy of this instance. | |||||
</returns> | |||||
</member> | |||||
<member name="P:DotNetOpenAuth.OAuth.ChannelElements.RsaSha1ConsumerSigningBindingElement.SigningCertificate"> | |||||
<summary> | |||||
Gets or sets the certificate used to sign outgoing messages. Used only by Consumers. | |||||
</summary> | |||||
</member> | |||||
<member name="T:DotNetOpenAuth.OAuth.ConsumerBase"> | |||||
<summary> | |||||
Base class for <see cref="T:DotNetOpenAuth.OAuth.WebConsumer"/> and <see cref="T:DotNetOpenAuth.OAuth.DesktopConsumer"/> types. | |||||
</summary> | |||||
</member> | |||||
<member name="M:DotNetOpenAuth.OAuth.ConsumerBase.#ctor(DotNetOpenAuth.OAuth.ServiceProviderDescription,DotNetOpenAuth.OAuth.ChannelElements.IConsumerTokenManager)"> | |||||
<summary> | |||||
Initializes a new instance of the <see cref="T:DotNetOpenAuth.OAuth.ConsumerBase"/> class. | |||||
</summary> | |||||
<param name="serviceDescription">The endpoints and behavior of the Service Provider.</param> | |||||
<param name="tokenManager">The host's method of storing and recalling tokens and secrets.</param> | |||||
</member> | |||||
<member name="M:DotNetOpenAuth.OAuth.ConsumerBase.RequestNewClientAccount(System.Collections.Generic.IDictionary{System.String,System.String})"> | |||||
<summary> | |||||
Obtains an access token for a new account at the Service Provider via 2-legged OAuth. | |||||
</summary> | |||||
<param name="requestParameters">Any applicable parameters to include in the query string of the token request.</param> | |||||
<returns>The access token.</returns> | |||||
<remarks> | |||||
The token secret is stored in the <see cref="P:DotNetOpenAuth.OAuth.ConsumerBase.TokenManager"/>. | |||||
</remarks> | |||||
</member> | |||||
<member name="M:DotNetOpenAuth.OAuth.ConsumerBase.PrepareAuthorizedRequest(DotNetOpenAuth.Messaging.MessageReceivingEndpoint,System.String)"> | |||||
<summary> | |||||
Creates a web request prepared with OAuth authorization | |||||
that may be further tailored by adding parameters by the caller. | |||||
</summary> | |||||
<param name="endpoint">The URL and method on the Service Provider to send the request to.</param> | |||||
<param name="accessToken">The access token that permits access to the protected resource.</param> | |||||
<returns>The initialized WebRequest object.</returns> | |||||
</member> | |||||
<member name="M:DotNetOpenAuth.OAuth.ConsumerBase.PrepareAuthorizedRequest(DotNetOpenAuth.Messaging.MessageReceivingEndpoint,System.String,System.Collections.Generic.IDictionary{System.String,System.String})"> | |||||
<summary> | |||||
Creates a web request prepared with OAuth authorization | |||||
that may be further tailored by adding parameters by the caller. | |||||
</summary> | |||||
<param name="endpoint">The URL and method on the Service Provider to send the request to.</param> | |||||
<param name="accessToken">The access token that permits access to the protected resource.</param> | |||||
<param name="extraData">Extra parameters to include in the message. Must not be null, but may be empty.</param> | |||||
<returns>The initialized WebRequest object.</returns> | |||||
</member> | |||||
<member name="M:DotNetOpenAuth.OAuth.ConsumerBase.PrepareAuthorizedRequest(DotNetOpenAuth.Messaging.MessageReceivingEndpoint,System.String,System.Collections.Generic.IEnumerable{DotNetOpenAuth.Messaging.MultipartPostPart})"> | |||||
<summary> | |||||
Prepares an authorized request that carries an HTTP multi-part POST, allowing for binary data. | |||||
</summary> | |||||
<param name="endpoint">The URL and method on the Service Provider to send the request to.</param> | |||||
<param name="accessToken">The access token that permits access to the protected resource.</param> | |||||
<param name="binaryData">Extra parameters to include in the message. Must not be null, but may be empty.</param> | |||||
<returns>The initialized WebRequest object.</returns> | |||||
</member> | |||||
<member name="M:DotNetOpenAuth.OAuth.ConsumerBase.PrepareAuthorizedRequest(DotNetOpenAuth.OAuth.Messages.AccessProtectedResourceRequest)"> | |||||
<summary> | |||||
Prepares an HTTP request that has OAuth authorization already attached to it. | |||||
</summary> | |||||
<param name="message">The OAuth authorization message to attach to the HTTP request.</param> | |||||
<returns> | |||||
The HttpWebRequest that can be used to send the HTTP request to the remote service provider. | |||||
</returns> | |||||
<remarks> | |||||
If <see cref="P:DotNetOpenAuth.Messaging.IDirectedProtocolMessage.HttpMethods"/> property on the | |||||
<paramref name="message"/> has the | |||||
<see cref="F:DotNetOpenAuth.Messaging.HttpDeliveryMethods.AuthorizationHeaderRequest"/> flag set and | |||||
<see cref="P:DotNetOpenAuth.OAuth.ChannelElements.ITamperResistantOAuthMessage.HttpMethod"/> is set to an HTTP method | |||||
that includes an entity body, the request stream is automatically sent | |||||
if and only if the <see cref="P:DotNetOpenAuth.Messaging.IMessage.ExtraData"/> dictionary is non-empty. | |||||
</remarks> | |||||
</member> | |||||
<member name="M:DotNetOpenAuth.OAuth.ConsumerBase.PrepareAuthorizedRequestAndSend(DotNetOpenAuth.Messaging.MessageReceivingEndpoint,System.String)"> | |||||
<summary> | |||||
Creates a web request prepared with OAuth authorization | |||||
that may be further tailored by adding parameters by the caller. | |||||
</summary> | |||||
<param name="endpoint">The URL and method on the Service Provider to send the request to.</param> | |||||
<param name="accessToken">The access token that permits access to the protected resource.</param> | |||||
<returns>The initialized WebRequest object.</returns> | |||||
<exception cref="T:System.Net.WebException">Thrown if the request fails for any reason after it is sent to the Service Provider.</exception> | |||||
</member> | |||||
<member name="M:DotNetOpenAuth.OAuth.ConsumerBase.Dispose"> | |||||
<summary> | |||||
Performs application-defined tasks associated with freeing, releasing, or resetting unmanaged resources. | |||||
</summary> | |||||
</member> | |||||
<member name="M:DotNetOpenAuth.OAuth.ConsumerBase.CreateAuthorizingMessage(DotNetOpenAuth.Messaging.MessageReceivingEndpoint,System.String)"> | |||||
<summary> | |||||
Creates a web request prepared with OAuth authorization | |||||
that may be further tailored by adding parameters by the caller. | |||||
</summary> | |||||
<param name="endpoint">The URL and method on the Service Provider to send the request to.</param> | |||||
<param name="accessToken">The access token that permits access to the protected resource.</param> | |||||
<returns>The initialized WebRequest object.</returns> | |||||
</member> | |||||
<member name="M:DotNetOpenAuth.OAuth.ConsumerBase.PrepareRequestUserAuthorization(System.Uri,System.Collections.Generic.IDictionary{System.String,System.String},System.Collections.Generic.IDictionary{System.String,System.String},System.String@)"> | |||||
<summary> | |||||
Prepares an OAuth message that begins an authorization request that will | |||||
redirect the user to the Service Provider to provide that authorization. | |||||
</summary> | |||||
<param name="callback"> | |||||
An optional Consumer URL that the Service Provider should redirect the | |||||
User Agent to upon successful authorization. | |||||
</param> | |||||
<param name="requestParameters">Extra parameters to add to the request token message. Optional.</param> | |||||
<param name="redirectParameters">Extra parameters to add to the redirect to Service Provider message. Optional.</param> | |||||
<param name="requestToken">The request token that must be exchanged for an access token after the user has provided authorization.</param> | |||||
<returns>The pending user agent redirect based message to be sent as an HttpResponse.</returns> | |||||
</member> | |||||
<member name="M:DotNetOpenAuth.OAuth.ConsumerBase.ProcessUserAuthorization(System.String,System.String)"> | |||||
<summary> | |||||
Exchanges a given request token for access token. | |||||
</summary> | |||||
<param name="requestToken">The request token that the user has authorized.</param> | |||||
<param name="verifier">The verifier code.</param> | |||||
<returns> | |||||
The access token assigned by the Service Provider. | |||||
</returns> | |||||
</member> | |||||
<member name="M:DotNetOpenAuth.OAuth.ConsumerBase.Dispose(System.Boolean)"> | |||||
<summary> | |||||
Releases unmanaged and - optionally - managed resources | |||||
</summary> | |||||
<param name="disposing"><c>true</c> to release both managed and unmanaged resources; <c>false</c> to release only unmanaged resources.</param> | |||||
</member> | |||||
<member name="P:DotNetOpenAuth.OAuth.ConsumerBase.ConsumerKey"> | |||||
<summary> | |||||
Gets the Consumer Key used to communicate with the Service Provider. | |||||
</summary> | |||||
</member> | |||||
<member name="P:DotNetOpenAuth.OAuth.ConsumerBase.ServiceProvider"> | |||||
<summary> | |||||
Gets the Service Provider that will be accessed. | |||||
</summary> | |||||
</member> | |||||
<member name="P:DotNetOpenAuth.OAuth.ConsumerBase.TokenManager"> | |||||
<summary> | |||||
Gets the persistence store for tokens and secrets. | |||||
</summary> | |||||
</member> | |||||
<member name="P:DotNetOpenAuth.OAuth.ConsumerBase.Channel"> | |||||
<summary> | |||||
Gets the channel to use for sending/receiving messages. | |||||
</summary> | |||||
</member> | |||||
<member name="P:DotNetOpenAuth.OAuth.ConsumerBase.SecuritySettings"> | |||||
<summary> | |||||
Gets the security settings for this consumer. | |||||
</summary> | |||||
</member> | |||||
<member name="P:DotNetOpenAuth.OAuth.ConsumerBase.OAuthChannel"> | |||||
<summary> | |||||
Gets or sets the channel to use for sending/receiving messages. | |||||
</summary> | |||||
</member> | |||||
<member name="T:DotNetOpenAuth.OAuth.DesktopConsumer"> | |||||
<summary> | |||||
Used by a desktop application to use OAuth to access the Service Provider on behalf of the User. | |||||
</summary> | |||||
<remarks> | |||||
The methods on this class are thread-safe. Provided the properties are set and not changed | |||||
afterward, a single instance of this class may be used by an entire desktop application safely. | |||||
</remarks> | |||||
</member> | |||||
<member name="M:DotNetOpenAuth.OAuth.DesktopConsumer.#ctor(DotNetOpenAuth.OAuth.ServiceProviderDescription,DotNetOpenAuth.OAuth.ChannelElements.IConsumerTokenManager)"> | |||||
<summary> | |||||
Initializes a new instance of the <see cref="T:DotNetOpenAuth.OAuth.DesktopConsumer"/> class. | |||||
</summary> | |||||
<param name="serviceDescription">The endpoints and behavior of the Service Provider.</param> | |||||
<param name="tokenManager">The host's method of storing and recalling tokens and secrets.</param> | |||||
</member> | |||||
<member name="M:DotNetOpenAuth.OAuth.DesktopConsumer.RequestUserAuthorization(System.Collections.Generic.IDictionary{System.String,System.String},System.Collections.Generic.IDictionary{System.String,System.String},System.String@)"> | |||||
<summary> | |||||
Begins an OAuth authorization request. | |||||
</summary> | |||||
<param name="requestParameters">Extra parameters to add to the request token message. Optional.</param> | |||||
<param name="redirectParameters">Extra parameters to add to the redirect to Service Provider message. Optional.</param> | |||||
<param name="requestToken">The request token that must be exchanged for an access token after the user has provided authorization.</param> | |||||
<returns>The URL to open a browser window to allow the user to provide authorization.</returns> | |||||
</member> | |||||
<member name="M:DotNetOpenAuth.OAuth.DesktopConsumer.ProcessUserAuthorization(System.String)"> | |||||
<summary> | |||||
Exchanges a given request token for access token. | |||||
</summary> | |||||
<param name="requestToken">The request token that the user has authorized.</param> | |||||
<returns>The access token assigned by the Service Provider.</returns> | |||||
</member> | |||||
<member name="M:DotNetOpenAuth.OAuth.DesktopConsumer.ProcessUserAuthorization(System.String,System.String)"> | |||||
<summary> | |||||
Exchanges a given request token for access token. | |||||
</summary> | |||||
<param name="requestToken">The request token that the user has authorized.</param> | |||||
<param name="verifier">The verifier code typed in by the user. Must not be <c>Null</c> for OAuth 1.0a service providers and later.</param> | |||||
<returns> | |||||
The access token assigned by the Service Provider. | |||||
</returns> | |||||
</member> | |||||
<member name="T:DotNetOpenAuth.OAuth.WebConsumer"> | |||||
<summary> | |||||
A website or application that uses OAuth to access the Service Provider on behalf of the User. | |||||
</summary> | |||||
<remarks> | |||||
The methods on this class are thread-safe. Provided the properties are set and not changed | |||||
afterward, a single instance of this class may be used by an entire web application safely. | |||||
</remarks> | |||||
</member> | |||||
<member name="M:DotNetOpenAuth.OAuth.WebConsumer.#ctor(DotNetOpenAuth.OAuth.ServiceProviderDescription,DotNetOpenAuth.OAuth.ChannelElements.IConsumerTokenManager)"> | |||||
<summary> | |||||
Initializes a new instance of the <see cref="T:DotNetOpenAuth.OAuth.WebConsumer"/> class. | |||||
</summary> | |||||
<param name="serviceDescription">The endpoints and behavior of the Service Provider.</param> | |||||
<param name="tokenManager">The host's method of storing and recalling tokens and secrets.</param> | |||||
</member> | |||||
<member name="M:DotNetOpenAuth.OAuth.WebConsumer.PrepareRequestUserAuthorization"> | |||||
<summary> | |||||
Begins an OAuth authorization request and redirects the user to the Service Provider | |||||
to provide that authorization. Upon successful authorization, the user is redirected | |||||
back to the current page. | |||||
</summary> | |||||
<returns>The pending user agent redirect based message to be sent as an HttpResponse.</returns> | |||||
<remarks> | |||||
Requires HttpContext.Current. | |||||
</remarks> | |||||
</member> | |||||
<member name="M:DotNetOpenAuth.OAuth.WebConsumer.PrepareRequestUserAuthorization(System.Uri,System.Collections.Generic.IDictionary{System.String,System.String},System.Collections.Generic.IDictionary{System.String,System.String})"> | |||||
<summary> | |||||
Prepares an OAuth message that begins an authorization request that will | |||||
redirect the user to the Service Provider to provide that authorization. | |||||
</summary> | |||||
<param name="callback"> | |||||
An optional Consumer URL that the Service Provider should redirect the | |||||
User Agent to upon successful authorization. | |||||
</param> | |||||
<param name="requestParameters">Extra parameters to add to the request token message. Optional.</param> | |||||
<param name="redirectParameters">Extra parameters to add to the redirect to Service Provider message. Optional.</param> | |||||
<returns>The pending user agent redirect based message to be sent as an HttpResponse.</returns> | |||||
</member> | |||||
<member name="M:DotNetOpenAuth.OAuth.WebConsumer.ProcessUserAuthorization"> | |||||
<summary> | |||||
Processes an incoming authorization-granted message from an SP and obtains an access token. | |||||
</summary> | |||||
<returns>The access token, or null if no incoming authorization message was recognized.</returns> | |||||
<remarks> | |||||
Requires HttpContext.Current. | |||||
</remarks> | |||||
</member> | |||||
<member name="M:DotNetOpenAuth.OAuth.WebConsumer.ProcessUserAuthorization(System.Web.HttpRequestBase)"> | |||||
<summary> | |||||
Processes an incoming authorization-granted message from an SP and obtains an access token. | |||||
</summary> | |||||
<param name="request">The incoming HTTP request.</param> | |||||
<returns>The access token, or null if no incoming authorization message was recognized.</returns> | |||||
</member> | |||||
</members> | |||||
</doc> |
@ -0,0 +1,397 @@ | |||||
<?xml version="1.0"?> | |||||
<doc> | |||||
<assembly> | |||||
<name>DotNetOpenAuth.OAuth.Consumer</name> | |||||
</assembly> | |||||
<members> | |||||
<member name="T:DotNetOpenAuth.OAuth.ChannelElements.IConsumerTokenManager"> | |||||
<summary> | |||||
A token manager for use by a web site in its role as a consumer of | |||||
an individual ServiceProvider. | |||||
</summary> | |||||
</member> | |||||
<member name="P:DotNetOpenAuth.OAuth.ChannelElements.IConsumerTokenManager.ConsumerKey"> | |||||
<summary> | |||||
Gets the consumer key. | |||||
</summary> | |||||
<value>The consumer key.</value> | |||||
</member> | |||||
<member name="P:DotNetOpenAuth.OAuth.ChannelElements.IConsumerTokenManager.ConsumerSecret"> | |||||
<summary> | |||||
Gets the consumer secret. | |||||
</summary> | |||||
<value>The consumer secret.</value> | |||||
</member> | |||||
<member name="T:DotNetOpenAuth.OAuth.ChannelElements.OAuthConsumerChannel"> | |||||
<summary> | |||||
The messaging channel for OAuth 1.0(a) Consumers. | |||||
</summary> | |||||
</member> | |||||
<member name="M:DotNetOpenAuth.OAuth.ChannelElements.OAuthConsumerChannel.#ctor(DotNetOpenAuth.Messaging.ITamperProtectionChannelBindingElement,DotNetOpenAuth.Messaging.Bindings.INonceStore,DotNetOpenAuth.OAuth.ChannelElements.IConsumerTokenManager,DotNetOpenAuth.OAuth.ConsumerSecuritySettings,DotNetOpenAuth.Messaging.IMessageFactory)"> | |||||
<summary> | |||||
Initializes a new instance of the <see cref="T:DotNetOpenAuth.OAuth.ChannelElements.OAuthConsumerChannel"/> class. | |||||
</summary> | |||||
<param name="signingBindingElement">The binding element to use for signing.</param> | |||||
<param name="store">The web application store to use for nonces.</param> | |||||
<param name="tokenManager">The token manager instance to use.</param> | |||||
<param name="securitySettings">The security settings.</param> | |||||
<param name="messageFactory">The message factory.</param> | |||||
</member> | |||||
<member name="M:DotNetOpenAuth.OAuth.ChannelElements.OAuthConsumerChannel.GetConsumerSecret(System.String)"> | |||||
<summary> | |||||
Gets the consumer secret for a given consumer key. | |||||
</summary> | |||||
<param name="consumerKey">The consumer key.</param> | |||||
<returns>The consumer secret.</returns> | |||||
</member> | |||||
<member name="M:DotNetOpenAuth.OAuth.ChannelElements.OAuthConsumerChannel.InitializeBindingElements(DotNetOpenAuth.Messaging.ITamperProtectionChannelBindingElement,DotNetOpenAuth.Messaging.Bindings.INonceStore)"> | |||||
<summary> | |||||
Initializes the binding elements for the OAuth channel. | |||||
</summary> | |||||
<param name="signingBindingElement">The signing binding element.</param> | |||||
<param name="store">The nonce store.</param> | |||||
<returns> | |||||
An array of binding elements used to initialize the channel. | |||||
</returns> | |||||
</member> | |||||
<member name="T:DotNetOpenAuth.OAuth.ChannelElements.OAuthConsumerMessageFactory"> | |||||
<summary> | |||||
An OAuth-protocol specific implementation of the <see cref="T:DotNetOpenAuth.Messaging.IMessageFactory"/> | |||||
interface. | |||||
</summary> | |||||
</member> | |||||
<member name="M:DotNetOpenAuth.OAuth.ChannelElements.OAuthConsumerMessageFactory.#ctor"> | |||||
<summary> | |||||
Initializes a new instance of the <see cref="T:DotNetOpenAuth.OAuth.ChannelElements.OAuthConsumerMessageFactory"/> class. | |||||
</summary> | |||||
</member> | |||||
<member name="M:DotNetOpenAuth.OAuth.ChannelElements.OAuthConsumerMessageFactory.GetNewRequestMessage(DotNetOpenAuth.Messaging.MessageReceivingEndpoint,System.Collections.Generic.IDictionary{System.String,System.String})"> | |||||
<summary> | |||||
Analyzes an incoming request message payload to discover what kind of | |||||
message is embedded in it and returns the type, or null if no match is found. | |||||
</summary> | |||||
<param name="recipient">The intended or actual recipient of the request message.</param> | |||||
<param name="fields">The name/value pairs that make up the message payload.</param> | |||||
<returns> | |||||
A newly instantiated <see cref="T:DotNetOpenAuth.Messaging.IProtocolMessage"/>-derived object that this message can | |||||
deserialize to. Null if the request isn't recognized as a valid protocol message. | |||||
</returns> | |||||
<remarks> | |||||
The request messages are: | |||||
UserAuthorizationResponse | |||||
</remarks> | |||||
</member> | |||||
<member name="M:DotNetOpenAuth.OAuth.ChannelElements.OAuthConsumerMessageFactory.GetNewResponseMessage(DotNetOpenAuth.Messaging.IDirectedProtocolMessage,System.Collections.Generic.IDictionary{System.String,System.String})"> | |||||
<summary> | |||||
Analyzes an incoming request message payload to discover what kind of | |||||
message is embedded in it and returns the type, or null if no match is found. | |||||
</summary> | |||||
<param name="request"> | |||||
The message that was sent as a request that resulted in the response. | |||||
Null on a Consumer site that is receiving an indirect message from the Service Provider. | |||||
</param> | |||||
<param name="fields">The name/value pairs that make up the message payload.</param> | |||||
<returns> | |||||
A newly instantiated <see cref="T:DotNetOpenAuth.Messaging.IProtocolMessage"/>-derived object that this message can | |||||
deserialize to. Null if the request isn't recognized as a valid protocol message. | |||||
</returns> | |||||
<remarks> | |||||
The response messages are: | |||||
UnauthorizedTokenResponse | |||||
AuthorizedTokenResponse | |||||
</remarks> | |||||
</member> | |||||
<member name="T:DotNetOpenAuth.OAuth.ChannelElements.RsaSha1ConsumerSigningBindingElement"> | |||||
<summary> | |||||
A binding element that signs outgoing messages and verifies the signature on incoming messages. | |||||
</summary> | |||||
</member> | |||||
<member name="M:DotNetOpenAuth.OAuth.ChannelElements.RsaSha1ConsumerSigningBindingElement.#ctor(System.Security.Cryptography.X509Certificates.X509Certificate2)"> | |||||
<summary> | |||||
Initializes a new instance of the <see cref="T:DotNetOpenAuth.OAuth.ChannelElements.RsaSha1ConsumerSigningBindingElement"/> class. | |||||
</summary> | |||||
<param name="signingCertificate">The certificate used to sign outgoing messages.</param> | |||||
</member> | |||||
<member name="M:DotNetOpenAuth.OAuth.ChannelElements.RsaSha1ConsumerSigningBindingElement.IsSignatureValid(DotNetOpenAuth.OAuth.ChannelElements.ITamperResistantOAuthMessage)"> | |||||
<summary> | |||||
Determines whether the signature on some message is valid. | |||||
</summary> | |||||
<param name="message">The message to check the signature on.</param> | |||||
<returns> | |||||
<c>true</c> if the signature on the message is valid; otherwise, <c>false</c>. | |||||
</returns> | |||||
</member> | |||||
<member name="M:DotNetOpenAuth.OAuth.ChannelElements.RsaSha1ConsumerSigningBindingElement.GetSignature(DotNetOpenAuth.OAuth.ChannelElements.ITamperResistantOAuthMessage)"> | |||||
<summary> | |||||
Calculates a signature for a given message. | |||||
</summary> | |||||
<param name="message">The message to sign.</param> | |||||
<returns>The signature for the message.</returns> | |||||
<remarks> | |||||
This method signs the message per OAuth 1.0 section 9.3. | |||||
</remarks> | |||||
</member> | |||||
<member name="M:DotNetOpenAuth.OAuth.ChannelElements.RsaSha1ConsumerSigningBindingElement.Clone"> | |||||
<summary> | |||||
Creates a new object that is a copy of the current instance. | |||||
</summary> | |||||
<returns> | |||||
A new object that is a copy of this instance. | |||||
</returns> | |||||
</member> | |||||
<member name="P:DotNetOpenAuth.OAuth.ChannelElements.RsaSha1ConsumerSigningBindingElement.SigningCertificate"> | |||||
<summary> | |||||
Gets or sets the certificate used to sign outgoing messages. Used only by Consumers. | |||||
</summary> | |||||
</member> | |||||
<member name="T:DotNetOpenAuth.OAuth.ConsumerBase"> | |||||
<summary> | |||||
Base class for <see cref="T:DotNetOpenAuth.OAuth.WebConsumer"/> and <see cref="T:DotNetOpenAuth.OAuth.DesktopConsumer"/> types. | |||||
</summary> | |||||
</member> | |||||
<member name="M:DotNetOpenAuth.OAuth.ConsumerBase.#ctor(DotNetOpenAuth.OAuth.ServiceProviderDescription,DotNetOpenAuth.OAuth.ChannelElements.IConsumerTokenManager)"> | |||||
<summary> | |||||
Initializes a new instance of the <see cref="T:DotNetOpenAuth.OAuth.ConsumerBase"/> class. | |||||
</summary> | |||||
<param name="serviceDescription">The endpoints and behavior of the Service Provider.</param> | |||||
<param name="tokenManager">The host's method of storing and recalling tokens and secrets.</param> | |||||
</member> | |||||
<member name="M:DotNetOpenAuth.OAuth.ConsumerBase.RequestNewClientAccount(System.Collections.Generic.IDictionary{System.String,System.String})"> | |||||
<summary> | |||||
Obtains an access token for a new account at the Service Provider via 2-legged OAuth. | |||||
</summary> | |||||
<param name="requestParameters">Any applicable parameters to include in the query string of the token request.</param> | |||||
<returns>The access token.</returns> | |||||
<remarks> | |||||
The token secret is stored in the <see cref="P:DotNetOpenAuth.OAuth.ConsumerBase.TokenManager"/>. | |||||
</remarks> | |||||
</member> | |||||
<member name="M:DotNetOpenAuth.OAuth.ConsumerBase.PrepareAuthorizedRequest(DotNetOpenAuth.Messaging.MessageReceivingEndpoint,System.String)"> | |||||
<summary> | |||||
Creates a web request prepared with OAuth authorization | |||||
that may be further tailored by adding parameters by the caller. | |||||
</summary> | |||||
<param name="endpoint">The URL and method on the Service Provider to send the request to.</param> | |||||
<param name="accessToken">The access token that permits access to the protected resource.</param> | |||||
<returns>The initialized WebRequest object.</returns> | |||||
</member> | |||||
<member name="M:DotNetOpenAuth.OAuth.ConsumerBase.PrepareAuthorizedRequest(DotNetOpenAuth.Messaging.MessageReceivingEndpoint,System.String,System.Collections.Generic.IDictionary{System.String,System.String})"> | |||||
<summary> | |||||
Creates a web request prepared with OAuth authorization | |||||
that may be further tailored by adding parameters by the caller. | |||||
</summary> | |||||
<param name="endpoint">The URL and method on the Service Provider to send the request to.</param> | |||||
<param name="accessToken">The access token that permits access to the protected resource.</param> | |||||
<param name="extraData">Extra parameters to include in the message. Must not be null, but may be empty.</param> | |||||
<returns>The initialized WebRequest object.</returns> | |||||
</member> | |||||
<member name="M:DotNetOpenAuth.OAuth.ConsumerBase.PrepareAuthorizedRequest(DotNetOpenAuth.Messaging.MessageReceivingEndpoint,System.String,System.Collections.Generic.IEnumerable{DotNetOpenAuth.Messaging.MultipartPostPart})"> | |||||
<summary> | |||||
Prepares an authorized request that carries an HTTP multi-part POST, allowing for binary data. | |||||
</summary> | |||||
<param name="endpoint">The URL and method on the Service Provider to send the request to.</param> | |||||
<param name="accessToken">The access token that permits access to the protected resource.</param> | |||||
<param name="binaryData">Extra parameters to include in the message. Must not be null, but may be empty.</param> | |||||
<returns>The initialized WebRequest object.</returns> | |||||
</member> | |||||
<member name="M:DotNetOpenAuth.OAuth.ConsumerBase.PrepareAuthorizedRequest(DotNetOpenAuth.OAuth.Messages.AccessProtectedResourceRequest)"> | |||||
<summary> | |||||
Prepares an HTTP request that has OAuth authorization already attached to it. | |||||
</summary> | |||||
<param name="message">The OAuth authorization message to attach to the HTTP request.</param> | |||||
<returns> | |||||
The HttpWebRequest that can be used to send the HTTP request to the remote service provider. | |||||
</returns> | |||||
<remarks> | |||||
If <see cref="P:DotNetOpenAuth.Messaging.IDirectedProtocolMessage.HttpMethods"/> property on the | |||||
<paramref name="message"/> has the | |||||
<see cref="F:DotNetOpenAuth.Messaging.HttpDeliveryMethods.AuthorizationHeaderRequest"/> flag set and | |||||
<see cref="P:DotNetOpenAuth.OAuth.ChannelElements.ITamperResistantOAuthMessage.HttpMethod"/> is set to an HTTP method | |||||
that includes an entity body, the request stream is automatically sent | |||||
if and only if the <see cref="P:DotNetOpenAuth.Messaging.IMessage.ExtraData"/> dictionary is non-empty. | |||||
</remarks> | |||||
</member> | |||||
<member name="M:DotNetOpenAuth.OAuth.ConsumerBase.PrepareAuthorizedRequestAndSend(DotNetOpenAuth.Messaging.MessageReceivingEndpoint,System.String)"> | |||||
<summary> | |||||
Creates a web request prepared with OAuth authorization | |||||
that may be further tailored by adding parameters by the caller. | |||||
</summary> | |||||
<param name="endpoint">The URL and method on the Service Provider to send the request to.</param> | |||||
<param name="accessToken">The access token that permits access to the protected resource.</param> | |||||
<returns>The initialized WebRequest object.</returns> | |||||
<exception cref="T:System.Net.WebException">Thrown if the request fails for any reason after it is sent to the Service Provider.</exception> | |||||
</member> | |||||
<member name="M:DotNetOpenAuth.OAuth.ConsumerBase.Dispose"> | |||||
<summary> | |||||
Performs application-defined tasks associated with freeing, releasing, or resetting unmanaged resources. | |||||
</summary> | |||||
</member> | |||||
<member name="M:DotNetOpenAuth.OAuth.ConsumerBase.CreateAuthorizingMessage(DotNetOpenAuth.Messaging.MessageReceivingEndpoint,System.String)"> | |||||
<summary> | |||||
Creates a web request prepared with OAuth authorization | |||||
that may be further tailored by adding parameters by the caller. | |||||
</summary> | |||||
<param name="endpoint">The URL and method on the Service Provider to send the request to.</param> | |||||
<param name="accessToken">The access token that permits access to the protected resource.</param> | |||||
<returns>The initialized WebRequest object.</returns> | |||||
</member> | |||||
<member name="M:DotNetOpenAuth.OAuth.ConsumerBase.PrepareRequestUserAuthorization(System.Uri,System.Collections.Generic.IDictionary{System.String,System.String},System.Collections.Generic.IDictionary{System.String,System.String},System.String@)"> | |||||
<summary> | |||||
Prepares an OAuth message that begins an authorization request that will | |||||
redirect the user to the Service Provider to provide that authorization. | |||||
</summary> | |||||
<param name="callback"> | |||||
An optional Consumer URL that the Service Provider should redirect the | |||||
User Agent to upon successful authorization. | |||||
</param> | |||||
<param name="requestParameters">Extra parameters to add to the request token message. Optional.</param> | |||||
<param name="redirectParameters">Extra parameters to add to the redirect to Service Provider message. Optional.</param> | |||||
<param name="requestToken">The request token that must be exchanged for an access token after the user has provided authorization.</param> | |||||
<returns>The pending user agent redirect based message to be sent as an HttpResponse.</returns> | |||||
</member> | |||||
<member name="M:DotNetOpenAuth.OAuth.ConsumerBase.ProcessUserAuthorization(System.String,System.String)"> | |||||
<summary> | |||||
Exchanges a given request token for access token. | |||||
</summary> | |||||
<param name="requestToken">The request token that the user has authorized.</param> | |||||
<param name="verifier">The verifier code.</param> | |||||
<returns> | |||||
The access token assigned by the Service Provider. | |||||
</returns> | |||||
</member> | |||||
<member name="M:DotNetOpenAuth.OAuth.ConsumerBase.Dispose(System.Boolean)"> | |||||
<summary> | |||||
Releases unmanaged and - optionally - managed resources | |||||
</summary> | |||||
<param name="disposing"><c>true</c> to release both managed and unmanaged resources; <c>false</c> to release only unmanaged resources.</param> | |||||
</member> | |||||
<member name="P:DotNetOpenAuth.OAuth.ConsumerBase.ConsumerKey"> | |||||
<summary> | |||||
Gets the Consumer Key used to communicate with the Service Provider. | |||||
</summary> | |||||
</member> | |||||
<member name="P:DotNetOpenAuth.OAuth.ConsumerBase.ServiceProvider"> | |||||
<summary> | |||||
Gets the Service Provider that will be accessed. | |||||
</summary> | |||||
</member> | |||||
<member name="P:DotNetOpenAuth.OAuth.ConsumerBase.TokenManager"> | |||||
<summary> | |||||
Gets the persistence store for tokens and secrets. | |||||
</summary> | |||||
</member> | |||||
<member name="P:DotNetOpenAuth.OAuth.ConsumerBase.Channel"> | |||||
<summary> | |||||
Gets the channel to use for sending/receiving messages. | |||||
</summary> | |||||
</member> | |||||
<member name="P:DotNetOpenAuth.OAuth.ConsumerBase.SecuritySettings"> | |||||
<summary> | |||||
Gets the security settings for this consumer. | |||||
</summary> | |||||
</member> | |||||
<member name="P:DotNetOpenAuth.OAuth.ConsumerBase.OAuthChannel"> | |||||
<summary> | |||||
Gets or sets the channel to use for sending/receiving messages. | |||||
</summary> | |||||
</member> | |||||
<member name="T:DotNetOpenAuth.OAuth.DesktopConsumer"> | |||||
<summary> | |||||
Used by a desktop application to use OAuth to access the Service Provider on behalf of the User. | |||||
</summary> | |||||
<remarks> | |||||
The methods on this class are thread-safe. Provided the properties are set and not changed | |||||
afterward, a single instance of this class may be used by an entire desktop application safely. | |||||
</remarks> | |||||
</member> | |||||
<member name="M:DotNetOpenAuth.OAuth.DesktopConsumer.#ctor(DotNetOpenAuth.OAuth.ServiceProviderDescription,DotNetOpenAuth.OAuth.ChannelElements.IConsumerTokenManager)"> | |||||
<summary> | |||||
Initializes a new instance of the <see cref="T:DotNetOpenAuth.OAuth.DesktopConsumer"/> class. | |||||
</summary> | |||||
<param name="serviceDescription">The endpoints and behavior of the Service Provider.</param> | |||||
<param name="tokenManager">The host's method of storing and recalling tokens and secrets.</param> | |||||
</member> | |||||
<member name="M:DotNetOpenAuth.OAuth.DesktopConsumer.RequestUserAuthorization(System.Collections.Generic.IDictionary{System.String,System.String},System.Collections.Generic.IDictionary{System.String,System.String},System.String@)"> | |||||
<summary> | |||||
Begins an OAuth authorization request. | |||||
</summary> | |||||
<param name="requestParameters">Extra parameters to add to the request token message. Optional.</param> | |||||
<param name="redirectParameters">Extra parameters to add to the redirect to Service Provider message. Optional.</param> | |||||
<param name="requestToken">The request token that must be exchanged for an access token after the user has provided authorization.</param> | |||||
<returns>The URL to open a browser window to allow the user to provide authorization.</returns> | |||||
</member> | |||||
<member name="M:DotNetOpenAuth.OAuth.DesktopConsumer.ProcessUserAuthorization(System.String)"> | |||||
<summary> | |||||
Exchanges a given request token for access token. | |||||
</summary> | |||||
<param name="requestToken">The request token that the user has authorized.</param> | |||||
<returns>The access token assigned by the Service Provider.</returns> | |||||
</member> | |||||
<member name="M:DotNetOpenAuth.OAuth.DesktopConsumer.ProcessUserAuthorization(System.String,System.String)"> | |||||
<summary> | |||||
Exchanges a given request token for access token. | |||||
</summary> | |||||
<param name="requestToken">The request token that the user has authorized.</param> | |||||
<param name="verifier">The verifier code typed in by the user. Must not be <c>Null</c> for OAuth 1.0a service providers and later.</param> | |||||
<returns> | |||||
The access token assigned by the Service Provider. | |||||
</returns> | |||||
</member> | |||||
<member name="T:DotNetOpenAuth.OAuth.WebConsumer"> | |||||
<summary> | |||||
A website or application that uses OAuth to access the Service Provider on behalf of the User. | |||||
</summary> | |||||
<remarks> | |||||
The methods on this class are thread-safe. Provided the properties are set and not changed | |||||
afterward, a single instance of this class may be used by an entire web application safely. | |||||
</remarks> | |||||
</member> | |||||
<member name="M:DotNetOpenAuth.OAuth.WebConsumer.#ctor(DotNetOpenAuth.OAuth.ServiceProviderDescription,DotNetOpenAuth.OAuth.ChannelElements.IConsumerTokenManager)"> | |||||
<summary> | |||||
Initializes a new instance of the <see cref="T:DotNetOpenAuth.OAuth.WebConsumer"/> class. | |||||
</summary> | |||||
<param name="serviceDescription">The endpoints and behavior of the Service Provider.</param> | |||||
<param name="tokenManager">The host's method of storing and recalling tokens and secrets.</param> | |||||
</member> | |||||
<member name="M:DotNetOpenAuth.OAuth.WebConsumer.PrepareRequestUserAuthorization"> | |||||
<summary> | |||||
Begins an OAuth authorization request and redirects the user to the Service Provider | |||||
to provide that authorization. Upon successful authorization, the user is redirected | |||||
back to the current page. | |||||
</summary> | |||||
<returns>The pending user agent redirect based message to be sent as an HttpResponse.</returns> | |||||
<remarks> | |||||
Requires HttpContext.Current. | |||||
</remarks> | |||||
</member> | |||||
<member name="M:DotNetOpenAuth.OAuth.WebConsumer.PrepareRequestUserAuthorization(System.Uri,System.Collections.Generic.IDictionary{System.String,System.String},System.Collections.Generic.IDictionary{System.String,System.String})"> | |||||
<summary> | |||||
Prepares an OAuth message that begins an authorization request that will | |||||
redirect the user to the Service Provider to provide that authorization. | |||||
</summary> | |||||
<param name="callback"> | |||||
An optional Consumer URL that the Service Provider should redirect the | |||||
User Agent to upon successful authorization. | |||||
</param> | |||||
<param name="requestParameters">Extra parameters to add to the request token message. Optional.</param> | |||||
<param name="redirectParameters">Extra parameters to add to the redirect to Service Provider message. Optional.</param> | |||||
<returns>The pending user agent redirect based message to be sent as an HttpResponse.</returns> | |||||
</member> | |||||
<member name="M:DotNetOpenAuth.OAuth.WebConsumer.ProcessUserAuthorization"> | |||||
<summary> | |||||
Processes an incoming authorization-granted message from an SP and obtains an access token. | |||||
</summary> | |||||
<returns>The access token, or null if no incoming authorization message was recognized.</returns> | |||||
<remarks> | |||||
Requires HttpContext.Current. | |||||
</remarks> | |||||
</member> | |||||
<member name="M:DotNetOpenAuth.OAuth.WebConsumer.ProcessUserAuthorization(System.Web.HttpRequestBase)"> | |||||
<summary> | |||||
Processes an incoming authorization-granted message from an SP and obtains an access token. | |||||
</summary> | |||||
<param name="request">The incoming HTTP request.</param> | |||||
<returns>The access token, or null if no incoming authorization message was recognized.</returns> | |||||
</member> | |||||
</members> | |||||
</doc> |