diff --git a/src/UmbracoUrlHandling.sln b/src/UmbracoUrlHandling.sln index e4f3926..b5b0c73 100644 --- a/src/UmbracoUrlHandling.sln +++ b/src/UmbracoUrlHandling.sln @@ -1 +1,22 @@ + +Microsoft Visual Studio Solution File, Format Version 12.00 +# Visual Studio 15 +VisualStudioVersion = 15.0.26430.16 +MinimumVisualStudioVersion = 10.0.40219.1 +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "UmbracoUrlHandling", "UmbracoUrlHandling\UmbracoUrlHandling.csproj", "{ABCE8508-6EEC-46B0-96DC-B062201F4972}" +EndProject +Global + GlobalSection(SolutionConfigurationPlatforms) = preSolution + Debug|Any CPU = Debug|Any CPU + Release|Any CPU = Release|Any CPU EndGlobalSection + GlobalSection(ProjectConfigurationPlatforms) = postSolution + {ABCE8508-6EEC-46B0-96DC-B062201F4972}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {ABCE8508-6EEC-46B0-96DC-B062201F4972}.Debug|Any CPU.Build.0 = Debug|Any CPU + {ABCE8508-6EEC-46B0-96DC-B062201F4972}.Release|Any CPU.ActiveCfg = Release|Any CPU + {ABCE8508-6EEC-46B0-96DC-B062201F4972}.Release|Any CPU.Build.0 = Release|Any CPU + EndGlobalSection + GlobalSection(SolutionProperties) = preSolution + HideSolutionNode = FALSE + EndGlobalSection +EndGlobal diff --git a/src/UmbracoUrlHandling/App_Browsers/Form.browser b/src/UmbracoUrlHandling/App_Browsers/Form.browser new file mode 100644 index 0000000..a15cd2c --- /dev/null +++ b/src/UmbracoUrlHandling/App_Browsers/Form.browser @@ -0,0 +1,10 @@ + + + + + + + + + \ No newline at end of file diff --git a/src/UmbracoUrlHandling/App_Browsers/w3cvalidator.browser b/src/UmbracoUrlHandling/App_Browsers/w3cvalidator.browser new file mode 100644 index 0000000..ab466c8 --- /dev/null +++ b/src/UmbracoUrlHandling/App_Browsers/w3cvalidator.browser @@ -0,0 +1,26 @@ + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/src/UmbracoUrlHandling/App_Data/Models/all.dll.path b/src/UmbracoUrlHandling/App_Data/Models/all.dll.path new file mode 100644 index 0000000..dae1949 --- /dev/null +++ b/src/UmbracoUrlHandling/App_Data/Models/all.dll.path @@ -0,0 +1 @@ +C:\Users\brendeld\AppData\Local\Temp\Temporary ASP.NET Files\vs\db0e3ea5\41b4334d\App_Web_all.generated.cs.8f9494c4.o_xl0we4.dll \ No newline at end of file diff --git a/src/UmbracoUrlHandling/App_Data/Models/all.generated.cs b/src/UmbracoUrlHandling/App_Data/Models/all.generated.cs new file mode 100644 index 0000000..d151f7c --- /dev/null +++ b/src/UmbracoUrlHandling/App_Data/Models/all.generated.cs @@ -0,0 +1,586 @@ +using System; +using System.Collections.Generic; +using System.Linq.Expressions; +using System.Web; +using Umbraco.Core.Models; +using Umbraco.Core.Models.PublishedContent; +using Umbraco.Web; +using Umbraco.ModelsBuilder; +using Umbraco.ModelsBuilder.Umbraco; +[assembly: PureLiveAssembly] +[assembly:ModelsBuilderAssembly(PureLive = true, SourceHash = "d75e4cafcf09787f")] +[assembly:System.Reflection.AssemblyVersion("0.0.0.3")] + + +// FILE: models.generated.cs + +//------------------------------------------------------------------------------ +// +// This code was generated by a tool. +// +// Umbraco.ModelsBuilder v3.0.7.99 +// +// Changes to this file will be lost if the code is regenerated. +// +//------------------------------------------------------------------------------ + + + + + + + + + + + + + + + +namespace Umbraco.Web.PublishedContentModels +{ + /// Blog Post + [PublishedContentModel("BlogPost")] + public partial class BlogPost : PublishedContentModel + { +#pragma warning disable 0109 // new is redundant + public new const string ModelTypeAlias = "BlogPost"; + public new const PublishedItemType ModelItemType = PublishedItemType.Content; +#pragma warning restore 0109 + + public BlogPost(IPublishedContent content) + : base(content) + { } + +#pragma warning disable 0109 // new is redundant + public new static PublishedContentType GetModelContentType() + { + return PublishedContentType.Get(ModelItemType, ModelTypeAlias); + } +#pragma warning restore 0109 + + public static PublishedPropertyType GetModelPropertyType(Expression> selector) + { + return PublishedContentModelUtility.GetModelPropertyType(GetModelContentType(), selector); + } + + /// + /// Content + /// + [ImplementPropertyType("content")] + public Newtonsoft.Json.Linq.JToken Content + { + get { return this.GetPropertyValue("content"); } + } + + /// + /// Introduction + /// + [ImplementPropertyType("introduction")] + public string Introduction + { + get { return this.GetPropertyValue("introduction"); } + } + + /// + /// Url Name: The url name which should be used + /// + [ImplementPropertyType("umbracoUrlName")] + public string UmbracoUrlName + { + get { return this.GetPropertyValue("umbracoUrlName"); } + } + } + + /// Blog Post Repository + [PublishedContentModel("BlogPostRepository")] + public partial class BlogPostRepository : PublishedContentModel + { +#pragma warning disable 0109 // new is redundant + public new const string ModelTypeAlias = "BlogPostRepository"; + public new const PublishedItemType ModelItemType = PublishedItemType.Content; +#pragma warning restore 0109 + + public BlogPostRepository(IPublishedContent content) + : base(content) + { } + +#pragma warning disable 0109 // new is redundant + public new static PublishedContentType GetModelContentType() + { + return PublishedContentType.Get(ModelItemType, ModelTypeAlias); + } +#pragma warning restore 0109 + + public static PublishedPropertyType GetModelPropertyType(Expression> selector) + { + return PublishedContentModelUtility.GetModelPropertyType(GetModelContentType(), selector); + } + + /// + /// Hide in bottom navigation? + /// + [ImplementPropertyType("umbracoNaviHide")] + public bool UmbracoNaviHide + { + get { return this.GetPropertyValue("umbracoNaviHide"); } + } + } + + /// Home + [PublishedContentModel("Home")] + public partial class Home : PublishedContentModel + { +#pragma warning disable 0109 // new is redundant + public new const string ModelTypeAlias = "Home"; + public new const PublishedItemType ModelItemType = PublishedItemType.Content; +#pragma warning restore 0109 + + public Home(IPublishedContent content) + : base(content) + { } + +#pragma warning disable 0109 // new is redundant + public new static PublishedContentType GetModelContentType() + { + return PublishedContentType.Get(ModelItemType, ModelTypeAlias); + } +#pragma warning restore 0109 + + public static PublishedPropertyType GetModelPropertyType(Expression> selector) + { + return PublishedContentModelUtility.GetModelPropertyType(GetModelContentType(), selector); + } + + /// + /// Content + /// + [ImplementPropertyType("content")] + public Newtonsoft.Json.Linq.JToken Content + { + get { return this.GetPropertyValue("content"); } + } + + /// + /// Site Description + /// + [ImplementPropertyType("siteDescription")] + public string SiteDescription + { + get { return this.GetPropertyValue("siteDescription"); } + } + + /// + /// Site Logo + /// + [ImplementPropertyType("siteLogo")] + public string SiteLogo + { + get { return this.GetPropertyValue("siteLogo"); } + } + + /// + /// Site Title + /// + [ImplementPropertyType("siteTitle")] + public string SiteTitle + { + get { return this.GetPropertyValue("siteTitle"); } + } + } + + /// Landing Page + [PublishedContentModel("LandingPage")] + public partial class LandingPage : PublishedContentModel + { +#pragma warning disable 0109 // new is redundant + public new const string ModelTypeAlias = "LandingPage"; + public new const PublishedItemType ModelItemType = PublishedItemType.Content; +#pragma warning restore 0109 + + public LandingPage(IPublishedContent content) + : base(content) + { } + +#pragma warning disable 0109 // new is redundant + public new static PublishedContentType GetModelContentType() + { + return PublishedContentType.Get(ModelItemType, ModelTypeAlias); + } +#pragma warning restore 0109 + + public static PublishedPropertyType GetModelPropertyType(Expression> selector) + { + return PublishedContentModelUtility.GetModelPropertyType(GetModelContentType(), selector); + } + + /// + /// Content + /// + [ImplementPropertyType("content")] + public Newtonsoft.Json.Linq.JToken Content + { + get { return this.GetPropertyValue("content"); } + } + + /// + /// Hide in bottom navigation? + /// + [ImplementPropertyType("umbracoNaviHide")] + public bool UmbracoNaviHide + { + get { return this.GetPropertyValue("umbracoNaviHide"); } + } + } + + /// Text Page + [PublishedContentModel("TextPage")] + public partial class TextPage : PublishedContentModel + { +#pragma warning disable 0109 // new is redundant + public new const string ModelTypeAlias = "TextPage"; + public new const PublishedItemType ModelItemType = PublishedItemType.Content; +#pragma warning restore 0109 + + public TextPage(IPublishedContent content) + : base(content) + { } + +#pragma warning disable 0109 // new is redundant + public new static PublishedContentType GetModelContentType() + { + return PublishedContentType.Get(ModelItemType, ModelTypeAlias); + } +#pragma warning restore 0109 + + public static PublishedPropertyType GetModelPropertyType(Expression> selector) + { + return PublishedContentModelUtility.GetModelPropertyType(GetModelContentType(), selector); + } + + /// + /// Content + /// + [ImplementPropertyType("content")] + public Newtonsoft.Json.Linq.JToken Content + { + get { return this.GetPropertyValue("content"); } + } + } + + /// RealEstate + [PublishedContentModel("realEstate")] + public partial class RealEstate : PublishedContentModel + { +#pragma warning disable 0109 // new is redundant + public new const string ModelTypeAlias = "realEstate"; + public new const PublishedItemType ModelItemType = PublishedItemType.Content; +#pragma warning restore 0109 + + public RealEstate(IPublishedContent content) + : base(content) + { } + +#pragma warning disable 0109 // new is redundant + public new static PublishedContentType GetModelContentType() + { + return PublishedContentType.Get(ModelItemType, ModelTypeAlias); + } +#pragma warning restore 0109 + + public static PublishedPropertyType GetModelPropertyType(Expression> selector) + { + return PublishedContentModelUtility.GetModelPropertyType(GetModelContentType(), selector); + } + + /// + /// City: The city the real estate is located + /// + [ImplementPropertyType("city")] + public string City + { + get { return this.GetPropertyValue("city"); } + } + + /// + /// Type: The type of this real estate + /// + [ImplementPropertyType("type")] + public string Type + { + get { return this.GetPropertyValue("type"); } + } + } + + /// Folder + [PublishedContentModel("Folder")] + public partial class Folder : PublishedContentModel + { +#pragma warning disable 0109 // new is redundant + public new const string ModelTypeAlias = "Folder"; + public new const PublishedItemType ModelItemType = PublishedItemType.Media; +#pragma warning restore 0109 + + public Folder(IPublishedContent content) + : base(content) + { } + +#pragma warning disable 0109 // new is redundant + public new static PublishedContentType GetModelContentType() + { + return PublishedContentType.Get(ModelItemType, ModelTypeAlias); + } +#pragma warning restore 0109 + + public static PublishedPropertyType GetModelPropertyType(Expression> selector) + { + return PublishedContentModelUtility.GetModelPropertyType(GetModelContentType(), selector); + } + + /// + /// Contents: + /// + [ImplementPropertyType("contents")] + public object Contents + { + get { return this.GetPropertyValue("contents"); } + } + } + + /// Image + [PublishedContentModel("Image")] + public partial class Image : PublishedContentModel + { +#pragma warning disable 0109 // new is redundant + public new const string ModelTypeAlias = "Image"; + public new const PublishedItemType ModelItemType = PublishedItemType.Media; +#pragma warning restore 0109 + + public Image(IPublishedContent content) + : base(content) + { } + +#pragma warning disable 0109 // new is redundant + public new static PublishedContentType GetModelContentType() + { + return PublishedContentType.Get(ModelItemType, ModelTypeAlias); + } +#pragma warning restore 0109 + + public static PublishedPropertyType GetModelPropertyType(Expression> selector) + { + return PublishedContentModelUtility.GetModelPropertyType(GetModelContentType(), selector); + } + + /// + /// Size + /// + [ImplementPropertyType("umbracoBytes")] + public string UmbracoBytes + { + get { return this.GetPropertyValue("umbracoBytes"); } + } + + /// + /// Type + /// + [ImplementPropertyType("umbracoExtension")] + public string UmbracoExtension + { + get { return this.GetPropertyValue("umbracoExtension"); } + } + + /// + /// Upload image + /// + [ImplementPropertyType("umbracoFile")] + public Umbraco.Web.Models.ImageCropDataSet UmbracoFile + { + get { return this.GetPropertyValue("umbracoFile"); } + } + + /// + /// Height + /// + [ImplementPropertyType("umbracoHeight")] + public string UmbracoHeight + { + get { return this.GetPropertyValue("umbracoHeight"); } + } + + /// + /// Width + /// + [ImplementPropertyType("umbracoWidth")] + public string UmbracoWidth + { + get { return this.GetPropertyValue("umbracoWidth"); } + } + } + + /// File + [PublishedContentModel("File")] + public partial class File : PublishedContentModel + { +#pragma warning disable 0109 // new is redundant + public new const string ModelTypeAlias = "File"; + public new const PublishedItemType ModelItemType = PublishedItemType.Media; +#pragma warning restore 0109 + + public File(IPublishedContent content) + : base(content) + { } + +#pragma warning disable 0109 // new is redundant + public new static PublishedContentType GetModelContentType() + { + return PublishedContentType.Get(ModelItemType, ModelTypeAlias); + } +#pragma warning restore 0109 + + public static PublishedPropertyType GetModelPropertyType(Expression> selector) + { + return PublishedContentModelUtility.GetModelPropertyType(GetModelContentType(), selector); + } + + /// + /// Size + /// + [ImplementPropertyType("umbracoBytes")] + public string UmbracoBytes + { + get { return this.GetPropertyValue("umbracoBytes"); } + } + + /// + /// Type + /// + [ImplementPropertyType("umbracoExtension")] + public string UmbracoExtension + { + get { return this.GetPropertyValue("umbracoExtension"); } + } + + /// + /// Upload file + /// + [ImplementPropertyType("umbracoFile")] + public string UmbracoFile + { + get { return this.GetPropertyValue("umbracoFile"); } + } + } + + /// Member + [PublishedContentModel("Member")] + public partial class Member : PublishedContentModel + { +#pragma warning disable 0109 // new is redundant + public new const string ModelTypeAlias = "Member"; + public new const PublishedItemType ModelItemType = PublishedItemType.Member; +#pragma warning restore 0109 + + public Member(IPublishedContent content) + : base(content) + { } + +#pragma warning disable 0109 // new is redundant + public new static PublishedContentType GetModelContentType() + { + return PublishedContentType.Get(ModelItemType, ModelTypeAlias); + } +#pragma warning restore 0109 + + public static PublishedPropertyType GetModelPropertyType(Expression> selector) + { + return PublishedContentModelUtility.GetModelPropertyType(GetModelContentType(), selector); + } + + /// + /// Is Approved + /// + [ImplementPropertyType("umbracoMemberApproved")] + public bool UmbracoMemberApproved + { + get { return this.GetPropertyValue("umbracoMemberApproved"); } + } + + /// + /// Comments + /// + [ImplementPropertyType("umbracoMemberComments")] + public string UmbracoMemberComments + { + get { return this.GetPropertyValue("umbracoMemberComments"); } + } + + /// + /// Failed Password Attempts + /// + [ImplementPropertyType("umbracoMemberFailedPasswordAttempts")] + public string UmbracoMemberFailedPasswordAttempts + { + get { return this.GetPropertyValue("umbracoMemberFailedPasswordAttempts"); } + } + + /// + /// Last Lockout Date + /// + [ImplementPropertyType("umbracoMemberLastLockoutDate")] + public string UmbracoMemberLastLockoutDate + { + get { return this.GetPropertyValue("umbracoMemberLastLockoutDate"); } + } + + /// + /// Last Login Date + /// + [ImplementPropertyType("umbracoMemberLastLogin")] + public string UmbracoMemberLastLogin + { + get { return this.GetPropertyValue("umbracoMemberLastLogin"); } + } + + /// + /// Last Password Change Date + /// + [ImplementPropertyType("umbracoMemberLastPasswordChangeDate")] + public string UmbracoMemberLastPasswordChangeDate + { + get { return this.GetPropertyValue("umbracoMemberLastPasswordChangeDate"); } + } + + /// + /// Is Locked Out + /// + [ImplementPropertyType("umbracoMemberLockedOut")] + public bool UmbracoMemberLockedOut + { + get { return this.GetPropertyValue("umbracoMemberLockedOut"); } + } + + /// + /// Password Answer + /// + [ImplementPropertyType("umbracoMemberPasswordRetrievalAnswer")] + public string UmbracoMemberPasswordRetrievalAnswer + { + get { return this.GetPropertyValue("umbracoMemberPasswordRetrievalAnswer"); } + } + + /// + /// Password Question + /// + [ImplementPropertyType("umbracoMemberPasswordRetrievalQuestion")] + public string UmbracoMemberPasswordRetrievalQuestion + { + get { return this.GetPropertyValue("umbracoMemberPasswordRetrievalQuestion"); } + } + } + +} + + + +// EOF diff --git a/src/UmbracoUrlHandling/App_Data/Models/models.generated.cs b/src/UmbracoUrlHandling/App_Data/Models/models.generated.cs new file mode 100644 index 0000000..055b607 --- /dev/null +++ b/src/UmbracoUrlHandling/App_Data/Models/models.generated.cs @@ -0,0 +1,566 @@ +//------------------------------------------------------------------------------ +// +// This code was generated by a tool. +// +// Umbraco.ModelsBuilder v3.0.7.99 +// +// Changes to this file will be lost if the code is regenerated. +// +//------------------------------------------------------------------------------ + +using System; +using System.Collections.Generic; +using System.Linq.Expressions; +using System.Web; +using Umbraco.Core.Models; +using Umbraco.Core.Models.PublishedContent; +using Umbraco.Web; +using Umbraco.ModelsBuilder; +using Umbraco.ModelsBuilder.Umbraco; + +[assembly: PureLiveAssembly] +[assembly:ModelsBuilderAssembly(PureLive = true, SourceHash = "d75e4cafcf09787f")] +[assembly:System.Reflection.AssemblyVersion("0.0.0.3")] + +namespace Umbraco.Web.PublishedContentModels +{ + /// Blog Post + [PublishedContentModel("BlogPost")] + public partial class BlogPost : PublishedContentModel + { +#pragma warning disable 0109 // new is redundant + public new const string ModelTypeAlias = "BlogPost"; + public new const PublishedItemType ModelItemType = PublishedItemType.Content; +#pragma warning restore 0109 + + public BlogPost(IPublishedContent content) + : base(content) + { } + +#pragma warning disable 0109 // new is redundant + public new static PublishedContentType GetModelContentType() + { + return PublishedContentType.Get(ModelItemType, ModelTypeAlias); + } +#pragma warning restore 0109 + + public static PublishedPropertyType GetModelPropertyType(Expression> selector) + { + return PublishedContentModelUtility.GetModelPropertyType(GetModelContentType(), selector); + } + + /// + /// Content + /// + [ImplementPropertyType("content")] + public Newtonsoft.Json.Linq.JToken Content + { + get { return this.GetPropertyValue("content"); } + } + + /// + /// Introduction + /// + [ImplementPropertyType("introduction")] + public string Introduction + { + get { return this.GetPropertyValue("introduction"); } + } + + /// + /// Url Name: The url name which should be used + /// + [ImplementPropertyType("umbracoUrlName")] + public string UmbracoUrlName + { + get { return this.GetPropertyValue("umbracoUrlName"); } + } + } + + /// Blog Post Repository + [PublishedContentModel("BlogPostRepository")] + public partial class BlogPostRepository : PublishedContentModel + { +#pragma warning disable 0109 // new is redundant + public new const string ModelTypeAlias = "BlogPostRepository"; + public new const PublishedItemType ModelItemType = PublishedItemType.Content; +#pragma warning restore 0109 + + public BlogPostRepository(IPublishedContent content) + : base(content) + { } + +#pragma warning disable 0109 // new is redundant + public new static PublishedContentType GetModelContentType() + { + return PublishedContentType.Get(ModelItemType, ModelTypeAlias); + } +#pragma warning restore 0109 + + public static PublishedPropertyType GetModelPropertyType(Expression> selector) + { + return PublishedContentModelUtility.GetModelPropertyType(GetModelContentType(), selector); + } + + /// + /// Hide in bottom navigation? + /// + [ImplementPropertyType("umbracoNaviHide")] + public bool UmbracoNaviHide + { + get { return this.GetPropertyValue("umbracoNaviHide"); } + } + } + + /// Home + [PublishedContentModel("Home")] + public partial class Home : PublishedContentModel + { +#pragma warning disable 0109 // new is redundant + public new const string ModelTypeAlias = "Home"; + public new const PublishedItemType ModelItemType = PublishedItemType.Content; +#pragma warning restore 0109 + + public Home(IPublishedContent content) + : base(content) + { } + +#pragma warning disable 0109 // new is redundant + public new static PublishedContentType GetModelContentType() + { + return PublishedContentType.Get(ModelItemType, ModelTypeAlias); + } +#pragma warning restore 0109 + + public static PublishedPropertyType GetModelPropertyType(Expression> selector) + { + return PublishedContentModelUtility.GetModelPropertyType(GetModelContentType(), selector); + } + + /// + /// Content + /// + [ImplementPropertyType("content")] + public Newtonsoft.Json.Linq.JToken Content + { + get { return this.GetPropertyValue("content"); } + } + + /// + /// Site Description + /// + [ImplementPropertyType("siteDescription")] + public string SiteDescription + { + get { return this.GetPropertyValue("siteDescription"); } + } + + /// + /// Site Logo + /// + [ImplementPropertyType("siteLogo")] + public string SiteLogo + { + get { return this.GetPropertyValue("siteLogo"); } + } + + /// + /// Site Title + /// + [ImplementPropertyType("siteTitle")] + public string SiteTitle + { + get { return this.GetPropertyValue("siteTitle"); } + } + } + + /// Landing Page + [PublishedContentModel("LandingPage")] + public partial class LandingPage : PublishedContentModel + { +#pragma warning disable 0109 // new is redundant + public new const string ModelTypeAlias = "LandingPage"; + public new const PublishedItemType ModelItemType = PublishedItemType.Content; +#pragma warning restore 0109 + + public LandingPage(IPublishedContent content) + : base(content) + { } + +#pragma warning disable 0109 // new is redundant + public new static PublishedContentType GetModelContentType() + { + return PublishedContentType.Get(ModelItemType, ModelTypeAlias); + } +#pragma warning restore 0109 + + public static PublishedPropertyType GetModelPropertyType(Expression> selector) + { + return PublishedContentModelUtility.GetModelPropertyType(GetModelContentType(), selector); + } + + /// + /// Content + /// + [ImplementPropertyType("content")] + public Newtonsoft.Json.Linq.JToken Content + { + get { return this.GetPropertyValue("content"); } + } + + /// + /// Hide in bottom navigation? + /// + [ImplementPropertyType("umbracoNaviHide")] + public bool UmbracoNaviHide + { + get { return this.GetPropertyValue("umbracoNaviHide"); } + } + } + + /// Text Page + [PublishedContentModel("TextPage")] + public partial class TextPage : PublishedContentModel + { +#pragma warning disable 0109 // new is redundant + public new const string ModelTypeAlias = "TextPage"; + public new const PublishedItemType ModelItemType = PublishedItemType.Content; +#pragma warning restore 0109 + + public TextPage(IPublishedContent content) + : base(content) + { } + +#pragma warning disable 0109 // new is redundant + public new static PublishedContentType GetModelContentType() + { + return PublishedContentType.Get(ModelItemType, ModelTypeAlias); + } +#pragma warning restore 0109 + + public static PublishedPropertyType GetModelPropertyType(Expression> selector) + { + return PublishedContentModelUtility.GetModelPropertyType(GetModelContentType(), selector); + } + + /// + /// Content + /// + [ImplementPropertyType("content")] + public Newtonsoft.Json.Linq.JToken Content + { + get { return this.GetPropertyValue("content"); } + } + } + + /// RealEstate + [PublishedContentModel("realEstate")] + public partial class RealEstate : PublishedContentModel + { +#pragma warning disable 0109 // new is redundant + public new const string ModelTypeAlias = "realEstate"; + public new const PublishedItemType ModelItemType = PublishedItemType.Content; +#pragma warning restore 0109 + + public RealEstate(IPublishedContent content) + : base(content) + { } + +#pragma warning disable 0109 // new is redundant + public new static PublishedContentType GetModelContentType() + { + return PublishedContentType.Get(ModelItemType, ModelTypeAlias); + } +#pragma warning restore 0109 + + public static PublishedPropertyType GetModelPropertyType(Expression> selector) + { + return PublishedContentModelUtility.GetModelPropertyType(GetModelContentType(), selector); + } + + /// + /// City: The city the real estate is located + /// + [ImplementPropertyType("city")] + public string City + { + get { return this.GetPropertyValue("city"); } + } + + /// + /// Type: The type of this real estate + /// + [ImplementPropertyType("type")] + public string Type + { + get { return this.GetPropertyValue("type"); } + } + } + + /// Folder + [PublishedContentModel("Folder")] + public partial class Folder : PublishedContentModel + { +#pragma warning disable 0109 // new is redundant + public new const string ModelTypeAlias = "Folder"; + public new const PublishedItemType ModelItemType = PublishedItemType.Media; +#pragma warning restore 0109 + + public Folder(IPublishedContent content) + : base(content) + { } + +#pragma warning disable 0109 // new is redundant + public new static PublishedContentType GetModelContentType() + { + return PublishedContentType.Get(ModelItemType, ModelTypeAlias); + } +#pragma warning restore 0109 + + public static PublishedPropertyType GetModelPropertyType(Expression> selector) + { + return PublishedContentModelUtility.GetModelPropertyType(GetModelContentType(), selector); + } + + /// + /// Contents: + /// + [ImplementPropertyType("contents")] + public object Contents + { + get { return this.GetPropertyValue("contents"); } + } + } + + /// Image + [PublishedContentModel("Image")] + public partial class Image : PublishedContentModel + { +#pragma warning disable 0109 // new is redundant + public new const string ModelTypeAlias = "Image"; + public new const PublishedItemType ModelItemType = PublishedItemType.Media; +#pragma warning restore 0109 + + public Image(IPublishedContent content) + : base(content) + { } + +#pragma warning disable 0109 // new is redundant + public new static PublishedContentType GetModelContentType() + { + return PublishedContentType.Get(ModelItemType, ModelTypeAlias); + } +#pragma warning restore 0109 + + public static PublishedPropertyType GetModelPropertyType(Expression> selector) + { + return PublishedContentModelUtility.GetModelPropertyType(GetModelContentType(), selector); + } + + /// + /// Size + /// + [ImplementPropertyType("umbracoBytes")] + public string UmbracoBytes + { + get { return this.GetPropertyValue("umbracoBytes"); } + } + + /// + /// Type + /// + [ImplementPropertyType("umbracoExtension")] + public string UmbracoExtension + { + get { return this.GetPropertyValue("umbracoExtension"); } + } + + /// + /// Upload image + /// + [ImplementPropertyType("umbracoFile")] + public Umbraco.Web.Models.ImageCropDataSet UmbracoFile + { + get { return this.GetPropertyValue("umbracoFile"); } + } + + /// + /// Height + /// + [ImplementPropertyType("umbracoHeight")] + public string UmbracoHeight + { + get { return this.GetPropertyValue("umbracoHeight"); } + } + + /// + /// Width + /// + [ImplementPropertyType("umbracoWidth")] + public string UmbracoWidth + { + get { return this.GetPropertyValue("umbracoWidth"); } + } + } + + /// File + [PublishedContentModel("File")] + public partial class File : PublishedContentModel + { +#pragma warning disable 0109 // new is redundant + public new const string ModelTypeAlias = "File"; + public new const PublishedItemType ModelItemType = PublishedItemType.Media; +#pragma warning restore 0109 + + public File(IPublishedContent content) + : base(content) + { } + +#pragma warning disable 0109 // new is redundant + public new static PublishedContentType GetModelContentType() + { + return PublishedContentType.Get(ModelItemType, ModelTypeAlias); + } +#pragma warning restore 0109 + + public static PublishedPropertyType GetModelPropertyType(Expression> selector) + { + return PublishedContentModelUtility.GetModelPropertyType(GetModelContentType(), selector); + } + + /// + /// Size + /// + [ImplementPropertyType("umbracoBytes")] + public string UmbracoBytes + { + get { return this.GetPropertyValue("umbracoBytes"); } + } + + /// + /// Type + /// + [ImplementPropertyType("umbracoExtension")] + public string UmbracoExtension + { + get { return this.GetPropertyValue("umbracoExtension"); } + } + + /// + /// Upload file + /// + [ImplementPropertyType("umbracoFile")] + public string UmbracoFile + { + get { return this.GetPropertyValue("umbracoFile"); } + } + } + + /// Member + [PublishedContentModel("Member")] + public partial class Member : PublishedContentModel + { +#pragma warning disable 0109 // new is redundant + public new const string ModelTypeAlias = "Member"; + public new const PublishedItemType ModelItemType = PublishedItemType.Member; +#pragma warning restore 0109 + + public Member(IPublishedContent content) + : base(content) + { } + +#pragma warning disable 0109 // new is redundant + public new static PublishedContentType GetModelContentType() + { + return PublishedContentType.Get(ModelItemType, ModelTypeAlias); + } +#pragma warning restore 0109 + + public static PublishedPropertyType GetModelPropertyType(Expression> selector) + { + return PublishedContentModelUtility.GetModelPropertyType(GetModelContentType(), selector); + } + + /// + /// Is Approved + /// + [ImplementPropertyType("umbracoMemberApproved")] + public bool UmbracoMemberApproved + { + get { return this.GetPropertyValue("umbracoMemberApproved"); } + } + + /// + /// Comments + /// + [ImplementPropertyType("umbracoMemberComments")] + public string UmbracoMemberComments + { + get { return this.GetPropertyValue("umbracoMemberComments"); } + } + + /// + /// Failed Password Attempts + /// + [ImplementPropertyType("umbracoMemberFailedPasswordAttempts")] + public string UmbracoMemberFailedPasswordAttempts + { + get { return this.GetPropertyValue("umbracoMemberFailedPasswordAttempts"); } + } + + /// + /// Last Lockout Date + /// + [ImplementPropertyType("umbracoMemberLastLockoutDate")] + public string UmbracoMemberLastLockoutDate + { + get { return this.GetPropertyValue("umbracoMemberLastLockoutDate"); } + } + + /// + /// Last Login Date + /// + [ImplementPropertyType("umbracoMemberLastLogin")] + public string UmbracoMemberLastLogin + { + get { return this.GetPropertyValue("umbracoMemberLastLogin"); } + } + + /// + /// Last Password Change Date + /// + [ImplementPropertyType("umbracoMemberLastPasswordChangeDate")] + public string UmbracoMemberLastPasswordChangeDate + { + get { return this.GetPropertyValue("umbracoMemberLastPasswordChangeDate"); } + } + + /// + /// Is Locked Out + /// + [ImplementPropertyType("umbracoMemberLockedOut")] + public bool UmbracoMemberLockedOut + { + get { return this.GetPropertyValue("umbracoMemberLockedOut"); } + } + + /// + /// Password Answer + /// + [ImplementPropertyType("umbracoMemberPasswordRetrievalAnswer")] + public string UmbracoMemberPasswordRetrievalAnswer + { + get { return this.GetPropertyValue("umbracoMemberPasswordRetrievalAnswer"); } + } + + /// + /// Password Question + /// + [ImplementPropertyType("umbracoMemberPasswordRetrievalQuestion")] + public string UmbracoMemberPasswordRetrievalQuestion + { + get { return this.GetPropertyValue("umbracoMemberPasswordRetrievalQuestion"); } + } + } + +} diff --git a/src/UmbracoUrlHandling/App_Data/Models/models.hash b/src/UmbracoUrlHandling/App_Data/Models/models.hash new file mode 100644 index 0000000..4e2f9c7 --- /dev/null +++ b/src/UmbracoUrlHandling/App_Data/Models/models.hash @@ -0,0 +1 @@ +d75e4cafcf09787f \ No newline at end of file diff --git a/src/UmbracoUrlHandling/App_Plugins/Grid/Config/FanoeConfig.txt b/src/UmbracoUrlHandling/App_Plugins/Grid/Config/FanoeConfig.txt new file mode 100644 index 0000000..1adb6da --- /dev/null +++ b/src/UmbracoUrlHandling/App_Plugins/Grid/Config/FanoeConfig.txt @@ -0,0 +1,151 @@ +[ + { + "name": "Rich text editor", + "alias": "rte", + "view": "rte", + "icon": "icon-article" + }, + { + "name": "Image", + "alias": "media", + "view": "media", + "icon": "icon-picture" + }, + { + "name": "Image wide", + "alias": "media_wide", + "view": "media", + "render": "/App_Plugins/Grid/Editors/Render/media_wide.cshtml", + "icon": "icon-picture" + }, + { + "name": "Image wide cropped", + "alias": "media_wide_cropped", + "view": "media", + "render": "media", + "icon": "icon-picture", + "config": { + "size": { + "width": 1920, + "height": 700 + } + } + }, + { + "name": "Image rounded", + "alias": "media_round", + "view": "media", + "render": "/App_Plugins/Grid/Editors/Render/media_round.cshtml", + "icon": "icon-picture" + }, + { + "name": "Image w/ text right", + "alias": "media_text_right", + "view": "/App_Plugins/Grid/Editors/Views/media_with_description.html", + "render": "/App_Plugins/Grid/Editors/Render/media_text_right.cshtml", + "icon": "icon-picture" + }, + { + "name": "Macro", + "alias": "macro", + "view": "macro", + "icon": "icon-settings-alt" + }, + { + "name": "Embed", + "alias": "embed", + "view": "embed", + "render": "/App_Plugins/Grid/Editors/Render/embed_videowrapper.cshtml", + "icon": "icon-movie-alt" + }, + { + "name": "Banner Headline", + "alias": "banner_headline", + "view": "textstring", + "icon": "icon-coin", + "config": { + "style": "font-size: 36px; line-height: 45px; font-weight: bold; text-align:center", + "markup": "

#value#

" + } + }, + { + "name": "Banner Tagline", + "alias": "banner_tagline", + "view": "textstring", + "icon": "icon-coin", + "config": { + "style": "font-size: 25px; line-height: 35px; font-weight: normal; text-align:center", + "markup": "

#value#

" + } + }, + { + "name": "Headline", + "alias": "headline", + "view": "textstring", + "icon": "icon-coin", + "config": { + "style": "font-size: 36px; line-height: 45px; font-weight: bold", + "markup": "

#value#

" + } + }, + { + "name": "Headline centered", + "alias": "headline_centered", + "view": "textstring", + "icon": "icon-coin", + "config": { + "style": "font-size: 30px; line-height: 45px; font-weight: bold; text-align:center;", + "markup": "

#value#

" + } + }, + { + "name": "Abstract", + "alias": "abstract", + "view": "textstring", + "icon": "icon-coin", + "config": { + "style": "font-size: 16px; line-height: 20px; font-weight: bold;", + "markup": "

#value#

" + } + }, + { + "name": "Paragraph", + "alias": "paragraph", + "view": "textstring", + "icon": "icon-font", + "config": { + "style": "font-size: 16px; line-height: 20px; font-weight: light;", + "markup": "

#value#

" + } + }, + { + "name": "Quote", + "alias": "quote", + "view": "textstring", + "icon": "icon-quote", + "config": { + "style": "border-left: 3px solid #ccc; padding: 10px; color: #ccc; font-family: serif; font-variant: italic; font-size: 18px", + "markup": "
#value#
" + } + }, + { + "name": "Quote with description", + "alias": "quote_D", + "view": "/App_Plugins/Grid/Editors/Views/quote_with_description.html", + "render": "/App_Plugins/Grid/Editors/Render/quote_with_description.cshtml", + "icon": "icon-quote", + "config": { + "style": "border-left: 3px solid #ccc; padding: 10px; color: #ccc; font-family: serif; font-variant: italic; font-size: 18px" + } + }, + { + "name": "Code", + "alias": "code", + "view": "textstring", + "icon": "icon-code", + "config": { + "style": "overflow: auto;padding: 6px 10px;border: 1px solid #ddd;border-radius: 3px;background-color: #f8f8f8;font-size: .9rem;font-family: 'Courier 10 Pitch', Courier, monospace;line-height: 19px;", + "markup": "
#value#
" + } + } +] \ No newline at end of file diff --git a/src/UmbracoUrlHandling/App_Plugins/Grid/Editors/Render/embed_videowrapper.cshtml b/src/UmbracoUrlHandling/App_Plugins/Grid/Editors/Render/embed_videowrapper.cshtml new file mode 100644 index 0000000..60212e4 --- /dev/null +++ b/src/UmbracoUrlHandling/App_Plugins/Grid/Editors/Render/embed_videowrapper.cshtml @@ -0,0 +1,5 @@ +@inherits Umbraco.Web.Mvc.UmbracoViewPage + +
+ @Html.Raw(Model.value) +
\ No newline at end of file diff --git a/src/UmbracoUrlHandling/App_Plugins/Grid/Editors/Render/media_round.cshtml b/src/UmbracoUrlHandling/App_Plugins/Grid/Editors/Render/media_round.cshtml new file mode 100644 index 0000000..3624562 --- /dev/null +++ b/src/UmbracoUrlHandling/App_Plugins/Grid/Editors/Render/media_round.cshtml @@ -0,0 +1,22 @@ +@inherits Umbraco.Web.Mvc.UmbracoViewPage + +@if (Model.value != null) +{ + var url = Model.value.image; + if(Model.editor.config != null && Model.editor.config.size != null){ + url += "?width=" + Model.editor.config.size.width; + url += "&height=" + Model.editor.config.size.height; + + if(Model.value.focalPoint != null){ + url += "¢er=" + Model.value.focalPoint.top +"," + Model.value.focalPoint.left; + url += "&mode=crop"; + } + } + + @Model.value.caption + + if (Model.value.caption != null) + { + @Model.value.caption + } +} diff --git a/src/UmbracoUrlHandling/App_Plugins/Grid/Editors/Render/media_text_right.cshtml b/src/UmbracoUrlHandling/App_Plugins/Grid/Editors/Render/media_text_right.cshtml new file mode 100644 index 0000000..e28530a --- /dev/null +++ b/src/UmbracoUrlHandling/App_Plugins/Grid/Editors/Render/media_text_right.cshtml @@ -0,0 +1,42 @@ +@inherits Umbraco.Web.Mvc.UmbracoViewPage + +@if (Model.value != null) +{ + var url = Model.value.image; + if(Model.editor.config != null && Model.editor.config.size != null){ + url += "?width=" + Model.editor.config.size.width; + url += "&height=" + Model.editor.config.size.height; + + if(Model.value.focalPoint != null){ + url += "¢er=" + Model.value.focalPoint.top +"," + Model.value.focalPoint.left; + url += "&mode=crop"; + } + } + +
+
+
+ @Model.value.caption +
+
+ + @if (Model.value.headline != null) + { +
+
+

+ @Model.value.headline +
+ @Model.value.paragraph +

+
+
+ } + @if (Model.value.paragraph != null) + { +
+ +
+ } +
+} diff --git a/src/UmbracoUrlHandling/App_Plugins/Grid/Editors/Render/media_wide.cshtml b/src/UmbracoUrlHandling/App_Plugins/Grid/Editors/Render/media_wide.cshtml new file mode 100644 index 0000000..0ab2d10 --- /dev/null +++ b/src/UmbracoUrlHandling/App_Plugins/Grid/Editors/Render/media_wide.cshtml @@ -0,0 +1,22 @@ +@inherits Umbraco.Web.Mvc.UmbracoViewPage + +@if (Model.value != null) +{ + var url = Model.value.image; + if(Model.editor.config != null && Model.editor.config.size != null){ + url += "?width=" + Model.editor.config.size.width; + url += "&height=" + Model.editor.config.size.height; + + if(Model.value.focalPoint != null){ + url += "¢er=" + Model.value.focalPoint.top +"," + Model.value.focalPoint.left; + url += "&mode=crop"; + } + } + + @Model.value.caption + + if (Model.value.caption != null) + { +

@Model.value.caption

+ } +} diff --git a/src/UmbracoUrlHandling/App_Plugins/Grid/Editors/Render/quote_with_description.cshtml b/src/UmbracoUrlHandling/App_Plugins/Grid/Editors/Render/quote_with_description.cshtml new file mode 100644 index 0000000..09e9649 --- /dev/null +++ b/src/UmbracoUrlHandling/App_Plugins/Grid/Editors/Render/quote_with_description.cshtml @@ -0,0 +1,34 @@ +@inherits Umbraco.Web.Mvc.UmbracoViewPage + +@if (Model.editor.config.markup != null) +{ + string markup = Model.editor.config.markup.ToString(); + + markup = markup.Replace("#value#", Model.value.ToString()); + markup = markup.Replace("#style#", Model.editor.config.style.ToString()); + + + @Html.Raw(markup) + +} +else +{ + +
+
+
+
@Model.value.quote
+
+
+
+
+

+ @Model.value.headline +
+ @Model.value.description +

+
+
+
+
+} diff --git a/src/UmbracoUrlHandling/App_Plugins/Grid/Editors/Views/media_with_description.html b/src/UmbracoUrlHandling/App_Plugins/Grid/Editors/Views/media_with_description.html new file mode 100644 index 0000000..34fc9f1 --- /dev/null +++ b/src/UmbracoUrlHandling/App_Plugins/Grid/Editors/Views/media_with_description.html @@ -0,0 +1,32 @@ +
+ +
+ +
Click to insert image
+
+ +
+
+ +
+
+ + +
+
+
diff --git a/src/UmbracoUrlHandling/App_Plugins/Grid/Editors/Views/quote_with_description.html b/src/UmbracoUrlHandling/App_Plugins/Grid/Editors/Views/quote_with_description.html new file mode 100644 index 0000000..41a48cf --- /dev/null +++ b/src/UmbracoUrlHandling/App_Plugins/Grid/Editors/Views/quote_with_description.html @@ -0,0 +1,21 @@ +
+ + + +
diff --git a/src/UmbracoUrlHandling/App_Plugins/ModelsBuilder/modelsbuilder.controller.js b/src/UmbracoUrlHandling/App_Plugins/ModelsBuilder/modelsbuilder.controller.js new file mode 100644 index 0000000..942b79e --- /dev/null +++ b/src/UmbracoUrlHandling/App_Plugins/ModelsBuilder/modelsbuilder.controller.js @@ -0,0 +1,31 @@ +function modelsBuilderController($scope, umbRequestHelper, $log, $http, modelsBuilderResource) { + + $scope.generate = function() { + $scope.generating = true; + umbRequestHelper.resourcePromise( + $http.post(umbRequestHelper.getApiUrl("modelsBuilderBaseUrl", "BuildModels")), + 'Failed to generate.') + .then(function (result) { + $scope.generating = false; + $scope.dashboard = result; + }); + }; + + $scope.reload = function () { + $scope.ready = false; + modelsBuilderResource.getDashboard().then(function (result) { + $scope.dashboard = result; + $scope.ready = true; + }); + }; + + function init() { + modelsBuilderResource.getDashboard().then(function(result) { + $scope.dashboard = result; + $scope.ready = true; + }); + } + + init(); +} +angular.module("umbraco").controller("Umbraco.Dashboard.ModelsBuilderController", modelsBuilderController); \ No newline at end of file diff --git a/src/UmbracoUrlHandling/App_Plugins/ModelsBuilder/modelsbuilder.htm b/src/UmbracoUrlHandling/App_Plugins/ModelsBuilder/modelsbuilder.htm new file mode 100644 index 0000000..5049e5f --- /dev/null +++ b/src/UmbracoUrlHandling/App_Plugins/ModelsBuilder/modelsbuilder.htm @@ -0,0 +1,41 @@ +
+ +
+ +
+ +

Models Builder

+ +
+ Loading... +
+ +
+
+ +
+

Models are out-of-date. +

+
+ +
+
+

Generating models will restart the application.

+
+
+ +
+
+
+
+
+ +
+ Last generation failed with the following error: +
{{dashboard.lastError}}
+
+
+ +
diff --git a/src/UmbracoUrlHandling/App_Plugins/ModelsBuilder/modelsbuilder.resource.js b/src/UmbracoUrlHandling/App_Plugins/ModelsBuilder/modelsbuilder.resource.js new file mode 100644 index 0000000..58ca77c --- /dev/null +++ b/src/UmbracoUrlHandling/App_Plugins/ModelsBuilder/modelsbuilder.resource.js @@ -0,0 +1,23 @@ +function modelsBuilderResource($q, $http, umbRequestHelper) { + + return { + getModelsOutOfDateStatus: function () { + return umbRequestHelper.resourcePromise( + $http.get(umbRequestHelper.getApiUrl("modelsBuilderBaseUrl", "GetModelsOutOfDateStatus")), + "Failed to get models out-of-date status"); + }, + + buildModels: function () { + return umbRequestHelper.resourcePromise( + $http.post(umbRequestHelper.getApiUrl("modelsBuilderBaseUrl", "BuildModels")), + "Failed to build models"); + }, + + getDashboard: function () { + return umbRequestHelper.resourcePromise( + $http.get(umbRequestHelper.getApiUrl("modelsBuilderBaseUrl", "GetDashboard")), + "Failed to get dashboard"); + } + }; +} +angular.module("umbraco.resources").factory("modelsBuilderResource", modelsBuilderResource); diff --git a/src/UmbracoUrlHandling/App_Plugins/ModelsBuilder/package.manifest b/src/UmbracoUrlHandling/App_Plugins/ModelsBuilder/package.manifest new file mode 100644 index 0000000..d835235 --- /dev/null +++ b/src/UmbracoUrlHandling/App_Plugins/ModelsBuilder/package.manifest @@ -0,0 +1,7 @@ +{ + //array of files we want to inject into the application on app_start + javascript: [ + '~/App_Plugins/ModelsBuilder/modelsbuilder.controller.js', + '~/App_Plugins/ModelsBuilder/modelsbuilder.resource.js' + ] +} \ No newline at end of file diff --git a/src/UmbracoUrlHandling/Global.asax b/src/UmbracoUrlHandling/Global.asax new file mode 100644 index 0000000..53d2d54 --- /dev/null +++ b/src/UmbracoUrlHandling/Global.asax @@ -0,0 +1,2 @@ +<%@ Application Inherits="Umbraco.Web.UmbracoApplication" Language="C#" %> + \ No newline at end of file diff --git a/src/UmbracoUrlHandling/Media/1012/fanoe-denmark.jpg b/src/UmbracoUrlHandling/Media/1012/fanoe-denmark.jpg new file mode 100644 index 0000000..a32db16 Binary files /dev/null and b/src/UmbracoUrlHandling/Media/1012/fanoe-denmark.jpg differ diff --git a/src/UmbracoUrlHandling/Media/1013/9027510123_92a91b5cf4_b_dark.jpg b/src/UmbracoUrlHandling/Media/1013/9027510123_92a91b5cf4_b_dark.jpg new file mode 100644 index 0000000..d7b3871 Binary files /dev/null and b/src/UmbracoUrlHandling/Media/1013/9027510123_92a91b5cf4_b_dark.jpg differ diff --git a/src/UmbracoUrlHandling/Media/1014/9017002308_81dfd2c1d5_b_dark.jpg b/src/UmbracoUrlHandling/Media/1014/9017002308_81dfd2c1d5_b_dark.jpg new file mode 100644 index 0000000..a55e09d Binary files /dev/null and b/src/UmbracoUrlHandling/Media/1014/9017002308_81dfd2c1d5_b_dark.jpg differ diff --git a/src/UmbracoUrlHandling/Media/1015/14257753719_2c02b94030_h.jpg b/src/UmbracoUrlHandling/Media/1015/14257753719_2c02b94030_h.jpg new file mode 100644 index 0000000..84e399b Binary files /dev/null and b/src/UmbracoUrlHandling/Media/1015/14257753719_2c02b94030_h.jpg differ diff --git a/src/UmbracoUrlHandling/Media/1016/14435759945_a2c58e9ed6_h.jpg b/src/UmbracoUrlHandling/Media/1016/14435759945_a2c58e9ed6_h.jpg new file mode 100644 index 0000000..48462e6 Binary files /dev/null and b/src/UmbracoUrlHandling/Media/1016/14435759945_a2c58e9ed6_h.jpg differ diff --git a/src/UmbracoUrlHandling/Media/1017/14359779226_df7329d607_h_dark.jpg b/src/UmbracoUrlHandling/Media/1017/14359779226_df7329d607_h_dark.jpg new file mode 100644 index 0000000..73133e0 Binary files /dev/null and b/src/UmbracoUrlHandling/Media/1017/14359779226_df7329d607_h_dark.jpg differ diff --git a/src/UmbracoUrlHandling/Media/1018/10818851674_e375a8751e_b.jpg b/src/UmbracoUrlHandling/Media/1018/10818851674_e375a8751e_b.jpg new file mode 100644 index 0000000..1b6b343 Binary files /dev/null and b/src/UmbracoUrlHandling/Media/1018/10818851674_e375a8751e_b.jpg differ diff --git a/src/UmbracoUrlHandling/Media/1022/9686845888_e2d216ce81_b_dark_small.jpg b/src/UmbracoUrlHandling/Media/1022/9686845888_e2d216ce81_b_dark_small.jpg new file mode 100644 index 0000000..11bd4a9 Binary files /dev/null and b/src/UmbracoUrlHandling/Media/1022/9686845888_e2d216ce81_b_dark_small.jpg differ diff --git a/src/UmbracoUrlHandling/Media/1023/form-bg.png b/src/UmbracoUrlHandling/Media/1023/form-bg.png new file mode 100644 index 0000000..87c9ee8 Binary files /dev/null and b/src/UmbracoUrlHandling/Media/1023/form-bg.png differ diff --git a/src/UmbracoUrlHandling/Media/1024/14448232381_8f994d2adc_h_dark.jpg b/src/UmbracoUrlHandling/Media/1024/14448232381_8f994d2adc_h_dark.jpg new file mode 100644 index 0000000..c879aa1 Binary files /dev/null and b/src/UmbracoUrlHandling/Media/1024/14448232381_8f994d2adc_h_dark.jpg differ diff --git a/src/UmbracoUrlHandling/Media/1027/14434411872_8e663d6de0_h.jpg b/src/UmbracoUrlHandling/Media/1027/14434411872_8e663d6de0_h.jpg new file mode 100644 index 0000000..6f6ecb8 Binary files /dev/null and b/src/UmbracoUrlHandling/Media/1027/14434411872_8e663d6de0_h.jpg differ diff --git a/src/UmbracoUrlHandling/Media/1028/14435732345_c9f5b48dfa_h_dark.jpg b/src/UmbracoUrlHandling/Media/1028/14435732345_c9f5b48dfa_h_dark.jpg new file mode 100644 index 0000000..9e4d91f Binary files /dev/null and b/src/UmbracoUrlHandling/Media/1028/14435732345_c9f5b48dfa_h_dark.jpg differ diff --git a/src/UmbracoUrlHandling/Media/1031/9026528992_d38fbc2e28_o_dark.jpg b/src/UmbracoUrlHandling/Media/1031/9026528992_d38fbc2e28_o_dark.jpg new file mode 100644 index 0000000..a257b07 Binary files /dev/null and b/src/UmbracoUrlHandling/Media/1031/9026528992_d38fbc2e28_o_dark.jpg differ diff --git a/src/UmbracoUrlHandling/Media/1032/9039247947_e15a9d8850_b.jpg b/src/UmbracoUrlHandling/Media/1032/9039247947_e15a9d8850_b.jpg new file mode 100644 index 0000000..5e1fff4 Binary files /dev/null and b/src/UmbracoUrlHandling/Media/1032/9039247947_e15a9d8850_b.jpg differ diff --git a/src/UmbracoUrlHandling/Media/1033/whole-earth-catalog.jpg b/src/UmbracoUrlHandling/Media/1033/whole-earth-catalog.jpg new file mode 100644 index 0000000..08d2f6c Binary files /dev/null and b/src/UmbracoUrlHandling/Media/1033/whole-earth-catalog.jpg differ diff --git a/src/UmbracoUrlHandling/Media/1036/1912289_753997844648209_7099291360101379579_o.jpg b/src/UmbracoUrlHandling/Media/1036/1912289_753997844648209_7099291360101379579_o.jpg new file mode 100644 index 0000000..3882577 Binary files /dev/null and b/src/UmbracoUrlHandling/Media/1036/1912289_753997844648209_7099291360101379579_o.jpg differ diff --git a/src/UmbracoUrlHandling/Media/1037/9015601712_72e44263e4_b.jpg b/src/UmbracoUrlHandling/Media/1037/9015601712_72e44263e4_b.jpg new file mode 100644 index 0000000..9376222 Binary files /dev/null and b/src/UmbracoUrlHandling/Media/1037/9015601712_72e44263e4_b.jpg differ diff --git a/src/UmbracoUrlHandling/Media/1038/screen-shot-2014-12-01-at-121327.png b/src/UmbracoUrlHandling/Media/1038/screen-shot-2014-12-01-at-121327.png new file mode 100644 index 0000000..c29089c Binary files /dev/null and b/src/UmbracoUrlHandling/Media/1038/screen-shot-2014-12-01-at-121327.png differ diff --git a/src/UmbracoUrlHandling/Media/1042/logo.jpg b/src/UmbracoUrlHandling/Media/1042/logo.jpg new file mode 100644 index 0000000..a7accfa Binary files /dev/null and b/src/UmbracoUrlHandling/Media/1042/logo.jpg differ diff --git a/src/UmbracoUrlHandling/Media/1044/14441035391_7ee1d0d166_h_darken.jpg b/src/UmbracoUrlHandling/Media/1044/14441035391_7ee1d0d166_h_darken.jpg new file mode 100644 index 0000000..bae4aad Binary files /dev/null and b/src/UmbracoUrlHandling/Media/1044/14441035391_7ee1d0d166_h_darken.jpg differ diff --git a/src/UmbracoUrlHandling/Media/1046/14386124825_d43f359900_h_cropped.jpg b/src/UmbracoUrlHandling/Media/1046/14386124825_d43f359900_h_cropped.jpg new file mode 100644 index 0000000..88648e0 Binary files /dev/null and b/src/UmbracoUrlHandling/Media/1046/14386124825_d43f359900_h_cropped.jpg differ diff --git a/src/UmbracoUrlHandling/Media/1047/9027509991_ff12bd87e4_b_small_cropped.jpg b/src/UmbracoUrlHandling/Media/1047/9027509991_ff12bd87e4_b_small_cropped.jpg new file mode 100644 index 0000000..01dc0db Binary files /dev/null and b/src/UmbracoUrlHandling/Media/1047/9027509991_ff12bd87e4_b_small_cropped.jpg differ diff --git a/src/UmbracoUrlHandling/Media/1048/sharingiscaring_cropped.jpg b/src/UmbracoUrlHandling/Media/1048/sharingiscaring_cropped.jpg new file mode 100644 index 0000000..658f824 Binary files /dev/null and b/src/UmbracoUrlHandling/Media/1048/sharingiscaring_cropped.jpg differ diff --git a/src/UmbracoUrlHandling/Media/1049/9027510123_92a91b5cf4_b_dark.jpg b/src/UmbracoUrlHandling/Media/1049/9027510123_92a91b5cf4_b_dark.jpg new file mode 100644 index 0000000..d7b3871 Binary files /dev/null and b/src/UmbracoUrlHandling/Media/1049/9027510123_92a91b5cf4_b_dark.jpg differ diff --git a/src/UmbracoUrlHandling/Media/Web.config b/src/UmbracoUrlHandling/Media/Web.config new file mode 100644 index 0000000..6cbb733 --- /dev/null +++ b/src/UmbracoUrlHandling/Media/Web.config @@ -0,0 +1,9 @@ + + + + + + + + + \ No newline at end of file diff --git a/src/UmbracoUrlHandling/Properties/AssemblyInfo.cs b/src/UmbracoUrlHandling/Properties/AssemblyInfo.cs new file mode 100644 index 0000000..4c8bba3 --- /dev/null +++ b/src/UmbracoUrlHandling/Properties/AssemblyInfo.cs @@ -0,0 +1,35 @@ +using System.Reflection; +using System.Runtime.CompilerServices; +using System.Runtime.InteropServices; + +// General Information about an assembly is controlled through the following +// set of attributes. Change these attribute values to modify the information +// associated with an assembly. +[assembly: AssemblyTitle("UmbracoUrlHandling")] +[assembly: AssemblyDescription("")] +[assembly: AssemblyConfiguration("")] +[assembly: AssemblyCompany("")] +[assembly: AssemblyProduct("UmbracoUrlHandling")] +[assembly: AssemblyCopyright("Copyright © 2017")] +[assembly: AssemblyTrademark("")] +[assembly: AssemblyCulture("")] + +// Setting ComVisible to false makes the types in this assembly not visible +// to COM components. If you need to access a type in this assembly from +// COM, set the ComVisible attribute to true on that type. +[assembly: ComVisible(false)] + +// The following GUID is for the ID of the typelib if this project is exposed to COM +[assembly: Guid("abce8508-6eec-46b0-96dc-b062201f4972")] + +// Version information for an assembly consists of the following four values: +// +// Major Version +// Minor Version +// Build Number +// Revision +// +// You can specify all the values or you can default the Revision and Build Numbers +// by using the '*' as shown below: +[assembly: AssemblyVersion("1.0.0.0")] +[assembly: AssemblyFileVersion("1.0.0.0")] diff --git a/src/UmbracoUrlHandling/Umbraco/Actions/delete.aspx b/src/UmbracoUrlHandling/Umbraco/Actions/delete.aspx new file mode 100644 index 0000000..5a5be0b --- /dev/null +++ b/src/UmbracoUrlHandling/Umbraco/Actions/delete.aspx @@ -0,0 +1,30 @@ +<%@ Page Language="C#" AutoEventWireup="true" MasterPageFile="../masterpages/umbracoPage.Master" CodeBehind="delete.aspx.cs" Inherits="umbraco.presentation.actions.delete" %> +<%@ Register TagPrefix="cc1" Namespace="umbraco.uicontrols" Assembly="controls" %> + + + + + + + + + + + +

+
+

+ +

+
+ + + +

+
+ + +
+
diff --git a/src/UmbracoUrlHandling/Umbraco/Actions/editContent.aspx b/src/UmbracoUrlHandling/Umbraco/Actions/editContent.aspx new file mode 100644 index 0000000..d08f683 --- /dev/null +++ b/src/UmbracoUrlHandling/Umbraco/Actions/editContent.aspx @@ -0,0 +1,16 @@ +<%@ Page Language="C#" AutoEventWireup="true" CodeBehind="editContent.aspx.cs" Inherits="umbraco.presentation.actions.editContent" %> + + + + + + Untitled Page + + +
+
+ +
+
+ + diff --git a/src/UmbracoUrlHandling/Umbraco/Actions/preview.aspx b/src/UmbracoUrlHandling/Umbraco/Actions/preview.aspx new file mode 100644 index 0000000..d95bab7 --- /dev/null +++ b/src/UmbracoUrlHandling/Umbraco/Actions/preview.aspx @@ -0,0 +1,16 @@ +<%@ Page Language="C#" AutoEventWireup="true" CodeBehind="preview.aspx.cs" Inherits="umbraco.presentation.actions.preview" %> + + + + + + Preview page + + +
+
+ +
+
+ + diff --git a/src/UmbracoUrlHandling/Umbraco/Actions/publish.aspx b/src/UmbracoUrlHandling/Umbraco/Actions/publish.aspx new file mode 100644 index 0000000..b7ea481 --- /dev/null +++ b/src/UmbracoUrlHandling/Umbraco/Actions/publish.aspx @@ -0,0 +1,30 @@ +<%@ Page Language="C#" AutoEventWireup="true" MasterPageFile="../masterpages/umbracoPage.Master" CodeBehind="publish.aspx.cs" Inherits="umbraco.presentation.actions.publish" %> +<%@ Register TagPrefix="cc1" Namespace="umbraco.uicontrols" Assembly="controls" %> + + + + + + + + + + +

+ +

+
+
+

+ +

+
+ + +

+
+
+ +
\ No newline at end of file diff --git a/src/UmbracoUrlHandling/Umbraco/Channels/rsd.aspx b/src/UmbracoUrlHandling/Umbraco/Channels/rsd.aspx new file mode 100644 index 0000000..a047215 --- /dev/null +++ b/src/UmbracoUrlHandling/Umbraco/Channels/rsd.aspx @@ -0,0 +1,20 @@ + +<%@ Page Language="C#" AutoEventWireup="true" Inherits="System.Web.UI.Page" %> +<%@ Import Namespace="Umbraco.Core.IO" %> + + + + umbraco + http://umbraco.org/ + http://<%=Request.ServerVariables["SERVER_NAME"]%> + + <%=IOHelper.ResolveUrl(SystemDirectories.Umbraco) %>/channels.aspx" /> + <%=IOHelper.ResolveUrl(SystemDirectories.Umbraco) %>/channels.aspx" /> + + + \ No newline at end of file diff --git a/src/UmbracoUrlHandling/Umbraco/Channels/wlwmanifest.aspx b/src/UmbracoUrlHandling/Umbraco/Channels/wlwmanifest.aspx new file mode 100644 index 0000000..cad2f8f --- /dev/null +++ b/src/UmbracoUrlHandling/Umbraco/Channels/wlwmanifest.aspx @@ -0,0 +1,51 @@ + +<%@ Page Language="C#" AutoEventWireup="true" Inherits="System.Web.UI.Page" %> +<%@ Import Namespace="Umbraco.Core.IO" %> +<%@ Import Namespace="umbraco" %> + + + + http://umbraco.org/images/liveWriterIcon.png + http://umbraco.org/images/liveWriterWatermark.png + View your site/weblog + Edit your site/weblog + {blog-homepage-url}<%= IOHelper.ResolveUrl(SystemDirectories.Umbraco) %>/ + {blog-homepage-url}<%= IOHelper.ResolveUrl(SystemDirectories.Umbraco)%>/actions/editContent.aspx?id={post-id} + + + + WebLayout + + + Yes + Yes + Yes + No + 100 + Yes + Yes + No + No + No + Yes + Yes + + + diff --git a/src/UmbracoUrlHandling/Umbraco/ClientRedirect.aspx b/src/UmbracoUrlHandling/Umbraco/ClientRedirect.aspx new file mode 100644 index 0000000..2a10d4d --- /dev/null +++ b/src/UmbracoUrlHandling/Umbraco/ClientRedirect.aspx @@ -0,0 +1,64 @@ +<%@ Page Language="C#" AutoEventWireup="true" Inherits="Umbraco.Web.UI.Pages.UmbracoEnsuredPage" %> +<%-- + This page is required because we cannot reload the angular app with a changed Hash since it just detects the hash and doesn't reload. + So this is used purely for a full reload of an angular app with a changed hash. +--%> + + + + Redirecting... + + + + Redirecting... + + diff --git a/src/UmbracoUrlHandling/Umbraco/Config/Create/UI.xml b/src/UmbracoUrlHandling/Umbraco/Config/Create/UI.xml new file mode 100644 index 0000000..3e2c60a --- /dev/null +++ b/src/UmbracoUrlHandling/Umbraco/Config/Create/UI.xml @@ -0,0 +1,270 @@ + + + +
Template
+ /create/simple.ascx + + + + +
+ +
Template
+ /create/simple.ascx + + + +
+ +
Macro
+ /create/simple.ascx + + + +
+ +
Macro
+ /create/simple.ascx + + + +
+ +
Macro
+ /create/xslt.ascx + + + +
+ +
Xslt
+ /create/xslt.ascx + + + +
+ +
User
+ /create/user.ascx + + + + +
+ +
User
+ /create/simple.ascx + + + +
+ +
membergroup
+ /create/simple.ascx + + + +
+ +
Stylesheet
+ /create/simple.ascx + + + +
+ +
XSLT file
+ /create/xslt.ascx + + + +
+ +
member
+ /create/member.ascx + + + +
+ +
member
+ /create/member.ascx + + + +
+ +
membergroup
+ /create/simple.ascx + + + +
+ +
Stylesheet editor egenskab
+ /create/simple.ascx + + + + +
+ +
Stylesheet editor egenskab
+ /create/simple.ascx + + + +
+ +
Dictionary editor egenskab
+ /create/simple.ascx + + + +
+ +
Dictionary editor egenskab
+ /create/simple.ascx + + + + +
+ +
Language
+ /create/language.ascx + + + +
+ +
Language
+ /create/language.ascx + + + +
+ + + + + + +
Scripting file
+ /create/DLRScripting.ascx + + + +
+ +
Macro
+ /create/DLRScripting.ascx + + + +
+ +
Scripting file
+ /create/DLRScripting.ascx + + + +
+ +
Macro
+ /create/DLRScripting.ascx + + + +
+ +
Script file
+ /create/script.ascx + + + +
+ +
Script file
+ /create/script.ascx + + + + +
+ +
Macro
+ /create/script.ascx + + + +
+ +
Package
+ /create/simple.ascx + + + +
+ +
Package
+ /create/simple.ascx + + + +
+ +
Package
+ /create/simple.ascx + + + +
+ +
Package
+ /create/simple.ascx + + + +
+ +
User Types
+ /create/simple.ascx + + + + +
+ +
Macro
+ /Create/PartialView.ascx + + + + +
+ +
Macro
+ /Create/PartialViewMacro.ascx + + + + +
+ +
Macro
+ /Create/PartialView.ascx + + + + +
+ +
Macro
+ /Create/PartialViewMacro.ascx + + + + +
+
diff --git a/src/UmbracoUrlHandling/Umbraco/Config/Lang/cs.xml b/src/UmbracoUrlHandling/Umbraco/Config/Lang/cs.xml new file mode 100644 index 0000000..5ca5078 --- /dev/null +++ b/src/UmbracoUrlHandling/Umbraco/Config/Lang/cs.xml @@ -0,0 +1,1047 @@ + + + + umbraco + http://umbraco.org + + + Kultura a názvy hostitelů + Historie změn + Prohlížet uzel + Změnit typ dokumentu + Kopírovat + Vytvořit + Vytvořit balíček + Odstranit + Deaktivovat + Vyprázdnit koš + Exportovat typ dokumentu + Importovat typ dokumentu + Importovat balíček + Editovat na stránce + Odhlásit + Přesunout + Upozornění + Veřejný přístup + Publikovat + Nepublikovat + Znovu načíst uzly + Znovu publikovat celý web + Práva + Vrátit starší verzi + Odeslat k publikování + Odeslat k překladu + Seřadit + Odeslat k publikování + Přeložit + Aktualizovat + Výchozí hodnota + + + Přístup zakázán. + Přidat novou doménu + odebrat + Neplatný uzel. + Neplatný tvar domény. + Doména už byla přiřazena. + Doména + Jazyk + Nová doména '%0%' byla vytvořena + Doména '%0%' je odstraněna + Doména '%0%' už byla přiřazena +
Jednoúrovňové cesty v doménách jsou podporovány, např. "example.com/en". Měli byste se jich nicméně vyvarovat. Raději použijte nastavení kultury výše.]]>
+ Doména '%0%' byla aktualizována + Editace aktuálních domén + Dědit + Kultura + nebo dědění kultury po nadřazeném uzlu. Vztahuje se také
+ na aktivní uzel.]]>
+ Domény + + + Zobrazení pro + + + Vybrat + Vybrat aktuální složku + Dělat něco jiného + Tučně + Zrušit odsazení odstavce + Vložit formulářové pole + Vložit grafický nadpis + Editovat Html + Odsadit odstavec + Kurzíva + Zarovnat na střed + Zarovnat na levo + Zarovnat na pravo + Vložit odkaz + Vložit místní odkaz (kotvu) + Neuspořádaný seznam + Číslovaný seznam + Vložit makro + Vložit obrázek + Editovat vztahy + Uložit + Uložit a publikovat + Uložit a odeslat ke schválení + Náhled + Náhled je deaktivován, protože není přiřazena žádná šablona + Vybrat styl + Zobrazit styly + Vložit tabulku + + + Abyste změnili typ dokumentu pro zvolený obsah, nejprve jej vyberte ze seznamu typů platných pro tohle umístění. + Pak potvrďte a/nebo pozměňte mapování vlastností z aktuálního typu na nový a dejte Uložit. + Obsah byl znovu publikován. + Aktuální vlastnost + Aktuální typ + Typ dokumentu nemůže být změněn, neboť neexistují alternativy platné pro toto umístění. + Typ dokumentu byl změněn + Mapování vlastností + Mapování na vlastnost + Nová šablona + Nový typ + nic + Obsah + Vybrat nový typ dokumentu + Typ dokumentu pro zvolený obsah byl úspěšně změněný na [new type] a následující vlastnosti byly namapovány: + na + Nelze dokončit mapování vlastností, neboť nejméně jedna z vlastností má definováno více než jedno mapování. + Jsou zobrazeny pouze alternativní typy platné pro aktuální umístění. + + + O této stránce + Alias + (jak byste popsali obrázek přes telefon) + Alternativní adresy URL + Klikněte pro editaci položky + Vytvořeno uživatelem + Původní autor + Aktualizováno uživatelem + Vytvořeno + Datum/čas vytvoření tohoto dokumentu + Typ dokumentu + Editování + Datum odebrání + Tato položko byla změněna po publikování + Tato položka není publikována + Naposledy publikováno + Typ média + Odkaz na položky medií + Skupina členů + Role + Typ člena + Nevybráno žádné datum + Titulek stránky + Vlastnosti + Tento dokument je publikován, ale není viditelný, protože jeho rodič '%0%' publikován není + Jejda: tento dokument je publikován, ale není v mezipaměti (vnitřní chyba) + Publikovat + Stav publikování + Datum publikování + Datum ukončení publikování + Datum odebrání + Třídění je aktualizováno + Abyste uzly setřídili, jednoduše je přetáhněte anebo klikněte na jednu z hlaviček sloupce. Podržením "shift" nebo "control" při výběru můžete označit uzlů více. + Statistika + Titulek (volitelně) + Typ + Nepublikovat + Naposledy změněno + Datum/čas poslední změny dokumentu + Odebrat soubor(y) + URL adresa dokumentu + Člen skupin(y) + Není člen skupin(y) + Podřízené položky + Cíl + + + Klikněte pro nahrání + Upusťte soubory zde... + + + Kde chcete vytvořit nový %0% + Vytvořit položku pod + Vyberte typ a titulek + "typy dokumentů".]]> + "typy medií".]]> + + + Prohlédnout svůj web + - Skrýt + Jestli se umbraco neotevírá, možná budete muset povolit na tomto webu vyskakovací okna + byl otevřený v novém okně + Restart + Navštívit + Vítejte + + + Stay + Discard changes + You have unsaved changes + Are you sure you want to navigate away from this page? - you have unsaved changes + + + Done + + Deleted %0% item + Deleted %0% items + Deleted %0% out of %1% item + Deleted %0% out of %1% items + + Published %0% item + Published %0% items + Published %0% out of %1% item + Published %0% out of %1% items + + Unpublished %0% item + Unpublished %0% items + Unpublished %0% out of %1% item + Unpublished %0% out of %1% items + + Moved %0% item + Moved %0% items + Moved %0% out of %1% item + Moved %0% out of %1% items + + Copied %0% item + Copied %0% items + Copied %0% out of %1% item + Copied %0% out of %1% items + + + Název + Spravovat názvy hostitelů + Zavřít toto okno + Jste si jistí. že chcete odstranit + Jste si jistí, že chcete deaktivovat + Zatrhněte, prosím, tento box, abyste potvrdili odstranění %0% položek + Jste si jistí? + Jste si jistí? + Vyjmout + Editovat položku slovníku + Editovat jazyk + Vložit místní odkaz + Vložit znak + Vložit grafický titulek + Vložit obrázek + Vložit odkaz + Kliknout pro přidání makra + Vložit tabulku + Naposledy editováno + Odkaz + Místní odkaz: + Při používání místních odkazů vložte znak "#" před odkaz + Otevřít v novém okně? + Nastavení makra + Toto makro nemá žádné vlastnosti, které by bylo možno editovat + Vložit + Editovat oprávnění pro + Položky koše jsou nyní mazány. Nezavírejte, prosím, toto okno, dokud operace probíhá + Koš je nyní prázdný + Odebrání položek z koše způsobí jejich trvalé odstranění + regexlib.com má v tuto chvíli nějaké problémy, které jsou mimo naší kontrolu. Omlouváme se za vzniklé nepříjemnosti.]]> + Vyhledat regulární výraz pro přidání validace formulářového prvku. Například: 'email, 'PSČ' 'url' + Odstranit makro + Pole je vyžadování + Web je přeindexován + Mezipaměť webu byla obnovena. Všechen publikovaný obsah je nyní aktuální, zatímco nepublikovaný obsah zůstal nepublikovaný. + Mezipaměť webu bude obnovena. Všechen publikovaný obsah bude aktualizován, zatímco nepublikovaný obsah zůstane nepublikovaný. + Počet sloupců + Počet řádků + Nastavení ID zástupce Nastavením ID zástupce můžete do této šablony zavést obsah z podřízených šablon tak, že odkážete na toto ID při použití prvku <asp:content />.]]> + Vyberte id zástupce ze seznamu níže. Můžete vybírat pouze z ID ze šablony nadřazené tomuto formuláři.]]> + Klikněte na obrázek pro zobrazení v plné velikosti + Vybrat položku + Zobrazit položku mezipaměti + + + %0%' níže.
Můžete přidat další jazyky v nabídce 'jazyky' nalevo.]]>
+ Název jazyka + + + Zadejte Vaše uživatelské jméno + Zadejte Vaše heslo + Pojmenujte %0%... + Zadejte jméno... + Pište pro vyhledání... + Pište pro filtrování... + + + Povolené podřízené typy uzlů + Vytvořit + Odstranit záložku + Popis + Nová záložka + Záložka + Miniatura + Povolit zobrazení jako seznam + + + Přidat předlohu + Databázový datový typ + GUID editoru vlastností + Editor vlastností + Tlačítka + Povolit rozšířené nastavení pro + Povolit kontextové menu + Největší výchozí rozměr pro vložené obrázky + Související stylopisy + Zobrazit jmenovku + Šířka a výška + + + Vaše data byla uložena, ale než budete moci publikovat tuto stránku, je třeba odstranit některé chyby: + Současný MemberShip Provider nepodporuje změnu hesla (EnablePasswordRetrieval musí mít hodnotu true) + %0% již existuje + Vyskytly se chyby: + Vyskytly se chyby: + Heslo musí být nejméně %0% znaků dlouhé a obsahovat nejméně %1% nealfanumerických znaků + %0% musí být celé číslo + Pole %0% na záložce %1% je povinné + %0% je povinné pole + %0% v %1% není ve správném formátu + %0% není ve správném formátu + + + Použití daného typu souboru bylo zakázáno adminitrátorem + UPOZORNĚNÍ! I když CodeMirror je dle konfigurace povolený, je zakázaný v Internet Exploreru, protože není dost stabilní. + Vyplňte, prosím, alias i název nového typu vlastností! + Vyskytl se problém při čtení/zápisu do určeného souboru nebo adresáře + Uveďte, prosím, titulek + Vyberte, prosím, typ + Chystáte se obrázek zvětšit více, než je jeho původní rozměr. Opravdu chcete pokračovat? + Chyba ve skriptu python + Skript python nebyl ještě uložen, protože obsahuje chyby + Počáteční uzel je odstraněný, kontaktujte, prosím, administrátora + Před změnou stylu označte, prosím, obsah + Žádne aktivní styly nejsou dostupné + Umístěte, prosím, kurzor nalevo od těch dvou buňek, které chcete sloučit + Nemužete rozdělit buňku, která nebyla sloučená. + Chyba ve zdroji XSLT + Soubor XSLT nebyl uložen, protože obsahoval chyby + V nastavení datového typu použitého pro tuto vlastnost je chyba, zkontrolujte, prosím, datový typ + + + O... + Akce + Akce + Přidat + Alias + Jste si jistí? + Okraj + o + Zrušit + Okraj buňky + Vybrat + Zavřít + Zavřít okno + Komentovat + Potvrdit + Zachovat proporce + Pokračovat + Kopírovat + Vytvořit + Databáse + Datum + Výchozí + Odstranit + Odstraněno + Odstraňování... + Vzhled + Rozměry + Dolů + Stáhnout + Editovat + Editováno + Prvky + Email + Chyba + Najít + Výška + Nápověda + Ikona + Import + Vnitřní okraj + Vložit + Instalovat + Vyrovnat + Jazyk + Rozvržení + Nahrávání + Zamčeno + Přihlášení + Odhlášení + Odhlášení + Makro + Přesunout + Více + Název + Nový + Následující + Ne + z + OK + Otevřít + nebo + Heslo + Cesta + ID zástupce + Moment, prosím... + Předchozí + Vlastnosti + Email pro obdržení formulářových dat + Koš + Zbývající + Přejmenovat + Obnovit + Povinné + Zopakovat + Oprávnění + Hledat + Server + Zobrazit + Zobrazit stránku při odeslání + Rozměr + Seřadit + Submit + Typ + Pro hledání pište... + Nahoru + Aktualizovat + Povýšit + Nahrání + Url + Uživatel + Uživatelské jméno + Hodnota + Pohled + Vítejte... + Šířka + Ano + Složka + Výsledky hledání + Reorder + I am done reordering + + + Background color + Bold + Text color + Font + Text + + + Page + + + Instalátor se nemůže připojit k databázi. + Nelze uložit soubor web.config. Modifikujte, prosím, připojovací řetězec manuálně. + Vyše databáze byla nalezena a je identifikována jako + Nastavení databáze + instalovat, abyste nainstalovali Umbraco %0% databázi + ]]> + následující pro pokračování.]]> + Databáze nenalezena! Zkontrolujte, prosím, že informace v "připojovacím řetězci" souboru "web.config" jsou správné.

+

Pro pokračování otevřete, prosím, soubor "web.config" (za pužití Visual Studia nebo Vašeho oblíbeného tedtového editoru), přejděte na jeho konec, přidejte připojovací řetězec pro Vaši databázi v klíčí nazvaném "umbracoDbDSN" a soubor uložte.

+

+ Klikněte na tlačítko zopakovat, až budete hotovi.
+ Další informace o editování souboru web.config zde.

]]>
+ + Pokud je to nezbytné, kontaktujte vašeho poskytovatele hostingu. + Jestliže instalujete na místní počítač nebo server, budete potřebovat informace od Vašeho systémového administrátora.]]> + + Stiskněte tlačítko povýšit pro povýšení Vaší databáze na Umbraco %0%

+

+ Neobávejte se - žádný obsah nebude odstraněn a všechno bude fungovat jak má! +

+ ]]>
+ Stiskněte Následující pro pokračování. ]]> + následující, pro pokračování konfiguračního průvodce]]> + Heslo výchozího uživatele musí být změněno!]]> + Výchozí uživatel byl deaktivován, nebo nemá přístup k umbracu!

Netřeba nic dalšího dělat. Klikněte na Následující pro pokračování.]]> + Heslo výchozího uživatele bylo úspěšně změněno od doby instalace!

Netřeba nic dalšího dělat. Klikněte na Následující pro pokračování.]]> + Heslo je změněno! + + umbraco vytváří výchozího uživatele s uživatelským jménem ('admin') a heslem ('default'). Je důležité změnit toto heslo na jiné. +

+

+ Tento krok zkontroluje heslo výchozího uživatele a doporučí, má-li být změněno. +

+ ]]>
+ Mějte skvělý start, sledujte naše uváděcí videa + Kliknutím na tlačítko následující (nebo modifikováním umbracoConfigurationStatus v souboru web.config) přijímáte licenci tohoto software tak, jak je uvedena v poli níže. Upozorňujeme, že tato distribuce umbraca se skládá ze dvou různých licencí, open source MIT licence pro framework a umbraco freeware licence, která pokrývá UI. + Není nainstalováno. + Dotčené soubory a složky + Další informace o nastavování oprávnění pro umbraco zde + Musíte udělit ASP.NET oprávnění měnit následující soubory/složky + Vaše nastavení oprávnění je téměř dokonalé!

+ Můžete provozovat umbraco bez potíží, ale nebudete smět instalovat balíčky, které jsou doporučené pro plné využívání všech možností umbraca.]]>
+ Jak to vyřešit + Klikněte zde, chcete-li číst textovou verzi + výukové video o nastavovaní oprávnění pro složky umbraca, nebo si přečtěte textovou verzi.]]> + Vaše nastavení oprávnění může být problém! +

+ Můžete provozovat umbraco bez potíží, ale nebudete smět vytvářet složky a instalovat balíčky, které jsou doporučené pro plné využívání všech možností umbraca.]]>
+ Vaše nastavení oprívnění není připraveno pro umbraco! +

+ Abyste mohli umbraco provozovat, budete muset aktualizovat Vaše nastavení oprávnění.]]>
+ Vaše nastavení oprávnění je dokonalé!

+ Jste připraveni provozovat umbraco a instalovat balíčky!]]>
+ Řešení potíží se složkami + Následujte tento odkaz pro další informace o potížích s ASP.NET a vytvářením složek. + Nastavování oprávnění pro složky + + Chci začít od nuly + zjistěte jak) + Stále se můžete později rozhodnout nainstalovat Runway. Za tím účelem navštivte Vývojářskou sekci a zvolte Balíčky. + ]]> + Právě jste vytvořili čistou platformu Umbraco. Co chcete dělat dále? + Runway je nainstalován + + Toto je náš seznam doporučených modulů, vyberte ty, které chcete nainstalovat, nebo si prohlédněte úplný seznam modulů + ]]> + Doporučeno pouze pro zkušené uživatele + Chci začít s jednoduchým webem + + "Runway" je jednoduchý web poskytující některé základní typy dokumentů a šablon. Instalátor pro Vás může Runway nainstalovat automaticky a Vy ho pak můžete jednoduše editovat, rozšířit anebo úplně odstranit. Není nezbytný a můžete bez problému provozovat Umbraco bez něj. Runway nicméně nabízí jednoduché základy založené na nejlepších praktikách tak, abyste mohli začít rychleji, než kdykoliv jindy. Rozhodnete-li se Runway si nainstalovat, můžete si volitelně vybrat základní stavební bloky zvané Moduly Runway a stránky Runway si tak vylepšit. +

+ + Runway obsahuje: Úvodní stránku, stránku Začínáme, stránku Instalace modulů.
+ Volitelné moduly: Horní navigace, Mapa webu, Kontakt, Galerie. +
+ ]]>
+ Co je Runway + Krok 1/5: Přijetí licence + Krok 2/5: Konfigurace databáze + Krok 3/5: Ověřování oprávnění k souborům + Krok 4/5: Kontrola zabezpečení umbraca + Krok 5/5: Umbraco je připraveno a můžete začít + Děkujeme, že jeste si vybrali umbraco + Prohlédněte si svůj nový web + Nainstalovali jste Runway, tak proč se nepodívat, jak Váš nový web vypadá.]]> + Další pomoc a informace + Abyste získali pomoc od naší oceňované komunity, projděte si dokumentaci, nebo si pusťte některá videa zdarma o tom, jak vytvořit jednoduchý web, jak používat balíčky a rychlý úvod do terminologie umbraca]]> + Umbraco %0% je nainstalováno a připraveno k použití + soubor /web.config a upravit klíč AppSetting umbracoConfigurationStatus dole na hodnotu '%0%'.]]> + ihned začít kliknutím na tlačítko "Spustit Umbraco" níže.
Jestliže je pro Vás umbraco nové, + spoustu zdrojů naleznete na naších stránkách "začínáme".]]>
+ Spustit Umbraco + Chcete-li spravovat Váš web, jednoduše přejděte do administrace umbraca a začněte přidávat obsah, upravovat šablony a stylopisy, nebo přidávat nové funkce]]> + Připojení k databázi selhalo. + Umbraco verze 3 + Umbraco verze 4 + Shlédnout + umbraca %0% jako čisté instalace nebo povýšením z 3.0. +

+ Stiskněte "následující" pro spuštění průvodce.]]>
+ + + Kód kultury + Název kultury + + + Byli jste nečinní a odhlášení proběhne automaticky za + Obnovte nyní pro uložení práce + + + Šťastnou super neděli + Šťastné šílené pondělí + Šťastné husté úterý + Šťastnou překrásnou středu + Šťastný bouřlivý čtvrtek + Šťastný bláznivý pátek + Šťastnou kočkobotu + přihlašte se níže + Relace vypršela + © 2001 - %0%
umbraco.org

]]>
+ + + Ovládací panel + Sekce + Obsah + + + Vyberte stránku výše... + %0% byl zkopírován do %1% + Níže vyberte, kam má být dokument %0% zkopírován + %0% byl přesunut do %1% + Níže vyberte, kam má být dokument %0% přesunut + byl vybrán jako kořen Vašeho nového obsahu, klikněte na 'ok' níže. + Ještě nebyl vybrán uzel, vyberte, prosím, uzel ze seznamu výše, než stisknete 'ok' + Aktuální uzel není povolen pod vybraným uzlem kvůli jeho typu + Aktuální uzel nemůže být přesunut do jedné ze svých podstránek + Aktuální uzel nemůže být v kořeni + Operace není povolena, protože máte nedostatečná práva pro 1 nebo více podřizených dokumentů. + Vztáhněte kopírované položky k originálu + + + Upravte vaše oznámení pro %0% + + Hi %0%

+ +

Toto je automatická zpráva informující Vás, že úloha '%1%' + byla provedena na stránce '%2%' + uživatelem '%3%' +

+ +

+

Shrnutí změn:

+ + %6% +
+

+ + + +

Mějte hezký den!

+ Zdraví umbraco robot +

]]>
+ [%0%] Upozornění o %1% na %2% + Upozornění + + + + a výběrem balíčku. Balíčky umbraco mají obvykle přípony ".umb" nebo ".zip". + ]]> + Autor + Ukázka + Dokumentace + Meta data balíčku + Název balíčku + Balíček neobsahuje žádné položky +
+ Můžete jej ze systému bezpečně odstranit kliknutím na "odebrat balíček" níže.]]>
+ Žádné aktualizace nejsou dostupné + Možnosti balíčku + Čti mě balíčku + Úložiště balíčku + Potvrdit odinstalování + Balíček byl odinstalován + Balíček byl úspěšně odinstalován + Odinstalovat balíček + + Upozornění: všechny dokumenty, media atd. závislé na položkách, které odstraníte, přestanou pracovat a mohou vést k nestabilitě systému, + takže odinstalovávejte opatrně. Jste-li na pochybách, kontaktujte autora balíčku.]]> + Stáhnout aktualizaci z úložiště + Balíček s aktualizací + Pokyny pro aktualizaci + Pro tento balíček je dostupná aktualizace. Můžete si ji stáhnout přímo z úložiště balíčků umbraco. + Verze balíčku + Historie verzí balíčku + Zobrazit web balíčku + + + Vložit s úplným formatováním (nedoporučeno) + Text, který chcete vložit, obsahuje speciální znaky nebo formatování. Toto může být způsobeno kopirováním textu z Microsoft Wordu. Umbraco může odstranit speciální znaky nebo formatování, takže vložený obsah bude pro web vhodnější. + Vložit jako čistý text bez jakéhokoliv formátování + Vložit, ale odstranit formátování (doporučeno) + + + Ochrana prostřednictvím rolí + použijte členské skupiny umbraca.]]> + Musíte vytvořit členskou skupinu před tím, než můžete použít autentizaci prostřednictvím rolí + Chybová stránka + Použita, když jsou lidé přihlášení, ale nemají přístup + Vyberte, jak omezit přístup k této stránce + %0% je nyní chráněna + Ochrana odebrána z %0% + Přihlašovací stránka + Vyberte stránku, která obsahuje přihlašovací formulář + Odstranit ochranu + Vyberte stránky, které obsahují přihlašovací formulář a chybová hlášení + Vyberte role, které mají přístup k této stránce + Nastavte přihlašovací jmého a heslo pro tuto stránku + Jednouživatelská ochrana + Jestliže chcete nastavit jenom jednoduchou ochranu prostřednictvím uživatelského jména a hesla + + + + + + + + + Zahrnout nepublikované podřízené stránky + Probíhá publikování - počkejte, prosím... + %0% ze %1% stránek bylo publikováno... + %0% byla publikována + %0% a podstránky byly publikovány + Publikovat %0% a všechny její podstránky + ok pro publikování %0% a tedy zveřejnění jejího obsahu.

+ Můžete publikovat tuto stránku a všechny její podstránky zatrhnutím publikovat všchny podstránky níže. + ]]>
+ + + Nenakonfigurovali jste žádné schválené barvy + + + Přidat vnější odkaz + Přidat vnitřní odkaz + Přidat + Nadpis + Vnitřní stránka + URL + Posunout dolů + Posunout nahoru + Otevřít v novém okně + Odebrat odkaz + + + Současná verze + Červený text nebude ve vybrané verzi zobrazen, zelený znamená přidaný].]]> + Dokument byl vrácen na starší verzi + Tohle zobrazuje vybranou verzi jako html, jestliže chcete vidět rozdíly mezi 2 verzemi najednou, použijte rozdílové zobrazení + Vrátit starší verzi + Vybrat verzi + Zobrazení + + + Editovat skriptovací soubor + + + Domovník + Obsah + Kurýr + Vývojář + Průvodce nastavením Umbraca + Media + Členové + Zpravodaje + Nastavení + Statistiky + Překlad + Uživatelé + Nápověda + + + Výchozí šablona + Klíč slovníku + Pro importování typu dokumentu vyhledejte soubor ".udt" ve svém počítači tak, že kliknete na tlačítko "Prohledat" a pak kliknete na "Import" (na následující obrazovce budete vyzváni k potvrzení) + Název nové záložky + Typ uzlu + Typ + Stylopis + Skript + Vlastnost stylopisu + Záložka + Název záložky + Záložky + Nadřazený typ obsahu povolen + Tento typ obsahu používá + jako nadřazený typ obsahu. Záložky z nadřazených typů obsahu nejsou zobrazeny a mohou byt editovány pouze na nadřazených typech obsahu samotných + Na této záložce nejsou definovány žádné vlastnosti. Pro vytvoření nové vlastnosti klikněte na odkaz "přidat novou vlastnost" nahoře. + + + Sort order + Creation date + Třídění bylo ukončeno. + Abyste nastavili, jak mají být položky seřazeny, přetáhněte jednotlivé z nich nahoru či dolů. Anebo klikněte na hlavičku sloupce pro setřídění celé kolekce +
Během třídění nezavírejte toto okno]]>
+ + + Publikování bylo zrušeno doplňkem třetí strany + Typ vlastnosti už existuje + Typ vlastnosti vytvořen + Datový typ: %1%]]> + Typ vlastnosti odstraněn + Typ vlastnosti uložen + Záložka vytvořena + Záložka odstraněna + Záložka s id: %0% odstraněna + Stylopis nebyl uložen + Stylopis byl uložen + Stylopis byl uložen bez chyb + Datový typ byl uložen + Položka slovníku byla uložena + Publikování se nezdařilo, protože nadřazená stránka není publikována + Obsah byl publikován + a je viditelný na webu + Obsah byl uložen + Nezapomeňte na publikování, aby se změny projevily + Odeslat ke schválení + Změny byly odeslány ke schválení + Medium bylo uloženo + Medium bylo uloženo bez chyb + Člen byl uložen + Vlastnost stylopisu byla uložena + Stylopis byl uložen + Šablona byla uložena + Chyba při ukládání uživatele (zkontrolujte log) + Uživatel byl uložen + Typ uživatele byl uložen + Soubor nebyl uložen + soubor nemohl být uložen. Zkontrolujte, prosím, oprávnění k souboru + Soubor byl uložen + Soubor byl uložen bez chyb + Jazyk byl uložen + Skript python nebyl uložen + Skript python nemohl být uložen kvůli chybě + Skript python byl uložen + Ve skriptu python nejsou žádné chyby + Šablona nebyla uložena + Ujistěte se, prosím, že nemáte 2 šablony se stejným aliasem + Šablona byla uložena + Šablona byla uložena bez chyb! + XSLT nebyl uložen + XSLT obsahoval chybu + XSLT nemohl být uložen, zkontrolujte oprávnění k souboru + XSLT byl uložen + V XSLT nejsou žádné chyby + Publikování obsahu bylo zrušeno + Částečný pohled byl uložen + Částečný pohled byl uložen bez chyb! + Částečný pohled nebyl uložen + Při ukládání souboru došlo k chybě. + + + Používá CSS syntaxi např.: h1, .redHeader, .blueTex + Editovat stylopis + Editovat vlastnost stylopisu + Název, který identifikuje vlastnost stylu v editoru formátovaného textu + Náhled + Styly + + + Editovat šablonu + Vložit obsahovou oblast + Vložit zástupce obsahové oblasti + Vložit položku slovníku + Vložit makro + Vložit pole stránky umbraco + Nadřazená šablona + Rychlá příručka k šablonovým značkám umbraca + Šablona + + + Choose type of content + Choose a layout + Add a row + Add content + Drop content + Settings applied + + This content is not allowed here + This content is allowed here + + Click to embed + Click to insert image + Image caption... + Write here... + + Grid Layouts + Layouts are the overall work area for the grid editor, usually you only need one or two different layouts + Add Grid Layout + Adjust the layout by setting column widths and adding additional sections + Row configurations + Rows are predefined cells arranged horizontally + Add row configuration + Adjust the row by setting cell widths and adding additional cells + Columns + Total combined number of columns in the grid layout + Settings + Configure what settings editors can change + Styles + Configure what styling editors can change + Settings will only save if the entered json configuration is valid + Allow all editors + Allow all row configurations + + + Alternativní pole + Alternativní text + Velká a malá písmena + Kódování + Vybrat pole + Konvertovat + Nahrazuje nové řádky html tagem &lt;br&gt; + Vlastní pole + Ano, pouze datum + Formátovat jako datum + HTML kódování + Nahradí speciální znaky jejich HTML ekvivalentem. + Bude vloženo za hodnotou pole + Bude vloženo před hodnotou pole + Malá písmena + Nic + Vložit za polem + Vložit před polem + Rekurzivní + Standardní pole + Velká písmena + Kódování URL + Formátuje speciální znaky v URL adresách + Bude použito pouze pokud jsou pole nahoře prázdná + Toto pole bude použito pouze pokud je primární pole prázdné + Ano, s časem. Oddělovač: + + + Úlohy přidělené Vám + přidělené Vám. Chcete-li vidět podrobné zobrazení včetně komentářů, klikněte na "Podrobnosti" nebo pouze na název stránky. + Můžete také přímo stáhnout stránku jako XML kliknutím na odkaz "Stáhnout Xml".
+ Pro zavření překladatelské úlohy přejděte, prosím, na zobrazení Podrobnosti a klikněte na tlačítko "Zavřít". + ]]>
+ zavřít úlohu + Podrobnosti překladu + Stáhnout všechny překladatelské úlohy jako xml + Stáhnout xml + Stáhnout xml DTD + Pole + Zahrnout podstránky + + [%0%] Překladatelská úloha pro %1% + Žádní uživatelé překladatelé nebyli nalezeni. Vytvořte, prosím, překladatele před tím, než začnete posílat obsah k překladu + Úlohy vytvořené Vámi + vytvořené Vámi. Chcete-li vidět podrobné zobrazení včetně komentářů, klikněte na "Podrobnosti" nebo pouze na název stránky. Můžete také přímo stáhnout stránku jako XML kliknutím na odkaz "Stáhnout Xml". + Pro zavření překladatelské úlohy přejděte, prosím, na zobrazení Podrobnosti a klikněte na tlačítko "Zavřít". + ]]> + Stránka '%0%' byla poslána k překladu + Poslat stránku '%0%' k překladu + Přiděleno uživatelem + Otevřené úlohy + Slov celkem + Přeložit do + Překlad hotov. + Klikutím níže můžete vidět stránky, které jste právě přeložili. Jestliže je nalezena originální stránka, dostanete srovnání 2 stránek. + Překlad selhal, xml soubor může být poškozený + Možnosti překladu + Překladatel + Nahrát xml překladu + + + Prohlížeč mezipaměti + Koš + Vytvořené balíčky + Datové typy + Slovník + Instalované balíčky + Instalovat téma + Instalovat startovní sadu + Jazyky + Instalovat místní balíček + Makra + Typy medií + Členové + Skupiny členů + Role + Typy členů + Typy dokumentů + Balíčky + Balíčky + Soubory python + Instalovat z úložiště + Instalovat Runway + Moduly Runway + Skriptovací soubory + Skripty + Stylopisy + Šablony + XSLT soubory + + + Nová aktualizace je připrvena + %0% je připraven, klikněte zde pro stažení + Žádné spojení se serverem + Chyba při kontrole aktualizace. Zkontrolujte, prosím, trasovací zásobník pro další informace + + + Administrátor + Pole kategorie + Změnit heslo + Změnit heslo + Potvrdit heslo + Můžete změnit své heslo pro přístup do administrace Umbraca vyplněním formuláře níže a kliknutím na tlačítko 'Změnit Heslo' + Kanál obsahu + Popis + Deaktivovat uživatele + Typ dokumentu + Editor + Výtah + Jazyk + Přihlašovací jméno + Úvodní uzel v knihovně medií + Sekce + Deaktivovat přistup k Umbracu + Heslo + Resetovat heslo + Vyše heslo bylo změněno! + Potvrďte, prosím, nové heslo + Zadejte Vaše nové heslo + Vaše nové heslo nesmí být prázdné! + Současné heslo + Neplatné současné heslo + Nové heslo a potvrzující heslo se liší. Zkuste to, prosím, znovu! + Potvrzující heslo není stejné jako nové heslo! + Nahradit oprávnění podřízených uzlů + Nyní měníte oprávnění pro stránky: + Vyberte stránky, pro které chcete měnit oprávnění + Prohledat všechny podřízené uzly + Úvodní uzel v obsahu + Uživatelské jméno + Oprávnění uživatele + Typ uživatele + Typy uživatelů + Spisovatel + Váš profil + Vaše nedávná historie + Relace vyprší za + +
\ No newline at end of file diff --git a/src/UmbracoUrlHandling/Umbraco/Config/Lang/da.xml b/src/UmbracoUrlHandling/Umbraco/Config/Lang/da.xml new file mode 100644 index 0000000..3d2e4c2 --- /dev/null +++ b/src/UmbracoUrlHandling/Umbraco/Config/Lang/da.xml @@ -0,0 +1,1294 @@ + + + + The Umbraco community + http://our.umbraco.org/documentation/Extending-Umbraco/Language-Files + + + Tilføj domæne + Revisionsspor + Gennemse elementer + Skift dokumenttype + Kopier + Opret + Opret pakke + Slet + Deaktivér + Tøm papirkurv + Eksportér dokumenttype + Eksportér til .NET + Eksportér til .NET + Importér dokumenttype + Importér pakke + Redigér i Canvas + Log af + Flyt + Notificeringer + Offentlig adgang + Udgiv + Fortryd udgivelse + Genindlæs elementer + Genudgiv hele sitet + Gendan + Sæt rettigheder for siden %0% + Hvor vil du flytte + hen til i træstrukturen? + Rettigheder + Fortryd ændringer + Send til udgivelse + Send til oversættelse + Sortér + Send til udgivelse + Oversæt + Opdatér + Standard værdi + + + Tilladelse nægtet. + Tilføj nyt domæne + fjern + Ugyldig node. + Ugyldigt domæne-format. + Domæne er allerede blevet tildelt. + Sprog + Domæne + Domænet '%0%' er nu oprettet og tilknyttet siden + Domænet '%0%' er nu slettet + Domænet '%0%' er oprettet + Domænet '%0%' er nu opdateret + eller rediger nuværende domæner + f.eks. ditdomaene.com, www.ditdomaene.com + + + For + + + Ryd valg + Vælg + Vælg nuværende mappe + Gør noget andet + Fed + Fortryd indryk afsnit + Indsæt formularfelt + Indsæt grafisk overskrift + Redigér Html + Indryk afsnit + Kursiv + Centrér + Venstrestil afsnit + Højrestil afsnit + Indsæt link + Indsæt lokalt link (anker) + Punktopstilling + Nummerorden + Indsæt makro + Indsæt billede + Redigér relationer + Tilbage til listen + Gem + Gem og udgiv + Gem og send til udgivelse + Gem listevisning + Forhåndsvisning + Forhåndsvisning er deaktiveret fordi der ikke er nogen skabelon tildelt + Vælg formattering + Vis koder + Indsæt tabel + Generer modeller + + + For at skifte det valgte indholds dokumenttype, skal du først vælge en ny dokumenttype, som er gyldig på denne placering. + Kontroller derefter, at alle egenskaber bliver overført rigtigt til den nye dokumenttype, og klik derefter på Gem. + Indholdet er blevet genudgivet. + Nuværende egenskab + Nuværende type + Du kan ikke skifte dokumenttype, da der ikke er andre gyldige dokumenttyper på denne placering. + Dokumenttype skiftet + Overfør egenskaber + Overfør til egenskab + Ny skabelon + Ny type + ingen + Indhold + Vælg ny dokumenttype + Dokumenttypen på detvalgte indhold blev skiftet til [new type], og følgende egenskaber blev overført: + til + Overførsel af egenskaber kunne ikke fuldføres, da en eller flere egenskaber er indstillet til at blive overført mere end én gang. + Kun andre dokumenttyper, der er gyldige på denne placering, vises. + + + Udgivet + Om siden + Alias + (hvordan ville du f.eks. beskrive billedet via telefonen?) + Alternative links + Klik for at redigere dette punkt + Oprettet af + Oprindelig forfatter + Opdateret af + Oprettet den + Tidspunkt for oprettelse + Dokumenttype + Redigerer + Nedtagningsdato + Dette punkt er ændret siden udgivelsen + Dette punkt er endnu ikke udgivet + Sidst udgivet + Der er ingen elementer at vise på listen. + Medietype + Link til medie(r) + Medlemsgruppe + Rolle + Medlemstype + Ingen dato valgt + Sidetitel + Egenskaber + Dette dokument er udgivet, men ikke synligt da den overliggende side '%0%' ikke er udgivet! + Upd: dette dokument er udgiver, men er ikke i cachen (intern fejl) + Udgivet + Udgivelsesstatus + Udgivelsesdato + Dato for Fortryd udgivelse + Fjern dato + Sorteringsrækkefølgen er opdateret + For at sortere, træk siderne eller klik på en af kolonnehovederne. Du kan vælge flere sider ved at holde "shift" eller "control" nede mens du vælger. + Statistik + Titel (valgfri) + Alternativ tekst (valgfri) + Type + Fortryd udgivelse + Sidst redigeret + Tidspunkt for seneste redigering + Fjern fil + Link til dokument + Medlem af grupper(ne) + Ikke medlem af grupper(ne) + Undersider + Åben i vindue + + + Klik for at uploade + Slip filerne her... + Link til medie + eller klik her for at vælge filer + Tilladte filtyper er kun + Maks filstørrelse er + + + Opret et nyt medlem + Alle medlemmer + + + Hvor ønsker du at oprette den nye %0% + Opret under + Vælg en type og skriv en titel + "dokument typer".]]> + "media typer".]]> + Dokumenttype uden skabelon + Ny mappe + Ny datatype + + + Til dit website + - Skjul + Hvis Umbraco ikke starter, kan det skyldes at din browser ikke tillader pop-up vinduer + er åbnet i nyt vindue + Genstart + Besøg + Velkommen + + + Bliv + Kassér ændringer + Du har ikke-gemte ændringer + Er du sikker på du vil navigere væk fra denne side? - du har ikke-gemte ændringer + + + Færdig + + Slettede %0% element + Slettede %0% elementer + Slettede %0% ud af %1% element + Slettede %0% ud af %1% elementer + + Udgav %0% element + Udgav %0% elementer + Udgav %0% ud af %1% element + Udgav %0% ud af %1% elementer + + Fjernede %0% element fra udgivelse + Fjernede %0% elementer fra udgivelse + Fjernede %0% ud af %1% element fra udgivelse + Fjernede %0% ud af %1% elementer fra udgivelse + + Flyttede %0% element + Flyttede %0% elementer + Flyttede %0% ud af %1% element + Flyttede %0% ud af %1% elementer + + Kopierede %0% element + Kopierede %0% elementer + Kopierede %0% ud af %1% element + Kopierede %0% ud af %1% elementer + + + Navn på lokalt link + Rediger domæner + Luk denne dialog + Er du sikker på at du vil slette + Er du sikker på du vil deaktivere + Afkryds venligst denne boks for at bekræfte sletningen af %0% enhed(er) + Er du sikker på at du vil forlade Umbraco? + Er du sikker? + Klip + Rediger ordbogsnøgle + Rediger sprog + Indsæt lokalt link + Indsæt tegn + Indsæt grafisk overskrift + Indsæt billede + Indsæt link + Indsæt makro + Indsæt tabel + Sidst redigeret + Link + Internt link: + Ved lokalt link, indsæt da en "#" foran linket + Åben i nyt vindue? + Makroindstillinger + Denne makro har ingen egenskaber du kan redigere + Indsæt tekst + Rediger rettigheder for + Elementerne i papirkurven slettes. Luk venligst ikke dette vindue mens sletningen foregår + Papirkurven er nu tom + Når elementer slettes fra papirkurven, slettes de for altid + regexlib.com's webservice oplever i øjeblikket problemer, vi ikke har kontrol over. Beklager ulejligheden. ]]> + Søg efter et regulært udtryk for at tilføje validering til et formularfelt. Eksempel: 'email', 'zip-code', 'url' + Fjern makro + Obligatorisk + Sitet er genindekseret + Sitet er nu genudgivet + Websitets cache vil blive genopfrisket. Alt udgivet indhold vil blive opdateret, mens upubliceret indhold vil forblive upubliceret. + Antal kolonner + Antal rækker + Vælg et placeholder id Ved at sætte et id på en placeholder kan du indskyde indhold fra undertemplates ved at referere til dette ID vha. et <asp:content /> element.]]> + Vælg et placeholder id fra listen herunder. Du kan kun vælge id'er fra den nuværende masterskabelon.]]> + Klik på billedet for at se den fulde størrelse + Vælg + Se cache element + Opret mappe... + Relatér til original + Inkludér undersider + Link til side + Åben linket i et nyt vindue eller fane + Link til medie + Vælg medie + Vælg ikon + Vælg item + Vælg link + Vælg makro + Vælg indhold + Vælg medlem + Vælg medlemsgruppe + Der er ingen parametre for denne makro + Der er ikke tilføjet nogen makroer + Link dit + Fjern link fra dit + konto + Vælg editor + + + + Du tilføjer flere sprog under 'sprog' i menuen til venstre + ]]> + + Kulturnavn + Rediger navnet på ordbogselementet. + + + + + + Indtast dit brugernavn + Indtast dit kodeord + Navngiv %0%... + Indtast navn... + Label... + Indtast beskrivelse + Søg... + Filtrer... + Indtast nøgleord (tryk på Enter efter hvert nøgleord)... + Dit brugernavn er typisk din e-mail adresse + + + Tillad på rodniveau + Kun dokumenttyper med denne indstilling aktiveret oprettes i rodniveau under Inhold og Mediearkiv + Tilladte typer + Sammensætning af dokumenttyper + Opret + Slet fane + Beskrivelse + Ny fane + Fane + Thumbnail + Aktiver listevisning + Viser undersider i en søgbar liste, undersider vises ikke i indholdstræet + Nuværende listevisning + Den aktive listevisningsdatatype + Opret brugerdefineret listevisning + Fjern brugerdefineret listevisning + + + Tilføj førværdi + Database-datatype + Data Editor GUID + Visningskontrol + Knapper + Aktiver avancerede indstillinger for + Aktiver kontekstmenu + Maks. std. størrelse på indsatte billeder + Relaterede stylesheets + Vis label + Bredde og højde + + + Dine data er blevet gemt, men før du kan udgive denne side er der nogle fejl der skal rettes: + Den nuværende membership-provider understøtter ikke skift af kodeord (EnablePasswordRetrieval skal være true) + %0% der findes allerede + Der var fejl i dokumentet: + Der var fejl i formularen: + Kodeordet skal være på minimum %0% tegn og indeholde mindst %1% alfanumeriske karakterer + %0% skal være et heltal + %0% under %1% er et obligatorisk felt og skal udfyldes + %0% er et obligatorisk felt og skal udfyldes + %0% under %1% er ikke i et korrekt format + %0% er ikke i et korrekt format + + + Der skete en fejl på severen + Denne filttype er blevet deaktiveret af administratoren + OBS! Selvom CodeMirror er slået til i konfigurationen, så er den deaktiveret i Internet Explorer fordi den ikke er stabil nok. + Du skal udfylde både Alias & Navn på den nye egenskabstype! + Der mangler læse/skrive rettigheder til bestemte filer og mapper + Skriv venligst en titel + Du skal vælge en type + Du er ved at gøre billedet større end originalen. Det vil forringe kvaliteten af billedet. Ønsker du at fortsætte? + Fejl i Python-script + Python-scriptet er ikke blevet gemt, fordi det indeholder fejl + Startnode er slettet, kontakt systemadministrator + Du skal markere noget indhold, før du kan ændre stylen + Der er ingen aktive styles eller formatteringer på denne side + Du skal stå til venstre for de 2 celler du ønsker at samle! + Du kan ikke opdele en celle, som ikke allerede er delt. + Fejl i XSLT kode + Din XSLT er ikke opdateret, da det indeholdt en fejl + Der er et problem med den datatype, der bruges til denn egenskab. Kontroller konfigurationen og prøv igen. + + + Om + Handling + Muligheder + Tilføj + Alias + Er du sikker? + Tilbage + Kant + af + Fortryd + Celle margen + Vælg + Luk + Luk vindue + Kommentar + Bekræft + Behold proportioner + Fortsæt + Kopiér + Opret + Database + Dato + Standard + Slet + Slettet + Sletter... + Design + Dimensioner + Ned + Hent + Rediger + Redigeret + Elementer + Email + Fejl + Find + Højde + Hjælp + Ikon + Importer + Indre margen + Indsæt + Installér + Justering + Sprog + Layout + Henter + Låst + Log ind + Log af + Log ud + Makro + Flyt + Mere + Navn + Ny + Næste + Nej + af + OK + Åben + eller + Kodeord + Sti + Placeholder ID + Et øjeblik... + Forrige + Egenskaber + Email der skal modtage indhold af formular + Papirkurv + Din papirkurv er tom + Mangler + Omdøb + Forny + Påkrævet + Prøv igen + Rettigheder + Søg + Server + Vis + Hvilken side skal vises efter at formularen er sendt + Størrelse + Sortér + Indsend + + Type + Skriv for at søge... + Op + Opdatér + Opdatér + Upload + Url + Bruger + Brugernavn + Værdi + Vis + Velkommen... + Bredde + Ja + Mappe + Søgeresultater + Sorter + Afslut sortering + Eksempel + Skift kodeord + til + Listevisning + Gemmer... + nuværende + Indlejring + valgt + + + + Sort + Grøn + Gul + Orange + Blå + Rød + + + + Tilføj fane + Tilføj egenskab + Tilføj editor + Tilføj skabelon + Tilføj child node + Tilføj child + + Rediger datatype + + Naviger sektioner + + Genveje + Vis genveje + + Brug listevisning + Tillad på rodniveau + + Comment/Uncomment lines + Remove line + Copy Lines Up + Copy Lines Down + Move Lines Up + Move Lines Down + + General + Editor + + + + Baggrundsfarve + Fed + Tekst farve + Skrifttype + Tekst + + + Side + + + Installeringsprogrammet kan ikke forbinde til databasen. + Kunne ikke gemme web.config filen. Du bedes venligst manuelt ændre database forbindelses strengen. + Din database er blevet fundet og identificeret som + Database konfiguration + + installér knappen for at installere Umbraco %0% databasen + ]]> + + installér knappen for at installere Umbraco %0% databasen]]> + Næste for at fortsætte.]]> + + Databasen er ikke fundet. Kontrollér venligst at informationen i database forbindelsesstrengen i "web.config" filen er korrekt.

+

For at fortsætte bedes du venligst rette "web.config" filen (ved at bruge Visual Studio eller dit favoritprogram), scroll til bunden, tilføj forbindelsesstrengen til din database i feltet som hedder "umbracoDbDSN" og gem filen.

Klik på Forsøg igen knappen når du er færdig.
Mere information om at redigere web.config her.

]]> +
+ Kontakt venligst din ISP hvis det er nødvendigt. Hvis du installerer på en lokal maskine eller server kan du muligvis få informationerne fra din systemadministrator.]]> + Tryk på Opgradér knappen for at opgradere din database til Umbraco %0%

Bare rolig - intet indhold vil blive slettet og alt vil stadig fungere bagefter!

]]>
+ Tryk på Næste for at fortsætte.]]> + Næste for at fortsætte med konfigurationsguiden.]]> + Normalbrugerens adgangskode er nødt til at blive ændret!]]> + Normalbrugeren er blevet gjort utjenstdygtig eller har ikke adgang til Umbraco!

Du behøver ikke foretage yderligere handlinger. Tryk på Næste for at fortsætte.

]]>
+ Normalbrugerens adgangskode er på succesfuld vis blevet ændret siden installationen!

Du behøver ikke foretage yderligere handlinger. Tryk på Næste for at fortsætte.

]]>
+ Adgangskoden er blevet ændret! + Umbraco opretter en normalbruger med et login ('admin') og en adgangskode ('default').

Det er vigtigt at adgangskoden bliver ændret til noget unikt.

Dette skridt vil kontrollere normalbrugerens adgangskode og foreslå om det er nødt til at blive ændret.

]]>
+ Få en fremragende start, se vores videoer + Ved at klikke på næste knappen (eller ved at ændre UmbracoConfigurationStatus i web.config filen), accepterer du licensaftalen for denne software, som specificeret i boksen nedenfor. Bemærk venligst at denne Umbraco distribution består af to forskellige licenser, MIT's Open Source Licens for frameworket og Umbraco Freeware Licensen som dækker UI'en. + Endnu ikke installeret + Berørte filer og foldere + Flere informationer om at opsætte rettigheder for Umbraco her + Du er nødt til at give ASP.NET 'modify' rettigheder på følgende filer/foldere + Dine rettighedsindstillinger er næsten perfekte!

Du kan køre Umbraco uden problemer, men du vil ikke være i stand til at installere pakker, som er anbefalet for at få fuldt udbytte af Umbraco.]]>
+ Hvorledes besluttes + Klik her for at læse tekstversionen + video tutorials om at opsætte folderrettigheder for Umbraco eller læs tekstversionen.]]> + Dine rettighedsindstillinger kan være et problem!

Du kan afvikle Umbraco uden problemer, men du vil ikke være i stand til at oprette foldere eller installere pakker, hvilket er anbefalet for at få fuldt udbytte af Umbraco.]]>
+ Dine rettighedsindstillinger er ikke klar til Umbraco!

For at afvikle Umbraco er du nødt til at opdatere dine rettighedsindstillinger.]]>
+ Dine rettighedsindstillinger er perfekte!

Du er nu parat til at afvikle Umbraco og installere pakker!]]>
+ Løser folder problem + Følg dette link for mere information om udfordringer med ASP.NET og oprettelse af foldere + Sætter folderrettigheder op + Umbraco har behov for 'write/modify' adgang til bestemte foldere, for at kunne gemme filer som billeder og PDF'er. Umbraco gemmer også midlertidige data (eksempelvis cachen) for at forbedre ydelsen på dit website. + Jeg har lyst til at begynde på bar bund + lær hvordan) Du kan stadig vælge at installere Runway senere. Gå venligst til Udvikler-sektionen og vælg Pakker.]]> + Du har lige opsat en ren Umbraco-platform. Hvad ønsker du nu at gøre? + Runway er installeret + Dette er vores liste over anbefalede moduler. Kryds dem af du ønsker at installere eller se den fulde liste af moduler ]]> + Kun anbefalet for erfarne brugere + Jeg ønsker at begynder med et simpelt website + "Runway" er et simpelt website som stiller nogle basale dokumenttyper og skabeloner til rådighed. Installeringsprogrammet kan automatisk opsætte Runway for dig, men du kan nemt redigere, udvide eller fjerne det. Det er ikke nødvendigt og du kan sagtens bruge Umbraco uden. Men Runway tilbyder et fundament, som er baseret på 'Best Practices', som får dig igang hurtigere end nogensinde før. Hvis du vælger at installere Runway, kan du efter eget valg vælge de grundlæggende byggesten kaldet 'Runway Modules' til at forbedre dine Runway-sider.

Inkluderet med Runway:Home Page, Getting Started page, Installing Modules page.
Valgfri Moduler: Top Navigation, Sitemap, Contact, Gallery.

]]>
+ Hvad er Runway + Skridt 1/5: Acceptér licens + Skridt 2/5: Database-konfiguration + Skridt 3/5: Validerer filrettigheder + Skridt 4/5: Kontrollér Umbraco sikkerhed + Skridt 5/5: Umbraco er parat til at få dig igang + Tak fordi du valgte Umbraco + Gennemse dit nye site Du installerede Runway, så hvorfor ikke se hvordan dit nye website ser ud.]]> + Yderligere hjælpe og informationer Få hjælp fra vores prisvindende fællesskab, gennemse dokumentationen eller se nogle gratis videoer om hvordan du opsætter et simpelt site, hvordan du bruger pakker og en 'quick guide' til Umbraco terminologier]]> + Umbraco %0% er installeret og klar til brug + /web.config filen og opdatére 'AppSetting' feltet UmbracoConfigurationStatus i bunden til '%0%'.]]> + + komme igang med det samme ved at klikke på "Start Umbraco" knappen nedenfor.
Hvis du er ny med Umbraco, kan du finde masser af ressourcer på vores 'getting started' sider. +]]> +
+ Start UmbracoFor at administrere dit website skal du blot åbne Umbraco administrationen og begynde at tilføje indhold, opdatere skabelonerne og stylesheets'ene eller tilføje ny funktionalitet.]]> + Forbindelse til databasen fejlede. + Umbraco Version 3 + Umbraco Version 4 + Se + Umbraco %0% for en frisk installation eller for en opgradering fra version 3.0.

Tryk på Næste for at begynde på guiden.]]>
+ + + Culture Code + Culture Name + + + Du har været inaktiv, og du vil blive logget ud om + Forny for at gemme dine ændringer + + + Så er det søndag! + Smil, det er mandag! + Hurra, det er tirsdag! + Hvilken herlig onsdag! + Glædelig torsdag! + Endelig fredag! + Glædelig lørdag + Log ind nedenfor + indtast brugernavn og kodeord + Log ind med + Din session er udløbet + © 2001 - %0%
umbraco.com

]]>
+ Glemt adgangskode? + En e-mail vil blive sendt til den angivne adresse med et link til at nulstille din adgangskode + En e-mail med instruktioner for nulstilling af adgangskoden vil blive sendt til den angivne adresse, hvis det matcher vores optegnelser + Tilbage til login formular + Angiv en ny adgangskode + Din adgangskode er blevet opdateret + Det link, du har klikket på, er ugyldigt eller udløbet + Umbraco: Nulstil adgangskode + + Dit brugernavn til at logge på Umbraco backoffice er: %0%

Klik her for at nulstille din adgangskode eller kopier/indsæt denne URL i din browser:

%1%

]]> +
+ + + Skrivebord + Sektioner + Indhold + + + Vælg siden ovenover... + %0% er nu kopieret til %1% + Kopier til + %0% er nu flyttet til %1% + Flyt til + er blevet valgt som roden for dit nye indhold, klik 'ok' nedenunder. + Intet element valgt, vælg et element i listen ovenfor før der klikkes 'fortsæt' + Det nuværende element kan ikke lægges under denne pga. sin type + Det nuværende element kan ikke ligge under en af dens undersider + Dette element må ikke findes på rodniveau + Denne handling er ikke tilladt fordi du ikke har de fornødne rettigheder på et eller flere af under-dokumenterne + Relater det kopierede element til originalen + + + Rediger dine notificeringer for %0% + + + + + Hej %0%

+

Dette er en automatisk mail for at informere dig om at opgaven '%1%' + er blevet udførtpå siden '%2%' af brugeren '%3%'

+

Opdateringssammendrag:

%6%

Hav en fortsat god dag!

De bedste hilsner fra umbraco robotten

]]> +
+ [%0%] Notificering om %1% udført på %2% + Notificeringer + + + Vælg pakken fra din computer. Umbraco pakker er oftest en ".zip" fil + Udvikler + Demonstration + Dokumentation + Pakke meta data + Pakkenavn + Pakken indeholder ingen elementer +
Du kan roligt fjerne denne fra systemet ved at klikke på "Fjern pakke" nedenfor.]]>
+ Ingen opdateringer tilgængelige + Pakkevalg + Pakke læs mig + Pakke opbevaringsbase + Bekræft af-installering + Pakken blev fjernet + Pakken er på succesfuld vis blevet fjernet + Afinstallér pakke + + +Bemærk: at dokumenter og medier som afhænger af denne pakke vil muligvis holde op med at virke, så vær forsigtig. Hvis i tvivl, kontakt personen som har udviklet pakken.]]> + + Download opdatering fra opbevaringsbasen + Opdatér pakke + Opdateringsinstrukser + Der er en tilgængelig opdatering til denne pakke. Du kan downloade den direkte fra Umbracos pakke opbevaringsbase. + Pakke version + Se pakkeudviklerens website + + + Indsæt med fuld formattering (Anbefales ikke) + Den tekst du er ved at indsætte indeholder specialtegn eller formattering. Dette kan skyldes at du kopierer fra f.eks. Microsoft Word. Umbraco kan fjerne denne specialformattering automatisk så indholdet er mere velegnet til visning på en webside. + Indsæt som ren tekst, dvs. fjern al formattering + Indsæt, men fjern formattering som ikke bør være på en webside (Anbefales) + + + Rollebaseret beskyttelse + Hvis du ønsker at kontrollere adgang til siden ved hjælp af rollebaseret godkendelse via Umbracos medlemsgrupper. + Du skal oprette en medlemsgruppe før du kan bruge rollebaseret godkendelse + Fejlside + Brugt når folk er logget ind, men ingen adgang + Vælg hvordan siden skal beskyttes + %0% er nu beskyttet + Beskyttelse fjernet fra %0% + Log ind-side + Vælg siden der indeholder log ind-formularen + Fjern beskyttelse + Vælg siderne der indeholder log ind-formularer og fejlmeddelelser + Vælg de roller der har adgang til denne side + Indstil login og kodeord for denne side + Enkel brugerbeskyttelse + Hvis du blot ønsker at opsætte simpel beskyttelse ved hjælp af et enkelt login og kodeord + + + Udgivelsen kunne ikke udgives da publiceringsdato er sat + + + + + + + Udgivelsen fejlede fordi en overordnet side ikke er publiceret + + %0% kunne ikke udgives, fordi et 3. parts modul annullerede handlingen + Medtag ikke-udgivede undersider + Publicerer - vent venligst... + %0% ud af %1% sider er blevet udgivet... + %0% er nu publiceret + %0% og alle undersider er nu publiceret + Publicér alle undersider + ok for at udgive %0% og derved gøre indholdet offentligt tilgængeligt..

Du kan udgive denne side og dens undersider ved at klikke Udgiv alle undersider forneden]]>
+ + + Du har ikke konfigureret nogen godkendte farver + + + indtast eksternt link + vælg en intern side + Tekst + Link + Nyt vindue + Indtast en tekst + Indtast et link + + + Nulstil + + + Vælg indholdstype + Vælg layout + Tilføj række + Tilføj indhold + Slip indhold + Indstillinger tilføjet + + Indholdet er ikke tilladt her + Indholdet er tilladt her + + Klik for at indlejre + Klik for at indsætte et billede + Billedtekst... + Skriv her... + + Gridlayout + Et layout er det overordnede arbejdsområde til dit gitter - du vil typisk kun behøve ét eller to + Tilføj gitterlayout + Juster dit layout ved at justere kolonnebredder og tilføj yderligere sektioner + + Rækkekonfigurationer + Rækker er foruddefinerede celler, der arrangeres vandret + Tilføj rækkekonfiguration + Juster rækken ved at indstille cellebredder og tilføje yderligere celler + + Kolonner + Det totale antaller kolonner i gitteret + + Indstillinger + Konfigurer, hvilket indstillinger, brugeren kan ændre + + + Typografi + Vælg, hvilke typografiværdier, en redaktør kan ændre + + Indstillinger gemmes kun, hvis den indtaste json-konfiguration er gyldig + + Tillad alle editorer + Tillad alle rækkekonfigurationer + + Sæt som standard + Vælg ekstra + Vælg standard + er tilføjet + + + + + Kompositioner + Du har ikke tilføjet nogle faner + Tilføj ny fane + Tilføj endnu en fane + Nedarvet fra + Tilføj property + Påkrævet label + + Aktiver listevisning + Konfigurer indholdet til at blive vist i en sorterbar og søgbar liste, dens børn vil ikke blive vist i træet + + Tilladte skabeloner + Vælg hvilke skabeloner der er tilladt at bruge på dette indhold + + Tillad på rodniveau + Kun dokumenttyper med denne indstilling aktiveret oprettes i rodniveau under inhold og mediearkiv + Ja – indhold af denne type er tilladt i roden + + Tilladte typer + Tillad at oprette indhold af en specifik type under denne + + Vælg child node + + Nedarv faner og egenskaber fra en anden dokumenttype. Nye faner vil blive tilføjet den nuværende dokumenttype eller sammenflettet hvis fanenavnene er ens. + Indholdstypen bliver brugt i en komposition og kan derfor ikke blive anvendt som komposition + Der er ingen indholdstyper tilgængelige at bruge som komposition + + Tilgængelige editors + Genbrug + Editor indstillinger + + Konfiguration + + Ja, slet + + blev flyttet til + Vælg hvor + skal flyttes til + + Alle dokumenttyper + Alle dokumenter + Alle medier + + som benytter denne dokumenttype vil blive slettet permanent. Bekræft at du også vil slette dem. + som benytter denne medietype vil blive slettet permanent. Bekræft at du også vil slette dem. + som benytter denne medlemstype vil blive slettet permanent. Bekræft at du også vil slette dem. + + og alle dokumenter, som benytter denne type + og alle medier, som benytter denne type + og alle medlemmer, som benytter denne type + + der bruger denne editor vil blive opdateret med de nye indstillinger + + + + Nuværende version + Rød tekst vil ikke blive vist i den valgte version. Grøn betyder tilføjet]]> + Dokument tilbagerullet + Her vises den valgte version som html. Hvis du ønsker at se forskellen mellem de 2 versioner på samme tid, brug 'diff'-oversigten + Tilbagerulning til + Vælg version + Vis + + + Rediger script + + + Concierge + Indhold + Courier + Udvikler + Umbraco konfigurationsguide + Mediearkiv + Medlemmer + Nyhedsbreve + Indstillinger + Statistik + Oversættelse + Brugere + Hjælp + Formularer + Analytics + + + gå til + Hjælpeemner for + Videokapitler for + De bedste Umbraco video tutorials + + + Standardskabelon + Ordbogsnøgle + For at importere en dokumenttype, find ".udt"-filen på din computer ved at klikke på "Gennemse"-knappen og klik "Import" (Du vil blive bedt om bekræftelse på næste skærmbillede) + Ny titel på faneblad + Nodetype + Type + Stylesheet + Script + Stylesheetegenskab + Faneblad + Titel på faneblad + Faneblade + Master Dokumenttype + Opret matchende skabelon + + + Sorteringsrækkefølge + Oprettelsesdato + Sortering udført + Træk de forskellige sider op eller ned for at indstille hvordan de skal arrangeres, eller klik på kolonnehovederne for at sortere hele rækken af sider +
Luk ikke dette vindue imens]]>
+ + + Annulleret + Handlingen blev annulleret af et 3. part tilføjelsesprogram + Property type eksisterer allerede + Egenskabstype oprettet + DataType: %1%]]> + Egenskabs type slettet + Indholdstype gemt + Du har oprettet et faneblad + Faneblad slettet + Faneblad med id: %0% slettet + Stylesheetet blev ikke gemt + Stylesheet gemt + Stylesheet gemt uden fejl + Datatype gemt + Ordbogsnøgle gemt + Indhold publiceret + og nu synligt for besøgende + Indhold gemt + Husk at publicere for at gøre det synligt for besøgende + Send til Godkendelse + Rettelser er blevet sendt til godkendelse + Medie gemt + Medie gemt uden problemer + Medlem gemt + Stylesheetegenskab gemt + Stylesheet gemt + Skabelon gemt + Der er opstået en fejl under redigering + Bruger gemt + Brugertype gemt + Fil ikke gemt + Filen kunne ikke gemmes. Tjek filrettighederne + Fil gemt + Fil gemt uden fejl + Sprog gemt + Medietype gemt + Medlemstype gemt + Python script ikke gemt + Python-script kunne ikke gemmes pga. fejl + Python-script gemt + Ingen fejl i Python-script + Skabelon ikke gemt + Undgå venligst at du har 2 templates med samme alias + Skabelon gemt + Skabelon gemt uden fejl! + XSLT'en blev ikke gemt + XSLT'en indeholdt fejl + XSLT kunne ikke gemmes, check filrettigheder + XSLT gemt + Der var ingen fejl i din XSLT! + Indhold fjernet fra udgivelse + Partial view gemt + Partial view gemt uden fejl! + Partial view ikke gemt + Der opstod en fejl ved at gemme filen. + + + Bruger CSS-syntax f.eks. h1, .redheader, .blueTex + Rediger stylesheet + Rediger CSS-egenskab + Navn der identificerer CSS-egenskaben i tekstredigeringsværktøjet + Vis prøve + Styles + + + + Rediger skabelon + + Sektioner + Indsæt indholdsområde + Indsæt pladsholder for indholdsområde + + Indsæt + Hvad vil du indsætte? + + Oversættelse + Indsætter en oversætbar tekst, som skifter efter det sprog, som websitet vises i. + + Makro + + En makro er et element, som kan have forskellige indstillinger, når det indsættes. + Brug det som en genbrugelig del af dit design såsom gallerier, formularer og lister. + + + Sideværdi + + Viser værdien af et felt fra den nuværende side. Kan indstilles til at bruge rekursive værdier eller + vise en standardværdi i tilfælde af, at feltet er tomt. + + + Partial view + + Et Partial View er et skabelonelement, som kan indsættes i andre skabeloner og derved + genbruges og deles på tværs af sideskabelonerne. + + + Master skabelon + Ingen masterskabelon + Ingen master + + Indsæt en underliggende skabelon + + @RenderBody() element. + ]]> + + + + Definer en sektion + + @section { ... }. Herefter kan denne sektion flettes ind i + overliggende skabelon ved at indsætte et @RenderSection element. + ]]> + + + Indsæt en sektion + + @RenderSection(name) element. Den underliggende skabelon skal have + defineret en sektion via et @section [name]{ ... } element. + ]]> + + + Sektionsnavn + Sektionen er obligatorisk + + + Hvis obligatorisk, skal underskabelonen indeholde en @section -definition. + + + + Query builder + sider returneret, på + + Returner + alt indhold + indhold af typen "%0%" + + fra + mit website + hvor + og + + er + ikke er + er før + er før (inkl. valgte dato) + er efter + er efter (inkl. valgte dato) + er + ikke er + indeholder + ikke indeholder + er større end + er større end eller det samme som + er mindre end + er mindre end eller det samme som + + Id + Navn + Oprettelsesdato + Sidste opdatering + + Sortér efter + stigende rækkefølge + faldende rækkefølge + + Skabelon + + + + + Alternativt felt + Alternativ tekst + Casing + Felt som skal indsættes + Konvertér linieskift + Erstatter et linieskift med html-tag'et &lt;br&gt; + Ja, kun dato + Formatér som dato + HTML indkod + Vil erstatte specielle karakterer med deres HTML jævnbyrdige. + Denne tekst vil blive sat ind lige efter værdien af feltet + Denne tekst vil blive sat ind lige før værdien af feltet + Lowercase + Ingen + Indsæt efter felt + Indsæt før felt + Rekursivt + Standard felter + Uppercase + URL encode + Hvis indholdet af felterne skal sendes til en url, skal denne slåes til så specialtegn formateres + Denne tekst vil blive brugt hvis ovenstående felter er tomme + Dette felt vil blive brugt hvis ovenstående felt er tomt + Ja, med klokkeslæt. Dato/tid separator: + + + Opgaver tildelt dig + tildelt dig. For at se en mere detaljeret visning, klik "Detaljer" eller blot sidenavnet. Du kan også hente siden direkte som XML ved at klikke på "Download XML"-linket.
For at lukke en oversættelsesopgave, gå til detaljevisning og tryk på "Luk"-knappen.]]>
+ Luk opgave + Oversættelsesdetaljer + Download alle oversættelsesopgaver som XML + Download XML + Download XML DTD + Felter + Inkluder undersider + Hej %0%. Dette er en automatisk mail sendt for at informere dig om at dokumentet '%1' har en forespørgsel omkring oversættelse til '%5%' af %2%. Gå til http://%3%/translation/details.aspx?id=%4% for at redigere. Eller log ind i Umbraco for at få en oversigt over dine oversættelsesopgaver: http://%3%/Umbraco Hav en god dag! Mange hilsner Umbraco-robotten + [%0%] Oversættelsesopgave for %1% + Ingen oversættelsesbrugere er fundet. Opret venligst en oversættelsesbruger før du begynder at sende indhold til oversættelse + Opgaver oprettet af dig + oprettet af dig. For at se et detaljeret overblik indeholdende kommentarer, klik på "Detaljer" eller bare sidenavnet. Du kna også downloade siden som XML direkte ved at klikke på "Download XML"linket. Gå venligst til Detaljeoverblikket og klik på "Luk" knappen for at lukke en oversættelsesopgve.]]> + Siden '%0%' er blevet sent til oversættelse + Send siden '%0%' til oversættelse + Tildelt af + Opgave åbnet + Totalt antal ord + Oversæt til + Oversættelse gennemført. + Du kan gennemse de sider, som du lige har oversat, ved at klikke nedenfor. Hvis den originale side bliver fundet, vil du blive præsenteret for en sammenligning af de to sider. + Oversættelse fejlede, XML-filen kan være korrupt (indeholde fejl) + Oversættelsesmuligheder + Oversætter + Upload oversættelse (xml) + + + Cacheviser + Papirkurv + Oprettede pakker + Datatyper + Ordbog + Installerede pakker + Installér et skin + Installér et starterkit + Sprog + Installér lokal pakke + Makroer + Medietyper + Medlemmer + Medlemsgruppe + Roller + Medlemstype + Dokumenttyper + Relationstyper + Pakker + Pakker + Partial Views + Partial View Makro Filer + Python + Installer fra "repository" + Installer Runway + Runway-moduler + Scripting filer + Scripts + Stylesheets + Skabeloner + XSLT-filer + Analytics + + + Ny opdatering er klar + %0% er klar, klik her for at downloade + Ingen forbindelse til server + Der kunne ikke tjekkes for ny opdatering. Se trace for mere info. + + + Administrator + Kategorifelt + Skift dit kodeord + Nyt kodeord + Gentag dit nye kodeord + Du kan ændre dit kodeord, som giver dig adgang til Umbraco Back Office ved at udfylde formularen og klikke på knappen 'Skift dit kodeord' + Indholdskanal + Beskrivelsesfelt + Deaktivér bruger + Dokumenttype + Redaktør + Uddragsfelt + Sprog + Brugernavn + Startnode i mediearkivet + Moduler + Deaktivér adgang til Umbraco + Gammelt kodeord + Adgangskode + Nulstil kodeord + Dit kodeord er blevet ændret! + Bekræft venligst dit nye kodeord + Indtast dit nye kodeord + Nuværende kodeord + ugyldig nuværende kodeord + Dit nye kodeord må ikke være tomt! + Dit nye kodeord og dit bekræftede kodeord var ikke ens, forsøg venligst igen! + Det bekræftede kodeord matcher ikke det nye kodeord + Erstat underelement-rettigheder + Du ændrer i øjeblikket rettigheder for siderne: + Vælg sider for at ændre deres rettigheder + Søg alle 'børn' + Start node + Navn + Brugertilladelser + Brugertype + Brugertyper + Forfatter + Oversætter + Skift + Din profil + Din historik + Session udløber + + + Validation + Valider som email + Valider som tal + Valider som Url + ...eller indtast din egen validering + Feltet er påkrævet + + + Slå URL tracker fra + Slå URL tracker til + Original URL + Viderestillet til + Der er ikke lavet nogen viderestillinger + Når en udgivet side bliver omdøbt eller flyttet, vil en viderestilling automatisk blive lavet til den nye side. + Fjern + Er du sikker på at du vil fjerne viderestillingen fra '%0%' til '%1%'? + Viderestillings URL fjernet. + Fejl under fjernelse af viderestillings URL. + Er du sikker på at du vil slå URL trackeren fra? + URL tracker er nu slået fra. + Der opstod en fejl under forsøget på at slå URL trackeren fra, der findes mere information i logfilen. + URL tracker er nu slået fra. + Der opstod en fejl under forsøget på at slå URL trackeren til, der findes mere information i logfilen. + +
diff --git a/src/UmbracoUrlHandling/Umbraco/Config/Lang/de.xml b/src/UmbracoUrlHandling/Umbraco/Config/Lang/de.xml new file mode 100644 index 0000000..4c678d9 --- /dev/null +++ b/src/UmbracoUrlHandling/Umbraco/Config/Lang/de.xml @@ -0,0 +1,1033 @@ + + + + The Umbraco community + http://our.umbraco.org/documentation/Extending-Umbraco/Language-Files + + + Hostnamen verwalten + Protokoll + Durchsuchen + Dokumenttyp ändern + Kopieren + Erstellen + Paket erstellen + Löschen + Deaktivieren + Papierkorb leeren + Dokumenttyp exportieren + Dokumenttyp importieren + Paket importieren + 'Canvas'-Modus starten + Abmelden + Verschieben + Benachrichtigungen + Öffentlicher Zugriff + Veröffentlichen + Veröffentlichung zurücknehmen + Aktualisieren + Erneut veröffentlichen + Wiederherstellen + Berechtigungen + Zurücksetzen + Zur Veröffentlichung einreichen + Zur Übersetzung senden + Sortieren + Zur Veröffentlichung einreichen + Übersetzen + Aktualisieren + Standardwert + + + Erlaubnis verweigert. + Neue Domain hinzufügen + entfernen + Ungültiges Element. + Format der Domain ungültig. + Domain wurde bereits zugewiesen. + Sprache + Domain + Domain '%0%' hinzugefügt + Domain '%0%' entfernt + Die Domain '%0%' ist bereits zugeordnet + Domain '%0%' aktualisiert + Domains bearbeiten + Beispiel: example.com, www.example.com + Vererben + Kultur + Definiert die Kultureinstellung für untergeordnete Elemente dieses Elements oder vererbt vom übergeordneten Element. Wird auch auf das aktuelle Element angewendet, sofern auf tieferer Ebene keine Domain zugeordnet ist. + Domains + + + Ansicht für + + + Auswählen + Aktuellen Ordner auswählen + Etwas anderes machen + Fett + Ausrücken + Formularelement einfügen + Graphische Überschrift einfügen + HTML bearbeiten + Einrücken + Kursiv + Zentriert + Linksbündig + Rechtsbündig + Link einfügen + Anker einfügen + Aufzählung + Nummerierung + Makro einfügen + Abbildung einfügen + Datenbeziehungen bearbeiten + Zurück zur Liste + Speichern + Speichern und veröffentlichen + Speichern und zur Abnahme übergeben + Vorschau + Die Vorschaufunktion ist deaktiviert, da keine Vorlage zugewiesen ist + Stil auswählen + Stil anzeigen + Tabelle einfügen + + + Um den Typ des ausgewählten Dokuments zu ändern, wählen Sie bitte zunächst aus der Liste der an dieser Stelle erlaubten Dokumenttypen. + Im Anschluss bestätigen oder korrigieren Sie die Zuordnung der Eigenschaften und klicken Sie auf 'Speichern'. + Der Inhalt wurde neu veröffentlicht. + Derzeitige Eigenschaft + Derzeitiger Datentyp + Der Typ dieses Dokuments kann nicht geändert werden, da an dieser Stelle keine Alternativen zugelassen sind. Ein alternativer Dokumenttyp kann nur dann verwendet werden, wenn er unterhalb des diesem Dokument übergeordneten Elements angelegt werden darf. + Dokumenttyp geändert + Eigenschaften zuordnen + Dieser Eigenschaft zuordnen + Neue Vorlage + Neuer Typ + keiner + Inhalt + Neuen Dokumenttyp auswählen + Der Typ des ausgewählten Dokuments wurde erfolgreich zu [new type] geändert und die Eigenschaften wie folgend zugeordnet: + nach + Die Zuordnung der Eigenschaften kann nicht abgeschlossen werden, da mindestens eine Eigenschaft mehrfach zugeordnet werden soll. + Nur an dieser Stelle erlaubte Dokumenttypen werden angezeigt. + + + Ist veröffentlicht + Über dieses Dokument + Alias + (Wie würden Sie das Bild über das Telefon beschreiben?) + Alternative Links + Klicken, um das Dokument zu bearbeiten + Erstellt von + Ursprünglicher Autor + Aktualisiert von + Erstellt am + Erstellungszeitpunkt des Dokuments + Dokumenttyp + In Bearbeitung + Veröffentlichung aufheben am + Dieses Dokument wurde nach dem Veröffentlichen bearbeitet. + Dieses Dokument ist nicht veröffentlicht. + Zuletzt veröffentlicht + Diese Liste enthält keine Einträge. + Medientyp + Verweis auf Medienobjekt(e) + Mitgliedergruppe + Mitgliederrolle + Mitglieder-Typ + Kein Datum gewählt + Name des Dokument + Eigenschaften + Dieses Dokument ist veröffentlicht aber nicht sichtbar, da das übergeordnete Dokument '%0%' nicht publiziert ist + Ups! Dieses Dokument ist veröffentlicht aber nicht im internen Cache aufzufinden: Systemfehler. + Veröffentlichen + Publikationsstatus + Veröffentlichen am + Veröffentlichung widerrufen am + Datum entfernen + Sortierung abgeschlossen + Um die Dokumente zu sortieren, ziehen Sie sie einfach an die gewünschte Position. Sie können mehrere Zeilen markieren indem Sie die Umschalttaste ("Shift") oder die Steuerungstaste ("Strg") gedrückt halten + Statistiken + Titel (optional) + Alternativtext (optional) + Typ + Veröffentlichung widerrufen + Zuletzt bearbeitet am + Letzter Änderungszeitpunkt des Dokuments + Datei entfernen + Link zum Dokument + Mitglied der Gruppe(n) + Kein Mitglied der Gruppe(n) + Untergeordnete Elemente + Ziel + + + Für Upload klicken + Dateien hier fallen lassen ... + + + Neues Mitglied anlegen + Alle Mitglieder + + + An welcher Stellen wollen Sie das Element erstellen + Erstellen unter + Wählen Sie einen Namen und einen Typ + Es stehen keine erlaubten Dokumenttypen zur Verfügung. Sie müssen diese in den Einstellungen (unter "Dokumenttypen") aktivieren. + Es stehen keine erlaubten Medientypen zur Verfügung. Sie müssen diese in den Einstellungen (unter "Medientypen") aktivieren. + + + Website anzeigen + - Verstecken + Wenn Umbraco nicht geöffnet wurde, wurde möglicherweise das Pop-Up unterdrückt. + wurde in einem neuen Fenster geöffnet + Neu öffnen + Besuchen + Willkommen + + + Stay + Discard changes + You have unsaved changes + Are you sure you want to navigate away from this page? - you have unsaved changes + + + Done + + Deleted %0% item + Deleted %0% items + Deleted %0% out of %1% item + Deleted %0% out of %1% items + + Published %0% item + Published %0% items + Published %0% out of %1% item + Published %0% out of %1% items + + Unpublished %0% item + Unpublished %0% items + Unpublished %0% out of %1% item + Unpublished %0% out of %1% items + + Moved %0% item + Moved %0% items + Moved %0% out of %1% item + Moved %0% out of %1% items + + Copied %0% item + Copied %0% items + Copied %0% out of %1% item + Copied %0% out of %1% items + + + Name + Hostnamen verwalten + Fenster schließen + Sind Sie sicher? + Deaktivieren bestätigen + Löschen von %0% Element(en) bestätigen + Sind Sie sicher? + Sind Sie sicher? + Ausschneiden + Wörterbucheintrag bearbeiten + Sprache bearbeiten + Anker einfügen + Zeichen einfügen + Grafische Überschrift einfügen + Abbildung einfügen + Link einfügen + klicken um Macro hinzuzufügen + Tabelle einfügen + Zuletzt bearbeitet + Link + Anker: + Wenn lokale Links verwendet werden, füge ein "#" vor den Link ein + In einem neuen Fenster öffnen? + Macro Einstellungen + Dieses Makro enthält keine einstellbaren Eigenschaften. + Einfügen + Berechtigungen bearbeiten für + Der Papierkorb wird geleert. Bitte warten Sie und schließen Sie das Fenster erst, wenn der Vorgang abgeschlossen ist. + Der Papierkorb ist leer + Wenn Sie den Papierkorb leeren, werden die enthaltenen Elemente endgültig gelöscht. Dieser Vorgang kann nicht rückgängig gemacht werden. + Der Webservice von <a target='_blank' href='http://regexlib.com'>regexlib.com</a> ist zur Zeit nicht erreichbar. Bitte versuchen Sie es später erneut. + Finden Sie einen vorbereiteten regulären Ausdruck zur Validierung der Werte, die in dieses Feld eingegeben werden - zum Beispiel 'email, 'plz', 'url' oder ähnlich. + Macro entfernen + Pflichtfeld + Die Website-Index wurd neu erstellt + Der Zwischenspeicher der Website wurde aktualisiert und alle veröffentlichten Inhalte sind jetzt auf dem neuesten Stand. Bisher unveröffentliche Inhalte wurden dabei nicht veröffentlicht. + Der Zwischenspeicher der Website wird aktualisiert und der veröffentlichte Inhalt auf den neuesten Stand gebracht. Unveröffentlichte Inhalte bleiben dabei weiterhin unveröffentlicht. + Anzahl der Spalten + Anzahl der Zeilen + <strong>Legen Sie eine Platzhalter-ID fest.</strong> Anhand der festgelegten Platzhalter-ID können Sie Inhalte von untergeordneten Vorlagen in diese Vorlage integrieren, indem Sie das <code>&lt;asp:content /&gt;</code>-Element und die zugehörige Platzhalter-ID verwenden. + <strong>Wählen Sie eine Platzhalter-ID aus.</strong> Sie können nur unter den Platzhaltern der übergeordneten Vorlage wählen. + Für Originalgröße auf die Abbildung klicken + Element auswählen + Zwischenspeicher-Element anzeigen + + + Bearbeiten Sie nachfolgend die verschiedenen Sprachversionen für den Wörterbucheintrag '<em>%0%</em>'. <br/>Unter dem links angezeigten Menüpunkt 'Sprachen' können Sie weitere hinzufügen. + Name der Kultur + + + Benutzername eingeben + Kennwort eingeben + %0% benennen ... + Name angeben ... + Durchsuchen ... + Filtern ... + Tippen, um Tags hinzuzufügen (nach jedem Tag die Eingabetaste drücken) ... + Der Benutzername ist normalerweise Ihre E-Mail-Adresse + + + Auf oberster Ebene erlauben + Nur diese Dokumenttypen können auf oberster Ebene in Inhalte und Medien angelegt werden + Dokumenttypen, die unterhalb dieses Typs erlaubt sind + Zusammengesetzte Dokumenttypen + Erstellen + Registerkarte löschen + Beschreibung + Neue Registerkarte + Registerkarte + Illustration + Listenansicht aktivieren + Aktiviert eine durchsuch- und sortierbare Listendarstellung der untergeordneten Elemente anstelle diese in der Baumstruktur anzuzeigen + Aktuelle Listenansicht + Der Datentyp für die aktuelle Ansicht der Liste + Angepasste Listenansicht erstellen + Angepasste Listenansicht entfernen + + + Vorgabewert hinzufügen + Feldtyp in der Datenbank + Datentyp-GUID + Steuerelement zur Darstellung + Schaltflächen + Erweiterte Einstellungen aktivieren für + Kontextmenü aktivieren + Maximale Standardgröße für eingefügte Bilder + Verknüpfte Stylesheets + Beschriftung anzeigen + Breite und Höhe + + + Ihre Daten wurden gespeichert. Bevor Sie diese Seite jedoch veröffentlichen können, müssen Sie die folgenden Korrekturen vornehmen: + Der aktuelle Mitgliedschaftsanbieter erlaubt keine Kennwortänderung (EnablePasswordRetrieval muss auf "true" gesetzt sein) + '%0%' ist bereits vorhanden + Bitte prüfen und korrigieren: + Bitte prüfen und korrigieren: + Für das Kennwort ist eine Mindestlänge von %0% Zeichen vorgesehen, wovon mindestens %1% Sonderzeichen (nicht alphanumerisch) sein müssen + '%0%' muss eine Zahl sein + '%0%' (in Registerkarte '%1%') ist ein Pflichtfeld + '%0%' ist ein Pflichtfeld + '%0%' (in Registerkarte '%1%') hat ein falsches Format + '%0%' hat ein falsches Format + + + Dieser Dateityp wird durch die Systemeinstellungen blockiert + ACHTUNG! Obwohl CodeMirror in den Einstellungen aktiviert ist, bleibt das Modul wegen mangelnder Stabilität in Internet Explorer deaktiviert. + Bitte geben Sie die Bezeichnung und den Alias des neuen Dokumenttyps ein. + Es besteht ein Problem mit den Lese-/Schreibrechten auf eine Datei oder einen Ordner + Bitte geben Sie einen Titel ein + Bitte wählen Sie einen Typ + Soll die Abbildung wirklich über die Originalgröße hinaus vergrößert werden? + Fehler im Python-Skript + Das Python-Skript ist fehlerhaft und wurde daher nicht gespeichert. + Startelement gelöscht, bitte kontaktieren Sie den System-Administrator. + Bitte markieren Sie den gewünschten Text, bevor Sie einen Stil auswählen + Keine aktiven Stile vorhanden + Bitte platzieren Sie den Mauszeiger in die erste der zusammenzuführenden Zellen + Sie können keine Zelle trennen, die nicht zuvor aus mehreren zusammengeführt wurde. + Fehler im XSLT + Das XSLT ist fehlerhaft und wurde daher nicht gespeichert. + Es liegt ein Konfigurationsfehler beim Datentyp dieser Eigenschaft vor. Bitte prüfen Sie den Datentyp bzw. die Eigenschaft. + + + Info + Aktion + Aktionen + Hinzufügen + Alias + Sind Sie sicher? + Rahmen + von + Abbrechen + Zellabstand + Auswählen + Schließen + Fenster schließen + Kommentar + bestätigen + Seitenverhältnis beibehalten + Weiter + Kopieren + Erstellen + Datenbank + Datum + Standard + Löschen + Gelöscht + Löschen ... + Design + Abmessungen + nach unten + Herunterladen + Bearbeiten + Bearbeitet + Elemente + E-Mail + Fehler + Suche + Höhe + Hilfe + Symbol + Import + Innerer Abstand + Einfügen + installieren + Zentrieren + Sprache + Layout + Laden + Gesperrt + Anmelden + Abmelden + Abmelden + Makro + Verschieben + Mehr + Name + Neu + Weiter + Nein + von + Ok + Öffnen + oder + Kennwort + Pfad + Platzhalter-ID + Einen Moment bitte... + Zurück + Eigenschaften + E-Mail-Empfänger für die Formulardaten + Papierkorb + Verbleibend + Umbenennen + Erneuern + Pflichtangabe + Wiederholen + Berechtigungen + Suchen + Server + Anzeigen + Seite beim Senden anzeigen + Größe + Sortieren + Submit + Typ + Durchsuchen ... + nach oben + Aktualisieren + Update + Hochladen + URL + Benutzer + Benutzername + Wert + Ansicht + Willkommen ... + Breite + Ja + Ordner + Suchergebnisse + Reorder + I am done reordering + + + Hintergrundfarbe + Fett + Textfarbe + Schriftart + Text + + + Dokument + + + Mit dieser Datenbank kann leider keine Verbindung hergestellt werden. + Die "web.config"-Datei konnte nicht angepasst werden (Zugriffsrechte?). Bitte passen Sie die Verbindungszeichenfolge manuell an. + Die Datenbank ist erreichbar und wurde identifiziert als + Datenbank + Klicken Sie auf <strong>Installieren</strong>, um die Datenbank für Umbraco %0% einzurichten. + Die Datenbank wurde für Umbraco %0% konfiguriert. Klicken Sie auf <strong>weiter</strong>, um fortzufahren. + <p>Die angegebene Datenbank ist leider nicht erreichbar. Bitte prüfen Sie die Verbindungszeichenfolge ("Connection String") in der "web.config"-Datei.</p> +<p>Um fortzufahren, passen Sie bitte die "web.config"-Datei mit einem beliebigen Text-Editor an. Scrollen Sie dazu nach unten, fügen Sie die Verbindungszeichenfolge für die zuverbindende Datenbank als Eintrag "UmbracoDbDSN" hinzu und speichern Sie die Datei.</p> +<p>Klicken Sie nach erfolgter Anpassung auf <strong>Wiederholen</strong>.<br />Wenn Sie weitere technische Informationen benötigen, besuchen Sie <a href="http://our.Umbraco.org/wiki" target="_blank">The Umbraco documentation wiki</a>.</p> + + Um diesen Schritt abzuschließen, müssen Sie die notwendigen Informationen zur Datenbankverbindung angeben.<br />Bitte kontaktieren Sie Ihren Provider bzw. Server-Administrator für weitere Informationen. + + <p> + Bitte bestätigen Sie mit einem Klick auf <strong>Update</strong>, dass die Datenbank auf Umbraco %0% aktualisiert werden soll.</p> + <p> + Keine Sorge - Dabei werden keine Inhalte gelöscht und alles wird weiterhin funktionieren! + </p> + + Die Datenbank wurde auf die Version %0% aktualisiert. Klicken Sie auf <strong>weiter</strong>, um fortzufahren. + Die Datenbank ist fertig eingerichtet. Klicken Sie auf <strong>"weiter"</strong>, um mit der Einrichtung fortzufahren. + <strong>Das Kennwort des Standard-Benutzers muss geändert werden!</strong> + <strong>Der Standard-Benutzer wurde deaktiviert oder hat keinen Zugriff auf Umbraco.</strong></p><p>Es sind keine weiteren Aktionen notwendig. Klicken Sie auf <b>Weiter</b> um fortzufahren. + <strong>Das Kennwort des Standard-Benutzers wurde seit der Installation verändert.</strong></p><p>Es sind keine weiteren Aktionen notwendig. Klicken Sie auf <b>Weiter</b> um fortzufahren. + Das Kennwort wurde geändert! + <p> + Bei der Installation von Umbraco wurde ein Standard-Benutzer mit dem Login-Namen <strong>'admin'</strong> und dem Kennwort <strong>'default'</strong> erstellt. + <strong>WICHTIG:</strong> Das Kennwort sollte auf ein sicheres, eigenes Kennwort geändert werden. + </p> + <p> + Das Kennwort des Standard-Benutzers wird jetzt geprüft und im Anschluss werden eventuell notwendige Änderungen vorschlagen. + </p> + Schauen Sie sich die Einführungsvideos für einen schnellen und einfachen Start an. + Mit der Installation stimmen Sie der angezeigten Lizenz für diese Software zu. Bitte beachten Sie, dass diese Umbraco-Distribution aus zwei Lizenzen besteht. Einer freien Open-Source MIT-Lizenz für das Framework und der Umbraco-Freeware-Lizenz für die Verwaltungsoberfläche. + Noch nicht installiert. + Betroffene Verzeichnisse und Dateien + Weitere Informationen zum Thema "Dateiberechtigungen" für Umbraco + Für die folgenden Dateien und Verzeichnisse müssen ASP.NET-Schreibberechtigungen gesetzt werden + <strong>Die Dateiberechtigungen sind fast perfekt eingestellt!</strong><br /><br />Damit können Sie Umbraco ohne Probleme verwenden, werden aber viele Erweiterungspakete können nicht installiert werden. + Problemlösung + Klicken Sie hier, um den technischen Artikel zu lesen + Schauen Sie sich die <strong>Video-Lehrgänge</strong> zum Thema Verzeichnisberechtigungen für Umbraco an oder lesen Sie den technischen Artikel. + <strong>Die Dateiberechtigungen sind möglicherweise fehlerhaft!</strong>Sie können Umbraco vermutlich ohne Probleme verwenden, werden aber viele Erweiterungspakete können nicht installiert werden. + <strong>Die Dateiberechtigungen sind nicht geeignet!</strong><br /><br />Die Dateiberechtigungen müssen angepasst werden. + <strong>Die Dateiberechtigungen sind perfekt eingestellt!</strong><br /><br /> Damit ist Umbraco komplett eingerichtet und es können problemlos Erweiterungspakete installiert werden. + Verzeichnisprobleme lösen + Folgen Sie diesem Link für weitere Informationen zum Thema ASP.NET und der Erstellung von Verzeichnissen. + Verzeichnisberechtigungen anpassen + Umbraco benötigt Schreibrechte auf verschiedene Verzeichnisse, um Dateien wie Bilder oder PDF-Dokumente speichern zu können. Außerdem werden temporäre Daten zur Leistungssteigerung der Website angelegt. + Ich möchte mit einem leeren System ohne Inhalte und Vorgaben starten + + Die Website ist zur Zeit komplett leer und ohne Inhalte und Vorgaben zu Erstellung eigener Dokumenttypen und Vorlagen bereit. + (<a href="http://Umbraco.tv/documentation/videos/for-site-builders/foundation/document-types">So geht's</a>) + Sie können "Runway" auch jederzeit später installieren. Verwenden Sie hierzu den Punkt "Pakete" im Entwickler-Bereich. + + Die Einrichtung von Umbraco ist abgeschlossen und das Content-Management-System steht bereit. Wie soll es weitergehen? + 'Runway' wurde installiert + +Die Basis ist eingerichtet. Wählen Sie die Module aus, die Sie nun installieren möchten.<br /> +Dies sind unsere empfohlenen Module. Schauen Sie sich die an, die Sie installieren möchten oder Sie sich die <a href="#" onclick="toggleModules(); return false;" id="toggleModuleList">komplette Liste der Module an.</a> + + Nur für erfahrene Benutzer empfohlen + Ich möchte mit einer einfache Website starten + +<p> +"Runway" ist eine einfache Website mit einfachen Dokumententypen und Vorlagen. Der Installer kann Runway automatisch einrichten, +aber es kann einfach verändert, erweitert oder entfernt werden. Es ist nicht zwingend notwendig und Umbraco kann auch ohne Runway verwendet werden. +Runway bietet eine einfache Basis zum schnellen Start mit Umbraco. +Wenn Sie sich für Runway entscheiden, können Sie optional Blöcke nutzen, die "Runway Modules" und Ihre Runway-Seite erweitern. +</p> +<small> +<em>Runway umfasst:</em> Home page, Getting Started page, Installing Modules page.<br /> +<em>Optionale Module:</em> Top Navigation, Sitemap, Contact, Gallery. +</small> + + Was ist 'Runway'? + Schritt 1/5 Lizenz + Schritt 2/5: Datenbank + Schritt 3/5: Dateiberechtigungen + Schritt 4/5: Sicherheit + Schritt 5/5: Umbraco ist startklar! + Vielen Dank, dass Sie Umbraco installieren! + <h3>Zur neuen Seite</h3>Sie haben Runway installiert, schauen Sie sich doch mal auf Ihrer Website um. + <h3>Weitere Hilfe und Informationen</h3>Hilfe von unserer preisgekrönten Community, Dokumentation und kostenfreie Videos, wie Sie eine einfache Website erstellen, ein Packages nutzen und eine schnelle Einführung in alle Umbraco-Begriffe + Umbraco %0% wurde installiert und kann verwendet werden + Um die Installation abzuschließen, müssen Sie die <strong>"web.config"-Datei</strong> von Hand anpassen und den AppSetting-Schlüssel <strong>UmbracoConfigurationStatus</strong> auf den Wert <strong>'%0%'</strong> ändern. + Sie können <strong>sofort starten</strong>, in dem Sie auf "Umbraco starten" klicken. + <h3>Umbraco starten</h3>Um Ihre Website zu verwalten, öffnen Sie einfach den Administrationsbereich und beginnen Sie damit, Inhalte hinzuzufügen sowie Vorlagen und Stylesheets zu bearbeiten oder neue Funktionen einzurichten + Verbindung zur Datenbank fehlgeschlagen. + Umbraco Version 3 + Umbraco Version 4 + Anschauen + Dieser Assistent führt Sie durch die Einrichtung einer neuen Installation von <strong>Umbraco %0%</strong> oder einem Upgrade von Version 3.0.<br /><br />Klicken Sie auf <strong>weiter</strong>, um zu beginnen. + + + Code der Kultur + Name der Kultur + + + Sie haben keine Tätigkeiten mehr durchgeführt und werden automatisch abgemeldet in + Erneuern Sie, um Ihre Arbeit zu speichern ... + + + Einen wunderbaren Sonntag + Schönen Montag + Einen großartigen Dienstag + Wunderbaren Mittwoch + Donnerwetter Donnerstag + Frohen freundlichen Freitag + Wunderbaren sonnigen Samstag + Hier anmelden: + Anmelden mit + Sitzung abgelaufen + <p style="text-align:right;">&copy; 2001 - %0% <br /><a href="http://umbraco.com" style="text-decoration: none" target="_blank">umbraco.org</a></p> + + + Dashboard + Bereiche + Inhalt + + + Bitte Element auswählen ... + %0% wurde nach %1% kopiert + Bitte wählen Sie, wohin das Element %0% kopiert werden soll: + %0% wurde nach %1% verschoben + Bitte wählen Sie, wohin das Element %0% verschoben werden soll: + wurde als das Ziel ausgewählt. Bestätigen mit 'Ok'. + Es ist noch kein Element ausgewählt. Bitte wählen Sie ein Element aus der Liste aus, bevor Sie fortfahren. + Das aktuelle Element kann aufgrund seines Dokumenttyps nicht an diese Stelle verschoben werden. + Das ausgewählte Element kann nicht zu einem seiner eigenen Unterelemente verschoben werden. + Dieses Element kann nicht auf der obersten Ebene platziert werden. + Diese Aktion ist nicht erlaubt, da Sie unzureichende Berechtigungen für mindestens ein untergeordnetes Element haben. + Kopierte Elemente mit dem Original verknüpfen + + + Bearbeiten Sie Ihre Benachrichtigungseinstellungen für '%0%' + + Hallo %0%, + + die Aufgabe '%1%' (von Benutzer '%3%') an der Seite '%2%' wurde ausgeführt. + + Zum Bearbeiten verwenden Sie bitte diesen Link: http://%4%/#/content/content/edit/%5% + + Einen schönen Tag wünscht + Ihr freundlicher Umbraco-Robot + + +Hallo %0%

+

Dies ist eine automatisch E-Mail, welche Sie informiert, dass die Aufgabe '%1%' + an der Seite '%2%' + vom Benutzer '%3%' ausgeführt wurde. +

+ +

+

Zusammenfassung der Aktualisierung:

+ + %6% +
+

+ + + +

Einen schönen Tag wünscht

+ Ihr freundlicher Umbraco-Robot +

+]]> +
+ [%0%] Benachrichtigung: %1% ausgeführt an Seite '%2%' + Benachrichtigungen + + + Wählen Sie ein Paket auf Ihrem lokalen Computer über "Datei auswählen" aus. <br />Umbraco-Pakete besitzen üblicherweise die Dateiendungen ".umb" oder ".zip". + Autor + Demonstration + Dokumentation + Paket-Meta-Daten + Name des Pakets + Paket enthält keine Elemente + Die Paket-Datei enthält keine Elemente die deinstalliert werden können.<br/><br/>Sie können das Paket ohne Gefahr deinstallieren indem Sie "Paket deinstallieren" anklicken. + Keine Updates für das Paket verfügbar + Paket-Optionen + Informationen zum Paket + Paket-Repository + Deinstallation bestätigen + Paket wurde deinstalliert + Das Paket wurde erfolgreich deinstalliert + Paket deinstallieren + Sie können einzelne Elemente, die Sie nicht deinstallieren möchten, unten abwählen. Wenn Sie "Deinstallation bestätigen" klicken, werden alle markierten Elemente entfernt.<br /><span style="color: Red; font-weight: bold;">Achtung:</span> alle Dokumente, Medien, etc, die von den zu entfernenden Elementen abhängen, werden nicht mehr funktionieren und im Zweifelsfall kann dass gesamte CMS instabil werden. Bitte deinstallieren Sie also mit Vorsicht. Falls Sie unsicher sind, kontaktieren Sie den Autor des Pakets. + Update vom Paket-Repository herunterladen + Paket-Update + Hinweise für die Durchführung des Updates + Es ist ein Update für dieses Paket verfügbar. Sie können es direkt vom Umbraco-Paket-Repository herunterladen. + Version des Pakets + Versionsverlauf des Pakets + Paket-Webseite aufrufen + + + Einfügen mit Formatierung (Nicht empfohlen) + Der Text, den Sie einfügen möchten, enthält Sonderzeichen oder spezielle Formatierungen. Dies kann zum Beispiel beim Kopieren aus Microsoft Word heraus passieren. Umbraco kann Sonderzeichen und spezielle Formatierungen automatisch entfernen, damit der eingefügte Inhalt besser für die Veröffentlichung im Web geeignet ist. + Als reinen Text ohne jede Formatierung einfügen + Einfügen, aber Formatierung bereinigen (Empfohlen) + + + Rollenbasierter Zugriffschutz + Wenn Sie rollenbasierte Authentifikation mit Umbraco-Mitgliedsgruppen verwenden wollen. + Sie müssen zuerst eine Mitgliedsgruppe erstellen, bevor derrollenbasierte Zugriffschutz aktiviert werden kann. + Fehlerseite + Seite mit Fehlermeldung (Benutzer-Login erfolgt, aber keinen Zugriff auf die aufgerufene Seite erlaubt) + Bitte wählen Sie, auf welche Art der Zugriff auf diese Seite geschützt werden soll + %0% ist nun zugriffsgeschützt + Zugriffsschutz von %0% entfernt + Login-Seite + Seite mit Login-Formular + Zugriffsschutz entfernen + Auswahl der Seiten, die das Login-Formular und die Fehlermeldung enthalten + Auswahl der Benutzerrollen, die Zugriff haben sollen + Kennwort und Login für diese Seite setzen + Zugriffsschutz durch einzelnen Benutzerzugang + Wenn Sie einen einfachen Zugriffsschutz unter Verwendung eines einzelnen Logins mit Kennwort aktivieren wollen + + + %0% kann nicht veröffentlicht werden, da die Veröffentlichung zeitlich geplant ist. + %0% konnte nicht veröffentlicht werden, da einige Daten die Gültigkeitsprüfung nicht bestanden haben. + %0% konnte nicht veröffentlicht werden, da ein Plug-In die Aktion abgebrochen hat. + %0% kann nicht veröffentlicht werden, da das übergeordnete Dokument nicht veröffentlicht ist. + Unveröffentlichte Unterelemente einschließen + Bitte warten, Veröffentlichung läuft... + %0% Elemente veröffentlicht, %1% Elemente ausstehend ... + %0% wurde veröffentlicht + %0% und die untergeordneten Elemente wurden veröffentlicht + %0% und alle untergeordneten Elemente veröffentlichen + Mit <em>Ok</em> wird <strong>%0%</strong> veröffentlicht und auf der Website sichtbar.<br/><br />Sie können dieses Element mitsamt seinen untergeordneten Elementen veröffentlichen, indem Sie <em>Unveröffentlichte Unterelemente einschließen</em> aktivieren. + + + Sie haben keine freigegeben Farben konfiguriert + + + Externen Link eingeben + Internen Link auswählen + Beschriftung + Link + In neuem Fenster öffnen + Bezeichnung eingeben + Link eingeben + + + Zurücksetzen + + + Aktuelle Version + Zeigt die Unterschiede zwischen der aktuellen und der ausgewählten Version an.<br />Text in <del>rot</del> fehlen in der ausgewählten Version, <ins>grün</ins> markierter Text wurde hinzugefügt. + Dokument wurde zurückgesetzt + Zeigt die ausgewählte Version als HTML an. Wenn Sie sich die Unterschiede zwischen zwei Versionen anzeigen lassen wollen, benutzen Sie bitte die Vergleichsansicht. + Zurücksetzen auf + Version auswählen + Ansicht + + + Skript bearbeiten + + + Umbraco Concierge + Inhalte + Umbraco Courier + Entwickler + Konfigurationsassistent + Medien + Mitglieder + Newsletter + Einstellungen + Statistiken + Übersetzung + Benutzer + Hilfe + Formulare + Auswertungen + + + go to + Hilfethemen zu + Video-Tutorials für + Die besten Umbraco-Video-Tutorials + + + Standardvorlage + Wörterbuch-Schlüsselwort + Wählen Sie die lokale .udt-Datei aus, die den zu importierenden Dokumenttyp enthält und fahren Sie mit dem Import fort. Die endgültige Übernahme erfolgt im Anschluss erst nach einer weiteren Bestätigung. + Beschriftung der neuen Registerkarte + Elementtyp + Typ + Stylesheet + Skript + Stylesheet-Eigenschaft + Registerkarte + Registerkartenbeschriftung + Registerkarten + Masterdokumenttyp aktiviert + Dieser Dokumenttyp verwendet + als Masterdokumenttyp. Register vom Masterdokumenttyp werden nicht angezeigt und können nur im Masterdokumenttyp selbst bearbeitet werden + Für dieses Register sind keine Eigenschaften definiert. Klicken Sie oben auf "neue Eigenschaft hinzufügen", um eine neue Eigenschaft hinzuzufügen. + Masterdokumenttyp + Zugehörige Vorlage anlegen + + + Sortierreihenfolge + Erstellungsdatum + Sortierung abgeschlossen. + Ziehen Sie die Elemente an ihre gewünschte neue Position. + Bitte warten, die Seiten werden sortiert. Das kann einen Moment dauern. Bitte schließen Sie dieses Fenster nicht, bis der Sortiervorgang abgeschlossen ist. + + + Fehlgeschlagen + Unzureichende Benutzerberechtigungen. Vorgang kann nicht abgeschlossen werden. + Abgebrochen + Vorgang wurde durch eine benutzerdefinierte Erweiterung abgebrochen + Das Veröffentlichen wurde von einem individuellen Ereignishandler abgebrochen + Eigenschaft existiert bereits + Eigenschaft erstellt + Name: %0% Datentyp: %1% + Eigenschaft gelöscht + Dokumenttyp gespeichert + Registerkarte erstellt + Registerkarte gelöscht + Registerkarte %0% gelöscht + Stylesheet wurde nicht gespeichert + Stylesheet gespeichert + Stylesheet erfolgreich gespeichert + Datentyp gespeichert + Wörterbucheintrag gespeichert + Veröffentlichung nicht möglich, da das übergeordnete Dokument nicht veröffentlicht ist. + Inhalte veröffentlicht + Sichtbar auf der Webseite + Inhalte gespeichert + Denken Sie daran, die Inhalte zu veröffentlichen, um die Änderungen sichtbar zu machen + Zur Abnahme eingereicht + Die Änderungen wurden zur Abnahme eingereicht + Medium gespeichert + Medium fehlerfrei gespeichert + Mitglied gespeichert + Stylesheet-Regel gespeichert + Stylesheet gespeichert + Vorlage gespeichert + Fehler beim Speichern des Benutzers. + Benutzer gespeichert + Benutzertyp gepsichert + Datei wurde nicht gespeichert + Datei konnte nicht gespeichert werden. Bitte überprüfen Sie die Schreibrechte auf Dateiebene. + Datei gespeichert + Datei erfolgreich gespeichert + Sprache gespeichert + Python-Skript nicht gespeichert + Das Python-Skript enthält Fehler + Python-Skript gespeichert + Keine Fehler im Python-Skript + Vorlage wurde nicht gespeichert + Bitte prüfen Sie, ob möglicherweise zwei Vorlagen den gleichen Alias verwenden. + Vorlage gespeichert + Vorlage erfolgreich gespeichert! + XSLT nicht gespeichert + Das XSLT enthält Fehler + XSLT kann nicht gespeichert werden. Bitte überprüfen Sie die Schreibrechte auf Dateiebene. + XSLT gespeichert + Keine Fehler im XSLT + Veröffentlichung des Inhalts aufgehoben + Partielle Ansicht gespeichert + Partielle Ansicht ohne Fehler gespeichert. + Partielle Ansicht nicht gespeichert + Fehler beim Speichern der Datei. + Skript gespeichert + Skript fehlerfrei gespeichert! + Skript nicht gespeichert + Fehler beim Speichern der Datei. + Fehler beim Speichern der Datei. + + + Gewünschter CSS-Selektor, zum Beispiel 'h1', '.bigHeader' oder 'p.infoText' + Stylesheet bearbeiten + Stylesheet-Regel bearbeiten + Bezeichnung im Auswahlmenü des Rich-Text-Editors + Vorschau + Stile + + + Vorlage bearbeiten + Platzhalter-Bereich verwenden + Platzhalter einfügen + Wörterbucheintrag einfügen + Makro einfügen + Umbraco-Feld einfügen + Mastervorlage + Schnellübersicht zu den verfügbaren Umbraco-Feldern + Vorlage + + + Element hinzufügen + Zeilenlayout auswählen + Element mit <i class="icon icon-add blue"></i> hinzufügen + Drop content + Klicken, um Inhalt einzubetten + Klicken, um Abbildung einzufügen + Beschriftung ... + Hier schreiben ... + Layouts + Layouts sind die grundlegenden Arbeitsflächen für das Gestaltungsraster. Üblicherweise sind nicht mehr als ein oder zwei Layouts nötig. + Layout hinzufügen + Passen Sie das Layout an, indem Sie die Spaltenbreiten einstellen und Abschnitte hinzufügen. + Einstellungen für das Zeilenlayout + Zeilen sind vordefinierte horizontale Zellenanordnungen + Zeilenlayout hinzufügen + Pasen Sie das Zeilenlayout an, indem Sie die Zellenbreite einstellen und Zellen hinzufügen. + Spalten + Insgesamte Spaltenanzahl im Layout + Einstellungen + Legen Sie fest, welche Einstellungen die Autoren anpassen können. + CSS-Stile + Legen Sie fest, welche Stile die Autoren anpassen können. + Die Einstellungen werden nur gespeichert, wenn die angegebene JSON-Konfiguration gültig ist. + Alle Elemente erlauben + Alle Zeilenlayouts erlauben + + + Alternatives Feld + Alternativer Text + Groß- und Kleinschreibung + Kodierung + Feld auswählen + Zeilenumbrüche ersetzen + Ersetzt Zeilenumbrüche durch das HTML-Tag <br /> + Benutzerdefinierte Felder + nur Datum + Als Datum formatieren + HTML kodieren + Wandelt Sonderzeichen in HTML-Zeichencodes um + Wird nach dem Feldinhalt eingefügt + Wird vor dem Feldinhalt eingefügt + Kleinbuchstaben + Keine + An den Feldinhalt anhängen + Dem Feldinhalt voranstellen + Rekursiv + Standardfelder + Großbuchstaben + URL kodieren + Wandelt Sonderzeichen zur Verwendung in URLs um + Wird nur verwendet, wenn beide vorgenannten Felder leer sind + Dieses Feld wird nur verwendet, wenn das primäre Feld leer ist + Datum und Zeit mit Trennzeichen: + + + Ihre Aufgaben + Die Liste unten zeigt <strong>ihre</strong> Übersetzungsaufträge. Um eine ausführliche Liste mit Kommentaren zu sehen, klicken Sie auf "Details" oder einfach auf den Seitennamen. Sie können die Seite auch direkt als XML herunterladen, indem Sie den Link "XML herunterladen" anklicken. <br/>Um eine Übersetzung abzuschließen, gehen Sie bitte auf die Detailansicht und klicken Sie auf "Aufgabe abschließen". + Aufgabe abschließen + Details zur Übersetzung + Alle Übersetzungsaufgaben als XML-Datei herunterladen + XML herunterladen + Herunterladen der XML-Defintionen (XML-DTD) + Felder + Einschließlich der Unterseiten + +Hallo %0%, + +das Dokument '%1%' wurde von '%2%' zur Übersetzung in '%5%' freigegeben. + +Zum Bearbeiten verwenden Sie bitte diesen Link: http://%3%/translation/details.aspx?id=%4%. + +Sie können sich auch alle anstehenden Übersetzungen gesammelt im Umbraco-Verwaltungsbereich anzeigen lassen: http://%3%/Umbraco.aspx + +Einen schönen Tag wünscht +Ihr freundlicher Umbraco-Robot + + [%0%] Aufgabe zur Übersetzung von '%1%' + Bitte erstellen Sie zuerst mindestens einen Übersetzer. + Von Ihnen erstellte Aufgaben + Die Liste unten zeigt die von <strong>Ihnen</strong> erstellten Seiten. Um eine ausführliche Liste mit Kommentaren zu sehen, klicken Sie auf "Details" oder einfach auf den Seitennamen. Sie können die Seite auch direkt als XML herunterladen, indem Sie den Link "XML herunterladen" anklicken. Um eine Übersetzung abzuschließen, gehen Sie bitte auf die Detailansicht und klicken Sie auf "Aufgabe abschließen". + Die Seite '%0%' wurde zur Übersetzung gesendet + Sendet die Seite '%0%' zur Übersetzung + Zugewiesen von + Aufgabe aktiviert + Anzahl der Wörter + Übersetzen in + Übersetzung abgeschlossen. + Sie können eine Vorschau der Seiten anzeigen, die Sie gerade übersetzt haben, indem Sie sie unten anklicken. Wenn die Originalseite zugeordnet werden kann, erhalten Sie einen Vergleich der beiden Seiten angezeigt. + Übersetzung fehlgeschlagen, die XML-Datei könnte beschädigt oder falsch formatiert sein + Übersetzungsoptionen + Übersetzer + Hochladen der XML-Übersetzungsdatei + + + Zwischenspeicher + Papierkorb + Erstellte Pakete + Datentypen + Wörterbuch + Installierte Pakete + Design-Skin installieren + Starter-Kit installieren + Sprachen + Lokales Paket hochladen und installieren + Makros + Medientypen + Mitglieder + Mitgliedergruppen + Mitgliederrollen + Mitglieder-Typen + Dokumententypen + Pakete + Pakete + Python-Dateien + Paket-Repositories + 'Runway' installieren + Runway-Module + Server-Skripte + Client-Skripte + Stylesheets + Vorlagen + XSLT-Dateien + Auswertungen + + + Neues Update verfügbar + %0% verfügbar, hier klicken zum Herunterladen + Keine Verbindung zum Update-Server + Fehler beim Überprüfen der Updates. Weitere Informationen finden Sie im Stacktrace. + + + Administrator + Feld für Kategorie + Kennwort ändern + Neues Kennwort + Neues Kennwort (Bestätigung) + Sie können Ihr Kennwort für den Zugriff auf den Umbraco-Verwaltungsbereich ändern, indem Sie das nachfolgende Formular ausfüllen und auf 'Kennwort ändern' klicken + Schnittstelle für externe Editoren + Feld für Beschreibung + Benutzer endgültig deaktivieren + Dokumenttyp + Editor + Feld für Textausschnitt + Sprache + Login + Startelement in der Medienbibliothek + Freigegebene Bereiche + Zugang sperren + Kennwort + Kennwort zurücksetzen + Ihr Kennwort wurde geändert! + Bitte bestätigen Sie das neue Kennwort + Geben Sie Ihr neues Kennwort ein + Ihr neues Kennwort darf nicht leer sein! + Aktuelles Kennwort + Aktuelles Kennwort falsch + Ihr neues Kennwort und die Wiederholung Ihres neuen Kennworts stimmen nicht überein. Bitte versuchen Sie es erneut! + Die Bestätigung Ihres Kennworts stimmt nicht mit dem angegebenen neuen Kennwort überein! + Die Berechtigungen der untergeordneten Elemente ersetzen + Die Berechtigungen für folgende Seiten werden angepasst: + Dokumente auswählen, um deren Berechtigungen zu ändern + Auch untergeordnete Elemente + Startelement in den Inhalten + Benutzername + Berechtigungen + Rolle + Rollen + Autor + Übersetzer + Ihr Profil + Ihr Verlauf + Sitzung läuft ab in + +
diff --git a/src/UmbracoUrlHandling/Umbraco/Config/Lang/en.xml b/src/UmbracoUrlHandling/Umbraco/Config/Lang/en.xml new file mode 100644 index 0000000..4b6df77 --- /dev/null +++ b/src/UmbracoUrlHandling/Umbraco/Config/Lang/en.xml @@ -0,0 +1,1630 @@ + + + + The Umbraco community + http://our.umbraco.org/documentation/Extending-Umbraco/Language-Files + + + Culture and Hostnames + Audit Trail + Browse Node + Change Document Type + Copy + Create + Create Package + Delete + Disable + Empty recycle bin + Export Document Type + Import Document Type + Import Package + Edit in Canvas + Exit + Move + Notifications + Public access + Publish + Unpublish + Reload + Republish entire site + Restore + Set permissions for the page %0% + Choose where to move + to in the tree structure below + Permissions + Rollback + Send To Publish + Send To Translation + Sort + Send to publication + Translate + Update + Default value + + + Permission denied. + Add new Domain + remove + Invalid node. + Invalid domain format. + Domain has already been assigned. + Language + Domain + New domain '%0%' has been created + Domain '%0%' is deleted + Domain '%0%' has already been assigned + Domain '%0%' has been updated + Edit Current Domains + + Inherit + Culture + or inherit culture from parent nodes. Will also apply
+ to the current node, unless a domain below applies too.]]>
+ Domains + + + Viewing for + + + Clear selection + Select + Select current folder + Do something else + Bold + Cancel Paragraph Indent + Insert form field + Insert graphic headline + Edit Html + Indent Paragraph + Italic + Center + Justify Left + Justify Right + Insert Link + Insert local link (anchor) + Bullet List + Numeric List + Insert macro + Insert picture + Edit relations + Return to list + Save + Save and publish + Save and send for approval + Save list view + Preview + Preview is disabled because there's no template assigned + Choose style + Show styles + Insert table + Generate models + Undo + Redo + + + To change the document type for the selected content, first select from the list of valid types for this location. + Then confirm and/or amend the mapping of properties from the current type to the new, and click Save. + The content has been re-published. + Current Property + Current type + The document type cannot be changed, as there are no alternatives valid for this location. An alternative will be valid if it is allowed under the parent of the selected content item and that all existing child content items are allowed to be created under it. + Document Type Changed + Map Properties + Map to Property + New Template + New Type + none + Content + Select New Document Type + The document type of the selected content has been successfully changed to [new type] and the following properties mapped: + to + Could not complete property mapping as one or more properties have more than one mapping defined. + Only alternate types valid for the current location are displayed. + + + Is Published + About this page + Alias + (how would you describe the picture over the phone) + Alternative Links + Click to edit this item + Created by + Original author + Updated by + Created + Date/time this document was created + Document Type + Editing + Remove at + This item has been changed after publication + This item is not published + Last published + There are no items to show + There are no items to show in the list. + Media Type + Link to media item(s) + Member Group + Role + Member Type + No date chosen + Link title + Properties + This document is published but is not visible because the parent '%0%' is unpublished + This document is published but is not in the cache + Could not get the url + This document is published but its url would collide with content %0% + Publish + Publication Status + Publish at + Unpublish at + Clear Date + Sortorder is updated + To sort the nodes, simply drag the nodes or click one of the column headers. You can select multiple nodes by holding the "shift" or "control" key while selecting + Statistics + Title (optional) + Alternative text (optional) + Type + Unpublish + Last edited + Date/time this document was edited + Remove file(s) + Link to document + Member of group(s) + Not a member of group(s) + Child items + Target + This translates to the following time on the server: + What does this mean?]]> + Add another text box + Remove this text box + + + Click to upload + Drop your files here... + Link to media + or click here to choose files + Only allowed file types are + Max file size is + + + Create a new member + All Members + + + Where do you want to create the new %0% + Create an item under + Choose a type and a title + "document types".]]> + "media types".]]> + Document Type without a template + New folder + New data type + New javascript file + New empty partial view + New partial view macro + New partial view from snippet + New empty partial view macro + New partial view macro from snippet + New partial view macro (without macro) + + + Browse your website + - Hide + If Umbraco isn't opening, you might need to allow popups from this site + has opened in a new window + Restart + Visit + Welcome + + + Stay + Discard changes + You have unsaved changes + Are you sure you want to navigate away from this page? - you have unsaved changes + + + Done + + Deleted %0% item + Deleted %0% items + Deleted %0% out of %1% item + Deleted %0% out of %1% items + + Published %0% item + Published %0% items + Published %0% out of %1% item + Published %0% out of %1% items + + Unpublished %0% item + Unpublished %0% items + Unpublished %0% out of %1% item + Unpublished %0% out of %1% items + + Moved %0% item + Moved %0% items + Moved %0% out of %1% item + Moved %0% out of %1% items + + Copied %0% item + Copied %0% items + Copied %0% out of %1% item + Copied %0% out of %1% items + + + Name + Manage hostnames + Close this window + Are you sure you want to delete + Are you sure you want to disable + Please check this box to confirm deletion of %0% item(s) + Are you sure? + Are you sure? + Cut + Edit Dictionary Item + Edit Language + Insert local link + Insert character + Insert graphic headline + Insert picture + Insert link + Click to add a Macro + Insert table + Last Edited + Link + Internal link: + When using local links, insert "#" in front of link + Open in new window? + Macro Settings + This macro does not contain any properties you can edit + Paste + Edit Permissions for + The items in the recycle bin are now being deleted. Please do not close this window while this operation takes place + The recycle bin is now empty + When items are deleted from the recycle bin, they will be gone forever + regexlib.com's webservice is currently experiencing some problems, which we have no control over. We are very sorry for this inconvenience.]]> + Search for a regular expression to add validation to a form field. Example: 'email, 'zip-code' 'url' + Remove Macro + Required Field + Site is reindexed + The website cache has been refreshed. All publish content is now up to date. While all unpublished content is still unpublished + The website cache will be refreshed. All published content will be updated, while unpublished content will stay unpublished. + Number of columns + Number of rows + Set a placeholder id by setting an ID on your placeholder you can inject content into this template from child templates, + by referring this ID using a <asp:content /> element.]]> + Select a placeholder id from the list below. You can only + choose Id's from the current template's master.]]> + Click on the image to see full size + Pick item + View Cache Item + Create folder... + Relate to original + Include descendants + The friendliest community + Link to page + Opens the linked document in a new window or tab + Link to media + Link to file + Select media + Select icon + Select item + Select link + Select macro + Select content + Select member + Select member group + No icons were found + There are no parameters for this macro + There are no macros available to insert + External login providers + Exception Details + Stacktrace + Inner Exception + Link your + Un-link your + account + Select editor + Select snippet + + + %0%' below
You can add additional languages under the 'languages' in the menu on the left + ]]>
+ Culture Name + Edit the key of the dictionary item. + + + + + + Enter your username + Enter your password + Confirm your password + Name the %0%... + Enter a name... + Label... + Enter a description... + Type to search... + Type to filter... + Type to add tags (press enter after each tag)... + Enter your email + Your username is usually your email + + + Allow at root + Only Content Types with this checked can be created at the root level of Content and Media trees + Allowed child node types + Document Type Compositions + Create + Delete tab + Description + New tab + Tab + Thumbnail + Enable list view + Configures the content item to show a sortable & searchable list of its children, the children will not be shown in the tree + Current list view + The active list view data type + Create custom list view + Remove custom list view + + + Add prevalue + Database datatype + Property editor GUID + Property editor + Buttons + Enable advanced settings for + Enable context menu + Maximum default size of inserted images + Related stylesheets + Show label + Width and height + All property types & property data + using this data type will be deleted permanently, please confirm you want to delete these as well + Yes, delete + and all property types & property data using this data type + Select the folder to move + to in the tree structure below + was moved underneath + + + Your data has been saved, but before you can publish this page there are some errors you need to fix first: + The current membership provider does not support changing password (EnablePasswordRetrieval need to be true) + %0% already exists + There were errors: + There were errors: + The password should be a minimum of %0% characters long and contain at least %1% non-alpha numeric character(s) + %0% must be an integer + The %0% field in the %1% tab is mandatory + %0% is a mandatory field + %0% at %1% is not in a correct format + %0% is not in a correct format + + + Received an error from the server + The specified file type has been disallowed by the administrator + NOTE! Even though CodeMirror is enabled by configuration, it is disabled in Internet Explorer because it's not stable enough. + Please fill both alias and name on the new property type! + There is a problem with read/write access to a specific file or folder + Error loading Partial View script (file: %0%) + Error loading userControl '%0%' + Error loading customControl (Assembly: %0%, Type: '%1%') + Error loading MacroEngine script (file: %0%) + "Error parsing XSLT file: %0% + "Error reading XSLT file: %0% + Please enter a title + Please choose a type + You're about to make the picture larger than the original size. Are you sure that you want to proceed? + Error in python script + The python script has not been saved, because it contained error(s) + Startnode deleted, please contact your administrator + Please mark content before changing style + No active styles available + Please place cursor at the left of the two cells you wish to merge + You cannot split a cell that hasn't been merged. + Error in XSLT source + The XSLT has not been saved, because it contained error(s) + There is a configuration error with the data type used for this property, please check the data type + + + About + Action + Actions + Add + Alias + All + Are you sure? + Back + Border + by + Cancel + Cell margin + Choose + Close + Close Window + Comment + Confirm + Constrain + Constrain proportions + Continue + Copy + Create + Database + Date + Default + Delete + Deleted + Deleting... + Design + Dictionary + Dimensions + Down + Download + Edit + Edited + Elements + Email + Error + Find + First + Height + Help + Icon + Import + Inner margin + Insert + Install + Invalid + Justify + Language + Last + Layout + Loading + Locked + Login + Log off + Logout + Macro + Mandatory + Move + More + Name + New + Next + No + of + OK + Open + or + Password + Path + Placeholder ID + One moment please... + Previous + Properties + Email to receive form data + Recycle Bin + Remaining + Remove + Rename + Renew + Required + Retry + Permissions + Search + Sorry, we can not find what you are looking for + No items have been added + Server + Show + Show page on Send + Size + Sort + Submit + Type + Type to search... + Up + Update + Upgrade + Upload + Url + User + Username + Value + View + Welcome... + Width + Yes + Folder + Search results + Reorder + I am done reordering + Preview + Change password + to + List view + Saving... + current + Embed + selected + + + + Black + Green + Yellow + Orange + Blue + Red + + + + Add tab + Add property + Add editor + Add template + Add child node + Add child + + Edit data type + + Navigate sections + + Shortcuts + show shortcuts + + Toggle list view + Toggle allow as root + + Comment/Uncomment lines + Remove line + Copy Lines Up + Copy Lines Down + Move Lines Up + Move Lines Down + + General + Editor + + + + Background colour + Bold + Text colour + Font + Text + + + + Page + + + The installer cannot connect to the database. + Could not save the web.config file. Please modify the connection string manually. + Your database has been found and is identified as + Database configuration + install button to install the Umbraco %0% database + ]]> + Next to proceed.]]> + Database not found! Please check that the information in the "connection string" of the "web.config" file is correct.

+

To proceed, please edit the "web.config" file (using Visual Studio or your favourite text editor), scroll to the bottom, add the connection string for your database in the key named "UmbracoDbDSN" and save the file.

+

+ Click the retry button when + done.
+ More information on editing web.config here.

]]>
+ + Please contact your ISP if necessary. + If you're installing on a local machine or server you might need information from your system administrator.]]> + + Press the upgrade button to upgrade your database to Umbraco %0%

+

+ Don't worry - no content will be deleted and everything will continue working afterwards! +

+ ]]>
+ Press Next to + proceed. ]]> + next to continue the configuration wizard]]> + The Default users' password needs to be changed!]]> + The Default user has been disabled or has no access to Umbraco!

No further actions needs to be taken. Click Next to proceed.]]> + The Default user's password has been successfully changed since the installation!

No further actions needs to be taken. Click Next to proceed.]]> + The password is changed! + + Umbraco creates a default user with a login ('admin') and password ('default'). It's important that the password is + changed to something unique. +

+

+ This step will check the default user's password and suggest if it needs to be changed. +

+ ]]>
+ Get a great start, watch our introduction videos + By clicking the next button (or modifying the umbracoConfigurationStatus in web.config), you accept the license for this software as specified in the box below. Notice that this Umbraco distribution consists of two different licenses, the open source MIT license for the framework and the Umbraco freeware license that covers the UI. + Not installed yet. + Affected files and folders + More information on setting up permissions for Umbraco here + You need to grant ASP.NET modify permissions to the following files/folders + Your permission settings are almost perfect!

+ You can run Umbraco without problems, but you will not be able to install packages which are recommended to take full advantage of Umbraco.]]>
+ How to Resolve + Click here to read the text version + video tutorial on setting up folder permissions for Umbraco or read the text version.]]> + Your permission settings might be an issue! +

+ You can run Umbraco without problems, but you will not be able to create folders or install packages which are recommended to take full advantage of Umbraco.]]>
+ Your permission settings are not ready for Umbraco! +

+ In order to run Umbraco, you'll need to update your permission settings.]]>
+ Your permission settings are perfect!

+ You are ready to run Umbraco and install packages!]]>
+ Resolving folder issue + Follow this link for more information on problems with ASP.NET and creating folders + Setting up folder permissions + + I want to start from scratch + learn how) + You can still choose to install Runway later on. Please go to the Developer section and choose Packages. + ]]> + You've just set up a clean Umbraco platform. What do you want to do next? + Runway is installed + + This is our list of recommended modules, check off the ones you would like to install, or view the full list of modules + ]]> + Only recommended for experienced users + I want to start with a simple website + + "Runway" is a simple website providing some basic document types and templates. The installer can set up Runway for you automatically, + but you can easily edit, extend or remove it. It's not necessary and you can perfectly use Umbraco without it. However, + Runway offers an easy foundation based on best practices to get you started faster than ever. + If you choose to install Runway, you can optionally select basic building blocks called Runway Modules to enhance your Runway pages. +

+ + Included with Runway: Home page, Getting Started page, Installing Modules page.
+ Optional Modules: Top Navigation, Sitemap, Contact, Gallery. +
+ ]]>
+ What is Runway + Step 1/5 Accept license + Step 2/5: Database configuration + Step 3/5: Validating File Permissions + Step 4/5: Check Umbraco security + Step 5/5: Umbraco is ready to get you started + Thank you for choosing Umbraco + Browse your new site +You installed Runway, so why not see how your new website looks.]]> + Further help and information +Get help from our award winning community, browse the documentation or watch some free videos on how to build a simple site, how to use packages and a quick guide to the Umbraco terminology]]> + Umbraco %0% is installed and ready for use + /web.config file and update the AppSetting key UmbracoConfigurationStatus in the bottom to the value of '%0%'.]]> + started instantly by clicking the "Launch Umbraco" button below.
If you are new to Umbraco, +you can find plenty of resources on our getting started pages.]]>
+ Launch Umbraco +To manage your website, simply open the Umbraco back office and start adding content, updating the templates and stylesheets or add new functionality]]> + Connection to database failed. + Umbraco Version 3 + Umbraco Version 4 + Watch + Umbraco %0% for a fresh install or upgrading from version 3.0. +

+ Press "next" to start the wizard.]]>
+ + + Culture Code + Culture Name + + + You've been idle and logout will automatically occur in + Renew now to save your work + + + Happy super Sunday + Happy manic Monday + Happy tubular Tuesday + Happy wonderful Wednesday + Happy thunderous Thursday + Happy funky Friday + Happy Caturday + Log in below + Sign in with + Session timed out + © 2001 - %0%
Umbraco.com

]]>
+ Forgotten password? + An email will be sent to the address specified with a link to reset your password + An email with password reset instructions will be sent to the specified address if it matched our records + Return to login form + Please provide a new password + Your Password has been updated + The link you have clicked on is invalid or has expired + Umbraco: Reset Password + + Your username to login to the Umbraco back-office is: %0%

Click here to reset your password or copy/paste this URL into your browser:

%1%

]]> +
+ + + Dashboard + Sections + Content + + + Choose page above... + %0% has been copied to %1% + Select where the document %0% should be copied to below + %0% has been moved to %1% + Select where the document %0% should be moved to below + has been selected as the root of your new content, click 'ok' below. + No node selected yet, please select a node in the list above before clicking 'ok' + The current node is not allowed under the chosen node because of its type + The current node cannot be moved to one of its subpages + The current node cannot exist at the root + The action isn't allowed since you have insufficient permissions on 1 or more child documents. + Relate copied items to original + + + Edit your notification for %0% + + Hi %0%

+ +

This is an automated mail to inform you that the task '%1%' + has been performed on the page '%2%' + by the user '%3%' +

+ +

+

Update summary:

+ + %6% +
+

+ + + +

Have a nice day!

+ Cheers from the Umbraco robot +

]]>
+ [%0%] Notification about %1% performed on %2% + Notifications + + + + button and locating the package. Umbraco packages usually have a ".zip" extension. + ]]> + Drop to upload + or click here to choose files + Upload package + Install a local package by selecting it from your machine. Only install packages from sources you know and trust + Upload another package + Cancel and upload another package + License + I accept + terms of use + Install package + Finish + Installed packages + You don’t have any packages installed + 'Packages' icon in the top right of your screen]]> + Search for packages + Results for + We couldn’t find anything for + Please try searching for another package or browse through the categories + Popular + New releases + has + karma points + Information + Owner + Contributors + Created + Current version + .NET version + Downloads + Likes + Compatibility + This package is compatible with the following versions of Umbraco, as reported by community members. Full compatability cannot be gauranteed for versions reported below 100% + External sources + Author + Demonstration + Documentation + Package meta data + Package name + Package doesn't contain any items +
+ You can safely remove this from the system by clicking "uninstall package" below.]]>
+ No upgrades available + Package options + Package readme + Package repository + Confirm package uninstall + Package was uninstalled + The package was successfully uninstalled + Uninstall package + + Notice: any documents, media etc depending on the items you remove, will stop working, and could lead to system instability, + so uninstall with caution. If in doubt, contact the package author.]]> + Download update from the repository + Upgrade package + Upgrade instructions + There's an upgrade available for this package. You can download it directly from the Umbraco package repository. + Package version + Package version history + View package website + Package already installed + This package cannot be installed, it requires a minimum Umbraco version of + Uninstalling... + Downloading... + Importing... + Installing... + Restarting, please wait... + All done, your browser will now refresh, please wait... + Please click 'Finish' to complete installation and reload the page. + Uploading package... + + + Paste with full formatting (Not recommended) + The text you're trying to paste contains special characters or formatting. This could be caused by copying text from Microsoft Word. Umbraco can remove special characters or formatting automatically, so the pasted content will be more suitable for the web. + Paste as raw text without any formatting at all + Paste, but remove formatting (Recommended) + + + Role based protection + using Umbraco's member groups.]]> + You need to create a membergroup before you can use role-based authentication + Error Page + Used when people are logged on, but do not have access + Choose how to restrict access to this page + %0% is now protected + Protection removed from %0% + Login Page + Choose the page that contains the login form + Remove Protection + Select the pages that contain login form and error messages + Pick the roles who have access to this page + Set the login and password for this page + Single user protection + If you just want to setup simple protection using a single login and password + + + + + + + + + + Include unpublished subpages + Publishing in progress - please wait... + %0% out of %1% pages have been published... + %0% has been published + %0% and subpages have been published + Publish %0% and all its subpages + Publish to publish %0% and thereby making its content publicly available.

+ You can publish this page and all its subpages by checking Include unpublished subpages below. + ]]>
+ + + You have not configured any approved colours + + + enter external link + choose internal page + Caption + Link + New window + Enter a new caption + Enter the link + + + Reset + Define crop + Give the crop an alias and its default width and height + Save crop + Add new crop + + + Current version + Red text will not be shown in the selected version. , green means added]]> + Document has been rolled back + This displays the selected version as HTML, if you wish to see the difference between 2 versions at the same time, use the diff view + Rollback to + Select version + View + + + Edit script file + + + Concierge + Content + Courier + Developer + Umbraco Configuration Wizard + Media + Members + Newsletters + Settings + Statistics + Translation + Users + Help + Forms + Analytics + + + go to + Help topics for + Video chapters for + The best Umbraco video tutorials + + + Default template + Dictionary Key + To import a document type, find the ".udt" file on your computer by clicking the "Browse" button and click "Import" (you'll be asked for confirmation on the next screen) + New Tab Title + Node type + Type + Stylesheet + Script + Stylesheet property + Tab + Tab Title + Tabs + Master Content Type enabled + This Content Type uses + as a Master Content Type. Tabs from Master Content Types are not shown and can only be edited on the Master Content Type itself + No properties defined on this tab. Click on the "add a new property" link at the top to create a new property. + Master Document Type + Create matching template + Add icon + + + Sort order + Creation date + Sorting complete. + Drag the different items up or down below to set how they should be arranged. Or click the column headers to sort the entire collection of items +
Do not close this window during sorting]]>
+ + + Validation + Validation errors must be fixed before the item can be saved + Failed + Insufficient user permissions, could not complete the operation + Cancelled + Operation was cancelled by a 3rd party add-in + Publishing was cancelled by a 3rd party add-in + Property type already exists + Property type created + DataType: %1%]]> + Propertytype deleted + Document Type saved + Tab created + Tab deleted + Tab with id: %0% deleted + Stylesheet not saved + Stylesheet saved + Stylesheet saved without any errors + Datatype saved + Dictionary item saved + Publishing failed because the parent page isn't published + Content published + and visible on the website + Content saved + Remember to publish to make changes visible + Sent For Approval + Changes have been sent for approval + Media saved + Media saved without any errors + Member saved + Stylesheet Property Saved + Stylesheet saved + Template saved + Error saving user (check log) + User Saved + User type saved + File not saved + file could not be saved. Please check file permissions + File saved + File saved without any errors + Language saved + Media Type saved + Member Type saved + Python script not saved + Python script could not be saved due to error + Python script saved + No errors in python script + Template not saved + Please make sure that you do not have 2 templates with the same alias + Template saved + Template saved without any errors! + XSLT not saved + XSLT contained an error + XSLT could not be saved, check file permissions + XSLT saved + No errors in XSLT + Content unpublished + Partial view saved + Partial view saved without any errors! + Partial view not saved + An error occurred saving the file. + Script view saved + Script view saved without any errors! + Script view not saved + An error occurred saving the file. + An error occurred saving the file. + + + Uses CSS syntax ex: h1, .redHeader, .blueTex + Edit stylesheet + Edit stylesheet property + Name to identify the style property in the rich text editor + Preview + Styles + + + + Edit template + + Sections + Insert content area + Insert content area placeholder + + Insert + Choose what to insert into your template + + Dictionary item + A dictionary item is a placeholder for a translatable piece of text, which makes it easy to create designs for multilingual websites. + + Macro + + A Macro is a configurable component which is great for + reusable parts of your design, where you need the option to provide parameters, + such as galleries, forms and lists. + + + Value + Displays the value of a named field from the current page, with options to modify the value or fallback to alternative values. + + Partial view + + A partial view is a separate template file which can be rendered inside another + template, it's great for reusing markup or for separating complex templates into separate files. + + + Master template + No master template + No master + + Render child template + + @RenderBody() placeholder. + ]]> + + + + Define a named section + + @section { ... }. This can be rendered in a + specific area of the parent of this template, by using @RenderSection. + ]]> + + + Render a named section + + @RenderSection(name) placeholder. + This renders an area of a child template which is wrapped in a corresponding @section [name]{ ... } definition. + ]]> + + + Section Name + Section is mandatory + + If mandatory, the child template must contain a @section definition, otherwise an error is shown. + + + + Query builder + Build a query + items returned, in + + I want + all content + content of type "%0%" + from + my website + where + and + + is + is not + before + before (including selected date) + after + after (including selected date) + equals + does not equal + contains + does not contain + greater than + greater than or equal to + less than + less than or equal to + + Id + Name + Created Date + Last Updated Date + + order by + ascending + descending + + Template + + + + + Choose type of content + Choose a layout + Add a row + Add content + Drop content + Settings applied + + This content is not allowed here + This content is allowed here + + Click to embed + Click to insert image + Image caption... + Write here... + + Grid Layouts + Layouts are the overall work area for the grid editor, usually you only need one or two different layouts + Add Grid Layout + Adjust the layout by setting column widths and adding additional sections + Row configurations + Rows are predefined cells arranged horizontally + Add row configuration + Adjust the row by setting cell widths and adding additional cells + + Columns + Total combined number of columns in the grid layout + + Settings + Configure what settings editors can change + + Styles + Configure what styling editors can change + + Settings will only save if the entered json configuration is valid + + Allow all editors + Allow all row configurations + Set as default + Choose extra + Choose default + are added + + + + + Compositions + You have not added any tabs + Add new tab + Add another tab + Inherited from + Add property + Required label + + Enable list view + Configures the content item to show a sortable and searchable list of its children, the children will not be shown in the tree + + Allowed Templates + Choose which templates editors are allowed to use on content of this type + + Allow as root + Allow editors to create content of this type in the root of the content tree + Yes - allow content of this type in the root + + Allowed child node types + Allow content of the specified types to be created underneath content of this type + + Choose child node + + Inherit tabs and properties from an existing document type. New tabs will be added to the current document type or merged if a tab with an identical name exists. + This content type is used in a composition, and therefore cannot be composed itself. + There are no content types available to use as a composition. + + Available editors + Reuse + Editor settings + + Configuration + + Yes, delete + + was moved underneath + was copied underneath + Select the folder to move + Select the folder to copy + to in the tree structure below + + All Document types + All Documents + All media items + + using this document type will be deleted permanently, please confirm you want to delete these as well. + using this media type will be deleted permanently, please confirm you want to delete these as well. + using this member type will be deleted permanently, please confirm you want to delete these as well + + and all documents using this type + and all media items using this type + and all members using this type + + using this editor will get updated with the new settings + + Member can edit + Show on member profile + + + + + Add fallback field + Fallback field + Add default value + Default value + Alternative field + Alternative Text + Casing + Encoding + Choose field + Convert line breaks + Yes, convert line breaks + Replaces line breaks with 'br' html tag + Custom Fields + Date only + Format and encoding + Format as date + Format the value as a date, or a date with time, according to the active culture + HTML encode + Will replace special characters by their HTML equivalent. + Will be inserted after the field value + Will be inserted before the field value + Lowercase + Modify output + None + Output sample + Insert after field + Insert before field + Recursive + Yes, make it recursive + Separator + Standard Fields + Uppercase + URL encode + Will format special characters in URLs + Will only be used when the field values above are empty + This field will only be used if the primary field is empty + Date and time + + + Tasks assigned to you + assigned to you. To see a detailed view including comments, click on "Details" or just the page name. + You can also download the page as XML directly by clicking the "Download Xml" link.
+ To close a translation task, please go to the Details view and click the "Close" button. + ]]>
+ close task + Translation details + Download all translation tasks as XML + Download XML + Download XML DTD + Fields + Include subpages + + [%0%] Translation task for %1% + No translator users found. Please create a translator user before you start sending content to translation + Tasks created by you + created by you. To see a detailed view including comments, + click on "Details" or just the page name. You can also download the page as XML directly by clicking the "Download Xml" link. + To close a translation task, please go to the Details view and click the "Close" button. + ]]> + The page '%0%' has been send to translation + Please select the language that the content should be translated into + Send the page '%0%' to translation + Assigned by + Task opened + Total words + Translate to + Translation completed. + You can preview the pages, you've just translated, by clicking below. If the original page is found, you will get a comparison of the 2 pages. + Translation failed, the XML file might be corrupt + Translation options + Translator + Upload translation XML + + + Cache Browser + Recycle Bin + Created packages + Data Types + Dictionary + Installed packages + Install skin + Install starter kit + Languages + Install local package + Macros + Media Types + Members + Member Groups + Roles + Member Types + Document Types + Relation Types + Packages + Packages + Partial Views + Partial View Macro Files + Python Files + Install from repository + Install Runway + Runway modules + Scripting Files + Scripts + Stylesheets + Templates + XSLT Files + Analytics + + + New update ready + %0% is ready, click here for download + No connection to server + Error checking for update. Please review trace-stack for further information + + + Administrator + Category field + Change Your Password + New password + Confirm new password + You can change your password for accessing the Umbraco Back Office by filling out the form below and click the 'Change Password' button + Content Channel + Description field + Disable User + Document Type + Editor + Excerpt field + Language + Username + Start Node in Media Library + Sections + Disable Umbraco Access + Old password + Password + Reset password + Your password has been changed! + Please confirm the new password + Enter your new password + Your new password cannot be blank! + Current password + Invalid current password + There was a difference between the new password and the confirmed password. Please try again! + The confirmed password doesn't match the new password! + Replace child node permissions + You are currently modifying permissions for the pages: + Select pages to modify their permissions + Search all children + Start Node in Content + Name + User permissions + User type + User types + Writer + Translator + Change + Your profile + Your recent history + Session expires in + + + Validation + Validate as email + Validate as a number + Validate as a Url + ...or enter a custom validation + Field is mandatory + Enter a regular expression + You need to add at least + You can only have + items + items selected + Invalid date + Not a number + Invalid email + + + + Value is set to the recommended value: '%0%'. + Value was set to '%1%' for XPath '%2%' in configuration file '%3%'. + Expected value '%1%' for '%2%' in configuration file '%3%', but found '%0%'. + Found unexpected value '%0%' for '%2%' in configuration file '%3%'. + + + Custom errors are set to '%0%'. + Custom errors are currently set to '%0%'. It is recommended to set this to '%1%' before go live. + Custom errors successfully set to '%0%'. + + MacroErrors are set to '%0%'. + MacroErrors are set to '%0%' which will prevent some or all pages in your site from loading completely if there are any errors in macros. Rectifying this will set the value to '%1%'. + MacroErrors are now set to '%0%'. + + + Try Skip IIS Custom Errors is set to '%0%' and you're using IIS version '%1%'. + Try Skip IIS Custom Errors is currently '%0%'. It is recommended to set this to '%1%' for your IIS version (%2%). + Try Skip IIS Custom Errors successfully set to '%0%'. + + + File does not exist: '%0%'. + '%0%' in config file '%1%'.]]> + There was an error, check log for full error: %0%. + + Members - Total XML: %0%, Total: %1%, Total invalid: %2% + Media - Total XML: %0%, Total: %1%, Total invalid: %2% + Content - Total XML: %0%, Total published: %1%, Total invalid: %2% + + Your site certificate was marked as valid. + Certificate validation error: '%0%' + Error pinging the URL %0% - '%1%' + You are currently %0% viewing the site using the HTTPS scheme. + The appSetting 'umbracoUseSSL' is set to 'false' in your web.config file. Once you access this site using the HTTPS scheme, that should be set to 'true'. + The appSetting 'umbracoUseSSL' is set to '%0%' in your web.config file, your cookies are %1% marked as secure. + Could not update the 'umbracoUseSSL' setting in your web.config file. Error: %0% + + + Enable HTTPS + Sets umbracoSSL setting to true in the appSettings of the web.config file. + The appSetting 'umbracoUseSSL' is now set to 'true' in your web.config file, your cookies will be marked as secure. + + Fix + Cannot fix a check with a value comparison type of 'ShouldNotEqual'. + Cannot fix a check with a value comparison type of 'ShouldEqual' with a provided value. + Value to fix check not provided. + + Debug compilation mode is disabled. + Debug compilation mode is currently enabled. It is recommended to disable this setting before go live. + Debug compilation mode successfully disabled. + + Trace mode is disabled. + Trace mode is currently enabled. It is recommended to disable this setting before go live. + Trace mode successfully disabled. + + All folders have the correct permissions set. + + %0%.]]> + %0%. If they aren't being written to no action need be taken.]]> + + All files have the correct permissions set. + + %0%.]]> + %0%. If they aren't being written to no action need be taken.]]> + + X-Frame-Options used to control whether a site can be IFRAMEd by another was found.]]> + X-Frame-Options used to control whether a site can be IFRAMEd by another was not found.]]> + Set Header in Config + Adds a value to the httpProtocol/customHeaders section of web.config to prevent the site being IFRAMEd by other websites. + A setting to create a header preventing IFRAMEing of the site by other websites has been added to your web.config file. + Could not update web.config file. Error: %0% + + + %0%.]]> + No headers revealing information about the website technology were found. + + In the Web.config file, system.net/mailsettings could not be found. + In the Web.config file system.net/mailsettings section, the host is not configured. + SMTP settings are configured correctly and the service is operating as expected. + The SMTP server configured with host '%0%' and port '%1%' could not be reached. Please check to ensure the SMTP settings in the Web.config file system.net/mailsettings are correct. + + %0%.]]> + %0%.]]> + + + Disable URL tracker + Enable URL tracker + Original URL + Redirected To + No redirects have been made + When a published page gets renamed or moved a redirect will automatically be made to the new page. + Remove + Are you sure you want to remove the redirect from '%0%' to '%1%'? + Redirect URL removed. + Error removing redirect URL. + Are you sure you want to disable the URL tracker? + URL tracker has now been disabled. + Error disabling the URL tracker, more information can be found in your log file. + URL tracker has now been enabled. + Error enabling the URL tracker, more information can be found in your log file. + + + No Dictionary items to choose from + +
diff --git a/src/UmbracoUrlHandling/Umbraco/Config/Lang/en_us.xml b/src/UmbracoUrlHandling/Umbraco/Config/Lang/en_us.xml new file mode 100644 index 0000000..e6cfed8 --- /dev/null +++ b/src/UmbracoUrlHandling/Umbraco/Config/Lang/en_us.xml @@ -0,0 +1,1626 @@ + + + + The Umbraco community + http://our.umbraco.org/documentation/Extending-Umbraco/Language-Files + + + Culture and Hostnames + Audit Trail + Browse Node + Change Document Type + Copy + Create + Create Package + Delete + Disable + Empty recycle bin + Export Document Type + Import Document Type + Import Package + Edit in Canvas + Exit + Move + Notifications + Public access + Publish + Unpublish + Reload + Republish entire site + Set permissions for the page %0% + Choose where to move + to in the tree structure below + Restore + Permissions + Rollback + Send To Publish + Send To Translation + Sort + Send to publication + Translate + Update + Default value + + + Permission denied. + Add new Domain + remove + Invalid node. + Invalid domain format. + Domain has already been assigned. + Language + Domain + New domain '%0%' has been created + Domain '%0%' is deleted + Domain '%0%' has already been assigned + Domain '%0%' has been updated + Edit Current Domains + + Inherit + Culture + or inherit culture from parent nodes. Will also apply
+ to the current node, unless a domain below applies too.]]>
+ Domains + + + Viewing for + + + Clear selection + Select + Select current folder + Do something else + Bold + Cancel Paragraph Indent + Insert form field + Insert graphic headline + Edit Html + Indent Paragraph + Italic + Center + Justify Left + Justify Right + Insert Link + Insert local link (anchor) + Bullet List + Numeric List + Insert macro + Insert picture + Edit relations + Return to list + Save + Save and publish + Save and send for approval + Save list view + Preview + Preview is disabled because there's no template assigned + Choose style + Show styles + Insert table + Generate models + Save and generate models + + + To change the document type for the selected content, first select from the list of valid types for this location. + Then confirm and/or amend the mapping of properties from the current type to the new, and click Save. + The content has been re-published. + Current Property + Current type + The document type cannot be changed, as there are no alternatives valid for this location. An alternative will be valid if it is allowed under the parent of the selected content item and that all existing child content items are allowed to be created under it. + Document Type Changed + Map Properties + Map to Property + New Template + New Type + none + Content + Select New Document Type + The document type of the selected content has been successfully changed to [new type] and the following properties mapped: + to + Could not complete property mapping as one or more properties have more than one mapping defined. + Only alternate types valid for the current location are displayed. + + + Is Published + About this page + Alias + (how would you describe the picture over the phone) + Alternative Links + Click to edit this item + Created by + Original author + Updated by + Created + Date/time this document was created + Document Type + Editing + Remove at + This item has been changed after publication + This item is not published + Last published + There are no items to show + There are no items to show in the list. + Media Type + Link to media item(s) + Member Group + Role + Member Type + No date chosen + Link title + Properties + This document is published but is not visible because the parent '%0%' is unpublished + This document is published but is not in the cache + Could not get the url + This document is published but its url would collide with content %0% + Publish + Publication Status + Publish at + Unpublish at + Clear Date + Sortorder is updated + To sort the nodes, simply drag the nodes or click one of the column headers. You can select multiple nodes by holding the "shift" or "control" key while selecting + Statistics + Title (optional) + Alternative text (optional) + Type + Unpublish + Last edited + Date/time this document was edited + Remove file(s) + Link to document + Member of group(s) + Not a member of group(s) + Child items + Target + This translates to the following time on the server: + What does this mean?]]> + Add another text box + Remove this text box + + + Click to upload + Drop your files here... + Link to media + or click here to choose files + Only allowed file types are + Cannot upload this file, it does not have an approved file type + Max file size is + + + Create a new member + All Members + + + Where do you want to create the new %0% + Create an item under + Choose a type and a title + "document types".]]> + "media types".]]> + Document Type without a template + New folder + New data type + New javascript file + New empty partial view + New partial view macro + New partial view from snippet + New empty partial view macro + New partial view macro from snippet + New partial view macro (without macro) + + + Browse your website + - Hide + If Umbraco isn't opening, you might need to allow popups from this site + has opened in a new window + Restart + Visit + Welcome + + + Stay + Discard changes + You have unsaved changes + Are you sure you want to navigate away from this page? - you have unsaved changes + + + Done + + Deleted %0% item + Deleted %0% items + Deleted %0% out of %1% item + Deleted %0% out of %1% items + + Published %0% item + Published %0% items + Published %0% out of %1% item + Published %0% out of %1% items + + Unpublished %0% item + Unpublished %0% items + Unpublished %0% out of %1% item + Unpublished %0% out of %1% items + + Moved %0% item + Moved %0% items + Moved %0% out of %1% item + Moved %0% out of %1% items + + Copied %0% item + Copied %0% items + Copied %0% out of %1% item + Copied %0% out of %1% items + + + Name + Manage hostnames + Close this window + Are you sure you want to delete + Are you sure you want to disable + Please check this box to confirm deletion of %0% item(s) + Are you sure? + Are you sure? + Cut + Edit Dictionary Item + Edit Language + Insert local link + Insert character + Insert graphic headline + Insert picture + Insert link + Click to add a Macro + Insert table + Last Edited + Link + Internal link: + When using local links, insert "#" in front of link + Open in new window? + Macro Settings + This macro does not contain any properties you can edit + Paste + Edit Permissions for + The items in the recycle bin are now being deleted. Please do not close this window while this operation takes place + The recycle bin is now empty + When items are deleted from the recycle bin, they will be gone forever + regexlib.com's webservice is currently experiencing some problems, which we have no control over. We are very sorry for this inconvenience.]]> + Search for a regular expression to add validation to a form field. Example: 'email, 'zip-code' 'url' + Remove Macro + Required Field + Site is reindexed + The website cache has been refreshed. All publish content is now up to date. While all unpublished content is still unpublished + The website cache will be refreshed. All published content will be updated, while unpublished content will stay unpublished. + Number of columns + Number of rows + Set a placeholder id by setting an ID on your placeholder you can inject content into this template from child templates, + by referring this ID using a <asp:content /> element.]]> + Select a placeholder id from the list below. You can only + choose Id's from the current template's master.]]> + Click on the image to see full size + Pick item + View Cache Item + Create folder... + Relate to original + Include descendants + The friendliest community + Link to page + Opens the linked document in a new window or tab + Link to media + Link to file + Select media + Select icon + Select item + Select link + Select macro + Select content + Select member + Select member group + There are no parameters for this macro + There are no macros available to insert + External login providers + Exception Details + Stacktrace + Inner Exception + Link your + Un-link your + account + Select editor + Select snippet + + + %0%' below
You can add additional languages under the 'languages' in the menu on the left + ]]>
+ Culture Name + Edit the key of the dictionary item. + + + + + + Enter your username + Enter your password + Confirm your password + Name the %0%... + Enter a name... + Label... + Enter a description... + Type to search... + Type to filter... + Type to add tags (press enter after each tag)... + Enter your email + + + + Allow at root + Only Content Types with this checked can be created at the root level of Content and Media trees + Allowed child node types + Document Type Compositions + Create + Delete tab + Description + New tab + Tab + Thumbnail + Enable list view + Configures the content item to show a sortable & searchable list of its children, the children will not be shown in the tree + Current list view + The active list view data type + Create custom list view + Remove custom list view + + + Add prevalue + Database datatype + Property editor GUID + Property editor + Buttons + Enable advanced settings for + Enable context menu + Maximum default size of inserted images + Related stylesheets + Show label + Width and height + All property types & property data + using this data type will be deleted permanently, please confirm you want to delete these as well + Yes, delete + and all property types & property data using this data type + Select the folder to move + to in the tree structure below + was moved underneath + + + Your data has been saved, but before you can publish this page there are some errors you need to fix first: + The current membership provider does not support changing password (EnablePasswordRetrieval need to be true) + %0% already exists + There were errors: + There were errors: + The password should be a minimum of %0% characters long and contain at least %1% non-alpha numeric character(s) + %0% must be an integer + The %0% field in the %1% tab is mandatory + %0% is a mandatory field + %0% at %1% is not in a correct format + %0% is not in a correct format + + + Received an error from the server + The specified file type has been disallowed by the administrator + NOTE! Even though CodeMirror is enabled by configuration, it is disabled in Internet Explorer because it's not stable enough. + Please fill both alias and name on the new property type! + There is a problem with read/write access to a specific file or folder + Error loading Partial View script (file: %0%) + Error loading userControl '%0%' + Error loading customControl (Assembly: %0%, Type: '%1%') + Error loading MacroEngine script (file: %0%) + "Error parsing XSLT file: %0% + "Error reading XSLT file: %0% + Please enter a title + Please choose a type + You're about to make the picture larger than the original size. Are you sure that you want to proceed? + Error in python script + The python script has not been saved, because it contained error(s) + Startnode deleted, please contact your administrator + Please mark content before changing style + No active styles available + Please place cursor at the left of the two cells you wish to merge + You cannot split a cell that hasn't been merged. + Error in XSLT source + The XSLT has not been saved, because it contained error(s) + There is a configuration error with the data type used for this property, please check the data type + + + About + Action + Actions + Add + Alias + All + Are you sure? + Back + Border + by + Cancel + Cell margin + Choose + Close + Close Window + Comment + Confirm + Constrain + Constrain proportions + Continue + Copy + Create + Database + Date + Default + Delete + Deleted + Deleting... + Design + Dictionary + Dimensions + Down + Download + Edit + Edited + Elements + Email + Error + Find + First + Height + Help + Icon + Import + Inner margin + Insert + Install + Invalid + Justify + Label + Language + Last + Layout + Loading + Locked + Login + Log off + Logout + Macro + Mandatory + Move + More + Name + New + Next + No + of + OK + Open + or + Password + Path + Placeholder ID + One moment please... + Previous + Properties + Email to receive form data + Recycle Bin + Your recycle bin is empty + Remaining + Remove + Rename + Renew + Required + Retry + Permissions + Search + Sorry, we can not find what you are looking for + Server + Show + Show page on Send + Size + Sort + Submit + Type + Type to search... + Up + Update + Upgrade + Upload + Url + User + Username + Value + View + Welcome... + Width + Yes + Folder + Search results + Reorder + I am done reordering + Preview + Change password + to + List view + Saving... + current + Embed + selected + + + Black + Green + Yellow + Orange + Blue + Red + + + Add tab + Add property + Add editor + Add template + Add child node + Add child + + Edit data type + + Navigate sections + + Shortcuts + show shortcuts + + Toggle list view + Toggle allow as root + + Comment/Uncomment lines + Remove line + Copy Lines Up + Copy Lines Down + Move Lines Up + Move Lines Down + + General + Editor + + + Background color + Bold + Text color + Font + Text + + + Page + + + The installer cannot connect to the database. + Could not save the web.config file. Please modify the connection string manually. + Your database has been found and is identified as + Database configuration + install button to install the Umbraco %0% database + ]]> + Next to proceed.]]> + Database not found! Please check that the information in the "connection string" of the "web.config" file is correct.

+

To proceed, please edit the "web.config" file (using Visual Studio or your favourite text editor), scroll to the bottom, add the connection string for your database in the key named "UmbracoDbDSN" and save the file.

+

+ Click the retry button when + done.
+ More information on editing web.config here.

]]>
+ + Please contact your ISP if necessary. + If you're installing on a local machine or server you might need information from your system administrator.]]> + + Press the upgrade button to upgrade your database to Umbraco %0%

+

+ Don't worry - no content will be deleted and everything will continue working afterwards! +

+ ]]>
+ + Press Next to + proceed. ]]> + + next to continue the configuration wizard]]> + The Default users' password needs to be changed!]]> + The Default user has been disabled or has no access to Umbraco!

No further actions needs to be taken. Click Next to proceed.]]> + The Default user's password has been successfully changed since the installation!

No further actions needs to be taken. Click Next to proceed.]]> + The password is changed! + + ('admin') and password ('default'). It's important that the password is changed to something unique. + ]]> + Get a great start, watch our introduction videos + By clicking the next button (or modifying the umbracoConfigurationStatus in web.config), you accept the license for this software as specified in the box below. Notice that this Umbraco distribution consists of two different licenses, the open source MIT license for the framework and the Umbraco freeware license that covers the UI. + Not installed yet. + Affected files and folders + More information on setting up permissions for Umbraco here + You need to grant ASP.NET modify permissions to the following files/folders + Your permission settings are almost perfect!

+ You can run Umbraco without problems, but you will not be able to install packages which are recommended to take full advantage of Umbraco.]]>
+ How to Resolve + Click here to read the text version + video tutorial on setting up folder permissions for Umbraco or read the text version.]]> + Your permission settings might be an issue! +

+ You can run Umbraco without problems, but you will not be able to create folders or install packages which are recommended to take full advantage of Umbraco.]]>
+ Your permission settings are not ready for Umbraco! +

+ In order to run Umbraco, you'll need to update your permission settings.]]>
+ Your permission settings are perfect!

+ You are ready to run Umbraco and install packages!]]>
+ Resolving folder issue + Follow this link for more information on problems with ASP.NET and creating folders + Setting up folder permissions + + I want to start from scratch + + learn how) + You can still choose to install Runway later on. Please go to the Developer section and choose Packages. + ]]> + You've just set up a clean Umbraco platform. What do you want to do next? + Runway is installed + + This is our list of recommended modules, check off the ones you would like to install, or view the full list of modules + ]]> + Only recommended for experienced users + I want to start with a simple website + + + "Runway" is a simple website providing some basic document types and templates. The installer can set up Runway for you automatically, + but you can easily edit, extend or remove it. It's not necessary and you can perfectly use Umbraco without it. However, + Runway offers an easy foundation based on best practices to get you started faster than ever. + If you choose to install Runway, you can optionally select basic building blocks called Runway Modules to enhance your Runway pages. +

+ + Included with Runway: Home page, Getting Started page, Installing Modules page.
+ Optional Modules: Top Navigation, Sitemap, Contact, Gallery. +
+ ]]>
+ What is Runway + Step 1/5 Accept license + Step 2/5: Database configuration + Step 3/5: Validating File Permissions + Step 4/5: Check Umbraco security + Step 5/5: Umbraco is ready to get you started + Thank you for choosing Umbraco + Browse your new site +You installed Runway, so why not see how your new website looks.]]> + Further help and information +Get help from our award winning community, browse the documentation or watch some free videos on how to build a simple site, how to use packages and a quick guide to the Umbraco terminology]]> + Umbraco %0% is installed and ready for use + /web.config file and update the AppSetting key UmbracoConfigurationStatus in the bottom to the value of '%0%'.]]> + started instantly by clicking the "Launch Umbraco" button below.
If you are new to Umbraco, +you can find plenty of resources on our getting started pages.]]>
+ Launch Umbraco +To manage your website, simply open the Umbraco back office and start adding content, updating the templates and stylesheets or add new functionality]]> + Connection to database failed. + Umbraco Version 3 + Umbraco Version 4 + Watch + Umbraco %0% for a fresh install or upgrading from version 3.0. +

+ Press "next" to start the wizard.]]>
+ + + Culture Code + Culture Name + + + You've been idle and logout will automatically occur in + Renew now to save your work + + + Happy super Sunday + Happy manic Monday + Happy tubular Tuesday + Happy wonderful Wednesday + Happy thunderous Thursday + Happy funky Friday + Happy Caturday + Log in below + Sign in with + Session timed out + © 2001 - %0%
Umbraco.com

]]>
+ Forgotten password? + An email will be sent to the address specified with a link to reset your password + An email with password reset instructions will be sent to the specified address if it matched our records + Return to login form + Please provide a new password + Your Password has been updated + The link you have clicked on is invalid or has expired + Umbraco: Reset Password + + Your username to login to the Umbraco back-office is: %0%

Click here to reset your password or copy/paste this URL into your browser:

%1%

]]> +
+ + + Dashboard + Sections + Content + + + Choose page above... + %0% has been copied to %1% + Select where the document %0% should be copied to below + %0% has been moved to %1% + Select where the document %0% should be moved to below + has been selected as the root of your new content, click 'ok' below. + No node selected yet, please select a node in the list above before clicking 'ok' + The current node is not allowed under the chosen node because of its type + The current node cannot be moved to one of its subpages + The current node cannot exist at the root + The action isn't allowed since you have insufficient permissions on 1 or more child documents. + Relate copied items to original + + + Edit your notification for %0% + + + Hi %0%

+ +

This is an automated mail to inform you that the task '%1%' + has been performed on the page '%2%' + by the user '%3%' +

+ +

+

Update summary:

+ + %6% +
+

+ + + +

Have a nice day!

+ Cheers from the Umbraco robot +

]]>
+ [%0%] Notification about %1% performed on %2% + Notifications + + + + button and locating the package. Umbraco packages usually have a ".umb" or ".zip" extension. + ]]> + Drop to upload + or click here to choose package file + Upload package + Install a local package by selecting it from your machine. Only install packages from sources you know and trust + Upload another package + Cancel and upload another package + License + I accept + terms of use + Install package + Finish + Installed packages + You don’t have any packages installed + 'Packages' icon in the top right of your screen]]> + Search for packages + Results for + We couldn’t find anything for + Please try searching for another package or browse through the categories + Popular + New releases + has + karma points + Information + Owner + Contributors + Created + Current version + .NET version + Downloads + Likes + Compatibility + This package is compatible with the following versions of Umbraco, as reported by community members. Full compatability cannot be gauranteed for versions reported below 100% + External sources + Author + Demonstration + Documentation + Package meta data + Package name + Package doesn't contain any items +
+ You can safely remove this from the system by clicking "uninstall package" below.]]>
+ No upgrades available + Package options + Package readme + Package repository + Confirm package uninstall + Package was uninstalled + The package was successfully uninstalled + Uninstall package + + Notice: any documents, media etc depending on the items you remove, will stop working, and could lead to system instability, + so uninstall with caution. If in doubt, contact the package author.]]> + Download update from the repository + Upgrade package + Upgrade instructions + There's an upgrade available for this package. You can download it directly from the Umbraco package repository. + Package version + Package version history + View package website + Package already installed + This package cannot be installed, it requires a minimum Umbraco version of + Uninstalling... + Downloading... + Importing... + Installing... + Restarting, please wait... + All done, your browser will now refresh, please wait... + Please click 'Finish' to complete installation and reload the page. + Uploading package... + + + Paste with full formatting (Not recommended) + The text you're trying to paste contains special characters or formatting. This could be caused by copying text from Microsoft Word. Umbraco can remove special characters or formatting automatically, so the pasted content will be more suitable for the web. + Paste as raw text without any formatting at all + Paste, but remove formatting (Recommended) + + + Role based protection + using Umbraco's member groups.]]> + You need to create a membergroup before you can use role-based authentication + Error Page + Used when people are logged on, but do not have access + Choose how to restrict access to this page + %0% is now protected + Protection removed from %0% + Login Page + Choose the page that contains the login form + Remove Protection + Select the pages that contain login form and error messages + Pick the roles who have access to this page + Set the login and password for this page + Single user protection + If you just want to setup simple protection using a single login and password + + + + + + + + + + Include unpublished subpages + Publishing in progress - please wait... + %0% out of %1% pages have been published... + %0% has been published + %0% and subpages have been published + Publish %0% and all its subpages + Publish to publish %0% and thereby making its content publicly available.

+ You can publish this page and all its subpages by checking Include unpublished subpages below. + ]]>
+ + + You have not configured any approved colors + + + enter external link + choose internal page + Caption + Link + Open in new window + enter the display caption + Enter the link + + + Reset + Define crop + Give the crop an alias and its default width and height + Save crop + Add new crop + + + Current version + Red text will not be shown in the selected version. , green means added]]> + Document has been rolled back + This displays the selected version as HTML, if you wish to see the difference between 2 versions at the same time, use the diff view + Rollback to + Select version + View + + + Edit script file + + + Concierge + Content + Courier + Developer + Umbraco Configuration Wizard + Media + Members + Newsletters + Settings + Statistics + Translation + Users + Help + Forms + Analytics + + + go to + Help topics for + Video chapters for + The best Umbraco video tutorials + + + Default template + Dictionary Key + To import a document type, find the ".udt" file on your computer by clicking the "Browse" button and click "Import" (you'll be asked for confirmation on the next screen) + New Tab Title + Node type + Type + Stylesheet + Script + Stylesheet property + Tab + Tab Title + Tabs + Master Content Type enabled + This Content Type uses + as a Master Content Type. Tabs from Master Content Types are not shown and can only be edited on the Master Content Type itself + No properties defined on this tab. Click on the "add a new property" link at the top to create a new property. + Master Document Type + Create matching template + Add icon + + + Sort order + Creation date + Sorting complete. + Drag the different items up or down below to set how they should be arranged. Or click the column headers to sort the entire collection of items +
Do not close this window during sorting]]>
+ + + Validation + Validation errors must be fixed before the item can be saved + Failed + Insufficient user permissions, could not complete the operation + Cancelled + Operation was cancelled by a 3rd party add-in + Publishing was cancelled by a 3rd party add-in + Property type already exists + Property type created + DataType: %1%]]> + Propertytype deleted + Document Type saved + Tab created + Tab deleted + Tab with id: %0% deleted + Stylesheet not saved + Stylesheet saved + Stylesheet saved without any errors + Datatype saved + Dictionary item saved + Publishing failed because the parent page isn't published + Content published + and visible on the website + Content saved + Remember to publish to make changes visible + Sent For Approval + Changes have been sent for approval + Media saved + Media saved without any errors + Member saved + Stylesheet Property Saved + Stylesheet saved + Template saved + Error saving user (check log) + User Saved + User type saved + File not saved + file could not be saved. Please check file permissions + File saved + File saved without any errors + Language saved + Media Type saved + Member Type saved + Python script not saved + Python script could not be saved due to error + Python script saved + No errors in python script + Template not saved + Please make sure that you do not have 2 templates with the same alias + Template saved + Template saved without any errors! + XSLT not saved + XSLT contained an error + XSLT could not be saved, check file permissions + XSLT saved + No errors in XSLT + Content unpublished + Partial view saved + Partial view saved without any errors! + Partial view not saved + An error occurred saving the file. + Script view saved + Script view saved without any errors! + Script view not saved + An error occurred saving the file. + An error occurred saving the file. + + + Uses CSS syntax ex: h1, .redHeader, .blueTex + Edit stylesheet + Edit stylesheet property + Name to identify the style property in the rich text editor + Preview + Styles + + + Edit template + + Sections + Insert content area + Insert content area placeholder + + Insert + Choose what to insert into your template + + Dictionary item + A dictionary item is a placeholder for a translatable piece of text, which makes it easy to create designs for multilingual websites. + + Macro + + A Macro is a configurable component which is great for + reusable parts of your design, where you need the option to provide parameters, + such as galleries, forms and lists. + + + Value + Displays the value of a named field from the current page, with options to modify the value or fallback to alternative values. + + Partial view + + A partial view is a separate template file which can be rendered inside another + template, it's great for reusing markup or for separating complex templates into separate files. + + + Master template + No master template + No master + + Render child template + + @RenderBody() placeholder. + ]]> + + + + Define a named section + + @section { ... }. This can be rendered in a + specific area of the parent of this template, by using @RenderSection. + ]]> + + + Render a named section + + @RenderSection(name) placeholder. + This renders an area of a child template which is wrapped in a corresponding @section [name]{ ... } definition. + ]]> + + + Section Name + Section is mandatory + + If mandatory, the child template must contain a @section definition, otherwise an error is shown. + + + + Query builder + Build a query + items returned, in + + I want + all content + content of type "%0%" + from + my website + where + and + + is + is not + before + before (including selected date) + after + after (including selected date) + equals + does not equal + contains + does not contain + greater than + greater than or equal to + less than + less than or equal to + + Id + Name + Created Date + Last Updated Date + + order by + ascending + descending + + Template + + + Choose type of content + Choose a layout + Add a row + Add content + Drop content + Settings applied + + This content is not allowed here + This content is allowed here + + Click to embed + Click to insert image + Image caption... + Write here... + + Grid Layouts + Layouts are the overall work area for the grid editor, usually you only need one or two different layouts + Add Grid Layout + Adjust the layout by setting column widths and adding additional sections + Row configurations + Rows are predefined cells arranged horizontally + Add row configuration + Adjust the row by setting cell widths and adding additional cells + + Columns + Total combined number of columns in the grid layout + + Settings + Configure what settings editors can change + + + Styles + Configure what styling editors can change + + Settings will only save if the entered json configuration is valid + + Allow all editors + Allow all row configurations + Set as default + Choose extra + Choose default + are added + + + + Compositions + You have not added any tabs + Add new tab + Add another tab + Inherited from + Add property + Required label + + Enable list view + Configures the content item to show a sortable and searchable list of its children, the children will not be shown in the tree + + Allowed Templates + Choose which templates editors are allowed to use on content of this type + Allow as root + Allow editors to create content of this type in the root of the content tree + Yes - allow content of this type in the root + + Allowed child node types + Allow content of the specified types to be created underneath content of this type + + Choose child node + Inherit tabs and properties from an existing document type. New tabs will be added to the current document type or merged if a tab with an identical name exists. + This content type is used in a composition, and therefore cannot be composed itself. + There are no content types available to use as a composition. + + Available editors + Reuse + Editor settings + + Configuration + + Yes, delete + + was moved underneath + was copied underneath + Select the folder to move + Select the folder to copy + to in the tree structure below + + All Document types + All Documents + All media items + + using this document type will be deleted permanently, please confirm you want to delete these as well. + using this media type will be deleted permanently, please confirm you want to delete these as well. + using this member type will be deleted permanently, please confirm you want to delete these as well + + and all documents using this type + and all media items using this type + and all members using this type + + using this editor will get updated with the new settings + + Member can edit + Show on member profile + tab has no sort order + + + + Building models + this can take a bit of time, don't worry + Models generated + Models could not be generated + Models generation has failed, see exception in U log + + + + Add fallback field + Fallback field + Add default value + Default value + Fallback field + Default value + Casing + Encoding + Choose field + Convert line breaks + Yes, convert line breaks + Replaces line breaks with 'br' html tag + Custom Fields + Date only + Format and encoding + Format as date + Format the value as a date, or a date with time, according to the active culture + HTML encode + Will replace special characters by their HTML equivalent. + Will be inserted after the field value + Will be inserted before the field value + Lowercase + Modify output + None + Output sample + Insert after field + Insert before field + Recursive + Yes, make it recursive + Separator + Standard Fields + Uppercase + URL encode + Will format special characters in URLs + Will only be used when the field values above are empty + This field will only be used if the primary field is empty + Date and time + + + Tasks assigned to you + assigned to you. To see a detailed view including comments, click on "Details" or just the page name. + You can also download the page as XML directly by clicking the "Download Xml" link.
+ To close a translation task, please go to the Details view and click the "Close" button. + ]]>
+ close task + Translation details + Download all translation tasks as XML + Download XML + Download XML DTD + Fields + Include subpages + + [%0%] Translation task for %1% + No translator users found. Please create a translator user before you start sending content to translation + Tasks created by you + created by you. To see a detailed view including comments, + click on "Details" or just the page name. You can also download the page as XML directly by clicking the "Download Xml" link. + To close a translation task, please go to the Details view and click the "Close" button. + ]]> + The page '%0%' has been send to translation + Please select the language that the content should be translated into + Send the page '%0%' to translation + Assigned by + Task opened + Total words + Translate to + Translation completed. + You can preview the pages, you've just translated, by clicking below. If the original page is found, you will get a comparison of the 2 pages. + Translation failed, the XML file might be corrupt + Translation options + Translator + Upload translation XML + + + Cache Browser + Recycle Bin + Created packages + Data Types + Dictionary + Installed packages + Install skin + Install starter kit + Languages + Install local package + Macros + Media Types + Members + Member Groups + Member Roles + Member Types + Document Types + Relation Types + Packages + Packages + Python Files + Install from repository + Install Runway + Runway modules + Scripting Files + Scripts + Stylesheets + Templates + XSLT Files + Analytics + + + New update ready + %0% is ready, click here for download + No connection to server + Error checking for update. Please review trace-stack for further information + + + Administrator + Category field + Change Your Password + New password + Confirm new password + You can change your password for accessing the Umbraco Back Office by filling out the form below and click the 'Change Password' button + Content Channel + Description field + Disable User + Document Type + Editor + Excerpt field + Language + Login + Start Node in Media Library + Sections + Disable Umbraco Access + Old password + Password + Reset password + Your password has been changed! + Please confirm the new password + Enter your new password + Your new password cannot be blank! + Current password + Invalid current password + There was a difference between the new password and the confirmed password. Please try again! + The confirmed password doesn't match the new password! + Replace child node permissions + You are currently modifying permissions for the pages: + Select pages to modify their permissions + Search all children + Start Node in Content + Name + User permissions + User type + User types + Writer + Translator + Change + Your profile + Your recent history + Session expires in + + + Validation + Validate as email + Validate as a number + Validate as a Url + ...or enter a custom validation + Field is mandatory + Enter a regular expression + You need to add at least + You can only have + items + items selected + Invalid date + Not a number + Invalid email + + + + Value is set to the recommended value: '%0%'. + Value was set to '%1%' for XPath '%2%' in configuration file '%3%'. + Expected value '%1%' for '%2%' in configuration file '%3%', but found '%0%'. + Found unexpected value '%0%' for '%2%' in configuration file '%3%'. + + + Custom errors are set to '%0%'. + Custom errors are currently set to '%0%'. It is recommended to set this to '%1%' before go live. + Custom errors successfully set to '%0%'. + + MacroErrors are set to '%0%'. + MacroErrors are set to '%0%' which will prevent some or all pages in your site from loading completely if there are any errors in macros. Rectifying this will set the value to '%1%'. + MacroErrors are now set to '%0%'. + + + Try Skip IIS Custom Errors is set to '%0%' and you're using IIS version '%1%'. + Try Skip IIS Custom Errors is currently '%0%'. It is recommended to set this to '%1%' for your IIS version (%2%). + Try Skip IIS Custom Errors successfully set to '%0%'. + + + File does not exist: '%0%'. + '%0%' in config file '%1%'.]]> + There was an error, check log for full error: %0%. + + Members - Total XML: %0%, Total: %1%, Total invalid: %2% + Media - Total XML: %0%, Total: %1%, Total invalid: %2% + Content - Total XML: %0%, Total published: %1%, Total invalid: %2% + + Your site certificate was marked as valid. + Certificate validation error: '%0%' + Error pinging the URL %0% - '%1%' + You are currently %0% viewing the site using the HTTPS scheme. + The appSetting 'umbracoUseSSL' is set to 'false' in your web.config file. Once you access this site using the HTTPS scheme, that should be set to 'true'. + The appSetting 'umbracoUseSSL' is set to '%0%' in your web.config file, your cookies are %1% marked as secure. + Could not update the 'umbracoUseSSL' setting in your web.config file. Error: %0% + + + Enable HTTPS + Sets umbracoSSL setting to true in the appSettings of the web.config file. + The appSetting 'umbracoUseSSL' is now set to 'true' in your web.config file, your cookies will be marked as secure. + + Fix + Cannot fix a check with a value comparison type of 'ShouldNotEqual'. + Cannot fix a check with a value comparison type of 'ShouldEqual' with a provided value. + Value to fix check not provided. + + Debug compilation mode is disabled. + Debug compilation mode is currently enabled. It is recommended to disable this setting before go live. + Debug compilation mode successfully disabled. + + Trace mode is disabled. + Trace mode is currently enabled. It is recommended to disable this setting before go live. + Trace mode successfully disabled. + + All folders have the correct permissions set. + + %0%.]]> + %0%. If they aren't being written to no action need be taken.]]> + + All files have the correct permissions set. + + %0%.]]> + %0%. If they aren't being written to no action need be taken.]]> + + X-Frame-Options used to control whether a site can be IFRAMEd by another was found.]]> + X-Frame-Options used to control whether a site can be IFRAMEd by another was not found.]]> + Set Header in Config + Adds a value to the httpProtocol/customHeaders section of web.config to prevent the site being IFRAMEd by other websites. + A setting to create a header preventing IFRAMEing of the site by other websites has been added to your web.config file. + Could not update web.config file. Error: %0% + + + %0%.]]> + No headers revealing information about the website technology were found. + + In the Web.config file, system.net/mailsettings could not be found. + In the Web.config file system.net/mailsettings section, the host is not configured. + SMTP settings are configured correctly and the service is operating as expected. + The SMTP server configured with host '%0%' and port '%1%' could not be reached. Please check to ensure the SMTP settings in the Web.config file system.net/mailsettings are correct. + + %0%.]]> + %0%.]]> + + + Disable URL tracker + Enable URL tracker + Original URL + Redirected To + No redirects have been made + When a published page gets renamed or moved a redirect will automatically be made to the new page. + Remove + Are you sure you want to remove the redirect from '%0%' to '%1%'? + Redirect URL removed. + Error removing redirect URL. + Are you sure you want to disable the URL tracker? + URL tracker has now been disabled. + Error disabling the URL tracker, more information can be found in your log file. + URL tracker has now been enabled. + Error enabling the URL tracker, more information can be found in your log file. + + + No Dictionary items to choose from + +
diff --git a/src/UmbracoUrlHandling/Umbraco/Config/Lang/es.xml b/src/UmbracoUrlHandling/Umbraco/Config/Lang/es.xml new file mode 100644 index 0000000..d3d8d9c --- /dev/null +++ b/src/UmbracoUrlHandling/Umbraco/Config/Lang/es.xml @@ -0,0 +1,935 @@ + + + + The Umbraco community + http://our.umbraco.org/documentation/Extending-Umbraco/Language-Files + + + Administrar hostnames + Auditoría + Nodo de Exploración + Cambiar tipo de documento + Copiar + Crear + Crear Paquete + Borrar + Deshabilitar + Vaciar Papelera + Exportar Documento (tipo) + Importar Documento (tipo) + Importar Paquete + Editar en lienzo + Salir + Mover + Notificaciones + Acceso Público + Publicar + Unpublish + Recargar Nodos + Republicar sitio completo + Permisos + Deshacer + Enviar a Publicar + Enviar a Traducir + Ordernar + Enviar a publicación + Traducir + Actualizar + Valor por defecto + + + Permiso denegado. + Añadir nuevo dominio + quitar + Nodo no válido. + Formato de dominio no válido. + Este dominio ya ha sido asignado. + Language + Dominio + El nuevo dominio %0% ha sido creado + El dominio %0% ha sido borrado + El dominio'%0%' ya ha sido asignado + El dominio %0% ha sido actualizado + Editar dominios actuales + +
Los dominios de un nivel están soportados, por ej. "example.com/en". De todas formas deberían de evitarse. Mejor usar la configuración cultural especificada arriba.]]> +
+ Heredar + Cultura + + o hereda la cultura de los nodos padres. También se aplicará
+ para el nodo actual, a menos que un dominio por debajo lo aplique también.]]> +
+ Domains + + + Visualización de + + + Seleccionar + Selecciona la carpeta actual + Hacer otra cosa + Negrita + Cancelar Sangría del Párrafo + Insertar campo de formulario + Insertar gráfico de titular + Editar Html + Sangría + Cursiva + Centrar + Alinear a la Izquierda + Alinear a la Derecha + Insertar Link + Insertar link local (anchor) + Lista en Viñetas + Lista Numérica + Insertar macro + Insertar imagen + Editar relaciones + Guardar + Guardar y publicar + Guardar y enviar para aprobación + Previsualizar + La previsualización está deshabilitada porque no hay ninguna plantilla asignada + Elegir estilo + Mostrar estilos + Insertar tabla + Volver al listado + + + Para cambiar el tipo de documento al contenido seleccionado, primero selecciona uno de la lista de tipos válidos. + Entonces confirma el mapeo de propiedades del tipo actual al nuevo y haz click en Guardar. + El contenido se ha vuelto a publicar. + Propiedad actual + Tipo actual + El tipo de contenido no se puede cambiar, porque no hay alternativas válidas para este contenido. + Tipo de documento cambiado + Mapeo de propiedades + Mapea a la propiedad + Nueva plantilla + Nuevo tipo + ninguno + Contenido + Selecciona un nuevo Tipo de Documento + El tipo de documento del contenido seleccionado ha sido cambiado correctamente a [new type] y las siguientes propiedades mapeadas: + a + No se ha podido completar el mapeo de propiedades porque uno o más propiedades tienen más de un mapeo definido. + Solo se muestran otros tipos válidos para el contenido actual. + + + Está publicado + Acerca de + Link alternativo + (como describe la imagen sobre el teléfono) + Vinculos Alternativos + Click para editar esta entrada + Creado por + Autor original + Actualizado por + Creado + Fecha/hora de creación del documento + Tipo de Documento + Editando + Remover el + Esta entrada ha sido modificada después de haber sido publicada + Esta entrada no esta publicada + Último publicado + Tipo de Medio + Miembro de Grupo + Rol + Tipo de miembro + Sin fecha + Título de la página + Propiedades + Este documento ha sido publicado pero no es visible porque el padre '%0%' no esta publicado + Upss: este documento está publicado pero no está en la caché (error interno) + Publicar + Estado de la Publicación + Publicar el + Despublicar el + Fecha de Eliminación + El Orden esta actualizado + Para organizar los nodos, simplemente arrastre los nodos o realice un clic en uno de los encabezados de columna. Puede seleccionar multiple nodos manteniendo presionados "Shift" o "Control" mientras selecciona + Estadísticas + Título (opcional) + Tipo + No Publicar + Última actualización + Fecha/hora este documento fue modificado + Eliminar archivo + Vínculo al documento + Miembro de grupo(s) + No es miembreo de grupo(s) + Nodos hijo + Target + No hay datos que mostrar + + + Haz click para subir archivos + Arrastra los archivos aquí... + + + ¿Dónde quieres crear el nuevo %0% + Crear debajo de + Elije un tipo y un título + "Tipos de documentos".]]> + "Tipos de medios".]]> + + + Navega en tu sitio Web + No volver a mostrar + Si Umbraco no se ha abierto tendrás que permitir ventanas emergentes para este sitio Web + se ha abierto en una nueva ventana + Reinicio + Visita + Bienvenido + + + Stay + Discard changes + You have unsaved changes + Are you sure you want to navigate away from this page? - you have unsaved changes + + + Done + + Deleted %0% item + Deleted %0% items + Deleted %0% out of %1% item + Deleted %0% out of %1% items + + Published %0% item + Published %0% items + Published %0% out of %1% item + Published %0% out of %1% items + + Unpublished %0% item + Unpublished %0% items + Unpublished %0% out of %1% item + Unpublished %0% out of %1% items + + Moved %0% item + Moved %0% items + Moved %0% out of %1% item + Moved %0% out of %1% items + + Copied %0% item + Copied %0% items + Copied %0% out of %1% item + Copied %0% out of %1% items + + + Nombre + Administrar dominios + Cerrar esta ventana + Esta usted seguro que desea borrar + Esta usted seguro que desea deshabilitar + Por favor seleccione esta casilla para confirmar la eliminación de %0% entrada(s) + Esta usted seguro? + Esta usted Seguro? + Cortar + Editar entrada del Diccionario + Editar idioma + Agregar enlace interno + Insertar caracter + Insertar titular gráfico + Insertar imagen + Insertar enlace + Insertar macro + Insertar tabla + Última edición + Enlace + Enlace interno + Al usar enlaces locales, insertar "#" delante del enlace + ¿Abrir en nueva ventana? + Ajustes para la Macro + Esta macro no contiene ninguna propiedad que pueda editar + Pegar + Editar permisos para + Se está vaciando la papelera. No cierre esta ventana mientras se ejecuta este proceso + La papelera está vacía + No podrá recuperar los items una vez sean borrados de la papelera + regexlib.com está experimentando algunos problemas en estos momentos, de los cuales no somos responsables. Pedimos disculpas por las molestias.]]> + Buscar una expresión regular para agregar validación a un campo de formulario. Ejemplo: 'correo electrónico', código postal "," url " + Eliminar macro + Campo obligatorio + El sitio ha sido reindexado + Se ha actualizado la caché y se ha publicado el contenido del sitio web. + La caché del sitio web será actualizada. Todos los contenidos publicados serán actualizados, mientras el contenido no publicado permanecerá no publicado. + Número de columnas + Número de filas + Coloca un 'placeholder' id al colocar un ID en tu 'placeholder' puedes insertar contenido en esta plantilla desde una plantilla hija, referenciando este ID usando un elemento<asp:content />.]]> + Seleccione una tecla de la lista abajo indicada. Sólo puede elegir a partir de la ID de la plantilla actual del dominio. + Haga clic sobre la imagen para verla a tamaño completo. + Seleccionar item + Ver item en la caché + + + Editar las diferentes versiones lingüísticas para la entrada en el diccionario '% 0%' debajo añadir otros idiomas en el menu de 'idiomas' en el menú de la izquierda + + + + Escribe tu nombre de usuario + Escribe tu contraseña + Nombre del %0%... + Escribe un nombre... + Escribe tu búsqueda... + Escribe para filtrar resultados... + Tu nombre de usuario normalmente es tu e-mail + + + Permitir en nodo raíz + Sólo tipos de contenido permitidos podrán crearse bajo el nodo raíz de los árboles de Contenido y Media + Tipos de nodos hijos permitidos + Composiciones de Tipo de Documento + Crear + Borrar pestaña + Descripción + Nueva pestaña + Pestaña + Miniatura + Permitir vista de listado + Configura el contenido para mostrar un listado de nodos hijos, en lugar de mostrarlos en forma de árbol + Vista de listado actual + El tipo de vista de listado activa + Crear un tipo de listado personalizado + Quitar el tipo de listado personalizado + + + añadir prevalor + + Tipo de datos GUID + Tipo de datos GUIDprestar control + Botones + Habilitar la configuración avanzada para + Habilitar menú contextual + Por defecto, el tamaño máximo de imágenes insertado + + Mostrar etiqueta + + + + Se ha guardado la información pero debes solucionar los siguientes errores para poder publicar: + La composición actual del proveedor no es compatible con el cambio de la contraseña (Habilitar la contraseña de recuperación es necesaria para que sea cierta) + %0% ya existe + Se han encontrado los siguientes errores: + Se han encontrado los siguientes errores: + La clave debe tener como mínimo %0% caracteres y %1% caracter(es) no alfanuméricos + %0% debe ser un número entero + Debe llenar los campos del %0% al %1% + Debe llenar el campo %0% + Debe poner el formato correcto del %0% al %1% + Debe poner un formato correcto en %0% + + + NOTA: Aunque CodeMirror esté activado en los ajustes de configuracion, no se muestra en Internet Explorer debido a que no es lo suficientemente estable.' + Debe llenar el alias y el nombre en el propertytype + Hay un problema de lectura y escritura al acceder a un archivo o carpeta + + Por favor, elija un tipo + Usted está a punto de hacer la foto más grande que el tamaño original. ¿Está seguro de que desea continuar? + Error en script python + El script python no se ha guardado debido a que contenía error(es) + + Por favor, marque el contenido antes de cambiar de estilo + No active estilos disponibles + + + + El XSLT no se ha guardado, porque contenía un error (s) + + + Acerca de + Acción + Acciones + Añadir + Alias + ¿Está seguro? + Borde + o + Cancelar + Margen de la celda + Elegir + Cerrar + Cerrar ventana + Comentario + Confirmar + Mantener proporciones + Continuar + Copiar + Crear + Base de datos + Fecha + Por defecto + Borrar + Borrado + Borrando... + Diseño + Dimensiones + Abajo + Descargar + Editar + Editado + Elementos + Mail + Error + Buscar + Altura + Ayuda + Icono + Importar + Margen interno + Insertar + Instalar + Justificar + Idioma + Diseño + Cargando + Bloqueado + Iniciar sesión + Cerrar sesión + Cerrar sesión + Macro + Mover + Nombre + New + Próximo + No + de + OK + Abrir + o + Contraseña + Ruta + ID de marcador de posición + Un momento por favor... + Anterior + Propiedades + Mail para recibir los datos del formulario + Papelera + Restantes + Renombrar + Renovar + Reintentar + Permisos + Buscar + Servidor + Mostrar + Mostrar página al enviar + Tamaño + Ordenar + Submit + Tipo + Tipo que buscar... + Arriba + Actualizar + Actualizar + Upload + Url + Usuario + Nombre de usuario + Valor + Ver + Bienvenido... + Ancho + Si + Reorder + I am done reordering + + + Color de fondo + Negritas + Color del texto + Fuente + Texto + + + Página + + + El instalador no puede conectar con la base de datos. + No se ha podido guardar el archivo Web.config. Por favor, modifique la cadena de conexión manualmente. + Su base de datos ha sido encontrada y ha sido identificada como + Configuración de la base de datos + instalar para instalar %0% la base de datos de Umbraco]]> + Próximo para continuar]]> + ¡No se ha encontrado ninguna base de datos! Mira si la información en la "connection string" del “web.config” es correcta.

Para continuar, edite el "web.config" (bien sea usando Visual Studio o su editor de texto preferido), vaya al final del archivo y añada la cadena de conexión para la base de datos con el nombre (key) "umbracoDbDSN" y guarde el archivo.

Pinche en reintentar cuando haya terminado.
Pinche aquí para mayor información de como editar el web.config (en inglés)

]]>
+ Por favor, contacta con tu ISP si es necesario. Si estás realizando la instalación en una máquina o servidor local, quizás necesites información de tu administrador de sistemas.]]> + Pinche en actualizar para actualizar la base de datos a Umbraco %0%

Ningún contenido será borrado de la base de datos y seguirá funcionando después de la actualización

]]>
+ Pinche en Próximo para continuar. ]]> + próximo para continuar con el asistente de configuración]]> + La contraseña del usuario por defecto debe ser cambiada]]> + El usuario por defecto ha sido desabilitado o ha perdido el acceso a Umbraco!

Pinche en Próximo para continuar.]]> + ¡La contraseña del usuario por defecto ha sido cambiada desde que se instaló!

No hay que realizar ninguna tarea más. Pulsa Siguiente para proseguir.]]> + ¡La constraseña se ha cambiado! + Umbraco crea un usuario por defecto con un nombre de usuario ('admin') y constraseña ('default'). Es importante que la contraseña se cambie a algo único.

Este paso comprobará la contraseña del usuario por defecto y sugerirá si debe cambiarse.

]]>
+ Ten un buen comienzo, visita nuestros videos de introducción + Pulsando el botón de Siguiente (o modificando el UmbracoConfigurationStatus en el web.config), aceptar la licencia de este software tal y como se especifica en el cuadro de debajo. Ten en cuenta que esta distribución de Umbraco consta de dos licencias diferentes, la licencia open source MIT para el framework y la licencia Umbraco freeware que cubre la IU. + No ha sido instalado. + Archivos y directorios afectados + Mas información en configurar los permisos para Umbraco aquí + Necesitas dar permisos de modificación a ASP.NET para los siguientes archivos/directorios + ¡Tu configuración de permisos es casi perfecta!

Puedes ejecutar Umbraco sin problemas, pero no podrás instalar paquetes que es algo recomendable para explotar el potencial de Umbraco.]]>
+ Como Resolver + Pulsa aquí para leer la versión de texto + video tutoriales acerca de cómo configurar los permisos de los directorios para Umbraco o lee la versión de texto.]]> + ¡La configuración de tus permisos podría ser un problema!

Puedes ejecutar Umbraco sin problemas, pero no serás capaz de crear directorios o instalar paquetes que es algo recomendable para explotar el potencial de Umbraco.]]>
+ ¡Tu configuración de permisos no está lista para Umbraco!

Para ejecutar Umbraco, necesitarás actualizar tu configuración de permisos.]]>
+ ¡Tu configuración de permisos es perfecta!

¡Estás listo para ejecutar Umbraco e instalar paquetes!]]>
+ Resolviendo problemas con directorios + Sigue este enlace para más información sobre problemas con ASP.NET y creación de directorios + Configurando los permisos de directorios + Umbraco necesita permisos de lectura/escritura en algunos directorios para poder almacenar archivos tales como imagenes y PDFs. También almacena datos en la caché para mejorar el rendimiento de su sitio web + Quiero empezar de cero + learn how). Todavía podrás elegir instalar Runway más adelante. Por favor ve a la sección del Desarrollador y elije Paquetes.]]> + Acabas de configurar una nueva plataforma Umbraco. ¿Qué deseas hacer ahora? + Se ha instalado Runway + Esta es nuestra lista de módulos recomendados, selecciona los que desees instalar, o mira la lista completa de módulos ]]> + Sólo recomendado para usuarios expertos + Quiero empezar con un sitio web sencillo + "Runway" es un sitio web sencillo que contiene unos tipos de documentos y plantillas básicos. El instalador puede configurar Runway por ti de forma automática, pero fácilmente puedes editarlo, extenderlo o eliminarlo. No es necesario y puedes usar Umbrao perfectamente sin él. Sin embargo, Runway ofrece unos cimientos sencillos basados en buenas prácticas para iniciarte más rápido que nunca. Si eliges instalar Runway, puedes seleccionar bloques de construcción básicos llamados Módulos de Runway de forma opcional para realzar tus páginas de Runway. Incluido con Runway: Página de inicio, página de Cómo empezar, página de Instalación de módulos.
Módulos opcionales: Navegación superior, Mapa del sitio, Contacto, Galería.
]]>
+ ¿Qué es Runway? + Paso 1 de 5. Aceptar los términos de la licencia + Paso 2 de 5. Configuración de la base de datos + Paso 3 de 5. Autorizar / validar permiso en los archivos + Paso 4 de 5. Configurar seguridad en Umbraco + Paso 5 de 5. Umbraco está listo para ser usado + Gracias por elegir Umbraco + Navega a tu nuevo sitio Has instalado Runway, por qué no ves el aspecto de tu nuevo sitio web.]]> + Más ayuda e información Consigue ayuda de nuestra premiada comunidad, navega por la documentación o mira algunos videos gratuitos de cómo crear un sitio sencillo, cómo utilizar los paquetes y una guía rápida de la terminología de Umbraco]]> + Umbraco %0% ha sido instalado y está listo para ser usado + archivo /web.config y actualizar la clave del AppSetting UmbracoConfigurationStatus del final al valor '%0%'.]]> + empezar inmediatamente pulsando el botón "Lanzar Umbraco" de debajo.
Si eres nuevo con Umbraco, puedes encontrar cantidad de recursos en nuestras páginas de cómo empezar.]]>
+ Lanzar Umbraco Para administrar tu sitio web, simplemente abre el back office de Umbraco y empieza a añadir contenido, a actualizar plantillas y hojas de estilo o a añadir nueva funcionalidad]]> + No se ha podido establecer la conexión con la base de datos + Umbraco versión 3 + Umbraco versión 4 + Mirar + Umbraco %0% o actualizar la versión 3.0 a Umbraco %0%.

Pinche en "próximo" para empezar con el asistente de configuración.]]>
+ + + Código de cultura + Nombre de cultura + + + No ha habido ninguna actividad y su sessión se cerrará en + Renovar su sessión para guardar sus cambios + + + Feliz super domingo + Feliz lunes + Tremendo martes + Maravilloso miércoles + Fantástico jueves + ¡Ya es viernes! + Resplandeciente sábado + Iniciar sesión + La sesión ha caducado + © 2001 - %0%
umbraco.com

]]>
+ + + + Panel de Administración + Secciones + Contenido + + + Elija una página arriba... + %0% ha sido copiado al %1% + Seleccione donde el documento %0% debe ser copiado abajo + %0% ha sido movido a %1% + Seleccione debajo donde mover el documento %0% + ha sido seleccionado como raíz de su nuevo contenido, haga click sobre 'ok' debajo. + No ha seleccionado ningún nodo. Seleccione un nodo en la lista mostrada arriba antes the pinchar en 'continuar' (continue) + No se puede colgar el nodo actual bajo el nodo elegido debido a su tipo + El nodo actual no puede moverse a ninguna de sus subpáginas + Acción no permitida. No tiene permisos suficientes para uno o más subnodos.' + + + Edite su notificación para %0% + Hola %0% Esto es un e-mail automático para informarle que la tarea '%1%' ha sido realizada sobre la página '%2%' por el usuario '%3%' Vaya a http://%4%/#/content/content/edit/%5% para editarla. ¡Espero que tenga un buen día! Saludos del robot de Umbraco + Hola %0%

Esto es un e-mail generado automáticamente para informarle que la tarea '%1%' ha sido realizada sobre la página '%2%' por el usuario '%3%'

Resumen de actualización:

%6%

¡Espero que tenga un buen día!

Saludos del robot Umbraco.

]]>
+ [%0%] Notificación acerca de %1% realizado en %2% + Notificaciones + + + y localizando el paquete. Los paquetes de Umbraco normalmente tienen la extensión ".umb" o ".zip".]]> + Autor + + Documentación + Meta datos del paquete + Nombre del paquete + El paquete no contiene ningún elemento +
Puedes eliminarlo del sistema de forma segura seleccionando la opción "desinstalar paquete" de abajo.]]>
+ No hay actualizaciones disponibles + Opciones del paquete + Leeme del paquete + Repositorio de paquetes + Confirma la desinstalación + El paquete ha sido desinstalado + El paquete se ha desinstalado correctamente + Desinstalar paquete + Nota: cualquier documento, archivo etc dependiente de los elementos eliminados, dejará de funcionar, y puede conllevar inestabilidad en el sistema, por lo que lleva cuidado al desinstalar elementos. En caso de duda, contacta con el autor del paquete.]]> + Descargar actualización del repositorio + Actualizar paquete + Instrucciones de actualización + Hay una actualización disponible para este paquete. Puedes descargarla directamente del repositorio de paquetes de Umbraco. + Versión del paquete + Ver página web del paquete + + + Pegar con formato completo (No recomendado) + El texto que estás intentando pegar contiene caractéres o formato especial. El problema puede ser debido al copiar texto desde Microsoft Word. Umbraco puede eliminar estos caractéres o formato especial automáticamente, de esa manera el contenido será más adecuado para la web. + Pegar como texto sin formato + Pegar, pero quitando el formato (Recomendado) + + + Proteccion basada en roles + usando los grupos de miembros de Umbraco.]]> + Necesita crear un grupo de miembros antes de poder usar autenticación basada en roles + Página de error + Usada cuando alguien hace login, pero no tiene acceso + Elija cómo restringir el acceso a esta página + %0% está protegido + Protección borrada de %0% + Página de login + Elija la página que contenga el formulario de login + Borrar protección + Elija las páginas que contendrán el formulario de login y mensajes de error + Elija los roles que tendrán acceso a esta página + Elija el login y password para esta página + Protección de usuario único + Si sólo necesita configurar una protección simple usando un único login y password + + + %0% no ha podido ser publicado, debido a que una extensión de otro proveedor ha cancelado la acción. + Incluir las páginas hija sin publicar + Publicación en progreso - por favor, espera... + Se han publicado %0% de %1% páginas... + %0% se ha publicado + %0% y sus subpáginas se han publicado + Publicar %0% y todas sus subpáginas + aceptar para publicar %0% y por lo tanto, hacer que su contenido esté disponible al público.

Puedes publicar esta página y todas sus subpáginas marcando publicar todos los hijos debajo. ]]>
+ + + Añadir un enlace externo + Añadir un enlace interno + Añadir + Título + Página interna + Enlace + Bajar + Subir + Abrir en una nueva ventana + Quitar el enlace + + + Versión actual + Red el texto de la versión seleccionada no se mostrará. , green means added]]> + Se ha recuperado la última versión del documento. + Esto muestra la versión seleccionada como html, si desea ver la diferencia entre 2 versiones al mismo tiempo, por favor use la vista diff + Volver a + Elija versión + Vista + + + Editar fichero de script + + + Conserje + Contenido + Mensajero + Desarrollador + Asistente de configuración de Umbraco + Media + Miembros + Boletín informativo + Ajustes + Estadísticas + Traducción + Usuarios + Ayuda + Analytics + + + Plantilla por defecto + Clave de diccionario + Para importar un tipo de documento encuentre el fichero ".udt" en su ordenador haciendo click sobre el botón "Navegar" y pulsando "Importar" (se le solicitará confirmación en la siguiente pantalla) + Nuevo nombre de la pestaña + Tipo de nodo + Tipo + Hoja de estilos + Propiedades de la hoja de estilos + Pestaña + Nombre de la pestaña + Pestañas + Tipo de Contenido Maestro activado + Este Tipo de Contenido usa + como Tipo de Contenido Maestro. Las pestañas para los Tipos de Contenido Maestros no se muestran y solo se pueden modificar desde el Tipo de Contenido Maestro + No existen propiedades para esta pestaña. Haga clic en el enlace "añadir nueva propiedad" para crear una nueva propiedad. + Tipo de documento Maestro + Crear template correspondiente + + + Sort order + Creation date + Ordenación completa. + Arrastra las diferentes páginas debajo para colocarlas como deberían estar. O haz click en las cabeceras de las columnas para ordenar todas las páginas + +
No cierre esta ventana mientras se está ordenando ]]>
+ + + La publicación fue cancelada por un complemento de terceros + El tipo de propiedad ya existe + Tipo de propiedad creado + Tipo de Dato: %1%]]> + Tipo de propiedad eliminado + Tipo de contenido guardado + Pestaña creada + Pestaña eliminada + Pestaña con id: %0% eliminada + La hoja de estilos no se ha guardado + Hoja de estilos guardada + La hoja de estilos se ha guardado sin errores + Tipo de dato guardado + Elemento del diccionario guardado + La publicación ha fallado porque la página padre no está publicada + Contenido publicado + y visible en el sitio web + Contenido guardado + Recuerda publicar para hacer los cambios visibles + Mandado para ser aprobado + Los cambios se han mandado para ser aprobados + Miembro guardado + Propiedad de la hoja de estilos guardada + Hoja de estilos guardada + Plantilla guardada + Error grabando usuario (comprueba el log) + Usuario grabado + El archivo no se ha guardado + El archivo no se ha grabado. Por favor, comprueba los permisos de los ficheros + Archivo guardado + Archivo grabado sin errores + Lenguaje guardado + El script en Python no se ha guardado + El script en Python no se ha podido guardar debido a un error + Script en Python guardado + No hay errores en el script en Python + La plantilla no se ha guardado + Por favor, asegúrate de que no hay 2 plantillas con el mismo alias + Plantilla guardada + Plantilla guardada sin errores + El XSLT no se ha guardado + El XSLT tenía un error + El XSLT no se ha podido guardar, comprueba los permisos de los ficheros + XSLT guardado + No hay errores en el XSLT + + + Usa sintaxis CSS, p.ej.: h1, .redHeader, .blueTex + Editar hoja de estilos + Editar propiedades de la hoja de estilos + Nombre para identificar la propiedad del estilo en el editor de texto rico + Previsualizar + Estilos + + + Editar plantilla + Insertar área de contenido + Insertar marcador de posición de área de contenido + Insertar objeto del diccionario + Insertar macro + Insertar campo de página de Umbraco + Plantilla principal + Guía rápida sobre las etiquetas de plantilla de Umbraco + Plantilla + + + Insertar control + Choose layout + Añade más filas + Add content + Drop content + Settings applied + + This content is not allowed here + This content is allowed here + + Plantillas de Grid + Las plantillas son el área de trabajo para el editor de grids, normalmente sólo necesitas una o dos plantillas diferentes + Añadir plantilla de grid + Ajusta la plantilla configurando la anchura de las columnas y añadiendo más secciones + + Configuraciones de filas + Las filas son celdas predefinidas que se disponen horizontalmente + Añade una configuración de fila + Ajusta la fila configurando los anchos de cada celda y añadiendo más celdas + + Columnas + Número total de columnas en la plantilla del grid + + Configuración + Configura qué ajustes pueden cambiar los editores + + + Estilos + Configura qué estilos pueden cambiar los editores + + La configuración sólo se guardará si el json introducido es válido + + Permitir todos los controles de edición + Permitir todas las configuraciones de fila + + + Campo opcional + Texto opcional + MAYÚSCULA/minúscula + Elegir campo + Convertir a salto de línea + Reemplaza los saltos de línea con la etiqueta HTML &lt;br&gt; + Si, solamente la fecha + Cambiar formato a fecha + Codificar HTML + Se reemplazarán los caracteres especiales por su código HTML equivalente. + Será insertado después del valor del campo + Será insertado antes del valor del campo + Minúscula + Ninguno/ninguna + Insertar después del campo + Insertar antes del campo + Recursivo + Mayúscula + Codificar URL + Formateará los caracteres especiales de las URLs + Sólo será usado cuando el campo superior esté vacio + Este campo será usado unicamente si el campo primario está vacío + Si, con el tiempo. Separador: + + + Tareas asignadas a usted + asignadas a usted. Para acceder a la vista detallaa incluyendo comentarios, haga click sobre "Detalles" o sobre el nombre de la página. También puede descargar la página como XML directamente pulsando sobre el enlace "Descarga XML".
Para terminar la tarea de traducción, por favor dirijase a la vista de detalles y haga click sobre el botón de "Cerrar". ]]>
+ cerrar tarea + Detalles de traducción + Descargar todas las tareas pendientes de traducción como archivo xml + Descargar xml + Descargar xml DTD + Campos + Incluir subpáginas + + Tarea para tradudir [%0%] por %1% + No se encontraron usuarios traductores. Por favor, crea un usuario traductor antes de empezar a mandar contenido para su traducción + Tareas creadas por ti + creadas por tí. Para ver una vista detallada incluyendo los comentarios, pulsa en "Detalles" o tan solo en el nombre de la página. También puedes descargar la página como XML directamente pulsando en el enlace "Descargar Xml". Para cerrar una tarea de traducción, por favor ve a la vista de Detalles y pulsa el botón de "Cerrar".]]> + La página '%0%' se ha mandado a traducción + Manda la página '%0%' a traducción + Asignada por + Tarea abierta + Total de palabras + Traducir a + Traducción hecha. + Puedes previsualizar las páginas que acabas de traducir, pulsando debajo. Si la página original existe, se mostrará una comparación de las 2 páginas. + La traducción ha fallado. El archivo xml es inválido + Opciones para traducir + Traductor + Subir traducción xml + + + Caché del navegador + Papelera de reciclaje + Paquetes creados + Tipos de datos + Diccionario + Paquetes instalados + Instalar skin + Instalar starter kit + Idiomas + Instalar paquete local + Macros + Tipos de medios + Miembros + Grupos de miembros + Roles + Tipos de miembros + Tipos de documento + Paquetes + Paquetes + Ficheros Python + Instalar desde repositorio + Instalar pasarela + Módulos pasarela + Ficheros de script + Scripts + Hojas de estilo + Plantillas + Archivos XSLT + + + Existe una nueva actualización + %0% esta listo, pulsa aquí para descargar + No hay conexión al servidor + Error al comprobar la actualización. Por favor revisa "trace-stack" para conseguir más información. + + + Administrador + Campo de categoria + Cambiar contraseña + Change Your Password + Confirm new password + Puede cambiar su contraseña para acceder al 'back office' de Umbraco rellenando el siguiente formulario y haciendo clic en el botón 'Cambiar contraseña' + Canal de contenido + Campo descriptivo + Deshabilitar usuario + Tipo de documento + Editor + Campo de citas + Idioma + Login + Nodo de comienzo en la libreria de medios + Secciones + Deshabilitar acceso a Umbraco + Contraseña + Reset password + Su contraseña ha sido cambiada + Por favor confirme su nueva contraseña + Introduzca su nueva contraseña + La nueva contraseña no puede estar vacía + Current password + Invalid current password + La nueva contraseña no coincide con la contraseña de confirmación. Por favor, vuela a intentarlo!' + La contraseña de confirmación no coincide con la nueva contraseña!' + Reemplazar los permisos de los nodos hijo + Estas modificando los permisos para las páginas: + Selecciona las páginas para modificar sus permisos + Buscar en todos los hijos + Nodo de comienzo en contenido + Nombre de usuario + Permisos de usuarios + Tipo de usuario + Tipos de usuarios + Redactor + Tu perfil + Tu historial reciente + La sesión caduca en + +
diff --git a/src/UmbracoUrlHandling/Umbraco/Config/Lang/fr.xml b/src/UmbracoUrlHandling/Umbraco/Config/Lang/fr.xml new file mode 100644 index 0000000..5fabc83 --- /dev/null +++ b/src/UmbracoUrlHandling/Umbraco/Config/Lang/fr.xml @@ -0,0 +1,1631 @@ + + + + The Umbraco community + http://our.umbraco.org/documentation/Extending-Umbraco/Language-Files + + + Gérer les noms d'hôtes + Informations d'audit + Parcourir + Changer le type de document + Copier + Créer + Créer un package + Supprimer + Désactiver + Vider la corbeille + Exporter un type + Importer un type + Importer un package + Editer dans Canvas + Déconnexion + Déplacer + Notifications + Accès public + Publier + Dépublier + Rafraîchir + Republier le site tout entier + Récupérer + Spécifiez les permissions pour la page %0% + Choisissez où déplacer + dans l'arborescence ci-dessous + Permissions + Version antérieure + Envoyer pour publication + Envoyer pour traduction + Trier + Envoyer pour publication + Traduire + Mettre à jour + Valeur par défaut + + + Permission refusée. + Ajouter un nouveau domaine + Supprimer + Noeud invalide. + Domaine invalide. + Domaine déjà assigné. + Langue + Domaine + Nouveau domaine '%0%' créé + Domaine '%0%' supprimé + Domaine '%0%' déjà assigné + Domaine '%0%' mis à jour + Editer les domaines actuels +
Les domaines contenant un chemin d'un niveau sont autorisés, ex : "example.com/en". Pour autant, cela + devrait être évité. Utilisez plutôt la gestion des noms d'hôte.]]>
+ Hériter + Culture + ou hériter de la culture des noeuds parents. S'appliquera aussi
+ au noeud courant, à moins qu'un domaine ci-dessous soit aussi d'application.]]>
+ Domaines + + + Aperçu pour + + + Vider la sélection + Choisir + Choisir le répertoire courant + Faire autre chose + Gras + Annuler l'indentation de paragraphe + Insérer un champ de formulaire + Insérer un entête graphique + Editer le HTML + Indenter le paragraphe + Italique + Centrer + Justifier à gauche + Justifier à droite + Insérer un lien + Insérer un lien local (ancre) + Liste à puces + Liste numérique + Insérer une macro + Insérer une image + Editer les relations + Retourner à la liste + Sauver + Sauver et publier + Sauver et envoyer pour approbation + Sauver la mise en page de la liste + Prévisualiser + La prévisualisation est désactivée car aucun modèle n'a été assigné. + Choisir un style + Afficher les styles + Insérer un tableau + Générer les modèles + Défaire + Refaire + + + Pour changer le type de document du contenu séléctionné, faites d'abord un choix dans la liste des types valides à cet endroit. + Puis modifiez si nécessaire la correspondance des propriétés du type actuel vers le nouveau, et cliquez sur Sauver. + Le contenu a été republié. + Propriété actuelle + Type actuel + Le type de document ne peut être changé car il n'y a pas d'alternative valide à cet endroit. Une alternative sera valide si elle est autorisée sous le parent du contenu sélectionné et si tous les éléments de contenu enfants existants peuvent être créés avec celle-ci. + Type de document modifié + Faire correspondre les propriétés + Faire correspondre à la propriété + Nouveau modèle + Nouveau type + aucun + Contenu + Choisir le nouveau Type de Document + Le type de document du contenu séléctionné a bien été changé en [new type] et les correspondances de propriétés suivantes effectuées : + en + Impossible de terminer la correspondance des propriétés car une ou plusieurs propriétés ont plus d'une correspondance définie. + Seuls les types de documents valides à cet endroit sont affichés. + + + A été publié + A propos de cette page + Alias + (comment décririez-vous l'image oralement) + Liens alternatifs + Cliquez pour éditer cet élément + Créé par + Auteur original + Mis à jour par + Créé + Date/heure à laquelle ce document a été créé + Type de Document + Edition + Expire le + Cet élément a été modifié après la publication + Cet élément n'est pas publié + Dernière publication + Il n'y a aucun élément à afficher + Il n'y a aucun élément à afficher dans cette liste. + Type de Média + Lien vers des média(s) + Groupe de membres + Rôle + Type de membre + Aucune date choisie + Titre de la page + Propriétés + Ce document est publié mais n'est pas visible car son parent '%0%' n'est pas publié + Oups : ce document est publié mais n'est pas présent dans le cache (erreur interne Umbraco) + Oups: impossible d'obtenir cet url (erreur interne - voir fichier log) + Oups: ce document est publié mais son url entrerait en collision avec le contenu %0% + Publier + Statut de publication + Publié le + Dépublié le + Supprimer la date + Ordre de tri mis à jour + Pour trier les noeuds, faites-les simplement glisser à l'aide de la souris ou cliquez sur les entêtes de colonne. Vous pouvez séléctionner plusieurs noeuds en gardant la touche "shift" ou "ctrl" enfoncée pendant votre séléction. + Statistiques + Titre (optionnel) + Texte alternatif (optionnel) + Type + Dépublier + Dernière édition + Date/heure à laquelle ce document a été édité + Supprimer le(s) fichier(s) + Lien vers un document + Membre du/des groupe(s) + Pas membre du/des groupe(s) + Eléments enfants + Cible + Ceci se traduit par l'heure suivante sur le serveur : + Qu'est-ce que cela signifie?]]> + Ajouter un autre champ texte + Enlever ce champ texte + + + Cliquez pour télécharger + Faites glisser vos fichier ici... + Lien vers le média + ou cliquez ici pour choisir un fichier + Les seuls types de fichiers autorisés sont + La taille maximum de fichier est + + + Créer un nouveau membre + Tous les membres + + + Où voulez-vous créer le nouveau %0% + Créer un élément sous + Choisissez un type et un titre + "Types de documents".]]> + "Types de médias".]]> + Type de document sans modèle + Nouveau répertoire + Nouveau type de données + Nouveau fichier javascript + Nouvelle vue partielle vide + Nouvelle macro pour vue partielle + Nouvelle vue partielle à partir d'un snippet + Nouvelle macro pour vue partielle vide + Nouvelle macro pour vue partielle à partir d'un snippet + Nouvelle macro pour vue partielle (sans macro) + + + Parcourir votre site + - Cacher + Si Umbraco ne s'ouvre pas, peut-être devez-vous autoriser l'ouverture des popups pour ce site. + s'est ouvert dans une nouvelle fenêtre + Redémarrer + Visiter + Bienvenue + + + Rester + Invalider les changements + Vous avez des changements en cours + Etes-vous certain(e) de vouloir quitter cette page? - vous avez des changements en cours + + + Terminé + + %0% élément supprimé + %0% éléments supprimés + %0% élément sur %1% supprimé + %0% éléments sur %1% supprimés + + %0% élément publié + %0% éléments publiés + %0% élément sur %1% publié + %0% éléments sur %1% publiés + + %0% élément dépublié + %0% éléments dépubliés + %0% élément sur %1% dépublié + %0% éléments sur %1% dépubliés + + %0% élément déplacé + %0% éléments déplacés + %0% élément sur %1% déplacé + %0% éléments sur %1% déplacés + + %0% élément copié + %0% éléments copiés + %0% élément sur %1% copié + %0% éléments sur %1% copiés + + + Nom + Gérer les noms d'hôtes + Fermer cette fenêtre + Êtes-vous certain(e) de vouloir supprimer + Êtes-vous certain(e) de vouloir désactiver + Cochez cette case pour confirmer la suppression de %0% élément(s) + Êtes-vous certain(e)? + Êtes-vous certain(e)? + Couper + Editer une entrée du Dictionnaire + Modifier la langue + Insérer un lien local (ancre) + Insérer un caractère + Insérer un entête graphique + Insérer une image + Insérer un lien + Insérer une macro + Insérer un tableau + Dernière modification + Lien + Lien interne : + Si vous utilisez des ancres, insérez # au début du lien + Ouvrir dans une nouvelle fenêtre? + Paramètres de macro + Cette macro ne contient aucune propriété éditable + Coller + Editer les permissions pour + Les éléments dans la corbeille sont en cours de suppression. Ne fermez pas cette fenêtre avant que cette opération soit terminée. + La corbeille est maintenant vide + Les éléments supprimés de la corbeille seront supprimés définitivement + regexlib.com rencontre actuellement des problèmes sur lesquels nous n'avons aucun contrôle. Nous sommes sincèrement désolés pour le désagrément.]]> + Rechercher une expression régulière à ajouter pour la validation d'un champ de formulaire. Exemple: 'email, 'zip-code', 'url' + Supprimer la macro + Champ obligatoire + Le site a été réindéxé + Le cache du site a été mis à jour. Tous les contenus publiés sont maintenant à jour. Et tous les contenus dépubliés sont restés invisibles. + Le cache du site va être mis à jour. Tous les contenus publiés seront mis à jour. Et tous les contenus dépubliés resteront invisibles. + Nombre de colonnes + Nombre de lignes + Définir un placeholder ID. En mettant un ID sur votre placeholder, vous pouvez injecter du contenu à cet endroit depuis les modèles enfants, + en faisant référence à cet ID au sein d'un élément <asp:content />.]]> + Séléctionnez un placeholder id dans la liste ci-dessous. Vous pouvez seulement + choisir un ID se trouvant dans le parent du modèle actuel.]]> + Cliquez sur l'image pour la voir en taille réelle + Sélectionner un élément + Voir l'élément de cache + Créer un répertoire... + Lier à l'original + Inclure les descendants + La communauté la plus amicale + Lier à la page + Ouvre le document lié dans une nouvelle fenêtre ou un nouvel onglet + Lier à un media + Lier à un fichier + Sélectionner le media + Sélectionner l'icône + Sélectionner l'élément + Sélectionner le lien + Sélectionner la macro + Sélectionner le contenu + Sélectionner le membre + Sélectionner le groupe de membres + Aucune icone n'a été trouvée + Il n'y a pas de paramètres pour cette macro + Il n'y a pas de macro disponible à insérer + Fournisseurs externes d'identification + Détails de l'exception + Trace d'exécution + Exception interne + Liez votre + Enlevez votre + compte + Sélectionner un éditeur + Selectionner un snippet + + + %0%' ci-dessous.
Vous pouvez ajouter d'autres langues depuis le menu ci-dessous "Langues". + ]]>
+ Nom de Culture + Modifiez la clé de l'élément de dictionaire. + + + + + + Votre nom d'utilisateur + Votre mot de passe + Confirmation de votre mot de passe + Nommer %0%... + Entrez un nom... + Libellé... + Entrez une description... + Rechercher... + Filtrer... + Ajouter des tags (appuyer sur enter entre chaque tag)... + Entrez votre email + Votre nom d'utilisateur est généralement votre adresse email + + + Autoriser à la racine + Seuls les Types de Contenu qui ont ceci coché peuvent être créés au niveau racine des arborescences de contenu et de media + Types de noeuds enfants autorisés + Composition de Type de Documents + Créer + Supprimer l'onglet + Description + Nouvel onglet + Onglet + Miniature + Activer la vue liste + Configure l'élément de contenu de sorte à afficher une liste de ses enfants que l'on peut trier et filtrer, les enfants ne seront pas affichés dans l'arborescence + Liste courante + Le type de donnée de la liste courante + Créer une liste personnalisée + Supprimer la liste personnalisée + + + Ajouter une valeur de base + Type de donnée en base de donées + GUID du Property Editor + Property editor + Boutons + Activer les paramètres avancés pour + Activer le menu contextuel + Taille maximale par défaut des images insérées + CSS associées + Afficher le libellé + Largeur et hauteur + Tous les types de propriétés & les données de propriétés + utilisant ce type de données seront supprimés définitivement, veuillez confirmer que vous voulez également les supprimer + Oui, supprimer + et tous les types de propriétés & les données de propriétés utilisant ce type de données + Sélectionnez le répertoire où déplacer + dans l'arborescence ci-dessous + a été déplacé sous + + + Vos données ont été sauvegardées, mais avant de pouvoir publier votre page, il y a des erreurs que vous devez corriger : + Le Membership Provider n'autorise pas le changement des mots de passe (EnablePasswordRetrieval doit être défini à true) + %0% existe déjà + Des erreurs sont survenues : + Des erreurs sont survenues : + Le mot de passe doit contenir un minimum de %0% caractères et contenir au moins %1% caractère(s) non-alphanumerique + %0% doit être un entier + Le champ %0% dans l'onglet %1% est obligatoire + %0% est un champ obligatoire + %0% dans %1% n'est pas correctement formaté + %0% n'est pas correctement formaté + + + Le serveur a retourné une erreur + Le type de fichier spécifié n'est pas autorisé par l'administrateur + NOTE ! Même si CodeMirror est activé dans la configuration, il est désactivé dans Internet Explorer car il n'est pas suffisamment stable dans ce navigateur. + Veuillez remplir l'alias et le nom de la nouvelle propriété! + Il y a un problème de droits en lecture/écriture sur un fichier ou dossier spécifique + Erreur de chargement du script d'une Partial View (fichier : %0%) + Erreur de chargement du userControl '%0%' + Erreur de chargement d'un customControl (Assembly: %0%, Type: '%1%') + Erreur de chargement d'un script du MacroEngine (fichier : %0%) + "Erreur de parsing d'un fichier XSLT : %0% + "Erreur de lecture d'un fichier XSLT : %0% + Veuillez entrer un titre + Veuillez choisir un type + Vous allez définir une taille d'image supérieure à sa taille d'origine. Êtes-vous certain(e) de vouloir continuer? + Erreur dans le script Python + Le script Python n'a pas été sauvegardé car il contient des erreurs + Noeud de départ supprimé, contactez votre administrateur + Veuillez sélectionner du contenu avant de changer le style + Aucun style actif disponible + Veuillez placer le curseur à gauche des deux cellules que vous voulez fusionner + Vous ne pouvez pas scinder une cellule qui n'a pas été fusionnée. + Erreur dans le code source XSLT + Le XSLT n'a pas été sauvegardé car il contient des erreurs + Il y a une erreur de configuration du type de données utilisé pour cette propriété, veuillez vérifier le type de données. + + + A propos + Action + Actions + Ajouter + Alias + Tout + Êtes-vous certain(e)? + Retour + Bord + par + Annuler + Marge de cellule + Choisir + Fermer + Fermer la fenêtre + Commenter + Confirmer + Conserver + Conserver les proportions + Continuer + Copier + Créer + Base de données + Date + Défaut + Supprimer + Supprimé + Suppression... + Design + Dictionnaire + Dimensions + Bas + Télécharger + Editer + Edité + Eléments + Email + Erreur + Trouver + Premier + Hauteur + Aide + Icône + Importer + Marge intérieure + Insérer + Installer + Non valide + Justifier + Langue + Dernier + Mise en page + En cours de chargement + Bloqué + Connexion + Déconnexion + Déconnexion + Macro + Obligatoire + Déplacer + Plus + Nom + Nouveau + Suivant + Non + de + OK + Ouvrir + ou + Mot de passe + Chemin + Placeholder ID + Un moment s'il vous plaît... + Précédent + Propriétés + Email de réception des données de formulaire + Corbeille + Restant + Enlever + Renommer + Renouveller + Requis + Réessayer + Permissions + Rechercher + Désolé, nous ne pouvons pas trouver ce que vous recherchez + Aucun élément n'a été ajouté + Serveur + Montrer + Afficher la page à l'envoi + Taille + Trier + Envoyer + Type + Rechercher... + Haut + Mettre à jour + Upgrader + Télécharger + Url + Utilisateur + Nom d'utilisateur + Valeur + Voir + Bienvenue... + Largeur + Oui + Dossier + Résultats de recherche + Réorganiser + J'ai fini de réorganiser + Prévisualiser + Modifier le mot de passe + vers + Liste + Sauvegarde... + actuel + Intégrer + sélectionné + + + + Noir + Vert + Jaune + Orange + Bleu + Rouge + + + + Ajouter un onglet + Ajouter une propriété + Ajouter un éditeur + Ajouter un modèle + Ajouter un noeud enfant + Ajouter un enfant + + Editer le type de données + + Parcourir les sections + + Raccourcis + afficher les raccourcis + + Passer à la vue en liste + Basculer vers l'autorisation comme racine + + Commenter/Décommenter les lignes + Supprimer la ligne + Copier les lignes vers le haut + Copier les lignes vers le bas + Déplacer les lignes vers le haut + Déplacer les lignes vers le bas + + Général + Editeur + + + + Couleur de fond + Gras + Couleur de texte + Police + Texte + + + + Page + + + Le programme d'installation ne parvient pas à se connecter à la base de données. + Impossible de sauvegarder le fichier web.config. Veuillez modifier la "connection string" manuellement. + Votre base de données a été détectée et est identifiée comme étant + Configuration de la base de données + installer pour installer la base de données Umbraco %0% + ]]> + Suivant pour poursuivre.]]> + Base de données non trouvée ! Veuillez vérifier les informations de la "connection string" dans le fichier web.config.

+

Pour poursuivre, veuillez éditer le fichier "web.config" (avec Visual Studio ou votre éditeur de texte favori), scroller jusqu'en bas, ajouter le "connection string" pour votre base de données dans la ligne avec la clé "umbracoDbDSN" et sauvegarder le fichier.

+

+ Cliquez sur le bouton Réessayer lorsque cela est fait. +
+ Plus d'informations sur l'édition du fichier web.config ici.

]]>
+ + Veuillez contacter votre fournisseur de services internet si nécessaire. + Si vous installez Umbraco sur un ordinateur ou un serveur local, vous aurez peut-être besoin de consulter votre administrateur système.]]> + + Appuyez sur le bouton Upgrader pour mettre à jour votre base de données vers Umbraco %0%

+

+ N'ayez pas d'inquiétude : aucun contenu ne sera supprimé et tout continuera à fonctionner parfaitement par après ! +

+ ]]>
+ Appuyez sur Suivant pour + poursuivre. ]]> + Suivant pour poursuivre la configuration]]> + Le mot de passe par défaut doit être modifié !]]> + L'utilisateur par défaut a été désactivé ou n'a pas accès à Umbraco!

Aucune autre action n'est requise. Cliquez sur Suivant pour poursuivre.]]> + Le mot de passe par défaut a été modifié avec succès depuis l'installation!

Aucune autre action n'est requise. Cliquez sur Suivant pour poursuivre.]]> + Le mot de passe a été modifié ! + + Umbraco crée un utilisateur par défaut avec le login ('admin') et le mot de passe ('default'). Il est important que ce mot de passe soit + modifié en quelque-chose de sécurisé et unique. +

+

+ Cette étape va vérifier le mot de passe utilisateur par défaut et suggèrera de le modifier si nécessaire. +

+ ]]>
+ Pour bien commencer, regardez nos vidéos d'introduction + En cliquant sur le bouton "Suivant" (ou en modifiant umbracoConfigurationStatus dans le fichier web.config), vous acceptez la licence de ce logiciel telle que spécifiée dans le champ ci-dessous. Veuillez noter que cette distribution Umbraco consiste en deux licences différentes, la licence open source MIT pour le framework et la licence Umbraco freeware qui couvre l'UI. + Pas encore installé. + Fichiers et dossiers concernés + Plus d'informations sur la configuration des permissions + Vous devez donner à ASP.NET les droits de modification sur les fichiers/dossiers suivants + Vos configurations de permissions sont presque parfaites !

+ Vous pouvez faire fonctionner Umbraco sans problèmes, mais vous ne serez pas en mesure d'installer des packages, ce qui est hautement recommandé pour tirer pleinement profit d'Umbraco.]]>
+ Comment résoudre + Cliquez ici pour lire la version texte + tutoriel vidéo sur la définition des permissions des répertoires pour Umbraco, ou lisez la version texte.]]> + Vos configurations de permissions pourraient poser problème ! +

+ Vous pouvez faire fonctionner Umbraco sans problèmes, mais vous ne serez pas en mesure d'installer des packages, ce qui est hautement recommandé pour tirer pleinement profit d'Umbraco.]]>
+ Vos configurations de permissions ne sont pas prêtes pour Umbraco ! +

+ Pour faire fonctionner Umbraco, vous aurez besoin de mettre à jour les permissions sur les fichiers/dossiers.]]>
+ Vos configurations de permissions sont parfaites !

+ Vous êtes prêt(e) à faire fonctionner Umbraco et à installer des packages !]]>
+ Résoudre un problème sur un dossier + Suivez ce lien pour plus d'informations sur les problèmes avec ASP.NET et la création de dossiers + Définir les permissions de dossier + + Je veux démarrer "from scratch" + Apprenez comment) + Vous pouvez toujours choisir d'installer Runway plus tard. Pour cela, allez dans la section "Développeur" et sélectionnez "Packages". + ]]> + Vous venez de mettre en place une plateforme Umbraco toute nette. Que voulez-vous faire ensuite ? + Runway est installé + + Voici la liste des modules recommandés, cochez ceux que vous souhaitez installer, ou regardez la liste complète des modules + ]]> + Recommandé uniquement pour les utilisateurs expérimentés + Je veux commencer avec un site simple + + "Runway" est un site simple qui fournit des types de documents et des modèles de base. L'installateur peut mettre en place Runway automatiquement pour vous, + mais vous pouvez facilement l'éditer, l'enrichir, ou le supprimer par la suite. Il n'est pas nécessaire, et vous pouvez parfaitement vous en passer pour utiliser Umbraco. Cela étant dit, + Runway offre une base facile, fondée sur des bonnes pratiques, pour vous permettre de commencer plus rapidement que jamais. + Si vous choisissez d'installer Runway, vous pouvez sélectionner en option des blocs de base, appelés Runway Modules, pour enrichir les pages de votre site. +

+ + Inclus avec Runway : Home page, Getting Started page, Installing Modules page.
+ Modules optionnels : Top Navigation, Sitemap, Contact, Gallery. +
+ ]]>
+ Qu'est-ce que Runway + Etape 1/5 : Accepter la licence + Etape 2/5 : Configuration de la base de données + Etape 3/5 : Validation des permissions de fichiers + Etape 4/5 : Sécurité Umbraco + Etape 5/5 : Umbraco est prêt + Merci d'avoir choisi Umbraco + Parcourir votre nouveau site +Vous avez installé Runway, alors pourquoi ne pas jeter un oeil au look de votre nouveau site ?]]> + Aide et informations complémentaires +Obtenez de l'aide de notre "award winning" communauté, parcourez la documentation ou regardez quelques vidéos gratuites sur la manière de construire un site simple, d'utiliser les packages ainsi qu'un guide rapide sur la terminologie Umbraco]]> + Umbraco %0% est installé et prêt à être utilisé + fichier /web.config et mettre à jour le paramètre AppSetting umbracoConfigurationStatus situé en bas à la valeur '%0%'.]]> + démarrer instantanément en cliquant sur le bouton "Lancer Umbraco" ci-dessous.
+Si vous débutez avec Umbraco, vous pouvez trouver une foule de ressources dans nos pages "Getting Started".]]>
+ Lancer Umbraco +Pour gérer votre site, ouvrez simplement le backoffice Umbraco et commencez à ajouter du contenu, à mettre à jour les modèles d'affichage et feuilles de styles ou à ajouter de nouvelles fonctionnalités]]> + La connexion à la base de données a échoué. + Umbraco Version 3 + Umbraco Version 4 + Regarder + Umbraco %0%, qu'il s'agisse d'une nouvelle installation ou d'une mise à jour à partir de la version 3.0 +

+ Appuyez sur "suivant" pour commencer l'assistant.]]>
+ + + Code de la Culture + Nom de la culture + + + Vous avez été inactif et la déconnexion aura lieu automatiquement dans + Renouvellez votre session maintenant pour sauvegarder votre travail + + + Joyeux dimanche + Joyeux lundi + Joyeux mardi + Joyeux mercredi + Joyeux jeudi + Joyeux vendredi + Joyeux samedi + Connectez-vous ci-dessous + Identifiez-vous avec + La session a expiré + © 2001 - %0%
Umbraco.com

]]>
+ Mot de passe oublié? + Un email contenant un lien pour ré-initialiser votre mot de passe sera envoyé à l'adresse spécifiée + Un email contenant les instructions de ré-initialisation de votre mot de passe sera envoyée à l'adresse spécifiée si elle correspond à nos informations. + Revenir au formulaire de connexion + Veuillez fournir un nouveau mot de passe + Votre mot de passe a été mis à jour + Le lien sur lequel vous avez cliqué est non valide ou a expiré. + Umbraco: Ré-initialiser le mot de passe + + Votre nom d'utilisateur pour vous connecter au back-office Umbraco est : %0%.

Cliquez ici pour ré-initialiser votre mot de passe, ou recopiez cet URL dans votre navigateur :

%1%

]]> +
+ + + Tableau de bord + Sections + Contenu + + + Choisissez la page au-dessus... + %0% a été copié dans %1% + Choisissez ci-dessous l'endroit où le document %0% doit être copié + %0% a été déplacé dans %1% + Choisissez ci-dessous l'endroit où le document %0% doit être déplacé + a été choisi comme racine de votre nouveau contenu, cliquez sur 'ok' ci-dessous. + Aucun noeud n'a encore été choisi, veuillez choisir un noeud dans la liste ci-dessus avant de cliquer sur 'ok'. + Le noeud actuel n'est pas autorisé sous le noeud choisi à cause de son type + Le noeud actuel ne peut pas être déplacé dans une de ses propres sous-pages + Le noeud actuel ne peut pas exister à la racine + L'action n'est pas autorisée car vous n'avez pas les droits suffisants sur un ou plusieurs noeuds enfants. + Relier les éléments copiés à l'original + + + Editez vos notifications pour %0% + + Hello %0%

+ +

Ceci est un email automatique pour vous informer que la tâche '%1%' + a été executée sur la page '%2%' + par l'utilisateur '%3%' +

+ +

+

Résumé de la mise à jour :

+ + %6% +
+

+ + + +

Bonne journée !

+ Avec les salutations du Robot Umbraco +

]]>
+ La notification [%0%] à propos de %1% a été executée sur %2% + Notifications + + + + et localisez le package. Les packages Umbraco ont généralement une extension ".umb" ou ".zip". + ]]> + Déposez pour uploader + ou cliquez ici pour choisir les fichiers + Uploader un package + Installez un package local en le sélectionnant sur votre ordinateur. Installez uniquement des packages de sources fiables que vous connaissez + Uploader un autre package + Annuler et uploader un autre package + Licence + J'accepte + les conditions d'utilisation + Installer le package + Terminer + Packages installés + Vous n'avez aucun package installé + 'Packages' en haut à droite de votre écran]]> + Chercher des packages + Résultats pour + Nous n'avons rien pu trouver pour + Veuillez essayer de chercher un autre package ou naviguez à travers les catégories + Populaires + Nouvelles releases + a + points de karma + Information + Propriétaire + Contributeurs + Créé + Version actuelle + version .NET + Téléchargements + Coups de coeur + Compatibilité + Ce package est compatible avec les versions suivantes de Umbraco, selon les rapports des membres de la communauté. Une compatibilité complète ne peut pas être garantie pour les versions rapportées sous 100% + Sources externes + Auteur + Démo + Documentation + Meta data du package + Nom du package + Le package ne contient aucun élément +
+ Vous pouvez supprimer tranquillement ce package de votre installation en cliquant sur "Désinstaller le package" ci-dessous.]]>
+ Aucune mise à jour disponible + Options du package + Package readme + Repository des packages + Confirmation de désinstallation + Le package a été désinstallé + Le package a été désinstallé avec succès + Désinstaller le package + + Remarque : tous les documents, media etc. dépendant des éléments que vous supprimez vont cesser de fonctionner, ce qui peut provoquer une instabilité du système, + désinstallez donc avec prudence. En cas de doute, contactez l'auteur du package.]]> + Télécharger la mise à jour depuis le repository + Mettre à jour le package + Instructions de mise à jour + Il y a une mise à jour disponible pour ce package. Vous pouvez la télécharger directement depuis le repository des packages Umbraco. + Version du package + Historique des versions du package + Voir le site internet du package + Package déjà installé + Ce package ne peut pas être installé, il nécessite au minimum la version Umbraco %0% + Désinstallation... + Téléchargement... + Import... + Installation... + Redémarrage, veuillez patienter... + Terminé, votre navigateur va être rafraîchi, veuillez patienter... + Veuillez cliquer sur terminer pour compléter l'installation et recharger la page. + Package en cours de chargement... + + + Coller en conservant le formatage (non recommandé) + Le texte que vous tentez de coller contient des caractères spéciaux ou du formatage. Cela peut être dû à une copie d'un texte depuis Microsoft Word. Umbraco peut supprimer automatiquement les caractères spéciaux et le formatage, de manière à ce que le texte collé convienne mieux pour le Web. + Coller en tant que texte brut sans aucun formatage + Coller, mais supprimer le formatage (recommandé) + + + Protection basée sur les rôles + via les groupes de membres Umbraco.]]> + Vous devez créer un groupe avant de pouvoir utiliser l'authentification basée sur les rôles + Page d'erreur + Utilisé pour les personnes connectées, mais qui n'ont pas accès + Choisissez comment restreindre l'accès à cette page + %0% est maintenant protégée + Protection supprimée de %0% + Page de connexion + Choisissez la page qui contient le formulaire de connexion + Supprimer la protection + Choisissez les pages qui contiennent le formulaire de connexion et les messages d'erreur + Choisissez les rôles qui ont accès à cette page + Définissez l'identifiant et le mot de passe pour cette page + Protection utilisateur unique + Si vous souhaitez mettre en place une protection simple utilisant un identifiant et un mot de passe uniques + + + + + + + + + + Inclure les pages enfant non publiées + Publication en cours - veuillez patienter... + %0% pages sur %1% ont été publiées... + %0% a été publié + %0% et ses pages enfants ont été publiées + Publier %0% et toutes ses pages enfant + Publier pour publier %0% et la rendre ainsi accessible publiquement.

+ Vous pouvez publier cette page et toutes ses sous-pages en cochant Inclure les pages enfant non pubiées ci-dessous. + ]]>
+ + + Vous n'avez configuré aucune couleur approuvée + + + introduire un lien externe + choisir une page interne + Légende + Lien + Ouvrir dans une nouvelle fenêtre + introduisez la légende à afficher + Introduiser le lien + + + Réinitialiser + Définir le recadrage + Donnez un alias au recadrage ainsi que sa largeur et sa hauteur par défaut + Sauvegarder le recadrage + Ajouter un nouveau recadrage + + + Version actuelle + Le texte en Rouge signifie qu'il a été supprimé de la version choisie, vert signifie ajouté]]> + Le document a été restauré à une version antérieure + Ceci affiche la version choisie en tant que HTML, si vous souhaitez voir les différences entre les deux versions en même temps, utilisez la vue différentielle + Revenir à + Choisissez une version + Voir + + + Editer le fichier de script + + + Concierge + Contenu + Courier + Développeur + Assistant de configuration Umbraco + Medias + Membres + Newsletters + Configuration + Statistiques + Traduction + Utilisateurs + Aide + Formulaires + Analytics + + + aller à + Rubriques d'aided pour + Chapitres vidéo pour + Les meilleurs tutoriels vidéo Umbraco + + + Modèle par défaut + Clé de dictionnaire + Pour importer un type de document, trouvez le fichier ".udt" sur votre ordinateur en cliquant sur le bouton "Parcourir" et cliquez sur "Importer" (une confirmation vous sera demandée à l'écran suivant) + Titre du nouvel onglet + Type de noeud + Type + Feuille de style + Script + Propriété de feuille de style + Onglet + Titre de l'onglet + Onglets + Type de contenu de base activé + Ce type de contenu utilise + en tant que type de contenu de base. Les onglets du type de contenu de base ne sont pas affichés et peuvent seulement être modifiés à partir du type de contenu de base lui-même. + Aucune propriété définie dans cet onglet. Cliquez sur le lien "Ajouter une nouvelle propriété" en-haut pour créer une nouvelle propriété. + Type de contenu de base + Créer le modèle correspondant + Ajouter une icône + + + Ordre de tri + Date de création + Tri achevé. + Faites glisser les différents éléments vers le haut ou vers le bas pour définir la manière dont ils doivent être organisés. Ou cliquez sur les entêtes de colonnes pour trier la collection complète d'éléments +
Ne fermez pas cette fenêtre durant le tri.]]>
+ + + Validation + Les erreurs de validation doivent être corrigées avant de pouvoir sauvegarder l'élément + Echec + Permissions utilisateur insuffisantes, l'opération n'a pas pu être complétée + Annulation + L'opération a été annulée par une extension tierce + La publication a été annulée par une extension tierce. + Le type de propriété existe déjà + Type de propriété créé + Type de données : %1%]]> + Type de propriété supprimé + Type de documet sauvegardé + Onglet créé + Onglet supprimé + Onglet avec l'ID : %0% supprimé + Feuille de style non sauvegardée + Feuille de style sauvegardée + Feuille de style sauvegardée sans erreurs + Type de données sauvegardé + Elément de dictionnaire sauvegardé + La publication a échoué car la page parent n'est pas publiée + Contenu publié + et visible sur le site + Contenu sauvegardé + N'oubliez pas de publier pour rendre les modifications visibles + Envoyer pour approbation + Les modifications ont été envoyées pour approbation + Media sauvegardé + Media sauvegardé sans erreurs + Membre sauvegardé + Propriété de feuille de style sauvegardée + Feuille de style sauvegardée + Modèle sauvegardé + Erreur lors de la sauvegarde de l'utilisateur (consultez les logs) + Utilisateur sauvegardé + Type d'utilisateur sauvegardé + Fichier non sauvegardé + Le fichier n'a pas pu être sauvegardé. Vérifiez les permissions de fichier. + Fichier sauvegardé + Fichier sauvegardé sans erreurs + Langue sauvegardée + Type de média sauvegardé + Type de membre sauvegardé + Le script Python n'a pas été sauvegardé + Le script Python n'a pas été sauvegardé à cause d'erreurs + Le script Python a été sauvegardé + Aucune erreur dans le script Python + Modèle non sauvegardé + Assurez-vous de ne pas avoir 2 modèles avec le même alias. + Modèle sauvegardé + Modèle sauvegardé sans aucune erreurs ! + Le XSLT n'a pas été sauvegardé + Le XSLT contenait une erreur + Le XSLT n'a pas pu être sauvegardé, vérifiez les permissions de fichier + Le XSLT a été sauvegardé + Aucune erreur dans le XSLT + Contenu publié + Vue partielle sauvegardée + Vue partielle sauvegardée sans erreurs ! + Vue partielle non sauvegardée + Une erreur est survenue lors de la sauvegarde du fichier. + Vue script sauvegardée + Vue script sauvegardée sans erreur ! + Vue script non sauvegardée + Une erreur est survenue lors de la sauvegarde du fichier. + Une erreur est survenue lors de la sauvegarde du fichier. + + + Utilise la syntaxe CSS. Ex : h1, .redHeader, .blueTex + Editer la feuille de style + Editer la propriété de feuille de style + Donner un nom pour identifier la propriété dans le Rich Text Editor + Prévisualiser + Styles + + + + Editer le modèle + + Sections + Insérer une zone de contenu + Insérer un placeholder de zone de contenu + + Insérer + Choisissez l'élément à insérer dans votre modèle + + Elément de dictionnaire + Un élément de dictionnaire est un espace pour un morceau de texte traduisible, ce qui facilite la création de designs pour des sites web multilangues. + + Macro + + Une Macro est un composant configurable, ce qui est génial pour les parties réutilisables de votre + design où vous devez pouvoir fournir des paramètres, + comme les galeries, les formulaires et les listes. + + + Valeur + Affiche la valeur d'un des champs de la page en cours, avec des options pour modifier la valeur ou spécifier des valeurs alternatives. + + Vue partielle + + Une vue partielle est un fichier modèle séparé qui peut être à l'intérieur d'un aute modèle, + c'est génial pour réutiliser du markup ou pour séparer des modèles complexes en plusieurs fichiers. + + + Modèle de base + Pas de modèle de base + Pas de modèle + + Afficher un modèle enfant + + @RenderBody(). + ]]> + + + + Définir une section nommée + + @section { ... }. Celle-ci peut être affichée dans une région + spécifique du parent de ce modèle, en utilisant @RenderSection. + ]]> + + + Afficher une section nommée + + @RenderSection(name). + Ceci affiche une région d'un modèle enfant qui est entourée d'une définition @section [name]{ ... } correspondante. + ]]> + + + Nom de la section + La section est obligatoire + + Si obligatoire, le modèle enfant doit contenir une définition @section, sinon une erreur est affichée. + + + + Générateur de requêtes + Générer une requête + éléments trouvés, en + + Je veux + tout le contenu + le contenu du type "%0%" + à partir de + mon site web + + et + + est + n'est pas + avant + avant (incluant la date sélectionnée) + après + après (incluant la date sélectionnée) + égal + n'est pas égal + contient + ne contient pas + supérieur à + supérieur ou égal à + inférieur à + inférieur ou égal à + + Id + Nom + Date de Création + Date de Dernière Modification + + trier par + ascendant + descendant + + Modèle + + + + + Choisissez le type de contenu + Choisissez une mise en page + Ajouter une ligne + Ajouter du contenu + Supprimer le contenu + Paramètres appliqués + + Ce contenu n'est pas autorisé ici + Ce contenu est autorisé ici + + Cliquez pour intégrer + Cliquez pour insérer une image + Légende de l'image... + Ecrivez ici... + + Mises en pages de la Grid + Les mises en pages représentent la surface de travail globale pour l'éditeur de grille, en général, vous n'avez seulement besoin que d'une ou deux mises en pages différentes + Ajouter une mise en page de grille + Ajustez la mise en page en définissant la largeur des colonnes et en ajoutant des sections supplémentaires + Configurations des rangées + Les rangées sont des cellules prédéfinies disposées horizontalement + Ajouter une configuration de rangée + Ajustez la rangée en réglant la largeur des cellules et en ajoutant des cellules supplémentaires + + Colonnes + Nombre total combiné de colonnes dans la configuration de la grille + + Paramètres + Configurez les paramètres qui peuvent être modifiés par les éditeurs + + Styles + Configurez les effets de style qui peuvent être modifiés par les éditeurs + + Les paramètres ne seront sauvegardés que si la configuration json saisie est valide + + Autoriser tous les éditeurs + Autoriser toutes les configurations de rangées + Configurer comme défaut + Choisir en plus + Choisir le défaut + ont été ajoutés + + + + + Compositions + Vous n'avez pas ajouté d'onglet + Ajouter un nouvel onglet + Ajouter un autre onglet + Hérité de + Ajouter une propriété + Label requis + + Activer la vue en liste + Configure l'élément de contenu de manière à afficher ses éléments enfants sous forme d'une liste que l'on peut trier et filtrer, les enfants ne seront pas affichés dans l'arborescence + + Modèles autorisés + Sélectionnez les modèles que les éditeurs sont autorisés à utiliser pour du contenu de ce type. + + Autorisé comme racine + Autorisez les éditeurs à créer du contenu de ce type à la racine de l'arborescence de contenu. + Oui - autoriser du contenu de ce type à la racine + + Types de noeuds enfants autorisés + Autorisez la création de contenu des types spécifiés sous le contenu de ce type-ci + + Choisissez les noeuds enfants + + Hériter des onglets et propriétés d'un type de document existant. De nouveaux onglets seront ajoutés au type de document actuel, ou fusionnés s'il existe un onglet avec un nom sililaire. + Ce type de contenu est utilisé dans une composition, et ne peut donc pas être lui-même un composé. + Il n'y a pas de type de contenu disponible à utiliser dans une composition. + + Editeurs disponibles + Réutiliser + Configuration de l'éditeur + + Configuration + + Oui, supprimer + + a été déplacé en-dessous + a été copié en-dessous + Sélectionnez le répertoire à déplacer + Sélectionnez le répertoire à copier + dans l'arborescence ci-dessous + + Tous les types de document + Tous les documents + Tous les éléments media + + utilisant ce type de document seront supprimés définitivement, veuillez confirmer que vous souhaitez les supprimer également. + utilisant ce type de media seront supprimés définitivement, veuillez confirmer que vous souhaitez les supprimer également. + utilisant ce type de membre seront supprimés définitivement, veuillez confirmer que vous souhaitez les supprimer également + + et tous les documents utilisant ce type + et tous les éléments media utilisant ce type + et tous les membres utilisant ce type + + utilisant cet éditeur seront mis à jour avec la nouvelle configuration + + Le membre peut éditer + Afficher dans le profil du membre + + + + + Ajouter un champ de rechange + Champ de rechange + Ajouter une valeur par défaut + Valeur par défaut + Champ alternatif + Texte alternatif + Casse + Encodage + Choisir un champ + Convertir les sauts de ligne + Oui, convertir les sauts de ligne + Remplace les sauts de ligne avec des balises &lt;br&gt; + Champs particuliers + Oui, la date seulement + Format et encodage + Formater comme une date + Formate la valeur comme une date, ou une date avec l'heure, en fonction de la culture active + Encoder en HTML + Remplacera les caractères spéciaux par leur équivalent HTML. + Sera inséré après la valeur du champ + Sera inséré avant la valeur du champ + Minuscules + Modifier le résultat + Aucun + Example de résultat + Insérer après le champ + Insérer avant le champ + Récursif + Oui, rendre récursif + Séparateur + Champs standards + Majuscules + Encode pour URL + Formatera les caractères spéciaux de manière à ce qu'ils soient reconnus dans une URL + Sera seulement utilisé si toutes les valeurs des champs ci-dessus sont vides + Ce champ sera utilisé seulement si le champ initial est vide + Oui, avec l'heure. Séparateur: + + + Tâches qui vous sont assignées + vous sont assignées. Pour voir un aperçu détaillé incluant les commentaires, cliquez sur "Détails" ou juste sur le nom de la page. + Vous pouvez aussi télécharger la page au format XML en cliquant sur le lien "Télécharger XML".
+ Pour clôturer une tâche de traduction, allez sur Détails, puis cliquez sur le bouton "Terminer la tâche". + ]]>
+ Terminer la tâche + Détails + Télécharger toutes les tâches de traductions au format XML + Télécharger XML + Télécharger la DTD XML + Champs + Inclure les pages enfants + + [%0%] tâches de traductions pour %1% + Aucun utilisateur traducteur trouvé. Veuillez créer un utilisateur traducteur avant d'envoyer du contenu pour traduction + Tâches que vous avez créées + que vous avez créées. Pour voir un aperçu détaillé incluant les commentaires, + cliquez sur "Détails" ou juste sur le nom de la page. Vous pouvez aussi télécharger la page au format XML en cliquant sur le lien "Télécharger XML". + Pour clôturer une tâche de traduction, allez sur Détails, puis cliquez sur le bouton "Terminer tâche". + ]]> + La page '%0%' a été envoyée pour traduction + Veuillez choisir la langue dans laquelle le contenu doit être traduit + Envoyer la page '%0%' pour traduction + Assignée par + Tâches ouvertes + Nombre total de mots + Traduire en + Traduction complétée. + Vous pouvez prévisualiser les pages que vous avez traduites en cliquant ci-dessous. Si la page originale est trouvée, vous verrez une comparaison entre les deux pages. + Traduction échouée, il se pourrait que fichier XML soit corrompu + Options de traduction + Traducteur + Uploader le fichier de traduction XML + + + Navigateur de cache + Corbeille + Packages créés + Types de données + Dictionnaire + Packages installés + Installer une skin + Installer un starter kit + Langues + Installer un package local + Macros + Types de média + Membres + Groupes de membres + Rôles + Types de membres + Types de documents + Types de relations + Packages + Packages + Fichiers Python + Installer depuis le repository + Installer Runway + Modules Runway + Fichiers de script + Scripts + Feuilles de style + Modèles + Fichiers XSLT + Analytique + Vues partielles + Fichiers Macro pour les vues partielles + + + Nouvelle mise à jour disponible + %0% est disponible, cliquez ici pour télécharger + Aucune connexion au serveur + Erreur lors de la recherche de mises à jour. Veuillez vérifier le stack trace pour obtenir plus d'informations sur l'erreur. + + + Administrateur + Champ catégorie + Changer le mot de passe + Nouveau mot de passe + Confirmez votre nouveau mot de passe + Vous pouvez changer votre mot de passe d'accès au Back Office Umbraco en remplissant le formulaire ci-dessous puis en cliquant sur le bouton "Changer le mot de passe" + Canal de contenu + Champ description + Désactiver l'utilisateur + Type de document + Editeur + Champ extrait + Langue + Identifiant + Noeud de départ dans la librarie de média + Sections + Désactiver l'accès Umbraco + Ancien mot de passe + Mot de passe + Réinitialiser le mot de passe + Votre mot de passe a été modifié! + Veuillez confirmer votre nouveau mot de passe + Introduisez votre nouveau mot de passe + Votre nouveau mot de passe ne peut être vide ! + Mot de passe actuel + Mot de passe actuel invalide + Il y a une différence entre le nouveau mot de passe et le mot de passe confirmé. Veuillez réessayer. + Le mot de passe confirmé ne correspond pas au nouveau mot de passe saisi! + Remplacer les permissions sur les noeuds enfants + Vous êtes en train de modifiez les permissions pour les pages : + Choisissez les pages dont les permissions doivent être modifiées + Rechercher tous les enfants + Noeud de départ du contenu + Nom d'utilisateur + Permissions utilisateur + Type d'utilisateur + Types d'utilisateurs + Rédacteur + Traducteur + Modifier + Votre profil + Votre historique récent + La session expire dans + + + Validation + Valider comme email + Valider comme nombre + Valider comme Url + ...ou introduisez une validation spécifique + Champ obligatoire + Introduisez une expression régulière + Vous devez ajouter au moins + Vous ne pouvez avoir que + éléments + éléments sélectionnés + Date non valide + Pas un nombre + Email non valide + + + + La valeur est égale à la valeur recommandée : '%0%'. + La valeur du XPath '%2%' a été fixée à '%1%' dans le fichier de configuration '%3%'. + La valeur attendue pour '%2%' dans le fichier de configuration '%3%' est '%1%', mais la valeur trouvée est '%0%'. + La valeur inattendue '%0%' a été trouvée pour '%2%' dans le fichier de configuration '%3%'. + + + Custom errors est fixé à la valeur '%0%'. + Custom errors est pour la moment fixé à la valeur '%0%'. Il est recommandé de le fixer la valeur à '%1%' avant la mise en ligne. + Custom errors a été rectifié avec succès à la valeur '%0%'. + + MacroErrors est fixé à la valeur '%0%'. + MacroErrors est fixé à la valeur '%0%', ce qui empêchera certaines ou même toutes les pages de votre site de se charger complètement en cas d'erreur dans les macros. La rectification de ceci fixera la valeur à '%1%'. + MacroErrors est maintenant fixé à la valeur '%0%'. + + + Try Skip IIS Custom Errors est fixé à la valeur '%0%' et vous utilisez IIS version '%1%'. + Try Skip IIS Custom Errors est actuellement fixé à '%0%'. Il est recommandé de fixer la valeur à '%1%' pour votre version IIS (%2%). + Try Skip IIS Custom Errors a été rectifié avec succès à la valeur '%0%'. + + + Le fichier n'existe pas : '%0%'. + '%0%' dans le fichier config '%1%'.]]> + Une erreur est survenue, consultez le log pour voir l'erreur complète : %0%. + + Total XML : %0%, Total : %1% + Total XML : %0%, Total : %1% + Total XML : %0%, Total publié : %1% + + Le certificat de votre site a été marqué comme valide. + Erreur de validation du certificat : '%0%' + Erreur en essayant de contacter l'URL %0% - '%1%' + Vous êtes actuellement %0% à voir le site via le schéma HTTPS. + La valeur appSetting 'umbracoUseSSL' est fixée à 'false' dans votre fichier web.config. Une fois que vous donnerez accès à ce site en utilisant le schéma HTTPS, cette valeur devra être mise à 'true'. + La valeur appSetting 'umbracoUseSSL' est fixée à '%0%' dans votre fichier web.config, vos cookies sont %1% marqués comme étant sécurisés. + Impossible de mettre à jour la configuration 'umbracoUseSSL' dans votre fichier web.config. Erreur : %0% + + + Activer HTTPS + Fixe la configuration 'umbracoSSL' à 'true' dans la section appSettings du fichier web.config. + La configuration appSetting 'umbracoUseSSL' est maintenant fixée à 'true' dans votre fichier web.config, vos cookies seront marqués comme étant sécurisés. + + Corriger + Impossible de corriger une vérification avec un type de comparaison 'ShouldNotEqual'. + Impossible de corriger une vérification avec un type de comparaison 'ShouldEqual' avec une valeur spécifiée. + La valeur de correction n'est pas fournie. + + Le mode de compilation Debug est désactivé. + Le mode de compilation Debug est actuellement activé. Il est recommandé de désactiver ce paramètre avant la mise en ligne. + Le mode de compilation Debug a été désactivé avec succès. + + Le mode tracing est désactivé. + Le mode tracing est actuellement activé. Il est recommandé de désactiver cette configuration avant la mise en ligne. + Le mode tracing a été désactivé avec succès. + + Tous les répertoires ont les configurations de permissions adéquates. + + %0%.]]> + %0%. Aucune action n'est requise s'il n'y a pas de nécessité d'y écrire.]]> + + Tous les fichiers ont les configurations de permissions adéquates. + + %0%.]]> + %0%. Aucune action n'est requise s'il n'y a pas de nécessité d'y écrire.]]> + + X-Frame-Options, utilisé pour contrôler si un site peut être intégré dans un autre via IFRAME, a été trouvé.]]> + X-Frame-Options , utilisé pour contrôler si un site peut être intégré dans un autre via IFRAME, n'a pas été trouvé.]]> + Configurez le Header dans le fichier Config + Ajoute une valeur dans la section httpProtocol/customHeaders du fichier web.config afin d'éviter que le site ne soit intégré dans d'autres sites via IFRAME. + Une configuration générant un header qui empêche l'intégration du site par d'autres sites via IFRAME a été ajoutée à votre fichier web.config. + Impossible de modifier le fichier web.config. Erreur : %0% + + + %0%.]]> + Aucun header révélant des informations à propos de la technologie du site web n'a été trouvé. + + La section system.net/mailsettings n'a pas pu être trouvée dans le fichier Web.config. + Dans la section system.net/mailsettings du fichier Web.config, le "host" n'est pas configuré. + La configuration SMTP est correcte et le service fonctionne comme prévu. + Le serveur SMTP configuré avec le host '%0%' et le port '%1%' n'a pas pu être contacté. Veuillez vérifier et vous assurer que la configuration SMTP est correcte dans la section system.net/mailsettings du fichier Web.config. + + %0%.]]> + %0%.]]> + + + Désactiver URL tracker + Activer URL tracker + URL original + Redirigé Vers + Aucune redirection n'a été créée + Lorsqu'une page publiée est renommée ou déplacée, une redirection sera automatiquement créée vers la nouvelle page. + Supprimer + Etes-vous certain(e) de vouloir supprimer la redirection de '%0%' vers '%1%'? + Redirection d'URL supprimée. + Erreur lors de la suppression de la redirection d'URL. + Etes-vous certain(e) de vouloir désactiver le URL tracker? + URL tracker est maintenant désactivé. + Erreur lors de la désactivation de l'URL tracker, plus d'information disponible dans votre fichier log. + URL tracker est maintenant activé. + Erreur lors de l'activation de l'URL tracker, plus d'information disponible dans votre fichier log. + + + Pas d'élément de dictionaire à choisir + +
+ diff --git a/src/UmbracoUrlHandling/Umbraco/Config/Lang/he.xml b/src/UmbracoUrlHandling/Umbraco/Config/Lang/he.xml new file mode 100644 index 0000000..248a38f --- /dev/null +++ b/src/UmbracoUrlHandling/Umbraco/Config/Lang/he.xml @@ -0,0 +1,945 @@ + + + + The Umbraco community + http://our.umbraco.org/documentation/Extending-Umbraco/Language-Files + + + נהל שמות מתחם + מעקב ביקורות + צפה בתוכן + העתק + צור + צור חבילה + מחק + נטרל + רוקן סל מיחזור + ייצא סוג קובץ + ייצא אל.NET + ייצא אל .NET + ייבא סוג מסמך + ייבא חבילה + ערוך במצב "קנבס" + יציאה + הזז + התראות + גישה ציבורית + פרסם + רענן פריטי תוכן + פרסם את כל האתר מחדש + הרשאות + חזור לאחור + שלח לפירסום + שלח לתירגום + מיין + שלח לפירסום + תרגם + עדכן + מחק + בצע + תזמן + ייבא נתונים + צור הגדרות ילדים + יומן משימות מתוזמנות + + + הוסף דומיין חדש + דומיין + הדומיין החדש %0% נוסף בהצלחה + הדומיין %0% נמחק + הדומיין %0% כבר מוקצה + לדוגמא: yourdomain.com, www.yourdomain.com + הדומיין %0% עודכן בהצלחה + ערוך דומיין נוכחי + + + צופה עבור + + + מודגש + בטל מרחק שוליים מהפסקה + הוסף מתוך שדה + הוספת קו גרפי + ערוך -Html + מרחק שוליים מהפסקה + נטוי + ממורכז + מוצמד לשמאל + מוצמד לימין + הוספת לינק + הוספת לינק מקומי (עוגן) + רשימת תבליטים + רשימה ממוספרת + הוספת מקרו + הוספת תמונה + ערוך הקשר + שמור + שמור ופרסם + שמור ושלח לאישור + תצוגה מקדימה + בחר עיצוב + הצג עיצוב + הוספת טבלה + + + אודות עמוד זה + קישור חלופי + (תיאור התמונה בקצרה) + קישור חלופי + לחץ לעריכת פריט זה + נוצר על ידי + נוצר בתאריך + סוג מסמך + עריכה + הוסר ב + פריט זה שונה לאחר פירסומו + פריט זה לא פורסם + פורסם לאחרונה + סוג מדיה + קבוצת חברים + תפקיד + סוג חבר + לא נבחר מידע + כותרת עמוד + הגדרות + מסמך זה פורסם אך לא זמין לצפיה, עקב כך שמסמך האב '%0%' ממתין לפירסום + פרסם + סטטוס פירסום + פורסם ב + נקה מידע + סידור ממוין עודכן + כדי למיין את המסמכים, פשוט יש לגרור את המסמכים או ללחוץ על אחד מכותרות העמודות. ניתן לבחור מספר מסמכים בו זמנית על ידי לחיצת "Shift" או "Ctrl" בזמן הבחירה. + סטטיסטיקות + כותרת (לא חובה) + סוג + ממתין לפירסום + נערך לאחרונה + הסר קובץ + קשר למסמך + + + היכן ברצונך ליצור את %0% + צור ב + בחר סוג וכותרת + + + סייר באתר + - הסתר מידע לצמיתות + במידה ואומברקו לא פתוח, יש צורך לאשר חלונות קופצים מאתר זה. + נפתח בחלון חדש + הפעל מחדש + בקר + ברוכים הבאים + + + Stay + Discard changes + You have unsaved changes + Are you sure you want to navigate away from this page? - you have unsaved changes + + + Done + + Deleted %0% item + Deleted %0% items + Deleted %0% out of %1% item + Deleted %0% out of %1% items + + Published %0% item + Published %0% items + Published %0% out of %1% item + Published %0% out of %1% items + + Unpublished %0% item + Unpublished %0% items + Unpublished %0% out of %1% item + Unpublished %0% out of %1% items + + Moved %0% item + Moved %0% items + Moved %0% out of %1% item + Moved %0% out of %1% items + + Copied %0% item + Copied %0% items + Copied %0% out of %1% item + Copied %0% out of %1% items + + + שם + ניהול שם מתחם + סגור חלון זה + האם הינך בטוח שברצונך למחוק זאת? + האם הינך בטוח שברצונך לכבות זאת? + סמן תיבה זו לאשר מחיקה סופית של %0% פריט/ים + האם הינך בטוח? + האם אתה בטוח? + גזור + ערוך פרט מילון + ערוך שפה + הוסף קישור מקומי + הוסף תו + הוסף פס גרפי + הוסף תמונה + הוסף קישור + לחץ להוספת מאקרו חדש + הוסף טבלה + נערך לאחרונה + קישור + קישור פנימי: + בעת שימוש בקישוריים פנימיים, הוסף "#" בתחילת הקישור + לפתוח בחלון חדש? + הגדרות מאקרו + המאקרו לא מכיל מאפיינים שניתן לערוך + הדבק + ערוך הרשאות עבור + הפריטים הנמצאים בסל המיחזור נמחקים כעת, השאר חלון זה פתוח עד לגמר פעולת המחיקה. + סל המיחזור ריק כעת + מחיקת פריטים מסל המיחזור תמחוק את הפריטים לצמיתות + regexlib.com's webservice is currently experiencing some problems, which we have no control over. We are very sorry for this inconvenience.]]> + חיפוש ביטויים להוספת אימות עבור שדות טופס. לדוגמא: 'כתובת אימייל', 'מיקוד', 'כתובת אתר' ועוד + הסר מאקרו + שדה חובה + האתר אונדקס מחדש + זיכרון המטמון של האתר רוענן בהצלחה. כל התוכן המפורסם כעת מעודכן, שאר התוכן המיועד לפירסום ימתין לפירסום + זיכרון המטמון של האתר ירוענן. כל התוכן שפורסם ירוענן בהתאם, שאר התוכן המיועד לפירסום ימתין לפירסום + מספר עמודות + מספר שורות + Set a placeholder id by setting an ID on your placeholder you can inject content into this template from child templates, + by refering this ID using a <asp:content /> element.]]> + Select a placeholder id from the list below. You can only + choose Id's from the current template's master.]]> + לחץ על התמונה לגודל מלא + בחר פריט + צפה בפרטי זיכרון מטמון + + + %0%' למטה
ניתן להוסיף שפות נוספות תחת "שפות" בתפריט בצד שמאל + ]]>
+ שם התצוגה לשפה + + + תת פריטי תוכן מאושרים: + צור + מחק לשונית + תיאור + לשונית חדשה + לשונית + תמונה ממוזערת + + + הוסף ערך מקדים + סוג מידע עבור בסיס נתונים + Data Editor GUID + הפוך שליטה + כפתורים + הפעל הגדרות מתקדמות עבור + הפעל תפריט מקושר + גודל תמונה מקסימלי כברירת מחדל עבור תמונות המתווספות + סגנונות עיצוב קרובים + הצג תוויות + רוחב ואורך + + + המידע שלך נשמר, אך לפני שניתן יהיה לפרסם אותו יש צורך לתקן את השגיאות הבאות: + ספק החברות הנוכחית לא תומך בשינוי סיסמה (EnablePasswordRetrieval צריך להיות מוגדר על true) + השדה %0% כבר קיים + התרחשו שגיאות: + התרחשו שגיאות: + הסיסמה חייבת להיות במינימום של %0% תווים characters long and contain at least %1% non-alpha numeric character(s) + %0% חייב להיות מספר שלם + השדה %0% בלשונית %1% הינו זה חובה + השדה %0% הינו זה חובה + %0% ב- %1% אינו הפורמט התקין + %0% אינו פורמט תקין + + + שים לב! למרות ש- CodeMirror מופעל מההגדרות, הוא נמצא במצב כבוי באינטרנט אקספלורר מפאת חוסר יציבות. + אנא הזן את את הכינוי והשם עבור סוג המידע! + קיימת בעיית הרשאות גישה בקריאה/כתיבה עבור הקובץ או התיקיה הזו + אנא בחר כותרת + אנא בחר סוג + הינך עומד לשנות את התמונה לגודל גדול יותר מהמקור, האם ברצונך להמשיך + שגיאות ב- python script + ה- python script לא נשמר, מכיל שגיאות + הפריט תוכן ההתחלתי נמחק, צור קשר עם מנהל האתר. + תחילה יש לסמן תוכן לפני שינוי עיצוב + סגנונות עיצוב פעילים לא זמינים + יש למקם את הסמן משמאל לשני התאים אותם תרצה למזג + אין אפשרות לפצל תא שלא מוזג לפני כן. + שגיאה במקור XSLT + קובץ ה- XSLT לא נשמר, הקובץ מכיל שגיאות. + + + אודות + פעולה + הוסף + כינוי + האם אתה בטוח? + גבול + או + בטל + שוליים לתא + בחר + סגור + סגור חלון + הערה + אישור + שמור על פרופורציות + המשך + העתק + צור + בסיס נתונים + תאריך + ברירת מחדל + מחק + נמחק + מחיקה... + עיצוב + מימדים + למטה + הורדה + עריכה + נערך + אלמנטים + כתובת אימייל + שגיאה + חפש + אורך + עזרה + אייקון + ייבא + שוליים פנימיים + הוסף + התקנה + ליישר + שפה + תכנית + טוען + נעול + התחבר + התנתק + התנתק + מקרו + הזז + שם + חדש + הבא + לא + של + אישור + פתח + או + סיסמה + נתיב + Placeholder קוד זיהוי + אנא המתן בבקשה... + הקודם + הגדרות + כתובת אימייל לקבלת טופס + סל מיחזור + נשאר + שנה שם + חידוש + נסה שנית + הרשאות + חיפוש + שרת + הצג + הצג עמוד בשליחה + גודל + סדר + Submit + סוג + הקלד לחיפוש... + למעלה + עדכן + שדרג + העלאה + כתובת URL + משתמש + שם משתמש + ערך + צפיה + ברוכים הבאים... + רוחב + כן + Reorder + I am done reordering + + + צבע רקע + מובלט + צבע טקסט + פונט + טקסט + + + עמוד + + + ההתקנה לא מצליחה להתחבר לבסיס הנתונים. + אין אפשרות לשמור את הקובץ Web.config file. הגדר את ה- connection string באופן ידני. + בסיס הנתונים שלך נמצא והוא מזוהה כ + הגדרת בסיס נתונים + install button to install the Umbraco %0% database + ]]> + Next to proceed.]]> + Database not found! Please check that the information in the "connection string" of the “web.config” file is correct.

+

To proceed, please edit the "web.config" file (using Visual Studio or your favourite text editor), scroll to the bottom, add the connection string for your database in the key named "UmbracoDbDSN" and save the file.

+

+ Click the retry button when + done.
+ More information on editing web.config here.

]]>
+ + Please contact your ISP if necessary. + If you're installing on a local machine or server you might need information from your system administrator.]]> + + Press the upgrade button to upgrade your database to Umbraco %0%

+

+ Don't worry - no content will be deleted and everything will continue working afterwards! +

+ ]]>
+ Press Next to + proceed. ]]> + next to continue the configuration wizard]]> + The Default users’ password needs to be changed!]]> + The Default user has been disabled or has no access to Umbraco!

No further actions needs to be taken. Click Next to proceed.]]> + The Default user's password has been successfully changed since the installation!

No further actions needs to be taken. Click Next to proceed.]]> + הסיסמה שונתה! + + Umbraco creates a default user with a login ('admin') and password ('default'). It's important that the password is + changed to something unique. +

+

+ This step will check the default user's password and suggest if it needs to be changed. +

+ ]]>
+ התחל מכאן, צפה בסרטוני ההדרכה עבור אומברקו + על ידי לחיצה על 'הבא', הנך מאשר את פרטי התקנון כפי שמפורט בתיבת הטקטס למטה. שים לב, הפצה זו של אומברקו כוללת שני גירסאות שונות של רשיון,קוד פתוח ברשיון MIT עבור ה- framework ורשיון Umbraco freeware המכסה את ה- UI. + לא הותקן עדיין. + קבצים ותיקיות המושפעים + מידע נוסף אודות התקנה ורשאות עבור אומרקו ניתן לקרוא כאן + על מנת לבצע זאת, יש צורך לאפשר הרשאות ל ASP.NET לערוך את הקצבים או התיקיות הבאות + Your permission settings are almost perfect!

+ You can run Umbraco without problems, but you will not be able to install packages which are recommended to take full advantage of Umbraco.]]>
+ איך לפתור + לחץ כאן לקרוא את גירסת הטקסט + video tutorial on setting up folder permissions for Umbraco or read the text version.]]> + Your permission settings might be an issue! +

+ You can run Umbraco without problems, but you will not be able to create folders or install packages which are recommended to take full advantage of Umbraco.]]>
+ Your permission settings are not ready for Umbraco! +

+ In order to run Umbraco, you'll need to update your permission settings.]]>
+ Your permission settings are perfect!

+ You are ready to run Umbraco and install packages!]]>
+ פתירת בעיות בתיקיה + עקוב אחר הלינק המצורף על מנת לפתור בעיות עם ASP.NET ויצירת תיקיות חדשות. + הגדרת הרשאות לתיקיה + + אני רוצה להתחיל מאתר ריק + learn how) + You can still choose to install Runway later on. Please go to the Developer section and choose Packages. + ]]> + סיימת להתקין את מערכת אומברקו, מה ברצונך לעשות כעת? + Runway הותקן + + This is our list of recommended modules, check off the ones you would like to install, or view the full list of modules + ]]> + המלצות עבור משתמשים מנוסים + ברצוני להתחיל עם אתר פשוט + + "Runway" is a simple website providing some basic document types and templates. The installer can set up Runway for you automatically, + but you can easily edit, extend or remove it. It’s not necessary and you can perfectly use Umbraco without it. However, + Runway offers an easy foundation based on best practices to get you started faster than ever. + If you choose to install Runway, you can optionally select basic building blocks called Runway Modules to enhance your Runway pages. +

+ + Included with Runway: Home page, Getting Started page, Installing Modules page.
+ Optional Modules: Top Navigation, Sitemap, Contact, Gallery. +
+ ]]>
+ מה זה Runway + צעד 1/5 אישור רשיון + צעד 2/5: הגדרת בסיס נתונים + צעד 3/5: אימות קובץ ההרשאות + צעד 4/5: בדיקת האבטחה של אומברקו + צעד 5/5: אומברקו מוכנה להתחיל + תודה שבחרת באומברקו + Browse your new site +You installed Runway, so why not see how your new website looks.]]> + Further help and information +Get help from our award winning community, browse the documentation or watch some free videos on how to build a simple site, how to use packages and a quick guide to the Umbraco terminology]]> + אומברקו %0% מותקנת ומוכנה לשימוש + /web.config file and update the AppSetting key UmbracoConfigurationStatus in the bottom to the value of '%0%'.]]> + started instantly by clicking the "Launch Umbraco" button below.
If you are new to Umbraco, +you can find plenty of resources on our getting started pages.]]>
+ Launch Umbraco +To manage your website, simply open the Umbraco back office and start adding content, updating the templates and stylesheets or add new functionality]]> + ההתחברות לבסיס הנתונים נכשלה. + Umbraco גירסה 3 + Umbraco גירסה 4 + צפה + Umbraco %0% for a fresh install or upgrading from version 3.0. +

+ Press "next" to start the wizard.]]>
+ + + קוד שפה + שם השפה + + + לא זוהתה פעילות כלשהי ותבוצע התנתקות אוטומטית בעוד + יש לבצע חידוש פעילות על מנת לשמור על התוכן + + + © 2001 - %0%
umbraco.com

]]>
+ ברוכים הבאים לאומברקו, יש להזין שם משתמש וסיסמה בשדות למטה: + + + לוח הבקרה + איזורים + תוכן + + + בחר עמוד מלמעלה... + %0% הועתק אל %1% + בחר לאן המסמך %0% יועתק + %0% הועבר אל %1% + בחר להיכן המסמך %0% יועבר + has been selected as the root of your new content, click 'ok' below. + No node selected yet, please select a node in the list above before clicking 'ok' + The current node is not allowed under the chosen node because of its type + The current node cannot be moved to one of its subpages + TRANSLATE ME: 'The action isn't allowed since you have insufficient permissions on 1 or more child documents.' + + + ערוך את ההתראות עבור %0% + + Hi %0%

+ +

This is an automated mail to inform you that the task '%1%' + has been performed on the page '%2%' + by the user '%3%' +

+ +

+

Update summary:

+ + %6% +
+

+ + + +

Have a nice day!

+ Cheers from the Umbraco robot +

]]>
+ [%0%] התראות %1% בוצעו ב %2% + התראות + + + + ויש לבחור את החבילה הרצויה. לחבילות Umbraco יש בד"כ יש סיומות בשם ".umb" או ".zip". + ]]> + יוצר החבילה + הדגמה + תיעוד + מטה דטה עבור החבילה + שם החבילה + החבילה לא מכילה אף פריט +
+ ניתן למחוק בבטיחות רבה את החבילה מהמערכת על ידי לחיצה על "הסר חבילה".]]>
+ אין עידכונים זמינים + אפשרויות חבילה + תיאור החבילה + מאגר חבילות + אשר הסרה + החבילה הוסרה + החבילה הוסרה בהצלחה! + הסר חבילה + + הערה:כל מסמך, מדיה וכו' התלוים בפריטים שהסרת יפסיקו לעבוד, ויכולים להביא למצב של אי יציבות למערכת, + יש למחוק קבצים עם זהירות יתרה, אם יש ספק יש לפנות ליוצר החבילה.]]> + הורד עידכון מהמאגר + שידרוג חבילה + הורדות שידרוג + קיים עידכון זמין עבור חבילה זו. ניתן להוריד אותו ישירות ממאגר החבילות של אומברקו. + גירסת החבילה + צפה באתר החבילה + + + שמור עיצוב בהדבקה (לא מומלץ) + הטקסט שאתה עומד להדביק מכיל עיצוב או תווים מיוחדים. דבר זה יגול להגרם בעת העתקה ממסמך בוורד. אומברקו יכולה להסיר את העיצוב או תווים מיוחדים על מנת שהטקסט המועתק יתאים ל- Web. + הסר עיצוב באופן מלא בהדבקה + הדבק אך הסר רק עיצוב (מומלץ) + + + תפקיד בסיסי בהגנה + על ידי שימוש בקבוצות הקיימות ב Umbraco.]]> + בזיהוי תפקיד המשתמש.]]> + עמוד שגיאות + השתמש בעת התחברות משתמשים וללא אפשרות גישה + בחר איך להגביל את הגישה לעמוד זה + %0% כעת מוגן + הגנה הוסרה עבור %0% + עמוד התחברות + בחר את העמוד המכיל טופס התחברות + הסר הגנה + בחר את העמודים המכילים פרטי התחברות והודעות שגיאה + בחר את הכללים אשר יש להם גישה לעמוד זה + הגדר שם משתמש וסיסמה עבור עמוד זה + הגנת משתמש יחיד + אם ברצונך להגדיר הגנה פשוטה בעזרת שימוש בשם משתמש וסיסמה + + + + כלול עמודי ילדים שלא פורסמו + אנא המתן - הפירסום בתהליך... + %0% מתוך %1% עמודים פורסמם בהצלחה... + העמוד %0% פורסם. + העמוד %0% וכל תתי העמודים פורסמו + פרסם את העמוד %0% ואת כל תתי העמודים + ok כדי לפרסם %0% ולהפוך תוכן זה זמין לציבור הרחב

+ הינך יכולה לפרסם את כל תתי העמודים על ידי סימון פרסם את העמוד את כל תתי העמודים למטה. + ]]>
+ + + הוסף קישור חיצוני + הוסף קישור פנימי + הוסף + כותרת + עמוד פנימי + קישור + הורד למטה + העלה למעלה + פתח בחלון חדש + הסר קישור + + + גירסה עדכנית + טקסט אדום לא יוצג בגרסא שנבחרה, טקסט ירוק מייצט טקסט שנוסף.]]> + המסמך שוחזר בהצלחה + להלן הגרסא שנבחרה כHTML, אם הינך לצפות בשינויים בין שתי הגרסאות בו זמנית, בחר ב diff + חזור לאחור אל + בחר גירסה + תצוגה + + + ערוך קובץ סקריפט + + + Concierge + תוכן + Courier + מפתח + אשף הגדרת אומברקו + מדיה + חברים + עיתון + הגדרות + סטטיסטיקות + תירגום + משתמשים + + + תבנית ברירת מחדל + מפתח מילון + על מנת לייבא סוג מסמך,מצא את הקובץ ".udt" במחשב שלך על ידי לחיצה על 'סייר' ואז 'ייבא' (ייתכן ותצטרך לבצע אימות במסך הבא) + כותרת לשונית חדשה + סוג פריט תוכן + סוג + גליונות סגנון + תכונות גליונות סגנון + לשונית + כותרת לשונית + לשוניות + + + Sort order + Creation date + המיון הושלם. + יש לגרור את הפריטים מעלה או מטה כדי להגדיר את סדר התוכן. או לחץ על כותרת העמודה כדי למיין את כל פריטי התוכן +
נא לא לסגור את החלון בזמן המיון]]>
+ + + הפירסום בוטל על ידי תוסף צד שלישי + סוג תכונה כבר קיים + סוג תכונה נשמר + סוג מידע: %1%]]> + סוג תכונה נמחק + סוג מסמך נשמר + נוצרה לשונית + לשונית נמחקה + לשונית עם מזהה: %0% נמחקה + סגנון עיצוב לא נשמר + סגנון עיצוב נשמר + סגנון עיצוב נשמר ללא שגיאות + סוג מידע נשמר + פריט במילון נשמר + הפירסום נכשל, עמוד האב לא מפורסם + התוכן פורסם + ומוצג לצפיה באתר + תוכן נשמר + זכור לפרסם את התוכן על מנת שהשינויים יוצגו + נשלח לאישור + השינויים נשלחו לאישור + חבר נשמר + תגונה של סגנון עיצוב נשמרה + סגנון עיצוב נשמר + תבנית נשמרה + שגיאה בעת שמירת משתמש (בדוק Log) + הגדרות משתמש נשמרו + קובץ לא נשמר + אין אפשרות לשמור את הקובץ, בדוק הרשאות + הקובץ נשמר + הקובץ נשמר ללא שגיאות + שפה נשמרה + Python script לא נשמרו + Python script לא נשמרו עקב שגיאות + Python script נשמר + לא נמצאו שגיאות ב- python script + התבנית לא נשמרה + שים לב שאין 2 תבניות עם אותו השם/כינוי + התבנית נשמרה + התבנית נשמרה ללא שגיאות! + הקובץ XSLT לאנשמר + הקובץ XSLT מכיל שגיאה + אין אפשרות לשמור את ה- XSLT, בדוק הרשאות קובץ לפני + הקובץ XSLT נשמר + אין שגיאות ב- XSLT + + + השתמש בסינטקס CSS לדוגמא: h1, .redHeader, .blueTex + ערוך סגנון עיצוב + ערוך הגדרות סגנון עיצוב + שם לזיהוי הגדרות ה- style בעורך הטקסט העשיר + תצוגה מקדימה + עיצובים + + + ערוך תבנית + הוסף איזור תוכן + הוסף content area placeholder + הוסף פריט מילון + הוסף מקרו + הוסף שדה עמוד לאומברקו + תבנית ראשית + מדריך מהיר עבור תבנית תגיות באומברקו + תבנית + + + Choose type of content + Choose a layout + Add a row + Add content + Drop content + Settings applied + + This content is not allowed here + This content is allowed here + + Click to embed + Click to insert image + Image caption... + Write here... + + Grid Layouts + Layouts are the overall work area for the grid editor, usually you only need one or two different layouts + Add Grid Layout + Adjust the layout by setting column widths and adding additional sections + Row configurations + Rows are predefined cells arranged horizontally + Add row configuration + Adjust the row by setting cell widths and adding additional cells + + Columns + Total combined number of columns in the grid layout + + Settings + Configure what settings editors can change + + Styles + Configure what styling editors can change + + Settings will only save if the entered json configuration is valid + + Allow all editors + Allow all row configurations + + + שדה אלטרנטיבי + טקסט חלופי + מסגרת + בחר שדה + המרת מעברי שורה + החלף מעברי שורה עם תגית ה HTML &lt;br&gt; + כן, תאריך בלבד + פורמט תאריך + קידוד HTML + תווים מיוחדים יוחלפו בתווי HTML מתאימים. + יוכנס אחרי ערך השדה + יוכנס לפני ערך השדה + אותיות קטנות + ללא + הוסף אחרי השדה + הוסף לפני השדה + רקורסיבי + אותיות גדולות + קידוד URL + תווים מיוחדים יעוצבו ב- URL + יבוצע שימוש אך ורק עם ערך השדה יהיה ריק + בשדה זה יבוצע שימוש אך ורק אם השדה העיקרי יהיה ריק + כן, עם שעה. תו מפריד: + + + משימות משוייכות אליך + שמשוייכות אלייך. כדי לצפות בפרטים נוספים הכוללים תגובות, יש ללחוץ על "פרטים" או על שם העמוד. + ניתן בנוסף להוריד את הקובץ כ XML ישירות למחשב על ידי לחיצה ב"הורד קובץ XML".
+ כדי לסגור את משימת התרגום, אנא בחר בצפיה נרחבת ואז יש ללחוץ על כפתור "סגור משימה". + ]]>
+ סגור משימה + פרטי תירגום + הורד את כל התירגומים כקובץ xml + הורד קובץ xml + הורד xml DTD + שדות + כלול דפי משנה + + [%0%] משימות תירגום עבור %1% + לא נמצאו משתמשמים המוגדרים כמתרגמים. יש ליצור משתמש המוגדר כמתרגם לפני שליחת תוכן לתירגום + משימות שנוצרו על ידך + שנוצרו על ידיך. כדי לצפות בפרטים נוספים הכוללים תגובות, + יש ללחוץ על "פרטי תרגום" או על ידי שם העמוד. ניתן בנוסף להוריד את העמוד כקובץ XML ישירות למחשב על ידי לחיצה על "הורד קובץ XML". + כדי לסגור את משימת התרגום, אנא בחר בצפיה נרחבת ואז יש ללחוץ על כפתור "סגור משימה". + ]]> + העמוד '%0%' נשלח לתירגום + שלח את העמוד '%0%' לתירגום + הוקצה על ידי + משימה נפתחה + סך הכל מילים + תרגם עבור + התירגום הושלם. + ניתן לראות תצוגה מקדימה של העמודים שכבר תורגמו על ידי לחיצה על הלינק למטה. If the original page is found, you will get a comparison of the 2 pages. + התירגום נכשל, קובץ ה- xml עלול להיות מקולקל + אפשרויות תירגום + מתרגם + העלה קובץ תירגום ב xml + + + זיכרון מטמון בדפדפן + סל מיחזור + יצירת חבילות + סוגי מידע + מילון + חבילות מותקנות + התקן עיצוב + התקן ערכת התחלה + שפות + התקן חבילה מקומית + מקרו + סוגי מדיה + משתמשים + קבוצות משתמשים + כללים + סוגי משתמשים + סוגי מסמכים + חבילות + חבילות + קבצי פייתון + התקן מתוך מאגר + התקן Runway + מודולי Runway + קבצי סקריפטים + סקריפטים + גיליונות סגנון + תבניות + קבצי XSLT + + + עידכון חדש זמין + %0% זמין, כאן להורדה + אין תקשורת עם השרת + בדיקת עידכונים נכשלה. בדוק את ה trace-stack למידע נוסף + + + מנהל ראשי + שדה קטגוריה + שנה את הסיסמה שלך + בעמוד זה ניתן לשנות את הסיסמה שלך ולאחר מכן ללחוץ על הכפתור 'שנה סיסמה' למטה + ערוץ תוכן + שדה תיאור + נטרל משתמש + שדה מסמך + עורך + שדה תקציר + שפה + שם משתמש + התחלה בפריט המדיה + אזורים + נטרל גישת אומברקו + סיסמה + הסיסמה שונתה בהצלחה! + אישור סיסמה + הזן את הסיסמה החדשה שלך + שדה סיסמה לא יכול להיות ריק ! + סיסמאות לא תואמות, אנא בדוק זאת ונסה שנית + אישור סיסמה לא תואם ! + החלף הרשאות בכל תתי הפריטים + הינך משנה הרשאות לעמודים הבאים: + בחר עמוד/עמודים לשינוי הרשאות + חפש בכל הפריטים + התחלה בפריט התוכן + שם תצוגה + הרשאות משתמש + סוג משתמש + סוגי משתמש + כותב + +
diff --git a/src/UmbracoUrlHandling/Umbraco/Config/Lang/it.xml b/src/UmbracoUrlHandling/Umbraco/Config/Lang/it.xml new file mode 100644 index 0000000..5faa182 --- /dev/null +++ b/src/UmbracoUrlHandling/Umbraco/Config/Lang/it.xml @@ -0,0 +1,922 @@ + + + + The Umbraco community + http://our.umbraco.org/documentation/Extending-Umbraco/Language-Files + + + Gestisci hostnames + Audit Trail + Sfoglia + Copia + Crea + Crea pacchetto + Cancella + Disabilita + Svuota il cestino + Esporta il tipo di documento + Importa il tipo di documento + Importa il pacchetto + Modifica in Area di Lavoro + Uscita + Sposta + Notifiche + Accesso pubblico + Pubblica + Aggiorna nodi + Ripubblica intero sito + Permessi + Annulla ultima modifica + Invia per la pubblicazione + Invia per la traduzione + Ordina + Invia la pubblicazione + Traduci + Annulla pubblicazione + Aggiorna + + + Aggiungi nuovo dominio + Dominio + + + + + + Hostname non valido + Modifica il dominio corrente + + + Visualizzazione per + + + Grassetto + Cancella rientro paragrafo + Inserisci dal file + Inserisci intestazione grafica + Modifica Html + Inserisci rientro paragrafo + Corsivo + Centra + Allinea testo a sinistra + Allinea testo a destra + Inserisci Link + Inserisci local link (ancora) + Elenco puntato + Elenco numerato + Inserisci macro + Inserisci immagine + Modifica relazioni + Salva + Salva e pubblica + Salva e invia per approvazione + Anteprima + + Scegli lo stile + Mostra gli stili + Inserisci tabella + + + Informazioni su questa pagina + Link alternativo + + Links alternativi + Clicca per modificare questo elemento + Creato da + Creato il + Tipo di documento + Modifica + Attivo fino al + + + Ultima pubblicazione + Link ai media + Tipo di media + Gruppo di membri + Ruolo + Tipologia Membro + + Titolo della Pagina + + + Pubblicato + Stato della pubblicazione + Pubblicato il + Rimuovi data + Ordinamento dei nodi aggiornato + + Statistiche + Titolo (opzionale) + Tipo + Non pubblicare + Ultima modifica + Rimuovi il file + Link al documento + + + + Crea al + Scegli il tipo ed il titolo + + + + + + hai aperto una nuova finestra + Riavvia + Visita + Benvenuto + + + Stay + Discard changes + You have unsaved changes + Are you sure you want to navigate away from this page? - you have unsaved changes + + + Done + + Deleted %0% item + Deleted %0% items + Deleted %0% out of %1% item + Deleted %0% out of %1% items + + Published %0% item + Published %0% items + Published %0% out of %1% item + Published %0% out of %1% items + + Unpublished %0% item + Unpublished %0% items + Unpublished %0% out of %1% item + Unpublished %0% out of %1% items + + Moved %0% item + Moved %0% items + Moved %0% out of %1% item + Moved %0% out of %1% items + + Copied %0% item + Copied %0% items + Copied %0% out of %1% item + Copied %0% out of %1% items + + + Nome + Gestione alias Hostnames + Chiudi questa finestra + + + + + + Taglia + Modifica elemento Dictionary + Modifica il linguaggio + Inserisci il link locale + Inserisci carattere + + + Inserisci link + Inserisci macro + Inserisci tabella + Ultima modifica + Link + + + + Impostazioni Macro + + Incolla + Modifica il Permesso per + + + + regexlib.com ha attualmente qualche problema, di cui non abbiamo il controllo. Siamo spiacevoli dell'inconveniente.]]> + + Elimina Macro + Campo obbligatorio + + + + Numero di colonne + Numero di righe + Imposta identificativo del placeholder. Settando tale ID puoi inserire il contenuto in questo template dai template figli, facendo riferimento a questo ID usando il codice <asp:content />.]]> + Seleziona Identificativo del placeholder dalla lista seguente. Puoi scegliere solo l'ID appartenente al template master corrente.]]> + + Seleziona elemento + Visualizza gli elementi in cache + + + + + + + Possibili nodetypes figli + Crea + Cancella tab + Descrizione + Nuova tab + Tab + Miniatura + + + + + + Rendering controllo + Bottoni + Abilita impostazioni avanzate per + Abilita menu contestuale + Dimensione massima delle immagini inserite + Fogli di stile collegati + Visualizza etichetta + Larghezza e altezza + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + Info + Azione + Aggiungi + Alias + + Bordo + o + Annulla + + Scegli + Chiudi + Chiudi la finestra + Commento + Conferma + Blocca le proporzioni + Continua + Copia + Crea + Base di dati + Data + Default + Elimina + Eliminato + Elimina... + Design + Dimensioni + + Scarica + Modifica + Modificato + Elementi + Email + Errore + Trova + Cartella + Altezza + Guida + Icona + Importa + + Inserisci + Installa + Giustificato + Lingua + Layout + Caricamento + Bloccato + Login + Log off + Logout + Macro + Sposta + Nome + Nuovo + Successivo + No + di + Ok + Apri + o + Password + Percorso + + + Precedente + + + Cestino + Rimangono + Rinomina + Rinnova + Riprova + Permessi + Cerca + Server + Mostra + Mostra la pagina inviata + Dimensione + Ordina + Submit + Tipo + + Su + Aggiorna + Aggiornamento + Carica + Url + Utente + + Valore + Vedi + Benvenuto... + Larghezza + Si + Reorder + I am done reordering + + + Colore di sfondo + Grassetto + Colore del testo + Carattere + Testo + + + Pagina + + + + + + + installa per installare il database Umbraco %0% ]]> + Avanti per proseguire.]]> + + Database non trovato! Perfavore, controlla che le informazioni della stringa di connessione nel file "web.config" siano corrette.

+

Per procedere, edita il file "web.config" (utilizzando Visual Studio o l'editor di testo che preferisci), scorri in basso, aggiungi la stringa di connessione per il database chiamato "umbracoDbDSN" e salva il file.

Clicca il tasto riprova quando hai finito.
Maggiori dettagli per la modifica del file web.config qui.

]]> +
+ + Premi il tasto aggiorna per aggiornare il database ad Umbraco %0%

Non preoccuparti, il contenuto non verrà perso e tutto continuerà a funzionare dopo l'aggiornamento!

]]>
+ Premi il tasto Avanti per continuare.]]> + Avanti per continuare la configurazione.]]> + La password predefinita per l'utente di default deve essere cambiata!]]> + L'utente di default è stato disabilitato o non ha accesso ad Umbraco!

Non è necessario eseguire altre operazioni. Clicca il tasto Avanti per continuare.]]> + La password è stata modificata con successo

Non è necessario eseguire altre operazioni. Clicca il tasto Avanti per continuare.]]> + + Umbraco crea un utente ('admin')predefinito e password ('default'). E' importante modificare la password con una personale.

Questo passaggio controlla la password predefinita e ricorda, se necessario, di modificarla.

]]>
+ + + + + + + Le impostazioni dei permessi sono perfette!

Puoi eseguire Umbraco senza problemi, ma potresti non poter installare i pacchetti che sono consigliati per sfruttare tutti i vantaggi offerti da Umbraco.]]>
+ + + video tutorial su come impostare i permessi delle cartelle per Umbraco o leggi la versione testuale.]]> + Le impostazioni dei permessi potrebbero avere dei problemi!

Puoi eseguire Umbraco, ma potresti non essere in grado di creare cartelle o installare pacchetti che sono raccomandati per sfruttare tutti i vantaggi di Umbraco.]]>
+ Le impostazioni dei permessi non sono corrette per Umbraco!

Per eseguire Umbraco, devi aggiornare le impostazioni dei permessi.]]>
+ La configurazione dei permessi è perfetta!

Sei pronto per avviare Umbraco e installare i pacchetti!]]>
+ + + + + + Guarda come) Puoi anche installare eventuali Runway in un secondo momento. Vai nella sezione Developer e scegli Pacchetti.]]> + + Runway è installato + + Questa è la lista dei nostri moduli raccomandati, seleziona quali vorresti installare, o vedi l'intera lista di moduli + ]]> + Raccommandato solo per utenti esperti + Vorrei iniziare da un sito semplice + + "Runway" è un semplice sito web contenente alcuni tipi di documento e alcuni templates di base. L'installer configurerà Runway per te automaticamente, + ma tu potrai facilmente modificarlo, estenderlo o eliminarlo. Non è necessario installarlo e potrai usare Umbraco anche senza di esso, ma + Runway ti offre le basi e le best practices per cominciare velocemente. + Se sceglierai di installare Runway, volendo potrai anche selezionare i moduli di Runway per migliorare le pagine. +

+ + Inclusi in Runway: Home page, pagina Guida introduttiva, pagina Installazione moduli
+ Moduli opzionali: Top Navigation, Sitemap, Contatti, Gallery. +
+ ]]>
+ Cosa è Runway + Passo 1/5 Accettazione licenza + Passo 2/5: Configurazione database + Passo 3/5: Controllo permessi dei file + Passo 4/5: Controllo impostazioni sicurezza + Passo 5/5: Umbraco è pronto per iniziare + Grazie per aver scelto Umbraco + Naviga per il tuo nuovo sito +Hai installato Runway, quindi perché non dare uno sguardo al vostro nuovo sito web.]]> + Ulteriori informazioni e assistenza +Fatti aiutare dalla nostra community, consulta la documentazione o guarda alcuni video gratuiti su come costruire un semplice sito web, come usare i pacchetti e una guida rapida alla terminologia Umbraco]]> + + /web.config e aggiornare la chiave AppSetting UmbracoConfigurationStatus impostando il valore '%0%'.]]> + + iniziare immediatamente cliccando sul bottone "Avvia Umbraco".
Se sei nuovo a Umbraco, si possono trovare un sacco di risorse sulle nostre pagine Getting Started.]]>
+ + Avvia Umbraco +Per gestire il tuo sito web, è sufficiente aprire il back office di Umbraco e iniziare ad aggiungere i contenuti, aggiornando i modelli e i fogli di stile o aggiungere nuove funzionalità]]> + Connessione al database non riuscita. + Umbraco Versione 3 + Umbraco Versione 4 + Guarda + Umbraco %0% per una nuova installazione o per l'aggiornamento dalla versione 3.0. +

+ Clicca "avanti" per avviare la procedura.]]>
+ + + Codice cultura + Nome cultura + + + + Riconnetti adesso per salvare il tuo lavoro + + + © 2001 - %0%
umbraco.com

]]>
+ Benvenuti in Umbraco, digita il tuo username e la tua password nelle caselle seguenti: + + + Dashboard + Sezioni + Contenuto + + + Scegli la pagina sopra... + + Seleziona dove il documento %0% deve essere copiato + + Seleziona dove il documento %0% deve essere spostato + + + + + + + + + + + + Salve %0%

+ +

Questa è un'email automatica per informare che l'azione '%1%' + è stata eseguita sulla pagina '%2%' + dall'utente '%3%' +

+ +

+

Riepilogo aggiornamento:

+ + %6% +
+

+ + + +

Buona giornata!

+ Grazie da Umbraco +

]]>
+ [%0%] Notifica per %1% eseguita su %2% + Notifiche + + + + e selezionando il pacchetto. I pacchetti Umbraco generalmente hanno l'estensione ".umb" o ".zip". + ]]> + Autore + Dimostrazione + Documentazione + Meta dati pacchetto + Nome del pacchetto + Il pacchetto non contiene tutti gli elementi +
+ E' possibile rimuovere questo pacchetto dal sistema cliccando "rimuovi pacchetto" in basso.]]>
+ Non ci sono aggiornamenti disponibili + Opzioni pacchetto + Pacchetto leggimi + Pacchetto repository + Conferma eliminazione + + + Disinstalla pacchetto + + Avviso: tutti i documenti, i media, etc a seconda degli elementi che rimuoverai, smetteranno di funzionare, e potrebbero portare a un'instabilità del sistema, + perciò disinstalla con cautela. In caso di dubbio contattare l'autore del pacchetto.]]> + + Aggiorna pacchetto + + + Versione del pacchetto + Vedi sito web pacchetto + + + + + + + + + + usando i gruppi di membri di Umbraco.]]> + Devi creare un gruppo di membri prima di utilizzare l'autenticazione basata sui ruoli + + + + + + + + + + + + + + + + + + + + + + + + ok per pubblicare %0% e rendere questo contenuto accessibile al pubblico.

Puoi pubblicare questa pagina e tutte le sue sottopagine selezionando pubblica tutti i figli qui sotto.]]>
+ + + + + + + + + + + + + + + + Il testo in rosso non verrà mostrato nella versione selezionata, quello in verde verrà aggiunto]]> + + + + + + + + + + + Concierge + Contenuto + Courier + Sviluppo + Configurazione guidata Umbraco + Media + Membri + Newsletters + Impostazioni + Statistiche + Traduzione + Utenti + + + + Tipo di contenuto master abilitato + Questo tipo di contenuto usa + + + + + + Tipo + Foglio di stile + + Tab + Titolo tab + Tabs + + + Sort order + Creation date + + +
Non chiudere questa finestra durante l'operazione]]>
+ + + + + + Tipo di dati: %1%]]> + + Tipo di documento salvato + Tab creata + Tab eliminata + Tab con id: %0% eliminata + Contenuto non pubblicare + + + + Tipo di dato salvato + + + + + + + + + + + + + + + Tipo utente salvato + + + + + + Partial view salvata + Partial view salvata senza errori! + Partial view non salvata + Errore durante il salvataggio del file. + + + + + + + + + + + + + + + + + + + + Anteprima + Stili + + + + + + + + + Master template + + Template + + + Choose type of content + Choose a layout + Add a row + Add content + Drop content + Settings applied + + This content is not allowed here + This content is allowed here + + Click to embed + Click to insert image + Image caption... + Write here... + + Grid Layouts + Layouts are the overall work area for the grid editor, usually you only need one or two different layouts + Add Grid Layout + Adjust the layout by setting column widths and adding additional sections + Row configurations + Rows are predefined cells arranged horizontally + Add row configuration + Adjust the row by setting cell widths and adding additional cells + + Columns + Total combined number of columns in the grid layout + + Settings + Configure what settings editors can change + + Styles + Configure what styling editors can change + + Settings will only save if the entered json configuration is valid + + Allow all editors + Allow all row configurations + + + + + + Scegli il campo + Converte le interruzioni di linea + + Campi Personalizzati + + + + + + + Minuscolo + Nessuno + + + Ricorsivo + Campi Standard + Maiuscolo + + + + + + + + Task assegnati a te + assegnate a te. Per vedere i dettagli, commenti inclusi, clicca su "Dettagli" o sul nome della pagina. + Puoi anche scaricare la pagina direttamente in formato XML cliccando sul link "Scarica Xml".
+ Per chiudere una traduzione, vai sulla vista Dettagli e clicca sul pulsante "Chiudi". + ]]>
+ chiudi task + Dettagli + Scarica tutte le traduzioni in formato xml + Scarica xml + Scarica xml DTD + Campi + Includi le sottopagine + + [%0%] Traduzione per %1% + + + create da te. Per vedere i dettagli, inclusi i commenti, + clicca su "Dettagli" o sul nome della pagina. Puoi anche scaricare la pagina direttamente in formato XML cliccando sul link "Scarica Xml". + Per chiudere una traduzione, vai sulla vista Dettagli e clicca sul pulsante "Chiudi". + ]]> + + + + + + + + + + + Traduttore + + + + Cache Browser + Cestino + Pacchetti creati + Tipi di dato + Dizionario + Pacchetti installati + Installare skin + Installare starter kit + Lingue + Installa un pacchetto locale + Macros + Tipi di media + Membri + Gruppi di Membri + Ruoli + Tipologia Membri + Tipi di documento + Pacchetti + Pacchetti + Files Python + Installa dal repository + Installa Runway + Moduli Runway + Files di scripting + Scripts + Fogli di stile + Templates + Files XSLT + + + + + + + + + Amministratore + Campo Categoria + Cambia la tua password + + Conferma la nuova password + Contenuto del canale + Campo Descrizione + Disabilita l'utente + Tipo di Documento + Editor + Campo Eccezione + Lingua + Login + + Sezioni + Modifica la tua password + + Password + + + Password attuale + + + + + + + + + + + Username + + + + Writer + +
diff --git a/src/UmbracoUrlHandling/Umbraco/Config/Lang/ja.xml b/src/UmbracoUrlHandling/Umbraco/Config/Lang/ja.xml new file mode 100644 index 0000000..98d0258 --- /dev/null +++ b/src/UmbracoUrlHandling/Umbraco/Config/Lang/ja.xml @@ -0,0 +1,1255 @@ + + + + The Umbraco community + http://our.umbraco.org/documentation/Extending-Umbraco/Language-Files + + + ドメインの割り当て + 動作記録 + ノードの参照 + ドキュメントタイプの変更 + コピー + 新規作成 + パッケージの作成 + 削除 + 無効 + ごみ箱を空にする + ドキュメントタイプの書出 + ドキュメントタイプの読込 + パッケージの読み込み + ライブ編集 + ログアウト + 移動 + メール通知 + 一般公開 + 公開 + 公開を止める + 最新の情報に更新 + サイトのリフレッシュ + 復元 + アクセス権 + 以前の版に戻る + 公開に送る + 翻訳に送る + 並べ替え + 公開する + 翻訳 + 更新 + 初期値 + + + アクセスが拒否されました + ドメインの割り当て + ドメインの削除 + 適当でないノード名 + 適当でないホスト名 + そのホスト名は既に利用されています + 言語コード + ドメイン + ドメイン '%0%' が新たに割り当てられました + ドメイン '%0%' は削除されました + ドメイン '%0%' は既に割り当てられています + ドメイン '%0%' は更新されました + ドメインの編集 + + 継承 + カルチャの割り当て + + ドメイン割り当て + + + これらを表示 + + + 選択 + 現在のフォルダを選択 + その他のアクション + 太字 + インデント解除 + フォーム フィールドの挿入 + グラフィックヘッドラインの挿入 + HTMLの編集 + インデント + イタリック + 中央揃え + 左揃え + 右揃え + リンクの挿入 + アンカーの挿入 + 番号なしリスト + 番号付きリスト + マクロの挿入 + 画像の挿入 + 関係性の編集 + リストに戻る + 保存 + 保存及び公開 + 保存して承認に送る + リスト ビューの保存 + プレビュー + テンプレートが指定されていないのでプレビューは無効になっています + スタイルの選択 + スタイルの表示 + 表の挿入 + モデルを生成 + + + ドキュメントタイプを変更するには、まず有効なドキュメントタイプのリストから選択します + 確認および現在のドキュメントタイプからのマッピングを割り当て、保存します。 + コンテントは再公開されています + 現在のプロパティ + 現在のドキュメントタイプ + 有効な代替タイプが存在しないため変更することができません。選択されたコンテントの親の下に許可されたドキュメントタイプへのみ変更ができます + ドキュメントタイプを変更しました + プロパティを割り当てる + 割り当てるプロパティ + 新しいテンプレート + 新しいドキュメントタイプ + なし + コンテント + ドキュメントタイプを変更する + 選択コンテンツのドキュメント タイプは、[新しいタイプ] に変更され、以下のプロパティがマップされました。 + から + 1つ以上のプロパティを割り当てられませんでした。プロパティが定義が重複しています + 有効なドキュメントタイプのみが表示されます + + + 公開されました + このページについて + エイリアス + (画像を電話でわかるように言葉で説明) + 別名のリンク + クリックでアイテムを編集する + 作成者 + 作成者 + 更新者 + 作成日時 + このドキュメントが作成された日時 + ドキュメントタイプ + 編集中 + 公開終了日時 + このページは公開後変更されています + このページは公開されていません + 公開日時 + 表示するアイテムはありません + リストに表示するアイテムはありません + メディアタイプ + メディアの項目へのリンク + メンバーグループ + 役割 + メンバータイプ + 日時が選択されていません + タイトル + プロパティ + このページは公開されましたが、親ページの '%0%' が非公開のため閲覧できません + このコンテントは公開されていますがキャッシュされていません(内部エラー) + 公開 + 公開状態 + 公開開始日時 + 公開停止日時 + 日時の消去 + 並び順が更新されました + ノードをドラッグ、クリック、または列のヘッダーをクリックする事でノードを簡単にソートできます。SHIFT、CONTROLキーを使い複数のノードを選択する事もできます。 + 統計 + タイトル (オプション) + 代替テキスト (オプション) + + 非公開 + 最終更新日時 + このドキュメントが最後に更新された日時 + ファイルの消去 + ページへのリンク + グループのメンバー + グループのメンバーではありません + 子コンテンツ + ターゲット + + + クリックしてアップロードする + ファイルをここへドロップ.. + メディアへリンク + またはクリックしてファイルを選択 + 使用可能なファイル タイプ + ファイルの最大サイズ + + + メンバーの新規作成 + 全てのメンバー + + + どこに新しい %0% を作りますか + ここに作成 + 型とタイトルを選んでください + "document types".]]> + "media types".]]> + テンプレートなしのドキュメント タイプ + + + ウェブサイトを参照する + 次回から表示しない + Umbracoが起動しない時は、このサイトのポップアップを許可してください。 + 新規ウィンドウで開く + 再起動 + 訪れる + ようこそ + + + Stay + Discard changes + You have unsaved changes + Are you sure you want to navigate away from this page? - you have unsaved changes + + + Done + + Deleted %0% item + Deleted %0% items + Deleted %0% out of %1% item + Deleted %0% out of %1% items + + Published %0% item + Published %0% items + Published %0% out of %1% item + Published %0% out of %1% items + + Unpublished %0% item + Unpublished %0% items + Unpublished %0% out of %1% item + Unpublished %0% out of %1% items + + Moved %0% item + Moved %0% items + Moved %0% out of %1% item + Moved %0% out of %1% items + + Copied %0% item + Copied %0% items + Copied %0% out of %1% item + Copied %0% out of %1% items + + + 名前 + ドメインの割り当て + このウィンドウを閉じる + 削除しますか? + 無効にしますか? + これらの %0% 個の項目を削除する場合は、チェックボックスにチェックを入れてください + ログアウトしますか? + 本当にいいですか? + 切り取り + ディクショナリのアイテムの編集 + 言語の編集 + アンカーの挿入 + 文字の挿入 + ヘッドライン画像の挿入 + 画像の挿入 + リンクの挿入 + クリックするとマクロを追加 + 表の挿入 + 最近の更新 + リンク + 内部リンク: + 内部リンクを使うときは、リンクの前に "#" を挿入してください。 + 新規ウィンドウで開きますか? + マクロの設定 + このマクロは編集できるプロパティがありません + 貼り付け + 許可の編集 + ごみ箱を空にしています。実行中はウィンドウを閉じないでください。 + ごみ箱は空です + ごみ箱から削除すると復活させることはできません + regexlib.comのウェブサービスに現在問題が起きているかもしれず、操作できませんでした。大変申し訳ありませんがこの機能は使用できません。]]> + フォームのフィールドを正規表現で検証できます。例: 'email, 'zip-code' 'url' + マクロを削除 + 必須フィールド + サイトは再インデックスされました + ウェブサイトのキャッシュがリフレッシュされました。 公開されているコンテンツはリフレッシュされましたが、非公開のコンテンツは非公開のままです。 + ウェブサイトのキャッシュがリフレッシュされます。 公開されているコンテンツはリフレッシュされますが、非公開のコンテンツは非公開のままです。 + 列数 + 行数 + プレースホルダにidを設定して、子テンプレートからもこのテンプレートをコンテントに入れられるようにできます。 + IDは<asp:content />エレメントとして用います。]]> + プレースホルダのidを選択してください。 + このテンプレートのマスターで使用可能なIdのみ選択可能です。]]> + クリックすると画像がフルサイズで表示されます + 項目の選択 + キャッシュされている項目の表示 + フォルダーの作成... + オリジナルに関連付ける + フレンドリーなコミュニティ + ページへリンク + リンク ドキュメントを新しいウィンドウまたはタブで開く + メディアへリンク + メディアの選択 + アイコンの選択 + アイテムの選択 + リンクの選択 + マクロの選択 + コンテンツの選択 + メンバーの選択 + メンバー グループの選択 + このマクロのパラメーターはありません + 外部ログイン プロバイダー + 例外の詳細 + スタックトレース + Inner Exception + 次をリンク: + 次をリンク解除: + アカウント + エディターの選択 + + + %0%' の別の言語版を編集するには、左側のメニューの'言語'でその言語を追加します + ]]> + カルチャ名 + + + ユーザー名を入力... + パスワードを入力... + %0%と命名します... + ここに名称を入力してください... + ラベル... + 説明を入力してください... + 検索する... + 条件で絞り込む... + 入力してタグを追加 (各タグの後に Enter を押してください)... + + + ルートノードとして許可する + これを有効にするとコンテンツとメディアツリーのルートレベルに作成することができます + 子ノードとして許可するタイプ + ドキュメント タイプ構成 + 新規作成 + タブの削除 + 説明 + 新しいタブ + タブ + サムネイル + リストビューを有効にする + 子ノードをツリーに表示せずにリストビューに表示します + 現在のリストビュー + 有効なリストビューデータタイプ + カスタムリストビューを作成する + カスタムリストビューを削除する + + + 値の前に追加 + データベースのデータ型 + プロパティ エディター GUID + プロパティ エディター + ボタン + 高度な設定を有効にする + コンテキストメニューを有効にする + 挿入される画像のデフォルト最大サイズ + 関連付けるスタイルシート + ラベルの表示 + 幅と高さ + + + データは保存されましたが、公開前にこのページの幾つかのエラーを修正しなければなりません: + 現在のメンバーシッププロバイダではパスワードを変更できません (EnablePasswordRetrievalがtrueでなければなりません) + %0% は既にあります + 次の様なエラーが発生しています: + 次の様なエラーが発生しています: + パスワードは最低でも %0% 文字の長さかつ %1% 文字以上の数以外の文字を含める必要があります + %0% は整数でなければなりません + %1% タブの %0% フィールドは必須です + %0% は必須です + %1% の %0% は正しい書式ではありません + %0% は正しい書式ではありません + + + サーバー エラーが発生しました + 指定されたファイルタイプは管理者のみに許可されます + 注意! CodeMirrorが設定で有効化されていますが、 Internet Explorerでは不安定なので無効化してください。 + 新しいプロパティ型のエイリアスと名前の両方を設定してください! + 特定のファイルまたはフォルタの読み込み/書き込みアクセスに問題があります + Partial View スクリプトの読み込みエラー (ファイル: %0%) + userControl の読み込みエラー '%0%' + customControl の読み込みエラー (アセンブリ: %0%, タイプ: '%1%') + MacroEngine スクリプトの読み込みエラー (ファイル: %0%) + XSLT ファイル解析エラー: %0% + XSLT ファイル読み込みエラー: %0% + タイトルを入力してください + 型を選択してください + 元画像より大きくしようとしていますが、本当によろしいのですか? + Pythonスクリプトにエラーがあります + 1つ以上のエラーがあるのでこのPythonスクリプトは保存できませんでした + 開始ノードが削除されています。管理者に連絡してください。 + スタイルを変更する前にコンテントをマークしてください + 有効なスタイルがありません + 結合したい2つのセルの左側にカーソルを置いてください + このセルは結合されたものではないので分離する事はできません。 + XSLTソースにエラーがあります + 1つ以上のエラーがあるのでこのXSLTは保存できませんでした + このプロパティに使用されているデータタイプにエラーがあります + + + Umbracoについて + アクション + アクション選択 + 追加 + エイリアス + すべて + 確かですか? + 枠線 + または + キャンセル + セルの余白 + 選択 + 閉じる + ウィンドウを閉じる + コメント + 確認 + 縦横比 + 続行 + コピー + 新規作成 + データベース + 日付 + 既定 + 削除 + 削除済 + 削除中... + デザイン + 次元 + + ダウンロード + 編集 + 編集済 + 要素 + 電子メール + エラー + 検索 + 高さ + ヘルプ + アイコン + インポート + 内側の余白 + 挿入 + インストール + 無効 + 位置揃え + 言語 + レイアウト + 読み込み中 + ロックされています + ログイン + ログオフ + ログアウト + マクロ + 移動 + もっと + 名前 + 新規 + 次へ + いいえ + of + OK + 開く + または + パスワード + パス + プレースホルダのID + しばらくお待ちください... + 前へ + プロパティ + フォームからEmailを受信 + ごみ箱 + 残り + 名前の変更 + 更新 + この項目は必須です + 再試行 + 許可 + 検索 + サーバー + 表示 + 送信後にページを表示 + サイズ + 並べ替え + 送信 + + 検索... + + 更新 + アップグレード + アップロード + URL + ユーザー + ユーザー名 + + ビュー + ようこそ... + + はい + フォルダー + 検索結果 + 順序変更 + 順序変更終了 + プレビュー + パスワードの変更 + ->  + リスト ビュー + 保存... + 現在 + 移動 + 埋め込み + + + + ブラック + グリーン + イエロー + オレンジ + ブルー + レッド + + + + タブの追加 + プロパティの追加 + エディターの追加 + テンプレートの追加 + 子ノードの追加 + 子の追加 + + データ タイプの編集 + + セクションの移動 + + ショートカット + ショートカットの表示 + + リスト ビューの切り替え + ルートとして許可に切り替え + + + + 背景色 + 太字 + テキストの色 + フォント + テキスト + + + ページ + + + インストーラーはデータベースに接続できませんでした。 + web.configファイルを保存できませんでした。接続文字列を手作業で編集してください。 + データベースが見つかりました。識別子: + データベースの設定 + インストールボタンを押すと Umbraco %0% のデータベースへインストールします + ]]> + 次へを押して続行してください。]]> + データベースを見つけられません!"web.config"ファイルの中の"接続文字列"を確認してください。

+

続行するには"web.config"ファイルを編集(Visual Studioないし使い慣れたテキストエディタで)し、下の方にスクロールし、"umbracoDbDSN"という名前のキーでデータベースの接続文字列を追加して保存します。

+

+ 再施行ボタンをクリックして + 続けます。
+ より詳細にはこちらの web.config を編集します。

]]>
+ + 必要ならISPに連絡するなどしてみてください。 + もしローカルのパソコンないしサーバーへインストールするのなら、システム管理者に情報を確認してください。]]> + + アップグレードボタンを押すとUmbraco %0% 用にデータベースをアップグレードします。

+

+ 心配ありません。 - コンテントが消える事はありませんし、後で続けることもできます。 +

+ ]]>
+ 次へ + を押して続行してください。]]> + 次へ をクリックして設定ウィザードを進めてください。]]> + デフォルトユーザーのパスワードを変更する必要があります!]]> + デフォルトユーザーは無効化されているかUmbracoにアクセスできない状態になっています!

これ以上のアクションは必要ありません。次へをクリックして続行してください。]]> + インストール後にデフォルトユーザーのパスワードが変更されています!

これ以上のアクションは必要ありません。次へをクリックして続行してください。]]> + パスワードは変更されました! + + Umbracoはデフォルトユーザーとしてユーザー名 ('admin') 、パスワード ('default')を作成します。このパスワードを独自のものに変更する事は重要 + なことです。 +

+

+ ここではデフォルトのユーザーのパスワードを確認し、必要ならば変更しておく事をお勧めします。 +

+ ]]>
+ 始めに、ビデオによる解説を見ましょう + 次へボタンをクリック(またはweb.configのumbracoConfigurationStatusを編集)すると、あなたはここに示されるこのソフトウェアのライセンスを承諾したと見做されます。注意として、UmbracoはMITライセンスをフレームワークへ、フリーウェアライセンスをUIへ、それぞれ異なる2つのライセンスを採用しています。 + まだインストールは完了していません。 + 影響するファイルとフォルダ + Umbracoに必要なアクセス権の設定についての詳細はこちらをどうぞ + これらのファイル/フォルダについてASP.NETに変更のアクセス権を与えなくてはなりません。 + アクセス権の設定はほぼ完璧です!

+ Umbracoは問題無く起動できますが、Umbracoを最大限に活用する為に推奨されるパッケージのインストールはできないでしょう。]]>
+ 解決方法 + テキスト版を読むにはここをクリックしてください + ビデオチュートリアルを見るか、テキスト版を読んで下さい。]]> + このアクセス権の設定はきっと問題になります! +

+ Umbracoを問題無く起動できますが、フォルダを作成できませんし、Umbracoを最大限に活用する為に推奨されるパッケージのインストールはできないでしょう。]]>
+ Umbracoに必要なアクセス権の設定が不足しています! +

+ Umbracoを起動する為には、アクセス権の設定を見直す必要があります。]]>
+ アクセス権の設定は完璧です!

+ Umbracoを起動し、パッケージをインストールする準備が整いました!]]>
+ フォルダの問題解決 + ASP.NETとフォルダの作成についての詳細はこちらのリンクからどうぞ + フォルダのアクセス権を設定 + + スクラッチから始めたい + どうしたらいいの?) + 後からRunwayをインストールする事もできます。そうしたくなった時は、Developerセクションのパッケージへどうぞ。 + ]]> + Umbracoプラットフォームのクリーンセットアップが完了しました。この後はどうしますか? + Runwayがインストールされました + + 推奨モジュールからインストールしたいモジュールをチェック、または全てのモジュールのリストを見て下さい。 + ]]> + 経験を積んだユーザーのみに推奨します + 簡単なウェブサイトから始めたい + + "Runway"(≈滑走路)は幾つかの基本的なテンプレートから簡単なウェブサイトを用意します。このインストーラーは自動的にRnwayをセットアップできますが、 + これを編集したり、拡張したり、削除する事も簡単にできます。もしUmbracoを完璧に使いこなせるならばこれは不要です。とはいえ、 + Runwayを使う事は、手間なく簡単にUmbracoを始める為には良い選択肢です。 + Runwayをインストールすれば、必要に応じてRunwayによる基本的な構成のページをRunwayのモジュールから選択できます。 +

+ + Runwayに含まれるもの: ホームページ、はじめてのページ、モジュールのインストールページ。
+ オプションモジュール: トップのナビゲーション、サイトマップ、コンタクト、ギャラリー。 +
+ ]]>
+ Runwayとは? + ステップ 1/5: ライセンスの承諾 + ステップ 2/5: データベースの設定 + ステップ 3/5: ファイルのアクセス権を検証 + ステップ 4/5: Umbracoのセキュリティ確認 + ステップ 5/5: Umbracoの準備が整いました + Umbracoを選んで頂きありがとうございます + 新しいあなたのサイトを表示 +Runwayをインストールして作られた新しいウェブサイトがどのように表示されるのかを見る事ができます。]]> + 追加の情報と手助け +我々の認めるコミュニティから手助けを得られるでしょう。どうしたら簡単なサイトを構築できるか、どうしたらパッケージを使えるかについてのビデオや文書、またUmbracoの用語のクイックガイドも見る事ができます。]]> + Umbraco %0% のインストールは完了、準備が整いました + /web.config fileを手作業で編集し、'%0%'の下にあるumbracoConfigurationStatusキーを設定してください。]]> + 今すぐ開始できます。
もしUmbracoの初心者なら、 +私たちの初心者向けのたくさんの情報を参考にしてください。]]>
+ Umbracoの開始 +ウェブサイトの管理から、簡単にバックオフィスを開き、コンテント、テンプレート、スタイルシート、機能を追加したり更新したりできます]]> + データベースの接続に失敗しました。 + Umbraco Version 3 + Umbraco Version 4 + 見る + umbraco %0% の新規インストールまたは3.0からの更新について設定方法を案内します。 +

+ "次へ"を押してウィザードを開始します。]]>
+ + + カルチャコード + カルチャ名 + + + 何もしないでいると自動的にログアウトします + 作業を保存して今すぐ更新 + + + ハッピー スーパー日曜日 + ハッピー マニアック月曜日 + ハッピー最高の火曜日 + ハッピー ワンダフル水曜日 + ハッピー サンダー木曜日 + ハッピー ファンキー金曜日 + ハッピー土曜日 + ウェブサイトにログインします。 + セッションタイムアウトしました。 + © 2001 - %0%
umbraco.org

]]>
+ + + ダッシュボード + セクション + コンテンツ + + + 上でページを選択... + %0% は %1% にコピーしました + 下でドキュメント'%0%'をコピーする場所を選択してください。 + %0% は %1% に移動しました + 下でドキュメント'%0%'を移動する場所を選択してください。 + が、コンテンツの新しい親として選択されました。下の'ok' をクリックしてください。 + まだノードが選択されていません。'ok'をクリックする前に上のリストでノードを選択してください。 + 現在のノードは、ドキュメントタイプの設定により選択されたノードの子になることはできません。 + ノードは、自分のサブページには移動できません + 現在のノードはルートにできません。 + 子ドキュメントで権限がないので、その操作はできません。 + コピーしたものを元と関係づける + + + %0% への通知を編集 + + 前略 %0% さま

+ +

ユーザー '%3%' によりページ '%2%' 上のタスク '%1%' から自動的にメールします。

+ +

+

更新のまとめ:

+ + %6% +
+

+ + + +

早々

+ Umbracoのロボットより +

]]>
+ [%0%] に通知: ページ %2% 上の %1% について + 通知 + + + + パッケージを選択できます。Umbracoのパッケージは概ね".zip"ないしは".umb"といった拡張子です。 + ]]> + 作成者 + デモ + ヘルプ + パッケージのメタデータ + パッケージ名 + パッケージには何も含まれません +
+ "パッケージのアンインストール"をクリックしてシステムから安全に削除できます。]]>
+ 更新はありません + パッケージのオプション + パッケージの取扱説明書 + パッケージリポジトリ + 本当にアンインストールしますか + パッケージのアンインストールが終了しました + パッケージが正常にアンインストールされました + パッケージのアンインストール + + 注意: 全ての、文書やメディアなどに依存したアイテムを削除する場合はそれらの作業を一端止めてからアンインストールしなければシステムが不安定になる恐れがあります。 + 疑問点などあればパッケージの作者へ連絡してください。]]> + リポジトリからアップデートをダウンロード + パッケージのアップグレード + 更新の手順 + このパッケージの更新があります。Umbracoのパッケージリポジトリから直接ダウンロードできます。 + パッケージのバージョン + パッケージのバージョン履歴 + パッケージのウェブサイトを見る + + + 完全な書式を含んだまま貼り付け (非推奨) + 貼り付けようとしたテキストは、特殊文字や書式設定が含まれます。これは、Microsoft Wordからテキストをコピーしたりすると発生する事です。Umbracoでは貼り付けられたコンテンツをウェブに適用させる為、書式や特殊文字を自動的に削除します。 + 全ての書式を削除してRAWテキストを貼り付け + 書式を除去して貼り付け (推奨) + + + 役割による保護 + 役割に基づく認証によりアクセス制御するのに適します。]]> + メンバーグループを作成する必要があります。]]> + エラーページ + ログインできてもアクセスできない人々へのページです + このページのアクセス制限方法を選択してください + %0% は保護されています + %0% の保護を解除しました + ログインページ + ログインフォームのあるページを選択します + 保護を解除 + ログインフォームとエラーメッセージを含むページを選択してください + このページへアクセス可能な役割を選んでください + このページへのログインとパスワードを設定します + 単一ユーザー保護 + 単一のログインとパスワードで単純に保護したい場合に適します + + + + + + + + + + + 非公開の子ページも含めます + 公開を進めています - 少々お待ちください... + %1% ページ中 %0% ページが公開されました... + %0% は公開されました + %0% とサブページは公開されました + %0% とそのサブページの全てを公開します + OK をクリックすると %0% を公開。

+ このページとその全ての子ページも公開したければ 全ての子ページを公開 をチェック。 + ]]>
+ + + 設定済みの色はありません。 + + + 外部リンクを入力 + 内部リンクを選択 + キャプション + リンク + 新規ウィンドウで開く + キャプションを入力 + リンクを入力 + + + リセット + + + 現在の版 + の文字列は以前の版にはない部分で、緑の文字列は以前の版にのみある部分です。]]> + ドキュメントは以前の版に戻りました + 選択した版をhtmlで表示します。2つの版の比較を表示したいときは、Diff を選択してください。 + 以前の版に戻る + 版の選択 + 表示 + + + スクリプトファイルの編集 + + + 管理人 + コンテンツ + Courier + 開発 + Umbraco 設定ウィザード + メディア + メンバー + ニュースレター + 設定 + 統計 + 翻訳 + ユーザー + ヘルプ + フォーム + アナリティクス + + + 該当のヘルプへ + ヘルプトピック: + ヘルプの動画: + 動画によるチュートリアル + + + 既定のテンプレート + ディクショナリのキー + ドキュメントタイプを読み込むには、「参照」ボタンをクリックして自分のPC内にある".udt"ファイルを選択して、「インポート」ボタンをクリックします。 (次画面で確認画面が表示されます) + 新規タブの名前 + ノードのタイプ + タイプ + スタイルシート + スクリプト + スタイルシートのプロパティ + タブ + タブの名前 + タブ + マスターコンテンツタイプが有効 + このコンテンツタイプの使用 + マスターコンテンツタイプについては、マスターコンテンツタイプからのタブは表示されず、マスターコンテンツタイプでのみ編集することができます。 + このタブにはプロパティが定義されていません、上部のリンクから新しいプロパティを作成してください + マスタードキュメントタイプ + テンプレートを作成する + アイコンの追加 + + + Sort order + Creation date + ソートが完了しました。 + 上下にアイテムをドラッグするなどして適当に配置したり、列のヘッダーをクリックしてコレクション全体をソートできます +
並び替え中はウィンドウを閉じないでください。]]>
+ + + 検証 + アイテムを保存する前に検証エラーを修正してください。 + 失敗しました + 不十分なユーザー権限により操作を完了できませんでした + キャンセルされました + サードパーティのアドインにより操作はキャンセルされました + サードパーティのアドインにより公開はキャンセルされました + プロパティの方は既に存在しています + プロパティの型を作成しました + データ型: %1%]]> + プロパティ型を削除しました + コンテントの型を保存しました + タブを作成しました + タブを削除しました + idが %0% のタブを削除しました + スタイルシートは未保存です + スタイルシートを保存しました + エラーなくスタイルシートを保存しました + データ型を保存しました + ディクショナリのアイテムを保存しました + 親ページが公開されていないので、公開に失敗しました + コンテントを公開しました + と同時にウェブサイトを可視化しました + コンテントを保存しました + 変更を適用する為に公開する事を忘れないでください + 承認へ送りました + 変更は承認へと送られます + メディアを保存しました + メディアをエラーなく保存しました + メンバーを保存しました + スタイルシートのプロパティを保存しました + スタイルシートを保存しました + テンプレートを保存しました + ユーザーの保存時にエラーが発生しました (ログを確認してください) + ユーザーを保存しました + ユーザータイプを保存しました + ファイルは未保存です + ファイルを保存できません。アクセス権を確認してください。 + ファイルを保存しました + エラーなくファイルを保存しました + 言語を保存しました + Pythonスクリプトは未保存です + Pythonスクリプトはエラーがあるので保存できません + Pythonスクリプトを保存しました + Pythonスクリプトにエラーはありません + テンプレートは未保存です + 2つのテンプレートで同じエイリアスを使用していないか確認してください + テンプレートを保存しました + エラーなくテンプレートを保存しました! + XSLTは未保存です + XSLTにエラーがあります + XSLTを保存できません。アクセス権を確認してください。 + XSLTを保存しました + XSLTにエラーはありません + コンテンツは公開されていません + 部分ビュー保存しました + 部分ビューをエラーなしで保存しました! + 部分ビューは保存されていません + ファイルを保存するときにエラーが発生しました。 + スクリプト ビューが保存されました + スクリプト ビューが正しく保存されました + スクリプト ビューが保存されていません + ファイルの保存でエラーが発生しました。 + ファイルの保存でエラーが発生しました。 + + + CSSシンタックスを使用 例: h1, .redHeader, .blueTex + スタイルシートの編集 + スタイルシートのプロパティの編集 + リッチテキストエディターでスタイルのプロパティを識別する名前 + プレビュー + スタイル + + + テンプレートの編集 + コンテンツ領域の挿入 + コンテンツ領域プレースホルダーの挿入 + ディクショナリ アイテムを挿入 + マクロの挿入 + umbraco ページフィールドの挿入 + マスターテンプレート + umbraco テンプレートタグのクイックガイド + テンプレート + + + + 挿入するアイテムを選択する + レイアウトを選択 + 行の追加 + コンテンツの追加 + コンテンツのドロップ + 適用される設定 + + このコンテンツはここでは許可されていません + このコンテンツはここに使用できます + + クリックして埋め込む + クリックして画像を挿入する + キャプション... + ここに記入する... + + レイアウト + レイアウトは通常1つまたは2つの異なるレイアウトを必要とする、グリッドエディタの全体的な作業エリアです + レイアウトを追加する + 追加のセクションの横幅を設定し、レイアウトを調整する + + 行の構成 + 定義された構成の行が水平に配置されます + 行の構成を追加 + 追加のセルのセル幅を設定することで調整します + + + グリッドレイアウトの列を合計した数 + + 設定 + 編集者が設定できる項目 + + + スタイル + 編集者が設定できるスタイル + + 入力されたJSONが正しい場合のみ設定が保存されます + + すべてのエディタを許可する + すべての行の構成を許可する + デフォルトとして設定 + 追加を選択 + デフォルトの選択 + 追加されました + + + + + 構成 + タブが追加されていません + 新しいタブの追加 + 他のタブの追加 + 次から継承: + プロパティの追加 + 必要なラベル + + リスト ビューの有効化 + 並べ替えと検索が可能な子のリストを表示するコンテンツ アイテムを設定します。子はツリーに表示されません。 + + 利用可能なテンプレート + このタイプのコンテンツで使用できるテンプレート エディターを選択してください + + ルートとして許可 + コンテンツ ツリーのルートでこのタイプのコンテンツをエディターで作成することを許可 + はい - ルートでこのタイプのコンテンツを許可 + + 許可された子ノード タイプ + このタイプの下部コンテンツに指定タイプのコンテンツを作成することを許可 + + 子ノードの選択 + + 既存ドキュメント タイプのタブとプロパティを継承。新しいタブを現在のドキュメント タイプに追加、または同じ名前のタブがある場合はマージされます。 + このコンテンツ タイプが構成で使用されるため、自身を構成することはできません。 + 構成に使用できるコンテンツ タイプはありません。 + + 使用可能なエディター + 再利用 + エディター設定 + + 設定 + + 削除します + + 下部に移動しました。 + 以下のツリー構造へ移動する + フォルダーを選択します + + すべてのドキュメント タイプ + すべてのドキュメント + すべてのメディア アイテム + + このドキュメント タイプを使用すると完全に削除されます。削除してもよろしいですか? + このメディア タイプを使用すると完全に削除されます。削除してもよろしいですか? + このメンバー タイプを使用すると完全に削除されます。削除してもよろしいですか? + + およびこのタイプを使用したすべてのドキュメント + およびこのタイプを使用したこのメディア アイテム + およびこのタイプを使用したすべてのメンバー + + このエディターを使用すると新しい設定で更新されます + + + + 代替フィールド + 代替テキスト + 大文字小文字変換 + エンコーディング + フィールドの選択 + 改行コードの変換 + 改行コードをhtmlタグ &lt;br&gt; に変換する + カスタムフィールド + 日付のみ表示 + 日付の形式 + HTMLエンコード + 特殊文字をHTMLで等価な文字列に変換する + フィールドの値の後ろに追加される + フィールドの値の前に追加される + 小文字変換 + なし + フィールド値の後ろ追加 + フィールド値の前に追加 + 再帰的 + 標準フィールド + 大文字変換 + URLエンコード + 文字列をURLで使用可能な文字列に変換する + 上のフィールドの値がいずれも空白の場合に使用される + このフィールドは第1フィールドが空白の場合に使用される + 時刻も表示 区切り文字: + + + 自分に割り当てられたタスク + 自分に割り当てられたタスクに翻訳タスクのリストが示されます。"詳細"ないしページ名をクリックするとコメントなどの詳細を見れます。 + "XML ダウンロード"のリンクから直接XMLをダウンロードできます。
+ 翻訳タスクを閉じる際は、詳細を表示して"閉じる"ボタンをクリックしてください。 + ]]>
+ タスクを閉じる + 翻訳の詳細 + 全ての翻訳タスクをXMLでダウンロード + XML ダウンロード + XML DTD ダウンロード + フィールド + サブページを含める + + [%0%] %1% の翻訳タスク + 翻訳者ユーザーが見つかりません。コンテントの翻訳の前に翻訳者ユーザーを作成してください。 + 自分で作成したタスク + 自分で作成したタスクにページのリストが示されます。"詳細"ないしページ名をクリックするとコメントなどの詳細を見れます。 + "XML ダウンロード"のリンクから直接XMLをダウンロードできます。
+ 翻訳タスクを閉じる際は、詳細を表示して"閉じる"ボタンをクリックしてください。 + ]]>
+ ページ '%0%' を翻訳へ送りました + ページ '%0%' を翻訳へ送る + 割り当てた人 + 開始されたタスク + 述べ語数 + 翻訳する: + 翻訳完了。 + クリックして翻訳したページのプレビューを表示できます。元のページがあれば2つのページを比較します。 + 翻訳に失敗しました。XMLファイルが壊れているかもしれません。 + 翻訳オプション + 翻訳者 + 翻訳XMLのアップロード + + + キャッシュの参照 + ごみ箱 + パッケージの作成 + データ型 + ディクショナリ + インストール済のパッケージ + スキンのインストール + スターターキットのインストール + 言語 + ローカルパッケージのインストール + マクロ + メディアタイプ + メンバー + メンバーのグループ + 役割 + メンバーの種類 + ドキュメントタイプ + 関連タイプ + パッケージ + パッケージ + Python ファイル + リポジトリからインストール + Runwayのインストール + Runwayのモジュール + スクリプトファイル + スクリプト + スタイルシート + テンプレート + XSLT ファイル + アナリティクス + + + 新しい更新があります + %0% が用意されています。ダウンロードするにはクリックしてください。 + サーバーに接続できませんでした + 更新の確認中にエラーが発生しました。詳細についてはスタックトレースを確認してください。 + + + 管理者 + フィールドのカテゴリー + パスワードの変更 + 新パスワード + 新パスワードの確認 + Umbracoの管理画面にアクセスするためのパスワードを変更するには、以下のフォームに新しいパスワード入力して「パスワードの変更」ボタンをクリックしてください。 + コンテントチャンネル + 概要フィールド + ユーザーを無効にする + ドキュメントタイプ + 編集者 + フィールドの抜粋 + 言語 + ログイン + メディアライブラリの開始ノード + セクション + Umbracoへのアクセスを無効にする + パスワード + パスワードのリセット + パスワードが変更されました! + 新しいパスワードの確認 + 新しいパスワードの入力 + パスワードは空白にできません! + 現在のパスワード + 現在のパスワードが正しくない + 新しいパスワードと確認のパスワードが一致しません。再度入力してください! + 確認のパスワードは新しいパスワードと一致しません! + 子ノードのアクセス権を置き換える + これらのページのアクセス権を変更します: + 選択したページのアクセス権を変更する + 全ての子要素から調べる + コンテンツの開始ノード + ユーザー名 + ユーザーの権限 + ユーザーの種類 + ユーザーの種類 + 投稿者 + 翻訳者 + 変更 + あなたのプロフィール + あなたの最新の履歴 + セッションの期限 + + + 検証 + メールで検証 + 数値で検証 + URL で検証 + ... またはカスタム検証を入力 + 必須フィールドです + +
diff --git a/src/UmbracoUrlHandling/Umbraco/Config/Lang/ko.xml b/src/UmbracoUrlHandling/Umbraco/Config/Lang/ko.xml new file mode 100644 index 0000000..d0a5237 --- /dev/null +++ b/src/UmbracoUrlHandling/Umbraco/Config/Lang/ko.xml @@ -0,0 +1,922 @@ + + + + The Umbraco community + http://our.umbraco.org/documentation/Extending-Umbraco/Language-Files + + + 호스트명 관리 + 감사 추적 + 노드 탐색 + 복사 + 새로 만들기 + 패키지 새로 만들기 + 삭제 + 비활성 + 휴지통 비우기 + 추출 문서 유형 + .NET으로 추출 + .NET으로 추출 + 등록 문서 유형 + 패키지 등록 + 캔버스 내용 편집 + 종료 + 이동 + 알림 + 퍼블릭 접근 + 발행 + 노드 새로 고침 + 전체 사이트 재발행 + 권한 + 롤백 + 발행 항목으로 전달 + 번역 항목으로 전달 + 정렬 + 발행 항목으로 전달 + 번역 + 업데이트 + + + 새로운 도메인 추가 + 도메인 + 새로운 '%0%' 도메인이 생성되었습니다 + '%0%' 도메인이 삭제되었습니다 + '%0%' 도메인이 이미 존재합니다 + 예제: yourdomain.com, www.yourdomain.com + '%0%' 도메인이 업데이트 되었습니다 + 현재 도메인 수정 + + + 보기 + + + 굵게 + 단락 들여쓰기 취소 + 폼 필드 삽입 + 그래픽 헤드라인 삽입 + Html 편집 + 단락 들여쓰기 + 기울임꼴 + 가운데 맞춤 + 왼쪽 맞춤 + 오른쪽 맞춤 + 하이퍼 링크 + 기호 삽입 + 기호 목록 + 번호 목록 + 매크로 삽입 + 이미지 삽입 + 관계 편집 + 저장 + 저장 후 발행 + 저장 후 승인을 위해 전송 + 미리보기 + 스타일 선택 + 스타일 보기 + 테이블 삽입 + + + 이 페이지 정보 + 대체 링크 + (전화위에 그림을 어떻게 설명하시겠습니까) + 대체 링크 + 이 항목을 편집하시려면 클릭하세요. + 작성자 + 생성일 + 문서 유형 + 편집 + 삭제됨 + 이 항목은 발행후 변경되었습니다. + 이 항목은 발행되지 않았습니다. + 마지막 발행일 + 미디어 타입 + 사용자 그룹 + 역할 + 사용자 타입 + 날짜가 선택되지 않았습니다. + 페이지 제목 + 속성 + 이문서는 발행되었지만 부모문서 '%0%'가 발행되지 않아 볼 수 없습니다. + 발행 + 발행 상태 + 발행됨 + 날짜 삭제 + 정렬이 업데이트되었습니다. + 노드를 드래그하거나 컬럼헤더를 클릭하면 노드가 정렬됩니다. 쉬프트키나 컨트롤키를 이용하면 여러노드선택이 가능합니다. + 통계 + 제목(옵션) + 유형 + 발행취소 + 마지막 수정일 + 파일 삭제 + 문서에 링크 + + + 새로운 %0% (을)를 생성할 위치를 지정하십시오 + 생성자 + 타입과 제목을 선택하세요 + + + 브라우저에서 보기 + TRANSLATE ME: '- Hide' + Umbraco 가 열리지 않으면, 이 사이트의 팝업을 허용하여야 합니다 + 새로운 창으로 열렸습니다 + 재시작 + 방문 + 환영합니다 + + + Stay + Discard changes + You have unsaved changes + Are you sure you want to navigate away from this page? - you have unsaved changes + + + Done + + Deleted %0% item + Deleted %0% items + Deleted %0% out of %1% item + Deleted %0% out of %1% items + + Published %0% item + Published %0% items + Published %0% out of %1% item + Published %0% out of %1% items + + Unpublished %0% item + Unpublished %0% items + Unpublished %0% out of %1% item + Unpublished %0% out of %1% items + + Moved %0% item + Moved %0% items + Moved %0% out of %1% item + Moved %0% out of %1% items + + Copied %0% item + Copied %0% items + Copied %0% out of %1% item + Copied %0% out of %1% items + + + 이름 + 호스트네임 관리 + 이창 닫기 + 정말로 삭제하시겠습니까? + 정말로 비활성화하시겠습니까? + %0% 항목(들)을 삭제하시려면 이 박스를 체크하세요 + 로그아웃 하시겠습니까? + 확실합니까? + TRANSLATE ME: 'Cut' + 사전 항목 편집 + 언어 편집 + 내부 링크삽입 + 문자열 삽입 + 그래픽 헤드라인 삽입 + 그림삽입 + 링크 삽입 + 매크로 추가 클릭 + 테이블 삽입 + 마지막 수정 + 링크 + 내부링크: + 내부링크를 사용하실 때 링크앞에 "#"를 넣어주세요 + 새 창으로 여시겠습니까? + 매크로 세팅 + 이 매크로에는 편집할 수 있는 항목이 포함되어 있지 않습니다. + 붙여넣기 + 권한 편집 + 휴지통안에 이 항목들이 완전히 삭제중 입니다. 작업이 완료되기전까지 창을 닫지마세요. + 휴지통이 비었습니다. + 휴지통에서 삭제하시면 완전히 삭제됩니다. + regexlib.com의 웹서비스는 현재 제어할 수 없는 몇가지 문제점이 보고되었습니다. 불편을 드려 대단히 죄송합니다.]]> + 필드 유효성검사를 위해 정규표현식을 검색합니다. 예: 'email, 'zip-code' 'url' + 매크로 삭제 + 필수 필드 + 사이트의 색인이 재생성되었습니다. + 웹사이트 캐쉬가 재생되었습니다. 모든 발행컨텐츠가 업데이트되었습니다. 그러나 모든 미발행 컨텐츠는 여전히 미발행상태입니다. + 웹사이트 캐쉬가 재생되었습니다. 모든 발행컨텐츠가 업데이트되었습니다. 그러나 모든 미발행 컨텐츠는 미발행상태로 남아있습니다. + 컬럼수 + 줄수 + <asp:컨텐츠 /> 항목을 사용하는 아이디를 참조하여 Placeholder 아이디를 설정하세요.]]> + Placeholder 아이디를 선택하세요. 현재 템플릿의 마스터에 아이디들만 선택할 수 있습니다.]]> + 이미지를 전체크기로 보시려면 클릭하세요. + 아이템 선택 + 캐쉬 아이템 보기 + + + %0%'사전 항목 아래에 다른 언어버전들을 편집하세요
왼쪽 '언어'메뉴를 사용하여 추가 언어들을 설정할 수 있습니다. + ]]>
+ 국가명 + + + 자식노드 타입 허용 + 생성 + 색인 삭제 + 설명 + 새 색인 + 색인 + 썸네일 + + + 이전값 더하기 + 데이터베이스 데이터타입 + 데이터타입 GUID + Render 컨트롤 + 버튼 + 고급설정 사용 + context 메뉴 사용 + 삽입이미지의 기본사이즈 최대값 + 관련 스타일시트 + 라벨 보기 + 너비와 높이 + + + 데이터가 저장되었지만, 이 페이지를 발행하기전에 에러들부터 수정하셔야 합니다 + 현재의 멤버쉽 프로바이더는 암호변경을 지원하지 않습니다(EnablePasswordRetrieval need to be true) + %0% 은 이미 존재합니다. + 에러: + 에러: + 암호는 최소 %0% 자 이상이며 적어도 %1% 개의 알파벳이 아닌 문자를 포함해야 합니다. + %0% must be an integer + The %0% field in the %1% tab is mandatory + %0% 은 필수선택 항목입니다. + %0% at %1% 올바른 형식이 아닙니다. + %0% 올바른 형식이 아닙니다. + + + 주의! CodeMirror가 설정에서 활성화 되었어도 충분히 안정적이지 않기 때문에 인터넷 익스플로러에선 비활성화 됩니다. + 새 속성타입에 이름과 별칭을 모두 채우세요! + 특정 파일또는 폴더에 읽기/쓰기 접근제한 문제가 있습니다 + 제목을 넣어주세요 + 유형을 선택해주세요 + 원본크기보다 큰사이즈의 이미지를 만들려고 합니다. 계속하시겠습니까? + Python 스크립트 에러 + 에러를 포함하고 있어 Python 스크립트가 저장되지 않았습니다. + 시작노드가 삭제되었습니다. 관리자에게 문의하세요 + 스타일을 변경하시기 전에 컨텐츠를 체크하세요 + 사용할 수 있는 스타일이 없습니다. + 합치기 원하시는 두셀의 왼쪽에 커서를 가져다놓으세요 + 병합되지 않은 셀을 분리할 수 없습니다. + XSLT 소스에러 + 에러를 포함하고 있어 XSLT가 저장되지 않았습니다. + + + 정보 + 액션 + 추가 + 별칭 + 확실합니까? + 경계선 + 또는 + 취소 + 셀 마진 + 선택 + 닫기 + 창 닫기 + 코멘트 + 확인 + 비율 맞추기 + 계속 + 복사 + 생성 + 데이타베이스 + 날짜 + 기본 + 삭제 + 삭제됨 + 삭제중... + 디자인 + 범위 + 아래로 + 다운로드 + 편집 + 편집됨 + 항목 + 이메일 + 에러 + 찾기 + 높이 + 도움말 + 아이콘 + 가져오기 + 내부 마진 + 삽입 + 설치 + 적용 + 언어 + 레이아웃 + 로딩 + TRANSLATE ME: 'Locked' + 로그인 + 로그오프 + 로그아웃 + 매크로 + 이동 + 이름 + 새로 + 다음 + 아니요 + + 완료 + 열기 + 또는 + 비밀번호 + 경로 + Placeholder 아이디 + 잠시만 기다려주세요... + 이전 + 속성 + 수신된 폼데이터 이메일전송 + 휴지통 + 남아있는 + 이름바꾸기 + TRANSLATE ME: 'Renew' + 재시도 + 권한 + 검색 + 서버 + 보기 + 전송된 페이지보기 + 사이즈 + 정렬 + Submit + 타입 + 검색유형... + 위로 + 업데이트 + 업그레이드 + 업로드 + Url + 사용자 + 사용자 + + 보기 + 환영합니다... + 너비 + + Reorder + I am done reordering + + + 배경색 + 굵게 + 글자색 + 폰트 + 글꼴 + + + 페이지 + + + 인스톨러가 데이터베이스에 연결할 수 없습니다. + web.config를 저장할 수 없습니다.connection string을 수동으로 수정하세요. + 데이터베이스가 확인되었으며 정보는 + 데이터베이스 설정 + 설치 버튼을 누르면 Umbraco %0% 데이터베이스가 설치됩니다.]]> + 다음을 누르세요.]]> + 데이터베이스를 찾을 수 없습니다. “web.config”파일의 "connection string"이 바르게 설정되었는지 확인하세요.

+

"web.config" 파일에 맨아래에 ,키네임을 "UmbracoDbDSN"로 하여 사용하시는 데이터베이스의 connection string 정보를 입력하시고 파일을 저장하세요.

+

+ 완료 후재시도버튼을 누르세요.
+ web.config의 더많은 정보는 여기에 있습니다.

]]>
+ + 필요하시다면 사용하시는 ISP쪽에 문의하시기 바랍니다.. + 로컬 머신이나 서버에 설치되어 있다면 해당 시스템 관리자에게 문의하시기 바랍니다.]]> + 업그레이드 버튼을 누르면 여러분의 데이터베이스를 Umbraco %0% 로 업데이트합니다.

어떤 컨텐트도 삭제되지 않으니 걱정마세요!

]]>
+ 계속 진행하시려면 다음 을 누르세요. ]]> + 다음을 클릭하시면 설정마법사를 계속 진행합니다.]]> + 기본 사용자의 암호가 변경되어야 합니다!]]> + 기본 사용자가 비활성화되었거나 Umbraco에 접근할 수 없습니다!

더 이상 과정이 필요없으시면 다음을 눌러주세요.]]> + 설치후 기본사용자의 암호가 성공적으로 변경되었습니다!

더 이상 과정이 필요없으시면 다음을 눌러주세요.]]> + 비밀번호가 변경되었습니다! + + Umbraco 는 로긴을 위한 기본 ('admin') 사용자를 만들고 암호를 ('default')로 설정합니다. 암호를 변경하셔야 합니다. +

+

+ 이 과정은 기본 사용자의 암호를 체크하고 변경이 필요한 부분을 제안합니다. +

+ ]]>
+ 편리한 시작을 위해, 소개 Video를 시청하세요 + 다음버튼을 누르시면 (또는Web.config에 UmbracoConfigurationStatus를 수정하시면), 여러분은 아래에 명시된 소프트웨어 라이센스를 수락합니다. Umbraco 배포는 2가지 다른 라이센스로 구성되어 있습니다. 프레임워크에는 오픈소스 MIT라이센스가 UI에는 Umbraco 프리웨어 라이센스가 적용됩니다. + 아직 설치되지 않았습니다. + 영향받는 파일과 폴더 + Umbraco권한관리을 위해 더정보가 필요하시면 여기를 누르세요 + 다음 파일/폴더에 ASP.NET 수정권한이 필요합니다. + 권한 설정이 대부분 완벽합니다!

+ 여러분은 문제없이 Umbraco사용이 가능하지만 일부 추천 패키지가 설치되지 않을 수 있습니다.]]>
+ 문제해결방법 + 문서버전을 읽으시려면 클릭하세요 + Video tutorial를 시청하세요.]]> + 퍼미션 세팅에 문제가 있을 수 있습니다. +

+ Umbraco를 문제없이 실행할 수 있지만, 폴더를 만들거나 추천패키지를 설치하지 못할 수 있습니다.]]>
+ 권한 설정이 완료되지 않았습니다! +

+ Umbraco 실행을 위해, 권한설정을 업데이트하세요.]]>
+ 권한세팅이 완벽합니다!

+ Umbraco 패키지 설치를 진행할 준비가 되었습니다. ]]>
+ 폴더 문제해결 + 다음 링크는 ASP.NET이나 폴더생성문제에 대한 더 많은 정보를 제공합니다. + 폴더 권한 세팅 + Umbraco 는 특정 디렉토리에 쓰기/수정 권한이 필요합니다. 이것은 PDF나 그림과 같은 파일을 저장하고 cache같은 임시데이터을 위해 사용됩니다. + scratch를 시작하기 원합니다. + learn how) + Runway설치를 나중에 실행하실 수 있습니다. 개발도구 부분에서 패키지를 선택하세요. + ]]> + 여러분은 Umbraco 플랫폼 설치를 완료하였습니다. 다음엔 어떤 작업을 원하십니까? + Runway 가 설치됨 + + 이것은 저희가 권장하는 모듈들입니다. 설치를 원하시는 모듈을 확인하세요 모듈이 없다면 전체 모듈리스트를 보세요 + ]]> + 경험이 있는 사용자 분들만 추천합니다. + 간단한 웹사이트 생성을 원합니다. + + "Runway" 는 간단한 웹사이트 생성을 위한 기본 문서타입과 템플릿을 제공합니다. 인스톨러를 이용해 Runway를 자동으로 설치하신 후 + 여러분은 쉽게 수정, 확장, 삭제가 가능하십니다. + Umbraco에 익숙하시다면 Runway 가 필요없지만 그렇지 않으신경우 Runway는 가장 빨리 시작할 수 있는 최고의 예제를 제공합니다. + Runway 설치를 선택하시면, 여러분은 옵션으로 Runway 페이지에 쓰이는 Runway 모듈로 불리는 기본 빌딩 블록들을 선택하실 수 있습니다. +

+ + Runway 포함사항: 홈페이지, Getting Started 페이지, 모듈 설치페이지.
+ 옵션 모듈들: 네이게이션, 사이트맵, 연락처, 갤러리. +
+ ]]>
+ Runway 란? + Step 1/5 라이센스 허가 + Step 2/5 데이터베이스 설정 + Step 3/5 파일권한 확인 + Step 4/5 Umbraco 보안설정 확인 + Step 5/5 Umbraco를 시작할 준비가 되었습니다. + Umbraco를 선택해주셔서 감사합니다. + 새 사이트 보기 + Runway가 설치되었습니다, 새 웹사이트를 볼 수 있습니다.]]> + 고급 도움말과 정보 + 우수 커뮤니티에서 도음을 받으세요. 간단한 사이트제작이나 패키지 사용법, Umbraco기술의 퀵가이드를 제공하는 문서를 보시거나 무료 비디오를 시청하세요.]]> + Umbraco %0% 가 설치되어 사용준비가 되었습니다. + /web.config file을 수동으로 편집해야 합니다. AppSetting 키의 UmbracoConfigurationStatus'%0%'의 값으로 설정하세요.]]> + Umbraco 와 첫만남이시면
아래의 "Umbraco 접속하기" 버튼을 클릭하여 즉시 시작하실 수 있습니다. + 시작페이지에서 풍부한 리소소를 제공받을 수 있습니다.]]>
+ Umbraco 실행 +사이트 관리를 위해서 Umbraco 관리자를 여시고 컨텐츠를 추가하시거나 템플릿과 스타일시트 업데이트 또는 새기능을 추가하세요]]> + 데이터베이스에 연결 실패 + Umbraco 버전 3 + Umbraco 버전 4 + 보기 + Umbraco %0% 로 신규설치나 업그레이드가 가능하도록 도와줍니다. +

+ 마법사를 시작하시려면 "다음" 을 누르세요.]]>
+ + + 국가 코드 + 국가명 + + + TRANSLATE ME: 'You've been idle and logout will automatically occur in' + TRANSLATE ME: 'Renew now to save your work' + + + © 2001 - %0%
umbraco.com

]]>
+ Umbraco 에 오신것을 환영합니다. 사용자명과 비밀번호를 입력하십시오: + + + 대시보드 + 세부항목 + 컨텐츠 + + + 페이지 상단 선택... + %0% 가 %1%로 복사되었습니다. + %0%문서가 복사될 곳을 선택하세요 + %0% 가 %1%로 이동되었습니다. + %0%문서가 이동할 곳을 선택하세요 + 새 컨텐츠의 루트로 선택되었습니다. 확인을 클릭하세요 + 아직 노드가 선택되지 않았습니다, 확인 버튼을 누르기전에 리스트에 노드를 선택하세요. + 현재노드는 타입때문에 선택된 노드아래로 갈 수 없습니다. + 현재 노드는 서브페이지로 이동할 수 없습니다. + TRANSLATE ME: 'The action isn't allowed since you have insufficient permissions on 1 or more child documents.' + + + %0% 에 대한 알림 편집 + + 안녕하세요 %0%

+ +

사용자 '%3%' 가 작업 '%1%' 를 + 페이지 '%2%' 에서 + 진행했음을 알리는 자동 발송 메일입니다. +

+ +

+

업데이트 요약:

+ + %6% +
+

+ + + +

좋은 하루 되세요!

+

]]>
+ %1%에 대한 [%0]알림이 %2%에 생성되었습니다 + 알림 + + + + Umbraco 패키지는 보통 ".umb" 나 ".zip" 확장자를 가집니다. + ]]> + 저자 + 데모 + 문서화 + 패키지 메타데이터 + 패키지 이름 + 패키지가 포함한 아이템이 없습니다. +
+ 아래 "패키지 삭제"를 클릭하시면 안전하게 시스템에서 삭제하실 수 있습니다.]]>
+ 업그레이드할 패키지가 없습니다. + 패키지 옵션 + 패키지 정보 + 패키지 저장소 + 삭제 확인 + 패키지가 삭제되었습니다. + 패키지가 성공적으로 삭제되었습니다. + 패키지 삭제 + + 알림: 문서, 미디어등 삭제항목에 관련된 모든 항목이 삭제됩니다, 작업을 중단하면 시스템이 불안정적으로 동작할 수 있습니다. + 삭제는 매우 주의를 요하기 때문에 의심스러운항목은 패키지 제작자에게 문의하시기 바랍니다.]]> + 저장소에서 업데이트 다운로드 + 업그레이드 패키지 + 업그레이드 지시사항 + 업그레이드할 패키지가 없습니다. Umbraco패키지 저장소에서 직접다운로드하실 수 있습니다. + 패키지 버전 + 패키지 웹사이트 보기 + + + 포맷을 포함여하 붙여넣기(권장하지 않음) + 붙여넣으려는 텍스트에 특수한 문자나 포맷이 포함되어있습니다. Microsoft Word문서에서 바로 복사해와서 문제가 발생된것일 수 있습니다. Umbraco는 붙여넣으려는 컨텐츠가 웹에 적합하도록 특수한 문자나 포맷을 자동으로 제거합니다 + 포맷을 전혀 적용하지 않고 붙여넣기 + 포맷을 제거하고 붙여넣기(권장) + + + 역할 기반 제한 + Umbraco의 사용자그룹을 사용하세요.]]> + 사용자 그룹부터 생성해야합니다.]]> + 에러 페이지 + 로그인을 시도할 때 접근할 수 없습니다. + 이페이지의 접근제한을 어떻게 제한할지 선택하세요 + %0% 제한되었습니다. + %0% 의 제한이 제거되었습니다 + 로그인 페이지 + 로그인 폼 양식페이지를 선택하세요 + 제한 제거 + 로그인 폼과 에러메세지가 포함된 페이지를 선택하세요 + 이 페이지에 접근할 역할을 선택하세요 + 이 페이지에 로그인과 암호 설정 + 사용자 제한 + 로그인과 암호를 이용해 사용자 제한 + + + 제3공급자 익스텐션 취소때문에 %0% 가 발행할 수없습니다. + 미발행된 자식 문서 포함 + 발행 진행중 - 잠시만 기다리세요... + %1% 페이지를 제외한 %0% 가 발행됨... + %0% 발행됨 + %0% 과 서브페이지가 발행되었습니다 + %0% 와 모든 서브페이지 발행 + %0%를 발행하기위해 확인를 클릭하세요 and thereby making it's content publicly available.

+ 이 페이지와 모든 서브페이지를 아래 모든 자식문서 발행을 체크하여 발행할 수 있습니다. + ]]>
+ + + 외부링크 추가 + 내부링크 추가 + 추가 + 설명 + 내부 페이지 + URL + 아래로 이동 + 위로 이동 + 새 창 열기 + 링크 삭제 + + + 현재 버전 + 빨간 텍스트는 선택한 버전에선 보이지 않습니다. 녹색은 추가되었음을 의미합니다]]> + 문서가 롤백되었습니다. + 선택한 버전을 html로 보여줍니다. 두 버전의 차이점을 동시에 보시려면, 차이점 보기를 사용하세요 + 롤백 + 버전 선택 + 보기 + + + 스크립트 파일 편집 + + + 안내 + 컨텐츠 + 가이드 + 개발도구 + Umbraco 설치마법사 + 미디어 + 구성원 + 뉴스레터 + 세팅 + 통계 + 변환 + 사용자 + + + 기본 템플릿 + 사전 키 + 문서를 가져오시려면 사용하시는 컴퓨터에 ".udt"를 찾아 선택하시고 "가져오기"를 클릭하세요(다음 단계에서 확인여부를 문의합니다) + 새 색인 제목 + 노드타입 + 타입 + 스타일시트 + 스타일시트 속성 + 색인 + 색인 제목 + 색인 + + + Sort order + Creation date + 정렬 완료 + 다른 아이템을 마우스로 위,아래로 드래그 하여 이동하거나 열의 헤더를 클릭하여 아이템을 정렬할 수 있습니다 +
정렬하는 동안 이 창을 닫지 마십시오]]>
+ + + 3rd party add-in 때문에 발행이 취소되었습니다. + 속성타입이 이미존재합니다 + 속성타입 생성되었습니다 + 데이터타입: %1%]]> + 속성타입 삭제됨 + 컨텐츠타입 저장됨 + 색인 생성 + 색인 삭제 + Tab with id: %0% 삭제됨 + 스타일시트 저장되지 않음 + 스타일시트 저장 + 스타일시트 에러없이 저장 + 데이터타입 저장됨 + 사전 항목 저장됨 + 부모페이지가 발행되지 않았기때문에 발행에 실패했습니다. + 컨텐츠 발행됨 + and 웹사이트에서 보기 + 컨텐츠 저장됨 + 변경된 내용이 적용되어 발행됨을 기억하세요 + 승인을 위해 전송 + 변경사항이 승인을 위해 전송되었습니다. + 사용자 저장됨 + 스타일시트 속성 저장됨 + 스타일시트 저장됨 + 템플릿 저장됨 + 사용자 저장에러(로그 확인) + 사용자 저장됨 + 파일 저장되지 않음 + 파일이 저장되지 않았습니다. 권한을 확인하세요 + 파일 저장 + 파일이 에러없이 저장 + 언어 저장됨 + Python 스크립트가 저장되지 않았습니다. + Python 스크립트가 에러때문에 저장되지 않았습니다. + Python 스크립트 저장 + Python 스크립트 에러없음 + 템플릿이 저장되지 않음 + 2 템플릿에 동일한 별칭이 적용되지 않았는지 확인하시기 바랍니다. + 템플릿 저장 + 탬플릿이 에러없이 저장되었습니다! + XSLT 저장되지 않음 + XSLT 에 에러가 포함됨 + XSLT가 저장되지 않았습니다. 권한을 확인하세요 + XSLT 저장 + XSLT 에러없음 + + + CSS 태그를 사용하세요 예: h1, .redHeader, .blueTex + 스타일시트 편집 + 스타일시트 속성편집 + rich text editor 에 스타일속성을 확인할 수 있는 이름을 붙이세요 + 미리보기 + 스타일 + + + 템플릿 편집 + 컨텐츠범위 삽입 + 컨텐츠범위 Placeholder 삽입 + 사전 항목 삽입 + 매크로 삽입 + Umbraco 페이지필드 삽입 + 마스터 템플릿 + Umbraco 템플릿태그 퀵가이드 + 템플릿 + + + Choose type of content + Choose a layout + Add a row + Add content + Drop content + Settings applied + + This content is not allowed here + This content is allowed here + + Click to embed + Click to insert image + Image caption... + Write here... + + Grid Layouts + Layouts are the overall work area for the grid editor, usually you only need one or two different layouts + Add Grid Layout + Adjust the layout by setting column widths and adding additional sections + Row configurations + Rows are predefined cells arranged horizontally + Add row configuration + Adjust the row by setting cell widths and adding additional cells + + Columns + Total combined number of columns in the grid layout + + Settings + Configure what settings editors can change + + Styles + Configure what styling editors can change + + Settings will only save if the entered json configuration is valid + + Allow all editors + Allow all row configurations + + + 대체 필드 + 대체 글꼴 + Casing + 필드 선택 + 줄바꿈문자 변환 + 줄바꿈문자를 Html태그 &amp;lt;br&amp;gt; 로 변경 + 예, 날짜만 + 날짜포맷으로 + HTML 인코딩 + HTML과 동일하게 특수문자를 변경하시겠습니까 + 필드 값 후에 삽입하시겠습니까 + 필드값 전에 삽입하시겠습니까 + 소문자 + 없음 + 필드뒤에 삽입 + 필드앞에 삽입 + Recursive + 대문자 + URL 인코딩 + URL의 특수문자를 포맷하겠습니까 + 필드 위의 값들이 비었을때만 사용가능합니다. + 이 필드는 최초필드가 비었을때만 사용가능합니다. + 예, 시간를 :로 구분하여 + + + 할당된 작업 + 당신에게 할당된 번역작업들을 볼 수 있습니다. + 상세내역을 보시려면 "상세" 나 페이지 이름을 클릭하세요. + "Xml 다운로드" 링크를 클릭하시면 Xml로 페이지를 다운로드 할 수 있습니다.
+ 번역작업을 닫으시려면, 상세보기로 가셔서 "닫기" 버튼을 클릭하세요. + ]]>
+ 작업 닫기 + 번역 세부항목 + 모든 번역작업을 XML로 다운로드 + XML 다운로드 + 다운로드 xml DTD + 필드 + 서브페이지 포함 + + Translation task for %1%을 위한 [%0%] 번역작업 + 번역자를 찾을 수 없습니다. 컨텐츠를 번역하기위해 발송하시기 전에 번역자를 생성하세요. + 생성한 작업 + 생성한 작업 페이지를 볼 수 있습니다. + 상세내역을 보시려면 "상세" 나 페이지 이름을 클릭하세요. + "Xml 다운로드" 링크를 클릭하시면 Xml로 페이지를 다운로드 할 수 있습니다.
+ 번역작업을 닫으시려면, 상세보기로 가셔서 "닫기" 버튼을 클릭하세요. + ]]>
+ '%0%' 페이지가 번역을 위해 전송되었습니다. + 번역을 위해 '%0%' 페이지 전송하기Send the page '%0%' to translation + 할당자 + 작업 열기 + 총 단어 수 + 번역 + 번역 완료 + 아래를 클릭하셔서 방금 번역한 페이지를 미리볼 수 있습니다. 원본 페이지가 있다면 두 페이지를 비교해보시기 바랍니다. + 번역에 실패했습니다. Xml 파일에 문제가 있을수 있습니다. + 번역 옵션 + 번역자 + 번역 XML 업로드 + + + 캐시 브라우저 + 휴지통 + 생성된 패키지 + 데이터 타입 + 사전 + 설치된 패키지 + TRANSLATE ME: 'Install skin' + TRANSLATE ME: 'Install starter kit' + 언어 + 로컬 패키지 설치 + 매크로 + 미디어 타입 + 구성원 + 구성원 그룹 + 역할 + 구성원 유형 + 문서 타입 + 패키지 + 패키지 + Python 파일 + 저장소에 설치 + Runway 설치 + Runway 모듈 + 스크립트 파일 + 스크립트 + 스타일시트 + 템플릿 + XSLT 파일 + + + 새 업데이트가 준비되었습니다. + %0% 가 준비되었습니다. 다운로드를 위해 여기를 클릭하세요 + 연결할 서버가 없습니다연결할 서버가 없습니다 + 업데이트을 위해 에러를 체크합니다 더많은 정보를 보시려면 stack 추적을 하세요 + + + 관리자 + 카테고리 필드 + Change Your Password + You can change your password for accessing the Umbraco Back Office by filling out the form below and click the 'Change Password' button + 컨텐츠 채널 + 설명 필드 + 사용자 비활성화 + 문서 타입 + 편집자 + 필드 발췌 + 언어 + 로그인 + 미디어 라이브러리에 시작노드 + 세부항목 + Umbraco 접속 비활성화 + 비밀번호 + Your password has been changed! + Please confirm the new password + Enter your new password + Your new password cannot be blank! + There was a difference between the new password and the confirmed password. Please try again! + The confirmed password doesn't match the new password! + 자식노드 권한변경 + 현재 이페이지의 권한을 수정하는 중입니다: + 권한변경할 페이지를 선택해주세요 + 하위항목 모두찾기 + 컨텐츠의 시작노드 + 사용자명 + 사용자권한 + 사용자 타입 + 사용자 타입 + 작성자 + +
\ No newline at end of file diff --git a/src/UmbracoUrlHandling/Umbraco/Config/Lang/nb.xml b/src/UmbracoUrlHandling/Umbraco/Config/Lang/nb.xml new file mode 100644 index 0000000..c6c6093 --- /dev/null +++ b/src/UmbracoUrlHandling/Umbraco/Config/Lang/nb.xml @@ -0,0 +1,1015 @@ + + + + The Umbraco community + http://our.umbraco.org/documentation/Extending-Umbraco/Language-Files + + + Angi domene + Revisjoner + Bla gjennom + Skift dokumenttype + Kopier + Opprett + Opprett pakke + Slett + Deaktiver + Tøm papirkurv + Eksporter dokumenttype + Importer dokumenttype + Importer pakke + Rediger i Canvas + Logg av + Flytt + Varslinger + Offentlig tilgang + Publiser + Avpubliser + Oppdater noder + Republiser hele siten + Gjenopprett + Rettigheter + Reverser + Send til publisering + Send til oversetting + Sorter + Send til publisering + Oversett + Oppdater + Standard verdi + + + Ingen tilgang. + Legg til domene + Fjern + Ugyldig node. + Ugyldig domeneformat. + Domene er allerede tilknyttet. + Språk + Domene + Domene '%0%' er nå opprettet og tilknyttet siden + Domenet '%0%' er nå slettet + Domenet '%0%' er allerede tilknyttet + Domenet '%0%' er nå oppdatert + eller rediger eksisterende domener +
Stier med ett nivå støttes, f.eks. "eksempel.com/no". Imidlertid bør det unngås. Bruk heller språkinnstillingen over.]]>
+ Arv + Språk + Vil også gjelde denne noden, med mindre et underordnet domene også gjelder.]]> + Domener + + + Viser for + + + Velg + Velg gjeldende mappe + Gjør noe annet + Fet + Reduser innrykk + Sett inn skjemafelt + Sett inn grafisk overskrift + Rediger HTML + Øk innrykk + Kursiv + Midtstill + Juster tekst venstre + Juster tekst høyre + Sett inn lenke + Sett inn lokal lenke (anker) + Punktmerking + Nummerering + Sett inn makro + Sett inn bilde + Rediger relasjoner + Tilbake til listen + Lagre + Lagre og publiser + Lagre og send til publisering + Forhåndsvis + Forhåndsvisning er deaktivert siden det ikke er angitt noen mal + Velg formattering + Vis stiler + Sett inn tabell + + + For å endre det valge innholdets dokumenttype, velger du først en ny dokumenttype som er gyldig på gjeldende plassering. + Kontroller deretter at alle egenskaper blir overført riktig til den nye dokumenttypen og klikk på Lagre. + Innholdet har blitt republisert. + Nåværende egenskap + Nåværende type + Du kan ikke endre dokumenttype, ettersom det ikke er andre gyldige dokumenttyper på denne plasseringen. + Dokumenttype endret + Overfør egenskaper + Overfør til egenskap + Ny mal + Ny type + ingen + Innhold + Velg ny dokumenttype + Dokumenttypen på det valgte innhold ble endret til [new type], og følgende egenskaper ble overført: + til + Overføringen av egenskaper kunne ikke fullføres da en eller flere egenskaper er satt til å bli overført mer enn en gang. + Kun andre dokumenttyper som er gyldige for denne plasseringen vises. + + + Publisert + Om siden + Alias + (hvordan du ville beskrevet bildet over telefon) + Alternative lenker + Klikk for å redigere denne noden + Opprettet av + Opprinnelig forfatter + Oppdatert av + Opprettet den + Tidspunkt for opprettelse + Dokumenttype + Redigerer + Utløpsdato + Denne noden er endret siden siste publisering + Denne noden er enda ikke publisert + Sist publisert + Det er ingen elementer å vise i listen. + Mediatype + Link til media + Medlemsgruppe + Rolle + Medlemstype + Ingen dato valgt + Sidetittel + Egenskaper + Dette dokumentet er publisert, men ikke synlig ettersom den overliggende siden '%0%' ikke er publisert + Intern feil: dokumentet er publisert men finnes ikke i hurtigbuffer + Publisert + Publiseringsstatus + Publiseringsdato + Dato for avpublisering + Fjern dato + Sorteringsrekkefølgen er oppdatert + Trekk og slipp nodene eller klikk på kolonneoverskriftene for å sortere. Du kan velge flere noder ved å holde shift eller control tastene mens du velger. + Statistikk + Tittel (valgfri) + Alternativ tekst (valgfri) + Type + Avpubliser + Sist endret + Tidspunkt for siste endring + Fjern fil + Lenke til dokument + Medlem av gruppe(ne) + Ikke medlem av gruppe(ne) + Undersider + Åpne i vindu + + + Klikk for å laste opp + Slipp filene her... + + + Opprett et nytt medlem + Alle medlemmer + + + Hvor ønsker du å oprette den nye %0% + Opprett under + Velg en type og skriv en tittel + "dokumenttyper".]]> + "mediatyper".]]> + + + Til ditt nettsted + - Skjul + Hvis Umbraco ikke starter, kan det skyldes at pop-up vinduer ikke er tillatt + er åpnet i nytt vindu + Omstart + Besøk + Velkommen + + + Stay + Discard changes + You have unsaved changes + Are you sure you want to navigate away from this page? - you have unsaved changes + + + Done + + Deleted %0% item + Deleted %0% items + Deleted %0% out of %1% item + Deleted %0% out of %1% items + + Published %0% item + Published %0% items + Published %0% out of %1% item + Published %0% out of %1% items + + Unpublished %0% item + Unpublished %0% items + Unpublished %0% out of %1% item + Unpublished %0% out of %1% items + + Moved %0% item + Moved %0% items + Moved %0% out of %1% item + Moved %0% out of %1% items + + Copied %0% item + Copied %0% items + Copied %0% out of %1% item + Copied %0% out of %1% items + + + Navn på lokal link + Rediger domener + Lukk dette vinduet + Er du sikker på at du vil slette + Er du sikker på at du vil deaktivere + Vennligst kryss av i denne boksen for å bekrefte sletting av %0% element(er) + Er du sikker på at du vil forlate Umbraco? + Er du sikker? + Klipp ut + Rediger ordboksnøkkel + Rediger språk + Sett inn lokal link + Sett inn spesialtegn + Sett inn grafisk overskrift + Sett inn bilde + Sett inn lenke + Sett inn makro + Sett inn tabell + Sist redigert + Lenke + Intern link: + Ved lokal link, sett inn "#" foran link + Åpne i nytt vindu? + Makroinnstillinger + Denne makroen har ingen egenskaper du kan endre + Lim inn + Endre rettigheter for + Innholdet i papirkurven blir nå slettet. Vennligst ikke lukk dette vinduet mens denne operasjonen foregår + Papirkurven er nå tom + Når elementer blir slettet fra papirkurven vil de være slettet for alltid + regexlib.com tjenesten opplever for tiden problemer som vi ikke har kontroll over. Vi beklager denne ubeleiligheten.]]> + Søk etter et regulært uttrykk for å legge inn validering til et felt. Eksempel: 'email, 'zip-code' 'url' + Fjern makro + Obligatorisk + Nettstedet er indeksert + Hurtigbufferen er blitt oppdatert. Alt publisert innhold er nå à jour. Alt upublisert innhold er fortsatt ikke publisert. + Hurtigbufferen for siden vil bli oppdatert. Alt publisert innhold vil bli oppdatert, mens upublisert innhold vil forbli upublisert. + Antall kolonner + Antall rader + Sett en plassholder-ID
Ved å sette en ID på plassholderen kan du legge inn innhold i denne malen fra underliggende maler, ved å referere denne ID'en ved hjelp av et <asp:content /> element.]]>
+ Velg en plassholder ID fra listen under. Du kan bare velge ID'er fra den gjeldende malens overordnede mal.]]> + Klikk på bildet for å se det i full størrelse + Velg punkt + Se buffret node + + + %0%' under.
Du kan legge til flere språk under 'språk' i menyen til venstre.]]>
+ Språk + + + Skriv inn ditt brukernavn + Skriv inn ditt passord + Navngi %0%... + Skriv inn navn... + Søk... + Filtrer... + Skriv inn nøkkelord (trykk på Enter etter hvert nøkkelord)... + + + Tillat på rotnivå + Kun dokumenttyper med denne innstillingen aktivert kan opprettes på rotnivå under Innhold og Mediearkiv + Tillatte underordnede noder + Sammensetting av dokumenttyper + Opprett + Slett arkfane + Beskrivelse + Ny arkfane + Arkfane + Miniatyrbilde + Aktiver listevisning + Viser undersider i en søkbar liste, undersider vises ikke i innholdstreet + Gjeldende listevisning + Den aktive listevisningsdatatypen + Opprett brukerdefinert listevisning + Fjern brukerdefinert listevisning + + + Legg til forhåndsverdi + Database datatype + Kontrollelement GUID + Kontrollelement + Knapper + Aktiver avanserte instillinger for + Aktiver kontektsmeny + Maksimum standard størrelse på innsatte bilder + Beslektede stilark + Vis etikett + Bredde og høyde + + + Dine data har blitt lagret, men før du kan publisere denne siden må du rette noen feil: + Den gjeldende Membership Provider støtter ikke endring av passord. (EnablePasswordRetrieval må være satt til sann) + %0% finnes allerede + Det var feil i dokumentet: + Det var feil i skjemaet: + Passordet bør være minst %0% tegn og inneholde minst %1% numeriske tegn + %0% må være et heltall + %0% under %1% er obligatorisk + %0% er obligatorisk + %0% under %1% er ikke i et korrekt format + %0% er ikke i et korrekt format + + + Filtypen er deaktivert av administrator + NB! Selv om CodeMirror er aktivert i konfigurasjon er det deaktivert i Internet Explorer pga. ustabilitet. + Fyll ut både alias og navn på den nye egenskapstypen! + Det er et problem med lese/skrive rettighetene til en fil eller mappe + Tittel mangler + Type mangler + Du er i ferd med å gjøre bildet større enn originalen. Det vil forringe kvaliteten på bildet, ønsker du å fortsette? + Feil i python-skriptet + Python-skriptet ble ikke lagret fordi det inneholder en eller flere feil + Startnode er slettet. Kontakt din administrator + Du må markere innhold før du kan endre stil + Det er ingen aktive stiler eller formateringer på denne siden + Sett markøren til venstre i de 2 cellene du ønsker å slå sammen + Du kan ikke dele en celle som allerede er delt. + Feil i XSLT kode + XSLT ble ikke lagret på grunn av feil i koden + Det er et problem dem datatypen som brukes til denne egenskapen. Kontroller innstillingene og prøv igjen. + + + Om + Handling + Muligheter + Legg til + Alias + Er du sikker? + Ramme + av + Avbryt + Cellemargin + Velg + Lukk + Lukk vindu + Kommentar + Bekreft + Behold proposjoner + Fortsett + Kopier + Opprett + Database + Dato + Standard + Slett + Slettet + Sletter... + Design + Dimensjoner + Ned + Last ned + Rediger + Endret + Elementer + E-post + Feil + Finn + Høyde + Hjelp + Ikon + Importer + Indre margin + Sett inn + Installer + Justering + Språk + Layout + Laster + Låst + Logg inn + Logg ut + Logg ut + Makro + Flytt + Mer + Navn + Ny + Neste + Nei + av + OK + Åpne + eller + Passord + Sti + Plassholder ID + Ett øyeblikk... + Forrige + Egenskaper + E-post som innholdet i skjemaet skal sendes til + Papirkurv + Gjenværende + Gi nytt navn + Forny + Påkrevd + Prøv igjen + Rettigheter + Søk + Server + Vis + Hvilken side skal vises etter at skjemaet er sendt + Størrelse + Sorter + Submit + Type + Søk... + Opp + Oppdater + Oppgrader + Last opp + Url + Bruker + Brukernavn + Verdi + Visning + Velkommen... + Bredde + Ja + Mappe + Søkeresultater + + + Bakgrunnsfarge + Fet + Tekstfarge + Skrifttype + Tekst + + + Side + + + Installasjonsprogrammet kan ikke koble til databasen + Kunne ikke lagre Web.Config-filen. Vennligst endre databasens tilkoblingsstreng manuelt. + Din database er funnet og identifisert som + Databasekonfigurasjon + installer-knappen for å installere Umbraco %0% databasen]]> + Neste for å fortsette.]]> + Databasen ble ikke funnet! Vennligst sjekk at informasjonen i "connection string" i "web.config"-filen er korrekt.

For å fortsette, vennligst rediger "web.config"-filen (bruk Visual Studio eller din favoritteditor), rull ned til bunnen, og legg til tilkoblingsstrengen for din database i nøkkelen "umbracoDbDSN" og lagre filen.

Klikk prøv på nytt når du er ferdig.
Mer informasjon om redigering av web.config her.

]]>
+ Vennligst kontakt din ISP om nødvendig. Hvis du installerer på en lokal maskin eller server, må du kanskje skaffe informasjonen fra din systemadministrator.]]> + Trykk på knappen oppgrader for å oppgradere databasen din til Umbraco %0%

Ikke vær urolig - intet innhold vil bli slettet og alt vil fortsette å virke etterpå!

]]>
+ Trykk Neste for å fortsette.]]> + neste for å fortsette konfigurasjonsveiviseren]]> + Passordet til standardbrukeren må endres!]]> + Standardbrukeren har blitt deaktivert eller har ingen tilgang til Umbraco!

Ingen videre handling er nødvendig. Klikk neste for å fortsette.]]> + Passordet til standardbrukeren har blitt forandret etter installasjonen!

Ingen videre handling er nødvendig. Klikk Neste for å fortsette.]]> + Passordet er blitt endret! + Umbraco skaper en standard bruker med login ( "admin") og passord ( "default") . Det er viktig at passordet er endret til noe unikt.

Dette trinnet vil sjekke standard brukerens passord og foreslår hvis det må skiftes ]]> + Få en god start med våre introduksjonsvideoer + Ved å klikke på Neste-knappen (eller endre UmbracoConfigurationStatus i Web.config), godtar du lisensen for denne programvaren som angitt i boksen nedenfor. Legg merke til at denne Umbraco distribusjon består av to ulike lisenser, åpen kilde MIT lisens for rammen og Umbraco frivareverktøy lisens som dekker brukergrensesnittet. + Ikke installert. + Berørte filer og mapper + Mer informasjon om å sette opp rettigheter for Umbraco her + Du må gi ASP.NET brukeren rettigheter til å endre de følgende filer og mapper + Rettighetene er nesten perfekt satt opp!

Du kan kjøre Umbraco uten problemer, men du vil ikke være i stand til å installere de anbefalte pakkene for å utnytte Umbraco fullt ut.]]> + Hvordan løse problemet + Klikk her for å lese tekstversjonen + innføringsvideo
om å sette opp rettigheter for Umbraco eller les tekstversjonen.]]> + Rettighetsinnstillingene kan være et problem!


Du kan kjøre Umbraco uten problemer, men du vil ikke være i stand til å installere de anbefalte pakkene for å utnytte Umbraco fullt ut.]]> + Rettighetsinstillingene er ikke klargjort for Umbraco!

For å kunne kjøre Umbraco, må du oppdatere rettighetsinnstillingene dine.]]>
+ Rettighetsinnstillingene er perfekt!

Du er klar for å kjøre Umbraco og installere pakker!]]>
+ Løser mappeproblem + Følg denne linken for mer informasjon om problemer med ASP.NET og oppretting av mapper + Konfigurerer mappetillatelser + + Jeg ønsker å starte fra bunnen. + lær hvordan) Du kan fortsatt velge å installere Runway senere. Vennligst gå til Utvikler-seksjonen og velg Pakker.]]> + Du har akkurat satt opp en ren Umbraco plattform. Hva vil du gjøre nå? + Runway er installert + Dette er vår liste av anbefalte moduler- Kryss av de du ønsker å installere, eller se denfulle listen av moduler ]]> + Bare anbefalt for erfarne brukere + Jeg vil starte med en enkel webside + "Runway" er en enkel webside som utstyrer deg med noen grunnleggende dokumenttyper og maler. Veiviseren kan sette opp Runway for deg automatisk, men du kan enkelt endre, utvide eller slette den. Runway er ikke nødvendig, og du kan enkelt bruke Umbraco uten den. Imidlertidig tilbyr Runway et enkelt fundament basert på de beste metodene for å hjelpe deg i gang fortere enn noensinne. Hvis du velger å installere Runway, kan du også velge blant grunnleggende byggeklosser kalt Runway Moduler for å forøke dine Runway-sider.

Sider inkludert i Runway: Hjemmeside, Komme-i-gang, Installere moduler.
Valgfrie Moduler: Toppnavigasjon, Sidekart, Kontakt, Galleri.
]]>
+ Hva er Runway + Steg 1/5 Godta lisens + Steg 2/5 Database konfigurasjon + Steg 3/5: Valider filrettigheter + Steg 4/5: Skjekk Umbraco sikkerheten + Steg 5/5: Umbraco er klar for deg til å starte! + Tusen takk for at du valgte Umbraco! + Se ditt nye nettsted Du har installert Runway, hvorfor ikke se hvordan ditt nettsted ser ut.]]> + Mer hjelp og info Få hjelp fra vårt prisbelønte samfunn, bla gjennom dokumentasjonen eller se noen gratis videoer på hvordan man bygger et enkelt nettsted, hvordan bruke pakker og en rask guide til Umbraco terminologi]]> + Umbraco %0% er installert og klar til bruk + web.config filen, og oppdatere AppSetting-nøkkelen UmbracoConfigurationStatus til verdien '%0%']]> + starte øyeblikkelig ved å klikke på "Start Umbraco" knappen nedenfor.
Hvis du er ny på Umbraco, kan du finne mange ressurser på våre komme-i-gang sider.]]>
+ Start Umbraco For å administrere din webside, åpne Umbraco og begynn å legge til innhold, oppdatere maler og stilark eller utvide funksjonaliteten]]> + Tilkobling til databasen mislyktes. + Umbraco Versjon 3 + Umbraco Versjon 4 + Se + Umbraco %0% for en ny installasjon eller oppgradering fra versjon 3.0.

Trykk "neste" for å starte veiviseren.]]>
+ + + Språkkode + Språk + + + Du har vært inaktiv og vil logges ut automatisk om + Forny innlogging for å lagre + + + Da er det søndag! + Smil, det er mandag! + Hurra, det er tirsdag! + For en herlig onsdag! + Gledelig torsdag! + Endelig fredag! + Gledelig lørdag + Logg på nedenfor + Logg på med + Din sesjon er utløpt + © 2001 - %0%
umbraco.com

]]>
+ + + Skrivebord + Seksjoner + Innhold + + + Velg side over... + %0% er nå kopiert til %1% + Kopier til + %0% er nå flyttet til %1% + Flytt til + har blitt valgt som rot til ditt nye innhold, klikk 'ok' nedenfor. + Ingen node er valgt, vennligst velg en node i listen over før du klikker 'fortsett' + Gjeldende nodes type tillates ikke under valgt node + Gjeldende node kan ikke legges under en underordnet node + Denne noden kan ikke ligge på rotnivå + Handlingen tillates ikke. Du mangler tilgang til en eller flere underordnede noder. + Relater kopierte elementer til original(e) + + + Rediger dine varsler for %0% + + Hei %0%

+ +

Dette er en automatisk mail for å informere om at handlingen '%1%' + er blitt utført på siden '%2%' + av brukeren '%3%' +

+ +

+

Rettelser:

+ + %6% +
+

+ + + +

Ha en fin dag!

+ Vennlig hilsen Umbraco roboten +

]]>
+ [%0%] Varsling om %1% utført på %2% + Varslinger + + + Umbraco-pakker har vanligvis endelsen ".umb" eller ".zip".]]> + Utvikler + Demonstrasjon + Dokumentasjon + Metadata + Pakkenavn + Pakken inneholder ingen elementer +
Du kan trygt fjerne pakken fra systemet ved å klikke "avinstaller pakke" nedenfor.]]>
+ Ingen oppdateringer tilgjengelig + Alternativer for pakke + Lesmeg for pakke + Pakkebrønn + Bekreft avinstallering + Pakken ble avinstallert + Pakken ble vellykket avinstallert + Avinstaller pakke + Advarsel: alle dokumenter, media, etc. som som er avhengig av elementene du sletter, vil slutte å virke, noe som kan føre til ustabilitet, så avinstaller med forsiktighet. Hvis du er i tvil, kontakt pakkeutvikleren.]]> + Last ned oppdatering fra pakkeregisteret + Oppgrader pakke + Oppgraderingsinstrukser + Det er en oppdatering tilgjengelig for denne pakken. Du kan laste den ned direkte fra pakkebrønnen. + Pakkeversjon + Pakkeversjonshistorie + Se pakkens nettsted + + + Lim inn med full formattering (Anbefales ikke) + Teksten du er i ferd med å lime inn, inneholder spesialtegn eller formattering. Dette kan skyldes at du kopierer fra f.eks. Microsoft Word. Umbraco kan fjerne denne spesialformatteringen automatisk slik at innholdet er mer velegnet for visning på en webside. + Lim inn som ren tekst, dvs. fjern al formattering + Lim inn og fjern uegnet formatering (anbefalt) + + + Avansert: Beskytt ved å velge hvilke brukergrupper som har tilgang til siden + ved å bruke Umbraco's medlems-grupper]]> + Du må opprette en medlemsgruppe før du kan bruke rollebasert autentikasjon. + Feilside + Brukt når personer logger på, men ikke har tilgang + Hvordan vil du beskytte siden din? + %0% er nå beskyttet + Beskyttelse fjernet fra %0% + Innloggingsside + Velg siden som har loginformularet + Fjern beskyttelse + Velg sidene som inneholder login-skjema og feilmelding ved feil innolgging. + Velg rollene som har tilgang til denne siden + Sett brukernavn og passord for denne siden + Enkelt: Beskytt ved hjelp av brukernavn og passord + Om du ønsker å bruke enkel autentisering via ett enkelt brukernavn og passord + + + %0% kunne ikke publiseres fordi den har planlagt utgivelsesdato. + %0% ble ikke publisert. Ett eller flere felter ble ikke godkjent av validering. + %0% kunne ikke publiseres fordi et tredjepartstillegg avbrøt handlingen. + %0% kan ikke publiseres fordi en overordnet side ikke er publisert. + Inkluder upubliserte undersider + Publiserer - vennligst vent... + %0% av %1% sider har blitt publisert... + %0% er nå publisert + %0% og alle undersider er nå publisert + Publiser alle undersider + ok for å publisere %0% og dermed gjøre innholdet synlig for alle.

Du kan publisere denne siden og alle dens undersider ved å krysse av Publiser alle undersider nedenfor.]]>
+ + + Du har ikke konfigurert noen godkjente farger + + + skriv inn ekstern lenke + velg en intern side + Tittel + Lenke + Åpne i nytt vindu + Skriv inn en tekst + Skriv inn en lenke + + + Nullstill + + + Gjeldende versjon + Rød tekst vil ikke bli vist i den valgte versjonen. , grønn betyr lagt til]]> + Dokumentet er tilbakeført til en tidligere versjon + Dette viser den valgte versjonen som HTML, bruk avviksvisningen hvis du ønsker å se forksjellene mellom to versjoner samtidig. + Tilbakefør til + Velg versjon + Vis + + + Rediger scriptfilen + + + Concierge + Innhold + Courier + Utvikler + Umbraco konfigurasjonsveiviser + Mediaarkiv + Medlemmer + Nyhetsbrev + Innstillinger + Statistikk + Oversettelse + Brukere + Hjelp + Skjemaer + Analytics + + + gå til + Hjelpeemner for + Videokapitler for + De beste Umbraco opplæringsvideoer + + + Standardmal + Ordboksnøkkel + For å importere en dokumenttype, finn ".udt" filen på datamaskinen din ved å klikke "Utforsk" knappen og klikk "Importer" (du vil bli spurt om bekreftelse i det neste skjermbildet) + Ny tittel på arkfane + Nodetype + Type + Stilark + Script + Stilark-egenskap + Arkfane + Tittel på arkfane + Arkfaner + Hovedinnholdstype aktivert + Denne dokumenttypen bruker + som hoveddokumenttype. Arkfaner fra hoveddokumenttyper vises ikke og kan kun endres på hoveddokumenttypen selv. + Ingen egenskaper definert i denne arkfanen. Klikk på "legg til ny egenskap" lenken i toppen for å opprette en ny egenskap. + Hovedinnholdstype + Opprett tilhørende mal + + + Sort order + Creation date + Sortering ferdig. + Dra elementene opp eller ned for å arrangere dem. Du kan også klikke kolonneoverskriftene for å sortere alt på en gang. +
Ikke lukk dette vinduet under sortering]]>
+ + + En feil oppsto + Utilstrekkelige brukertillatelser, kunne ikke fullføre operasjonen + Avbrutt + Handlingen ble avbrutt av et tredjepartstillegg + Publisering ble avbrutt av et tredjepartstillegg + Egenskaptypen finnes allerede + Egenskapstype opprettet + DataType: %1%]]> + Egenskapstype slettet + Innholdstype lagret + Du har opprettet en arkfane + Arkfane slettet + Arkfane med id: %0% slettet + Stilarket ble ikke lagret + Stilarket ble lagret + Stilark lagret uten feil + Datatype lagret + Ordbokelement lagret + Publiseringen feilet fordi den overliggende siden ikke er publisert + Innhold publisert + og er nå synlig for besøkende + Innhold lagret + Husk å publisere for å gjøre endringene synlig for besøkende + Sendt for godkjenning + Endringer har blitt sendt til godkjenning + Media lagret + Media lagret uten feil + Medlem lagret + Stilarksegenskap lagret + Stilark lagret + Mal lagret + Feil ved lagring av bruker (sjekk loggen) + Bruker lagret + Brukertypen lagret + Filen ble ikke lagret + Filen kunne ikke lagres. Vennligst sjekk filrettigheter + Filen ble lagret + Filen ble lagret uten feil + Språk lagret + Python-skriptet ble ikke lagret + Python-skriptet kunne ikke lagres fordi det inneholder en eller flere feil + Python-skriptet er lagret! + Ingen feil i python-skriptet! + Malen ble ikke lagret + Vennligst forviss deg om at du ikke har to maler med samme alias + Malen ble lagret + Malen ble lagret uten feil! + XSLT-koden ble ikke lagret + XSLT-koden inneholdt en feil + XSLT-koden ble ikke lagret, sjekk filrettigheter + XSLT lagret + Ingen feil i XSLT! + Innhold avpublisert + Delmal lagret + Delmal lagret uten feil + Delmal ble ikke lagret! + En feil oppsto ved lagring av delmal + Script visning lagret + Script visning lagret uten feil! + Script visning ikke lagret + En feil oppsto under lagring av filen. + En feil oppsto under lagring av filen. + + + Bruk CSS syntaks f.eks: h1, .redHeader, .blueText + Rediger stilark + Rediger egenskap for stilark + Navn for å identifisere stilarksegenskapen i rik-tekst editoren + Forhåndsvis + Stiler + + + Rediger mal + Sett inn innholdsområde + Sett inn plassholder for innholdsområde + Sett inn ordbokselement + Sett inn makro + Sett inn Umbraco sidefelt + Hovedmal + Hurtigguide til Umbraco sine maltagger + Mal + + + Sett inn element + Velg layout + Legg til rad + Legg til innhold + Slipp innhold + Raden har tilpasset design + + Innholdstypen er ikke tillatt her + Innholdstypen er tillatt her + + Klikk for å bygge inn + Klikk for å sette inn et bilde + Bildetekst... + Skriv her... + + Rutenettoppsett + Et oppsett er det overordnede arbeidsområdet til ditt rutenett - du vil typisk kun behøve ett eller to + Legg til rutenettoppsett + Juster oppsettet ved å konfigurere kolonnebredder og legge til ytterligere seksjoner + Radkonfigurasjoner + Rader er forhåndsdefinerte celler arrangert vannrett + Legg til radkonfigurasjon + Juster raden ved å sette cellebredder og legge til flere celler + + Kolonner + Totalt antall kolonner i rutenettet + + Innstillinger + Konfigurer hvilke innstillinger brukeren kan endre + + Stiler + Konfigurer hvilke stiler redaktørene kan endre + + Innstillingene lagres kun når konfigurasjonen er gyldig + + Tillatt alle editorer + Tillat alle radkonfigurasjoner + Bruk som standard + Velg ekstra + Velg standard + er lagt til + + + Alternativt felt + Alternativ tekst + Store/små bokstaver + Encoding + Felt som skal settes inn + Konverter linjeskift + Erstatter et linjeskift med htmltaggen <br> + Egendefinerte felt + Ja, kun dato + Formatter som dato + HTML koding + Formater spesialtegn med tilsvarende HTML-tegn. + Denne teksten vil settes inn etter verdien av feltet + Denne teksten vil settes inn før verdien av feltet + Små bokstaver + Ingen + Sett inn etter felt + Sett inn før felt + Rekursivt + Standardfelter + Store bokstaver + URL koding + Dersom innholdet av feltene skal sendes til en URL skal spesialtegn formatteres + Denne teksten vil benyttes dersom feltene over er tomme + Dette feltet vil benyttes dersom feltet over er tomt + Ja, med klokkeslett. Dato/tid separator: + + + Oppgaver satt til deg + som du er tildelt. For å se en detaljert visning inkludert kommentarer, klikk på "Detaljer" eller navnet på siden. Du kan også laste ned siden som XML direkte ved å klikke på linken "Last ned XML".
For å lukke en oversettelsesoppgave, vennligst gå til detaljvisningen og klikk på "Lukk" knappen.]]>
+ Lukk oppgave + Oversettelses detaljer + Last ned all oversettelsesoppgaver som XML + Last ned XML + Last ned XML DTD + Felt + Inkluder undersider + + [%0%] Oversettingsoppgave for %1% + Ingen oversettelses-bruker funnet. Vennligst opprett en oversettelses-bruker før du begynner å sende innhold til oversetting + Oppgaver opprettet av deg + opprettet av deg. For å se en detaljert visning inkludert kommentarer, klikk på "Detaljer" eller navnet på siden. Du kan også laste ned siden som XML direkte ved å klikke på linken "Last ned XML". For å lukke en oversettelsesoppgave, vennligst gå til detaljvisningen og klikk på "Lukk" knappen.]]> + Siden '%0%' har blitt sendt til oversetting + Send til oversetting + Tildelt av + Oppgave åpnet + Antall ord + Oversett til + Oversetting fullført. + Du kan forhåndsvise sidene du nettopp har oversatt ved å klikke nedenfor. Hvis den originale siden finnes, vil du få en sammenligning av sidene. + Oversetting mislykkes, XML filen kan være korrupt + Alternativer for oversetting + Oversetter + Last opp XML med oversettelse + + + Hurtigbufferleser + Papirkurv + Opprettede pakker + Datatyper + Ordbok + Installerte pakker + Installer utseende + Installer startpakke + Språk + Installer lokal pakke + Makroer + Mediatyper + Medlemmer + Medlemsgrupper + Roller + Medlemstyper + Dokumenttyper + Pakker + Pakker + Python Filer + Installer fra pakkeregister + Installer Runway + Runway moduler + Skriptfiler + Skript + Stiler + Maler + XSLT Filer + Analytics + + + Ny oppdatering er klar + %0% er klar, klikk her for å laste ned + Ingen forbindelse til server + Kunne ikke sjekke etter ny oppdatering. Se trace for mere info. + + + Administrator + Kategorifelt + Bytt passord + Nytt passord + Bekreft nytt passord + Du kan endre passordet til Umbraco ved å fylle ut skjemaet under og klikke "Bytt passord" knappen. + Innholdskanal + Beskrivelsesfelt + Deaktiver bruker + Dokumenttype + Redaktør + Utdragsfelt + Språk + Brukernavn + Øverste nivå i Media + Moduler + Deaktiver tilgang til Umbraco + Passord + Nullstill passord + Passordet er endret + Bekreft nytt passord + Nytt passord + Nytt passord kan ikke være blankt + Gjeldende passord + Feil passord + Nytt og bekreftet passord må være like + Nytt og bekreftet passord må være like + Overskriv tillatelser på undernoder + Du redigerer for øyeblikket tillatelser for sidene: + Velg sider for å redigere deres tillatelser + Søk i alle undersider + Startnode + Navn + Brukertillatelser + Brukertype + Brukertyper + Forfatter + Oversetter + Endre + Din profil + Din historikk + Sesjonen utløper om + +
\ No newline at end of file diff --git a/src/UmbracoUrlHandling/Umbraco/Config/Lang/nl.xml b/src/UmbracoUrlHandling/Umbraco/Config/Lang/nl.xml new file mode 100644 index 0000000..2c62b41 --- /dev/null +++ b/src/UmbracoUrlHandling/Umbraco/Config/Lang/nl.xml @@ -0,0 +1,1444 @@ + + + + The Umbraco community + http://our.umbraco.org/documentation/Extending-Umbraco/Language-Files + + + Beheer domeinnamen + Documentgeschiedenis + Node bekijken + Wijzig document type + Kopiëren + Nieuw + Nieuwe package + Verwijderen + Uitschakelen + Prullenbak leegmaken + Documenttype exporteren + Documenttype importeren + Package importeren + Aanpassen in Canvas + Afsluiten + Verplaatsen + Meldingen + Publieke toegang + Publiceren + Depubliceren + Nodes opnieuw inladen + Herpubliceer de site + Stel rechten voor pagina %0% in + Waarheen verplaatsen/ + Naar de onderstaande boomstructuur + Herstellen + Rechten + Vorige versies + Klaar voor publicatie + Klaar voor vertalen + Sorteren + Klaar voor publicatie + Vertalen + Bijwerken + Standaardwaarde + + + Permission denied. + Nieuw domein toevoegen + verwijderen + Ongeldige node. + Ongeldig domeinformaat. + Domein is reeds aanwezig. + Domein + Taal + Nieuw domein '%0%' is aangemaakt + Domein '%0%' is verwijderd + Domein '%0' is al aanwezig + Domein '%0%' is bijgewerkt + Bewerk huidige domeinen +
Zgn. 'one-level' paden in domeinen worden ondersteund, bijv. "example.com/en". Echter, ze + zouden moeten worden vermeden. Gebruik bij voorkeur de cultuurinstelling hierboven.]]>
+ Overerven + Cultuur + of erf de cultuur over van de ouder nodes. Zal ook van toepassing
+ zijn op de huidige node, tenzij een domein hieronder ook van toepassing is.]]>
+ Domeinen + + + Tonen voor + + + Selectie ongedaan maken + Selecteren + Selecteer huidige map + Doe iets anders + Vet + Paragraaf uitspringen + Voeg formulierveld in + Voeg grafische titel in + Wijzig Html + Paragraaf inspringen + Cursief + Centreren + Links Uitlijnen + Rechts Uitlijnen + Link Invoegen + Lokale link invoegen (anker) + Opsomming + Nummering + Macro invoegen + Afbeelding invoegen + Relaties wijzigen + Terug naar overzicht + Opslaan + Opslaan en publiceren + Opslaan en verzenden voor goedkeuring + Sla list view op + voorbeeld bekijken + Voorbeeld bekijken is uitgeschakeld omdat er geen template is geselecteerd + Stijl kiezen + Stijlen tonen + Tabel invoegen + Genereer models + Opslaan en models genereren + + + Om het documenttype voor de geselecteerde inhoud te wijzigen, selecteert u eerst uit de lijst van geldige types voor deze locatie. + Bevestig en/of wijzig vervolgens de toewijzing van eigenschappen van het huidige naar het nieuwe type en klik op Opslaan. + De inhoud is opnieuw gepubliceerd. + Huidige eigenschap + Huidig type + Het documenttype kan niet worden gewijzigd, omdat er geen alternatieven geldig zijn voor deze locatie. + Documenttype gewijzigd + Eigenschappen toewijzen + Toewijzen aan eigenschap + Nieuw sjabloon + Nieuw type + geen + Inhoud + Selecteer nieuw documenttype + Het documenttype van de geselecteerde inhoud is succesvol gewijzigd naar [new type] en de volgende eigenschappen zijn toegekend: + aan + Toewijzen van eigenschappen kan niet worden afgerond, omdat één of meer eigenschappen meer dan één toewijzing hebben. + Alleen alternatieve types geldig voor de huidige locatie worden weergegeven. + + + Is gepubliceerd + Over deze pagina + Alternatieve link + (hoe zou jij de foto beschrijven via de telefoon) + Alternatieve links + Klik om dit item te wijzigen + Aangemaakt door + Oorspronkelijke auteur + Bijgewerkt door + Aangemaakt op + Datum/tijd waarop dit document is aangemaakt + Documenttype + Aanpassen + Verloopt op + Dit item is gewijzigd na publicatie + Dit item is niet gepubliceerd + Laatst gepubliceerd op + Er zijn geen items om weer te geven + Er zijn geen items om weer te geven. + Mediatype + Link naar media item(s) + Ledengroep + Rol + Ledentype + Geen datum gekozen + Pagina Titel + Eigenschappen + Dit document is gepubliceerd maar niet zichtbaar omdat de bovenliggende node '%0%' niet gepubliceerd is + Dit document is gepubliceerd, maar het is niet in de cache (interne serverfout) + Kan de Url niet ophalen + Dit document is gepubliceerd, maar de Url conflicteert met %0% + Publiceren + Publicatiestatus + Publiceren op + Depubliceren op + Verwijderdatum + De sorteervolgorde is gewijzigd + Om nodes te sorteren, sleep de nodes of klik op één van de kolomtitels. Je kan meerdere nodes tegelijk selecteren door de "shift"- of "control"knop in te drukken tijdens het selecteren. + Statistieken + Titel (optioneel) + Alternatieve tekst (optioneel) + Type + Depubliceren + Laatst gewijzigd + Date/time this document was edited + Bestand(en) verwijderen + Link naar het document + Lid van groep(en) + Geen lid van groep(en) + Subitems + Doel + Dit betekend de volgende tijd op de server: + Wat houd dit in?]]> + + + Klik om te uploaden + Plaats je bestanden hier... + Link naar media + Of klik hier om bestanden te kiezen + De toegestane bestandtypen zijn + Dit bestand heeft niet het juiste file-type. Dit bestand kan niet geupload worden. + Max file size is + + + Maak nieuwe member aan + Alle Members + + + Nieuw lid aanmaken + Alle Leden + + + Waar wil je de nieuwe %0% aanmaken? + Aanmaken onder + Kies een type en een titel + "Documenttypes".]]> + "Mediatypes".]]> + Document Type zonder template + Nieuwe folder + Nieuw data type + + + Open je website + - Verbergen + Als Umbraco niet geopend wordt dan moet je misschien popups toelaten voor deze site. + is geopend in een nieuw venster + Herstarten + Bezoek + Welkom + + + Blijf op deze pagina + Negeer wijzigingen + Wijzigingen niet opgeslagen + Weet je zeker dat deze pagina wilt verlaten? - er zijn onopgeslagen wijzigingen + + + Done + + %0% item verwijderd + %0% items verwijderd + Item %0% van de %1% verwijderd + Items %0% van de %1% verwijderd + + %0% item gepubliceerd + %0% items gepubliceerd + Item %0% van de %1% gepubliceerd + Items %0% van de %1% gepubliceerd + + %0% item gedepubliceerd + %0% items gedepubliceerd + Item %0% van de %1% gedepubliceerd + Items %0% van de %1% gedepubliceerd + + %0% item verplaatst + %0% items verplaatst + item %0% van de %1% verplaatst + items %0% van de %1% verplaatst + + %0% item gekopieerd + %0% items gekopieerd + item %0% van de %1% gekopieerd + item %0% van de %1% gekopieerd + + + Naam + Beheer domeinnamen + Sluit dit venster + Weet je zeker dat je dit wilt verwijderen + Weet je zeker dat je dit wilt uitschakelen + Vink aub dit keuzevak aan om het verwijderen van %0% item(s) te bevestigen + Weet je het zeker? + Weet je het zeker? + Knippen + Pas woordenboekitem aan + Taal aanpassen + Lokale link invoegen + Karakter invoegen + Voeg grafische titel in + Afbeelding invoegen + Link invoegen + Klik om een Macro toe te voegen + Tabel invoegen + Laatst aangepast op + Link + Interne link: + Plaats een hekje (“#”) voor voor interne links. + In nieuw venster openen? + Macro Settings + Deze macro heeft geen eigenschappen die u kunt bewerken + Plakken + Bewerk rechten voor + De items worden nu uit de prullenbak verwijderd. Sluit dit venster niet terwijl de actie nog niet voltooid is. + De prullenbak is nu leeg. + Als items worden verwijderd uit de prullenbak, zijn ze voorgoed verwijderd. + regexlib.com ondervindt momenteel prolemen waarover we geen controle hebben. Onze excuses voor het ongemak.]]> + Zoek naar een regular expressie om validatie aan een formulierveld toe te voegen. Voorbeeld: 'email, 'post-code' 'url' + Verwijder Macro + Verplicht veld + Site is opnieuw geïndexeerd + De site is opnieuw gepubliceerd + De cache zal worden vernieuwd. Alle gepubliceerde inhoud zal worden ge-update, terwijl ongepubliceerde inhoud ongepubliceerd zal blijven. + Aantal kolommen + Aantal regels + Plaats een placeholder id door een ID op uw placeholder te zetten kunt u inhoud plaatsen in deze template vanuit onderliggende templates, + door te referreren naar deze ID door gebruik te maken van een <asp:content /> element.]]> + Selecteer een placeholder id uit onderstaande lijst. U kunt alleen + Id's kiezen van de master van de huidige template..]]> + Klik op de afbeelding voor volledige grootte + Kies een item + Toon cache item + Maak folder aan... + Relateer aan origineel + Descendants meenemen + De vriendelijkste community + Link naar pagina + Opent het gelinkte document in een nieuw venster of tab + Link naar media + Selecteer media + Selecteer icoon + Selecteer item + Selecteer link + Selecteer macro + Selecteer content + Selecteer member + Selecteer member group + Er zijn geen parameters voor deze macro + Externe login providers + Error details + Stacktrace + Inner Exception + Link je + De-Link je + account + Selecteer editor + + + + Cultuurnaam + Verander de key van het dictionary item. + + + + + + Typ jouw gebruikersnaam + Typ jouw wachtwoord + Bevestig jouw wachtwoord + Benoem de %0%... + Typ een naam... + Label... + Voer een omschrijving in... + Typ om te zoeken... + Typ om te filteren... + Typ om tags toe te voegen (druk op enter na elke tag)... + Voer jouw email in + Jouw gebruikersnaam is meestal jouw email + + + + Toestaan op root-niveau + Wanneer aangevinkt dan mag dit document type aangemaakt worden op het root-niveau van content of media trees. + Toegelaten subnodetypes + Document Type Composities + Nieuw + Tab verwijderen + Omschrijving + Nieuwe tab + Tab + Miniatuur + Lijstweergave inschakelen + Stelt het content item in zodat een sorteer- en zoekbare lijstweergave van onderliggende nodes wordt getoond. De onderliggende nodes worden niet in de tree getoond + Huidige lijstweergave + De actieve data type in lijstweergave + Maak een aangepaste lijstweergave + Verwijder aangepaste lijstweergave + + + Prevalue toevoegen + Datebase datatype + Data Editor GUID + Render control + Buttons + Geavanceerde instellingen inschakelen voor + Context menu inschakelen + Maximum standaard grootte van afbeeldingen + Gerelateerde stylesheets + Toon label + Breedte en hoogte + + + Je data is opgeslagen, maar voordat je deze pagina kunt publiceren moet je eerst aan paar problemen herstellen: + Het wachtwoord veranderen wordt door de huidige Membership Provider niet ondersteund (EnablePasswordRetrieval moet op true staan) + %0% bestaat al + Er zijn fouten geconstateerd: + Er zijn fouten geconstateerd: + Het wachtwoord moet minstens %0% tekens lang zijn en moet minstens %1% cijfers bevatten + %0% moet een geheel getal zijn + %0% op tab %1% is een verplicht veld + %0% is een verplicht veld + %0% op tab %1% is niet in het correcte formaat + %0% is niet in het correcte formaat + + + Een error ontvangen van de server + Het opgegeven bestandstype is niet toegestaan ​​door de beheerder + OPMERKING! Ondanks dat CodeMiror is ingeschakeld, is het uitgeschakeld in Internet Explorer omdat het niet stabiel genoeg is. + Zowel de alias als de naam van het nieuwe eigenschappen type moeten worden ingevuld! + Er is een probleem met de lees/schrijf rechten op een bestand of map + Error bij het laden van Partial View script (file: %0%) + Error bij het laden van userControl '%0%' + Error bij het laden van customControl (Assembly: %0%, Type: '%1%') + Error bij het laden van MacroEngine script (file: %0%) + "Error bij het parsen van XSLT file: %0% + "Error bij het laden van XSLT file: %0% + Vul een titel in + Selecteer een type + U wilt een afbeelding groter maken dan de originele afmetingen. Weet je zeker dat je wilt doorgaan? + Fout in python script + Het python script is niet opgeslagen omdat het fouten bevat + Start node is verwijderd, neem contact op met uw systeembeheerder + Markeer de inhoud voordat u de stijl aanpast + Geen actieve stijlen beschikbaar + Plaats de cursor links van de twee cellen die je wilt samenvoegen + Je kunt een cel die is samengevoegd niet delen + Fout in de XSLT bron + De XSLT is niet opgeslagen omdat deze fout(en) bevat + Er is een configuratiefout bij het gegevenstype dat wordt gebruikt voor deze eigenschap. Controleer het gegevenstype + + + Over + Actie + Acties + Toevoegen + Alias + Alles + Weet je het zeker? + Terug + Border + bij + Cancel + Cel marge + Kies + Sluit + Sluit venster + Comment + Bevestig + Verhoudingen behouden + Ga verder + Copy + Aanmaken + Database + Datum + Standaard + Verwijder + Verwijderd + Aan het verwijderen... + Ontwerp + Afmetingen + Omlaag + Download + Bewerk + Bewerkt + Elementen + Email + Fout + Vind + Hogte + Help + Icoon + Import + Binnenste marge + Invoegen + Installeren + Ongeldig + Justify + Label + Taal + Layout + Aan het laden + Gesloten + Inloggen + Uitloggen + Uitloggen + Macro + Verplicht + Verplaats + meer + Naam + Nieuw + Volgende + Nee + of + OK + Open + of + Wachtwoord + Pad + Placeholder ID + Een ogenblik geduld aub... + Vorige + Eigenschappen + Email om formulier resultaten te ontvangen + Prullenbak + De prullenbak is leeg + Overblijvend + Hernoem + Vernieuw + Verplicht + Opnieuw proberen + Rechten + Zoeken + We konden helaas niet vinden wat je zocht + Server + Toon + Toon pagina na verzenden + Grootte + Sorteer + Verstuur + Typen + Typ om te zoeken... + Omhoog + Update + Upgrade + Upload + Url + Gebruiker + Gebruikersnaam + Waarde + Bekijk + Welkom... + Breedte + Ja + Map + Zoekresultaten + Herschik + Ik ben klaar met herschikken + Voorvertoning + Wachtwoord veranderen + naar + Lijstweergave + Aan het opslaan... + huidig + Embed + geselecteerd + + + Zwart + Groen + Geel + Oranje + Blauw + Rood + + + Tab toevoegen + Property toevoegen + Editor toevoegen + Template toevoegen + Child node toevoegen + Child toevoegen + + Data type bewerken + + Secties navigeren + + Shortcuts + Toon shortcuts + + Toggle lijstweergave + Toggle toestaan op root-niveau + + + Achtergrondkleur + Vet + Tekstkleur + Lettertype + Tekst + + + Pagina + + + De installer kan geen connectie met de database maken. + De web.config kon niet worden opgeslagen. Gelieve de connectiestring handmatig aan te passen. + Je database is gevonden en is geïdentificeerd als + Database configuratie + installeren om de Umbraco %0% database te installeren]]> + Volgende om door te gaan.]]> + De database kon niet gevonden worden! Gelieve na te kijken of de informatie in de "connection string" van het "web.config" bestand correct is.

Om door te gaan, gelieve het "web.config" bestand aan te passen (met behulp van Visual Studio of je favoriete tekstverwerker), scroll in het bestand naar beneden, voeg de connection string voor je database toe in de key met naam "umbracoDbDSN" en sla het bestand op.

Klik op de knop opnieuw proberen als je hiermee klaar bent.
Meer informatie over het aanpassen van de web.config vind je hier.

]]>
+ Gelieve contact op te nemen met je ISP indien nodig. Wanneer je installeert op een lokale computer of server, dan heb je waarschijnlijk informatie nodig van je systeembeheerder.]]> + Klik de upgrade knop om je database te upgraden naar Umbraco %0%

Maak je geen zorgen - er zal geen inhoud worden gewist en alles blijft gewoon werken!

]]>
+ Klik Volgende om verder te gaan.]]> + volgende om door te gaan]]> + Het wachtwoord van de default gebruiker dient veranderd te worden!]]> + De default gebruiker is geblokkeerd of heeft geen toegang tot Umbraco!

Geen verdere actie noodzakelijk. Klik Volgende om verder te gaan.]]> + Het wachtwoord van de default gebruiker is sinds installatie met succes veranderd.

Geen verdere actie noodzakelijk. Klik Volgende om verder te gaan.]]> + Het wachtwoord is veranderd! + Umbraco maakt een default gebruiker aan met login ('admin') and wachtwoord ('default'). Het is belangrijk dat dit wachtwoord wordt veranderd in iets unieks.

Deze stap controleert het password van de default gebruiker en adviseert of het veranderd dient te worden.

]]>
+ Neem een jumpstart en bekijk onze introductie videos + + Nog niet geïnstalleerd. + Betreffende bestanden en mappen + Meer informatie over het instellen van machtigingen voor Umbraco vind je hier + Je dient ASP.NET 'modify' machtiging te geven voor de volgende bestanden/mappen + Je machtigingen zijn bijna perfect!

Je kunt Umbraco zonder problemen starten, maar je kunt nog geen packages installeren om volledig van Umbraco te profiteren.]]>
+ Hoe op te lossen + Klik hier om de tekst versie te lezen + video tutorial over het instellen van machtigingen voor Umbraco, of lees de tekst versie.]]> + Je machtigingen zijn misschien incorrect!

Je kunt Umbraco probleemloos starten, maar je kunt nog geen mappen aanmaken of packages installeren om zo volledig van Umbraco te profiteren.]]>
+ Je machtigingen zijn nog niet gereed gemaakt voor Umbraco!

Om Umbraco te starten zul je je machtigingen moeten aanpassen.]]>
+ Je machtigingen zijn perfect!

Je bent nu klaar om Umbraco te starten en om packages te installeren!]]>
+ Map probleem wordt opgelost + Volg deze link voor meer informatie over problemen met ASP.NET en het aanmaken van mappen + Machtigingen worden aangepast + Umbraco heeft write/modify toegang nodig op bepaalde mappen om bestanden zoals plaatjes en PDF's op te slaan. Het slaat ook tijdelijke data (ook bekend als 'de cache') op om de snelheid van je website te verbeteren. + Ik wil met een lege website beginnen + leer hoe). Je kunt er later alsnog voor kiezen om Runway te installeren. Ga dan naar de Ontwikkelaar sectie en kies Packages.]]> + Je hebt zojuist een blanco Umbraco platform geinstalleerd. Wat wil je nu doen? + Runway is geinstalleerd + Dit is onze lijst van aanbevolen modules. Vink de modules die je wilt installeren, of bekijk de volledige lijst modules]]> + Alleen aanbevolen voor gevorderde gebruikers + Ik wil met een eenvoudige website beginnen + "Runway" is een eenvoudige website die je van enkele elementaire documenttypes en templates voorziet. De installer kan Runway automatisch voor je opzetten, maar je kunt het gemakkelijk aanpassen, uitbreiden of verwijderen. Het is niet vereist en je kunt Umbraco prima zonder Runway gebruiken. + +Echter, Runway biedt een gemakkelijke basis om je snel op weg te helpen. Als je er voor kiest om Runway te installeren, dan kun je optioneel de bouwstenen (genaamd Runway Modules) kiezen om je Runway pagina's te verbeteren.

Runway omvat: Home pagina, Getting Started pagina, Module installatie pagina.
Optionele Modules: Top Navigatie, Sitemap, Contact, Gallery.
+ ]]>
+ Wat is Runway + Stap 1/5: Licentie aanvaarden + Stap 2/5: Database configureren + Stap 3/5: Controleren van rechten op bestanden + Stap 4/5: Umbraco beveiliging controleren + Stap 5/5: Umbraco is klaar + Bedankt dat je voor Umbraco hebt gekozen + Browse je nieuwe site Je hebt Runway geinstalleerd, dus kijk eens hoe je nieuwe site eruit ziet.]]> + Meer hulp en informatie Vind hulp in onze bekroonde community, blader door de documentatie of bekijk enkele gratis videos over het bouwen van een eenvoudige site, het gebruiken van packages en een overzicht van Umbraco terminologie]]> + Umbraco %0% is geïnstalleerd en klaar voor gebruik. + /web.config bestand aanpassen, en de Appsetting key UmbracoConfigurationStatus onder in het bestand veranderen naar '%0%'.]]> + meteen beginnen door de "Launch Umbraco" knop hieronder te klikken.
Als je een beginnende Umbraco gebruiker bent, dan kun je you can find veel informatie op onze "getting started" pagina's vinden.]]>
+ Launch Umbraco Om je website te beheren open je simpelweg de Umbraco back office en begin je inhoud toe te voegen, templates en stylesheets aan te passen of nieuwe functionaliteit toe te voegen]]> + Verbinding met de database mislukt. + Umbraco versie 3 + Umbraco versie 4 + Bekijken + Umbraco %0% voor een nieuwe installatie of een upgrade van versie 3.0.

Druk op "volgende" om de wizard te starten.]]>
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + Cultuurcode + Cultuurnaam + + + Je bent inactief en zult automatisch worden uitgelogd over + Vernieuw je sessie om je wijzigingen te behouden + + + Goede zondag + Fijne maandag + Fijne dinsdag + Fijne woensdag + Fijne donderdag + Fijne vrijdag + Fijne zaterdag + log hieronder in + Inloggen met + Sessie is verlopen + © 2001 - %0%
umbraco.com

]]>
+ Wachtwoord vergeten? + Er zal een email worden gestuurd naar het emailadres van jouw account. Hierin staat een link om je wachtwoord te resetten + Een email met daarin de wachtwoord reset uitleg zal worden gestuurd als het emailadres in onze database voorkomt. + Terug naar loginformulier + Geeft alsjeblieft een nieuw wachtwoord op + Je wachtwoord is aangepast + De link die je hebt aangeklikt is niet (meer) geldig. + Umbraco: Wachtwoord Reset + + De gebruikersnaam om in te loggen bij jouw Umbraco omgeving is: %0%

Klik hier om je wachtwoord te resetten of knip/plak deze URL in je browser:

%1%

]]> +
+ + + Dashboard + Secties + Inhoud + + + Selecteer pagina boven... + %0% is gekopieerd naar %1% + Kopieer naar + %0% is verplaatst naar %1% + Verplaats naar + is geselecteerd als root van je nieuwe pagina, klik hieronder op 'ok'. + Nog geen node geselecteerd, selecteer eerst een node in bovenstaade lijst voordat je op 'volgende' klikt + De huidige node is niet toegestaan onder de geselecteerde node vanwege het node type + De huidige node kan niet naar een van zijn subpagina’s worden verplaatst. + De huidige node kan niet worden gebruikt op root-niveau + Deze actie is niet toegestaan omdat je onvoldoende rechten hebt op 1 of meer subitems. + Relateer gekopieerde items aan het origineel + + + Bewerk de notificatie voor %0% + + Hi %0%

+ +

Dit is een geautomatiseerde mail om u op de hoogte te brengen dat de taak '%1%' + is uitgevoerd op pagina '%2%' + door gebruiker '%3%' +

+ +

+

Update samenvatting:

+ + %6% +
+

+ + + +

Een prettige dag!

+ Dit is een bericht van uw Content Management Systeem. +

+ ]]>
+ [%0%] Notificatie over %1% uitgevoerd op %2% + Notificaties + + + Kies een package op je computer door op "Bladeren" te klikken en de package te selecteren. Umbraco packages hebben meestal ".umb" of ".zip" als extensie. + Auteur + Demonstratie + Documentatie + Package meta data + Package naam + Package bevat geen inhoud +
+ Je kunt dit package veilig verwijderen door 'verwijder package' te klikken. + ]]>
+ Geen upgrades beschikbaar + Package opties + Package lees mij + Package repository + Bevestig verwijderen + Package is verwijderd + De package is succesvol verwijderd + Verwijder package + + Waarschuwing: alle documenten, media etc, die afhankelijk zijn van de items die je verwijderd, zullen niet meer werken en kan leiden tot een instabiele installatie, + wees dus voorzichtig met verwijderen. Als je niet zeker bent, neem dan contact op met de auteur van de package. + ]]> + Download update uit de repository + Upgrade package + Upgrade instructies + Er is een upgrade beschikbaar voor deze package. Je kunt het direct downloaden uit de Umbraco package repository. + Package versie + Package versiehistorie + Bekijk de package website + Package reeds geinstalleerd + Deze package kan niet worden geinstalleerd omdat minimaal Umbraco versie %0% benodigd is. + Aan het deinstalleren... + Aan het downloaden... + Aan het importeren... + Aan het installeren... + Aan het herstarten, een ongenblik geduld aub... + Geinstalleerd! Je browser zal nu automatisch ververst worden... + Kruk op "finish" om de installate te voltooien en de pagina te verversen. + + + Plakken met alle opmaak (Niet aanbevolen) + De tekst die je probeert te plakken bevat speciale karakters en/of opmaak. Dit kan veroorzaakt worden doordat de tekst vanuit Microsoft Word is gekopieerd. Umbraco kan deze speciale karakters en formattering automatisch verwijderen zodat de geplakte tekst geschikt is voor het web. + Plakken als ruwe tekst en alle opmaak verwijderen + Plakken, en verwijder de opmaak (aanbevolen) + + + Geavanceerd: Beveilig door de Member Groups te selecteren die toegang hebben op de pagina + gebruik makend van Umbraco's member groups.]]> + Je moet eerst een membergroup maken voordat je kunt werken met role-based authentication. + Error Pagina + Gebruikt om te tonen als een gebruiker is ingelogd, maar geen rechten heeft om de pagina te bekijken + Hoe wil je de pagina beveiligen? + %0% is nu beveiligd + Beveiliging verwijderd van %0% + Login Pagina + Kies de pagina met het login-formulier + Verwijder beveiliging + Kies de pagina's die het login-formulier en de error-berichten bevatten + Kies de roles wie toegang hebben tot deze pagina + Geef de gebruikersnaam en wachtwoord voor deze pagina + Eenvoudig: Beveilig door middel van gebruikersnaam en wachtwoord + Als je eenvoudige beveiliging wilt gebruiken met behulp van een enkele gebruikersnaam en wachtwoord + + + + + + + + + + Inclusief ongepubliceerde subitems + Publicatie in uitvoering - even geduld... + %0% van %1% pagina’s zijn gepubliceerd... + %0% is gepubliceerd + %0% en onderliggende pagina’s zijn gepubliceerd + Publiceer %0% en alle subitems + ok om %0% te publiceren en de wijzigingen zichtbaar te maken voor bezoekers.

+ Je kunt deze pagina publiceren en alle onderliggende sub-pagina's door publiceer alle subitems aan te vinken hieronder. + ]]>
+ + + Je hebt geen goedgekeurde kleuren geconfigureerd + + + Externe link toevoegen + Interne link toevoegen + Bijschrift + Link + In een nieuw venster openen + Voer het bijschrijft in + Voer de link in + + + Reset + + + Huidige versie + Rode tekst wordt niet getoond in de geselecteerde versie , groen betekent toegevoegd]]> + Document is teruggezet + Hiermee wordt de geselecteerde versie als html getoond, als u de verschillen tussen de 2 versies tegelijk wilt zien, gebruik dan de diff view + Terugzetten naar + Selecteer versie + Bekijk + + + Bewerk script-bestand + + + Concierge + Inhoud + Courier + Ontwikkelaar + Umbraco configuratiewizard + Media + Leden + Nieuwsbrieven + Instellingen + Statistieken + Vertaling + Gebruikers + Help + Formulieren + Analytics + + + ga naar + Help onderwerpen voor + Video's voor + De beste Umbraco video tutorials + + + Standaard template + Woordenboek sleutel + Om een bestaand documenttype te importeren, zoek het betreffende “.udt” bestand door op browse en import te klikken. (Je ziet een bevestigingspagina voordat de import start. Als het documenttype al bestaat dan wordt het bijgewerkt.) + Nieuwe tabtitel + Node type + Type + Stylesheet + Script + Stylesheet eigenschap + Tab + Tab titel + Tabs + Basis inhoudstype ingeschakeld + Dit inhoudstype gebruikt + als basis inhoudstype. Tabs van basis inhoudstypes worden niet getoond en kunnen alleen worden aangepast op het basis inhoudstype zelf + Geen eigenschappen gedefinieerd op dit tabblad. Klik op de link "voeg een nieuwe eigenschap" aan de bovenkant om een ​​nieuwe eigenschap te creëren. + Master Document Type + Maak een bijbehorend template + Icon toevoegen + + + Sort order + Creation date + Sorteren gereed. + Sleep de pagina's omhoog of omlaag om de volgorde te veranderen. Of klik op de kolom-header om alle pagina's daarop te sorteren. +
Sluit dit venster niet tijdens het sorteren]]>
+ + + Validatie + Validatiefouten moeten worden opgelost voor dit item kan worden opgeslagen + Mislukt + Wegens onvoldoende rechten kon deze handeling kon niet worden uitegevoerd + Geannuleerd + Uitvoering is g eannuleerd door de plugin van een 3e partij + Publicatie werd geannuleerd doordeeen plugin van een 3e partij + Eigenschappen type bestaat al + Eigenschappen type aangemaakt + Data type: %1%]]> + Eigenschappen type verwijderd + Inhoudstype opgeslagen + Tab aangemaakt + Tab verwijderd + Tab met id: %0% verwijderd + Stylesheet niet opgeslagen + Stylesheet opgeslagen + Stylesheet opgeslagen zonder fouten + Datatype opgeslagen + Woordenboek item opgeslagen + Publicatie is mislukt omdat de bovenliggende pagina niet gepubliceerd is + Inhoud gepubliceerd + en zichtbaar op de website + Inhoud opgeslagen + Vergeet niet te publiceren om de wijzigingen zichtbaar te maken + Verzend voor goedkeuring + Verandering zijn verstuurd voor goedkeuring + Media opgeslagen + Media opgeslagen zonder fouten + Lid opgeslagen + Stijlsheet eigenschap opgeslagen + Stijlsheet opgeslagen + Template opgeslagen + Fout bij opslaan gebruiker (zie logboek) + Gebruiker opgeslagen + Gebruikerstype opgeslagen + Bestand niet opgeslagen + bestand kon niet worden opgeslagen. Controleer de bestandsbeveiliging + Bestand opgeslagen + Bestand opgeslagen zonder fouten + Taal opgeslagen + Media Type opgeslagen + Member Type opgeslagen + Python script niet opgeslagen + Python script kon niet worden opgeslagen door een fout + Python script opeslagen! + Geen fouten in python script! + Template niet opgeslagen + Controleer dat je geen 2 tamplates met dezelfde naam hebt + Template opgeslagen + Template opgeslagen zonder fouten! + XSLT niet opgeslagen + XSLT bevat een fout + XSLT kon niet worden opgeslagen, controleer de bestandsbeveiliging + XSLT opgeslagen + Geen fouten in de XSLT! + Inhoud gedepubliceerd + Partial view opgeslagen + Partial view opgeslagen zonder fouten! + Partial view niet opgeslagen + Er is een fout opgetreden bij het opslaan van het bestand. + Script view opgeslagen + Script view opgeslagen zonder fouten! + Script view niet opgeslagen + Er is een fout opgetreden bij het opslaan van dit bestand. + Er is een fout opgetreden bij het opslaan van dit bestand. + + + Gebruik CSS syntax bijv: h1, .redHeader, .blueTex + Stijlsheet aanpassen + Bewerk stylesheet eigenschap + Naam waarmee de stijl in de editor te kiezen is + Voorbeeld + Stijlen + + + Template aanpassen + Invoegen inhoudsgebied + Invoegen inhoudsgebied placeholder + Invoegen dictionary item + Invoegen Macro + Invoegen Umbraco page field + Basis sjabloon + Quick Guide voor Umbraco template tags + Sjabloon + + + Item toevoegen + Kies de indeling + Kies een indeling voor deze pagina om content toe te kunnen voegen + Plaats een (extra) content blok]]> + Drop content + Instellingen toegepast + + Deze content is hier niet toegestaan + Deze content is hier toegestaan + + Klik om een item te embedden + Klik om een afbeelding in te voegen + Afbeelding ondertitel... + Typ hier...... + Grid lay-outs + Lay-outs zijn het globale werkgebied voor de grid editor. Je hebt meestal maar één of twee verschillende lay-outs nodig + Een grid layout toevoegen + De lay-out aanpassen door de kolombreedte aan te passen en extra kolommen toe te voegen + + Rijconfiguratie + Rijen zijn voorgedefinieerde cellen die horizontaal zijn gerangschikt + Een rijconfiguratie toevoegen + De rijconfiguratie aanpassen door de breedte van de cel in te stellen en extra cellen toe te voegen + + Kolommen + Het totaal aantal gecombineerde kolommen in de grid layout + + Instellingen + Configureren welke instellingen de editors kunnen aanpassen + + + Styles + Configureren welke stijlen de editors kunnen aanpassen + + De instellingen worden enkel bewaard indien de ingevoerde Json geldig is + + Alle editors toelaten + Alle rijconfiguraties toelaten + Instellen als standaard + Kies extra + Kies standaard + zijn toegevoegd + + + + Composities + Er zijn nog geen tabs toegevoegd + Voeg een nieuwe tab toe + Voeg nog een tab toe + Inherited van + Voeg property toe + Verplicht label + + Zet list view aan + Laat de child nodes van het content item zien als een sorteer- en doorzoekbare lijstweergave zien. Deze child nodes worden dan niet in de boomstructuur getoond. + + Toegestane Templates + Kies welke templates toegestaan zijn om door de editors op dit content-type gebruikt te worden + Sta toe op root-niveau + Sta editors toe om content van dit type aan te maken op root-niveau + Ja - sta content van dit type toe op root-niveau + + Toegestane child node types + Sta contetn van een bepaalde type toe om onder dit type aangemaakt te kunnen worden + + Kies child node + Overerfde tabs en properties van een bestaand document-type. Nieuwe tabs worden toegevoegd aan het huidige document-type of samengevoegd als een tab met de identieke naam al bestaat. + Dit content-type wordt gebruikt in een compositie en kan daarom niet zelf een compositie worden. + Er zijn geen content-typen beschikbaar om als compositie te gebruiken. + + Beschikbare editors + Herbruik + Editor instellingen + + Configuratie + + Ja, verwijder + + is naar onder geplaatst + is naar onder gecopierd + Selecteer de map om te verplaatsen + Selecteer de map om te kopieren + naar de boomstructuur onder + + Alle Document types + Alle documenten + Alle media items + + die gebruik maken van dit document type zullen permanent verwijderd worden. Bevestig aub dat je deze ook wilt verwijderen. + die gebruik maken van dit media type zullen permanent verwijderd worden. Bevestig aub dat je deze ook wilt verwijderen. + die gebruik maken van dit member type zullen permanent verwijderd worden. Bevestig aub dat je deze ook wilt verwijderen. + + en alle documenten van dit type + en alle media items van dit type + en alle leden van dit type + + die gebruik maken van deze editor zullen geupdate worden met deze nieuwe instellingen + + Lid kan bewerken + Toon in het profiel van leden + tab heeft geen sorteervolgorde + + + + Models aan het gereneren + dit kan enige tijd duren, geduld aub + Models gegenereerd + Models konden niet gegenereerd worden + Models generatie is mislukt, kijk in de Umbraco log voor details + + + + Alternatief veld + Alternatieve tekst + Kapitalisatie + Encoding + Selecteer veld + Converteer regelafbreking + ]]> + Aangepaste velden + Ja, alleen datum + Opmaken als datum + HTML-encoderen + Speciale karakters worden geëncodeerd naar HTML. + Zal worden ingevoegd na de veld waarde + Zal worden ingevoegd voor de veld waarde + Kleine letters + Geen + Invoegen na veld + Invoegen voor veld + Recursief + Standaard velden + Hoofdletters + URL-encoderen + Speciale karakters in URL's worden geëncodeerd + Zal alleen worden gebruikt waneer de bovenstaande veld waardes leeg zijn + Dit veld zal alleen worden gebruikt als het primaire veld leeg is + Ja, met tijd. Scheidingsteken: + + + Taken aan jou toegewezen + + Sluit taak + Details van vertaling + Download alle vertalingstaken als xml + Download xml + Download xml DTD + Velden + Inclusief onderliggende pagina's + + [%0%] Vertaalopdracht voor %1% + Geen vertaal-gebruikers gevonden. Maak eerst een vertaal-gebruiker aan voordat je pagina's voor vertaling verstuurd + Taken aangemaakt door jou + die je aanmaakte. + Om een detailweergave met opmerkingen te zien, klik op "Detail" of op de paginanaam. + Je kan ook de pagina in XML-formaat downloaden door op de "Download XML"-link te klikken. + Om een vertalingstaak te sluiten, klik je op de "Sluiten"-knop in detailweergave.]]> + De pagina '%0%' is verstuurd voor vertaling + Kies de taal waarin deze contetn vertaald moet worden + Stuur voor vertaling + Toegewezen door + Taak geopend + Totaal aantal woorden + Vertaal naar + Vertaling voltooid. + Je kan een voorbeeld van vertaalde pagina's bekijken door hieronder te klikken. Als de originele pagina gevonden werd, wordt een vergelijking van beide pagina's getoond. + Vertalen niet gelukt, het XML-bestand is mogelijk beschadigd. + Vertalingsopties + Vertaler + Vertaald XML-document uploaden + + + Cachebrowser + Prullenbak + Gemaakte packages + Datatypes + Woordenboek + Geïnstalleerde packages + Installeer skin + Installeer starter kit + Talen + Installeer een lokale package + Macro's + Mediatypes + Leden + Ledengroepen + Rollen + Ledentypes + Documenttypen + RelatieTypen + Packages + Packages + Python-bestanden + Installeer uit repository + Installeer Runway + Runway modules + Script bestanden + Scripts + Stylesheets + Sjablonen + XSLT Bestanden + Analytics + + + Nieuwe update beschikbaar + %0% is gereed, klik hier om te downloaden + Er is geen verbinding met de server + Er is een fout opgetreden bij het zoeken naar een update. Bekijk de trace-stack voor verdere informatie. + + + Beheerders + Categorieveld + Verander je wachtwoord + Wijzig je wachtwoord + Bevestig nieuw password + Je kunt je wachtwoord veranderen door onderstaan formulier in te vullen en op de knop 'Verander wachtwoord' te klikken + Inhoudskanaal + Omschrijving + Geblokkeerde gebruiker + Documenttype + Redacteur + Samenvattingsveld + Taal + Loginnaam + Startnode in Mediabibliotheek + Secties + Blokkeer Umbraco toegang + Oude wachtwoord + Wachtwoord + Reset wachtwoord + Je wachtwoord is veranderd! + Herhaal nieuwe wachtwoord + Voer nieuwe wachtwoord in + Je nieuwe wachtwoord mag niet leeg zijn! + Huidig wachtwoord + Ongeldig huidig wachtwoord + Beide wachtwoorden waren niet hetzelfde. Probeer opnieuw! + Beide wachtwoorden zijn niet hetzelfde! + Vervang rechten op de subitems + U bent momenteel rechten aan het aanpassen voor volgende pagina's: + Selecteer pagina's om hun rechten aan te passen + Doorzoek alle subitems + Startnode in Content + Gebruikersnaam + Gebruikersrechten + Gebruikerstype + Gebruikerstypes + Auteur + Vertaler + Wijzig + Je profiel + Je recente historie + Sessie verloopt over + + + Validatie + Valideer als email + Valideer als nummer + Valideer als Url + ...of gebruik custom validatie + Veld is verplicht + + + + Waarde is insteld naar the aanbevolen waarde: '%0%'. + Waarde was '%1%' voor XPath '%2%' in configuratie bestand '%3%'. + De verwachtte waarde voor '%2%' is '%1%' in configuratie bestand '%3%', maar is '%0%'. + Onverwachte waarde '%0%' gevonden voor '%2%' in configuratie bestand '%3%'. + + + Custom foutmeldingen zijn ingesteld op '%0%'. + Custom foutmeldingen zijn momenteel '%0%'. Wij raden aan deze aan te passen naar '%1%' voor livegang. + Custom foutmeldingen aangepast naar '%0%'. + + Macro foutmeldingen zijn ingesteld op'%0%'. + Macro foutmeldingen zijn ingesteld op '%0%'. Dit zal er voor zorgen dat bepaalde, of alle, pagina's van de website niet geladen kunnen worden als er errors in een Macro zitten. Corrigeren zal deze waarde aanpassen naar '%1%'. + Macro foutmeldingen zijn aangepast naar '%0%'. + + + Try Skip IIS Custom foutmeldingen is ingesteld op '%0%'. IIS versie '%1%' wordt gebruikt. + Try Skip IIS Custom foutmeldingen is ingesteld op '%0%'. Het wordt voor de gebruikte IIS versie (%2%) aangeraden deze in te stellen op '%1%'. + Try Skip IIS Custom foutmeldingen ingesteld op '%0%'. + + + Het volgende bestand bestaat niet: '%0%'. + '%0%' kon niet gevonden worden in configuratie bestand '%1%'.]]> + Er is een fout opgetreden. Bekijk de log file voor de volledige fout: %0%. + + Members - Totaal XML: %0%, Totaal: %1%, Total incorrect: %2% + Media - Totaal XML: %0%, Totaal: %1%, Total incorrect: %2% + Content - Totaal XML: %0%, Totaal gepubliceerd: %1%, Total incorrect: %2% + + Het cerficaat van de website is ongeldig. + Cerficaat validatie foutmelding: '%0%' + Fout bij pingen van URL %0% - '%1%' + De site wordt momenteel %0% bekeken via HTTPS. + De appSetting 'umbracoUseSSL' in web.config staat op 'false'. Indien HTTPS gebruikt wordt moet deze op 'true' staan. + De appSetting 'umbracoUseSSL' in web.config is ingesteld op '%0%'. Cookies zijn %1% ingesteld als secure. + De 'umbracoUseSSL' waarde in web.config kon niet aangepast worden. Foutmelding: %0% + + + HTTPS inschakelen + Zet in de appSettings van de web.config de umbracoSSL instelling op 'true'. + De appSetting 'umbracoUseSSL' is nu ingesteld op 'true', cookies zullen als 'secure' worden aangemerkt. + + Fix + Cannot fix a check with a value comparison type of 'ShouldNotEqual'. + Cannot fix a check with a value comparison type of 'ShouldEqual' with a provided value. + Value to fix check not provided. + + Debug compiliate mode staat uit. + Debug compiliate mode staat momenteel aan. Wij raden aan deze instelling uit te zetten voor livegang. + Debug compiliate mode uitgezet. + + Trace mode staat uit. + Trace mode staat momenteel aan. Wij raden aan deze instelling uit te zetten voor livegang. + Trace mode uitgezet. + + Alle mappen hebben de juiste permissie-instellingen!. + + %0%.]]> + %0%. Als deze niet in gebruik zijn voor deze omgeving hoeft er geen actie te worden ondernomen.]]> + + All files have the correct permissions set. + + %0%.]]> + %0%. Als deze niet in gebruik zijn voor deze omgeving hoeft er geen actie te worden ondernomen.]]> + + X-Frame-Options header of meta-tag om IFRAMEing door andere websites te voorkomen is aanwezig!]]> + X-Frame-Options header of meta-tag om IFRAMEing door andere websites te voorkomen is NIET aanwezig.]]> + Voorkom IFRAMEing via web.config + Voegt de instelling toe aan de httpProtocol/customHeaders section in web.config om IFRAMEing door andere websites te voorkomen. + De instelling om IFRAMEing door andere websites te voorkomen is toegevoegd aan de web.config! + Web.config kon niet aangepast worden door error: %0% + + + %0%.]]> + Er zijn geen headeres gevonden welke informatie over de gebruikte website technologie prijsgeven! + + In de Web.config werd system.net/mailsettings niet gevonden + In de Web.config sectie system.net/mailsettings is de host niet geconfigureerd. + SMTP instellingen zijn correct ingesteld en werken zoals verwacht. + De SMTP server geconfigureerd met host '%0%' en poort '%1%' kon niet gevonden worden. Controleer of de SMTP instellingen in Web.config file system.net/mailsettings correct zijn. + + %0%.]]> + %0%.]]> + + + URL tracker uitzetten + URL tracker aanzetten + Originele URL + Doorgestuurd naar + Er zijn geen redirects + Er wordt automatisch een redirect aangemaakt als een gepubliceerde pagina hernoemd of verplaatst wordt. + Verwijder + Weet je zeker dat je de redirect van '%0%' naar '%1%' wilt verwijderen? + Redirect URL verwijderd. + Fout bij verwijderen redirect URL. + Weet je zeker dat je de URL tracker wilt uitzetten? + URL tracker staat nu uit. + Fout bij het uitzetten van de URL Tracker. Meer informatie kan gevonden worden in de log file. + URL tracker staat nu aan. + Fout bij het aanzetten van de URL tracker. Meer informatie kan gevonden worden in de log file. + +
diff --git a/src/UmbracoUrlHandling/Umbraco/Config/Lang/pl.xml b/src/UmbracoUrlHandling/Umbraco/Config/Lang/pl.xml new file mode 100644 index 0000000..704469e --- /dev/null +++ b/src/UmbracoUrlHandling/Umbraco/Config/Lang/pl.xml @@ -0,0 +1,1556 @@ + + + + The Umbraco community + http://our.umbraco.org/documentation/Extending-Umbraco/Language-Files + + + Zarządzanie hostami + Historia zmian + Przeglądaj węzeł + Zmień typ dokumentu + Kopiuj + Utwórz + Stwórz zbiór + Usuń + Deaktywuj + Opróżnij kosz + Eksportuj typ dokumentu + Importuj typ dokumentu + Importuj zbiór + Edytuj na stronie + Wyjście + Przenieś + Powiadomienia + Publiczny dostęp + Opublikuj + Cofnij publikację + Odśwież węzeł + Opublikuj ponownie całą stronę + Przywróć + Ustaw uprawnienia dla strony %0% + Wybierz miejsce docelowe + do w poniższej strukturze drzewa + Uprawnienia + Cofnij + Wyślij do publikacji + Wyślij do tłumaczenia + Sortuj + Zapisz do opublikowania + Przetłumacz + Aktualizuj + Domyślna wartość + + + Brak odpowiednich uprawnień + Dodaj nową domenę + Usuń domenę + Niepoprawny węzeł<./key> + Niepoprawny format domeny. + Domena została już przydzielona. + Język + Domena + Domena '%0%' została utworzona + Domena '%0%' została skasowana + Domena '%0%' jest aktualnie przypisana + Domena '%0%' została zaktualizowana + + Edycja aktualnych domen + Odziedziczona + Język + lub wybierz dziedziczenie języka z węzła rodzica. Zostanie to zastosowane
+także do obecnego węzła, o ile poniższa domena również do niego należy.]]>
+ Domeny + + + Wyświetlane dla + + + Wyczyść sekcję + Wybierz + Wybierz bieżący folder + Zrób coś innego + Pogrubienie + Zmniejsz wcięcie + Wstaw z pola + Wstaw graficzną linię nagłówka + Podgląd HTML + Zwiększ wcięcie + Kursywa + Wyśrodkuj + Wyrównaj do lewej + Wyrównaj do prawej + Wstaw link + Wstaw link wewnętrzny + Wypunktowanie + Numerowanie + Wstawianie makra + Wstawianie obrazka + Edycja relacji + Powrót do listy + Zapisz + Zapisz i publikuj + Zapisz i wyślij do zaakceptowania + Zapisz widok listy + Podgląd + Podgląd jest wyłączony, ponieważ żaden szablon nie został przydzielony + Wybierz styl + Pokaż style + Wstaw tabelę + Wygeneruj modele + Cofnij + Powtórz + + + Aby zmienić typ dokumentu dla wybranej treści, najpierw wybierz typ z listy typów obowiązujących dla tej lokalizacji. + Następnie potwierdź i/lub zmień mapowanie właściwości z bieżącego typu do nowego i kliknij "Zapisz". + Treść została opublikowana ponownie. + Bieżąca właściwość + Bieżący typ + Typ dokumentu nie może być zmieniony, ponieważ nie istnieją obowiązujące alternatywy dla tej lokalizacji. Alternatywa będzie dostępna, jeśli będzie dozwolona pod rodzicem wybranego elementu zawartości i jeśli wszystkie istniejące dzieci elementu zawartości będą mieć pozwolenie na bycie tworzonym pod rodzicem. + Typ dokumentu został zmieniony + Mapuj Właściwości + Mapuj do Właściwości + Nowy Szablon + Nowy typ + Nic + Zawartość + Wybierz Nowy Typ Dokumentu + Typ dokumentu wybranej zawartości został zmieniony z powodzeniem do [new type] i następujące właściwości zostały zmapowane: + do + Nie można dokończyć mapowania właściwości, ponieważ jedna lub więcej właściwości mają zdefiniowane więcej niż jedno mapowanie. + Wyświetlane są tylko alternatywne typy obowiązujące dla obecnej lokalizacji. + + + Jest Opublikowany + O tej stronie + Link alternatywny + (jakbyś opisał obrazek nad telefonem) + Alternatywne linki + Kliknij, aby edytować ten element + Utworzone przez + Pierwotny autor + Zaktualizowane przez + Data utworzenia + Data/czas stworzenia tego dokumentu + Rodzaj dokumentu + Edytowanie + Usuń w + Ten element został zmieniony po publikacji + Element nie jest opublikowany + Opublikowane + Nie ma żadnych elementów do wyświetlenia + Nie ma żadnych elementów do wyświetlenia w liście. + Typ mediów + Link do elementu(ów) mediów + Członek grupy + Rola + Typ członka + Brak daty + Tytuł strony + Właściwości + Ten dokument jest opublikowany, ale jest niewidoczny, ponieważ jego rodzic '%0%' nie jest opublikowany + Ten dokument jest opublikowany, ale nie jest w cache. + Nie znaleziono URL + Ten dokument jest opublikowany ale jego URL kolidowałby z elementem treści %0% + Publikuj + Status publikacji + Opublikuj + Cofnij publikację + Data usunięcia + Porządek się zmienił + Aby posortować gałęzie, po prostu przeciągnij gałąż lub kliknij na jednym z nagłówków kolumn. Możesz wybrać kilka gałęzi poprzez przytrzymanie klawisza "shift" lub "control" podczas zaznaczania + Statystyki + Tytuł (opcjonalny) + Alternatywny tekst (opcjonalny) + Typ + Cofnij publikację + Ostatnio edytowany + Data/czas edycji dokumentu + Usuń plik(i) + Link do dokumentu + Członek grupy (grup) + Nie jest członkiem grupy (grup) + Elementy dzieci + Cel + Oznacza to następującą godzinę na serwerze: + Co to oznacza?]]> + + + Kliknij, aby załadować plik + Przerzuć swoje pliki tutaj... + Link do mediów + lub kliknij tutaj, aby wybrać pliki + Jedyne dozwolone typy plików to + Maksymalny rozmiar pliku to + + + Stwórz nowego członka + Wszyscy członkowie + + + Gdzie chcesz stworzyć nowy %0%? + Utwórz w + Wybierz rodzaj oraz tytuł + "typy dokumentów".]]> + "typy mediów".]]> + Typ Dokumentu bez szablonu + Nowy folder + Nowy typ danych + Nowy plik javascript + Nowy pusty Częściowy Widok + Nowy Częściowy Widok makro + Nowy Częściowy Widok ze snippeta + Nowy pusty Częściowy Widok makro + Nowy Częściowy Widok makro ze snippeta + Nowy Częściowy Widok makro (bez makro) + + + Przeglądaj swoją stronę + - Ukryj + Jeśli Umbraco się nie otwiera, prawdopodobnie musisz zezwolić tej stronie na otwieranie wyskakujących okienek + zostało otwarte w nowym oknie + Restartuj + Odwiedź + Witaj + + + Zostań + Odrzuć zmiany + Masz niezapisane zmiany + Jesteś pewien, że chcesz wyjść ze strony? - masz niezapisane zmiany + + + Wykonane + + Usunięto %0% element + Usunięto %0% elementy(ów) + Usunięto %0% z %1% elementu + Usunięto %0% z %1% elementów + + Opublikowano %0% element + Opublikowano %0% elementy(ów) + Opublikowano %0% z %1% elementu + Opublikowano %0% z %1% elementów + + Cofnięto publikację %0% elementu + Cofnięto publikację %0% elementy(ów) + Cofnięto publikację %0% z %1% elementu + Cofnięto publikację %0% z %1% elementów + + Przeniesiono %0% element + Przeniesiono %0% elementy(ów) + Przeniesiono %0% z %1% elementu + Przeniesiono %0% z %1% elementów + + Skopiowano %0% element + Skopiowano %0% elementy(ów) + Skopiowano %0% z %1% elementu + Skopiowano %0% z %1% elementów + + + Nazwa + Zarządzaj nazwami hostów + Zamknij to okno + Jesteś pewny, że chcesz usunąć + Jesteś pewny, że chcesz wyłączyć + Proszę zaznaczyć, aby potwierdzić usunięcie %0% elementów. + Jesteś pewny? + Jesteś pewny? + Wytnij + Edytuj element słownika + Edytuj język + Wstaw link wewnętrzny + Wstaw znak + Wstaw graficzny nagłówek + Wstaw zdjęcie + Wstaw link + Wstaw makro + Wstaw tabelę + Ostatnio edytowane + Link + Link wewnętrzny: + Kiedy używasz odnośników lokalnych, wstaw znak "#" na początku linku + Otworzyć w nowym oknie? + Ustawienia Makro + To makro nie posiada żadnych właściwości, które można edytować + Wklej + Edytuj Uprawnienia dla + Zawartość kosza jest teraz usuwana. Proszę nie zamykać tego okna do momentu zakończenia procesu. + Zawartość kosza została usunięta + Usunięcie elementów z kosza powoduje ich trwałe i nieodwracalne skasowanie + regexlib.com aktualnie nie jest dostępny, na co nie mamy wpływu. Bardzo przepraszamy za te utrudnienia.]]> + Przeszukaj dla wyrażeń regularnych, aby dodać regułę sprawdzającą do formularza. Np. 'email' 'url' + Usuń Makro + Pole wymagane + Strona została przeindeksowana + Cache strony zostało odświeżone. Cała opublikowana zawartość jest teraz aktualna. Natomiast cała nieopublikowana zawartość ciągle nie jest widoczna + Cache strony zostanie odświeżone. Cała zawartość opublikowana będzie aktualna, lecz nieopublikowana zawartość pozostanie niewidoczna + Liczba kolumn + Liczba wierszy + Ustaw zastępczy ID Ustawiając ID na tym elemencie możesz później łączyć treść z podrzędnych szablonów, + ustawiając dowiązanie do tego ID na elemencie <asp:treści />]]> + Wybierz zastępczy ID z poniższej listy. Możesz wybierać tylko + spośród ID na szablonie nadrzędnym tego formularza.]]> + Kliknij na obrazie, aby zobaczyć go w pełnym rozmiarze + Wybierz element + Podgląd elementów Cache + Utwórz folder... + Odnieś się do oryginału + Zawrzyj potomków + Najbardziej przyjacielska społeczność + Link do strony + Otwórz zlinkowany dokument w nowym oknie lub zakładce + Link do mediów + Wybierz media + Wybierz ikonę + Wybierz element + Wybierz link + Wybierz makro + Wybierz zawartość + Wybierz członka + Wybierz członka grupy + Nie znaleziono ikon + Te makro nie ma żadnych właściwości + Brak dostępnych makro do wstawienia + Zewnętrzni dostawcy logowania + Sczegóły Wyjątku + Stacktrace + Wewnętrzny wyjątek + Zlinkuj swój + Odlinkuj swój + konto + Wybierz edytora + + + %0%' poniżej.
+Możesz dodać dodatkowe języki w menu "Języki" po lewej stronie.]]>
+ Nazwa języka + Edytuj klucz elementu słownika. + + + + + + Wpisz nazwę użytkownika + Wpisz hasło + Potwierdź hasło + Nazwij %0%... + Wpisz nazwę... + Etykieta... + Wpisz opis... + Wpisz, aby wyszukać... + Wpisz, aby filtrować... + Wpisz, aby dodać tagi (naciśnij enter po każdym tagu)... + Wpisz adres e-mail + Twoja nazwa użytkownika to przeważnie Twój adres e-mail + + + Zezwól w korzeniu + Tylko Typ Zawartości, który jest zaznaczony może być stworzony na pozomie korzenia drzew Zawartości i Mediów + Dozwolone węzły pochodne + Kompozycje Typu Dokumentu + Stwórz + Usuń zakładkę + Opis + Nowa zakładka + Zakładka + Miniatura + Włącz widok listy + Konfiguruje element treści, aby pokazywał możliwą do sortowania i szukania listę jego dzieci, dzieci nie będą wyświetlone w drzewie + Bieżący widok listy + Typ danych aktywnego widoku listy + Stwórz niestandardowy widok listy + Usuń niestandardowy widok listy + + + Dodaj wartość + Typ bazy danych + Edytor GUID + Renderuj kontrolkę + Przyciski + Włącz ustawienia zaawansowane dla + Włącz menu podręczne + Maksymalny dozwolony rozmiar wstawianego obrazu + Powiązane arkusze stylów + Pokaż etykietę + Szerokość i wysokość + + + Dane zostały zapisane, lecz wystąpiły błędy, które musisz poprawić przed publikacją strony: + Bieżący dostawca członkowstwa nie obsługuje zmiany hasła (EnablePasswordRetrieval musi mieć wartość 'true') + %0% już istnieje + Wystąpiły błędy: + Wystąpiły błędy: + Hasło powinno mieć minimum %0% znaków, i zawierać co najmniej %1% niealfanumeryczny znak + %0% musi być liczbą całkowitą + %0% (%1%) to pole wymagane + %0% to pole wymagane + %0% w %1% nie jest w odpowiednim formacie + %0% nie jest w odpowiednim formacie + + + Otrzymano błąd serwera + Określony typ pliku został ustawiony jako niedozwolony przez administratora + Pomimo tego, że CodeMirror jest włączony w konfiguracji, jest on wyłączony w Internet Explorerze ze względu na swoją niestabilność. + Proszę uzupełnij zarówno alias, jak i nazwę dla nowego typu właściwości + Wystąpił problem podczas zapisu/odczytu wymaganego pliku lub folderu + Wystąpił błąd podczas ładowania skryptu Częściowego Widoku (plik: %0%) + Wystąpił błąd podczas ładowania userControl '%0%' + Wystąpił błąd podczas ładowania customControl (Assembly: %0%, Typ: '%1%') + Wystąpił błąd podczas ładowania skryptu MacroEngine (plik: %0%) + "Wystąpił błąd podczas parsowania pliku XSLT: %0% + "Wystąpił błąd odczytu pliku XSLT: %0% + Proszę podać tytuł + Proszę wybrać typ + Chcesz utworzyć obraz większy niż rozmiar oryginalny. Czy na pewno chcesz kontynuować? + Błąd w skrypcie Python + Skrypt Python nie został zapisany, ponieważ zawiera błędy + Węzeł początkowy usunięto, proszę skontaktować się z administratorem + Proszę zaznaczyć zawartość przed zmianą stylu + Brak dostępnych aktywnych stylów + Proszę ustaw kursor po lewej stronie dwóch komórek, które chcesz połączyć + Nie możesz podzielić komórki, która nie była wcześniej połączona. + Błąd w źródle XSLT + Plik XSLT nie został zapisany, ponieważ wystąpiły błędy + Wystąpił błąd konfiguracji związany z typem danych użytych we właściwościach, proszę sprawdź typ danych + + + O... + Akcja + Akcje + Dodaj + Alias + Wszystkie + Czy jesteś pewny? + Wstecz + Ramka + przez + Anuluj + Marginesy komórki + Wybierz + Zamknij + Zamknij okno + Komentarz + Potwierdzenie + Zachowaj proporcje + Kontynuuj + Kopiuj + Utwórz + Baza danych + Data + Domyślne + Usuń + Usunięto + Usuwanie... + Wygląd + Rozmiary + Dół + Pobierz + Edytuj + Edytowane + Elementy + Email + Błąd + Znajdź + Wysokość + Pomoc + Ikona + Importuj + Margines wewnętrzny + Wstaw + Instaluj + Nieprawidłowe + Wyrównaj + Język + układ + Ładowanie + Zablokowany + Zaloguj + Wyloguj + Wyloguj + Makro + Obowiązkowy + Przenieś + Więcej + Nazwa + Nowy + Dalej + Nie + z + OK + Otwórz + lub + Hasło + Ścieżka + Zastępczy ID + Proszę czekać... + Poprzedni + Właściwości + E-mail, aby otrzymywać dane z formularzy + Kosz + Pozostało + Zmień nazwę + Odnów + Wymagany + Ponów próbę + Uprawnienia + Szukaj + Przepraszamy, ale nie możemy znaleźć tego, czego szukasz + Elementy nie zostały dodane + Serwer + Pokaż + Pokaż stronę "wyślij" + Rozmiar + Sortuj + Zatwierdź + Typ + Wpisz, aby wyszukać... + W górę + Aktualizacja + Aktualizacja + Wyślij plik + URL + Użytkownik + Nazwa użytkownika + Wartość + Widok + Witaj... + Szerokość + Tak + Folder + Wyniki wyszukiwania + Zmień kolejność + Kolejność została zmieniona + Podgląd + Zmień hasło + do + Widok listy + Zapisywanie... + bieżący + Osadzony + wybrany + + + + Czarny + Zielony + Żółty + Pomarańczowy + Niebieski + Czerwony + + + + Dodaj zakładkę + Dodaj właściwość + Dodaj edytora + Dodaj szablon + Dodaj węzeł dziecka + Dodaj dziecko + + Edytuj typ danych + + Nawiguj sekcje + + Skróty + Pokaż skróty + + Przełącz widok listy + Przełącznik możliwy jako korzeń + + Komentuj/Odkomentuj linie + Usuń linię + Kopiuj linie do góry + Kopiuj linie w dół + Przenieś linie w górę + Przenieś linie w dół + + Ogólne + Edytor + + + + Kolor tła + Pogrubienie + Kolor tekstu + Font + Tekst + + + + Strona + + + Instalator nie mógł połączyć się z bazą danych. + Nie udało się zapisać pliku web.config. Zmodyfikuj parametry połączenia ręcznie. + Twoja baza danych została znaleziona i zidentyfikowana jako + Konfiguracja bazy danych + instaluj, aby zainstalować bazę danych Umbraco %0% +]]> + Dalej, aby kontynuować.]]> + Nie odnaleziono bazy danych! Sprawdź, czy informacje w sekcji "connection string" w pliku "web.config" są prawidłowe.

+

Aby kontynuować, dokonaj edycji pliku "web.config" (używając Visual Studio lub dowolnego edytora tekstu), przemieść kursor na koniec pliku, dodaj parametry połączenia do Twojej bazy danych w kluczu o nazwie "umbracoDbDSN" i zapisz plik.

+

+ Kliknij ponów próbę kiedy + skończysz.
+ Tu znajdziesz więcej informacji na temat edycji pliku "web.config".

]]>
+ + Skontaktuj się z Twoim dostawą usług internetowych jeśli zajdzie taka potrzeba. + W przypadku instalacji na lokalnej maszynie lub serwerze możesz potrzebować pomocy administratora.]]> + + Naciśnij przycisk aktualizuj, aby zaktualizować swoją bazę danych do Umbraco %0%

+

+ Bez obaw - żadne dane nie zostaną usunięte i wszystko będzie działać jak należy! +

+ ]]>
+ Naciśnij przycisk Dalej, aby + kontynuować.]]> + Dalej, aby kontynuować kreatora instalacji.]]> + Hasło domyślnego użytkownika musi zostać zmienione!]]> + Konto domyślnego użytkownika zostało wyłączone lub nie ma on dostępu do Umbraco!

Żadne dodatkowe czynności nie są konieczne. Naciśnij Dalej, aby kontynuować.]]> + Hasło domyślnego użytkownika zostało zmienione od czasu instalacji!

Żadne dodatkowe czynności nie są konieczne. Naciśnij Dalej, aby kontynuować.]]> + Hasło zostało zmienione! + + Umbraco tworzy domyślne konto użytkownika o loginie ('admin') i haśle ('default'). Jest ważne, + aby zmienić hasło na inne. +

+

+ Ten krok sprawdzi, czy hasło domyślnego użytkownika powinno być zmienione. +

+ ]]>
+ Aby szybko wejść w świat Umbraco, obejrzyj nasze filmy wprowadzające + Klikając przycisk dalej (lub modyfikując klucz UmbracoConfigurationStatus w pliku web.config), akceptujesz licencję na niniejsze oprogramowanie zgodnie ze specyfikacją w poniższym polu. Zauważ, że ta dystrybucja Umbraco składa się z dwoch licencji - licencja MIT typu open source dla kodu oraz licencja "Umbraco freeware", która dotyczy interfejsu użytkownika. + Nie zainstalowane. + Zmienione pliki i foldery + Więcej informacji na temat ustalania pozwoleń dla Umbraco znajdziesz tutaj + Musisz zezwolić procesowi ASP.NET na zmianę poniższych plików/folderów + Twoje ustawienia uprawnień są prawie idealne!

+ Umbraco będzie działało bez problemów, ale nie będzie możliwa instalacja pakietów, które są rekomendowane, aby w pełni wykorzystać możliwości Umbraco.]]>
+ Jak to Rozwiązać + Kliknij tutaj, aby przeczytać wersję tekstową + samouczek, pokazujący jak ustawić uprawnienia dostępu do folderów dla Umbraco, albo przeczytaj wersję tekstową.]]> + Twoje ustawienia uprawnień mogą stanowić problem! +

+ Umbraco będzie działało bez problemów, ale nie będzie możliwa instalacja pakietów, które są rekomendowane, aby w pełni wykorzystać możliwości Umbraco.]]>
+ Twoje ustawienia uprawnień nie są gotowe na Umbraco! +

+ Aby Umbraco mogło działać musisz uaktualnić swoje ustawienia zabezpieczeń.]]>
+ Twoje ustawienia uprawnień są idealne!

+ Umbraco będzie działać bez problemów i będzie można instalować pakiety!]]>
+ Rozwiązywanie problemów z folderami + Kliknij ten link, aby uzyskać więcej informacji na temat problemów z ASP.NET i tworzeniem folderów. + Ustawianie uprawnień dostępu do folderów + + Chcę zacząć od zera + dowiedz się jak) + Ciągle możesz wybrać, aby zainstalować Runway w późniejszym terminie. W tym celu przejdź do sekcji Deweloper i wybierz Pakiety. + ]]> + Właśnie stworzyłeś czystą instalację platformy Umbraco. Co chcesz zrobić teraz? + Pakiet Runway został zainstalowany pomyślnie + + To jest nasza lista rekomendowanych modułów. Zaznacz te, które chcesz zainstalować lub wyświetl pełną listę modułów + ]]> + Rekomendowane tylko dla doświadczonych użytkowników + Chcę rozpocząć z prostą stroną + + Pakiet "Runway" to prosta strona, dostarczająca kilku podstawowych typów dokumentów i szablonów. Instalator może automatycznie zainstalować pakiet Runway za Ciebie, + ale możesz w łatwy sposób edytować, rozszerzyć lub usunąć go. Nie jest on potrzebny i możesz doskonale używać Umbraco bez niego. + Jednakże pakiet Runway oferuje łatwą podstawę, bazującą na najlepszych praktykach, która pozwolić Ci rozpocząć pracę w mgnieniu oka. + Jeśli zdecydujesz się zainstalować pakiet Runway, możesz opcjonalnie wybrać podstawowe klocki zwane Modułami Runway, aby poprawić swoje strony. +

+ + Dołączone z pakietem Runway: Strona domowa, strona Jak rozpocząć pracę, strona Instalowanie Modułów.
+ Opcjonalne moduły:Górna nawigacja, Mapa strony, Formularz kontaktowy, Galeria. +
+ ]]>
+ Co to jest pakiet Runway + Krok 1/5 Akceptacja licencji + Krok 2/5: Konfiguracja bazy danych + Krok 3/5: Sprawdzanie uprawnień plików + Krok 4/5: Sprawdzanie zabezpieczeń Umbraco + Krok 5/5: Umbraco jest gotowe do pracy + Dziękujemy za wybór Umbraco + Przeglądaj swoją nową stronę + Pakiet Runway został zainstalowany, zobacz zatem jak wygląda Twoja nowa strona.]]> + Dalsza pomoc i informacje + Zaczerpnij pomocy z naszej nagrodzonej społeczności, przeglądaj dokumentację lub obejrzyj niektóre darmowe filmy o tym, jak budować proste strony, jak używać pakietów i szybki przewodnik po terminologii Umbraco]]> + Umbraco %0% zostało zainstalowane i jest gotowe do użycia + plik web.config i zaktualizować klucz AppSetting o nazwie UmbracoConfigurationStatus na dole do wartości '%0%'.]]> + rozpocząć natychmiast klikając przycisk "Uruchom Umbraco" poniżej.
Jeżeli jesteś nowy dla Umbraco + znajdziesz mnóstwo materiałów na naszych stronach "jak rozpocząć".]]>
+ Uruchom Umbraco + Aby zarządzać swoją stroną po prostu otwórz zaplecze Umbraco i zacznij dodawać treść, aktualizować szablony i style lub dodawaj nową funkcjonalność]]> + Połączenie z bazą danych nie zostało ustanowione. + Umbraco wersja 3 + Umbraco wersja 4 + Zobacz + Umbraco %0% dla świeżej instalacji lub aktualizacji z wersji 3.0. +

+ Wciśnij "dalej", aby rozpocząć proces konfigruacji.]]>
+ + + Kod języka + Nazwa języka + + + Z powodu bezczynności na stronie, nastąpi automatyczne wylogowanie + Wznów sesję teraz, aby zapisać swoją pracę + + + Szczęśliwej super niedzieli + Szczęśliwego maniakalnego poniedziałku + Szczęśliwego świetnego wtorku + Szczęśliwej niesamowitej środy + Szczęśliwego wyjątkowego czwartku + Szczęśliwego odjechanego piątku + Szczęśliwej cudownej soboty + Zaloguj się poniżej + Zaloguj się z + Sesja wygasła + © 2001 - %0%
umbraco.com

]]>
+ Zapomniałeś hasła? + E-mail z linkiem do zresetowania hasła zostanie wysłany na podany adres + E-mail z instrukcjami do zresetowania hasła zostanie wysłany, jeśli zgadza się z naszą bazą danych + Powrót do formularza logowania + Proszę wpisać nowe hasło + Twoje hasło zostało zmienione + Link, na który kliknąłeś jest niewłaściwy lub wygasł + Umbraco: Resetowanie hasła + + Twoja nazwa użytkownika do zalogowania się w Umbraco back-office to: %0%

Kliknij tutaj, aby zresetować Twoje hasło lub kopiuj/wklej ten URL w przeglądarce:

%1%

]]> +
+ + + Panel zarządzania + Sekcje + Zawartość + + + Wybierz stronę powyżej... + %0% zostało skopiowane do %1% + Wybierz, gdzie dokument %0% ma zostać skopiowany + %0% został przeniesiony do %1% + Wskaż gdzie dokument %0% ma zostać przeniesiony + został wybrany jako korzeń nowej zawartości, kliknik 'ok' poniżej. + Nie wskazano węzła, proszę wybrać węzeł z listy powyżej przed kliknięciem "ok" + Typ bieżącego węzła nie jest dozwolony dla wybranego węzła + Bieżący węzeł nie może być przeniesiony do jednej z jego podstron + Bieżący węzeł nie może istnieć w korzeniu + Działanie jest niedozwolone, ponieważ nie masz odpowiednich uprawnień w 1 lub więcej dokumentach dzieci. + Powiąż skopiowane elementy z oryginalnymi + + + Edytuj powiadomienie dla %0% + + Witaj %0%

+ +

To jest automatyczny e-mail, wysłany, aby poinformować Cię, że polecenie '%1%' + zostało wykonane na stronie '%2%' + przez użytkownika '%3%' +

+ +

+

Podsumowanie zmian:

+ + %6% +
+

+ + + +

Miłego dnia!

+ Pozdrowienia od robota Umbraco +

]]>
+ [%0%] Powiadomienie o %1% wykonane na %2% + Powiadomienie + + + + i wskaż gdzie jest zapisany. Pakiety Umbraco przeważnie posiadają rozszerzenie ".umb" lub ".zip". + ]]> + Autor + Demonstracja + Dokumentacja + Metadane pakietu + Nazwa pakietu + Pakiet nie zawiera żadnych elementów +
+ Możesz bezpiecznie go usunąć z systemu poprzez kliknięcie na przycisku "odinstaluj pakiet"]]>
+ Nie ma dostępnych aktualizacji + Opcje pakietu + Opis pakietu + Repozytorium pakietu + Potwierdź odinstalowanie + Pakiet został odinstalowany + Pakiet został pomyślnie odinstalowany + Odinstaluj pakiet + + Uwaga: wszystkie elementy, media, itp. w zależności od elementów, które usuwasz, przestaną działać i mogą spowodować niestabilność systemu, + więc odinstalowuj z uwagą. W przypadku problemów skontaktuj się z autorem pakietu.]]> + Pobierz aktualizację z repozytorium + Aktualizuj pakiet + Instrukcja aktualizacji + Jest dostępna aktualizacja dla tego pakietu. Możesz ją pobrać wprost z repozytorium pakietów Umbraco. + Wersja pakietu + Historia wersji pakietu + Odwiedź stronę pakietu + Pakiet jest już zainstalowany + Ten pakiet nie może być zainstalowany, ponieważ wymaga Umbraco w wersji przynajmniej %0% + Odinstalowywanie... + Pobieranie... + Importowanie... + Instalowanie... + Restartowanie, proszę czekać... + Wszystko skończone, Twoja przeglądarka się teraz odświeży, proszę czekać... + Proszę kliknąć Zakończ, aby zakończyć instalację i przeładować stronę. + + + Wklej z zachowaniem formatowania (Nie zalecane) + Tekst, który wklejasz zawiera specjalne znaki formatujące. Prawdopodobnie tekst pochodzi z programu Microsoft Word. Umbraco może usunąć specjalne znaki lub formatowanie automatycznie, więc skopiowana treść będzie lepiej dopasowana do wyświetlania w Internecie. + Wklej sam tekst, bez żadnego formatowania + Wklej, usuwając formatowanie (zalecane) + + + Ochrona w oparciu o role + użyj grup członkowskich Umbraco ]]> + Musisz utworzyć grupę przed użyciem uwierzytelniania opartego na rolach + Strona błędu + Używana, kiedy użytkownicy są zalogowani, ale nie posiadają dostępu + Wybierz sposób ograniczenia dostępu do tej strony + %0% jest teraz zabezpieczona + Ze strony %0% usunięto zabezpieczenia dostępu + Strona logowania + Wybierz stronę z formularzem logowania + Usuń ochronę + Wybierz strony, które zawierają formularz logowania i komunikaty o błędach + Wybierz role, które mają mieć dostęp do tej strony + Ustaw nazwę użytkownika i hasło dla tej strony + Ochrona pojedynczego użytkownika + Jeżeli chcesz ustawić prostą ochronę używając pojedynczej nazwy użytkownika i hasła + + + + + + + + + + Dołącz nieopublikowane węzły pochodne (dzieci) + Publikacja w toku - proszę czekać... + Opublikowano %0% z %1% stron... + %0% został opublikowany + %0% oraz podstrony zostały opublikowane + Publikuj %0% ze wszytkimi podstronami + OK , aby publikować % 0% i spowodować upublicznienie całej zawartości.

+ Możesz opublikować tą stronę wraz ze wszystkimi podstronami zaznaczając poniżej publikuj wszystkie węzły pochodne + ]]>
+ + + Nie skonfigurowałeś żadnych zaakceptowanych kolorów + + + Wpisz link zewnętrzny + Wybierz link wewnętrzny + Podpis + Link + Otwórz w nowym oknie + Wpisz nowy podpis + Wpisz link + + + Resetuj + + + Aktualna wersja + Czerwony tekst nie będzie pokazany w wybranej wersji, zielony tekst został dodany]]> + Dokument został przywrócony + Tu widać wybraną wersję jako html, jeżeli chcesz zobaczyć różnicę pomiędzy 2 wersjami w tym samym czasie, użyj podglądu różnic + Cofnij do + Wybierz wersję + Zobacz + + + Edytuj skrypt + + + Concierge + Treść + Kurier + Deweloper + Konfigurator Umbraco + Media + Członkowie + Biuletyny + Ustawienia + Statystyki + Tłumaczenie + Użytkownicy + Pomoc + Formularze + Analizy + + + idź do + Tematy pomocy dla + Rozdziały filmów dla + Najlepsze filmy-samouczki Umbraco + + + Domyślny szablon + Klucz słownika + By zaimportować typ dokumentu, wskaż plik ".udt" na swoim komputerze, klikając przycisk "Przeglądaj" i kliknij "Importuj" (zostaniesz poproszony o potwierdzenie w następnym kroku) + Nazwa nowej zakładki + Typ węzła + Typ + Arkusz styli + Skrypt + Właściwości arkusza styli + Zakładka + Nazwa zakładki + Zakładki + Włączono Główny Typ Treści + Ten Typ Treści używa + jako Główny Typ Treści. Zakładki Głównego Typu Treści nie są wyświetlone i mogą być edytowane jedynie w samym Głównym Typie Treści + Żadne właściwości nie zostały zdefiniowane dla tej zakładki. Kliknij w link "dodaj nową właściwość", który znajduje się na górze strony, aby stworzyć nową właściwość. + Główny Typ Dokumentu + Stwórz pasujący szablon + Dodaj ikonę + + + Porządek sortowania + Data utworzenia + Sortowanie zakończone. + Przesuń poszczególne elementy w górę oraz w dół aż będą w odpowiedniej kolejności lub kliknij na nagłówku kolumny, aby posortować całą kolekcję elementów +
Nie zamykaj tego okna podczas sortowania]]>
+ + + Walidacja + Błędy walidacji muszą zostać naprawione zanim element będzie mógł być zapisany + Nie powiodło się + Niewystarczające uprawnienia użytkownika, nie można zakończyć operacji + Anulowane + Operacja została anulowana przez dodatek firmy trzeciej + Publikacja została przerwana poprzez dodatek firmy trzeciej + Właściwość typu już istnieje + Właściwość typu została utworzona + typ danych: %1%]]> + Właściwość typu została usunięta + Zakładka została zapisana + Zakładkę utworzono + Zakładkę usunięto + Usunięto zakładkę o ID:%0% + Arkusz stylów nie został zapisany + Arkusz stylów został zapisany + Arkusz stylów został zapisany bez żadnych błędów + Typ danych został zapisany + Element słownika został zapisany + Publikacja nie powiodła się, ponieważ rodzic węzła nie jest opublikowany + Treść została opublikowana + i jest widoczna na stronie + Treść została zapisana + Pamiętaj, aby opublikować, aby zmiany były widoczne + Wysłano do zatwierdzenia + Zmiany zostały wysłane do akceptacji + Media zostały zapisane + Media zostały poprawnie zapisane + Członek został zapisany + Właściwość arkusza stylów została zapisana + Arkusz stylów został zapisany + Szablon został zapisany + Błąd przy zapisie danych użytkownika (sprawdź log) + Użytkownik został zapisany + Typ użytkownika został zapisany + Plik nie został zapisany + Plik nie został zapisany. Sprawdź uprawnienia dostępu do pliku + Plik został zapisany + Plik został zapisany bez żadnych błędów + Język został zapisany + Typ mediów został zapisany + Typ członka został zapisany + Skrypt Python nie został zapisany + Wystąpiły błędy, skrypt Python nie może zostać zapisany + Skrypt Python został zapisany + Brak błędów w skrypcie Python + Szablon nie został zapisany + Proszę się upewnić że nie ma dwóch szablonów o tym samym aliasie + Szablon został zapisany + Szablon został zapisany bez żadnych błędów! + Nie zapisano XSLT + XSLT zawiera błędy + Nie można zapisać XSLT, sprawdź uprawnienia dostępu do pliku + Zapisano XSLT + XSLT nie zawiera błedów + Cofnięto publikację treści + Częściowy Widok został zapisany + Częściowy Widok został zapisany bez błędów! + Częściowy Widok nie został zapisany + Wystąpił błąd podczas zapisywania pliku. + Widok skryptu został zapisany + Widok skryptu został zapisany bez błędów! + Widok skryptu nie został zapisany + Wystąpił błąd podczas zapisywania pliku. + Wystąpił błąd podczas zapisywania pliku. + + + Używaj składni CSS np.: h1, .czerwonyNaglowek, .niebieskiTekst + Edytuj arkusz stylów + Edytuj właściwość arkusza stylów + Nazwa dla znalezienia właściwości stylu w edytorze + Podgląd + Style + + + + Edytuj szablon + + Sekcje + Wstaw obszar zawartości + Wstaw miejsce dla obszaru zawartości + + Wstaw + Wybierz, co chcesz wstawić do swojego szablonu + + Wstaw element słownika + Element słownika to miejsce, gdzie można wstawić przetłumaczony tekst, co ułatwia tworzenie projektów dla wielojęzycznych stron. + + Makro + + Makro to konfigurowalny komponent, który sprawdzi się + przy wielokrotnie używanych częściach Twojego projektu, kiedy potrzebujesz opcji dostarczenia parametrów, + takich jak galerie, formularze, czy listy. + + + Wartość + Wyświetla wartość danego pola z bieżącej strony z opcjami modyfikacji wartości lub powrotu do alernatywnych wartości. + + Częściowy Widok + + Częściowy Widok to oddzielny szablon pliku, który może być renderowany wewnątrz innego + szablonu, sprawdzi się w ponownym używaniu markupu lub oddzielaniu złożonych szablonów do oddzielnych plików. + + + Główny szablon + Brak głównego szablonu + Brak głównego + + Renderuj szablon dziecka + + @RenderBody(). + ]]> + + + + Zdefiniuj nazwaną sekcję + + @section { ... }. Może być to renderowane w + określonym obszarze rodzica tego szablonu, poprzez użycie @RenderSection. + ]]> + + + Renderuj nazwaną sekcję + + @RenderSection(name). + To renderuje obszar w szablonie dziecka, który jest opakowany w odpowiednią definicję @section [name]{ ... }. + ]]> + + + Nazwa Sekcji + Sekcja jest wymagana + + Jeśli wymagana, szablon dziecka musi zawierać definicję @section, w przeciwnym przypadku wystąpi błąd. + + + + Konstruktor zapytań + Element zwrócony, w + + Chcę + całą zawartość + zawartość typu "%0%" + z + mojej strony + gdzie + i + + jest + nie jest + przed + przed (włączając wybraną datę) + po + po (włączając wybraną datę) + równa się + nie równa się + zawiera + nie zawiera + większe niż + większe lub równe niż + mniejsze niż + mniejsze lub równe niż + + ID + Nazwa + Data Utworzenia + Data Ostatniej Aktualizacji + + sortuj + rosnąco + malejąco + + Szablon + + + + + Wybierz typ treści + Wybierz układ + Dodaj wiersz + Dodaj zawartość + Upuść zawartość + Zastosowano ustawienia + + Ta zawartość nie jest tu dozwolona + Ta zawartość jest tu dozwolona + + Kliknij, żeby osadzić + Kliknij, żeby dodać obraz + Podpis obrazu... + Pisz tutaj... + + Układy Siatki + Układy to ogólne pole pracy dla edytora siatki, przeważnie będziesz potrzebować tylko jednego lub dwóch różnych układów + Dodaj Układ Siatki + Dostosuj układ przez ustawienie szerokości kolumn i dodanie dodatkowych sekcji + Konfiguracja rzędów + Rzędy to predefiniowane komórki ułożone poziomo + Dodaj konfigurację rzędu + Dostosuj rząd poprzez ustawienie szerokości komórki i dodanie dodatkowych komórek + + Kolumny + Całkowita liczba wszystkich kolumn w układzie siatki + + Ustawienia + Konfiguruj jakie ustawienia może zmieniać edytor + + Style + Konfiguruj jakie style może zmieniać edytor + + Ustawienia zostaną zapisane tylko jeśli wprowadzona konfiguracja json jest prawidłowa + + Zezwól wszystkim edytorom + Zezwól na konfigurację wszystkich rzędów + Ustaw jako domyślne + Wybierz dodatkowe + Wybierz domyślne + zostały dodane + + + + + Kompozycje + Nie dodałeś żadnych zakładek + Dodaj nową zakładkę + Dodaj kolejną zakładkę + Odziedziczone z + Dodaj właściwość + Wymagana etykieta + + Włącz widok listy + Konfiguruje element treści, aby pokazać sortowaną i możliwą do przeszukiwania listę jego dzieci, dzieci nie będą wyświetlone w drzewie + + Dozwolone Szablony + Wybierz, które szablony edytorzy będą mogli używać dla zawartości tego typu + + Zezwól jako korzeń + Zezwól edytorom na tworzenie zawartości tego typu w korzeniu drzewa treści + Tak - zezwól na zawartość tego typu w korzeniu + + Dozwolone typy węzłów dzieci + Zezwól na tworzenie zawartości określonych typów pod zawartością tego typu + + Wybierz węzeł dziecka + + Odziedzicz zakładki i właściwości z istniejącego typu dokumentu. Nowe zakładki będą dodane do bieżącego typu dokumentu lub złączone jeśli zakładka z identyczną nazwą już istnieje. + Ten typ zawartości jest używany w kompozycji, przez co sam nie może być złożony. + Brak możliwych typów zawartości do użycia jako kompozycja. + + Dostępni edytorzy + Użyj ponownie + Ustawienia edytora + + Konfiguracja + + Tak, usuń + + zostało przeniesione poniżej + zostało skopiowane poniżej + Wybierz folder do przeniesienia + Wybierz folder do skopiowania + do w strukturze drzewa poniżej + + Wszystkie typy Dokumentów + Wszystkie Dokumenty + Wszystkie elementy mediów + + używający tego typu dokumentu zostanie usunięty na stałe, proszę potwierdź czy chcesz usunąć także te. + używający tych mediów zostanie usunięty na stałe, proszę potwierdź czy chcesz usunąć także te. + używający tego typu członka zostanie usunięty na stałe, proszę potwierdź czy chcesz usunąć także te + + i wszystkie dokumenty, używające tego typu + i wszystkie media, używające tego typu + i wszyscy członkowie, używający tego typu + + używający tego edytora będzie zaktualizowany o nowe ustawienia + + Członek może edytować + Pokaż na profilu członka + + + + + Pole alternatywne + Tekst alternatywny + Wielkość liter + Kodowanie + Wybierz pole + Konwertuj złamania wiersza + Zamienia złamania wiersza na html-tag &lt;br&gt; + Niestandardowe Pola + Tak, tylko data + Formatuj jako datę + Kodowanie HTML + Zamienia znaki specjalne na ich odpowiedniki HTML + Zostanie wstawione za wartością pola + Zostanie wstawione przed wartością pola + małe znaki + Nic + Wstaw za polem + Wstaw przed polem + Rekurencyjne + Standardowe Pola + Wielkie litery + Kodowanie URL + Formatuje znaki specjalne w URLach + Zostanie użyte tylko wtedy, gdy wartość pola jest pusta + To pole jest używane tylko wtedy, gdy główne pole jest puste + Tak, z czasem. Separator: + + + Zadania przypisane dla Ciebie + przypisane do Ciebie
. Aby zobaczyć szczegółowe informacje wraz z komentarzami, kliknij na "Szczegóły" lub po prostu na nazwę strony. + Możesz również pobrać stronę jako XML poprzez kliknięcie na link "Pobierz XML".
+ Aby zamknąć zadanie tłumaczenia, proszę kliknąć "Zamknij" w podglądzie szczegółowym. + ]]>
+ zamknij zadanie + Szczegóły tłumaczenia + Pobierz wszystkie tłumaczenia jako XML + Pobierz XML + Pobierz XML DTD + Pola + Włączając podstrony + + [%0%] Tłumaczeń dla %1% + Nie znaleziono tłumaczy. Proszę utwórz tłumacza przed wysłaniem zawartości do tłumaczenia + Zadania stworzone przez Ciebie + stworzone przez Ciebie. Aby zobaczyć szczegółowe informacje wraz z komentarzami, + kliknij na "Szczegóły" lub na nazwę strony. Możesz również pobrać stronę jako XML poprzez kliknięcie na link "Pobierz XML". + Aby zamknąć zadanie tłumaczenia, proszę kliknąć "Zamknij" w podglądzie szczegółowym. + ]]> + Strona '%0%' została wysłana do tłumaczenia + Proszę wybrać język, na jaki zawartość powinna zostać przetłumaczona + Wyślij stronę '%0%' do tłumaczenia + Przypisane przez + Zadanie otwarte + Liczba słów + Przetłumacz na + Tłumaczenie zakończone. + Możesz podejrzeć stronę, którą właśnie przetłumaczyłeś, poprzez kliknięcie poniżej. Jeżeli strona oryginalna istnieje, możesz porównać obie wersje + Błąd tłumaczenia, plik XML może być uszkodzony + Opcje tłumaczeń + Tłumacz + Załaduj przetłumaczony XML + + + Cache przeglądarki + Kosz + Utworzone pakiety + Typy danych + Słownik + Zainstalowane pakiety + Zainstaluj skórkę + Zainstaluj Starter Kit + Języki + Zainstaluj pakiet lokalny + Makra + Typy mediów + Członkowie + Grupy członków + Role + Typ członka + Typy dokumentów + Typy relacji + Pakiety + Pakiety + Pliki Python + Zainstaluj z repozytorium + Zainstaluj Runway + Moduły Runway + Pliki skryptowe + Skrypty + Arkusze stylów + Szablony + Pliki XSLT + Analizy + Częściowe Widoki + Pliki Makro Częściowych Widoków + + + Aktualizacja jest gotowa + Gotowe jest %0%, kliknij tutaj, aby pobrać + Brak połączenia z serwerem + Wystąpił błąd podczas sprawdzania aktualizacji. Przeglądnij trace-stack dla dalszych informacji + + + Administrator + Pole kategorii + Zmień hasło! + Nowe hasło + Potwierdź nowe hasło + Możesz zmienić swoje hasło w Umbraco Back Office przez wypełnienie formularza poniżej i kliknięcie przycisku "Zmień hasło" + Kanał zawartości + Opis + Wyłącz użytkownika + Typ dokumentu + Edytor + Wypis + Język + Login + Węzeł początkowy w bibliotece mediów + Sekcje + Wyłącz dostęp do Umbraco + Stare hasło + Hasło + Zresetuj hasło + Twoje hasło zostało zmienione! + Proszę potwierdź nowe hasło! + Wprowadź nowe hasło + Nowe hasło nie może byc puste! + Bieżące hasło + Bieżące hasło jest nieprawidłowe + Nowe hasło i potwierdzenie nowego hasła nie są identyczne. Spróbuj ponownie! + Potwierdzone hasło nie jest identyczne z nowym hasłem! + Zastąp prawa dostępu dla węzłów potomnych + Aktualnie zmieniasz uprawnienia dostępu do stron: + Wybierz strony, którym chcesz zmienić prawa dostępu + Przeszukaj wszystkie węzły potomne + Węzeł początkowy w zawartości + Nazwa użytkownika + Prawa dostępu użytkownika + Typ + Typy użytkowników + Pisarz + Tłumacz + Zmień + Twój profil + Twoja historia + Sesja wygaśnie za + + + Walidacja + Waliduj jako e-mail + Waliduj jako numer + Waliduj jako URL + ...lub wpisz niestandardową walidację + Pole jest wymagane + + + + Wartość jest ustawiona na rekomendowaną wartość: '%0%'. + Wartość została ustawiona na '%1%' dla XPath '%2%' w pliku konfiguracyjnym '%3%'. + Oczekiwana jest wartość '%1%' dla '%2%' w pliku konfiguracyjnym '%3%', ale znaleziono '%0%'. + Znaleziono nieoczekiwaną wartość '%0%' dla '%2%' w pliku konfiguracyjnym '%3%'. + + + Niestandardowe błędy są ustawione na '%0%'. + Niestandardowe błędy są obecnie ustawione na '%0%'. Zaleca się ustawienie ich na '%1%' przed wypuszczeniem strony na produkcję. + Niestandardowe błędy zostały z powodzeniem ustawione na '%0%'. + + MacroErrors są ustawione na '%0%'. + MacroErrors są ustawione na '%0%' co uniemożliwi częściowe lub całkowite załadowanie stron w Twojej witrynie jeśli wystąpią jakiekolwiek błędy w makro. Korekta ustawi wartość na '%1%'. + MacroErrors są teraz ustawione na '%0%'. + + + Try Skip IIS Custom Errors jest ustawione na '%0%' a Ty używasz IIS w wersji '%1%'. + Try Skip IIS Custom Errors wynosi obecnie '%0%'. Zalecane jest ustawienie go na '%1%' dla Twojego IIS w wersji (%2%). + Try Skip IIS Custom Errors ustawiono z powodzeniem na '%0%'. + + + Plik nie istnieje: '%0%'. + '%0%' w pliku konfiguracyjnym '%1%'.]]> + Wystąpił błąd, sprawdź logi, aby wyświetlić pełen opis błędu: %0%. + + Członkowie - Suma XML: %0%, Suma: %1%, Suma niepoprawnych: %2% + Media - Suma XML: %0%, Suma: %1%, Suma niepoprawnych: %2% + Zawartość - Suma XML: %0%, Suma opublikowanych: %1%, Suma niepoprawnych: %2% + + Certifikat Twojej strony został oznaczony jako poprawny. + Błąd walidacji certyfikatu: '%0%' + Błąd pingowania adresu URL %0% - '%1%' + Oglądasz %0% stronę używając HTTPS. + appSetting 'umbracoUseSSL' został ustawiony na 'false' w Twoim pliku web.config. Po uzyskaniu dostępu do strony, używając HTTPS, powinieneś go ustawić na 'true'. + appSetting 'umbracoUseSSL' został ustawiony na '%0%' w Twoim pliku web.config, Twoje ciasteczka są %1% ustawione jako bezpieczne. + Nie można zaktualizaować ustawień 'umbracoUseSSL' w Twoim pliku web.config file. Błąd: %0% + + + Włącz HTTPS + Ustawia umbracoSSL na 'true' w appSettings pliku web.config. + appSetting 'umbracoUseSSL' jest teraz ustawione na 'true' w Twoim pliku web.config, Twoje ciasteczka będą oznaczone jako bezpieczne. + + Napraw + Nie można naprawić sprawdzenia z wartością typu porównania 'ShouldNotEqual'. + Nie można naprawić sprawdzenia z wartością typu porównania 'ShouldEqual' z wprowadzoną wartością. + Nie wprowadzono wartości do naprawy sprawdzenia. + + Tryb kompilacji debugowania jest wyłączony. + Tryb kompilacji debugowania jest obecnie włączony. Zaleca się wyłączenie tego ustawienia przed wypuszczeniem strony na produkcję. + Tryb komplikacji debugowania został wyłączony z powodzeniem. + + Tryb śledzenia jest wyłączony. + Tryb śledzenia jest obecnie włączony. Zaleca się wyłączenie tego ustawienia przed wypuszczeniem strony na produkcję. + Tryb śledzenia został wyłączony z powodzeniem + + Wszystkie foldery mają ustawione poprawne ustawienia. + + %0%.]]> + %0%. Jeśli nie będzie nic w nich pisane, żadne działania nie muszą być podejmowane.]]> + + Wszystkie pliki mają ustawione poprawne uprawnienia. + + %0%.]]> + %0%. Jeśli nie będzie nic w nich pisane, żadne działania nie muszą być podejmowane.]]> + + X-Frame-Options używany do kontrolowania czy strona może być IFRAME'owana przez inną został znaleziony.]]> + X-Frame-Options używany do kontrolowania czy strona może być IFRAME'owana przez inną nie został znaleziony.]]> + Ustaw nagłówek w Config + Dodaje wartość do sekcji httpProtocol/customHeaders pliku web.config, aby zapobiec IFRAME'owania strony przez inne witryny. + Ustawienie do tworzenia nagłówka, zapobiegającego IFRAME'owania strony przez inne witryny zostało dodane do Twojego pliku web.config. + Nie można zaktualizować pliku web.config. Błąd: %0% + + + %0%.]]> + Nie znaleziono żadnych nagłówków, ujawniających informacji o technologii strony. + + Nie znaleziono system.net/mailsettings w pliku Web.config. + Host nie jest skonfigurowany w sekcji system.net/mailsettings pliku Web.config. + Ustawienia SMTP są skonfigurowane poprawnie i serwis działa według oczekiwań. + Nie można połączyć się z serwerem SMTP skonfigurowanym z hostem '%0%' i portem '%1%'. Proszę sprawdzić ponownie, czy ustawienia system.net/mailsettings w pliku Web.config są poprawne. + + %0%.]]> + %0%.]]> + + + Wyłącz śledzenie URL + Włącz śledzenie URL + Oryginalny URL + Przekierowane do + Nie stworzono żadnych przekierowań + Kiedy nazwa opublikowanej strony zostanie zmieniona lub zostanie ona przeniesiona, zostanie stworzone automatyczne przekierowanie na nową stronę. + Usuń + Czy jesteś pewien, że chcesz usunąć przekierowanie z '%0%' do '%1%'? + Przekierowanie URL zostało usunięte. + Wystąpił błąd podczas usuwania przekierowania URL. + Czy jesteś pewien, że chcesz wyłączyć śledzenie URL? + Śledzenie URL zostało wyłączone. + Wystąpił błąd podczas wyłączania śledzenia URL, więcej informacji znajdziesz w pliku z logami. + Śledzenie URL zostało włączone. + Wystąpił błąd podczas włączania śledzenia URL, więcej informacji znajdziesz w pliku z logami. + + + Brak elementów słownika do wyboru + +
diff --git a/src/UmbracoUrlHandling/Umbraco/Config/Lang/pt.xml b/src/UmbracoUrlHandling/Umbraco/Config/Lang/pt.xml new file mode 100644 index 0000000..9001ae5 --- /dev/null +++ b/src/UmbracoUrlHandling/Umbraco/Config/Lang/pt.xml @@ -0,0 +1,906 @@ + + + + The Umbraco community + http://our.umbraco.org/documentation/Extending-Umbraco/Language-Files + + + Gerenciar hostnames + Caminho de Auditoria + Navegar o Nó + Copiar + Criar + Criar Pacote + Remover + Desabilitar + Esvaziar Lixeira + Exportar Tipo de Documento + Exportar para .NET + Exportar para .NET + Importar Tipo de Documento + Importar Pacote + Editar na Tela + Sair + Mover + Notificações + Acesso público + Publicar + Recarregar nós + Republicar site inteiro + Permissões + Reversão + Enviar para Publicação + Enviar para Tradução + Classificar + Enviar para publicação + Traduzir + Atualizar + + + Adicionar novo Domínio + Domínio + Novo domínio '%0%' foi criado + Domínio '%0%' foi removido + Domínio '%0%' já foi designado + ou seja: seudominio.com, www.seudominio.com + Domínio '%0%' foi atualizado + Editar Domínios Atuais + + + Visão para + + + Negrito + Remover Travessão de Parágrafo + Inserir campo de formulário + Inserir manchete de gráfico + Editar Html + Travessão de Parágrafo + Itálico + Centro + Justificar à Esquerda + Justificar à Direita + Inserir Link + Inserir link local (âncora) + Lista de tópicos + Lista numérica + Inserir macro + Inserir figura + Editar relacionamentos + Salvar + Salvar e publicar + Salvar e mandar para aprovação + Prévia + Escolha estilo + Mostrar estilos + Inserir tabela + + + Sobre esta página + Link alternativo + (como você descreveria a imagem pelo telefone) + Links Alternativos + Clique para editar este item + Criado por + Criado + Tipo de Documento + Editando + Remover em + Este item foi alterado após a publicação + Este item não está publicado + Última publicação + Tipo de Mídia + Grupo do Membro + Função + Tipo de Membro + Nenhuma data escolhida + Título da Página + Propriedades + Este documento está publicado mas não está visível porque o pai '%0%' não está publicado + Publicar + Status da Publicação + Publicado em + Remover Data + Ordem de classificação está atualizada + Para classificar os nós simplesmente arraste os nós ou clique em um dos títulos de colunas. Você pode selecionar múltiplos nós ao pressionar e segurar 'shift' ou 'control' durante a seleção + Estatísticas + Título (opcional) + Tipo + Des-Publicar + Última edição + Remover arquivo + Link ao documento + + + Onde você quer criar seu novo(a) %0% + Criado em + Escolha um tipo e um título + + + Navegue seu site + - Esconder + Se Umbraco não estiver abrindo talvez você precise hablitar pop-ups para este site + foi aberto em uma nova janela + Reiniciar + Visitar + Bem Vindo(a) + + + Stay + Discard changes + You have unsaved changes + Are you sure you want to navigate away from this page? - you have unsaved changes + + + Done + + Deleted %0% item + Deleted %0% items + Deleted %0% out of %1% item + Deleted %0% out of %1% items + + Published %0% item + Published %0% items + Published %0% out of %1% item + Published %0% out of %1% items + + Unpublished %0% item + Unpublished %0% items + Unpublished %0% out of %1% item + Unpublished %0% out of %1% items + + Moved %0% item + Moved %0% items + Moved %0% out of %1% item + Moved %0% out of %1% items + + Copied %0% item + Copied %0% items + Copied %0% out of %1% item + Copied %0% out of %1% items + + + Nome + Gerenciar hostnames + Fechar esta janela + Certeza em remover + Certeza em desabilitar + Favor selecionar esta caixa para confirmar a remoção de %0% item(s) + Tem certeza + Tem certeza? + Cortar + Editar Item de Dicionário + Editar Linguagem + Inserir link local + Inserir charactere + Inserir manchete de gráfico + Inserir figura + Inserir Link + Inserir Macro + Inserir tabela + Última Edição + Link + Link interno: + Ao usar links locais insira "#" na frente do link + Abrir em nova janela? + Configurações de Macro + Este macro não contém nenhuma propriedade que possa ser editada + Colar + Editar Permissões para + Os itens na lixeira agora estão sendo removidos. Favor não fechar esta janela enquanto este processo é concluído + A lixeira agora está vazia + Quando itens são removidos da lixeira estes somem para sempre + regexlib.com está no momento sofrendo dificuldades dos quais não temos controle. Pedimos desculpas pela inconveniência.]]> + Busque por uma expressão regular para adicionar validação à um campo de formulário. Exemplo: 'email', 'zip-code' (código postal), 'url' + Remover Macro + Campo obrigatório + Site foi re-indexado + O cache do website foi atualizado. Todo conteúdo publicado está atualizado agora. No entanto, todo conteúdo não publicado ainda permanecerá invisível + O cache do website será atualizado. Todo conteúdo publicado será atualizado, enquanto o conteúdo que não foi publicado permanecerá invisível + Número de colunas + Número de linhas + Defina uma id de espaço reservado definindo uma ID em seu espaço reservado você pode injetar conteúdo dentro deste modelo desde modelos filhos usando esta ID como referência dentro de um elemento <asp:content />]]> + Selecione uma id de espaço reservado da lista abaixo. Você pode escolher somente as IDs em seu modelo mestre atual.]]> + Clique para ver a imagem em seu tamanho original + Escolha item + Ver Item em Cache + + + %0%' abaixo
Você pode adicionar mais linguagens sob 'linguagens' no menu à esquerda]]>
+ Nome da Cultura + + + Tipos de nós filhos permitidos + Criar + Remover guia + Descrição + Nova guia + Guia + Miniatura + + + Adicionar valor prévio + Tipo de Dados do Banco de Dados + GUID do Editor de Propriedades + Editor de Propriedades + Botões + Habilitar configurações avançadas para + Habilitar menu de contexto + Tamanho padrão máximo para imagens inseridas + Stylesheets relacionadas + Mostrar Rótulo + Largura e altura + + + Seus dados foram salvos mas antes que possa publicar esta página existem alguns erros que precisam ser concertados: + O provedor de membros (Membership provider) atual não suporta alterações de senha (EnablePasswordRetrieval tem que estar definica como true) + %0% já existe + Houve erros: + Houve erros: + A senha deve ter no mínimo %0% caracteres e conter pelo menos %1% caractere(s) não alfa-númérico + %0% tem que ser um inteiro + O campo %0% na guia %1% é mandatório + %0% é um campo mandatório + %0% em %1% não está no formato correto + %0% não está em um formato correto + + + NOTA! Mesmo que CodeMirror esteja habilitado pela configuração o mesmo foi desabilitado em Internet Explorer pois não é estável o suficiente. + Favor preencher ambos apelidos e nome na sua nova propriedade de tipo! + Houve um erro com o acesso de ler/escrever em um arquivo ou pasta específica + Favor digitar um título + Favor escolher um tipo + Você está prestes a tornar esta figura maior que o tamanho original. Tem certeza que deseja proceguir? + Erro no script python + O script pyton não foi salvo por que contém erro(s) + Nó inicial removido, favor entrar em contato com seu administrador + Favor marcar conteúdo antes de alterar o estilo + Nenhum estilo ativo disponível + Favor colocar o cursos à esquerda das duas células que deseja mesclar + Você não pode dividir uma célula que não foi mesclada. + Erro na fonta XSLT + O XSLT não foi salvo porque contém erro(s) + + + Sobre + Ação + Adicionar + Apelido + Tem certeza? + Borda + por + Cancelar + Margem da célula + Escolher + Fechar + Fechar Janela + Comentário + Confirmar + Restrições de proporções + Continuar + Copiar + Criar + Banco de Dados + Data + Padrão + Remover + Removido + Removendo... + Desenho + Dimensões + Abaixo + Download + Editar + Editado + Elementos + Email + Erro + Buscar + Altura + Ajuda + Ícone + Importar + Margem interna + Inserir + Instalar + Justificar + Idioma + Esboço + Carregando + Travado + Login + Sair + Logout + Macro + Mover + Nome + Novo + Próximo + Não + de + OK + Abrir + ou + Senha + Caminho + ID do Espaço Reservado + Um momento por favor... + Prévio + Propriedades + Email para receber dados do formulário + Lixeira + Remanescentes + Renomear + Renovar + Tentar novamente + Permissões + Busca + Servidor + Mostrar + Mostrar página durante envio + Tamanho + Classificar + Submit + Tipo + Digite para buscar... + Acima + Atualizar + Atualizar + Subir (Upload) + Url + Usuário + Usuário + Valor + Ver + Bem Vindo(a)... + Largura + Sim + Reorder + I am done reordering + + + Cor de fundo + Negrito + Cor do Texto + Fonte + Texto + + + Página + + + O instalador não pôde conectar-se ao banco de dados. + Não foi possível salvar o arquivo web.config. Favor modificar a linha de conexão manualmente. + Seu banco de dados foi encontrado e identificado como + Configuração do Banco de Dados + instalar para instalar o banco de dados do Umbraco %0%]]> + Próximo para prosseguir.]]> + Banco de dados não encontrado! Favor checar se a informação no "connection string" do "web.config" esteja correta.

+

Para prosseguir, favor editar o arquivo "web.config" (usando Visual Studio ou seu editor de texto favorito), role até embaixo, adicione a connection string para seu banco de dados com a chave de nome "UmbracoDbDSN" e salve o arquivo

+

Clique o botão tentar novamente quando terminar.
+ Mais informações em como editar o web.config aqui.

]]>
+ Favor contatar seu provedor de internet ou hospedagem web se necessário. Se você estiver instalando em uma máquina ou servidor local é possível que você precise dessas informações por um administrador de sistema.]]> + + Pressione o botão atualizar para atualizar seu banco de dados para Umbraco %0%

+

+ Não se preocupe - nenhum conteúdo será removido e tudo estará funcionando depois disto!

+ + ]]>
+ Pressione Próximo para prosseguir.]]> + próximo para continuar com o assistente de configuração]]> + A senha do usuário padrão precisa ser alterada!]]> + O usuário padrão foi desabilitado ou não tem acesso à Umbraco!

Nenhuma ação posterior precisa ser tomada. Clique Próximo para prosseguir.]]> + A senha do usuário padrão foi alterada com sucesso desde a instalação!

Nenhuma ação posterior é necessária. Clique Próximo para prosseguir.]]> + Senha foi alterada! + + Umbraco cria um usuário padrão com o login ('admin') e senha ('default'). É importante que a senha seja alterada para algo único. +

+

+ Este passo irá checar a senha do usuário padrão e sugerir uma alteração se necessário. +

+ + ]]>
+ Comece com o pé direito, assista nossos vídeos introdutórios + Ao clicar no próximo botão (ou modificando o UmbracoConfigurationStatus no web.config), você aceita a licença deste software cmo especificado na caixa abaixo. Note que esta distribuição de Umbraco consiste em duas licenças diferentes, a licença aberta MIT para a framework e a licença de software livre (freeware) Umbraco que cobre o UI. + Nenhum instalado ainda. + Pastas e arquivos afetados + Mais informações em como configurar permissões para Umbraco aqui + Você precisa conceder permissão de modificação ASP.NET aos seguintes arquivos/pastas + Suas permissões estão quase perfeitas!

+Você pode correr Umbraco sem problemas, mas não vai ser capaz de instalar pacotes que são recomendados para tirar total vantagem de Umbraco.]]>
+ Como Resolver + Clique aqui para ler a versão texto + vídeo tutorial sobre configuração de permissões de pastas para Umbraco ou leia a versão texto.]]> + Suas permissões podem ser um problema! +

+Você pode correr Umbraco sem problemas mas não será capaz de criar pastas ou instalar pacotes que são recomendados para tirar total vantagem de Umbraco.]]>
+ Suas permissões não estão prontas para Umbraco! +

+Para correr Umbraco você vai precisar atualizar as configurações de permissões.]]>
+ Suas configurações de permissões estão perfeitas!

Você está pronto para correr o Umbraco e instalar pacotes!]]>
+ Resolvendo problemas de pastas + Siga este link para mais informações sobre problemas com ASP.NET e criação de pastas + Configurando permissões de pastas + + Eu quero começar do zero + learn how) + Você ainda pode escolher instalar Runway mais tarde. Favor ir à seção Desenvolvedor e selecione pacotes.]]> + Você acabou de configurar uma plataforma Umbraco limpa. O que deseja fazer a seguir? + Runway está instalado + +Esta é nossa lista de módulos recomendados, selecione os que gostaria de instalar, ou veja a lista completa de módulos]]> + Somente recomendado para usuários experientes + Eu quero começar com um site simples + + "Runway" é um website simples que provê alguns documentos básicos e modelos. O instalador pode configurar Runway automaticamente mas você pode editar facilmente, extender ou removê-lo. Não é necessário e você pode perfeitamente usar Umbraco sem ele. +No entanto, Runway oferece uma fundação básica sobre melhores práticas em como começar o mais rápido possível. +Se escolher instalar Runway você pode opcionalmente selecionar blocos de construção básicos chamados módulos Runway para melhorar suas páginas Runway.

+ + Incluso com Runway: Página Inicial, Começando, Instalando Módulos.
+ Módulos Opcionais: Navegação de Topo, Mapa de Site, Contato, Galeria. +
+ + ]]>
+ O que é Runway + Passo 1/5 Aceitar Licença + Passo 2/5: Configuração do Banco de Dados + Passo 3/5: Validando Permissões de Arquivos + Passo 4/5: Checar segurança Umbraco + Passo 5/5: Umbraco está pronto para ser usado + Obrigado por escolher Umbraco + Navegue seu site +Você instalou Runway, então por que não ver como é seu novo website.]]> + Ajuda adicional e informações +Consiga ajuda de nossa comunidade ganhadora de prêmios, navegue a documentação e assista alguns vídeos grátis sobre como construir um site simples, como usar pacotes e um guia prático sobre a terminologia Umbraco]]> + Umbraco %0% está instalado e pronto para uso + web.config e atualizar a chave AppSettings UmbracoConfigurationStatus no final para '%0%'.]]> + iniciar instantâneamente clicando em "Lançar Umbraco" abaixo.
Se você é novo com Umbraco você pode encontrar vários recursos em nossa página para iniciantes.]]>
+ Lançar Umbraco +Para gerenciar seu website, simplesmente abra a área administrativa do Umbraco para começar adicionando conteúdo, atualizando modelos e stylesheets e adicionando nova funcionalidade]]> + Conexão ao banco falhou. + Umbraco Versão 3 + Umbraco Versão 4 + Assistir + Umbraco %0% para uma nova instalação ou atualizando desde verão 3.0. +

+Pressione "próximo" para iniciar o assistente.]]>
+ + + Código da Cultura + Nome da Cultura + + + Você está inativo e logout irá ocorrer automaticamente em + Renovar agora para salvar seu trabalho + + + © 2001 - %0%
umbraco.com

]]>
+ Bem vindo(a) à Umbraco, digite seu nome de usuário e senha nas caixas abaixo: + + + Painel + Seções + Conteúdo + + + Escolha página acima... + %0% foi copiado para %1% + Selecione onde o documento %0% deve ser copiado abaixo + %0% foi movido para %1% + Selecione onde o documento %0% dever ser movido abaixo + foi selecionado como raíz do seu novo conteúdo, clique 'ok' abaixo. + Nenhum nó selecionado, favor selecionar um nó na lista acima antes de clicar em 'ok' + O nó atual não é permitido embaixo do nó escolhido por causa de seu tipo + O nó atual não pode ser movido para uma de suas sub-páginas + TRANSLATE ME: 'The action isn't allowed since you have insufficient permissions on 1 or more child documents.' + + + Editar sua notificação para %0% + + Olá %0%

+ +

Esta é uma mensagem automatizada para informar que a tarefa '%1%' + foi completada na página '%2%' + pelo usuário '%3%' +

+ +

+

Resumo da Atualização:

+ + %6% +
+

+ + + +

Tenha um bom dia!

+ Saudações do robô Umbraco +

+ ]]>
+ [%0%] Notificação sobre %1% realizada em %2% + Notificações + + + e localizando o pacote. Pacotes Umbraco tem extensão ".umb" ou ".zip".]]> + Autor + Demonstração + Documentação + Dado meta do pacote + Nome do pacote + Pacote não contém nenhum item +
+Você pode remover com segurança do seu sistema clicando em "desinstalar pacote" abaixo.]]>
+ Nenhuma atualização disponível + Oções do pacote + Leia-me do pacote + Repositório do pacote + Confirmar desinstalação + Pacote foi desinstalado + O pacote foi desinstalado com sucesso + Desinstalar pacote + +Aviso: quaisquer documentos, mídia, etc dependentes dos itens que forem removidos vão parar de funcionar e podem levar à instabilidade do sistema. Então desinstale com cuidado. Se tiver dúvidas, contate o autor do pacote]]> + Baixar atualização pelo repositório + Atualizar pacote + Instruções de atualização + Há uma atualizaçào disponível para este pacote. Você pode baixá-lo diretamente do repositório de pacotes do Umbraco. + Versão do pacote + Ver website do pacote + + + Colar com formatação completa (Não recomendado) + O texto que você está tentando colar contém caracteres ou formatação especial. Isto pode ser causado ao copiar textos diretamente do Microsoft Word. Umbraco pode remover os caracteres ou formatação especial automaticamente para que o conteúdo colado seja mais adequado para a internet. + Colar como texto crú sem nenhuma formatação + Colar, mas remover formatação (Recomendado) + + + Proteção baseada em função + usando grupos de membros do Umbraco.]]> + Você precisa criar um grupo de membros antes que possa usar autenticação baseada em função. + Página de Erro + Usado quando as pessoas estão logadas, mas não para ter acesso + Escolha como restringir o acesso à esta página + %0% agora está protegido + Proteção removida de %0% + Página de Login + Escolha a página que tem o formulário de login + Remover Proteção + Selecione as páginas que contém o formulário de login e mensagens de erro + Escolha as funções que terão acesso à esta página + Defina o login e senha para esta página + Proteção à um usuário específico + Se você deseja configurar proteção simples usando somente um usuário e senha + + + %0% não pode ser publicado devido à uma extensão de terceiros que cancelou a ação. + Incluir páginas filhas ainda não publicadas + Publicação em progresso - favor aguardar... + %0% de %1% páginas foram publicadas... + %0% foi publicada + %0% e sub-páginas foram publicadas + Publicar %0% e todoas suas sub-páginas + ok para publicar %0% e assim fazer com que seu conteúdo se torne disponível.

+Você pode publicar esta página e todas suas sub-páginas ao selecionar publicar todos filhos abaixo.]]>
+ + + Adicionar link externo + Adicionar link interno + Adicionar + Legenda + Página interna + URL + Mover Abaixo + Mover Acima + Abrir em nova janela + Remover Link + + + Versão atual + Texto vermelho não será mostrado na versão selecionada; verde significa adicionado]]> + Documento foi revertido + Isto mostra a versão selecionada como html se você deseja ver as diferenças entre as 2 versões ao mesmo tempo use a visão em diff + Reverter à + Selecione versão + Ver + + + Editar arquivo de script + + + Porteiro + Conteúdo + Mensageiro + Desenvolvedor + Assistente de Configuração Umbraco + Mídia + Membros + Boletins Informativos + Configurações + Estatísticas + Tradução + Usuários + + + Modelo padrão + Chave do Dicionário + Para importar um tipo de documento encontre o arquivo ".udt" em seu computador clicando em "Navegar" e depois clicando em "Importar"(você pode confirmar na próxima tela) + Novo Título da Guia + Tipo de Nó + Tipo + Stylesheet + Propriedade de Stylesheet + Guia + Título da Guia + Guias + + + Sort order + Creation date + Classificação concluída. + Arraste os diferentes itens para cima ou para baixo para definir como os mesmos serão arranjados. Ou clique no título da coluna para classificar a coleção completa de itens +
Não feche esta janela durante a classificação]]>
+ + + Publicação foi cancelada por add-in de terceiros + Tipo de propriedade já existe + Tipo de propriedade criada + Tipo de Dado: %1%]]> + Tipo de propriedade removido + Tipo de Documento salvo + Guia criada + Guia removida + Guia com ID: %0% removida + Stylesheet não salva + Stylesheet salva + Stylesheet salva sem nenhum erro + Typo de Dado salvo + Item de Dicionário salvo + Publicação falhou porque a página pai não está publicada + Conteúdo publicado + e visível no website + Conteúdo salvo + Lembre-se de publicar para tornar as mudanças visíveis + Enviado para Aprovação + Alterações foram enviadas para aprovação + Membro salvo + Propriedade de Stylesheet salva + Stylesheet salva + Modelo salvo + Erro ao salvar usuário (verificar log) + Usuário Salvo + Arquivo não salvo + Arquivo não pode ser salvo. Favor checar as permissões do arquivo + Arquivo salvo + Arquivo salvo sem nenhum erro + Linguagem salva + Script Python não salvo + Script python não pode ser salvo devido à erro + Script Python salvo + Nenhum erro no script python + Modelo não salvo + Favor confirmar que não existem 2 modelos com o mesmo apelido + Modelo salvo + Modelo salvo sem nenhum erro! + XSLT não salvo + XSLT continha um erro + XSLT não pode ser salvo, cheque as permissões do arquivo + XSLT salvo + Nenhum erro no XSLT + + + Use sintaxe CSS ex: h1, .redHeader, .blueTex + Editar stylesheet + Editar propriedade do stylesheet + Nome para identificar a propriedade de estilo no editor de texto rico (richtext) + Prévia + Estilos + + + Editar modelo + Inserir área de conteúdo + Inserir área de conteúdo em espaço reservado + Inserir item de dicionário + Inserir Macro + Inserir campo de página Umbraco + Modelo mestre + Guia rápido para etiquetas de modelos Umbraco + Modelo + + + Choose type of content + Choose a layout + Add a row + Add content + Drop content + Settings applied + + This content is not allowed here + This content is allowed here + + Click to embed + Click to insert image + Image caption... + Write here... + + Grid Layouts + Layouts are the overall work area for the grid editor, usually you only need one or two different layouts + Add Grid Layout + Adjust the layout by setting column widths and adding additional sections + Row configurations + Rows are predefined cells arranged horizontally + Add row configuration + Adjust the row by setting cell widths and adding additional cells + + Columns + Total combined number of columns in the grid layout + + Settings + Configure what settings editors can change + + Styles + Configure what styling editors can change + + Settings will only save if the entered json configuration is valid + + Allow all editors + Allow all row configurations + + + Campo alternativo + Texto alternativo + Letra Maíscula ou minúscula + Escolha campo + Converter Quebra de Linhas + Substitui quebra de linhas com a etiqueta html &lt;br&gt; + Sim, Data somente + Formatar como data + Codificar HTML + Vai substituir caracteres especiais por seus equivalentes em HTML. + Será inserida após o valor do campo + Será inserida antes do valor do campo + Minúscula + Nenhum + Inserir após campo + Inserir antes do campo + Recursivo + Maiúscula + Codificar URL + Vai formatar caracteres especiais em URLs + Será usado somente quando os valores nos campos acima estiverem vazios + Este campo somente será usado se o campo primário estiver em vazio + Sim, com hora. Separador: + + + Tarefas designadas à você + designadas à você. Para ver os detalhes, incluinddo comentários, clique em "Detalhes" ou no nome da página. +Você também pode baixar a página como XML ao clicar no link "Download XML".
+Para fechar a tarefa de tradução vá até os detalhes e clique no botão "Fechar".]]>
+ fechar tarefa + Detalhes da Tradução + Download todas as tarefas de tradução como xml + Download Xml + Download Xml DTD + Campos + Incluir sub-páginas + + Tarefa de tradução [%0%] para %1% + Nenhum usuário tradutor encontrado. Favor criar um usuário tradutor antes que possa começar a enviar conteúdo para tradução + Tarefas criadas por você + criadas por você. Para ver os detalhes, incluindo comentários, clique em "Detalhes" ou no nome da página. Você também pode baixar a página em XML ao clicar no link "Download XML". +Para fechar a tarefa de tradução vá até os detalhes e clique no botão "Fechar".]]> + A página '%0%' foi enviada para tradução + Enviar página '%0%' para tradução + Designada por + Tarefa aberta + Total de palavras + Traduzir para + Tradução concluída. + Você pode visualizar as páginas que acaba de traduzir ao clicar abaixo. Se a página original for encontrada você poderá fazer a comparação entre as 2 páginas. + Tradução falhou, o arquivo xml pode estar corrupto + Opções de Tradução + Tradutor + Upload Xml de Tradução + + + Navegador de Cache + Lixeira + Pacotes criados + Tipo de Dado + Dicionário + Pacotes instalados + Instalar tema + Instalar kit de iniciante + Linguagens + Instalar pacote local + Macros + Tipos de Mídia + Membros + Grupos de Membros + Funções + Tipo de Membro + Tipos de Documentos + Pacotes + Pacotes + Arquivos Python + Instalar desde o repositório + Instalar Runway + Módulos Runway + Arquivos de Script + Scripts + Stylesheets + Modelos + Arquivos XSLT + + + Nova atualização pronta + %0% está pronto, clique aqui para download + Nenhuma conexão ao servidor + Erro ao procurar por atualização. Favor revisar os detalhes (stack-trace) para mais informações + + + Administrador + Campo de Categoria + Alterar Sua Senha + você pode alterar sua senha para acessar a área administrativa do Umbraco preenchendo o formulário abaixo e clicando no botão 'Alterar Senha' + Canal de Conteúdo + Campo de descrição + Desabilitar Usuário + Tipo de Documento + Editor + Campo de excerto + Linguagem + Login + Nó Inicial na Biblioteca de Mídia + Seções + Desabilitar Acesso Umbraco + Senha + Sua senha foi alterada! + Favor confirmar sua nova senha + Digite sua nova senha + Sua nova senha não pode estar em branco! + Há uma diferença entre a nova senha e a confirmação da senha. Favor tentar novamente! + A confirmação da senha não é igual à nova senha! + Substituir permissões do nó filho + Vocês está modificando permissões para as páginas no momento: + Selecione páginas para modificar suas permissões + Buscar todos filhos + Nó Inicial do Conteúdo + Nome de Usuário + Permissões de usuário + Tipo de usuário + Tipos de usuários + Escrevente + +
diff --git a/src/UmbracoUrlHandling/Umbraco/Config/Lang/ru.xml b/src/UmbracoUrlHandling/Umbraco/Config/Lang/ru.xml new file mode 100644 index 0000000..64276d4 --- /dev/null +++ b/src/UmbracoUrlHandling/Umbraco/Config/Lang/ru.xml @@ -0,0 +1,1607 @@ + + + + The Umbraco community + http://our.umbraco.org/documentation/Extending-Umbraco/Language-Files + + + Языки и домены + История исправлений + Просмотреть + Изменить тип документа + Копировать + Создать + Создать пакет + Значение по умолчанию + Удалить + Отключить + Очистить корзину + Экспортировать + Импортировать + Импортировать пакет + Править на месте + Выйти + Переместить + Уведомления + Публичный доступ + Опубликовать + Обновить узлы + Опубликовать весь сайт + Установить разрешения для страницы '%0%' + Выберите, куда переместить + В структуре документов ниже + Восстановить + Разрешения + Откатить + Направить на публикацию + Направить на перевод + Сортировать + Направить на публикацию + Перевести + Скрыть + Обновить + + + Добавить новый домен + Домен + Создан новый домен '%0%' + Домен '%0%' удален + Домен с именем '%0%' уже существует +
Также здесь допустимы части адресов URL первого уровня, например "example.com/en", + однако их следует по возможности избегать. Рекомендуется использовать настройку культуры (языка), расположенную выше.]]>
+ Домен '%0%' обновлен + Такой домен уже назначен. + Унаследовать + Недопустимый формат домена. + Недопустимый узел. + Язык + Править существующие домены + Недостаточно полномочий. + удалить + Домены + Язык (культура) + или унаследуйте язык от родительских узлов.
+ Эта установка будет применена также и к текущему узлу, если только для него ниже явно не задан домен.]]>
+ + + Наблюдать за + + + Завершено + + Удален %0% элемент + Удалено %0% элементов + Удален %0% из %1% элементов + Удалено %0% из %1% элементов + + Опубликован %0% элемент + Опубликовано %0% элементов + Опубликован %0% из %1% элементов + Опубликовано %0% из %1% элементов + + Скрыт %0% элемент + Скрыто %0% элементов + Скрыт %0% из %1% элементов + Скрыто %0% из %1% элементов + + Перенесен %0% элемент + Перенесено %0% элементов + Перенесен %0% из %1% элементов + Перенесено %0% из %1% элементов + + Скопирован %0% элемент + Скопировано %0% элементов + Скопирован %0% из %1% элементов + Скопировано %0% из %1% элементов + + + Полужирный + Снять выбор + Уменьшить отступ + Вставить поле формы + Сгенерировать модели + Вставить графический заголовок + Править исходный код HTML + Увеличить отступ + Курсив + По центру + По левому краю + По правому краю + Вставить ссылку + Вставить якорь (локальную ссылку) + Маркированный список + Нумерованный список + Вставить макрос + Вставить изображение + Править связи + Вернуться к списку + Сохранить + Сохранить и построить модели + Сохранить и опубликовать + Сохранить и направить на публикацию + Сохранить список + Выбрать + Выбрать текущую папку + Предварительный просмотр + Предварительный просмотр запрещен, так как документу не сопоставлен шаблон + Другие действия + Выбрать стиль + Показать стили + Вставить таблицу + + + Чтобы сменить тип документа для выбранного узла, сначала выберите тип из списка разрешенных для данного расположения. + Затем подтвердите и/или исправьте сопоставление свойств текущего типа документа свойствам нового и нажмите "Сохранить". + Документ переопубликован. + Текущее свойство + Текущий тип + Тип документа не может быть изменен, так как для данного расположения нет разрешенных альтернатив. + Альтернативный тип станет доступным, если его разрешить как тип, пригодный для создания дочерних узлов внутри родительского узла данного документа. + Тип документа изменен + Сопоставление свойств + Сопоставлено свойству + Новый шаблон + Новый тип + нет + Узел + Выберите новый тип документа + Тип документа выбранного узла успешно изменен на [new type] и следующие свойства были перенесены: + в + Невозможно закончить перенос свойств, так как одно или более свойства имеют больше чем одно сопоставление. + Показаны только допустимые для данного расположения альтернативные типы. + + + Вы не указали ни одного допустимого цвета + + + Черный + Зеленый + Желтый + Оранжевый + Синий + Красный + + + Об этой странице + Алиас + (как бы Вы описали изображение по телефону) + Альтернативные ссылки + Альтернативный текст (необязательно) + Элементы списка + Нажмите для правки этого элемента + Создано пользователем + Исходный автор + Дата создания + Дата/время создания документа + Тип документа + Редактирование + Скрыть + ВНИМАНИЕ: невозможно получить URL документа (внутренняя ошибка - подробности в системном журнале) + Опубликовано + Этот документ был изменен после публикации + Этот документ не опубликован + Документ опубликован + Здесь еще нет элементов. + В этом списке пока нет элементов. + Ссылка на медиа-элементы + Тип медиа-контента + Группа участников + Включен в группу(ы) + Роль участника + Тип участника + Дата не указана + Заголовок ссылки + Доступные группы + Свойства + Этот документ опубликован, но скрыт, потому что его родительский документ '%0%' не опубликован + ВНИМАНИЕ: этот документ опубликован, но его нет в глобальном кэше (внутренняя ошибка - подробности в системном журнале) + Опубликовать + Состояние публикации + Опубликовать + Очистить дату + ВНИМАНИЕ: этот документ опубликован, но его URL вступает в противоречие с документом %0% + Это время будет соответствовать следующему времени на сервере: + Что это означает?]]> + Порядок сортировки обновлен + Для сортировки узлов просто перетаскивайте узлы или нажмите на заголовке столбца. Вы можете выбрать несколько узлов, удерживая клавиши "shift" или "ctrl" при пометке + Статистика + Цель + Заголовок (необязательно) + Тип + Скрыть + Распубликовать + Последняя правка + Дата/время редактирования документа + Обновлено + Удалить файл + Ссылка на документ + Добавить новое поле текста + Удалить это поле текста + + + Композиции + Вы не добавили ни одной вкладки + Добавить вкладку + Добавить новую вкладку + Унаследовано от + Добавить свойство + Обязательная метка + + Представление в формате списка + Устанавливает представление документа данного типа в виде сортируемого списка дочерних документов с функцией поиска, в отличие от обычного представления дочерних документов в виде дерева + + Допустимые шаблоны + Выберите перечень допустимых шаблонов для сопоставления документам данного типа + Разрешить в качестве корневого + Позволяет создавать документы этого типа в самом корне дерева содержимого + ДА - разрешить создание в качестве корневого + + Допустимые типы дочерних документов + Позволяет указать перечень типов документов, допустимых для создания документов, дочерних к данному типу + + Выбрать дочерний узел + Унаследовать вкладки и свойства из уже существующего типа документов. Вкладки будут либо добавлены в создаваемый тип, либо в случае совпадения названий вкладок будут добавлены наследуемые свойства. + Этот тип документов уже участвует в композиции другого типа, поэтому сам не может быть композицией. + В настоящее время нет типов документов, допустимых для построения композиции. + + Доступные редакторы + Переиспользовать + Установки редактора + + Конфигурирование + + ДА, удалить + + перемещены внутрь + скопированы внутрь + Выбрать папку для перемещения + Выбрать папку для копирования + в структуре дерева + + Все типы документов + Все документы + Все медиа-элементы + + , использующие этот тип документов, будут безвозвратно удалены, пожалуйста, подтвердите это действие. + , использующие этот тип медиа, будут безвозвратно удалены, пожалуйста, подтвердите это действие. + , использующие этот тип участников, будут безвозвратно удалены, пожалуйста, подтвердите это действие. + + и все документы, использующие данный тип + и все медиа-элементы, использующие данный тип + и все участники, использующие данный тип + + , использующие этот редактор, будут обновлены с применением этих установок + + Участник может изменить + Показать в профиле участника + для вкладки не указан порядок сортировки + + + Где вы хотите создать новый %0% + Создать в узле + Новая папка + Новый тип данных + "Типы документов".]]> + "Типы медиа-материалов".]]> + Выберите тип и заголовок + Тип документа без сопоставленного шаблона + Новый файл javascript + Новое пустое частичное представление + Новый макрос-представление + Новое частичное представление по образцу + Новый пустой макрос-представление + Новый макрос-представление по образцу + Новый макрос-представление (без регистрации макроса) + + + Обзор сайта + - Скрыть - + Если административная панель не загружается, Вам, возможно, следует разрешить всплывающие окна для данного сайта + было открыто в новом окне + Перезапустить + Посетить + Рады приветствовать + + + Название + Управление доменами + Закрыть это окно + Вы уверены, что хотите удалить + Вы уверены, что хотите запретить + Пожалуйста, подтвердите удаление из корзины %0% элементов + Вы уверены? + Вы уверены? + Вырезать + Править статью словаря + Изменить язык + Вставить локальную ссылку (якорь) + Вставить символ + Вставить графический заголовок + Вставить изображение + Вставить ссылку + Вставить макрос + Вставить таблицу + Последняя правка + Ссылка + Внутренняя ссылка: + Для того чтобы определить локальную ссылку, используйте "#" первым символом + Открыть в новом окне? + Свойства макроса + Этот макрос не имеет редактируемых свойств + Вставить + Изменить разрешения для + Все элементы в корзине сейчас удаляются. Пожалуйста, не закрывайте это окно до окончания процесса удаления + Корзина пуста + Вы больше не сможете восстановить элементы, удаленные из корзины + regexlib.com испытывает в настоящее время некоторые трудности, не зависящие от нас. Просим извинить за причиненные неудобства.]]> + Используйте поиск регулярных выражений для добавления сервиса проверки к полю Вашей формы. Например: 'email, 'zip-code', 'url' + Удалить макрос + Обязательное поле + Сайт переиндексирован + Кэш сайта был обновлен. Все опубликованное содержимое приведено в актуальное состояние, в то время как неопубликованное содержимое по-прежнему не опубликовано + Кэш сайта будет полностью обновлен. Все опубликованное содержимое будет обновлено, в то время как неопубликованное содержимое по-прежнему останется неопубликованным + Количество столбцов + Количество строк + Идентификация контейнера (placeholder) + путем назначения Вашему элементу-контейнеру уникального идентификатора (ID) позволит Вам автоматически включать в шаблон содержимое из дочерних шаблонов путем указания этого идентификатора (ID) в конструкции <asp:content />.]]> + Выберите идентификатор элемента-контейнера (placeholder) + из нижеследующего списка. Список ограничивается идентификаторами, определенными в родительском шаблоне данного шаблона.]]> + Кликните на изображении, чтобы увидеть полноразмерную версию + Выберите элемент + Просмотр элемента кэша + Создать папку... + Связать с оригиналом + Включая все дочерние + Самое дружелюбное сообщество + Ссылка на страницу + Открывать ссылку в новом окне или вкладке браузера + Ссылка на медиа-файл + Выбрать медиа + Выбрать значок + Выбрать элемент + Выбрать ссылку + Выбрать макрос + Выбрать содержимое + Выбрать участника + Выбрать группу участников + Это макрос без параметров + Нет макросов доступных для вставки в редактор + Провайдеры аутентификации + Подробное сообщение об ошибке + Трассировка стека + Внутренняя ошибка + Связать + Разорвать связь + учетную запись + Выбрать редактор + Выбрать образец + + + %0%'
Добавить другие языки можно, воспользовавшись пунктом 'Языки' в меню слева + ]]>
+ Название языка (культуры) + Редактировать элемент (ключ) словаря + + + + + + Допустим как корневой + Только узлы таких типов (с установленным флагом) могут быть созданы в корневом уровне дерева содержимого или медиа-библиотеки + Допустимые типы дочерних узлов + Составные типы документов + Создать + Создать пользовательский список + Текущий список + Текущий тип данных в виде списка + Удалить вкладку + Описание + Включить представление в виде списка + Включает представление узлов, дочерних к узлу данного типа, в виде сортируемого списка с функцией фильтра и поиска. Такие дочерние узлы при этом перестают быть видимыми в дереве. + Новая вкладка + Удалить пользовательский список + Вкладка + Миниатюра + + + Добавить предустановленное значение + Тип данных в БД + GUID типа данных + Редактор свойства + Кнопки + Включить расширенные настройки для + Включить контекстное меню + Максимальный размер по-умолчанию для вставляемых изображений + Сопоставленные стили CSS + Показать метку + Ширина и высота + ВСЕ типы свойств и данные в свойствах документов, + использующие этот тип данных, будут удалены безвозвратно, подтвердите их удаление + Да, можно удалить + и все типы свойств и данные свойств, использующие этот тип данных + Выберите папку, чтобы переместить в нее + в структуре дерева ниже + был перемещен в папку + + + Нет доступных элементов словаря + + + Ваши данные сохранены, но для того, чтобы опубликовать этот документ, Вы должны сначала исправить следующие ошибки: + Текущий провайдер ролей пользователей не поддерживает изменение пароля (необходимо свойству EnablePasswordRetrieval в файле web.config присвоить значение true) + %0% уже существует + Обнаружены следующие ошибки: + Обнаружены следующие ошибки: + Пароль должен состоять как минимум из %0% символов, хотя бы %1% из которых не являются буквами + %0% должно быть целочисленным значением + %0% в %1% является обязательным полем + %0% является обязательным полем + %0% в %1%: данные в некорректном формате + %0% - данные в некорректном формате + + + Получено сообщение об ошибке от сервера + ПРЕДУПРЕЖДЕНИЕ! Несмотря на то, что CodeMirror по-умолчанию разрешен в данной конфигурации, он по-прежнему отключен для браузеров Internet Explorer ввиду нестабильной работы + Укажите, пожалуйста, алиас и имя для этого свойства! + Использование данного типа файлов на сайте запрещено администратором + Ошибка доступа к указанному файлу или папке + Ошибка загрузки кода в частичном представлении (файл: %0%) + Ошибка загрузки пользовательского элемента управления '%0%' + Ошибка загрузки внешнего типа (сборка: %0%, тип: '%1%') + Ошибка загрузки макроса (файл: %0%) + "Ошибка разбора кода XSLT в файле: %0% + "Ошибка чтения XSLT-файла: %0% + Ошибка в конфигурации типа данных, используемого для свойства, проверьте тип данных + Укажите заголовок + Выберите тип + Вы пытаетесь увеличить изображение по сравнению с его исходным размером. Уверены, что хотите сделать это? + Ошибка в скрипте Python + Скрипт на языке Python не был сохранен, так как он содержит одну или несколько ошибок. + Начальный узел был удален, свяжитесь с Вашим администратором + Для смены стиля отметьте фрагмент текста + Не определен ни один доступный стиль + Поместите курсор в левую из двух ячеек, которые хотите объединить + Нельзя разделить ячейку, которая не была до этого объединена + Ошибка в XSLT-документе + XSLT-документ не был сохранен, так как он содержит одну или несколько ошибок + + + О системе + Действие + Действия + Добавить + Алиас + Все + Вы уверены? + Назад + Границы + пользователем + Отмена + Отступ ячейки + Выбрать + Закрыть + Закрыть окно + Примечание + Подтвердить + Сохранять пропорции + Далее + Копировать + Создать + База данных + Дата + По-умолчанию + Удалить + Удалено + Удаляется... + Дизайн + Словарь + Размеры + Вниз + Скачать + Изменить + Изменено + Элементы + Email адрес + Ошибка + Найти + Начало + Папка + Высота + Справка + Иконка + Импорт + Внутренний отступ + Вставить + Установить + Неверно + Выравнивание + Название + Язык + Конец + Макет + Загрузка + БЛОКИРОВКА + Войти + Выйти + Выход + Макрос + Обязательно + Больше + Переместить + Название + Новый + След + Нет + из + Ok + Открыть + или + Пароль + Путь + Идентификатор контейнера + Минуточку... + Пред + Свойства + Email адрес для получения данных + Корзина + Ваша корзина пуста + Осталось + Удалить + Переименовать + Обновить + Обязательное + Повторить + Разрешения + Поиск + К сожалению, ничего подходящего не нашлось + Результаты поиска + Сервер + Показать + Показать страницу при отправке + Размер + Сортировать + Отправить + Тип + Что искать? + Вверх + Обновить + Обновление + Загрузить + URL + Пользователь + Имя пользователя + Значение + Просмотр + Добро пожаловать... + Ширина + Да + Пересортировать + Пересортировка завершена + Предпросмотр + Сменить пароль + к + Список + Сохранение... + текущий + выбрано + Внедрить + + + Цвет фона + Полужирный + Цвет текста + Шрифт + Текст + + + Добавить содержимое + Сбросить содержимое + Добавить шаблон сетки + Настройте шаблон, задавая ширину колонок или добавляя дополнительные секции + Добавить конфигурацию строки + Настройте строку, задавая ширину ячеек или добавляя дополнительные ячейки + Добавить новые строки + Доступны все редакторы + Доступны все конфигурации строк + Выберите шаблон + Кликните для встраивания + Кликните для вставки изображения + Колонки + Недопустимый тип содержимого + Данный тип содержимого разрешен + Суммарное число колонок в шаблоне сетки + Шаблоны сетки + Шаблоны являются рабочим пространством для редактора сетки, обычно Вам понадобится не более одного или двух шаблонов + Вставить элемент + Заголовок для изображения... + Напишите... + Конфигурации строк + Строки - это последовательности ячеек с горизонтальным расположением + Установки будут сохранены только если они указаны в корректном формате json + Установки + Установки применены + Задайте установки, доступные редакторам для изменения + Стили + Задайте стили, доступные редакторам для изменения + Установить по-умолчанию + Выбрать дополнительно + Выбрать по-умолчанию + добавлены + + + Страница + + + + Для параметра установлено рекомендованное значение: '%0%'. + Значение установлено в '%1%' для пути XPath '%2%' в файле конфигурации '%3%'. + Ожидаемое значение '%1%' для параметра '%2%' в файле конфигурации '%3%', найденное значение: '%0%'. + Найдено неожиданное значение '%0%' для параметра '%2%' в файле конфигурации '%3%'. + + + Параметр 'CustomErrors' установлен в '%0%'. + Параметр 'CustomErrors' сейчас установлен в '%0%'. Рекомендуется установить в '%1%' перед размещением сайта в сети. + Параметр 'CustomErrors' успешно установлен в '%0%'. + + Параметр 'MacroErrors' установлен в '%0%'. + Параметр 'MacroErrors' установлен в '%0%', что может привести к неполной обработке части страниц или всех страниц сайта при наличии ошибок в макросах. Устранить это можно путем установки значения в '%1%'. + Параметр 'MacroErrors' теперь установлен в '%0%'. + + + Параметр 'Try Skip IIS Custom Errors' установлен в '%0%' и Вы используете IIS версии '%1%'. + Параметр 'Try Skip IIS Custom Errors' сейчас установлен в '%0%'. Рекомендуется установить в '%1%' для Вашего текущего IIS версии (%2%). + Параметр 'Try Skip IIS Custom Errors' успешно установлен в '%0%'. + + + Файл не существует: '%0%'. + '%0%' в файле конфигурации '%1%'.]]> + Обнаружена ошибка, для получения полной информации обратитесь к журналу: %0%. + + Участники - всего в XML: %0%, всего: %1%, с ошибками: %2% + Медиа - всего в XML: %0%, всего: %1%Б с ошибками: %2% + Содержимое - всего в XML: %0%, всего опубликовано: %1%, с ошибками: %2% + + Сертификат Вашего веб-сайта отмечен как проверенный. + Ошибка проверки сертификата: '%0%' + Ошибка проверки адреса URL %0% - '%1%' + Сейчас Вы %0% просматриваете сайт, используя протокол HTTPS. + Параметр 'umbracoUseSSL' в секции 'appSetting' установлен в 'false' в файле web.config. Если Вам необходим доступ к сайту по протоколу HTTPS, нужно установить данный параметр в 'true'. + Параметр 'umbracoUseSSL' в секции 'appSetting' в файле установлен в '%0%', значения cookies %1% маркированы как безопасные. + Невозможно обновить значение параметра 'umbracoUseSSL' в файле web.config. Ошибка: %0% + + + Разрешить HTTPS + Устанавливает значение параметра 'umbracoSSL' в 'true' в секции 'appSettings' файла web.config. + Параметр 'umbracoUseSSL' в секции 'appSetting' файлf web.config теперь установлен в 'true', значения cookies будут промаркированы как безопасные. + + Исправить + Невозможно исправление по результату проверки значения на 'ShouldNotEqual'. + Невозможно исправление по результату проверки значения на 'ShouldEqual' с предоставленным значением. + Значение для исправления не предоставлено. + + Режим компиляции с отладкой выключен. + Режим компиляции с отладкой сейчас включен. Рекомендуется выключить перед размещением сайта в сети. + Режим компиляции с отладкой успешно выключен. + + Режим трассировки выключен. + Режим трассировки сейчас включен. Рекомендуется выключить перед размещением сайта в сети. + Режим трассировки успешно выключен. + + Все папки имеют корректно установленные параметры безопасности. + + %0%.]]> + %0%. Если в них не разрешена запись, не нужно предпринимать никаких действий.]]> + + Все файлы имеют корректно установленные параметры безопасности. + + %0%.]]> + %0%. Если в них не разрешена запись, не нужно предпринимать никаких действий.]]> + + X-Frame-Options, использующийся для управления возможностью помещать сайт в IFRAME на другом сайте.]]> + X-Frame-Options, использующийся для управления возможностью помещать сайт в IFRAME на другом сайте, не обнаружен.]]> + Установить заголовок в файле конфигурации + Добавляет значение в секцию 'httpProtocol/customHeaders' файла web.config, препятствующее возможному использованию этого сайта внутри IFRAME на другом сайте. + Значение, добавляющее заголовок, препятствующий использованию этого сайта внутри IFRAME другого сайта, успешно добавлено в файл web.config. + Невозможно обновить файл web.config. Ошибка: %0% + + + %0%.]]> + Заголовки, позволяющие выяснить базовую технологию сайта, не обнаружены. + + В файле Web.config, не обнаружено параметров работы с отправкой электронной почты (секция 'system.net/mailsettings'). + В файле Web.config в секции 'system.net/mailsettings' не обнаружены настройки почтового хоста. + Параметры отправки электронной почты (SMTP) настроены корректно, сервис работает как ожидается. + Сервер SMTP сконфигурирован на использование хоста '%0%' на порту '%1%', который в настоящее время недоступен. Пожалуйста, убедитесь, что настройки SMTP в файле Web.config в секции 'system.net/mailsettings' верны. + + %0%.]]> + %0%.]]> + + + перейти к + Разделы справки для + Обучающие видео для + Лучшие обучающие видео-курсы по Umbraco + + + Сбросить + Задать рамку + Задайте рамке имя (алиас), а также ширину и высоту по-умолчанию + Сохранить рамку + Добавить новую рамку + + + Программа установки не может установить подключение к базе данных. + Невозможно сохранить изменения в файл web.config. Пожалуйста, вручную измените настройки строки подключения к базе данных. + База данных обнаружена и идентифицирована как + Конфигурация базы данных + Установить чтобы установить базу данных Umbraco %0% + ]]> + Далее для продолжения.]]> + База данных не найдена! Пожалуйста, проверьте настройки строки подключения ("connection string") в файле конфигурации "web.config"

+

Для настройки откройте файл "web.config" с помощью любого текстового редактора и добавьте нужную информацию в строку подключения (параметр "UmbracoDbDSN"), + затем сохраните файл.

+

Нажмите кнопку "Повторить" когда все будет готово
+ Более подробно о внесении изменений в файл "web.config" рассказано здесь.

]]>
+ + Пожалуйста, свяжитесь с Вашим хостинг-провайдером, если есть необходимость, а если устанавливаете на локальную рабочую станцию или сервер, то получите информацию у Вашего системного администратора.]]> + Нажмите кнопку Обновление + для того, чтобы привести Вашу базу данных + в соответствие с версией Umbraco %0%

+

Пожалуйста, не волнуйтесь, ни одной строки Вашей базы данных + не будет потеряно при данной операции, и после ее завершения все будет работать!

+ ]]>
+ + Нажмите Далее для продолжения. ]]> + + Далее для продолжения работы мастера настроек]]> + Пароль пользователя по-умолчанию необходимо сменить!]]> + Пользователь по-умолчанию заблокирован или не имеет доступа к Umbraco!

Не будет предпринято никаких дальнейших действий. Нажмите кнопку Далее для продолжения.]]> + Пароль пользователя по-умолчанию успешно изменен в процессе установки!

Нет надобности в каких-либо дальнейших действиях. Нажмите кнопку Далее для продолжения.]]> + Пароль изменен! + Umbraco создает пользователя по-умолчанию с именем входа ('admin') и паролем ('default'). + ОЧЕНЬ ВАЖНО изменить пароль по-умолчанию на что-либо уникальное.

]]> +
+ Для начального обзора возможностей системы рекомендуем посмотреть ознакомительные видеоматериалы + Далее (или модифицируя вручную ключ "UmbracoConfigurationStatus" в файле "web.config"), Вы принимаете лицензионное соглашение для данного программного обеспечения, расположенное ниже. Пожалуйста, обратите внимание, что установочный пакет Umbraco отвечает двум различным типам лицензий: лицензии MIT на программные продукты с открытым исходным кодом в части ядра системы и свободной лицензии Umbraco в части пользовательского интерфейса.]]> + Система не установлена. + Затронутые файлы и папки + Более подробно об установке разрешений для Umbraco рассказано здесь + Вам следует установить разрешения для учетной записи ASP.NET на модификацию следующих файлов и папок + Установки разрешений в Вашей системе почти полностью отвечают требованиям Umbraco! +

Вы имеете возможность запускать Umbraco без проблем, однако не сможете воспользоваться такой сильной стороной системы Umbraco как установка дополнительных пакетов расширений и дополнений.]]>
+ Как решить проблему + Нажмите здесь, чтобы прочесть текстовую версию документа + видео-материал, посвященный установке разрешений для файлов и папок в Umbraco или прочтите текстовую версию документа.]]> + Установки разрешений в Вашей файловой системе могут быть неверными! +

Вы имеете возможность запускать Umbraco без проблем, + однако не сможете воспользоваться такой сильной стороной системы Umbraco как установка дополнительных пакетов расширений и дополнений.]]>
+ Установки разрешений в Вашей файловой системе не подходят для работы Umbraco! +

Если Вы хотите продолжить работу с Umbraco, + Вам необходимо скорректировать установки разрешений.]]>
+ Установки разрешений в Вашей системе идеальны! +

Вы имеете возможность работать с Umbraco в полном объеме включая установку дополнительных пакетов расширений и дополнений!]]>
+ Решение проблемы с папками + Воспользуйтесь этой ссылкой для получения более подробной информации о проблемах создания папок от имени учетной записи ASP.NET + Установка разрешений на папки + + + Здесь можно узнать об этом подробнее) Вы также можете отложить установку "Runway" на более позднее время. Перейдите к разделу "Разработка" и выберите пункт "Пакеты". + ]]> + Вы только что установили чистую платформу Umbraco. Какой шаг будет следующим? + "Runway" установлен + Ниже приведен список модулей, рекомендованных к установке, измените его при необходимости, или ознакомьтесь с полным списком модулей + ]]> + Рекомендовано только для опытных пользователей + Я хочу начать с установки простого демонстрационного сайта + "Runway" - это простой демонстрационный веб-сайт, предоставляющий базовый перечень шаблонов и типов документов. + Программа установки может настроить "Runway" для Вас автоматически, + но Вы можете в дальнейшем свободно изменять, расширять или удалить его. + Этот демонстрационный сайт не является необходимой частью, и Вы можете свободно + использовать Umbraco без него. Однако, "Runway" предоставляет Вам возможность + максимально быстро познакомиться с базовыми принципами и техникой построения сайтов + на основе Umbraco. Если Вы выберете вариант с установкой "Runway", + Вам будет предложен выбор "базовых строительных блоков" (т.н. модулей Runway) для расширения возможностей страниц сайта "Runway".

+ В "Runway" входят:"Домашняя" (главная) страница, страница "Начало работы", + страница установки модулей.
Дополнительные модули:Базовая навигация, Карта сайта, Форма обратной связи, Галерея.
+ ]]>
+ Что такое "Runway" + Шаг 1 из 5: Лицензионное соглашение + Шаг 2 из 5: конфигурация базы данных + Шаг 3 из 5: проверка файловых разрешений + Шаг 4 из 5: проверка безопасности + Шаг 5 из 5: система готова для начала работы + Спасибо, что выбрали Umbraco + Обзор Вашего нового сайтаВы установили "Runway", + почему бы не посмотреть, как выглядит Ваш новый сайт?]]> + Дальнейшее изучение и помощь + Получайте помощь от нашего замечательного сообщества пользователей, изучайте документацию или просматривайте наши свободно распространяемые видео-материалы о том, как создать собственный несложный сайт, как использовать расширения и пакеты, а также краткое руководство по терминологии Umbraco.]]> + Система Umbraco %0% установлена и готова к работе + web.config и изменить значение ключа UmbracoConfigurationStatus в секции AppSetting, установив его равным '%0%'.]]> + прямо сейчас, + воспользовавшись ссылкой "Начать работу с Umbraco".
Если Вы новичок в мире Umbraco, Вы сможете найти много полезных ссылок на ресурсы на странице "Начало работы".]]>
+ Начните работу с Umbraco + Для того, чтобы начать администрировать свой сайт, просто откройте административную панель Umbraco и начните обновлять контент, изменять шаблоны страниц и стили CSS или добавлять новую функциональность]]> + Попытка соединения с базой данных потерпела неудачу. + Версия Umbraco 3 + Версия Umbraco 4 + Смотреть + Umbraco %0% в форме "чистой" установки или обновления предыдущей версии 3.x. +

Нажмите кнопку "Далее" для начала работы мастера.]]>
+ + + Код языка + Название языка + + + Вы отсутствовали некоторое время. Был осуществлен автоматический выход в + Обновите сейчас, чтобы сохранить сделанные изменения + + + © 2001 - %0%
umbraco.com

]]>
+ Сегодня же выходной! + Понедельник — день тяжелый... + Вот уже вторник... + Берегите окружающую среду + Рыбный день + Слава Богу, сегодня пятница! + Понедельник начинается в субботу + Укажите имя пользователя и пароль + Время сессии истекло + Забыли пароль? + На email-адрес будет выслано письмо со ссылкой для сброса пароля + Будет выслано письмо с инструкциями по сбросу пароля на указанный email-адрес, если он совпадает с адресом пользователя + Вернуться к форме входа + Пожалуйста укажите новый пароль + Ваш пароль обновлен + Войти с помощью + Ссылка, по которой Вы попали сюда, неверна или устарела + Umbraco: сброс пароля + + Ваше имя пользователя для входа в панель администрирования Umbraco: %0%

Перейдите по этой ссылке для того, чтобы сбросить Ваш пароль, или скопируйте текст ссылки и вставьте в адресную строку своего браузера:

%1%

]]> +
+ + + Панель управления + Разделы + Содержимое + + + Нажмите, чтобы загрузить + Невозможна загрузка этого файла, этот тип файлов не разрешен для загрузки + Перетащите файлы сюда... + Ссылка на файл + или нажмите сюда, чтобы выбрать файлы + Разрешены только типы файлов: + Максимально допустимый размер файла: + + + Создать нового участника + Все участники + + + Построение моделей + это может занять некоторое время, пожалуйста, подождите + Модели построены + Модели не могут быть построены + Процесс построения моделей завершился ошибкой, подробности в системном журнале Umbraco + + + Выберите страницу... + Узел %0% был скопирован в %1% + Выберите, куда должен быть скопирован узел %0% + Узел %0% был перемещён в %1% + Выберите, куда должен быть перемещён узел %0% + был выбран как родительский узел для нового элемента, нажмите 'Ок'. + Не выбран узел! Пожалуйста выберите узел назначения, прежде чем нажать 'Ок'. + Текущий узел не может быть размещен непосредственно в корне дерева + Текущий узел не может быть размещён в выбранном Вами из-за несоответствия типов. + Текущий узел не может быть перемещен внутрь своих дочерних узлов + Данное действие не может быть осуществлено, так как Вы не имеете достаточных прав для совершения действий над одним или более дочерними документами. + Связать новые копии с оригиналами + + + Вы можете изменить уведомление для %0% + + Здравствуйте, %0%

+ +

Это автоматически сгенерированное уведомление. Операция '%1%' + была произведена на странице '%2%' + пользователем '%3%'.

+ + + +

+

Сводка обновлений:

+ + %6% +
+

+ + + +

Удачи!

Генератор уведомлений Umbraco +

]]>
+ [%0%] Уведомление об операции %1% над документом %2% + Уведомления + + + + и указав на нужный файл. Пакеты Umbraco обычно являются архивами с расширением ".umb" или ".zip". + ]]> + Перетащите сюда + или нажмите здесь для выбора файла пакета + Загрузить пакет + Установите локальный пакет из файла, расположенного на Вашем компьютере. Остерегайтесь устанавливать пакеты из непроверенных источников! + Загрузить еще один пакет + Отменить и загрузить другой пакет + Лицензия + Я принимаю + условия использования + Установить пакет + Завершить + Установленные пакеты + Ни одного пакета еще не установлено + 'Packages' наверху справа]]> + Поиск по пакетам + Результаты поиска по + Ничего не найдено по запросу + Пожалуйста, повторите поиск, уточнив запрос, или воспользуйтесь просмотром по категориям + Популярные + Недавно созданные + имеет на счету + очков кармы + Информация + Владелец + Соавторы + Создан + Текущая версия + Версия .NET + Загрузок + Нравится + Совместимость + Этот пакет совместим со следующими версиями Umbraco, по сообщениям участников сообщества. Полная совместимость не гарантируется для версий со значением ниже 100% + Внешние источники + Автор + Демонстрация + Документация (описание) + Мета-данные пакета + Название пакета + Пакет ничего не содержит +
Вы можете безопасно удалить данный пакет из системы, нажав на кнопку "Деинсталлировать пакет".]]>
+ Нет доступных обновлений + Опции пакета + Краткий обзор пакета + Репозиторий пакета + Подтверждение деинсталляции пакета + Пакет деинсталлирован + Указанный пакет успешно удален из системы + Деинсталлировать пакет + + Обратите внимание: все документы, медиа-файлы и другой контент, зависящий от этого пакета, перестанет нормально работать, что может привести к нестабильному поведению системы, + поэтому удаляйте пакеты очень осторожно. При наличии сомнений, свяжитесь с автором пакета.]]> + Скачать обновление из репозитория + Обновление пакета + Руководство по обновлению + Для данного пакета доступно обновление. Вы можете загрузить это обновление непосредственно из центрального репозитория пакетов Umbraco. + Версия пакета + История версий пакета + Перейти на веб-сайт пакета + Этот пакет уже установлен в системе + Этот пакет не может быть установлен, он требует наличия Umbraco версии как минимум + Удаление... + Загрузка... + Импорт... + Установка... + Перезапуск, подождите, пожалуйста... + Все готово, сейчас браузер перезагрузит страницу, подождите, пожалуйста... + Пожалуйста, нажмите кнопку 'Завершить' для завершения установки и перезагрузки страницы. + Загрузка пакета... + + + Вставить, полностью сохранив форматирование (не рекомендуется) + Текст, который Вы пытаетесь вставить, содержит специальные символы и/или элементы форматирования. Это возможно при вставке текста, скопированного из Microsoft Word. Система может удалить эти элементы автоматически, чтобы сделать вставляемый текст более пригодным для веб-публикации. + Вставить как простой текст без форматирования + Вставить с очисткой форматирования (рекомендуется) + + + Подтвердите пароль + Укажите Ваш email + Укажите описание... + Укажите имя... + Укажите теги (нажимайте Enter после каждого тега)... + Укажите фильтр... + Метка... + Назовите %0%... + Укажите пароль + Что искать... + Укажите имя пользователя + Имя пользователя (часто это Ваш email-адрес) + + + Остаться + Отменить изменения + Есть несохраненные изменения + Вы уверены, что хотите уйти с этой страницы? - на ней имеются несохраненные изменения + + + Расширенный: Защита на основе ролей (групп) + с использованием групп участников Umbraco.]]> + Вам необходимо создать хотя бы одну группу участников для применения ролевой модели безопасности. + Страница сообщения об ошибке + Используется в случае, когда пользователь авторизован в системе, но не имеет доступа к документу. + Выберите способ ограничения доступа к документу + Правила доступа к документу %0% установлены + Правила доступа для документа %0% удалены + Страница авторизации (входа) + Используйте как страницу с формой для авторизации пользователей + Снять защиту + Выберите страницы авторизации и сообщений об ошибках + Выберите роли пользователей, имеющих доступ к документу + Установите имя пользователя и пароль для доступа к этому документу + Простой: Защита по имени пользователя и паролю + Применяйте, если хотите установить самый простой способ доступа к документу - явно указанные имя пользователя и пароль + + + + + + + + Включая неопубликованные дочерние документы + Идет публикация. Пожалуйста, подождите... + %0% из %1% документов опубликованы... + Документ %0% опубликован. + Документ %0% и его дочерние документы были опубликованы + Опубликовать документ %0% и все его дочерние документы + Опубликовать для публикации документа %0%. + Тем самым Вы сделаете содержимое документа доступным для просмотра.

+ Вы можете опубликовать этот документ и все его дочерние документы, отметив опцию Опубликовать все дочерние документы. + Чтобы опубликовать ранее неопубликованные документы среди дочерних, отметьте опцию Включая неопубликованные дочерние документы. + ]]>
+ + + Остановить отслеживание URL + Запустить отслеживание URL + Первоначальный URL + Перенаправлен в + На данный момент нет ни одного перенаправления + Если опубликованный документ переименовывается или меняет свое расположение в дереве, а следовательно, меняется адрес (URL), автоматически создается перенаправление на новое местоположение этого документа. + Удалить + Вы уверены, что хотите удалить перенаправление с '%0%' на '%1%'? + Перенаправление удалено. + Ошибка удаления перенаправления. + Вы уверены, что хотите остановить отслеживание URL? + Отслеживание URL в настоящий момент остановлено. + Ошибка остановки отслеживания URL, более подробные сведения находятся в системном журнале. + Отслеживание URL в настоящий момент запущено. + Ошибка запуска отслеживания URL, более подробные сведения находятся в системном журнале. + + + Заголовок + Укажите заголовок + выбрать страницу сайта + указать внешнюю ссылку + Укажите ссылку + Ссылка + В новом окне + + + Текущая версия + Красным отмечен текст, которого уже нет в последней версии, зеленым - текст, который добавлен]]> + Произведен откат к ранней версии + Текущая версия показана в виде HTML. Для просмотра различий в версиях выберите режим сравнения + Откатить к версии + Выберите версию + Просмотр + + + Править файл скрипта + + + Аналитика + Смотритель + Содержимое + Курьер + Разработка + Формы + Помощь + Мастер конфигурирования Umbraco + Медиа-материалы + Участники + Рассылки + Установки + Статистика + Перевод + Пользователи + + + Добавить значок + в качестве родительского типа. Вкладки родительского типа не показаны и могут быть изменены непосредственно в родительском типе + Родительский тип контента разрешен + Данный тип контента использует + Создать шаблон для документов этого типа + Шаблон по-умолчанию + Словарная статья + Чтобы импортировать тип документа, найдите файл ".udt" на своем компьютере, нажав на кнопку "Обзор", затем нажмите "Импортировать" (на следующем экране будет запрошено подтверждение для этой операции). + Родительский тип документа + Заголовок новой вкладки + Тип узла (документа) + Для данной вкладки не определены свойства. Кликните по ссылке "Click here to add a new property" сверху, чтобы создать новое свойство. + Тип + Скрипт + Стили CSS + Правило стиля CSS + Вкладка + Заголовок вкладки + Вкладки + + + Добавить вкладку + Добавить свойство + Добавить редактор + Добавить шаблон + Добавить дочерний узел + Добавить дочерний + + Изменить тип данных + + Навигация по разделам + + Ярлыки + показать ярлыки + + В формате списка + Разрешить в качестве корневого + + Закомментировать/раскомментировать строки + Удалить строку + Копировать строки вверх + Копировать строки вниз + Переместить строки вверх + Переместить строки вниз + + Общее + Редактор + + + Порядок сортировки + Дата создания + Сортировка завершена + Перетаскивайте элементы на нужное место вверх или вниз для определения необходимого Вам порядка сортировки. Также можно использовать заголовки столбцов, чтобы отсортировать все элементы сразу. +
Не закрывайте это окно до окончания процесса сортировки.]]>
+ + + Процесс публикации был отменен установленным пакетом дополнений. + Такое свойство уже существует. + Свойство создано + Тип данных: %1%]]> + Свойство удалено + Тип документа сохранен + Вкладка создана + Вкладка удалена + Вкладка с идентификатором (id): %0% удалена + Документ скрыт (публикация отменена) + Стиль CSS не сохранен + При сохранении файла произошла ошибка. + Стиль CSS сохранен + Стиль CSS сохранен без ошибок + Тип данных сохранен + Статья в словаре сохранена + Публикация не завершена, так как родительский документ не опубликован + Документ опубликован + и является видимым + Документ сохранен + Не забудьте опубликовать, чтобы сделать видимым + Отослано на утверждение + Изменения отосланы на утверждение + Медиа-элемент сохранен + + Участник сохранен + Правило стиля CSS сохранено + Стиль CSS сохранен + Шаблон сохранен + Произошла ошибка при сохранении пользователя (проверьте журналы ошибок) + Пользователь сохранен + Тип пользователей сохранен + Файл не сохранен + Файл не может быть сохранен. Пожалуйста, проверьте установки файловых разрешений + Файл сохранен + Файл сохранен без ошибок + У текущего пользователя недостаточно прав, невозможно завершить операцию + Язык сохранен + Тип медиа сохранен + Тип участника сохранен + Отменено + Операция отменена установленным сторонним расширением или блоком кода + Ошибка + Представление не сохранено + Произошла ошибка при сохранении файла + Представление сохранено + Представление сохранено без ошибок + Cкрипт Python не сохранен + Cкрипт Python не может быть сохранен в связи с ошибками + Cкрипт Python сохранен + Cкрипт Python сохранен без ошибок + Скрипт не сохранен + При сохранении файла скрипта произошла ошибка + Скрипт сохранен + Файл скрипта сохранен без ошибок + Шаблон не сохранен + Пожалуйста, проверьте, что нет двух шаблонов с одним и тем же алиасом (названием) + Шаблон сохранен + Шаблон сохранен без ошибок + Проверка значений + Ошибки, найденные при проверке значений, должны быть исправлены, чтобы было возможно сохранить документ + XSLT-документ не сохранен + XSLT-документ содержит одну или несколько ошибок + XSLT-документ не может быть сохранен, проверьте установки файловых разрешений + XSLT-документ сохранен + Ошибок в XSLT-документе нет + + + Используется синтаксис селекторов CSS, например: h1, .redHeader, .blueTex + Изменить стиль CSS + Изменить правило стиля CSS + Название правила для отображения в редакторе документа + Предварительный просмотр + Стили + + + Изменить шаблон + + Секции + Вставить контент-область + Вставить контейнер (placeholder) + + Вставить + Выберите, что хотите вставить в шаблон + + Статью словаря + Статья словаря - это контейнер для части текста, переводимой на разные языки, это позволяет упростить создание многоязычных сайтов. + + Макрос + + Макросы - это настраиваемые компоненты, которые хорошо подходят для + реализации переиспользуемых блоков, (особенно, если необходимо менять их внешний вид и/или поведение при помощи параметров) + таких как галереи, формы, списки и т.п. + + + Значение поля + Отображает значение указанного поля данных текущей страницы, + с возможностью указать альтернативные поля и/или подстановку константы. + + + Частичное представление + + Частичное представление - это шаблон в отдельном файле, который может быть вызван для отображения внутри + другого шаблона, хорошо подходит для реализации переиспользуемых фрагментов разметки или для разбиения сложных шаблонов на составные части. + + + Мастер-шаблон + Без мастер-шаблона + Не выбран + + Вставить дочерний шаблон + + @RenderBody() в выбранном месте. + ]]> + + + Определить именованную секцию + + @section { ... }. Такая секци может быть отображена в нужном месте родительского шаблона + при помощи конструкции @RenderSection. + ]]> + + + Вставить именованную секцию + + @RenderSection(name). + Таким образом из дочернего шаблона отображается содержимое внутри конструкции @section [name]{ ... }. + ]]> + + + Название секции + Секция обязательна + + Если секция помечена как обязательная, то дочерний шаблон должен обязательно содержать ее определение @section, в противном случае генерируется ошибка. + + + Генератор запросов + Построить запрос + элементов в результате, за + + Мне нужны + все документы + документы типа "%0%" + из + всего сайта + где + и + + равна + не равна + до + до (включая выбранную дату) + после + после (включая выбранную дату) + равно + не равно + содержит + не содержит + больше, чем + больше или равно + меньше, чем + меньше или равно + + Id + Название + Создан + Обновлен + + сортировать + по возрастанию + по убыванию + + Шаблон + + + Добавить поле замены + Добавить значение по-умолчанию + Альтернативное поле + Текст по-умолчанию + Регистр + Выбрать поле + Преобразовать переводы строк + Заменяет переводы строк на тэг html 'br' + Пользовательские + Только дата + Кодировка + Форматирование и кодировка + Форматировать как дату + Форматировать значение как дату, или как дату и время, в соответствии с текущей культурой + Кодировка HTML + Заменяет спецсимволы эквивалентами в формате HTML + Будет добавлено после поля + Будет вставлено перед полем + В нижнем регистре + Модификации при выводе + -Не указано- + Пример результата + Вставить после поля + Вставить перед полем + Рекурсивно + Да, использовать рекурсию + Разделитель + Стандартные + В верхнем регистре + Кодирование URL + Форматирование специальных символов в URL + Это значение будет использовано только если предыдущие поля пусты + Это значение будет использовано только если первичное поле пусто + Дата и время + + + Задачи, назначенные Вам + назначенные Вам. Для того, чтобы просмотреть подробные сведения, + включая комментарии, нажмите кнопку "Подробно" или просто кликните имя страницы. Вы также можете скачать XML-версию страницы нажав ссылку "Загрузить Xml".
Чтобы закрыть задачу перевода, следует перейти к подробному просмотру и нажать там кнопку "Закрыть". + ]]>
+ Закрыть задачу + Подробности перевода + Загрузить все задачи по переводу в виде xml + Загрузить Xml + Загрузить xml DTD + Поля + Включить дочерние документы + + [%0%] Задание по переводу %1% + Пожалуйста, выберите язык, на который нужно перевести документ(ы) + Пользователей-переводчиков не обнаружено. Пожалуйста, создайте пользователя с ролью переводчика, перед тем как отсылать содержимое на перевод + Созданные Вами задания + созданных Вами. + Чтобы увидеть подробные данные, включая комментарии, нажмите кнопку "Подробно" или просто кликните название страницы. + Вы также можете загрузить XML-версию страницы, нажав на ссылку "Загрузить Xml". Чтобы завершить задачу перевода, Вам следует перейти к подробному просмотру и нажать там кнопку "Закрыть". + ]]> + Документ '%0%' был отправлен на перевод + Отправить документ '%0%' на перевод + Задание назначил + Задача создана + Всего слов + Перевести на + Перевод завершен. + Вы можете просмотреть документы, переведенные Вами, кликнув на ссылке ниже. Если будет найден оригинал документа, Вы увидите его и переведенный вариант в режиме сравнения. + Перевод не сохранен, файл xml может быть поврежден + Опции перевода + Переводчик + Загрузить переведенный xml + + + Аналитика + Обзор кэша + Корзина + Созданные пакеты + Типы данных + Словарь + Установленные пакеты + Установить тему + Установить стартовый набор + Языки + Установить локальный пакет + Макросы + Типы медиа-материалов + Участники + Группы участников + Роли участников + Типы участников + Типы документов + Пакеты дополнений + Пакеты дополнений + Скрипты Python + Типы связей + Установить из репозитория + Установить Runway + Модули Runway + Файлы скриптов + Скрипты + Стили CSS + Шаблоны + Файлы XSLT + + + Доступны обновления + Обновление %0% готово, кликните для загрузки + Нет связи с сервером + Во время проверки обновлений произошла ошибка. Пожалуйста, просмотрите журнал трассировки для получения дополнительной информации. + + + Администратор + Поле категории + Изменить + Изменить пароль + Вы можете сменить свой пароль для доступа к административной панели Umbraco, заполнив нижеследующие поля и нажав на кнопку 'Изменить пароль' + Подтверждение нового пароля + Канал содержимого + Поле описания + Отключить пользователя + Тип документа + Редактор + Исключить поле + Язык + Имя входа (логин) + Начальный узел в Медиа-библиотеке + Разделы + Новый пароль + Отключить доступ к административной панели Umbraco + Прежний пароль + Пароль + Ваш пароль доступа изменен! + Подтвердите новый пароль + Текущий пароль + Укажите новый пароль + Текущий пароль указан неверно + Пароль не может быть пустым + Новый пароль и его подтверждение не совпадают. Попробуйте еще раз + Новый пароль и его подтверждение не совпадают + Заменить разрешения для дочерних документов + Вы изменяете разрешения для следующих документов: + Выберите документы для изменения их разрешений + Сбросить пароль + Поиск всех дочерних документов + Сессия истекает через + Начальный узел содержимого + Переводчик + Имя пользователя + Разрешения для пользователя + Тип пользователя + Типы пользователей + Автор + Ваша недавняя история + Ваш профиль + + + Валидация + Валидация по формату email + Валидация числового значения + Валидация по формату Url + ...или указать свои правила валидации + Обязательно к заполнению + Задайте регулярное выражение + Необходимо выбрать как минимум + Возможно выбрать максимум + элементов + элементов + Неверный формат даты + Не является числом + неверный формат email-адреса + +
diff --git a/src/UmbracoUrlHandling/Umbraco/Config/Lang/sv.xml b/src/UmbracoUrlHandling/Umbraco/Config/Lang/sv.xml new file mode 100644 index 0000000..36712a6 --- /dev/null +++ b/src/UmbracoUrlHandling/Umbraco/Config/Lang/sv.xml @@ -0,0 +1,939 @@ + + + + The Umbraco community + http://our.umbraco.org/documentation/Extending-Umbraco/Language-Files + + + Hantera domännamn + Hantera versioner + Surfa på sidan + Ändra dokumenttyp + Kopiera + Skapa + Skapa paket + Standardvärde + Ta bort + Avaktivera + Töm papperskorgen + Exportera dokumenttyp + Importera dokumenttyp + Importera paket + Redigera i Canvas + Logga ut + Flytta + Meddelanden + Lösenordsskydd + Publicera + Ladda om noder + Publicera hela webbplatsen + Rättigheter + Ångra ändringar + Skicka för publicering + Skicka för översättning + Sortera + Skicka för publicering + Översätt + Avpublicera + Uppdatera + + + Lägg till nytt domännamn + Domännamn + Har skapat domännamnet %0% + Har tagit bort domännamnet %0% + Domänen %0% är redan tillagd + t.ex.: dittdomannamn.se, www.dittdomannamn.se + Domännamnet %0% har uppdaterats + Domänen är redan tilldelad + Ärv + Ogiltigt domännamn + Ogiltig nod + Språk + Redigera domännamn + Ingen behörighet + Ta bort + Domäner + Kultur + eller ärv kulturen från föregående noder. Appliceras även
+ på befintlig nod.]]>
+ + + Visar för + + + Fetstil + Minska indrag + Infoga formulärfält + Infoga grafisk rubrik + Ändra html + Öka indrag + Kursiv + Centrera + Vänsterjustera + Högerjustera + Infoga länk + Infoga intern länk (ankare) + Punktlista + Numrerad lista + Infoga macro + Infoga bild + Ändra relation + Återvänd till lista + Spara + Spara och publicera + Spara och skicka för godkännande + Välj + Välj aktuell mapp + Förhandsgranska + Förhandsgranskning är avstängt på grund av att det inte finns någon mall tilldelad + Annat + Välj stil + Visa stil + Infoga tabell + + + För att ändra vald dokumenttyp, välj först i listan av giltiga typer för denna platsen. + Konfirmera sedan och/eller ändra mappningen av egenskaper från aktuell dokumenttyp till den nya, och klicka sedan på spara. + Innehållet har blivit publicerat på nytt + Aktuell egenskap + Aktuell typ + Dokumenttypen kan inte ändras, eftersom det inte finns några giltiga val för denna plats. + Dokumenttypen är ändrad + Mappningsegenskaper + Mappning till egenskap + Ny sidmall + Ny egenskap + ingen + Innehåll + Välj ny dokumenttyp + Dokumenttypen på valt innehåll har ändrats till [new type] utan problem och följande egenskaper är mappade: + till + Kunde inte slutföra egenskapsmappningen då en eller flera egenskaper har en eller flera mappningar definierade. + Enbart giltiga alternativa egenskaper visas för platsen + + + Du har inte konfigurerat några giltiga färger + + + Om denna sida + Alias + (hur skulle du beskriva denna bild för någon över telefon) + Alternativa länkar + Alternativ text (optionell) + Underliggande noder + Klicka för att redigera detta objekt + Skapad av + Ursprunglig författare + Skapad + Datum/tid som dokumentet skapades + Dokumenttyp + Redigering + Ta bort + Är publicerad + Detta objekt har ändrats efter publicering + Detta objekt är inte publicerat + Senast publicerat + Det finns inget att visa i listan + Länk till medieobjekt + Mediatyp + Medlemsgrupp + Medlem av grupp(er) + Roll + Medlemstyp + Inget datum valt + Sidnamn + Ej medlem av grupp(er) + Egenskaper + Detta dokument är publicerat men syns inte eftersom den överordnade sidan %0% inte är publicerad + Oops: detta dokument är publicerat men finns inte i cacheminnet (internt fel) + Publicera + Publiceringsstatus + Publiceringsdatum + Rensa datum + Sorteringsordningen har uppdaterats + För att sortera noderna, dra i dem eller klicka på någon av kolumnrubrikerna. Du kan markera flera noder samtidigt genom att hålla nere SHIFT eller CONTROL medan du klickar + Statistik + Mål + Titel (valfritt) + Typ + Avpublicera + Avpubliceras + Senast redigerad + Datum/tid detta dokument ändrats + Uppdaterad av + Ta bort fil + Länk till dokument + + + Var vill du skapa den nya %0% + Skapa innehåll under + "dokumenttyper".]]> + "mediatyper".]]> + Välj typ och rubrik + Dokumenttyp utan sidmall + + + Surfa på din webbplats + - Dölj + Om Umbraco inte öppnas kan det bero på att du måste tillåta poppuppfönster att öppnas från denna webbplats + har öppnats i ett nytt fönster + Starta om + Välkommen + Besök + + + Stay + Discard changes + You have unsaved changes + Are you sure you want to navigate away from this page? - you have unsaved changes + + + Done + + Deleted %0% item + Deleted %0% items + Deleted %0% out of %1% item + Deleted %0% out of %1% items + + Published %0% item + Published %0% items + Published %0% out of %1% item + Published %0% out of %1% items + + Unpublished %0% item + Unpublished %0% items + Unpublished %0% out of %1% item + Unpublished %0% out of %1% items + + Moved %0% item + Moved %0% items + Moved %0% out of %1% item + Moved %0% out of %1% items + + Copied %0% item + Copied %0% items + Copied %0% out of %1% item + Copied %0% out of %1% items + + + Namn + Hantera domännamn + Stäng fönstret + Är du säker på att du vill ta bort + Är du säker på att du vill avaktivera + Kryssa i denna ruta för att bekräfta att %0% objekt tas bort + Är du säker? + Är du säker? + Klipp ut + Redigera ord i ordboken + Redigera språk + Infoga ankarlänk + Infoga tecken + Infoga grafisk rubrik + Infoga bild + Lägg in länk + Infoga makro + Infoga tabell + Senast redigerad + Länk + Intern länk: + När du använder lokala länkar, lägg till "#" framför länken + Öppna i nytt fönster? + Makroinställningar + Detta makro innehåller inga egenskaper som du kan redigera + Klistra in + Redigera rättigheter för + Allt som ligger i papperskorgen tas nu bort. Stäng inte detta fönster förrän detta är klart + Papperskorgen är nu tom + Om du tömmer papperskorgen kommer allt som ligger i den att tas bort permanent + regexlib.com's webbtjänst har för närvarande driftsstörningar. Tyvärr kan vi inte göra något åt detta.]]> + Sök efter en regular expression som kan validera ett formulärsfält. t.ex. 'email' eller 'url' + Ta bort makro + Obligatoriskt formulärsfält + Webbplatsen har indexerats + Cache för webbplatsen har uppdaterats. Allt publicerat innehåll är nu uppdaterat. Innehåll som inte har publicerats är fortfarande opublicerat. + Webbplatsens cache kommer att uppdateras. Allt innehåll som är publicerat kommer att uppdateras. Innehåll som inte är publicerat kommer att förbli opublicerat. + Antal kolumner + Antal rader + Ge din platshållare ett id du kan skjuta in innehåll från underordnade sidmallar i platshållaren genom att ge den ett ID. Du refererar sedan till detta ID med hjälp av en <asp:content /> tagg.]]> + Välj ett platshållar-ID från listan nedan. Du kan bara välja de ID som finns i denna malls huvudmall.]]> + Klicka på förhandsgranskningsbilden för att se bilden i full storlek + Välj ett objekt + Se cachat objekt + + + Redigera de olika översättningarna för ordboksinlägget %0% nedan. Du kan lägga till ytterligare språk under 'språk' i menyn till vänster. + Språknamn + + + Tillåt i roten + Endast innehållstyper med denna markerad kan skapas i roten av innehåll samt media + Tillåtna typer för underliggande noder + Dokumenttypssammansättning + Skapa + Skapa en anpassad listvy + Aktuell listvy + Datatyp för markerad listvy + Ta bort flik + Beskrivning + Aktivera listvy + Konfigurerar innehållet till att visa en sorterbar & sökbar lista av nodens barn, barnen kommer ej att visas i trädet. + Ny flik + Radera anpassad listvy + Flik + Miniatyrbild + + + Lägg till värde + Datatyp i databasen + Datatyp GUID + Rendera som + Knappar + Slå på avancerade inställningar för + Slå på kontextmeny + Maximal förinställd storlek för bilder som läggs in + Relaterade stilmallar + Visa etikett + Bredd och höjd + + + Informationen har sparats, men innan du kan publicera denna sida måste du åtgärda följande fel: + Det går inte att byta lösenord i den medlemshanterare du har valt (EnablePasswordRetrieval måste vara satt till 'true'). + %0% redan finns + Följande fel inträffade: + Följande fel inträffade: + Lösenordet måste bestå av minst %0% tecken varav minst %1% är icke-alfanumeriska tecken (t.ex. %, #, !, @). + %0% måste vara ett heltal + %0% under %1% är ett obligatoriskt fält + %0% är ett obligatoriskt fält + %0% under %1% har ett felaktigt format + %0% har ett felaktigt format + + + Även om CodeMirror är aktiverad i konfigurationen, så är den avaktiverad i Internet Explorer på grund av att den inte är tillräckligt stabil + Du måste ange både alias och namn för den nya egenskapstypen! + Filtypen är icke godkännd av administratören + Ett fel upptäcktes i läsningen/skrivningen till den aktuella filen eller mappen + Det finns ett konfigurationsfel med datatypen som används för denna egenskapen, vänligen undersök datatypen + Du måste skriva en rubrik + Du måste välja en typ + Du kommer att göra bilden större än originalstorleken. Är du säker på att du vill fortsätta? + Ett fel inträffade i pythonscriptet + Pythonscriptet har inte sparats eftersom det innehåller ett eller flera fel. + Startsidan har tagits bort, var vänlig kontakta administratören + Du måste markera något innan du kan göra stiländringar + Det finns inga tillgängliga stilar + Placera markören i den vänstra av de två celler du vill slå ihop + Du kan inte dela en cell som inte är ihopslagen. + Fel i XSLT-scriptet + XSLT-scriptet har inte sparats eftersom det innehåller ett eller flera fel + + + Om + Åtgärd + Händelser + Lägg till + Alias + Är du säker? + Kant + eller + Avbryt + Cellmarginal + Välj + Stäng + Stäng fönstret + Kommentar + Bekräfta + Begränsa proportioner + Fortsätt + Kopiera + Skapa + Databas + Datum + Standard + Ta bort + Borttagen + Tar bort... + Design + Dimensioner + Ner + Ladda ned + Redigera + Redigerad + Element + E-post + Fel + Hitta + Mapp + Höjd + Hjälp + Ikon + Importera + Innermarginal + Lägg in + Installera + Justera + Språk + Layout + Laddar + Låst + Logga in + Logga ut + Logga ut + Makro + Fler + Flytta + Namn + Nytt + Nästa + Nej + av + OK + Öppna + eller + Lösenord + Sökväg + Platshållar-ID + Ett ögonblick... + Föregående + Egenskaper + E-postadress för formulärsdata + Papperskorg + Återstående + Döp om + Förnya + Obligatorisk + Försök igen + Rättigheter + Sök + Sökresultat + Server + Visa + Vilken sida skall visas när formuläret är skickat + Storlek + Sortera + Submit + Skriv + Skriv för att söka... + Upp + Uppdatera + Uppgradera + Ladda upp + URL + Användare + Användarnamn + Värde + Välkommen... + Bredd + Titta på + Ja + Reorder + I am done reordering + + + Bakgrundsfärg + Fetstil + Textfärg + Typsnitt + Text + + + Sida + + + Installationsprogrammet kan inte ansluta till databasen. + Kunde inte spara filen web.config. Vänligen ändra databasanslutnings-inställningarna manuellt. + Din databas har lokaliserats och är identifierad som + Databaskonfiguration + installera]]> + Nästa för att fortsätta.]]> + Databasen kunde inte hittas! Kontrollera att informationen i databasanslutnings-inställningarna i filen "web.config" är rätt.

För att fortsätta måste du redigera filen "web.config" (du kan använda Visual Studio eller din favorit text-redigerare), bläddra till slutet, lägg till databasanslutnings-inställningarna för din databas i fältet som heter "umbracoDbDSN" och spara filen.

Klicka på Försök igen knappen när du är klar.
> Mer information om att redigera web.config hittar du här.

]]>
+ Eventuellt kan du behöva kontakta ditt webb-hotell. Om du installerar på en lokal maskin eller server kan du få informationen från din systemadministratör.]]> + Tryck Uppgradera knappen för att uppgradera din databas till Umbraco %0%

Du behöver inte vara orolig. Inget innehåll kommer att raderas och efteråt kommer allt att fungera som vanligt!

]]>
+ Tryck Nästa för att fortsätta.]]> + Nästa för att fortsätta med konfigurationsguiden]]> + Lösenordet på standardanvändaren måste bytas!]]> + Standardanvändaren har avaktiverats eller har inte åtkomst till Umbraco!

Du behöver inte göra något ytterligare här. Klicka Next för att fortsätta.]]> + Standardanvändarens lösenord har ändrats sedan installationen!

Du behöver inte göra något ytterligare här. Klicka Nästa för att fortsätta.]]> + Lösenordet är ändrat! + Umbraco skapar en standardanvändare med login ('admin') och lösenordet ('default'). Det är viktigt att lösenordet ändras till något unikt.

Det här steget kommer kontrollera standardanvändarens lösenord och låta dig vet om det behöver ändras.

]]>
+ Få en flygande start, kolla på våra introduktionsvideor + Genom att klicka på Nästa knappen (eller redigera UmbracoConfigurationStatus i web.config), accepterar du licensavtalet för den här mjukvaran som det är skrivet i rutan nedan. Observera att den här Umbracodistributionen består av två olika licensavtal, "the open source MIT license" för ramverket och "the Umbraco freeware license" som täcker användargränssnittet. + Inte installerad än. + Berörda filer och mappar + Här hittar du mer information om att sätta rättigheter för Umbraco + Du måste ge ASP.NET ändra rättigheter till följande filer/mappar + Dina rättighetsinställningar är nästa perfekta! +

Du kan köra Umbraco utan problem, men du kommer inte att kunna installera paket vilket är rekommenderat för att kunna utnyttja Umbraco fullt ut.]]>
+ Hur skall man lösa + Klicka här för att läsa text-versionen + video-självstudiekurs om hur du konfigurerar mapp-rättigheter för Umbraco eller läs text-versionen.]]> + Dina rättighetsinställningar kan vara ett problem!

Du kan köra Umbraco utan problem, men du kommer inte att kunna skapa mappar eller installera paket vilket är rekommenderat för att kunna utnyttja Umbraco fullt ut.]]>
+ Dina rättighetsinställningar är inte reda för Umbraco!

För att kunna köra Umbraco måste du ändra dina rättighetsinställningar.]]>
+ Dina rättighetsinställningar är perfekta!

Du är redo att köra Umbraco och installera paket!]]>
+ Lösa mapp problem + Följ den här länken för mer information om problem med ASP.NET och att skapa mappar + Konfigurerar mapprättigheter + Umbraco behöver skriv/ändra rättigheter till vissa mappar för att spara filer som bilder och PDFer. Umbraco sparar också temporär data (så kallad cache) för att öka prestandan på din webbplats. + Jag vill börja från början + lär dig hur) Du kan fortfarande välja att installera Runway senare. Gå in i Utvecklarsektionen och välj Paket.]]> + Du har just installerat en ren Umbraco platform. Vad vill du göra härnäst? + Runway är installerat + Det här är vår lista över rekommenderade moduler, markera de moduler du vill installera, eller visa den fullständiga listan]]> + Endast rekommenderad för erfarna användare + Jag vill börja med en enkel webbplats + "Runway" är en enkel webbplats med några enkla dokumentyper och mallar. Installationsguiden kan automatiskt installera Runway åt dig, men du kan lätt ändra, utöka eller ta bort den. Det är inte nödvändigt och du kan använda Umbraco utan den, men Runway erbjuder en enkel grund baserad på bästa praxis för att hjälpa dig igång snabbare än någonsin tidigare. Om du väljer att installera Runway, kan du välja till grundläggande byggstenar så kallade Runway-moduler för att utöka dina Runway-sidor.

Inkluderat i Runway: Startsida, "komma igång"-sida och en sidan om att installera moduler.
Tilläggs moduler: Toppnavigation, Sitemap, Kontakt och galleri.
]]>
+ Vad är Runway + Steg 1/5 Acceptera licensavtalet + Steg 2/5: Databaskonfiguration + Steg 3/5: Bekräftar filrättigheter + Steg 4/5: Umbraco säkerhetskontroll + Steg 5/5: Umbraco är redo att ge dig en flygande start + Tack för att du valde Umbraco + Besök din nya webbplats Du installerade Runway, så varför inte se hur din nya webbplats ser ut.]]> + Ytterligare hjälp och information Få hjälp från våra prisbelönta community, bläddra i dokumentationen eller titta på några gratis videor om hur man bygger en enkel webbplats, hur du använder paket eller en snabbguide till Umbracos terminologi]]> + Umbraco %0% är installerat och klart för användning + /web.config filen och ändra AppSettingsnyckeln UmbracoConfigurationStatus på slutet till %0%]]> + börja omedelbart genom att klicka på "Starta Umbraco"-knappen nedan.
Om du är en ny Umbraco användarekan du hitta massor av resurser på våra kom igång sidor.]]>
+ Starta Umbraco För att administrera din webbplats öppnar du bara Umbraco back office och börjar lägga till innehåll, uppdatera mallar och stilmallar eller lägga till nya funktioner.]]> + Anslutningen till databasen misslyckades. + Se + Umbraco %0% antingen för en ny installation eller en uppgradering från version 3.0.

Tryck på "next" för att börja.]]>
+ Umbraco Version 3 + Umbraco Version 4 + + + Språkkod + Språknamn + + + Du har varit inaktiv och kommer automatiskt att loggas ut + Förnya nu för att spara ditt arbete + + + © 2001 - %0%
umbraco.com

]]>
+ Happy super Sunday + Happy manic Monday + Happy tremendous Tuesday + Happy wonderful Wednesday + Happy thunderous Thursday + Happy friendly Friday + Happy shiny Saturday + Logga in nedan + Logga in med + Sessionen har nått sin maxgräns + + + Översikt + Sektioner + Innehåll + + + Klicka för att ladda upp + Släpp dina filer här... + + + Välj sida ovan... + %0% har kopierats till %1% + Ange mål att kopiera sidan %0% till nedan + %0% har flyttats till %1% + Ange vart sidan %0% skall flyttas till nedan + är nu roten för ditt nya innehåll. Klicka 'ok' nedan. + Du har inte valt någon sida än. Välj en sida i listan ovan och klicka sedan 'fortsätt'. + Aktuell nod får inte existera i roten + Den aktuella sidan får inte vara undersida till den valda sidan eftersom den har fel dokumenttyp. + Den aktuella sidan kan inte flyttas till en av sina egna undersidor. + Händelsen är inte tillåten på grund av att du inte har tillräckliga rättigheter till 1 eller flera underliggande sidor + Relatera kopierat objekt till orginalet + + + Inställningar för notifieringar gällande %0% + Hej %0% Detta mail skickas till dig automatiskt för att meddela att '%1%' har utförts på sidan '%2%' av användaren '%3%' Gå till http://%4%/actions/editContent.aspx?id=%5% för att redigera. + Hej %0%

Detta mail skickas till dig automatiskt för att meddela att '%1%' har utförts på sidan '%2%' av användaren '%3%'

Sammanfattning av uppdateringen:

%6%

]]>
+ [%0%] Meddelande för att informera om att %1% har utförts på %2% + Notifieringar + + + och leta upp paketet. Umbracos installationspaket har oftast filändelsen ".umb" eller ".zip".]]> + Utvecklare + Demonstration + Dokumentation + Paket metadata + Paketnamn + Paketet innehåller inga poster +
Det är säkert att ta bort den ur systemet genom att klicka på "avinstallera paket" nedan.]]>
+ Inga uppdateringar tillgängliga + Paketalternativ + Paket läsmig + Paketvalv + Bekräfta avinstallation + Paketet har avinstallerats + Paketet har avinstallerats utan problem + Avinstallera paket + OBS! dokument, media osv som använder de borttagna posterna kommer sluta fungera vilket kan leda till att systemet blir instabilt. Avinstallera därför med försiktighet. Om du är osäker, kontakta personen som skapat paketet.]]> + Hämta uppdatering från paketvalvet + Uppdatera paket + Uppdateringsinstruktioner + Det finns an uppdaterad version av paketet. Du kan hämta den direkt från Umbracos paketvalv. + Paketversion + Versionshistorik för paket + Besök paketets webbplats + + + Klistra in med helt bibehållen formatering (rekommenderas ej) + Texten du försöker klistra in innehåller specialtecken och/eller formateringstaggar. Detta kan bero på att texten kommer från t.ex. Microsoft Word. Umbraco kan ta bort specialtecken och formateringstaggar automatiskt så att innehållet lämpar sig bättre för webbpublicering. + Klistra in texten helt utan formatering + Klistra in texen och ta bort specialformatering (rekommenderas) + + + Fyll i ett namn... + Skriv för att filtrera... + Namnge %0%... + Fyll i ditt lösenord + Skriv för att söka... + Fyll i ditt lösenord + Skriv för att lägga till taggar (och tryck enter efter varje tagg)... + Ditt användarnamn är vanligtvis din e-postadress + + + Rollbaserat lösenordsskydd + Då används Umbracos medlemsgrupper.]]> + Du måste skapa en medlemsgrupp innan du kan använda rollbaserat lösenordsskydd. + Sida med felmeddelande + Används när en användare är inloggad, men saknar rättigheter att se sidan + Välj hur du vill lösenordsskydda sidan + %0% är nu lösenordsskyddad + Lösenordsskyddet är nu borttaget på %0% + Inloggningssida + Välj sidan med inloggningsformuläret + Ta bort lösenordsskydd + Välj sidorna med inloggningsformulär och felmeddelande + Välj de roller som ska ha tillgång till denna sida + Ange användarnamn och lösenord för denna sida + Samma lösenord för alla användare + Välj detta alternativ om du vill skydda sidan med ett enkelt användarnamn och lösenord. Alla loggar då in med samma inloggningsuppgifter. + + + %0% kunde inte publiceras på grund av dess tidsinställda publicering. + %0% kunde inte publiceras på grund av att ett tredjepartstillägg avbröt publiceringen. + %0% kan inte publiceras, på grund av att överordnad nod inte är publicerad. + %0% kunde inte publiceras på grund av följande orsaker: %1% passerade inte valideringen. + Inkludera opublicerade undersidor + Publicering pågår - vänligen vänta... + %0% av %1% sidor har publicerats... + %0% har publicerats + %0% och underliggande sidor har publicerats + Publicera %0% och alla dess underordnade sidor + ok för att publicera %0%. Därmed blir innehållet publikt.

Du kan publicera denna sida och alla dess undersidor genom att kryssa i publicera alla undersidor. ]]>
+ + + ange en extern länk + ange en intern sida + Rubrik + Länk + Öppna i nytt fönster + Ange visningstext + Ange adress + + + Återställ + + + Nuvarande version + Röd text kommer inte att synas i den valda versionen. , Grön betyder att den har tillkommit]]> + Dokumentet har återgått till en tidigare version + Här visas den valda sidversionen i HTML. Om du vill se skillnaden mellan två versioner samtidigt, välj istället "Diff". + Återgå till + Vald version + Visningsläge + + + Redigera script + + + Analytics + Concierge + Innehåll + Courier + Utvecklare + Formulär + Hjälp + Umbraco konfigurationsguide + Media + Medlemmar + Nyhetsbrev + Inställningar + Statistik + Översättning + Användare + + + som huvudinnehållstyp. Tabbar från huvudinnehållstyper visas inte och kan endast redigeras på själva huvudinnehållstypen. + Huvudinnehållstyp påslagen + Denna huvudinnehållstyp använder + Defaultmall + Ordboksnyckel + För att importera en dokumenttyp, leta upp ".udt"-filen på din hårddisk genom att klicka på "Browse"-knappen och sedan på "Importera" (du får bekräfta ditt val i nästa steg). + Namn på ny flik + Nodtyp + Inga egenskaper definierade i denna sektion. Klicka på "Lägg till ny egenskap" länken vid toppen för att skapa en ny egenskap. + Typ + Skript + Stilmall + Egenskap för stilmall + Flik + Fliknamn + Flikar + Huvuddokumenttyp + Skapa matchande mall + + + Sort order + Creation date + Sortering klar + Välj i vilken ordning du vill ha sidorna genom att dra dem upp eller ner i listan. Du kan också klicka på kolumnrubrikerna för att sortera grupper av sidor +
Stäng inte fönstret under tiden sidorna sorteras.]]>
+ + + Publiceringen avbröts av ett tredjepartstillägg + Egenskapstyp finns redan + Egenskapstyp skapad + Datatyp: %1%]]> + Egenskapstypen har tagits bort + Innehållstypen har sparats + Ny flik skapad + Fliken har tagits bort + Fliken med id: %0% har tagits bort + Innehållet är avpublicerat + Stilmallen kunde inte sparas + Stilmallen sparades + Stilmallen sparades utan fel + Datatypen har sparats + Ordet sparades i ordboken + Det gick inte att publicera sidan eftersom dess överordnade sida inte är publicerad + Innehållet är publicerat + och syns på webbplatsen + Innehållet har sparats + Kom ihåg att publicera för att ändringarna ska synas på webbplatsen + Skickat för godkännande + Ändringarna har skickats för godkännande + Mediaobjektet är sparat + Media sparat + Medlemmen har sparats + Egenskap för stilmall har sparats + Stilmallen har sparats + Sidmallen har sparats + Ett fel inträffade när användaren sparades (läs logg-filen) + Användaren har sparats + Användartypen har sparats + Filen sparades inte + filen kunde inte sparas. Kontrollera filrättigheterna + Filen har sparats + Filen sparades utan fel + Språket har sparats + Partial view Ej sparad + Ett fel uppstod när filen sparades + Partial view sparad + Partial view sparad utan fel! + Pythonscriptet har inte sparats + Pythonscriptet kunde inte sparas på grund av ett fel + Pythonscriptet har sparats + Inga fel i pythonscriptet + Sidmallen har inte sparats + Kontrollera att du inte har två sidmallar med samma alias + Sidmallen har sparats + Sidmallen sparades utan fel + XSLT-scriptet sparades inte + XSLT-scriptet innehöll ett fel + XSLT-scripet kunde inte sparas, kontrollera filrättigheterna + XSLT-scriptet har sparats + Inga fel i XSLT-scriptet + + + Använder CSS-syntax, t ex: h1, .redHeader, .blueTex + Redigera stilmall + Redigera egenskaper för stilmall + Namnet som används för att identifiera stilen i HTML-editorn + Förhandsgranska + Stilar + + + Redigera sidmall + Lägg in innehållsyta + Lägg in platshållare för innehållsyta + Lägg in ord från ordboken + Lägg in makro + Lägg in sidfält + Huvudmall + Snabbguide för taggar i Umbracos sidmallar + Sidmall + + + Lägg till + Choose layout + Lägg till rad + Add content + Drop content + Styles applied + Indholdet er ikke tilladt her + Indholdet er tilladt her + Klicka för att lägga in + Klicka för att lägga till bild + Bildtext... + Skriv här... + Rutnätslayouter + Layouter är arbetsytan för rutnätet, oftast så behöver du bara en eller två layouter + Lägg till layout + Redigera layouten genom att sätta kolumnbredd och lägg till fler sektioner + Radkonfigureringar + Rader är fördefinierade celler, arrangerade horisontellt + Lägg till radkonfiguration + Justera rad genom att ställa in cellbredder och lägga till ytterligare celler + Kolumner + Sammanlagda antalet kolumner i rutnätslayout + Inställningar + Konfigurera vilka inställningar redaktörer kan ändra + Stilar + Konfigurera vilken styling redaktörer kan ändra + Inställningarna kommer bara att sparas om det inmatade json-konfigurationen är giltig + Tillåt alla editors + Tillåt alla rad- konfigurationer + + + Alternativt fält + Alternativ text + Casing + Välj fält + Konvertera radbrytningar + Byter radbrytningar mot html-taggen &lt;br&gt; + Anpassade fält + Ja, endast datum + Omkodning + Formatera som datum + HTML-omkodning + Ersätter specialtecken med deras HTML-motsvarigheter. + Kommer läggas till efter fältets värde + Kommer läggas till före fältets värde + Gemener + Ingen + Infoga efter fält + Infoga före fält + Rekursiv + Standardfält + Versaler + URL-koda + Om fältets innehåll skall sändas till en url, skall detta slås på så att specialtecken kodas + Texten kommer användas om ovanstående fält är tomma + Fältet kommer användas om det primära fältet ovan är tomt + Ja, med tid. Separator: + + + Arbetsuppgifter som tilldelats dig + som har tilldelats dig. För att se en detaljvy med kommentarer, klicka på "Detaljer" eller på sidans namn. Du kan också ladda ned sidan i XML-format genom att klicka på länken "Ladda ned XML".
För att markera ett översättningsjobb som avslutat, gå till detaljvyn och klicka på knappen "Stäng".]]>
+ Stäng arbetsuppgift + Översättningsdetaljer + Ladda ned alla översättningsjobb i XML-format + Ladda ned i XML-format + Ladda hem DTD för XML + Fält + Inkludera undersidor + Hej %0%. Detta är ett automatisk mail skickat for att informera dig om att det finns en översättningsförfrågan på dokument '%1%' till '%5%' skickad av %2%. För att redigera, besök http://%3%/translation/details.aspx?id=%4%. För att få en översikt över dina översättningsuppgigter loggar du in i Umbraco på: http://%3% + [%0%] Översättningsuppgift för %1% + Hittade inga användare som är översättare. Vänligen skapa en användare som är översättare innan du börjar skicka innehåll för översättning + Arbetsuppgifter som du har skapat + som du har skapat. För att se en detaljvy med kommentarer, klicka på "Detaljer" eller på sidans namn. Du kan också ladda ned sidan i XML-format genom att klicka på länken "Ladda ned XML".
För att markera ett översättningsjobb som avslutat, gå till detaljvyn och klicka på knappen "Stäng".]]>
+ Sidan %0% har skickats för översättning + Skicka sidan %0% för översättning + Tilldelat av + Arbetsuppgift öppnad + Totalt antal ord + Översätt till + Översättning klar. + Du kan förhandsgranska sidorna du nyss har översatt genom att klicka nedan. Om originalsidan finns kommer du att se en jämförelse mellan din sida och originalsidan. + Översättningen misslyckades. XML-filen kan vara korrupt + Valmöjligheter översättning + Översättare + Ladda upp översättning i XML-format + + + Analytics + Cacha webbläsare + Papperskorg + Skapade paket + Datatyper + Ordbok + Installerade paket + Installera skin + Installera Startkit + Språk + Installera lokalt paket + Makron + Mediatyper + Medlem + Medlemsgrupper + Roller + Medlemstyper + Dokumenttyper + Paket + Paket + Python-filer + Installera från gemensamt bibliotek + Installera Runway + Runway-moduler + Skript-filer + Skript + Stilmallar + Sidmallar + XSLT-filer + + + Ny uppdatering tillgänglig + %0% är klart, klicka här för att ladda ner + Ingen kontakt med server + Fel vid kontroll av uppdatering. Se trace-stack för mer information. + + + Administratör + Kategorifält + Ändra lösenord + Du kan byta ditt lösenord för Umbraco Back Office genom att fylla i nedanstående formulär och klicka på knappen "Ändra lösenord". + Bekräfta det nya lösenordet + Innehållskanal + Fält för beskrivning + Avaktivera användare + Dokumenttyp + Redaktör + Fält för utdrag + Språk + Login + Startnod i mediabiblioteket + Sektioner + Byt ditt lösenord + Inaktivera tillgång till Umbraco + Lösenord + Ditt lösenord är nu ändrat! + Vänligen bekräfta ditt nya lösenord + Nuvarande lösenord + Vänligen fyll i ditt nya lösenord + Nuvarande lösenord är ogiltigt + Ditt nya lösenord kan inte vara tomt! + Lösenorden matchar inte. Vänligen försök igen! + Det bekräftade lösenordet matchar inte det nya lösenordet! + Ersätt rättigheterna på underliggande noder + Du redigerar nu rättigheterna för sidorna: + Välj de sidor vars rättigheter du vill redigera + Återställ lösenord + Sök igenom alla undernoder + Sessionen går ut + Startnod i innehåll + Användarens namn + Användarrättigheter + Användartyp + Användartyper + Skribent + Din nuvarande historik + Översättare + Din profil + +
diff --git a/src/UmbracoUrlHandling/Umbraco/Config/Lang/zh.xml b/src/UmbracoUrlHandling/Umbraco/Config/Lang/zh.xml new file mode 100644 index 0000000..8d6aab9 --- /dev/null +++ b/src/UmbracoUrlHandling/Umbraco/Config/Lang/zh.xml @@ -0,0 +1,1635 @@ + + + + 黄仁祥(wanddy@163.com) + http://our.umbraco.org/documentation/Extending-Umbraco/Language-Files + + + 管理主机名 + 跟踪审计 + 浏览节点 + 改变文档类型 + 复制 + 创建 + 创建扩展包 + 删除 + 禁用 + 清空回收站 + 导出文档类型 + 导入文档类型 + 导入扩展包 + 实时编辑模式 + 退出 + 移动 + 提醒 + 公众访问权限 + 发布 + 取消发布 + 重新加载节点 + 重新发布整站 + 恢复 + 为 %0%设置权限 + 选择移动目的地 + 到下列的树结构中 + 权限 + 回滚 + 提交至发布者 + 发送给翻译 + 排序 + 提交至发布者 + 翻译 + 更新 + 默认值 + + + 禁止访问 + 添加域名 + 移除 + 错误的节点 + 域名错误 + 域名重复 + 语言 + 域名 + 新域名 '%0%' 已创建 + 域名 '%0%' 已删除 + 域名 '%0%' 已使用 + 域名 '%0%' 已更新 + 编辑当前域名 + + + https://www.example.com/、example.com/en、……使用 * 代表任意域名,
+ 只需要设置语言部分即可。]]> +
+ 继承 + 语言 + + + 也可以从父节点继承。]]> + + 域名 + + + 查看 + + + 清除选择 + 选择 + 选择当前目录 + 其它功能 + 粗体 + 取消段落缩进 + 插入表单字段 + 插入图片标题 + 编辑Html + 段落缩进 + 斜体 + 居中 + 左对齐 + 右对齐 + 插入链接 + 插入本地链接(锚点) + 圆点列表 + 数字列表 + 插入宏 + 插入图片 + 编辑关联 + 返回列表 + 保存 + 保存并发布 + 保存并提交审核 + 保存列表视图 + 预览 + 因未设置模板无法预览 + 选择样式 + 显示样式 + 插入表格 + 生成模型 + 撤销 + 重做 + + + 要更改所选节点的文档类型,先在列表中选择合适的文档类型。 + 然后设置当前文档类型到新文档类型的各字段间的对应映射关系并保存。 + 内容已被重新发布 + 当前属性 + 当前类型 + 不能改变文档类型,因为没有可替代的类型。 + 文档类型已更改 + 要映射的字段 + 映射字段 + 新模板 + 新类型 + + 内容 + 选择新的文档类型 + 选中文档的类型已被成功更改为[new type],以下字段被映射: + + 不能完成字段映射,因为存在一个字段映射至多字段的问题。 + 仅显示可作为替代的文档类型。 + + + 已发布 + 关于本页 + 别名 + (图片的替代文本) + 替代链接 + 点击编辑 + 创建者 + 原作者 + 更新者 + 创建时间 + 创建此文档的日期/时间 + 文档类型 + 编辑 + 过期于 + 该项发布之后有更改 + 该项没有发布 + 最近发布 + 没有要显示的项目 + 列表中没有要显示的项目。 + 媒体类型 + 媒体链接地址 + 会员组 + 角色 + 会员类型 + 没有选择时间 + 页标题 + 属性 + 该文档不可见,因为其上级 '%0%' 未发布。 + 该文档已发布,但是没有更新至缓存(内部错误) + 无法获取网址 + 此文档已发布,但其url将与内容相冲突 %0% + 发布 + 发布状态 + 发布于 + 取消发布于 + 清空时间 + 排序完成 + 拖拽项目或单击列头即可排序,可以按住Shift多选。 + 统计 + 标题(可选) + 备选 (可选) + 类型 + 取消发布 + 最近编辑 + 编辑此文档的日期/时间 + 移除文件 + 链接到文档 + 会员组成员 + 非会员组成员 + 子项 + 目标 + 这将转换到服务器上的以下时间: + 这是什么意思?]]> + 添加其他文本框 + 删除此文本框 + + + 点击上传 + 将文件放在此处.. + 链接到媒体 + 或单击此处选择文件 + 仅允许的文件类型为 + 最大文件大小为 + + + 创建新成员 + 所有成员 + + + 您想在哪里创建 %0% + 创建在 + 选择类型和标题 + "文档类型" 下的 "设置" 部分中启用这些内容。]]> + "媒体类型" 下的 "设置" 部分中启用这些内容。]]> + 没有模板的文档类型 + 新建文件夹 + 新数据类型 + 新建 javascript 文件 + 新建空分部视图 + 新的分部视图宏 + 从代码段中新建分部视图 + 新的空分部视图宏 + 从代码段中新建分部视图宏 + 新的分部视图宏 (不带宏) + + + 浏览您的网站 + - 隐藏 + 如果Umbraco没有打开,您可能需要允许弹出式窗口。 + 已经在新窗口中打开 + 重启 + 访问 + 欢迎 + + + 保持 + 丢弃更改 + 您有未保存的更改 + 确实要离开此页吗?-您有未保存的更改 + + + 完成 + 已删除 %0% 项 + 已删除 %0% 项 + 已删除 %0% 项,共 %1% 项 + 已删除 %0% 项,共 %1% 项 + 已发布 %0% 项 + 已发布 %0% 项 + 已发布 %0% 项,共 %1% 项 + 已发布 %0% 项,共 %1% 项 + 已取消发布 %0% 项 + 已取消发布 %0% 项 + 已取消发布 %0% 项,共 %1% 项 + 已取消发布 %0% 项,共 %1% 项 + 已移动 %0% 项 + 已移动 %0% 项 + 已移动 %0% 项,共 %1% 项 + 已移动 %0% 项,共 %1% 项 + 已复制 %0% 项 + 已复制 %0% 项 + 已复制 %0% 项,共 %1% 项 + 已复制 %0% 项,共 %1% 项 + + + 锚点名称 + 管理主机名 + 关闭窗口 + 您确定要删除吗 + 您确定要禁用吗 + 单击此框确定删除%0%项 + 您确定吗? + 您确定吗? + 剪切 + 编辑字典项 + 编辑语言 + 插入本地链接 + 插入字符 + 插入图片标题 + 插入图片 + 插入链接 + 插入宏 + 插入表格 + 最近编辑 + 链接 + 内部链接: + 本地链接请用“#”号开头 + 在新窗口中打开? + 宏设置 + + 粘贴 + 编辑权限 + 正在清空回收站,请不要关闭窗口。 + 回收站已清空 + 从回收站删除的项目将不可恢复 + regexlib.com的服务暂时出现问题。]]> + 查找正则表达式来验证输入,如: 'email、'zip-code'、'url'。 + 移除宏 + 必填项 + 站点已重建索引 + 网站缓存已刷新,所有已发布的内容更新生效。 + 网站缓存将会刷新,所有已发布的内容将会更新。 + 表格列数 + 表格行数 + + 设置一个占位符id 您可以在子模板中通过该ID来插入内容, + 引用格式: <asp:content />。]]> + + + 选择一个 + 占位符id。]]> + + 点击图片查看完整大小 + 拾取项 + 查看缓存项 + 创建文件夹... + 与原始连接 + 包括后代 + 最友好的社区 + 链接到页面 + 在新窗口或选项卡中打开链接的文档 + 链接到媒体 + 选择媒体 + 选择图标 + 选择项 + 选择链接 + 选择宏 + 选择内容 + 选择成员 + 选择成员组 + 未找到图标 + 此宏没有参数 + 外部登录提供程序 + 异常详细信息 + 堆栈跟踪 + 内部异常 + 链接您的 + 取消链接您的 + 帐户 + 选择编辑器 + 帐号 + 选择编辑器 + 选择代码段 + + + + %0%’
您可以在左侧的“语言”中添加一种语言 + ]]> +
+ 语言名称 + 编辑字典项的键。 + + + + + + 输入您的用户名 + 输入您的密码 + 确认密码 + 命名 %0%... + 输入用户名... + 标签... + 输入说明... + 输入搜索关键字... + 输入过滤词... + 键入添加tags (在每个tag之后按 enter)... + 输入您的电子邮件 + 您的用户名通常是您的电子邮件 + + + 允许在根目录 + 只能在内容和媒体树的根级别创建具有选中的内容类型 + 允许子项节点类型 + 文档类型组合 + 创建 + 删除选项卡 + 描述 + 新建选项卡 + 选项卡 + 缩略图 + 启用列表视图 + 配置内容项以显示可排序和搜索的子项列表, 这些子项将不会显示在树中 + 当前列表视图 + 活动列表视图数据类型 + 创建自定义列表视图 + 删除自定义列表视图 + + + 添加预设值 + 数据库数据类型 + 数据类型唯一标识 + 渲染控件 + 按钮 + 允许高级设置 + 允许快捷菜单 + 插入图片默认最大 + 关联的样式表 + 显示标签 + 宽和高 + 所有属性类型 & 属性数据 + 使用此数据类型将被永久删除, 请确认您还要删除这些 + 是, 删除 + 以及使用此数据类型的所有属性类型 & 属性数据 + 选择要移动的文件夹 + 在树结构下面 + 被移到下面 + + + 数据已保存,但是发布前您需要修正一些错误: + 当前成员提供程序不支持修改密码(EnablePasswordRetrieval的值应该为true) + %0% 已存在 + 发现错误: + 发现错误: + 密码最少%0%位,且至少包含%1%位非字母数字符号 + %0% 必须是整数 + %1% 中的 %0% 字段是必填项 + %0% 是必填项 + %1% 中的 %0% 格式不正确 + %0% 格式不正确 + + + 从服务器收到错误 + 该文件类型已被管理员禁用 + 注意,尽管配置中允许CodeMirror,但是它在IE上不够稳定,所以无法在IE运行。 + 请为新的属性类型填写名称和别名! + 权限有问题,访问指定文件或文件夹失败! + 加载Partial视图脚本时出错(文件: %0%) + 加载 userControl 时出错 '%0%' + 加载 customControl 时出错(程序集: %0%, 类型: '%1%') + 加载 MacroEngine 脚本时出错 (文件: %0%) + "解析 xslt 文件时出错: %0% + "读取 xslt 文件时出错: %0% + 请输入标题 + 请选择类型 + 图片尺寸大于原始尺寸不会提高图片质量,您确定要把图片尺寸变大吗? + python脚本错误 + python脚本未保存,因为包含错误。 + 默认打开页面不存在,请联系管理员 + 请先选择内容,再设置样式。 + 没有可用的样式 + 请把光标放在您要合并的两个单元格中的左边单元格 + 非合并单元格不能分离。 + XSLT源码出错 + XSLT未保存,因为包含错误。 + 此属性使用的数据类型存在配置错误, 请检查数据类型 + + + 关于 + 操作 + 操作 + 添加 + 别名 + 所有 + 您确定吗? + 返回 + 边框 + + 取消 + 单元格边距 + 选择 + 关闭 + 关闭窗口 + 备注 + 确认 + 约束 + 强制属性 + 继续 + 复制 + 创建 + 数据库 + 时间 + 默认 + 删除 + 已删除 + 正在删除… + 设计 + 字典 + 规格 + + 下载 + 编辑 + 已编辑 + 元素 + 邮箱 + 错误 + 查找文档 + 第一 + + 帮助 + 图标 + 导入 + 内边距 + 插入 + 安装 + 无效 + 对齐 + 语言 + 最后 + 布局 + 加载中 + 锁定 + 登录 + 退出 + 注销 + + 必填项 + 移动 + 更多 + 名称 + 新的 + 下一步 + + 属于 + 确定 + 打开 + + 密码 + 路径 + 占位符ID + 请稍候… + 上一步 + 属性 + 接收数据邮箱 + 回收站 + 保持状态中 + 移除 + 重命名 + 更新 + 必填 + 重试 + 权限 + 搜索 + 对不起, 我们找不到你要找的东西。 + 未添加任何项目 + 服务器 + 显示 + 在发送时预览 + 大小 + 排序 + 提交 + + 类型 + 输入内容开始查找… + + 更新 + 更新 + 上传 + 链接地址 + 用户 + 用户名 + + 查看 + 欢迎… + + + 文件夹 + 搜索结果 + 重新排序 + 我已结束排序 + 预览 + 更改密码 + + 列表视图 + 保存中... + 当前 + 嵌入 + 已选择 + + + + 黑色 + 绿色 + 黄色 + 橙色 + 蓝色 + 红色 + + + + 添加选项卡 + 添加属性 + 添加编辑器 + 添加模板 + 添加子节点 + 添加子项 + 编辑数据类型 + 导航节 + 快捷方式 + 显示快捷方式 + 切换列表视图 + 切换允许作为根 + 注释/取消注释行 + 移除行 + 向上复制行 + 向下复制行 + 向上移动行 + 向下移动线条 + 一般 + 编辑 + + + + 背景色 + 粗体 + 前景色 + 字体 + 文本 + + + + 页面 + + + 无法连接到数据库。 + 无法保存web.config文件,请手工修改。 + 发现数据库 + 数据库配置 + + 安装进行 %0% 数据库配置 + ]]> + + 下一步继续。]]> + + 数据库未找到!请检查数据库连接串设置。

+

您可以自行编辑“web.config”文件,键名为 “UmbracoDbDSN”

+

+ 当自行编辑后,单击重试按钮
。 + 如何编辑web.config

+ ]]> +
+ + + 如有必要,请联系您的系统管理员。 + 如果您是本机安装,请使用管理员账号。]]> + + + + 点击更新来更新系统到 %0%

+

+ 不用担心更新会丢失数据! +

+ ]]> +
+ 点击下一步继续。]]> + + 下一步继续]]> + 需要修改默认密码!]]> + 默认账户已禁用或无权访问系统!

点击下一步继续。]]> + 安装过程中默认用户密码已更改

点击下一步继续。]]> + 密码已更改 + + + 系统创建了一个默认用户(‘admin’)和默认密码(‘default’)。 + 现在密码是随机的。 +

+

+ 该步骤建议您修改默认密码。 +

+ ]]> +
+ 作为入门者,从视频教程开始吧! + 点击下一步 (或在Web.config中自行修改UmbracoConfigurationStatus),意味着您接受上述许可协议。 + 安装失败。 + 受影响的文件和文件夹 + 此处查看更多信息 + 您需要对以下文件和文件夹授于ASP.NET用户修改权限 + + 您当前的安全设置满足要求!

+ 您可以毫无问题的运行系统,但您不能安装系统所推荐的扩展包的完整功能。]]> +
+ 如何解决 + 点击阅读文字版 + 视频教程 ]]> + + 您当前的安全设置有问题! +

+ 您可以毫无问题的运行系统,但您不能新建文件夹、也不能安装系统所推荐的包的完整功能。 ]]> +
+ + 您当前的安全设置不适合于系统! +

+ 您需要修改系统访问权限。]]> +
+ + 您当前的权限设置正确!

+ 您可以运行系统并安装其它扩展包!]]> +
+ 解决文件夹问题 + 点此查看ASP.NET和创建文件夹的问题解决方案 + 设置文件夹权限 + + + + 我要从头开始 + + 如何操作?) + 您也可以安装晚一些安装“Runway”。 + ]]> + + 您刚刚安装了一个干净的系统,要继续吗? + “Runway”已安装 + + + 这是我们推荐的模块,您也可以查看 全部模块 + ]]> + + 仅推荐高级用户使用 + 给我一个简单的网站 + + + “Runway”是一个简单的,包含文件类型和模板的示例网站。安装程序会自动为您安装。 + 您可以自行编辑和删除之。 + “Runway”为新手提供了最佳的入门功能 + +

+ + Runway: 主页, 开始页, 安装模块页.
+ 可选模块: 顶部导航, 站点地图, 联系我们, 图库. +
+ ]]> +
+ “Runway”是什么? + 步骤 1/5:接受许可协议 + 步骤 2/5:数据库配置 + 步骤 3/5:文件权限验证 + 步骤 4/5:系统安全性 + 步骤 5/5:一切就绪,可以开始使用系统。 + 感谢选择我们的产品 + + 浏览您的新站点 +您安装了“Runway”,那么来瞧瞧吧。]]> + + + 更多的帮助信息 +从社区获取帮助]]> + + 系统 %0% 安装完毕 + + /web.config file 的 AppSetting 键 + UmbracoConfigurationStatus'%0%'。]]> + + 立即开始请点“运行系统”
如果您是新手, 您可以得到相当丰富的学习资源。]]>
+ + 运行系统 +管理您的网站, 运行后台添加内容, +也可以添加模板和功能。]]> + + 无法连接到数据库。 + 系统版本 3 + 系统版本 4 + 观看 + +
+按 “下一步”进入向导。]]> +
+ + + 语言代码 + 语言名称 + + + 用户在空闲状态下将会自动注销 + 已更新,继续工作。 + + + 星期一快乐 + 星期二快乐 + 星期三快乐 + 星期四快乐 + 星期五快乐 + 星期六快乐 + 星期天快乐 + 在下方登录 + 登录 + 会话超时 + © 2001 - %0%
Umbraco.com

]]>
+ 忘记密码? + 电子邮件将发送到地址指定的链接, 以重置您的密码 + 如果电子邮件与我们的记录相符, 则将发送带有密码重置指令的邮件 + 返回登录表单 + 请提供新密码 + 您的密码已更新 + 您单击的链接无效或已过期 + Umbraco: 重置密码 + + 您的用户名登录到 Umbraco 后台是: %0%

点击 这里 重置密码,或复制链接粘贴到您的浏览器访问:

%1%

]]> +
+ + + 仪表板 + 区域 + 内容 + + + 选择上面的页面… + %0% 被复制到 %1% + 将 %0% 复制到 + %0% 已被移动到 %1% + 将 %0% 移动到 + 作为内容的根结点,点“确定”。 + 尚未选择节点,请选择一个节点点击“确定”。 + 类型不符不允许选择 + 该项不能移到其子项 + 当前节点不能建在根节点下 + 您在子项的权限不够,不允许该操作。 + 复本和原本建立关联 + + + 为 %0% 编写通知 + + + + + %0%:

+ +

您好!这是一封自动发送的邮件,告诉您任务'%1%' + 已在'%2%' + 被用户'%3%'执行 +

+ +

+

更新概况:

+ + %6% +
+

+ + + +

祝您愉快!

+ 该信息由系统自动发送 +

]]> +
+ 在 %2%,[%0%] 关于 %1% 的通告已执行。 + 通知 + + + + + 选择 ".umb" 或者 ".zip" 文件 + ]]> + + 拖入上传 + 或单击此处选择文件 + 上传包 + 通过从计算机中选择一个本地包来安装它。仅从您知道和信任的来源安装软件包 + 上传另一包 + 取消并上载另一个包 + 许可证 + 我接受 + 使用条款 + 安装包 + 完成 + 已安装的软件包 + 您没有安装任何软件包 + "程序包" 图标浏览可用的包]]> + 搜索包 + 结果为 + 我们找不到任何东西 + 请尝试搜索其他包或浏览类别 + 流行 + 新版本 + + karma 点 + 信息 + 所有者 + 贡献者 + 创建 + 当前版本 + .NET 版本 + 下载 + 喜欢 + 兼容性 + 此软件包与社区成员报告的 Umbraco 的以下版本兼容。报告100% 以下版本不能保证完全兼容 + 外部来源 + 作者 + 演示 + 文档 + 元数据 + 名称 + 扩展包不含任何项 + +
+ 点击下面的“卸载”,您可以安全的删除。]]> +
+ 无可用更新 + 选项 + 说明 + 程序库 + 确认卸载 + 已卸载 + 扩展包卸载成功 + 卸载 + + + 注意: + 卸载包将导致所有依赖该包的东西失效,请确认。 ]]> + + 从程序库下载更新 + 更新扩展包 + 更新说明 + 此软件包有一个可用的升级。您可以直接从 Umbraco 软件包存储库下载。 + 版本 + 版本历史 + 访问扩展包网站 + 已安装软件包 + 此软件包无法安装, 它需要一个最小的 Umbraco 版本的%0% + 卸载中... + 下载中... + 导入中... + 安装中... + 重启中, 请稍候... + 所有完成后, 您的浏览器将立即刷新, 请稍候... + 请单击 "完成" 以完成安装和重新加载页面。 + Uploading package... + + + 带格式粘贴(不推荐) + 您所粘贴的文本含有特殊字符或格式,Umbraco将清除以适应网页。 + 无格式粘贴 + 粘贴并移除格式(推荐) + + + 基于角色的保护 + 要使用的会员组。]]> + 使用基于角色的授权需要首先建立会员组。 + 错误页 + 当用户登录后访问没有权限的页时显示该页 + 选择限制访问此页的方式 + %0% 现在处于受保护状态 + %0% 的保护被取消 + 登录页 + 选择公开的登录入口 + 取消保护 + 选择一个包含登录表单和提示信息的页 + 选择访问该页的角色类型 + 为此页设置账号和密码 + 单用户保护 + 如果您只希望提供一个用户名和密码就能访问 + + + + + + + + + + + + + + + + + + 包含未发布的子项 + 正在发布,请稍候… + %0% 中的 %1% 页面已发布… + %0% 已发布 + %0% 及其子项已发布 + 发布 %0% 及其子项 + + 确定 发布 %0%

+ 要发布当前页和所有子页,请选中 全部发布 发布所有子页。 + ]]> +
+ + + 您没有配置任何认可的颜色 + + + 输入外部链接 + 选择内部页面 + 标题 + 链接 + 新窗口 + 输入新标题 + 输入链接 + + + Reset + Define crop + Give the crop an alias and its default width and height + Save crop + Add new crop + + + 当前版本 + 红色是选中版本中没有的。绿色是新增的]]> + 文档已回滚 + + 回滚至 + 选择版本 + 查看 + + + 编辑脚本 + + + 礼宾 + 内容 + 导游 + 开发 + Umbraco配置向导 + 媒体 + 会员 + 消息 + 设置 + 统计 + 翻译 + 用户 + 帮助 + 窗体 + 统计 + + + 转到 + 帮助主题 + 视频章节 + 最佳 Umbraco 视频教程 + + + 默认模板 + 字典键 + 要导入文档类型,请点击“浏览”按钮,再点击“导入”,然后在您电脑上查找 ".udt"文件导入(下一页中需要您再次确认) + 新建选项卡标题 + 节点类型 + 类型 + 样式表 + 脚本 + 样式表属性 + 选项卡 + 选项卡标题 + 选项卡 + 主控文档类型激活 + 该文档类型使用 + 作为主控文档类型. 主控文档类型的标签只能在主控文档类型里修改。 + 没有字段设置在该标签页 + 主控文档类型 + 创建匹配模板 + 添加图标 + + + 排序次序 + 创建日期 + 排序完成。 + 上下拖拽项目或单击列头进行排序 +
请不要关闭窗口]]>
+ + + 验证 + 在保存项之前必须修复验证错误 + 失败 + 用户权限不足, 无法完成操作 + 取消 + 操作被第三方插件取消。 + 发布因为第三方插件取消 + 属性类型已存在 + 属性类型已创建 + 数据类型:%1%]]> + 属性类型已删除 + 内容类型已保存 + 选项卡已创建 + 选项卡已删除 + id为%0%的选项卡已删除 + 样式表未保存 + 样式表已保存 + 样式表保存,无错误。 + 数据类型已保存 + 字典项已保存 + 因为上级页面未发布导致发布失败! + 内容已发布 + 公众可见 + 内容已保存 + 请发布以使更改生效 + 提交审核 + 更改已提交审核 + 媒体已保存 + 媒体已保存 + 会员已保存 + 样式表属性已保存 + 样式表已保存 + 模板已保存 + 保存用户出错(请查看日志) + 用户已保存 + 用户类型已保存 + 文件未保存 + 文件无法保存,请检查权限。 + 文件保存 + 文件保存,无错误。 + 语言已保存 + 已保存媒体类型 + 已保存成员类型 + Python脚本未保存 + Python脚本因为错误未能保存 + Python已保存 + Python脚本无错误 + 模板未保存 + 模板别名相同 + 模板已保存 + 模板保存,无错误。 + XSLT未保存 + XSLT有错误 + XSLT无法保存,请检查权限。 + XSLT已保存 + XSLT无错误 + 未发布内容 + 片段视图已保存 + 片段视图保存,无错误。 + 片段视图未保存 + 片段视图因为错误未能保存 + 已保存脚本视图 + 脚本视图保存时没有发生任何错误! + 未保存脚本视图 + 保存文件时出错。 + 保存文件时出错。 + + + 使用CSS语法,如:h1、.redHeader、.blueTex。 + 编辑样式表 + 编辑样式属性 + 编辑器中的样式属性名 + 预览 + 样式 + + + 编辑模板 + 部分 + 插入内容区 + 插入内容占位符 + 插入 + 选择要插入到模板中的内容 + 插入字典项 + 字典项是可翻译的文本部分的占位符, 这使得为多语言网站创建设计变得容易。 + 插入宏 + + 宏是一个可配置的组件, 对于 + 设计的可重用部分, 在这里您需要提供参数的选项, + 如画廊、表格和列表。 + + 插入页字段 + 显示当前页中指定字段的值, 其中有用于修改值或回退到替代值的选项。 + 分部视图 + + 分部视图是可以在另一个模板内呈现的单独的模板文件, + 它对于重用标记或将复杂的模板分离到单独的文件中非常重要。 + + 母版 + 无主模板 + 无主 + 呈现子模板 + + @RenderBody(). + ]]> + + 定义命名节 + + @section { ... }. 这可以呈现在 + 此模板的父级的特定区域, 请使用 @RenderSection. + ]]> + + 呈现命名节 + + @RenderSection(name). + 这将呈现子模板的一个区域, 它被包装在相应的 @section [名称] {...} 定义中. + ]]> + + 节名称 + 节是必需的 + + 如果强制, 子模板必须包含 @section 定义, 否则将显示错误。 + + 查询生成器 + 生成查询 + 返回的项, 在 + 我要 + 所有内容 + 类型 "%0%"的内容 + from + 我的网站 + where + and + is + is not + before + before (包含选定日期) + after + after (包含选定日期) + equals + does not equal + contains + does not contain + greater than + greater than or equal to + less than + less than or equal to + Id + Name + Created Date + Last Updated Date + order by + ascending + descending + 模板 + + + + 选择内容类别 + 选择一项布局 + 添加一行 + 添加内容 + 丢弃内容 + 设置已应用 + 此处不允许有该内容 + 此处允许有该内容 + 点击嵌入 + 点击添加图片 + 图片说明... + 在这里输入... + 网格布局 + 布局是网格编辑器的整体工作区域, 通常只需要一个或两个不同的布局 + 添加网络布局 + 通过设置列宽并添加其他节来调整版式 + 行配置 + 行是水平排列的预定义单元格 + 添加行配置 + 通过设置单元格宽度和添加其他单元格来调整行 + + 网格布局中的总和列数 + 设置 + 配置编辑器可以更改的设置 + 样式 + 配置编辑器可以更改的样式 + 输入的 json 配置有效, 设置才可保存 + 允许所有的编辑器 + 允许所有行配置 + 设置为默认值 + 选择附加 + 选择默认值 + 已增加 + + + + 组合 + 您没有添加任何选项卡 + 添加新选项卡 + 添加其他选项卡 + 继承自 + 添加属性 + 必需的标签 + 启用列表视图 + 配置内容项以显示其子项的可排序和搜索列表, 这些子项将不会显示在树中 + 允许的模板 + 选择允许在该类型的内容上使用哪些模板编辑器 + 允许作为根 + 允许编辑器在内容树的根目录中创建此类型的内容 + 是 - 允许根中的此类型的内容 + 允许的子节点类型 + 允许在该类型的内容下方创建指定类型的内容 + 选择子节点 + 从现有文档类型继承选项卡和属性。如果存在同名的选项卡, 则新选项卡将添加到当前文档类型或合并。 + 此内容类型在组合中使用, 因此不能自行组成。 + 没有可供组合使用的内容类型。 + 可用编辑器 + 重用 + 编辑器设置 + 配置 + 是,删除 + 被移动到下方 + 被复制到下面 + 选择要移动的文件夹 + 选择要复制的文件夹 + 在下面的树结构中 + 所有文档类型 + 所有文档 + 所有媒体项目 + 使用此文档类型将被永久删除, 请确认您还要删除这些文件。 + 使用此媒体类型将被永久删除, 请确认您也要删除这些。 + 使用此成员类型将被永久删除, 请确认您想要删除这些 + 和所有使用此类型的文档 + 和所有使用此类型的媒体项目 + 和使用此类型的所有成员 + 使用此编辑器将用新设置更新 + 成员可编辑 + 显示成员配置文件 + + + + 添加后备字段 + 后备字段 + 添加默认值 + 默认值 + 替代字段 + 替代文本 + 大小写 + 编码 + 选取字段 + 转换换行符 + 是, 转换换行符 + 将换行符转化为&lt;br&gt; + 自定义字段 + 是,仅日期 + 格式和编码 + 格式化时间 + 根据活动区域性将该值设置为日期或日期。 + HTML编码 + 将替换HTML中的特殊字符 + 将在字段值后插入 + 将在字段值前插入 + 小写 + 修改输出 + + 输出示例 + 字段后插入 + 字段前插入 + 递归 + 是, 让它递归 + 分隔符 + 标准字段 + 大写 + URL编码 + 将格式化URL中的特殊字符 + 当上面字段值为空时使用 + 该字段仅在主字段为空时使用 + 是,含时间,分隔符为: + + + 标记为您的任务 + + 分配给您. 查看详情, 点击“详情”或页名。 + 如果需要XML格式,请点击“下载 XML”链接。
+ 关闭翻译任务,请返回详细视图点击“关闭”按钮。 + ]]> +
+ 关闭任务 + 翻译详情 + 将翻译任务下载为xml + 下载 XML + 下载 XML DTD + 字段 + 包含子页 + + + + [%0%]翻译任务:%1% + 没有翻译员,请创建翻译员角色的用户。 + 您创建的任务 + + 您创建的页面. 查看详情, 点击“详情” 或页名. + 如果需要XML格式,请点击“下载 Xml”链接。
+ 关闭翻译任务,请返回详细视图点击“关闭”按钮。 + ]]> +
+ 页面'%0%'已经发送给翻译 + 请选择内容应翻译成的语言 + 发送页面'%0%'以便翻译 + 分配者 + 任务开启 + 总字数 + 翻译到 + 翻译完成。 + 您可以浏览刚翻译的页面,如果原始页存在,您将得到两者的比较。 + 翻译失败,XML可能损坏了。 + 翻译选项 + 翻译员 + 上传翻译的xml + + + 缓存浏览 + 回收站 + 创建扩展包 + 数据类型 + 字典 + 已安装的扩展包 + 安装皮肤 + 安装新手套件 + 语言 + 安装本地扩展包 + + 媒体类型 + 会员 + 会员组 + 角色 + 会员类型 + 文档类型 + 关系类型 + 扩展包 + 扩展包 + 分部视图 + 分部视图宏文件 + Python文件 + 从在线程序库安装 + 安装Runway + Runway模块 + Scripting文件 + 脚本 + 样式表 + 模板 + XSLT文件 + 分析 + + + 有可用更新 + %0%已就绪,点击这里下载 + 无到服务器的连接 + 检查更新失败 + + + 管理员 + 分类字段 + 更改密码 + 更改密码 + 确认新密码 + 要改变密码,请在框中输入新密码,然后单击“更改密码”。 + 内容频道 + 描述字段 + 禁用用户 + 文档类型 + 编辑 + 排除字段 + 语言 + 登录 + 默认打开媒体项 + 区域 + 禁用后台管理界面 + 旧密码 + 密码 + 重设密码 + 您的密码已更改! + 重输密码 + 输入新密码 + 新密码不能为空! + 当前密码 + 密码错误 + 新密码和重输入的密码不一致,请重试! + 重输的密码和原密码不一致! + 替换子项权限设置 + 您正在修改访问权限的页面: + 选择要修改权限的页 + 搜索子对象 + 默认打开内容项 + 用户名 + 用户权限 + 用户类型 + 用户类型 + 撰稿人 + 翻译人 + 更改 + 你的资料 + 你最近的历史信息 + 会话过期于 + + + 验证 + 验证为电子邮件 + 验证为数字 + 验证为 url + ...或输入自定义验证 + 字段是强制性的 + 输入正则表达式 + 您需要添加至少 + 你只能有 + + 选定的项 + 无效日期 + 不是一个数字 + 无效的电子邮件 + + + + Value is set to the recommended value: '%0%'. + Value was set to '%1%' for XPath '%2%' in configuration file '%3%'. + Expected value '%1%' for '%2%' in configuration file '%3%', but found '%0%'. + Found unexpected value '%0%' for '%2%' in configuration file '%3%'. + + + Custom errors are set to '%0%'. + Custom errors are currently set to '%0%'. It is recommended to set this to '%1%' before go live. + Custom errors successfully set to '%0%'. + MacroErrors are set to '%0%'. + MacroErrors are set to '%0%' which will prevent some or all pages in your site from loading completely if there are any errors in macros. Rectifying this will set the value to '%1%'. + MacroErrors are now set to '%0%'. + + + Try Skip IIS Custom Errors is set to '%0%' and you're using IIS version '%1%'. + Try Skip IIS Custom Errors is currently '%0%'. It is recommended to set this to '%1%' for your IIS version (%2%). + Try Skip IIS Custom Errors successfully set to '%0%'. + + + File does not exist: '%0%'. + '%0%' in config file '%1%'.]]> + There was an error, check log for full error: %0%. + Members - Total XML: %0%, Total: %1%, Total invalid: %2% + Media - Total XML: %0%, Total: %1%, Total invalid: %2% + Content - Total XML: %0%, Total published: %1%, Total invalid: %2% + Your site certificate was marked as valid. + Certificate validation error: '%0%' + Error pinging the URL %0% - '%1%' + You are currently %0% viewing the site using the HTTPS scheme. + The appSetting 'umbracoUseSSL' is set to 'false' in your web.config file. Once you access this site using the HTTPS scheme, that should be set to 'true'. + The appSetting 'umbracoUseSSL' is set to '%0%' in your web.config file, your cookies are %1% marked as secure. + Could not update the 'umbracoUseSSL' setting in your web.config file. Error: %0% + + + Enable HTTPS + Sets umbracoSSL setting to true in the appSettings of the web.config file. + The appSetting 'umbracoUseSSL' is now set to 'true' in your web.config file, your cookies will be marked as secure. + Fix + Cannot fix a check with a value comparison type of 'ShouldNotEqual'. + Cannot fix a check with a value comparison type of 'ShouldEqual' with a provided value. + Value to fix check not provided. + Debug compilation mode is disabled. + Debug compilation mode is currently enabled. It is recommended to disable this setting before go live. + Debug compilation mode successfully disabled. + Trace mode is disabled. + Trace mode is currently enabled. It is recommended to disable this setting before go live. + Trace mode successfully disabled. + All folders have the correct permissions set. + + %0%.]]> + %0%. If they aren't being written to no action need be taken.]]> + All files have the correct permissions set. + + %0%.]]> + %0%. If they aren't being written to no action need be taken.]]> + X-Frame-Options used to control whether a site can be IFRAMEd by another was found.]]> + X-Frame-Options used to control whether a site can be IFRAMEd by another was not found.]]> + Set Header in Config + Adds a value to the httpProtocol/customHeaders section of web.config to prevent the site being IFRAMEd by other websites. + A setting to create a header preventing IFRAMEing of the site by other websites has been added to your web.config file. + Could not update web.config file. Error: %0% + + + %0%.]]> + No headers revealing information about the website technology were found. + In the Web.config file, system.net/mailsettings could not be found. + In the Web.config file system.net/mailsettings section, the host is not configured. + SMTP settings are configured correctly and the service is operating as expected. + The SMTP server configured with host '%0%' and port '%1%' could not be reached. Please check to ensure the SMTP settings in the Web.config file system.net/mailsettings are correct. + %0%.]]> + %0%.]]> + + + 禁用 url 跟踪程序 + 启用 url 跟踪程序 + 原始网址 + 已重定向至 + 未进行重定向 + 当已发布的页重命名或移动时, 将自动对新页进行重定向。 + 删除 + 确实要删除 "%0%" 到 "%1%" 的重定向吗? + 重定向URL已删除。 + 删除重定向 url 时出错. + 是否确实要禁用 url 跟踪程序? + url 跟踪器现在已被禁用。 + 禁用 url 跟踪程序时出错, 可以在日志文件中找到更多信息。 + 现在已启用 url 跟踪程序。 + 启用 url 跟踪程序时出错, 可以在日志文件中找到更多信息。 + + + 没有可供选择的词典项目 + +
diff --git a/src/UmbracoUrlHandling/Umbraco/Config/Lang/zh_tw.xml b/src/UmbracoUrlHandling/Umbraco/Config/Lang/zh_tw.xml new file mode 100644 index 0000000..53e893e --- /dev/null +++ b/src/UmbracoUrlHandling/Umbraco/Config/Lang/zh_tw.xml @@ -0,0 +1,1356 @@ + + + + The Umbraco community + http://our.umbraco.org/documentation/Extending-Umbraco/Language-Files + + + 管理主機名稱 + 跟蹤審計 + 流覽節點 + 改變文檔類型 + 複製 + 創建 + 創建擴展包 + 刪除 + 禁用 + 清空回收站 + 匯出文檔類型 + 導入文檔類型 + 導入擴展包 + 即時編輯模式 + 退出 + 移動 + 提醒 + 公眾存取權限 + 發佈 + 取消發佈 + 重新載入節點 + 重新發佈整站 + 回復 + 許可權 + 回滾 + 提交至發佈者 + 發送給翻譯 + 排序 + 提交至發佈者 + 翻譯 + 更新 + 預設值 + + + 禁止訪問 + 添加功能變數名稱 + 移除 + 錯誤的節點 + 功能變數名稱錯誤 + 功能變數名稱重複 + 語言 + 功能變數名稱 + 新功能變數名稱 '%0%' 已創建 + 功能變數名稱 '%0%' 已刪除 + 功能變數名稱 '%0%' 已使用 + 功能變數名稱 '%0%' 已更新 + 編輯當前功能變數名稱 + + 繼承 + 語言 + 或從父節點繼承文化設定。
+ 也會改變目前節點設定,除非下方網域有其他項目。]]>
+ 功能變數名稱 + + + 查看 + + + 清除選擇 + 選擇 + 選擇目前資料夾 + 做別的事情 + 粗體 + 取消段落縮進 + 插入表單字段 + 插入圖片標題 + 編輯Html + 段落縮進 + 斜體 + 居中 + 左對齊 + 右對齊 + 插入連結 + 插入本地連結(錨點) + 圓點列表 + 數字清單 + 插入巨集 + 插入圖片 + 編輯關聯 + 回到清單 + 保存 + 保存並發佈 + 保存並提交審核 + 保存清單檢視 + 預覽 + 因未設置範本無法預覽 + 選擇樣式 + 顯示樣式 + 插入表格 + 產生模組 + + + 要更改所選節點的文檔類型,先在列表中選擇合適的文檔類型。 + 然後設置當前文檔類型到新文檔類型的各欄位間的對應映射關係並保存。 + 內容已被重新發佈 + 當前屬性 + 當前類型 + 不能改變文檔類型,因為沒有可替代的類型。 + 文檔類型已更改 + 要映射的欄位 + 映射欄位 + 新範本 + 新類型 + + 內容 + 選擇新的文檔類型 + 選中文檔的類型已被成功更改為[new type],以下欄位被映射: + + 不能完成欄位映射,因為存在一個欄位映射至多欄位的問題。 + 僅顯示可作為替代的文檔類型。 + + + 已發表 + 關於本頁 + 別名 + (圖片的替代文本) + 替代連結 + 點擊編輯 + 創建者 + 創建者 + 更新者 + 創建時間 + 此文件創建的日期時間 + 文檔類型 + 編輯 + 過期於 + 該項發佈之後有更改 + 該項沒有發佈 + 最近發佈 + 沒有可供顯示的項目 + 此列表中沒有可供顯示的項目 + 媒體類型 + 媒體連結位址 + 會員組 + 角色 + 會員類型 + 沒有選擇時間 + 頁標題 + 屬性 + 該文檔不可見,因為其上級 '%0%' 未發佈。 + 糟糕:該文檔已發佈,但是沒有更新至緩存(內部錯誤) + 糟糕:沒辦法連結到此網址(內部錯誤-請參見記錄) + 糟糕:此文件已經發表,但是網址和其他內容相衝 %0% + 發佈 + 發佈狀態 + 發佈於 + 取消發表於 + 清空時間 + 排序完成 + 拖拽項目或按一下列頭即可排序,可以按住Shift多選。 + 統計 + 標題(可選) + 其他說明文字(可選) + 類型 + 取消發佈 + 最近編輯 + 本文件修改時間 + 移除文件 + 連結到文檔 + 會員組成員 + 非會員組成員 + 子項目 + 目標 + 預計發表的時間(伺服器端) + 這是什麼意思?]]> + + + 點選以便上傳 + 拖曳檔案至此... + 媒體連結 + 或按這裡選擇檔案 + 只允許檔案類型為 + 檔案大小上限為 + + + 新增一位會員 + 所有會員 + + + 您想在哪裡創建 %0% + 創建在 + 選擇類型和標題 + "文檔類型"處變更。]]> + "媒體類型"處變更。]]> + 文檔類型沒有相關範本 + 沒有資料夾 + 新資料類別 + + + 流覽您的網站 + - 隱藏 + 如果Umbraco沒有打開,您可能需要允許彈出式視窗。 + 已經在新視窗中打開 + 重啟 + 訪問 + 歡迎 + + + 留下 + 放棄變更 + 您有未存檔的變更 + 您確定要離開本頁? - 您有未存檔的變更 + + + 完成 + 刪除 %0% 個項目 + 刪除 %0% 個項目 + 刪除 %1% 個中的 %0% 個項目 + 刪除 %1% 個中的 %0% 個項目 + 已發佈 %0% 個項目 + 已發佈 %0% 個項目 + 已發佈 %1% 個中的 %0% 個項目 + 已發佈 %1% 個中的 %0% 個項目 + 取消發佈 %0% 個項目 + 取消發佈 %0% 個項目 + 取消發佈 %1 個中的 %0% 個項目 + 取消發佈 %1 個中的 %0% 個項目 + 移動 %0% 個項目 + 移動 %0% 個項目 + 移動 %1 個中的 %0% 個項目 + 移動 %1 個中的 %0% 個項目 + 複製 %0% 個項目 + 複製 %0% 個項目 + 複製 %1 個中的 %0% 個項目 + 複製 %1 個中的 %0% 個項目 + + + 錨點名稱 + 管理主機名稱 + 關閉窗口 + 您確定要刪除嗎 + 您確定要禁用嗎 + 按一下此框確定刪除%0%項 + 您確定嗎? + 您確定嗎? + 剪切 + 編輯字典項 + 編輯語言 + 插入本地連結 + 插入字元 + 插入圖片標題 + 插入圖片 + 插入連結 + 插入巨集 + 插入表格 + 最近編輯 + 連結 + 內部連結: + 本地連結請用“#”號開頭 + 在新視窗中打開? + 巨集設置 + 本巨集沒有包含您可以編輯的屬性 + 粘貼 + 編輯許可權 + 正在清空回收站,請不要關閉窗口。 + 回收站已清空 + 從回收站刪除的項目將不可恢復 + regexlib.com的網站服務目前出現些狀況,而我們無能為力。我們對此不便感到十分抱歉。]]> + 查找規則運算式來驗證輸入,如: 'email、'zip-code'、'url'。 + 移除巨集 + 必填項目 + 網站已重建索引 + 網站緩存已刷新,所有已發佈的內容更新生效。 + 網站緩存將會刷新,所有已發佈的內容將會更新。 + 表格列數 + 表格行數 + 設定預留位置代碼 以便您要在子範本中插入內容到本範本時,填入此代碼到 <asp:content /> 裡面。]]> + 選擇預留位置代碼 於此清單中。您只能選擇目前父範本中的代碼。]]> + 點擊圖片查看完整大小 + 拾取項 + 查看緩存項 + 新增資料夾... + 與原本相關 + 最友善的社群 + 頁面連結 + 打開此連結文檔至新視窗或標籤頁 + 打開此連結文檔至全新視窗 + 打開此連結文檔在原本視窗中 + 媒體連結 + 選擇媒體 + 選擇圖示 + 選擇項目 + 選擇連結 + 選擇巨集 + 選擇內容 + 選擇會員 + 選擇會員群組 + 沒有找到任何圖示 + 本巨集沒有需要參數 + 外部登入提供者 + 例外細節 + 詳細記錄 + 內部例外 + 連結您的 + 取消連結您的 + 帳戶 + 選擇編輯器 + + + %0%' 編輯不同語言版本,
您可以在左方選單「語言」中增添新的語言 + ]]>
+ 語言名稱 + + + 輸入您的使用者名稱 + 輸入您的密碼 + 確認您的密碼 + 命名此 %0%... + 輸入一個名稱 + 標籤... + 輸入一段描述... + 搜尋請輸入... + 過濾請輸入... + 增加標籤(每個標籤後請按輸入鍵)... + 輸入您的電子郵件 + + + 允許放置於根節點 + 只有勾選「允許放置於根節點」的內容種類可以放在內容樹或媒體樹的最頂端 + 允許子項節點類型 + 文檔種類集合 + 創建 + 刪除選項卡 + 描述 + 新建選項卡 + 選項卡 + 縮略圖 + 允許清單檢視 + 允許內容項目顯示成可以排列及搜尋的清單,子項目不會被顯示 + 目前清單檢視 + 作用中的清單檢視資料類別 + 新增自訂清單檢視 + 移除自訂清單檢視 + + + 添加預設值 + 資料庫資料類型 + 資料類型唯一標識 + 渲染控制項 + 按鈕 + 允許高級設置 + 允許快顯功能表 + 插入圖片預設最大 + 關聯的樣式表 + 顯示標籤 + 寬和高 + + + 資料已保存,但是發佈前您需要修正一些錯誤: + 當前成員提供程式不支援修改密碼(EnablePasswordRetrieval的值應該為true) + %0% 已存在 + 發現錯誤: + 發現錯誤: + 密碼最少%0%位元,且至少包含%1%位元非字母數位記號 + %0% 必須是整數 + %1% 中的 %0% 欄位是必填項 + %0% 是必填項 + %1% 中的 %0% 格式不正確 + %0% 格式不正確 + + + 收到伺服器傳來的錯誤 + 該檔案類型已被管理員禁用 + 注意,儘管配置中允許CodeMirror,但是它在IE上不夠穩定,所以無法在IE運行。 + 請為新的屬性類型填寫名稱和別名! + 許可權有問題,訪問指定文檔或資料夾失敗! + 讀取片段視圖腳本錯誤(檔案:%0%) + 讀取使用者控制項 %0% 錯誤 + 讀取使用者控制項 %0% 錯誤(組件:%0%,類別:%1%) + 讀取巨集引擎腳本錯誤(檔案:%0%) + 分析XSLT檔案錯誤:%0% + 讀取XSLT檔案錯誤:%0% + 請輸入標題 + 請選擇類型 + 圖片尺寸大於原始尺寸不會提高圖片品質,您確定要把圖片尺寸變大嗎? + python腳本錯誤 + python腳本未保存,因為包含錯誤。 + 預設打開頁面不存在,請聯繫管理員 + 請先選擇內容,再設置樣式。 + 沒有可用的樣式 + 請把游標放在您要合併的兩個儲存格中的左邊儲存格 + 非合併儲存格不能分離。 + XSLT源碼出錯 + XSLT未保存,因為包含錯誤。 + 這是此屬性所使用的資料類別設定錯誤,請檢查資料類別 + + + 關於 + 操作 + 操作 + 添加 + 別名 + 所有 + 您確定嗎? + 回去 + 邊框 + + 取消 + 儲存格邊距 + 選擇 + 關閉 + 關閉窗口 + 備註 + 確認 + 強制屬性 + 繼續 + 複製 + 創建 + 資料庫 + 時間 + 默認 + 刪除 + 已刪除 + 正在刪除… + 設計 + 規格 + + 下載 + 編輯 + 已編輯 + 元素 + 郵箱 + 錯誤 + 查找文檔 + + 幫助 + 圖示 + 導入 + 內邊距 + 插入 + 安裝 + 不合格 + 對齊 + 語言 + 佈局 + 載入中 + 鎖定 + 登入 + 退出 + 登出 + 巨集 + 必要 + 移動 + 更多 + 名稱 + 新的 + 下一步 + + 屬於 + 確定 + 打開 + + 密碼 + 路徑 + 預留位置代碼 + 請稍候… + 上一步 + 屬性 + 接收資料郵箱 + 回收站 + 保持狀態中 + 重命名 + 更新 + 必要 + 重試 + 許可權 + 搜索 + 伺服器 + 顯示 + 在發送時預覽 + 大小 + 排序 + 送出 + 類型 + 輸入內容開始搜尋… + + 更新 + 更新 + 上傳 + 連結位址 + 用戶 + 用戶名 + + 查看 + 歡迎… + + + 資料夾 + 搜尋結果 + 重新排列 + 我已經完成排列 + 預覽 + 更改密碼 + + 清單檢視 + 存檔中... + 目前 + 內嵌 + 選取的 + + + + + + + + + + + 增加標籤頁 + 增加屬性 + 增加編輯器 + 增加範本 + 增加子節點 + 增加子項目 + 編輯資料類別 + 瀏覽區塊 + 捷徑 + 顯示捷徑 + 開關清單檢視 + 開關是否允許為根項目 + + + 背景色 + 粗體 + 前景色 + 字體 + 文本 + + + 頁面 + + + 無法連接到資料庫。 + 無法保存web.config檔,請手工修改。 + 發現資料庫 + 資料庫配置 + 安裝 按鈕來安裝Umbraco資料庫 %0% + ]]> + 下一步繼續。]]> + 沒有找到資料庫!請確認檔案"web.config"中的字串"connection string"是否正確。

+

請編輯檔案"web.config" (例如使用Visual Studio或您喜歡的編輯器),移動到檔案底部,並在名稱為"UmbracoDbDSN"的字串中設定資料庫連結資訊,並存檔。

+

+ 點選重試按鈕當上述步驟完成。
+ + 在此查詢更多編輯web.config的資訊。

]]>
+ + 若需要時,請聯繫您的網路公司。如果您在本地機器或伺服器安裝的話,您也許需要聯絡系統管理者。]]> + + 點選升級按鈕來升級Umbraco資料庫 %0%

+

+ 請別擔心 - 不會刪除任何資料而且馬上就會繼續運作! +

+ ]]>
+ 點選下一步繼續。]]> + 下一步繼續設定精靈。]]> + 預設使用者的密碼必須更改!]]> + 預設使用者已經被暫停或沒有Umbraco的使用權!

不需更多的操作步驟。點選下一步繼續。]]> + 安裝後預設使用者的密碼已經成功修改!

不需更多的操作步驟。點選下一步繼續。]]> + 密碼已更改 + + Umbraco新增一預設使用者,名稱為('admin'),密碼為('default')。修改此密碼是十分重要的事情。

+

+ 這個步驟會檢查預設使用者的密碼並在需要時建議修改。 +

+ ]]>
+ 作為入門者,從視頻教程開始吧! + 點擊下一步 (或在Web.config中自行修改UmbracoConfigurationStatus),意味著您接受上述授權合約。 + 安裝失敗。 + 受影響的檔和資料夾 + 此處查看更多資訊 + 您需要對以下檔和資料夾授於ASP.NET用戶修改許可權 + 您的權限設定幾近完美!

+ 您可以正常執行Umbraco沒有任何問題,只差您將沒有辦法安裝那些建議需要全部許可權的插件。]]>
+ 如何解決 + 點擊閱讀文字版 + 影片教學來瞭解如何設定Umbraco的資料夾權限或閱讀文字版本。]]> + 您的權限可能有點小問題! +

+ 您可以正常執行Umbraco沒有任何問題,然而您將無法新增資料夾或安裝那些可以讓Umbraco發揮全力的插件。]]>
+ 您的權限設定尚未未完成! +

+ 您需要更新權限設定才能執行Umbraco。]]>
+ 您的權限設定完美無瑕!

+ 您已經準備好執行Umbraco和安裝插件!]]>
+ 解決資料夾問題 + 點此查看ASP.NET和創建資料夾的問題解決方案 + 設置資料夾許可權 + + 我要從頭開始 + 學習該怎麼做) + 您晚點仍可以選擇安裝Runway,請至開發者區域選擇安裝。 + ]]> + 您剛剛安裝了一個乾淨的系統,要繼續嗎? + “Runway”已安裝 + + 這是我們的模組推薦清單,選取您想要安裝的項目,或者至 查詢完整清單。 + ]]> + 僅推薦高級用戶使用 + 給我一個簡單的網站 + + "Runway"是一個提供基本檔案類別和範本的簡單網站。安裝程式會自動幫您設定Runway, + 但你仍可輕易編輯,擴充或移除它。它並非必要項目而且您可以在沒它的情況下完美執行Umbraco。然而, + Runway提供一個輕鬆簡便但基於寶貴經驗的平台讓您可以更快開始。 + 如果您安裝Runway,您還可以選擇名為「Runway模組」的基本區塊來加強Runway頁面。 +

+ + 內含於Runway: 首頁,準備開始頁面,模組安裝頁面。
+ 可選模組: 上方瀏覽列,網站地圖,聯絡,藝廊。 +
+ ]]>
+ “Runway”是什麼? + 步驟 1/5:接受授權合約 + 步驟 2/5:資料庫配置 + 步驟 3/5:文件許可權驗證 + 步驟 4/5:系統安全性 + 步驟 5/5:一切就緒,可以開始使用系統。 + 感謝選擇我們的產品 + 參觀您的新網站 +您剛安裝好Runway,何不瞧瞧它的模樣。]]> + 更多的幫忙與資訊 +從我們獲獎的社群得到幫助,瀏覽文件,或觀看免費影片來瞭解如何輕鬆架設網站,如何使用插件,和瞭解Umbraco項目名稱的快速上手指引。]]> + 系統 %0% 安裝完畢 + /web.config 檔案並且更新AppSetting中的字串UmbracoConfigurationStatus 內容為 '%0%'。]]> + 快速開始指引。
如果您是Umbraco的新成員, +您可以在其中找到相當多的資源。]]>
+ 啟動Umbraco +想要管理您的網站時,只需開啟Umbraco後台便可增加內容,更新範本和樣式表,或增添新功能。]]> + 無法連接到資料庫。 + 系統版本 3 + 系統版本 4 + 觀看 +
+ 點選"下一步"來啟動精靈。]]>
+ + + 語言代碼 + 語言名稱 + + + 使用者在空閒狀態下將會自動登出 + 已更新,繼續工作。 + + + 超級星期天快樂 + 瘋狂星期一快樂 + 熱鬧星期二快樂 + 美妙星期三快樂 + 悅耳星期四快樂 + 時髦星期五快樂 + 喵喵星期六快樂 + 下方登入 + 登入使用 + 連線時間過了 + © 2001 - %0%
Umbraco.com

]]>
+ 忘記密碼? + 一封內有重設密碼連結的電子郵件已經寄出給您 + 一封內有重設密碼連結的電子郵件已經寄到此信箱 + 回到登入畫面 + 請輸入新密碼 + 您的密碼已經更新 + 您點選的連結是無效或過期的 + Umbraco:重設密碼 + 您登入到後台的使用者名稱是:%0%

點選這裡來重設您的密碼或將此連結複製/貼上到您的瀏覽器:

%1%

]]>
+ + + 儀錶板 + 區域 + 內容 + + + 選擇上面的頁面… + %0% 被複製到 %1% + 將 %0% 複製到 + %0% 已被移動到 %1% + 將 %0% 移動到 + 作為內容的根結點,點“確定”。 + 尚未選擇節點,請選擇一個節點點擊“確定”。 + 類型不符不允許選擇 + 該項不能移到其子項 + 當前節點不能建在根節點下 + 您在子項的許可權不夠,不允許該操作。 + 複本和原本建立關聯 + + + 為 %0% 編寫通知 + + 哈嘍 %0%

+ +

這是一封自動產生的信件來通知您 %1% 工作 + 已經在頁面 %2% 上由使用者 %3% 執行完成 +

+ +

+

更新摘要:

+ + %6% +
+

+ + + +

祝您有美好的一天!

+ Umbraco機器人 謹上 +

]]>
+ 在 %2%,[%0%] 關於 %1% 的通告已執行。 + 通知 + + + + 按鈕並點選該檔案。Umbraco擴展包通常有「.zip」的副檔名。 + ]]> + 作者 + 演示 + 文檔 + 中繼資料 + 名稱 + 擴展包不含任何項 +
+ 您可以點選下方「移除擴展包」來安全地移除此項目。]]>
+ 無可用更新 + 選項 + 說明 + 程式庫 + 確認卸載 + 已卸載 + 擴展包卸載成功 + 卸載 + + 注意: 任何文檔,媒體或需要這些項目才能運作的物件將會停止運作,並可能使得系統不穩定, + 請小心移除。若有疑慮,請聯絡擴展包作者。]]> + 從程式庫下載更新 + 更新擴展包 + 更新說明 + 擴展包有可用的更新,您可以從程式庫網站更新。 + 版本 + 版本歷史 + 訪問擴展包網站 + 擴展包已安裝 + 這個擴展包無法安裝,它需要Umbraco至少是版本 %0% + 移除中... + 下載中... + 匯入中... + 安裝中... + 重新啟動中,請稍後... + 都好了,您的瀏覽器將重新整理,請稍待... + + + 帶格式粘貼(不推薦) + 您所粘貼的文本含有特殊字元或格式,Umbraco將清除以適應網頁。 + 無格式粘貼 + 粘貼並移除格式(推薦) + + + 基於角色的保護 + 請使用Umbraco的會員群組。]]> + 使用基於角色的授權需要首先建立會員組。 + 錯誤頁 + 當用戶登錄後訪問沒有許可權的頁時顯示該頁 + 選擇限制訪問此頁的方式 + %0% 現在處於受保護狀態 + %0% 的保護被取消 + 登錄頁 + 選擇公開的登錄入口 + 取消保護 + 選擇一個包含登錄表單和提示資訊的頁 + 選擇訪問該頁的角色類型 + 為此頁設置帳號和密碼 + 單用戶保護 + 如果您只希望提供一個用戶名和密碼就能訪問 + + + + + + + + 包含未發佈的子項 + 正在發佈,請稍候… + %0% 中的 %1% 頁面已發佈… + %0% 已發佈 + %0% 及其子項已發佈 + 發佈 %0% 及其子項 + 發佈按鈕來將%0%的內容設定為公開。

+ 您可以同時發佈本頁以及其子項目若您點選下面的包含子頁。 + ]]>
+ + + 您尚未設定任何許可顏色 + + + 輸入外部連結 + 選擇內部連結 + 標題 + 連結 + 新視窗 + 輸入新標題 + 輸入連結 + + + 重設 + + + 當前版本 + 紅色 文字將不會顯示於所選版本,而綠色表示增加部分。]]> + 文檔已回滾 + 這顯示所選版本的HTML格式,如果您想要比較兩版本的差異,請使用比較檢視 + 回滾至 + 選擇版本 + 查看 + + + 編輯腳本 + + + Concierge + 內容 + Courier + 開發 + 設定精靈 + 媒體 + 會員 + 消息 + 設置 + 統計 + 翻譯 + 用戶 + 說明 + 表單 + 統計 + + + 移至 + 說明主題為 + 影片主題為 + 最好的Umbraco影片教學 + + + 預設範本 + 字典鍵 + 要導入文檔類型,請點擊“流覽”按鈕,再點擊“導入”,然後在您電腦上查找 ".udt"檔導入(下一頁中需要您再次確認) + 新建選項卡標題 + 節點類型 + 類型 + 樣式表 + 腳本 + 樣式表屬性 + 選項卡 + 選項卡標題 + 選項卡 + 主控文件類型啟動 + 該文檔類型使用 + 作為主控文件類型. 主控文件類型的標籤只能在主控文件類型裡修改。 + 沒有欄位設置在該標籤頁 + 主文檔類別 + 新增對應範本 + 增加圖示 + + + 排列順序 + 增添時間 + 排序完成。 + 上下拖拽項目或按一下列頭進行排序 +
排序中請不要關閉視窗。]]>
+ + + 驗證 + 驗證錯誤一定要修正才能儲存項目 + 失敗 + 使用者權限不足,無法完成操作 + 已取消 + 操作被協力廠商外掛程式取消 + 發佈被協力廠商外掛程式取消 + 屬性類型已存在 + 屬性類型已創建 + 資料類別:%1%]]> + 屬性類型已刪除 + 內容類別型已保存 + 選項卡已創建 + 選項卡已刪除 + id為%0%的選項卡已刪除 + 樣式表未保存 + 樣式表已保存 + 樣式表保存,無錯誤。 + 資料類型已保存 + 字典項已保存 + 因為上級頁面未發佈導致發佈失敗! + 內容已發佈 + 公眾可見 + 內容已保存 + 請發佈以使更改生效 + 提交審核 + 更改已提交審核 + 媒體已保存 + 媒體已保存 + 會員已保存 + 樣式表屬性已保存 + 樣式表已保存 + 範本已保存 + 保存使用者出錯(請查看日誌) + 用戶已保存 + 用戶類型已保存 + 檔未保存 + 檔無法保存,請檢查許可權。 + 檔保存 + 檔保存,無錯誤。 + 語言已保存 + 媒體類別已儲存 + 會員類別已儲存 + Python腳本未保存 + Python腳本因為錯誤未能保存 + Python已保存 + Python腳本無錯誤 + 範本未保存 + 範本別名相同 + 範本已保存 + 範本保存,無錯誤。 + XSLT未保存 + XSLT有錯誤 + XSLT無法保存,請檢查許可權。 + XSLT已保存 + XSLT無錯誤 + 內容已取消發佈 + 片段視圖已保存 + 片段視圖保存,無錯誤。 + 片段視圖未保存 + 片段視圖因為錯誤未能保存 + 腳本視圖已儲存 + 腳本視圖已儲存,沒有任何錯誤! + 腳本視圖未儲存 + 儲存檔案時發生錯誤 + 儲存檔案時發生錯誤 + + + 使用CSS語法,如:h1、.redHeader、.blueTex。 + 編輯樣式表 + 編輯樣式屬性 + 編輯器中的樣式屬性名 + 預覽 + 樣式 + + + 編輯範本 + 插入內容區 + 插入內容預留位置 + 插入字典項 + 插入巨集 + 插入頁欄位 + 母版 + 範本標籤快速指南 + 範本 + + + 選擇內容類別 + 選擇排列方式 + 新增一行 + 新增內容 + 放棄內容 + 設定已儲存 + 此處不允許有內容 + 此處允許有內容 + 點選來內嵌 + 點選來插入圖片 + 圖片標題... + 在此填寫... + 網格排列方式 + 排列是指網格編輯器的整體工作區域,通常您只需要一種或兩種排列方式 + 增加網格排列方式 + 藉由設定列寬以及增加新的區域來調整排列方式 + 行設定 + 行是預先水平排列的格子 + 增加行設定 + 藉由設定小格寬度和增添小格來調整此行 + + 網格排列方式的列總數 + 設定 + 調整設定編輯器可以改變的項目 + 樣式 + 調整樣式編輯器可以改變的項目 + 當JSON格式正確時設定才可以儲存 + 允許所有編輯器 + 允許所有行設定 + 定為預設 + 選擇額外 + 選擇預設 + 已增加 + + + 組合 + 您沒有增加任何選項卡 + 增加新的選項卡 + 增加另外的選項卡 + 繼承的表格 + 增加屬性 + 必要標籤 + 允許清單檢視 + 允許內容項目顯示成可以排列及搜尋的清單,子項目不會被顯示 + 允許的範本 + 選擇哪些範本編輯器可以使用於此類別的內容 + 允許為根項目 + 允許編輯器新增此類別的內容為根項目 + 是的 - 允許此類別內容為根項目 + 允許子節點種類 + 允許某些特定種類能夠成為此種類內容的子項目 + 選擇子節點 + 從已存在的文檔類別中繼承選項卡以及屬性。新選項卡將被新增至目前文檔種類或合併至已存在同名的選項卡中。 + 此內容種類已經用於集合中,因此不能重複添加本身。 + 沒有可用於集合的內容種類。 + 可用的編輯器 + 重複使用 + 編輯器設定 + 設定 + 是,刪除 + 已移至下層 + 已複製至下層 + 選擇要移動的資料夾 + 選擇要複製的資料夾 + 至下方樹狀結構 + 所有文檔種類 + 所有文檔 + 所有媒體項目 + 使用此文檔種類的將被永久刪除,請確認您也想要將它們刪除。 + 使用此媒體種類的將被永久刪除,請確認您也想要將它們刪除。 + 使用此會員種類的將被永久刪除,請確認您也想要將它們刪除。 + 以及所有使用此種類的文件項目 + 以及所有使用此種類的媒體項目 + 以及所有使用此種類的會員項目 + 使用此編輯器將會套用新設定 + 會員可以編輯 + 顯示於會員資料 + + + 替代欄位 + 替代文本 + 大小寫 + 編碼 + 選取欄位 + 轉換分行符號 + 將換行符號取代成為HTML標籤 &lt;br&gt; + 自訂欄位 + 是,僅日期 + 格式化時間 + HTML編碼 + 將替換HTML中的特殊字元 + 將在欄位值後插入 + 將在欄位值前插入 + 小寫 + + 欄位後插入 + 欄位前插入 + 遞迴 + 標準欄位 + 大寫 + URL編碼 + 將格式化URL中的特殊字元 + 當上面欄位值為空時使用 + 該欄位僅在主欄位為空時使用 + 是,含時間,分隔符號為: + + + 標記為您的任務 + 指派給您。請按「翻譯詳情」或頁面名稱觀看包含回應的詳細檢視畫面。 + 您也可以將此頁面下載成為XML格式檔案,請按「下載XML」按鈕。
+ 若想要關閉翻譯任務,請至細節頁面點選「結束」按鈕。 + ]]>
+ 關閉任務 + 翻譯詳情 + 將翻譯任務下載為XML + 下載 XML + 下載 XML DTD + 欄位 + 包含子頁 + + [%0%]翻譯任務:%1% + 沒有翻譯員,請創建翻譯員角色的用戶。 + 您創建的任務 + 由您創建的頁面。要瀏覽包含回應的詳細檢視畫面, + 點選「詳情」或頁面名稱。您可以下載此頁面成為XML格式檔案,請點選「下載XML」連結。 + 若要關閉翻譯任務,請至詳情檢視並點選「關閉」按鈕。 + ]]> + 頁面'%0%'已經發送給翻譯 + 請選擇本內容應該被翻譯成的語言 + 發送頁面'%0%'以便翻譯 + 分配者 + 任務開啟 + 總字數 + 翻譯到 + 翻譯完成。 + 您可以流覽剛翻譯的頁面,如果原始頁存在,您將得到兩者的比較。 + 翻譯失敗,XML可能損壞了。 + 翻譯選項 + 翻譯員 + 上傳翻譯的xml + + + 緩存流覽 + 回收站 + 創建擴展包 + 資料類型 + 字典 + 已安裝的擴展包 + 安裝皮膚 + 安裝新手套件 + 語言 + 安裝本地擴展包 + 巨集 + 媒體類型 + 會員 + 會員組 + 角色 + 會員類型 + 文檔類型 + 相關類型 + 擴展包 + 擴展包 + Python文件 + 從線上程式庫安裝 + 安裝Runway + Runway模組 + Scripting文件 + 腳本 + 樣式表 + 範本 + XSLT文件 + 統計 + + + 有可用更新 + %0%已就緒,點擊這裡下載 + 無到伺服器的連接 + 檢查更新失敗 + + + 管理員 + 分類欄位 + 更改密碼 + 更改密碼 + 確認新密碼 + 要改變密碼,請在框中輸入新密碼,然後按一下“更改密碼”。 + 內容頻道 + 描述欄位 + 禁用用戶 + 文檔類型 + 編輯 + 排除欄位 + 語言 + 登錄 + 默認打開媒體項 + 區域 + 禁用後臺管理介面 + 舊的密碼 + 密碼 + 重設密碼 + 您的密碼已更改! + 重輸密碼 + 輸入新密碼 + 新密碼不能為空! + 當前密碼 + 密碼錯誤 + 新密碼和重輸入的密碼不一致,請重試! + 重輸的密碼和原密碼不一致! + 替換子項許可權設置 + 您正在修改存取權限的頁面: + 選擇要修改許可權的頁 + 搜索子物件 + 預設打開內容項 + 用戶名 + 用戶許可權 + 用戶類型 + 用戶類型 + 撰稿人 + 翻譯者 + 改變 + 您的個人檔案 + 您的歷程記錄 + 連線到期於 + + + 驗證 + 以電子郵件驗證 + 以數字驗證 + 以網址驗證 + ...或輸入自訂驗證 + 必要欄位 + + + + 數值已設為推薦值:%0% + 在設定檔 %3% 中XPath %2% 的數值設為 %1% 。 + 在設定檔 %3% 中XPath %2% 的預期值設為 %1% ,但卻是 %0%。 + 在設定檔 %3% 中XPath %2% 的值為非預期值 %0%。 + + 自訂錯誤設定為 %0% + 自訂錯誤設定為 %0。建議在上線前改為 %1%。 + 自訂錯誤成功設定為 %0% + 巨集錯誤設為 %0% + 巨集錯誤設為 %0%,如此一來,當巨集有任何錯誤時會阻止某些或全部頁面正常載入。改正會將此設定 %1%。 + 巨集錯誤已設為 %0% + + 嘗試略過IIS自訂錯誤目前設為 %0%,而且您使用的IIS版本為 %1%。 + 嘗試略過IIS自訂錯誤目前設為 %0%,然而在您使用的IIS版本為 %2% 時,建議設定是 %1%。 + 嘗試略過IIS自訂錯誤已成功設為 %0%。 + + 檔案不存在:%0%。 + '%1%'中無法找到'%0%'。]]> + 有錯誤產生,請參閱下列錯誤的紀錄:%0%。 + 成員 - 所有XML:%0%,總共:%1%,不合格:%2% + 媒體 - 所有XML:%0%,總共發佈:%1%,不合格:%2% + 內容 - 所有XML:%0%,總共發佈:%1%,不合格:%2% + 憑證驗證錯誤:%0% + 網址探查錯誤:%0% - '%1%' + 您目前使用HTTPS瀏覽本站:%0% + 在您的web.config檔案中,appSetting的umbracoUseSSL是設為false。當您開始使用HTTPS時,應將其改為 true。 + 在您的web.config檔案中,appSetting的umbracoUseSSL是設為 %0%,您的cookies %0% 標成安全。 + 無法在您的web.config檔案中,更新appSetting的umbracoUseSSL設定,錯誤訊息:%0% + + 開啟HTTPS + 在web.config檔案中,將appSetting的umbracoUseSSL設true。 + 在您的web.config檔案中,appSetting的umbracoUseSSL已設為 true,您的cookies 將被標成安全。 + 修正 + 無法修正比較種類檢查為'ShouldNotEqual'。 + 用提供的數值無法修正比較種類檢查為'ShouldEqual'。 + 沒有提供要修正檢查的數值。 + 偵錯編輯模式關閉。 + 偵錯編輯模式目前已開啟。上線前建議將其關閉。 + 偵錯編輯模式已成功關閉。 + 詳細記錄模式已關閉。 + 詳細記錄模式目前已開啟。上線前建議將其關閉。 + 詳細記錄模式已成功關閉。 + 所有資料夾已有正確權限設定。 + + %0%。]]> + %0%。如果無須寫入,不需採取行動。]]> + 所有檔案已有正確權限設定。 + + %0%。]]> + %0%。如果無須寫入,不需採取行動。]]> + X-Frame-Options 設定能控制網站是否可以被其他人IFRAMEd已找到。]]> + X-Frame-Options 設定能控制網站是否可以被其他人IFRAMEd沒有找到。]]> + 調整設定的標頭 + 在 web.config 的 httpProtocol/customHeaders 區域增加設定來防止本站被別的網站IFRAMEd。 + 在 web.config 的 httpProtocol/customHeaders 區域已經增加設定來防止本站被別的網站IFRAMEd。 + 無法更新web.config檔案,錯誤:%0% + + %0%。]]> + 在標頭中沒有找到揭露網站技術的資訊。 + 在 Web.config 檔案中,找不到 system.net/mailsettings。 + 在 Web.config 檔案中的 system.net/mailsettings,沒有設定 host 。 + SMTP設定正確,而且服務正常運作。 + SMTP伺服器 %0% : %1% 無法連接。請確認在Web.config 檔案中 system.net/mailsettings 設定正確。 + %0%。]]> + %0%。]]> + + + 停止網址追蹤器 + 啟動網址追蹤器 + 原本網址 + 轉址成 + 沒有任何轉址 + 當發佈後的頁面改名或移動時,會自動轉址至新網頁。 + 移除 + 您確定要移除從 %0% 到 %1% 的轉址嗎? + 轉址已移除。 + 移除轉址錯誤。 + + 您確定要停止轉址追蹤器? + 轉址追蹤器已停止。 + 停止轉址追蹤器錯誤,更多資訊請參閱您的紀錄檔。 + 轉址追蹤器已開啟。 + 啟動轉址追蹤器錯誤,更多資訊請參閱您的紀錄檔。 + +
\ No newline at end of file diff --git a/src/UmbracoUrlHandling/Umbraco/Controls/Images/ImageViewer.ascx b/src/UmbracoUrlHandling/Umbraco/Controls/Images/ImageViewer.ascx new file mode 100644 index 0000000..0ccd0c3 --- /dev/null +++ b/src/UmbracoUrlHandling/Umbraco/Controls/Images/ImageViewer.ascx @@ -0,0 +1,49 @@ +<%@ Control Language="C#" AutoEventWireup="True" CodeBehind="ImageViewer.ascx.cs" Inherits="Umbraco.Web.UI.Umbraco.Controls.Images.ImageViewer" %> +<%@ Import Namespace="Umbraco.Core.IO" %> +<%@ Register TagPrefix="umb" Namespace="ClientDependency.Core.Controls" Assembly="ClientDependency.Core" %> + +
+ + + + <%#AltText%> + + + + <%#AltText%> + + + +
');"> +
+
+
+ + + <%--Register the javascript callback method if any.--%> + + +
+<%--Ensure that the client API is registered for the image.--%> + + + diff --git a/src/UmbracoUrlHandling/Umbraco/Controls/Images/ImageViewer.js b/src/UmbracoUrlHandling/Umbraco/Controls/Images/ImageViewer.js new file mode 100644 index 0000000..9798426 --- /dev/null +++ b/src/UmbracoUrlHandling/Umbraco/Controls/Images/ImageViewer.js @@ -0,0 +1,133 @@ +/// +/// + +Umbraco.Sys.registerNamespace("Umbraco.Controls"); + +(function($) { + //jQuery plugin for Umbraco image viewer control + $.fn.UmbracoImageViewer = function(opts) { + //all options must be specified + var conf = $.extend({ + style: false, + linkTarget: "_blank", + umbPath: "" + }, opts); + return this.each(function() { + new Umbraco.Controls.ImageViewer().init($(this), conf); + }); + } + $.fn.UmbracoImageViewerAPI = function() { + /// exposes the Umbraco Image Viewer api for the selected object + //if there's more than item in the selector, throw exception + if ($(this).length != 1) { + throw "UmbracoImageViewerAPI selector requires that there be exactly one control selected"; + }; + return Umbraco.Controls.ImageViewer.inst[$(this).attr("id")] || null; + }; + Umbraco.Controls.ImageViewer = function() { + return { + _cntr: ++Umbraco.Controls.ImageViewer.cntr, + _containerId: null, + _context: null, + _serviceUrl: "", + _umbPath: "", + _style: false, + _linkTarget: "", + + init: function(jItem, opts) { + //this is stored so that we search the current document/iframe for this object + //when calling _getContainer. Before this was not required but for some reason inside the + //TinyMCE popup, when doing an ajax call, the context is lost to the jquery item! + this._context = jItem.get(0).ownerDocument; + + //store a reference to this api by the id and the counter + Umbraco.Controls.ImageViewer.inst[this._cntr] = this; + if (!jItem.attr("id")) jItem.attr("id", "UmbImageViewer_" + this._cntr); + Umbraco.Controls.ImageViewer.inst[jItem.attr("id")] = Umbraco.Controls.ImageViewer.inst[this._cntr]; + + this._containerId = jItem.attr("id"); + + this._umbPath = opts.umbPath; + this._serviceUrl = this._umbPath + "/controls/Images/ImageViewerUpdater.asmx"; + this._style = opts.style; + this._linkTarget = opts.linkTarget; + + }, + + updateImage: function(mediaId, callback) { + /// Updates the image to show the mediaId parameter using AJAX + + this._showThrobber(); + + var _this = this; + $.ajax({ + type: "POST", + url: _this._serviceUrl + "/UpdateImage", + data: '{ "mediaId": ' + parseInt(mediaId) + ', "style": "' + _this._style + '", "linkTarget": "' + _this._linkTarget + '"}', + contentType: "application/json; charset=utf-8", + dataType: "json", + success: function(msg) { + var rHtml = $("
").append(msg.d.html); //get the full html response wrapped in temp div + _this._updateImageFromAjax(rHtml); + if (typeof callback == "function") { + //build the parameters to pass back to the callback method + var params = { + hasImage: _this._getContainer().find("img.noimage").length == 0, + mediaId: msg.d.mediaId, + width: msg.d.width, + height: msg.d.height, + url: msg.d.url, + alt: msg.d.alt + }; + //call the callback method + callback.call(_this, params); + } + } + }); + }, + + showImage: function(path) { + /// This will force the image to show the path passed in + if (this._style != "ThumbnailPreview") { + this._getContainer().find("img").attr("src", path); + } + else { + c = this._getContainer().find(".bgImage"); + c.css("background-image", "url('" + path + "')"); + } + }, + + _getContainer: function() { + return $("#" + this._containerId, this._context); + }, + + _updateImageFromAjax: function(rHtml) { + this._getContainer().html(rHtml.find(".imageViewer").html()); //replace the html with the inner html of the image viewer response + }, + + _showThrobber: function() { + var c = null; + if (this._style != "ThumbnailPreview") { + c = this._getContainer().find("img"); + c.attr("src", this._umbPath + "/images/throbber.gif"); + c.css("margin-top", ((c.height() - 15) / 2) + "px"); + c.css("margin-left", ((c.width() - 15) / 2) + "px"); + } + else { + c = this._getContainer().find(".bgImage"); + c.css("background-image", ""); + c.html(""); + var img = c.find("img"); + img.attr("src", this._umbPath + "/images/throbber.gif"); + img.css("margin-top", "45px"); + img.css("margin-left", "45px"); + } + } + } + } + + // instance manager + Umbraco.Controls.ImageViewer.cntr = 0; + Umbraco.Controls.ImageViewer.inst = {}; + +})(jQuery); \ No newline at end of file diff --git a/src/UmbracoUrlHandling/Umbraco/Controls/Images/ImageViewerUpdater.asmx b/src/UmbracoUrlHandling/Umbraco/Controls/Images/ImageViewerUpdater.asmx new file mode 100644 index 0000000..c3070f3 --- /dev/null +++ b/src/UmbracoUrlHandling/Umbraco/Controls/Images/ImageViewerUpdater.asmx @@ -0,0 +1 @@ +<%@ WebService Language="C#" CodeBehind="ImageViewerUpdater.asmx.cs" Class="umbraco.controls.Images.ImageViewerUpdater" %> diff --git a/src/UmbracoUrlHandling/Umbraco/Controls/Images/UploadMediaImage.ascx b/src/UmbracoUrlHandling/Umbraco/Controls/Images/UploadMediaImage.ascx new file mode 100644 index 0000000..81bb1cb --- /dev/null +++ b/src/UmbracoUrlHandling/Umbraco/Controls/Images/UploadMediaImage.ascx @@ -0,0 +1,28 @@ +<%@ Control Language="C#" AutoEventWireup="true" CodeBehind="UploadMediaImage.ascx.cs" + Inherits="umbraco.controls.Images.UploadMediaImage" %> +<%@ Register TagPrefix="cc1" Namespace="umbraco.uicontrols" Assembly="controls" %> +<%@ Register TagPrefix="umb" Namespace="ClientDependency.Core.Controls" Assembly="ClientDependency.Core" %> +<%@ Register TagPrefix="ctl" Namespace="umbraco.controls" Assembly="umbraco" %> + + + + + + + + + + + + + + + + + + + + diff --git a/src/UmbracoUrlHandling/Umbraco/Controls/Images/UploadMediaImage.js b/src/UmbracoUrlHandling/Umbraco/Controls/Images/UploadMediaImage.js new file mode 100644 index 0000000..af34ce8 --- /dev/null +++ b/src/UmbracoUrlHandling/Umbraco/Controls/Images/UploadMediaImage.js @@ -0,0 +1,52 @@ +/// + +Umbraco.Sys.registerNamespace("Umbraco.Controls"); + +(function($) { + Umbraco.Controls.UploadMediaImage = function(txtBoxTitleID, btnID, uploadFileID) { + return { + _txtBoxTitleID: txtBoxTitleID, + _btnID: btnID, + _uplaodFileID: uploadFileID, + + validateImage: function() { + // Disable save button + var imageTypes = ",jpeg,jpg,gif,bmp,png,tiff,tif,"; + var tb_title = document.getElementById(this._txtBoxTitleID); + var bt_submit = $("#" + this._btnID); + var tb_image = document.getElementById(this._uplaodFileID); + + bt_submit.attr("disabled","disabled").css("color", "gray"); + + var imageName = tb_image.value; + if (imageName.length > 0) { + var extension = imageName.substring(imageName.lastIndexOf(".") + 1, imageName.length); + if (imageTypes.indexOf(',' + extension.toLowerCase() + ',') > -1) { + bt_submit.removeAttr("disabled").css("color", "#000"); + if (tb_title.value == "") { + var curName = imageName.substring(imageName.lastIndexOf("\\") + 1, imageName.length).replace("." + extension, ""); + var curNameLength = curName.length; + var friendlyName = ""; + for (var i = 0; i < curNameLength; i++) { + currentChar = curName.substring(i, i + 1); + if (friendlyName.length == 0) + currentChar = currentChar.toUpperCase(); + + if (i < curNameLength - 1 && friendlyName != '' && curName.substring(i - 1, i) == ' ') + currentChar = currentChar.toUpperCase(); + else if (currentChar != " " && i < curNameLength - 1 && friendlyName != '' + && curName.substring(i-1, i).toUpperCase() != curName.substring(i-1, i) + && currentChar.toUpperCase() == currentChar) + friendlyName += " "; + + friendlyName += currentChar; + + } + tb_title.value = friendlyName; + } + } + } + } + }; + } +})(jQuery); \ No newline at end of file diff --git a/src/UmbracoUrlHandling/Umbraco/Controls/ProgressBar.ascx b/src/UmbracoUrlHandling/Umbraco/Controls/ProgressBar.ascx new file mode 100644 index 0000000..907b925 --- /dev/null +++ b/src/UmbracoUrlHandling/Umbraco/Controls/ProgressBar.ascx @@ -0,0 +1,2 @@ +<%@ Control Language="C#" AutoEventWireup="true" CodeBehind="ProgressBar.ascx.cs" Inherits="umbraco.presentation.umbraco.controls.ProgressBar" %> +<%#umbraco.ui.Text("publish", "inProgress")%>
\ No newline at end of file diff --git a/src/UmbracoUrlHandling/Umbraco/Controls/Tree/CustomTreeService.asmx b/src/UmbracoUrlHandling/Umbraco/Controls/Tree/CustomTreeService.asmx new file mode 100644 index 0000000..2ddab05 --- /dev/null +++ b/src/UmbracoUrlHandling/Umbraco/Controls/Tree/CustomTreeService.asmx @@ -0,0 +1 @@ +<%@ WebService language="C#" class="umbraco.controls.Tree.CustomTreeService" %> \ No newline at end of file diff --git a/src/UmbracoUrlHandling/Umbraco/Controls/Tree/TreeControl.ascx b/src/UmbracoUrlHandling/Umbraco/Controls/Tree/TreeControl.ascx new file mode 100644 index 0000000..8f40b59 --- /dev/null +++ b/src/UmbracoUrlHandling/Umbraco/Controls/Tree/TreeControl.ascx @@ -0,0 +1,59 @@ +<%@ Control Language="C#" AutoEventWireup="true" Inherits="umbraco.controls.Tree.TreeControl" %> +<%@ Register TagPrefix="umb" Namespace="ClientDependency.Core.Controls" Assembly="ClientDependency.Core" %> +<%@ Register TagPrefix="umbClient" Namespace="Umbraco.Web.UI.Bundles" Assembly="umbraco" %> + + + + + + + + + + + + + +
+
+
+
\ No newline at end of file diff --git a/src/UmbracoUrlHandling/Umbraco/Controls/passwordChanger.ascx b/src/UmbracoUrlHandling/Umbraco/Controls/passwordChanger.ascx new file mode 100644 index 0000000..0572d10 --- /dev/null +++ b/src/UmbracoUrlHandling/Umbraco/Controls/passwordChanger.ascx @@ -0,0 +1,133 @@ +<%@ Control Language="C#" AutoEventWireup="True" CodeBehind="passwordChanger.ascx.cs" Inherits="Umbraco.Web.UI.Umbraco.Controls.PasswordChanger" %> + + + +<%= umbraco.ui.Text("user", "changePassword") %>
+ + + +
+

+ Password has been reset to
+
+ <%# ChangingPasswordModel.GeneratedPassword %> +

+
diff --git a/src/UmbracoUrlHandling/Umbraco/Create/DlrScripting.ascx b/src/UmbracoUrlHandling/Umbraco/Create/DlrScripting.ascx new file mode 100644 index 0000000..5956182 --- /dev/null +++ b/src/UmbracoUrlHandling/Umbraco/Create/DlrScripting.ascx @@ -0,0 +1,40 @@ +<%@ Control Language="C#" AutoEventWireup="True" CodeBehind="DlrScripting.ascx.cs" Inherits="Umbraco.Web.UI.Umbraco.Create.DlrScripting" %> +<%@ Import Namespace="umbraco" %> +<%@ Register TagPrefix="cc1" Namespace="umbraco.uicontrols" Assembly="controls" %> + + + + + * + + + + + + + + + + + + + + + + + + + + + + + <%=umbraco.ui.Text("cancel")%> + + + + +
+ diff --git a/src/UmbracoUrlHandling/Umbraco/Views/common/dialogs/template/snippet.html b/src/UmbracoUrlHandling/Umbraco/Views/common/dialogs/template/snippet.html new file mode 100644 index 0000000..0d6c050 --- /dev/null +++ b/src/UmbracoUrlHandling/Umbraco/Views/common/dialogs/template/snippet.html @@ -0,0 +1,37 @@ +
+
+ +
+
Configure the section
+
+ + + + +
+
diff --git a/src/UmbracoUrlHandling/Umbraco/Views/common/dialogs/treepicker.html b/src/UmbracoUrlHandling/Umbraco/Views/common/dialogs/treepicker.html new file mode 100644 index 0000000..c3569c6 --- /dev/null +++ b/src/UmbracoUrlHandling/Umbraco/Views/common/dialogs/treepicker.html @@ -0,0 +1,60 @@ +
+
+
+ + + + +
+
+ + + + +
diff --git a/src/UmbracoUrlHandling/Umbraco/Views/common/dialogs/user.html b/src/UmbracoUrlHandling/Umbraco/Views/common/dialogs/user.html new file mode 100644 index 0000000..c97d585 --- /dev/null +++ b/src/UmbracoUrlHandling/Umbraco/Views/common/dialogs/user.html @@ -0,0 +1,119 @@ +
+
+
+
+ +
+
+

{{user.name}}

+ Umbraco version {{version}} +

+ + : {{remainingAuthSeconds | timespan}} + +

+ +
+ +
+
+ +
+ +
+ + + Edit + + + + + +
+ +
+ +
External login providers
+ +
+ +
+ + +
+ + +
+ +
+ +
+
+ +
+ +
+ +
Change password
+ +
+ + + + + + + + + +
+ +
+ +
+
diff --git a/src/UmbracoUrlHandling/Umbraco/Views/common/dialogs/ysod.html b/src/UmbracoUrlHandling/Umbraco/Views/common/dialogs/ysod.html new file mode 100644 index 0000000..1734867 --- /dev/null +++ b/src/UmbracoUrlHandling/Umbraco/Views/common/dialogs/ysod.html @@ -0,0 +1,28 @@ +
+ + + + + \ No newline at end of file diff --git a/src/UmbracoUrlHandling/Umbraco/Views/common/legacy.html b/src/UmbracoUrlHandling/Umbraco/Views/common/legacy.html new file mode 100644 index 0000000..2fd41be --- /dev/null +++ b/src/UmbracoUrlHandling/Umbraco/Views/common/legacy.html @@ -0,0 +1,3 @@ +
+ +
\ No newline at end of file diff --git a/src/UmbracoUrlHandling/Umbraco/Views/common/login.html b/src/UmbracoUrlHandling/Umbraco/Views/common/login.html new file mode 100644 index 0000000..d490d39 --- /dev/null +++ b/src/UmbracoUrlHandling/Umbraco/Views/common/login.html @@ -0,0 +1,3 @@ +
+ +
\ No newline at end of file diff --git a/src/UmbracoUrlHandling/Umbraco/Views/common/notifications/confirmroutechange.html b/src/UmbracoUrlHandling/Umbraco/Views/common/notifications/confirmroutechange.html new file mode 100644 index 0000000..6d47084 --- /dev/null +++ b/src/UmbracoUrlHandling/Umbraco/Views/common/notifications/confirmroutechange.html @@ -0,0 +1,7 @@ +
+

You have unsaved changes

+

Are you sure you want to navigate away from this page? - you have unsaved changes

+ + + +
diff --git a/src/UmbracoUrlHandling/Umbraco/Views/common/overlays/contentpicker/contentpicker.html b/src/UmbracoUrlHandling/Umbraco/Views/common/overlays/contentpicker/contentpicker.html new file mode 100644 index 0000000..43eab53 --- /dev/null +++ b/src/UmbracoUrlHandling/Umbraco/Views/common/overlays/contentpicker/contentpicker.html @@ -0,0 +1,48 @@ +
+ +
+ +
+ + +
+ + + + +
+ + +
+ +
+ + + + +
\ No newline at end of file diff --git a/src/UmbracoUrlHandling/Umbraco/Views/common/overlays/contenttypeeditor/compositions/compositions.html b/src/UmbracoUrlHandling/Umbraco/Views/common/overlays/contenttypeeditor/compositions/compositions.html new file mode 100644 index 0000000..3cc81fd --- /dev/null +++ b/src/UmbracoUrlHandling/Umbraco/Views/common/overlays/contenttypeeditor/compositions/compositions.html @@ -0,0 +1,55 @@ +
+ +
+ +
+ +
+ +
+ + + + + + + + +
    +
  • + +
    + +
    + + + +
  • +
+
\ No newline at end of file diff --git a/src/UmbracoUrlHandling/Umbraco/Views/common/overlays/contenttypeeditor/editorpicker/editorpicker.html b/src/UmbracoUrlHandling/Umbraco/Views/common/overlays/contenttypeeditor/editorpicker/editorpicker.html new file mode 100644 index 0000000..392d45e --- /dev/null +++ b/src/UmbracoUrlHandling/Umbraco/Views/common/overlays/contenttypeeditor/editorpicker/editorpicker.html @@ -0,0 +1,117 @@ +
+ + +
+ +
+ + + + +
+ + + + + + + +
+
+
{{key}}
+ +
+
+ +
+
+
{{key}}
+ +
+
+ +
+ +
+ +
+ + +
+ +
+
+
+
{{key}}
+ +
+
+ +
+
+
+
{{key}}
+ +
+
+ +
+ + + + +
diff --git a/src/UmbracoUrlHandling/Umbraco/Views/common/overlays/contenttypeeditor/editorsettings/editorsettings.html b/src/UmbracoUrlHandling/Umbraco/Views/common/overlays/contenttypeeditor/editorsettings/editorsettings.html new file mode 100644 index 0000000..0ea012b --- /dev/null +++ b/src/UmbracoUrlHandling/Umbraco/Views/common/overlays/contenttypeeditor/editorsettings/editorsettings.html @@ -0,0 +1,21 @@ +
+ + using this editor will get updated with the new settings. +
+ +
+
+ +
+ +
+
+
+ +
+ + + + diff --git a/src/UmbracoUrlHandling/Umbraco/Views/common/overlays/contenttypeeditor/propertysettings/propertysettings.html b/src/UmbracoUrlHandling/Umbraco/Views/common/overlays/contenttypeeditor/propertysettings/propertysettings.html new file mode 100644 index 0000000..03ae935 --- /dev/null +++ b/src/UmbracoUrlHandling/Umbraco/Views/common/overlays/contenttypeeditor/propertysettings/propertysettings.html @@ -0,0 +1,119 @@ +
+ +
+
+ +
Required label
+
+
+ +
+
+ +
+ +
+ + + +
+ +
+ + + + + + + +
+ +
+ +
+ + + + + +
+ + + + + + + +
diff --git a/src/UmbracoUrlHandling/Umbraco/Views/common/overlays/copy/copy.html b/src/UmbracoUrlHandling/Umbraco/Views/common/overlays/copy/copy.html new file mode 100644 index 0000000..aeafaec --- /dev/null +++ b/src/UmbracoUrlHandling/Umbraco/Views/common/overlays/copy/copy.html @@ -0,0 +1,54 @@ +
+ +
+
+ + +
+ +
+ + +
+ +
+ + +
+ +
+ +
+ + +
+ +
+ + +
+ +
diff --git a/src/UmbracoUrlHandling/Umbraco/Views/common/overlays/embed/embed.html b/src/UmbracoUrlHandling/Umbraco/Views/common/overlays/embed/embed.html new file mode 100644 index 0000000..689643f --- /dev/null +++ b/src/UmbracoUrlHandling/Umbraco/Views/common/overlays/embed/embed.html @@ -0,0 +1,27 @@ +
+ + + + + + + +

+
+
+ +
+ + + + + + + + + + + +
+ +
diff --git a/src/UmbracoUrlHandling/Umbraco/Views/common/overlays/help/help.html b/src/UmbracoUrlHandling/Umbraco/Views/common/overlays/help/help.html new file mode 100644 index 0000000..ecfdd24 --- /dev/null +++ b/src/UmbracoUrlHandling/Umbraco/Views/common/overlays/help/help.html @@ -0,0 +1,50 @@ +
+ +
+
Help topics for: {{sectionName}}
+ + +
+ +
+
Video chapters for: {{sectionName}}
+ + +
+ +
diff --git a/src/UmbracoUrlHandling/Umbraco/Views/common/overlays/iconpicker/iconpicker.html b/src/UmbracoUrlHandling/Umbraco/Views/common/overlays/iconpicker/iconpicker.html new file mode 100644 index 0000000..56b31c8 --- /dev/null +++ b/src/UmbracoUrlHandling/Umbraco/Views/common/overlays/iconpicker/iconpicker.html @@ -0,0 +1,57 @@ +
+ +
+ +
+ +
+ +
+ + + +
+ +
+ + + No icons were found. + +
diff --git a/src/UmbracoUrlHandling/Umbraco/Views/common/overlays/insert/insert.html b/src/UmbracoUrlHandling/Umbraco/Views/common/overlays/insert/insert.html new file mode 100644 index 0000000..19005cc --- /dev/null +++ b/src/UmbracoUrlHandling/Umbraco/Views/common/overlays/insert/insert.html @@ -0,0 +1,46 @@ +
+
+
+
+
+
+
+
+
+ +
+
+
+
+
+ + +
+
+
+
+
+
+
+ + + + + + + + + +
diff --git a/src/UmbracoUrlHandling/Umbraco/Views/common/overlays/insertfield/insertfield.html b/src/UmbracoUrlHandling/Umbraco/Views/common/overlays/insertfield/insertfield.html new file mode 100644 index 0000000..ce522ec --- /dev/null +++ b/src/UmbracoUrlHandling/Umbraco/Views/common/overlays/insertfield/insertfield.html @@ -0,0 +1,183 @@ +
+ + +
+
+ +
+ +
+
+
+ +
+ + +
+ + +
+ + Add fallback field + +
+
+ +
+ +
+
+
+
+ + +
+ + +
+
+ +
+ +
+
+
+
+ + +
+
+
+ + + Yes, make it recursive +
+
+
+ +
Format and encoding
+ + +
+
+
+
+ +
+ Date only + Date and time + +
+
+
+ + +
+
+
+
+ +
+ Uppercase + Lowercase +
+
+
+ + +
+
+
+
+ +
+ HTML + URL +
+
+
+ +
Modify output
+ + +
+
+ +
+ +
+
+
+ + +
+
+ +
+ +
+
+
+ + +
+
+
+
+ +
+ + Yes, convert line breaks +
+
+
+ + +
+
+
+ +
{{ vm.generateOutputSample() }}
+
+
+
+ +
+ +
diff --git a/src/UmbracoUrlHandling/Umbraco/Views/common/overlays/itempicker/itempicker.html b/src/UmbracoUrlHandling/Umbraco/Views/common/overlays/itempicker/itempicker.html new file mode 100644 index 0000000..d71352c --- /dev/null +++ b/src/UmbracoUrlHandling/Umbraco/Views/common/overlays/itempicker/itempicker.html @@ -0,0 +1,25 @@ +
+ + + + + +
diff --git a/src/UmbracoUrlHandling/Umbraco/Views/common/overlays/linkpicker/linkpicker.html b/src/UmbracoUrlHandling/Umbraco/Views/common/overlays/linkpicker/linkpicker.html new file mode 100644 index 0000000..70a4ccb --- /dev/null +++ b/src/UmbracoUrlHandling/Umbraco/Views/common/overlays/linkpicker/linkpicker.html @@ -0,0 +1,89 @@ +
+ + + + + + + + + + + + + +
+
+ Link to page +
+ +
+ + + +
+ + + + +
+ + +
+
+ + + + +
+ +
+
+ Link to media +
+ + Select media + +
+ + + + +
diff --git a/src/UmbracoUrlHandling/Umbraco/Views/common/overlays/macropicker/macropicker.html b/src/UmbracoUrlHandling/Umbraco/Views/common/overlays/macropicker/macropicker.html new file mode 100644 index 0000000..da566e4 --- /dev/null +++ b/src/UmbracoUrlHandling/Umbraco/Views/common/overlays/macropicker/macropicker.html @@ -0,0 +1,64 @@ +
+ +
+ + +
+ + + + + + + + There are no macros available to insert + + +
+ +
+ +
{{model.selectedMacro.name}}
+ +
    +
  • + + + + + + + +
  • +
+ + + There are no parameters for this macro + + +
+
+ +
diff --git a/src/UmbracoUrlHandling/Umbraco/Views/common/overlays/mediaPicker/mediapicker.html b/src/UmbracoUrlHandling/Umbraco/Views/common/overlays/mediaPicker/mediapicker.html new file mode 100644 index 0000000..c7475e0 --- /dev/null +++ b/src/UmbracoUrlHandling/Umbraco/Views/common/overlays/mediaPicker/mediapicker.html @@ -0,0 +1,162 @@ +
+ +
+ +
+ + + + + + +
+ + +
+ +
+ +
+ +
+
+ + + + + + + +
+ + +
+ + + + + +
+ + + +
+ +
+ + +
+ +
+ +
+ Preview +
+ + + + +
+ +
+ +
+ + +
+ +
+ + +
+ + +
+ +
diff --git a/src/UmbracoUrlHandling/Umbraco/Views/common/overlays/mediatypepicker/mediatypepicker.html b/src/UmbracoUrlHandling/Umbraco/Views/common/overlays/mediatypepicker/mediatypepicker.html new file mode 100644 index 0000000..bd37800 --- /dev/null +++ b/src/UmbracoUrlHandling/Umbraco/Views/common/overlays/mediatypepicker/mediatypepicker.html @@ -0,0 +1,15 @@ + diff --git a/src/UmbracoUrlHandling/Umbraco/Views/common/overlays/membergrouppicker/membergrouppicker.html b/src/UmbracoUrlHandling/Umbraco/Views/common/overlays/membergrouppicker/membergrouppicker.html new file mode 100644 index 0000000..0f504c2 --- /dev/null +++ b/src/UmbracoUrlHandling/Umbraco/Views/common/overlays/membergrouppicker/membergrouppicker.html @@ -0,0 +1,12 @@ +
+ + + + +
diff --git a/src/UmbracoUrlHandling/Umbraco/Views/common/overlays/memberpicker/memberpicker.html b/src/UmbracoUrlHandling/Umbraco/Views/common/overlays/memberpicker/memberpicker.html new file mode 100644 index 0000000..00475dd --- /dev/null +++ b/src/UmbracoUrlHandling/Umbraco/Views/common/overlays/memberpicker/memberpicker.html @@ -0,0 +1,47 @@ +
+ +
+ +
+ + +
+ + + + +
+ + +
+
+ + + + +
diff --git a/src/UmbracoUrlHandling/Umbraco/Views/common/overlays/move/move.html b/src/UmbracoUrlHandling/Umbraco/Views/common/overlays/move/move.html new file mode 100644 index 0000000..34130c3 --- /dev/null +++ b/src/UmbracoUrlHandling/Umbraco/Views/common/overlays/move/move.html @@ -0,0 +1,43 @@ +
+
+
+ + +
+ +
+ + +
+ +
+ + +
+
+ + + + +
diff --git a/src/UmbracoUrlHandling/Umbraco/Views/common/overlays/querybuilder/querybuilder.html b/src/UmbracoUrlHandling/Umbraco/Views/common/overlays/querybuilder/querybuilder.html new file mode 100644 index 0000000..d469c45 --- /dev/null +++ b/src/UmbracoUrlHandling/Umbraco/Views/common/overlays/querybuilder/querybuilder.html @@ -0,0 +1,149 @@ +
+ +
+ +
+ + +
+ + + where + + + and + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + + +
+ +
{{model.result.resultCount}} items, returned in {{model.result.executionTime}} ms
+ + + +
+{{model.result.queryExpression}}
+        
+ +
+ + + + +
\ No newline at end of file diff --git a/src/UmbracoUrlHandling/Umbraco/Views/common/overlays/templatesections/templatesections.html b/src/UmbracoUrlHandling/Umbraco/Views/common/overlays/templatesections/templatesections.html new file mode 100644 index 0000000..ee62c34 --- /dev/null +++ b/src/UmbracoUrlHandling/Umbraco/Views/common/overlays/templatesections/templatesections.html @@ -0,0 +1,59 @@ +
+ +
+
+ +
+ +
+ +
+
+ +
+ +
+
+
+ +
+ +
+
+ + + +
+ +
+ + +
+ +
+
+
+ +
+ +
+ +
+
+
+ +
+ +
+
+ + + +
+
+ +
+ +
\ No newline at end of file diff --git a/src/UmbracoUrlHandling/Umbraco/Views/common/overlays/treepicker/treepicker.html b/src/UmbracoUrlHandling/Umbraco/Views/common/overlays/treepicker/treepicker.html new file mode 100644 index 0000000..a4d5ea9 --- /dev/null +++ b/src/UmbracoUrlHandling/Umbraco/Views/common/overlays/treepicker/treepicker.html @@ -0,0 +1,54 @@ +
+ +
+ +
+ + +
+ + + + + + {{ emptyStateMessage }} + + +
+ + +
+ +
+ + + + +
\ No newline at end of file diff --git a/src/UmbracoUrlHandling/Umbraco/Views/common/overlays/user/user.html b/src/UmbracoUrlHandling/Umbraco/Views/common/overlays/user/user.html new file mode 100644 index 0000000..31ff07a --- /dev/null +++ b/src/UmbracoUrlHandling/Umbraco/Views/common/overlays/user/user.html @@ -0,0 +1,123 @@ +
+ +
+ +
+ +

+ + : {{remainingAuthSeconds | timespan}} + +

+ + + + + + + + + + +
+ +
+ +
+ External login providers +
+ +
+ +
+ + +
+ + +
+ +
+ +
+
+ +
+ +
+ +
+ Change password +
+ +
+ + + + + + + + + +
+ +
+ +
diff --git a/src/UmbracoUrlHandling/Umbraco/Views/common/overlays/ysod/ysod.html b/src/UmbracoUrlHandling/Umbraco/Views/common/overlays/ysod/ysod.html new file mode 100644 index 0000000..fa0639f --- /dev/null +++ b/src/UmbracoUrlHandling/Umbraco/Views/common/overlays/ysod/ysod.html @@ -0,0 +1,27 @@ +
+ +

{{model.error.errorMsg}}

+

{{model.error.data.ExceptionMessage || model.error.data.Message}}

+ +
+
+ Exception Details: +
+ {{model.error.data.ExceptionType}}: {{model.error.data.ExceptionMessage}} +
+ +
+
+ Stacktrace: +
+
{{model.error.data.StackTrace}}
+
+ +
+
+ Inner Exception: +
+
{{e.ExceptionType}}: {{e.ExceptionMessage}}
+
{{e.StackTrace}}
+
+
diff --git a/src/UmbracoUrlHandling/Umbraco/Views/components/application/umb-contextmenu.html b/src/UmbracoUrlHandling/Umbraco/Views/components/application/umb-contextmenu.html new file mode 100644 index 0000000..de7e30a --- /dev/null +++ b/src/UmbracoUrlHandling/Umbraco/Views/components/application/umb-contextmenu.html @@ -0,0 +1,17 @@ +
+
+

{{menuDialogTitle}}

+
+ + +
\ No newline at end of file diff --git a/src/UmbracoUrlHandling/Umbraco/Views/components/application/umb-navigation.html b/src/UmbracoUrlHandling/Umbraco/Views/components/application/umb-navigation.html new file mode 100644 index 0000000..7a64394 --- /dev/null +++ b/src/UmbracoUrlHandling/Umbraco/Views/components/application/umb-navigation.html @@ -0,0 +1,104 @@ +
+ + + + + + + +
diff --git a/src/UmbracoUrlHandling/Umbraco/Views/components/application/umb-sections.html b/src/UmbracoUrlHandling/Umbraco/Views/components/application/umb-sections.html new file mode 100644 index 0000000..9dcedfe --- /dev/null +++ b/src/UmbracoUrlHandling/Umbraco/Views/components/application/umb-sections.html @@ -0,0 +1,66 @@ +
+ + + + + + + + + + +
diff --git a/src/UmbracoUrlHandling/Umbraco/Views/components/buttons/umb-button-group.html b/src/UmbracoUrlHandling/Umbraco/Views/components/buttons/umb-button-group.html new file mode 100644 index 0000000..46e1adb --- /dev/null +++ b/src/UmbracoUrlHandling/Umbraco/Views/components/buttons/umb-button-group.html @@ -0,0 +1,26 @@ +
+ + + + + + + + + + +
diff --git a/src/UmbracoUrlHandling/Umbraco/Views/components/buttons/umb-button.html b/src/UmbracoUrlHandling/Umbraco/Views/components/buttons/umb-button.html new file mode 100644 index 0000000..eb68a0c --- /dev/null +++ b/src/UmbracoUrlHandling/Umbraco/Views/components/buttons/umb-button.html @@ -0,0 +1,35 @@ +
+ +
+ +
+ +
+ +
+ + + + + {{label}} + {{label}} + + + + + + + +
diff --git a/src/UmbracoUrlHandling/Umbraco/Views/components/editor/subheader/umb-editor-sub-header-content-left.html b/src/UmbracoUrlHandling/Umbraco/Views/components/editor/subheader/umb-editor-sub-header-content-left.html new file mode 100644 index 0000000..9c52979 --- /dev/null +++ b/src/UmbracoUrlHandling/Umbraco/Views/components/editor/subheader/umb-editor-sub-header-content-left.html @@ -0,0 +1 @@ +
diff --git a/src/UmbracoUrlHandling/Umbraco/Views/components/editor/subheader/umb-editor-sub-header-content-right.html b/src/UmbracoUrlHandling/Umbraco/Views/components/editor/subheader/umb-editor-sub-header-content-right.html new file mode 100644 index 0000000..982ea18 --- /dev/null +++ b/src/UmbracoUrlHandling/Umbraco/Views/components/editor/subheader/umb-editor-sub-header-content-right.html @@ -0,0 +1 @@ +
diff --git a/src/UmbracoUrlHandling/Umbraco/Views/components/editor/subheader/umb-editor-sub-header-section.html b/src/UmbracoUrlHandling/Umbraco/Views/components/editor/subheader/umb-editor-sub-header-section.html new file mode 100644 index 0000000..1b2ab2e --- /dev/null +++ b/src/UmbracoUrlHandling/Umbraco/Views/components/editor/subheader/umb-editor-sub-header-section.html @@ -0,0 +1 @@ +
diff --git a/src/UmbracoUrlHandling/Umbraco/Views/components/editor/subheader/umb-editor-sub-header.html b/src/UmbracoUrlHandling/Umbraco/Views/components/editor/subheader/umb-editor-sub-header.html new file mode 100644 index 0000000..5a8e38c --- /dev/null +++ b/src/UmbracoUrlHandling/Umbraco/Views/components/editor/subheader/umb-editor-sub-header.html @@ -0,0 +1,6 @@ +
+
diff --git a/src/UmbracoUrlHandling/Umbraco/Views/components/editor/umb-breadcrumbs.html b/src/UmbracoUrlHandling/Umbraco/Views/components/editor/umb-breadcrumbs.html new file mode 100644 index 0000000..a9e42d0 --- /dev/null +++ b/src/UmbracoUrlHandling/Umbraco/Views/components/editor/umb-breadcrumbs.html @@ -0,0 +1,15 @@ + \ No newline at end of file diff --git a/src/UmbracoUrlHandling/Umbraco/Views/components/editor/umb-editor-container.html b/src/UmbracoUrlHandling/Umbraco/Views/components/editor/umb-editor-container.html new file mode 100644 index 0000000..44ced2e --- /dev/null +++ b/src/UmbracoUrlHandling/Umbraco/Views/components/editor/umb-editor-container.html @@ -0,0 +1,6 @@ +
+ +
+
+
+
diff --git a/src/UmbracoUrlHandling/Umbraco/Views/components/editor/umb-editor-footer-content-left.html b/src/UmbracoUrlHandling/Umbraco/Views/components/editor/umb-editor-footer-content-left.html new file mode 100644 index 0000000..3bab2ea --- /dev/null +++ b/src/UmbracoUrlHandling/Umbraco/Views/components/editor/umb-editor-footer-content-left.html @@ -0,0 +1 @@ +
diff --git a/src/UmbracoUrlHandling/Umbraco/Views/components/editor/umb-editor-footer-content-right.html b/src/UmbracoUrlHandling/Umbraco/Views/components/editor/umb-editor-footer-content-right.html new file mode 100644 index 0000000..9d58a97 --- /dev/null +++ b/src/UmbracoUrlHandling/Umbraco/Views/components/editor/umb-editor-footer-content-right.html @@ -0,0 +1 @@ +
diff --git a/src/UmbracoUrlHandling/Umbraco/Views/components/editor/umb-editor-footer.html b/src/UmbracoUrlHandling/Umbraco/Views/components/editor/umb-editor-footer.html new file mode 100644 index 0000000..3052636 --- /dev/null +++ b/src/UmbracoUrlHandling/Umbraco/Views/components/editor/umb-editor-footer.html @@ -0,0 +1,7 @@ +
+ +
+ +
+ +
diff --git a/src/UmbracoUrlHandling/Umbraco/Views/components/editor/umb-editor-header.html b/src/UmbracoUrlHandling/Umbraco/Views/components/editor/umb-editor-header.html new file mode 100644 index 0000000..fdc1ddf --- /dev/null +++ b/src/UmbracoUrlHandling/Umbraco/Views/components/editor/umb-editor-header.html @@ -0,0 +1,88 @@ +
+ +
+ +
+ +
+ +
+ +
+ +
+
+ +
+ + + + + +
{{ name }}
+ + + + + + +
{{ description }}
+ + +
+ +
+ + +
+ +
+ + + + +
+ + + + +
+ + + + +
diff --git a/src/UmbracoUrlHandling/Umbraco/Views/components/editor/umb-editor-menu.html b/src/UmbracoUrlHandling/Umbraco/Views/components/editor/umb-editor-menu.html new file mode 100644 index 0000000..25f9d87 --- /dev/null +++ b/src/UmbracoUrlHandling/Umbraco/Views/components/editor/umb-editor-menu.html @@ -0,0 +1,22 @@ +
+ + + + Actions + + + + + +
diff --git a/src/UmbracoUrlHandling/Umbraco/Views/components/editor/umb-editor-navigation.html b/src/UmbracoUrlHandling/Umbraco/Views/components/editor/umb-editor-navigation.html new file mode 100644 index 0000000..ec3260b --- /dev/null +++ b/src/UmbracoUrlHandling/Umbraco/Views/components/editor/umb-editor-navigation.html @@ -0,0 +1,15 @@ + diff --git a/src/UmbracoUrlHandling/Umbraco/Views/components/editor/umb-editor-sub-views.html b/src/UmbracoUrlHandling/Umbraco/Views/components/editor/umb-editor-sub-views.html new file mode 100644 index 0000000..6327e9f --- /dev/null +++ b/src/UmbracoUrlHandling/Umbraco/Views/components/editor/umb-editor-sub-views.html @@ -0,0 +1,10 @@ +
+
+
+
diff --git a/src/UmbracoUrlHandling/Umbraco/Views/components/editor/umb-editor-view.html b/src/UmbracoUrlHandling/Umbraco/Views/components/editor/umb-editor-view.html new file mode 100644 index 0000000..f99603a --- /dev/null +++ b/src/UmbracoUrlHandling/Umbraco/Views/components/editor/umb-editor-view.html @@ -0,0 +1,7 @@ +
+ +
diff --git a/src/UmbracoUrlHandling/Umbraco/Views/components/html/umb-control-group.html b/src/UmbracoUrlHandling/Umbraco/Views/components/html/umb-control-group.html new file mode 100644 index 0000000..342c96e --- /dev/null +++ b/src/UmbracoUrlHandling/Umbraco/Views/components/html/umb-control-group.html @@ -0,0 +1,13 @@ +
+
+
+ + +
+
+
+
+
\ No newline at end of file diff --git a/src/UmbracoUrlHandling/Umbraco/Views/components/html/umb-pane.html b/src/UmbracoUrlHandling/Umbraco/Views/components/html/umb-pane.html new file mode 100644 index 0000000..7c94769 --- /dev/null +++ b/src/UmbracoUrlHandling/Umbraco/Views/components/html/umb-pane.html @@ -0,0 +1,3 @@ +
+ +
\ No newline at end of file diff --git a/src/UmbracoUrlHandling/Umbraco/Views/components/html/umb-panel.html b/src/UmbracoUrlHandling/Umbraco/Views/components/html/umb-panel.html new file mode 100644 index 0000000..a963eff --- /dev/null +++ b/src/UmbracoUrlHandling/Umbraco/Views/components/html/umb-panel.html @@ -0,0 +1,3 @@ +
+ +
diff --git a/src/UmbracoUrlHandling/Umbraco/Views/components/imaging/umb-image-crop.html b/src/UmbracoUrlHandling/Umbraco/Views/components/imaging/umb-image-crop.html new file mode 100644 index 0000000..4f431de --- /dev/null +++ b/src/UmbracoUrlHandling/Umbraco/Views/components/imaging/umb-image-crop.html @@ -0,0 +1,19 @@ +
+
+
+ +
+
+
+ +
+ + + +
+
\ No newline at end of file diff --git a/src/UmbracoUrlHandling/Umbraco/Views/components/imaging/umb-image-gravity.html b/src/UmbracoUrlHandling/Umbraco/Views/components/imaging/umb-image-gravity.html new file mode 100644 index 0000000..21500e7 --- /dev/null +++ b/src/UmbracoUrlHandling/Umbraco/Views/components/imaging/umb-image-gravity.html @@ -0,0 +1,12 @@ +
+
+
+ + +
+ +
+ +
+
+
diff --git a/src/UmbracoUrlHandling/Umbraco/Views/components/imaging/umb-image-thumbnail.html b/src/UmbracoUrlHandling/Umbraco/Views/components/imaging/umb-image-thumbnail.html new file mode 100644 index 0000000..2f3861a --- /dev/null +++ b/src/UmbracoUrlHandling/Umbraco/Views/components/imaging/umb-image-thumbnail.html @@ -0,0 +1,5 @@ +
+ {{}} +
diff --git a/src/UmbracoUrlHandling/Umbraco/Views/components/notifications/umb-notifications.html b/src/UmbracoUrlHandling/Umbraco/Views/components/notifications/umb-notifications.html new file mode 100644 index 0000000..d8245ab --- /dev/null +++ b/src/UmbracoUrlHandling/Umbraco/Views/components/notifications/umb-notifications.html @@ -0,0 +1,21 @@ +
+ +
diff --git a/src/UmbracoUrlHandling/Umbraco/Views/components/overlays/umb-overlay-backdrop.html b/src/UmbracoUrlHandling/Umbraco/Views/components/overlays/umb-overlay-backdrop.html new file mode 100644 index 0000000..23ffbf6 --- /dev/null +++ b/src/UmbracoUrlHandling/Umbraco/Views/components/overlays/umb-overlay-backdrop.html @@ -0,0 +1 @@ +
{{ numberOfOverlays }}
diff --git a/src/UmbracoUrlHandling/Umbraco/Views/components/overlays/umb-overlay.html b/src/UmbracoUrlHandling/Umbraco/Views/components/overlays/umb-overlay.html new file mode 100644 index 0000000..4724084 --- /dev/null +++ b/src/UmbracoUrlHandling/Umbraco/Views/components/overlays/umb-overlay.html @@ -0,0 +1,76 @@ +
+ + +
+

{{model.title}}

+

{{model.subtitle}}

+
+ +
+
+
+ +
+ +
+ +
{{ model.itemDetails.title }}
+
+ +
{{ model.itemDetails.description }}
+ +
+ +
+ +
+ +
{{ model.confirmSubmit.title }}
+

{{ model.confirmSubmit.description }}

+ + + +
+ + + + + +
+
+ +
+ + + + + +
+ +
+
+
diff --git a/src/UmbracoUrlHandling/Umbraco/Views/components/property/umb-property-editor.html b/src/UmbracoUrlHandling/Umbraco/Views/components/property/umb-property-editor.html new file mode 100644 index 0000000..bbf70f7 --- /dev/null +++ b/src/UmbracoUrlHandling/Umbraco/Views/components/property/umb-property-editor.html @@ -0,0 +1,3 @@ +
+
+
diff --git a/src/UmbracoUrlHandling/Umbraco/Views/components/property/umb-property-group.html b/src/UmbracoUrlHandling/Umbraco/Views/components/property/umb-property-group.html new file mode 100644 index 0000000..e69de29 diff --git a/src/UmbracoUrlHandling/Umbraco/Views/components/property/umb-property.html b/src/UmbracoUrlHandling/Umbraco/Views/components/property/umb-property.html new file mode 100644 index 0000000..24bc1de --- /dev/null +++ b/src/UmbracoUrlHandling/Umbraco/Views/components/property/umb-property.html @@ -0,0 +1,22 @@ +
+ +
+ + + +
+ + + +
+
+
+
+
+
\ No newline at end of file diff --git a/src/UmbracoUrlHandling/Umbraco/Views/components/tabs/umb-tab.html b/src/UmbracoUrlHandling/Umbraco/Views/components/tabs/umb-tab.html new file mode 100644 index 0000000..8ee6fb4 --- /dev/null +++ b/src/UmbracoUrlHandling/Umbraco/Views/components/tabs/umb-tab.html @@ -0,0 +1,5 @@ +
+
+
+
+
diff --git a/src/UmbracoUrlHandling/Umbraco/Views/components/tabs/umb-tabs-content.html b/src/UmbracoUrlHandling/Umbraco/Views/components/tabs/umb-tabs-content.html new file mode 100644 index 0000000..8e1c7d4 --- /dev/null +++ b/src/UmbracoUrlHandling/Umbraco/Views/components/tabs/umb-tabs-content.html @@ -0,0 +1 @@ +
diff --git a/src/UmbracoUrlHandling/Umbraco/Views/components/tabs/umb-tabs-nav.html b/src/UmbracoUrlHandling/Umbraco/Views/components/tabs/umb-tabs-nav.html new file mode 100644 index 0000000..808822e --- /dev/null +++ b/src/UmbracoUrlHandling/Umbraco/Views/components/tabs/umb-tabs-nav.html @@ -0,0 +1,5 @@ + diff --git a/src/UmbracoUrlHandling/Umbraco/Views/components/tree/umb-tree-search-box.html b/src/UmbracoUrlHandling/Umbraco/Views/components/tree/umb-tree-search-box.html new file mode 100644 index 0000000..6bb2d12 --- /dev/null +++ b/src/UmbracoUrlHandling/Umbraco/Views/components/tree/umb-tree-search-box.html @@ -0,0 +1,13 @@ + \ No newline at end of file diff --git a/src/UmbracoUrlHandling/Umbraco/Views/components/tree/umb-tree-search-results.html b/src/UmbracoUrlHandling/Umbraco/Views/components/tree/umb-tree-search-results.html new file mode 100644 index 0000000..b77810b --- /dev/null +++ b/src/UmbracoUrlHandling/Umbraco/Views/components/tree/umb-tree-search-results.html @@ -0,0 +1,26 @@ +
+ + + + + + +
+ + diff --git a/src/UmbracoUrlHandling/Umbraco/Views/components/umb-avatar.html b/src/UmbracoUrlHandling/Umbraco/Views/components/umb-avatar.html new file mode 100644 index 0000000..1d23769 --- /dev/null +++ b/src/UmbracoUrlHandling/Umbraco/Views/components/umb-avatar.html @@ -0,0 +1 @@ + diff --git a/src/UmbracoUrlHandling/Umbraco/Views/components/umb-child-selector.html b/src/UmbracoUrlHandling/Umbraco/Views/components/umb-child-selector.html new file mode 100644 index 0000000..686937e --- /dev/null +++ b/src/UmbracoUrlHandling/Umbraco/Views/components/umb-child-selector.html @@ -0,0 +1,37 @@ +
+ +
+
+
+ +
+ + {{ parentName }} + + + () + +
+
+ +
+ +
+
+
+ +
+ {{ selectedChild.name }} +
+
+ +
+
+ + +
Add Child
+
+ +
+ +
diff --git a/src/UmbracoUrlHandling/Umbraco/Views/components/umb-confirm-action.html b/src/UmbracoUrlHandling/Umbraco/Views/components/umb-confirm-action.html new file mode 100644 index 0000000..c34c3f9 --- /dev/null +++ b/src/UmbracoUrlHandling/Umbraco/Views/components/umb-confirm-action.html @@ -0,0 +1,16 @@ +
+ + + + + + + + +
diff --git a/src/UmbracoUrlHandling/Umbraco/Views/components/umb-confirm.html b/src/UmbracoUrlHandling/Umbraco/Views/components/umb-confirm.html new file mode 100644 index 0000000..1460e38 --- /dev/null +++ b/src/UmbracoUrlHandling/Umbraco/Views/components/umb-confirm.html @@ -0,0 +1,10 @@ +
+

{{caption}}

+ +
+
+ Cancel + Ok +
+
+
\ No newline at end of file diff --git a/src/UmbracoUrlHandling/Umbraco/Views/components/umb-content-grid.html b/src/UmbracoUrlHandling/Umbraco/Views/components/umb-content-grid.html new file mode 100644 index 0000000..8ac49e4 --- /dev/null +++ b/src/UmbracoUrlHandling/Umbraco/Views/components/umb-content-grid.html @@ -0,0 +1,36 @@ +
+ +
+ + + +
+ +
+ +
+ +
{{ item.name }}
+ +
    +
  • +
    {{ property.header }}:
    +
    {{ item[property.alias] }}
    +
  • +
+ +
+ +
+ + + There are no items to show + + +
\ No newline at end of file diff --git a/src/UmbracoUrlHandling/Umbraco/Views/components/umb-date-time-picker.html b/src/UmbracoUrlHandling/Umbraco/Views/components/umb-date-time-picker.html new file mode 100644 index 0000000..6b37381 --- /dev/null +++ b/src/UmbracoUrlHandling/Umbraco/Views/components/umb-date-time-picker.html @@ -0,0 +1,6 @@ +
+ + + + +
\ No newline at end of file diff --git a/src/UmbracoUrlHandling/Umbraco/Views/components/umb-empty-state.html b/src/UmbracoUrlHandling/Umbraco/Views/components/umb-empty-state.html new file mode 100644 index 0000000..e982277 --- /dev/null +++ b/src/UmbracoUrlHandling/Umbraco/Views/components/umb-empty-state.html @@ -0,0 +1,9 @@ +
+
diff --git a/src/UmbracoUrlHandling/Umbraco/Views/components/umb-folder-grid.html b/src/UmbracoUrlHandling/Umbraco/Views/components/umb-folder-grid.html new file mode 100644 index 0000000..df5eafb --- /dev/null +++ b/src/UmbracoUrlHandling/Umbraco/Views/components/umb-folder-grid.html @@ -0,0 +1,18 @@ +
+ +
+ +
+ +
{{ folder.name }}
+
+ + + +
+ +
diff --git a/src/UmbracoUrlHandling/Umbraco/Views/components/umb-generate-alias.html b/src/UmbracoUrlHandling/Umbraco/Views/components/umb-generate-alias.html new file mode 100644 index 0000000..6932747 --- /dev/null +++ b/src/UmbracoUrlHandling/Umbraco/Views/components/umb-generate-alias.html @@ -0,0 +1,12 @@ +
+ {{ alias }} +
+ + +
+
+ \ No newline at end of file diff --git a/src/UmbracoUrlHandling/Umbraco/Views/components/umb-grid-selector.html b/src/UmbracoUrlHandling/Umbraco/Views/components/umb-grid-selector.html new file mode 100644 index 0000000..0fa236f --- /dev/null +++ b/src/UmbracoUrlHandling/Umbraco/Views/components/umb-grid-selector.html @@ -0,0 +1,43 @@ +
+ +
+ +
+
+ +
{{ defaultItem.name }}
+ (Default {{itemLabel}}) +
+ +
+ +
+
+ +
{{ selectedItem.name }}
+ Set as default +
+ +
+ + +
+
Choose extra {{ itemLabel }}
+
Choose default {{ itemLabel }}
+
+
+ +
+ +
+ Akk {{itemLabel}}s are added +
+ + + + +
diff --git a/src/UmbracoUrlHandling/Umbraco/Views/components/umb-groups-builder.html b/src/UmbracoUrlHandling/Umbraco/Views/components/umb-groups-builder.html new file mode 100644 index 0000000..f294178 --- /dev/null +++ b/src/UmbracoUrlHandling/Umbraco/Views/components/umb-groups-builder.html @@ -0,0 +1,299 @@ +
+ + + + + + + + + + + + + + + +
+ +
+ +
    + +
  • + + + + +
    +
    +
    + + + + +
    + + +
    + +
    + + + +
    + +
    + + +
    + + + +
    +
    + +
    +
    + + +
    + +
    +
    +
    +
    + +
    + + {{ tab.inheritedFromName }} + + + {{ contentTypeName }} + , + +
    + +
    + +
      + +
    • + + + + +
      +
      +
      +
      +
      +
      +
      +
      +
      + +
      + +
      + +
      + +
      + +
      + + +
      + + +
      + +
      {{ property.alias }}
      + + + +
      + + +
      +
      +
      + +
      + +
      +
      +
      + +
      + + {{ property.label }} + ({{ property.alias }}) +
      + +
      + + +
      + +
      + + + {{property.dataTypeName}} + + + +
      + * + +
      + +
      + + +
      + +
      + + +
      + +
      + +
      + +
      + + + {{property.contentTypeName}} +
      + +
      + + +
      + +
      + + + + + + +
      + + +
      + +
      + + +
      + +
      + + +
      + + + +
      + +
      + +
      + +
      + +
    • + +
    + +
    + +
    + +
  • + +
+ + + + + + + +
diff --git a/src/UmbracoUrlHandling/Umbraco/Views/components/umb-keyboard-shortcuts-overview.html b/src/UmbracoUrlHandling/Umbraco/Views/components/umb-keyboard-shortcuts-overview.html new file mode 100644 index 0000000..8b12ee4 --- /dev/null +++ b/src/UmbracoUrlHandling/Umbraco/Views/components/umb-keyboard-shortcuts-overview.html @@ -0,0 +1,60 @@ +
+ +
+
show shortcuts
+
+
+
alt
+
+
+
+
+
shift
+
+
+
+
+
k
+
+
+
+ +
+ + + + + +
+ +
+ +
{{ keyboardShortcutGroup.name }}
+ +
+ +
+
{{ keyboardShortcut.description }}
+
+ +
+ +
+
{{ key.key }}
+
+ + + - +
+
+ +
+ +
+
+ +
+ +
+ +
+
+ +
diff --git a/src/UmbracoUrlHandling/Umbraco/Views/components/umb-layout-selector.html b/src/UmbracoUrlHandling/Umbraco/Views/components/umb-layout-selector.html new file mode 100644 index 0000000..c7dba13 --- /dev/null +++ b/src/UmbracoUrlHandling/Umbraco/Views/components/umb-layout-selector.html @@ -0,0 +1,14 @@ +
+ +
+ +
+ +
+
+ +
+ +
+ +
diff --git a/src/UmbracoUrlHandling/Umbraco/Views/components/umb-lightbox.html b/src/UmbracoUrlHandling/Umbraco/Views/components/umb-lightbox.html new file mode 100644 index 0000000..1379072 --- /dev/null +++ b/src/UmbracoUrlHandling/Umbraco/Views/components/umb-lightbox.html @@ -0,0 +1,22 @@ +
+ +
+
+ +
+ +
+
+ +
+
+ +
+ +
+ +
+ +
+ +
diff --git a/src/UmbracoUrlHandling/Umbraco/Views/components/umb-list-view-layout.html b/src/UmbracoUrlHandling/Umbraco/Views/components/umb-list-view-layout.html new file mode 100644 index 0000000..a4ea2d2 --- /dev/null +++ b/src/UmbracoUrlHandling/Umbraco/Views/components/umb-list-view-layout.html @@ -0,0 +1,3 @@ +
+
+
diff --git a/src/UmbracoUrlHandling/Umbraco/Views/components/umb-list-view-settings.html b/src/UmbracoUrlHandling/Umbraco/Views/components/umb-list-view-settings.html new file mode 100644 index 0000000..5afd301 --- /dev/null +++ b/src/UmbracoUrlHandling/Umbraco/Views/components/umb-list-view-settings.html @@ -0,0 +1,39 @@ +
+ +
+
+ + +
+
+ +
+ +
+
+
{{ dataType.name }} (default)
+ +
+ Create custom list view + Remove custom list view +
+
+ +
+ + +
+ + + + + + + + +
+
+
diff --git a/src/UmbracoUrlHandling/Umbraco/Views/components/umb-load-indicator.html b/src/UmbracoUrlHandling/Umbraco/Views/components/umb-load-indicator.html new file mode 100644 index 0000000..4d545e2 --- /dev/null +++ b/src/UmbracoUrlHandling/Umbraco/Views/components/umb-load-indicator.html @@ -0,0 +1,5 @@ +
    +
  • +
  • +
  • +
diff --git a/src/UmbracoUrlHandling/Umbraco/Views/components/umb-locked-field.html b/src/UmbracoUrlHandling/Umbraco/Views/components/umb-locked-field.html new file mode 100644 index 0000000..217d420 --- /dev/null +++ b/src/UmbracoUrlHandling/Umbraco/Views/components/umb-locked-field.html @@ -0,0 +1,35 @@ + + +
+ + + + + + + + + + + +
+ +
Required alias
+
Invalid alias
+
+ +
diff --git a/src/UmbracoUrlHandling/Umbraco/Views/components/umb-media-grid.html b/src/UmbracoUrlHandling/Umbraco/Views/components/umb-media-grid.html new file mode 100644 index 0000000..412a572 --- /dev/null +++ b/src/UmbracoUrlHandling/Umbraco/Views/components/umb-media-grid.html @@ -0,0 +1,28 @@ +
+
+
+ + +
+ +
{{item.name}}
+
+ + +
+ + + {{item.name}} + + + {{item.name}} + + + {{item.name}} + + + + +
+
+
diff --git a/src/UmbracoUrlHandling/Umbraco/Views/components/umb-mini-list-view.html b/src/UmbracoUrlHandling/Umbraco/Views/components/umb-mini-list-view.html new file mode 100644 index 0000000..9959d7b --- /dev/null +++ b/src/UmbracoUrlHandling/Umbraco/Views/components/umb-mini-list-view.html @@ -0,0 +1,101 @@ +
+ +
+ +
+ +

{{ miniListView.node.name }}

+
+ +
+ + + + Back / + + + + + +
+ +
+ + +
+
+ +
+ +
+
+
+ + +
+ + +
+ +
+ + +
+
+
+   + + +
+
+
{{ child.name }}
+
+ + +
+ + +
+ + +
+ +
+ +
+ +
+ +
+ + +
+ +
+ +
diff --git a/src/UmbracoUrlHandling/Umbraco/Views/components/umb-node-preview.html b/src/UmbracoUrlHandling/Umbraco/Views/components/umb-node-preview.html new file mode 100644 index 0000000..02bce43 --- /dev/null +++ b/src/UmbracoUrlHandling/Umbraco/Views/components/umb-node-preview.html @@ -0,0 +1,12 @@ +
+ +
+
{{ name }}
+
{{ description }}
+
+
+ Open + Remove +
+ +
diff --git a/src/UmbracoUrlHandling/Umbraco/Views/components/umb-pagination.html b/src/UmbracoUrlHandling/Umbraco/Views/components/umb-pagination.html new file mode 100644 index 0000000..e8effcd --- /dev/null +++ b/src/UmbracoUrlHandling/Umbraco/Views/components/umb-pagination.html @@ -0,0 +1,26 @@ + diff --git a/src/UmbracoUrlHandling/Umbraco/Views/components/umb-progress-bar.html b/src/UmbracoUrlHandling/Umbraco/Views/components/umb-progress-bar.html new file mode 100644 index 0000000..d3f7c2f --- /dev/null +++ b/src/UmbracoUrlHandling/Umbraco/Views/components/umb-progress-bar.html @@ -0,0 +1,3 @@ +
+ +
diff --git a/src/UmbracoUrlHandling/Umbraco/Views/components/umb-table.html b/src/UmbracoUrlHandling/Umbraco/Views/components/umb-table.html new file mode 100644 index 0000000..f7d5caa --- /dev/null +++ b/src/UmbracoUrlHandling/Umbraco/Views/components/umb-table.html @@ -0,0 +1,60 @@ +
+
+ +
+
+
+ +
+ + +
+
+ +
+
+ +
+ + +
+
+ + +
+
+ {{item[column.alias]}} +
+
+
+
+ + + There are no items show in the list. + +
diff --git a/src/UmbracoUrlHandling/Umbraco/Views/components/umb-tooltip.html b/src/UmbracoUrlHandling/Umbraco/Views/components/umb-tooltip.html new file mode 100644 index 0000000..18095e5 --- /dev/null +++ b/src/UmbracoUrlHandling/Umbraco/Views/components/umb-tooltip.html @@ -0,0 +1 @@ +
diff --git a/src/UmbracoUrlHandling/Umbraco/Views/components/upload/umb-file-dropzone.html b/src/UmbracoUrlHandling/Umbraco/Views/components/upload/umb-file-dropzone.html new file mode 100644 index 0000000..6b05593 --- /dev/null +++ b/src/UmbracoUrlHandling/Umbraco/Views/components/upload/umb-file-dropzone.html @@ -0,0 +1,108 @@ +
+ + + + +
+ + +
+ + + + + + +
+ - or click here to choose files +
+
+
+ + +
    + + +
  • + + +
    {{ file.name }}
    + + +
    + +
    + +
  • + +
  • + + +
    {{ currentFile.name }}
    + + +
    + +
    +
  • + + +
  • + + +
    {{ queued.name }}
    +
  • + +
  • + + +
    + + {{ file.name }} + + + + "{{maxFileSize}}" + + + + {{file.serverErrorMessage}} + + +
    + + +
    + +
    + +
  • +
+ +
+ + + + +
diff --git a/src/UmbracoUrlHandling/Umbraco/Views/content/copy.html b/src/UmbracoUrlHandling/Umbraco/Views/content/copy.html new file mode 100644 index 0000000..8992ca1 --- /dev/null +++ b/src/UmbracoUrlHandling/Umbraco/Views/content/copy.html @@ -0,0 +1,93 @@ +
+
+
+ +
+
+
{{error.errorMsg}}
+
{{error.data.message}}
+
+
+ +
+
+ {{currentNode.name}} was copied to + {{target.name}} +
+ +
+ +

+ Choose where to copy {{currentNode.name}} to in the tree structure below +

+ +
+
+
+ +
+ +
+ + + +
+ + + + +
+ + +
+
+ + + + + + + + + + + + + + + + +
+
+
+ + +
\ No newline at end of file diff --git a/src/UmbracoUrlHandling/Umbraco/Views/content/create.html b/src/UmbracoUrlHandling/Umbraco/Views/content/create.html new file mode 100644 index 0000000..d07dff4 --- /dev/null +++ b/src/UmbracoUrlHandling/Umbraco/Views/content/create.html @@ -0,0 +1,45 @@ + + + \ No newline at end of file diff --git a/src/UmbracoUrlHandling/Umbraco/Views/content/delete.html b/src/UmbracoUrlHandling/Umbraco/Views/content/delete.html new file mode 100644 index 0000000..abe655e --- /dev/null +++ b/src/UmbracoUrlHandling/Umbraco/Views/content/delete.html @@ -0,0 +1,12 @@ +
+
+ +

+ Are you sure you want to delete {{currentNode.name}} ? +

+ + + + +
+
diff --git a/src/UmbracoUrlHandling/Umbraco/Views/content/edit.html b/src/UmbracoUrlHandling/Umbraco/Views/content/edit.html new file mode 100644 index 0000000..0ef68fe --- /dev/null +++ b/src/UmbracoUrlHandling/Umbraco/Views/content/edit.html @@ -0,0 +1,86 @@ +
+ + + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
diff --git a/src/UmbracoUrlHandling/Umbraco/Views/content/emptyrecyclebin.html b/src/UmbracoUrlHandling/Umbraco/Views/content/emptyrecyclebin.html new file mode 100644 index 0000000..ec3ff44 --- /dev/null +++ b/src/UmbracoUrlHandling/Umbraco/Views/content/emptyrecyclebin.html @@ -0,0 +1,17 @@ +
+
+ +
+
+
+ +

+ When items are deleted from the recycle bin, they will be gone forever. + Are you sure? +

+ + + +
+
+
diff --git a/src/UmbracoUrlHandling/Umbraco/Views/content/move.html b/src/UmbracoUrlHandling/Umbraco/Views/content/move.html new file mode 100644 index 0000000..166d0f0 --- /dev/null +++ b/src/UmbracoUrlHandling/Umbraco/Views/content/move.html @@ -0,0 +1,83 @@ +
+
+
+ +
+
+
{{error.errorMsg}}
+
{{error.data.message}}
+
+
+ +
+
+ {{currentNode.name}} was moved underneath {{target.name}} +
+ +
+ +

+ Choose where to move + {{currentNode.name}} + to in the tree structure below +

+ +
+
+
+ +
+ +
+ + + +
+ + + + +
+ + +
+
+ + + + +
+
+
+ + + +
\ No newline at end of file diff --git a/src/UmbracoUrlHandling/Umbraco/Views/content/recyclebin.html b/src/UmbracoUrlHandling/Umbraco/Views/content/recyclebin.html new file mode 100644 index 0000000..2a6efa3 --- /dev/null +++ b/src/UmbracoUrlHandling/Umbraco/Views/content/recyclebin.html @@ -0,0 +1,16 @@ + +
+ + + + + +
+ +
+
+
\ No newline at end of file diff --git a/src/UmbracoUrlHandling/Umbraco/Views/content/restore.html b/src/UmbracoUrlHandling/Umbraco/Views/content/restore.html new file mode 100644 index 0000000..c1901c4 --- /dev/null +++ b/src/UmbracoUrlHandling/Umbraco/Views/content/restore.html @@ -0,0 +1,26 @@ +
+
+ + +

+ Restore {{currentNode.name}} to under {{target.name}}? +

+ +
+

{{error.errorMsg}}

+

{{error.data.Message}}

+
+ +
+

{{currentNode.name}} was moved underneath {{target.name}}

+ +
+ +
+
+ + +
\ No newline at end of file diff --git a/src/UmbracoUrlHandling/Umbraco/Views/content/umbpreview.html b/src/UmbracoUrlHandling/Umbraco/Views/content/umbpreview.html new file mode 100644 index 0000000..3cdf145 --- /dev/null +++ b/src/UmbracoUrlHandling/Umbraco/Views/content/umbpreview.html @@ -0,0 +1,9 @@ + + + + Loading + + + + + \ No newline at end of file diff --git a/src/UmbracoUrlHandling/Umbraco/Views/dashboard/ChangePassword.html b/src/UmbracoUrlHandling/Umbraco/Views/dashboard/ChangePassword.html new file mode 100644 index 0000000..7b1398b --- /dev/null +++ b/src/UmbracoUrlHandling/Umbraco/Views/dashboard/ChangePassword.html @@ -0,0 +1,18 @@ +
+ +

Change password

+ + + + + + + + + +
diff --git a/src/UmbracoUrlHandling/Umbraco/Views/dashboard/default/StartupDashboardIntro.html b/src/UmbracoUrlHandling/Umbraco/Views/dashboard/default/StartupDashboardIntro.html new file mode 100644 index 0000000..7eaa59c --- /dev/null +++ b/src/UmbracoUrlHandling/Umbraco/Views/dashboard/default/StartupDashboardIntro.html @@ -0,0 +1,71 @@ +
+ + + +
+ +
+
+ + +
+
+ + +
+
+ + +
+
+
+
+
+ +
+
+ +
+
+
+ + +
+
+ + + + +
+ +
+

Welcome to The Friendly CMS

+

Thank you for choosing Umbraco - we think this could be the beginning of something beautiful. While it may feel overwhelming at first, we've done a lot to make the learning curve as smooth and fast as possible.

+
+ + + +
+
+
+ + {{ article.altText }} + +
+
+

{{ article.title }}

+
{{ article.description }}
+ {{article.buttonText}} +
+
+
+ +
+ +
\ No newline at end of file diff --git a/src/UmbracoUrlHandling/Umbraco/Views/dashboard/default/StartupDashboardKits.html b/src/UmbracoUrlHandling/Umbraco/Views/dashboard/default/StartupDashboardKits.html new file mode 100644 index 0000000..29049d0 --- /dev/null +++ b/src/UmbracoUrlHandling/Umbraco/Views/dashboard/default/StartupDashboardKits.html @@ -0,0 +1,15 @@ +

Install a Starter Site and Skin

+

If you haven't already installed one of our Starter Kits, we think you should do that now. This is one of the best ways to start working with Umbraco. After you install a Starter Kit, you can select a skin to make it look great and customize the kit to your liking.

+

Starter Kits:

+
+
+
+ +
+
+
diff --git a/src/UmbracoUrlHandling/Umbraco/Views/dashboard/default/StartupDashboardLastEdits.html b/src/UmbracoUrlHandling/Umbraco/Views/dashboard/default/StartupDashboardLastEdits.html new file mode 100644 index 0000000..e69de29 diff --git a/src/UmbracoUrlHandling/Umbraco/Views/dashboard/default/StartupDashboardVideos.html b/src/UmbracoUrlHandling/Umbraco/Views/dashboard/default/StartupDashboardVideos.html new file mode 100644 index 0000000..1a83a5e --- /dev/null +++ b/src/UmbracoUrlHandling/Umbraco/Views/dashboard/default/StartupDashboardVideos.html @@ -0,0 +1,18 @@ +

Hours of Umbraco training videos are only a click away

+

Want to master Umbraco? Spend a couple of minutes learning some best practices by watching one of these videos about using Umbraco. And visit umbraco.tv for even more Umbraco videos

+ +

To get you started:

+
+ + +
diff --git a/src/UmbracoUrlHandling/Umbraco/Views/dashboard/default/ourumbraco.jpg b/src/UmbracoUrlHandling/Umbraco/Views/dashboard/default/ourumbraco.jpg new file mode 100644 index 0000000..5d5324e Binary files /dev/null and b/src/UmbracoUrlHandling/Umbraco/Views/dashboard/default/ourumbraco.jpg differ diff --git a/src/UmbracoUrlHandling/Umbraco/Views/dashboard/default/umbracotv.jpg b/src/UmbracoUrlHandling/Umbraco/Views/dashboard/default/umbracotv.jpg new file mode 100644 index 0000000..22ae365 Binary files /dev/null and b/src/UmbracoUrlHandling/Umbraco/Views/dashboard/default/umbracotv.jpg differ diff --git a/src/UmbracoUrlHandling/Umbraco/Views/dashboard/developer/developerdashboardintro.html b/src/UmbracoUrlHandling/Umbraco/Views/dashboard/developer/developerdashboardintro.html new file mode 100644 index 0000000..6ced082 --- /dev/null +++ b/src/UmbracoUrlHandling/Umbraco/Views/dashboard/developer/developerdashboardintro.html @@ -0,0 +1,14 @@ +

Start here

+

This section contains the tools to add advanced features to your Umbraco site

+

From here you can explore and install packages, create macros, add data types, and much more. Start by exploring the below links or videos.

+ +

Find out more:

+ + diff --git a/src/UmbracoUrlHandling/Umbraco/Views/dashboard/developer/developerdashboardvideos.html b/src/UmbracoUrlHandling/Umbraco/Views/dashboard/developer/developerdashboardvideos.html new file mode 100644 index 0000000..bc428fc --- /dev/null +++ b/src/UmbracoUrlHandling/Umbraco/Views/dashboard/developer/developerdashboardvideos.html @@ -0,0 +1,20 @@ +

Hours of Umbraco training videos are only a click away

+

Want to master Umbraco? Spend a couple of minutes learning some best practices by watching one of these videos about using Umbraco. And visit umbraco.tv for even more Umbraco videos

+ +
+ + +
diff --git a/src/UmbracoUrlHandling/Umbraco/Views/dashboard/developer/examinemanagement.html b/src/UmbracoUrlHandling/Umbraco/Views/dashboard/developer/examinemanagement.html new file mode 100644 index 0000000..e80e777 --- /dev/null +++ b/src/UmbracoUrlHandling/Umbraco/Views/dashboard/developer/examinemanagement.html @@ -0,0 +1,287 @@ +
+ +

Examine Management

+ +
+
+ +
+ +
+ +
+
Indexers
+
+ +
+
+
+
Manage Examine's indexes
+
Allows you to view the details of each index and provides some tools for managing the indexes
+
+ +
+ +
+ +
+ +
+
+
+ {{indexer.name}} +
+ + {{indexer.name}} + +
+ The index cannot be read and will need to be rebuilt +
+
+ +
+
+ +
+
+ +
+
    +
  • + Index info & tools + +
    +
    +
    + +
    + +
    + +
    + The process is taking longer than expected, check the umbraco log to see if there have been any errors during this operation +
    +
    + + + + + + + + + + + + + + + + + + + +
     
    Documents in index{{indexer.documentCount}}
    Fields in index{{indexer.fieldCount}}
    Has deletions? + {{indexer.deletionCount > 0}} + ({{indexer.deletionCount}}) +
    Optimized? + {{indexer.isOptimized}} +
    +
    +
  • +
  • + Node types + + + + + + + + + + + + + +
    Include node types{{indexer.indexCriteria.IncludeNodeTypes | json}}
    Exclude node types{{indexer.indexCriteria.ExcludeNodeTypes | json}}
    Parent node id{{indexer.indexCriteria.ParentNodeId}}
    +
  • +
  • + System fields + + + + + + + + + + + + + + + + +
     
    NameEnable sortingType
    {{field.Name}}{{field.EnableSorting}}{{field.Type}}
    +
  • +
  • + User fields + + + + + + + + + + + + + + + + +
     
    NameEnable sortingType
    {{field.Name}}{{field.EnableSorting}}{{field.Type}}
    +
  • +
  • + Provider properties + + + + + + +
     
    {{key}}{{val}}
    +
  • +
+
+
+ +
+
+ +
+
+
+
+ +
+ +
+
Searchers
+
+ +
+
+
+
Search indexes
+
Allows you to search the indexes and view the searcher properties
+
+ +
+ +
+ +
+ +
+ + +
+
    +
  • + + Search tools + +
    + Hide search results + +
    + +
    + + +
    + + +
    + + +
    + +
    + +
    +
    +
    + + + + + + + + + + + + + + + + +
    ScoreIdValues
    {{result.Score}}{{result.Id}} + + {{key}}: + {{val}} + +
    +
    +
    +
  • +
  • + Provider properties + + + + + + +
     
    {{key}}{{val}}
    +
  • +
+
+
+
+
+
+ + +
+ + + +
diff --git a/src/UmbracoUrlHandling/Umbraco/Views/dashboard/developer/healthcheck.html b/src/UmbracoUrlHandling/Umbraco/Views/dashboard/developer/healthcheck.html new file mode 100644 index 0000000..3d91301 --- /dev/null +++ b/src/UmbracoUrlHandling/Umbraco/Views/dashboard/developer/healthcheck.html @@ -0,0 +1,139 @@ +
+ +
+ +
+

Health Check

+ +
+ +
+

The health checker evaluates various areas of your site for best practice settings, configuration, potential problems, etc. You can easily fix problems by pressing a button. + You can add your own health checks, have a look at the documentation for more information about custom health checks.

+
+ +
+ +
+
+ +
{{group.name}}
+ +
+ +
+ +
+ +
+ + {{ group.totalSuccess }} +
+ +
+ + {{ group.totalWarning }} +
+ +
+ + {{ group.totalError }} +
+ +
+ + {{ group.totalInfo }} +
+ +
+ +
+
+ +
+ +
+ +
+ + + + ← Back to overview + + + + +
+ +
+
{{ vm.selectedGroup.name }}
+ +
+ +
+ +
+ +
+
{{ check.name }}
+
{{ check.description }}
+
+ +
+ +
+ + + + +
+ +
+ +
+
+
+
+ +
+
+ + +
+
+ +
+ + + +
+ +
+
+
+ +
+ +
+ +
+
+ +
+ +
+ +
+ +
+ +
+ +
diff --git a/src/UmbracoUrlHandling/Umbraco/Views/dashboard/developer/redirecturls.html b/src/UmbracoUrlHandling/Umbraco/Views/dashboard/developer/redirecturls.html new file mode 100644 index 0000000..f23b8f5 --- /dev/null +++ b/src/UmbracoUrlHandling/Umbraco/Views/dashboard/developer/redirecturls.html @@ -0,0 +1,113 @@ +
+ + + + + + + + + + + + + + + + + + + + + + + + + +
+ +
+
+
Original URL
+
+
Redirected To
+
+
+ +
+ +
+ + + + +
+ +
+ +
+ + + +
+ +
+ +
+ +
+ + +
No redirects have been made
+ When a published page gets renamed or moved a redirect will automatically be made to the new page +
+ + + + + +
+ + +
+ +
diff --git a/src/UmbracoUrlHandling/Umbraco/Views/dashboard/developer/xmldataintegrityreport.html b/src/UmbracoUrlHandling/Umbraco/Views/dashboard/developer/xmldataintegrityreport.html new file mode 100644 index 0000000..11f1834 --- /dev/null +++ b/src/UmbracoUrlHandling/Umbraco/Views/dashboard/developer/xmldataintegrityreport.html @@ -0,0 +1,29 @@ +
+ +

Xml Cache Data integrity

+ +
+ Loading... +
+ +

+ This checks the data integrity for the xml structures for content, media and members that are stored in the cmsContentXml table. + This does not check the data integrity of the xml cache file, only the xml structures stored in the database used to create the xml cache file. +

+
+ {{value.label}} ... + Checking... + Ok + Error +
+ +
+
+
+
+
+ +
diff --git a/src/UmbracoUrlHandling/Umbraco/Views/dashboard/forms/formsdashboardintro.html b/src/UmbracoUrlHandling/Umbraco/Views/dashboard/forms/formsdashboardintro.html new file mode 100644 index 0000000..7ef9537 --- /dev/null +++ b/src/UmbracoUrlHandling/Umbraco/Views/dashboard/forms/formsdashboardintro.html @@ -0,0 +1,42 @@ +
+
+ +
+ +

Umbraco Forms

+
+ +
+ +
+ +
+ +

Create forms using an intuitive drag and drop interface. From simple contact forms that sends e-mails to advanced questionaires that integrate with CRM systems. Your clients will love it!

+ + + + +
+ +
+

Installing...

+ +
+
+
+ {{state}} +
+
+
+
+
diff --git a/src/UmbracoUrlHandling/Umbraco/Views/dashboard/media/desktopmediauploader.html b/src/UmbracoUrlHandling/Umbraco/Views/dashboard/media/desktopmediauploader.html new file mode 100644 index 0000000..59a50f4 --- /dev/null +++ b/src/UmbracoUrlHandling/Umbraco/Views/dashboard/media/desktopmediauploader.html @@ -0,0 +1,38 @@ +

Desktop Media Uploader

+ +

Desktop Media Uploader is a small desktop application that you can install on your computer which allows you to easily upload media items directly to the media section.

+

The badge below will auto configure itself based upon whether you already have Desktop Media Uploader installed or not.

+

Just click the Install Now / Upgrade Now / Launch Now link to perform that action.

+ +

+

+

Download Desktop Media Uploader now.

+ + This application requires Adobe® AIR™ to be installed for Mac OS or Windows. + +
+

+ + diff --git a/src/UmbracoUrlHandling/Umbraco/Views/dashboard/media/mediadashboardintro.html b/src/UmbracoUrlHandling/Umbraco/Views/dashboard/media/mediadashboardintro.html new file mode 100644 index 0000000..0af91b4 --- /dev/null +++ b/src/UmbracoUrlHandling/Umbraco/Views/dashboard/media/mediadashboardintro.html @@ -0,0 +1,13 @@ +

Start here

+

Get started with Media right now

+

Use the tool below to upload your images or documents to a media folder.

+ +

Follow these steps:

+
    +
  • Click Install and follow the on screen instructions to install the Desktop Media Uploader
  • +
  • Enter your login details for the site and click Sign In
  • +
  • Choose a media folder to upload files to from the Upload files to... dropdown list
  • +
  • Drag the files and folders you wish to upload directly into the Desktop Media Uploader application
  • +
  • Click Upload to start uploading
  • +
+

For a more thorough guide on how to use the Desktop Media Uploader, checkout this video.

diff --git a/src/UmbracoUrlHandling/Umbraco/Views/dashboard/media/mediadashboardvideos.html b/src/UmbracoUrlHandling/Umbraco/Views/dashboard/media/mediadashboardvideos.html new file mode 100644 index 0000000..2135c37 --- /dev/null +++ b/src/UmbracoUrlHandling/Umbraco/Views/dashboard/media/mediadashboardvideos.html @@ -0,0 +1,18 @@ +

Hours of Umbraco training videos are only a click away

+

Want to master Umbraco? Spend a couple of minutes learning some best practices by watching one of these videos about using Umbraco. And visit umbraco.tv for even more Umbraco videos

+ +

To get you started:

+
+ + +
\ No newline at end of file diff --git a/src/UmbracoUrlHandling/Umbraco/Views/dashboard/media/mediafolderbrowser.html b/src/UmbracoUrlHandling/Umbraco/Views/dashboard/media/mediafolderbrowser.html new file mode 100644 index 0000000..d49bdd8 --- /dev/null +++ b/src/UmbracoUrlHandling/Umbraco/Views/dashboard/media/mediafolderbrowser.html @@ -0,0 +1,3 @@ +
+ +
diff --git a/src/UmbracoUrlHandling/Umbraco/Views/dashboard/members/membersdashboardintro.html b/src/UmbracoUrlHandling/Umbraco/Views/dashboard/members/membersdashboardintro.html new file mode 100644 index 0000000..d42d3eb --- /dev/null +++ b/src/UmbracoUrlHandling/Umbraco/Views/dashboard/members/membersdashboardintro.html @@ -0,0 +1,10 @@ +

Start here

+ +

Get started with Members right now

+

Use the tool below to search for an existing member.

+ +

More about members

+ + diff --git a/src/UmbracoUrlHandling/Umbraco/Views/dashboard/members/membersdashboardvideos.html b/src/UmbracoUrlHandling/Umbraco/Views/dashboard/members/membersdashboardvideos.html new file mode 100644 index 0000000..08e7fb3 --- /dev/null +++ b/src/UmbracoUrlHandling/Umbraco/Views/dashboard/members/membersdashboardvideos.html @@ -0,0 +1,18 @@ +

Hours of Umbraco training videos are only a click away

+

Want to master Umbraco? Spend a couple of minutes learning some best practices by watching one of these videos about using Umbraco. And visit umbraco.tv for even more Umbraco videos

+ +

To get you started:

+
+ + +
\ No newline at end of file diff --git a/src/UmbracoUrlHandling/Umbraco/Views/dashboard/settings/settingsdashboardintro.html b/src/UmbracoUrlHandling/Umbraco/Views/dashboard/settings/settingsdashboardintro.html new file mode 100644 index 0000000..3a45776 --- /dev/null +++ b/src/UmbracoUrlHandling/Umbraco/Views/dashboard/settings/settingsdashboardintro.html @@ -0,0 +1,14 @@ +

Start here

+

This section contains the building blocks for your Umbraco site

+

Follow the below links to find out more about working with the items in the Settings section:

+ +

Find out more:

+ + diff --git a/src/UmbracoUrlHandling/Umbraco/Views/dashboard/settings/settingsdashboardvideos.html b/src/UmbracoUrlHandling/Umbraco/Views/dashboard/settings/settingsdashboardvideos.html new file mode 100644 index 0000000..2135c37 --- /dev/null +++ b/src/UmbracoUrlHandling/Umbraco/Views/dashboard/settings/settingsdashboardvideos.html @@ -0,0 +1,18 @@ +

Hours of Umbraco training videos are only a click away

+

Want to master Umbraco? Spend a couple of minutes learning some best practices by watching one of these videos about using Umbraco. And visit umbraco.tv for even more Umbraco videos

+ +

To get you started:

+
+ + +
\ No newline at end of file diff --git a/src/UmbracoUrlHandling/Umbraco/Views/datatypes/create.html b/src/UmbracoUrlHandling/Umbraco/Views/datatypes/create.html new file mode 100644 index 0000000..5550fe8 --- /dev/null +++ b/src/UmbracoUrlHandling/Umbraco/Views/datatypes/create.html @@ -0,0 +1,45 @@ + + + diff --git a/src/UmbracoUrlHandling/Umbraco/Views/datatypes/delete.html b/src/UmbracoUrlHandling/Umbraco/Views/datatypes/delete.html new file mode 100644 index 0000000..debd3cc --- /dev/null +++ b/src/UmbracoUrlHandling/Umbraco/Views/datatypes/delete.html @@ -0,0 +1,34 @@ +
+
+ +

+ Are you sure you want to delete {{currentNode.name}} ? +

+ + +
+ + +
+ +
+

+ All property types & property data + using this data type will be deleted permanently, please confirm you want to delete these as well. +

+ +
+ + + + + +
+
+ +
+
diff --git a/src/UmbracoUrlHandling/Umbraco/Views/datatypes/edit.html b/src/UmbracoUrlHandling/Umbraco/Views/datatypes/edit.html new file mode 100644 index 0000000..6968f8a --- /dev/null +++ b/src/UmbracoUrlHandling/Umbraco/Views/datatypes/edit.html @@ -0,0 +1,71 @@ +
+ + + +
+ + + + + + + + + + +
+ + Required +
+ +
+ + +
{{content.selectedEditor}}
+
+ + + + + + + +
+ + + + + + + + + + + + + + +
+ +
+
diff --git a/src/UmbracoUrlHandling/Umbraco/Views/datatypes/move.html b/src/UmbracoUrlHandling/Umbraco/Views/datatypes/move.html new file mode 100644 index 0000000..09390cd --- /dev/null +++ b/src/UmbracoUrlHandling/Umbraco/Views/datatypes/move.html @@ -0,0 +1,50 @@ +
+ +
+
+ +

+ Select the folder to move {{currentNode.name}} to in the tree structure below +

+ +
+
+
+ +
+
{{error.errorMsg}}
+

{{error.data.message}}

+
+ +
+
{{currentNode.name}} was moved underneath {{target.name}}
+ +
+ +
+ +
+ + +
+ +
+
+
+ + +
diff --git a/src/UmbracoUrlHandling/Umbraco/Views/directives/_obsolete/umb-content-name.html b/src/UmbracoUrlHandling/Umbraco/Views/directives/_obsolete/umb-content-name.html new file mode 100644 index 0000000..46ad6e5 --- /dev/null +++ b/src/UmbracoUrlHandling/Umbraco/Views/directives/_obsolete/umb-content-name.html @@ -0,0 +1,19 @@ + +
+ + + + Required + {{contentNameForm.name.errorMsg}} + +
+
\ No newline at end of file diff --git a/src/UmbracoUrlHandling/Umbraco/Views/directives/_obsolete/umb-header.html b/src/UmbracoUrlHandling/Umbraco/Views/directives/_obsolete/umb-header.html new file mode 100644 index 0000000..c65b373 --- /dev/null +++ b/src/UmbracoUrlHandling/Umbraco/Views/directives/_obsolete/umb-header.html @@ -0,0 +1,14 @@ +
+
+ +
+ + +
+
diff --git a/src/UmbracoUrlHandling/Umbraco/Views/directives/_obsolete/umb-item-sorter.html b/src/UmbracoUrlHandling/Umbraco/Views/directives/_obsolete/umb-item-sorter.html new file mode 100644 index 0000000..569a678 --- /dev/null +++ b/src/UmbracoUrlHandling/Umbraco/Views/directives/_obsolete/umb-item-sorter.html @@ -0,0 +1,38 @@ +
+ +
+
+

Sort children of {{viewModel.name}}

+ + + + + + + + + + + + + + + +
NameLast UpdateIndex
{{item.column1}}{{item.column2}}{{item.column3}}
+ +
+
+ + +
+
+
+
+ {{model.successMsg}} +
+ +
+ +
+
+
diff --git a/src/UmbracoUrlHandling/Umbraco/Views/directives/_obsolete/umb-login.html b/src/UmbracoUrlHandling/Umbraco/Views/directives/_obsolete/umb-login.html new file mode 100644 index 0000000..3bf8332 --- /dev/null +++ b/src/UmbracoUrlHandling/Umbraco/Views/directives/_obsolete/umb-login.html @@ -0,0 +1,12 @@ +
+
+

Happy {{today}}!, log in below

+
+ +
+
+ +
+ +
+
diff --git a/src/UmbracoUrlHandling/Umbraco/Views/directives/_obsolete/umb-optionsmenu.html b/src/UmbracoUrlHandling/Umbraco/Views/directives/_obsolete/umb-optionsmenu.html new file mode 100644 index 0000000..f834dfb --- /dev/null +++ b/src/UmbracoUrlHandling/Umbraco/Views/directives/_obsolete/umb-optionsmenu.html @@ -0,0 +1,22 @@ +
+ + + + Actions + + + + + +
diff --git a/src/UmbracoUrlHandling/Umbraco/Views/directives/_obsolete/umb-photo-folder.html b/src/UmbracoUrlHandling/Umbraco/Views/directives/_obsolete/umb-photo-folder.html new file mode 100644 index 0000000..67e0ecb --- /dev/null +++ b/src/UmbracoUrlHandling/Umbraco/Views/directives/_obsolete/umb-photo-folder.html @@ -0,0 +1,28 @@ + diff --git a/src/UmbracoUrlHandling/Umbraco/Views/directives/_obsolete/umb-tab-view.html b/src/UmbracoUrlHandling/Umbraco/Views/directives/_obsolete/umb-tab-view.html new file mode 100644 index 0000000..93b520c --- /dev/null +++ b/src/UmbracoUrlHandling/Umbraco/Views/directives/_obsolete/umb-tab-view.html @@ -0,0 +1,5 @@ +
+
+ +
+
diff --git a/src/UmbracoUrlHandling/Umbraco/Views/directives/_obsolete/umb-upload-dropzone.html b/src/UmbracoUrlHandling/Umbraco/Views/directives/_obsolete/umb-upload-dropzone.html new file mode 100644 index 0000000..20a8f9d --- /dev/null +++ b/src/UmbracoUrlHandling/Umbraco/Views/directives/_obsolete/umb-upload-dropzone.html @@ -0,0 +1,8 @@ +
+
+ +

+ Drop your files here... +

+
+
\ No newline at end of file diff --git a/src/UmbracoUrlHandling/Umbraco/Views/documenttypes/copy.html b/src/UmbracoUrlHandling/Umbraco/Views/documenttypes/copy.html new file mode 100644 index 0000000..db1a0db --- /dev/null +++ b/src/UmbracoUrlHandling/Umbraco/Views/documenttypes/copy.html @@ -0,0 +1,51 @@ +
+ +
+
+ +

+ Select the folder to copy {{currentNode.name}} to in the tree structure below +

+ +
+
+
+ +
+
{{error.errorMsg}}
+

{{error.data.message}}

+
+ +
+
+ {{currentNode.name}} was copied underneath {{target.name}}
+ +
+ +
+ +
+ + +
+ +
+
+
+ + +
diff --git a/src/UmbracoUrlHandling/Umbraco/Views/documenttypes/create.html b/src/UmbracoUrlHandling/Umbraco/Views/documenttypes/create.html new file mode 100644 index 0000000..2f23643 --- /dev/null +++ b/src/UmbracoUrlHandling/Umbraco/Views/documenttypes/create.html @@ -0,0 +1,56 @@ + + + diff --git a/src/UmbracoUrlHandling/Umbraco/Views/documenttypes/delete.html b/src/UmbracoUrlHandling/Umbraco/Views/documenttypes/delete.html new file mode 100644 index 0000000..d0826bf --- /dev/null +++ b/src/UmbracoUrlHandling/Umbraco/Views/documenttypes/delete.html @@ -0,0 +1,43 @@ +
+ +
+ +

+ Are you sure you want to delete + {{currentNode.name}} ? +

+ + +
+ + +
+ +
+

+ + + All Documents + + + using this document type will be deleted permanently, please confirm you want to delete these as well. + +

+ +
+ + + + + +
+
+ + +
+
diff --git a/src/UmbracoUrlHandling/Umbraco/Views/documenttypes/edit.html b/src/UmbracoUrlHandling/Umbraco/Views/documenttypes/edit.html new file mode 100644 index 0000000..1c480b9 --- /dev/null +++ b/src/UmbracoUrlHandling/Umbraco/Views/documenttypes/edit.html @@ -0,0 +1,70 @@ +
+ + + +
+ + + + + + + + +
+ + +
+ +
+ + + + + + + + + + + + + + + + + + + + + + +
+ +
+ +
diff --git a/src/UmbracoUrlHandling/Umbraco/Views/documenttypes/move.html b/src/UmbracoUrlHandling/Umbraco/Views/documenttypes/move.html new file mode 100644 index 0000000..c982abc --- /dev/null +++ b/src/UmbracoUrlHandling/Umbraco/Views/documenttypes/move.html @@ -0,0 +1,51 @@ +
+ +
+
+ +

+ Select the folder to move {{currentNode.name}} to in the tree structure below +

+ +
+
+
+ +
+
{{error.errorMsg}}
+

{{error.data.message}}

+
+ +
+
+ {{currentNode.name}} was moved underneath {{target.name}}
+ +
+ +
+ +
+ + +
+ +
+
+
+ + +
diff --git a/src/UmbracoUrlHandling/Umbraco/Views/documenttypes/property.html b/src/UmbracoUrlHandling/Umbraco/Views/documenttypes/property.html new file mode 100644 index 0000000..ccd6322 --- /dev/null +++ b/src/UmbracoUrlHandling/Umbraco/Views/documenttypes/property.html @@ -0,0 +1,4 @@ +
+ + {{property.description}} +
\ No newline at end of file diff --git a/src/UmbracoUrlHandling/Umbraco/Views/documenttypes/propertygroup.html b/src/UmbracoUrlHandling/Umbraco/Views/documenttypes/propertygroup.html new file mode 100644 index 0000000..e69de29 diff --git a/src/UmbracoUrlHandling/Umbraco/Views/documenttypes/views/design/design.html b/src/UmbracoUrlHandling/Umbraco/Views/documenttypes/views/design/design.html new file mode 100644 index 0000000..805be7b --- /dev/null +++ b/src/UmbracoUrlHandling/Umbraco/Views/documenttypes/views/design/design.html @@ -0,0 +1,4 @@ + + diff --git a/src/UmbracoUrlHandling/Umbraco/Views/documenttypes/views/listview/listview.html b/src/UmbracoUrlHandling/Umbraco/Views/documenttypes/views/listview/listview.html new file mode 100644 index 0000000..c27d885 --- /dev/null +++ b/src/UmbracoUrlHandling/Umbraco/Views/documenttypes/views/listview/listview.html @@ -0,0 +1,19 @@ +
+ +
+
+ +
+ +
+ + + + +
+ +
diff --git a/src/UmbracoUrlHandling/Umbraco/Views/documenttypes/views/permissions/permissions.html b/src/UmbracoUrlHandling/Umbraco/Views/documenttypes/views/permissions/permissions.html new file mode 100644 index 0000000..d9c7d18 --- /dev/null +++ b/src/UmbracoUrlHandling/Umbraco/Views/documenttypes/views/permissions/permissions.html @@ -0,0 +1,47 @@ +
+ +
+ +
+
+ +
+
+ +
+ +
+ +
+ +
+
+ +
+ +
+ + + + + + +
+ +
+ +
diff --git a/src/UmbracoUrlHandling/Umbraco/Views/documenttypes/views/templates/templates.html b/src/UmbracoUrlHandling/Umbraco/Views/documenttypes/views/templates/templates.html new file mode 100644 index 0000000..0cfe76c --- /dev/null +++ b/src/UmbracoUrlHandling/Umbraco/Views/documenttypes/views/templates/templates.html @@ -0,0 +1,23 @@ +
+ +
+
+ +
+ +
+ + + + +
+ +
diff --git a/src/UmbracoUrlHandling/Umbraco/Views/install/continueinstall.html b/src/UmbracoUrlHandling/Umbraco/Views/install/continueinstall.html new file mode 100644 index 0000000..28fa1d3 --- /dev/null +++ b/src/UmbracoUrlHandling/Umbraco/Views/install/continueinstall.html @@ -0,0 +1,13 @@ +
+

Continue Umbraco Installation

+

+ You see this screen because your Umbraco installation did not complete correctly. +

+

+ Simply click continue below to be guided through the rest of the installation process. +

+ +

+ +

+
diff --git a/src/UmbracoUrlHandling/Umbraco/Views/install/database.html b/src/UmbracoUrlHandling/Umbraco/Views/install/database.html new file mode 100644 index 0000000..6b71f1d --- /dev/null +++ b/src/UmbracoUrlHandling/Umbraco/Views/install/database.html @@ -0,0 +1,118 @@ +
+ +

Configure your database

+

+ Enter connection and authentication details for the database you want to install Umbraco on +

+ +
+
+ What type of database do you use? + +
+ +
+
+ +
+

Great!, no need to configure anything then, you simply click the continue button below to continue to the next step

+
+ +
+ What is the exact connectionstring we should use? +
+ +
+ + + Enter a valid database connection string. +
+
+
+ +
+
+ Where do we find your database? +
+
+ +
+ + Enter server domain or IP +
+
+
+ +
+
+ +
+ + Enter the name of the database +
+
+
+
+ +
+ What credentials are used to access the database? +
+
+ +
+ + Enter the database user name +
+
+
+ +
+
+ +
+ + Enter the database password +
+
+
+ +
+
+ +
+
+
+
+ +
+
+
+ + + + + + Validating your database connection... + + + + Could not connect to database + +
+
+
+ + +
+
diff --git a/src/UmbracoUrlHandling/Umbraco/Views/install/error.html b/src/UmbracoUrlHandling/Umbraco/Views/install/error.html new file mode 100644 index 0000000..4fb5823 --- /dev/null +++ b/src/UmbracoUrlHandling/Umbraco/Views/install/error.html @@ -0,0 +1,9 @@ +
+

Error during installation

+ +

{{installer.current.model.message}}

+ +

See the log for full details (logs can typically be found in the App_Data\Logs folder).

+ + +
diff --git a/src/UmbracoUrlHandling/Umbraco/Views/install/permissionsreport.html b/src/UmbracoUrlHandling/Umbraco/Views/install/permissionsreport.html new file mode 100644 index 0000000..3ced6ed --- /dev/null +++ b/src/UmbracoUrlHandling/Umbraco/Views/install/permissionsreport.html @@ -0,0 +1,26 @@ +
+

Your permission settings are not ready for umbraco

+

+ In order to run umbraco, you'll need to update your permission settings. + Detailed information about the correct file & folder permissions for Umbraco can be found + here. +

+

+ The following report list the permissions that are currently failing. Once the permissions are fixed press the 'Go back' button to restart the installation. +

+ +
    +
  • +

    {{category}}

    +
      +
    • + {{item}} +
    • +
    +
  • +
+ +

+ +

+
diff --git a/src/UmbracoUrlHandling/Umbraco/Views/install/starterkit.html b/src/UmbracoUrlHandling/Umbraco/Views/install/starterkit.html new file mode 100644 index 0000000..0b9e22a --- /dev/null +++ b/src/UmbracoUrlHandling/Umbraco/Views/install/starterkit.html @@ -0,0 +1,23 @@ +
+

Install a starter website

+ +

+ Installing a starter website helps you learn how Umbraco works, and gives you a solid + and simple foundation to build on top of. +

+ + Loading... + + + + + No thanks, I do not want to install a starter website + +
diff --git a/src/UmbracoUrlHandling/Umbraco/Views/install/upgrade.html b/src/UmbracoUrlHandling/Umbraco/Views/install/upgrade.html new file mode 100644 index 0000000..4edf2ed --- /dev/null +++ b/src/UmbracoUrlHandling/Umbraco/Views/install/upgrade.html @@ -0,0 +1,20 @@ +
+

Upgrading Umbraco

+

+ Welcome to the Umbraco installer. You see this screen because your Umbraco installation needs a quick upgrade of its database and files, which will ensure your website is kept as fast, secure and up to date as possible. +

+ +

+ To read a report of changes between your current version {{installer.current.model.currentVersion}} and this version you're upgrading to {{installer.current.model.newVersion}} +

+

+ View Report +

+ +

+ Simply click continue below to be guided through the rest of the upgrade +

+

+ +

+
diff --git a/src/UmbracoUrlHandling/Umbraco/Views/install/user.html b/src/UmbracoUrlHandling/Umbraco/Views/install/user.html new file mode 100644 index 0000000..68958be --- /dev/null +++ b/src/UmbracoUrlHandling/Umbraco/Views/install/user.html @@ -0,0 +1,72 @@ +
+

Install Umbraco 7

+ +

Enter your name, email and password to install Umbraco 7 with its default settings, alternatively you can customize your installation

+ +
+ +
+
+
+
+ +
+ +
+
+ +
+ +
+ + Your email will be used as your login +
+
+ +
+ +
+ + + At least {{installer.current.model.minCharLength}} characters long + + + At least {{installer.current.model.minNonAlphaNumericLength}} symbol{{installer.current.model.minNonAlphaNumericLength > 1 ? 's' : ''}} + +
+
+ + +
+
+ +
+
+ +
+
+ + Customize +
+
+ +
+
+
+
+ +
diff --git a/src/UmbracoUrlHandling/Umbraco/Views/install/version7upgradereport.html b/src/UmbracoUrlHandling/Umbraco/Views/install/version7upgradereport.html new file mode 100644 index 0000000..df1e58d --- /dev/null +++ b/src/UmbracoUrlHandling/Umbraco/Views/install/version7upgradereport.html @@ -0,0 +1,22 @@ +
+

Major version upgrade from {{installer.current.model.currentVersion}} to {{installer.current.model.newVersion}}

+

There were {{installer.current.model.errors.length}} issues detected

+

+ The following compatibility issues were found. If you continue all non-compatible property editors will be converted to a Readonly/Label. + You will be able to change the property editor to a compatible type manually by editing the data type after installation. +

+

+ Otherwise if you choose not to proceed you will need to fix the errors listed below. + Refer to v{{installer.current.model.newVersion}} upgrade instructions for full details. +

+ +
    +
  • + {{item}} +
  • +
+ +

+ +

+
\ No newline at end of file diff --git a/src/UmbracoUrlHandling/Umbraco/Views/media/create.html b/src/UmbracoUrlHandling/Umbraco/Views/media/create.html new file mode 100644 index 0000000..f966d73 --- /dev/null +++ b/src/UmbracoUrlHandling/Umbraco/Views/media/create.html @@ -0,0 +1,50 @@ + + + + diff --git a/src/UmbracoUrlHandling/Umbraco/Views/media/delete.html b/src/UmbracoUrlHandling/Umbraco/Views/media/delete.html new file mode 100644 index 0000000..3c9716e --- /dev/null +++ b/src/UmbracoUrlHandling/Umbraco/Views/media/delete.html @@ -0,0 +1,10 @@ +
+
+ +

+ Are you sure you want to delete {{currentNode.name}} ? +

+ + +
+
diff --git a/src/UmbracoUrlHandling/Umbraco/Views/media/edit.html b/src/UmbracoUrlHandling/Umbraco/Views/media/edit.html new file mode 100644 index 0000000..8b478ef --- /dev/null +++ b/src/UmbracoUrlHandling/Umbraco/Views/media/edit.html @@ -0,0 +1,75 @@ +
+ + + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
diff --git a/src/UmbracoUrlHandling/Umbraco/Views/media/emptyrecyclebin.html b/src/UmbracoUrlHandling/Umbraco/Views/media/emptyrecyclebin.html new file mode 100644 index 0000000..4558a21 --- /dev/null +++ b/src/UmbracoUrlHandling/Umbraco/Views/media/emptyrecyclebin.html @@ -0,0 +1,19 @@ +
+
+ + +
+
+
+ +

+ When items are deleted from the recycle bin, they will be gone forever. + Are you sure? +

+ + + +
+ +
+
diff --git a/src/UmbracoUrlHandling/Umbraco/Views/media/move.html b/src/UmbracoUrlHandling/Umbraco/Views/media/move.html new file mode 100644 index 0000000..ba1ad08 --- /dev/null +++ b/src/UmbracoUrlHandling/Umbraco/Views/media/move.html @@ -0,0 +1,56 @@ +
+
+
+ +
+
+
{{error.errorMsg}}
+
{{error.data.message}}
+
+
+ +
+
+ {{currentNode.name}} was moved underneath {{target.name}} +
+ +
+ +

+ Choose where to move + {{currentNode.name}} + to in the tree structure below +

+ +
+ +
+ + +
+ + + + +
+
+
+ + + +
diff --git a/src/UmbracoUrlHandling/Umbraco/Views/media/recyclebin.html b/src/UmbracoUrlHandling/Umbraco/Views/media/recyclebin.html new file mode 100644 index 0000000..4a74e4a --- /dev/null +++ b/src/UmbracoUrlHandling/Umbraco/Views/media/recyclebin.html @@ -0,0 +1,16 @@ + +
+ + + + + +
+ +
+
+
diff --git a/src/UmbracoUrlHandling/Umbraco/Views/mediatypes/copy.html b/src/UmbracoUrlHandling/Umbraco/Views/mediatypes/copy.html new file mode 100644 index 0000000..319e59c --- /dev/null +++ b/src/UmbracoUrlHandling/Umbraco/Views/mediatypes/copy.html @@ -0,0 +1,51 @@ +
+ +
+
+ +

+ Select the folder to copy {{currentNode.name}} to in the tree structure below +

+ +
+
+
+ +
+
{{error.errorMsg}}
+

{{error.data.message}}

+
+ +
+
+ {{currentNode.name}} was copied underneath {{target.name}}
+ +
+ +
+ +
+ + +
+ +
+
+
+ + +
diff --git a/src/UmbracoUrlHandling/Umbraco/Views/mediatypes/create.html b/src/UmbracoUrlHandling/Umbraco/Views/mediatypes/create.html new file mode 100644 index 0000000..3a52d19 --- /dev/null +++ b/src/UmbracoUrlHandling/Umbraco/Views/mediatypes/create.html @@ -0,0 +1,44 @@ + + + diff --git a/src/UmbracoUrlHandling/Umbraco/Views/mediatypes/delete.html b/src/UmbracoUrlHandling/Umbraco/Views/mediatypes/delete.html new file mode 100644 index 0000000..6d33b6a --- /dev/null +++ b/src/UmbracoUrlHandling/Umbraco/Views/mediatypes/delete.html @@ -0,0 +1,39 @@ +
+
+ +

+ Are you sure you want to delete {{currentNode.name}} ? +

+ + +
+ + +
+ +
+

+ + + All media items + + using this media type will be deleted permanently, please confirm you want to delete these as well. +

+ +
+ + + + + +
+
+ + +
+
diff --git a/src/UmbracoUrlHandling/Umbraco/Views/mediatypes/edit.html b/src/UmbracoUrlHandling/Umbraco/Views/mediatypes/edit.html new file mode 100644 index 0000000..f0d3a8f --- /dev/null +++ b/src/UmbracoUrlHandling/Umbraco/Views/mediatypes/edit.html @@ -0,0 +1,70 @@ +
+ + + +
+ + + + + + + + +
+ + +
+ +
+ + + + + + + + + + + + + + + + + + + + + + +
+ +
+ +
diff --git a/src/UmbracoUrlHandling/Umbraco/Views/mediatypes/move.html b/src/UmbracoUrlHandling/Umbraco/Views/mediatypes/move.html new file mode 100644 index 0000000..59172eb --- /dev/null +++ b/src/UmbracoUrlHandling/Umbraco/Views/mediatypes/move.html @@ -0,0 +1,51 @@ +
+ +
+
+ +

+ Select the folder to move {{currentNode.name}} to in the tree structure below +

+ +
+
+
+ +
+
{{error.errorMsg}}
+

{{error.data.message}}

+
+ +
+
{{currentNode.name}} was moved underneath {{target.name}}
+ +
+ +
+ +
+ + +
+ +
+
+
+ + + +
diff --git a/src/UmbracoUrlHandling/Umbraco/Views/mediatypes/views/design/design.html b/src/UmbracoUrlHandling/Umbraco/Views/mediatypes/views/design/design.html new file mode 100644 index 0000000..215664e --- /dev/null +++ b/src/UmbracoUrlHandling/Umbraco/Views/mediatypes/views/design/design.html @@ -0,0 +1,4 @@ + + diff --git a/src/UmbracoUrlHandling/Umbraco/Views/mediatypes/views/listview/listview.html b/src/UmbracoUrlHandling/Umbraco/Views/mediatypes/views/listview/listview.html new file mode 100644 index 0000000..1461341 --- /dev/null +++ b/src/UmbracoUrlHandling/Umbraco/Views/mediatypes/views/listview/listview.html @@ -0,0 +1,19 @@ +
+ +
+
+ +
+ +
+ + + + +
+ +
diff --git a/src/UmbracoUrlHandling/Umbraco/Views/mediatypes/views/permissions/permissions.html b/src/UmbracoUrlHandling/Umbraco/Views/mediatypes/views/permissions/permissions.html new file mode 100644 index 0000000..7c9811e --- /dev/null +++ b/src/UmbracoUrlHandling/Umbraco/Views/mediatypes/views/permissions/permissions.html @@ -0,0 +1,49 @@ +
+ +
+ +
+
+ +
+
+ +
+ +
+ +
+ +
+
+ +
+ +
+ + + + + + + + +
+ +
+ +
diff --git a/src/UmbracoUrlHandling/Umbraco/Views/member/create.html b/src/UmbracoUrlHandling/Umbraco/Views/member/create.html new file mode 100644 index 0000000..586cd73 --- /dev/null +++ b/src/UmbracoUrlHandling/Umbraco/Views/member/create.html @@ -0,0 +1,27 @@ + + + + diff --git a/src/UmbracoUrlHandling/Umbraco/Views/member/delete.html b/src/UmbracoUrlHandling/Umbraco/Views/member/delete.html new file mode 100644 index 0000000..ce7a118 --- /dev/null +++ b/src/UmbracoUrlHandling/Umbraco/Views/member/delete.html @@ -0,0 +1,12 @@ +
+
+ +

+ Are you sure you want to delete {{currentNode.name}} ? +

+ + + + +
+
diff --git a/src/UmbracoUrlHandling/Umbraco/Views/member/edit.html b/src/UmbracoUrlHandling/Umbraco/Views/member/edit.html new file mode 100644 index 0000000..3b96c2d --- /dev/null +++ b/src/UmbracoUrlHandling/Umbraco/Views/member/edit.html @@ -0,0 +1,70 @@ +
+ + + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ +
diff --git a/src/UmbracoUrlHandling/Umbraco/Views/member/list.html b/src/UmbracoUrlHandling/Umbraco/Views/member/list.html new file mode 100644 index 0000000..d828dc4 --- /dev/null +++ b/src/UmbracoUrlHandling/Umbraco/Views/member/list.html @@ -0,0 +1,37 @@ +
+ + + +
+ + + + + + + + + + + + + + + + + + + + + + +
+ +
diff --git a/src/UmbracoUrlHandling/Umbraco/Views/membertypes/create.html b/src/UmbracoUrlHandling/Umbraco/Views/membertypes/create.html new file mode 100644 index 0000000..cd9de7a --- /dev/null +++ b/src/UmbracoUrlHandling/Umbraco/Views/membertypes/create.html @@ -0,0 +1,47 @@ + + + diff --git a/src/UmbracoUrlHandling/Umbraco/Views/membertypes/delete.html b/src/UmbracoUrlHandling/Umbraco/Views/membertypes/delete.html new file mode 100644 index 0000000..f1dad26 --- /dev/null +++ b/src/UmbracoUrlHandling/Umbraco/Views/membertypes/delete.html @@ -0,0 +1,26 @@ +
+
+ +

+ Are you sure you want to delete {{currentNode.name}} ? +

+ +

+ + All members + using this member type will be deleted permanently, please confirm you want to delete these as well. +

+ +
+ + + + + + + +
+
diff --git a/src/UmbracoUrlHandling/Umbraco/Views/membertypes/edit.html b/src/UmbracoUrlHandling/Umbraco/Views/membertypes/edit.html new file mode 100644 index 0000000..eb34aae --- /dev/null +++ b/src/UmbracoUrlHandling/Umbraco/Views/membertypes/edit.html @@ -0,0 +1,69 @@ +
+ + + +
+ + + + + + + + +
+ + +
+ +
+ + + + + + + + + + + + + + + + + + + + + + +
+ +
+ +
diff --git a/src/UmbracoUrlHandling/Umbraco/Views/membertypes/move.html b/src/UmbracoUrlHandling/Umbraco/Views/membertypes/move.html new file mode 100644 index 0000000..0eeadfa --- /dev/null +++ b/src/UmbracoUrlHandling/Umbraco/Views/membertypes/move.html @@ -0,0 +1,11 @@ +
+ +
+ +

+ Select the folder to move {{currentNode.name}} to. +

+ + +
+
diff --git a/src/UmbracoUrlHandling/Umbraco/Views/membertypes/views/design/design.html b/src/UmbracoUrlHandling/Umbraco/Views/membertypes/views/design/design.html new file mode 100644 index 0000000..7cd40dd --- /dev/null +++ b/src/UmbracoUrlHandling/Umbraco/Views/membertypes/views/design/design.html @@ -0,0 +1,5 @@ + + diff --git a/src/UmbracoUrlHandling/Umbraco/Views/packager/delete.html b/src/UmbracoUrlHandling/Umbraco/Views/packager/delete.html new file mode 100644 index 0000000..1a802ab --- /dev/null +++ b/src/UmbracoUrlHandling/Umbraco/Views/packager/delete.html @@ -0,0 +1,13 @@ +
+
+ +

+ Are you sure you want to delete {{currentNode.name}} ? +

+ + + + + +
+
diff --git a/src/UmbracoUrlHandling/Umbraco/Views/packager/overview.html b/src/UmbracoUrlHandling/Umbraco/Views/packager/overview.html new file mode 100644 index 0000000..b9857ac --- /dev/null +++ b/src/UmbracoUrlHandling/Umbraco/Views/packager/overview.html @@ -0,0 +1,28 @@ +
+ +
+ + + + + + + + + + + + + + + +
+ +
diff --git a/src/UmbracoUrlHandling/Umbraco/Views/packager/views/install-local.html b/src/UmbracoUrlHandling/Umbraco/Views/packager/views/install-local.html new file mode 100644 index 0000000..b265a34 --- /dev/null +++ b/src/UmbracoUrlHandling/Umbraco/Views/packager/views/install-local.html @@ -0,0 +1,183 @@ +
+ +
+ + +
+
+ + +
+ + +
+ + + + Drop to upload + + +
+ - or click here to choose files +
+ +
+ +
+ + +

Upload package

+

+ Install a local package by selecting it from your machine. Only install packages from sources you know and trust. +

+ +
+
+
+ +
+ + + + Upload another package + + + +
+ +
+
+
+ +
+
+ +

Uploading package...

+ + + + +
+ {{ vm.zipFile.serverErrorMessage }} +
+ +
+
+
+ +
+ +
+ +
+ + + + Cancel and upload another package + + + +
+ + +
+
+ +
+
+ + +
+ + +
+

{{ vm.localPackage.name }}

+ + + +
+ Version + {{ vm.localPackage.version }} +
+ + + +
+ Read me +
+ +
+ +
+ + +
+ +
+ + +
+ +
+ This package cannot be installed, it requires a minimum Umbraco version of {{vm.localPackage.umbracoVersion}} +
+
+

{{vm.installState.status}}

+
+ + + +
+ + +
+ +
+
+ +
+
+
+
+ +
diff --git a/src/UmbracoUrlHandling/Umbraco/Views/packager/views/installed.html b/src/UmbracoUrlHandling/Umbraco/Views/packager/views/installed.html new file mode 100644 index 0000000..ca4f129 --- /dev/null +++ b/src/UmbracoUrlHandling/Umbraco/Views/packager/views/installed.html @@ -0,0 +1,122 @@ +
+ + +
+ +
+ +
Installed packages
+ +
+ +
+ +
+ + +
+ +
+
{{ installedPackage.name }}
+
+ {{ installedPackage.version }} | {{ installedPackage.url }}| {{ installedPackage.author }} +
+
+ +
+ Uninstall +
+ +
+ +
+ +
+ + +

You don’t have any packages installed.

+

You don’t have any packages installed. Either install a local package by selecting it from your machine, or browse through available packages using the "Packages" icon in the top right of your screen.

+
+ +
+ + +
+ + + + Back + + + +
+ +
+ +
+
+ + +
+ + +
+

{{ vm.package.name }}

+ + + +
+ Version + {{ vm.package.version }} +
+ +
+ License + {{ vm.package.license }} +
+ +
+ Read me +
+ {{ vm.package.readme }} +
+ +
+ + +
+ +
+ + +
+ +
+

{{vm.installState.status}}

+
+ +
+
+ +
+ +
+
+ +
diff --git a/src/UmbracoUrlHandling/Umbraco/Views/packager/views/repo.html b/src/UmbracoUrlHandling/Umbraco/Views/packager/views/repo.html new file mode 100644 index 0000000..7e352f2 --- /dev/null +++ b/src/UmbracoUrlHandling/Umbraco/Views/packager/views/repo.html @@ -0,0 +1,361 @@ +
+ + + + +
+ +
+ +
+ +
+ + + + + + + +
+ + + + +
+ + + +

We couldn't find anything for '{{ vm.searchQuery }}'

+

Please try searching for another package or browse through the categories.

+
+ +
+ +
+ + + +
+ + + + Back + + + +
+ +
+ +
+ +
{{ vm.package.name }}
+ +
+ + + + + + +
+ +
+ +
+ + + +
+ +
+
+ +
+ + +
+ +
+
{{ vm.package.ownerInfo.owner }}
+
+ {{ vm.package.ownerInfo.owner }} has {{ vm.package.ownerInfo.karma }} karma points +
+
+
+
+ +
+
Information
+
+ +
+
Owner:
+
{{vm.package.ownerInfo.owner}}
+
+ +
+
Contributors:
+
+ {{ contributor }} +
+
+ +
+
Created:
+
{{vm.package.created | date:'yyyy-MM-dd HH:mm:ss'}}
+
+ +
+
Current version:
+
{{vm.package.latestVersion}}
+
+ +
+
.NET Version:
+
{{vm.package.information.netVersion}}
+
+ +
+
License:
+
{{vm.package.licenseName}}
+
+ +
+
Downloads:
+
{{vm.package.downloads}}
+
+ +
+
Likes:
+
{{vm.package.likes}}
+
+ +
+
+ +
+
Compatibility
+
This package is compatible with the following versions of Umbraco, as reported by community members. Full compatability cannot be gauranteed for versions reported below 100%
+
+
+ {{compatibility.version}} + ({{compatibility.percentage}}%) +
+ + + + +
+
+ +
+
External sources
+ + +
+ +
+ +
+
+
+ + +
+ + + Back + + + +
+ +
+ +
+ +
+
+ + +
+ + +
+

{{ vm.localPackage.name }}

+ + + +
+ Version + {{ vm.localPackage.version }} +
+ + + +
+ Read me +
+ +
+ +
+ + +
+ +
+ + +
+ +
+ This package cannot be installed, it requires a minimum Umbraco version of {{vm.localPackage.umbracoVersion}} +
+ +
+

{{vm.installState.status}}

+
+ +
+ + +
+ +
+
+ +
+
+
+
+ +
diff --git a/src/UmbracoUrlHandling/Umbraco/Views/partialviewmacros/create.html b/src/UmbracoUrlHandling/Umbraco/Views/partialviewmacros/create.html new file mode 100644 index 0000000..febaaab --- /dev/null +++ b/src/UmbracoUrlHandling/Umbraco/Views/partialviewmacros/create.html @@ -0,0 +1,85 @@ +
+ + + + + + +
diff --git a/src/UmbracoUrlHandling/Umbraco/Views/partialviewmacros/delete.html b/src/UmbracoUrlHandling/Umbraco/Views/partialviewmacros/delete.html new file mode 100644 index 0000000..6b66a48 --- /dev/null +++ b/src/UmbracoUrlHandling/Umbraco/Views/partialviewmacros/delete.html @@ -0,0 +1,12 @@ +
+
+ +

+ Are you sure you want to delete {{currentNode.name}} ? +

+ + + + +
+
diff --git a/src/UmbracoUrlHandling/Umbraco/Views/partialviewmacros/edit.html b/src/UmbracoUrlHandling/Umbraco/Views/partialviewmacros/edit.html new file mode 100644 index 0000000..2c56655 --- /dev/null +++ b/src/UmbracoUrlHandling/Umbraco/Views/partialviewmacros/edit.html @@ -0,0 +1,123 @@ +
+ + + +
+ + + + + + + + +
+ +
+ + + + +
+ +
+ +
+
+ + +
+ + + + + + + + + + + + +
+
+ + + + + + + + + + + + + + + + +
diff --git a/src/UmbracoUrlHandling/Umbraco/Views/partialviews/create.html b/src/UmbracoUrlHandling/Umbraco/Views/partialviews/create.html new file mode 100644 index 0000000..7dc4268 --- /dev/null +++ b/src/UmbracoUrlHandling/Umbraco/Views/partialviews/create.html @@ -0,0 +1,75 @@ +
+ + + + + + +
diff --git a/src/UmbracoUrlHandling/Umbraco/Views/partialviews/delete.html b/src/UmbracoUrlHandling/Umbraco/Views/partialviews/delete.html new file mode 100644 index 0000000..0f75e85 --- /dev/null +++ b/src/UmbracoUrlHandling/Umbraco/Views/partialviews/delete.html @@ -0,0 +1,12 @@ +
+
+ +

+ Are you sure you want to delete {{currentNode.name}} ? +

+ + + + +
+
diff --git a/src/UmbracoUrlHandling/Umbraco/Views/partialviews/edit.html b/src/UmbracoUrlHandling/Umbraco/Views/partialviews/edit.html new file mode 100644 index 0000000..3d9c9c4 --- /dev/null +++ b/src/UmbracoUrlHandling/Umbraco/Views/partialviews/edit.html @@ -0,0 +1,128 @@ +
+ + + +
+ + + + + + + + +
+ +
+ + + + +
+ +
+ +
+
+ + +
+ + + + + + + + + + + + + + + +
+
+ + + + + + + + + + + + + + + + +
diff --git a/src/UmbracoUrlHandling/Umbraco/Views/prevalueeditors/boolean.html b/src/UmbracoUrlHandling/Umbraco/Views/prevalueeditors/boolean.html new file mode 100644 index 0000000..8af17a1 --- /dev/null +++ b/src/UmbracoUrlHandling/Umbraco/Views/prevalueeditors/boolean.html @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/src/UmbracoUrlHandling/Umbraco/Views/prevalueeditors/decimal.html b/src/UmbracoUrlHandling/Umbraco/Views/prevalueeditors/decimal.html new file mode 100644 index 0000000..c4e4c95 --- /dev/null +++ b/src/UmbracoUrlHandling/Umbraco/Views/prevalueeditors/decimal.html @@ -0,0 +1,11 @@ +
+ + + Not a number + {{propertyForm.requiredField.errorMsg}} + +
\ No newline at end of file diff --git a/src/UmbracoUrlHandling/Umbraco/Views/prevalueeditors/hidden.html b/src/UmbracoUrlHandling/Umbraco/Views/prevalueeditors/hidden.html new file mode 100644 index 0000000..d0ebd99 --- /dev/null +++ b/src/UmbracoUrlHandling/Umbraco/Views/prevalueeditors/hidden.html @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/src/UmbracoUrlHandling/Umbraco/Views/prevalueeditors/imagepicker.html b/src/UmbracoUrlHandling/Umbraco/Views/prevalueeditors/imagepicker.html new file mode 100644 index 0000000..d9d988d --- /dev/null +++ b/src/UmbracoUrlHandling/Umbraco/Views/prevalueeditors/imagepicker.html @@ -0,0 +1,20 @@ +
+
    +
  • + + +
  • +
+ + + + + + + + +
diff --git a/src/UmbracoUrlHandling/Umbraco/Views/prevalueeditors/mediapicker.html b/src/UmbracoUrlHandling/Umbraco/Views/prevalueeditors/mediapicker.html new file mode 100644 index 0000000..a902385 --- /dev/null +++ b/src/UmbracoUrlHandling/Umbraco/Views/prevalueeditors/mediapicker.html @@ -0,0 +1,30 @@ +
+ + + + + + + + +
diff --git a/src/UmbracoUrlHandling/Umbraco/Views/prevalueeditors/multivalues.html b/src/UmbracoUrlHandling/Umbraco/Views/prevalueeditors/multivalues.html new file mode 100644 index 0000000..f89efcf --- /dev/null +++ b/src/UmbracoUrlHandling/Umbraco/Views/prevalueeditors/multivalues.html @@ -0,0 +1,13 @@ +
+
+ + +
+
+
+ + + +
+
+
diff --git a/src/UmbracoUrlHandling/Umbraco/Views/prevalueeditors/nodetype.html b/src/UmbracoUrlHandling/Umbraco/Views/prevalueeditors/nodetype.html new file mode 100644 index 0000000..d5dcbf9 --- /dev/null +++ b/src/UmbracoUrlHandling/Umbraco/Views/prevalueeditors/nodetype.html @@ -0,0 +1,5 @@ + \ No newline at end of file diff --git a/src/UmbracoUrlHandling/Umbraco/Views/prevalueeditors/number.html b/src/UmbracoUrlHandling/Umbraco/Views/prevalueeditors/number.html new file mode 100644 index 0000000..fcdb067 --- /dev/null +++ b/src/UmbracoUrlHandling/Umbraco/Views/prevalueeditors/number.html @@ -0,0 +1,11 @@ +
+ + + Not a number + {{propertyForm.requiredField.errorMsg}} + +
\ No newline at end of file diff --git a/src/UmbracoUrlHandling/Umbraco/Views/prevalueeditors/radiobuttonlist.html b/src/UmbracoUrlHandling/Umbraco/Views/prevalueeditors/radiobuttonlist.html new file mode 100644 index 0000000..b82eb88 --- /dev/null +++ b/src/UmbracoUrlHandling/Umbraco/Views/prevalueeditors/radiobuttonlist.html @@ -0,0 +1,7 @@ +
    +
  • + +
  • +
\ No newline at end of file diff --git a/src/UmbracoUrlHandling/Umbraco/Views/prevalueeditors/readonlykeyvalues.html b/src/UmbracoUrlHandling/Umbraco/Views/prevalueeditors/readonlykeyvalues.html new file mode 100644 index 0000000..a9a5558 --- /dev/null +++ b/src/UmbracoUrlHandling/Umbraco/Views/prevalueeditors/readonlykeyvalues.html @@ -0,0 +1,7 @@ +
+
    +
  • + {{preVal.Key}} : {{preVal.Value}} +
  • +
+
\ No newline at end of file diff --git a/src/UmbracoUrlHandling/Umbraco/Views/prevalueeditors/requiredfield.html b/src/UmbracoUrlHandling/Umbraco/Views/prevalueeditors/requiredfield.html new file mode 100644 index 0000000..2d24c35 --- /dev/null +++ b/src/UmbracoUrlHandling/Umbraco/Views/prevalueeditors/requiredfield.html @@ -0,0 +1,9 @@ +
+ + + Required + {{propertyForm.requiredField.errorMsg}} +
diff --git a/src/UmbracoUrlHandling/Umbraco/Views/prevalueeditors/textarea.html b/src/UmbracoUrlHandling/Umbraco/Views/prevalueeditors/textarea.html new file mode 100644 index 0000000..e489a6d --- /dev/null +++ b/src/UmbracoUrlHandling/Umbraco/Views/prevalueeditors/textarea.html @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/src/UmbracoUrlHandling/Umbraco/Views/prevalueeditors/textstring.html b/src/UmbracoUrlHandling/Umbraco/Views/prevalueeditors/textstring.html new file mode 100644 index 0000000..a394bde --- /dev/null +++ b/src/UmbracoUrlHandling/Umbraco/Views/prevalueeditors/textstring.html @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/src/UmbracoUrlHandling/Umbraco/Views/prevalueeditors/treepicker.html b/src/UmbracoUrlHandling/Umbraco/Views/prevalueeditors/treepicker.html new file mode 100644 index 0000000..96b3436 --- /dev/null +++ b/src/UmbracoUrlHandling/Umbraco/Views/prevalueeditors/treepicker.html @@ -0,0 +1,30 @@ +
+ + + + + + + + +
diff --git a/src/UmbracoUrlHandling/Umbraco/Views/prevalueeditors/treesource.html b/src/UmbracoUrlHandling/Umbraco/Views/prevalueeditors/treesource.html new file mode 100644 index 0000000..29e3880 --- /dev/null +++ b/src/UmbracoUrlHandling/Umbraco/Views/prevalueeditors/treesource.html @@ -0,0 +1,87 @@ +
+ + + + + +
+ + + + + + + + +
    +
  • + + + Show xpath query help + + + +

    + Use Xpath query to set a root node on the tree, either based on a search from the root of the content tree, or by using a context-aware placeholder. +

    + +

    + Placeholders finds the nearest published ID and runs its query from there. so for instance: + +

    $parent/newsArticle
    + + Will try to get the parent if available, but will then fall back to the nearest ancestor and query for all news articles there. +

    + +

    + Available placeholders:
    + $current: current page or closest found ancestor
    + $parent: parent page or closest found ancestor
    + $root: root of the content tree
    + $site: Ancestor node at level 1
    +

    +
    +
  • +
  • + + Cancel and clear query +
  • +
+
+
+ + + + +
diff --git a/src/UmbracoUrlHandling/Umbraco/Views/prevalueeditors/valuetype.html b/src/UmbracoUrlHandling/Umbraco/Views/prevalueeditors/valuetype.html new file mode 100644 index 0000000..59b7c55 --- /dev/null +++ b/src/UmbracoUrlHandling/Umbraco/Views/prevalueeditors/valuetype.html @@ -0,0 +1,7 @@ + \ No newline at end of file diff --git a/src/UmbracoUrlHandling/Umbraco/Views/propertyeditors/boolean/boolean.html b/src/UmbracoUrlHandling/Umbraco/Views/propertyeditors/boolean/boolean.html new file mode 100644 index 0000000..2d302d0 --- /dev/null +++ b/src/UmbracoUrlHandling/Umbraco/Views/propertyeditors/boolean/boolean.html @@ -0,0 +1,3 @@ +
+ +
\ No newline at end of file diff --git a/src/UmbracoUrlHandling/Umbraco/Views/propertyeditors/changepassword/changepassword.html b/src/UmbracoUrlHandling/Umbraco/Views/propertyeditors/changepassword/changepassword.html new file mode 100644 index 0000000..aee4211 --- /dev/null +++ b/src/UmbracoUrlHandling/Umbraco/Views/propertyeditors/changepassword/changepassword.html @@ -0,0 +1,62 @@ +
+
+ Password has been reset to: +
+ {{model.value.generatedPassword}} +
+
+ +
+ + + + + + + + + + Required + + + + + + Required + Minimum {{$parent.model.config.minPasswordLength}} characters + + + + + + + + The confirmed password doesn't match the new password! + + + + + Cancel + +
+
+
diff --git a/src/UmbracoUrlHandling/Umbraco/Views/propertyeditors/checkboxlist/checkboxlist.html b/src/UmbracoUrlHandling/Umbraco/Views/propertyeditors/checkboxlist/checkboxlist.html new file mode 100644 index 0000000..e6407bd --- /dev/null +++ b/src/UmbracoUrlHandling/Umbraco/Views/propertyeditors/checkboxlist/checkboxlist.html @@ -0,0 +1,14 @@ +
+ +
    +
  • + +
  • +
+ +
diff --git a/src/UmbracoUrlHandling/Umbraco/Views/propertyeditors/colorpicker/colorpicker.html b/src/UmbracoUrlHandling/Umbraco/Views/propertyeditors/colorpicker/colorpicker.html new file mode 100644 index 0000000..4709e24 --- /dev/null +++ b/src/UmbracoUrlHandling/Umbraco/Views/propertyeditors/colorpicker/colorpicker.html @@ -0,0 +1,17 @@ +
+ +
+ You haven't defined any colors +
+ + + + + +
diff --git a/src/UmbracoUrlHandling/Umbraco/Views/propertyeditors/colorpicker/colorpicker.prevalues.html b/src/UmbracoUrlHandling/Umbraco/Views/propertyeditors/colorpicker/colorpicker.prevalues.html new file mode 100644 index 0000000..a772f83 --- /dev/null +++ b/src/UmbracoUrlHandling/Umbraco/Views/propertyeditors/colorpicker/colorpicker.prevalues.html @@ -0,0 +1,12 @@ +
+
+ + + +
+
+
+
{{item.value}}
+ +
+
diff --git a/src/UmbracoUrlHandling/Umbraco/Views/propertyeditors/contentpicker/contentpicker.html b/src/UmbracoUrlHandling/Umbraco/Views/propertyeditors/contentpicker/contentpicker.html new file mode 100644 index 0000000..4808b90 --- /dev/null +++ b/src/UmbracoUrlHandling/Umbraco/Views/propertyeditors/contentpicker/contentpicker.html @@ -0,0 +1,49 @@ +
+ + + +
+ + +
+ + + Add + + + + + + +
+ You need to add at least {{model.config.minNumber}} items +
+ +
+ You can only have {{model.config.maxNumber}} items selected +
+ +
+ + + + +
diff --git a/src/UmbracoUrlHandling/Umbraco/Views/propertyeditors/datepicker/datepicker.html b/src/UmbracoUrlHandling/Umbraco/Views/propertyeditors/datepicker/datepicker.html new file mode 100644 index 0000000..e5f7cf9 --- /dev/null +++ b/src/UmbracoUrlHandling/Umbraco/Views/propertyeditors/datepicker/datepicker.html @@ -0,0 +1,30 @@ +
+ +
+ + + + + + + +
+ + Required + {{datePickerForm.datepicker.errorMsg}} + Invalid date + +

+ This translates to the following time on the server: {{serverTime}}
+ What does this mean? +

+

+ Clear date +

+ +
+
diff --git a/src/UmbracoUrlHandling/Umbraco/Views/propertyeditors/decimal/decimal.html b/src/UmbracoUrlHandling/Umbraco/Views/propertyeditors/decimal/decimal.html new file mode 100644 index 0000000..9b619bc --- /dev/null +++ b/src/UmbracoUrlHandling/Umbraco/Views/propertyeditors/decimal/decimal.html @@ -0,0 +1,12 @@ +
+ + + Not a number + {{propertyForm.requiredField.errorMsg}} +
diff --git a/src/UmbracoUrlHandling/Umbraco/Views/propertyeditors/dropdown/dropdown.html b/src/UmbracoUrlHandling/Umbraco/Views/propertyeditors/dropdown/dropdown.html new file mode 100644 index 0000000..e728b3d --- /dev/null +++ b/src/UmbracoUrlHandling/Umbraco/Views/propertyeditors/dropdown/dropdown.html @@ -0,0 +1,20 @@ +
+ + + + + + +
\ No newline at end of file diff --git a/src/UmbracoUrlHandling/Umbraco/Views/propertyeditors/email/email.html b/src/UmbracoUrlHandling/Umbraco/Views/propertyeditors/email/email.html new file mode 100644 index 0000000..999c2a7 --- /dev/null +++ b/src/UmbracoUrlHandling/Umbraco/Views/propertyeditors/email/email.html @@ -0,0 +1,13 @@ +
+ + + Required + Invalid email + +
diff --git a/src/UmbracoUrlHandling/Umbraco/Views/propertyeditors/entitypicker/entitypicker.html b/src/UmbracoUrlHandling/Umbraco/Views/propertyeditors/entitypicker/entitypicker.html new file mode 100644 index 0000000..274710b --- /dev/null +++ b/src/UmbracoUrlHandling/Umbraco/Views/propertyeditors/entitypicker/entitypicker.html @@ -0,0 +1,19 @@ +
+ + + + + + +
diff --git a/src/UmbracoUrlHandling/Umbraco/Views/propertyeditors/fileupload/fileupload.html b/src/UmbracoUrlHandling/Umbraco/Views/propertyeditors/fileupload/fileupload.html new file mode 100644 index 0000000..1778b7b --- /dev/null +++ b/src/UmbracoUrlHandling/Umbraco/Views/propertyeditors/fileupload/fileupload.html @@ -0,0 +1,36 @@ +
+ +
+ + + + +
+
+ +
+
+ +
+
    +
  • {{file.file.name}}
  • +
+
+ + + +
diff --git a/src/UmbracoUrlHandling/Umbraco/Views/propertyeditors/folderbrowser/folderbrowser.html b/src/UmbracoUrlHandling/Umbraco/Views/propertyeditors/folderbrowser/folderbrowser.html new file mode 100644 index 0000000..8bf860b --- /dev/null +++ b/src/UmbracoUrlHandling/Umbraco/Views/propertyeditors/folderbrowser/folderbrowser.html @@ -0,0 +1,3 @@ +
+ +
diff --git a/src/UmbracoUrlHandling/Umbraco/Views/propertyeditors/googlemaps/googlemaps.html b/src/UmbracoUrlHandling/Umbraco/Views/propertyeditors/googlemaps/googlemaps.html new file mode 100644 index 0000000..7fa8ef8 --- /dev/null +++ b/src/UmbracoUrlHandling/Umbraco/Views/propertyeditors/googlemaps/googlemaps.html @@ -0,0 +1,3 @@ +
+
+
\ No newline at end of file diff --git a/src/UmbracoUrlHandling/Umbraco/Views/propertyeditors/grid/config/grid.default.config.js b/src/UmbracoUrlHandling/Umbraco/Views/propertyeditors/grid/config/grid.default.config.js new file mode 100644 index 0000000..466429a --- /dev/null +++ b/src/UmbracoUrlHandling/Umbraco/Views/propertyeditors/grid/config/grid.default.config.js @@ -0,0 +1,363 @@ +var uSkyGridConfig = [ +{ + + style:[ + { + label: "Set a background image", + description: "Set a row background", + key: "background-image", + view: "imagepicker", + modifier: "url({0})" + }, + + { + label: "Set a font color", + description: "Pick a color", + key: "color", + view: "colorpicker" + } + ], + + config:[ + { + label: "Preview", + description: "Display a live preview", + key: "preview", + view: "boolean" + }, + + { + label: "Class", + description: "Set a css class", + key: "class", + view: "textstring" + } + ], + + layouts: [ + { + grid: 12, + percentage: 100, + + + rows: [ + { + name: "Single column", + columns: [{ + grid: 12, + percentage: 100 + }] + }, + + { + name: "Article", + models: [{ + grid: 4, + percentage: 33.3, + allowed: ["media","quote"] + }, { + grid: 8, + percentage: 66.6, + allowed: ["rte"] + }] + }, + + { + name: "Article, reverse", + models: [ + { + grid: 8, + percentage: 66.6, + allowed: ["rte","macro"] + }, + { + grid: 4, + percentage: 33.3, + allowed: ["media","quote","embed"] + }] + }, + { + name: "Profile page", + models: [ + { + grid: 4, + percentage: 33.3, + allowed: ["media"] + }, + { + grid: 8, + percentage: 66.6, + allowed: ["rte"] + } + ] +}, +{ + name: "Headline", + models: [ + { + grid: 12, + percentage: 100, + max: 1, + allowed: ["headline"] + } + ] +}, +{ + name: "Three columns", + models: [{ + grid: 4, + percentage: 33.3, + allowed: ["rte"] + }, + { + grid: 4, + percentage: 33.3, + allowed: ["rte"] + }, + { + grid: 4, + percentage: 33.3, + allowed: ["rte"] + }] +} +] + +} +] +}, +{ + columns: [ + { + grid: 9, + percentage: 70, + + cellModels: [ + { + models: [{ + grid: 12, + percentage: 100 + }] + }, { + models: [{ + grid: 6, + percentage: 50 + }, { + grid: 6, + percentage: 50 + }] + }, { + models: [{ + grid: 4, + percentage: 33.3 + }, { + grid: 4, + percentage: 33.3 + }, { + grid: 4, + percentage: 33.3 + }] + }, { + models: [{ + grid: 3, + percentage: 25 + }, { + grid: 3, + percentage: 25 + }, { + grid: 3, + percentage: 25 + }, { + grid: 3, + percentage: 25 + }, ] + }, { + models: [{ + grid: 2, + percentage: 16.6 + }, { + grid: 2, + percentage: 16.6 + }, { + grid: 2, + percentage: 16.6 + }, { + grid: 2, + percentage: 16.6 + }, { + grid: 2, + percentage: 16.6 + }, { + grid: 2, + percentage: 16.6 + }] + }, { + models: [{ + grid: 8, + percentage: 60 + }, { + grid: 4, + percentage: 40 + }] + }, { + models: [{ + grid: 4, + percentage: 40 + }, { + grid: 8, + percentage: 60 + }] + } + ] + }, + { + grid: 3, + percentage: 30, + cellModels: [ + { + models: [{ + grid: 12, + percentage: 100 + }] + } + ] + } + ] +}, +{ + columns: [ + { + grid: 3, + percentage: 30, + cellModels: [ + { + models: [{ + grid: 12, + percentage: 100 + }] + } + ] + }, + { + grid: 9, + percentage: 70, + cellModels: [ + { + models: [{ + grid: 12, + percentage: 100 + }] + }, { + models: [{ + grid: 6, + percentage: 50 + }, { + grid: 6, + percentage: 50 + }] + }, { + models: [{ + grid: 4, + percentage: 33.3 + }, { + grid: 4, + percentage: 33.3 + }, { + grid: 4, + percentage: 33.3 + }] + }, { + models: [{ + grid: 3, + percentage: 25 + }, { + grid: 3, + percentage: 25 + }, { + grid: 3, + percentage: 25 + }, { + grid: 3, + percentage: 25 + }, ] + }, { + models: [{ + grid: 2, + percentage: 16.6 + }, { + grid: 2, + percentage: 16.6 + }, { + grid: 2, + percentage: 16.6 + }, { + grid: 2, + percentage: 16.6 + }, { + grid: 2, + percentage: 16.6 + }, { + grid: 2, + percentage: 16.6 + }] + }, { + models: [{ + grid: 8, + percentage: 60 + }, { + grid: 4, + percentage: 40 + }] + }, { + models: [{ + grid: 4, + percentage: 40 + }, { + grid: 8, + percentage: 60 + }] + } + ] + } + ] +}, +{ + columns: [ + { + grid: 4, + percentage: 33.3, + cellModels: [ + { + models: [{ + grid: 12, + percentage: 100 + }] + } + ] + }, + { + grid: 4, + percentage: 33.3, + cellModels: [ + { + models: [{ + grid: 12, + percentage: 100 + }] + } + ] + }, + { + grid: 4, + percentage: 33.3, + cellModels: [ + { + models: [{ + grid: 12, + percentage: 100 + }] + } + ] + } + ] +} +]; diff --git a/src/UmbracoUrlHandling/Umbraco/Views/propertyeditors/grid/config/grid.default.rtestyles.css b/src/UmbracoUrlHandling/Umbraco/Views/propertyeditors/grid/config/grid.default.rtestyles.css new file mode 100644 index 0000000..3837788 --- /dev/null +++ b/src/UmbracoUrlHandling/Umbraco/Views/propertyeditors/grid/config/grid.default.rtestyles.css @@ -0,0 +1,15 @@ +body.mce-content-body { + background: transparent !important; + overflow-x:hidden !important; + padding-bottom: 10px !important; + /*margin:0px;*/ +} + +p { + margin: 0 0 10px; +} + +.button { + display: inline-block; + border-radius:4px; +} \ No newline at end of file diff --git a/src/UmbracoUrlHandling/Umbraco/Views/propertyeditors/grid/dialogs/config.html b/src/UmbracoUrlHandling/Umbraco/Views/propertyeditors/grid/dialogs/config.html new file mode 100644 index 0000000..aa96348 --- /dev/null +++ b/src/UmbracoUrlHandling/Umbraco/Views/propertyeditors/grid/dialogs/config.html @@ -0,0 +1,16 @@ +
+ + + +
+ +
+

Style

+ + + +
diff --git a/src/UmbracoUrlHandling/Umbraco/Views/propertyeditors/grid/dialogs/editconfig.html b/src/UmbracoUrlHandling/Umbraco/Views/propertyeditors/grid/dialogs/editconfig.html new file mode 100644 index 0000000..1c67eb0 --- /dev/null +++ b/src/UmbracoUrlHandling/Umbraco/Views/propertyeditors/grid/dialogs/editconfig.html @@ -0,0 +1,14 @@ +
+ +

{{model.name}}

+

Settings will only save if the entered json configuration is valid

+ + +
+ This configuration is not valid json, and will not be saved. +
+ +
diff --git a/src/UmbracoUrlHandling/Umbraco/Views/propertyeditors/grid/dialogs/layoutconfig.html b/src/UmbracoUrlHandling/Umbraco/Views/propertyeditors/grid/dialogs/layoutconfig.html new file mode 100644 index 0000000..f87262d --- /dev/null +++ b/src/UmbracoUrlHandling/Umbraco/Views/propertyeditors/grid/dialogs/layoutconfig.html @@ -0,0 +1,115 @@ +
+ +
+ +
+

+ + + + + +
+ +
+
+ + + + + + + + +
+
+
+ +
+ + +
+ + + + {{currentSection.grid}} + + + +
+
+ + + + + Delete + + + + + +
    +
  • + +
  • +
+ +
+
+ +
+
    + +
  • + + + +
    +
  • +
+
+
+
+
+ +
+ +
diff --git a/src/UmbracoUrlHandling/Umbraco/Views/propertyeditors/grid/dialogs/rowconfig.html b/src/UmbracoUrlHandling/Umbraco/Views/propertyeditors/grid/dialogs/rowconfig.html new file mode 100644 index 0000000..421aaf0 --- /dev/null +++ b/src/UmbracoUrlHandling/Umbraco/Views/propertyeditors/grid/dialogs/rowconfig.html @@ -0,0 +1,97 @@ +
+ +
+ +
+

+ +
+

Modifying a row configuration name will result in loss of + data for any existing content that is based on this configuration.

+

Modifying only the label will not result in data loss.

+
+ + + + + + + + + +
+ +
+
+ + + + + + + +
+
+
+ +
+ + +
+ + + + {{currentCell.grid}} + + + +
+
+ + + + + Delete + + + + +
    +
  • + +
  • +
+ +
+
+
    +
  • + +
  • +
+
+
+
+ +
+ +
diff --git a/src/UmbracoUrlHandling/Umbraco/Views/propertyeditors/grid/dialogs/rowdeleteconfirm.html b/src/UmbracoUrlHandling/Umbraco/Views/propertyeditors/grid/dialogs/rowdeleteconfirm.html new file mode 100644 index 0000000..c69ae2c --- /dev/null +++ b/src/UmbracoUrlHandling/Umbraco/Views/propertyeditors/grid/dialogs/rowdeleteconfirm.html @@ -0,0 +1,18 @@ +
+ +

Warning!

+ +

+ You are deleting the row configuration '{{model.dialogData.rowName}}' +

+ +

+ Modifying a row configuration name will result in loss of + data for any existing content that is based on this configuration. +

+ +

+ Are you sure? +

+ +
diff --git a/src/UmbracoUrlHandling/Umbraco/Views/propertyeditors/grid/editors/embed.html b/src/UmbracoUrlHandling/Umbraco/Views/propertyeditors/grid/editors/embed.html new file mode 100644 index 0000000..e506ac5 --- /dev/null +++ b/src/UmbracoUrlHandling/Umbraco/Views/propertyeditors/grid/editors/embed.html @@ -0,0 +1,17 @@ +
+ +
+ +
Click to embed
+
+ +
+ + + + +
diff --git a/src/UmbracoUrlHandling/Umbraco/Views/propertyeditors/grid/editors/error.html b/src/UmbracoUrlHandling/Umbraco/Views/propertyeditors/grid/editors/error.html new file mode 100644 index 0000000..67ef4ea --- /dev/null +++ b/src/UmbracoUrlHandling/Umbraco/Views/propertyeditors/grid/editors/error.html @@ -0,0 +1,2 @@ +

Something went wrong with this editor, below is the data stored:

+
{{control | json}}
\ No newline at end of file diff --git a/src/UmbracoUrlHandling/Umbraco/Views/propertyeditors/grid/editors/macro.html b/src/UmbracoUrlHandling/Umbraco/Views/propertyeditors/grid/editors/macro.html new file mode 100644 index 0000000..f36a870 --- /dev/null +++ b/src/UmbracoUrlHandling/Umbraco/Views/propertyeditors/grid/editors/macro.html @@ -0,0 +1,23 @@ +
+ +
+
+ +
{{title}}
+
+
+
+
+
+
+ + + + +
diff --git a/src/UmbracoUrlHandling/Umbraco/Views/propertyeditors/grid/editors/media.html b/src/UmbracoUrlHandling/Umbraco/Views/propertyeditors/grid/editors/media.html new file mode 100644 index 0000000..dd35757 --- /dev/null +++ b/src/UmbracoUrlHandling/Umbraco/Views/propertyeditors/grid/editors/media.html @@ -0,0 +1,24 @@ +
+ +
+ +
Click to insert image
+
+ +
+ + +
+ + + + +
diff --git a/src/UmbracoUrlHandling/Umbraco/Views/propertyeditors/grid/editors/rte.html b/src/UmbracoUrlHandling/Umbraco/Views/propertyeditors/grid/editors/rte.html new file mode 100644 index 0000000..7bceed6 --- /dev/null +++ b/src/UmbracoUrlHandling/Umbraco/Views/propertyeditors/grid/editors/rte.html @@ -0,0 +1,42 @@ +
+ +
+
+ + + + + + + + + + + + + +
diff --git a/src/UmbracoUrlHandling/Umbraco/Views/propertyeditors/grid/editors/textstring.html b/src/UmbracoUrlHandling/Umbraco/Views/propertyeditors/grid/editors/textstring.html new file mode 100644 index 0000000..18526b0 --- /dev/null +++ b/src/UmbracoUrlHandling/Umbraco/Views/propertyeditors/grid/editors/textstring.html @@ -0,0 +1,9 @@ +
+ +
diff --git a/src/UmbracoUrlHandling/Umbraco/Views/propertyeditors/grid/grid.html b/src/UmbracoUrlHandling/Umbraco/Views/propertyeditors/grid/grid.html new file mode 100644 index 0000000..4ddca47 --- /dev/null +++ b/src/UmbracoUrlHandling/Umbraco/Views/propertyeditors/grid/grid.html @@ -0,0 +1,312 @@ +
+ + + + + + + + + + + +
+ + + +
+ +

+ +
+ +
+ +
+ +
+
+ +
+ +
+ +
+
+ + {{template.name}} + +
+ +
+ + + +
+
+ + +
+ +
+ + + + +
+ +
+ +
+
{{row.label || row.name}}
+ +
+ +
+
+ + +
+ +
+ +
+ +
+ + + +
+ +
+ + +
+ + +
+ +
+
+
+ + +
+ + +
+ + +
+ + +
+ + +
+ + +
+ +
+ +
+ +
+
+ +
+
+ +
+ + +
+
+ + +
+
+ + +
+ +
+ +
+ {{control.editor.name}} +
+ +
+ +
+ +
+ {{control.editor.name}} +
+ +
+ +
+ +
+ +
+ + + +
+ +
+ +
+ + +
+
+ +
+
+ +
+ + + +
+
+
+ +
+ +
+ + +
+
+
+
+ + +
+ + +
+ + + +
+ + + + + + + +
+ +
+ +

+ +
+ +
+ +
+ +
+
+ +
+ +
+ +
+
+ + {{layout.label || layout.name}} + +
+ +
+ + +
+ +
+
+
+ + + + + + + +
diff --git a/src/UmbracoUrlHandling/Umbraco/Views/propertyeditors/grid/grid.prevalues.html b/src/UmbracoUrlHandling/Umbraco/Views/propertyeditors/grid/grid.prevalues.html new file mode 100644 index 0000000..06bdfe2 --- /dev/null +++ b/src/UmbracoUrlHandling/Umbraco/Views/propertyeditors/grid/grid.prevalues.html @@ -0,0 +1,193 @@ +
+
+
+ +

+

+ +
    + +
  • + +
    + +
    +
    +
    +
    +
    +
    + +
    + {{template.name}}
    + + +
    + +
  • +
+ + +
+
+
+ +
+ +

+

+ +
+
    + +
  • + +
    + +
    +
    + +
    +
    +
    +
    + +
    + {{layout.label || layout.name}}
    + + + + +
    + +
  • +
+ + + +
+
+ +
+ + +
+ + + + + + + + + + + + + + + + + + + + +
+ + + + + + + + + + + + + +
diff --git a/src/UmbracoUrlHandling/Umbraco/Views/propertyeditors/imagecropper/imagecropper.html b/src/UmbracoUrlHandling/Umbraco/Views/propertyeditors/imagecropper/imagecropper.html new file mode 100644 index 0000000..e1c0118 --- /dev/null +++ b/src/UmbracoUrlHandling/Umbraco/Views/propertyeditors/imagecropper/imagecropper.html @@ -0,0 +1,72 @@ +
+ + + + +

Click to upload

+ +
+ + +
+ + +
+ +
+
+ + + +
+ + +
+ + + Reset + +
+
+ +
+ + + Remove file +
+ +
    +
  • + + + + +
    + {{value.alias}} + {{value.width}}px x {{value.height}}px +
    +
  • +
+ + +
+ +
+
diff --git a/src/UmbracoUrlHandling/Umbraco/Views/propertyeditors/imagecropper/imagecropper.prevalues.html b/src/UmbracoUrlHandling/Umbraco/Views/propertyeditors/imagecropper/imagecropper.prevalues.html new file mode 100644 index 0000000..62a5565 --- /dev/null +++ b/src/UmbracoUrlHandling/Umbraco/Views/propertyeditors/imagecropper/imagecropper.prevalues.html @@ -0,0 +1,49 @@ +
+ + +
+
    +
  • + + + + {{node.alias}} +
    {{node.width}}px × {{node.height}}px +
  • +
+
+ +
+

Define crop

+

+ Give the crop an alias and it's default width and height. +

+ +
+ + +
+ +
+ + + × + +
+ +
+ + Cancel +
+
+ +
+ +
+ +
diff --git a/src/UmbracoUrlHandling/Umbraco/Views/propertyeditors/integer/integer.html b/src/UmbracoUrlHandling/Umbraco/Views/propertyeditors/integer/integer.html new file mode 100644 index 0000000..c1c1212 --- /dev/null +++ b/src/UmbracoUrlHandling/Umbraco/Views/propertyeditors/integer/integer.html @@ -0,0 +1,13 @@ +
+ + + Not a number + {{propertyForm.requiredField.errorMsg}} +
diff --git a/src/UmbracoUrlHandling/Umbraco/Views/propertyeditors/listview/bulkActionPermissions.prevalues.html b/src/UmbracoUrlHandling/Umbraco/Views/propertyeditors/listview/bulkActionPermissions.prevalues.html new file mode 100644 index 0000000..8a5ca61 --- /dev/null +++ b/src/UmbracoUrlHandling/Umbraco/Views/propertyeditors/listview/bulkActionPermissions.prevalues.html @@ -0,0 +1,32 @@ +
+
+ +
+
+ +
+
+ +
+
+ +
+
+ +
+
diff --git a/src/UmbracoUrlHandling/Umbraco/Views/propertyeditors/listview/includeproperties.prevalues.html b/src/UmbracoUrlHandling/Umbraco/Views/propertyeditors/listview/includeproperties.prevalues.html new file mode 100644 index 0000000..5cf7de7 --- /dev/null +++ b/src/UmbracoUrlHandling/Umbraco/Views/propertyeditors/listview/includeproperties.prevalues.html @@ -0,0 +1,55 @@ +
+
+ + + +
+
+ + + + + + + + + + + + + + + + + + +
AliasHeader
+ + + {{val.alias}} + + {{val.alias}} + + (system field) + + + + Required + + + + {{val.alias}} + + + +
+
+ + +
\ No newline at end of file diff --git a/src/UmbracoUrlHandling/Umbraco/Views/propertyeditors/listview/layouts.prevalues.html b/src/UmbracoUrlHandling/Umbraco/Views/propertyeditors/listview/layouts.prevalues.html new file mode 100644 index 0000000..c71f330 --- /dev/null +++ b/src/UmbracoUrlHandling/Umbraco/Views/propertyeditors/listview/layouts.prevalues.html @@ -0,0 +1,57 @@ +
+ +
+ +
+ + + +
+ + + + + +
+ +
+ +
+ +
+ + {{ layout.name }} + (system layout) +
+ +
+ +
+ +
+ +
+ + + +
+
+ +
+ + Add layout + +
+ + + + +
diff --git a/src/UmbracoUrlHandling/Umbraco/Views/propertyeditors/listview/layouts/grid/grid.html b/src/UmbracoUrlHandling/Umbraco/Views/propertyeditors/listview/layouts/grid/grid.html new file mode 100644 index 0000000..949374c --- /dev/null +++ b/src/UmbracoUrlHandling/Umbraco/Views/propertyeditors/listview/layouts/grid/grid.html @@ -0,0 +1,92 @@ +
+ +
+ + + + + +
No content has been added
+
No members have been added
+
+ + + + + + + + + +
+ +
+ + + + + + + + + + + +
    +
  • +
    {{ property.header }}
    +
    {{ vm.mediaDetailsTooltip.item[property.alias] }}
    +
  • +
+
+ + + + + + + + + +
+ +
diff --git a/src/UmbracoUrlHandling/Umbraco/Views/propertyeditors/listview/layouts/list/list.html b/src/UmbracoUrlHandling/Umbraco/Views/propertyeditors/listview/layouts/list/list.html new file mode 100644 index 0000000..ca1c212 --- /dev/null +++ b/src/UmbracoUrlHandling/Umbraco/Views/propertyeditors/listview/layouts/list/list.html @@ -0,0 +1,74 @@ +
+ +
+ + + + + + + +
+ +
+ + + + + +
No content has been added
+
No members have been added
+
+ +
+ + + + + + + + + +
diff --git a/src/UmbracoUrlHandling/Umbraco/Views/propertyeditors/listview/listview.html b/src/UmbracoUrlHandling/Umbraco/Views/propertyeditors/listview/listview.html new file mode 100644 index 0000000..a9016bd --- /dev/null +++ b/src/UmbracoUrlHandling/Umbraco/Views/propertyeditors/listview/listview.html @@ -0,0 +1,199 @@ +
+ +
+ +
+ +
+ + + + + + + + + + + + + + + + + {{ selectedItemsCount() }} of {{ listViewResultSet.items.length }} selected + + +
+
+
+
+ +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + + + + + +
+ + +
+ +
+ + + + + + + + + + +
diff --git a/src/UmbracoUrlHandling/Umbraco/Views/propertyeditors/listview/orderDirection.prevalues.html b/src/UmbracoUrlHandling/Umbraco/Views/propertyeditors/listview/orderDirection.prevalues.html new file mode 100644 index 0000000..6e8ecd4 --- /dev/null +++ b/src/UmbracoUrlHandling/Umbraco/Views/propertyeditors/listview/orderDirection.prevalues.html @@ -0,0 +1,12 @@ +
+ + + + Required +
\ No newline at end of file diff --git a/src/UmbracoUrlHandling/Umbraco/Views/propertyeditors/listview/sortby.prevalues.html b/src/UmbracoUrlHandling/Umbraco/Views/propertyeditors/listview/sortby.prevalues.html new file mode 100644 index 0000000..754afd9 --- /dev/null +++ b/src/UmbracoUrlHandling/Umbraco/Views/propertyeditors/listview/sortby.prevalues.html @@ -0,0 +1,4 @@ + \ No newline at end of file diff --git a/src/UmbracoUrlHandling/Umbraco/Views/propertyeditors/macrocontainer/macrocontainer.html b/src/UmbracoUrlHandling/Umbraco/Views/propertyeditors/macrocontainer/macrocontainer.html new file mode 100644 index 0000000..1dec278 --- /dev/null +++ b/src/UmbracoUrlHandling/Umbraco/Views/propertyeditors/macrocontainer/macrocontainer.html @@ -0,0 +1,33 @@ +
+ +
+
+ + +
+
+ + + Add + + + + + +
diff --git a/src/UmbracoUrlHandling/Umbraco/Views/propertyeditors/macrocontainer/macrolist.prevalues.html b/src/UmbracoUrlHandling/Umbraco/Views/propertyeditors/macrocontainer/macrolist.prevalues.html new file mode 100644 index 0000000..d0081e7 --- /dev/null +++ b/src/UmbracoUrlHandling/Umbraco/Views/propertyeditors/macrocontainer/macrolist.prevalues.html @@ -0,0 +1,7 @@ +
+ + + +
\ No newline at end of file diff --git a/src/UmbracoUrlHandling/Umbraco/Views/propertyeditors/markdowneditor/markdowneditor.html b/src/UmbracoUrlHandling/Umbraco/Views/propertyeditors/markdowneditor/markdowneditor.html new file mode 100644 index 0000000..6b86bf7 --- /dev/null +++ b/src/UmbracoUrlHandling/Umbraco/Views/propertyeditors/markdowneditor/markdowneditor.html @@ -0,0 +1,15 @@ +
+
+ + + +
+ + + + +
diff --git a/src/UmbracoUrlHandling/Umbraco/Views/propertyeditors/mediapicker/mediapicker.html b/src/UmbracoUrlHandling/Umbraco/Views/propertyeditors/mediapicker/mediapicker.html new file mode 100644 index 0000000..300b017 --- /dev/null +++ b/src/UmbracoUrlHandling/Umbraco/Views/propertyeditors/mediapicker/mediapicker.html @@ -0,0 +1,47 @@ +
+ +
    +
  • + + + + + + + + + + + + {{image.name}} + + + + +
  • +
+ + + + + + + +
diff --git a/src/UmbracoUrlHandling/Umbraco/Views/propertyeditors/membergrouppicker/membergrouppicker.html b/src/UmbracoUrlHandling/Umbraco/Views/propertyeditors/membergrouppicker/membergrouppicker.html new file mode 100644 index 0000000..7287de5 --- /dev/null +++ b/src/UmbracoUrlHandling/Umbraco/Views/propertyeditors/membergrouppicker/membergrouppicker.html @@ -0,0 +1,28 @@ +
+ +
+ + +
+ + + Add + + + + + +
diff --git a/src/UmbracoUrlHandling/Umbraco/Views/propertyeditors/membergroups/membergroups.html b/src/UmbracoUrlHandling/Umbraco/Views/propertyeditors/membergroups/membergroups.html new file mode 100644 index 0000000..d8eb44d --- /dev/null +++ b/src/UmbracoUrlHandling/Umbraco/Views/propertyeditors/membergroups/membergroups.html @@ -0,0 +1,18 @@ +
+
+
Not a member of group(s)
+ +
+
+
Member of group(s)
+ +
+
diff --git a/src/UmbracoUrlHandling/Umbraco/Views/propertyeditors/memberpicker/memberpicker.html b/src/UmbracoUrlHandling/Umbraco/Views/propertyeditors/memberpicker/memberpicker.html new file mode 100644 index 0000000..08786c4 --- /dev/null +++ b/src/UmbracoUrlHandling/Umbraco/Views/propertyeditors/memberpicker/memberpicker.html @@ -0,0 +1,28 @@ +
+ +
+ + +
+ + + Add + + + + + +
diff --git a/src/UmbracoUrlHandling/Umbraco/Views/propertyeditors/multipletextbox/multipletextbox.html b/src/UmbracoUrlHandling/Umbraco/Views/propertyeditors/multipletextbox/multipletextbox.html new file mode 100644 index 0000000..29106a7 --- /dev/null +++ b/src/UmbracoUrlHandling/Umbraco/Views/propertyeditors/multipletextbox/multipletextbox.html @@ -0,0 +1,20 @@ +
+ +
+
+ + + + + +
+
+ + + + +
diff --git a/src/UmbracoUrlHandling/Umbraco/Views/propertyeditors/radiobuttons/radiobuttons.html b/src/UmbracoUrlHandling/Umbraco/Views/propertyeditors/radiobuttons/radiobuttons.html new file mode 100644 index 0000000..2e5ce96 --- /dev/null +++ b/src/UmbracoUrlHandling/Umbraco/Views/propertyeditors/radiobuttons/radiobuttons.html @@ -0,0 +1,12 @@ +
+
    +
  • + +
  • +
+
\ No newline at end of file diff --git a/src/UmbracoUrlHandling/Umbraco/Views/propertyeditors/readonlyvalue/readonlyvalue.html b/src/UmbracoUrlHandling/Umbraco/Views/propertyeditors/readonlyvalue/readonlyvalue.html new file mode 100644 index 0000000..449fa53 --- /dev/null +++ b/src/UmbracoUrlHandling/Umbraco/Views/propertyeditors/readonlyvalue/readonlyvalue.html @@ -0,0 +1,3 @@ +
+ +
\ No newline at end of file diff --git a/src/UmbracoUrlHandling/Umbraco/Views/propertyeditors/relatedlinks/relatedlinks.html b/src/UmbracoUrlHandling/Umbraco/Views/propertyeditors/relatedlinks/relatedlinks.html new file mode 100644 index 0000000..5440d0c --- /dev/null +++ b/src/UmbracoUrlHandling/Umbraco/Views/propertyeditors/relatedlinks/relatedlinks.html @@ -0,0 +1,98 @@ + \ No newline at end of file diff --git a/src/UmbracoUrlHandling/Umbraco/Views/propertyeditors/rte/rte.html b/src/UmbracoUrlHandling/Umbraco/Views/propertyeditors/rte/rte.html new file mode 100644 index 0000000..9e6bc2d --- /dev/null +++ b/src/UmbracoUrlHandling/Umbraco/Views/propertyeditors/rte/rte.html @@ -0,0 +1,35 @@ +
+
Loading...
+ + + + + + + + + + + + + + +
diff --git a/src/UmbracoUrlHandling/Umbraco/Views/propertyeditors/rte/rte.prevalues.html b/src/UmbracoUrlHandling/Umbraco/Views/propertyeditors/rte/rte.prevalues.html new file mode 100644 index 0000000..b9d63df --- /dev/null +++ b/src/UmbracoUrlHandling/Umbraco/Views/propertyeditors/rte/rte.prevalues.html @@ -0,0 +1,43 @@ +
+ + +
+ +
+
+ + +
+ +
+
+ + +
+ × + Pixels +
+
+ + +
+ Pixels +
+
+
\ No newline at end of file diff --git a/src/UmbracoUrlHandling/Umbraco/Views/propertyeditors/slider/handle.prevalues.html b/src/UmbracoUrlHandling/Umbraco/Views/propertyeditors/slider/handle.prevalues.html new file mode 100644 index 0000000..ae5deb0 --- /dev/null +++ b/src/UmbracoUrlHandling/Umbraco/Views/propertyeditors/slider/handle.prevalues.html @@ -0,0 +1,11 @@ +
+ + + + Required + +
\ No newline at end of file diff --git a/src/UmbracoUrlHandling/Umbraco/Views/propertyeditors/slider/orientation.prevalues.html b/src/UmbracoUrlHandling/Umbraco/Views/propertyeditors/slider/orientation.prevalues.html new file mode 100644 index 0000000..7feed04 --- /dev/null +++ b/src/UmbracoUrlHandling/Umbraco/Views/propertyeditors/slider/orientation.prevalues.html @@ -0,0 +1,10 @@ +
+ + + + Required + +
\ No newline at end of file diff --git a/src/UmbracoUrlHandling/Umbraco/Views/propertyeditors/slider/slider.html b/src/UmbracoUrlHandling/Umbraco/Views/propertyeditors/slider/slider.html new file mode 100644 index 0000000..e7d9a06 --- /dev/null +++ b/src/UmbracoUrlHandling/Umbraco/Views/propertyeditors/slider/slider.html @@ -0,0 +1,5 @@ +
+ + + +
\ No newline at end of file diff --git a/src/UmbracoUrlHandling/Umbraco/Views/propertyeditors/slider/tooltip.prevalues.html b/src/UmbracoUrlHandling/Umbraco/Views/propertyeditors/slider/tooltip.prevalues.html new file mode 100644 index 0000000..9baf195 --- /dev/null +++ b/src/UmbracoUrlHandling/Umbraco/Views/propertyeditors/slider/tooltip.prevalues.html @@ -0,0 +1,11 @@ +
+ + + + Required + +
\ No newline at end of file diff --git a/src/UmbracoUrlHandling/Umbraco/Views/propertyeditors/tags/tags.html b/src/UmbracoUrlHandling/Umbraco/Views/propertyeditors/tags/tags.html new file mode 100644 index 0000000..247ae7d --- /dev/null +++ b/src/UmbracoUrlHandling/Umbraco/Views/propertyeditors/tags/tags.html @@ -0,0 +1,27 @@ +
+ +
+ Loading... +
+ +
+ + + + + + + + + + +
+ +
\ No newline at end of file diff --git a/src/UmbracoUrlHandling/Umbraco/Views/propertyeditors/tags/tags.prevalues.html b/src/UmbracoUrlHandling/Umbraco/Views/propertyeditors/tags/tags.prevalues.html new file mode 100644 index 0000000..2eb9aec --- /dev/null +++ b/src/UmbracoUrlHandling/Umbraco/Views/propertyeditors/tags/tags.prevalues.html @@ -0,0 +1,10 @@ +
+ + + +
\ No newline at end of file diff --git a/src/UmbracoUrlHandling/Umbraco/Views/propertyeditors/templatepicker/templatepicker.html b/src/UmbracoUrlHandling/Umbraco/Views/propertyeditors/templatepicker/templatepicker.html new file mode 100644 index 0000000..6dad637 --- /dev/null +++ b/src/UmbracoUrlHandling/Umbraco/Views/propertyeditors/templatepicker/templatepicker.html @@ -0,0 +1,3 @@ +
+
{{model.value | json}}
+
\ No newline at end of file diff --git a/src/UmbracoUrlHandling/Umbraco/Views/propertyeditors/test/test.html b/src/UmbracoUrlHandling/Umbraco/Views/propertyeditors/test/test.html new file mode 100644 index 0000000..19b0972 --- /dev/null +++ b/src/UmbracoUrlHandling/Umbraco/Views/propertyeditors/test/test.html @@ -0,0 +1,18 @@ +
+
    +
  • + {{item[0].value}}... +
  • +
+ +
+ + +
+ + + +
+ json: {{model.value|json}} +
+
\ No newline at end of file diff --git a/src/UmbracoUrlHandling/Umbraco/Views/propertyeditors/textarea/textarea.html b/src/UmbracoUrlHandling/Umbraco/Views/propertyeditors/textarea/textarea.html new file mode 100644 index 0000000..7dbb1be --- /dev/null +++ b/src/UmbracoUrlHandling/Umbraco/Views/propertyeditors/textarea/textarea.html @@ -0,0 +1,3 @@ + +Required + diff --git a/src/UmbracoUrlHandling/Umbraco/Views/propertyeditors/textbox/textbox.html b/src/UmbracoUrlHandling/Umbraco/Views/propertyeditors/textbox/textbox.html new file mode 100644 index 0000000..7c400a1 --- /dev/null +++ b/src/UmbracoUrlHandling/Umbraco/Views/propertyeditors/textbox/textbox.html @@ -0,0 +1,9 @@ +
+ + + Required +
diff --git a/src/UmbracoUrlHandling/Umbraco/Views/propertyeditors/ultrasimple/ultrasimple.html b/src/UmbracoUrlHandling/Umbraco/Views/propertyeditors/ultrasimple/ultrasimple.html new file mode 100644 index 0000000..76e31ec --- /dev/null +++ b/src/UmbracoUrlHandling/Umbraco/Views/propertyeditors/ultrasimple/ultrasimple.html @@ -0,0 +1,2 @@ + + \ No newline at end of file diff --git a/src/UmbracoUrlHandling/Umbraco/Views/propertyeditors/urllist/urllist.html b/src/UmbracoUrlHandling/Umbraco/Views/propertyeditors/urllist/urllist.html new file mode 100644 index 0000000..864ad21 --- /dev/null +++ b/src/UmbracoUrlHandling/Umbraco/Views/propertyeditors/urllist/urllist.html @@ -0,0 +1,11 @@ + \ No newline at end of file diff --git a/src/UmbracoUrlHandling/Umbraco/Views/propertyeditors/validationtest/validationtest.html b/src/UmbracoUrlHandling/Umbraco/Views/propertyeditors/validationtest/validationtest.html new file mode 100644 index 0000000..4716a63 --- /dev/null +++ b/src/UmbracoUrlHandling/Umbraco/Views/propertyeditors/validationtest/validationtest.html @@ -0,0 +1,12 @@ +
+

Enter a numeric value

+ + + + Required! + The value entered is not a number + A server error occurred +
diff --git a/src/UmbracoUrlHandling/Umbraco/Views/scripts/create.html b/src/UmbracoUrlHandling/Umbraco/Views/scripts/create.html new file mode 100644 index 0000000..f7d8b03 --- /dev/null +++ b/src/UmbracoUrlHandling/Umbraco/Views/scripts/create.html @@ -0,0 +1,47 @@ + + + diff --git a/src/UmbracoUrlHandling/Umbraco/Views/scripts/delete.html b/src/UmbracoUrlHandling/Umbraco/Views/scripts/delete.html new file mode 100644 index 0000000..187db7f --- /dev/null +++ b/src/UmbracoUrlHandling/Umbraco/Views/scripts/delete.html @@ -0,0 +1,12 @@ +
+
+ +

+ Are you sure you want to delete {{currentNode.name}} ? +

+ + + + +
+
diff --git a/src/UmbracoUrlHandling/Umbraco/Views/scripts/edit.html b/src/UmbracoUrlHandling/Umbraco/Views/scripts/edit.html new file mode 100644 index 0000000..4c58356 --- /dev/null +++ b/src/UmbracoUrlHandling/Umbraco/Views/scripts/edit.html @@ -0,0 +1,59 @@ +
+ + + +
+ + + + + + + + +
+
+ +
+ + + + + + + + + + + + + + + + + + +
+
+ +
\ No newline at end of file diff --git a/src/UmbracoUrlHandling/Umbraco/Views/templates/edit.html b/src/UmbracoUrlHandling/Umbraco/Views/templates/edit.html new file mode 100644 index 0000000..2d59b64 --- /dev/null +++ b/src/UmbracoUrlHandling/Umbraco/Views/templates/edit.html @@ -0,0 +1,188 @@ +
+ + + +
+ + + + + + + + + +
+ +
+ +
+ + + + + + + +
+ +
+ +
+ + + + + + +
+ +
+ +
+
+ +
+ + + + + + + + + + + + + + + + + + + +
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + +
diff --git a/src/UmbracoUrlHandling/Umbraco/Webservices/CMSNode.asmx b/src/UmbracoUrlHandling/Umbraco/Webservices/CMSNode.asmx new file mode 100644 index 0000000..201a882 --- /dev/null +++ b/src/UmbracoUrlHandling/Umbraco/Webservices/CMSNode.asmx @@ -0,0 +1 @@ +<%@ WebService Language="C#" CodeBehind="CMSNode.asmx.cs" Class="umbraco.presentation.webservices.CMSNode" %> diff --git a/src/UmbracoUrlHandling/Umbraco/Webservices/CacheRefresher.asmx b/src/UmbracoUrlHandling/Umbraco/Webservices/CacheRefresher.asmx new file mode 100644 index 0000000..e2bc295 --- /dev/null +++ b/src/UmbracoUrlHandling/Umbraco/Webservices/CacheRefresher.asmx @@ -0,0 +1 @@ +<%@ WebService Language="c#" Codebehind="CacheRefresher.asmx.cs" Class="umbraco.presentation.webservices.CacheRefresher" %> diff --git a/src/UmbracoUrlHandling/Umbraco/Webservices/CheckForUpgrade.asmx b/src/UmbracoUrlHandling/Umbraco/Webservices/CheckForUpgrade.asmx new file mode 100644 index 0000000..226022e --- /dev/null +++ b/src/UmbracoUrlHandling/Umbraco/Webservices/CheckForUpgrade.asmx @@ -0,0 +1 @@ +<%@ WebService Language="C#" CodeBehind="CheckForUpgrade.asmx.cs" Class="umbraco.presentation.webservices.CheckForUpgrade" %> diff --git a/src/UmbracoUrlHandling/Umbraco/Webservices/Developer.asmx b/src/UmbracoUrlHandling/Umbraco/Webservices/Developer.asmx new file mode 100644 index 0000000..b98e33e --- /dev/null +++ b/src/UmbracoUrlHandling/Umbraco/Webservices/Developer.asmx @@ -0,0 +1 @@ +<%@ WebService Language="c#" Codebehind="Developer.asmx.cs" Class="umbraco.webservices.Developer" %> diff --git a/src/UmbracoUrlHandling/Umbraco/Webservices/MacroContainerService.asmx b/src/UmbracoUrlHandling/Umbraco/Webservices/MacroContainerService.asmx new file mode 100644 index 0000000..451f468 --- /dev/null +++ b/src/UmbracoUrlHandling/Umbraco/Webservices/MacroContainerService.asmx @@ -0,0 +1 @@ +<%@ WebService Language="C#" CodeBehind="MacroContainerService.asmx.cs" Class="umbraco.presentation.webservices.MacroContainerService" %> diff --git a/src/UmbracoUrlHandling/Umbraco/Webservices/MediaUploader.ashx b/src/UmbracoUrlHandling/Umbraco/Webservices/MediaUploader.ashx new file mode 100644 index 0000000..4d5cb75 --- /dev/null +++ b/src/UmbracoUrlHandling/Umbraco/Webservices/MediaUploader.ashx @@ -0,0 +1 @@ +<%@ WebHandler Language="C#" CodeBehind="MediaUploader.ashx.cs" Class="umbraco.presentation.umbraco.webservices.MediaUploader" %> diff --git a/src/UmbracoUrlHandling/Umbraco/Webservices/Settings.asmx b/src/UmbracoUrlHandling/Umbraco/Webservices/Settings.asmx new file mode 100644 index 0000000..ed224f1 --- /dev/null +++ b/src/UmbracoUrlHandling/Umbraco/Webservices/Settings.asmx @@ -0,0 +1 @@ +<%@ WebService Language="c#" Codebehind="Settings.asmx.cs" Class="umbraco.webservices.Settings" %> diff --git a/src/UmbracoUrlHandling/Umbraco/Webservices/TagsAutoCompleteHandler.ashx b/src/UmbracoUrlHandling/Umbraco/Webservices/TagsAutoCompleteHandler.ashx new file mode 100644 index 0000000..0c15355 --- /dev/null +++ b/src/UmbracoUrlHandling/Umbraco/Webservices/TagsAutoCompleteHandler.ashx @@ -0,0 +1 @@ +<%@ WebHandler Language="C#" CodeBehind="TagsAutoCompleteHandler.ashx.cs" Class="umbraco.presentation.umbraco.webservices.TagsAutoCompleteHandler" %> diff --git a/src/UmbracoUrlHandling/Umbraco/Webservices/TreeClientService.asmx b/src/UmbracoUrlHandling/Umbraco/Webservices/TreeClientService.asmx new file mode 100644 index 0000000..585441d --- /dev/null +++ b/src/UmbracoUrlHandling/Umbraco/Webservices/TreeClientService.asmx @@ -0,0 +1 @@ +<%@ WebService Language="C#" CodeBehind="TreeClientService.asmx.cs" Class="umbraco.presentation.webservices.TreeClientService" %> diff --git a/src/UmbracoUrlHandling/Umbraco/Webservices/TreeDataService.ashx b/src/UmbracoUrlHandling/Umbraco/Webservices/TreeDataService.ashx new file mode 100644 index 0000000..29e9cd4 --- /dev/null +++ b/src/UmbracoUrlHandling/Umbraco/Webservices/TreeDataService.ashx @@ -0,0 +1 @@ +<%@ WebHandler Language="C#" CodeBehind="TreeDataService.ashx.cs" Class="umbraco.presentation.webservices.TreeDataService" %> diff --git a/src/UmbracoUrlHandling/Umbraco/Webservices/UltimatePickerAutoCompleteHandler.ashx b/src/UmbracoUrlHandling/Umbraco/Webservices/UltimatePickerAutoCompleteHandler.ashx new file mode 100644 index 0000000..f65459c --- /dev/null +++ b/src/UmbracoUrlHandling/Umbraco/Webservices/UltimatePickerAutoCompleteHandler.ashx @@ -0,0 +1 @@ +<%@ WebHandler Language="C#" CodeBehind="UltimatePickerAutoCompleteHandler.ashx.cs" Class="umbraco.presentation.umbraco.webservices.UltimatePickerAutoCompleteHandler" %> diff --git a/src/UmbracoUrlHandling/Umbraco/Webservices/ajax.js b/src/UmbracoUrlHandling/Umbraco/Webservices/ajax.js new file mode 100644 index 0000000..868ccf6 --- /dev/null +++ b/src/UmbracoUrlHandling/Umbraco/Webservices/ajax.js @@ -0,0 +1,805 @@ +// ajax.js +// Common Javascript methods and global objects +// Ajax framework for Internet Explorer (6.0, ...) and Firefox (1.0, ...) +// Copyright by Matthias Hertel, http://www.mathertel.de +// This work is licensed under a Creative Commons Attribution 2.0 Germany License. +// See http://creativecommons.org/licenses/by/2.0/de/ +// More information on: http://ajaxaspects.blogspot.com/ and http://ajaxaspekte.blogspot.com/ +// ----- +// 05.06.2005 created by Matthias Hertel. +// 19.06.2005 minor corrections to webservices. +// 25.06.2005 ajax action queue and timing. +// 02.07.2005 queue up actions fixed. +// 10.07.2005 ajax.timeout +// 10.07.2005 a option object that is passed from ajax.Start() to prepare() is also queued. +// 10.07.2005 a option object that is passed from ajax.Start() to prepare(), finish() +// and onException() is also queued. +// 12.07.2005 correct xml encoding when CallSoap() +// 20.07.2005 more datatypes and XML Documents +// 20.07.2005 more datatypes and XML Documents fixed +// 06.08.2005 caching implemented. +// 07.08.2005 bugs fixed, when queuing without a delay time. +// 04.09.2005 bugs fixed, when entering non-multiple actions. +// 07.09.2005 proxies.IsActive added +// 27.09.2005 fixed error in handling bool as a datatype +// 13.12.2005 WebServices with arrays on strings, ints, floats and booleans - still undocumented +// 27.12.2005 fixed: empty string return values enabled. +// 27.12.2005 enable the late binding of proxy methods. +// 21.01.2006 void return bug fixed. +// 18.02.2006 typo: Finsh -> Finish. +// 25.02.2006 better xmlhttp request object retrieval, see http://blogs.msdn.com/ie/archive/2006/01/23/516393.aspx +// 22.04.2006 progress indicator added. +// 28.01.2006 void return bug fixed again? +// 09.03.2006 enable late binding of prepare and finish methods by using an expression. +// 14.07.2006 Safari Browser Version 2.03/Mac OS X 10.4. compatibility: xNode.textContent || xNode.innerText || xNode.text || xNode.childNodes[0].nodeValue +// 10.08.2006 date to xml format fixed by Kars Veling +// 16.09.2006 .postUrl + +// ----- global variable for the proxies to webservices. ----- + +/// The root object for the proxies to webservices. +var proxies = new Object(); + +proxies.current = null; // the current active webservice call. +proxies.xmlhttp = null; // The current active xmlhttp object. + + +// ----- global variable for the ajax engine. ----- + +/// The root object for the ajax engine. +var ajax = new Object(); + +ajax.current = null; /// The current active AJAX action. +ajax.option = null; /// The options for the current active AJAX action. + +ajax.queue = new Array(); /// The pending AJAX actions. +ajax.options = new Array(); /// The options for the pending AJAX actions. + +ajax.timer = null; /// The timer for delayed actions. + +ajax.progress = false; /// show a progress indicator +ajax.progressTimer = null; /// a timer-object that help displaying the progress indicator not too often. + +// ----- AJAX engine and actions implementation ----- + +///Start an AJAX action by entering it into the queue +ajax.Start = function (action, options) { + ajax.Add(action, options); + // check if the action should start + if ((ajax.current == null) && (ajax.timer == null)) + ajax._next(false); +} // ajax.Start + + +///Start an AJAX action by entering it into the queue +ajax.Add = function (action, options) { + if (action == null) { + alert("ajax.Start: Argument action must be set."); + return; + } // if + + // enable the late binding of the methods by using a string that is evaluated. + if (typeof(action.call) == "string") action.call = eval(action.call); + if (typeof(action.prepare) == "string") action.prepare = eval(action.prepare); + if (typeof(action.finish) == "string") action.finish = eval(action.finish); + + if ((action.queueClear != null) && (action.queueClear == true)) { + ajax.queue = new Array(); + ajax.options = new Array(); + + } else if ((ajax.queue.length > 0) && ((action.queueMultiple == null) || (action.queueMultiple == false))) { + // remove existing action entries from the queue and clear a running timer + if ((ajax.timer != null) && (ajax.queue[0] == action)) { + window.clearTimeout(ajax.timer); + ajax.timer = null; + } // if + + var n = 0; + while (n < ajax.queue.length) { + if (ajax.queue[n] == action) { + ajax.queue.splice(n, 1); + ajax.options.splice(n, 1); + } else { + n++; + } // if + } // while + } // if + + if ((action.queueTop == null) || (action.queueTop == false)) { + // to the end. + ajax.queue.push(action); + ajax.options.push(options); + + } else { + // to the top + ajax.queue.unshift(action); + ajax.options.unshift(options); + } // if +} // ajax.Add + + +///Check, if the next AJAX action can start. +///This is an internal method that should not be called from external. +///for private use only. +ajax._next = function (forceStart) { + var ca = null // current action + var co = null // current opptions + var data = null; + + if (ajax.current != null) + return; // a call is active: wait more time + + if (ajax.timer != null) + return; // a call is pendig: wait more time + + if (ajax.queue.length == 0) + return; // nothing to do. + + ca = ajax.queue[0]; + co = ajax.options[0]; + if ((forceStart == true) || (ca.delay == null) || (ca.delay == 0)) { + // start top action + ajax.current = ca; + ajax.queue.shift(); + ajax.option = co; + ajax.options.shift(); + + // get the data + if (ca.prepare != null) + try { + data = ca.prepare(co); + } catch (ex) { } + + if (ca.call != null) { + ajax.StartProgress(); + + // start the call + ca.call.func = ajax.Finish; + ca.call.onException = ajax.Exception; + ca.call(data); + // start timeout timer + if (ca.timeout != null) + ajax.timer = window.setTimeout(ajax.Cancel, ca.timeout * 1000); + + } else if (ca.postUrl != null) { + // post raw data to URL + + } else { + // no call + ajax.Finish(data); + } // if + + } else { + // start a timer and wait + ajax.timer = window.setTimeout(ajax.EndWait, ca.delay); + } // if +} // ajax._next + + +///The delay time of an action is over. +ajax.EndWait = function() { + ajax.timer = null; + ajax._next(true); +} // ajax.EndWait + + +///The current action timed out. +ajax.Cancel = function() { + proxies.cancel(false); // cancel the current webservice call. + ajax.timer = null; + ajax.current = null; + ajax.option = null; + ajax.EndProgress(); + window.setTimeout(ajax._next, 200); // give some to time to cancel the http connection. +} // ajax.Cancel + + +///Finish an AJAX Action the normal way +ajax.Finish = function (data) { + // clear timeout timer if set + if (ajax.timer != null) { + window.clearTimeout(ajax.timer); + ajax.timer = null; + } // if + + // use the data + try { + if ((ajax.current != null) && (ajax.current.finish != null)) + ajax.current.finish(data, ajax.option); + } catch (ex) { } + // reset the running action + ajax.current = null; + ajax.option = null; + ajax.EndProgress(); + ajax._next(false) +} // ajax.Finish + + +///Finish an AJAX Action with an exception +ajax.Exception = function (ex) { + // use the data + if (ajax.current.onException != null) + ajax.current.onException(ex, ajax.option); + + // reset the running action + ajax.current = null; + ajax.option = null; + ajax.EndProgress(); +} // ajax.Exception + + +///Clear the current and all pending AJAX actions. +ajax.CancelAll = function () { + ajax.Cancel(); + // clear all pending AJAX actions in the queue. + ajax.queue = new Array(); + ajax.options = new Array(); +} // ajax.CancelAll + + +// ----- show or hide a progress indicator ----- + +// show a progress indicator if it takes longer... +ajax.StartProgress = function() { + ajax.progress = true; + if (ajax.progressTimer != null) + window.clearTimeout(ajax.progressTimer); + ajax.progressTimer = window.setTimeout(ajax.ShowProgress, 220); +} // ajax.StartProgress + + +// hide any progress indicator soon. +ajax.EndProgress = function () { + ajax.progress = false; + if (ajax.progressTimer != null) + window.clearTimeout(ajax.progressTimer); + ajax.progressTimer = window.setTimeout(ajax.ShowProgress, 20); +} // ajax.EndProgress + + +// this function is called by a timer to show or hide a progress indicator +ajax.ShowProgress = function() { + ajax.progressTimer = null; + var a = document.getElementById("AjaxProgressIndicator"); + + if (ajax.progress && (a != null)) { + // just display the existing object + a.style.top = document.documentElement.scrollTop + 2 + "px"; + a.style.display = ""; + + } else if (ajax.progress) { + + // find a relative link to the ajaxcore folder containing ajax.js + var path = "../ajaxcore/" + for (var n in document.scripts) { + s = document.scripts[n].src; + if ((s != null) && (s.length >= 7) && (s.substr(s.length -7).toLowerCase() == "ajax.js")) + path = s.substr(0,s.length -7); + } // for + + // create new standard progress object + a = document.createElement("div"); + a.id = "AjaxProgressIndicator"; + a.style.position = "absolute"; + a.style.right = "2px"; + a.style.top = document.documentElement.scrollTop + 2 + "px"; + a.style.width = "98px"; + a.style.height = "16px" + a.style.padding = "2px"; + a.style.verticalAlign = "bottom"; + a.style.backgroundColor="#51c77d"; + + a.innerHTML = " please wait..."; + document.body.appendChild(a); + + } else if (a) { + a.style.display="none"; + } // if +} // ajax.ShowProgress + + +// ----- simple http-POST server call ----- + +ajax.postData = function (url, data, func) { + var x = proxies._getXHR(); + + // enable cookieless sessions: + var cs = document.location.href.match(/\/\(.*\)\//); + if (cs != null) { + url = url.split('/'); + url[3] += cs[0].substr(0, cs[0].length-1); + url = url.join('/'); + } // if + + x.open("POST", url, (func != null)); + + if (func != null) { + // async call with xmlhttp-object as parameter + x.onreadystatechange = func; + x.send(data); + + } else { + // sync call + x.send(soap); + return(x.responseText); + } // if +} // ajax.postData + + +///Execute a soap call. +///Build the xml for the call of a soap method of a webservice +///and post it to the server. +proxies.callSoap = function (args) { + var p = args.callee; + var x = null; + + // check for existing cache-entry + if (p._cache != null) { + if ((p.params.length == 1) && (args.length == 1) && (p._cache[args[0]] != null)) { + if (p.func != null) { + p.func(p._cache[args[0]]); + return(null); + } else { + return(p._cache[args[0]]); + } // if + } else { + p._cachekey = args[0]; + }// if + } // if + + proxies.current = p; + x = proxies._getXHR(); + proxies.xmlhttp = x; + + // envelope start + var soap = "" + + "" + + "" + + "<" + p.fname + " xmlns='" + p.service.ns + "'>"; + + // parameters + for (n = 0; (n < p.params.length) && (n < args.length); n++) { + var val = args[n]; + var typ = p.params[n].split(':'); + + if ((typ.length == 1) || (typ[1] == "string")) { + val = String(args[n]).replace(/&/g, "&").replace(//g, ">"); + + } else if (typ[1] == "int") { + val = parseInt(args[n]); + } else if (typ[1] == "float") { + val = parseFloat(args[n]); + + } else if ((typ[1] == "x") && (typeof(args[n]) == "string")) { + val = args[n]; + + } else if ((typ[1] == "x") && (typeof(XMLSerializer) != "undefined")) { + val = (new XMLSerializer()).serializeToString(args[n].firstChild); + + } else if (typ[1] == "x") { + val = args[n].xml; + + } else if ((typ[1] == "bool") && (typeof(args[n]) == "string")) { + val = args[n].toLowerCase(); + + } else if (typ[1] == "bool") { + val = String(args[n]).toLowerCase(); + + } else if (typ[1] == "date") { + // calculate the xml format for datetime objects from a javascript date object + var s, ret; + ret = String(val.getFullYear()); + ret += "-"; + s = String(val.getMonth() + 1); + ret += (s.length == 1 ? "0" + s : s); + ret += "-"; + s = String(val.getDate()); + ret += (s.length == 1 ? "0" + s : s); + ret += "T"; + s = String(val.getHours()); + ret += (s.length == 1 ? "0" + s : s); + ret += ":"; + s = String(val.getMinutes()); + ret += (s.length == 1 ? "0" + s : s); + ret += ":"; + s = String(val.getSeconds()); + ret += (s.length == 1 ? "0" + s : s); + val = ret; + + } else if (typ[1] == "s[]") { + val = "" + args[n].join("") + ""; + + } else if (typ[1] == "int[]") { + val = "" + args[n].join("") + ""; + + } else if (typ[1] == "float[]") { + val = "" + args[n].join("") + ""; + + } else if (typ[1] == "bool[]") { + val = "" + args[n].join("") + ""; + + } // if + soap += "<" + typ[0] + ">" + val + "" + } // for + + // envelope end + soap += "" + + "" + + ""; + + // enable cookieless sessions: + var u = p.service.url; + var cs = document.location.href.match(/\/\(.*\)\//); + if (cs != null) { + u = p.service.url.split('/'); + u[3] += cs[0].substr(0, cs[0].length-1); + u = u.join('/'); + } // if + + x.open("POST", u, (p.func != null)); + x.setRequestHeader("SOAPAction", p.action); + x.setRequestHeader("Content-Type", "text/xml; charset=utf-8"); + + if (p.corefunc != null) { + // async call with xmlhttp-object as parameter + x.onreadystatechange = p.corefunc; + x.send(soap); + + } else if (p.func != null) { + // async call + x.onreadystatechange = proxies._response; + x.send(soap); + + } else { + // sync call + x.send(soap); + return(proxies._response()); + } // if +} // proxies.callSoap + + +// cancel the running webservice call. +// raise: set raise to false to prevent raising an exception +proxies.cancel = function(raise) { + var cc = proxies.current; + var cx = proxies.xmlhttp; + + if (raise == null) raise == true; + + if (proxies.xmlhttp != null) { + proxies.xmlhttp.onreadystatechange = function() { }; + proxies.xmlhttp.abort(); + if (raise && (proxies.current.onException != null)) + proxies.current.onException("WebService call was canceled.") + proxies.current = null; + proxies.xmlhttp = null; + } // if +} // proxies.cancel + + +// px is a proxies.service.func object ! +proxies.EnableCache = function (px) { + // attach an empty _cache object. + px._cache = new Object(); +} // proxies.EnableCache + + +// check, if a call is currently waiting for a result +proxies.IsActive = function () { + return(proxies.xmlhttp != null); +} // proxies.IsActive + + +///Callback method for a webservice call that dispatches the response to servive.func or service.onException. +///for private use only. +proxies._response = function () { + var ret = null; + var x = proxies.xmlhttp; + var cc = proxies.current; + var rtype = null; + + if ((cc.rtype.length > 0) && (cc.rtype[0] != null)) + rtype = cc.rtype[0].split(':'); + + if ((x != null) && (x.readyState == 4)) { + if (x.status == 200) { + var xNode = null; + + if (rtype != null) + xNode = x.responseXML.getElementsByTagName(rtype[0])[0]; + + if (xNode == null) { + ret = null; + + } else if (xNode.firstChild == null) { // 27.12.2005: empty string return values + ret = ((rtype.length == 1) || (rtype[1] == "string") ? "" : null); + + } else if ((rtype.length == 1) || (rtype[1] == "string")) { + ret = xNode.textContent || xNode.innerText || xNode.text || xNode.childNodes[0].nodeValue; + + } else if (rtype[1] == "bool") { + ret = xNode.textContent || xNode.innerText || xNode.text || xNode.childNodes[0].nodeValue; + ret = (ret == "true"); + + } else if (rtype[1] == "int") { + ret = xNode.textContent || xNode.innerText || xNode.text || xNode.childNodes[0].nodeValue; + ret = parseInt(ret); + + } else if (rtype[1] == "float") { + ret = xNode.textContent || xNode.innerText || xNode.text || xNode.childNodes[0].nodeValue; + ret = parseFloat(ret); + + } else if ((rtype[1] == "x") && (typeof(XMLSerializer) != "undefined")) { + ret = (new XMLSerializer()).serializeToString(xNode.firstChild); + ret = ajax._getXMLDOM(ret); + + } else if ((rtype[1] == "ds") && (typeof(XMLSerializer) != "undefined")) { + // ret = (new XMLSerializer()).serializeToString(xNode.firstChild.nextSibling.firstChild); + ret = (new XMLSerializer()).serializeToString(xNode); + ret = ajax._getXMLDOM(ret); + + } else if (rtype[1] == "x") { + ret = xNode.firstChild.xml; + ret = ajax._getXMLDOM(ret); + + } else if (rtype[1] == "ds") { +// ret = xNode.firstChild.nextSibling.firstChild.xml; + ret = xNode.xml; + ret = ajax._getXMLDOM(ret); + + } else if (rtype[1] == "s[]") { + // Array of strings + ret = new Array(); + xNode = xNode.firstChild; + while (xNode != null) { + ret.push(xNode.textContent || xNode.innerText || xNode.text || xNode.childNodes[0].nodeValue); + xNode = xNode.nextSibling; + } // while + + } else if (rtype[1] == "int[]") { + // Array of int + ret = new Array(); + xNode = xNode.firstChild; + while (xNode != null) { + ret.push(parseInt(xNode.textContent || xNode.innerText || xNode.text || xNode.childNodes[0].nodeValue)); + xNode = xNode.nextSibling; + } // while + + } else if (rtype[1] == "float[]") { + // Array of float + ret = new Array(); + xNode = xNode.firstChild; + while (xNode != null) { + ret.push(parseFloat(xNode.textContent || xNode.innerText || xNode.text || xNode.childNodes[0].nodeValue)); + xNode = xNode.nextSibling; + } // while + + } else if (rtype[1] == "bool[]") { + // Array of bool + ret = new Array(); + xNode = xNode.firstChild; + while (xNode != null) { + ret.push((xNode.textContent || xNode.innerText || xNode.text || xNode.childNodes[0].nodeValue).toLowerCase() == "true"); + xNode = xNode.nextSibling; + } // while + + } else { + ret = xNode.textContent || xNode.innerText || xNode.text || xNode.childNodes[0].nodeValue; + } // if + + // store to _cache + if ((cc._cache != null) && (cc._cachekey != null)) { + cc._cache[cc._cachekey] = ret; + cc._cachekey = null; + } // if + + proxies.xmlhttp = null; + proxies.current = null; + + if (cc.func == null) { + return(ret); // sync + } else { + cc.func(ret); // async + return(null); + } // if + + } else if (proxies.current.onException == null) { + // no exception + + } else { + // raise an exception + ret = new Error(); + + if (x.status == 404) { + ret.message = "The webservice could not be found."; + + } else if (x.status == 500) { + ret.name = "SoapException"; + var n = x.responseXML.documentElement.firstChild.firstChild.firstChild; + while (n != null) { + if (n.nodeName == "faultcode") ret.message = n.firstChild.nodeValue; + if (n.nodeName == "faultstring") ret.description = n.firstChild.nodeValue; + n = n.nextSibling; + } // while + + } else if ((x.status == 502) || (x.status == 12031)) { + ret.message = "The server could not be found."; + + } else { + // no classified response. + ret.message = "Result-Status:" + x.status + "\n" + x.responseText; + } // if + proxies.current.onException(ret); + } // if + + proxies.xmlhttp = null; + proxies.current = null; + } // if +} // proxies._response + + +///Callback method to show the result of a soap call in an alert box. +///To set up a debug output in an alert box use: +///proxies.service.method.corefunc = proxies.alertResult; +proxies.alertResult = function () { + var x = proxies.xmlhttp; + + if (x.readyState == 4) { + if (x.status == 200) { + if (x.responseXML.documentElement.firstChild.firstChild.firstChild == null) + alert("(no result)"); + else + alert(x.responseXML.documentElement.firstChild.firstChild.firstChild.firstChild.nodeValue); + + } else if (x.status == 404) { alert("Error!\n\nThe webservice could not be found."); + + } else if (x.status == 500) { + // a SoapException + var ex = new Error(); + ex.name = "SoapException"; + var n = x.responseXML.documentElement.firstChild.firstChild.firstChild; + while (n != null) { + if (n.nodeName == "faultcode") ex.message = n.firstChild.nodeValue; + if (n.nodeName == "faultstring") ex.description = n.firstChild.nodeValue; + n = n.nextSibling; + } // while + alert("The server threw an exception.\n\n" + ex.message + "\n\n" + ex.description); + + } else if (x.status == 502) { alert("Error!\n\nThe server could not be found."); + + } else { + // no classified response. + alert("Result-Status:" + x.status + "\n" + x.responseText); + } // if + + proxies.xmlhttp = null; + proxies.current = null; + } // if +} // proxies.alertResult + + +///Show all the details of the returned data of a webservice call. +///Use this method for debugging transmission problems. +///To set up a debug output in an alert box use: +///proxies.service.method.corefunc = proxies.alertResponseText; +proxies.alertResponseText = function () { + if (proxies.xmlhttp.readyState == 4) + alert("Status:" + proxies.xmlhttp.status + "\nRESULT:" + proxies.xmlhttp.responseText); +} // proxies.alertResponseText + + +///show the details about an exception. +proxies.alertException = function(ex) { + var s = "Exception:\n\n"; + + if (ex.constructor == String) { + s = ex; + } else { + if ((ex.name != null) && (ex.name != "")) + s += "Type: " + ex.name + "\n\n"; + + if ((ex.message != null) && (ex.message != "")) + s += "Message:\n" + ex.message + "\n\n"; + + if ((ex.description != null) && (ex.description != "") && (ex.message != ex.description)) + s += "Description:\n" + ex.description + "\n\n"; + } // if + alert(s); +} // proxies.alertException + + +///Get a browser specific implementation of the XMLHttpRequest object. +// from http://blogs.msdn.com/ie/archive/2006/01/23/516393.aspx +proxies._getXHR = function () { + var x = null; + if (window.XMLHttpRequest) { + // if IE7, Mozilla, Safari, etc: Use native object + x = new XMLHttpRequest() + + } else if (window.ActiveXObject) { + // ...otherwise, use the ActiveX control for IE5.x and IE6 + try { x = new ActiveXObject("Msxml2.XMLHTTP"); } catch (e) { } + if (x == null) + try { x = new ActiveXObject("Microsoft.XMLHTTP"); } catch (e) { } + } // if + return(x); +} // proxies._getXHR + + +///Get a browser specific implementation of the XMLDOM object, containing a XML document. +///the xml document as string. +ajax._getXMLDOM = function (xmlText) { + var obj = null; + + if ((document.implementation != null) && (typeof document.implementation.createDocument == "function")) { + // Gecko / Mozilla / Firefox + var parser = new DOMParser(); + obj = parser.parseFromString(xmlText, "text/xml"); + + } else { + // IE + try { + obj = new ActiveXObject("MSXML2.DOMDocument"); + } catch (e) { } + + if (obj == null) { + try { + obj = new ActiveXObject("Microsoft.XMLDOM"); + } catch (e) { } + } // if + + if (obj != null) { + obj.async = false; + obj.validateOnParse = false; + } // if + obj.loadXML(xmlText); + } // if + return(obj); +} // _getXMLDOM + + +///show the details of a javascript object. +///This helps a lot while developing and debugging. +function inspectObj(obj) { + var s = "InspectObj:"; + + if (obj == null) { + s = "(null)"; alert(s); return; + } else if (obj.constructor == String) { + s = "\"" + obj + "\""; + } else if (obj.constructor == Array) { + s += " _ARRAY"; + } else if (typeof(obj) == "function") { + s += " [function]" + obj; + + } else if ((typeof(XMLSerializer) != "undefined") && (obj.constructor == XMLDocument)) { + s = "[XMLDocument]:\n" + (new XMLSerializer()).serializeToString(obj.firstChild); + alert(s); return; + + } else if ((obj.constructor == null) && (typeof(obj) == "object") && (obj.xml != null)) { + s = "[XML]:\n" + obj.xml; + alert(s); return; + } + + for (p in obj) { + try { + if (obj[p] == null) { + s += "\n" + String(p) + " (...)"; + + } else if (typeof(obj[p]) == "function") { + s += "\n" + String(p) + " [function]"; + + } else if (obj[p].constructor == Array) { + s += "\n" + String(p) + " [ARRAY]: " + obj[p]; + for (n = 0; n < obj[p].length; n++) + s += "\n " + n + ": " + obj[p][n]; + + } else { + s += "\n" + String(p) + " [" + typeof(obj[p]) + "]: " + obj[p]; + } // if + } catch (e) { s+= e;} + } // for + alert(s); +} // inspectObj + +// ----- End ----- diff --git a/src/UmbracoUrlHandling/Umbraco/Webservices/codeEditorSave.asmx b/src/UmbracoUrlHandling/Umbraco/Webservices/codeEditorSave.asmx new file mode 100644 index 0000000..947a6fb --- /dev/null +++ b/src/UmbracoUrlHandling/Umbraco/Webservices/codeEditorSave.asmx @@ -0,0 +1 @@ +<%@ WebService Language="C#" CodeBehind="codeEditorSave.asmx.cs" Class="umbraco.presentation.webservices.codeEditorSave" %> diff --git a/src/UmbracoUrlHandling/Umbraco/Webservices/legacyAjaxCalls.asmx b/src/UmbracoUrlHandling/Umbraco/Webservices/legacyAjaxCalls.asmx new file mode 100644 index 0000000..5acc6e6 --- /dev/null +++ b/src/UmbracoUrlHandling/Umbraco/Webservices/legacyAjaxCalls.asmx @@ -0,0 +1 @@ +<%@ WebService Language="C#" CodeBehind="legacyAjaxCalls.asmx.cs" Class="umbraco.presentation.webservices.legacyAjaxCalls" %> diff --git a/src/UmbracoUrlHandling/Umbraco/Webservices/nodeSorter.asmx b/src/UmbracoUrlHandling/Umbraco/Webservices/nodeSorter.asmx new file mode 100644 index 0000000..ae09ffa --- /dev/null +++ b/src/UmbracoUrlHandling/Umbraco/Webservices/nodeSorter.asmx @@ -0,0 +1 @@ +<%@ WebService Language="C#" CodeBehind="nodeSorter.asmx.cs" Class="umbraco.presentation.webservices.nodeSorter" %> diff --git a/src/UmbracoUrlHandling/Umbraco/Webservices/progressStatus.asmx b/src/UmbracoUrlHandling/Umbraco/Webservices/progressStatus.asmx new file mode 100644 index 0000000..7b3eebc --- /dev/null +++ b/src/UmbracoUrlHandling/Umbraco/Webservices/progressStatus.asmx @@ -0,0 +1 @@ +<%@ WebService Language="c#" Codebehind="progressStatus.asmx.cs" Class="presentation.umbraco.webservices.progressStatus" %> diff --git a/src/UmbracoUrlHandling/Umbraco/Webservices/publication.asmx b/src/UmbracoUrlHandling/Umbraco/Webservices/publication.asmx new file mode 100644 index 0000000..a2ff9b7 --- /dev/null +++ b/src/UmbracoUrlHandling/Umbraco/Webservices/publication.asmx @@ -0,0 +1 @@ +<%@ WebService Language="c#" Codebehind="publication.asmx.cs" Class="umbraco.webservices.publication" %> diff --git a/src/UmbracoUrlHandling/Umbraco/Webservices/templates.asmx b/src/UmbracoUrlHandling/Umbraco/Webservices/templates.asmx new file mode 100644 index 0000000..4a6e4ee --- /dev/null +++ b/src/UmbracoUrlHandling/Umbraco/Webservices/templates.asmx @@ -0,0 +1 @@ +<%@ WebService Language="c#" Codebehind="templates.asmx.cs" Class="umbraco.webservices.templates" %> diff --git a/src/UmbracoUrlHandling/Umbraco/Webservices/trashcan.asmx b/src/UmbracoUrlHandling/Umbraco/Webservices/trashcan.asmx new file mode 100644 index 0000000..19c43da --- /dev/null +++ b/src/UmbracoUrlHandling/Umbraco/Webservices/trashcan.asmx @@ -0,0 +1 @@ +<%@ WebService Language="C#" CodeBehind="trashcan.asmx.cs" Class="umbraco.presentation.webservices.trashcan" %> diff --git a/src/UmbracoUrlHandling/Umbraco/Webservices/wsdl.xslt b/src/UmbracoUrlHandling/Umbraco/Webservices/wsdl.xslt new file mode 100644 index 0000000..9e3673c --- /dev/null +++ b/src/UmbracoUrlHandling/Umbraco/Webservices/wsdl.xslt @@ -0,0 +1,178 @@ + + + + + + + + + + + + + + // javascript proxy for SOAP based web services + // by Matthias Hertel + /* */ + + + + + + + proxies. = { + url: "", + ns: "" + } // proxies. + + + + + + + + + + + + + /* inputMessageName='', outputMessageName='' */ + + + /** */ + + proxies.. = function () { return(proxies.callSoap(arguments)); } + proxies...fname = ""; + proxies...service = proxies.; + proxies...action = "\"\""; + proxies...params = [ + + ]; + proxies...rtype = [ + + ]; + + + + + + + + + + + + "" + + + + "" + + + + ":int" + + + + ":float" + + + ":date" + + + + ":bool" + + + + + ":s[]" + + + ":int[]" + + + ":float[]" + + + ":bool[]" + + + + + + ":ds" + + + + + ":x" + + + "" + + + + + + + + + + + + + + , + + + + + + + + + + + + + , + + + + + + \ No newline at end of file diff --git a/src/UmbracoUrlHandling/Umbraco/Xslt/Templates/Breadcrumb.xslt b/src/UmbracoUrlHandling/Umbraco/Xslt/Templates/Breadcrumb.xslt new file mode 100644 index 0000000..b5cd15e --- /dev/null +++ b/src/UmbracoUrlHandling/Umbraco/Xslt/Templates/Breadcrumb.xslt @@ -0,0 +1,34 @@ + +]> + + + + + + + + + + + +
    + +
  • + + + +
  • +
    + +
  • + +
  • +
+
+
+
\ No newline at end of file diff --git a/src/UmbracoUrlHandling/Umbraco/Xslt/Templates/Clean.xslt b/src/UmbracoUrlHandling/Umbraco/Xslt/Templates/Clean.xslt new file mode 100644 index 0000000..3bdb71a --- /dev/null +++ b/src/UmbracoUrlHandling/Umbraco/Xslt/Templates/Clean.xslt @@ -0,0 +1,21 @@ + + ]> + + + + + + + + + + + + + + \ No newline at end of file diff --git a/src/UmbracoUrlHandling/Umbraco/Xslt/Templates/ListSubPagesAsThumbnails.xslt b/src/UmbracoUrlHandling/Umbraco/Xslt/Templates/ListSubPagesAsThumbnails.xslt new file mode 100644 index 0000000..cec76a1 --- /dev/null +++ b/src/UmbracoUrlHandling/Umbraco/Xslt/Templates/ListSubPagesAsThumbnails.xslt @@ -0,0 +1,33 @@ + + ]> + + + + + + + + + + +
+ + + + +
+
+
+
+ Photo(s) +
+
+ +
+ +
\ No newline at end of file diff --git a/src/UmbracoUrlHandling/Umbraco/Xslt/Templates/ListSubPagesByDateAndLimit.xslt b/src/UmbracoUrlHandling/Umbraco/Xslt/Templates/ListSubPagesByDateAndLimit.xslt new file mode 100644 index 0000000..f97111c --- /dev/null +++ b/src/UmbracoUrlHandling/Umbraco/Xslt/Templates/ListSubPagesByDateAndLimit.xslt @@ -0,0 +1,36 @@ + + ]> + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/src/UmbracoUrlHandling/Umbraco/Xslt/Templates/ListSubPagesByDocumentType.xslt b/src/UmbracoUrlHandling/Umbraco/Xslt/Templates/ListSubPagesByDocumentType.xslt new file mode 100644 index 0000000..628d415 --- /dev/null +++ b/src/UmbracoUrlHandling/Umbraco/Xslt/Templates/ListSubPagesByDocumentType.xslt @@ -0,0 +1,32 @@ + + ]> + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/src/UmbracoUrlHandling/Umbraco/Xslt/Templates/ListSubPagesByLevel.xslt b/src/UmbracoUrlHandling/Umbraco/Xslt/Templates/ListSubPagesByLevel.xslt new file mode 100644 index 0000000..9b4f5eb --- /dev/null +++ b/src/UmbracoUrlHandling/Umbraco/Xslt/Templates/ListSubPagesByLevel.xslt @@ -0,0 +1,32 @@ + + ]> + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/src/UmbracoUrlHandling/Umbraco/Xslt/Templates/ListSubPagesFromAChangableSource.xslt b/src/UmbracoUrlHandling/Umbraco/Xslt/Templates/ListSubPagesFromAChangableSource.xslt new file mode 100644 index 0000000..0bcf90d --- /dev/null +++ b/src/UmbracoUrlHandling/Umbraco/Xslt/Templates/ListSubPagesFromAChangableSource.xslt @@ -0,0 +1,33 @@ + + ]> + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/src/UmbracoUrlHandling/Umbraco/Xslt/Templates/ListSubPagesFromCurrentPage.xslt b/src/UmbracoUrlHandling/Umbraco/Xslt/Templates/ListSubPagesFromCurrentPage.xslt new file mode 100644 index 0000000..7fdff63 --- /dev/null +++ b/src/UmbracoUrlHandling/Umbraco/Xslt/Templates/ListSubPagesFromCurrentPage.xslt @@ -0,0 +1,29 @@ + + ]> + + + + + + + + + + + + + + \ No newline at end of file diff --git a/src/UmbracoUrlHandling/Umbraco/Xslt/Templates/ListThumbnailsFromCurrentPage.xslt b/src/UmbracoUrlHandling/Umbraco/Xslt/Templates/ListThumbnailsFromCurrentPage.xslt new file mode 100644 index 0000000..d1f598b --- /dev/null +++ b/src/UmbracoUrlHandling/Umbraco/Xslt/Templates/ListThumbnailsFromCurrentPage.xslt @@ -0,0 +1,31 @@ + + ]> + + + + + + + + + + + +
+ + + +
+
+
+
+
+ +
+ +
\ No newline at end of file diff --git a/src/UmbracoUrlHandling/Umbraco/Xslt/Templates/ListWholeStructureFromCurrentPage.xslt b/src/UmbracoUrlHandling/Umbraco/Xslt/Templates/ListWholeStructureFromCurrentPage.xslt new file mode 100644 index 0000000..c47b558 --- /dev/null +++ b/src/UmbracoUrlHandling/Umbraco/Xslt/Templates/ListWholeStructureFromCurrentPage.xslt @@ -0,0 +1,30 @@ + + ]> + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/src/UmbracoUrlHandling/Umbraco/Xslt/Templates/NavigationPrototype.xslt b/src/UmbracoUrlHandling/Umbraco/Xslt/Templates/NavigationPrototype.xslt new file mode 100644 index 0000000..4b14a68 --- /dev/null +++ b/src/UmbracoUrlHandling/Umbraco/Xslt/Templates/NavigationPrototype.xslt @@ -0,0 +1,40 @@ + + ]> + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/src/UmbracoUrlHandling/Umbraco/Xslt/Templates/RSSFeed.xslt b/src/UmbracoUrlHandling/Umbraco/Xslt/Templates/RSSFeed.xslt new file mode 100644 index 0000000..28b67d2 --- /dev/null +++ b/src/UmbracoUrlHandling/Umbraco/Xslt/Templates/RSSFeed.xslt @@ -0,0 +1,92 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + <?xml version="1.0" encoding="UTF-8"?> + + + + + <xsl:value-of select="$RSSTitle"/> + + + + + + + + umbraco + + + + en + + + + + + + + + + + + + + <xsl:value-of select="@nodeName"/> + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/src/UmbracoUrlHandling/Umbraco/Xslt/Templates/RelatedLinks.xslt b/src/UmbracoUrlHandling/Umbraco/Xslt/Templates/RelatedLinks.xslt new file mode 100644 index 0000000..58c54d7 --- /dev/null +++ b/src/UmbracoUrlHandling/Umbraco/Xslt/Templates/RelatedLinks.xslt @@ -0,0 +1,51 @@ + +]> + + + + + + + + + + + + + +
    + +
  • + + + _blank + + + + + + + + + + + + + + + +
  • +
    +
+ + + + +
+ +
\ No newline at end of file diff --git a/src/UmbracoUrlHandling/Umbraco/Xslt/Templates/Schema2/Breadcrumb.xslt b/src/UmbracoUrlHandling/Umbraco/Xslt/Templates/Schema2/Breadcrumb.xslt new file mode 100644 index 0000000..924cdb8 --- /dev/null +++ b/src/UmbracoUrlHandling/Umbraco/Xslt/Templates/Schema2/Breadcrumb.xslt @@ -0,0 +1,34 @@ + +]> + + + + + + + + + + + +
    + +
  • + + + +
  • +
    + +
  • + +
  • +
+
+
+
\ No newline at end of file diff --git a/src/UmbracoUrlHandling/Umbraco/Xslt/Templates/Schema2/Clean.xslt b/src/UmbracoUrlHandling/Umbraco/Xslt/Templates/Schema2/Clean.xslt new file mode 100644 index 0000000..3bdb71a --- /dev/null +++ b/src/UmbracoUrlHandling/Umbraco/Xslt/Templates/Schema2/Clean.xslt @@ -0,0 +1,21 @@ + + ]> + + + + + + + + + + + + + + \ No newline at end of file diff --git a/src/UmbracoUrlHandling/Umbraco/Xslt/Templates/Schema2/ListSubPagesAsThumbnails.xslt b/src/UmbracoUrlHandling/Umbraco/Xslt/Templates/Schema2/ListSubPagesAsThumbnails.xslt new file mode 100644 index 0000000..d2538ef --- /dev/null +++ b/src/UmbracoUrlHandling/Umbraco/Xslt/Templates/Schema2/ListSubPagesAsThumbnails.xslt @@ -0,0 +1,33 @@ + + ]> + + + + + + + + + + +
+ + + + +
+
+
+
+ Photo(s) +
+
+ +
+ +
\ No newline at end of file diff --git a/src/UmbracoUrlHandling/Umbraco/Xslt/Templates/Schema2/ListSubPagesByDateAndLimit.xslt b/src/UmbracoUrlHandling/Umbraco/Xslt/Templates/Schema2/ListSubPagesByDateAndLimit.xslt new file mode 100644 index 0000000..ef16f22 --- /dev/null +++ b/src/UmbracoUrlHandling/Umbraco/Xslt/Templates/Schema2/ListSubPagesByDateAndLimit.xslt @@ -0,0 +1,36 @@ + + ]> + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/src/UmbracoUrlHandling/Umbraco/Xslt/Templates/Schema2/ListSubPagesByDocumentType.xslt b/src/UmbracoUrlHandling/Umbraco/Xslt/Templates/Schema2/ListSubPagesByDocumentType.xslt new file mode 100644 index 0000000..87db20c --- /dev/null +++ b/src/UmbracoUrlHandling/Umbraco/Xslt/Templates/Schema2/ListSubPagesByDocumentType.xslt @@ -0,0 +1,32 @@ + + ]> + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/src/UmbracoUrlHandling/Umbraco/Xslt/Templates/Schema2/ListSubPagesByLevel.xslt b/src/UmbracoUrlHandling/Umbraco/Xslt/Templates/Schema2/ListSubPagesByLevel.xslt new file mode 100644 index 0000000..f8001ec --- /dev/null +++ b/src/UmbracoUrlHandling/Umbraco/Xslt/Templates/Schema2/ListSubPagesByLevel.xslt @@ -0,0 +1,32 @@ + + ]> + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/src/UmbracoUrlHandling/Umbraco/Xslt/Templates/Schema2/ListSubPagesFromAChangableSource.xslt b/src/UmbracoUrlHandling/Umbraco/Xslt/Templates/Schema2/ListSubPagesFromAChangableSource.xslt new file mode 100644 index 0000000..c67d06e --- /dev/null +++ b/src/UmbracoUrlHandling/Umbraco/Xslt/Templates/Schema2/ListSubPagesFromAChangableSource.xslt @@ -0,0 +1,33 @@ + + ]> + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/src/UmbracoUrlHandling/Umbraco/Xslt/Templates/Schema2/ListSubPagesFromCurrentPage.xslt b/src/UmbracoUrlHandling/Umbraco/Xslt/Templates/Schema2/ListSubPagesFromCurrentPage.xslt new file mode 100644 index 0000000..caf2907 --- /dev/null +++ b/src/UmbracoUrlHandling/Umbraco/Xslt/Templates/Schema2/ListSubPagesFromCurrentPage.xslt @@ -0,0 +1,29 @@ + + ]> + + + + + + + + + + + + + + \ No newline at end of file diff --git a/src/UmbracoUrlHandling/Umbraco/Xslt/Templates/Schema2/ListThumbnailsFromCurrentPage.xslt b/src/UmbracoUrlHandling/Umbraco/Xslt/Templates/Schema2/ListThumbnailsFromCurrentPage.xslt new file mode 100644 index 0000000..ffc5ae1 --- /dev/null +++ b/src/UmbracoUrlHandling/Umbraco/Xslt/Templates/Schema2/ListThumbnailsFromCurrentPage.xslt @@ -0,0 +1,31 @@ + + ]> + + + + + + + + + + + +
+ + + +
+
+
+
+
+ +
+ +
\ No newline at end of file diff --git a/src/UmbracoUrlHandling/Umbraco/Xslt/Templates/Schema2/ListWholeStructureFromCurrentPage.xslt b/src/UmbracoUrlHandling/Umbraco/Xslt/Templates/Schema2/ListWholeStructureFromCurrentPage.xslt new file mode 100644 index 0000000..2513ea9 --- /dev/null +++ b/src/UmbracoUrlHandling/Umbraco/Xslt/Templates/Schema2/ListWholeStructureFromCurrentPage.xslt @@ -0,0 +1,30 @@ + + ]> + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/src/UmbracoUrlHandling/Umbraco/Xslt/Templates/Schema2/NavigationPrototype.xslt b/src/UmbracoUrlHandling/Umbraco/Xslt/Templates/Schema2/NavigationPrototype.xslt new file mode 100644 index 0000000..dfd56c8 --- /dev/null +++ b/src/UmbracoUrlHandling/Umbraco/Xslt/Templates/Schema2/NavigationPrototype.xslt @@ -0,0 +1,40 @@ + + ]> + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/src/UmbracoUrlHandling/Umbraco/Xslt/Templates/Schema2/RSSFeed.xslt b/src/UmbracoUrlHandling/Umbraco/Xslt/Templates/Schema2/RSSFeed.xslt new file mode 100644 index 0000000..4606dbe --- /dev/null +++ b/src/UmbracoUrlHandling/Umbraco/Xslt/Templates/Schema2/RSSFeed.xslt @@ -0,0 +1,92 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + <?xml version="1.0" encoding="UTF-8"?> + + + + + <xsl:value-of select="$RSSTitle"/> + + + + + + + + umbraco + + + + en + + + + + + + + + + + + + + <xsl:value-of select="@nodeName"/> + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/src/UmbracoUrlHandling/Umbraco/Xslt/Templates/Schema2/RelatedLinks.xslt b/src/UmbracoUrlHandling/Umbraco/Xslt/Templates/Schema2/RelatedLinks.xslt new file mode 100644 index 0000000..ac9afe6 --- /dev/null +++ b/src/UmbracoUrlHandling/Umbraco/Xslt/Templates/Schema2/RelatedLinks.xslt @@ -0,0 +1,51 @@ + +]> + + + + + + + + + + + + + +
    + +
  • + + + _blank + + + + + + + + + + + + + + + +
  • +
    +
+ + + + +
+ +
\ No newline at end of file diff --git a/src/UmbracoUrlHandling/Umbraco/Xslt/Templates/Schema2/Sitemap.xslt b/src/UmbracoUrlHandling/Umbraco/Xslt/Templates/Schema2/Sitemap.xslt new file mode 100644 index 0000000..c786b92 --- /dev/null +++ b/src/UmbracoUrlHandling/Umbraco/Xslt/Templates/Schema2/Sitemap.xslt @@ -0,0 +1,42 @@ + + ]> + + + + + + + + + + +
+ + + +
+
+ + + + +
    +
  • + + + + + + + +
  • +
    +
+
+
+
\ No newline at end of file diff --git a/src/UmbracoUrlHandling/Umbraco/Xslt/Templates/Schema2/TablePrototype.xslt b/src/UmbracoUrlHandling/Umbraco/Xslt/Templates/Schema2/TablePrototype.xslt new file mode 100644 index 0000000..94bcd56 --- /dev/null +++ b/src/UmbracoUrlHandling/Umbraco/Xslt/Templates/Schema2/TablePrototype.xslt @@ -0,0 +1,54 @@ + + ]> + + + + + + + + + + + + + + + + + + + + + + + + + background-color: + + + background-color: + + + + + + + +
NameCreate DateCustom Property
+ + + + + + +
+ +
+ +
\ No newline at end of file diff --git a/src/UmbracoUrlHandling/Umbraco/Xslt/Templates/Sitemap.xslt b/src/UmbracoUrlHandling/Umbraco/Xslt/Templates/Sitemap.xslt new file mode 100644 index 0000000..092cb5e --- /dev/null +++ b/src/UmbracoUrlHandling/Umbraco/Xslt/Templates/Sitemap.xslt @@ -0,0 +1,42 @@ + + ]> + + + + + + + + + + +
+ + + +
+
+ + + + +
    +
  • + + + + + + + +
  • +
    +
+
+
+
\ No newline at end of file diff --git a/src/UmbracoUrlHandling/Umbraco/Xslt/Templates/TablePrototype.xslt b/src/UmbracoUrlHandling/Umbraco/Xslt/Templates/TablePrototype.xslt new file mode 100644 index 0000000..ce72b73 --- /dev/null +++ b/src/UmbracoUrlHandling/Umbraco/Xslt/Templates/TablePrototype.xslt @@ -0,0 +1,54 @@ + + ]> + + + + + + + + + + + + + + + + + + + + + + + + + background-color: + + + background-color: + + + + + + + +
NameCreate DateCustom Property
+ + + + + + +
+ +
+ +
\ No newline at end of file diff --git a/src/UmbracoUrlHandling/Umbraco/Xslt/Web.config b/src/UmbracoUrlHandling/Umbraco/Xslt/Web.config new file mode 100644 index 0000000..80182af --- /dev/null +++ b/src/UmbracoUrlHandling/Umbraco/Xslt/Web.config @@ -0,0 +1,18 @@ + + + + + + + + + + + + + + + + + + diff --git a/src/UmbracoUrlHandling/Umbraco/Xslt/macroGetCurrent.xsl b/src/UmbracoUrlHandling/Umbraco/Xslt/macroGetCurrent.xsl new file mode 100644 index 0000000..8793937 --- /dev/null +++ b/src/UmbracoUrlHandling/Umbraco/Xslt/macroGetCurrent.xsl @@ -0,0 +1,23 @@ + + + + + + + + + + + + + + + + + + + + + + diff --git a/src/UmbracoUrlHandling/Umbraco/Xslt/macroGetSubs.xsl b/src/UmbracoUrlHandling/Umbraco/Xslt/macroGetSubs.xsl new file mode 100644 index 0000000..2f4eb88 --- /dev/null +++ b/src/UmbracoUrlHandling/Umbraco/Xslt/macroGetSubs.xsl @@ -0,0 +1,38 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/src/UmbracoUrlHandling/Umbraco/Xslt/searchResult.xslt b/src/UmbracoUrlHandling/Umbraco/Xslt/searchResult.xslt new file mode 100644 index 0000000..1191412 --- /dev/null +++ b/src/UmbracoUrlHandling/Umbraco/Xslt/searchResult.xslt @@ -0,0 +1,32 @@ + + + + + +
    + +
  1. +

    + + + + + + + + + + Node Type: +

    +

    + Last updated on + +

    +
  2. + +
    +
+
+
diff --git a/src/UmbracoUrlHandling/Umbraco/Xslt/sqlNodeHierachy.xslt b/src/UmbracoUrlHandling/Umbraco/Xslt/sqlNodeHierachy.xslt new file mode 100644 index 0000000..50e0ade --- /dev/null +++ b/src/UmbracoUrlHandling/Umbraco/Xslt/sqlNodeHierachy.xslt @@ -0,0 +1,85 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + +<!DOCTYPE umbraco [ + <!ELEMENT nodes ANY> + <!ELEMENT node ANY> + <!ATTLIST node id ID #REQUIRED> +]> + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/src/UmbracoUrlHandling/Umbraco/assets/css/canvasdesigner.css b/src/UmbracoUrlHandling/Umbraco/assets/css/canvasdesigner.css new file mode 100644 index 0000000..3537f96 --- /dev/null +++ b/src/UmbracoUrlHandling/Umbraco/assets/css/canvasdesigner.css @@ -0,0 +1 @@ +@font-face{src:url('assets/fonts/helveticons/helveticons.eot')!important;src:url('assets/fonts/helveticons/helveticons.eot?#iefix') format('embedded-opentype'),url('assets/fonts/helveticons/helveticons.ttf') format('truetype'),url('assets/fonts/helveticons/helveticons.svg#icomoon') format('svg')!important}body{position:absolute;width:100%;width:calc(100% - 80px);height:100%;padding:0;padding-left:80px;margin:0;overflow:hidden;font-family:"Open Sans","Helvetica Neue",Helvetica,Arial,sans-serif;font-size:14px;line-height:20px;color:#343434;-webkit-transition:all .2s ease-in-out;-moz-transition:all .2s ease-in-out;transition:all .2s ease-in-out}h4{position:initial;display:block;padding:5px 10px;margin:0;font-size:16px;font-size:12px;font-weight:normal;color:#b3b3b3;text-transform:uppercase;background-color:#535353}h5{margin:0 0 6px 0;font-size:12px;color:#535353}ul{padding:0;margin:0;list-style:none}a,a:hover{color:#333;text-decoration:none}.right{display:inline-block;float:right}.left{display:inline-block;float:left}.leftOpen{padding-left:330px}.wait{display:block;width:100%;height:280px;background:center center url(../img/loader.gif) no-repeat}.btn-group{float:right;margin-right:10px}.btn{display:inline-block;padding:4px 12px;margin-bottom:0;font-size:14px;line-height:20px;color:#000;text-align:center;vertical-align:middle;cursor:pointer;background:#f2f2f2;border:1px solid #ccc;-webkit-border-radius:2px;-moz-border-radius:2px;border-radius:2px;-webkit-box-shadow:none;box-shadow:none}.btn-success{color:#fff;text-shadow:0 -1px 0 rgba(0,0,0,0.25);background-color:#53a93f;background-image:-moz-linear-gradient(top,#53a93f,#53a93f);background-image:-webkit-gradient(linear,0 0,0 100%,from(#53a93f),to(#53a93f));background-image:-webkit-linear-gradient(top,#53a93f,#53a93f);background-image:-o-linear-gradient(top,#53a93f,#53a93f);background-image:linear-gradient(to bottom,#53a93f,#53a93f);background-repeat:repeat-x;border-color:#53a93f #53a93f #38712a;border-color:rgba(0,0,0,0.1) rgba(0,0,0,0.1) rgba(0,0,0,0.25);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff53a93f',endColorstr='#ff53a93f',GradientType=0);filter:progid:DXImageTransform.Microsoft.gradient(enabled=false)}.btn-success:hover{color:#fff}.btn-group>.btn+.dropdown-toggle{-webkit-box-shadow:none;box-shadow:none}.btn-group>.btn+.btn{margin-left:-6px}.btn-group>.btn+.dropdown-toggle{padding-right:8px;padding-left:8px;-webkit-box-shadow:inset 1px 0 0 rgba(255,255,255,0.125),inset 0 1px 0 rgba(255,255,255,0.2),0 1px 2px rgba(0,0,0,0.05);-moz-box-shadow:inset 1px 0 0 rgba(255,255,255,0.125),inset 0 1px 0 rgba(255,255,255,0.2),0 1px 2px rgba(0,0,0,0.05);box-shadow:inset 1px 0 0 rgba(255,255,255,0.125),inset 0 1px 0 rgba(255,255,255,0.2),0 1px 2px rgba(0,0,0,0.05)}.btn-group>.btn:last-child,.btn-group>.dropdown-toggle{-webkit-border-top-right-radius:2px;border-top-right-radius:2px;-webkit-border-bottom-right-radius:2px;border-bottom-right-radius:2px;-moz-border-radius-topright:2px;-moz-border-radius-bottomright:2px}.caret{display:inline-block;width:0;height:0;margin-top:8px;margin-left:0;vertical-align:top;border-top:4px solid #fff;border-top:0;border-right:4px solid transparent;border-bottom:4px solid #fff;border-left:4px solid transparent;content:""}.dropdown-menu{position:absolute;top:auto;right:0;z-index:1000;display:block;float:left;min-width:160px;padding:5px 0;margin:-96px 10px 0 0;margin-bottom:1px;list-style:none;background-color:#fff;border:1px solid #ccc;border:1px solid rgba(0,0,0,0.2);-webkit-border-radius:6px;-moz-border-radius:6px;border-radius:6px;-webkit-box-shadow:0 5px 10px rgba(0,0,0,0.2);-moz-box-shadow:0 5px 10px rgba(0,0,0,0.2);box-shadow:0 5px 10px rgba(0,0,0,0.2);-webkit-background-clip:padding-box;-moz-background-clip:padding;background-clip:padding-box}.dropdown-menu>li>a{display:block;padding:3px 20px;clear:both;font-weight:normal;line-height:20px;color:#343434;white-space:nowrap;cursor:pointer}.dropdown-menu>li>a:hover,.dropdown-menu>li>a:focus,.dropdown-submenu:hover>a,.dropdown-submenu:focus>a{color:#000;background:#f8f8f8}#speechbubble{position:absolute;right:0;bottom:40px;left:0;z-index:9999;display:none;padding:0;margin:auto;margin-left:300px;text-align:left;background:0;border:0;border-bottom:0}#speechbubble p{position:relative;padding:8px 30px 8px 20px;margin:auto;margin-top:5px;font-size:12px;color:#fff;text-shadow:none;background-color:#46a546;border:0;border-color:transparent;border-radius:5px 0 0 5px}.more-options i{display:inline-block;width:5px!important;height:5px!important;margin:5px 1px 7px 0;background:#d9d9d9;border-radius:20px}.fix-left-menu{position:fixed;top:0;left:0;z-index:9999;width:80px;height:100%;padding:0;margin-left:-80px;font-family:"Lato",Helvetica,Arial,sans-serif;font-size:13px;line-height:16px;background:#413659;-webkit-transition:all .2s ease-in-out;-moz-transition:all .2s ease-in-out;transition:all .2s ease-in-out}.avatar{padding:27px 0 29px 0;text-align:center;border-bottom:1px solid #2e2246}.help{position:absolute;bottom:0;left:0;display:block;width:100%;margin:0;font-size:30px;color:#d8d7d9;text-align:center;opacity:.4;-webkit-transition:all .3s linear;-moz-transition:all .3s linear;transition:all .3s linear}ul.sections{position:absolute;top:90px;display:block;width:80px;height:100%;padding:0;margin:0;margin-left:-80px;list-style:none;background:#413659;-webkit-transition:all .2s ease-in-out;-moz-transition:all .2s ease-in-out;transition:all .2s ease-in-out}ul.sections li{display:block;border-left:4px #413659 solid;-webkit-transition:all .3s linear;-moz-transition:all .3s linear;transition:all .3s linear}.fix-left-menu ul.sections li a span,.fix-left-menu ul.sections li a i{color:#8d869b;-webkit-transition:all .3s linear;-moz-transition:all .3s linear;transition:all .3s linear}ul.sections li a{display:block;width:100%;height:100%;padding:20px 4px 15px 0;margin:0 0 0 -4px;text-align:center;text-decoration:none;border-bottom:1px solid #2e2246}ul.sections li a i{font-size:30px}ul.sections li a span{display:block;font-size:10px;line-height:1.4em;opacity:.4}ul.sections li.current{background-color:#2e2246}ul.sections li.current a i{color:#fff}ul.sections li.current,ul.sections li:hover{border-left:4px #00aea2 solid}.fix-left-menu:hover ul.sections li a span,.fix-left-menu:hover ul.sections li a i,.fix-left-menu:hover .help{opacity:1}.fix-left-menu.selected,.sections.selected{margin-left:0}.main-panel{position:fixed;top:0;left:0;z-index:999;width:250px;height:100%;padding:0;margin-left:-330px;font-family:"Helvetica Neue",Helvetica,Arial,sans-serif;font-size:13px;line-height:16px;background:#fff;-webkit-box-shadow:0 3px 7px rgba(0,0,0,0.3);-moz-box-shadow:0 3px 7px rgba(0,0,0,0.3);box-shadow:0 3px 7px rgba(0,0,0,0.3);-webkit-transition:all .2s ease-in-out;-moz-transition:all .2s ease-in-out;transition:all .2s ease-in-out}.main-panel .header{padding:28px 20px 32px 20px;font-weight:bold;background:#f8f8f8;border-bottom:1px solid #d9d9d9}.main-panel .header h3{margin:0;font-size:24px;color:rgba(179,179,179,0.49)}.main-panel .header h3 i{position:absolute;right:20px;cursor:pointer;-webkit-transition:all .2s ease-in-out;-moz-transition:all .2s ease-in-out;transition:all .2s ease-in-out}.main-panel .header h3 i:hover{color:#333}.main-panel.selected{position:absolute;right:0;bottom:0;left:0;margin-left:80px;overflow:auto}.main-panel .content{padding:20px 0}.float-panel{position:fixed;top:0;z-index:99;width:250px;height:100%;padding:0;padding:20px;margin-left:-480px;font-family:"Helvetica Neue",Helvetica,Arial,sans-serif;font-size:13px;line-height:16px;background:#fff;-webkit-box-shadow:0 3px 7px rgba(0,0,0,0.3);-moz-box-shadow:0 3px 7px rgba(0,0,0,0.3);box-shadow:0 3px 7px rgba(0,0,0,0.3);-webkit-transition:all .2s ease-in-out;-moz-transition:all .2s ease-in-out;transition:all .2s ease-in-out}.float-panel.selected{margin-left:0}.samples h4{position:initial;display:block;padding:5px 10px;margin:0;font-size:12px;font-weight:normal;border:0 solid #6b6b6b}.samples>li{padding:6px 20px;cursor:pointer}.samples>li:hover,.samples>li.hover{background:#f8f8f8}.samples>li ul{display:table;width:100%}.samples>li ul>li{display:table-cell;height:15px;padding:0}h4.panel-title{color:#767676;cursor:pointer;background-color:#f8f8f8}.editor-category{margin:5px 10px;border:1px solid #d9d9d9}.canvasdesigner-panel-container{padding:10px 10px}.canvasdesigner-panel-property{margin:0 0 10px 0;overflow:hidden;clear:both}.canvasdesigner .box-slider{padding:0 0 6px 0;overflow:hidden;clear:both}.field-title{float:left;margin-right:10px;font-size:12px;color:#d9d9d9}.div-field{margin-bottom:10px;overflow:hidden;clear:both}.fontFamilyPickerPreview{position:relative;float:left;width:90%;padding:8px;margin-top:4px;clear:both;font-size:18px;color:#cdcdcd;text-align:center;cursor:pointer;border:1px solid #cdcdcd}.fontFamilyPickerPreview span{font-size:32px;line-height:32px}.fontPickerDelete{position:absolute;top:0;right:0;margin:5px 0 0 -15px;color:#cdcdcd;cursor:pointer}.fontFamilyPickerPreview:hover{color:#979797;border:1px solid #979797}.fontFamilyPickerPreview:hover .fontPickerDelete{color:#979797}.canvasdesigner-fontfamilypicker{margin-bottom:30px}.canvasdesigner-fontfamilypicker select{padding:2px;font-size:12px}.canvasdesigner-fontfamilypicker select.font-list{width:170px}.canvasdesigner-fontfamilypicker select.variant-list{width:60px}.canvasdesigner-fontfamilypicker{margin-bottom:40px;font-size:42px;line-height:50px}.canvasdesigner .ui-widget-content{background:rgba(0,0,0,0.27)!important;border:0 solid #fff!important;border-radius:1px!important}.canvasdesigner .ui-slider-horizontal{margin:14px 11px 0 11px}.ui-widget-content .ui-state-default,.ui-widget-header .ui-state-default,.ui-state-hover,.ui-widget-content .ui-state-hover,.ui-widget-header .ui-state-hover,.ui-state-focus,.ui-widget-content .ui-state-focus,.ui-widget-header .ui-state-focus{background:#535353!important;background-color:none!important;border:1px solid #535353!important;outline:0}.canvasdesigner .ui-slider .ui-slider-handle:hover,.canvasdesigner .ui-slider .ui-slider-handle:focus{color:#d9d9d9!important}.canvasdesigner .ui-slider .ui-slider-handle span{position:absolute!important;display:block!important;width:30px!important;margin:-15px 0 0 -8px!important;font-size:9px!important;color:#535353!important;text-align:-webkit-center!important}.canvasdesigner .slider-input{float:right;width:25px;padding:0;margin-top:-9px;margin-right:1px;font-size:12px;color:#d9d9d9;text-align:right;background-color:transparent;border:0}@-moz-document url-prefix(){.canvasdesigner .slider-input{margin-top:-6px}}.canvasdesigner .sp-replacer{display:block;height:26px;padding:0;margin:0;border:0;border:1px solid #cdcdcd;border-radius:1px}.canvasdesigner .sp-replacer:hover{border:1px solid #979797}.canvasdesigner .panel-body{border-top:none!important}.canvasdesigner select{font-size:12px}.canvasdesigner .sp-dd{display:none}.canvasdesigner .sp-preview{display:block;width:100%;height:100%;margin-right:0;border:0}.canvasdesigner .color-picker-preview{height:26px;cursor:pointer;background:url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAwAAAAMCAIAAADZF8uwAAAAGUlEQVQYV2M4gwH+YwCGIasIUwhT25BVBADtzYNYrHvv4gAAAABJRU5ErkJggg==);border:1px solid #cdcdcd;border-radius:1px}.canvasdesigner .float-panel .sp-container.sp-flat{width:100%;padding:10px;background-color:transparent;border:0}.canvasdesigner .float-panel .sp-container.sp-flat .sp-picker-container{width:100%;padding:0;margin:0;margin-bottom:10px;border:0}.canvasdesigner .float-panel .sp-container.sp-flat .sp-palette-container{float:left;width:100%;height:32px;padding:0;margin:0;border:0}.canvasdesigner .float-panel .sp-container.sp-flat .sp-button-container{display:none}.colorPickerDelete{position:absolute;margin:-23px 0 0 0;cursor:pointer}.borderStyleSelect{display:inline-block;float:right;width:75px;height:28px}.desktop{width:100%;height:100%;margin:0 auto;overflow:hidden}.laptop{width:1366px;height:768px}.iPad-portrait{width:769px;height:929px}.iPad-landscape{width:1024px;height:675px}.smartphone-portrait{width:320px;height:504px}.smartphone-landscape{width:480px;height:256px}.border{margin:75px auto;background-color:#fff;border-radius:10px;opacity:1.0;box-shadow:0 0 0 29px #e9e9eb,0 0 0 30px #d8d7d9;transition:all .5s ease-in-out}iframe{top:0;right:0;bottom:0;left:0;width:100%;height:100%;overflow:hidden;overflow-x:hidden;overflow-y:hidden}.flip:before{-webkit-transform:rotate(90deg);-moz-transform:rotate(90deg);-o-transform:rotate(90deg)}.imagePickerPreview{height:20px;padding:6px 0 0 0;color:#cdcdcd;text-align:center;cursor:pointer;background-color:#fff;background-size:cover;border:1px solid #cdcdcd;border-radius:1px}.sp-clear-display{background-image:none!important}.imagePickerPreview:hover{border:1px solid #979797}.imagePickerPreview:hover i{color:#979797}.imagePickerPreview i{font-size:24px;color:#cdcdcd}.canvasdesignerImagePicker{padding:0;margin-top:10px;overflow:auto;text-align:left;list-style:none}.canvasdesignerImagePicker ul{padding:0;margin:0;margin-left:20px;list-style:none}.canvasdesignerImagePicker li{display:inline-block;margin-bottom:10px}.canvasdesignerImagePicker ul.media-items li{margin-right:20px}.canvasdesignerImagePicker .media-preview{position:relative;display:inline-block;width:91px;height:78px;cursor:pointer;background-position:center center;-webkit-background-size:cover;-moz-background-size:cover;-o-background-size:cover;background-size:cover;border:2px solid #f3f2f2}.canvasdesignerImagePicker .media-preview .folder{position:absolute;top:30px;left:0;width:100%;font-size:40px;color:gainsboro;text-align:center}.canvasdesignerImagePicker .media-preview .folder-name{margin-top:-5px;font-family:"Helvetica Neue",Helvetica,Arial,sans-serif;font-size:13px;line-height:0;color:grey}.canvasdesignerImagePicker .media-preview:hover,.media-preview.selected{border:2px solid #84b8f0}.canvasdesignerImagePicker .modal-dialog{width:618px;font-weight:normal}.bodyCanvasdesignerImagePicker .breadcrumb{margin-top:4px;margin-bottom:10px;font-size:16px;text-align:left}.bodyCanvasdesignerImagePicker .breadcrumb>li{display:inline}.breadcrumb{font-size:12px}.bodyCanvasdesignerImagePicker .breadcrumb>li a{cursor:pointer}.bodyCanvasdesignerImagePicker .breadcrumb input{padding:0;margin:-4px -4px}.bodyCanvasdesignerImagePicker .fileinput-button{position:absolute;top:10px;right:10px;font-size:19px}.bodyCanvasdesignerImagePicker input.input-media{position:absolute;top:0;right:0;margin:0;font-size:23px;cursor:pointer;opacity:0;filter:alpha(opacity=0);transform:translate(-300px,0) scale(4);direction:ltr}.bodyCanvasdesignerImagePicker .breadcrumb a.disabled,.bodyCanvasdesignerImagePicker .breadcrumb a.disabled:hover{color:grey;text-decoration:none;cursor:default}.canvasdesignerImagePicker h3{font-size:18px;color:#555}.box-preview{display:inline-block}.box-preview li{position:relative;display:inline-block;width:30px;height:30px;margin-right:6px;cursor:pointer;background-color:#535353;border:0;border-radius:1px}.box-preview li:last-child{margin-right:0}.box-preview li.selected{border-color:#53a93f!important}.box-preview li.border-all{width:18px;height:18px;margin-left:0;border:6px solid #b3b3b3}.box-preview li.border-left{width:24px;border-left:6px solid #b3b3b3}.box-preview li.border-right{width:24px;border-right:6px solid #b3b3b3}.box-preview li.border-top{height:24px;border-top:6px solid #b3b3b3}.box-preview li.border-bottom{height:24px;border-bottom:6px solid #b3b3b3}.bordereditor .color-picker-preview{display:inline-block;float:left;width:120px}.radius-top-left,.radius-top-right,.radius-bottom-left,.radius-bottom-right{position:absolute;display:block;width:7px;height:7px;background-color:#b3b3b3}.box-preview li.selected span{background-color:#53a93f}.radius-top-left{top:0;left:0}.radius-top-right{top:0;right:0}.radius-bottom-left{bottom:0;left:0}.radius-bottom-right{right:0;bottom:0}@font-face{font-family:'icomoon';font-style:normal;font-weight:normal;src:url('../fonts/helveticons/helveticons.eot');src:url('../fonts/helveticons/helveticons.eot?#iefix') format('embedded-opentype'),url('../fonts/helveticons/helveticons.ttf') format('truetype'),url('../fonts/helveticons/helveticons.svg#icomoon') format('svg')}[class^="icon-"],[class*=" icon-"]{*margin-right:.3em;font-family:icomoon;-webkit-font-smoothing:antialiased;font-style:normal;font-weight:normal;text-decoration:inherit}[class^="icon-"]:before,[class*=" icon-"]:before{display:inline-block;text-decoration:inherit;speak:none}i.large{font-size:32px}i.medium{font-size:24px}i.small{font-size:14px}.icon-zoom-out:before{content:"\e000"}.icon-truck:before{content:"\e001"}.icon-zoom-in:before{content:"\e002"}.icon-zip:before{content:"\e003"}.icon-axis-rotation:before{content:"\e004"}.icon-yen-bag:before{content:"\e005"}.icon-axis-rotation-2:before{content:"\e006"}.icon-axis-rotation-3:before{content:"\e007"}.icon-wrench:before{content:"\e008"}.icon-wine-glass:before{content:"\e009"}.icon-wrong:before{content:"\e00a"}.icon-windows:before{content:"\e00b"}.icon-window-sizes:before{content:"\e00c"}.icon-window-popin:before{content:"\e00d"}.icon-wifi:before{content:"\e00e"}.icon-width:before{content:"\e00f"}.icon-weight:before{content:"\e010"}.icon-war:before{content:"\e011"}.icon-wand:before{content:"\e012"}.icon-wallet:before{content:"\e013"}.icon-wall-plug:before{content:"\e014"}.icon-voice:before{content:"\e016"}.icon-video:before{content:"\e017"}.icon-vcard:before{content:"\e018"}.icon-utilities:before{content:"\e019"}.icon-users:before{content:"\e01a"}.icon-users-alt:before{content:"\e01b"}.icon-user:before{content:"\e01c"}.icon-user-glasses:before{content:"\e01d"}.icon-user-females:before{content:"\e01e"}.icon-user-females-alt:before{content:"\e01f"}.icon-user-female:before{content:"\e020"}.icon-usb:before{content:"\e021"}.icon-usb-connector:before{content:"\e022"}.icon-unlocked:before{content:"\e023"}.icon-universal:before{content:"\e024"}.icon-undo:before{content:"\e025"}.icon-umbrella:before{content:"\e026"}.icon-umb-deploy:before{content:"\e027"}.icon-umb-contour:before,.traycontour:before{content:"\e028"}.icon-umb-settings:before,.traysettings:before{content:"\e029"}.icon-umb-users:before,.trayuser:before,.trayusers:before{content:"\e02a"}.icon-umb-media:before,.traymedia:before{content:"\e02b"}.icon-umb-content:before,.traycontent:before{content:"\e02c"}.icon-umb-developer:before,.traydeveloper:before{content:"\e02d"}.icon-umb-members:before,.traymember:before{content:"\e015"}.icon-umb-translation:before,.traytranslation:before{content:"\e1fd"}.icon-tv:before{content:"\e02e"}.icon-tv-old:before{content:"\e02f"}.icon-trophy:before{content:"\e030"}.icon-tree:before{content:"\e031"}.icon-trash:before{content:"\e032"}.icon-trash-alt:before{content:"\e033"}.icon-trash-alt-2:before{content:"\e034"}.icon-train:before{content:"\e035"}.icon-trafic:before{content:"\e036"}.icon-traffic-alt:before{content:"\e037"}.icon-top:before{content:"\e038"}.icon-tools:before{content:"\e039"}.icon-timer:before{content:"\e03a"}.icon-time:before{content:"\e03b"}.icon-t-shirt:before{content:"\e03c"}.icon-tab-key:before{content:"\e03d"}.icon-tab:before{content:"\e03e"}.icon-tactics:before{content:"\e03f"}.icon-tag:before{content:"\e040"}.icon-tags:before{content:"\e041"}.icon-takeaway-cup:before{content:"\e042"}.icon-target:before{content:"\e043"}.icon-temperatrure-alt:before{content:"\e044"}.icon-temperature:before{content:"\e045"}.icon-terminal:before{content:"\e046"}.icon-theater:before{content:"\e047"}.icon-theif:before{content:"\e048"}.icon-thought-bubble:before{content:"\e049"}.icon-thumb-down:before{content:"\e04a"}.icon-thumb-up:before{content:"\e04b"}.icon-thumbnail-list:before{content:"\e04c"}.icon-thumbnails-small:before{content:"\e04d"}.icon-thumbnails:before{content:"\e04e"}.icon-ticket:before{content:"\e04f"}.icon-sync:before{content:"\e050"}.icon-sweatshirt:before{content:"\e051"}.icon-sunny:before{content:"\e052"}.icon-stream:before{content:"\e053"}.icon-store:before{content:"\e054"}.icon-stop:before{content:"\e055"}.icon-stop-hand:before{content:"\e056"}.icon-stop-alt:before{content:"\e057"}.icon-stamp:before{content:"\e058"}.icon-stacked-disks:before{content:"\e059"}.icon-ssd:before{content:"\e05a"}.icon-squiggly-line:before{content:"\e05b"}.icon-sprout:before{content:"\e05c"}.icon-split:before{content:"\e05d"}.icon-split-alt:before{content:"\e05e"}.icon-speed-gauge:before{content:"\e05f"}.icon-speaker:before{content:"\e060"}.icon-sound:before{content:"\e061"}.icon-spades:before{content:"\e062"}.icon-sound-waves:before{content:"\e063"}.icon-shipping-box:before{content:"\e064"}.icon-shipping:before{content:"\e065"}.icon-shoe:before{content:"\e066"}.icon-shopping-basket-alt-2:before{content:"\e067"}.icon-shopping-basket:before{content:"\e068"}.icon-shopping-basket-alt:before{content:"\e069"}.icon-shorts:before{content:"\e06a"}.icon-shuffle:before{content:"\e06b"}.icon-sience:before{content:"\e06c"}.icon-simcard:before{content:"\e06d"}.icon-single-note:before{content:"\e06e"}.icon-sitemap:before{content:"\e06f"}.icon-sleep:before{content:"\e070"}.icon-slideshow:before{content:"\e071"}.icon-smiley-inverted:before{content:"\e072"}.icon-smiley:before{content:"\e073"}.icon-snow:before{content:"\e074"}.icon-sound-low:before{content:"\e075"}.icon-sound-medium:before{content:"\e076"}.icon-sound-off:before{content:"\e077"}.icon-shift:before{content:"\e078"}.icon-shield:before{content:"\e079"}.icon-sharing-iphone:before{content:"\e07a"}.icon-share:before{content:"\e07b"}.icon-share-alt:before{content:"\e07c"}.icon-share-alt-2:before{content:"\e07d"}.icon-settings:before{content:"\e07e"}.icon-settings-alt:before{content:"\e07f"}.icon-settings-alt-2:before{content:"\e080"}.icon-server:before{content:"\e081"}.icon-server-alt:before{content:"\e082"}.icon-sensor:before{content:"\e083"}.icon-security-camera:before{content:"\e084"}.icon-search:before{content:"\e085"}.icon-scull:before{content:"\e086"}.icon-script:before{content:"\e087"}.icon-script-alt:before{content:"\e088"}.icon-screensharing:before{content:"\e089"}.icon-school:before{content:"\e08a"}.icon-scan:before{content:"\e08b"}.icon-refresh:before{content:"\e08c"}.icon-remote:before{content:"\e08d"}.icon-remove:before{content:"\e08e"}.icon-repeat-one:before{content:"\e08f"}.icon-repeat:before{content:"\e090"}.icon-resize:before{content:"\e091"}.icon-reply-arrow:before{content:"\e092"}.icon-return-to-top:before{content:"\e093"}.icon-right-double-arrow:before{content:"\e094"}.icon-road:before{content:"\e095"}.icon-roadsign:before{content:"\e096"}.icon-rocket:before{content:"\e097"}.icon-rss:before{content:"\e098"}.icon-ruler-alt:before{content:"\e099"}.icon-ruler:before{content:"\e09a"}.icon-sandbox-toys:before{content:"\e09b"}.icon-satellite-dish:before{content:"\e09c"}.icon-save:before{content:"\e09d"}.icon-safedial:before{content:"\e09e"}.icon-safe:before{content:"\e09f"}.icon-redo:before{content:"\e0a0"}.icon-printer-alt:before{content:"\e0a1"}.icon-planet:before{content:"\e0a2"}.icon-paste-in:before{content:"\e0a3"}.icon-os-x:before{content:"\e0a4"}.icon-navigation-left:before{content:"\e0a5"}.icon-message:before{content:"\e0a6"}.icon-lock:before{content:"\e0a7"}.icon-layers-alt:before{content:"\e0a8"}.icon-record:before{content:"\e0a9"}.icon-print:before{content:"\e0aa"}.icon-plane:before{content:"\e0ab"}.icon-partly-cloudy:before{content:"\e0ac"}.icon-ordered-list:before{content:"\e0ad"}.icon-navigation-last:before{content:"\e0ae"}.icon-message-unopened:before{content:"\e0af"}.icon-location-nearby:before{content:"\e0b0"}.icon-laptop:before{content:"\e0b1"}.icon-reception:before{content:"\e0b2"}.icon-price-yen:before{content:"\e0b3"}.icon-piracy:before{content:"\e0b4"}.icon-parental-control:before{content:"\e0b5"}.icon-operator:before{content:"\e0b6"}.icon-navigation-horizontal:before{content:"\e0b7"}.icon-message-open:before{content:"\e0b8"}.icon-lab:before{content:"\e0b9"}.icon-location-near-me:before{content:"\e0ba"}.icon-receipt-yen:before{content:"\e0bb"}.icon-price-pound:before{content:"\e0bc"}.icon-pin-location:before{content:"\e0bd"}.icon-parachute-drop:before{content:"\e0be"}.icon-old-phone:before{content:"\e0bf"}.icon-merge:before{content:"\e0c0"}.icon-navigation-first:before{content:"\e0c1"}.icon-locate:before{content:"\e0c2"}.icon-keyhole:before{content:"\e0c3"}.icon-receipt-pound:before{content:"\e0c4"}.icon-price-euro:before{content:"\e0c5"}.icon-piggy-bank:before{content:"\e0c6"}.icon-paper-plane:before{content:"\e0c7"}.icon-old-key:before{content:"\e0c8"}.icon-navigation-down:before{content:"\e0c9"}.icon-megaphone:before{content:"\e0ca"}.icon-loading:before{content:"\e0cb"}.icon-keychain:before{content:"\e0cc"}.icon-receipt-euro:before{content:"\e0cd"}.icon-price-dollar:before{content:"\e0ce"}.icon-pie-chart:before{content:"\e0cf"}.icon-paper-plane-alt:before{content:"\e0d0"}.icon-notepad:before{content:"\e0d1"}.icon-navigation-bottom:before{content:"\e0d2"}.icon-meeting:before{content:"\e0d3"}.icon-keyboard:before{content:"\e0d4"}.icon-load:before{content:"\e0d5"}.icon-receipt-dollar:before{content:"\e0d6"}.icon-previous:before{content:"\e0d7"}.icon-pictures:before{content:"\e0d8"}.icon-notepad-alt:before{content:"\e0d9"}.icon-paper-bag:before{content:"\e0da"}.icon-name-badge:before{content:"\e0db"}.icon-medicine:before{content:"\e0dc"}.icon-list:before{content:"\e0dd"}.icon-key:before{content:"\e0de"}.icon-receipt-alt:before{content:"\e0df"}.icon-previous-media:before{content:"\e0e0"}.icon-pictures-alt:before{content:"\e0e1"}.icon-pants:before{content:"\e0e2"}.icon-nodes:before{content:"\e0e3"}.icon-music:before{content:"\e0e4"}.icon-readonly:before{content:"\e0e5"}.icon-presentation:before{content:"\e0e6"}.icon-pictures-alt-2:before{content:"\e0e7"}.icon-pannel-close:before{content:"\e0e8"}.icon-next:before{content:"\e0e9"}.icon-multiple-windows:before{content:"\e0ea"}.icon-medical-emergency:before{content:"\e0eb"}.icon-medal:before{content:"\e0ec"}.icon-link:before{content:"\e0ed"}.icon-linux-tux:before{content:"\e0ee"}.icon-junk:before{content:"\e0ef"}.icon-item-arrangement:before{content:"\e0f0"}.icon-iphone:before{content:"\e0f1"}.icon-lightning:before{content:"\e0f2"}.icon-map:before{content:"\e0f3"}.icon-multiple-credit-cards:before{content:"\e0f4"}.icon-next-media:before{content:"\e0f5"}.icon-panel-show:before{content:"\e0f6"}.icon-picture:before{content:"\e0f7"}.icon-power:before{content:"\e0f8"}.icon-re-post:before{content:"\e0f9"}.icon-rate:before{content:"\e0fa"}.icon-rain:before{content:"\e0fb"}.icon-radio:before{content:"\e0fc"}.icon-radio-receiver:before{content:"\e0fd"}.icon-radio-alt:before{content:"\e0fe"}.icon-quote:before{content:"\e0ff"}.icon-qr-code:before{content:"\e100"}.icon-pushpin:before{content:"\e101"}.icon-pulse:before{content:"\e102"}.icon-projector:before{content:"\e103"}.icon-play:before{content:"\e104"}.icon-playing-cards:before{content:"\e105"}.icon-playlist:before{content:"\e106"}.icon-plugin:before{content:"\e107"}.icon-podcast:before{content:"\e108"}.icon-poker-chip:before{content:"\e109"}.icon-poll:before{content:"\e10a"}.icon-post-it:before{content:"\e10b"}.icon-pound-bag:before{content:"\e10c"}.icon-power-outlet:before{content:"\e10d"}.icon-photo-album:before{content:"\e10e"}.icon-phone:before{content:"\e10f"}.icon-phone-ring:before{content:"\e110"}.icon-people:before{content:"\e111"}.icon-people-female:before{content:"\e112"}.icon-people-alt:before{content:"\e113"}.icon-people-alt-2:before{content:"\e114"}.icon-pc:before{content:"\e115"}.icon-pause:before{content:"\e116"}.icon-path:before{content:"\e117"}.icon-out:before{content:"\e118"}.icon-outbox:before{content:"\e119"}.icon-outdent:before{content:"\e11a"}.icon-page-add:before{content:"\e11b"}.icon-page-down:before{content:"\e11c"}.icon-page-remove:before{content:"\e11d"}.icon-page-restricted:before{content:"\e11e"}.icon-page-up:before{content:"\e11f"}.icon-paint-roller:before{content:"\e120"}.icon-palette:before{content:"\e121"}.icon-newspaper:before{content:"\e122"}.icon-newspaper-alt:before{content:"\e123"}.icon-network-alt:before{content:"\e124"}.icon-navigational-arrow:before{content:"\e125"}.icon-navigation:before{content:"\e126"}.icon-navigation-vertical:before{content:"\e127"}.icon-navigation-up:before{content:"\e128"}.icon-navigation-top:before{content:"\e129"}.icon-navigation-road:before{content:"\e12a"}.icon-navigation-right:before{content:"\e12b"}.icon-microscope:before{content:"\e12c"}.icon-mindmap:before{content:"\e12d"}.icon-molecular-network:before{content:"\e12e"}.icon-molecular:before{content:"\e12f"}.icon-mountain:before{content:"\e130"}.icon-mouse-cursor:before{content:"\e131"}.icon-mouse:before{content:"\e132"}.icon-movie-alt:before{content:"\e133"}.icon-map-marker:before{content:"\e134"}.icon-movie:before{content:"\e135"}.icon-map-location:before{content:"\e136"}.icon-map-alt:before{content:"\e137"}.icon-male-symbol:before{content:"\e138"}.icon-male-and-female:before{content:"\e139"}.icon-mailbox:before{content:"\e13a"}.icon-magnet:before{content:"\e13b"}.icon-loupe:before{content:"\e13c"}.icon-mobile:before{content:"\e13d"}.icon-logout:before{content:"\e13e"}.icon-log-out:before{content:"\e13f"}.icon-layers:before{content:"\e140"}.icon-left-double-arrow:before{content:"\e141"}.icon-layout:before{content:"\e142"}.icon-legal:before{content:"\e143"}.icon-lense:before{content:"\e144"}.icon-library:before{content:"\e145"}.icon-light-down:before{content:"\e146"}.icon-light-up:before{content:"\e147"}.icon-lightbulb-active:before{content:"\e148"}.icon-lightbulb:before{content:"\e149"}.icon-ipad:before{content:"\e14a"}.icon-invoice:before{content:"\e14b"}.icon-info:before{content:"\e14c"}.icon-infinity:before{content:"\e14d"}.icon-indent:before{content:"\e14e"}.icon-inbox:before{content:"\e14f"}.icon-inbox-full:before{content:"\e150"}.icon-inactive-line:before{content:"\e151"}.icon-imac:before{content:"\e152"}.icon-hourglass:before{content:"\e153"}.icon-home:before{content:"\e154"}.icon-grid:before{content:"\e155"}.icon-food:before{content:"\e156"}.icon-favorite:before{content:"\e157"}.icon-door-open-alt:before{content:"\e158"}.icon-diagnostics:before{content:"\e159"}.icon-contrast:before{content:"\e15a"}.icon-coins-dollar-alt:before{content:"\e15b"}.icon-circle-dotted-active:before{content:"\e15c"}.icon-cinema:before{content:"\e15d"}.icon-chip:before{content:"\e15e"}.icon-chip-alt:before{content:"\e15f"}.icon-chess:before{content:"\e160"}.icon-checkbox:before{content:"\e161"}.icon-checkbox-empty:before{content:"\e162"}.icon-checkbox-dotted:before{content:"\e163"}.icon-checkbox-dotted-active:before{content:"\e164"}.icon-check:before{content:"\e165"}.icon-chat:before{content:"\e166"}.icon-chat-active:before{content:"\e167"}.icon-chart:before{content:"\e168"}.icon-chart-curve:before{content:"\e169"}.icon-certificate:before{content:"\e16a"}.icon-categories:before{content:"\e16b"}.icon-cash-register:before{content:"\e16c"}.icon-car:before{content:"\e16d"}.icon-caps-lock:before{content:"\e16e"}.icon-candy:before{content:"\e16f"}.icon-circle-dotted:before{content:"\e170"}.icon-circuits:before{content:"\e171"}.icon-circus:before{content:"\e172"}.icon-client:before{content:"\e173"}.icon-clothes-hanger:before{content:"\e174"}.icon-cloud-drive:before{content:"\e175"}.icon-cloud-upload:before{content:"\e176"}.icon-cloud:before{content:"\e177"}.icon-cloudy:before{content:"\e178"}.icon-clubs:before{content:"\e179"}.icon-cocktail:before{content:"\e17a"}.icon-code:before{content:"\e17b"}.icon-coffee:before{content:"\e17c"}.icon-coin-dollar:before{content:"\e17d"}.icon-coin-pound:before{content:"\e17e"}.icon-coin-yen:before{content:"\e17f"}.icon-coin:before{content:"\e180"}.icon-coins-alt:before{content:"\e181"}.icon-console:before{content:"\e182"}.icon-connection:before{content:"\e183"}.icon-compress:before{content:"\e184"}.icon-company:before{content:"\e185"}.icon-command:before{content:"\e186"}.icon-coin-euro:before{content:"\e187"}.icon-combination-lock:before{content:"\e188"}.icon-combination-lock-open:before{content:"\e189"}.icon-comb:before{content:"\e18a"}.icon-columns:before{content:"\e18b"}.icon-colorpicker:before{content:"\e18c"}.icon-color-bucket:before{content:"\e18d"}.icon-coins:before{content:"\e18e"}.icon-coins-yen:before{content:"\e18f"}.icon-coins-yen-alt:before{content:"\e190"}.icon-coins-pound:before{content:"\e191"}.icon-coins-pound-alt:before{content:"\e192"}.icon-coins-euro:before{content:"\e193"}.icon-coins-euro-alt:before{content:"\e194"}.icon-coins-dollar:before{content:"\e195"}.icon-conversation-alt:before{content:"\e196"}.icon-conversation:before{content:"\e197"}.icon-coverflow:before{content:"\e198"}.icon-credit-card-alt:before{content:"\e199"}.icon-credit-card:before{content:"\e19a"}.icon-crop:before{content:"\e19b"}.icon-crosshair:before{content:"\e19c"}.icon-crown-alt:before{content:"\e19d"}.icon-crown:before{content:"\e19e"}.icon-cupcake:before{content:"\e19f"}.icon-curve:before{content:"\e1a0"}.icon-cut:before{content:"\e1a1"}.icon-dashboard:before{content:"\e1a2"}.icon-defrag:before{content:"\e1a3"}.icon-delete:before{content:"\e1a4"}.icon-delete-key:before{content:"\e1a5"}.icon-departure:before{content:"\e1a6"}.icon-desk:before{content:"\e1a7"}.icon-desktop:before{content:"\e1a8"}.icon-donate:before{content:"\e1a9"}.icon-dollar-bag:before{content:"\e1aa"}.icon-documents:before{content:"\e1ab"}.icon-document:before{content:"\e1ac"}.icon-document-dashed-line:before{content:"\e1ad"}.icon-dock-connector:before{content:"\e1ae"}.icon-dna:before{content:"\e1af"}.icon-display:before{content:"\e1b0"}.icon-disk-image:before{content:"\e1b1"}.icon-disc:before{content:"\e1b2"}.icon-directions:before{content:"\e1b3"}.icon-directions-alt:before{content:"\e1b4"}.icon-diploma:before{content:"\e1b5"}.icon-diploma-alt:before{content:"\e1b6"}.icon-dice:before{content:"\e1b7"}.icon-diamonds:before{content:"\e1b8"}.icon-diamond:before{content:"\e1b9"}.icon-diagonal-arrow:before{content:"\e1ba"}.icon-diagonal-arrow-alt:before{content:"\e1bb"}.icon-door-open:before{content:"\e1bc"}.icon-download-alt:before{content:"\e1bd"}.icon-download:before{content:"\e1be"}.icon-drop:before{content:"\e1bf"}.icon-eco:before{content:"\e1c0"}.icon-economy:before{content:"\e1c1"}.icon-edit:before{content:"\e1c2"}.icon-eject:before{content:"\e1c3"}.icon-employee:before{content:"\e1c4"}.icon-energy-saving-bulb:before{content:"\e1c5"}.icon-enter:before{content:"\e1c6"}.icon-equalizer:before{content:"\e1c7"}.icon-escape:before{content:"\e1c8"}.icon-ethernet:before{content:"\e1c9"}.icon-euro-bag:before{content:"\e1ca"}.icon-exit-fullscreen:before{content:"\e1cb"}.icon-eye:before{content:"\e1cc"}.icon-facebook-like:before{content:"\e1cd"}.icon-factory:before{content:"\e1ce"}.icon-font:before{content:"\e1cf"}.icon-folders:before{content:"\e1d0"}.icon-folder:before,.icon-folder-close:before{content:"\e1d1"}.icon-folder-outline:before{content:"\e1d2"}.icon-folder-open:before{content:"\e1d3"}.icon-flowerpot:before{content:"\e1d4"}.icon-flashlight:before{content:"\e1d5"}.icon-flash:before{content:"\e1d6"}.icon-flag:before{content:"\e1d7"}.icon-flag-alt:before{content:"\e1d8"}.icon-firewire:before{content:"\e1d9"}.icon-firewall:before{content:"\e1da"}.icon-fire:before{content:"\e1db"}.icon-fingerprint:before{content:"\e1dc"}.icon-filter:before{content:"\e1dd"}.icon-filter-arrows:before{content:"\e1de"}.icon-files:before{content:"\e1df"}.icon-file-cabinet:before{content:"\e1e0"}.icon-female-symbol:before{content:"\e1e1"}.icon-footprints:before{content:"\e1e2"}.icon-hammer:before{content:"\e1e3"}.icon-hand-active-alt:before{content:"\e1e4"}.icon-forking:before{content:"\e1e5"}.icon-hand-active:before{content:"\e1e6"}.icon-hand-pointer-alt:before{content:"\e1e7"}.icon-hand-pointer:before{content:"\e1e8"}.icon-handprint:before{content:"\e1e9"}.icon-handshake:before{content:"\e1ea"}.icon-handtool:before{content:"\e1eb"}.icon-hard-drive:before{content:"\e1ec"}.icon-help:before{content:"\e1ed"}.icon-graduate:before{content:"\e1ee"}.icon-gps:before{content:"\e1ef"}.icon-help-alt:before{content:"\e1f0"}.icon-height:before{content:"\e1f1"}.icon-globe:before{content:"\e1f2"}.icon-hearts:before{content:"\e1f3"}.icon-globe-inverted-europe-africa:before{content:"\e1f4"}.icon-headset:before{content:"\e1f5"}.icon-globe-inverted-asia:before{content:"\e1f6"}.icon-headphones:before{content:"\e1f7"}.icon-globe-inverted-america:before{content:"\e1f8"}.icon-hd:before{content:"\e1f9"}.icon-globe-europe-africa:before,.icon-globe-europe---africa:before{content:"\e1fa"}.icon-hat:before{content:"\e1fb"}.icon-globe-asia:before{content:"\e1fc"}.icon-globe-alt:before{content:"\e1fd"}.icon-hard-drive-alt:before{content:"\e1fe"}.icon-glasses:before{content:"\e1ff"}.icon-gift:before{content:"\e200"}.icon-handtool-alt:before{content:"\e201"}.icon-geometry:before{content:"\e202"}.icon-game:before{content:"\e203"}.icon-fullscreen:before{content:"\e204"}.icon-fullscreen-alt:before{content:"\e205"}.icon-frame:before{content:"\e206"}.icon-frame-alt:before{content:"\e207"}.icon-camera-roll:before{content:"\e208"}.icon-bookmark:before{content:"\e209"}.icon-bill:before{content:"\e20a"}.icon-baby-stroller:before{content:"\e20b"}.icon-alarm-clock:before{content:"\e20c"}.icon-adressbook:before{content:"\e20d"}.icon-add:before{content:"\e20e"}.icon-activity:before{content:"\e20f"}.icon-untitled:before{content:"\e210"}.icon-glasses:before{content:"\e211"}.icon-camcorder:before{content:"\e212"}.icon-calendar:before{content:"\e213"}.icon-calendar-alt:before{content:"\e214"}.icon-calculator:before{content:"\e215"}.icon-bus:before{content:"\e216"}.icon-burn:before{content:"\e217"}.icon-bulleted-list:before{content:"\e218"}.icon-bug:before{content:"\e219"}.icon-brush:before{content:"\e21a"}.icon-brush-alt:before{content:"\e21b"}.icon-brush-alt-2:before{content:"\e21c"}.icon-browser-window:before{content:"\e21d"}.icon-briefcase:before{content:"\e21e"}.icon-brick:before{content:"\e21f"}.icon-brackets:before{content:"\e220"}.icon-box:before{content:"\e221"}.icon-box-open:before{content:"\e222"}.icon-box-alt:before{content:"\e223"}.icon-books:before{content:"\e224"}.icon-billboard:before{content:"\e225"}.icon-bills-dollar:before{content:"\e226"}.icon-bills-euro:before{content:"\e227"}.icon-bills-pound:before{content:"\e228"}.icon-bills-yen:before{content:"\e229"}.icon-bills:before{content:"\e22a"}.icon-binarycode:before{content:"\e22b"}.icon-binoculars:before{content:"\e22c"}.icon-bird:before{content:"\e22d"}.icon-birthday-cake:before{content:"\e22e"}.icon-blueprint:before{content:"\e22f"}.icon-block:before{content:"\e230"}.icon-bluetooth:before{content:"\e231"}.icon-boat-shipping:before{content:"\e232"}.icon-bomb:before{content:"\e233"}.icon-book-alt-2:before{content:"\e234"}.icon-bones:before{content:"\e235"}.icon-book-alt:before{content:"\e236"}.icon-book:before{content:"\e237"}.icon-bill-yen:before{content:"\e238"}.icon-award:before{content:"\e239"}.icon-bill-pound:before{content:"\e23a"}.icon-autofill:before{content:"\e23b"}.icon-bill-euro:before{content:"\e23c"}.icon-auction-hammer:before{content:"\e23d"}.icon-bill-dollar:before{content:"\e23e"}.icon-attachment:before{content:"\e23f"}.icon-bell:before{content:"\e240"}.icon-article:before{content:"\e241"}.icon-bell-off:before{content:"\e242"}.icon-art-easel:before{content:"\e243"}.icon-beer-glass:before{content:"\e244"}.icon-arrow-up:before{content:"\e245"}.icon-battery-low:before{content:"\e246"}.icon-arrow-right:before{content:"\e247"}.icon-battery-full:before{content:"\e248"}.icon-arrow-left:before{content:"\e249"}.icon-bars:before{content:"\e24a"}.icon-arrow-down:before{content:"\e24b"}.icon-barcode:before{content:"\e24c"}.icon-arrivals:before{content:"\e24d"}.icon-bar-chart:before{content:"\e24e"}.icon-application-window:before{content:"\e24f"}.icon-band-aid:before{content:"\e250"}.icon-application-window-alt:before{content:"\e251"}.icon-ball:before{content:"\e252"}.icon-application-error:before{content:"\e253"}.icon-badge-restricted:before{content:"\e254"}.icon-app:before{content:"\e255"}.icon-badge-remove:before{content:"\e256"}.icon-anchor:before{content:"\e257"}.icon-badge-count:before{content:"\e258"}.icon-alt:before{content:"\e259"}.icon-badge-add:before{content:"\e25a"}.icon-alert:before{content:"\e25b"}.icon-backspace:before{content:"\e25c"}.icon-alert-alt:before{content:"\e25d"} \ No newline at end of file diff --git a/src/UmbracoUrlHandling/Umbraco/assets/css/installer.css b/src/UmbracoUrlHandling/Umbraco/assets/css/installer.css new file mode 100644 index 0000000..51b5af5 --- /dev/null +++ b/src/UmbracoUrlHandling/Umbraco/assets/css/installer.css @@ -0,0 +1 @@ +@font-face{font-family:'Lato';font-style:normal;font-weight:900;src:url('../fonts/lato/LatoLatin-Black.eot');src:url('../fonts/lato/LatoLatin-Black.eot?#iefix') format('embedded-opentype'),url('../fonts/lato/LatoLatin-Black.ttf') format('truetype');text-rendering:optimizeLegibility}@font-face{font-family:'Lato';font-style:italic;font-weight:900;src:url('../fonts/lato/LatoLatin-BlackItalic.eot');src:url('../fonts/lato/LatoLatin-BlackItalic.eot?#iefix') format('embedded-opentype'),url('../fonts/lato/LatoLatin-BlackItalic.ttf') format('truetype');text-rendering:optimizeLegibility}@font-face{font-family:'Lato';font-style:normal;font-weight:bold;src:url('../fonts/lato/LatoLatin-Bold.eot');src:url('../fonts/lato/LatoLatin-Bold.eot?#iefix') format('embedded-opentype'),url('../fonts/lato/LatoLatin-Bold.ttf') format('truetype');text-rendering:optimizeLegibility}@font-face{font-family:'Lato';font-style:italic;font-weight:bold;src:url('../fonts/lato/LatoLatin-BoldItalic.eot');src:url('../fonts/lato/LatoLatin-BoldItalic.eot?#iefix') format('embedded-opentype'),url('../fonts/lato/LatoLatin-BoldItalic.ttf') format('truetype');text-rendering:optimizeLegibility}@font-face{font-family:'Lato';font-style:italic;font-weight:normal;src:url('../fonts/lato/LatoLatin-Italic.eot');src:url('../fonts/lato/LatoLatin-Italic.eot?#iefix') format('embedded-opentype'),url('../fonts/lato/LatoLatin-Italic.ttf') format('truetype');text-rendering:optimizeLegibility}@font-face{font-family:'Lato';font-style:normal;font-weight:normal;src:url('../fonts/lato/LatoLatin-Regular.eot');src:url('../fonts/lato/LatoLatin-Regular.eot?#iefix') format('embedded-opentype'),url('../fonts/lato/LatoLatin-Regular.ttf') format('truetype');text-rendering:optimizeLegibility}@font-face{font-family:'Lato';font-style:normal;font-weight:300;src:url('../fonts/lato/LatoLatin-Light.eot');src:url('../fonts/lato/LatoLatin-Light.eot?#iefix') format('embedded-opentype'),url('../fonts/lato/LatoLatin-Light.ttf') format('truetype');text-rendering:optimizeLegibility}@font-face{font-family:'Lato';font-style:italic;font-weight:300;src:url('../fonts/lato/LatoLatin-LightItalic.eot');src:url('../fonts/lato/LatoLatin-LightItalic.eot?#iefix') format('embedded-opentype'),url('../fonts/lato/LatoLatin-LightItalic.ttf') format('truetype');text-rendering:optimizeLegibility}@font-face{font-family:'Open Sans';font-style:normal;font-weight:400;src:url('../fonts/opensans/OpenSans-Regular-webfont.eot');src:local('Open Sans'),local('OpenSans'),url('../fonts/opensans/OpenSans-Regular-webfont.eot?#iefix') format('embedded-opentype'),url('../fonts/opensans/OpenSans-Regular-webfont.ttf') format('truetype'),url('../fonts/opensans/OpenSans-Regular-webfont.svg#open_sansregular') format('svg')}@font-face{font-family:'Open Sans';font-style:normal;font-weight:600;src:url('../fonts/opensans/OpenSans-Semibold-webfont.eot');src:local('Open Sans Semibold'),local('OpenSans-Semibold'),url('../fonts/opensans/OpenSans-Semibold-webfont.eot?#iefix') format('embedded-opentype'),url('../fonts/opensans/OpenSans-Semibold-webfont.ttf') format('truetype'),url('../fonts/opensans/OpenSans-Semibold-webfont.svg#open_sanssemibold') format('svg')}.red{color:#fe3e39}.blue{color:#2e8aea}.black{color:#000}.turquoise{color:#03bfb3}.turquoise-d1{color:#00aea2}.color-red,.color-red i{color:#f02e28!important}.color-blue,.color-blue i{color:#00aea2!important}.color-orange,.color-orange i{color:#d9631e!important}.color-green,.color-green i{color:#1fb572!important}.color-yellow,.color-yellow i{color:#ffc011!important}.clearfix{*zoom:1}.clearfix:before,.clearfix:after{display:table;line-height:0;content:""}.clearfix:after{clear:both}.hide-text{font:0/0 a;color:transparent;text-shadow:none;background-color:transparent;border:0}.input-block-level{display:block;width:100%;min-height:30px;-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box}.btn{display:inline-block;padding:6px 14px;margin-bottom:0;font-size:15px;line-height:20px;color:#000;text-align:center;vertical-align:middle;cursor:pointer;background:#e9e9eb;border:0;border-radius:3px;box-shadow:none}.btn:hover,.btn:focus{color:#68676b;text-decoration:none;background:#e9e9eb;background-position:0 -15px;-webkit-transition:background-position .1s linear;-moz-transition:background-position .1s linear;-o-transition:background-position .1s linear;transition:background-position .1s linear}.btn:focus{outline:thin dotted #515054;outline:5px auto -webkit-focus-ring-color;outline-offset:-2px}.btn.active,.btn:active{background-image:none;outline:0;-webkit-box-shadow:inset 0 2px 4px rgba(0,0,0,0.15),0 1px 2px rgba(0,0,0,0.05);-moz-box-shadow:inset 0 2px 4px rgba(0,0,0,0.15),0 1px 2px rgba(0,0,0,0.05);box-shadow:inset 0 2px 4px rgba(0,0,0,0.15),0 1px 2px rgba(0,0,0,0.05)}.btn.disabled,.btn[disabled],.btn:disabled:hover{cursor:default;border-color:#e9e9eb;opacity:.65;filter:alpha(opacity=65);-webkit-box-shadow:none;-moz-box-shadow:none;box-shadow:none}.btn-group>.btn+.dropdown-toggle{-webkit-box-shadow:none;box-shadow:none}.btn-group .btn.dropdown-toggle{border-left-style:solid;border-left-width:1px}.btn-large{padding:11px 19px;font-size:18.75px}.btn-large [class^="icon-"],.btn-large [class*=" icon-"]{margin-top:4px;-webkit-border-radius:3px;-moz-border-radius:3px;border-radius:3px}.btn-small{padding:2px 10px;font-size:12.75px;-webkit-border-radius:3px;-moz-border-radius:3px;border-radius:3px}.btn-small [class^="icon-"],.btn-small [class*=" icon-"]{margin-top:0}.btn-mini [class^="icon-"],.btn-mini [class*=" icon-"]{margin-top:-1px}.btn-mini{padding:0 6px;font-size:11.25px;-webkit-border-radius:3px;-moz-border-radius:3px;border-radius:3px}.btn-block{display:block;width:100%;padding-right:0;padding-left:0;-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box}.btn-block+.btn-block{margin-top:5px}input[type="submit"].btn-block,input[type="reset"].btn-block,input[type="button"].btn-block{width:100%}.btn-round{z-index:6666;display:inline-block;width:32px;height:32px;overflow:hidden;font-size:24px;line-height:32px;color:#515054;text-align:center;background:#fff;-moz-border-radius:15px;border-radius:15px}.btn-primary.active,.btn-warning.active,.btn-danger.active,.btn-success.active,.btn-info.active,.btn-inverse.active,.btn-neutral.active{color:rgba(255,255,255,0.75)}.btn-primary,.btn-warning,.btn-danger,.btn-success,.btn-info,.btn-inverse,.btn-neutral{font-weight:bold}.btn-primary{color:#fff;background-color:#35c786;*background-color:#35c786;background-image:-moz-linear-gradient(top,#35c786,#35c786);background-image:-webkit-gradient(linear,0 0,0 100%,from(#35c786),to(#35c786));background-image:-webkit-linear-gradient(top,#35c786,#35c786);background-image:-o-linear-gradient(top,#35c786,#35c786);background-image:linear-gradient(to bottom,#35c786,#35c786);background-repeat:repeat-x;border-color:#35c786 #35c786 #258b5d;border-color:rgba(0,0,0,0.1) rgba(0,0,0,0.1) rgba(0,0,0,0.25);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff35c786',endColorstr='#ff35c786',GradientType=0);filter:progid:DXImageTransform.Microsoft.gradient(enabled=false)}.btn-primary:hover,.btn-primary:focus,.btn-primary:active{background-color:#33bf81}.btn-primary:hover,.btn-primary:focus,.btn-primary:active,.btn-primary.active,.btn-primary.disabled,.btn-primary[disabled]{color:#fff;*background-color:#30b378}.btn-primary:active,.btn-primary.active{background-color:#2a9f6b \9}.btn-warning{color:#fff;background-color:#fe6561;*background-color:#fe6561;background-image:-moz-linear-gradient(top,#fe6561,#fe6561);background-image:-webkit-gradient(linear,0 0,0 100%,from(#fe6561),to(#fe6561));background-image:-webkit-linear-gradient(top,#fe6561,#fe6561);background-image:-o-linear-gradient(top,#fe6561,#fe6561);background-image:linear-gradient(to bottom,#fe6561,#fe6561);background-repeat:repeat-x;border-color:#fe6561 #fe6561 #fe1b15;border-color:rgba(0,0,0,0.1) rgba(0,0,0,0.1) rgba(0,0,0,0.25);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#fffe6561',endColorstr='#fffe6561',GradientType=0);filter:progid:DXImageTransform.Microsoft.gradient(enabled=false)}.btn-warning:hover,.btn-warning:focus,.btn-warning:active{background-color:#fe5b57}.btn-warning:hover,.btn-warning:focus,.btn-warning:active,.btn-warning.active,.btn-warning.disabled,.btn-warning[disabled]{color:#fff;*background-color:#fe4c48}.btn-warning:active,.btn-warning.active{background-color:#fe342e \9}.btn-danger{color:#fff;background-color:#fe6561;*background-color:#fe6561;background-image:-moz-linear-gradient(top,#fe6561,#fe6561);background-image:-webkit-gradient(linear,0 0,0 100%,from(#fe6561),to(#fe6561));background-image:-webkit-linear-gradient(top,#fe6561,#fe6561);background-image:-o-linear-gradient(top,#fe6561,#fe6561);background-image:linear-gradient(to bottom,#fe6561,#fe6561);background-repeat:repeat-x;border-color:#fe6561 #fe6561 #fe1b15;border-color:rgba(0,0,0,0.1) rgba(0,0,0,0.1) rgba(0,0,0,0.25);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#fffe6561',endColorstr='#fffe6561',GradientType=0);filter:progid:DXImageTransform.Microsoft.gradient(enabled=false)}.btn-danger:hover,.btn-danger:focus,.btn-danger:active{background-color:#fe5b57}.btn-danger:hover,.btn-danger:focus,.btn-danger:active,.btn-danger.active,.btn-danger.disabled,.btn-danger[disabled]{color:#fff;*background-color:#fe4c48}.btn-danger:active,.btn-danger.active{background-color:#fe342e \9}.btn-success{color:#fff;background-color:#35c786;*background-color:#35c786;background-image:-moz-linear-gradient(top,#35c786,#35c786);background-image:-webkit-gradient(linear,0 0,0 100%,from(#35c786),to(#35c786));background-image:-webkit-linear-gradient(top,#35c786,#35c786);background-image:-o-linear-gradient(top,#35c786,#35c786);background-image:linear-gradient(to bottom,#35c786,#35c786);background-repeat:repeat-x;border-color:#35c786 #35c786 #258b5d;border-color:rgba(0,0,0,0.1) rgba(0,0,0,0.1) rgba(0,0,0,0.25);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff35c786',endColorstr='#ff35c786',GradientType=0);filter:progid:DXImageTransform.Microsoft.gradient(enabled=false)}.btn-success:hover,.btn-success:focus,.btn-success:active{background-color:#33bf81}.btn-success:hover,.btn-success:focus,.btn-success:active,.btn-success.active,.btn-success.disabled,.btn-success[disabled]{color:#fff;*background-color:#30b378}.btn-success:active,.btn-success.active{background-color:#2a9f6b \9}.btn-info{color:#fff;background-color:#675e7a;*background-color:#675e7a;background-image:-moz-linear-gradient(top,#675e7a,#675e7a);background-image:-webkit-gradient(linear,0 0,0 100%,from(#675e7a),to(#675e7a));background-image:-webkit-linear-gradient(top,#675e7a,#675e7a);background-image:-o-linear-gradient(top,#675e7a,#675e7a);background-image:linear-gradient(to bottom,#675e7a,#675e7a);background-repeat:repeat-x;border-color:#675e7a #675e7a #433d4f;border-color:rgba(0,0,0,0.1) rgba(0,0,0,0.1) rgba(0,0,0,0.25);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff675e7a',endColorstr='#ff675e7a',GradientType=0);filter:progid:DXImageTransform.Microsoft.gradient(enabled=false)}.btn-info:hover,.btn-info:focus,.btn-info:active{background-color:#625a74}.btn-info:hover,.btn-info:focus,.btn-info:active,.btn-info.active,.btn-info.disabled,.btn-info[disabled]{color:#fff;*background-color:#5b536c}.btn-info:active,.btn-info.active{background-color:#4f485d \9}.btn-inverse{color:#fff;background-color:#303033;*background-color:#303033;background-image:-moz-linear-gradient(top,#303033,#303033);background-image:-webkit-gradient(linear,0 0,0 100%,from(#303033),to(#303033));background-image:-webkit-linear-gradient(top,#303033,#303033);background-image:-o-linear-gradient(top,#303033,#303033);background-image:linear-gradient(to bottom,#303033,#303033);background-repeat:repeat-x;border-color:#303033 #303033 #0b0b0c;border-color:rgba(0,0,0,0.1) rgba(0,0,0,0.1) rgba(0,0,0,0.25);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff303033',endColorstr='#ff303033',GradientType=0);filter:progid:DXImageTransform.Microsoft.gradient(enabled=false)}.btn-inverse:hover,.btn-inverse:focus,.btn-inverse:active{background-color:#2b2b2e}.btn-inverse:hover,.btn-inverse:focus,.btn-inverse:active,.btn-inverse.active,.btn-inverse.disabled,.btn-inverse[disabled]{color:#fff;*background-color:#242426}.btn-inverse:active,.btn-inverse.active{background-color:#171719 \9}.btn-neutral{color:#fff;color:#817f85;background-color:#e9e9eb;*background-color:#e9e9eb;background-image:-moz-linear-gradient(top,#e9e9eb,#e9e9eb);background-image:-webkit-gradient(linear,0 0,0 100%,from(#e9e9eb),to(#e9e9eb));background-image:-webkit-linear-gradient(top,#e9e9eb,#e9e9eb);background-image:-o-linear-gradient(top,#e9e9eb,#e9e9eb);background-image:linear-gradient(to bottom,#e9e9eb,#e9e9eb);background-repeat:repeat-x;border-color:#e9e9eb #e9e9eb #c1c1c7;border-color:rgba(0,0,0,0.1) rgba(0,0,0,0.1) rgba(0,0,0,0.25);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffe9e9eb',endColorstr='#ffe9e9eb',GradientType=0);filter:progid:DXImageTransform.Microsoft.gradient(enabled=false)}.btn-neutral:hover,.btn-neutral:focus,.btn-neutral:active{background-color:#e4e4e6}.btn-neutral:hover,.btn-neutral:focus,.btn-neutral:active,.btn-neutral.active,.btn-neutral.disabled,.btn-neutral[disabled]{color:#fff;*background-color:#dcdcdf}.btn-neutral:active,.btn-neutral.active{background-color:#ceced3 \9}.btn-neutral:hover,.btn-neutral:focus{color:#817f85}.btn-neutral.disabled,.btn-neutral[disabled]{color:#817f85;opacity:.65;filter:alpha(opacity=65)}.btn-install{display:block;padding:15px 50px;margin:40px auto;font-size:16px;font-weight:bold;color:white;background:#35c786;border:0}.btn-install:hover{background:#1fb572}button.btn,input[type="submit"].btn{*padding-top:3px;*padding-bottom:3px}button.btn::-moz-focus-inner,input[type="submit"].btn::-moz-focus-inner{padding:0;border:0}button.btn.btn-large,input[type="submit"].btn.btn-large{*padding-top:7px;*padding-bottom:7px}button.btn.btn-small,input[type="submit"].btn.btn-small{*padding-top:3px;*padding-bottom:3px}button.btn.btn-mini,input[type="submit"].btn.btn-mini{*padding-top:1px;*padding-bottom:1px}.btn-link,.btn-link:active,.btn-link[disabled]{background-color:transparent;background-image:none;-webkit-box-shadow:none;-moz-box-shadow:none;box-shadow:none}.btn-link{color:#000;cursor:pointer;border-color:transparent;-webkit-border-radius:0;-moz-border-radius:0;border-radius:0}.btn-link:hover,.btn-link:focus{color:#000;text-decoration:underline;background-color:transparent}.btn-link[disabled]:hover,.btn-link[disabled]:focus{color:#68676b;text-decoration:none}.btn-link-reverse{text-decoration:underline}.btn-link-reverse:hover,.btn-link-reverse:focus{text-decoration:none}.btn-link.-underline{display:inline-block;text-decoration:underline}.btn-link.-underline:hover{text-decoration:none}small.umb-detail,label small,.guiDialogTiny{display:block;font-size:11px;font-weight:normal;color:#817f85!important;text-decoration:none}label.control-label,.control-label{padding:0 10px 0 0!important;font-weight:bold;color:#000}.umb-status-label{color:#515054!important}.controls-row label{padding:0 10px 0 10px;vertical-align:middle}.breadcrumb{display:block;height:30px;margin-top:10px}.breadcrumb li{height:30px;vertical-align:middle}.breadcrumb li a{height:30px;vertical-align:middle}.breadcrumb input{font-size:11px!Important}.form-search{position:relative;padding:0}.form-search a{text-decoration:none;cursor:pointer}.form-search a:hover{color:#515054}.form-search h4{color:#515054}.form-search small{color:#d8d7d9}.form-search .icon,.form-search .icon-search{position:absolute;top:6px;left:4px;color:#d8d7d9}.form-search .icon-search{pointer-events:none}.form-search input{width:90%;padding:4px 0 4px 16px;padding-left:25px!Important;font-size:18.75px;font-weight:400;line-height:22px;background:#fff;border:1px solid #d8d7d9}.form-search .search-input{font-weight:bold;border-color:#d8d7d9}.form-search .search-input:hover,.form-search .search-input:focus,.form-search .search-input:focus:hover{border-color:#bbbabf}.form-search .search-input:-moz-placeholder{font-weight:normal}.form-search .search-input:-ms-input-placeholder{font-weight:normal}.form-search .search-input::-webkit-input-placeholder{font-weight:normal}form{margin:0 0 20px}form.-no-margin-bottom{margin-bottom:0}fieldset{padding:0;margin:0;border:0}legend{display:block;width:100%;padding:0;margin-bottom:20px;font-size:22.5px;line-height:40px;color:#343434;border:0;border-bottom:1px solid #d8d7d9}legend small{font-size:15px;color:#d8d7d9}label,input,button,select,textarea{font-size:15px;font-weight:normal;line-height:20px}input,button,select,textarea{font-family:"Lato","Helvetica Neue",Helvetica,Arial,sans-serif}label{display:inline-block;margin-bottom:5px}select,textarea,input[type="text"],input[type="password"],input[type="datetime"],input[type="datetime-local"],input[type="date"],input[type="month"],input[type="time"],input[type="week"],input[type="number"],input[type="email"],input[type="url"],input[type="search"],input[type="tel"],input[type="color"],.uneditable-input{display:inline-block;height:30px;padding:4px 6px;margin-bottom:10px;font-size:15px;line-height:20px;color:#515054;vertical-align:middle;-webkit-border-radius:0;-moz-border-radius:0;border-radius:0;box-sizing:border-box}input.-full-width-input{width:100%;height:30px;padding:4px 6px;box-sizing:border-box}input,textarea,.uneditable-input{width:206px}textarea{height:auto}textarea,input[type="text"],input[type="password"],input[type="datetime"],input[type="datetime-local"],input[type="date"],input[type="month"],input[type="time"],input[type="week"],input[type="number"],input[type="email"],input[type="url"],input[type="search"],input[type="tel"],input[type="color"],.uneditable-input{background-color:#fff;border:1px solid #bbbabf;-webkit-transition:border linear .2s,box-shadow linear .2s;-moz-transition:border linear .2s,box-shadow linear .2s;-o-transition:border linear .2s,box-shadow linear .2s;transition:border linear .2s,box-shadow linear .2s}textarea:focus,input[type="text"]:focus,input[type="password"]:focus,input[type="datetime"]:focus,input[type="datetime-local"]:focus,input[type="date"]:focus,input[type="month"]:focus,input[type="time"]:focus,input[type="week"]:focus,input[type="number"]:focus,input[type="email"]:focus,input[type="url"]:focus,input[type="search"]:focus,input[type="tel"]:focus,input[type="color"]:focus,.uneditable-input:focus{border-color:none;outline:0;outline:none \9}input[type="radio"],input[type="checkbox"]{margin:4px 0 0;margin-top:1px \9;*margin-top:0;line-height:normal}input[type="file"],input[type="image"],input[type="submit"],input[type="reset"],input[type="button"],input[type="radio"],input[type="checkbox"]{width:auto}select,input[type="file"]{height:30px;*margin-top:4px;line-height:30px}select{width:220px;background-color:#fff;border:1px solid #bbbabf}select[multiple],select[size]{height:auto}select:focus,input[type="file"]:focus,input[type="radio"]:focus,input[type="checkbox"]:focus{outline:thin dotted #515054;outline:5px auto -webkit-focus-ring-color;outline-offset:-2px}.uneditable-input,.uneditable-textarea{color:#d8d7d9;cursor:not-allowed;background-color:#fcfcfc;border-color:#bbbabf;-webkit-box-shadow:inset 0 1px 2px rgba(0,0,0,0.025);-moz-box-shadow:inset 0 1px 2px rgba(0,0,0,0.025);box-shadow:inset 0 1px 2px rgba(0,0,0,0.025)}.uneditable-input{overflow:hidden;white-space:nowrap}.uneditable-textarea{width:auto;height:auto}input:-moz-placeholder,textarea:-moz-placeholder{color:#a2a1a6}input:-ms-input-placeholder,textarea:-ms-input-placeholder{color:#a2a1a6}input::-webkit-input-placeholder,textarea::-webkit-input-placeholder{color:#a2a1a6}.radio,.checkbox{min-height:20px;padding-left:20px}.radio.no-indent,.checkbox.no-indent{padding-left:0}.radio input[type="radio"],.checkbox input[type="checkbox"]{float:left;margin-right:5px;margin-left:0}.controls>.radio:first-child,.controls>.checkbox:first-child{padding-top:5px}.radio.inline,.checkbox.inline{display:inline-block;padding-top:5px;margin-bottom:0;vertical-align:middle}.radio.inline+.radio.inline,.checkbox.inline+.checkbox.inline{margin-left:10px}.input-mini{width:60px}.input-small{width:90px}.input-medium{width:150px}.input-large{width:210px}.input-xlarge{width:270px}.input-xxlarge{width:530px}input.input--no-border{border:0}input[class*="span"],select[class*="span"],textarea[class*="span"],.uneditable-input[class*="span"],.row-fluid input[class*="span"],.row-fluid select[class*="span"],.row-fluid textarea[class*="span"],.row-fluid .uneditable-input[class*="span"]{float:none;margin-left:0}.input-append input[class*="span"],.input-append .uneditable-input[class*="span"],.input-prepend input[class*="span"],.input-prepend .uneditable-input[class*="span"],.row-fluid input[class*="span"],.row-fluid select[class*="span"],.row-fluid textarea[class*="span"],.row-fluid .uneditable-input[class*="span"],.row-fluid .input-prepend [class*="span"],.row-fluid .input-append [class*="span"]{display:inline-block}.bigInput,.input-large-type{font-size:20px!important}input,textarea,.uneditable-input{margin-left:0}.controls-row [class*="span"]+[class*="span"]{margin-left:0}input.span12,textarea.span12,.uneditable-input.span12{width:706px}input.span11,textarea.span11,.uneditable-input.span11{width:646px}input.span10,textarea.span10,.uneditable-input.span10{width:586px}input.span9,textarea.span9,.uneditable-input.span9{width:526px}input.span8,textarea.span8,.uneditable-input.span8{width:466px}input.span7,textarea.span7,.uneditable-input.span7{width:406px}input.span6,textarea.span6,.uneditable-input.span6{width:346px}input.span5,textarea.span5,.uneditable-input.span5{width:286px}input.span4,textarea.span4,.uneditable-input.span4{width:226px}input.span3,textarea.span3,.uneditable-input.span3{width:166px}input.span2,textarea.span2,.uneditable-input.span2{width:106px}input.span1,textarea.span1,.uneditable-input.span1{width:46px}.controls-row{*zoom:1}.controls-row:before,.controls-row:after{display:table;line-height:0;content:""}.controls-row:after{clear:both}.controls-row [class*="span"],.row-fluid .controls-row [class*="span"]{float:left}.controls-row .checkbox[class*="span"],.controls-row .radio[class*="span"]{padding-top:5px}input[disabled],select[disabled],textarea[disabled],input[readonly],select[readonly],textarea[readonly]{cursor:not-allowed;background-color:#f3f3f5}input[type="radio"][disabled],input[type="checkbox"][disabled],input[type="radio"][readonly],input[type="checkbox"][readonly]{background-color:transparent}.show-validation.ng-invalid .control-group.error .control-label,.show-validation.ng-invalid .umb-panel-header-content-wrapper .control-label,.show-validation.ng-invalid .control-group.error .help-block,.show-validation.ng-invalid .umb-panel-header-content-wrapper .help-block,.show-validation.ng-invalid .control-group.error .help-inline,.show-validation.ng-invalid .umb-panel-header-content-wrapper .help-inline{color:#f02e28}.show-validation.ng-invalid .control-group.error .checkbox.ng-invalid,.show-validation.ng-invalid .umb-panel-header-content-wrapper .checkbox.ng-invalid,.show-validation.ng-invalid .control-group.error .radio.ng-invalid,.show-validation.ng-invalid .umb-panel-header-content-wrapper .radio.ng-invalid,.show-validation.ng-invalid .control-group.error input.ng-invalid,.show-validation.ng-invalid .umb-panel-header-content-wrapper input.ng-invalid,.show-validation.ng-invalid .control-group.error select.ng-invalid,.show-validation.ng-invalid .umb-panel-header-content-wrapper select.ng-invalid,.show-validation.ng-invalid .control-group.error textarea.ng-invalid,.show-validation.ng-invalid .umb-panel-header-content-wrapper textarea.ng-invalid{color:#f02e28}.show-validation.ng-invalid .control-group.error input.ng-invalid,.show-validation.ng-invalid .umb-panel-header-content-wrapper input.ng-invalid,.show-validation.ng-invalid .control-group.error select.ng-invalid,.show-validation.ng-invalid .umb-panel-header-content-wrapper select.ng-invalid,.show-validation.ng-invalid .control-group.error textarea.ng-invalid,.show-validation.ng-invalid .umb-panel-header-content-wrapper textarea.ng-invalid{border-color:#f02e28}.show-validation.ng-invalid .control-group.error .input-prepend .add-on,.show-validation.ng-invalid .umb-panel-header-content-wrapper .input-prepend .add-on,.show-validation.ng-invalid .control-group.error .input-append .add-on,.show-validation.ng-invalid .umb-panel-header-content-wrapper .input-append .add-on{color:#f02e28;background-color:#fff;border-color:#f02e28}.highlight-error{color:#f02e28!important;border-color:#fe6561!important}.show-validation .umb-headline-editor-wrapper input:focus:invalid,.show-validation .umb-headline-editor-wrapper textarea:focus:invalid,.show-validation .umb-headline-editor-wrapper select:focus:invalid{color:inherit;border:0;border-color:inherit;-webkit-box-shadow:inherit;-moz-box-shadow:inherit;box-shadow:inherit}.ng-invalid>.umb-headline-editor-wrapper h1{color:#fe3e39;cursor:pointer;border-bottom:1px dashed #fe3e39}.form-actions{padding:19px 20px 20px;margin-top:20px;margin-bottom:20px;background-color:#e9e9eb;border-top:1px solid #d8d7d9;*zoom:1}.form-actions:before,.form-actions:after{display:table;line-height:0;content:""}.form-actions:after{clear:both}.help-block,.help-inline{color:#55555a}.help-block{display:block;margin-bottom:10px}.help-inline{display:inline-block;*display:inline;padding-left:5px;vertical-align:middle;*zoom:1}.input-append,.input-prepend{display:inline-block;margin-bottom:10px;font-size:0;white-space:nowrap;vertical-align:middle}.input-append input,.input-prepend input,.input-append select,.input-prepend select,.input-append .uneditable-input,.input-prepend .uneditable-input,.input-append .dropdown-menu,.input-prepend .dropdown-menu,.input-append .popover,.input-prepend .popover{font-size:15px}.input-append input,.input-prepend input,.input-append select,.input-prepend select,.input-append .uneditable-input,.input-prepend .uneditable-input{position:relative;margin-bottom:0;*margin-left:0;vertical-align:top}.input-append input:focus,.input-prepend input:focus,.input-append select:focus,.input-prepend select:focus,.input-append .uneditable-input:focus,.input-prepend .uneditable-input:focus{z-index:2}.input-append .add-on,.input-prepend .add-on{display:inline-block;width:auto;height:20px;min-width:16px;padding:4px 5px;font-size:15px;font-weight:normal;line-height:20px;text-align:center;text-shadow:0 1px 0 #fff;background-color:#f3f3f5;border:1px solid #d8d7d9}.input-append .add-on,.input-prepend .add-on,.input-append .btn,.input-prepend .btn,.input-append .btn-group>.dropdown-toggle,.input-prepend .btn-group>.dropdown-toggle{vertical-align:top;-webkit-border-radius:0;-moz-border-radius:0;border-radius:0}.input-append .active,.input-prepend .active{background-color:#ace9ce;border-color:#35c786}.input-prepend .add-on,.input-prepend .btn{margin-right:-1px}.input-append .add-on,.input-append .btn,.input-append .btn-group{margin-left:-1px}.input-prepend.input-append input,.input-prepend.input-append select,.input-prepend.input-append .uneditable-input{-webkit-border-radius:0;-moz-border-radius:0;border-radius:0}.input-prepend.input-append input+.btn-group .btn,.input-prepend.input-append select+.btn-group .btn,.input-prepend.input-append .uneditable-input+.btn-group .btn{-webkit-border-radius:0;-moz-border-radius:0;border-radius:0}.input-prepend.input-append .add-on:first-child,.input-prepend.input-append .btn:first-child{margin-right:-1px;-webkit-border-radius:0;-moz-border-radius:0;border-radius:0}.input-prepend.input-append .add-on:last-child,.input-prepend.input-append .btn:last-child{margin-left:-1px;-webkit-border-radius:0;-moz-border-radius:0;border-radius:0}.input-prepend.input-append .btn-group:first-child{margin-left:0}input.search-query{padding-right:4px \9;padding-left:14px;padding-left:4px \9;margin:0;-webkit-border-radius:0;-moz-border-radius:0;border-radius:0}.form-search .input-append .search-query,.form-search .input-prepend .search-query{-webkit-border-radius:0;-moz-border-radius:0;border-radius:0}.form-search .input-append .search-query{-webkit-border-radius:14px 0 0 14px;-moz-border-radius:14px 0 0 14px;border-radius:14px 0 0 14px}.form-search .input-append .btn{-webkit-border-radius:0 14px 14px 0;-moz-border-radius:0 14px 14px 0;border-radius:0 14px 14px 0}.form-search .input-prepend .search-query{-webkit-border-radius:0 14px 14px 0;-moz-border-radius:0 14px 14px 0;border-radius:0 14px 14px 0}.form-search .input-prepend .btn{-webkit-border-radius:14px 0 0 14px;-moz-border-radius:14px 0 0 14px;border-radius:14px 0 0 14px}.form-search input,.form-inline input,.form-horizontal input,.form-search textarea,.form-inline textarea,.form-horizontal textarea,.form-search select,.form-inline select,.form-horizontal select,.form-search .help-inline,.form-inline .help-inline,.form-horizontal .help-inline,.form-search .uneditable-input,.form-inline .uneditable-input,.form-horizontal .uneditable-input,.form-search .input-prepend,.form-inline .input-prepend,.form-horizontal .input-prepend,.form-search .input-append,.form-inline .input-append,.form-horizontal .input-append{display:inline-block;*display:inline;margin-bottom:0;vertical-align:top;*zoom:1}.form-search .hide,.form-inline .hide,.form-horizontal .hide{display:none}.form-search label,.form-inline label,.form-search .btn-group,.form-inline .btn-group{display:inline-block}.form-search .input-append,.form-inline .input-append,.form-search .input-prepend,.form-inline .input-prepend{margin-bottom:0}.form-search .radio,.form-search .checkbox,.form-inline .radio,.form-inline .checkbox{padding-left:0;margin-bottom:0;vertical-align:middle}.form-search .radio input[type="radio"],.form-search .checkbox input[type="checkbox"],.form-inline .radio input[type="radio"],.form-inline .checkbox input[type="checkbox"]{float:left;margin-right:3px;margin-left:0}.control-group{margin-bottom:10px}.control-group.-no-margin{margin-bottom:0}legend+.control-group{margin-top:20px;-webkit-margin-top-collapse:separate}.form-horizontal .control-group{margin-bottom:20px;*zoom:1}.form-horizontal .control-group:before,.form-horizontal .control-group:after{display:table;line-height:0;content:""}.form-horizontal .control-group:after{clear:both}.form-horizontal .control-label{float:left;width:160px;padding-top:5px;text-align:right}.form-horizontal .controls{*display:inline-block;*padding-left:20px;margin-left:180px;*margin-left:0}.form-horizontal .controls:first-child{*padding-left:180px}.form-horizontal .help-block{margin-bottom:0}.form-horizontal input+.help-block,.form-horizontal select+.help-block,.form-horizontal textarea+.help-block,.form-horizontal .uneditable-input+.help-block,.form-horizontal .input-prepend+.help-block,.form-horizontal .input-append+.help-block{margin-top:10px}.form-horizontal .form-actions{padding-left:180px}.umb-panel-buttons .umb-btn-toolbar .btn{position:relative;z-index:1000}@media(max-width:767px){.form-horizontal .control-label{width:100%}.form-horizontal .controls{margin-left:0}}body{margin:0;font-family:"Lato","Helvetica Neue",Helvetica,Arial,sans-serif;font-size:15px;line-height:20px;color:#303033;background-color:#fff}a{color:#000;text-decoration:none}a:hover,a:focus{color:#000;text-decoration:underline}.img-rounded{-webkit-border-radius:6px;-moz-border-radius:6px;border-radius:6px}.img-polaroid{padding:4px;background-color:#fff;border:1px solid #ccc;border:1px solid rgba(0,0,0,0.2);-webkit-box-shadow:0 1px 3px rgba(0,0,0,0.1);-moz-box-shadow:0 1px 3px rgba(0,0,0,0.1);box-shadow:0 1px 3px rgba(0,0,0,0.1)}.img-circle{-webkit-border-radius:500px;-moz-border-radius:500px;border-radius:500px}.row{margin-left:0;*zoom:1}.row:before,.row:after{display:table;line-height:0;content:""}.row:after{clear:both}[class*="span"]{float:left;min-height:1px;margin-left:0}.container,.navbar-static-top .container,.navbar-fixed-top .container,.navbar-fixed-bottom .container{width:720px}.span12{width:720px}.span11{width:660px}.span10{width:600px}.span9{width:540px}.span8{width:480px}.span7{width:420px}.span6{width:360px}.span5{width:300px}.span4{width:240px}.span3{width:180px}.span2{width:120px}.span1{width:60px}.offset12{margin-left:720px}.offset11{margin-left:660px}.offset10{margin-left:600px}.offset9{margin-left:540px}.offset8{margin-left:480px}.offset7{margin-left:420px}.offset6{margin-left:360px}.offset5{margin-left:300px}.offset4{margin-left:240px}.offset3{margin-left:180px}.offset2{margin-left:120px}.offset1{margin-left:60px}.row-fluid{width:100%;*zoom:1}.row-fluid:before,.row-fluid:after{display:table;line-height:0;content:""}.row-fluid:after{clear:both}.row-fluid [class*="span"]{display:block;float:left;width:100%;min-height:30px;margin-left:0;*margin-left:-0.06944444444444445%;-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box}.row-fluid [class*="span"]:first-child{margin-left:0}.row-fluid .controls-row [class*="span"]+[class*="span"]{margin-left:0}.row-fluid .span12{width:99.99999999999999%;*width:99.93055555555554%}.row-fluid .span11{width:91.66666666666666%;*width:91.59722222222221%}.row-fluid .span10{width:83.33333333333331%;*width:83.26388888888887%}.row-fluid .span9{width:74.99999999999999%;*width:74.93055555555554%}.row-fluid .span8{width:66.66666666666666%;*width:66.59722222222221%}.row-fluid .span7{width:58.33333333333333%;*width:58.263888888888886%}.row-fluid .span6{width:49.99999999999999%;*width:49.93055555555555%}.row-fluid .span5{width:41.66666666666666%;*width:41.597222222222214%}.row-fluid .span4{width:33.33333333333333%;*width:33.263888888888886%}.row-fluid .span3{width:24.999999999999996%;*width:24.930555555555554%}.row-fluid .span2{width:16.666666666666664%;*width:16.59722222222222%}.row-fluid .span1{width:8.333333333333332%;*width:8.263888888888888%}.row-fluid .offset12{margin-left:99.99999999999999%;*margin-left:99.8611111111111%}.row-fluid .offset12:first-child{margin-left:99.99999999999999%;*margin-left:99.8611111111111%}.row-fluid .offset11{margin-left:91.66666666666666%;*margin-left:91.52777777777777%}.row-fluid .offset11:first-child{margin-left:91.66666666666666%;*margin-left:91.52777777777777%}.row-fluid .offset10{margin-left:83.33333333333331%;*margin-left:83.19444444444443%}.row-fluid .offset10:first-child{margin-left:83.33333333333331%;*margin-left:83.19444444444443%}.row-fluid .offset9{margin-left:74.99999999999999%;*margin-left:74.8611111111111%}.row-fluid .offset9:first-child{margin-left:74.99999999999999%;*margin-left:74.8611111111111%}.row-fluid .offset8{margin-left:66.66666666666666%;*margin-left:66.52777777777777%}.row-fluid .offset8:first-child{margin-left:66.66666666666666%;*margin-left:66.52777777777777%}.row-fluid .offset7{margin-left:58.33333333333333%;*margin-left:58.19444444444444%}.row-fluid .offset7:first-child{margin-left:58.33333333333333%;*margin-left:58.19444444444444%}.row-fluid .offset6{margin-left:49.99999999999999%;*margin-left:49.86111111111111%}.row-fluid .offset6:first-child{margin-left:49.99999999999999%;*margin-left:49.86111111111111%}.row-fluid .offset5{margin-left:41.66666666666666%;*margin-left:41.52777777777777%}.row-fluid .offset5:first-child{margin-left:41.66666666666666%;*margin-left:41.52777777777777%}.row-fluid .offset4{margin-left:33.33333333333333%;*margin-left:33.19444444444444%}.row-fluid .offset4:first-child{margin-left:33.33333333333333%;*margin-left:33.19444444444444%}.row-fluid .offset3{margin-left:24.999999999999996%;*margin-left:24.86111111111111%}.row-fluid .offset3:first-child{margin-left:24.999999999999996%;*margin-left:24.86111111111111%}.row-fluid .offset2{margin-left:16.666666666666664%;*margin-left:16.52777777777778%}.row-fluid .offset2:first-child{margin-left:16.666666666666664%;*margin-left:16.52777777777778%}.row-fluid .offset1{margin-left:8.333333333333332%;*margin-left:8.194444444444443%}.row-fluid .offset1:first-child{margin-left:8.333333333333332%;*margin-left:8.194444444444443%}[class*="span"].hide,.row-fluid [class*="span"].hide{display:none}[class*="span"].pull-right,.row-fluid [class*="span"].pull-right{float:right}.container{margin-right:auto;margin-left:auto;*zoom:1}.container:before,.container:after{display:table;line-height:0;content:""}.container:after{clear:both}.container-fluid{padding-right:0;padding-left:0;*zoom:1}.container-fluid:before,.container-fluid:after{display:table;line-height:0;content:""}.container-fluid:after{clear:both}.thumbnails{margin-left:0;list-style:none;*zoom:1}.thumbnails:before,.thumbnails:after{display:table;line-height:0;content:""}.thumbnails:after{clear:both}.row-fluid .thumbnails{margin-left:0}.thumbnails>li{float:left;margin-bottom:20px;margin-left:0}.thumbnails>li a:hover{text-decoration:none}.thumbnail{display:block;padding:4px;line-height:20px;border:1px solid #ddd;-webkit-border-radius:3px;-moz-border-radius:3px;border-radius:3px;-webkit-box-shadow:0 1px 3px rgba(0,0,0,0.055);-moz-box-shadow:0 1px 3px rgba(0,0,0,0.055);box-shadow:0 1px 3px rgba(0,0,0,0.055);-webkit-transition:all .2s ease-in-out;-moz-transition:all .2s ease-in-out;-o-transition:all .2s ease-in-out;transition:all .2s ease-in-out}a.thumbnail:hover,a.thumbnail:focus{border-color:#000;-webkit-box-shadow:0 1px 4px rgba(0,105,214,0.25);-moz-box-shadow:0 1px 4px rgba(0,105,214,0.25);box-shadow:0 1px 4px rgba(0,105,214,0.25)}.thumbnail>img{display:block;max-width:100%;margin-right:auto;margin-left:auto}.thumbnail .caption{padding:9px;color:#555}.media,.media-body{overflow:hidden;*overflow:visible;zoom:1}.media,.media .media{margin-top:15px}.media:first-child{margin-top:0}.media-object{display:block}.media-heading{margin:0 0 5px}.media>.pull-left{margin-right:10px}.media>.pull-right{margin-left:10px}.media-list{margin-left:0;list-style:none}[ng\:cloak],[ng-cloak],[data-ng-cloak],[x-ng-cloak],.ng-cloak,.x-ng-cloak{display:none!important}html{background:url('../img/installer.jpg') no-repeat center center fixed;-webkit-background-size:cover;-moz-background-size:cover;-o-background-size:cover;background-size:cover}body{width:100%;height:100%;padding:0;margin:0;font-family:"Lato","Helvetica Neue",Helvetica,Arial,sans-serif;font-size:15px;-webkit-font-smoothing:antialiased;font-smoothing:antialiased;line-height:20px;color:#303033;text-align:center;vertical-align:middle;-moz-osx-font-smoothing:grayscale}#logo{position:absolute;top:20px;left:20px;z-index:777;opacity:.8}#installer{z-index:667;width:750px;height:600px;padding:30px;margin:auto;overflow:hidden;text-align:left;background:#fff}#overlay{position:absolute;top:0;right:0;bottom:0;left:0;z-index:666;background:#1d1333}.loading #overlay{display:block!important;opacity:.5}#fact{z-index:667;width:750px;height:600px;font-size:25px;line-height:35px;color:#fff;text-align:left;text-shadow:0 0 4px #000}#fact h2{padding-bottom:10px;margin-bottom:20px;font-size:35px;color:#fff;border-bottom:1px solid #fff}#fact a{color:#fff}#feedback{position:absolute;right:0;bottom:20px;left:0;z-index:667;height:25px;font-size:14px;line-height:20px;color:#fff;text-align:center;text-shadow:0 0 4px #000}h1{padding-bottom:10px;color:#303033;border-bottom:1px solid #f3f3f5}.error h1,.error .message,span.error{color:#fe3e39}legend{font-size:14px;font-weight:bold}input.ng-dirty.ng-invalid{color:#b94a48;border-color:#b94a48}.disabled{opacity:.6}#installer label.control-label,#installer .constrol-label{padding-top:5px!important}.controls{text-align:left}.controls small{display:block;color:#515054}.absolute-center{position:absolute;top:0;right:0;bottom:0;left:0;margin:auto}.fade-hide,.fade-show{-webkit-transition:all cubic-bezier(0.25,0.46,0.45,0.94) .5s;-moz-transition:all cubic-bezier(0.25,0.46,0.45,0.94) .5s;-o-transition:all cubic-bezier(0.25,0.46,0.45,0.94) .5s;transition:all cubic-bezier(0.25,0.46,0.45,0.94) .5s}.fade-hide{opacity:1}.fade-hide.fade-hide-active{opacity:0}.fade-show{opacity:0}.fade-show.fade-show-active{opacity:1}.umb-loader{width:100%;height:5px;margin-top:0;margin-left:-100%;background-color:#fff;-webkit-animation-duration:1s;-moz-animation-duration:1s;-ms-animation-duration:1s;-o-animation-duration:1s;animation-duration:1s;-webkit-animation-iteration-count:infinite;-moz-animation-iteration-count:infinite;-ms-animation-iteration-count:infinite;-o-animation-iteration-count:infinite;animation-iteration-count:infinite;-webkit-animation-name:bounce_loadingProgressG;-moz-animation-name:bounce_loadingProgressG;-ms-animation-name:bounce_loadingProgressG;-o-animation-name:bounce_loadingProgressG;animation-name:bounce_loadingProgressG;-webkit-animation-timing-function:linear;-moz-animation-timing-function:linear;-ms-animation-timing-function:linear;animation-timing-function:linear;-o-animationtiming-function:linear}@-moz-keyframes bounce_loadingProgressG{0%{margin-left:-100%}100%{margin-left:100%}}@-webkit-keyframes bounce_loadingProgressG{0%{margin-left:-100%}100%{margin-left:100%}}@-ms-keyframes bounce_loadingProgressG{0%{margin-left:-100%}100%{margin-left:100%}}@-o-keyframes bounce_loadingProgressG{0%{margin-left:-100%}100%{margin-left:100%}}@keyframes bounce_loadingProgressG{0%{margin-left:-100%}100%{margin-left:100%}}.umb-loader-container,.umb-loader-done{position:absolute;bottom:0;left:0;z-index:777;width:0;height:3px;overflow:hidden}.umb-loader-done{right:0;background:#fff}.permissions-report{display:block;height:320px;padding:0;margin:0;overflow:auto}.permissions-report>li{list-style:none}.permissions-report h4{margin:7px}.upgrade-report{display:block;height:280px;overflow:auto}select{width:320px}#ysod{width:100%;height:500px;overflow:auto;border:0}#starterKits .thumbnails{min-height:128px}#starterKits a.thumbnail{position:relative;height:98px}#starterKits a.thumbnail small{position:absolute;top:10px;left:10px;z-index:50}#starterKits a.thumbnail img{position:relative;z-index:100} \ No newline at end of file diff --git a/src/UmbracoUrlHandling/Umbraco/assets/css/nonodes.style.min.css b/src/UmbracoUrlHandling/Umbraco/assets/css/nonodes.style.min.css new file mode 100644 index 0000000..df77525 --- /dev/null +++ b/src/UmbracoUrlHandling/Umbraco/assets/css/nonodes.style.min.css @@ -0,0 +1 @@ +@font-face{font-family:'Lato';font-style:normal;font-weight:900;src:url('../fonts/lato/LatoLatin-Black.eot');src:url('../fonts/lato/LatoLatin-Black.eot?#iefix') format('embedded-opentype'),url('../fonts/lato/LatoLatin-Black.ttf') format('truetype');text-rendering:optimizeLegibility}@font-face{font-family:'Lato';font-style:italic;font-weight:900;src:url('../fonts/lato/LatoLatin-BlackItalic.eot');src:url('../fonts/lato/LatoLatin-BlackItalic.eot?#iefix') format('embedded-opentype'),url('../fonts/lato/LatoLatin-BlackItalic.ttf') format('truetype');text-rendering:optimizeLegibility}@font-face{font-family:'Lato';font-style:normal;font-weight:bold;src:url('../fonts/lato/LatoLatin-Bold.eot');src:url('../fonts/lato/LatoLatin-Bold.eot?#iefix') format('embedded-opentype'),url('../fonts/lato/LatoLatin-Bold.ttf') format('truetype');text-rendering:optimizeLegibility}@font-face{font-family:'Lato';font-style:italic;font-weight:bold;src:url('../fonts/lato/LatoLatin-BoldItalic.eot');src:url('../fonts/lato/LatoLatin-BoldItalic.eot?#iefix') format('embedded-opentype'),url('../fonts/lato/LatoLatin-BoldItalic.ttf') format('truetype');text-rendering:optimizeLegibility}@font-face{font-family:'Lato';font-style:italic;font-weight:normal;src:url('../fonts/lato/LatoLatin-Italic.eot');src:url('../fonts/lato/LatoLatin-Italic.eot?#iefix') format('embedded-opentype'),url('../fonts/lato/LatoLatin-Italic.ttf') format('truetype');text-rendering:optimizeLegibility}@font-face{font-family:'Lato';font-style:normal;font-weight:normal;src:url('../fonts/lato/LatoLatin-Regular.eot');src:url('../fonts/lato/LatoLatin-Regular.eot?#iefix') format('embedded-opentype'),url('../fonts/lato/LatoLatin-Regular.ttf') format('truetype');text-rendering:optimizeLegibility}@font-face{font-family:'Lato';font-style:normal;font-weight:300;src:url('../fonts/lato/LatoLatin-Light.eot');src:url('../fonts/lato/LatoLatin-Light.eot?#iefix') format('embedded-opentype'),url('../fonts/lato/LatoLatin-Light.ttf') format('truetype');text-rendering:optimizeLegibility}@font-face{font-family:'Lato';font-style:italic;font-weight:300;src:url('../fonts/lato/LatoLatin-LightItalic.eot');src:url('../fonts/lato/LatoLatin-LightItalic.eot?#iefix') format('embedded-opentype'),url('../fonts/lato/LatoLatin-LightItalic.ttf') format('truetype');text-rendering:optimizeLegibility}@font-face{font-family:'Open Sans';font-style:normal;font-weight:400;src:url('../fonts/opensans/OpenSans-Regular-webfont.eot');src:local('Open Sans'),local('OpenSans'),url('../fonts/opensans/OpenSans-Regular-webfont.eot?#iefix') format('embedded-opentype'),url('../fonts/opensans/OpenSans-Regular-webfont.ttf') format('truetype'),url('../fonts/opensans/OpenSans-Regular-webfont.svg#open_sansregular') format('svg')}@font-face{font-family:'Open Sans';font-style:normal;font-weight:600;src:url('../fonts/opensans/OpenSans-Semibold-webfont.eot');src:local('Open Sans Semibold'),local('OpenSans-Semibold'),url('../fonts/opensans/OpenSans-Semibold-webfont.eot?#iefix') format('embedded-opentype'),url('../fonts/opensans/OpenSans-Semibold-webfont.ttf') format('truetype'),url('../fonts/opensans/OpenSans-Semibold-webfont.svg#open_sanssemibold') format('svg')}.red{color:#fe3e39}.blue{color:#2e8aea}.black{color:#000}.turquoise{color:#03bfb3}.turquoise-d1{color:#00aea2}.color-red,.color-red i{color:#f02e28!important}.color-blue,.color-blue i{color:#00aea2!important}.color-orange,.color-orange i{color:#d9631e!important}.color-green,.color-green i{color:#1fb572!important}.color-yellow,.color-yellow i{color:#ffc011!important}abbr,address,article,aside,audio,b,blockquote,body,canvas,caption,cite,code,dd,del,details,dfn,div,dl,dt,em,fieldset,figcaption,figure,footer,form,h1,h2,h3,h4,h5,h6,header,hgroup,html,i,iframe,img,ins,kbd,label,legend,li,mark,menu,nav,object,ol,p,pre,q,samp,section,small,span,strong,sub,summary,sup,table,tbody,td,tfoot,th,thead,time,tr,ul,var,video{padding:0;margin:0;font-size:100%;vertical-align:baseline;background:0;border:0;outline:0}article,aside,details,figcaption,figure,footer,header,hgroup,menu,nav,section{display:block}nav ul{list-style:none}blockquote,q{quotes:none}blockquote:after,blockquote:before,q:after,q:before{content:'';content:none}a{padding:0;margin:0;font-size:100%;vertical-align:baseline;background:0}ins{color:#000;text-decoration:none;background-color:#ffecb0}mark{font-style:italic;font-weight:bold;color:#000;background-color:#ffecb0}del{text-decoration:line-through}abbr[title],dfn[title]{cursor:help;border-bottom:1px dotted}table{border-collapse:collapse;border-spacing:0}hr{display:block;height:1px;padding:0;margin:1em 0;border:0;border-top:1px solid #d8d7d9}input,select{vertical-align:middle}html{-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale}*,:after,:before{box-sizing:border-box}body,html{width:100%;height:100%;font-family:"Lato","Helvetica Neue",Helvetica,Arial,sans-serif;font-size:.9375em;font-weight:400;line-height:1.5;color:#fff}h1{margin:40px auto 10px;font-size:1.7em;font-weight:700}h2{margin:0 auto .4em;font-size:1.35em;font-weight:700}h3{font-size:1em;font-style:italic;font-weight:400}p{font-size:1em;line-height:1.6}p+a{display:inline-block;margin-top:1rem}a,a:active,a:visited{text-decoration:none}.cta{padding-bottom:4.5em;margin:4.5em auto 1.5em}.button,.button:visited{display:inline-block;padding:.9375em 1.875em;font-size:1.2em;font-weight:600;color:#fff;background:#35c786;border:0;border-radius:.1em;border-radius:3px;transition:all 200ms ease-in-out}.button:hover,.button:visited:hover{background:#1fb572;border-bottom:0}section{display:table;width:100%;height:100%;padding:3em 1.75em;background-image:url(../img/nonodesbg.jpg);background-position:center center;background-size:cover}section a,section a:focus,section a:visited{font-size:1.1625em;color:#fff;border-bottom:1px solid #fff;transition:border-bottom 100ms ease-in-out}section a:focus:hover,section a:hover,section a:visited:hover{border-bottom:1px solid}section:after{position:absolute;top:0;right:0;bottom:0;left:0;z-index:0;background:rgba(0,0,0,0.17);background:linear-gradient(45deg,rgba(85,98,112,0.1) 10%,rgba(255,107,107,0.1) 95%);content:""}section article{position:relative;z-index:100;display:table-cell;margin:0 auto;text-align:center;vertical-align:middle}section article>div{max-width:60em;padding-top:50px;padding-bottom:70px;margin:0 auto}section .logo{width:91px;height:91px;margin:0 auto;background-image:url(../img/logo.png);background-repeat:no-repeat}section .row{overflow:hidden}section .row .col{width:100%;text-align:left}section .row .col:nth-child(2){margin-top:3em}@media screen and (min-width:48em){body,html{font-size:1em}h1{margin:70px auto 0;font-size:2.5em;letter-spacing:.5px}h2{margin:0 auto 1em;font-size:1.4375em}h3{font-size:1.2em}a{font-size:1.1rem;font-weight:600}p+a{margin-top:3rem}.cta{padding-bottom:7.5em;margin:7.5em auto 2.5em;border-bottom:1px solid #817f85}section{padding:0 15px}section .row .col{display:inline-block;float:left;width:50%;padding-right:5%}section .row .col:nth-child(2){padding-right:0;padding-left:5%;margin-top:0}.button{font-size:1.1625em}} \ No newline at end of file diff --git a/src/UmbracoUrlHandling/Umbraco/assets/css/umbraco.css b/src/UmbracoUrlHandling/Umbraco/assets/css/umbraco.css new file mode 100644 index 0000000..d2fb97d --- /dev/null +++ b/src/UmbracoUrlHandling/Umbraco/assets/css/umbraco.css @@ -0,0 +1 @@ +@font-face{font-family:'Lato';font-style:normal;font-weight:900;src:url('../fonts/lato/LatoLatin-Black.eot');src:url('../fonts/lato/LatoLatin-Black.eot?#iefix') format('embedded-opentype'),url('../fonts/lato/LatoLatin-Black.ttf') format('truetype');text-rendering:optimizeLegibility}@font-face{font-family:'Lato';font-style:italic;font-weight:900;src:url('../fonts/lato/LatoLatin-BlackItalic.eot');src:url('../fonts/lato/LatoLatin-BlackItalic.eot?#iefix') format('embedded-opentype'),url('../fonts/lato/LatoLatin-BlackItalic.ttf') format('truetype');text-rendering:optimizeLegibility}@font-face{font-family:'Lato';font-style:normal;font-weight:bold;src:url('../fonts/lato/LatoLatin-Bold.eot');src:url('../fonts/lato/LatoLatin-Bold.eot?#iefix') format('embedded-opentype'),url('../fonts/lato/LatoLatin-Bold.ttf') format('truetype');text-rendering:optimizeLegibility}@font-face{font-family:'Lato';font-style:italic;font-weight:bold;src:url('../fonts/lato/LatoLatin-BoldItalic.eot');src:url('../fonts/lato/LatoLatin-BoldItalic.eot?#iefix') format('embedded-opentype'),url('../fonts/lato/LatoLatin-BoldItalic.ttf') format('truetype');text-rendering:optimizeLegibility}@font-face{font-family:'Lato';font-style:italic;font-weight:normal;src:url('../fonts/lato/LatoLatin-Italic.eot');src:url('../fonts/lato/LatoLatin-Italic.eot?#iefix') format('embedded-opentype'),url('../fonts/lato/LatoLatin-Italic.ttf') format('truetype');text-rendering:optimizeLegibility}@font-face{font-family:'Lato';font-style:normal;font-weight:normal;src:url('../fonts/lato/LatoLatin-Regular.eot');src:url('../fonts/lato/LatoLatin-Regular.eot?#iefix') format('embedded-opentype'),url('../fonts/lato/LatoLatin-Regular.ttf') format('truetype');text-rendering:optimizeLegibility}@font-face{font-family:'Lato';font-style:normal;font-weight:300;src:url('../fonts/lato/LatoLatin-Light.eot');src:url('../fonts/lato/LatoLatin-Light.eot?#iefix') format('embedded-opentype'),url('../fonts/lato/LatoLatin-Light.ttf') format('truetype');text-rendering:optimizeLegibility}@font-face{font-family:'Lato';font-style:italic;font-weight:300;src:url('../fonts/lato/LatoLatin-LightItalic.eot');src:url('../fonts/lato/LatoLatin-LightItalic.eot?#iefix') format('embedded-opentype'),url('../fonts/lato/LatoLatin-LightItalic.ttf') format('truetype');text-rendering:optimizeLegibility}@font-face{font-family:'Open Sans';font-style:normal;font-weight:400;src:url('../fonts/opensans/OpenSans-Regular-webfont.eot');src:local('Open Sans'),local('OpenSans'),url('../fonts/opensans/OpenSans-Regular-webfont.eot?#iefix') format('embedded-opentype'),url('../fonts/opensans/OpenSans-Regular-webfont.ttf') format('truetype'),url('../fonts/opensans/OpenSans-Regular-webfont.svg#open_sansregular') format('svg')}@font-face{font-family:'Open Sans';font-style:normal;font-weight:600;src:url('../fonts/opensans/OpenSans-Semibold-webfont.eot');src:local('Open Sans Semibold'),local('OpenSans-Semibold'),url('../fonts/opensans/OpenSans-Semibold-webfont.eot?#iefix') format('embedded-opentype'),url('../fonts/opensans/OpenSans-Semibold-webfont.ttf') format('truetype'),url('../fonts/opensans/OpenSans-Semibold-webfont.svg#open_sanssemibold') format('svg')}.red{color:#fe3e39}.blue{color:#2e8aea}.black{color:#000}.turquoise{color:#03bfb3}.turquoise-d1{color:#00aea2}.color-red,.color-red i{color:#f02e28!important}.color-blue,.color-blue i{color:#00aea2!important}.color-orange,.color-orange i{color:#d9631e!important}.color-green,.color-green i{color:#1fb572!important}.color-yellow,.color-yellow i{color:#ffc011!important}.clearfix{*zoom:1}.clearfix:before,.clearfix:after{display:table;line-height:0;content:""}.clearfix:after{clear:both}.hide-text{font:0/0 a;color:transparent;text-shadow:none;background-color:transparent;border:0}.input-block-level{display:block;width:100%;min-height:30px;box-sizing:border-box}article,aside,details,figcaption,figure,footer,header,hgroup,nav,section{display:block}audio,canvas,video{display:inline-block;*display:inline;*zoom:1}audio:not([controls]){display:none}html{font-size:100%;-webkit-text-size-adjust:100%;-ms-text-size-adjust:100%}a:focus{outline:thin dotted #515054;outline:5px auto -webkit-focus-ring-color;outline-offset:-2px}a:hover,a:active{outline:0}sub,sup{position:relative;font-size:75%;line-height:0;vertical-align:baseline}sup{top:-0.5em}sub{bottom:-0.25em}img{width:auto\9;height:auto;max-width:100%;vertical-align:middle;border:0;-ms-interpolation-mode:bicubic}#map_canvas img,.google-maps img{max-width:none}button,input,select,textarea{margin:0;font-size:100%;vertical-align:middle}button,input{*overflow:visible;line-height:normal}button::-moz-focus-inner,input::-moz-focus-inner{padding:0;border:0}button,html input[type="button"],input[type="reset"],input[type="submit"]{cursor:pointer;-webkit-appearance:button}label,select,button,input[type="button"],input[type="reset"],input[type="submit"],input[type="radio"],input[type="checkbox"]{cursor:pointer}input[type="search"]{box-sizing:content-box;-webkit-appearance:textfield}input[type="search"]::-webkit-search-decoration,input[type="search"]::-webkit-search-cancel-button{-webkit-appearance:none}textarea{overflow:auto;vertical-align:top}@media print{*{color:#000!important;text-shadow:none!important;background:transparent!important;box-shadow:none!important}a,a:visited{text-decoration:underline}a[href]:after{content:" (" attr(href) ")"}abbr[title]:after{content:" (" attr(title) ")"}.ir a:after,a[href^="javascript:"]:after,a[href^="#"]:after{content:""}pre,blockquote{border:1px solid #999;page-break-inside:avoid}thead{display:table-header-group}tr,img{page-break-inside:avoid}img{max-width:100%!important}@page{margin:.5cm}p,h2,h3{orphans:3;widows:3}h2,h3{page-break-after:avoid}}body{margin:0;font-family:"Lato","Helvetica Neue",Helvetica,Arial,sans-serif;font-size:15px;line-height:20px;color:#303033;background-color:#fff}a{color:#000;text-decoration:none}a:hover,a:focus{color:#000;text-decoration:underline}.img-rounded{border-radius:6px}.img-polaroid{padding:4px;background-color:#fff;border:1px solid #ccc;border:1px solid rgba(0,0,0,0.2);box-shadow:0 1px 3px rgba(0,0,0,0.1)}.img-circle{border-radius:500px}.row{margin-left:0;*zoom:1}.row:before,.row:after{display:table;line-height:0;content:""}.row:after{clear:both}[class*="span"]{float:left;min-height:1px;margin-left:0}.container,.navbar-static-top .container,.navbar-fixed-top .container,.navbar-fixed-bottom .container{width:720px}.span12{width:720px}.span11{width:660px}.span10{width:600px}.span9{width:540px}.span8{width:480px}.span7{width:420px}.span6{width:360px}.span5{width:300px}.span4{width:240px}.span3{width:180px}.span2{width:120px}.span1{width:60px}.offset12{margin-left:720px}.offset11{margin-left:660px}.offset10{margin-left:600px}.offset9{margin-left:540px}.offset8{margin-left:480px}.offset7{margin-left:420px}.offset6{margin-left:360px}.offset5{margin-left:300px}.offset4{margin-left:240px}.offset3{margin-left:180px}.offset2{margin-left:120px}.offset1{margin-left:60px}.row-fluid{width:100%;*zoom:1}.row-fluid:before,.row-fluid:after{display:table;line-height:0;content:""}.row-fluid:after{clear:both}.row-fluid [class*="span"]{display:block;float:left;width:100%;min-height:30px;margin-left:0;*margin-left:-0.06944444444444445%;box-sizing:border-box}.row-fluid [class*="span"]:first-child{margin-left:0}.row-fluid .controls-row [class*="span"]+[class*="span"]{margin-left:0}.row-fluid .span12{width:99.99999999999999%;*width:99.93055555555554%}.row-fluid .span11{width:91.66666666666666%;*width:91.59722222222221%}.row-fluid .span10{width:83.33333333333331%;*width:83.26388888888887%}.row-fluid .span9{width:74.99999999999999%;*width:74.93055555555554%}.row-fluid .span8{width:66.66666666666666%;*width:66.59722222222221%}.row-fluid .span7{width:58.33333333333333%;*width:58.263888888888886%}.row-fluid .span6{width:49.99999999999999%;*width:49.93055555555555%}.row-fluid .span5{width:41.66666666666666%;*width:41.597222222222214%}.row-fluid .span4{width:33.33333333333333%;*width:33.263888888888886%}.row-fluid .span3{width:24.999999999999996%;*width:24.930555555555554%}.row-fluid .span2{width:16.666666666666664%;*width:16.59722222222222%}.row-fluid .span1{width:8.333333333333332%;*width:8.263888888888888%}.row-fluid .offset12{margin-left:99.99999999999999%;*margin-left:99.8611111111111%}.row-fluid .offset12:first-child{margin-left:99.99999999999999%;*margin-left:99.8611111111111%}.row-fluid .offset11{margin-left:91.66666666666666%;*margin-left:91.52777777777777%}.row-fluid .offset11:first-child{margin-left:91.66666666666666%;*margin-left:91.52777777777777%}.row-fluid .offset10{margin-left:83.33333333333331%;*margin-left:83.19444444444443%}.row-fluid .offset10:first-child{margin-left:83.33333333333331%;*margin-left:83.19444444444443%}.row-fluid .offset9{margin-left:74.99999999999999%;*margin-left:74.8611111111111%}.row-fluid .offset9:first-child{margin-left:74.99999999999999%;*margin-left:74.8611111111111%}.row-fluid .offset8{margin-left:66.66666666666666%;*margin-left:66.52777777777777%}.row-fluid .offset8:first-child{margin-left:66.66666666666666%;*margin-left:66.52777777777777%}.row-fluid .offset7{margin-left:58.33333333333333%;*margin-left:58.19444444444444%}.row-fluid .offset7:first-child{margin-left:58.33333333333333%;*margin-left:58.19444444444444%}.row-fluid .offset6{margin-left:49.99999999999999%;*margin-left:49.86111111111111%}.row-fluid .offset6:first-child{margin-left:49.99999999999999%;*margin-left:49.86111111111111%}.row-fluid .offset5{margin-left:41.66666666666666%;*margin-left:41.52777777777777%}.row-fluid .offset5:first-child{margin-left:41.66666666666666%;*margin-left:41.52777777777777%}.row-fluid .offset4{margin-left:33.33333333333333%;*margin-left:33.19444444444444%}.row-fluid .offset4:first-child{margin-left:33.33333333333333%;*margin-left:33.19444444444444%}.row-fluid .offset3{margin-left:24.999999999999996%;*margin-left:24.86111111111111%}.row-fluid .offset3:first-child{margin-left:24.999999999999996%;*margin-left:24.86111111111111%}.row-fluid .offset2{margin-left:16.666666666666664%;*margin-left:16.52777777777778%}.row-fluid .offset2:first-child{margin-left:16.666666666666664%;*margin-left:16.52777777777778%}.row-fluid .offset1{margin-left:8.333333333333332%;*margin-left:8.194444444444443%}.row-fluid .offset1:first-child{margin-left:8.333333333333332%;*margin-left:8.194444444444443%}[class*="span"].hide,.row-fluid [class*="span"].hide{display:none}[class*="span"].pull-right,.row-fluid [class*="span"].pull-right{float:right}.container{margin-right:auto;margin-left:auto;*zoom:1}.container:before,.container:after{display:table;line-height:0;content:""}.container:after{clear:both}.container-fluid{padding-right:0;padding-left:0;*zoom:1}.container-fluid:before,.container-fluid:after{display:table;line-height:0;content:""}.container-fluid:after{clear:both}p{margin:0 0 10px}.lead{margin-bottom:20px;font-size:22.5px;font-weight:200;line-height:30px}small{font-size:85%}strong{font-weight:bold}em{font-style:italic}cite{font-style:normal}.muted{color:#d9d9d9}a.muted:hover,a.muted:focus{color:#c0c0c0}.text-warning{color:#fff}a.text-warning:hover,a.text-warning:focus{color:#e6e6e6}.text-error{color:#fff}a.text-error:hover,a.text-error:focus{color:#e6e6e6}.text-info{color:#fff}a.text-info:hover,a.text-info:focus{color:#e6e6e6}.text-success{color:#fff}a.text-success:hover,a.text-success:focus{color:#e6e6e6}.text-left{text-align:left}.text-right{text-align:right}.text-center{text-align:center}h1,h2,h3,h4,h5,h6{margin:10px 0;font-family:inherit;font-weight:500;line-height:20px;color:inherit;text-rendering:optimizelegibility}h1 small,h2 small,h3 small,h4 small,h5 small,h6 small{font-weight:normal;line-height:1;color:#d9d9d9}h1,h2,h3{line-height:40px}h1{font-size:41.25px}h2{font-size:33.75px}h3{font-size:26.25px}h4{font-size:18.75px}h5{font-size:15px}h6{font-size:12.75px}h1 small{font-size:26.25px}h2 small{font-size:18.75px}h3 small{font-size:15px}h4 small{font-size:15px}.page-header{padding-bottom:9px;margin:20px 0 30px;border-bottom:1px solid #f8f8f8}ul,ol{padding:0;margin:0 0 10px 25px}ul ul,ul ol,ol ol,ol ul{margin-bottom:0}li{line-height:20px}ul.unstyled,ol.unstyled{margin-left:0;list-style:none}ul.inline,ol.inline{margin-left:0;list-style:none}ul.inline>li,ol.inline>li{display:inline-block;*display:inline;padding-right:5px;padding-left:5px;*zoom:1}dl{margin-bottom:20px}dt,dd{line-height:20px}dt{font-weight:bold}dd{margin-left:10px}.dl-horizontal{*zoom:1}.dl-horizontal:before,.dl-horizontal:after{display:table;line-height:0;content:""}.dl-horizontal:after{clear:both}.dl-horizontal dt{float:left;width:160px;overflow:hidden;clear:left;text-align:right;text-overflow:ellipsis;white-space:nowrap}.dl-horizontal dd{margin-left:180px}hr{margin:20px 0;border:0;border-top:1px solid #f3f3f5;border-bottom:1px solid #fff}abbr[title],abbr[data-original-title]{cursor:help;border-bottom:1px dotted #d9d9d9}abbr.initialism{font-size:90%;text-transform:uppercase}blockquote{padding:0 0 0 15px;margin:0 0 20px;border-left:5px solid #f8f8f8}blockquote p{margin-bottom:0;font-size:18.75px;font-weight:300;line-height:1.25}blockquote small{display:block;line-height:20px;color:#d9d9d9}blockquote small:before{content:'\2014 \00A0'}blockquote.pull-right{float:right;padding-right:15px;padding-left:0;border-right:5px solid #f8f8f8;border-left:0}blockquote.pull-right p,blockquote.pull-right small{text-align:right}blockquote.pull-right small:before{content:''}blockquote.pull-right small:after{content:'\00A0 \2014'}q:before,q:after,blockquote:before,blockquote:after{content:""}address{display:block;margin-bottom:20px;font-style:normal;line-height:20px}code,pre.code{padding:0 3px 2px;font-family:Monaco,Menlo,Consolas,"Courier New",monospace;font-size:13px;color:#343434;border-radius:3px}code{padding:2px 4px;color:#d14;white-space:nowrap;background-color:#f7f7f9;border:1px solid #e1e1e8}pre.code{display:block;padding:9.5px;margin:0 0 10px;font-size:14px;line-height:20px;word-break:break-all;word-wrap:break-word;white-space:pre;white-space:pre-wrap;background-color:#f5f5f5;border:1px solid #ccc;border:1px solid rgba(0,0,0,0.15);border-radius:3px}pre.code.prettyprint{margin-bottom:20px}pre.code code{padding:0;color:inherit;white-space:pre;white-space:pre-wrap;background-color:transparent;border:0}.pre-scrollable{max-height:340px;overflow-y:scroll}table{max-width:100%;background-color:transparent;border-collapse:collapse;border-spacing:0}.table{width:100%;margin-bottom:20px}.table th,.table td{padding:8px;line-height:20px;text-align:left;vertical-align:top;border-top:1px solid #d8d7d9}.table th{font-weight:bold}.table thead th{vertical-align:bottom}.table caption+thead tr:first-child th,.table caption+thead tr:first-child td,.table colgroup+thead tr:first-child th,.table colgroup+thead tr:first-child td,.table thead:first-child tr:first-child th,.table thead:first-child tr:first-child td{border-top:0}.table tbody+tbody{border-top:2px solid #d8d7d9}.table .table{background-color:#fff}.table-condensed th,.table-condensed td{padding:4px 5px}.table-bordered{border:1px solid #d8d7d9;border-collapse:separate;*border-collapse:collapse;border-left:0;border-radius:3px}.table-bordered th,.table-bordered td{border-left:1px solid #d8d7d9}.table-bordered caption+thead tr:first-child th,.table-bordered caption+tbody tr:first-child th,.table-bordered caption+tbody tr:first-child td,.table-bordered colgroup+thead tr:first-child th,.table-bordered colgroup+tbody tr:first-child th,.table-bordered colgroup+tbody tr:first-child td,.table-bordered thead:first-child tr:first-child th,.table-bordered tbody:first-child tr:first-child th,.table-bordered tbody:first-child tr:first-child td{border-top:0}.table-bordered thead:first-child tr:first-child>th:first-child,.table-bordered tbody:first-child tr:first-child>td:first-child,.table-bordered tbody:first-child tr:first-child>th:first-child{border-top-left-radius:3px;-moz-border-radius-topleft:3px}.table-bordered thead:first-child tr:first-child>th:last-child,.table-bordered tbody:first-child tr:first-child>td:last-child,.table-bordered tbody:first-child tr:first-child>th:last-child{border-top-right-radius:3px;-moz-border-radius-topright:3px}.table-bordered thead:last-child tr:last-child>th:first-child,.table-bordered tbody:last-child tr:last-child>td:first-child,.table-bordered tbody:last-child tr:last-child>th:first-child,.table-bordered tfoot:last-child tr:last-child>td:first-child,.table-bordered tfoot:last-child tr:last-child>th:first-child{border-bottom-left-radius:3px;-moz-border-radius-bottomleft:3px}.table-bordered thead:last-child tr:last-child>th:last-child,.table-bordered tbody:last-child tr:last-child>td:last-child,.table-bordered tbody:last-child tr:last-child>th:last-child,.table-bordered tfoot:last-child tr:last-child>td:last-child,.table-bordered tfoot:last-child tr:last-child>th:last-child{border-bottom-right-radius:3px;-moz-border-radius-bottomright:3px}.table-bordered tfoot+tbody:last-child tr:last-child td:first-child{border-bottom-left-radius:0;-moz-border-radius-bottomleft:0}.table-bordered tfoot+tbody:last-child tr:last-child td:last-child{border-bottom-right-radius:0;-moz-border-radius-bottomright:0}.table-bordered caption+thead tr:first-child th:first-child,.table-bordered caption+tbody tr:first-child td:first-child,.table-bordered colgroup+thead tr:first-child th:first-child,.table-bordered colgroup+tbody tr:first-child td:first-child{border-top-left-radius:3px;-moz-border-radius-topleft:3px}.table-bordered caption+thead tr:first-child th:last-child,.table-bordered caption+tbody tr:first-child td:last-child,.table-bordered colgroup+thead tr:first-child th:last-child,.table-bordered colgroup+tbody tr:first-child td:last-child{border-top-right-radius:3px;-moz-border-radius-topright:3px}.table-striped tbody>tr:nth-child(odd)>td,.table-striped tbody>tr:nth-child(odd)>th{background-color:#f3f3f5}.table-hover tbody tr:hover>td,.table-hover tbody tr:hover>th{background-color:#e9e9eb}table td[class*="span"],table th[class*="span"],.row-fluid table td[class*="span"],.row-fluid table th[class*="span"]{display:table-cell;float:none;margin-left:0}.table td.span1,.table th.span1{float:none;width:44px;margin-left:0}.table td.span2,.table th.span2{float:none;width:104px;margin-left:0}.table td.span3,.table th.span3{float:none;width:164px;margin-left:0}.table td.span4,.table th.span4{float:none;width:224px;margin-left:0}.table td.span5,.table th.span5{float:none;width:284px;margin-left:0}.table td.span6,.table th.span6{float:none;width:344px;margin-left:0}.table td.span7,.table th.span7{float:none;width:404px;margin-left:0}.table td.span8,.table th.span8{float:none;width:464px;margin-left:0}.table td.span9,.table th.span9{float:none;width:524px;margin-left:0}.table td.span10,.table th.span10{float:none;width:584px;margin-left:0}.table td.span11,.table th.span11{float:none;width:644px;margin-left:0}.table td.span12,.table th.span12{float:none;width:704px;margin-left:0}.table tbody tr.success>td{background-color:#1fb572}.table tbody tr.error>td{background-color:#f02e28}.table tbody tr.warning>td{background-color:#f0ac00}.table tbody tr.info>td{background-color:#00aea2}.table-hover tbody tr.success:hover>td{background-color:#1b9f64}.table-hover tbody tr.error:hover>td{background-color:#ee1711}.table-hover tbody tr.warning:hover>td{background-color:#d79a00}.table-hover tbody tr.info:hover>td{background-color:#00958a}.dropup,.dropdown{position:relative}.dropdown-toggle{*margin-bottom:-3px}.dropdown-toggle:active,.open .dropdown-toggle{outline:0}.caret{display:inline-block;width:0;height:0;vertical-align:top;border-top:4px solid #000;border-right:4px solid transparent;border-left:4px solid transparent;content:""}.dropdown .caret{margin-top:8px;margin-left:2px}.dropdown-menu{position:absolute;top:100%;left:0;z-index:1000;display:none;float:left;min-width:160px;padding:5px 0;margin:2px 0 0;list-style:none;background-color:#fff;border:1px solid #ccc;border:1px solid #d8d7d9;*border-right-width:2px;*border-bottom-width:2px;border-radius:6px;box-shadow:0 5px 10px rgba(0,0,0,0.2);background-clip:padding-box}.dropdown-menu.pull-right{right:0;left:auto}.dropdown-menu .divider{*width:100%;height:1px;margin:9px 1px;*margin:-5px 0 5px;overflow:hidden;background-color:#d8d7d9;border-bottom:1px solid #fff}.dropdown-menu>li>a{display:block;padding:3px 20px;clear:both;font-weight:normal;line-height:20px;color:#303033;white-space:nowrap}.dropdown-menu>li>a:hover,.dropdown-menu>li>a:focus,.dropdown-submenu:hover>a,.dropdown-submenu:focus>a{color:#fff;text-decoration:none;background-color:#000;background-image:linear-gradient(to bottom,#000,#000);background-repeat:repeat-x;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff000000',endColorstr='#ff000000',GradientType=0)}.dropdown-menu>.active>a,.dropdown-menu>.active>a:hover,.dropdown-menu>.active>a:focus{color:#fff;text-decoration:none;background-color:#000;background-image:linear-gradient(to bottom,#000,#000);background-repeat:repeat-x;outline:0;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff000000',endColorstr='#ff000000',GradientType=0)}.dropdown-menu>.disabled>a,.dropdown-menu>.disabled>a:hover,.dropdown-menu>.disabled>a:focus{color:#d9d9d9}.dropdown-menu>.disabled>a:hover,.dropdown-menu>.disabled>a:focus{text-decoration:none;cursor:default;background-color:transparent;background-image:none;filter:progid:DXImageTransform.Microsoft.gradient(enabled=false)}.open{*z-index:1000}.open>.dropdown-menu{display:block}.pull-right>.dropdown-menu{right:0;left:auto}.dropup .caret,.navbar-fixed-bottom .dropdown .caret{border-top:0;border-bottom:4px solid #000;content:""}.dropup .dropdown-menu,.navbar-fixed-bottom .dropdown .dropdown-menu{top:auto;bottom:100%;margin-bottom:1px}.dropdown-submenu{position:relative}.dropdown-submenu>.dropdown-menu{top:0;left:100%;margin-top:-6px;margin-left:-1px;border-radius:0 6px 6px 6px}.dropdown-submenu:hover>.dropdown-menu{display:block}.dropup .dropdown-submenu>.dropdown-menu{top:auto;bottom:0;margin-top:0;margin-bottom:-2px;border-radius:5px 5px 5px 0}.dropdown-submenu>a:after{display:block;float:right;width:0;height:0;margin-top:5px;margin-right:-10px;border-color:transparent;border-left-color:#ccc;border-style:solid;border-width:5px 0 5px 5px;content:" "}.dropdown-submenu:hover>a:after{border-left-color:#fff}.dropdown-submenu.pull-left{float:none}.dropdown-submenu.pull-left>.dropdown-menu{left:-100%;margin-left:10px;border-radius:6px 0 6px 6px}.dropdown .dropdown-menu .nav-header{padding-right:20px;padding-left:20px}.typeahead{z-index:1051;margin-top:2px;border-radius:3px}.well{min-height:20px;padding:19px;margin-bottom:20px;background-color:#f3f3f5;border:1px solid #e0e0e5;border-radius:3px;box-shadow:inset 0 1px 1px rgba(0,0,0,0.05)}.well blockquote{border-color:#ddd;border-color:rgba(0,0,0,0.15)}.well-large{padding:24px;border-radius:3px}.well-small{padding:9px;border-radius:3px}.fade{opacity:0;transition:opacity .15s linear}.fade.in{opacity:1}.collapse{position:relative;height:0;overflow:hidden;transition:height .35s ease}.collapse.in{height:auto}.close{float:right;font-size:20px;font-weight:bold;line-height:20px;color:#000;text-shadow:0 1px 0 #fff;opacity:.2;filter:alpha(opacity=20)}.close:hover,.close:focus{color:#000;text-decoration:none;cursor:pointer;opacity:.4;filter:alpha(opacity=40)}button.close{padding:0;cursor:pointer;background:transparent;border:0;-webkit-appearance:none}.btn-group{position:relative;display:inline-block;*display:inline;*margin-left:.3em;font-size:0;white-space:nowrap;vertical-align:middle;*zoom:1}.btn-group:first-child{*margin-left:0}.btn-group+.btn-group{margin-left:5px}.btn-toolbar{margin-top:10px;margin-bottom:10px;font-size:0}.btn-toolbar>.btn+.btn,.btn-toolbar>.btn-group+.btn,.btn-toolbar>.btn+.btn-group{margin-left:5px}.btn-group>.btn{position:relative;border-radius:0}.btn-group>.btn+.btn{margin-left:-1px}.btn-group>.btn,.btn-group>.dropdown-menu,.btn-group>.popover{font-size:15px}.btn-group>.btn-mini{font-size:11.25px}.btn-group>.btn-small{font-size:12.75px}.btn-group>.btn-large{font-size:18.75px}.btn-group>.btn:first-child{margin-left:0;border-bottom-left-radius:3px;border-top-left-radius:3px;-moz-border-radius-bottomleft:3px;-moz-border-radius-topleft:3px}.btn-group>.btn:last-child,.btn-group>.dropdown-toggle{border-top-right-radius:3px;border-bottom-right-radius:3px;-moz-border-radius-topright:3px;-moz-border-radius-bottomright:3px}.btn-group>.btn.large:first-child{margin-left:0;border-bottom-left-radius:3px;border-top-left-radius:3px;-moz-border-radius-bottomleft:3px;-moz-border-radius-topleft:3px}.btn-group>.btn.large:last-child,.btn-group>.large.dropdown-toggle{border-top-right-radius:3px;border-bottom-right-radius:3px;-moz-border-radius-topright:3px;-moz-border-radius-bottomright:3px}.btn-group>.btn:hover,.btn-group>.btn:focus,.btn-group>.btn:active,.btn-group>.btn.active{z-index:2}.btn-group .dropdown-toggle:active,.btn-group.open .dropdown-toggle{outline:0}.btn-group>.btn+.dropdown-toggle{*padding-top:5px;padding-right:8px;*padding-bottom:5px;padding-left:8px;box-shadow:inset 1px 0 0 rgba(255,255,255,0.125),inset 0 1px 0 rgba(255,255,255,0.2),0 1px 2px rgba(0,0,0,0.05)}.btn-group>.btn-mini+.dropdown-toggle{*padding-top:2px;padding-right:5px;*padding-bottom:2px;padding-left:5px}.btn-group>.btn-small+.dropdown-toggle{*padding-top:5px;*padding-bottom:4px}.btn-group>.btn-large+.dropdown-toggle{*padding-top:7px;padding-right:12px;*padding-bottom:7px;padding-left:12px}.btn-group.open .dropdown-toggle{background-image:none;box-shadow:inset 0 2px 4px rgba(0,0,0,0.15),0 1px 2px rgba(0,0,0,0.05)}.btn-group.open .btn.dropdown-toggle{background-color:#e9e9eb}.btn-group.open .btn-primary.dropdown-toggle{background-color:#35c786}.btn-group.open .btn-warning.dropdown-toggle{background-color:#fe6561}.btn-group.open .btn-danger.dropdown-toggle{background-color:#fe6561}.btn-group.open .btn-success.dropdown-toggle{background-color:#35c786}.btn-group.open .btn-info.dropdown-toggle{background-color:#675e7a}.btn-group.open .btn-inverse.dropdown-toggle{background-color:#303033}.btn .caret{margin-top:8px;margin-left:0}.btn-large .caret{margin-top:6px}.btn-large .caret{border-top-width:5px;border-right-width:5px;border-left-width:5px}.btn-mini .caret,.btn-small .caret{margin-top:8px}.dropup .btn-large .caret{border-bottom-width:5px}.btn-primary .caret,.btn-warning .caret,.btn-danger .caret,.btn-info .caret,.btn-success .caret,.btn-inverse .caret{border-top-color:#fff;border-bottom-color:#fff}.btn-group-vertical{display:inline-block;*display:inline;*zoom:1}.btn-group-vertical>.btn{display:block;float:none;max-width:100%;border-radius:0}.btn-group-vertical>.btn+.btn{margin-top:-1px;margin-left:0}.btn-group-vertical>.btn:first-child{border-radius:3px 3px 0 0}.btn-group-vertical>.btn:last-child{border-radius:0 0 3px 3px}.btn-group-vertical>.btn-large:first-child{border-radius:3px 3px 0 0}.btn-group-vertical>.btn-large:last-child{border-radius:0 0 3px 3px}.alert{padding:8px 35px 8px 14px;margin-bottom:20px;background-color:#f0ac00;border:1px solid transparent;border-radius:0}.alert,.alert h4,.alert a{color:#fff}.alert h4{margin:0}.alert .close{position:relative;top:-2px;right:-21px;line-height:20px}.close.-align-right{right:0}.alert-success{color:#fff;background-color:#1fb572;border-color:transparent}.alert-success h4{color:#fff}.alert-danger,.alert-error{color:#fff;background-color:#f02e28;border-color:transparent}.alert-danger h4,.alert-error h4{color:#fff}.alert-info{color:#fff;background-color:#00aea2;border-color:transparent}.alert-info h4{color:#fff}.alert-form{color:#515054;background-color:#f3f3f5;border:1px solid #515054!important}.alert-form.-no-border{border:none!important}.alert-form h4{color:#515054}.alert-block{padding-top:14px;padding-bottom:14px}.alert-block>p,.alert-block>ul{margin-bottom:0}.alert-block p+p{margin-top:5px}.list-icons li{max-width:300px;padding-left:35px}.list-icons li>i.icon{padding-right:7px;margin-left:-25px}.icon.handle{color:#d8d7d9}.nav{margin-bottom:20px;margin-left:0;list-style:none}.nav>li>a{display:block}.nav>li>a:hover,.nav>li>a:focus{text-decoration:none;background-color:#f3f3f5}.nav>li>a>img{max-width:none}.nav>.pull-right{float:right}.nav-header{display:block;padding:3px 15px;font-size:12px;font-weight:bold;line-height:20px;color:#d8d7d9;text-transform:uppercase}.nav li+.nav-header{margin-top:9px}.nav-list{padding-right:15px;padding-left:15px;margin-bottom:0}.nav-list>li>a,.nav-list .nav-header{margin-right:-15px;margin-left:-15px}.nav-list>li>a{padding:3px 15px}.nav-list>.active>a,.nav-list>.active>a:hover,.nav-list>.active>a:focus{color:#fff;background-color:#000}.nav-list [class^="icon-"],.nav-list [class*=" icon-"]{margin-right:2px}.nav-list .divider{*width:100%;height:1px;margin:9px 1px;*margin:-5px 0 5px;overflow:hidden;background-color:#d8d7d9;border-bottom:1px solid #fff}.nav-tabs,.nav-pills{*zoom:1}.nav-tabs:before,.nav-pills:before,.nav-tabs:after,.nav-pills:after{display:table;line-height:0;content:""}.nav-tabs:after,.nav-pills:after{clear:both}.nav-tabs>li,.nav-pills>li{float:left}.nav-tabs>li>a,.nav-pills>li>a{padding-right:8px;padding-left:8px;margin-right:2px;line-height:14px;border-radius:3px 3px 0 0}.nav-tabs{border-bottom:1px solid #b3afbd}.nav-tabs>li{margin-bottom:-1px}.nav-tabs>li>a{padding-top:5px;padding-bottom:4px;line-height:20px;color:#515054;border:1px solid transparent}.nav-tabs>li>a:hover{color:#000}.nav-tabs>li>a:hover,.nav-tabs>li>a:focus{border-color:transparent transparent #b3afbd}.nav-tabs>.active>a,.nav-tabs>.active>a:hover,.nav-tabs>.active>a:focus{color:#000;cursor:default;background-color:#fff;border:1px solid #b3afbd;border-bottom-color:transparent}.show-validation .tab-error a,.show-validation .tab-error a:hover,.show-validation .tab-error a:focus{color:#fff!important;background-color:#fe3e39!important;border-color:transparent}.show-validation .tab-error a:before{margin-right:5px;font-family:'icomoon';vertical-align:top;content:"\e25d"}.umb-nav-tabs{margin:-8px 0 0 0}.nav-pills>li>a{padding-top:8px;padding-bottom:8px;margin-top:2px;margin-bottom:2px;border-radius:5px}.nav-pills>.active>a,.nav-pills>.active>a:hover,.nav-pills>.active>a:focus{color:#fff;background-color:#000}.nav-stacked>li{float:none}.nav-stacked>li>a{margin-right:0}.nav-tabs.nav-stacked{border-bottom:0}.nav-tabs.nav-stacked>li>a{border:1px solid #d8d7d9;border-radius:0}.nav-tabs.nav-stacked>li:first-child>a{border-top-right-radius:4px;border-top-left-radius:4px;-moz-border-radius-topright:4px;-moz-border-radius-topleft:4px}.nav-tabs.nav-stacked>li:last-child>a{border-bottom-right-radius:4px;border-bottom-left-radius:4px;-moz-border-radius-bottomright:4px;-moz-border-radius-bottomleft:4px}.nav-tabs.nav-stacked>li>a:hover,.nav-tabs.nav-stacked>li>a:focus{z-index:2;border-color:#d8d7d9}.nav-pills.nav-stacked>li>a{margin-bottom:3px}.nav-pills.nav-stacked>li:last-child>a{margin-bottom:1px}.dropdown-menu{border-radius:0}.dropdown-menu>li>a{padding:8px 20px}.nav-tabs .dropdown-menu{border-radius:0 0 3px 3px}.nav-pills .dropdown-menu{border-radius:6px}.nav .dropdown-toggle .caret{margin-top:6px;border-top-color:#000;border-bottom-color:#000}.nav .dropdown-toggle:hover .caret,.nav .dropdown-toggle:focus .caret{border-top-color:#000;border-bottom-color:#000}.nav-tabs .dropdown-toggle .caret{margin-top:8px}.nav .active .dropdown-toggle .caret{border-top-color:#fff;border-bottom-color:#fff}.nav-tabs .active .dropdown-toggle .caret{border-top-color:#515054;border-bottom-color:#515054}.nav>.dropdown.active>a:hover,.nav>.dropdown.active>a:focus{cursor:pointer}.nav-tabs .open .dropdown-toggle,.nav-pills .open .dropdown-toggle,.nav>li.dropdown.open.active>a:hover,.nav>li.dropdown.open.active>a:focus{background-color:#d8d7d9;border-color:#d8d7d9}.nav li.dropdown.open .caret,.nav li.dropdown.open.active .caret,.nav li.dropdown.open a:hover .caret,.nav li.dropdown.open a:focus .caret{border-top-color:#fff;border-bottom-color:#fff;opacity:1;filter:alpha(opacity=100)}.tabs-stacked .open>a:hover,.tabs-stacked .open>a:focus{border-color:#d8d7d9}.tabbable{*zoom:1}.tabbable:before,.tabbable:after{display:table;line-height:0;content:""}.tabbable:after{clear:both}.tab-content{overflow:auto}.tabs-below>.nav-tabs,.tabs-right>.nav-tabs,.tabs-left>.nav-tabs{border-bottom:0}.tab-content>.tab-pane,.pill-content>.pill-pane{display:none}.tab-content>.active,.pill-content>.active{display:block}.tabs-below>.nav-tabs{border-top:1px solid #d8d7d9}.tabs-below>.nav-tabs>li{margin-top:-1px;margin-bottom:0}.tabs-below>.nav-tabs>li>a{border-radius:0 0 4px 4px}.tabs-below>.nav-tabs>li>a:hover,.tabs-below>.nav-tabs>li>a:focus{border-top-color:#d8d7d9;border-bottom-color:transparent}.tabs-below>.nav-tabs>.active>a,.tabs-below>.nav-tabs>.active>a:hover,.tabs-below>.nav-tabs>.active>a:focus{border-color:transparent #d8d7d9 #d8d7d9 #d8d7d9}.tabs-left>.nav-tabs>li,.tabs-right>.nav-tabs>li{float:none}.tabs-left>.nav-tabs>li>a,.tabs-right>.nav-tabs>li>a{min-width:74px;margin-right:0;margin-bottom:3px}.tabs-left>.nav-tabs{float:left;margin-right:19px;border-right:1px solid #d8d7d9}.tabs-left>.nav-tabs>li>a{margin-right:-1px;border-radius:4px 0 0 4px}.tabs-left>.nav-tabs>li>a:hover,.tabs-left>.nav-tabs>li>a:focus{border-color:#f3f3f5 #d8d7d9 #f3f3f5 #f3f3f5}.tabs-left>.nav-tabs .active>a,.tabs-left>.nav-tabs .active>a:hover,.tabs-left>.nav-tabs .active>a:focus{border-color:#d8d7d9 transparent #d8d7d9 #d8d7d9;*border-right-color:#fff}.tabs-right>.nav-tabs{float:right;margin-left:19px;border-left:1px solid #d8d7d9}.tabs-right>.nav-tabs>li>a{margin-left:-1px;border-radius:0 4px 4px 0}.tabs-right>.nav-tabs>li>a:hover,.tabs-right>.nav-tabs>li>a:focus{border-color:#f3f3f5 #f3f3f5 #f3f3f5 #d8d7d9}.tabs-right>.nav-tabs .active>a,.tabs-right>.nav-tabs .active>a:hover,.tabs-right>.nav-tabs .active>a:focus{border-color:#d8d7d9 #d8d7d9 #d8d7d9 transparent;*border-left-color:#fff}.nav>.disabled>a{color:#d8d7d9}.nav>.disabled>a:hover,.nav>.disabled>a:focus{text-decoration:none;cursor:default;background-color:transparent}.navbar{*position:relative;*z-index:2;margin-bottom:20px;overflow:visible}.navbar-inner{min-height:40px;padding-right:20px;padding-left:20px;background-color:#fafafa;background-image:linear-gradient(to bottom,#fff,#f2f2f2);background-repeat:repeat-x;border:1px solid #d4d4d4;border-radius:3px;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffffffff',endColorstr='#fff2f2f2',GradientType=0);*zoom:1;box-shadow:0 1px 4px rgba(0,0,0,0.065)}.navbar-inner:before,.navbar-inner:after{display:table;line-height:0;content:""}.navbar-inner:after{clear:both}.navbar .container{width:auto}.nav-collapse.collapse{height:auto;overflow:visible}.navbar .brand{display:block;float:left;padding:10px 20px 10px;margin-left:-20px;font-size:20px;font-weight:200;color:#68676b;text-shadow:0 1px 0 #fff}.navbar .brand:hover,.navbar .brand:focus{text-decoration:none}.navbar-text{margin-bottom:0;line-height:40px;color:#68676b}.navbar-link{color:#68676b}.navbar-link:hover,.navbar-link:focus{color:#303033}.navbar .divider-vertical{height:40px;margin:0 9px;border-right:1px solid #fff;border-left:1px solid #f2f2f2}.navbar .btn,.navbar .btn-group{margin-top:5px}.navbar .btn-group .btn,.navbar .input-prepend .btn,.navbar .input-append .btn,.navbar .input-prepend .btn-group,.navbar .input-append .btn-group{margin-top:0}.navbar-form{margin-bottom:0;*zoom:1}.navbar-form:before,.navbar-form:after{display:table;line-height:0;content:""}.navbar-form:after{clear:both}.navbar-form input,.navbar-form select,.navbar-form .radio,.navbar-form .checkbox{margin-top:5px}.navbar-form input,.navbar-form select,.navbar-form .btn{display:inline-block;margin-bottom:0}.navbar-form input[type="image"],.navbar-form input[type="checkbox"],.navbar-form input[type="radio"]{margin-top:3px}.navbar-form .input-append,.navbar-form .input-prepend{margin-top:5px;white-space:nowrap}.navbar-form .input-append input,.navbar-form .input-prepend input{margin-top:0}.navbar-search{position:relative;float:left;margin-top:5px;margin-bottom:0}.navbar-search .search-query{padding:4px 14px;margin-bottom:0;font-family:"Lato","Helvetica Neue",Helvetica,Arial,sans-serif;font-size:13px;font-weight:normal;line-height:1;border-radius:15px}.navbar-static-top{position:static;margin-bottom:0}.navbar-static-top .navbar-inner{border-radius:0}.navbar-fixed-top,.navbar-fixed-bottom{position:fixed;right:0;left:0;z-index:1030;margin-bottom:0}.navbar-fixed-top .navbar-inner,.navbar-static-top .navbar-inner{border-width:0 0 1px}.navbar-fixed-bottom .navbar-inner{border-width:1px 0 0}.navbar-fixed-top .navbar-inner,.navbar-fixed-bottom .navbar-inner{padding-right:0;padding-left:0;border-radius:0}.navbar-static-top .container,.navbar-fixed-top .container,.navbar-fixed-bottom .container{width:720px}.navbar-fixed-top{top:0}.navbar-fixed-top .navbar-inner,.navbar-static-top .navbar-inner{box-shadow:0 1px 10px rgba(0,0,0,0.1)}.navbar-fixed-bottom{bottom:0}.navbar-fixed-bottom .navbar-inner{box-shadow:0 -1px 10px rgba(0,0,0,0.1)}.navbar .nav{position:relative;left:0;display:block;float:left;margin:0 10px 0 0}.navbar .nav.pull-right{float:right;margin-right:0}.navbar .nav>li{float:left}.navbar .nav>li>a{float:none;padding:10px 15px 10px;color:#68676b;text-decoration:none;text-shadow:0 1px 0 #fff}.navbar .nav .dropdown-toggle .caret{margin-top:8px}.navbar .nav>li>a:focus,.navbar .nav>li>a:hover{color:#303033;text-decoration:none;background-color:transparent}.navbar .nav>.active>a,.navbar .nav>.active>a:hover,.navbar .nav>.active>a:focus{color:#515054;text-decoration:none;background-color:#e5e5e5;box-shadow:inset 0 3px 8px rgba(0,0,0,0.125)}.navbar .btn-navbar{display:none;float:right;padding:7px 10px;margin-right:5px;margin-left:5px;color:#fff;background-color:#ededed;*background-color:#e5e5e5;background-image:linear-gradient(to bottom,#f2f2f2,#e5e5e5);background-repeat:repeat-x;border-color:#e5e5e5 #e5e5e5 #bfbfbf;border-color:rgba(0,0,0,0.1) rgba(0,0,0,0.1) rgba(0,0,0,0.25);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#fff2f2f2',endColorstr='#ffe5e5e5',GradientType=0);filter:progid:DXImageTransform.Microsoft.gradient(enabled=false);box-shadow:inset 0 1px 0 rgba(255,255,255,0.1),0 1px 0 rgba(255,255,255,0.075)}.navbar .btn-navbar:hover,.navbar .btn-navbar:focus,.navbar .btn-navbar:active{background-color:#ededed}.navbar .btn-navbar:hover,.navbar .btn-navbar:focus,.navbar .btn-navbar:active,.navbar .btn-navbar.active,.navbar .btn-navbar.disabled,.navbar .btn-navbar[disabled]{color:#fff;*background-color:#d9d9d9}.navbar .btn-navbar:active,.navbar .btn-navbar.active{background-color:#ccc \9}.navbar .btn-navbar .icon-bar{display:block;width:18px;height:2px;background-color:#f5f5f5;border-radius:1px;box-shadow:0 1px 0 rgba(0,0,0,0.25)}.btn-navbar .icon-bar+.icon-bar{margin-top:3px}.navbar .nav>li>.dropdown-menu:before{position:absolute;top:-7px;left:9px;display:inline-block;border-right:7px solid transparent;border-bottom:7px solid #ccc;border-left:7px solid transparent;border-bottom-color:#d8d7d9;content:''}.navbar .nav>li>.dropdown-menu:after{position:absolute;top:-6px;left:10px;display:inline-block;border-right:6px solid transparent;border-bottom:6px solid #fff;border-left:6px solid transparent;content:''}.navbar-fixed-bottom .nav>li>.dropdown-menu:before{top:auto;bottom:-7px;border-top:7px solid #ccc;border-bottom:0;border-top-color:#d8d7d9}.navbar-fixed-bottom .nav>li>.dropdown-menu:after{top:auto;bottom:-6px;border-top:6px solid #fff;border-bottom:0}.navbar .nav li.dropdown>a:hover .caret,.navbar .nav li.dropdown>a:focus .caret{border-top-color:#303033;border-bottom-color:#303033}.navbar .nav li.dropdown.open>.dropdown-toggle,.navbar .nav li.dropdown.active>.dropdown-toggle,.navbar .nav li.dropdown.open.active>.dropdown-toggle{color:#515054;background-color:#e5e5e5}.navbar .nav li.dropdown>.dropdown-toggle .caret{border-top-color:#68676b;border-bottom-color:#68676b}.navbar .nav li.dropdown.open>.dropdown-toggle .caret,.navbar .nav li.dropdown.active>.dropdown-toggle .caret,.navbar .nav li.dropdown.open.active>.dropdown-toggle .caret{border-top-color:#515054;border-bottom-color:#515054}.navbar .pull-right>li>.dropdown-menu,.navbar .nav>li>.dropdown-menu.pull-right{right:0;left:auto}.navbar .pull-right>li>.dropdown-menu:before,.navbar .nav>li>.dropdown-menu.pull-right:before{right:12px;left:auto}.navbar .pull-right>li>.dropdown-menu:after,.navbar .nav>li>.dropdown-menu.pull-right:after{right:13px;left:auto}.navbar .pull-right>li>.dropdown-menu .dropdown-menu,.navbar .nav>li>.dropdown-menu.pull-right .dropdown-menu{right:100%;left:auto;margin-right:-1px;margin-left:0;border-radius:6px 0 6px 6px}.navbar-inverse .navbar-inner{background-color:#29282a;background-image:linear-gradient(to bottom,#303033,#1e1c1c);background-repeat:repeat-x;border-color:#303033;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff303033',endColorstr='#ff1e1c1c',GradientType=0)}.navbar-inverse .brand,.navbar-inverse .nav>li>a{color:#d8d7d9;text-shadow:0 -1px 0 rgba(0,0,0,0.25)}.navbar-inverse .brand:hover,.navbar-inverse .nav>li>a:hover,.navbar-inverse .brand:focus,.navbar-inverse .nav>li>a:focus{color:#fff}.navbar-inverse .brand{color:#d8d7d9}.navbar-inverse .navbar-text{color:#d8d7d9}.navbar-inverse .nav>li>a:focus,.navbar-inverse .nav>li>a:hover{color:#fff;background-color:transparent}.navbar-inverse .nav .active>a,.navbar-inverse .nav .active>a:hover,.navbar-inverse .nav .active>a:focus{color:#fff;background-color:#1e1c1c}.navbar-inverse .navbar-link{color:#d8d7d9}.navbar-inverse .navbar-link:hover,.navbar-inverse .navbar-link:focus{color:#fff}.navbar-inverse .divider-vertical{border-right-color:#303033;border-left-color:#1e1c1c}.navbar-inverse .nav li.dropdown.open>.dropdown-toggle,.navbar-inverse .nav li.dropdown.active>.dropdown-toggle,.navbar-inverse .nav li.dropdown.open.active>.dropdown-toggle{color:#fff;background-color:#1e1c1c}.navbar-inverse .nav li.dropdown>a:hover .caret,.navbar-inverse .nav li.dropdown>a:focus .caret{border-top-color:#fff;border-bottom-color:#fff}.navbar-inverse .nav li.dropdown>.dropdown-toggle .caret{border-top-color:#d8d7d9;border-bottom-color:#d8d7d9}.navbar-inverse .nav li.dropdown.open>.dropdown-toggle .caret,.navbar-inverse .nav li.dropdown.active>.dropdown-toggle .caret,.navbar-inverse .nav li.dropdown.open.active>.dropdown-toggle .caret{border-top-color:#fff;border-bottom-color:#fff}.navbar-inverse .navbar-search .search-query{color:#fff;background-color:#605a5a;border-color:#1e1c1c;box-shadow:inset 0 1px 2px rgba(0,0,0,0.1),0 1px 0 rgba(255,255,255,0.15);transition:none}.navbar-inverse .navbar-search .search-query:-moz-placeholder{color:#bbbabf}.navbar-inverse .navbar-search .search-query:-ms-input-placeholder{color:#bbbabf}.navbar-inverse .navbar-search .search-query::-webkit-input-placeholder{color:#bbbabf}.navbar-inverse .navbar-search .search-query:focus,.navbar-inverse .navbar-search .search-query.focused{padding:5px 15px;color:#343434;text-shadow:0 1px 0 #fff;background-color:#fff;border:0;outline:0;box-shadow:0 0 3px rgba(0,0,0,0.15)}.navbar-inverse .btn-navbar{color:#fff;background-color:#1c1c1d;*background-color:#111010;background-image:linear-gradient(to bottom,#242426,#111010);background-repeat:repeat-x;border-color:#111010 #111010 #000;border-color:rgba(0,0,0,0.1) rgba(0,0,0,0.1) rgba(0,0,0,0.25);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff242426',endColorstr='#ff111010',GradientType=0);filter:progid:DXImageTransform.Microsoft.gradient(enabled=false)}.navbar-inverse .btn-navbar:hover,.navbar-inverse .btn-navbar:focus,.navbar-inverse .btn-navbar:active{background-color:#1f1f21}.navbar-inverse .btn-navbar:hover,.navbar-inverse .btn-navbar:focus,.navbar-inverse .btn-navbar:active,.navbar-inverse .btn-navbar.active,.navbar-inverse .btn-navbar.disabled,.navbar-inverse .btn-navbar[disabled]{color:#fff;*background-color:#040303}.navbar-inverse .btn-navbar:active,.navbar-inverse .btn-navbar.active{background-color:#000 \9}.breadcrumb{padding:8px 15px;margin:0 0 20px;list-style:none;background-color:#f5f5f5;border-radius:3px}.breadcrumb>li{display:inline-block;*display:inline;text-shadow:0 1px 0 #fff;*zoom:1}.breadcrumb>li>.divider{padding:0 5px;color:#ccc}.breadcrumb>.active{color:#d9d9d9}.pagination{margin:20px 0}.pagination ul{display:inline-block;*display:inline;margin-bottom:0;margin-left:0;border-radius:3px;*zoom:1;box-shadow:0 1px 2px rgba(0,0,0,0.05)}.pagination ul>li{display:inline}.pagination ul>li>a,.pagination ul>li>span{float:left;padding:4px 12px;line-height:20px;text-decoration:none;background-color:#fff;border:1px solid #d8d7d9;border-left-width:0}.pagination ul>li>a:hover,.pagination ul>li>a:focus,.pagination ul>.active>a,.pagination ul>.active>span{background-color:#f3f3f5}.pagination ul>.active>a,.pagination ul>.active>span{color:#d9d9d9;cursor:default}.pagination ul>.disabled>span,.pagination ul>.disabled>a,.pagination ul>.disabled>a:hover,.pagination ul>.disabled>a:focus{color:#d9d9d9;cursor:default;background-color:transparent}.pagination ul>li:first-child>a,.pagination ul>li:first-child>span{border-left-width:1px;border-bottom-left-radius:3px;border-top-left-radius:3px;-moz-border-radius-bottomleft:3px;-moz-border-radius-topleft:3px}.pagination ul>li:last-child>a,.pagination ul>li:last-child>span{border-top-right-radius:3px;border-bottom-right-radius:3px;-moz-border-radius-topright:3px;-moz-border-radius-bottomright:3px}.pagination-centered{text-align:center}.pagination-right{text-align:right}.pagination-large ul>li>a,.pagination-large ul>li>span{padding:11px 19px;font-size:18.75px}.pagination-large ul>li:first-child>a,.pagination-large ul>li:first-child>span{border-bottom-left-radius:3px;border-top-left-radius:3px;-moz-border-radius-bottomleft:3px;-moz-border-radius-topleft:3px}.pagination-large ul>li:last-child>a,.pagination-large ul>li:last-child>span{border-top-right-radius:3px;border-bottom-right-radius:3px;-moz-border-radius-topright:3px;-moz-border-radius-bottomright:3px}.pagination-mini ul>li:first-child>a,.pagination-small ul>li:first-child>a,.pagination-mini ul>li:first-child>span,.pagination-small ul>li:first-child>span{border-bottom-left-radius:3px;border-top-left-radius:3px;-moz-border-radius-bottomleft:3px;-moz-border-radius-topleft:3px}.pagination-mini ul>li:last-child>a,.pagination-small ul>li:last-child>a,.pagination-mini ul>li:last-child>span,.pagination-small ul>li:last-child>span{border-top-right-radius:3px;border-bottom-right-radius:3px;-moz-border-radius-topright:3px;-moz-border-radius-bottomright:3px}.pagination-small ul>li>a,.pagination-small ul>li>span{padding:2px 10px;font-size:12.75px}.pagination-mini ul>li>a,.pagination-mini ul>li>span{padding:0 6px;font-size:11.25px}.pager{margin:20px 0;text-align:center;list-style:none;*zoom:1}.pager:before,.pager:after{display:table;line-height:0;content:""}.pager:after{clear:both}.pager li{display:inline}.pager li>a,.pager li>span{display:inline-block;padding:5px 14px;background-color:#fff;border:1px solid #ddd;border-radius:15px}.pager li>a:hover,.pager li>a:focus{text-decoration:none;background-color:#f5f5f5}.pager .next>a,.pager .next>span{float:right}.pager .previous>a,.pager .previous>span{float:left}.pager .disabled>a,.pager .disabled>a:hover,.pager .disabled>a:focus,.pager .disabled>span{color:#d9d9d9;cursor:default;background-color:#fff}.modal-backdrop{position:fixed;top:0;right:0;bottom:0;left:0;z-index:1040;background-color:#000}.modal-backdrop.fade{opacity:0}.modal-backdrop,.modal-backdrop.fade.in{opacity:.8;filter:alpha(opacity=80)}.modal{position:fixed;top:10%;left:50%;z-index:1050;width:560px;margin-left:-280px;background-color:#fff;border:1px solid #999;border:1px solid rgba(0,0,0,0.3);*border:1px solid #999;border-radius:6px;outline:0;box-shadow:0 3px 7px rgba(0,0,0,0.3);background-clip:padding-box}.modal.fade{top:-25%;transition:opacity .3s linear,top .3s ease-out}.modal.fade.in{top:10%}.modal-header{padding:9px 15px;border-bottom:1px solid #eee}.modal-header .close{margin-top:2px}.modal-header h3{margin:0;line-height:30px}.modal-body{position:relative;max-height:400px;padding:15px;overflow-y:auto}.modal-form{margin-bottom:0}.modal-footer{padding:14px 15px 15px;margin-bottom:0;text-align:right;background-color:#f5f5f5;border-top:1px solid #ddd;border-radius:0 0 6px 6px;*zoom:1;box-shadow:inset 0 1px 0 #fff}.modal-footer:before,.modal-footer:after{display:table;line-height:0;content:""}.modal-footer:after{clear:both}.modal-footer .btn+.btn{margin-bottom:0;margin-left:5px}.modal-footer .btn-group .btn+.btn{margin-left:-1px}.modal-footer .btn-block+.btn-block{margin-left:0}.tooltip{position:absolute;z-index:1030;display:block;font-size:11px;line-height:1.4;opacity:0;filter:alpha(opacity=0);visibility:visible}.tooltip.in{opacity:.8;filter:alpha(opacity=80)}.tooltip.top{padding:5px 0;margin-top:-3px}.tooltip.right{padding:0 5px;margin-left:3px}.tooltip.bottom{padding:5px 0;margin-top:3px}.tooltip.left{padding:0 5px;margin-left:-3px}.tooltip-inner{max-width:200px;padding:8px;color:#fff;text-align:center;text-decoration:none;background-color:#000;border-radius:3px}.tooltip-arrow{position:absolute;width:0;height:0;border-color:transparent;border-style:solid}.tooltip.top .tooltip-arrow{bottom:0;left:50%;margin-left:-5px;border-top-color:#000;border-width:5px 5px 0}.tooltip.right .tooltip-arrow{top:50%;left:0;margin-top:-5px;border-right-color:#000;border-width:5px 5px 5px 0}.tooltip.left .tooltip-arrow{top:50%;right:0;margin-top:-5px;border-left-color:#000;border-width:5px 0 5px 5px}.tooltip.bottom .tooltip-arrow{top:0;left:50%;margin-left:-5px;border-bottom-color:#000;border-width:0 5px 5px}.popover{position:absolute;top:0;left:0;z-index:1010;display:none;max-width:276px;padding:1px;text-align:left;white-space:normal;background-color:#fff;border:1px solid #ccc;border:1px solid rgba(0,0,0,0.2);border-radius:6px;box-shadow:0 5px 10px rgba(0,0,0,0.2);background-clip:padding-box}.popover.top{margin-top:-10px}.popover.right{margin-left:10px}.popover.bottom{margin-top:10px}.popover.left{margin-left:-10px}.popover-title{padding:8px 14px;margin:0;font-size:14px;font-weight:normal;line-height:18px;background-color:#f7f7f7;border-bottom:1px solid #ebebeb;border-radius:5px 5px 0 0}.popover-title:empty{display:none}.popover-content{padding:9px 14px}.popover .arrow,.popover .arrow:after{position:absolute;display:block;width:0;height:0;border-color:transparent;border-style:solid}.popover .arrow{border-width:11px}.popover .arrow:after{border-width:10px;content:""}.popover.top .arrow{bottom:-11px;left:50%;margin-left:-11px;border-top-color:#999;border-top-color:#bbbabf;border-bottom-width:0}.popover.top .arrow:after{bottom:1px;margin-left:-10px;border-top-color:#fff;border-bottom-width:0}.popover.right .arrow{top:50%;left:-11px;margin-top:-11px;border-right-color:#999;border-right-color:#bbbabf;border-left-width:0}.popover.right .arrow:after{bottom:-10px;left:1px;border-right-color:#fff;border-left-width:0}.popover.bottom .arrow{top:-11px;left:50%;margin-left:-11px;border-bottom-color:#999;border-bottom-color:#bbbabf;border-top-width:0}.popover.bottom .arrow:after{top:1px;margin-left:-10px;border-bottom-color:#fff;border-top-width:0}.popover.left .arrow{top:50%;right:-11px;margin-top:-11px;border-left-color:#999;border-left-color:#bbbabf;border-right-width:0}.popover.left .arrow:after{right:1px;bottom:-10px;border-left-color:#fff;border-right-width:0}.tipmenu .tooltip{position:absolute;right:0;left:0;margin-right:auto;margin-left:auto}.tipmenu:hover .tooltip{opacity:1}.tipmenu:hover .tooltip a{color:#fff}.tipmenu .tooltip-inner{margin-right:auto;margin-left:auto}.thumbnails{margin-left:0;list-style:none;*zoom:1}.thumbnails:before,.thumbnails:after{display:table;line-height:0;content:""}.thumbnails:after{clear:both}.row-fluid .thumbnails{margin-left:0}.thumbnails>li{float:left;margin-bottom:20px;margin-left:0}.thumbnails>li a:hover{text-decoration:none}.thumbnail{display:block;padding:4px;line-height:20px;border:1px solid #ddd;border-radius:3px;box-shadow:0 1px 3px rgba(0,0,0,0.055);transition:all .2s ease-in-out}a.thumbnail:hover,a.thumbnail:focus{border-color:#000;box-shadow:0 1px 4px rgba(0,105,214,0.25)}.thumbnail>img{display:block;max-width:100%;margin-right:auto;margin-left:auto}.thumbnail .caption{padding:9px;color:#555}.media,.media-body{overflow:hidden;*overflow:visible;zoom:1}.media,.media .media{margin-top:15px}.media:first-child{margin-top:0}.media-object{display:block}.media-heading{margin:0 0 5px}.media>.pull-left{margin-right:10px}.media>.pull-right{margin-left:10px}.media-list{margin-left:0;list-style:none}.label,.badge{display:inline-block;padding:2px 4px;font-size:12.69px;font-weight:bold;line-height:14px;color:#fff;text-shadow:0 -1px 0 rgba(0,0,0,0.25);white-space:nowrap;vertical-align:baseline;background-color:#d9d9d9}.label{border-radius:3px}.badge{padding-right:9px;padding-left:9px;border-radius:9px}.label:empty,.badge:empty{display:none}a.label:hover,a.label:focus,a.badge:hover,a.badge:focus{color:#fff;text-decoration:none;cursor:pointer}.label-important,.badge-important{background-color:#fff}.label-important[href],.badge-important[href]{background-color:#e6e6e6}.label-warning,.badge-warning{background-color:#df7f48}.label-warning[href],.badge-warning[href]{background-color:#d06324}.label-success,.badge-success{background-color:#fff}.label-success[href],.badge-success[href]{background-color:#e6e6e6}.label-info,.badge-info{background-color:#fff}.label-info[href],.badge-info[href]{background-color:#e6e6e6}.label-inverse,.badge-inverse{background-color:#343434}.label-inverse[href],.badge-inverse[href]{background-color:#1a1a1a}.btn .label,.btn .badge{position:relative;top:-1px}.btn-mini .label,.btn-mini .badge{top:0}@keyframes progress-bar-stripes{from{background-position:40px 0}to{background-position:0 0}}.progress{height:20px;margin-bottom:20px;overflow:hidden;background-color:#f7f7f7;background-image:linear-gradient(to bottom,#f5f5f5,#f9f9f9);background-repeat:repeat-x;border-radius:3px;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#fff5f5f5',endColorstr='#fff9f9f9',GradientType=0);box-shadow:inset 0 1px 2px rgba(0,0,0,0.1)}.progress .bar{float:left;width:0;height:100%;font-size:12px;color:#fff;text-align:center;text-shadow:0 -1px 0 rgba(0,0,0,0.25);background-color:#0e90d2;background-image:linear-gradient(to bottom,#149bdf,#0480be);background-repeat:repeat-x;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff149bdf',endColorstr='#ff0480be',GradientType=0);box-shadow:inset 0 -1px 0 rgba(0,0,0,0.15);box-sizing:border-box;transition:width .6s ease}.progress .bar+.bar{box-shadow:inset 1px 0 0 rgba(0,0,0,0.15),inset 0 -1px 0 rgba(0,0,0,0.15)}.progress-striped .bar{background-color:#149bdf;background-image:linear-gradient(45deg,rgba(255,255,255,0.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,0.15) 50%,rgba(255,255,255,0.15) 75%,transparent 75%,transparent);background-size:40px 40px}.progress.active .bar{animation:progress-bar-stripes 2s linear infinite}.progress-danger .bar,.progress .bar-danger{background-color:#dd514c;background-image:linear-gradient(to bottom,#ee5f5b,#c43c35);background-repeat:repeat-x;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffee5f5b',endColorstr='#ffc43c35',GradientType=0)}.progress-danger.progress-striped .bar,.progress-striped .bar-danger{background-color:#ee5f5b;background-image:linear-gradient(45deg,rgba(255,255,255,0.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,0.15) 50%,rgba(255,255,255,0.15) 75%,transparent 75%,transparent)}.progress-success .bar,.progress .bar-success{background-color:#5eb95e;background-image:linear-gradient(to bottom,#62c462,#57a957);background-repeat:repeat-x;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff62c462',endColorstr='#ff57a957',GradientType=0)}.progress-success.progress-striped .bar,.progress-striped .bar-success{background-color:#62c462;background-image:linear-gradient(45deg,rgba(255,255,255,0.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,0.15) 50%,rgba(255,255,255,0.15) 75%,transparent 75%,transparent)}.progress-info .bar,.progress .bar-info{background-color:#4bb1cf;background-image:linear-gradient(to bottom,#5bc0de,#339bb9);background-repeat:repeat-x;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff5bc0de',endColorstr='#ff339bb9',GradientType=0)}.progress-info.progress-striped .bar,.progress-striped .bar-info{background-color:#5bc0de;background-image:linear-gradient(45deg,rgba(255,255,255,0.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,0.15) 50%,rgba(255,255,255,0.15) 75%,transparent 75%,transparent)}.progress-warning .bar,.progress .bar-warning{background-color:#e69a6f;background-image:linear-gradient(to bottom,#eaad89,#df7f48);background-repeat:repeat-x;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffeaad89',endColorstr='#ffdf7f48',GradientType=0)}.progress-warning.progress-striped .bar,.progress-striped .bar-warning{background-color:#eaad89;background-image:linear-gradient(45deg,rgba(255,255,255,0.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,0.15) 50%,rgba(255,255,255,0.15) 75%,transparent 75%,transparent)}.accordion{margin-bottom:20px}.accordion-group{margin-bottom:2px;border:1px solid #e5e5e5;border-radius:3px}.accordion-heading{border-bottom:0}.accordion-heading .accordion-toggle{display:block;padding:8px 15px}.accordion-toggle{cursor:pointer}.accordion-inner{padding:9px 15px;border-top:1px solid #e5e5e5}.carousel{position:relative;margin-bottom:20px;line-height:1}.carousel-inner{position:relative;width:100%;overflow:hidden}.carousel-inner>.item{position:relative;display:none;transition:.6s ease-in-out left}.carousel-inner>.item>img,.carousel-inner>.item>a>img{display:block;line-height:1}.carousel-inner>.active,.carousel-inner>.next,.carousel-inner>.prev{display:block}.carousel-inner>.active{left:0}.carousel-inner>.next,.carousel-inner>.prev{position:absolute;top:0;width:100%}.carousel-inner>.next{left:100%}.carousel-inner>.prev{left:-100%}.carousel-inner>.next.left,.carousel-inner>.prev.right{left:0}.carousel-inner>.active.left{left:-100%}.carousel-inner>.active.right{left:100%}.carousel-control{position:absolute;top:40%;left:15px;width:40px;height:40px;margin-top:-20px;font-size:60px;font-weight:100;line-height:30px;color:#fff;text-align:center;background:#222;border:3px solid #fff;border-radius:23px;opacity:.5;filter:alpha(opacity=50)}.carousel-control.right{right:15px;left:auto}.carousel-control:hover,.carousel-control:focus{color:#fff;text-decoration:none;opacity:.9;filter:alpha(opacity=90)}.carousel-indicators{position:absolute;top:15px;right:15px;z-index:5;margin:0;list-style:none}.carousel-indicators li{display:block;float:left;width:10px;height:10px;margin-left:5px;text-indent:-999px;background-color:#ccc;background-color:rgba(255,255,255,0.25);border-radius:5px}.carousel-indicators .active{background-color:#fff}.carousel-caption{position:absolute;right:0;bottom:0;left:0;padding:15px;background:#343434;background:rgba(0,0,0,0.75)}.carousel-caption h4,.carousel-caption p{line-height:20px;color:#fff}.carousel-caption h4{margin:0 0 5px}.carousel-caption p{margin-bottom:0}.hero-unit{padding:60px;margin-bottom:30px;font-size:18px;font-weight:200;line-height:30px;color:inherit;background-color:#f3f3f5;border-radius:6px}.hero-unit h1{margin-bottom:0;font-size:60px;line-height:1;letter-spacing:-1px;color:inherit}.hero-unit li{line-height:30px}.pull-right{float:right}.pull-left{float:left}.hide{display:none}.show{display:block}.invisible{visibility:hidden}.affix{position:fixed}html,body{height:100%;overflow:hidden}body{width:100%;height:100%;padding:0;margin:0;font-family:"Lato","Helvetica Neue",Helvetica,Arial,sans-serif;font-size:15px;-webkit-font-smoothing:antialiased;font-smoothing:antialiased;line-height:20px;color:#303033;background-color:#fff;-moz-osx-font-smoothing:grayscale}.padded{padding:20px}#layout{position:relative;z-index:1;height:100%;padding:0}#mainwrapper{width:100%;height:100%;margin:0}#contentwrapper,#contentcolumn{position:absolute;top:0;right:0;bottom:0;left:80px;z-index:10;margin:0}#umb-notifications-wrapper{left:80px}#contentcolumn{left:0}#contentcolumn iframe#right{position:relative;display:block;width:100%;height:100%;border:0}#leftcolumn{position:absolute;z-index:20;float:left;width:80px;height:100%}#applications{position:absolute;top:0;bottom:0;left:0;z-index:1000;height:100%;text-align:center}#applications-tray{position:absolute;top:0;bottom:0;left:80px;z-index:900;height:100%;text-align:center}#search-form{position:absolute;top:0;right:0;left:0;z-index:100;display:block;margin:0;overflow:hidden}#search-form .form-search{display:-ms-flexbox;display:flex;margin-top:17px}#search-form .form-search .umb-search-field{width:auto;min-width:160px;-ms-flex:1;flex:1}@media(max-width:500px){#search-form .form-search{width:calc(100% - 80px)}}#navigation{position:absolute;top:0;bottom:0;left:80px;z-index:100;height:100%;background:#fff}.navigation-inner-container{position:absolute;top:0;right:0;bottom:0;left:0;z-index:100;padding-top:100px;border-right:1px solid #b3afbd}#dialog{position:absolute;top:0;left:100%;z-index:50;display:inline-block;min-width:500px}#tree{z-index:100!important;padding:0;overflow:auto}#tree .umb-tree{padding:0 0 20px 0}#search-results{z-index:200}#contextMenu{position:absolute;top:0;left:100%;z-index:50;min-width:250px}#speechbubble{position:absolute;right:0;bottom:100px;left:0;z-index:1060;padding:0;margin:auto;background:0;border:0;border-bottom:0;border-radius:0}.ui-resizable-e{position:absolute;top:0;right:-5px;bottom:0;z-index:9999!important;width:4px;cursor:e-resize;background-color:#f3f3f5;border:solid 1px #b3afbd;border-top:0;border-bottom:0}@media(min-width:1101px){#contentwrapper,#umb-notifications-wrapper{left:440px}#speechbubble{left:360px}}.emptySection #contentwrapper,.emptySection #umb-notifications-wrapper{left:80px}.emptySection #speechbubble{left:0}.emptySection #navigation{display:none}.login-only #speechbubble{left:0!important;z-index:10000}.login-only #speechbubble ul{padding-left:20px}@media(max-width:767px){#leftcolumn{width:61px}#applications ul.sections{width:61px}ul.sections.sections-tray{width:61px}#applications-tray{left:60px}#navigation{left:60px}#contentwrapper,#contentcolumn,#umb-notifications-wrapper{left:30px}#umbracoMainPageBody .umb-modal-left.fade.in{margin-left:61px}}@media(max-width:500px){#leftcolumn{width:41px}#applications ul.sections{width:41px}#applications ul.sections-tray{width:41px}ul.sections.sections-tray{width:41px}#applications-tray{left:40px}#navigation{left:40px}#contentwrapper,#contentcolumn,#umb-notifications-wrapper{left:20px}#umbracoMainPageBody .umb-modal-left.fade.in{width:85%!important;margin-left:41px}}.shadow-depth-1{box-shadow:0 1px 3px rgba(0,0,0,0.12),0 1px 2px rgba(0,0,0,0.24)}.shadow-depth-2{box-shadow:0 3px 6px rgba(0,0,0,0.16),0 3px 6px rgba(0,0,0,0.23)}.shadow-depth-3{box-shadow:0 10px 20px rgba(0,0,0,0.19),0 6px 6px rgba(0,0,0,0.23)}.shadow-depth-4{box-shadow:0 14px 28px rgba(0,0,0,0.25),0 10px 10px rgba(0,0,0,0.22)}.shadow-depth-5{box-shadow:0 19px 38px rgba(0,0,0,0.3),0 15px 12px rgba(0,0,0,0.22)}.animated{animation-duration:1s;animation-fill-mode:both}.animated.infinite{animation-iteration-count:infinite}.animated.hinge{animation-duration:2s}@keyframes bounce{0%,100%,20%,53%,80%{transform:translate3d(0,0,0);transition-timing-function:cubic-bezier(0.215,0.61,0.355,1)}40%,43%{transform:translate3d(0,-30px,0);transition-timing-function:cubic-bezier(0.755,0.05,0.855,0.06)}70%{transform:translate3d(0,-15px,0);transition-timing-function:cubic-bezier(0.755,0.05,0.855,0.06)}90%{transform:translate3d(0,-4px,0)}}.bounce{animation-name:bounce;transform-origin:center bottom}@keyframes flash{0%,100%,50%{opacity:1}25%,75%{opacity:0}}.flash{animation-name:flash}@keyframes pulse{0%{transform:scale3d(1,1,1)}50%{transform:scale3d(1.05,1.05,1.05)}100%{transform:scale3d(1,1,1)}}.pulse{animation-name:pulse}@keyframes rubberBand{0%{transform:scale3d(1,1,1)}30%{transform:scale3d(1.25,0.75,1)}40%{transform:scale3d(0.75,1.25,1)}50%{transform:scale3d(1.15,0.85,1)}65%{transform:scale3d(0.95,1.05,1)}75%{transform:scale3d(1.05,0.95,1)}100%{transform:scale3d(1,1,1)}}.rubberBand{animation-name:rubberBand}@keyframes shake{0%,100%{transform:translate3d(0,0,0)}10%,30%,50%,70%,90%{transform:translate3d(-10px,0,0)}20%,40%,60%,80%{transform:translate3d(10px,0,0)}}.shake{animation-name:shake}@keyframes swing{20%{transform:rotate3d(0,0,1,15deg)}40%{transform:rotate3d(0,0,1,-10deg)}60%{transform:rotate3d(0,0,1,5deg)}80%{transform:rotate3d(0,0,1,-5deg)}100%{transform:rotate3d(0,0,1,0deg)}}.swing{animation-name:swing;transform-origin:top center}@keyframes tada{0%{transform:scale3d(1,1,1)}10%,20%{transform:scale3d(0.9,0.9,0.9) rotate3d(0,0,1,-3deg)}30%,50%,70%,90%{transform:scale3d(1.1,1.1,1.1) rotate3d(0,0,1,3deg)}40%,60%,80%{transform:scale3d(1.1,1.1,1.1) rotate3d(0,0,1,-3deg)}100%{transform:scale3d(1,1,1)}}.tada{animation-name:tada}@keyframes wobble{0%{transform:none}15%{transform:translate3d(-25%,0,0) rotate3d(0,0,1,-5deg)}30%{transform:translate3d(20%,0,0) rotate3d(0,0,1,3deg)}45%{transform:translate3d(-15%,0,0) rotate3d(0,0,1,-3deg)}60%{transform:translate3d(10%,0,0) rotate3d(0,0,1,2deg)}75%{transform:translate3d(-5%,0,0) rotate3d(0,0,1,-1deg)}100%{transform:none}}.wobble{animation-name:wobble}@keyframes bounceIn{0%,100%,20%,40%,60%,80%{transition-timing-function:cubic-bezier(0.215,0.61,0.355,1)}0%{opacity:0;transform:scale3d(0.3,0.3,0.3)}20%{transform:scale3d(1.1,1.1,1.1)}40%{transform:scale3d(0.9,0.9,0.9)}60%{opacity:1;transform:scale3d(1.03,1.03,1.03)}80%{transform:scale3d(0.97,0.97,0.97)}100%{opacity:1;transform:scale3d(1,1,1)}}.bounceIn{animation-duration:.75s;animation-name:bounceIn}@keyframes bounceInDown{0%,100%,60%,75%,90%{transition-timing-function:cubic-bezier(0.215,0.61,0.355,1)}0%{opacity:0;transform:translate3d(0,-3000px,0)}60%{opacity:1;transform:translate3d(0,25px,0)}75%{transform:translate3d(0,-10px,0)}90%{transform:translate3d(0,5px,0)}100%{transform:none}}.bounceInDown{animation-name:bounceInDown}@keyframes bounceInLeft{0%,100%,60%,75%,90%{transition-timing-function:cubic-bezier(0.215,0.61,0.355,1)}0%{opacity:0;transform:translate3d(-3000px,0,0)}60%{opacity:1;transform:translate3d(25px,0,0)}75%{transform:translate3d(-10px,0,0)}90%{transform:translate3d(5px,0,0)}100%{transform:none}}.bounceInLeft{animation-name:bounceInLeft}@keyframes bounceInRight{0%,100%,60%,75%,90%{transition-timing-function:cubic-bezier(0.215,0.61,0.355,1)}0%{opacity:0;transform:translate3d(3000px,0,0)}60%{opacity:1;transform:translate3d(-25px,0,0)}75%{transform:translate3d(10px,0,0)}90%{transform:translate3d(-5px,0,0)}100%{transform:none}}.bounceInRight{animation-name:bounceInRight}@keyframes bounceInUp{0%,100%,60%,75%,90%{transition-timing-function:cubic-bezier(0.215,0.61,0.355,1)}0%{opacity:0;transform:translate3d(0,3000px,0)}60%{opacity:1;transform:translate3d(0,-20px,0)}75%{transform:translate3d(0,10px,0)}90%{transform:translate3d(0,-5px,0)}100%{transform:translate3d(0,0,0)}}.bounceInUp{animation-name:bounceInUp}@keyframes bounceOut{20%{transform:scale3d(0.9,0.9,0.9)}50%,55%{opacity:1;transform:scale3d(1.1,1.1,1.1)}100%{opacity:0;transform:scale3d(0.3,0.3,0.3)}}.bounceOut{animation-duration:.75s;animation-name:bounceOut}@keyframes bounceOutDown{20%{transform:translate3d(0,10px,0)}40%,45%{opacity:1;transform:translate3d(0,-20px,0)}100%{opacity:0;transform:translate3d(0,2000px,0)}}.bounceOutDown{animation-name:bounceOutDown}@keyframes bounceOutLeft{20%{opacity:1;transform:translate3d(20px,0,0)}100%{opacity:0;transform:translate3d(-2000px,0,0)}}.bounceOutLeft{animation-name:bounceOutLeft}@keyframes bounceOutRight{20%{opacity:1;transform:translate3d(-20px,0,0)}100%{opacity:0;transform:translate3d(2000px,0,0)}}.bounceOutRight{animation-name:bounceOutRight}@keyframes bounceOutUp{20%{transform:translate3d(0,-10px,0)}40%,45%{opacity:1;transform:translate3d(0,20px,0)}100%{opacity:0;transform:translate3d(0,-2000px,0)}}.bounceOutUp{animation-name:bounceOutUp}@keyframes fadeIn{0%{opacity:0}100%{opacity:1}}.fadeIn{animation-name:fadeIn}@keyframes fadeInDown{0%{opacity:0;transform:translate3d(0,-100%,0)}100%{opacity:1;transform:none}}.fadeInDown{animation-name:fadeInDown}@keyframes fadeInDownBig{0%{opacity:0;transform:translate3d(0,-2000px,0)}100%{opacity:1;transform:none}}.fadeInDownBig{animation-name:fadeInDownBig}@keyframes fadeInLeft{0%{opacity:0;transform:translate3d(-100%,0,0)}100%{opacity:1;transform:none}}.fadeInLeft{animation-name:fadeInLeft}@keyframes fadeInLeftBig{0%{opacity:0;transform:translate3d(-2000px,0,0)}100%{opacity:1;transform:none}}.fadeInLeftBig{animation-name:fadeInLeftBig}@keyframes fadeInRight{0%{opacity:0;transform:translate3d(100%,0,0)}100%{opacity:1;transform:none}}.fadeInRight{animation-name:fadeInRight}@keyframes fadeInRightBig{0%{opacity:0;transform:translate3d(2000px,0,0)}100%{opacity:1;transform:none}}.fadeInRightBig{animation-name:fadeInRightBig}@keyframes fadeInUp{0%{opacity:0;transform:translate3d(0,100%,0)}100%{opacity:1;transform:none}}.fadeInUp{animation-name:fadeInUp}@keyframes fadeInUpBig{0%{opacity:0;transform:translate3d(0,2000px,0)}100%{opacity:1;transform:none}}.fadeInUpBig{animation-name:fadeInUpBig}@keyframes fadeOut{0%{opacity:1}100%{opacity:0}}.fadeOut{animation-name:fadeOut}@keyframes fadeOutDown{0%{opacity:1}100%{opacity:0;transform:translate3d(0,100%,0)}}.fadeOutDown{animation-name:fadeOutDown}@keyframes fadeOutDownBig{0%{opacity:1}100%{opacity:0;transform:translate3d(0,2000px,0)}}.fadeOutDownBig{animation-name:fadeOutDownBig}@keyframes fadeOutLeft{0%{opacity:1}100%{opacity:0;transform:translate3d(-100%,0,0)}}.fadeOutLeft{animation-name:fadeOutLeft}@keyframes fadeOutLeftBig{0%{opacity:1}100%{opacity:0;transform:translate3d(-2000px,0,0)}}.fadeOutLeftBig{animation-name:fadeOutLeftBig}@keyframes fadeOutRight{0%{opacity:1}100%{opacity:0;transform:translate3d(100%,0,0)}}.fadeOutRight{animation-name:fadeOutRight}@keyframes fadeOutRightBig{0%{opacity:1}100%{opacity:0;transform:translate3d(2000px,0,0)}}.fadeOutRightBig{animation-name:fadeOutRightBig}@keyframes fadeOutUp{0%{opacity:1}100%{opacity:0;transform:translate3d(0,-100%,0)}}.fadeOutUp{animation-name:fadeOutUp}@keyframes fadeOutUpBig{0%{opacity:1}100%{opacity:0;transform:translate3d(0,-2000px,0)}}.fadeOutUpBig{animation-name:fadeOutUpBig}@keyframes flip{0%{transform:perspective(400px) rotate3d(0,1,0,-360deg);animation-timing-function:ease-out}40%{transform:perspective(400px) translate3d(0,0,150px) rotate3d(0,1,0,-190deg);animation-timing-function:ease-out}50%{transform:perspective(400px) translate3d(0,0,150px) rotate3d(0,1,0,-170deg);animation-timing-function:ease-in}80%{transform:perspective(400px) scale3d(0.95,0.95,0.95);animation-timing-function:ease-in}100%{transform:perspective(400px);animation-timing-function:ease-in}}.animated.flip{animation-name:flip;-ms-backface-visibility:visible;backface-visibility:visible}@keyframes flipInX{0%{opacity:0;transform:perspective(400px) rotate3d(1,0,0,90deg);transition-timing-function:ease-in}40%{transform:perspective(400px) rotate3d(1,0,0,-20deg);transition-timing-function:ease-in}60%{opacity:1;transform:perspective(400px) rotate3d(1,0,0,10deg)}80%{transform:perspective(400px) rotate3d(1,0,0,-5deg)}100%{transform:perspective(400px)}}.flipInX{animation-name:flipInX;-ms-backface-visibility:visible!important;backface-visibility:visible!important}@keyframes flipInY{0%{opacity:0;transform:perspective(400px) rotate3d(0,1,0,90deg);transition-timing-function:ease-in}40%{transform:perspective(400px) rotate3d(0,1,0,-20deg);transition-timing-function:ease-in}60%{opacity:1;transform:perspective(400px) rotate3d(0,1,0,10deg)}80%{transform:perspective(400px) rotate3d(0,1,0,-5deg)}100%{transform:perspective(400px)}}.flipInY{animation-name:flipInY;-ms-backface-visibility:visible!important;backface-visibility:visible!important}@keyframes flipOutX{0%{transform:perspective(400px)}30%{opacity:1;transform:perspective(400px) rotate3d(1,0,0,-20deg)}100%{opacity:0;transform:perspective(400px) rotate3d(1,0,0,90deg)}}.flipOutX{animation-duration:.75s;animation-name:flipOutX;-ms-backface-visibility:visible!important;backface-visibility:visible!important}@keyframes flipOutY{0%{transform:perspective(400px)}30%{opacity:1;transform:perspective(400px) rotate3d(0,1,0,-15deg)}100%{opacity:0;transform:perspective(400px) rotate3d(0,1,0,90deg)}}.flipOutY{animation-duration:.75s;animation-name:flipOutY;-ms-backface-visibility:visible!important;backface-visibility:visible!important}@keyframes lightSpeedIn{0%{opacity:0;transform:translate3d(100%,0,0) skewX(-30deg)}60%{opacity:1;transform:skewX(20deg)}80%{opacity:1;transform:skewX(-5deg)}100%{opacity:1;transform:none}}.lightSpeedIn{animation-name:lightSpeedIn;animation-timing-function:ease-out}@keyframes lightSpeedOut{0%{opacity:1}100%{opacity:0;transform:translate3d(100%,0,0) skewX(30deg)}}.lightSpeedOut{animation-name:lightSpeedOut;animation-timing-function:ease-in}@keyframes rotateIn{0%{opacity:0;transform:rotate3d(0,0,1,-200deg);transform-origin:center}100%{opacity:1;transform:none;transform-origin:center}}.rotateIn{animation-name:rotateIn}@keyframes rotateInDownLeft{0%{opacity:0;transform:rotate3d(0,0,1,-45deg);transform-origin:left bottom}100%{opacity:1;transform:none;transform-origin:left bottom}}.rotateInDownLeft{animation-name:rotateInDownLeft}@keyframes rotateInDownRight{0%{opacity:0;transform:rotate3d(0,0,1,45deg);transform-origin:right bottom}100%{opacity:1;transform:none;transform-origin:right bottom}}.rotateInDownRight{animation-name:rotateInDownRight}@keyframes rotateInUpLeft{0%{opacity:0;transform:rotate3d(0,0,1,45deg);transform-origin:left bottom}100%{opacity:1;transform:none;transform-origin:left bottom}}.rotateInUpLeft{animation-name:rotateInUpLeft}@keyframes rotateInUpRight{0%{opacity:0;transform:rotate3d(0,0,1,-90deg);transform-origin:right bottom}100%{opacity:1;transform:none;transform-origin:right bottom}}.rotateInUpRight{animation-name:rotateInUpRight}@keyframes rotateOut{0%{opacity:1;transform-origin:center}100%{opacity:0;transform:rotate3d(0,0,1,200deg);transform-origin:center}}.rotateOut{animation-name:rotateOut}@keyframes rotateOutDownLeft{0%{opacity:1;transform-origin:left bottom}100%{opacity:0;transform:rotate(0,0,1,45deg);transform-origin:left bottom}}.rotateOutDownLeft{animation-name:rotateOutDownLeft}@keyframes rotateOutDownRight{0%{opacity:1;transform-origin:right bottom}100%{opacity:0;transform:rotate3d(0,0,1,-45deg);transform-origin:right bottom}}.rotateOutDownRight{animation-name:rotateOutDownRight}@keyframes rotateOutUpLeft{0%{opacity:1;transform-origin:left bottom}100%{opacity:0;transform:rotate3d(0,0,1,-45deg);transform-origin:left bottom}}.rotateOutUpLeft{animation-name:rotateOutUpLeft}@keyframes rotateOutUpRight{0%{opacity:1;transform-origin:right bottom}100%{opacity:0;transform:rotate3d(0,0,1,90deg);transform-origin:right bottom}}.rotateOutUpRight{animation-name:rotateOutUpRight}@keyframes hinge{0%{animation-timing-function:ease-in-out;transform-origin:top left}20%,60%{transform:rotate3d(0,0,1,80deg);animation-timing-function:ease-in-out;transform-origin:top left}40%,80%{opacity:1;transform:rotate3d(0,0,1,60deg);animation-timing-function:ease-in-out;transform-origin:top left}100%{opacity:0;transform:translate3d(0,700px,0)}}.hinge{animation-name:hinge}@keyframes rollIn{0%{opacity:0;transform:translate3d(-100%,0,0) rotate3d(0,0,1,-120deg)}100%{opacity:1;transform:none}}.rollIn{animation-name:rollIn}@keyframes rollOut{0%{opacity:1}100%{opacity:0;transform:translate3d(100%,0,0) rotate3d(0,0,1,120deg)}}.rollOut{animation-name:rollOut}@keyframes zoomIn{0%{opacity:0;transform:scale3d(0.3,0.3,0.3)}50%{opacity:1}}.zoomIn{animation-name:zoomIn}@keyframes zoomInDown{0%{opacity:0;transform:scale3d(0.1,0.1,0.1) translate3d(0,-1000px,0);animation-timing-function:cubic-bezier(0.55,0.055,0.675,0.19)}60%{opacity:1;transform:scale3d(0.475,0.475,0.475) translate3d(0,60px,0);animation-timing-function:cubic-bezier(0.175,0.885,0.32,1)}}.zoomInDown{animation-name:zoomInDown}@keyframes zoomInLeft{0%{opacity:0;transform:scale3d(0.1,0.1,0.1) translate3d(-1000px,0,0);animation-timing-function:cubic-bezier(0.55,0.055,0.675,0.19)}60%{opacity:1;transform:scale3d(0.475,0.475,0.475) translate3d(10px,0,0);animation-timing-function:cubic-bezier(0.175,0.885,0.32,1)}}.zoomInLeft{animation-name:zoomInLeft}@keyframes zoomInRight{0%{opacity:0;transform:scale3d(0.1,0.1,0.1) translate3d(1000px,0,0);animation-timing-function:cubic-bezier(0.55,0.055,0.675,0.19)}60%{opacity:1;transform:scale3d(0.475,0.475,0.475) translate3d(-10px,0,0);animation-timing-function:cubic-bezier(0.175,0.885,0.32,1)}}.zoomInRight{animation-name:zoomInRight}@keyframes zoomInUp{0%{opacity:0;transform:scale3d(0.1,0.1,0.1) translate3d(0,1000px,0);animation-timing-function:cubic-bezier(0.55,0.055,0.675,0.19)}60%{opacity:1;transform:scale3d(0.475,0.475,0.475) translate3d(0,-60px,0);animation-timing-function:cubic-bezier(0.175,0.885,0.32,1)}}.zoomInUp{animation-name:zoomInUp}@keyframes zoomOut{0%{opacity:1}50%{opacity:0;transform:scale3d(0.3,0.3,0.3)}100%{opacity:0}}.zoomOut{animation-name:zoomOut}@keyframes zoomOutDown{40%{opacity:1;transform:scale3d(0.475,0.475,0.475) translate3d(0,-60px,0);animation-timing-function:cubic-bezier(0.55,0.055,0.675,0.19)}100%{opacity:0;transform:scale3d(0.1,0.1,0.1) translate3d(0,2000px,0);animation-timing-function:cubic-bezier(0.175,0.885,0.32,1);transform-origin:center bottom}}.zoomOutDown{animation-name:zoomOutDown}@keyframes zoomOutLeft{40%{opacity:1;transform:scale3d(0.475,0.475,0.475) translate3d(42px,0,0)}100%{opacity:0;transform:scale(0.1) translate3d(-2000px,0,0);transform-origin:left center}}.zoomOutLeft{animation-name:zoomOutLeft}@keyframes zoomOutRight{40%{opacity:1;transform:scale3d(0.475,0.475,0.475) translate3d(-42px,0,0)}100%{opacity:0;transform:scale(0.1) translate3d(2000px,0,0);transform-origin:right center}}.zoomOutRight{animation-name:zoomOutRight}@keyframes zoomOutUp{40%{opacity:1;transform:scale3d(0.475,0.475,0.475) translate3d(0,60px,0);animation-timing-function:cubic-bezier(0.55,0.055,0.675,0.19)}100%{opacity:0;transform:scale3d(0.1,0.1,0.1) translate3d(0,-2000px,0);animation-timing-function:cubic-bezier(0.175,0.885,0.32,1);transform-origin:center bottom}}.zoomOutUp{animation-name:zoomOutUp}.animated.-half-second{animation-duration:.5s}.slide-in-left.ng-hide-remove{animation:fadeInLeft .6s}.slide-in-left.ng-hide-add{display:block!important;animation:fadeOutLeft .6s}.slide-in-right.ng-hide-remove{animation:fadeInRight .6s}.slide-in-right.ng-hide-add{display:block!important;animation:fadeOutRight .6s}.slide-in-up.ng-hide-remove{animation:fadeInUp .6s}.slide-in-up.ng-hide-add{display:block!important;animation:fadeOutDown .6s}.tree-node-delete-leave{position:relative;display:block;animation:leave 600ms cubic-bezier(0.445,0.05,0.55,0.95)}@keyframes leave{to{bottom:-70px;height:0;opacity:0}25%{bottom:15px}from{bottom:0;height:30px;opacity:1}}.tree-node-delete-leave *{color:#fe3e39!important}.tree-node-slide-up{top:0;opacity:1;transition:700ms cubic-bezier(0,0,0.58,1) all}.tree-node-slide-up *{font-size:100%;transition:font-size 700ms}.tree-node-slide-up.tree-node-slide-up-hide-active{top:-100px;opacity:0}.tree-node-slide-up.tree-node-slide-up-hide-active *{font-size:120%}.tree-fade-out-hide,.tree-fade-out-show,.tree-fade-out-hide div:not(.tree-node-slide-up-hide-active),.tree-fade-out-show div:not(.tree-node-slide-up-hide-active){transition:700ms cubic-bezier(0.075,0.82,0.165,1) all}.tree-fade-out-show.tree-fade-out-show-active div:not(.tree-node-slide-up-hide-active){opacity:1}.tree-fade-out-hide.tree-fade-out-hide-active div:not(.tree-node-slide-up-hide-active){opacity:0}.light{font-weight:300}.normal{font-weight:500}.semi-bold{font-weight:600}.bold{font-weight:700}.btn{display:inline-block;padding:6px 14px;margin-bottom:0;font-size:15px;line-height:20px;color:#000;text-align:center;vertical-align:middle;cursor:pointer;background:#e9e9eb;border:0;border-radius:3px;box-shadow:none}.btn:hover,.btn:focus{color:#68676b;text-decoration:none;background:#e9e9eb;background-position:0 -15px;transition:background-position .1s linear}.btn:focus{outline:thin dotted #515054;outline:5px auto -webkit-focus-ring-color;outline-offset:-2px}.btn.active,.btn:active{background-image:none;outline:0;box-shadow:inset 0 2px 4px rgba(0,0,0,0.15),0 1px 2px rgba(0,0,0,0.05)}.btn.disabled,.btn[disabled],.btn:disabled:hover{cursor:default;border-color:#e9e9eb;opacity:.65;filter:alpha(opacity=65);box-shadow:none}.btn-group>.btn+.dropdown-toggle{box-shadow:none}.btn-group .btn.dropdown-toggle{border-left-style:solid;border-left-width:1px}.btn-large{padding:11px 19px;font-size:18.75px}.btn-large [class^="icon-"],.btn-large [class*=" icon-"]{margin-top:4px;border-radius:3px}.btn-small{padding:2px 10px;font-size:12.75px;border-radius:3px}.btn-small [class^="icon-"],.btn-small [class*=" icon-"]{margin-top:0}.btn-mini [class^="icon-"],.btn-mini [class*=" icon-"]{margin-top:-1px}.btn-mini{padding:0 6px;font-size:11.25px;border-radius:3px}.btn-block{display:block;width:100%;padding-right:0;padding-left:0;box-sizing:border-box}.btn-block+.btn-block{margin-top:5px}input[type="submit"].btn-block,input[type="reset"].btn-block,input[type="button"].btn-block{width:100%}.btn-round{z-index:6666;display:inline-block;width:32px;height:32px;overflow:hidden;font-size:24px;line-height:32px;color:#515054;text-align:center;background:#fff;border-radius:15px}.btn-primary.active,.btn-warning.active,.btn-danger.active,.btn-success.active,.btn-info.active,.btn-inverse.active,.btn-neutral.active{color:rgba(255,255,255,0.75)}.btn-primary,.btn-warning,.btn-danger,.btn-success,.btn-info,.btn-inverse,.btn-neutral{font-weight:bold}.btn-primary{color:#fff;background-color:#35c786;*background-color:#35c786;background-image:linear-gradient(to bottom,#35c786,#35c786);background-repeat:repeat-x;border-color:#35c786 #35c786 #258b5d;border-color:rgba(0,0,0,0.1) rgba(0,0,0,0.1) rgba(0,0,0,0.25);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff35c786',endColorstr='#ff35c786',GradientType=0);filter:progid:DXImageTransform.Microsoft.gradient(enabled=false)}.btn-primary:hover,.btn-primary:focus,.btn-primary:active{background-color:#33bf81}.btn-primary:hover,.btn-primary:focus,.btn-primary:active,.btn-primary.active,.btn-primary.disabled,.btn-primary[disabled]{color:#fff;*background-color:#30b378}.btn-primary:active,.btn-primary.active{background-color:#2a9f6b \9}.btn-warning{color:#fff;background-color:#fe6561;*background-color:#fe6561;background-image:linear-gradient(to bottom,#fe6561,#fe6561);background-repeat:repeat-x;border-color:#fe6561 #fe6561 #fe1b15;border-color:rgba(0,0,0,0.1) rgba(0,0,0,0.1) rgba(0,0,0,0.25);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#fffe6561',endColorstr='#fffe6561',GradientType=0);filter:progid:DXImageTransform.Microsoft.gradient(enabled=false)}.btn-warning:hover,.btn-warning:focus,.btn-warning:active{background-color:#fe5b57}.btn-warning:hover,.btn-warning:focus,.btn-warning:active,.btn-warning.active,.btn-warning.disabled,.btn-warning[disabled]{color:#fff;*background-color:#fe4c48}.btn-warning:active,.btn-warning.active{background-color:#fe342e \9}.btn-danger{color:#fff;background-color:#fe6561;*background-color:#fe6561;background-image:linear-gradient(to bottom,#fe6561,#fe6561);background-repeat:repeat-x;border-color:#fe6561 #fe6561 #fe1b15;border-color:rgba(0,0,0,0.1) rgba(0,0,0,0.1) rgba(0,0,0,0.25);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#fffe6561',endColorstr='#fffe6561',GradientType=0);filter:progid:DXImageTransform.Microsoft.gradient(enabled=false)}.btn-danger:hover,.btn-danger:focus,.btn-danger:active{background-color:#fe5b57}.btn-danger:hover,.btn-danger:focus,.btn-danger:active,.btn-danger.active,.btn-danger.disabled,.btn-danger[disabled]{color:#fff;*background-color:#fe4c48}.btn-danger:active,.btn-danger.active{background-color:#fe342e \9}.btn-success{color:#fff;background-color:#35c786;*background-color:#35c786;background-image:linear-gradient(to bottom,#35c786,#35c786);background-repeat:repeat-x;border-color:#35c786 #35c786 #258b5d;border-color:rgba(0,0,0,0.1) rgba(0,0,0,0.1) rgba(0,0,0,0.25);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff35c786',endColorstr='#ff35c786',GradientType=0);filter:progid:DXImageTransform.Microsoft.gradient(enabled=false)}.btn-success:hover,.btn-success:focus,.btn-success:active{background-color:#33bf81}.btn-success:hover,.btn-success:focus,.btn-success:active,.btn-success.active,.btn-success.disabled,.btn-success[disabled]{color:#fff;*background-color:#30b378}.btn-success:active,.btn-success.active{background-color:#2a9f6b \9}.btn-info{color:#fff;background-color:#675e7a;*background-color:#675e7a;background-image:linear-gradient(to bottom,#675e7a,#675e7a);background-repeat:repeat-x;border-color:#675e7a #675e7a #433d4f;border-color:rgba(0,0,0,0.1) rgba(0,0,0,0.1) rgba(0,0,0,0.25);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff675e7a',endColorstr='#ff675e7a',GradientType=0);filter:progid:DXImageTransform.Microsoft.gradient(enabled=false)}.btn-info:hover,.btn-info:focus,.btn-info:active{background-color:#625a74}.btn-info:hover,.btn-info:focus,.btn-info:active,.btn-info.active,.btn-info.disabled,.btn-info[disabled]{color:#fff;*background-color:#5b536c}.btn-info:active,.btn-info.active{background-color:#4f485d \9}.btn-inverse{color:#fff;background-color:#303033;*background-color:#303033;background-image:linear-gradient(to bottom,#303033,#303033);background-repeat:repeat-x;border-color:#303033 #303033 #0b0b0c;border-color:rgba(0,0,0,0.1) rgba(0,0,0,0.1) rgba(0,0,0,0.25);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff303033',endColorstr='#ff303033',GradientType=0);filter:progid:DXImageTransform.Microsoft.gradient(enabled=false)}.btn-inverse:hover,.btn-inverse:focus,.btn-inverse:active{background-color:#2b2b2e}.btn-inverse:hover,.btn-inverse:focus,.btn-inverse:active,.btn-inverse.active,.btn-inverse.disabled,.btn-inverse[disabled]{color:#fff;*background-color:#242426}.btn-inverse:active,.btn-inverse.active{background-color:#171719 \9}.btn-neutral{color:#fff;color:#817f85;background-color:#e9e9eb;*background-color:#e9e9eb;background-image:linear-gradient(to bottom,#e9e9eb,#e9e9eb);background-repeat:repeat-x;border-color:#e9e9eb #e9e9eb #c1c1c7;border-color:rgba(0,0,0,0.1) rgba(0,0,0,0.1) rgba(0,0,0,0.25);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffe9e9eb',endColorstr='#ffe9e9eb',GradientType=0);filter:progid:DXImageTransform.Microsoft.gradient(enabled=false)}.btn-neutral:hover,.btn-neutral:focus,.btn-neutral:active{background-color:#e4e4e6}.btn-neutral:hover,.btn-neutral:focus,.btn-neutral:active,.btn-neutral.active,.btn-neutral.disabled,.btn-neutral[disabled]{color:#fff;*background-color:#dcdcdf}.btn-neutral:active,.btn-neutral.active{background-color:#ceced3 \9}.btn-neutral:hover,.btn-neutral:focus{color:#817f85}.btn-neutral.disabled,.btn-neutral[disabled]{color:#817f85;opacity:.65;filter:alpha(opacity=65)}.btn-install{display:block;padding:15px 50px;margin:40px auto;font-size:16px;font-weight:bold;color:white;background:#35c786;border:0}.btn-install:hover{background:#1fb572}button.btn,input[type="submit"].btn{*padding-top:3px;*padding-bottom:3px}button.btn::-moz-focus-inner,input[type="submit"].btn::-moz-focus-inner{padding:0;border:0}button.btn.btn-large,input[type="submit"].btn.btn-large{*padding-top:7px;*padding-bottom:7px}button.btn.btn-small,input[type="submit"].btn.btn-small{*padding-top:3px;*padding-bottom:3px}button.btn.btn-mini,input[type="submit"].btn.btn-mini{*padding-top:1px;*padding-bottom:1px}.btn-link,.btn-link:active,.btn-link[disabled]{background-color:transparent;background-image:none;box-shadow:none}.btn-link{color:#000;cursor:pointer;border-color:transparent;border-radius:0}.btn-link:hover,.btn-link:focus{color:#000;text-decoration:underline;background-color:transparent}.btn-link[disabled]:hover,.btn-link[disabled]:focus{color:#68676b;text-decoration:none}.btn-link-reverse{text-decoration:underline}.btn-link-reverse:hover,.btn-link-reverse:focus{text-decoration:none}.btn-link.-underline{display:inline-block;text-decoration:underline}.btn-link.-underline:hover{text-decoration:none}small.umb-detail,label small,.guiDialogTiny{display:block;font-size:11px;font-weight:normal;color:#817f85!important;text-decoration:none}label.control-label,.control-label{padding:0 10px 0 0!important;font-weight:bold;color:#000}.umb-status-label{color:#515054!important}.controls-row label{padding:0 10px 0 10px;vertical-align:middle}.breadcrumb{display:block;height:30px;margin-top:10px}.breadcrumb li{height:30px;vertical-align:middle}.breadcrumb li a{height:30px;vertical-align:middle}.breadcrumb input{font-size:11px!Important}.form-search{position:relative;padding:0}.form-search a{text-decoration:none;cursor:pointer}.form-search a:hover{color:#515054}.form-search h4{color:#515054}.form-search small{color:#d8d7d9}.form-search .icon,.form-search .icon-search{position:absolute;top:6px;left:4px;color:#d8d7d9}.form-search .icon-search{pointer-events:none}.form-search input{width:90%;padding:4px 0 4px 16px;padding-left:25px!Important;font-size:18.75px;font-weight:400;line-height:22px;background:#fff;border:1px solid #d8d7d9}.form-search .search-input{font-weight:bold;border-color:#d8d7d9}.form-search .search-input:hover,.form-search .search-input:focus,.form-search .search-input:focus:hover{border-color:#bbbabf}.form-search .search-input:-moz-placeholder{font-weight:normal}.form-search .search-input:-ms-input-placeholder{font-weight:normal}.form-search .search-input::-webkit-input-placeholder{font-weight:normal}form{margin:0 0 20px}form.-no-margin-bottom{margin-bottom:0}fieldset{padding:0;margin:0;border:0}legend{display:block;width:100%;padding:0;margin-bottom:20px;font-size:22.5px;line-height:40px;color:#343434;border:0;border-bottom:1px solid #d8d7d9}legend small{font-size:15px;color:#d8d7d9}label,input,button,select,textarea{font-size:15px;font-weight:normal;line-height:20px}input,button,select,textarea{font-family:"Lato","Helvetica Neue",Helvetica,Arial,sans-serif}label{display:inline-block;margin-bottom:5px}select,textarea,input[type="text"],input[type="password"],input[type="datetime"],input[type="datetime-local"],input[type="date"],input[type="month"],input[type="time"],input[type="week"],input[type="number"],input[type="email"],input[type="url"],input[type="search"],input[type="tel"],input[type="color"],.uneditable-input{display:inline-block;height:30px;padding:4px 6px;margin-bottom:10px;font-size:15px;line-height:20px;color:#515054;vertical-align:middle;border-radius:0;box-sizing:border-box}input.-full-width-input{width:100%;height:30px;padding:4px 6px;box-sizing:border-box}input,textarea,.uneditable-input{width:206px}textarea{height:auto}textarea,input[type="text"],input[type="password"],input[type="datetime"],input[type="datetime-local"],input[type="date"],input[type="month"],input[type="time"],input[type="week"],input[type="number"],input[type="email"],input[type="url"],input[type="search"],input[type="tel"],input[type="color"],.uneditable-input{background-color:#fff;border:1px solid #bbbabf;transition:border linear .2s,box-shadow linear .2s}textarea:focus,input[type="text"]:focus,input[type="password"]:focus,input[type="datetime"]:focus,input[type="datetime-local"]:focus,input[type="date"]:focus,input[type="month"]:focus,input[type="time"]:focus,input[type="week"]:focus,input[type="number"]:focus,input[type="email"]:focus,input[type="url"]:focus,input[type="search"]:focus,input[type="tel"]:focus,input[type="color"]:focus,.uneditable-input:focus{border-color:none;outline:0;outline:none \9}input[type="radio"],input[type="checkbox"]{margin:4px 0 0;margin-top:1px \9;*margin-top:0;line-height:normal}input[type="file"],input[type="image"],input[type="submit"],input[type="reset"],input[type="button"],input[type="radio"],input[type="checkbox"]{width:auto}select,input[type="file"]{height:30px;*margin-top:4px;line-height:30px}select{width:220px;background-color:#fff;border:1px solid #bbbabf}select[multiple],select[size]{height:auto}select:focus,input[type="file"]:focus,input[type="radio"]:focus,input[type="checkbox"]:focus{outline:thin dotted #515054;outline:5px auto -webkit-focus-ring-color;outline-offset:-2px}.uneditable-input,.uneditable-textarea{color:#d8d7d9;cursor:not-allowed;background-color:#fcfcfc;border-color:#bbbabf;box-shadow:inset 0 1px 2px rgba(0,0,0,0.025)}.uneditable-input{overflow:hidden;white-space:nowrap}.uneditable-textarea{width:auto;height:auto}input:-moz-placeholder,textarea:-moz-placeholder{color:#a2a1a6}input:-ms-input-placeholder,textarea:-ms-input-placeholder{color:#a2a1a6}input::-webkit-input-placeholder,textarea::-webkit-input-placeholder{color:#a2a1a6}.radio,.checkbox{min-height:20px;padding-left:20px}.radio.no-indent,.checkbox.no-indent{padding-left:0}.radio input[type="radio"],.checkbox input[type="checkbox"]{float:left;margin-right:5px;margin-left:0}.controls>.radio:first-child,.controls>.checkbox:first-child{padding-top:5px}.radio.inline,.checkbox.inline{display:inline-block;padding-top:5px;margin-bottom:0;vertical-align:middle}.radio.inline+.radio.inline,.checkbox.inline+.checkbox.inline{margin-left:10px}.input-mini{width:60px}.input-small{width:90px}.input-medium{width:150px}.input-large{width:210px}.input-xlarge{width:270px}.input-xxlarge{width:530px}input.input--no-border{border:0}input[class*="span"],select[class*="span"],textarea[class*="span"],.uneditable-input[class*="span"],.row-fluid input[class*="span"],.row-fluid select[class*="span"],.row-fluid textarea[class*="span"],.row-fluid .uneditable-input[class*="span"]{float:none;margin-left:0}.input-append input[class*="span"],.input-append .uneditable-input[class*="span"],.input-prepend input[class*="span"],.input-prepend .uneditable-input[class*="span"],.row-fluid input[class*="span"],.row-fluid select[class*="span"],.row-fluid textarea[class*="span"],.row-fluid .uneditable-input[class*="span"],.row-fluid .input-prepend [class*="span"],.row-fluid .input-append [class*="span"]{display:inline-block}.bigInput,.input-large-type{font-size:20px!important}input,textarea,.uneditable-input{margin-left:0}.controls-row [class*="span"]+[class*="span"]{margin-left:0}input.span12,textarea.span12,.uneditable-input.span12{width:706px}input.span11,textarea.span11,.uneditable-input.span11{width:646px}input.span10,textarea.span10,.uneditable-input.span10{width:586px}input.span9,textarea.span9,.uneditable-input.span9{width:526px}input.span8,textarea.span8,.uneditable-input.span8{width:466px}input.span7,textarea.span7,.uneditable-input.span7{width:406px}input.span6,textarea.span6,.uneditable-input.span6{width:346px}input.span5,textarea.span5,.uneditable-input.span5{width:286px}input.span4,textarea.span4,.uneditable-input.span4{width:226px}input.span3,textarea.span3,.uneditable-input.span3{width:166px}input.span2,textarea.span2,.uneditable-input.span2{width:106px}input.span1,textarea.span1,.uneditable-input.span1{width:46px}.controls-row{*zoom:1}.controls-row:before,.controls-row:after{display:table;line-height:0;content:""}.controls-row:after{clear:both}.controls-row [class*="span"],.row-fluid .controls-row [class*="span"]{float:left}.controls-row .checkbox[class*="span"],.controls-row .radio[class*="span"]{padding-top:5px}input[disabled],select[disabled],textarea[disabled],input[readonly],select[readonly],textarea[readonly]{cursor:not-allowed;background-color:#f3f3f5}input[type="radio"][disabled],input[type="checkbox"][disabled],input[type="radio"][readonly],input[type="checkbox"][readonly]{background-color:transparent}.show-validation.ng-invalid .control-group.error .control-label,.show-validation.ng-invalid .umb-panel-header-content-wrapper .control-label,.show-validation.ng-invalid .control-group.error .help-block,.show-validation.ng-invalid .umb-panel-header-content-wrapper .help-block,.show-validation.ng-invalid .control-group.error .help-inline,.show-validation.ng-invalid .umb-panel-header-content-wrapper .help-inline{color:#f02e28}.show-validation.ng-invalid .control-group.error .checkbox.ng-invalid,.show-validation.ng-invalid .umb-panel-header-content-wrapper .checkbox.ng-invalid,.show-validation.ng-invalid .control-group.error .radio.ng-invalid,.show-validation.ng-invalid .umb-panel-header-content-wrapper .radio.ng-invalid,.show-validation.ng-invalid .control-group.error input.ng-invalid,.show-validation.ng-invalid .umb-panel-header-content-wrapper input.ng-invalid,.show-validation.ng-invalid .control-group.error select.ng-invalid,.show-validation.ng-invalid .umb-panel-header-content-wrapper select.ng-invalid,.show-validation.ng-invalid .control-group.error textarea.ng-invalid,.show-validation.ng-invalid .umb-panel-header-content-wrapper textarea.ng-invalid{color:#f02e28}.show-validation.ng-invalid .control-group.error input.ng-invalid,.show-validation.ng-invalid .umb-panel-header-content-wrapper input.ng-invalid,.show-validation.ng-invalid .control-group.error select.ng-invalid,.show-validation.ng-invalid .umb-panel-header-content-wrapper select.ng-invalid,.show-validation.ng-invalid .control-group.error textarea.ng-invalid,.show-validation.ng-invalid .umb-panel-header-content-wrapper textarea.ng-invalid{border-color:#f02e28}.show-validation.ng-invalid .control-group.error .input-prepend .add-on,.show-validation.ng-invalid .umb-panel-header-content-wrapper .input-prepend .add-on,.show-validation.ng-invalid .control-group.error .input-append .add-on,.show-validation.ng-invalid .umb-panel-header-content-wrapper .input-append .add-on{color:#f02e28;background-color:#fff;border-color:#f02e28}.highlight-error{color:#f02e28!important;border-color:#fe6561!important}.show-validation .umb-headline-editor-wrapper input:focus:invalid,.show-validation .umb-headline-editor-wrapper textarea:focus:invalid,.show-validation .umb-headline-editor-wrapper select:focus:invalid{color:inherit;border:0;border-color:inherit;box-shadow:inherit}.ng-invalid>.umb-headline-editor-wrapper h1{color:#fe3e39;cursor:pointer;border-bottom:1px dashed #fe3e39}.form-actions{padding:19px 20px 20px;margin-top:20px;margin-bottom:20px;background-color:#e9e9eb;border-top:1px solid #d8d7d9;*zoom:1}.form-actions:before,.form-actions:after{display:table;line-height:0;content:""}.form-actions:after{clear:both}.help-block,.help-inline{color:#55555a}.help-block{display:block;margin-bottom:10px}.help-inline{display:inline-block;*display:inline;padding-left:5px;vertical-align:middle;*zoom:1}.input-append,.input-prepend{display:inline-block;margin-bottom:10px;font-size:0;white-space:nowrap;vertical-align:middle}.input-append input,.input-prepend input,.input-append select,.input-prepend select,.input-append .uneditable-input,.input-prepend .uneditable-input,.input-append .dropdown-menu,.input-prepend .dropdown-menu,.input-append .popover,.input-prepend .popover{font-size:15px}.input-append input,.input-prepend input,.input-append select,.input-prepend select,.input-append .uneditable-input,.input-prepend .uneditable-input{position:relative;margin-bottom:0;*margin-left:0;vertical-align:top}.input-append input:focus,.input-prepend input:focus,.input-append select:focus,.input-prepend select:focus,.input-append .uneditable-input:focus,.input-prepend .uneditable-input:focus{z-index:2}.input-append .add-on,.input-prepend .add-on{display:inline-block;width:auto;height:20px;min-width:16px;padding:4px 5px;font-size:15px;font-weight:normal;line-height:20px;text-align:center;text-shadow:0 1px 0 #fff;background-color:#f3f3f5;border:1px solid #d8d7d9}.input-append .add-on,.input-prepend .add-on,.input-append .btn,.input-prepend .btn,.input-append .btn-group>.dropdown-toggle,.input-prepend .btn-group>.dropdown-toggle{vertical-align:top;border-radius:0}.input-append .active,.input-prepend .active{background-color:#ace9ce;border-color:#35c786}.input-prepend .add-on,.input-prepend .btn{margin-right:-1px}.input-append .add-on,.input-append .btn,.input-append .btn-group{margin-left:-1px}.input-prepend.input-append input,.input-prepend.input-append select,.input-prepend.input-append .uneditable-input{border-radius:0}.input-prepend.input-append input+.btn-group .btn,.input-prepend.input-append select+.btn-group .btn,.input-prepend.input-append .uneditable-input+.btn-group .btn{border-radius:0}.input-prepend.input-append .add-on:first-child,.input-prepend.input-append .btn:first-child{margin-right:-1px;border-radius:0}.input-prepend.input-append .add-on:last-child,.input-prepend.input-append .btn:last-child{margin-left:-1px;border-radius:0}.input-prepend.input-append .btn-group:first-child{margin-left:0}input.search-query{padding-right:4px \9;padding-left:14px;padding-left:4px \9;margin:0;border-radius:0}.form-search .input-append .search-query,.form-search .input-prepend .search-query{border-radius:0}.form-search .input-append .search-query{border-radius:14px 0 0 14px}.form-search .input-append .btn{border-radius:0 14px 14px 0}.form-search .input-prepend .search-query{border-radius:0 14px 14px 0}.form-search .input-prepend .btn{border-radius:14px 0 0 14px}.form-search input,.form-inline input,.form-horizontal input,.form-search textarea,.form-inline textarea,.form-horizontal textarea,.form-search select,.form-inline select,.form-horizontal select,.form-search .help-inline,.form-inline .help-inline,.form-horizontal .help-inline,.form-search .uneditable-input,.form-inline .uneditable-input,.form-horizontal .uneditable-input,.form-search .input-prepend,.form-inline .input-prepend,.form-horizontal .input-prepend,.form-search .input-append,.form-inline .input-append,.form-horizontal .input-append{display:inline-block;*display:inline;margin-bottom:0;vertical-align:top;*zoom:1}.form-search .hide,.form-inline .hide,.form-horizontal .hide{display:none}.form-search label,.form-inline label,.form-search .btn-group,.form-inline .btn-group{display:inline-block}.form-search .input-append,.form-inline .input-append,.form-search .input-prepend,.form-inline .input-prepend{margin-bottom:0}.form-search .radio,.form-search .checkbox,.form-inline .radio,.form-inline .checkbox{padding-left:0;margin-bottom:0;vertical-align:middle}.form-search .radio input[type="radio"],.form-search .checkbox input[type="checkbox"],.form-inline .radio input[type="radio"],.form-inline .checkbox input[type="checkbox"]{float:left;margin-right:3px;margin-left:0}.control-group{margin-bottom:10px}.control-group.-no-margin{margin-bottom:0}legend+.control-group{margin-top:20px;-webkit-margin-top-collapse:separate}.form-horizontal .control-group{margin-bottom:20px;*zoom:1}.form-horizontal .control-group:before,.form-horizontal .control-group:after{display:table;line-height:0;content:""}.form-horizontal .control-group:after{clear:both}.form-horizontal .control-label{float:left;width:160px;padding-top:5px;text-align:right}.form-horizontal .controls{*display:inline-block;*padding-left:20px;margin-left:180px;*margin-left:0}.form-horizontal .controls:first-child{*padding-left:180px}.form-horizontal .help-block{margin-bottom:0}.form-horizontal input+.help-block,.form-horizontal select+.help-block,.form-horizontal textarea+.help-block,.form-horizontal .uneditable-input+.help-block,.form-horizontal .input-prepend+.help-block,.form-horizontal .input-append+.help-block{margin-top:10px}.form-horizontal .form-actions{padding-left:180px}.umb-panel-buttons .umb-btn-toolbar .btn{position:relative;z-index:1000}@media(max-width:767px){.form-horizontal .control-label{width:100%}.form-horizontal .controls{margin-left:0}}.umb-modalcolumn{background:#fff}.umb-modalcolumn-header{height:94px;padding:5px 20px 0 20px;white-space:nowrap;background:#f3f3f5;border-bottom:1px solid #b3afbd}.umb-modalcolumn-header h1{padding-top:10px!important;margin:0;font-size:18.75px;font-weight:400;white-space:nowrap}.umb-modalcolumn-body{position:absolute;top:100px;right:0;bottom:0;left:0;padding:0;overflow:auto;background:#fff}.no-padding .umb-modalcolumn-body{padding:0}.umb-modalcolumn .umb-modalcolumn-header .btn{position:absolute;top:13px;right:15px}.umb-modalcolumn iframe.auto-expand,.umb-modal iframe.auto-expand{position:absolute;top:0;right:0;bottom:0;left:0;padding:0;margin:0;border:0}.umb-modal .umb-loader-wrapper,.umb-modalcolumn .umb-loader-wrapper,.umb-dialog .umb-loader-wrapper{position:relative;margin:20px -20px}.umb-modal-left .umb-panel-header .umb-headline,.umb-modal-left .umb-panel-header h1{width:auto;padding-left:0}.umb-dialog{position:absolute;top:0;right:0;bottom:0;left:0;padding:0;outline:0}.umb-dialog .umb-btn-toolbar{padding:15px 20px 10px 20px;margin-top:30px;clear:both;text-align:right;background:#fff}.umb-dialog .umb-btn-toolbar .umb-control-group{padding:none;border:0}.umb-dialog-body{position:absolute;top:0;right:0;bottom:90px;left:0;overflow:auto}.umb-dialog-body .umb-pane{margin-top:15px}.umb-dialog-footer{position:absolute;right:0;bottom:0;left:0;height:60px;overflow:auto;text-align:right;border-top:#b3afbd 1px solid}.umbracoDialog{width:auto!Important;height:auto!Important;padding:20px}.umbracoDialog .umb-pane{margin-top:0;margin-right:0;margin-left:0}.umbracoDialog .umb-dialog-body .umb-pane{margin-top:20px;margin-right:20px;margin-left:20px}.umbracoDialog form{height:100%}.umbracoDialog .controls-row,.umb-modal .controls-row{margin-left:0!important}.modal{border-radius:0!important}.modal.fade.in{border:none!important}.umb-modal.fade{top:0!important;left:-100%!important;width:0!important;height:100%!important;outline:0;transition:opacity .3s linear,top .3s ease-out}.umb-modal.fade.in{top:0!important;left:100%!important;display:block;width:440px!important;height:100%!important;margin-left:-440px}.umb-modal-left.fade{top:0!important;left:-100%!important;width:0!important;height:100%!important;transition:opacity .3s linear,top .3s ease-out}.umb-modal-left.fade.in{top:0!important;left:0!important;display:block;width:440px!important;height:100%!important;margin-left:80px}.umb-modal .umb-panel-header{height:auto;padding:20px;background:#fff;border:0}.umb-modal .umb-panel-body{padding:0 20px 0 20px}.umb-modal.fade.in.wide{width:640px!important;margin-left:-640px}.umb-modal i{font-size:14px}.umb-modal .breadcrumb{padding:0;background:0}.umb-modal .breadcrumb input{height:12px}.umb-modal.ysod{z-index:10000}.umb-panel{position:absolute;top:0;right:0;bottom:0;left:0;background:#fff}.umb-panel-nobody{padding-top:100px;overflow:auto}.umb-panel-header{position:absolute;top:0;right:0;left:0;height:99px;background:#f3f3f5;border-bottom:1px solid #d8d7d9}.umb-panel-body{position:absolute;top:101px;right:0;bottom:0;left:0;overflow:auto;clear:both}.umb-panel-body.no-header{top:20px}.umb-panel-body.with-footer{bottom:90px}.umb-mediapicker-upload{display:-ms-flexbox;display:flex}.umb-mediapicker-upload .form-search{-ms-flex:1;flex:1}.umb-mediapicker-upload .upload-button{margin-left:16px}.umb-panel.editor-breadcrumb .umb-panel-body,.umb-panel.editor-breadcrumb .umb-bottom-bar{bottom:31px!important}.umb-panel-header .umb-headline,.umb-panel-header h1{width:100%;height:auto;padding:3px 5px;margin:15px 0 0 20px;font-size:16px;line-height:1.4;background:0;border:0;border:1px solid #f3f3f5}.umb-panel-header .umb-headline:focus,.umb-panel-header .umb-headline:active{background-color:#fff;border:1px solid #d8d7d9}.umb-headline-editor-wrapper{position:relative}.umb-headline-editor-wrapper .help-inline{position:absolute;top:25px;right:0;font-size:10px;color:#fe3e39}.umb-panel-header p{margin:0 20px}.umb-btn-toolbar .dimmed,.umb-dimmed{opacity:.6}.umb-headline-editor-wrapper input{padding:0 0 2px 0;margin:-6px 0 0 0;line-height:normal;letter-spacing:-0.01em;color:#000;background:0;border:0;border:1px solid transparent;border-radius:0}.umb-headline-editor-wrapper input.ng-invalid{color:#fe3e39}.umb-headline-editor-wrapper input.ng-invalid::-moz-placeholder,.umb-headline-editor-wrapper input.ng-invalid:-ms-input-placeholder,.umb-headline-editor-wrapper input.ng-invalid::-webkit-input-placeholder{line-height:22px;color:#fe3e39}.umb-panel-header-meta{height:50px}.umb-panel-header .umb-btn-toolbar{float:right;padding:5px 20px 0 0}.umb-panel-footer{position:absolute;right:0;bottom:0;left:0;z-index:999;padding:20px;margin:0}.umb-btn-toolbar .dropdown-menu{right:0;left:auto;z-index:6020;padding:0;border-radius:3px;box-shadow:none}.umb-btn-toolbar .dropdown-menu small{display:block;padding:10px 20px;background:#c0f0ed}.umb-btn-toolbar .dropdown-menu .btn{width:80px;margin:20px 29px}.umb-bottom-bar{position:fixed;right:40px;bottom:0;left:100px;z-index:6010;padding:10px 0 10px 0;background:#fff;border-top:1px solid #f3f3f5;box-shadow:0 -18px 20px #fff}@media(min-width:1101px){.umb-bottom-bar{left:460px}}@media(max-width:767px){.umb-bottom-bar{left:80px}}@media(max-width:500px){.umb-bottom-bar{left:60px}}.umb-tab-buttons{padding-left:0}.umb-tab-buttons>.btn-group:not([style*="display:none"]):not([style*="display: none"]){margin-left:0}@media(min-width:768px){.umb-tab-buttons{padding-left:180px}}.umb-tab-pane{padding-bottom:90px}.tab-content{overflow:visible}.umb-panel-footer-nav{position:absolute;right:0;bottom:0;left:0;display:block;height:30px;margin:0;overflow:hidden;background:#f3f3f5;border-top:#d8d7d9 1px solid}.umb-panel-footer-nav li a{position:relative;display:block;float:left;height:30px;padding:8px 0 8px 30px;margin:0 1px 0 0;font-size:12px;color:#515054;text-align:center;text-decoration:none;background:#f3f3f5;border-radius:0}.umb-panel-footer-nav li a:after{position:absolute;top:0;right:-16px;z-index:1;border-top:16px solid transparent;border-bottom:16px solid transparent;border-left:16px solid #f3f3f5;content:""}.umb-panel-footer-nav li a:before{position:absolute;top:0;left:0;border-top:16px solid transparent;border-bottom:16px solid transparent;border-left:16px solid #d8d7d9;content:""}.umb-panel-footer-nav li:first-child a{padding-left:20px}.umb-panel-footer-nav li:first-child a:before{display:none}.umb-panel-footer-nav li:last-child a:after{display:none}.umb-dialog .muted,.umb-panel .muted{color:#817f85}.umb-dialog a.muted:hover,.umb-dialog a.muted:focus,.umb-panel a.muted:hover,.umb-panel a.muted:focus{color:#68666b}.umb-dialog .text-warning,.umb-panel .text-warning{color:#f0ac00}.umb-dialog a.text-warning:hover,.umb-dialog a.text-warning:focus,.umb-panel a.text-warning:hover,.umb-panel a.text-warning:focus{color:#bd8700}.umb-dialog .text-error,.umb-panel .text-error{color:#f02e28}.umb-dialog a.text-error:hover,.umb-dialog a.text-error:focus,.umb-panel a.text-error:hover,.umb-panel a.text-error:focus{color:#d6150f}.umb-dialog .text-info,.umb-panel .text-info{color:#00aea2}.umb-dialog a.text-info:hover,.umb-dialog a.text-info:focus,.umb-panel a.text-info:hover,.umb-panel a.text-info:focus{color:#007b73}.umb-dialog .text-success,.umb-panel .text-success{color:#1fb572}.umb-dialog a.text-success:hover,.umb-dialog a.text-success:focus,.umb-panel a.text-success:hover,.umb-panel a.text-success:focus{color:#188957}.external-logins form{margin:0}.external-logins button{margin:5px}.umb-panel-header-content-wrapper{display:-ms-flexbox;display:flex;height:100px;padding:0 20px;-ms-flex-direction:column;flex-direction:column}.umb-panel-header-content{display:-ms-flexbox;display:flex;-ms-flex-align:center;align-items:center;-ms-flex:1;flex:1}.umb-panel-header-left-side{display:-ms-flexbox;display:flex;-ms-flex:1;flex:1;-ms-flex-direction:row;flex-direction:row}.umb-panel-header-left-side.-top-position{position:relative;top:-12px}.umb-panel-header-icon{display:-ms-flexbox;display:flex;height:55px;margin-right:5px;cursor:pointer;background:#fff;border:1px solid #d8d7d9;border-radius:3px;animation:fadeIn .5s;-ms-flex-pack:center;justify-content:center;-ms-flex-align:center;align-items:center;-ms-flex:0 0 55px;flex:0 0 55px}.umb-panel-header-title-wrapper{position:relative;width:80%}.umb-panel-header-alias{position:absolute;top:5px;right:10px}.umb-panel-header-alias .umb-locked-field{display:-ms-flexbox;display:flex;-ms-flex-align:center;align-items:center}.umb-panel-header-alias .umb-locked-field,.umb-panel-header-alias .umb-locked-field .umb-locked-field__wrapper{margin-bottom:0}.umb-panel-header-alias .umb-validation-label:after{visibility:hidden}.umb-panel-header-alias .umb-locked-field:after{display:none}.umb-panel-header-icon.-placeholder{border:1px dashed #d8d7d9}.umb-panel-header-icon .icon{font-size:35px;color:#bbbabf}.umb-panel-header-icon-text{font-size:10px;font-weight:bold;color:#35c786}.umb-panel-header .umb-nav-tabs{bottom:-1px}input.umb-panel-header-name-input{width:100%;height:30px;margin-bottom:0;font-size:15px;font-weight:bold;line-height:30px;color:#000;border-color:#d8d7d9;box-sizing:border-box}input.umb-panel-header-name-input:hover{background:#fff;border:1px solid #bbbabf}input.umb-panel-header-name-input.name-is-empty{background:#fff;border:1px dashed #d8d7d9}.umb-panel-header-name{font-size:16px;font-weight:bold}input.umb-panel-header-description{width:100%;height:25px;margin-bottom:0;font-size:13px;line-height:25px;background:transparent;border-color:transparent;box-sizing:border-box}input.umb-panel-header-description:hover{background:#fff;border-color:#d8d7d9}.umb-panel-header-locked-description{height:25px;margin-top:3px;margin-left:2px;font-size:12px;line-height:25px}.umb-editor-drawer-content{display:-ms-flexbox;display:flex;-ms-flex-align:center;align-items:center}.umb-editor-drawer-content__right-side{padding-left:10px;margin-left:auto;-ms-flex:0 0 auto;flex:0 0 auto}.umb-editor-drawer-content__left-side{padding-right:10px;margin-right:auto}ul.sections{display:block;width:80px;height:100%;margin:0;background:#413659;border-right:1px solid #413659}ul.sections li{display:block;border-left:4px #413659 solid;transition:all .3s linear}ul.sections li [class^="icon-"],ul.sections li [class*=" icon-"],ul.sections li img.icon-section{display:inline-block;margin:1px 0 0 0;font-size:30px;line-height:20px;color:#8d869b;transition:all .3s linear}ul.sections:hover li [class^="icon-"],ul.sections:hover li [class*=" icon-"],ul.sections:hover li img.icon-section{color:#fff}ul.sections li a{display:block;width:100%;height:100%;padding:20px 4px 4px 0;margin:0 0 0 -4px;color:#fff;text-align:center;text-decoration:none;cursor:pointer;border-bottom:1px solid #2e2246}ul.sections a span{display:block;font-size:11px;line-height:1.4em;opacity:0;transition:all .3s linear}ul.sections:hover a span{opacity:1}ul.sections li.avatar{height:75px;padding:22px 0 2px 0;margin:0 0 0 -4px;text-align:center;border-bottom:1px solid #2e2246}ul.sections li.avatar a{width:40px;height:40px;padding:0;margin:0 auto;border:0}ul.sections li.avatar a img{width:30px;border-radius:50%}.faded ul.sections li{opacity:.4}ul.sections li.current{background-color:#2e2246}ul.sections li.current,ul.sections li:hover{border-left:4px #00aea2 solid}ul.sections li.avatar.current,ul.sections li.avatar:hover{border-left:4px #413659 solid}ul.sections li.current a{padding-left:0}ul.sections li.current [class^="icon-"],ul.sections li.current [class*=" icon-"],ul.sections li.current img.icon-section{color:#fff}ul.sections li.help{position:absolute;bottom:0;left:0;display:block;width:calc(100% - 5px);margin:0}ul.sections li.help a{border-bottom:0}@media(max-width:500px){ul.sections li [class^="icon-"],ul.sections li [class*=" icon-"]{font-size:25px}ul.sections li:not(.avatar) a{padding-top:12px;padding-bottom:6px}ul.sections li:not(.avatar) a .icon,ul.sections li:not(.avatar) a .icon-section{display:inline-block;padding-left:2px}ul.sections a span{display:none}}li.expand a,li.expand{border:none!important}li.expand>a>i.icon{transition:all .3s linear}li.expand.open>a>i.icon{transform:rotate(180deg)}ul.sections-tray{width:80px;padding-top:99px}ul.sections-tray>li:first-child>a{border-top:1px solid #413659}ul.sections-tray>li{border-left-width:5px}ul.sections-tray>li.current,ul.sections-tray>li:hover{border-left-width:5px}@font-face{font-family:'icomoon';font-style:normal;font-weight:normal;src:url('../fonts/helveticons/helveticons.eot');src:url('../fonts/helveticons/helveticons.eot?#iefix') format('embedded-opentype'),url('../fonts/helveticons/helveticons.ttf') format('truetype'),url('../fonts/helveticons/helveticons.svg#icomoon') format('svg')}[class^="icon-"],[class*=" icon-"]{*margin-right:.3em;font-family:icomoon;-webkit-font-smoothing:antialiased;font-style:normal;font-weight:normal;text-decoration:inherit}[class^="icon-"]:before,[class*=" icon-"]:before{display:inline-block;text-decoration:inherit;speak:none}i.large{font-size:32px}i.medium{font-size:24px}i.small{font-size:14px}.icon-zoom-out:before{content:"\e000"}.icon-truck:before{content:"\e001"}.icon-zoom-in:before{content:"\e002"}.icon-zip:before{content:"\e003"}.icon-axis-rotation:before{content:"\e004"}.icon-yen-bag:before{content:"\e005"}.icon-axis-rotation-2:before{content:"\e006"}.icon-axis-rotation-3:before{content:"\e007"}.icon-wrench:before{content:"\e008"}.icon-wine-glass:before{content:"\e009"}.icon-wrong:before{content:"\e00a"}.icon-windows:before{content:"\e00b"}.icon-window-sizes:before{content:"\e00c"}.icon-window-popin:before{content:"\e00d"}.icon-wifi:before{content:"\e00e"}.icon-width:before{content:"\e00f"}.icon-weight:before{content:"\e010"}.icon-war:before{content:"\e011"}.icon-wand:before{content:"\e012"}.icon-wallet:before{content:"\e013"}.icon-wall-plug:before{content:"\e014"}.icon-voice:before{content:"\e016"}.icon-video:before{content:"\e017"}.icon-vcard:before{content:"\e018"}.icon-utilities:before{content:"\e019"}.icon-users:before{content:"\e01a"}.icon-users-alt:before{content:"\e01b"}.icon-user:before{content:"\e01c"}.icon-user-glasses:before{content:"\e01d"}.icon-user-females:before{content:"\e01e"}.icon-user-females-alt:before{content:"\e01f"}.icon-user-female:before{content:"\e020"}.icon-usb:before{content:"\e021"}.icon-usb-connector:before{content:"\e022"}.icon-unlocked:before{content:"\e023"}.icon-universal:before{content:"\e024"}.icon-undo:before{content:"\e025"}.icon-umbrella:before{content:"\e026"}.icon-umb-deploy:before{content:"\e027"}.icon-umb-contour:before,.traycontour:before{content:"\e028"}.icon-umb-settings:before,.traysettings:before{content:"\e029"}.icon-umb-users:before,.trayuser:before,.trayusers:before{content:"\e02a"}.icon-umb-media:before,.traymedia:before{content:"\e02b"}.icon-umb-content:before,.traycontent:before{content:"\e02c"}.icon-umb-developer:before,.traydeveloper:before{content:"\e02d"}.icon-umb-members:before,.traymember:before{content:"\e015"}.icon-umb-translation:before,.traytranslation:before{content:"\e1fd"}.icon-tv:before{content:"\e02e"}.icon-tv-old:before{content:"\e02f"}.icon-trophy:before{content:"\e030"}.icon-tree:before{content:"\e031"}.icon-trash:before{content:"\e032"}.icon-trash-alt:before{content:"\e033"}.icon-trash-alt-2:before{content:"\e034"}.icon-train:before{content:"\e035"}.icon-trafic:before{content:"\e036"}.icon-traffic-alt:before{content:"\e037"}.icon-top:before{content:"\e038"}.icon-tools:before{content:"\e039"}.icon-timer:before{content:"\e03a"}.icon-time:before{content:"\e03b"}.icon-t-shirt:before{content:"\e03c"}.icon-tab-key:before{content:"\e03d"}.icon-tab:before{content:"\e03e"}.icon-tactics:before{content:"\e03f"}.icon-tag:before{content:"\e040"}.icon-tags:before{content:"\e041"}.icon-takeaway-cup:before{content:"\e042"}.icon-target:before{content:"\e043"}.icon-temperatrure-alt:before{content:"\e044"}.icon-temperature:before{content:"\e045"}.icon-terminal:before{content:"\e046"}.icon-theater:before{content:"\e047"}.icon-theif:before{content:"\e048"}.icon-thought-bubble:before{content:"\e049"}.icon-thumb-down:before{content:"\e04a"}.icon-thumb-up:before{content:"\e04b"}.icon-thumbnail-list:before{content:"\e04c"}.icon-thumbnails-small:before{content:"\e04d"}.icon-thumbnails:before{content:"\e04e"}.icon-ticket:before{content:"\e04f"}.icon-sync:before{content:"\e050"}.icon-sweatshirt:before{content:"\e051"}.icon-sunny:before{content:"\e052"}.icon-stream:before{content:"\e053"}.icon-store:before{content:"\e054"}.icon-stop:before{content:"\e055"}.icon-stop-hand:before{content:"\e056"}.icon-stop-alt:before{content:"\e057"}.icon-stamp:before{content:"\e058"}.icon-stacked-disks:before{content:"\e059"}.icon-ssd:before{content:"\e05a"}.icon-squiggly-line:before{content:"\e05b"}.icon-sprout:before{content:"\e05c"}.icon-split:before{content:"\e05d"}.icon-split-alt:before{content:"\e05e"}.icon-speed-gauge:before{content:"\e05f"}.icon-speaker:before{content:"\e060"}.icon-sound:before{content:"\e061"}.icon-spades:before{content:"\e062"}.icon-sound-waves:before{content:"\e063"}.icon-shipping-box:before{content:"\e064"}.icon-shipping:before{content:"\e065"}.icon-shoe:before{content:"\e066"}.icon-shopping-basket-alt-2:before{content:"\e067"}.icon-shopping-basket:before{content:"\e068"}.icon-shopping-basket-alt:before{content:"\e069"}.icon-shorts:before{content:"\e06a"}.icon-shuffle:before{content:"\e06b"}.icon-sience:before{content:"\e06c"}.icon-simcard:before{content:"\e06d"}.icon-single-note:before{content:"\e06e"}.icon-sitemap:before{content:"\e06f"}.icon-sleep:before{content:"\e070"}.icon-slideshow:before{content:"\e071"}.icon-smiley-inverted:before{content:"\e072"}.icon-smiley:before{content:"\e073"}.icon-snow:before{content:"\e074"}.icon-sound-low:before{content:"\e075"}.icon-sound-medium:before{content:"\e076"}.icon-sound-off:before{content:"\e077"}.icon-shift:before{content:"\e078"}.icon-shield:before{content:"\e079"}.icon-sharing-iphone:before{content:"\e07a"}.icon-share:before{content:"\e07b"}.icon-share-alt:before{content:"\e07c"}.icon-share-alt-2:before{content:"\e07d"}.icon-settings:before{content:"\e07e"}.icon-settings-alt:before{content:"\e07f"}.icon-settings-alt-2:before{content:"\e080"}.icon-server:before{content:"\e081"}.icon-server-alt:before{content:"\e082"}.icon-sensor:before{content:"\e083"}.icon-security-camera:before{content:"\e084"}.icon-search:before{content:"\e085"}.icon-scull:before{content:"\e086"}.icon-script:before{content:"\e087"}.icon-script-alt:before{content:"\e088"}.icon-screensharing:before{content:"\e089"}.icon-school:before{content:"\e08a"}.icon-scan:before{content:"\e08b"}.icon-refresh:before{content:"\e08c"}.icon-remote:before{content:"\e08d"}.icon-remove:before{content:"\e08e"}.icon-repeat-one:before{content:"\e08f"}.icon-repeat:before{content:"\e090"}.icon-resize:before{content:"\e091"}.icon-reply-arrow:before{content:"\e092"}.icon-return-to-top:before{content:"\e093"}.icon-right-double-arrow:before{content:"\e094"}.icon-road:before{content:"\e095"}.icon-roadsign:before{content:"\e096"}.icon-rocket:before{content:"\e097"}.icon-rss:before{content:"\e098"}.icon-ruler-alt:before{content:"\e099"}.icon-ruler:before{content:"\e09a"}.icon-sandbox-toys:before{content:"\e09b"}.icon-satellite-dish:before{content:"\e09c"}.icon-save:before{content:"\e09d"}.icon-safedial:before{content:"\e09e"}.icon-safe:before{content:"\e09f"}.icon-redo:before{content:"\e0a0"}.icon-printer-alt:before{content:"\e0a1"}.icon-planet:before{content:"\e0a2"}.icon-paste-in:before{content:"\e0a3"}.icon-os-x:before{content:"\e0a4"}.icon-navigation-left:before{content:"\e0a5"}.icon-message:before{content:"\e0a6"}.icon-lock:before{content:"\e0a7"}.icon-layers-alt:before{content:"\e0a8"}.icon-record:before{content:"\e0a9"}.icon-print:before{content:"\e0aa"}.icon-plane:before{content:"\e0ab"}.icon-partly-cloudy:before{content:"\e0ac"}.icon-ordered-list:before{content:"\e0ad"}.icon-navigation-last:before{content:"\e0ae"}.icon-message-unopened:before{content:"\e0af"}.icon-location-nearby:before{content:"\e0b0"}.icon-laptop:before{content:"\e0b1"}.icon-reception:before{content:"\e0b2"}.icon-price-yen:before{content:"\e0b3"}.icon-piracy:before{content:"\e0b4"}.icon-parental-control:before{content:"\e0b5"}.icon-operator:before{content:"\e0b6"}.icon-navigation-horizontal:before{content:"\e0b7"}.icon-message-open:before{content:"\e0b8"}.icon-lab:before{content:"\e0b9"}.icon-location-near-me:before{content:"\e0ba"}.icon-receipt-yen:before{content:"\e0bb"}.icon-price-pound:before{content:"\e0bc"}.icon-pin-location:before{content:"\e0bd"}.icon-parachute-drop:before{content:"\e0be"}.icon-old-phone:before{content:"\e0bf"}.icon-merge:before{content:"\e0c0"}.icon-navigation-first:before{content:"\e0c1"}.icon-locate:before{content:"\e0c2"}.icon-keyhole:before{content:"\e0c3"}.icon-receipt-pound:before{content:"\e0c4"}.icon-price-euro:before{content:"\e0c5"}.icon-piggy-bank:before{content:"\e0c6"}.icon-paper-plane:before{content:"\e0c7"}.icon-old-key:before{content:"\e0c8"}.icon-navigation-down:before{content:"\e0c9"}.icon-megaphone:before{content:"\e0ca"}.icon-loading:before{content:"\e0cb"}.icon-keychain:before{content:"\e0cc"}.icon-receipt-euro:before{content:"\e0cd"}.icon-price-dollar:before{content:"\e0ce"}.icon-pie-chart:before{content:"\e0cf"}.icon-paper-plane-alt:before{content:"\e0d0"}.icon-notepad:before{content:"\e0d1"}.icon-navigation-bottom:before{content:"\e0d2"}.icon-meeting:before{content:"\e0d3"}.icon-keyboard:before{content:"\e0d4"}.icon-load:before{content:"\e0d5"}.icon-receipt-dollar:before{content:"\e0d6"}.icon-previous:before{content:"\e0d7"}.icon-pictures:before{content:"\e0d8"}.icon-notepad-alt:before{content:"\e0d9"}.icon-paper-bag:before{content:"\e0da"}.icon-name-badge:before{content:"\e0db"}.icon-medicine:before{content:"\e0dc"}.icon-list:before{content:"\e0dd"}.icon-key:before{content:"\e0de"}.icon-receipt-alt:before{content:"\e0df"}.icon-previous-media:before{content:"\e0e0"}.icon-pictures-alt:before{content:"\e0e1"}.icon-pants:before{content:"\e0e2"}.icon-nodes:before{content:"\e0e3"}.icon-music:before{content:"\e0e4"}.icon-readonly:before{content:"\e0e5"}.icon-presentation:before{content:"\e0e6"}.icon-pictures-alt-2:before{content:"\e0e7"}.icon-pannel-close:before{content:"\e0e8"}.icon-next:before{content:"\e0e9"}.icon-multiple-windows:before{content:"\e0ea"}.icon-medical-emergency:before{content:"\e0eb"}.icon-medal:before{content:"\e0ec"}.icon-link:before{content:"\e0ed"}.icon-linux-tux:before{content:"\e0ee"}.icon-junk:before{content:"\e0ef"}.icon-item-arrangement:before{content:"\e0f0"}.icon-iphone:before{content:"\e0f1"}.icon-lightning:before{content:"\e0f2"}.icon-map:before{content:"\e0f3"}.icon-multiple-credit-cards:before{content:"\e0f4"}.icon-next-media:before{content:"\e0f5"}.icon-panel-show:before{content:"\e0f6"}.icon-picture:before{content:"\e0f7"}.icon-power:before{content:"\e0f8"}.icon-re-post:before{content:"\e0f9"}.icon-rate:before{content:"\e0fa"}.icon-rain:before{content:"\e0fb"}.icon-radio:before{content:"\e0fc"}.icon-radio-receiver:before{content:"\e0fd"}.icon-radio-alt:before{content:"\e0fe"}.icon-quote:before{content:"\e0ff"}.icon-qr-code:before{content:"\e100"}.icon-pushpin:before{content:"\e101"}.icon-pulse:before{content:"\e102"}.icon-projector:before{content:"\e103"}.icon-play:before{content:"\e104"}.icon-playing-cards:before{content:"\e105"}.icon-playlist:before{content:"\e106"}.icon-plugin:before{content:"\e107"}.icon-podcast:before{content:"\e108"}.icon-poker-chip:before{content:"\e109"}.icon-poll:before{content:"\e10a"}.icon-post-it:before{content:"\e10b"}.icon-pound-bag:before{content:"\e10c"}.icon-power-outlet:before{content:"\e10d"}.icon-photo-album:before{content:"\e10e"}.icon-phone:before{content:"\e10f"}.icon-phone-ring:before{content:"\e110"}.icon-people:before{content:"\e111"}.icon-people-female:before{content:"\e112"}.icon-people-alt:before{content:"\e113"}.icon-people-alt-2:before{content:"\e114"}.icon-pc:before{content:"\e115"}.icon-pause:before{content:"\e116"}.icon-path:before{content:"\e117"}.icon-out:before{content:"\e118"}.icon-outbox:before{content:"\e119"}.icon-outdent:before{content:"\e11a"}.icon-page-add:before{content:"\e11b"}.icon-page-down:before{content:"\e11c"}.icon-page-remove:before{content:"\e11d"}.icon-page-restricted:before{content:"\e11e"}.icon-page-up:before{content:"\e11f"}.icon-paint-roller:before{content:"\e120"}.icon-palette:before{content:"\e121"}.icon-newspaper:before{content:"\e122"}.icon-newspaper-alt:before{content:"\e123"}.icon-network-alt:before{content:"\e124"}.icon-navigational-arrow:before{content:"\e125"}.icon-navigation:before{content:"\e126"}.icon-navigation-vertical:before{content:"\e127"}.icon-navigation-up:before{content:"\e128"}.icon-navigation-top:before{content:"\e129"}.icon-navigation-road:before{content:"\e12a"}.icon-navigation-right:before{content:"\e12b"}.icon-microscope:before{content:"\e12c"}.icon-mindmap:before{content:"\e12d"}.icon-molecular-network:before{content:"\e12e"}.icon-molecular:before{content:"\e12f"}.icon-mountain:before{content:"\e130"}.icon-mouse-cursor:before{content:"\e131"}.icon-mouse:before{content:"\e132"}.icon-movie-alt:before{content:"\e133"}.icon-map-marker:before{content:"\e134"}.icon-movie:before{content:"\e135"}.icon-map-location:before{content:"\e136"}.icon-map-alt:before{content:"\e137"}.icon-male-symbol:before{content:"\e138"}.icon-male-and-female:before{content:"\e139"}.icon-mailbox:before{content:"\e13a"}.icon-magnet:before{content:"\e13b"}.icon-loupe:before{content:"\e13c"}.icon-mobile:before{content:"\e13d"}.icon-logout:before{content:"\e13e"}.icon-log-out:before{content:"\e13f"}.icon-layers:before{content:"\e140"}.icon-left-double-arrow:before{content:"\e141"}.icon-layout:before{content:"\e142"}.icon-legal:before{content:"\e143"}.icon-lense:before{content:"\e144"}.icon-library:before{content:"\e145"}.icon-light-down:before{content:"\e146"}.icon-light-up:before{content:"\e147"}.icon-lightbulb-active:before{content:"\e148"}.icon-lightbulb:before{content:"\e149"}.icon-ipad:before{content:"\e14a"}.icon-invoice:before{content:"\e14b"}.icon-info:before{content:"\e14c"}.icon-infinity:before{content:"\e14d"}.icon-indent:before{content:"\e14e"}.icon-inbox:before{content:"\e14f"}.icon-inbox-full:before{content:"\e150"}.icon-inactive-line:before{content:"\e151"}.icon-imac:before{content:"\e152"}.icon-hourglass:before{content:"\e153"}.icon-home:before{content:"\e154"}.icon-grid:before{content:"\e155"}.icon-food:before{content:"\e156"}.icon-favorite:before{content:"\e157"}.icon-door-open-alt:before{content:"\e158"}.icon-diagnostics:before{content:"\e159"}.icon-contrast:before{content:"\e15a"}.icon-coins-dollar-alt:before{content:"\e15b"}.icon-circle-dotted-active:before{content:"\e15c"}.icon-cinema:before{content:"\e15d"}.icon-chip:before{content:"\e15e"}.icon-chip-alt:before{content:"\e15f"}.icon-chess:before{content:"\e160"}.icon-checkbox:before{content:"\e161"}.icon-checkbox-empty:before{content:"\e162"}.icon-checkbox-dotted:before{content:"\e163"}.icon-checkbox-dotted-active:before{content:"\e164"}.icon-check:before{content:"\e165"}.icon-chat:before{content:"\e166"}.icon-chat-active:before{content:"\e167"}.icon-chart:before{content:"\e168"}.icon-chart-curve:before{content:"\e169"}.icon-certificate:before{content:"\e16a"}.icon-categories:before{content:"\e16b"}.icon-cash-register:before{content:"\e16c"}.icon-car:before{content:"\e16d"}.icon-caps-lock:before{content:"\e16e"}.icon-candy:before{content:"\e16f"}.icon-circle-dotted:before{content:"\e170"}.icon-circuits:before{content:"\e171"}.icon-circus:before{content:"\e172"}.icon-client:before{content:"\e173"}.icon-clothes-hanger:before{content:"\e174"}.icon-cloud-drive:before{content:"\e175"}.icon-cloud-upload:before{content:"\e176"}.icon-cloud:before{content:"\e177"}.icon-cloudy:before{content:"\e178"}.icon-clubs:before{content:"\e179"}.icon-cocktail:before{content:"\e17a"}.icon-code:before{content:"\e17b"}.icon-coffee:before{content:"\e17c"}.icon-coin-dollar:before{content:"\e17d"}.icon-coin-pound:before{content:"\e17e"}.icon-coin-yen:before{content:"\e17f"}.icon-coin:before{content:"\e180"}.icon-coins-alt:before{content:"\e181"}.icon-console:before{content:"\e182"}.icon-connection:before{content:"\e183"}.icon-compress:before{content:"\e184"}.icon-company:before{content:"\e185"}.icon-command:before{content:"\e186"}.icon-coin-euro:before{content:"\e187"}.icon-combination-lock:before{content:"\e188"}.icon-combination-lock-open:before{content:"\e189"}.icon-comb:before{content:"\e18a"}.icon-columns:before{content:"\e18b"}.icon-colorpicker:before{content:"\e18c"}.icon-color-bucket:before{content:"\e18d"}.icon-coins:before{content:"\e18e"}.icon-coins-yen:before{content:"\e18f"}.icon-coins-yen-alt:before{content:"\e190"}.icon-coins-pound:before{content:"\e191"}.icon-coins-pound-alt:before{content:"\e192"}.icon-coins-euro:before{content:"\e193"}.icon-coins-euro-alt:before{content:"\e194"}.icon-coins-dollar:before{content:"\e195"}.icon-conversation-alt:before{content:"\e196"}.icon-conversation:before{content:"\e197"}.icon-coverflow:before{content:"\e198"}.icon-credit-card-alt:before{content:"\e199"}.icon-credit-card:before{content:"\e19a"}.icon-crop:before{content:"\e19b"}.icon-crosshair:before{content:"\e19c"}.icon-crown-alt:before{content:"\e19d"}.icon-crown:before{content:"\e19e"}.icon-cupcake:before{content:"\e19f"}.icon-curve:before{content:"\e1a0"}.icon-cut:before{content:"\e1a1"}.icon-dashboard:before{content:"\e1a2"}.icon-defrag:before{content:"\e1a3"}.icon-delete:before{content:"\e1a4"}.icon-delete-key:before{content:"\e1a5"}.icon-departure:before{content:"\e1a6"}.icon-desk:before{content:"\e1a7"}.icon-desktop:before{content:"\e1a8"}.icon-donate:before{content:"\e1a9"}.icon-dollar-bag:before{content:"\e1aa"}.icon-documents:before{content:"\e1ab"}.icon-document:before{content:"\e1ac"}.icon-document-dashed-line:before{content:"\e1ad"}.icon-dock-connector:before{content:"\e1ae"}.icon-dna:before{content:"\e1af"}.icon-display:before{content:"\e1b0"}.icon-disk-image:before{content:"\e1b1"}.icon-disc:before{content:"\e1b2"}.icon-directions:before{content:"\e1b3"}.icon-directions-alt:before{content:"\e1b4"}.icon-diploma:before{content:"\e1b5"}.icon-diploma-alt:before{content:"\e1b6"}.icon-dice:before{content:"\e1b7"}.icon-diamonds:before{content:"\e1b8"}.icon-diamond:before{content:"\e1b9"}.icon-diagonal-arrow:before{content:"\e1ba"}.icon-diagonal-arrow-alt:before{content:"\e1bb"}.icon-door-open:before{content:"\e1bc"}.icon-download-alt:before{content:"\e1bd"}.icon-download:before{content:"\e1be"}.icon-drop:before{content:"\e1bf"}.icon-eco:before{content:"\e1c0"}.icon-economy:before{content:"\e1c1"}.icon-edit:before{content:"\e1c2"}.icon-eject:before{content:"\e1c3"}.icon-employee:before{content:"\e1c4"}.icon-energy-saving-bulb:before{content:"\e1c5"}.icon-enter:before{content:"\e1c6"}.icon-equalizer:before{content:"\e1c7"}.icon-escape:before{content:"\e1c8"}.icon-ethernet:before{content:"\e1c9"}.icon-euro-bag:before{content:"\e1ca"}.icon-exit-fullscreen:before{content:"\e1cb"}.icon-eye:before{content:"\e1cc"}.icon-facebook-like:before{content:"\e1cd"}.icon-factory:before{content:"\e1ce"}.icon-font:before{content:"\e1cf"}.icon-folders:before{content:"\e1d0"}.icon-folder:before,.icon-folder-close:before{content:"\e1d1"}.icon-folder-outline:before{content:"\e1d2"}.icon-folder-open:before{content:"\e1d3"}.icon-flowerpot:before{content:"\e1d4"}.icon-flashlight:before{content:"\e1d5"}.icon-flash:before{content:"\e1d6"}.icon-flag:before{content:"\e1d7"}.icon-flag-alt:before{content:"\e1d8"}.icon-firewire:before{content:"\e1d9"}.icon-firewall:before{content:"\e1da"}.icon-fire:before{content:"\e1db"}.icon-fingerprint:before{content:"\e1dc"}.icon-filter:before{content:"\e1dd"}.icon-filter-arrows:before{content:"\e1de"}.icon-files:before{content:"\e1df"}.icon-file-cabinet:before{content:"\e1e0"}.icon-female-symbol:before{content:"\e1e1"}.icon-footprints:before{content:"\e1e2"}.icon-hammer:before{content:"\e1e3"}.icon-hand-active-alt:before{content:"\e1e4"}.icon-forking:before{content:"\e1e5"}.icon-hand-active:before{content:"\e1e6"}.icon-hand-pointer-alt:before{content:"\e1e7"}.icon-hand-pointer:before{content:"\e1e8"}.icon-handprint:before{content:"\e1e9"}.icon-handshake:before{content:"\e1ea"}.icon-handtool:before{content:"\e1eb"}.icon-hard-drive:before{content:"\e1ec"}.icon-help:before{content:"\e1ed"}.icon-graduate:before{content:"\e1ee"}.icon-gps:before{content:"\e1ef"}.icon-help-alt:before{content:"\e1f0"}.icon-height:before{content:"\e1f1"}.icon-globe:before{content:"\e1f2"}.icon-hearts:before{content:"\e1f3"}.icon-globe-inverted-europe-africa:before{content:"\e1f4"}.icon-headset:before{content:"\e1f5"}.icon-globe-inverted-asia:before{content:"\e1f6"}.icon-headphones:before{content:"\e1f7"}.icon-globe-inverted-america:before{content:"\e1f8"}.icon-hd:before{content:"\e1f9"}.icon-globe-europe-africa:before,.icon-globe-europe---africa:before{content:"\e1fa"}.icon-hat:before{content:"\e1fb"}.icon-globe-asia:before{content:"\e1fc"}.icon-globe-alt:before{content:"\e1fd"}.icon-hard-drive-alt:before{content:"\e1fe"}.icon-glasses:before{content:"\e1ff"}.icon-gift:before{content:"\e200"}.icon-handtool-alt:before{content:"\e201"}.icon-geometry:before{content:"\e202"}.icon-game:before{content:"\e203"}.icon-fullscreen:before{content:"\e204"}.icon-fullscreen-alt:before{content:"\e205"}.icon-frame:before{content:"\e206"}.icon-frame-alt:before{content:"\e207"}.icon-camera-roll:before{content:"\e208"}.icon-bookmark:before{content:"\e209"}.icon-bill:before{content:"\e20a"}.icon-baby-stroller:before{content:"\e20b"}.icon-alarm-clock:before{content:"\e20c"}.icon-adressbook:before{content:"\e20d"}.icon-add:before{content:"\e20e"}.icon-activity:before{content:"\e20f"}.icon-untitled:before{content:"\e210"}.icon-glasses:before{content:"\e211"}.icon-camcorder:before{content:"\e212"}.icon-calendar:before{content:"\e213"}.icon-calendar-alt:before{content:"\e214"}.icon-calculator:before{content:"\e215"}.icon-bus:before{content:"\e216"}.icon-burn:before{content:"\e217"}.icon-bulleted-list:before{content:"\e218"}.icon-bug:before{content:"\e219"}.icon-brush:before{content:"\e21a"}.icon-brush-alt:before{content:"\e21b"}.icon-brush-alt-2:before{content:"\e21c"}.icon-browser-window:before{content:"\e21d"}.icon-briefcase:before{content:"\e21e"}.icon-brick:before{content:"\e21f"}.icon-brackets:before{content:"\e220"}.icon-box:before{content:"\e221"}.icon-box-open:before{content:"\e222"}.icon-box-alt:before{content:"\e223"}.icon-books:before{content:"\e224"}.icon-billboard:before{content:"\e225"}.icon-bills-dollar:before{content:"\e226"}.icon-bills-euro:before{content:"\e227"}.icon-bills-pound:before{content:"\e228"}.icon-bills-yen:before{content:"\e229"}.icon-bills:before{content:"\e22a"}.icon-binarycode:before{content:"\e22b"}.icon-binoculars:before{content:"\e22c"}.icon-bird:before{content:"\e22d"}.icon-birthday-cake:before{content:"\e22e"}.icon-blueprint:before{content:"\e22f"}.icon-block:before{content:"\e230"}.icon-bluetooth:before{content:"\e231"}.icon-boat-shipping:before{content:"\e232"}.icon-bomb:before{content:"\e233"}.icon-book-alt-2:before{content:"\e234"}.icon-bones:before{content:"\e235"}.icon-book-alt:before{content:"\e236"}.icon-book:before{content:"\e237"}.icon-bill-yen:before{content:"\e238"}.icon-award:before{content:"\e239"}.icon-bill-pound:before{content:"\e23a"}.icon-autofill:before{content:"\e23b"}.icon-bill-euro:before{content:"\e23c"}.icon-auction-hammer:before{content:"\e23d"}.icon-bill-dollar:before{content:"\e23e"}.icon-attachment:before{content:"\e23f"}.icon-bell:before{content:"\e240"}.icon-article:before{content:"\e241"}.icon-bell-off:before{content:"\e242"}.icon-art-easel:before{content:"\e243"}.icon-beer-glass:before{content:"\e244"}.icon-arrow-up:before{content:"\e245"}.icon-battery-low:before{content:"\e246"}.icon-arrow-right:before{content:"\e247"}.icon-battery-full:before{content:"\e248"}.icon-arrow-left:before{content:"\e249"}.icon-bars:before{content:"\e24a"}.icon-arrow-down:before{content:"\e24b"}.icon-barcode:before{content:"\e24c"}.icon-arrivals:before{content:"\e24d"}.icon-bar-chart:before{content:"\e24e"}.icon-application-window:before{content:"\e24f"}.icon-band-aid:before{content:"\e250"}.icon-application-window-alt:before{content:"\e251"}.icon-ball:before{content:"\e252"}.icon-application-error:before{content:"\e253"}.icon-badge-restricted:before{content:"\e254"}.icon-app:before{content:"\e255"}.icon-badge-remove:before{content:"\e256"}.icon-anchor:before{content:"\e257"}.icon-badge-count:before{content:"\e258"}.icon-alt:before{content:"\e259"}.icon-badge-add:before{content:"\e25a"}.icon-alert:before{content:"\e25b"}.icon-backspace:before{content:"\e25c"}.icon-alert-alt:before{content:"\e25d"}.fill{height:100%;min-height:100%}.shadow{box-shadow:3px 0 7px #d8d7d9}.umb-scrollable,.umb-auto-overflow{overflow:auto}.umb-abstract{display:block;margin-top:0;margin-bottom:15px;font-size:14px;color:#bbbabf}h5{margin-top:15px;font-size:15px;font-weight:bold;color:#1e1c1c}h5.-border-bottom{padding-bottom:5px;border-bottom:1px solid #e9e9eb}h5.-black{color:#000}.umb-form-actions{background:0;border:0}.datepicker td.active,.datepicker td span.active{background:#03bfb3!important}.umb-datetime-picker div.info{vertical-align:middle}.umb-userwidget img{float:left;margin-right:15px}.umb-userwidget small{display:block}.popover-title{display:none}.thumbnails>li.umb-plus-btn{margin:0 10px 10px 0}.umb-plus-btn a{display:block;width:136px;height:136px;font-size:50px;line-height:136px;color:#d8d7d9;text-align:center;text-decoration:none;border:2px dashed #d8d7d9;transition:all .3s ease-in-out}.umb-plus-btn a:hover{color:#000;border:2px dashed #000}.umb-plus-btn i{margin:auto;vertical-align:middle}.umb-pane{margin:30px 20px}.umb-control-group{padding-bottom:20px;margin-bottom:15px!important;border-bottom:1px solid #f3f3f5}.umb-control-group.-no-border{border:0}.compact .umb-pane{margin:0 0 15px 0}.compact .umb-control-group{padding-bottom:10px;margin-bottom:5px!important;border-bottom:1px solid #f3f3f5}.compact label.control-label{padding-top:0!important;margin-bottom:0}.compact .controls-row{padding-top:0}.umb-pane>.umb-control-group:last-child{padding-bottom:0!important;border:0}.umb-control-group .umb-el-wrap{padding:0}.umb-control-group label.control-label,.umb-control-group .control-label{text-align:left}.umb-control-group label.control-label>div>label{padding-left:0}.umb-control-group label .help-block,.umb-control-group label small{padding-top:5px;font-size:12px;line-height:1.5em;color:#a2a1a6}.umb-nolabel .controls{margin-left:0}.umb-control-required{color:#fe3e39}.controls-row{padding-bottom:5px;margin-left:240px}.umb-user-panel .controls-row{margin-left:0}.controls-row label{display:inline-block}.controls-row>div>label{padding-left:0}.block-form .controls-row{padding-top:0;margin-left:0}.hidelabel>div>.controls-row,.hidelabel>.controls-row,.hidelabel>div>.controls{padding:0;margin:0!important;border:0}.controls-row>.vertical-align-items{display:-ms-flexbox;display:flex;-ms-flex-align:center;align-items:center}.controls-row>.vertical-align-items>input.umb-editor-tiny{margin-right:5px;margin-left:5px}.controls-row>.vertical-align-items>input.umb-editor-tiny:first-child{margin-left:0}.thumbnails .selected{background:#000;border-color:#000}.umb-version{position:absolute;right:20px;bottom:5px;color:#bbbabf}.dashboardHideLink{display:none}.dashboardWrapper{position:relative}.dashboardWrapper h2{padding:0 0 0 45px}.dashboardWrapper h3{font-size:14px;font-weight:bold}.dashboardIcon{position:absolute;top:2px;left:2px}.umb-dashboard-control iframe{position:absolute;display:block;width:99%;height:99%;overflow:auto!important}.umb-table{word-wrap:break-word;table-layout:fixed}.umb-no-border{border:none!important}table thead a{color:#303033}.umb-table tbody.ui-sortable tr{cursor:pointer}.umb-table tbody.ui-sortable tr.ui-sortable-helper{background-color:#81ded8;border:0}.umb-table tbody.ui-sortable tr.ui-sortable-helper td{border:0}.umb-table tbody.ui-sortable tr.ui-sortable-placeholder{background-color:#03bfb3;border:0}.umb-table tbody.ui-sortable tr.ui-sortable-placeholder td{height:5px;padding:0;line-height:0}.thumbnails>li.umb-thumbnail{position:relative;margin:0 10px 10px 0}.thumbnails>li.umb-thumbnail .umb-icons{position:absolute;top:0;left:0;z-index:1000;width:100%;padding:17px 0;background:#1e1c1c}.thumbnails>li.umb-thumbnail .icon-crop{position:absolute;top:10px;left:10px;font-size:14px;color:#fff}.thumbnails>li.umb-thumbnail .icon-remove{position:absolute;top:10px;right:10px;font-size:14px;color:#fff}.umb-image-crop{float:left;width:400px;padding:0 0 30px 0;margin:0 30px 25px 0}.umb-image-mask{position:relative;width:399px;height:300px;margin:0 30px 0 0}.umb-image-mask:after{position:absolute;top:0;left:0;z-index:5999;width:100%;height:100%;content:"";opacity:.6;filter:alpha(opacity=6);box-shadow:inset 0 0 0 40px #fff,inset 0 0 0 41px rgba(0,0,0,0.2),inset 0 0 20px 41px rgba(0,0,0,0.2)}.umb-image-mask .icon-screenshot{position:absolute;top:125px;left:110px;z-index:1000;font-size:30px;color:#fff}.umb-image-mask .icon-circle{position:absolute;top:130px;left:115px;z-index:1;font-size:20px;color:#00aea2}.umb-crop-preview{float:left;width:400px}.umb-image-controls{width:400px}.umb-image-controls .icon-minus{float:left;padding:14px 10px 0 10px;color:#bbbabf}.umb-image-controls .icon-plus{float:right;padding:14px 10px 0 10px;color:#bbbabf;text-align:left}.umb-image-crop .range{display:block;float:left;width:82%;height:1px;margin:20px 0 0 0;background:#bbbabf;-webkit-appearance:none}.umb-image-crop .range::-webkit-slider-thumb{width:14px;height:14px;margin-top:-1px;background:#f3f3f5;border:1px solid #bbbabf;border-radius:2px;content:"1";-webkit-appearance:none}.umb-search-group li>div{padding-left:20px}.umb-search-group li>div a>i{height:100%}#search-form .form-search div{margin-top:3px}#search-form .form-search div .btn{position:relative;top:0;left:0}#dictionaryItems tr{border-top:solid 1px #d8d7d9}#dictionaryItems thead tr{font-weight:bold;border-top:0}#dictionaryItems th{font-weight:normal;text-align:left}#dictionaryItems td{text-align:center}#dictionaryItems thead td:first-of-type{text-align:left}#dictioanryItems i{font-size:18px}#dictionaryItems .icon-alert{color:#fe3e39}#dictionaryItems .icon-check{color:#35c786}.umb-loader{width:100%;height:1px;margin-top:0;margin-left:-100%;background-color:#00aea2;animation-duration:1s;animation-iteration-count:infinite;animation-name:bounce_loadingProgressG;animation-timing-function:linear;-o-animationtiming-function:linear}@keyframes bounce_loadingProgressG{0%{margin-left:-100%}100%{margin-left:100%}}.umb-loader-wrapper{position:absolute;right:0;left:0;margin:10px 0;overflow:hidden}.umb-loader-wrapper.-bottom{bottom:0}.strong{font-weight:bold}.inline{display:inline}.input-label--title{margin-bottom:3px;font-weight:bold;color:#000}.input-label--small{display:inline;font-size:12px;font-weight:bold;color:#515054}.input-label--small:hover{color:#000}input[type=checkbox]:checked+.input-label--small{color:#00aea2}.panel-dialog--header{padding-bottom:10px;margin:10px 0;font-size:18.75px;font-weight:bold;line-height:20px;border-bottom:1px solid #515054}.bootstrap-datetimepicker-widget,.bootstrap-datetimepicker-widget td,.bootstrap-datetimepicker-widget th,.bootstrap-datetimepicker-widget td span{border-radius:0!important}.umb-item-list{display:block;width:auto;margin:0}.umb-item-list li{display:block;width:auto}.umb-tree{width:auto;min-width:100%;margin:0}.umb-tree li{display:block;width:auto;min-width:100%}.umb-tree li.current>div,.umb-tree div.selected{background:#00aea2}.umb-tree li.current>div a.umb-options i,.umb-tree div.selected i{background:#fff;border-color:#00aea2;transition:opacity 120ms ease}.umb-tree li.current>div a.umb-options:hover i,.umb-tree div.selected i{opacity:.7}.umb-tree li.current>div a,.umb-tree li.current>div i.icon,.umb-tree li.current>div ins{color:#fff!important;background-color:#00aea2;border-color:#00aea2}.umb-tree li.root>div{padding:0}.umb-tree li.root>div h5{display:-ms-flexbox;display:flex;width:100%;margin:0;-ms-flex-align:center;align-items:center}.umb-tree li.root>div h5>a,.umb-tree-header{display:-ms-flexbox;display:flex;padding:20px 0 20px 20px;box-sizing:border-box}.umb-tree *{white-space:nowrap}.umb-tree ul{width:100%;min-width:100%;padding:0;margin:0}.umb-tree ul.collapsed{display:none}.umb-tree a{text-decoration:none;cursor:pointer;outline:0}.umb-tree a:hover{text-decoration:none}.umb-tree div{position:relative;display:-ms-flexbox;display:flex;padding:5px 0 5px 0;overflow:hidden;-ms-flex-wrap:nowrap;flex-wrap:nowrap;-ms-flex-align:center;align-items:center}.umb-tree a.noSpr{background-position:0 0}.umb-tree div>a.umb-options{visibility:hidden}.umb-tree div:hover>a.umb-options{visibility:visible}.umb-tree li.root>div a,.umb-tree li.root h5,.umb-tree-header{font-size:15px;font-weight:bold;color:#303033}.umb-tree ins{width:16px;height:16px;margin:-4px 0 0 -16px;font-size:12px;text-decoration:none;visibility:hidden;transition:opacity 120ms ease}.umb-tree ins:hover{opacity:.7}.umb-tree li:hover ins{cursor:pointer;visibility:visible}.umb-tree li div{padding:0}.umb-tree li>div a:not(.umb-options){display:-ms-flexbox;display:flex;width:100%;padding:6px 0}.umb-tree li>div:hover a:not(.umb-options){margin-right:6px;overflow:hidden}.umb-tree .icon{margin:0 13px 0 0;font-size:20px;color:#1e1c1c;vertical-align:middle}.umb-tree-icon{cursor:pointer}.umb-tree i.noSpr{display:inline-block;width:16px;height:16px;margin-top:1px;line-height:16px}.umb-tree div:hover{background:#f3f3f5}.umb-tree small.search-subtitle{display:block;padding-left:35px;color:#bbbabf}.umb-tree .umb-tree-node-search{cursor:pointer}.umb-tree .umb-search-group-item{padding-left:20px}.umb-tree .umb-search-group-item-link{display:-ms-flexbox;display:flex;-ms-flex-wrap:wrap;flex-wrap:wrap;-ms-flex-direction:column;flex-direction:column}.icon-check:before{content:"\e165"}.umb-tree .umb-tree-node-checked i[class^="icon-"],.umb-tree .umb-tree-node-checked i[class*=" icon-"]{font-family:'icomoon'!important;color:#35c786!important}.umb-tree .umb-tree-node-checked i:before{content:"\e165"!important}a.umb-options{display:-ms-flexbox;display:flex;padding:9px 5px;margin-right:10px;text-align:center;cursor:pointer;visibility:hidden;-ms-flex-pack:end;justify-content:flex-end}a.umb-options i{display:inline-block;width:5px!important;height:5px!important;margin:0 2px 0 0;background:#000;border-radius:20px}a.umb-options i:last-child{margin:0}a.umb-options:hover{background:#e9e9eb;border-radius:3px}li.root>div>a.umb-options{top:18px;display:-ms-flexbox;display:flex;padding:10px 5px}.hide-options a.umb-options{display:none!important}.hide-header h5{display:none!important}.umb-icon-item{position:relative;display:block;padding:2px;padding-left:55px}.umb-icon-item:hover{background:#f3f3f5}.umb-icon-item i.icon{position:absolute;top:8px;left:19px}.umb-icon-item a:hover div{text-decoration:underline}.umb-icon-item a{height:15px;padding-top:3px;font-size:12px;color:#515054;text-decoration:none}.umb-icon-item small{display:block;font-size:10px;color:#a2a1a6}.umb-icon-item:hover a.umb-options{visibility:visible}.umb-icon-item .umb-spr{float:left}div.not-published>i.icon,div.not-published>a{opacity:.6}div.protected:before{position:absolute;bottom:0;padding-top:7px;padding-left:7px;font-family:'icomoon';font-size:20px;color:#fe3e39;content:"\e256"}div.has-unpublished-version:before{position:absolute;bottom:0;padding-top:7px;padding-left:7px;font-family:'icomoon';font-size:20px;color:#35c786;content:"\e25a"}div.not-allowed>i.icon,div.not-allowed>a{cursor:not-allowed}.umb-tree li.current>div:before{color:#81ded8}div.is-container:before{position:absolute;bottom:0;padding-top:8px;padding-left:13px;font-family:'icomoon';font-size:8px;color:#03bfb3;pointer-events:none;content:"\e04e"}div.locked:before{position:absolute;bottom:0;padding-top:7px;padding-left:7px;font-family:'icomoon';font-size:20px;color:#fe3e39;content:"\e0a7"}.umb-actions{padding:0;margin:12px 0 0 0;list-style:none;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none}.umb-actions li.sep{display:block;border-top:1px solid #e9e9eb}.umb-actions li.sep:first-child{border-top:0}.umb-actions a{display:block;display:-ms-flexbox;display:flex;padding:9px 25px 9px 20px;font-size:15px;color:#000;text-decoration:none;white-space:nowrap;cursor:pointer;-ms-flex-align:center;align-items:center}.umb-actions a:hover,.umb-actions a:focus,.umb-actions li.selected{color:#000!important;background:#f3f3f5!important}.umb-actions .menu-label{display:inline-block;padding-left:15px;vertical-align:middle}.umb-actions i{font-size:18px;color:#a2a1a6;color:#515054;vertical-align:middle}.umb-actions-child{display:block;margin:0;list-style:none}.umb-actions-child li{display:block}.umb-actions-child a{display:block;padding-left:10px;clear:both;text-decoration:none}.umb-actions-child li .menu-label{margin-left:10px;font-size:14px;color:#000}.umb-actions-child li .menu-label small{display:block;margin-top:2px;clear:right;font-size:12px;line-height:14px;color:#a2a1a6;white-space:normal}.umb-actions-child li a:hover .menuLabel small{text-decoration:none!important}.umb-actions-child i{min-width:30px;font-size:30px;line-height:24px;text-align:center}.umb-actions-child li.add{padding-top:20px;margin-top:20px;border-top:1px solid #d8d7d9}.umb-actions-child li.add i{opacity:.4}.umb-tree i.icon.blue{color:#2e8aea}.umb-tree i.icon.green{color:#35c786}.umb-tree i.icon.purple{color:#413659}.umb-tree i.icon.orange{color:#df7f48}.umb-tree i.icon.red{color:#fe3e39}.umb-tree li div.l{position:absolute;bottom:0;left:0;width:100%;height:1px;overflow:hidden}.umb-tree li div.l div{width:100%;height:1px;margin-top:0;margin-left:-100%;background-color:#00aea2;animation-duration:1s;animation-iteration-count:infinite;animation-name:bounce_loadingProgressG;animation-timing-function:linear;-o-animationtiming-function:linear}.umb-tree .umb-loader{height:10px;margin:10px 10px 10px 10px}body.touch .umb-tree ins{padding:7px;font-size:14px;visibility:visible}body.touch .umb-tree li>div{padding-top:8px;padding-bottom:8px;font-size:110%}body.touch .umb-tree li div.l div{padding:0}body.touch .umb-actions a{padding:7px 25px 7px 20px;font-size:110%}.umb-listview{width:auto!important}.umb-listview .dropdown-menu{border:1px solid #bbbabf;border-radius:0;box-shadow:0 5px 10px rgba(0,0,0,0)}.dropdown-menu>li>a:hover,.dropdown-menu>li>a:focus,.dropdown-submenu:hover>a,.dropdown-submenu:focus>a{color:#000;background:#f3f3f5}.umb-listview table{border:1px solid #d8d7d9}.umb-listview table caption{text-align:left;vertical-align:middle;background:#fff}.umb-sub-header{padding:0 0 20px 0}.umb-sub-header .header-content-right{float:right}.form-search .inner-addon{position:relative}.form-search .inner-addon [class^="icon-"],.form-search .inner-addon [class*=" icon-"]{position:absolute;top:0;padding:5px 8px;pointer-events:none}.form-search .inner-addon input[type="text"]{width:190px}.form-search .left-addon [class^="icon-"],.form-search .left-addon [class*=" icon-"]{right:inherit;left:0}.form-search .right-addon [class^="icon-"],.form-search .right-addon [class*=" icon-"]{right:0;left:inherit}.form-search .left-addon input[type="text"]{padding-right:6px;padding-left:30px!important}.form-search .right-addon input[type="text"]{padding-right:30px;padding-left:6px!important}.umb-listview table form{position:relative;margin:0}.umb-listview table input[type="text"]{width:60px;padding:4px 0 4px 20px;background:0;border:1px solid #d8d7d9;transition:all .5s}.umb-listview table input::-webkit-input-placeholder,.umb-listview table input:-moz-placeholder,.umb-listview table input::-moz-placeholder,.umb-listview table input:-ms-input-placeholder{color:#515054}.umb-listview table input[type="text"]:focus{width:200px;color:#000;background:#fff;border:1px solid #d8d7d9}.umb-listview table thead a{cursor:default}.umb-listview table thead a:hover{text-decoration:none}.umb-listview table thead a.sortable{cursor:pointer}.umb-listview table thead a.sortable span:hover{text-decoration:underline}.umb-listview .icon-star{color:#d8d7d9}.umb-listview .selected i.icon,.umb-listview tbody tr:hover i.icon{display:none}.umb-listview .selected input[type="checkbox"],.umb-listview tr:hover input[type="checkbox"]{display:inline-block!important}.umb-listview .inactive{color:#d8d7d9}.umb-listview .selected td{font-weight:bold}.umb-listview table thead{font-size:12px;font-weight:bold;text-transform:uppercase;background-color:#fff}.umb-listview table tfoot{background:#f3f3f5}.umb-listview table tfoot td:last-child{border-left:none}.umb-listview table tfoot th{padding:0 20px}.umb-listview .label{font-size:12px;font-weight:normal;color:#000;text-shadow:none;background:#f3f3f5;border:1px solid #d8d7d9}.umb-listview .table-striped tbody>tr:nth-child(even)>td,.umb-listview .table-striped tbody>tr:nth-child(even)>th{background-color:#f3f3f5}.table-striped tbody>tr:nth-child(odd)>td,.table-striped tbody>tr:nth-child(odd)>th{background:0}.umb-listview .table-striped tbody td{position:relative}.umb-listview .table-striped thead input[type="checkbox"]{margin-left:7px}.umb-listview .table-striped tbody input[type="checkbox"]{z-index:5;display:none;margin-left:7px}.umb-listview .table-striped tbody i{top:10px;left:6px;z-index:6;display:block;width:20px;height:20px;padding:0 0 0 4px;background:#fff}.umb-listview .table-striped tbody>tr:nth-child(even)>td i,.umb-listview .table-striped tbody>tr:nth-child(even)>th i{background-color:#f3f3f5}.umb-listview .table-striped tbody i:not(.handle):hover{display:none!important}.list-view-layout{display:-ms-flexbox;display:flex;padding:10px 15px;margin-bottom:1px;background:#f3f3f5;-ms-flex-align:center;align-items:center}.list-view-layout__sort-handle{margin-right:15px;font-size:14px;color:#d8d7d9}.list-view-layout__name{display:-ms-flexbox;display:flex;margin-right:15px;font-weight:bold;line-height:1.2em;-ms-flex:5;flex:5;-ms-flex-line-pack:center;align-content:center;-ms-flex-wrap:wrap;flex-wrap:wrap}.list-view-layout__name-text{margin-right:3px}.list-view-layout__system{font-size:10px;font-weight:normal}.list-view-layout__path{margin-right:15px;-ms-flex:10;flex:10}.list-view-layout__icon{display:block;padding:6px 8px;margin-right:10px;font-size:18px;vertical-align:middle;background:#fff;border:1px solid #d8d7d9}.list-view-layout__icon:hover,.list-view-layout__icon:focus,.list-view-layout__icon:active{text-decoration:none}.list-view-layout__remove{position:relative;cursor:pointer}.list-view-add-layout{display:-ms-flexbox;display:flex;padding:5px 0;margin-top:10px;color:#00aea2;border:1px dashed #d8d7d9;box-sizing:border-box;-ms-flex-align:center;align-items:center;-ms-flex-pack:center;justify-content:center}.list-view-add-layout:hover{text-decoration:none}.mceContentBody{overflow-y:hidden!important}.usky-grid IFRAME{overflow:hidden}.usky-grid .ui-sortable-helper{position:absolute!important;width:160px!important;height:80px!important;padding:5px;overflow:hidden;background:#bbbabf;border:dashed 1px #000!important;border-radius:5px;opacity:.4;box-shadow:3px 3px 12px 0 rgba(50,50,50,0.45)}.usky-grid .ui-sortable-helper *{padding:0!important;margin:0!important;color:#817f85!important;background:none!important;border:none!important}.usky-grid .ui-sortable-helper .cell-tools{display:none!important}.usky-grid .ui-sortable-placeholder{padding:20px;font-family:icomoon;font-size:85px;line-height:65px;color:#515054;text-align:center;vertical-align:middle;background-color:#f3f3f5;border:2px dashed #d8d7d9}.usky-grid .ui-sortable-placeholder:hover{border-color:#515054}.usky-grid .ui-sortable-placeholder:before{content:"\e1bd"}.usky-grid-width{width:100%;margin:20px auto}.usky-grid .right{float:right}.usky-grid .tb{width:100%}.usky-grid .td{display:inline-block;width:100%;vertical-align:top;border-right:1px dashed rgba(182,182,182,0);box-sizing:border-box}.usky-grid .tb:hover .td{border-right:1px dashed #e9e9eb}.usky-grid .td.last{border-right:1px dashed rgba(182,182,182,0)!important}.usky-grid .middle{text-align:center}.usky-grid .mainTb{border-collapse:separate}.usky-grid .mainTd{position:relative}.usky-grid .usky-row{position:relative;border:1px dashed rgba(0,0,0,0)}.umb-grid .tb:hover .usky-row{border-bottom:1px dashed rgba(182,182,182,0)!important}.usky-grid .usky-cell{position:relative;min-height:127px;border:1px dashed rgba(0,0,0,0)}.usky-grid .cell-tools{position:absolute;top:0;right:0;bottom:0;z-index:50;width:50px;opacity:.3;transition:all .2s ease-in-out}.umb-grid .cell-tools{width:50px!important}.usky-grid .cell-tools.with-prompt{width:200px}.usky-grid .cell-tools:hover{opacity:1}.usky-grid .cell-tools-add{position:absolute;right:0;bottom:0;left:0;margin:0 45px 1px 0;text-align:center}.usky-grid .cell-tools-add.emptyArea{margin:0 0 1px 0}.usky-grid .usky-control:hover .cell-tools-add{opacity:1}.usky-grid .cell-tools-remove{position:absolute;top:0;right:5px;z-index:500;display:inline-block;text-align:right}.usky-grid .cell-tools-remove .iconBox:hover,.usky-grid .cell-tools-remove .iconBox:hover *{background:#fe3e39!important;border-color:#fe3e39!important}.usky-grid .cell-tools-move{position:absolute;top:33px;right:5px;z-index:500;display:inline-block;cursor:move}.usky-grid .cell-tools-edit{position:absolute;top:66px;right:5px}.usky-grid .usky-control{position:relative;display:block;margin:10px 0 0 0;background-clip:padding-box}.usky-grid .warnhighlight,.usky-grid .td.last.warnhighlight{border:1px dashed #fe3e39!important}.usky-grid .infohighlight,.usky-grid .td.last.infohighlight{border:1px dashed #03bfb3!important}.usky-grid .warnhighlight>ins.item-label{color:#fe3e39;border-color:#fe3e39}.usky-grid .infohighlight>ins.item-label{color:#03bfb3;border-color:#03bfb3}.usky-grid ins.item-label{position:absolute;top:-22px;left:-1px;display:none;height:20px;padding:0 7px;overflow:hidden;font-size:.8em;color:#d8d7d9;text-decoration:none;background-color:#fff;border:1px dashed #d8d7d9;border-bottom:1px solid #fff!important}.usky-grid .usky-row-inner>ins.item-label{top:-20px;left:0}.usky-grid .usky-control-inner.selectedControl,.usky-grid .usky-row-inner.selectedRow{border:1px dashed #d8d7d9}.usky-grid .usky-control-inner.selectedControl>ins.item-label,.usky-grid .usky-row-inner.selectedRow>ins.item-label{z-index:100000;display:block}.usky-grid .usky-control-placeholder{position:relative;min-height:20px;text-align:center;text-align:-moz-center;cursor:text}.usky-grid .usky-control-placeholder .placeholder{height:20px;padding:5px;font-size:14px;text-align:left;border:1px solid #d8d7d9;opacity:.7}.usky-grid .usky-control-placeholder:hover .placeholder{border:1px solid #bbbabf}.usky-grid .usky-editor-placeholder{position:relative;min-height:65px;padding:20px;padding-bottom:30px;text-align:center;text-align:-moz-center;background-color:#fff;border:4px dashed #f3f3f5}.usky-grid .usky-editor-placeholder i{display:block;margin-bottom:10px;font-size:85px;line-height:85px;color:#f3f3f5}.usky-grid textarea.textstring{display:block;overflow:hidden;color:#515054;background:#fff;border:0;outline:0;resize:none}.usky-grid .usky-cell-rte textarea{display:none!important}.usky-grid .usky-cell-media .caption{display:block;width:98%;overflow:hidden;font-style:italic;background:#fff;border:0;outline:0;resize:none}.usky-grid .cellPanelRte{min-height:60px}.usky-grid .usky-cell-embed iframe{width:100%}.usky-grid .iconBox{display:inline-block;padding:4px 6px 4px 6px;margin:2px;cursor:pointer;background:#fff;border:1px solid #bbbabf;border-radius:200px}.usky-grid .iconBox span.prompt{display:block;text-align:center;white-space:nowrap}.usky-grid .iconBox span.prompt>a{text-decoration:underline}.usky-grid .iconBox:hover,.usky-grid .iconBox:hover *{color:#fff!important;text-decoration:none;background:#03bfb3!important;border-color:#03bfb3!important}.usky-grid .iconBox a:hover{color:#fff!important;text-decoration:none}.usky-grid .iconBox.selected{background:transparent;background-image:linear-gradient(to bottom,#e6e6e6,#bfbfbf);background-repeat:repeat-x;border-color:#bfbfbf #bfbfbf #999;border-color:rgba(0,0,0,0.1) rgba(0,0,0,0.1) rgba(0,0,0,0.25);border-radius:3px;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffe6e6e6',endColorstr='#ffbfbfbf',GradientType=0);zoom:1;box-shadow:inset 0 2px 4px rgba(0,0,0,0.15),0 1px 2px rgba(0,0,0,0.05);-webkit-appearance:none}.usky-grid .iconBox i{display:block;font-size:16px!important;color:#5f5f5f}.usky-grid ul{display:inline-block;padding:0;margin:10px 0 0 0;text-align:center;list-style:none}.usky-grid .help-text{display:inline-block;padding:10px 20px 10px 20px;clear:both;font-size:14px;color:#515054;background:#f3f3f5;border-radius:15px}.usky-grid ul li{display:inline-block;width:120px;margin:8px 8px 0 8px}.usky-grid .mce-panel{clear:both;border:none!important}.usky-grid .mce-btn button{padding:8px 6px;line-height:inherit}.usky-grid .mce-toolbar{position:absolute;z-index:100;z-index:9999999;display:inline-block;float:left;padding:-1px;margin:-1px -1px 0 -1px;background-color:#f3f3f5;border:1px solid #d8d7d9;box-shadow:2px 2px 10px 0 rgba(50,50,50,0.14)}.mce-flow-layout-item{margin:0}.usky-grid .mce-panel{background:transparent!important}.usky-grid .mce-floatpanel{background-color:#f3f3f5!important}.usky-cell-rte{border:1px solid #f3f3f5}.usky-grid .fullSizeImage{width:100%}.usky-grid .boxWidth{margin-bottom:10px;text-align:right}.usky-grid .boxWidth input{width:40px;text-align:center}.usky-grid .boxWidth label{padding:0;margin:5px 5px 0 0;font-size:10px;color:#817f85}.usky-grid .usky-cell{padding-top:5px;padding-bottom:15px}.usky-grid .usky-control{padding:5px;margin:10px 0 0 0;border:1px dashed transparent}.usky-grid .usky-templates-columns{margin-top:30px}.usky-grid .usky-row-inner{margin-right:45px;border:1px dashed transparent}.usky-grid .usky-control-inner{position:relative;min-height:60px;padding:5px;margin-right:45px;margin-bottom:15px;border:1px dashed transparent}.usky-grid .uSky-templates{width:100%;overflow:hidden;text-align:center}.usky-grid .uSky-templates-template{display:inline-block;width:100px;padding-right:30px;margin:20px}.usky-grid .uSky-templates-template a.tb:hover{border:5px solid #03bfb3}.usky-grid .uSky-templates-template .tb{position:relative;width:100%;height:150px;padding:10px;cursor:pointer;background-color:#f3f3f5;border:5px solid #d8d7d9}.usky-grid .uSky-templates-template .tr{position:relative;height:100%}.usky-grid .uSky-templates-template .tb .uSky-templates-column{height:100%;border:1px dashed #d8d7d9;border-right:0}.usky-grid .uSky-templates-template .tb .uSky-templates-column.last{border-right:1px dashed #d8d7d9!important}.usky-grid a.uSky-templates-column:hover,.usky-grid a.uSky-templates-column.selected{background-color:#03bfb3}.usky-grid .templates-preview{display:inline-block;width:100%;text-align:center}.usky-grid .templates-preview small{position:absolute;bottom:-25px;left:0;width:100%;padding-top:15px}.usky-grid .templates-preview .help-text{margin:35px 35px 0 0}.usky-grid .preview-rows{position:relative;display:inline-block;width:125px;margin:35px 40px 15px 0;border:2px solid #d8d7d9;box-sizing:border-box;transition:border 200ms linear}.usky-grid .preview-rows.prevalues-rows{float:left;width:80px;margin:0 20px 20px 0}.usky-grid .preview-rows.prevalues-templates{float:left;margin:0 20px 20px 0}.usky-grid .preview-rows:hover{cursor:pointer;border-color:#03bfb3}.usky-grid .preview-rows .preview-row{display:inline-block;width:100%;vertical-align:bottom}.usky-grid .preview-rows.layout{padding:2px}.usky-grid .preview-rows.layout .preview-row{height:100%}.usky-grid .preview-rows.layout .preview-col{height:180px;border:dashed 1px #d8d7d9}.usky-grid .preview-rows.layout .preview-cell{background-color:#f3f3f5}.usky-grid .preview-rows.layout .preview-overlay{display:none}.usky-grid .preview-rows.columns{min-height:18px;padding:1px;line-height:11px}.usky-grid .preview-rows.columns.prevalues-rows{min-height:30px}.usky-grid .preview-rows .preview-col{display:block;float:left;width:33.3%;height:10px;margin:0;border:1px solid #fff;box-sizing:border-box}.usky-grid .preview-rows .preview-col .preview-cell{display:block;width:100%;height:100%;margin:0 1px 1px 0;background-color:#d8d7d9}.usky-grid .preview-rows.prevalues-templates .preview-col{height:80px}.usky-grid .preview-overlay{position:absolute;top:0;left:0;display:block;width:100%;height:100%;border:3px solid #fff;box-sizing:border-box}.usky-grid .cell-tools-menu{position:absolute;top:0;left:50%;z-index:6660;width:360px;height:380px;padding:7px;margin-top:-270px;margin-left:-150px;overflow:auto;background:#fff;border:1px solid #d8d7d9;box-shadow:3px 3px 12px 0 rgba(50,50,50,0.45)}.usky-grid .cell-tools-menu h5{padding:10px;margin-top:0;color:#a2a1a6;border-bottom:1px solid #d8d7d9}.usky-grid .elements{display:block;padding:0;margin:0}.usky-grid .elements li{display:inline-block;width:90px;height:80px;padding:5px;margin:5px;overflow:hidden;font-size:12px}.usky-grid .elements li:hover,.usky-grid .elements li:hover *{color:#fff;background:#03bfb3}.usky-grid .elements a{color:#303033;text-decoration:none}.usky-grid .elements i{display:block;font-size:30px;line-height:50px;color:#817f85}.usky-grid-configuration .uSky-templates{text-align:left}.usky-grid-configuration ul{display:block}.usky-grid-configuration ul li{display:block;width:auto;text-align:left}.usky-grid-configuration .uSky-templates .uSky-templates-template .tb{max-height:50px;padding:0;overflow:hidden;border-spacing:2px;border-width:2px!important}.usky-grid-configuration .uSky-templates .uSky-templates-template span{display:inline-block;background:#d8d7d9}.usky-grid-configuration .uSky-templates .uSky-templates-template .tb:hover{border-width:2px!important}.usky-grid-configuration .uSky-templates-column{display:block;float:left;margin-left:-1px;background:#d8d7d9;border:1px #fff solid!important}.usky-grid-configuration .uSky-templates-column.last{margin-right:-1px}.usky-grid-configuration .uSky-templates-column.add{font-size:20px;line-height:70px;color:#d8d7d9;text-align:center;text-decoration:none;background:#fff}.usky-grid-configuration .mainTdpt{height:initial;border:0}.usky-grid-configuration .uSky-templates-rows .uSky-templates-row{width:60px;margin:0 50px 20px 0}.usky-grid-configuration .uSky-templates-rows .uSky-templates-row .tb{padding:0;border-spacing:2px;border-width:2px!important}.usky-grid-configuration .uSky-templates-rows .mainTdpt{height:10px!important}.usky-grid-configuration a.uSky-templates-column{height:70px!important}body.dragging,body.dragging *{cursor:move!important}li.dragged{position:absolute;z-index:2000;opacity:.5}.umb-sort li{display:block;padding:5px;margin:5px;background:#f3f3f5;border:1px solid #bbbabf}.umb-sort .placeholder{position:relative;padding:0;margin:0;border:0}.umb-sort .placeholder:before{position:absolute;top:-4px;left:-5px;width:0;height:0;margin-top:-5px;border:5px solid transparent;border-right:0;border-left-color:#fe3e39;content:""}.umb-dashboards-forms-install{position:relative;top:-30px;padding-top:30px;background:url('../img/forms/installer-background.png');background-repeat:repeat-x;border-radius:0 0 200px 200px;box-shadow:inset 0 -40px 30px 25px #fff}.umb-dashboards-forms-install small{font-size:14px;opacity:.5}.umb-dashboards-forms-install .umb-loader{width:640px;height:4px}.umb-dashboards-forms-install .video_player video{width:100%;max-width:640px;border:1px solid #e9e9eb;border-bottom:0;border-left:none;box-sizing:border-box}.umb-dashboards-forms-install .video_player input[type="range"]{position:relative;z-index:999;width:100%;max-width:640px;margin:0 auto;cursor:pointer;opacity:0}.umb-dashboards-forms-install .video_player input[type="range"]::-ms-fill-lower,.umb-dashboards-forms-install .video_player input[type="range"]::-ms-fill-upper{background:transparent}.umb-dashboards-forms-install .video_player input[type="range"]::-ms-tooltip{display:none}.umb-dashboards-forms-install .video_player .video-controls{position:relative;height:20px;max-width:640px;margin:-13px auto 40px;opacity:.8}.umb-dashboards-forms-install .video_player .loader{display:block;width:100%;height:3px;margin-top:-13px;background-color:#f3f3f5}.umb-dashboards-forms-install .video_player .progress-bar{display:block;width:200px;height:100%;max-width:100%;background:#817f85;box-sizing:border-box}.umb-dashboards-forms-install .video_player .video-controls,.umb-dashboards-forms-install .video_player .loader,.umb-dashboards-forms-install .video_player .progress-bar{transition:all 150ms ease-in-out}.umb-dashboards-forms-install .video_player .progress-bar{transition-property:background}.umb-dashboards-forms-install .video_player .video_player video:hover+.video-controls,.umb-dashboards-forms-install .video_player .video-controls:hover{margin-top:-19px;margin-bottom:46px;opacity:1}.umb-dashboards-forms-install .video_player .video_player video:hover+.video-controls .loader,.umb-dashboards-forms-install .video_player .video-controls:hover .loader{height:8px}.umb-dashboards-forms-install .video_player .video_player video:hover+.video-controls .progress-bar,.umb-dashboards-forms-install .video_player .video-controls:hover .progress-bar{background:#00aea2}.umb-dashboards-forms-install .forms-install-button .btn{padding:14px 40px}.umb-dashboards-forms-install .installer-top{position:relative;height:80px;margin:0 auto 30px;overflow:hidden;line-height:80px;text-align:center}.umb-dashboards-forms-install .installer-top i,.umb-dashboards-forms-install .installer-top h3{display:inline-block}.umb-dashboards-forms-install .installer-top i{position:absolute;top:50%;margin-top:-40px}.umb-dashboards-forms-install .installer-top h3{margin:0;margin-left:100px;font-size:36px;font-weight:700;line-height:80px;letter-spacing:-1px}.umb-validation-label{position:relative;padding:1px 5px;font-size:11px;line-height:1.5em;color:#fff;background:#fe3e39}.umb-validation-label:after{position:absolute;bottom:100%;left:10px;width:0;height:0;margin-left:-4px;pointer-events:none;border:solid transparent;border-color:rgba(255,255,255,0);border-bottom-color:#fe3e39;border-width:4px;content:" "}.umb-validation-label.-arrow-left{margin-left:10px}.umb-validation-label.-arrow-left:after{position:absolute;top:50%;right:100%;bottom:auto;left:auto;width:0;height:0;margin-top:-4px;pointer-events:none;border:solid transparent;border-color:rgba(255,255,255,0);border-right-color:#fe3e39;border-width:4px;content:" "}.umb-editor-wrapper{position:absolute;top:0;right:0;bottom:0;left:0;display:-ms-flexbox;display:flex;background:#fff;-ms-flex-direction:column;flex-direction:column}.umb-editor-wrapper>form{display:-ms-flexbox;display:flex;height:100%;-ms-flex-direction:column;flex-direction:column}.umb-editor-header{position:relative;background:#f3f3f5;border-bottom:1px solid #b3afbd;-ms-flex:0 0 99px;flex:0 0 99px}.umb-editor-header__actions-menu{margin-left:auto}.umb-editor-container{position:relative;top:0;right:0;bottom:0;left:0;overflow:auto;-ms-flex:1 1 100%;flex:1 1 100%}.umb-editor-wrapper.-no-footer .umb-editor-container{bottom:0}.umb-editor-container.-stop-scrolling{overflow:hidden}.umb-editor-drawer{padding:10px 20px;margin:0;background:#f3f3f5;border-top:1px solid #b3afbd;-ms-flex:1 0 31px;flex:1 0 31px}.umb-editor-actions{padding:0;margin:0;list-style:none}.umb-editor-actions li{display:inline-block}.umb-overlay{position:fixed;z-index:996660;overflow:hidden;background:#fff;box-shadow:0 10px 20px rgba(0,0,0,0.19),0 6px 6px rgba(0,0,0,0.23);animation:fadeIn .2s}.umb-overlay__form{display:-ms-flexbox;display:flex;height:100%;-ms-flex-wrap:nowrap;flex-wrap:nowrap;-ms-flex-direction:column;flex-direction:column}.umb-overlay .umb-overlay-header{padding:10px;margin-top:0;background:#f3f3f5;border-bottom:1px solid #b3afbd;-ms-flex-positive:0;flex-grow:0;-ms-flex-negative:0;flex-shrink:0}.umb-overlay .umb-overlay__title{margin:7px 0;font-size:18.75px;font-weight:bold;color:#000}.umb-overlay .umb-overlay__subtitle{font-size:12.75px;color:#515054}.umb-overlay .umb-overlay-container{position:relative;height:auto;overflow-x:hidden;overflow-y:auto;-ms-flex-positive:1;flex-grow:1;-ms-flex-negative:1;flex-shrink:1;-ms-flex-preferred-size:auto;flex-basis:auto}.umb-overlay .umb-overlay-drawer{padding:10px 20px;margin:0;background:#f3f3f5;border-top:1px solid #b3afbd;-ms-flex-positive:0;flex-grow:0;-ms-flex-negative:0;flex-shrink:0;-ms-flex-preferred-size:31px;flex-basis:31px}.umb-overlay .umb-overlay-drawer.-auto-height{-ms-flex-preferred-size:auto;flex-basis:auto}.umb-overlay .umb-overlay-drawer .umb-overlay-drawer__align-right{display:-ms-flexbox;display:flex;-ms-flex-pack:end;justify-content:flex-end}.umb-overlay .umb-overlay-drawer .umb-overlay-drawer-content .dropdown-menu{right:0;left:auto}.umb-overlay.umb-overlay-center{position:absolute;top:10px;left:50%;width:600px;height:500px;transform:translate(-50%,0)}.umb-overlay.umb-overlay-center .umb-overlay-header{text-align:center}.umb-overlay.umb-overlay-center .umb-overlay-container{padding:20px}.umb-overlay.umb-overlay-target{width:400px;height:400px;box-sizing:border-box}.umb-overlay.umb-overlay-target .umb-overlay-header{text-align:center}.umb-overlay.umb-overlay-target .umb-overlay-container{padding:10px}.umb-overlay.umb-overlay-right{top:0;right:0;bottom:0;width:500px;border:0;box-shadow:0 0 20px rgba(0,0,0,0.19),0 0 6px rgba(0,0,0,0.23)}.umb-overlay.umb-overlay-right .umb-overlay-header{padding:20px;box-sizing:border-box;-ms-flex-preferred-size:100px;flex-basis:100px}.umb-overlay.umb-overlay-right .umb-overlay-container{padding:20px}.umb-overlay.umb-overlay-left{top:0;bottom:0;left:0;width:500px;margin-left:81px;border:0;box-shadow:0 0 20px rgba(0,0,0,0.19),0 0 6px rgba(0,0,0,0.23)}.umb-overlay.umb-overlay-left .umb-overlay-header{padding:20px;box-sizing:border-box;-ms-flex-preferred-size:100px;flex-basis:100px}.umb-overlay.umb-overlay-left .umb-overlay-container{padding:20px}@media(max-width:767px){.umb-overlay.umb-overlay-left{margin-left:61px}}@media(max-width:500px){.umb-overlay.umb-overlay-left{width:calc(100% - 41px);margin-left:41px}}.umb-overlay__item-details{position:absolute;bottom:51px;left:0;width:100%;padding:20px;background:#f3f3f5;border-bottom:1px solid #b3afbd;box-sizing:border-box}.umb-overlay__item-details-title-wrapper{display:-ms-flexbox;display:flex;-ms-flex-direction:row;flex-direction:row;-ms-flex-align:center;align-items:center}.umb-overlay__item-details-icon{margin-right:10px;font-size:16px;color:#a2a1a6;vertical-align:middle}.umb-overlay__item-details-title{margin-top:0;margin-bottom:0}.umb-overlay__item-details-description{margin-top:10px;font-size:12px}.umb-overlay .control-label,.umb-overlay .form-horizontal .control-label,.form-horizontal .umb-overlay .control-label{display:block;float:none;width:100%;margin-bottom:10px;box-sizing:border-box}.umb-overlay .controls-row,.umb-overlay .form-horizontal .controls,.form-horizontal .umb-overlay .controls{margin-left:0!important}.umb-card{position:relative;padding:5px 10px 5px 10px;background:white}.umb-card .title{padding:12px;margin:0 -10px 10px -10px;font-size:16px;font-weight:400;color:#515054;text-transform:none;border-bottom:1px solid #d8d7d9}.umb-card-thumb{text-align:center}.umb-card-thumb i{display:block;padding-top:5px;font-size:20px;line-height:40px;color:#2e8aea;text-align:center}.umb-card-content .item-title{margin-bottom:3px;font-size:16px;font-weight:400;color:#1d1d1d;text-transform:none;border:0}.umb-card-content p{margin-bottom:1px;color:#515054}.umb-card-actions{padding-top:10px;clear:both;border-top:#f3f3f5 1px solid}.umb-card-icons{display:block;padding:0;margin:0;text-align:center;vertical-align:middle;list-style:none}.umb-card-icons.vertical{position:absolute;top:7px;right:7px;width:1px;text-align:right}.umb-card-icons li{display:inline-block;margin:0 2px 0 2px}.umb-card-icons.vertical li{display:block;float:right;margin-bottom:3px}.umb-card-list{display:block;padding:0;margin:0}.umb-card-list li{display:block;padding-bottom:3px;border-bottom:#f3f3f5 1px solid}.umb-card-grid{display:-ms-flexbox;display:flex;padding:0;margin:0 auto;list-style:none;-ms-flex-flow:row wrap;flex-flow:row wrap;-ms-flex-pack:start;justify-content:flex-start}.umb-card-grid li{width:100px;height:105px;padding:5px;overflow:hidden;font-size:12px;text-align:center;box-sizing:border-box}.umb-card-grid li.-four-in-row{-ms-flex:0 0 25%;flex:0 0 25%}.umb-card-grid li.-three-in-row{-ms-flex:0 0 33.33%;flex:0 0 33.33%}.umb-card-grid .umb-card-grid-item{display:block;width:100%;height:100%;border-radius:3px}.umb-card-grid .umb-card-grid-item:hover,.umb-card-grid .umb-card-grid-item:focus,.umb-card-grid .umb-card-grid-item:hover>*,.umb-card-grid .umb-card-grid-item:focus>*{cursor:pointer;background:#f3f3f5;border-radius:3px;outline:0}.umb-card-grid a{color:#303033;text-decoration:none}.umb-card-grid i{display:block;font-size:30px;line-height:50px;color:#515054}.umb-btn-round{display:inline-block;padding:4px 6px 4px 6px;margin:2px;cursor:pointer;background:#f3f3f5;border:1px solid #a2a1a6;border-radius:200px}.umb-btn-round:hover,.umb-btn-round:hover *{color:#fff!important;text-decoration:none;background:#03bfb3!important;border-color:#03bfb3!important}.umb-btn-round a:hover{color:#fff!important;text-decoration:none}.umb-btn-round i{display:block;font-size:16px!important;color:#d8d7d9}.umb-btn-round.alert:hover,.umb-btn-round.alert:hover *{color:#fff!important;text-decoration:none;background:#fe3e39!important;border-color:#fe3e39!important}.umb-btn-round.no-border{background:none!important;border:none!important}.umb-sub-views .umb-sub-views-action-bar{margin-bottom:40px}.umb-sub-views .umb-sub-views-action-bar .btn-link{padding-right:0;padding-left:0}.umb-sub-views .umb-sub-views-action-bar .btn-link:focus{text-decoration:none;outline:0}.umb-sub-views .umb-sub-views-nav{float:right;margin:0}.umb-sub-views .umb-sub-views-nav .umb-sub-views-nav-item{display:inline-block;margin-left:15px}.umb-sub-views .umb-sub-views-nav .umb-sub-views-nav-item.is-active .btn-link{color:#00aea2!important}.umb-sub-views .umb-sub-views-tools{float:left;margin:0}.umb-sub-views .umb-sub-views-tools .umb-sub-views-tool{display:inline-block;margin-right:15px}.umb-sub-views-nav{display:-ms-flexbox;display:flex;margin:0;list-style:none}.umb-sub-views-nav-item{display:block;margin-left:20px;text-align:center;cursor:pointer}.umb-sub-views-nav-item:focus{outline:0}.umb-sub-views-nav-item:hover,.umb-sub-views-nav-item:focus{text-decoration:none}.umb-sub-views-nav-item.is-active{color:#00aea2}.show-validation .umb-sub-views-nav-item.-has-error{color:#fe3e39}.umb-sub-views-nav-item .icon{display:block;font-size:24px;text-align:center}.umb-sub-views-nav-item-text{font-size:12px}.sub-view-columns{display:-ms-flexbox;display:flex;margin-bottom:40px}.sub-view-columns h5{margin-top:0}.sub-view-column-left{margin-right:70px;-ms-flex:0 0 250px;flex:0 0 250px}.sub-view-column-right{-ms-flex:1;flex:1}.sub-view-column-section{margin-bottom:20px}.umb-editor-sub-header{position:relative;top:0;display:-ms-flexbox;display:flex;padding:15px 0;margin-top:-30px;margin-bottom:30px;background:#fff;-ms-flex-pack:justify;justify-content:space-between}.umb-editor-sub-header.-umb-sticky-bar{top:100px;margin-top:0;margin-bottom:0;box-shadow:0 5px 0 rgba(0,0,0,0.08),0 1px 0 rgba(0,0,0,0.16);transition:box-shadow 1s}.umb-group-builder__property-preview .umb-editor-sub-header{display:none}.umb-editor-sub-header__content-left{margin-right:auto}.umb-editor-sub-header__content-right{margin-left:auto}.umb-editor-sub-header__content-left,.umb-editor-sub-header__content-right{display:-ms-flexbox;display:flex;-ms-flex-align:stretch;align-items:stretch}.umb-editor-sub-header__section{display:-ms-flexbox;display:flex;padding-right:20px;padding-left:20px;border-left:1px solid #d8d7d9;-ms-flex-align:center;align-items:center}.umb-editor-sub-header__content-left .umb-editor-sub-header__section:first-child{padding-left:0;border-left:none}.umb-editor-sub-header__content-right .umb-editor-sub-header__section{border-right:1px solid #d8d7d9;border-left:none}.umb-editor-sub-header__content-right .umb-editor-sub-header__section:last-child{padding-right:0;border-right:0}.umb-grid-selector__items{display:-ms-flexbox;display:flex;-ms-flex-direction:row;flex-direction:row;-ms-flex-wrap:wrap;flex-wrap:wrap}.umb-grid-selector__item{position:relative;display:-ms-flexbox;display:flex;width:125px;height:150px;padding:20px;margin:0 20px 20px 0;text-align:center;background:#f3f3f5;border:1px solid #d8d7d9;border-radius:3px;animation:fadeIn .5s;-ms-flex-align:center;align-items:center;-ms-flex-pack:center;justify-content:center}.umb-grid-selector__item.-default{border-width:2px}.umb-grid-selector__item.-placeholder{cursor:pointer;background:0;border:1px dashed #d8d7d9}.umb-grid-selector__item-content{margin-top:10px}.umb-grid-selector__item-icon{display:block;margin-bottom:15px;font-size:50px;line-height:50px;color:#d8d7d9}.umb-grid-selector__item-label{font-size:13px;font-weight:bold}.umb-grid-selector__item-label.-blue{color:#00aea2}.umb-grid-selector__item-remove{position:absolute;top:5px;right:5px;cursor:pointer}.umb-grid-selector__item-default-label{font-size:13px;color:#515054}.umb-grid-selector__item-default-label.-blue{color:#00aea2}.umb-grid-selector__item-add{color:#00aea2}.umb-child-selector__child{display:-ms-flexbox;display:flex;min-width:300px;padding:5px 15px;margin-bottom:5px;background:#f3f3f5;animation:fadeIn .5s}.umb-child-selector__child.-parent{padding-top:10px;padding-bottom:10px;background:#e9e9eb}.umb-child-selector__child.-placeholder{text-align:center;cursor:pointer;background:0;border:1px dashed #d8d7d9;-ms-flex-pack:center;justify-content:center}.umb-child-selector__children-container{margin-left:30px}.umb-child-selector__child-description{-ms-flex:1;flex:1}.umb-child-selector__child-icon-holder{display:inline-block;width:20px;margin-right:5px;text-align:center}.umb-child-selector__child-icon{font-size:16px;vertical-align:middle}.umb-child-selector__child-name{font-size:14px}.umb-child-selector__child-name.-blue{color:#00aea2}.umb-child-selector__child-actions{text-align:right;-ms-flex:0 0 50px;flex:0 0 50px}.umb-child-selector__child-remove{cursor:pointer}.umb-group-builder__groups{padding:0;margin:0;list-style:none}.umb-group-builder__group{position:relative;min-height:86px;padding:10px 10px 5px 10px;margin:50px 0 0 0;border:2px solid #bbbabf;border-radius:0 10px 10px 10px;box-sizing:border-box}.umb-group-builder__group.-active{border-color:#03bfb3}.umb-group-builder__group.-inherited{border-color:#e9e9eb;animation:fadeIn .5s}.umb-group-builder__group.-placeholder{display:-ms-flexbox;display:flex;min-height:86px;font-weight:bold;color:#00aea2;cursor:pointer;border:1px dashed #d8d7d9;-ms-flex-pack:center;justify-content:center;-ms-flex-align:center;align-items:center}.umb-group-builder__group.-sortable{min-height:initial;cursor:move}.umb-group-builder__group-actions{position:absolute;top:5px;right:5px;z-index:10;opacity:0;visibility:hidden}.umb-group-builder__group-action{display:inline-block}.umb-group-builder__group-remove{position:absolute;top:-30px;right:20px;font-size:18px}.umb-group-builder__group-remove:hover{color:#03bfb3;cursor:pointer}.umb-group-builder__group-title-wrapper{position:absolute;top:-45px;left:-2px;display:-ms-flexbox;display:flex;-ms-flex-align:center;align-items:center}.umb-group-builder__group-title-wrapper.-placeholder{top:-44px;left:-1px}.umb-group-builder__group-title{display:-ms-flexbox;display:flex;height:38px;padding:5px 9px 0 9px;font-weight:bold;background:#fff;border:2px solid #bbbabf;border-bottom:0;border-radius:10px 10px 0 0;-ms-flex-align:center;align-items:center}.umb-group-builder__group-title-icon{margin-left:5px}.umb-group-builder__group-title.-active{border-color:#03bfb3}.umb-group-builder__group-title.-placeholder{width:70px;border:1px dashed #d8d7d9;border-bottom:0}.umb-group-builder__group-title.-inherited{border-color:#e9e9eb}input.umb-group-builder__group-title-input{margin-bottom:0;font-weight:bold;color:#515054;background:transparent;border-color:transparent}.umb-group-builder__group-title-input:hover{border-color:#bbbabf}.umb-group-builder__group-title-input.-placeholder{border:1px dashed #a2a1a6}.umb-group-builder__group-inherited-label{position:relative;top:2px;display:inline-block;margin-left:10px;font-size:13px;color:#d8d7d9}.umb-group-builder__group-sort-order{display:-ms-flexbox;display:flex;margin-left:10px;-ms-flex-align:center;align-items:center}.umb-group-builder__properties{min-height:35px;padding:0;margin:0;list-style:none}.umb-group-builder__property{position:relative;display:-ms-flexbox;display:flex;padding:5px;margin-bottom:5px;border:1px solid transparent;border-radius:5px;box-sizing:border-box;-ms-flex-flow:row;flex-flow:row}.umb-group-builder__property:hover{border:1px dashed #bbbabf}.umb-group-builder__property.-placeholder{cursor:pointer;background:#fff;border:1px dashed #d8d7d9;border-radius:5px;animation:fadeIn .5s;-ms-flex-align:center;align-items:center}.umb-group-builder__property.-inherited{border:transparent;animation:fadeIn .5s}.umb-group-builder__property.-inherited:hover{border:transparent}.umb-group-builder__property.-locked{border:transparent;animation:fadeIn .5s}.umb-group-builder__property.-locked:hover{border:transparent}.umb-group-builder__property.-sortable,.umb-group-builder__property.-sortable-locked{min-height:35px;border:0;border-radius:5px;animation:none;-ms-flex-align:center;align-items:center}.umb-group-builder__property.-sortable{color:#1e1c1c;cursor:move;background:#e9e9eb}.umb-group-builder__property.-sortable-locked{padding-left:30px;background:#f3f3f5}.umb-group-builder__property-meta{margin-right:20px;-ms-flex:0 0 175px;flex:0 0 175px}.umb-group-builder__property-meta.-full-width{-ms-flex:1;flex:1}.umb-group-builder__property-meta-alias{margin-bottom:5px;font-size:10px;line-height:1.5;color:#515054;word-break:break-word}.umb-group-builder__property-meta-label textarea{width:100%;min-height:25px;padding:0;margin-bottom:0;overflow:hidden;font-size:14px;font-weight:bold;color:#1e1c1c;background:transparent;border-color:transparent;box-sizing:border-box;resize:none}.umb-group-builder__property-meta-label textarea.ng-invalid{border:0}.umb-group-builder__property-meta-description textarea{width:100%;min-height:25px;padding:0;margin-bottom:0;overflow:hidden;font-size:12px;line-height:1.5;color:#515054;background:transparent;border-color:transparent;box-sizing:border-box;resize:none}.umb-group-builder__property-preview{position:relative;height:30px;padding:35px 10px 25px 10px;overflow:hidden;background:url("../img/checkered-background-20.png");-ms-flex:1;flex:1}.umb-group-builder__property-preview:hover{cursor:pointer}.umb-group-builder__property-preview:focus{outline:0}.umb-group-builder__property-preview.-not-clickable:hover{cursor:auto}.umb-group-builder__property-preview .help-inline{display:none!important}.umb-group-builder__property-preview-label{position:absolute;top:0;left:0;z-index:15;padding:3px;font-size:12px;line-height:12px;text-transform:uppercase;background:#f3f3f5;opacity:.8}.umb-group-builder__property-actions{margin:15px 0 0 15px;text-align:center;-ms-flex:0 0 40px;flex:0 0 40px}.umb-group-builder__property-action{position:relative;display:block;margin:0 0 10px 0;font-size:18px;cursor:pointer}.umb-group-builder__property-action:hover{color:#03bfb3}.umb-group-builder__property-tags{position:absolute;top:0;left:0;z-index:20;display:-ms-flexbox;display:flex;-ms-flex-direction:row;flex-direction:row}.umb-group-builder__property-tags.-right{right:0;left:auto}.umb-group-builder__property-tag{display:-ms-flexbox;display:flex;padding:0 4px;margin-left:10px;font-size:12px;background-color:#d8d7d9}.umb-group-builder__property-tag:first-child{margin-left:0}.umb-group-builder__property-tag.-white{background-color:#fff}.umb-group-builder__property-tag-icon{margin-right:3px}.umb-group-builder__placeholder-box{display:-ms-flexbox;display:flex;font-size:13px;font-weight:bold;color:#00aea2;background:#e9e9eb;box-sizing:border-box;-ms-flex-align:center;align-items:center;-ms-flex-pack:center;justify-content:center}.umb-group-builder__placeholder-box.-input{height:10px;margin-bottom:5px}.umb-group-builder__placeholder-box.-input-small{width:25%;height:5px;margin-bottom:5px}.umb-group-builder__placeholder-box.-text-full-width{height:3px;margin-bottom:3px}.umb-group-builder__placeholder-box.-text-short{width:75%;height:3px;margin-bottom:3px}.umb-group-builder__group-sortable-placeholder{margin:0 0 70px 0;background:transparent;border:1px dashed #d8d7d9;border-radius:10px;border-radius:5px}.umb-group-builder__property_sortable-placeholder{margin-bottom:5px;background:transparent;border:1px dashed #d8d7d9;border-radius:5px}.umb-group-builder__no-data-text{padding-top:50px;font-size:16px;line-height:1.8em;color:#bbbabf;text-align:center}.umb-overlay .show-validation .ng-invalid-val-required-component .editor-placeholder{color:#fe3e39;border-color:#fe3e39}.content-type-editor-dialog.edit-property-settings .validation-wrapper{position:relative}.content-type-editor-dialog.edit-property-settings .validation-label{position:absolute;top:50%;right:0;font-size:12px;color:#fe3e39;transform:translate(0,-50%)}.content-type-editor-dialog.edit-property-settings textarea.editor-label{width:100%;padding-left:0;margin-bottom:0;font-size:16px;font-weight:bold;line-height:1.5em;border:0;border-color:transparent;box-shadow:none;box-sizing:border-box;resize:none}.content-type-editor-dialog.edit-property-settings textarea.editor-label:focus{outline:0;box-shadow:none!important}.content-type-editor-dialog.edit-property-settings .editor-placeholder{display:block;width:100%;height:80px;font-size:14px;font-weight:bold;line-height:80px;color:#515054;color:#00aea2;text-align:center;border:1px dashed #d8d7d9;border-radius:5px}.content-type-editor-dialog.edit-property-settings .editor-placeholder:hover{text-decoration:none}.content-type-editor-dialog.edit-property-settings .editor{margin-bottom:10px}.content-type-editor-dialog.edit-property-settings .editor .editor-icon-wrapper{float:left;width:60px;height:60px;margin-right:20px;line-height:60px;text-align:center;border:1px solid #d8d7d9;border-radius:5px}.content-type-editor-dialog.edit-property-settings .editor .editor-icon-wrapper .icon{font-size:26px}.content-type-editor-dialog.edit-property-settings .editor .editor-details{float:left;margin-top:10px}.content-type-editor-dialog.edit-property-settings .editor .editor-details .editor-name{display:block;font-weight:bold}.content-type-editor-dialog.edit-property-settings .editor .editor-details .editor-editor{display:block;font-size:12px}.content-type-editor-dialog.edit-property-settings .editor .editor-settings-icon{margin-top:8px;font-size:18px}.content-type-editor-dialog.edit-property-settings .checkbox{margin-bottom:20px}.content-type-editor-dialog.edit-property-settings .editor-description,.content-type-editor-dialog.edit-property-settings .editor-validation-pattern{min-width:100%;min-height:25px;overflow:hidden;border:0;box-sizing:border-box;resize:none}.content-type-editor-dialog.edit-property-settings .umb-dropdown{width:100%}.umb-list-view-settings__box{position:relative;display:-ms-flexbox;display:flex;padding:15px;background:#f3f3f5;border:1px solid #bbbabf;animation:fadeIn .5s}.umb-list-view-settings__trigger{margin-bottom:20px}.umb-list-view-settings__box.-open{border-bottom:transparent}.umb-list-view-settings__content{display:-ms-flexbox;display:flex}.umb-list-view-settings__list-view-icon{margin-right:10px;font-size:20px;color:#bbbabf}.umb-list-view-settings__name{float:left;margin-right:5px;font-size:14px;font-weight:bold}.umb-list-view-settings__create-new{font-size:13px;color:#00aea2}.umb-list-view-settings__create-new:hover{color:#00aea2}.umb-list-view-settings__remove-new{font-size:13px;color:#fe3e39}.umb-list-view-settings__settings{padding:20px;border:1px dashed #bbbabf;border-top:0}.umb-table{position:relative;display:-ms-flexbox;display:flex;min-width:auto;border:1px solid #d8d7d9;-ms-flex-direction:column;flex-direction:column;-ms-flex-wrap:nowrap;flex-wrap:nowrap;-ms-flex-pack:justify;justify-content:space-between}.umb-table.umb-table-inactive:before{position:absolute;top:0;right:0;bottom:0;left:0;z-index:10;background:rgba(255,255,255,0.75);content:"";outline:1px solid rgba(255,255,255,0.75)}.umb-table a{text-decoration:none;cursor:pointer}.umb-table a:focus{text-decoration:none;outline:0}input.umb-table__input{margin:0 auto}.umb-table-head{font-size:14px;font-weight:bold;background-color:#f3f3f5}.umb-table-head__link{position:relative;color:#515054;text-decoration:none;cursor:default}.umb-table-head__link:hover{color:#515054;text-decoration:none}.umb-table-head__link .sortable:hover{color:#000;text-decoration:none;cursor:pointer}.umb-table-thead__icon{position:absolute;padding-top:1px;padding-left:3px;font-size:13px;cursor:default}.umb-table-thead .sortable:hover{text-decoration:none;cursor:pointer}.umb-table-body{position:relative}.umb-table-body .umb-table-row{position:relative;min-height:32px;font-size:14px;color:#817f85;cursor:pointer;border-top:1px solid #d8d7d9}.umb-table-body .umb-table-row:hover{background-color:#f3f3f5}.umb-table-body .umb-table-row.-solid{cursor:default}.umb-table-body .umb-table-row.-solid:hover{background-color:#fff}.umb-table-body__link{text-decoration:none}.umb-table-body__link:hover{text-decoration:underline}.umb-table-body__icon,.umb-table-body__icon[class^="icon-"],.umb-table-body__icon[class*=" icon-"]{margin:0 auto;font-size:22px;line-height:22px;color:#00aea2}.umb-table-body__checkicon,.umb-table-body__checkicon[class^="icon-"],.umb-table-body__checkicon[class*=" icon-"]{display:none;font-size:18px;line-height:22px;color:#35c786}.umb-table-body .umb-table__name{font-size:14px;font-weight:bold;color:#000}.umb-table-body__empty{height:100%;padding:20px 0;font-size:16px;color:#515054;text-align:center}.-selected .umb-table-body__fileicon{display:none}.-selected .umb-table-body__checkicon{display:inline-block}.-content .-unpublished .umb-table__name>*{opacity:.4}.-content .-unpublished .umb-table-body__icon{opacity:.4}.-selected.-unpublished .umb-table-body__icon{opacity:1}.umb-table-row{display:-ms-flexbox;display:flex;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none;-ms-flex-flow:row nowrap;flex-flow:row nowrap;-ms-flex-align:center;align-items:center}.umb-table-body .umb-table-row--empty{display:-ms-flexbox;display:flex;padding:5px 0;cursor:auto;-webkit-user-select:auto;-moz-user-select:auto;-ms-user-select:auto;user-select:auto;-ms-flex:1 1 auto;flex:1 1 auto;-ms-flex-pack:center;justify-content:center}.umb-table-body .umb-table-row--empty:hover{cursor:auto;background-color:transparent}.umb-table-cell{position:relative;display:-ms-flexbox;display:flex;padding:6px 2px;margin:auto 14px;overflow:hidden;text-align:left;-ms-flex-flow:row nowrap;flex-flow:row nowrap;-ms-flex:1 1 1%;flex:1 1 1%}.umb-table-cell>*{overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.umb-table-cell:first-of-type:not(.not-fixed){padding:15px 0;margin:0 0 0 15px;-ms-flex:0 0 25px;flex:0 0 25px}.umb-table-cell--auto-width{-ms-flex:0 0 auto!important;flex:0 0 auto!important}.umb-table-cell--faded{opacity:.4}.umb-table__name{max-width:25%;-ms-flex:1 1 25%;flex:1 1 25%}.umb-table__loading-overlay{position:absolute;z-index:1;width:100%;height:100%;background-color:rgba(255,255,255,0.7)}.umb-table__row-expand{font-size:12px;color:#000;text-decoration:none}.umb-table__row-expand--hidden{visibility:hidden}.umb-table--condensed .umb-table-cell:first-of-type:not(.not-fixed){padding-top:10px;padding-bottom:10px}.umb-table--condensed .umb-table-body__icon{font-size:20px}.umb_confirm-action__overlay{position:absolute;z-index:999999;display:-ms-flexbox;display:flex}.umb_confirm-action__overlay.-top{top:-50px;right:auto;bottom:auto;left:0;animation:fadeInUp .2s;-ms-flex-direction:column;flex-direction:column}.umb_confirm-action__overlay.-top .umb_confirm-action__overlay-action{margin-bottom:5px}.umb_confirm-action__overlay.-top .umb_confirm-action__overlay-action.-confirm{-ms-flex-order:1;order:1}.umb_confirm-action__overlay.-top .umb_confirm-action__overlay-action.-cancel{-ms-flex-order:2;order:2}.umb_confirm-action__overlay.-right{top:0;right:-50px;bottom:auto;left:auto;animation:fadeInLeft .2s;-ms-flex-direction:row;flex-direction:row}.umb_confirm-action__overlay.-right .umb_confirm-action__overlay-action{margin-left:5px}.umb_confirm-action__overlay.-right .umb_confirm-action__overlay-action.-confirm{-ms-flex-order:2;order:2}.umb_confirm-action__overlay.-right .umb_confirm-action__overlay-action.-cancel{-ms-flex-order:1;order:1}.umb_confirm-action__overlay.-bottom{top:auto;right:auto;bottom:-50px;left:0;animation:fadeInDown .2s;-ms-flex-direction:column;flex-direction:column}.umb_confirm-action__overlay.-bottom .umb_confirm-action__overlay-action{margin-top:5px}.umb_confirm-action__overlay.-bottom .umb_confirm-action__overlay-action.-confirm{-ms-flex-order:2;order:2}.umb_confirm-action__overlay.-bottom .umb_confirm-action__overlay-action.-cancel{-ms-flex-order:1;order:1}.umb_confirm-action__overlay.-left{top:0;right:auto;bottom:auto;left:-50px;animation:fadeInRight .2s;-ms-flex-direction:row;flex-direction:row}.umb_confirm-action__overlay.-left .umb_confirm-action__overlay-action{margin-right:5px}.umb_confirm-action__overlay.-left .umb_confirm-action__overlay-action.-confirm{-ms-flex-order:1;order:1}.umb_confirm-action__overlay.-left .umb_confirm-action__overlay-action.-cancel{-ms-flex-order:2;order:2}.umb_confirm-action__overlay-action{display:-ms-flexbox;display:flex;width:20px;height:20px;font-size:18px;color:#fff;border-radius:40px;box-shadow:0 2px 5px 0 rgba(0,0,0,0.26);-ms-flex-align:center;align-items:center;-ms-flex-pack:center;justify-content:center}.umb_confirm-action__overlay-action:hover{color:#fff;text-decoration:none}.umb_confirm-action__overlay-action.-confirm{color:#35c786!important;background:#fff}.umb_confirm-action__overlay-action.-confirm:hover{color:#35c786!important}.umb_confirm-action__overlay-action.-cancel{color:#fe3e39!important;background:#fff}.umb_confirm-action__overlay-action.-cancel:hover{color:#fe3e39!important}.umb-keyboard-shortcuts-overview__overlay{position:fixed;top:0;left:0;z-index:1000;width:100%;height:100%;padding-left:440px;background:#fff;box-sizing:border-box;animation:fadeIn .2s}.umb-keyboard-shortcuts-overview__overlay-close{position:absolute;top:20px;right:20px;display:-ms-flexbox;display:flex;width:35px;height:35px;font-size:25px;line-height:1em;background-color:transparent;border-radius:20px;-ms-flex-pack:center;justify-content:center;-ms-flex-align:center;align-items:center}.umb-keyboard-shortcuts-overview__overlay-close:hover{color:#fff;text-decoration:none;background-color:#03bfb3}.umb-keyboard-shortcuts-overview__overlay-content{display:-ms-flexbox;display:flex;width:100%;height:100%;-ms-flex-direction:column;flex-direction:column;-ms-flex-pack:center;justify-content:center;-ms-flex-align:center;align-items:center}.umb-keyboard-shortcuts-overview__keyboard-shortcuts-group{width:50%;margin-bottom:10px}.umb-keyboard-shortcuts-overview__keyboard-shortcuts-group-name{margin-bottom:0}.umb-keyboard-shortcuts-overview__keyboard-shortcut{display:-ms-flexbox;display:flex;padding:7px 0;border-bottom:1px solid #d8d7d9;-ms-flex-pack:justify;justify-content:space-between;-ms-flex-align:center;align-items:center}.umb-keyboard-shortcuts-overview__keyboard-shortcut.-no-air{padding:0}.umb-keyboard-shortcuts-overview__keyboard-shortcut.-no-stroke{border-bottom:0}.umb-keyboard-shortcuts-overview__description{margin-right:10px;font-size:13px;font-weight:bold}.umb-keyboard-keys{display:-ms-flexbox;display:flex;font-size:12px;list-style:none;-ms-flex-align:center;align-items:center}.umb-keyboard-key-wrapper{display:-ms-flexbox;display:flex;margin-right:5px;-ms-flex-align:center;align-items:center}.umb-keyboard-key{padding:1px 7px;margin-right:5px;color:#515054;background:#fff;border:1px solid #d8d7d9;border-radius:5px}.umb-checkbox-list{margin-left:0;list-style:none}.umb-checkbox-list__item{display:-ms-flexbox;display:flex;margin-bottom:2px;-ms-flex-align:center;align-items:center}.umb-checkbox-list__item:last-child{border-bottom:0}.umb-checkbox-list__item:hover{background-color:#f3f3f5}.umb-checkbox-list__item.-selected,.umb-checkbox-list__item.-disabled{font-weight:bold;background-color:#f3f3f5}.umb-checkbox-list__item-checkbox{display:-ms-flexbox;display:flex;margin-right:5px;-ms-flex-pack:center;justify-content:center;-ms-flex-align:center;align-items:center;-ms-flex:0 0 30px;flex:0 0 30px}.umb-checkbox-list__item-icon{margin-right:5px;font-size:16px}.umb-checkbox-list__item-text{display:-ms-flexbox;display:flex;padding:5px 0;margin-bottom:0;font-size:14px;-ms-flex:1 1 auto;flex:1 1 auto;-ms-flex-align:center;align-items:center}.umb-checkbox-list__item-text.-faded{opacity:.5}.umb-checkbox-list__item.-disabled .umb-checkbox-list__item-text{cursor:not-allowed}.umb-checkbox-list__item-caption{margin-left:2px;font-size:12px}.umb-checkbox-list__no-data{padding-top:50px;font-size:16px;line-height:1.8em;color:#bbbabf;text-align:center}.umb-locked-field{position:relative;display:block;font-size:13px;color:#bbbabf}.umb-locked-field__wrapper{display:-ms-flexbox;display:flex;margin-bottom:5px;-ms-flex-align:center;align-items:center}.umb-locked-field__toggle{margin-right:3px}.umb-locked-field__toggle:hover,.umb-locked-field__toggle:focus{text-decoration:none}.umb-locked-field__lock-icon{color:#bbbabf;transition:color .25s}.umb-locked-field__lock-icon.-unlocked{color:#515054}input.umb-locked-field__input{height:auto;padding:0;margin-bottom:0;font-size:13px;color:#a2a1a6;background:rgba(255,255,255,0);border-color:transparent!important;transition:color .25s}input.umb-locked-field__input:focus{box-shadow:none!important}input.umb-locked-field__input.-unlocked{color:#515054}.umb-nav-tabs{position:absolute;z-index:10}.umb-nav-tabs.-padding-left{padding-left:20px}.umb-tab-content{position:relative;top:22px;padding-top:20px;border-top:1px solid #b3afbd}.umb-load-indicator{position:absolute;top:50%;left:50%;padding:0;margin:0;margin-top:-6px;margin-left:-6px;font-size:0;list-style:none;transform:translate(-50%,-50%)}.umb-load-indicator__bubble{position:absolute;top:50%;left:0;width:0;width:6px;height:0;height:6px;margin:0;border:2px solid #00aea2;border-radius:100%;transform:transformZ(0);animation:umbLoadIndicatorAnimation 1.4s infinite}.umb-load-indicator__bubble:nth-child(1n){left:-16px;animation-delay:0s}.umb-load-indicator__bubble:nth-child(2n){left:0;animation-delay:.15s}.umb-load-indicator__bubble:nth-child(3n){left:16px;animation-delay:.30s}@keyframes umbLoadIndicatorAnimation{0%{background:#00aea2;transform:scale(0.5)}50%{background:white;transform:scale(1)}100%{background:#00aea2;transform:scale(0.5)}}.umb-breadcrumbs{display:-ms-flexbox;display:flex;margin-bottom:0;margin-left:0;list-style:none;-ms-flex-wrap:wrap;flex-wrap:wrap}.umb-breadcrumbs__ancestor{display:-ms-flexbox;display:flex}.umb-breadcrumbs__ancestor-link,.umb-breadcrumbs__ancestor-text{max-width:150px;overflow:hidden;font-size:12px;color:#515054;text-overflow:ellipsis;white-space:nowrap}.umb-breadcrumbs__ancestor-link{text-decoration:underline}.umb-breadcrumbs__ancestor-link:hover{color:#000}.umb-breadcrumbs__seperator{position:relative;top:1px;margin-right:5px;margin-left:5px;color:#bbbabf}.umb-media-grid{display:-ms-flexbox;display:flex;width:100%;margin-bottom:30px;-ms-flex-direction:row;flex-direction:row;-ms-flex-wrap:wrap;flex-wrap:wrap;-ms-flex-align:center;align-items:center}.umb-media-grid__item{position:relative;display:-ms-flexbox;display:flex;margin:10px;overflow:hidden;cursor:pointer;box-shadow:0 1px 1px 0 rgba(0,0,0,0.2);transition:box-shadow 100ms;-ms-flex-direction:column;flex-direction:column;-ms-flex-wrap:wrap;flex-wrap:wrap;-ms-flex-pack:center;justify-content:center;-ms-flex-line-pack:center;align-content:center;-ms-flex-align:center;align-items:center;-ms-flex-item-align:stretch;align-self:stretch}.umb-media-grid__item.-file{background-color:#f3f3f5}.umb-media-grid__item.-selected{box-shadow:0 2px 8px 0 rgba(0,0,0,0.35)}.umb-media-grid__item:hover{text-decoration:none}.umb-media-grid__item-image{position:relative;height:auto;max-width:100%!important}.umb-media-grid__item-image-placeholder{position:relative;width:100%;height:auto;max-width:100%}.umb-media-grid__image-background{position:absolute;top:0;right:0;bottom:0;left:0;background:url("../img/checkered-background.png");background-repeat:repeat;content:"";opacity:.5}.umb-media-grid__item-overlay{position:absolute;right:0;bottom:0;left:0;z-index:100;display:-ms-flexbox;display:flex;padding:5px 10px;overflow:hidden;font-size:12px;color:#fff;white-space:nowrap;background:#413659;opacity:0;box-sizing:border-box;transition:opacity 150ms}.umb-media-grid__item.-file .umb-media-grid__item-overlay{color:#68676b;background:#f3f3f5;opacity:1}.umb-media-grid__item.-file:hover .umb-media-grid__item-overlay,.umb-media-grid__item.-file.-selected .umb-media-grid__item-overlay{color:#fff;background:#413659}.umb-media-grid__info{margin-right:5px}.umb-media-grid__item-overlay.-locked{opacity:1}.umb-media-grid__item:hover .umb-media-grid__item-overlay{opacity:1}.umb-media-grid__item-name{overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.umb-media-grid__item-icon{position:absolute;top:45%;left:50%;font-size:40px!important;color:#68676b;transform:translate(-50%,-50%)}.umb-media-grid__checkmark{position:absolute;top:10px;right:10px;z-index:2;display:-ms-flexbox;display:flex;width:26px;height:26px;margin-left:7px;color:#fff;background:#35c786;border:2px solid #fff;border-radius:50px;box-sizing:border-box;transition:background 100ms;-ms-flex-pack:center;justify-content:center;-ms-flex-align:center;align-items:center}.umb-folder-grid{display:-ms-flexbox;display:flex;width:100%;margin-bottom:30px;-ms-flex-direction:row;flex-direction:row;-ms-flex-wrap:wrap;flex-wrap:wrap}.umb-folder-grid__folder{position:relative;display:-ms-flexbox;display:flex;padding:10px 20px;margin:5px;cursor:pointer;background:#f3f3f5;border:1px solid transparent;box-sizing:border-box;transition:border .2s;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none;-ms-flex-align:center;align-items:center;-ms-flex:1 1 200px;flex:1 1 200px;-ms-flex-pack:justify;justify-content:space-between}.umb-folder-grid__folder:focus,.umb-folder-grid__folder:active{text-decoration:none}.umb-folder-grid__folder:hover{text-decoration:none;background-color:#e9e9eb}.umb-folder-grid__folder-description{display:-ms-flexbox;display:flex;-ms-flex-align:center;align-items:center}.umb-folder-grid__folder-icon,.umb-folder-grid__folder-icon[class^="icon-"],.umb-folder-grid__folder-icon[class*=" icon-"]{margin-right:15px;font-size:20px;color:#000}.umb-folder-grid__folder-name{font-size:13px;font-weight:bold;color:#000}.umb-folder-grid__folder-name:hover{text-decoration:underline}.umb-folder-grid__action{display:-ms-flexbox;display:flex;width:26px;height:26px;margin-left:7px;color:#fff;cursor:pointer;background:#515054;border:2px solid #fff;border-radius:50px;opacity:0;box-sizing:border-box;-ms-flex-pack:center;justify-content:center;-ms-flex-align:center;align-items:center}.umb-folder-grid__action.-selected{background:#35c786;opacity:1}.umb-content-grid{display:-ms-flexbox;display:flex;-ms-flex-direction:row;flex-direction:row;-ms-flex-wrap:wrap;flex-wrap:wrap;-ms-flex-pack:center;justify-content:center}.umb-content-grid__item{position:relative;margin:10px;cursor:pointer;background:#f3f3f5;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none;-ms-flex:0 1 200px;flex:0 1 200px}.umb-content-grid__item.-selected{box-shadow:0 2px 8px 0 rgba(0,0,0,0.35)}.umb-content-grid__icon-container{display:-ms-flexbox;display:flex;height:75px;background:#e9e9eb;-ms-flex-align:center;align-items:center;-ms-flex-pack:center;justify-content:center}.umb-content-grid__icon,.umb-content-grid__icon[class^="icon-"],.umb-content-grid__icon[class*=" icon-"]{font-size:40px;color:#a2a1a6}.umb-content-grid__icon.-light{color:#d8d7d9}.umb-content-grid__content{padding:15px;box-sizing:border-box}.umb-content-grid__item-name{display:inline-block;padding-bottom:10px;margin-bottom:10px;font-weight:bold;line-height:1.4em;color:#000;border-bottom:1px solid #d8d7d9}.umb-content-grid__item-name:hover{text-decoration:underline}.umb-content-grid__item-name.-light{color:#d8d7d9}.umb-content-grid__details-list{margin-bottom:0;margin-left:0;font-size:12px;list-style:none}.umb-content-grid__details-list.-light{color:#d8d7d9}.umb-content-grid__details-label{display:inline-block;font-weight:bold}.umb-content-grid__details-value{display:inline-block}.umb-content-grid__checkmark{position:absolute;top:10px;right:10px;display:-ms-flexbox;display:flex;width:26px;height:26px;color:#fff;cursor:pointer;background:#35c786;border:2px solid #fff;border-radius:50px;box-sizing:border-box;-ms-flex-pack:center;justify-content:center;-ms-flex-align:center;align-items:center}.umb-content-grid__item:hover .umb-content-grid__action:not(.-selected){opacity:1;animation:fadeIn;animation-duration:.2s;animation-timing-function:ease-in-out}.umb-content-grid__no-items{padding-top:50px;padding-bottom:50px;font-size:16px;font-weight:bold;color:#d8d7d9}.umb-layout-selector{position:relative;display:inline-block}.umb-layout-selector__active-layout{display:-ms-flexbox;display:flex;width:30px;height:30px;font-size:20px;cursor:pointer;border:1px solid transparent;box-sizing:border-box;-ms-flex-pack:center;justify-content:center;-ms-flex-align:center;align-items:center}.umb-layout-selector__active-layout:hover{border-color:#d8d7d9}.umb-layout-selector__dropdown{position:absolute;left:50%;z-index:999;display:-ms-flexbox;display:flex;padding:5px;background:#333;background:#fff;transform:translate(-50%,0);-ms-flex-wrap:wrap;flex-wrap:wrap;-ms-flex-direction:column;flex-direction:column}.umb-layout-selector__dropdown-item{display:-ms-flexbox;display:flex;padding:5px;margin:3px 5px;cursor:pointer;border:1px solid transparent;-ms-flex-line-pack:center;align-content:center;-ms-flex-pack:center;justify-content:center;-ms-flex-direction:column;flex-direction:column}.umb-layout-selector__dropdown-item:hover{border:1px solid #d8d7d9}.umb-layout-selector__dropdown-item.-active{border:1px solid #2e8aea}.umb-layout-selector__dropdown-item-icon,.umb-layout-selector__dropdown-item-icon[class^="icon-"],.umb-layout-selector__dropdown-item-icon[class*=" icon-"]{font-size:20px;color:#555;text-align:center}.umb-tooltip{position:fixed;z-index:1000;display:-ms-flexbox;display:flex;max-width:200px;padding:10px;margin-top:15px;font-size:12px;background:#fff;animation:fadeIn;animation-duration:.1s;animation-timing-function:ease-in}.umb-tooltip-list{padding:10px;margin-bottom:0;margin-left:0;list-style:none}.umb-tooltip-list__item{margin-bottom:5px}.umb-tooltip-list__item:last-child{margin-bottom:0}.umb-tooltip-list__item-label{margin-bottom:-3px;font-weight:bold}.umb-overlay-backdrop{position:fixed;top:0;left:0;z-index:2000;width:100%;height:100%;background-color:rgba(255,255,255,0.5);animation:fadeIn .2s}.umb-grid IFRAME{overflow:hidden}.umb-grid .ui-sortable-helper{position:absolute!important;width:42px!important;height:42px!important;padding:5px;overflow:hidden;font-family:"icomoon";text-align:center;background-color:#03bfb3!important;border-radius:2px;box-shadow:3px 3px 12px 0 rgba(50,50,50,0.45)}.umb-grid .ui-sortable-helper:after{font-size:22px;line-height:42px;color:#fff;content:"\e126"}.umb-grid .ui-sortable-helper *{display:none}.umb-grid .ui-sortable-helper .umb-row-title-bar,.umb-grid .ui-sortable-helper .cell-tools-add{display:none!important}.umb-grid .ui-sortable-placeholder{position:absolute;right:0;left:0;height:2px;margin-bottom:20px;background-color:#03bfb3}.umb-grid .ui-sortable-placeholder:before,.umb-grid .ui-sortable-placeholder:after{position:absolute;top:-9px;font-family:"icomoon";font-size:18px;color:#03bfb3}.umb-grid .ui-sortable-placeholder:before{left:-5px;content:"\e0e9"}.umb-grid .ui-sortable-placeholder:after{right:-5px;content:"\e0d7"}.umb-grid .umb-cell .ui-sortable-placeholder{right:10px;left:10px}.umb-grid-width{width:100%;margin:20px auto}.umb-grid .right{float:right}.umb-grid .tb{width:100%}.umb-grid .td{display:inline-block;width:100%;vertical-align:top;box-sizing:border-box}.umb-grid .middle{text-align:center}.umb-grid .mainTd{position:relative}.umb-grid .umb-column{position:relative}.umb-grid .umb-row{position:relative;padding-top:10px;margin-bottom:40px}.umb-grid .row-tools a{text-decoration:none}.umb-grid .umb-cell{position:relative}.umb-grid .umb-cell-content{position:relative;display:block;margin:10px;border:1px solid transparent;box-sizing:border-box}.umb-grid .umb-row .umb-cell-placeholder{min-height:130px;background-color:#f3f3f5;border-color:#d8d7d9;border-style:dashed;border-width:2px;transition:border-color 100ms linear}.umb-grid .umb-row .umb-cell-placeholder:hover{cursor:pointer;border-color:#03bfb3}.umb-grid .umb-cell-content.-has-editors{padding-top:38px;background-color:#fff;border-color:#d8d7d9;border-style:solid;border-width:1px}.umb-grid .umb-cell-content.-has-editors:hover{cursor:auto}.umb-grid .umb-cell-content.-has-editors.-collapsed{padding-top:10px}.umb-grid .cell-tools{position:absolute;top:10px;right:10px;font-size:16px;color:#515054}.umb-grid .cell-tool{float:right;cursor:pointer}.umb-grid .cell-tool:hover{color:#00aea2}.umb-grid .cell-tools-add{color:#00aea2}.umb-grid .cell-tools-add:focus,.umb-grid .cell-tools-add:hover{text-decoration:none}.umb-grid .cell-tools-add.-center{position:absolute;top:50%;left:50%;color:#00aea2;transform:translate(-50%,-50%)}.umb-grid .cell-tools-add.-bar{display:block;padding:5px;margin:10px;text-align:center;background:#f3f3f5;border:1px dashed #bbbabf}.umb-grid .cell-tools-remove{position:relative;display:inline-block}.umb-grid .cell-tools-remove .iconBox:hover,.umb-grid .cell-tools-remove .iconBox:hover *{background:#fe3e39!important;border-color:#fe3e39!important}.umb-grid .cell-tools-move{display:inline-block}.umb-grid .cell-tools-edit{display:inline-block;color:#fff}.umb-grid .drop-overlay{position:absolute;top:0;left:0;z-index:10;display:-ms-flexbox;display:flex;width:100%;height:100%;font-size:14px;font-weight:bold;line-height:1.3em;text-align:center;background:#fff;opacity:.9;box-sizing:border-box;-ms-flex-pack:center;justify-content:center;-ms-flex-align:center;align-items:center;-ms-flex-direction:column;flex-direction:column}.drop-overlay.-disable{color:#fe3e39}.drop-overlay.-allow{color:#35c786}.umb-grid .drop-overlay .drop-icon{margin-bottom:20px;font-size:40px}.umb-grid .umb-control{position:relative;display:block;margin-right:10px;margin-bottom:10px;margin-left:10px;overflow:hidden}.umb-control-collapsed{padding:5px 10px;cursor:move;background-color:#f3f3f5;border-color:transparent;border-style:solid;border-width:1px}.umb-control-collapsed:hover{border-color:#03bfb3}.umb-grid .umb-control-click-overlay{position:absolute;top:0;left:0;z-index:5;width:100%;height:100%;cursor:pointer;opacity:0}.umb-grid .umb-control-click-overlay:hover{background-color:#03bfb3;opacity:.1;transition:opacity .1s}.umb-grid .umb-row-title-bar{display:-ms-flexbox;display:flex;padding-right:10px;padding-left:10px}.umb-grid .umb-row-title{display:inline-block;margin-right:6px;font-size:15px;font-weight:bold;color:#000;cursor:pointer}.umb-grid .row-tools{display:inline-block;margin-left:10px;font-size:18px;color:#515054}.umb-grid .row-tool{cursor:pointer}.umb-grid .umb-add-row{text-align:center}.umb-grid .umb-control-placeholder{position:relative;min-height:20px;text-align:center;text-align:-moz-center;cursor:text}.umb-grid .umb-control-placeholder .placeholder{height:20px;padding:5px;font-size:14px;text-align:left;border:1px solid #e9e9eb;opacity:.7}.umb-grid .umb-control-placeholder:hover .placeholder{border:1px solid #bbbabf}.umb-grid .umb-editor-placeholder{position:relative;min-height:65px;padding:20px;padding-bottom:30px;text-align:center;text-align:-moz-center;cursor:pointer;background-color:#fff;border:4px dashed #d8d7d9}.umb-grid .umb-editor-placeholder i{display:block;margin-bottom:10px;font-size:85px;line-height:85px;color:#d8d7d9}.umb-grid .umb-row.-active{background-color:#00aea2}.umb-grid .umb-row.-active .umb-row-title-bar{cursor:move}.umb-grid .umb-row.-active .row-tool,.umb-grid .umb-row.-active .umb-row-title{color:#fff}.umb-grid .umb-row.-active .umb-grid-has-config{color:rgba(255,255,255,0.66)}.umb-grid .umb-row.-active .umb-cell .umb-grid-has-config{color:rgba(0,0,0,0.44)}.umb-grid .umb-row.-active .umb-cell .umb-cell-content{border-color:transparent}.umb-grid .umb-row.-active-child{background-color:#f3f3f5}.umb-grid .umb-row.-active-child .umb-row-title-bar{cursor:default}.umb-grid .umb-row.-active-child .umb-row-title{color:#515054}.umb-grid .umb-row.-active-child .row-tool{color:rgba(0,0,0,0.23)}.umb-grid .umb-row.-active-child .umb-grid-has-config{color:rgba(0,0,0,0.44)}.umb-grid .umb-row.-active-child .umb-cell-content.-placeholder{border-color:#d8d7d9}.umb-grid .umb-row.-active-child .umb-cell-content.-placeholder:hover{border-color:rgba(85,85,85,0.44)}.umb-grid .umb-row .umb-cell.-active{border-color:#d8d7d9}.umb-grid .umb-row .umb-cell.-active .umb-cell-content.-has-editors{border-color:#03bfb3;box-shadow:3px 3px 6px rgba(0,0,0,0.07)}.umb-grid .umb-row .umb-cell.-active-child .cell-tool{color:rgba(0,0,0,0.23)}.umb-grid .umb-row .umb-cell.-active-child .umb-cell-content.-has-editors{border-color:rgba(113,136,160,0.44)}.umb-grid .umb-row-title-bar{display:-ms-flexbox;display:flex}.umb-grid .umb-grid-right{display:-ms-flexbox;display:flex;-ms-flex-direction:row;flex-direction:row;-ms-flex-pack:center;justify-content:center}.umb-grid .umb-tools{margin-left:auto}.umb-grid-add-more-content{text-align:center}.umb-grid .newbtn{display:inline-block;width:auto;padding:6px 15px;margin:10px auto 20px;font-size:12px;font-weight:bold;border-color:#e9e9eb;border-style:solid}.umb-grid .newbtn:hover{cursor:pointer;opacity:.77}.umb-grid textarea.textstring{display:block;overflow:hidden;color:#515054;background:#fff;border:0;outline:0;resize:none}.umb-grid .umb-cell-rte textarea{display:none!important}.umb-grid .umb-cell-media .caption{display:block;width:98%;overflow:hidden;font-style:italic;background:#fff;border:0;outline:0;resize:none}.umb-grid .cellPanelRte{min-height:60px}.umb-grid .umb-cell-embed iframe{width:100%}.umb-grid .umb-cell-rte{border-color:transparent}.umb-grid .iconBox{display:inline-block;padding:4px 6px;margin:2px;cursor:pointer;background:#f3f3f5;border:1px solid #bbbabf;border-radius:200px}.umb-grid .iconBox:hover,.umb-grid .iconBox:hover *{color:#fff!important;text-decoration:none;background:#03bfb3!important;border-color:#03bfb3!important}.umb-grid .iconBox span.prompt{display:block;text-align:center;white-space:nowrap}.umb-grid .iconBox span.prompt>a{text-decoration:underline}.umb-grid .iconBox a:hover{color:#fff!important;text-decoration:none}.umb-grid .iconBox.selected{background:transparent;background-image:linear-gradient(to bottom,#e6e6e6,#bfbfbf);background-repeat:repeat-x;border-color:#bfbfbf #bfbfbf #999;border-color:rgba(0,0,0,0.1) rgba(0,0,0,0.1) rgba(0,0,0,0.25);border-radius:3px;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffe6e6e6',endColorstr='#ffbfbfbf',GradientType=0);zoom:1;box-shadow:inset 0 2px 4px rgba(0,0,0,0.15),0 1px 2px rgba(0,0,0,0.05);-webkit-appearance:none}.umb-grid .iconBox i{display:block;font-size:16px!important;color:#515054}.umb-grid .help-text{display:inline-block;clear:both;font-size:14px;font-weight:bold;color:#000}.umb-grid .mce-panel{clear:both;background:transparent!important;border:none!important}.umb-grid .mce-btn button{padding:8px 6px;line-height:inherit}.umb-grid .mce-toolbar{display:none;background-color:#fafafa;border-bottom:1px solid #d8d7d9}.umb-grid .umb-control.-active .mce-toolbar{display:block}.umb-grid .mce-flow-layout-item{margin:0}.umb-grid .mceContentBody{overflow-y:hidden!important}.umb-grid .fullSizeImage{width:100%}.umb-grid .boxWidth{margin-bottom:10px;text-align:right}.umb-grid .boxWidth input{width:40px;text-align:center}.umb-grid .boxWidth label{padding:0;margin:5px 5px 0 0;font-size:10px;color:#817f85}.umb-grid .umb-control{border-color:transparent;border-style:solid;border-width:1px}.umb-grid .umb-control.-active{border-color:#03bfb3}.umb-grid .umb-templates-columns{margin-top:30px}.umb-grid .umb-control-inner{position:relative}.umb-grid .umb-control-bar{display:-ms-flexbox;display:flex;height:0;padding:2px 5px;font-size:12px;color:#fff;background:#03bfb3;opacity:0;transition:height 80ms linear,opacity 80ms linear;-ms-flex-align:center;align-items:center}.umb-grid .umb-control-title{display:-ms-flexbox;display:flex;font-weight:bold;-ms-flex-align:center;align-items:center}.umb-grid .umb-control.-active .umb-control-bar{height:25px;cursor:move;opacity:1}.umb-grid .umb-control-tools{display:inline-block;margin-left:10px}.umb-grid .umb-control-tool{position:relative;display:inline-block;margin-right:5px;font-size:16px;cursor:pointer}.umb-grid .umb-templates{width:100%;overflow:hidden;text-align:center}.umb-grid .umb-templates-template{display:inline-block;width:100px;padding-right:30px;margin:20px}.umb-grid .umb-templates-template a.tb:hover{border:5px solid #03bfb3}.umb-grid .umb-templates-template .tb{position:relative;width:100%;height:150px;padding:10px;cursor:pointer;background-color:#f3f3f5;border:5px solid #d8d7d9}.umb-grid .umb-templates-template .tr{position:relative;height:100%}.umb-grid .umb-templates-template .tb .umb-templates-column{height:100%;border:1px dashed #d8d7d9;border-right:0}.umb-grid .umb-templates-template .tb .umb-templates-column.last{border-right:1px dashed #d8d7d9!important}.umb-grid a.umb-templates-column:hover,.umb-grid a.umb-templates-column.selected{background-color:#03bfb3}.umb-grid .templates-preview{display:inline-block;width:100%;text-align:center}.umb-grid .templates-preview small{position:absolute;bottom:-25px;left:0;width:100%;padding-top:15px}.umb-grid .templates-preview .help-text{margin:35px 35px 0 0}.umb-grid .preview-rows{position:relative;display:inline-block;width:125px;margin:15px;border:3px solid #d8d7d9;box-sizing:border-box;transition:border 100ms linear}.umb-grid .preview-rows.prevalues-rows{float:left;width:80px;margin:0 20px 20px 0}.umb-grid .preview-rows.prevalues-templates{float:left;margin:0 20px 20px 0}.umb-grid .preview-rows:hover{cursor:pointer;border-color:#03bfb3}.umb-grid .preview-rows .preview-row{display:inline-block;width:100%;vertical-align:bottom}.umb-grid .preview-rows.layout{padding:2px}.umb-grid .preview-rows.layout .preview-row{height:100%}.umb-grid .preview-rows.layout .preview-col{height:180px}.umb-grid .preview-rows.layout .preview-cell{background-color:#f3f3f5}.umb-grid .preview-rows.layout .preview-overlay{display:none}.umb-grid .preview-rows.columns{min-height:16px;padding:1px;line-height:11px}.umb-grid .preview-rows.columns.prevalues-rows{min-height:30px}.umb-grid .preview-rows .preview-col{display:block;float:left;width:33.3%;height:10px;margin:0;border:1px solid #fff;box-sizing:border-box}.umb-grid .preview-rows .preview-col .preview-cell{display:block;width:100%;height:100%;margin:0 1px 1px 0;background-color:#d8d7d9}.umb-grid .preview-rows.prevalues-templates .preview-col{height:80px}.umb-grid .preview-overlay{position:absolute;top:0;left:0;display:block;width:100%;height:100%;border:3px solid #fff;box-sizing:border-box}.umb-grid .umb-grid-has-config{display:inline;font-size:13px;color:#817f85}.umb-grid .umb-cell .umb-grid-has-config{position:absolute;top:10px;left:10px}.umb-grid .cell-tools-menu{position:absolute;top:0;left:50%;z-index:6660;width:360px;height:380px;padding:7px;margin-top:-270px;margin-left:-150px;overflow:auto;background:#fff;border:1px solid #d8d7d9;box-shadow:3px 3px 12px 0 rgba(50,50,50,0.45)}.umb-grid .cell-tools-menu h5{padding:10px;margin-top:0;color:#817f85;border-bottom:1px solid #d8d7d9}.umb-grid .elements{display:block;padding:0;margin:0}.umb-grid .elements li{display:inline-block;width:90px;height:80px;padding:5px;margin:5px;overflow:hidden;font-size:12px}.umb-grid .elements li:hover,.umb-grid .elements li:hover *{color:#fff;background:#03bfb3}.umb-grid .elements a{color:#1e1c1c;text-decoration:none}.umb-grid .elements i{display:block;font-size:30px;line-height:50px;color:#a2a1a6}.umb-grid-configuration .umb-templates{text-align:left}.umb-grid-configuration ul{display:block}.umb-grid-configuration ul li{display:block;width:auto;text-align:left}.umb-grid-configuration .umb-templates .umb-templates-template .tb{max-height:50px;padding:0;overflow:hidden;border-spacing:2px;border-width:2px!important}.umb-grid-configuration .umb-templates .umb-templates-template span{display:inline-block;background:#d8d7d9}.umb-grid-configuration .umb-templates .umb-templates-template .tb:hover{border-width:2px!important}.umb-grid-configuration .umb-templates-column{display:block;float:left;margin-left:-1px;background:#d8d7d9;border:1px #fff solid!important}.umb-grid-configuration .umb-templates-column.last{margin-right:-1px}.umb-grid-configuration .umb-templates-column.add{font-size:20px;line-height:70px;color:#d8d7d9;text-align:center;text-decoration:none;background:#fff}.umb-grid-configuration .mainTdpt{height:initial;border:0}.umb-grid-configuration .umb-templates-rows .umb-templates-row{width:60px;margin:0 50px 20px 0}.umb-grid-configuration .umb-templates-rows .umb-templates-row .tb{padding:0;border-spacing:2px;border-width:2px!important}.umb-grid-configuration .umb-templates-rows .mainTdpt{height:10px!important}.umb-grid-configuration a.umb-templates-column{height:70px!important}.umb-empty-state{font-size:17.25px;line-height:1.8em;color:#68676b;text-align:center}.umb-empty-state.-small{font-size:12.75px}.umb-empty-state.-large{font-size:18.75px}.umb-empty-state.-center{position:absolute;top:50%;left:50%;width:80%;max-width:400px;transform:translate(-50%,-50%)}.umb-property-editor.-not-clickable{pointer-events:none}.umb-iconpicker{display:-ms-flexbox;display:flex;margin:0;-ms-flex-direction:row;flex-direction:row;-ms-flex-wrap:wrap;flex-wrap:wrap}.umb-iconpicker-item{display:-ms-flexbox;display:flex;margin-bottom:0;overflow:hidden;-ms-flex-direction:row;flex-direction:row;-ms-flex:0 0 14.28%;flex:0 0 14.28%;-ms-flex-pack:center;justify-content:center;-ms-flex-align:center;align-items:center}.umb-iconpicker-item a{display:-ms-flexbox;display:flex;width:100%;height:100%;padding:15px 0;text-decoration:none;border-radius:3px;-ms-flex-pack:center;justify-content:center;-ms-flex-align:center;align-items:center}.umb-iconpicker-item a:hover,.umb-iconpicker-item a:focus{background:#f3f3f5;outline:0}.umb-iconpicker-item a:active{background:#f3f3f5}.umb-iconpicker-item i{font-size:30px}.umb-insert-code-boxes{display:-ms-flexbox;display:flex;-ms-flex-direction:column;flex-direction:column}.umb-insert-code-box{padding:15px 20px;margin-bottom:10px;border:2px solid #f3f3f5;border-radius:3px}.umb-insert-code-box:hover,.umb-insert-code-box.-selected{cursor:pointer;border-color:#03bfb3}.umb-insert-code-box__title{margin-bottom:5px;font-size:15px;font-weight:bold;color:#000}.umb-insert-code-box__description{font-size:13px;line-height:1.6em}.umb-insert-code-box__check{display:-ms-flexbox;display:flex;float:left;width:18px;height:18px;margin-top:1px;margin-right:5px;font-size:12px;background:#f3f3f5;border-radius:50%;-ms-flex-align:center;align-items:center;-ms-flex-pack:center;justify-content:center}.umb-insert-code-box__check--checked{color:#fff;background:#35c786}.umb-packages-view-title{margin-bottom:30px;font-size:20px;font-weight:bold;color:#000}.umb-packages-view-wrapper{padding:20px 60px}@media(max-width:768px){.umb-packages-view-wrapper{padding:0}}.umb-packages-section{margin-bottom:40px}.umb-packages-search{width:100%;padding:30px;background:#f3f3f5;border-radius:3px;box-sizing:border-box}.umb-packages-search input{min-height:44px;padding:4px 10px;margin-bottom:0;font-size:16px;border-color:#d8d7d9;border-width:2px;border-radius:3px}.umb-packages-search input:hover,.umb-packages-search input:focus{border-color:#d8d7d9}.umb-packages__pagination{display:-ms-flexbox;display:flex;-ms-flex-pack:center;justify-content:center}.umb-packages{display:-ms-flexbox;display:flex;margin:0 -10px;-ms-flex-wrap:wrap;flex-wrap:wrap}.umb-package{max-width:100%;padding:10px;box-sizing:border-box;-ms-flex:0 0 100%;flex:0 0 100%}@media(min-width:768px){.umb-package{max-width:50%;-ms-flex:0 0 50%;flex:0 0 50%}}@media(min-width:1200px){.umb-package{max-width:33.33%;-ms-flex:0 0 33.33%;flex:0 0 33.33%}}@media(min-width:1400px){.umb-package{max-width:25%;-ms-flex:0 0 25%;flex:0 0 25%}}@media(min-width:1700px){.umb-package{max-width:20%;-ms-flex:0 0 20%;flex:0 0 20%}}@media(min-width:1900px){.umb-package{max-width:16.66%;-ms-flex:0 0 16.66%;flex:0 0 16.66%}}@media(min-width:2200px){.umb-package{max-width:14.28%;-ms-flex:0 0 14.28%;flex:0 0 14.28%}}.umb-package-link{position:relative;display:block;width:100%;height:100%;text-decoration:none!important;border:1px solid #e9e9eb;border-radius:3px;box-sizing:border-box;transition:border-color 100ms ease;-ms-flex-wrap:wrap;flex-wrap:wrap;-ms-flex-direction:column;flex-direction:column;-ms-flex-pack:center;justify-content:center}.umb-package-link:hover{border-color:#03bfb3}.umb-package-icon{display:-ms-flexbox;display:flex;min-height:60px;padding-top:10px;padding-right:10px;padding-bottom:10px;padding-left:10px;text-align:center;background-color:#fff;border-top-right-radius:3px;border-top-left-radius:3px;-ms-flex-pack:center;justify-content:center;-ms-flex-align:center;align-items:center}.umb-package-icon img{width:70px;height:auto;max-width:70px}.umb-package-info{padding-top:15px;padding-right:15px;padding-bottom:15px;padding-left:15px;text-align:center;background:#f3f3f5;border-top:1px solid #e9e9eb;border-bottom-right-radius:3px;border-bottom-left-radius:3px}.umb-package-name{max-width:250px;margin-right:auto;margin-bottom:5px;margin-left:auto;overflow:hidden;font-size:14px;font-weight:bold;line-height:normal;text-overflow:ellipsis;white-space:nowrap}.umb-package-description{max-width:100%;overflow:hidden;font-size:12px;line-height:1.1rem;color:#68676b;text-overflow:ellipsis;word-wrap:break-word;white-space:nowrap}.umb-package-numbers{display:-ms-flexbox;display:flex;margin-top:10px;opacity:.6;-ms-flex-wrap:wrap;flex-wrap:wrap;-ms-flex-direction:row;flex-direction:row;-ms-flex-pack:center;justify-content:center}.umb-package-numbers small{display:-ms-flexbox;display:flex;padding:0 5px;-ms-flex-align:center;align-items:center;-ms-flex-pack:center;justify-content:center}.umb-package-numbers i{font-size:14px}.umb-package-link:hover .umb-package-numbers{opacity:1}.umb-package-link:hover .umb-package-numbers .icon-hearts{color:#fe3e39!important}.umb-package-version{display:-ms-inline-flexbox;display:inline-flex;padding:1px 5px;font-size:12px;font-weight:bold;color:#000;background:#d8d7d9;border-radius:3px}.umb-packages-categories{display:-ms-flexbox;display:flex;-webkit-user-select:center;-moz-user-select:center;-ms-user-select:center;user-select:center;-ms-flex-wrap:wrap;flex-wrap:wrap}.umb-packages-category{display:-ms-flexbox;display:flex;max-width:25%;padding:10px 0;font-size:14px;font-weight:bold;color:#000;border-top:1px solid #d8d7d9;border-right:1px solid #d8d7d9;border-bottom:1px solid #d8d7d9;box-sizing:border-box;-ms-flex-align:center;align-items:center;-ms-flex:1 0 auto;flex:1 0 auto;-ms-flex-pack:center;justify-content:center}@media(max-width:768px){.umb-packages-category{width:100%;margin-top:0;margin-right:0!important;margin-bottom:15px!important;margin-left:0!important}}@media(max-width:992px){.umb-packages-category{max-width:100%;padding:10px;margin:5px;text-align:center;border:1px solid #d8d7d9;border-radius:3px;-ms-flex:0 0 auto;flex:0 0 auto}}@media(min-width:1100px) and (max-width:1300px){.umb-packages-category{max-width:100%;padding:10px;margin:5px;text-align:center;border:1px solid #d8d7d9;border-radius:3px;-ms-flex:0 0 auto;flex:0 0 auto}}.umb-packages-category:hover,.umb-packages-category.-active{color:#03bfb3;text-decoration:none}.umb-packages-category.-first{border-left:1px solid #d8d7d9;border-bottom-left-radius:3px;border-top-left-radius:3px}.umb-packages-category.-last{border-right:1px solid #d8d7d9;border-top-right-radius:3px;border-bottom-right-radius:3px}.umb-package-details{display:-ms-flexbox;display:flex}a.umb-package-details__back-link{font-weight:bold;color:#000}.umb-package-details__back-link:hover{color:#68676b;text-decoration:none}.umb-package-details__main-content{width:calc(100% - 350px - 40px);margin-right:40px;-ms-flex:1 1 auto;flex:1 1 auto}.umb-package-details__sidebar{-ms-flex:0 0 350px;flex:0 0 350px}@media(max-width:768px){.umb-package-details{-ms-flex-direction:column;flex-direction:column}.umb-package-details__main-content{width:100%;margin-right:0;margin-bottom:30px;-ms-flex:1 1 auto;flex:1 1 auto}.umb-package-details__sidebar{width:100%;-ms-flex:1 1 auto;flex:1 1 auto}}.umb-package-details__section{padding:20px;margin-bottom:20px;background:#f3f3f5;border-radius:3px}.umb-package-details__section-title{margin-top:0;margin-bottom:15px;font-size:17px;font-weight:bold;color:#000}.umb-package-details__section-description{margin-bottom:15px;font-size:12px;line-height:1.6em}.umb-package-details__information-item{margin-bottom:10px;font-size:13px}.umb-package-details__information-item-label{font-weight:bold;color:#000}.umb-package-details__information-item-content{word-break:break-word}.umb-package-details__information-item-label-2{font-size:12px;color:#68676b}.umb-package-details__compatability{margin-bottom:15px}.umb-package-details__compatability-label{margin-bottom:3px}.umb-package-details__description{margin-bottom:20px;line-height:1.6em;word-wrap:break-word}.umb-package-details__description p{margin-bottom:20px}.umb-package-details__link{font-weight:bold;color:#000}.umb-package-details__link:hover{text-decoration:underline}.umb-package-details__owner-profile{display:-ms-flexbox;display:flex;-ms-flex-align:center;align-items:center}.umb-package-details__owner-profile-avatar{margin-right:15px;-ms-flex:0 0 auto;flex:0 0 auto}.umb-package-details__owner-profile-name{font-size:15px;font-weight:bold;color:#000}.umb-package-details__owner-profile-karma{font-size:12px;color:#68676b}.umb-gallery__thumbnails{display:-ms-flexbox;display:flex;-ms-flex-wrap:wrap;flex-wrap:wrap}.umb-gallery__thumbnail{max-width:100px;padding:10px;margin:5px;border:1px solid #d8d7d9;border-radius:3px;box-sizing:border-box;-ms-flex:0 1 100px;flex:0 1 100px}.umb-gallery__thumbnail:hover{cursor:pointer;border-color:#03bfb3}.umb-package-list{display:-ms-flexbox;display:flex;-ms-flex-direction:column;flex-direction:column}.umb-package-list__item{display:-ms-flexbox;display:flex;padding:15px 20px;margin-bottom:5px;background:#f3f3f5;border-radius:3px;-ms-flex-direction:row;flex-direction:row;-ms-flex-align:center;align-items:center}.umb-package-list__item-icon{margin-right:20px;font-size:30px;text-align:center;-ms-flex:0 0 35px;flex:0 0 35px;-ms-flex-pack:center;justify-content:center;-ms-flex-align:center;align-items:center}.umb-package-list__item-content{margin-right:20px;-ms-flex:1 1 auto;flex:1 1 auto}.umb-package-list__item-name{margin-bottom:5px;font-size:16px;font-weight:bold;color:#000}.umb-package-list__item-description{font-size:14px;color:#68676b}.umb-package-list__item-actions{display:-ms-flexbox;display:flex;-ms-flex:1 1 auto;flex:1 1 auto;-ms-flex-pack:end;justify-content:flex-end}.umb-package-list__item-action{font-weight:bold;color:#515054}.umb-package-list__item-action:hover{color:#fe3e39;text-decoration:none}.faded{color:#817f85}.umb-upload-local__dropzone{position:relative;display:-ms-flexbox;display:flex;width:500px;height:300px;margin-bottom:30px;background:#f3f3f5;border:2px dashed #d8d7d9;border-radius:3px;transition:100ms box-shadow ease,100ms border ease;-ms-flex-direction:column;flex-direction:column;-ms-flex-pack:center;justify-content:center;-ms-flex-align:center;align-items:center}.umb-upload-local__dropzone:hover,.umb-upload-local__dropzone.drag-over{border-color:#03bfb3;border-style:solid;box-shadow:0 3px 8px rgba(0,0,0,0.1);transition:100ms box-shadow ease,100ms border ease}.umb-upload-local__dropzone i{display:block;font-size:110px;line-height:1;color:#d8d7d9}.umb-upload-local__select-file{font-weight:bold;color:#00aea2;cursor:pointer}.umb-upload-local__select-file:hover{text-decoration:underline}.umb-accept-terms{display:-ms-flexbox;display:flex;font-size:13px;-ms-flex-align:center;align-items:center}.umb-package-installer-label .label-text{margin-left:5px}.umb-package-installer-label input[type="radio"],.umb-package-installer-label input[type="checkbox"]{margin-top:0}.umb-package-installer-label{display:-ms-inline-flexbox;display:inline-flex;font-size:13px;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none;-ms-flex-align:center;align-items:center}.umb-info-local-items{display:-ms-flexbox;display:flex;width:100%;max-width:540px;margin:0 20px;background:#f3f3f5;border:2px solid #d8d7d9;border-radius:3px;-ms-flex-direction:column;flex-direction:column;-ms-flex-pack:center;justify-content:center;-ms-flex-align:center;align-items:center}.umb-info-local-items a{text-decoration:underline}.umb-info-local-items a:hover{text-decoration:none}.umb-info-local-items .umb-package-icon{width:100%;min-height:150px;font-size:60px;box-sizing:border-box}.umb-info-local-items .umb-package-icon img{max-width:100px}.umb-info-local-items .umb-package-info{width:100%;padding:20px 40px;box-sizing:border-box}.umb-info-local-item{margin-bottom:20px}.umb-upload-local__dropzone .umb-info-local-item{margin:20px}.umb-lightbox{position:absolute;top:0;right:0;bottom:0;left:0;z-index:999;display:-ms-flexbox;display:flex;width:100%;height:100%;-ms-flex-align:center;align-items:center;-ms-flex-pack:center;justify-content:center;-ms-flex-direction:column;flex-direction:column}.umb-lightbox__backdrop{position:absolute;top:0;right:0;bottom:0;left:0;width:100%;height:100%;background:rgba(21,21,23,0.7)}.umb-lightbox__close{position:absolute;top:20px;right:60px}.umb-lightbox__close i{width:40px;height:40px;font-size:20px;cursor:pointer}.umb-lightbox__images{position:relative;z-index:1000}.umb-lightbox__image{padding:10px;background:#fff;border-radius:3px}.umb-lightbox__image img{max-width:80vw;max-height:80vh}.umb-lightbox__control{position:absolute;display:-ms-flexbox;display:flex;width:50px;height:50px;cursor:pointer;background-color:#fff;border-radius:50%;-ms-flex-align:center;align-items:center;-ms-flex-pack:center;justify-content:center}.umb-lightbox__control.-next{top:50%;right:20px;transform:translate(0,-50%)}.umb-lightbox__control.-prev{top:50%;left:20px;transform:translate(0,-50%)}.umb-lightbox__control-icon{font-size:20px;color:#03bfb3}.umb-avatar{width:50px;height:50px;border-radius:50%}.umb-avatar.-xs{width:30px;height:30px}.umb-avatar.-s{width:40px;height:40px}.umb-avatar.-m{width:50px;height:50px}.umb-avatar.-l{width:70px;height:70px}.umb-avatar.-xl{width:100px;height:100px}.umb-progress-bar{position:relative;display:block;width:100%;height:10px;overflow:hidden;background:#d8d7d9;border-radius:10px;box-sizing:border-box}.umb-progress-bar__progress{position:absolute;top:0;bottom:0;left:0;width:100%;background:#35c786;border-radius:10px}.umb-querybuilder .row{font-size:14px;line-height:14px}.umb-querybuilder .row a.btn{display:inline-block;padding:5px 8px;margin:0 5px;font-weight:bold;text-align:center;background-color:#f3fdfc;border:1px solid #42cfc5;border-radius:3px}.umb-querybuilder .row a.btn:hover{text-decoration:none;background-color:#f3fdfc;border:1px solid #00aea2}.umb-querybuilder .row>div{padding:20px 0;border-bottom:1px solid #f3f3f5}.umb-querybuilder .datepicker input{width:90px}.umb-querybuilder .query-items{display:-ms-flexbox;display:flex;-ms-flex-wrap:wrap;flex-wrap:wrap;-ms-flex-align:center;align-items:center}.umb-querybuilder .query-items>*{margin:5px;-ms-flex:0 1 auto;flex:0 1 auto}.umb-pagination ul{box-shadow:none}.umb-mini-list-view__title{display:-ms-flexbox;display:flex;-ms-flex-align:center;align-items:center}.umb-mini-list-view__title-text{font-size:16px;font-weight:bold}.umb-mini-list-view__title-icon{margin-right:5px;font-size:20px}.umb-mini-list-view__back{display:-ms-flexbox;display:flex;margin-right:5px;font-size:12px;color:#68676b;-ms-flex-align:center;align-items:center}.umb-mini-list-view__back-icon{height:11px;margin-right:4px;line-height:11px}.umb-mini-list-view__back-text{margin-right:5px;text-decoration:underline}.umb-mini-list-view__back:hover{color:#000;text-decoration:none;opacity:1}.umb-mini-list-view--forward-enter,.umb-mini-list-view--forward-leave{position:relative;display:block;transition:120ms cubic-bezier(0.25,0.25,0.75,0.75) all}.umb-mini-list-view--forward-enter{left:100%}.umb-mini-list-view--forward-enter.umb-mini-list-view--forward-enter-active{left:0;opacity:1}.umb-mini-list-view--forward-leave{left:0}.umb-mini-list-view--forward-leave.umb-mini-list-view--forward-leave-active{left:-100%;opacity:0}.umb-mini-list-view--backwards-enter,.umb-mini-list-view--backwards-leave{position:relative;display:block;transition:120ms cubic-bezier(0.25,0.25,0.75,0.75) all}.umb-mini-list-view--backwards-enter{right:100%}.umb-mini-list-view--backwards-enter.umb-mini-list-view--backwards-enter-active{right:0;opacity:1}.umb-mini-list-view--backwards-leave{left:0}.umb-mini-list-view--backwards-leave.umb-mini-list-view--backwards-leave-active{right:-100%;opacity:0}.umb-button{position:relative;display:inline;overflow:hidden}.umb-button__button:focus{outline:0}.umb-button__button{position:relative;z-index:1}.umb-button__content{display:-ms-flexbox;display:flex;opacity:1;transition:opacity .25s ease;-ms-flex-wrap:wrap;flex-wrap:wrap}.umb-button__icon{margin-right:5px}.umb-button__content.-hidden{opacity:0}.umb-button__progress{position:absolute;top:50%;left:50%;z-index:100;width:14px;height:14px;margin-top:-9px;margin-left:-9px;border:2px solid #e9e9eb;border-left-color:#35c786;border-radius:40px;opacity:1;animation:rotating .4s linear infinite;transition:opacity .25s ease}.umb-button__progress.-hidden{z-index:0;opacity:0}.umb-button__progress.-white{border-color:rgba(255,255,255,0.4);border-left-color:#fff}.umb-button__success,.umb-button__error{position:absolute;top:50%;left:50%;z-index:10;font-size:20px;color:#35c786;opacity:1;transform:translate(-50%,-50%);transition:opacity .25s ease}.umb-button__success{color:#35c786}.umb-button__error{color:#fe3e39}.umb-button__success.-hidden,.umb-button__error.-hidden{z-index:0;opacity:0}.umb-button__success.-white,.umb-button__error.-white{color:#fff}.umb-button__overlay{position:absolute;z-index:10;width:100%;height:100%;background:#fff;opacity:0}@keyframes rotating{from{transform:rotate(0deg)}to{transform:rotate(360deg)}}.umb-button-group__toggle{padding-right:8px;padding-left:8px}.umb-button-group__sub-buttons.-align-right{right:0;left:auto}.umb-button-group .umb-button__button{border-radius:3px 0 0 3px}.umb-button-group .umb-button-group__toggle{border-radius:0 3px 3px 0}.umb-era-button-group{display:-ms-flexbox;display:flex}.umb-era-button-group .umb-era-button:first-child{padding-right:15px;border-radius:3px 0 0 3px}.umb-era-button-group .umb-era-button.umb-button-group__toggle{padding-right:10px;padding-left:10px;border-left-color:rgba(0,0,0,0.1);border-left-style:solid;border-left-width:1px;border-radius:0 3px 3px 0}.umb-era-button-group .umb-era-button.umb-button-group__toggle .caret{margin:0}.umb-era-button{display:-ms-flexbox;display:flex;height:38px;max-width:100%;padding:0 18px;overflow:hidden;font-size:14px;font-weight:bold;line-height:1;color:#202129;text-decoration:none!important;white-space:nowrap;cursor:pointer;background-color:#edeeee;border:0 none;border-radius:3px;box-sizing:border-box;transition:background-color 80ms ease,color 80ms ease;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none;-ms-flex-pack:center;justify-content:center;-ms-flex-align:center;align-items:center}.umb-era-button:hover,.umb-era-button:active{color:#484848;text-decoration:none;background-color:#e1e2e2;outline:0}.umb-era-button:focus{outline:0}.umb-era-button.-blue{color:white;background:#2e8aea}.umb-era-button.-blue:hover{background-color:#0064cd}.umb-era-button.-red{color:white;background:#fe6561}.umb-era-button.-red:hover{background-color:#fe4c48}.umb-era-button.-green{color:#fff;background:#35c786}.umb-era-button.-green:hover{background-color:#1fb572}.umb-era-button.-link{padding:0;background:transparent}.umb-era-button.-link:hover{background-color:transparent;opacity:.6}.umb-era-button.-inactive{color:#BBB;cursor:not-allowed;background:#eae7e7}.umb-era-button.-inactive:hover{color:#BBB;background:#eae7e7}.umb-era-button.-full-width{display:block;width:100%}.umb-era-button.umb-button--s{height:30px;font-size:13px}.umb-era-button.-white{background-color:#fff}.umb-era-button.-white:hover{opacity:.9}.umb-era-button.-text-black{color:#000}.umb-era-button i{margin-right:5px}.umb-notifications{position:absolute;right:0;bottom:52px;left:0;z-index:1000;padding:0;margin:auto;background:0;border:0;border-bottom:0;border-radius:0}.umb-notifications__notifications{position:relative;margin:0;list-style:none}.umb-notifications__notification{position:relative;padding:5px 20px;margin-bottom:0;font-size:14px;text-shadow:none;border:0;border-radius:0}.umb-notifications__notification.-extra-padding{padding-top:20px;padding-bottom:20px}.umb-file-dropzone-directive .dropzone{position:relative;width:auto;height:400px;padding:50px 0;margin:0 0 20px 0;color:#515054;text-align:center;border:1px dashed #d8d7d9;transition:height .8s}.umb-file-dropzone-directive .dropzone .illustration{width:300px}.umb-file-dropzone-directive .dropzone.is-small{height:100px}.umb-file-dropzone-directive .dropzone.is-small .illustration{width:200px}.umb-file-dropzone-directive .dropzone.drag-over{border:1px dashed #1e1c1c}.umb-file-dropzone-directive .content{position:absolute;top:50%;left:50%;transform:translate(-50%,-50%)}.umb-file-dropzone-directive .file-select{margin-top:10px;font-size:15px;color:#00aea2;cursor:pointer}.umb-file-dropzone-directive .file-select:hover{color:#00aea2;text-decoration:underline}.umb-file-dropzone-directive .file-list{padding:10px 20px;margin:0 0 30px 0;list-style:none;background:#f3f3f5}.umb-file-dropzone-directive .file-list .file{position:relative;display:block;width:100%;padding:5px 0;border-top:1px solid #d8d7d9}.umb-file-dropzone-directive .file-list .file:first-child{border-top:0}.umb-file-dropzone-directive .file-list .file.ng-enter{animation:fadeIn .5s}.umb-file-dropzone-directive .file-list .file.ng-leave{animation:fadeOut 2s}.umb-file-dropzone-directive .file-list .file .file-description{display:block;width:100%;font-size:12px;color:#515054}.umb-file-dropzone-directive .file-list .file .file-upload-progress{display:block;width:100%}.umb-file-dropzone-directive .file-list .file .file-icon{position:absolute;right:0;bottom:0}.umb-file-dropzone-directive .file-list .file .file-icon .icon{font-size:20px}.umb-file-dropzone-directive .file-list .file .file-icon .icon.ng-enter{animation:fadeIn .5s}.umb-file-dropzone-directive .file-list .file .file-icon .icon.ng-leave{animation:fadeIn .5s}.umb-file-dropzone-directive .file-progress{position:relative;height:4px;padding:2px}.umb-file-dropzone-directive .file-progress .file-progress-indicator{position:relative;display:block;width:0;height:100%;overflow:hidden;background-color:#35c786;border-radius:20px}.umb-node-preview{display:-ms-flexbox;display:flex;max-width:66.6%;padding:5px 15px;margin-bottom:5px;background:#f3f3f5;border-radius:3px;box-sizing:border-box;-ms-flex-align:center;align-items:center}.umb-node-preview--sortable{cursor:move}.umb-node-preview--unpublished .umb-node-preview__icon,.umb-node-preview--unpublished .umb-node-preview__name,.umb-node-preview--unpublished .umb-node-preview__description{opacity:.6}.umb-node-preview__icon{display:-ms-flexbox;display:flex;width:25px;height:25px;margin-right:10px;font-size:20px;-ms-flex-pack:center;justify-content:center;-ms-flex-align:center;align-items:center;-ms-flex:0 0 auto;flex:0 0 auto}.umb-node-preview__content{-ms-flex:1 1 auto;flex:1 1 auto}.umb-node-preview__name{font-size:13px;font-weight:bold;color:#000}.umb-node-preview__description{font-size:12px;line-height:1.5em;color:#515054}.umb-node-preview__actions{display:-ms-flexbox;display:flex;-ms-flex:0 0 auto;flex:0 0 auto;-ms-flex-align:center;align-items:center}.umb-node-preview__action{margin-right:5px;margin-left:5px;font-size:13px;font-weight:bold;color:#817f85}.umb-node-preview__action:hover{color:#03bfb3;text-decoration:none;opacity:1}.umb-node-preview__action--red:hover{color:#fe3e39}.umb-node-preview-add{display:-ms-flexbox;display:flex;max-width:66.6%;padding:5px 15px;font-weight:bold;color:#00aea2;border:1px dashed #d8d7d9;box-sizing:border-box;-ms-flex-align:center;align-items:center;-ms-flex-pack:center;justify-content:center}.umb-node-preview-add:hover{color:#00aea2}.umb-overlay .umb-node-preview,.umb-modal .umb-node-preview{max-width:none}.umb-overlay .umb-node-preview-add,.umb-modal .umb-node-preview-add{max-width:none}.umb-modal .umb-mini-editor .umb-panel-header{height:59px;padding:20px;background:#f3f3f5;border-bottom:1px solid #b3afbd}.umb-modal .umb-mini-editor .umb-panel-header .umb-headline{margin-top:3px;margin-right:0;margin-bottom:0;margin-left:0}.umb-modal .umb-mini-editor .umb-panel-body{padding-right:0;padding-left:0}.umb-modal .umb-mini-editor .umb-panel-body.with-footer{bottom:52px}.umb-modal .umb-mini-editor .umb-panel-footer{height:52px;padding:0 20px;background:#f3f3f5;border-top:1px solid #b3afbd}.umb-modal .umb-mini-editor .umb-editor-sub-header{margin-top:0}.flex{display:-ms-flexbox;display:flex}.flex-inline{display:-ms-inline-flexbox;display:inline-flex}.flex-column{-ms-flex-direction:column;flex-direction:column}.flex-wrap{-ms-flex-wrap:wrap;flex-wrap:wrap}.items-start{-ms-flex-align:start;align-items:flex-start}.items-end{-ms-flex-align:end;align-items:flex-end}.items-center{-ms-flex-align:center;align-items:center}.items-baseline{-ms-flex-align:baseline;align-items:baseline}.items-stretch{-ms-flex-align:stretch;align-items:stretch}.self-start{-ms-flex-item-align:start;align-self:flex-start}.self-end{-ms-flex-item-align:end;align-self:flex-end}.self-center{-ms-flex-item-align:center;align-self:center}.self-baseline{-ms-flex-item-align:baseline;align-self:baseline}.self-stretch{-ms-flex-item-align:stretch;align-self:stretch}.justify-start{-ms-flex-pack:start;justify-content:flex-start}.justify-end{-ms-flex-pack:end;justify-content:flex-end}.justify-center{-ms-flex-pack:center;justify-content:center}.justify-between{-ms-flex-pack:justify;justify-content:space-between}.justify-around{-ms-flex-pack:distribute;justify-content:space-around}.content-start{-ms-flex-line-pack:start;align-content:flex-start}.content-end{-ms-flex-line-pack:end;align-content:flex-end}.content-center{-ms-flex-line-pack:center;align-content:center}.content-between{-ms-flex-line-pack:justify;align-content:space-between}.content-around{-ms-flex-line-pack:distribute;align-content:space-around}.content-stretch{-ms-flex-line-pack:stretch;align-content:stretch}.flx-i{-ms-flex:1;flex:1}.flx-g0{-ms-flex-positive:0;flex-grow:0}.flx-g1{-ms-flex-positive:1;flex-grow:1}.flx-s0{-ms-flex-negative:0;flex-shrink:0}.flx-s1{-ms-flex-negative:1;flex-shrink:1}.flx-b0{-ms-flex-preferred-size:0;flex-basis:0}.flx-b1{-ms-flex-preferred-size:10%;flex-basis:10%}.flx-b2{-ms-flex-preferred-size:20%;flex-basis:20%}.flx-b3{-ms-flex-preferred-size:30%;flex-basis:30%}.flx-b4{-ms-flex-preferred-size:40%;flex-basis:40%}.flx-b5{-ms-flex-preferred-size:50%;flex-basis:50%}.flx-b6{-ms-flex-preferred-size:60%;flex-basis:60%}.flx-b7{-ms-flex-preferred-size:70%;flex-basis:70%}.flx-b8{-ms-flex-preferred-size:80%;flex-basis:80%}.flx-b9{-ms-flex-preferred-size:90%;flex-basis:90%}.flx-b10{-ms-flex-preferred-size:100%;flex-basis:100%}.flx-ba{-ms-flex-preferred-size:auto;flex-basis:auto}.flex-auto{min-width:0;min-height:0;-ms-flex:1 1 auto;flex:1 1 auto}.flex-none{-ms-flex:none;flex:none}.m-center{margin-right:auto;margin-left:auto}.mt0{margin-top:0}.mt1{margin-top:.25rem}.mt2{margin-top:.5rem}.mt3{margin-top:1rem}.mt4{margin-top:2rem}.mt5{margin-top:4rem}.mt6{margin-top:8rem}.mt7{margin-top:16rem}.tl{text-align:left}.tr{text-align:right}.tc{text-align:center}.w1{width:1rem}.w2{width:2rem}.w3{width:4rem}.w4{width:8rem}.w5{width:16rem}.w-10{width:10%}.w-20{width:20%}.w-25{width:25%}.w-33{width:33%}.w-34{width:34%}.w-40{width:40%}.w-50{width:50%}.w-60{width:60%}.w-75{width:75%}.w-80{width:80%}.w-100{width:100%}.w-auto{width:auto}.login-overlay{position:absolute;top:0;left:0;z-index:10000;width:100%;height:100%;padding:0;margin:0!important;overflow-y:auto;background-color:#1d1333;border:0;border-radius:0}.login-overlay__background-image{position:absolute;width:100%;height:100%;background-position:center center;background-repeat:no-repeat;background-size:cover;opacity:.05}.login-overlay__logo{position:absolute;top:22px;left:25px;z-index:1}.login-overlay .umb-modalcolumn{background:0;border:0}.login-overlay .umb-login-container{position:relative;z-index:3;display:-ms-flexbox;display:flex;width:100%;height:100%;box-sizing:border-box;-ms-flex-pack:center;justify-content:center;-ms-flex-align:center;align-items:center}@media(max-width:565px){.login-overlay .umb-login-container{padding-top:80px}}.login-overlay .form{width:500px;padding:25px;margin-top:auto;margin-right:25px;margin-bottom:auto;margin-left:25px;background:#fff}.login-overlay .form input[type="text"],.login-overlay .form input[type="password"],.login-overlay .form input[type="email"]{height:36px;padding-right:10px;padding-left:10px}.login-overlay .btn-success{padding:12px 24px}.login-overlay .form label{font-weight:bold}.login-overlay h1{display:block;margin-bottom:20px;font-size:24px;font-weight:bold;color:#000;text-align:center}.login-overlay .alert{display:inline-block;padding-right:6px;padding-left:6px;margin-top:10px;text-align:center}.login-overlay .external-logins form{margin-bottom:20px}.login-overlay .btn-social{padding-top:8px;padding-bottom:8px;margin:0;margin-bottom:5px}.login-overlay .btn-social>:first-child{line-height:36px}.login-overlay .text-error,.login-overlay .text-info{font-weight:bold}.welcome-dashboard__intro{margin-top:20px;margin-bottom:30px}.welcome-dashboard__title{max-width:750px;margin-right:auto;margin-bottom:15px;margin-left:auto;font-size:30px;font-weight:bold;line-height:1.3em;color:#303033;text-align:center}.welcome-dashboard__intro-text{max-width:750px;margin-right:auto;margin-left:auto;font-size:18px;line-height:1.6em;text-align:center}.welcome-dashboard__info-box-boxes{display:-ms-flexbox;display:flex;margin-bottom:30px}.welcome-dashboard__info-box{display:block;padding:25px;margin:10px;text-decoration:none;background-color:#f3fdfc;border:2px solid transparent;border-radius:3px}.welcome-dashboard__info-box:hover{text-decoration:none;cursor:pointer;border:2px solid #03bfb3;transition:border-color 150ms ease-in-out}.welcome-dashboard__info-box:active,.welcome-dashboard__info-box:focus{text-decoration:none}.welcome-dashboard__info-box-title{margin-bottom:5px;font-size:16px;font-weight:bold;color:#00aea2;text-align:center}.welcome-dashboard__info-box-description{line-height:1.4em;text-align:center}.welcome-dashboard__cards{display:-ms-flexbox;display:flex;margin-bottom:30px}.welcome-dashboard__card{display:-ms-flexbox;display:flex;margin:10px;background-color:#f3f3f5;border-radius:3px;-ms-flex-direction:column;flex-direction:column;-ms-flex-align:start;align-items:flex-start}.welcome-dashboard__card-image-wrapper{width:100%;max-height:225px;margin-bottom:30px;overflow:hidden;-ms-flex:0 0 auto;flex:0 0 auto}.welcome-dashboard__card-image{width:100%;cursor:pointer;border-radius:3px 3px 0 0}.welcome-dashboard__card-image-wrapper+.welcome-dashboard__card-content{padding-top:0}.welcome-dashboard__card-content{padding:30px}.welcome-dashboard__card-title{margin-bottom:10px;font-size:18px;font-weight:bold;line-height:1.6em;color:#303033}.welcome-dashboard__card-teaser{margin-bottom:15px;font-size:14px}.umb-editor{min-width:66.6%}.umb-editor-tiny{width:60px}.umb-editor-small{width:90px}.umb-modal .umb-editor{width:95%}.umb-dialog .umb-editor{width:95%}.umb-dialog .umb-control-group .help-block{width:95%}.umb-codeeditor{width:99%}.umb-contentpicker li a:hover .hover-hide,.umb-contentpicker li a .hover-show{display:none}.umb-contentpicker li a:hover .hover-show{display:inline-block}.umb-contentpicker-popover .search-holder{padding:10px}.umb-contentpicker small:not(:last-child){padding-right:3px;border-right:1px solid #817f85}.umb-contentpicker small a{color:#515054}div.umb-codeeditor{border:1px solid #d8d7d9}div.umb-codeeditor .umb-el-wrap{padding:0}div.umb-codeeditor .umb-btn-toolbar{padding:0;margin:0;background:#f3f3f5;border-bottom:#d8d7d9 1px solid}.mce-tinymce{border:1px solid #d8d7d9!important;border-radius:0!important}.mce-panel{background:#f3f3f5!important;border-color:#d8d7d9!important}.mce-btn-group,.mce-btn{background:none!important;border:none!important}.mce-ico{font-size:12px!important;color:#1e1c1c!important}.mce-ico.mce-i-custom[class^="icon-"],.mce-ico.mce-i-custom[class*=" icon-"]{font-family:icomoon;font-size:16px!important}.rte-editor-preval .control-group .controls>div>label .mce-ico{line-height:20px}ul.color-picker li{width:60px;padding:2px;margin:3px;border:2px solid transparent}ul.color-picker li.active{border:2px dashed #d8d7d9}ul.color-picker li a{display:block;height:50px;cursor:pointer}.control-group.color-picker-preval .thumbnail{width:30px;border:0}.control-group.color-picker-preval pre{display:inline;margin-right:20px;margin-left:10px}.control-group.color-picker-preval label{padding:6px;border:solid #fff 1px}.umb-mediapicker .add-link{display:inline-block;width:120px;height:120px;line-height:120px;color:#d8d7d9;text-align:center;text-decoration:none;border:2px #d8d7d9 dashed;transition:all 150ms ease-in-out}.umb-mediapicker .add-link:hover{color:#00aea2;border-color:#03bfb3}.umb-mediapicker .picked-image{position:absolute;right:10px;bottom:10px;display:none;width:32px;height:32px;overflow:hidden;font-size:24px;line-height:36px;color:#fe3e39;text-align:center;text-decoration:none;background:#fff;border-radius:15px;opacity:.5}.umb-thumbnails{position:relative}.umb-thumbnails i{margin:auto}.umb-thumbnails a{border:none!important;outline:0;box-shadow:none!important}.umb-sortable-thumbnails{display:-ms-flexbox;display:flex;padding:0;margin:0;list-style-type:none;-ms-flex-direction:row;flex-direction:row;-ms-flex-wrap:wrap;flex-wrap:wrap}.umb-sortable-thumbnails li{position:relative;display:-ms-flexbox;display:flex;max-width:100%;padding:2px;margin:5px;background:#fff;border:1px solid #f3f3f5;-ms-flex-direction:row;flex-direction:row;-ms-flex-pack:center;justify-content:center;-ms-flex-align:center;align-items:center;-ms-flex-wrap:wrap;flex-wrap:wrap}.umb-mediapicker .umb-sortable-thumbnails li{padding:5px;margin:0;-ms-flex-direction:column;flex-direction:column}.umb-sortable-thumbnails li:hover a{display:-ms-flexbox;display:flex;-ms-flex-pack:center;justify-content:center;-ms-flex-align:center;align-items:center}.umb-sortable-thumbnails li img{display:block;max-width:100%;max-height:100%;margin:auto;background-image:url(../img/checkered-background.png)}.umb-sortable-thumbnails li img.noScale{max-width:none!important;max-height:none!important}.umb-sortable-thumbnails .umb-icon-holder{text-align:center}.umb-sortable-thumbnails .umb-icon-holder .icon{display:block;font-size:40px;line-height:50px;color:#515054}.umb-sortable-thumbnails .umb-sortable-thumbnails__actions{position:absolute;right:10px;bottom:10px;display:-ms-flexbox;display:flex;text-decoration:none;opacity:0;visibility:hidden;-ms-flex-direction:row;flex-direction:row}.umb-sortable-thumbnails li:hover .umb-sortable-thumbnails__actions{opacity:1;visibility:visible}.umb-sortable-thumbnails .umb-sortable-thumbnails__action{display:-ms-flexbox;display:flex;width:25px;height:25px;margin-left:5px;font-size:16px;color:#1e1c1c;background:#fff;border-radius:15px;-ms-flex-pack:center;justify-content:center;-ms-flex-align:center;align-items:center}.umb-sortable-thumbnails .umb-sortable-thumbnails__action.-red{color:#fe3e39}.umb-sortable-thumbnails .umb-sortable-thumbnails__action:hover{text-decoration:none}.umb-cropper{position:relative}.umb-cropper img,.umb-cropper-gravity img{position:relative;top:0;left:0;height:auto;max-width:100%}.umb-cropper img{max-width:none}.umb-cropper .overlay,.umb-cropper-gravity .overlay{position:absolute;top:0;left:0;z-index:6001;cursor:move}.umb-cropper .viewport{position:relative;height:auto;max-width:100%;margin:auto;overflow:hidden}.umb-cropper-gravity .viewport{position:relative;width:100%;height:100%;overflow:hidden}.umb-cropper .viewport:after{position:absolute;top:0;left:0;z-index:5999;width:100%;height:100%;content:"";-moz-opacity:.75;opacity:.75;filter:alpha(opacity=7);box-shadow:inset 0 0 0 20px #fff,inset 0 0 0 21px rgba(0,0,0,0.1),inset 0 0 20px 21px rgba(0,0,0,0.2)}.umb-cropper-gravity .overlay{width:14px;height:14px;text-align:center;background:#03bfb3;border:3px solid #fff;border-radius:20px;opacity:.8}.umb-cropper-gravity .overlay i{font-size:26px;line-height:26px;opacity:.8!important}.umb-cropper .crop-container{text-align:center}.umb-cropper .crop-slider{display:-ms-flexbox;display:flex;padding:10px;margin-top:10px;border-top:1px solid #f3f3f5;-ms-flex-align:center;align-items:center;-ms-flex-pack:center;justify-content:center;-ms-flex-wrap:wrap;flex-wrap:wrap}@media(min-width:769px){.umb-cropper .crop-slider{padding:10px 50px 10px 50px}}.umb-cropper .crop-slider i{padding:0 5px;color:#515054;box-sizing:border-box;-ms-flex:0 0 25px;flex:0 0 25px}.umb-cropper .crop-slider i:first-of-type{text-align:right}.umb-cropper .crop-slider input{-ms-flex:0 1 auto;flex:0 1 auto}.umb-cropper-gravity .viewport,.umb-cropper-gravity,.umb-cropper-imageholder{display:inline-block;max-width:100%}.umb-cropper-imageholder{float:left}.cropList{position:relative;display:inline-block;vertical-align:top}.gravity-container .viewport{max-width:600px}.gravity-container .viewport:hover{cursor:pointer}.imagecropper{display:-ms-flexbox;display:flex;-ms-flex-align:start;align-items:flex-start;-ms-flex-direction:row;flex-direction:row}@media(max-width:768px){.imagecropper{float:left;max-width:100%;-ms-flex-direction:column;flex-direction:column}}.imagecropper .umb-cropper__container{position:relative;max-width:100%;margin-bottom:10px;border:1px solid #f3f3f5}@media(min-width:769px){.imagecropper .umb-cropper__container{width:600px}}.umb-close-cropper{position:absolute;top:3px;right:3px;cursor:pointer}.umb-close-cropper:hover{background:#f3f3f5;opacity:.9}.imagecropper .umb-sortable-thumbnails{display:-ms-flexbox;display:flex;-ms-flex-direction:row;flex-direction:row;-ms-flex-wrap:wrap;flex-wrap:wrap}.imagecropper .umb-sortable-thumbnails li{display:-ms-flexbox;display:flex;padding:8px;margin-top:0;-ms-flex-direction:column;flex-direction:column;-ms-flex-pack:justify;justify-content:space-between}.imagecropper .umb-sortable-thumbnails li.current{color:#000;cursor:pointer;background:#f3f3f5;border-color:#d8d7d9}.imagecropper .umb-sortable-thumbnails li:hover,.imagecropper .umb-sortable-thumbnails li.current:hover{color:#000;cursor:pointer;background:#f3f3f5;border-color:#d8d7d9;opacity:.95}.imagecropper .umb-sortable-thumbnails li .crop-name,.imagecropper .umb-sortable-thumbnails li .crop-size{display:block;font-size:13px;line-height:1;text-align:left}.imagecropper .umb-sortable-thumbnails li .crop-name{margin:10px 0 5px;font-weight:bold}.imagecropper .umb-sortable-thumbnails li .crop-size{margin:0 0 5px;font-size:10px;font-style:italic}.btn-crop-delete{display:block;text-align:left}.umb-folderbrowser .add-link{display:inline-block;width:120px;height:120px;line-height:120px;text-align:center;border:1px #f3f3f5 dashed}.umb-upload-drop-zone{margin-bottom:5px}.umb-upload-drop-zone .info,.umb-upload-button-big{display:block;padding:20px;font-size:14px;color:#d8d7d9;text-align:center;background:0;border:1px dashed #d8d7d9;opacity:1}.umb-upload-button-big:hover{color:#d8d7d9}.umb-upload-drop-zone .info i.icon,.umb-upload-button-big i.icon{font-size:55px;line-height:70px}.umb-upload-button-big{display:block}.umb-upload-button-big input{bottom:0;left:0;width:100%;height:100%}.umb-photo-folder .picrow{position:relative;overflow-y:hidden}.umb-photo-folder .picrow div,.umb-photo-preview{position:relative;display:inline-block;padding:0;margin:0;vertical-align:top;border:0}.umb-photo-folder .picrow div a:first-child{width:100%;height:100%}.umb-photo-folder .picrow div.umb-photo{width:100%;height:100%;background-color:#f3f3f5}.umb-photo-folder a:hover{text-decoration:none}.umb-photo-folder .umb-non-thumbnail{font-size:12px;color:#000;text-align:center;text-decoration:none;vertical-align:middle;background:#f3f3f5}.umb-photo-folder .selector-overlay{display:none}.umb-photo-folder .pic:hover .selector-overlay{position:absolute;right:0;bottom:0;left:0;z-index:100;display:block;padding:5px;overflow:hidden;color:#fff;text-align:center;text-decoration:none;text-overflow:ellipsis;white-space:nowrap;background:#000;opacity:.4}.umb-photo-folder .umb-non-thumbnail i{position:relative;top:50%;display:block;margin:auto;font-size:50px;line-height:60px;color:#d8d7d9;transform:translateY(-50%)}.umb-photo-folder .umb-non-thumbnail span{position:absolute;top:20px;display:block;width:100%;margin:auto}.umb-photo-folder .selected{position:relative}.umb-photo-folder .selected:before{position:absolute;right:10px;bottom:10px;z-index:100;display:block;width:32px;height:32px;overflow:hidden;font-family:Icomoon;font-size:24px;line-height:36px;color:#000;text-align:center;background:#fff;border-radius:15px;content:"\e165";opacity:.5}.umb-fileupload .preview{float:left;padding:3px;margin-right:30px;margin-bottom:30px;background:#e9e9eb;border:1px solid #a2a1a6;border-radius:5px}.umb-fileupload ul{margin-bottom:0;vertical-align:middle;list-style:none}.umb-fileupload label{padding-left:7px;font-weight:normal;vertical-align:middle}.umb-fileupload .preview-file{width:55px;height:45px;padding-top:27px;font-size:10px;color:#68676b;text-align:center;text-transform:uppercase}.umb-fileupload .file-icon{position:relative;display:block;padding:5px 0;text-align:center}.umb-fileupload .file-icon>.icon{font-size:70px;line-height:110%;color:#68676b;text-align:center}.umb-fileupload .file-icon>span{position:absolute;top:45px;left:110px;padding:1px 3px;font-size:12px;line-height:130%;color:#fff;background:#68676b}.umb-fileupload input{font-size:12px;line-height:1}.umb-member-group-box{width:45%}.umb-member-group-box:nth-child(1){float:left}.umb-member-group-box:nth-child(2){float:right}.umb-relatedlinks table>tr>td{word-break:break-all;word-wrap:break-word;border-bottom:1px solid transparent}.umb-relatedlinks .handle{cursor:move}.umb-relatedlinks table>tbody>tr.unsortable .handle{cursor:default}.umb-relatedlinks table td.col-sort{width:20px}.umb-relatedlinks table td.col-caption{min-width:200px}.umb-relatedlinks table td.col-link{min-width:200px}.umb-relatedlinks table td.col-actions{min-width:120px}.umb-relatedlinks table td.col-caption .control-wrapper,.umb-relatedlinks table td.col-link .control-wrapper{display:-ms-flexbox;display:flex}.umb-relatedlinks table td.col-caption .control-wrapper input[type="text"],.umb-relatedlinks table td.col-link .control-wrapper input[type="text"]{width:auto;-ms-flex:1;flex:1}.umb-relatedlinks .sortable-placeholder{display:table-row;background-color:#f3f3f5}.umb-relatedlinks .sortable-placeholder>td{display:table-cell;padding:8px}.umb-relatedlinks .ui-sortable-helper{display:table-row;background-color:#fff;opacity:.7}.umb-relatedlinks .ui-sortable-helper>td{display:table-cell;border-bottom:1px solid #d8d7d9}.umb-tags{padding:10px;font-size:13px;text-shadow:none;border:#f3f3f5 solid 1px}.umb-tags .tag{padding:7px;margin:7px;cursor:pointer;background:#03bfb3}.umb-tags .tag i{padding:2px}.umb-tags input{background:#fff;border:0}.bootstrap-datetimepicker-widget .btn{padding:0}.bootstrap-datetimepicker-widget .picker-switch .btn{background:0;border:0}.umb-datepicker .input-append .add-on{cursor:pointer}.umb-datepicker p{margin-top:10px}.umb-datepicker p a{color:#515054}.CodeMirror,.CodeMirror-scroll{height:100%;min-height:200px}.umb-nested-boolean label{float:left;width:320px;margin-bottom:8px}.umb-nested-boolean label span{float:left;width:80%}.umb-nested-boolean label input[type='checkbox']{float:left;margin-right:10px}.typeahead,.tt-query,.tt-hint{z-index:auto!important;width:396px;height:30px;padding:8px 12px;margin-top:-4px!important;font-size:24px;line-height:30px;border:2px solid #d8d7d9;border-radius:2px!important;outline:0}.typeahead{background-color:#fff}.tt-query{box-shadow:inset 0 1px 1px rgba(0,0,0,0.075)}.tt-hint{color:#d8d7d9!important}.tt-dropdown-menu{width:422px;padding:8px 0;margin-top:12px;background-color:#fff;border:1px solid #d8d7d9;border-radius:8px;box-shadow:0 5px 10px rgba(0,0,0,0.2)}.tt-suggestion{padding:3px 20px;font-size:15px;line-height:20px;cursor:pointer}.tt-suggestion.tt-cursor{color:#fff;background-color:#03bfb3}.tt-suggestion p{margin:0}*{-ms-touch-action:none}.ace_editor{height:200px}.nounderline{text-decoration:none!important}.nounderline:hover{text-decoration:underline!important}.nounderline *{text-decoration:none!important;border:0}.ui-sortable-placeholder{margin-left:0!important}.controls-row img{max-width:none}.thumbnail{border-radius:0}.thumbnail img{width:100%;max-width:100%!important}#mapCanvas img{max-width:none!important}.btn-group .dropdown-backdrop{display:none}iframe,.content-column-body{background:center center url(../img/loader.gif) no-repeat;border:0}.fileinput-button{position:relative;margin-bottom:5px;overflow:hidden}.fileinput-button input{position:absolute;top:0;right:0;margin:0;font-size:23px;cursor:pointer;opacity:0;filter:alpha(opacity=0);transform:translate(-300px,0) scale(4);direction:ltr}.legacy-custom-file{display:inline-block;width:16px;height:16px;min-width:20px;background-position:center center;background-repeat:no-repeat}.icon-chevron-up:before{content:"\e128"}.icon-chevron-down:before{content:"\e0c9"}.pa-umb-overlay{-webkit-font-smoothing:antialiased;font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale}.pa-umb-overlay+.pa-umb-overlay{padding-top:30px;border-top:1px solid #d8d7d9}.pa-select-type{display:-ms-flexbox;display:flex;margin-top:15px;-ms-flex-wrap:nowrap;flex-wrap:nowrap;-ms-flex-direction:row;flex-direction:row;-ms-flex-pack:center;justify-content:center;-ms-flex-align:start;align-items:flex-start}.pa-select-type label{padding:0 20px}.pa-access-header{padding-bottom:0;margin:0 0 3px 0;font-weight:bold}.pa-access-description{margin:0;color:#bbbabf}.pa-validation-message{display:inline-block;padding:6px 12px!important;margin:5px 0 0 0!important}.pa-select-pages label{margin:0;font-size:15px}.pa-select-pages label+.controls-row{padding-top:0}.pa-select-pages .umb-detail{margin:2px 0 5px;font-size:13px}.pa-choose-page a{font-size:15px;color:#00aea2}.pa-choose-page a:hover,.pa-choose-page a:active,.pa-choose-page a:focus{color:#00aea2;text-decoration:none}.pa-choose-page a:before{margin-right:3px;font-weight:bold;content:"+"}.pa-choose-page .treePickerTitle{padding:3px 5px;font-size:13px;font-style:italic;font-weight:bold;color:#817f85;background:#f3f3f5;border-bottom:0}.pa-form+.pa-form{margin-top:10px}code{border-radius:3px}pre{display:block;padding:9.5px;margin:0 0 10px;overflow-x:auto;font-family:Monaco,Menlo,Consolas,"Courier New",monospace;font-size:14px;line-height:20px;color:#303033;white-space:pre-line;background-color:#f3f3f5;border:1px solid #d8d7d9;border-radius:3px}pre.prettyprint{margin-bottom:20px}pre code{padding:0;word-wrap:normal;white-space:pre;background-color:transparent;border:0}.umb-healthcheck{display:-ms-flexbox;display:flex;margin-right:-10px;margin-left:-10px;-ms-flex-wrap:wrap;flex-wrap:wrap}.umb-healthcheck-help-text{max-width:750px;margin-bottom:30px;line-height:1.6em}.umb-healthcheck-action-bar{display:-ms-flexbox;display:flex;margin-bottom:20px;-ms-flex-pack:end;justify-content:flex-end}.umb-healthcheck-group{display:-ms-flexbox;display:flex;height:100%;padding:15px 10px;text-align:center;background:#f3f3f5;border:2px solid transparent;border-radius:3px;box-sizing:border-box;-ms-flex-wrap:wrap;flex-wrap:wrap;-ms-flex-direction:column;flex-direction:column}.umb-healthcheck-group:hover{cursor:pointer;border:2px solid #03bfb3}.umb-healthcheck-group__load-container{position:relative;height:30px;margin-top:15px;margin-bottom:16px}.umb-healthcheck-title{font-size:14px;font-weight:bold}.umb-healthcheck-messages{margin-top:15px}.umb-healthcheck-message{position:relative;display:-ms-inline-flexbox;display:inline-flex;padding-right:8px;padding-left:8px;margin-bottom:5px;font-size:13px;font-weight:bold;color:#000;background:#fff;border-radius:50px;-ms-flex-align:center;align-items:center}.umb-healthcheck-message i{margin-right:3px;font-size:15px}.umb-healthcheck-details-link{color:#00aea2}.umb-healthcheck-details-link:hover{color:#00aea2;text-decoration:none}.align-self-center{-ms-flex-item-align:center;align-self:center}.umb-air{max-width:100%;padding:10px;box-sizing:border-box;-ms-flex:0 0 auto;flex:0 0 auto;-ms-flex-preferred-size:100%;flex-basis:100%}@media(min-width:500px){.umb-air{max-width:50%;-ms-flex-preferred-size:50%;flex-basis:50%}}@media(min-width:768px){.umb-air{max-width:20%;-ms-flex-preferred-size:20%;flex-basis:20%}}.umb-healthcheck-back-link{font-weight:bold;color:#000}.umb-healthcheck-group__details{margin-bottom:40px;border-radius:3px}.umb-healthcheck-group__details-group-title{display:-ms-flexbox;display:flex;padding:10px 20px;background-color:#675e7a;border-radius:3px 3px 0 0;-ms-flex-align:center;align-items:center;-ms-flex-pack:justify;justify-content:space-between}.umb-healthcheck-group__details-group-name{font-size:16px;font-weight:bold;color:#fff}.umb-healthcheck-group__details-checks{border:1px solid #d8d7d9;border-top:0;border-radius:0 0 3px 3px}.umb-healthcheck-group__details-check{position:relative}.umb-healthcheck-group__details-check-title{padding:15px 20px;background-color:#f3f3f5}.umb-healthcheck-group__details-check-name{margin-bottom:5px;font-size:15px;font-weight:bold;color:#000}.umb-healthcheck-group__details-check-description{font-size:13px;line-height:1.6em;color:#515054}.umb-healthcheck-group__details-status{display:-ms-flexbox;display:flex;padding:15px 0;border-bottom:2px solid #f3f3f5}.umb-healthcheck-group__details-status-overlay{position:absolute;top:0;right:0;bottom:0;left:0;background:#fff;opacity:.9}.umb-healthcheck-group__details-status:last-child{border-bottom:0}.umb-healthcheck-group__details-status-icon-container{display:-ms-flexbox;display:flex;padding:0 20px;-ms-flex:0 0 50px;flex:0 0 50px;-ms-flex-pack:center;justify-content:center}.umb-healthcheck-status-icon{margin-top:2px;font-size:20px}.umb-healthcheck-status-icon.-large{width:70px;height:70px;font-size:30px;background-color:#fff}.umb-healthcheck-group__details-status-content{padding:0 20px;-ms-flex:1 1 auto;flex:1 1 auto}.umb-healthcheck-group__details-status-text{line-height:1.6em}.umb-healthcheck-group__details-status-actions{display:-ms-flexbox;display:flex;margin-top:10px;-ms-flex-direction:column;flex-direction:column}.umb-healthcheck-group__details-status-action{padding:10px;margin-bottom:10px;background-color:#f3f3f5;border-radius:3px}.umb-healthcheck-group__details-status-action:last-child{margin-bottom:0}.umb-healthcheck-group__details-status-action-description{margin-top:5px;font-size:12px} \ No newline at end of file diff --git a/src/UmbracoUrlHandling/Umbraco/assets/fonts/helveticons/helveticons.eot b/src/UmbracoUrlHandling/Umbraco/assets/fonts/helveticons/helveticons.eot new file mode 100644 index 0000000..913fd66 Binary files /dev/null and b/src/UmbracoUrlHandling/Umbraco/assets/fonts/helveticons/helveticons.eot differ diff --git a/src/UmbracoUrlHandling/Umbraco/assets/fonts/helveticons/helveticons.svg b/src/UmbracoUrlHandling/Umbraco/assets/fonts/helveticons/helveticons.svg new file mode 100644 index 0000000..e4ae7c7 --- /dev/null +++ b/src/UmbracoUrlHandling/Umbraco/assets/fonts/helveticons/helveticons.svg @@ -0,0 +1,6176 @@ + + + + +This is a custom SVG font generated by IcoMoon. + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/src/UmbracoUrlHandling/Umbraco/assets/fonts/helveticons/helveticons.ttf b/src/UmbracoUrlHandling/Umbraco/assets/fonts/helveticons/helveticons.ttf new file mode 100644 index 0000000..4cca131 Binary files /dev/null and b/src/UmbracoUrlHandling/Umbraco/assets/fonts/helveticons/helveticons.ttf differ diff --git a/src/UmbracoUrlHandling/Umbraco/assets/fonts/helveticons/helveticons.woff b/src/UmbracoUrlHandling/Umbraco/assets/fonts/helveticons/helveticons.woff new file mode 100644 index 0000000..04d78a9 Binary files /dev/null and b/src/UmbracoUrlHandling/Umbraco/assets/fonts/helveticons/helveticons.woff differ diff --git a/src/UmbracoUrlHandling/Umbraco/assets/fonts/lato/LatoLatin-Black.eot b/src/UmbracoUrlHandling/Umbraco/assets/fonts/lato/LatoLatin-Black.eot new file mode 100644 index 0000000..d41103b Binary files /dev/null and b/src/UmbracoUrlHandling/Umbraco/assets/fonts/lato/LatoLatin-Black.eot differ diff --git a/src/UmbracoUrlHandling/Umbraco/assets/fonts/lato/LatoLatin-Black.ttf b/src/UmbracoUrlHandling/Umbraco/assets/fonts/lato/LatoLatin-Black.ttf new file mode 100644 index 0000000..45c55e4 Binary files /dev/null and b/src/UmbracoUrlHandling/Umbraco/assets/fonts/lato/LatoLatin-Black.ttf differ diff --git a/src/UmbracoUrlHandling/Umbraco/assets/fonts/lato/LatoLatin-Black.woff b/src/UmbracoUrlHandling/Umbraco/assets/fonts/lato/LatoLatin-Black.woff new file mode 100644 index 0000000..d1e2579 Binary files /dev/null and b/src/UmbracoUrlHandling/Umbraco/assets/fonts/lato/LatoLatin-Black.woff differ diff --git a/src/UmbracoUrlHandling/Umbraco/assets/fonts/lato/LatoLatin-Black.woff2 b/src/UmbracoUrlHandling/Umbraco/assets/fonts/lato/LatoLatin-Black.woff2 new file mode 100644 index 0000000..4127b4d Binary files /dev/null and b/src/UmbracoUrlHandling/Umbraco/assets/fonts/lato/LatoLatin-Black.woff2 differ diff --git a/src/UmbracoUrlHandling/Umbraco/assets/fonts/lato/LatoLatin-BlackItalic.eot b/src/UmbracoUrlHandling/Umbraco/assets/fonts/lato/LatoLatin-BlackItalic.eot new file mode 100644 index 0000000..74ea622 Binary files /dev/null and b/src/UmbracoUrlHandling/Umbraco/assets/fonts/lato/LatoLatin-BlackItalic.eot differ diff --git a/src/UmbracoUrlHandling/Umbraco/assets/fonts/lato/LatoLatin-BlackItalic.ttf b/src/UmbracoUrlHandling/Umbraco/assets/fonts/lato/LatoLatin-BlackItalic.ttf new file mode 100644 index 0000000..76563c2 Binary files /dev/null and b/src/UmbracoUrlHandling/Umbraco/assets/fonts/lato/LatoLatin-BlackItalic.ttf differ diff --git a/src/UmbracoUrlHandling/Umbraco/assets/fonts/lato/LatoLatin-BlackItalic.woff b/src/UmbracoUrlHandling/Umbraco/assets/fonts/lato/LatoLatin-BlackItalic.woff new file mode 100644 index 0000000..142c1c9 Binary files /dev/null and b/src/UmbracoUrlHandling/Umbraco/assets/fonts/lato/LatoLatin-BlackItalic.woff differ diff --git a/src/UmbracoUrlHandling/Umbraco/assets/fonts/lato/LatoLatin-BlackItalic.woff2 b/src/UmbracoUrlHandling/Umbraco/assets/fonts/lato/LatoLatin-BlackItalic.woff2 new file mode 100644 index 0000000..e9862e6 Binary files /dev/null and b/src/UmbracoUrlHandling/Umbraco/assets/fonts/lato/LatoLatin-BlackItalic.woff2 differ diff --git a/src/UmbracoUrlHandling/Umbraco/assets/fonts/lato/LatoLatin-Bold.eot b/src/UmbracoUrlHandling/Umbraco/assets/fonts/lato/LatoLatin-Bold.eot new file mode 100644 index 0000000..d90b47b Binary files /dev/null and b/src/UmbracoUrlHandling/Umbraco/assets/fonts/lato/LatoLatin-Bold.eot differ diff --git a/src/UmbracoUrlHandling/Umbraco/assets/fonts/lato/LatoLatin-Bold.ttf b/src/UmbracoUrlHandling/Umbraco/assets/fonts/lato/LatoLatin-Bold.ttf new file mode 100644 index 0000000..c598c24 Binary files /dev/null and b/src/UmbracoUrlHandling/Umbraco/assets/fonts/lato/LatoLatin-Bold.ttf differ diff --git a/src/UmbracoUrlHandling/Umbraco/assets/fonts/lato/LatoLatin-Bold.woff b/src/UmbracoUrlHandling/Umbraco/assets/fonts/lato/LatoLatin-Bold.woff new file mode 100644 index 0000000..cdfcbe0 Binary files /dev/null and b/src/UmbracoUrlHandling/Umbraco/assets/fonts/lato/LatoLatin-Bold.woff differ diff --git a/src/UmbracoUrlHandling/Umbraco/assets/fonts/lato/LatoLatin-Bold.woff2 b/src/UmbracoUrlHandling/Umbraco/assets/fonts/lato/LatoLatin-Bold.woff2 new file mode 100644 index 0000000..2615c85 Binary files /dev/null and b/src/UmbracoUrlHandling/Umbraco/assets/fonts/lato/LatoLatin-Bold.woff2 differ diff --git a/src/UmbracoUrlHandling/Umbraco/assets/fonts/lato/LatoLatin-BoldItalic.eot b/src/UmbracoUrlHandling/Umbraco/assets/fonts/lato/LatoLatin-BoldItalic.eot new file mode 100644 index 0000000..17216ef Binary files /dev/null and b/src/UmbracoUrlHandling/Umbraco/assets/fonts/lato/LatoLatin-BoldItalic.eot differ diff --git a/src/UmbracoUrlHandling/Umbraco/assets/fonts/lato/LatoLatin-BoldItalic.ttf b/src/UmbracoUrlHandling/Umbraco/assets/fonts/lato/LatoLatin-BoldItalic.ttf new file mode 100644 index 0000000..c1f225a Binary files /dev/null and b/src/UmbracoUrlHandling/Umbraco/assets/fonts/lato/LatoLatin-BoldItalic.ttf differ diff --git a/src/UmbracoUrlHandling/Umbraco/assets/fonts/lato/LatoLatin-BoldItalic.woff b/src/UmbracoUrlHandling/Umbraco/assets/fonts/lato/LatoLatin-BoldItalic.woff new file mode 100644 index 0000000..3e683fe Binary files /dev/null and b/src/UmbracoUrlHandling/Umbraco/assets/fonts/lato/LatoLatin-BoldItalic.woff differ diff --git a/src/UmbracoUrlHandling/Umbraco/assets/fonts/lato/LatoLatin-BoldItalic.woff2 b/src/UmbracoUrlHandling/Umbraco/assets/fonts/lato/LatoLatin-BoldItalic.woff2 new file mode 100644 index 0000000..f7bace1 Binary files /dev/null and b/src/UmbracoUrlHandling/Umbraco/assets/fonts/lato/LatoLatin-BoldItalic.woff2 differ diff --git a/src/UmbracoUrlHandling/Umbraco/assets/fonts/lato/LatoLatin-Italic.eot b/src/UmbracoUrlHandling/Umbraco/assets/fonts/lato/LatoLatin-Italic.eot new file mode 100644 index 0000000..403b9a5 Binary files /dev/null and b/src/UmbracoUrlHandling/Umbraco/assets/fonts/lato/LatoLatin-Italic.eot differ diff --git a/src/UmbracoUrlHandling/Umbraco/assets/fonts/lato/LatoLatin-Italic.ttf b/src/UmbracoUrlHandling/Umbraco/assets/fonts/lato/LatoLatin-Italic.ttf new file mode 100644 index 0000000..c61fc07 Binary files /dev/null and b/src/UmbracoUrlHandling/Umbraco/assets/fonts/lato/LatoLatin-Italic.ttf differ diff --git a/src/UmbracoUrlHandling/Umbraco/assets/fonts/lato/LatoLatin-Italic.woff b/src/UmbracoUrlHandling/Umbraco/assets/fonts/lato/LatoLatin-Italic.woff new file mode 100644 index 0000000..d8cf84c Binary files /dev/null and b/src/UmbracoUrlHandling/Umbraco/assets/fonts/lato/LatoLatin-Italic.woff differ diff --git a/src/UmbracoUrlHandling/Umbraco/assets/fonts/lato/LatoLatin-Italic.woff2 b/src/UmbracoUrlHandling/Umbraco/assets/fonts/lato/LatoLatin-Italic.woff2 new file mode 100644 index 0000000..aaa5a35 Binary files /dev/null and b/src/UmbracoUrlHandling/Umbraco/assets/fonts/lato/LatoLatin-Italic.woff2 differ diff --git a/src/UmbracoUrlHandling/Umbraco/assets/fonts/lato/LatoLatin-Light.eot b/src/UmbracoUrlHandling/Umbraco/assets/fonts/lato/LatoLatin-Light.eot new file mode 100644 index 0000000..865537d Binary files /dev/null and b/src/UmbracoUrlHandling/Umbraco/assets/fonts/lato/LatoLatin-Light.eot differ diff --git a/src/UmbracoUrlHandling/Umbraco/assets/fonts/lato/LatoLatin-Light.ttf b/src/UmbracoUrlHandling/Umbraco/assets/fonts/lato/LatoLatin-Light.ttf new file mode 100644 index 0000000..6af1b85 Binary files /dev/null and b/src/UmbracoUrlHandling/Umbraco/assets/fonts/lato/LatoLatin-Light.ttf differ diff --git a/src/UmbracoUrlHandling/Umbraco/assets/fonts/lato/LatoLatin-Light.woff b/src/UmbracoUrlHandling/Umbraco/assets/fonts/lato/LatoLatin-Light.woff new file mode 100644 index 0000000..e7d4278 Binary files /dev/null and b/src/UmbracoUrlHandling/Umbraco/assets/fonts/lato/LatoLatin-Light.woff differ diff --git a/src/UmbracoUrlHandling/Umbraco/assets/fonts/lato/LatoLatin-Light.woff2 b/src/UmbracoUrlHandling/Umbraco/assets/fonts/lato/LatoLatin-Light.woff2 new file mode 100644 index 0000000..b6d0288 Binary files /dev/null and b/src/UmbracoUrlHandling/Umbraco/assets/fonts/lato/LatoLatin-Light.woff2 differ diff --git a/src/UmbracoUrlHandling/Umbraco/assets/fonts/lato/LatoLatin-LightItalic.eot b/src/UmbracoUrlHandling/Umbraco/assets/fonts/lato/LatoLatin-LightItalic.eot new file mode 100644 index 0000000..52ee50c Binary files /dev/null and b/src/UmbracoUrlHandling/Umbraco/assets/fonts/lato/LatoLatin-LightItalic.eot differ diff --git a/src/UmbracoUrlHandling/Umbraco/assets/fonts/lato/LatoLatin-LightItalic.ttf b/src/UmbracoUrlHandling/Umbraco/assets/fonts/lato/LatoLatin-LightItalic.ttf new file mode 100644 index 0000000..b881036 Binary files /dev/null and b/src/UmbracoUrlHandling/Umbraco/assets/fonts/lato/LatoLatin-LightItalic.ttf differ diff --git a/src/UmbracoUrlHandling/Umbraco/assets/fonts/lato/LatoLatin-LightItalic.woff b/src/UmbracoUrlHandling/Umbraco/assets/fonts/lato/LatoLatin-LightItalic.woff new file mode 100644 index 0000000..bb72fd2 Binary files /dev/null and b/src/UmbracoUrlHandling/Umbraco/assets/fonts/lato/LatoLatin-LightItalic.woff differ diff --git a/src/UmbracoUrlHandling/Umbraco/assets/fonts/lato/LatoLatin-LightItalic.woff2 b/src/UmbracoUrlHandling/Umbraco/assets/fonts/lato/LatoLatin-LightItalic.woff2 new file mode 100644 index 0000000..fc21432 Binary files /dev/null and b/src/UmbracoUrlHandling/Umbraco/assets/fonts/lato/LatoLatin-LightItalic.woff2 differ diff --git a/src/UmbracoUrlHandling/Umbraco/assets/fonts/lato/LatoLatin-Regular.eot b/src/UmbracoUrlHandling/Umbraco/assets/fonts/lato/LatoLatin-Regular.eot new file mode 100644 index 0000000..96a9035 Binary files /dev/null and b/src/UmbracoUrlHandling/Umbraco/assets/fonts/lato/LatoLatin-Regular.eot differ diff --git a/src/UmbracoUrlHandling/Umbraco/assets/fonts/lato/LatoLatin-Regular.ttf b/src/UmbracoUrlHandling/Umbraco/assets/fonts/lato/LatoLatin-Regular.ttf new file mode 100644 index 0000000..bcc5778 Binary files /dev/null and b/src/UmbracoUrlHandling/Umbraco/assets/fonts/lato/LatoLatin-Regular.ttf differ diff --git a/src/UmbracoUrlHandling/Umbraco/assets/fonts/lato/LatoLatin-Regular.woff b/src/UmbracoUrlHandling/Umbraco/assets/fonts/lato/LatoLatin-Regular.woff new file mode 100644 index 0000000..bf73a6d Binary files /dev/null and b/src/UmbracoUrlHandling/Umbraco/assets/fonts/lato/LatoLatin-Regular.woff differ diff --git a/src/UmbracoUrlHandling/Umbraco/assets/fonts/lato/LatoLatin-Regular.woff2 b/src/UmbracoUrlHandling/Umbraco/assets/fonts/lato/LatoLatin-Regular.woff2 new file mode 100644 index 0000000..a4d084b Binary files /dev/null and b/src/UmbracoUrlHandling/Umbraco/assets/fonts/lato/LatoLatin-Regular.woff2 differ diff --git a/src/UmbracoUrlHandling/Umbraco/assets/fonts/opensans/OpenSans-Regular-webfont.eot b/src/UmbracoUrlHandling/Umbraco/assets/fonts/opensans/OpenSans-Regular-webfont.eot new file mode 100644 index 0000000..6bbc3cf Binary files /dev/null and b/src/UmbracoUrlHandling/Umbraco/assets/fonts/opensans/OpenSans-Regular-webfont.eot differ diff --git a/src/UmbracoUrlHandling/Umbraco/assets/fonts/opensans/OpenSans-Regular-webfont.svg b/src/UmbracoUrlHandling/Umbraco/assets/fonts/opensans/OpenSans-Regular-webfont.svg new file mode 100644 index 0000000..25a3952 --- /dev/null +++ b/src/UmbracoUrlHandling/Umbraco/assets/fonts/opensans/OpenSans-Regular-webfont.svg @@ -0,0 +1,1831 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/src/UmbracoUrlHandling/Umbraco/assets/fonts/opensans/OpenSans-Regular-webfont.ttf b/src/UmbracoUrlHandling/Umbraco/assets/fonts/opensans/OpenSans-Regular-webfont.ttf new file mode 100644 index 0000000..c537f83 Binary files /dev/null and b/src/UmbracoUrlHandling/Umbraco/assets/fonts/opensans/OpenSans-Regular-webfont.ttf differ diff --git a/src/UmbracoUrlHandling/Umbraco/assets/fonts/opensans/OpenSans-Regular-webfont.woff b/src/UmbracoUrlHandling/Umbraco/assets/fonts/opensans/OpenSans-Regular-webfont.woff new file mode 100644 index 0000000..e231183 Binary files /dev/null and b/src/UmbracoUrlHandling/Umbraco/assets/fonts/opensans/OpenSans-Regular-webfont.woff differ diff --git a/src/UmbracoUrlHandling/Umbraco/assets/fonts/opensans/OpenSans-Regular.ttf b/src/UmbracoUrlHandling/Umbraco/assets/fonts/opensans/OpenSans-Regular.ttf new file mode 100644 index 0000000..db43334 Binary files /dev/null and b/src/UmbracoUrlHandling/Umbraco/assets/fonts/opensans/OpenSans-Regular.ttf differ diff --git a/src/UmbracoUrlHandling/Umbraco/assets/fonts/opensans/OpenSans-Semibold-webfont.eot b/src/UmbracoUrlHandling/Umbraco/assets/fonts/opensans/OpenSans-Semibold-webfont.eot new file mode 100644 index 0000000..d8375dd Binary files /dev/null and b/src/UmbracoUrlHandling/Umbraco/assets/fonts/opensans/OpenSans-Semibold-webfont.eot differ diff --git a/src/UmbracoUrlHandling/Umbraco/assets/fonts/opensans/OpenSans-Semibold-webfont.svg b/src/UmbracoUrlHandling/Umbraco/assets/fonts/opensans/OpenSans-Semibold-webfont.svg new file mode 100644 index 0000000..eec4db8 --- /dev/null +++ b/src/UmbracoUrlHandling/Umbraco/assets/fonts/opensans/OpenSans-Semibold-webfont.svg @@ -0,0 +1,1830 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/src/UmbracoUrlHandling/Umbraco/assets/fonts/opensans/OpenSans-Semibold-webfont.ttf b/src/UmbracoUrlHandling/Umbraco/assets/fonts/opensans/OpenSans-Semibold-webfont.ttf new file mode 100644 index 0000000..b329084 Binary files /dev/null and b/src/UmbracoUrlHandling/Umbraco/assets/fonts/opensans/OpenSans-Semibold-webfont.ttf differ diff --git a/src/UmbracoUrlHandling/Umbraco/assets/fonts/opensans/OpenSans-Semibold-webfont.woff b/src/UmbracoUrlHandling/Umbraco/assets/fonts/opensans/OpenSans-Semibold-webfont.woff new file mode 100644 index 0000000..28d6ade Binary files /dev/null and b/src/UmbracoUrlHandling/Umbraco/assets/fonts/opensans/OpenSans-Semibold-webfont.woff differ diff --git a/src/UmbracoUrlHandling/Umbraco/assets/img/application/logo.png b/src/UmbracoUrlHandling/Umbraco/assets/img/application/logo.png new file mode 100644 index 0000000..2ddef4b Binary files /dev/null and b/src/UmbracoUrlHandling/Umbraco/assets/img/application/logo.png differ diff --git a/src/UmbracoUrlHandling/Umbraco/assets/img/application/logo@2x.png b/src/UmbracoUrlHandling/Umbraco/assets/img/application/logo@2x.png new file mode 100644 index 0000000..c57755d Binary files /dev/null and b/src/UmbracoUrlHandling/Umbraco/assets/img/application/logo@2x.png differ diff --git a/src/UmbracoUrlHandling/Umbraco/assets/img/application/logo@3x.png b/src/UmbracoUrlHandling/Umbraco/assets/img/application/logo@3x.png new file mode 100644 index 0000000..7ed68fb Binary files /dev/null and b/src/UmbracoUrlHandling/Umbraco/assets/img/application/logo@3x.png differ diff --git a/src/UmbracoUrlHandling/Umbraco/assets/img/application/logo_black.png b/src/UmbracoUrlHandling/Umbraco/assets/img/application/logo_black.png new file mode 100644 index 0000000..d3c6dc5 Binary files /dev/null and b/src/UmbracoUrlHandling/Umbraco/assets/img/application/logo_black.png differ diff --git a/src/UmbracoUrlHandling/Umbraco/assets/img/application/logo_white.png b/src/UmbracoUrlHandling/Umbraco/assets/img/application/logo_white.png new file mode 100644 index 0000000..72b2fe4 Binary files /dev/null and b/src/UmbracoUrlHandling/Umbraco/assets/img/application/logo_white.png differ diff --git a/src/UmbracoUrlHandling/Umbraco/assets/img/applicationIcons/content.png b/src/UmbracoUrlHandling/Umbraco/assets/img/applicationIcons/content.png new file mode 100644 index 0000000..d6a5f88 Binary files /dev/null and b/src/UmbracoUrlHandling/Umbraco/assets/img/applicationIcons/content.png differ diff --git a/src/UmbracoUrlHandling/Umbraco/assets/img/applicationIcons/default.png b/src/UmbracoUrlHandling/Umbraco/assets/img/applicationIcons/default.png new file mode 100644 index 0000000..23ee891 Binary files /dev/null and b/src/UmbracoUrlHandling/Umbraco/assets/img/applicationIcons/default.png differ diff --git a/src/UmbracoUrlHandling/Umbraco/assets/img/applicationIcons/developer.png b/src/UmbracoUrlHandling/Umbraco/assets/img/applicationIcons/developer.png new file mode 100644 index 0000000..4e1946c Binary files /dev/null and b/src/UmbracoUrlHandling/Umbraco/assets/img/applicationIcons/developer.png differ diff --git a/src/UmbracoUrlHandling/Umbraco/assets/img/applicationIcons/help.svg b/src/UmbracoUrlHandling/Umbraco/assets/img/applicationIcons/help.svg new file mode 100644 index 0000000..16edca4 --- /dev/null +++ b/src/UmbracoUrlHandling/Umbraco/assets/img/applicationIcons/help.svg @@ -0,0 +1,22 @@ + + + + + + + + + + + diff --git a/src/UmbracoUrlHandling/Umbraco/assets/img/applicationIcons/hlvticons-umbraco.svg b/src/UmbracoUrlHandling/Umbraco/assets/img/applicationIcons/hlvticons-umbraco.svg new file mode 100644 index 0000000..5025acd --- /dev/null +++ b/src/UmbracoUrlHandling/Umbraco/assets/img/applicationIcons/hlvticons-umbraco.svg @@ -0,0 +1,87 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/src/UmbracoUrlHandling/Umbraco/assets/img/applicationIcons/media.png b/src/UmbracoUrlHandling/Umbraco/assets/img/applicationIcons/media.png new file mode 100644 index 0000000..08ff39c Binary files /dev/null and b/src/UmbracoUrlHandling/Umbraco/assets/img/applicationIcons/media.png differ diff --git a/src/UmbracoUrlHandling/Umbraco/assets/img/applicationIcons/members.png b/src/UmbracoUrlHandling/Umbraco/assets/img/applicationIcons/members.png new file mode 100644 index 0000000..c2a5230 Binary files /dev/null and b/src/UmbracoUrlHandling/Umbraco/assets/img/applicationIcons/members.png differ diff --git a/src/UmbracoUrlHandling/Umbraco/assets/img/applicationIcons/search.png b/src/UmbracoUrlHandling/Umbraco/assets/img/applicationIcons/search.png new file mode 100644 index 0000000..0ea4b3b Binary files /dev/null and b/src/UmbracoUrlHandling/Umbraco/assets/img/applicationIcons/search.png differ diff --git a/src/UmbracoUrlHandling/Umbraco/assets/img/applicationIcons/settings.png b/src/UmbracoUrlHandling/Umbraco/assets/img/applicationIcons/settings.png new file mode 100644 index 0000000..1533056 Binary files /dev/null and b/src/UmbracoUrlHandling/Umbraco/assets/img/applicationIcons/settings.png differ diff --git a/src/UmbracoUrlHandling/Umbraco/assets/img/applicationIcons/tree-arrow.png b/src/UmbracoUrlHandling/Umbraco/assets/img/applicationIcons/tree-arrow.png new file mode 100644 index 0000000..ccc0397 Binary files /dev/null and b/src/UmbracoUrlHandling/Umbraco/assets/img/applicationIcons/tree-arrow.png differ diff --git a/src/UmbracoUrlHandling/Umbraco/assets/img/applicationIcons/users.png b/src/UmbracoUrlHandling/Umbraco/assets/img/applicationIcons/users.png new file mode 100644 index 0000000..7d40515 Binary files /dev/null and b/src/UmbracoUrlHandling/Umbraco/assets/img/applicationIcons/users.png differ diff --git a/src/UmbracoUrlHandling/Umbraco/assets/img/checkered-background-20.png b/src/UmbracoUrlHandling/Umbraco/assets/img/checkered-background-20.png new file mode 100644 index 0000000..eb0ca08 Binary files /dev/null and b/src/UmbracoUrlHandling/Umbraco/assets/img/checkered-background-20.png differ diff --git a/src/UmbracoUrlHandling/Umbraco/assets/img/checkered-background.png b/src/UmbracoUrlHandling/Umbraco/assets/img/checkered-background.png new file mode 100644 index 0000000..c6c66da Binary files /dev/null and b/src/UmbracoUrlHandling/Umbraco/assets/img/checkered-background.png differ diff --git a/src/UmbracoUrlHandling/Umbraco/assets/img/forms/installer-background.png b/src/UmbracoUrlHandling/Umbraco/assets/img/forms/installer-background.png new file mode 100644 index 0000000..87c9ee8 Binary files /dev/null and b/src/UmbracoUrlHandling/Umbraco/assets/img/forms/installer-background.png differ diff --git a/src/UmbracoUrlHandling/Umbraco/assets/img/installer.jpg b/src/UmbracoUrlHandling/Umbraco/assets/img/installer.jpg new file mode 100644 index 0000000..def9226 Binary files /dev/null and b/src/UmbracoUrlHandling/Umbraco/assets/img/installer.jpg differ diff --git a/src/UmbracoUrlHandling/Umbraco/assets/img/loader.gif b/src/UmbracoUrlHandling/Umbraco/assets/img/loader.gif new file mode 100644 index 0000000..bf2875b Binary files /dev/null and b/src/UmbracoUrlHandling/Umbraco/assets/img/loader.gif differ diff --git a/src/UmbracoUrlHandling/Umbraco/assets/img/logo.png b/src/UmbracoUrlHandling/Umbraco/assets/img/logo.png new file mode 100644 index 0000000..ec59683 Binary files /dev/null and b/src/UmbracoUrlHandling/Umbraco/assets/img/logo.png differ diff --git a/src/UmbracoUrlHandling/Umbraco/assets/img/nonodesbg.jpg b/src/UmbracoUrlHandling/Umbraco/assets/img/nonodesbg.jpg new file mode 100644 index 0000000..61e1803 Binary files /dev/null and b/src/UmbracoUrlHandling/Umbraco/assets/img/nonodesbg.jpg differ diff --git a/src/UmbracoUrlHandling/Umbraco/assets/img/transparent.png b/src/UmbracoUrlHandling/Umbraco/assets/img/transparent.png new file mode 100644 index 0000000..ec8b019 Binary files /dev/null and b/src/UmbracoUrlHandling/Umbraco/assets/img/transparent.png differ diff --git a/src/UmbracoUrlHandling/Umbraco/assets/img/uploader/upload-illustration.png b/src/UmbracoUrlHandling/Umbraco/assets/img/uploader/upload-illustration.png new file mode 100644 index 0000000..0a6f8d1 Binary files /dev/null and b/src/UmbracoUrlHandling/Umbraco/assets/img/uploader/upload-illustration.png differ diff --git a/src/UmbracoUrlHandling/Umbraco/assets/img/uploader/upload-illustration.svg b/src/UmbracoUrlHandling/Umbraco/assets/img/uploader/upload-illustration.svg new file mode 100644 index 0000000..30bce45 --- /dev/null +++ b/src/UmbracoUrlHandling/Umbraco/assets/img/uploader/upload-illustration.svg @@ -0,0 +1,22 @@ + + + + + + + + + + + + + + + + + + diff --git a/src/UmbracoUrlHandling/Umbraco/assets/less/background.less b/src/UmbracoUrlHandling/Umbraco/assets/less/background.less new file mode 100644 index 0000000..8506229 --- /dev/null +++ b/src/UmbracoUrlHandling/Umbraco/assets/less/background.less @@ -0,0 +1,25 @@ + +/************************************************************************/ +/* background -ALIAS- */ +/************************************************************************/ + +/***start-lessParam--ALIAS-***/ +@imageorpattern-ALIAS-:''; +@color-ALIAS-:''; +/***end-lessParam--ALIAS-***/ + +/***start-gridStyle--ALIAS-***/ +-SCHEMA- { + background-image: @imageorpattern-ALIAS- !important; + background-position: center; + background-repeat: no-repeat; + background-attachment: fixed; + -webkit-background-size: cover; + -moz-background-size: cover; + -o-background-size: cover; + background-size: cover; + background:@color-ALIAS- !important; +} +/***end-gridStyle--ALIAS-***/ + + diff --git a/src/UmbracoUrlHandling/Umbraco/assets/less/border.less b/src/UmbracoUrlHandling/Umbraco/assets/less/border.less new file mode 100644 index 0000000..0901e4e --- /dev/null +++ b/src/UmbracoUrlHandling/Umbraco/assets/less/border.less @@ -0,0 +1,70 @@ + +/************************************************************************/ +/* border -ALIAS- */ +/************************************************************************/ + +/***start-lessParam--ALIAS-***/ +@bordersize-ALIAS-:''; +@bordercolor-ALIAS-:''; +@bordertype-ALIAS-:solid; + +@leftbordersize-ALIAS-:''; +@leftbordercolor-ALIAS-:''; +@leftbordertype-ALIAS-:solid; + +@rightbordersize-ALIAS-:''; +@rightbordercolor-ALIAS-:''; +@rightbordertype-ALIAS-:solid; + +@topbordersize-ALIAS-:''; +@topbordercolor-ALIAS-:''; +@topbordertype-ALIAS-:solid; + +@bottombordersize-ALIAS-:''; +@bottombordercolor-ALIAS-:''; +@bottombordertype-ALIAS-:solid; + +/***end-lessParam--ALIAS-***/ + +/***start-lessStyle--ALIAS-***/ + +.all-ALIAS- () when (isnumber(@bordersize-ALIAS-)) { + border: @bordersize-ALIAS- + 0px; + border-color:@bordercolor-ALIAS-; + border-style:@bordertype-ALIAS-; +} + +.left-ALIAS- () when (isnumber(@leftbordersize-ALIAS-)) { + border-left: @leftbordersize-ALIAS- + 0px; + border-left-color:@leftbordercolor-ALIAS-; + border-left-style:@leftbordertype-ALIAS-; +} + +.right-ALIAS- () when (isnumber(@rightbordersize-ALIAS-)) { + border-right: @rightbordersize-ALIAS- + 0px; + border-right-color:@rightbordercolor-ALIAS-; + border-right-style:@rightbordertype-ALIAS-; +} + +.top-ALIAS- () when (isnumber(@topbordersize-ALIAS-)) { + border-top: @topbordersize-ALIAS- + 0px; + border-top-color:@topbordercolor-ALIAS-; + border-top-style:@topbordertype-ALIAS-; +} + +.bottom-ALIAS- () when (isnumber(@bottombordersize-ALIAS-)) { + border-bottom: @bottombordersize-ALIAS- + 0px; + border-bottom-color:@bottombordercolor-ALIAS-; + border-bottom-style:@bottombordertype-ALIAS-; +} + +-SCHEMA- { + .all-ALIAS-; + .left-ALIAS-; + .right-ALIAS-; + .top-ALIAS-; + .bottom-ALIAS-; +} +/***end-lessStyle--ALIAS-***/ + + diff --git a/src/UmbracoUrlHandling/Umbraco/assets/less/color.less b/src/UmbracoUrlHandling/Umbraco/assets/less/color.less new file mode 100644 index 0000000..efa2438 --- /dev/null +++ b/src/UmbracoUrlHandling/Umbraco/assets/less/color.less @@ -0,0 +1,14 @@ + +/************************************************************************/ +/* color -ALIAS- -CSS- */ +/************************************************************************/ + +/***start-lessParam--ALIAS-***/ +@color-ALIAS-:''; +/***end-lessParam--ALIAS-***/ + +/***start-lessStyle--ALIAS-***/ +-SCHEMA- { + -CSS-:@color-ALIAS-; +} +/***end-lessStyle--ALIAS-***/ \ No newline at end of file diff --git a/src/UmbracoUrlHandling/Umbraco/assets/less/googlefontpicker.less b/src/UmbracoUrlHandling/Umbraco/assets/less/googlefontpicker.less new file mode 100644 index 0000000..5fb99d8 --- /dev/null +++ b/src/UmbracoUrlHandling/Umbraco/assets/less/googlefontpicker.less @@ -0,0 +1,34 @@ + +/************************************************************************/ +/* font family -ALIAS- */ +/************************************************************************/ + +/***start-lessParam--ALIAS-***/ +@fontfamily-ALIAS-:''; +@fontweight-ALIAS-:''; +@fontstyle-ALIAS-:''; +@fonttype-ALIAS-:''; +/***end-lessParam--ALIAS-***/ + +/***start-fontfamilystyle--ALIAS-***/ + +.fontfamily-ALIAS- () when not (@fontfamily-ALIAS- = '') { + font-family:@fontfamily-ALIAS-; +} + +.fontweight-ALIAS- () when not (@fontweight-ALIAS- = '') { + font-weight:@fontweight-ALIAS-; +} + +.fontstyle-ALIAS- () when not (@fontstyle-ALIAS- = '') { + font-style:@fontstyle-ALIAS-; +} + +-SCHEMA- { + .fontfamily-ALIAS-; + .fontweight-ALIAS-; + .fontstyle-ALIAS-; +} +/***end-fontfamilystyle--ALIAS-***/ + + \ No newline at end of file diff --git a/src/UmbracoUrlHandling/Umbraco/assets/less/gridRow.less b/src/UmbracoUrlHandling/Umbraco/assets/less/gridRow.less new file mode 100644 index 0000000..93a3b6e --- /dev/null +++ b/src/UmbracoUrlHandling/Umbraco/assets/less/gridRow.less @@ -0,0 +1,40 @@ + +/************************************************************************/ +/* grid row -ALIAS- */ +/************************************************************************/ + +/***start-lessParam--ALIAS-***/ +@fullsize-ALIAS-:false; +/***end-lessParam--ALIAS-***/ + +/***start-gridStyle--ALIAS-***/ + +.fullusky-container-ALIAS- () when (@fullsize-ALIAS- = true) { + width:100%; +} + +.fullusky-grid-cell-ALIAS- () when (@fullsize-ALIAS- = true) { + margin-top: 0px; + margin-bottom: 0px; +} + +.fullcolumn-ALIAS- () when (@fullsize-ALIAS- = true) { + padding-right: 0px; + padding-left: 0px; +} + +-SCHEMA- .container { + .fullusky-container-ALIAS- +} + +-SCHEMA- .usky-grid-cell { + .fullusky-grid-cell-ALIAS- +} + +-SCHEMA- .column { + .fullcolumn-ALIAS- +} + +/***end-gridStyle--ALIAS-***/ + + diff --git a/src/UmbracoUrlHandling/Umbraco/assets/less/layout.less b/src/UmbracoUrlHandling/Umbraco/assets/less/layout.less new file mode 100644 index 0000000..7cc10da --- /dev/null +++ b/src/UmbracoUrlHandling/Umbraco/assets/less/layout.less @@ -0,0 +1,96 @@ + +/************************************************************************/ +/* wide -ALIAS- -CSS- */ +/************************************************************************/ + +/***start-lessParam--ALIAS-***/ +@layout-ALIAS-:''; +/***end-lessParam--ALIAS-***/ + +/***start-lessStyle--ALIAS-***/ + +.box1200-ALIAS- () when (@layout-ALIAS- = box) { + width: 1140px; +} + +.box992-ALIAS- () when (@layout-ALIAS- = box) { + width: 940px; +} + +.box768-ALIAS- () when (@layout-ALIAS- = box) { + width: 720px; +} + +.boxFull-ALIAS- () when (@layout-ALIAS- = box) { + width: 100%; +} + +.wide1200-ALIAS- () when (@layout-ALIAS- = wide) { + width: 1140px; +} + +.wide992-ALIAS- () when (@layout-ALIAS- = wide) { + width: 940px; +} + +.wide768-ALIAS- () when (@layout-ALIAS- = wide) { + width: 720px; +} + +.wideFull-ALIAS- () when (@layout-ALIAS- = wide) { + width: 100% !important; +} + +.fullFull-ALIAS- () when (@layout-ALIAS- = full) { + width: 100%; +} + +@media (min-width: 768px) { + -SCHEMACONTAINER- { + .wide768-ALIAS-; + .boxFull-ALIAS-; + .fullFull-ALIAS-; + } +} + +@media (min-width: 992px) { + -SCHEMACONTAINER- { + .wide992-ALIAS-; + .boxFull-ALIAS-; + .fullFull-ALIAS-; + } +} + +@media (min-width: 1200px) { + -SCHEMACONTAINER- { + .wide1200-ALIAS-; + .boxFull-ALIAS-; + .fullFull-ALIAS-; + } +} + +@media (min-width: 768px) { + -SCHEMA- { + .box768-ALIAS-; + .wideFull-ALIAS-; + .fullFull-ALIAS-; + } +} + +@media (min-width: 992px) { + -SCHEMA- { + .box992-ALIAS-; + .wideFull-ALIAS-; + .fullFull-ALIAS-; + } +} + +@media (min-width: 1200px) { + -SCHEMA- { + .box1200-ALIAS-; + .wideFull-ALIAS-; + .fullFull-ALIAS-; + } +} + +/***end-lessStyle--ALIAS-***/ \ No newline at end of file diff --git a/src/UmbracoUrlHandling/Umbraco/assets/less/margin.less b/src/UmbracoUrlHandling/Umbraco/assets/less/margin.less new file mode 100644 index 0000000..2f1c0de --- /dev/null +++ b/src/UmbracoUrlHandling/Umbraco/assets/less/margin.less @@ -0,0 +1,45 @@ + +/************************************************************************/ +/* margin -ALIAS- */ +/************************************************************************/ + +/***start-lessParam--ALIAS-***/ +@marginvalue-ALIAS-:''; +@leftmarginvalue-ALIAS-:''; +@rightmarginvalue-ALIAS-:''; +@topmarginvalue-ALIAS-:''; +@bottommarginvalue-ALIAS-:''; +/***end-lessParam--ALIAS-***/ + +/***start-lessStyle--ALIAS-***/ + +.all-ALIAS- () when (isnumber(@marginvalue-ALIAS-)) { + margin: @marginvalue-ALIAS- + 0px; +} + +.left-ALIAS- () when (isnumber(@leftmarginvalue-ALIAS-)) { + margin-left: @leftmarginvalue-ALIAS- + 0px; +} + +.right-ALIAS- () when (isnumber(@rightmarginvalue-ALIAS-)) { + margin-right: @rightmarginvalue-ALIAS- + 0px; +} + +.top-ALIAS- () when (isnumber(@topmarginvalue-ALIAS-)) { + margin-top: @topmarginvalue-ALIAS- + 0px; +} + +.bottom-ALIAS- () when (isnumber(@bottommarginvalue-ALIAS-)) { + margin-bottom: @bottommarginvalue-ALIAS- + 0px; +} + +-SCHEMA- { + .all-ALIAS-; + .left-ALIAS-; + .right-ALIAS-; + .top-ALIAS-; + .bottom-ALIAS-; +} +/***end-lessStyle--ALIAS-***/ + + diff --git a/src/UmbracoUrlHandling/Umbraco/assets/less/padding.less b/src/UmbracoUrlHandling/Umbraco/assets/less/padding.less new file mode 100644 index 0000000..66c5c30 --- /dev/null +++ b/src/UmbracoUrlHandling/Umbraco/assets/less/padding.less @@ -0,0 +1,45 @@ + +/************************************************************************/ +/* padding -ALIAS- */ +/************************************************************************/ + +/***start-lessParam--ALIAS-***/ +@paddingvalue-ALIAS-:''; +@leftpaddingvalue-ALIAS-:''; +@rightpaddingvalue-ALIAS-:''; +@toppaddingvalue-ALIAS-:''; +@bottompaddingvalue-ALIAS-:''; +/***end-lessParam--ALIAS-***/ + +/***start-lessStyle--ALIAS-***/ + +.all-ALIAS- () when (isnumber(@paddingvalue-ALIAS-)) { + padding: @paddingvalue-ALIAS- + 0px; +} + +.left-ALIAS- () when (isnumber(@leftpaddingvalue-ALIAS-)) { + padding-left: @leftpaddingvalue-ALIAS- + 0px; +} + +.right-ALIAS- () when (isnumber(@rightpaddingvalue-ALIAS-)) { + padding-right: @rightpaddingvalue-ALIAS- + 0px; +} + +.top-ALIAS- () when (isnumber(@toppaddingvalue-ALIAS-)) { + padding-top: @toppaddingvalue-ALIAS- + 0px; +} + +.bottom-ALIAS- () when (isnumber(@bottompaddingvalue-ALIAS-)) { + padding-bottom: @bottompaddingvalue-ALIAS- + 0px; +} + +-SCHEMA- { + .all-ALIAS-; + .left-ALIAS-; + .right-ALIAS-; + .top-ALIAS-; + .bottom-ALIAS-; +} +/***end-lessStyle--ALIAS-***/ + + diff --git a/src/UmbracoUrlHandling/Umbraco/assets/less/radius.less b/src/UmbracoUrlHandling/Umbraco/assets/less/radius.less new file mode 100644 index 0000000..a4ca1e3 --- /dev/null +++ b/src/UmbracoUrlHandling/Umbraco/assets/less/radius.less @@ -0,0 +1,65 @@ + +/************************************************************************/ +/* radius -ALIAS- */ +/************************************************************************/ + +/***start-lessParam--ALIAS-***/ +@radiusvalue-ALIAS-:''; +@topleftradiusvalue-ALIAS-:''; +@toprightradiusvalue-ALIAS-:''; +@bottomleftradiusvalue-ALIAS-:''; +@bottomrightradiusvalue-ALIAS-:''; + + +/***end-lessParam--ALIAS-***/ + +/***start-lessStyle--ALIAS-***/ + +.allzero-ALIAS- () when (isnumber(@radiusvalue-ALIAS-)) { + -webkit-border-radius: @radiusvalue-ALIAS- + 0px; + -moz-border-radius: @radiusvalue-ALIAS- + 0px; + border-radius: @radiusvalue-ALIAS- + 0px; +} + +.all-ALIAS- () when (isnumber(@radiusvalue-ALIAS-)) and (@radiusvalue-ALIAS- > 0) { + -webkit-border-radius: @radiusvalue-ALIAS- + 0px; + -moz-border-radius: @radiusvalue-ALIAS- + 0px; + border-radius: @radiusvalue-ALIAS- + 0px; +} + +.topleft-ALIAS- () when (isnumber(@topleftradiusvalue-ALIAS-)) { + -webkit-border-top-left-radius: @topleftradiusvalue-ALIAS- + 0px; + -moz-border-radius-topleft: @topleftradiusvalue-ALIAS- + 0px; + border-top-left-radius: @topleftradiusvalue-ALIAS- + 0px; +} + +.topright-ALIAS- () when (isnumber(@toprightradiusvalue-ALIAS-)) { + -webkit-border-top-right-radius: @toprightradiusvalue-ALIAS- + 0px; + -moz-border-radius-topright: @toprightradiusvalue-ALIAS- + 0px; + border-top-right-radius: @toprightradiusvalue-ALIAS- + 0px; +} + +.bottomleft-ALIAS- () when (isnumber(@bottomleftradiusvalue-ALIAS-)) { + -webkit-border-bottom-left-radius: @bottomleftradiusvalue-ALIAS- + 0px; + -moz-border-radius-bottomleft: @bottomleftradiusvalue-ALIAS- + 0px; + border-bottom-left-radius: @bottomleftradiusvalue-ALIAS- + 0px; +} + +.bottomright-ALIAS- () when (isnumber(@bottomrightradiusvalue-ALIAS-)) { + -webkit-border-bottom-right-radius: @bottomrightradiusvalue-ALIAS- + 0px; + -moz-border-radius-bottomright: @bottomrightradiusvalue-ALIAS- + 0px; + border-bottom-right-radius: @bottomrightradiusvalue-ALIAS- + 0px; +} + + +-SCHEMA- { + .allzero-ALIAS-; + .topleft-ALIAS-; + .topright-ALIAS-; + .bottomleft-ALIAS-; + .bottomright-ALIAS-; + .all-ALIAS-; +} +/***end-lessStyle--ALIAS-***/ + + diff --git a/src/UmbracoUrlHandling/Umbraco/assets/less/shadow.less b/src/UmbracoUrlHandling/Umbraco/assets/less/shadow.less new file mode 100644 index 0000000..e131911 --- /dev/null +++ b/src/UmbracoUrlHandling/Umbraco/assets/less/shadow.less @@ -0,0 +1,21 @@ + +/************************************************************************/ +/* shadow -ALIAS- -CSS- */ +/************************************************************************/ + +/***start-lessParam--ALIAS-***/ +@shadow-ALIAS-:''; +/***end-lessParam--ALIAS-***/ + +/***start-lessStyle--ALIAS-***/ + +.valueshadow-ALIAS- () when (isnumber(@shadow-ALIAS-)) { + -webkit-box-shadow: 0 0 @shadow-ALIAS- + 0px rgba(0, 0, 0, 0.5); + -moz-box-shadow: 0 0 @shadow-ALIAS- + 0px rgba(0, 0, 0, 0.5); + box-shadow: 0 0 @shadow-ALIAS- + 0px rgba(0, 0, 0, 0.5); +} + +-SCHEMA- { + .valueshadow-ALIAS- +} +/***end-lessStyle--ALIAS-***/ \ No newline at end of file diff --git a/src/UmbracoUrlHandling/Umbraco/assets/less/slider.less b/src/UmbracoUrlHandling/Umbraco/assets/less/slider.less new file mode 100644 index 0000000..664b105 --- /dev/null +++ b/src/UmbracoUrlHandling/Umbraco/assets/less/slider.less @@ -0,0 +1,19 @@ + +/************************************************************************/ +/* slider -ALIAS- -CSS- */ +/************************************************************************/ + +/***start-lessParam--ALIAS-***/ +@slider-ALIAS-:''; +/***end-lessParam--ALIAS-***/ + +/***start-lessStyle--ALIAS-***/ + +.valueslider-ALIAS- () when (isnumber(@slider-ALIAS-)) { + -CSS-:@slider-ALIAS- + 0px; +} + +-SCHEMA- { + .valueslider-ALIAS- +} +/***end-lessStyle--ALIAS-***/ \ No newline at end of file diff --git a/src/UmbracoUrlHandling/Umbraco/create.aspx b/src/UmbracoUrlHandling/Umbraco/create.aspx new file mode 100644 index 0000000..3ba09bb --- /dev/null +++ b/src/UmbracoUrlHandling/Umbraco/create.aspx @@ -0,0 +1,43 @@ +<%@ Page Language="c#" MasterPageFile="masterpages/umbracoDialog.Master" Codebehind="CreateDialog.aspx.cs" AutoEventWireup="True" Inherits="Umbraco.Web.UI.Umbraco.CreateDialog" %> +<%@ Register Namespace="umbraco" TagPrefix="umb" Assembly="umbraco" %> + + + + + + + + + +
+

+ The current user does not have access to create this type of object +

+
+
+
+ + + + \ No newline at end of file diff --git a/src/UmbracoUrlHandling/Umbraco/endPreview.aspx b/src/UmbracoUrlHandling/Umbraco/endPreview.aspx new file mode 100644 index 0000000..d90c1ae --- /dev/null +++ b/src/UmbracoUrlHandling/Umbraco/endPreview.aspx @@ -0,0 +1,25 @@ +<%@ Page Language="C#" AutoEventWireup="true" Inherits="System.Web.UI.Page" %> + + \ No newline at end of file diff --git a/src/UmbracoUrlHandling/Umbraco/helpRedirect.aspx b/src/UmbracoUrlHandling/Umbraco/helpRedirect.aspx new file mode 100644 index 0000000..97f27e4 --- /dev/null +++ b/src/UmbracoUrlHandling/Umbraco/helpRedirect.aspx @@ -0,0 +1,12 @@ +<%@ Page Language="C#" AutoEventWireup="true" CodeBehind="helpRedirect.aspx.cs" Inherits="umbraco.presentation.umbraco.helpRedirect" %> + + + + + + + + + Redirecting to help ... + + diff --git a/src/UmbracoUrlHandling/Umbraco/installer.html b/src/UmbracoUrlHandling/Umbraco/installer.html new file mode 100644 index 0000000..70073a2 --- /dev/null +++ b/src/UmbracoUrlHandling/Umbraco/installer.html @@ -0,0 +1,24 @@ + + + + + + + + Install Umbraco + + + + + + + +
+
+
+ +
+ + + + diff --git a/src/UmbracoUrlHandling/Umbraco/lib/ace-builds/src-min-noconflict/ace.js b/src/UmbracoUrlHandling/Umbraco/lib/ace-builds/src-min-noconflict/ace.js new file mode 100644 index 0000000..0d70ea5 --- /dev/null +++ b/src/UmbracoUrlHandling/Umbraco/lib/ace-builds/src-min-noconflict/ace.js @@ -0,0 +1,14 @@ +(function(){function o(n){var i=e;n&&(e[n]||(e[n]={}),i=e[n]);if(!i.define||!i.define.packaged)t.original=i.define,i.define=t,i.define.packaged=!0;if(!i.require||!i.require.packaged)r.original=i.require,i.require=r,i.require.packaged=!0}var ACE_NAMESPACE = "ace",e=function(){return this}();!e&&typeof window!="undefined"&&(e=window);if(!ACE_NAMESPACE&&typeof requirejs!="undefined")return;var t=function(e,n,r){if(typeof e!="string"){t.original?t.original.apply(this,arguments):(console.error("dropping module because define wasn't a string."),console.trace());return}arguments.length==2&&(r=n),t.modules[e]||(t.payloads[e]=r,t.modules[e]=null)};t.modules={},t.payloads={};var n=function(e,t,n){if(typeof t=="string"){var i=s(e,t);if(i!=undefined)return n&&n(),i}else if(Object.prototype.toString.call(t)==="[object Array]"){var o=[];for(var u=0,a=t.length;u1&&u(t,"")>-1&&(a=RegExp(this.source,r.replace.call(o(this),"g","")),r.replace.call(e.slice(t.index),a,function(){for(var e=1;et.index&&this.lastIndex--}return t},s||(RegExp.prototype.test=function(e){var t=r.exec.call(this,e);return t&&this.global&&!t[0].length&&this.lastIndex>t.index&&this.lastIndex--,!!t})}),ace.define("ace/lib/es5-shim",["require","exports","module"],function(e,t,n){function r(){}function w(e){try{return Object.defineProperty(e,"sentinel",{}),"sentinel"in e}catch(t){}}function H(e){return e=+e,e!==e?e=0:e!==0&&e!==1/0&&e!==-1/0&&(e=(e>0||-1)*Math.floor(Math.abs(e))),e}function B(e){var t=typeof e;return e===null||t==="undefined"||t==="boolean"||t==="number"||t==="string"}function j(e){var t,n,r;if(B(e))return e;n=e.valueOf;if(typeof n=="function"){t=n.call(e);if(B(t))return t}r=e.toString;if(typeof r=="function"){t=r.call(e);if(B(t))return t}throw new TypeError}Function.prototype.bind||(Function.prototype.bind=function(t){var n=this;if(typeof n!="function")throw new TypeError("Function.prototype.bind called on incompatible "+n);var i=u.call(arguments,1),s=function(){if(this instanceof s){var e=n.apply(this,i.concat(u.call(arguments)));return Object(e)===e?e:this}return n.apply(t,i.concat(u.call(arguments)))};return n.prototype&&(r.prototype=n.prototype,s.prototype=new r,r.prototype=null),s});var i=Function.prototype.call,s=Array.prototype,o=Object.prototype,u=s.slice,a=i.bind(o.toString),f=i.bind(o.hasOwnProperty),l,c,h,p,d;if(d=f(o,"__defineGetter__"))l=i.bind(o.__defineGetter__),c=i.bind(o.__defineSetter__),h=i.bind(o.__lookupGetter__),p=i.bind(o.__lookupSetter__);if([1,2].splice(0).length!=2)if(!function(){function e(e){var t=new Array(e+2);return t[0]=t[1]=0,t}var t=[],n;t.splice.apply(t,e(20)),t.splice.apply(t,e(26)),n=t.length,t.splice(5,0,"XXX"),n+1==t.length;if(n+1==t.length)return!0}())Array.prototype.splice=function(e,t){var n=this.length;e>0?e>n&&(e=n):e==void 0?e=0:e<0&&(e=Math.max(n+e,0)),e+ta)for(h=l;h--;)this[f+h]=this[a+h];if(s&&e===c)this.length=c,this.push.apply(this,i);else{this.length=c+s;for(h=0;h>>0;if(a(t)!="[object Function]")throw new TypeError;while(++s>>0,s=Array(i),o=arguments[1];if(a(t)!="[object Function]")throw new TypeError(t+" is not a function");for(var u=0;u>>0,s=[],o,u=arguments[1];if(a(t)!="[object Function]")throw new TypeError(t+" is not a function");for(var f=0;f>>0,s=arguments[1];if(a(t)!="[object Function]")throw new TypeError(t+" is not a function");for(var o=0;o>>0,s=arguments[1];if(a(t)!="[object Function]")throw new TypeError(t+" is not a function");for(var o=0;o>>0;if(a(t)!="[object Function]")throw new TypeError(t+" is not a function");if(!i&&arguments.length==1)throw new TypeError("reduce of empty array with no initial value");var s=0,o;if(arguments.length>=2)o=arguments[1];else do{if(s in r){o=r[s++];break}if(++s>=i)throw new TypeError("reduce of empty array with no initial value")}while(!0);for(;s>>0;if(a(t)!="[object Function]")throw new TypeError(t+" is not a function");if(!i&&arguments.length==1)throw new TypeError("reduceRight of empty array with no initial value");var s,o=i-1;if(arguments.length>=2)s=arguments[1];else do{if(o in r){s=r[o--];break}if(--o<0)throw new TypeError("reduceRight of empty array with no initial value")}while(!0);do o in this&&(s=t.call(void 0,s,r[o],o,n));while(o--);return s});if(!Array.prototype.indexOf||[0,1].indexOf(1,2)!=-1)Array.prototype.indexOf=function(t){var n=g&&a(this)=="[object String]"?this.split(""):F(this),r=n.length>>>0;if(!r)return-1;var i=0;arguments.length>1&&(i=H(arguments[1])),i=i>=0?i:Math.max(0,r+i);for(;i>>0;if(!r)return-1;var i=r-1;arguments.length>1&&(i=Math.min(i,H(arguments[1]))),i=i>=0?i:r-Math.abs(i);for(;i>=0;i--)if(i in n&&t===n[i])return i;return-1};Object.getPrototypeOf||(Object.getPrototypeOf=function(t){return t.__proto__||(t.constructor?t.constructor.prototype:o)});if(!Object.getOwnPropertyDescriptor){var y="Object.getOwnPropertyDescriptor called on a non-object: ";Object.getOwnPropertyDescriptor=function(t,n){if(typeof t!="object"&&typeof t!="function"||t===null)throw new TypeError(y+t);if(!f(t,n))return;var r,i,s;r={enumerable:!0,configurable:!0};if(d){var u=t.__proto__;t.__proto__=o;var i=h(t,n),s=p(t,n);t.__proto__=u;if(i||s)return i&&(r.get=i),s&&(r.set=s),r}return r.value=t[n],r}}Object.getOwnPropertyNames||(Object.getOwnPropertyNames=function(t){return Object.keys(t)});if(!Object.create){var b;Object.prototype.__proto__===null?b=function(){return{__proto__:null}}:b=function(){var e={};for(var t in e)e[t]=null;return e.constructor=e.hasOwnProperty=e.propertyIsEnumerable=e.isPrototypeOf=e.toLocaleString=e.toString=e.valueOf=e.__proto__=null,e},Object.create=function(t,n){var r;if(t===null)r=b();else{if(typeof t!="object")throw new TypeError("typeof prototype["+typeof t+"] != 'object'");var i=function(){};i.prototype=t,r=new i,r.__proto__=t}return n!==void 0&&Object.defineProperties(r,n),r}}if(Object.defineProperty){var E=w({}),S=typeof document=="undefined"||w(document.createElement("div"));if(!E||!S)var x=Object.defineProperty}if(!Object.defineProperty||x){var T="Property description must be an object: ",N="Object.defineProperty called on non-object: ",C="getters & setters can not be defined on this javascript engine";Object.defineProperty=function(t,n,r){if(typeof t!="object"&&typeof t!="function"||t===null)throw new TypeError(N+t);if(typeof r!="object"&&typeof r!="function"||r===null)throw new TypeError(T+r);if(x)try{return x.call(Object,t,n,r)}catch(i){}if(f(r,"value"))if(d&&(h(t,n)||p(t,n))){var s=t.__proto__;t.__proto__=o,delete t[n],t[n]=r.value,t.__proto__=s}else t[n]=r.value;else{if(!d)throw new TypeError(C);f(r,"get")&&l(t,n,r.get),f(r,"set")&&c(t,n,r.set)}return t}}Object.defineProperties||(Object.defineProperties=function(t,n){for(var r in n)f(n,r)&&Object.defineProperty(t,r,n[r]);return t}),Object.seal||(Object.seal=function(t){return t}),Object.freeze||(Object.freeze=function(t){return t});try{Object.freeze(function(){})}catch(k){Object.freeze=function(t){return function(n){return typeof n=="function"?n:t(n)}}(Object.freeze)}Object.preventExtensions||(Object.preventExtensions=function(t){return t}),Object.isSealed||(Object.isSealed=function(t){return!1}),Object.isFrozen||(Object.isFrozen=function(t){return!1}),Object.isExtensible||(Object.isExtensible=function(t){if(Object(t)===t)throw new TypeError;var n="";while(f(t,n))n+="?";t[n]=!0;var r=f(t,n);return delete t[n],r});if(!Object.keys){var L=!0,A=["toString","toLocaleString","valueOf","hasOwnProperty","isPrototypeOf","propertyIsEnumerable","constructor"],O=A.length;for(var M in{toString:null})L=!1;Object.keys=function I(e){if(typeof e!="object"&&typeof e!="function"||e===null)throw new TypeError("Object.keys called on a non-object");var I=[];for(var t in e)f(e,t)&&I.push(t);if(L)for(var n=0,r=O;n=0?parseFloat((i.match(/(?:MSIE |Trident\/[0-9]+[\.0-9]+;.*rv:)([0-9]+[\.0-9]+)/)||[])[1]):parseFloat((i.match(/(?:Trident\/[0-9]+[\.0-9]+;.*rv:)([0-9]+[\.0-9]+)/)||[])[1]),t.isOldIE=t.isIE&&t.isIE<9,t.isGecko=t.isMozilla=(window.Controllers||window.controllers)&&window.navigator.product==="Gecko",t.isOldGecko=t.isGecko&&parseInt((i.match(/rv:(\d+)/)||[])[1],10)<4,t.isOpera=window.opera&&Object.prototype.toString.call(window.opera)=="[object Opera]",t.isWebKit=parseFloat(i.split("WebKit/")[1])||undefined,t.isChrome=parseFloat(i.split(" Chrome/")[1])||undefined,t.isAIR=i.indexOf("AdobeAIR")>=0,t.isIPad=i.indexOf("iPad")>=0,t.isChromeOS=i.indexOf(" CrOS ")>=0,t.isIOS=/iPad|iPhone|iPod/.test(i)&&!window.MSStream,t.isIOS&&(t.isMac=!0)}),ace.define("ace/lib/event",["require","exports","module","ace/lib/keys","ace/lib/useragent"],function(e,t,n){"use strict";function a(e,t,n){var a=u(t);if(!i.isMac&&s){t.getModifierState&&(t.getModifierState("OS")||t.getModifierState("Win"))&&(a|=8);if(s.altGr){if((3&a)==3)return;s.altGr=0}if(n===18||n===17){var f="location"in t?t.location:t.keyLocation;if(n===17&&f===1)s[n]==1&&(o=t.timeStamp);else if(n===18&&a===3&&f===2){var l=t.timeStamp-o;l<50&&(s.altGr=!0)}}}n in r.MODIFIER_KEYS&&(n=-1),a&8&&n>=91&&n<=93&&(n=-1);if(!a&&n===13){var f="location"in t?t.location:t.keyLocation;if(f===3){e(t,a,-n);if(t.defaultPrevented)return}}if(i.isChromeOS&&a&8){e(t,a,n);if(t.defaultPrevented)return;a&=-9}return!!a||n in r.FUNCTION_KEYS||n in r.PRINTABLE_KEYS?e(t,a,n):!1}function f(){s=Object.create(null)}var r=e("./keys"),i=e("./useragent"),s=null,o=0;t.addListener=function(e,t,n){if(e.addEventListener)return e.addEventListener(t,n,!1);if(e.attachEvent){var r=function(){n.call(e,window.event)};n._wrapper=r,e.attachEvent("on"+t,r)}},t.removeListener=function(e,t,n){if(e.removeEventListener)return e.removeEventListener(t,n,!1);e.detachEvent&&e.detachEvent("on"+t,n._wrapper||n)},t.stopEvent=function(e){return t.stopPropagation(e),t.preventDefault(e),!1},t.stopPropagation=function(e){e.stopPropagation?e.stopPropagation():e.cancelBubble=!0},t.preventDefault=function(e){e.preventDefault?e.preventDefault():e.returnValue=!1},t.getButton=function(e){return e.type=="dblclick"?0:e.type=="contextmenu"||i.isMac&&e.ctrlKey&&!e.altKey&&!e.shiftKey?2:e.preventDefault?e.button:{1:0,2:2,4:1}[e.button]},t.capture=function(e,n,r){function i(e){n&&n(e),r&&r(e),t.removeListener(document,"mousemove",n,!0),t.removeListener(document,"mouseup",i,!0),t.removeListener(document,"dragstart",i,!0)}return t.addListener(document,"mousemove",n,!0),t.addListener(document,"mouseup",i,!0),t.addListener(document,"dragstart",i,!0),i},t.addTouchMoveListener=function(e,n){if("ontouchmove"in e){var r,i;t.addListener(e,"touchstart",function(e){var t=e.changedTouches[0];r=t.clientX,i=t.clientY}),t.addListener(e,"touchmove",function(e){var t=1,s=e.changedTouches[0];e.wheelX=-(s.clientX-r)/t,e.wheelY=-(s.clientY-i)/t,r=s.clientX,i=s.clientY,n(e)})}},t.addMouseWheelListener=function(e,n){"onmousewheel"in e?t.addListener(e,"mousewheel",function(e){var t=8;e.wheelDeltaX!==undefined?(e.wheelX=-e.wheelDeltaX/t,e.wheelY=-e.wheelDeltaY/t):(e.wheelX=0,e.wheelY=-e.wheelDelta/t),n(e)}):"onwheel"in e?t.addListener(e,"wheel",function(e){var t=.35;switch(e.deltaMode){case e.DOM_DELTA_PIXEL:e.wheelX=e.deltaX*t||0,e.wheelY=e.deltaY*t||0;break;case e.DOM_DELTA_LINE:case e.DOM_DELTA_PAGE:e.wheelX=(e.deltaX||0)*5,e.wheelY=(e.deltaY||0)*5}n(e)}):t.addListener(e,"DOMMouseScroll",function(e){e.axis&&e.axis==e.HORIZONTAL_AXIS?(e.wheelX=(e.detail||0)*5,e.wheelY=0):(e.wheelX=0,e.wheelY=(e.detail||0)*5),n(e)})},t.addMultiMouseDownListener=function(e,n,r,s){function c(e){t.getButton(e)!==0?o=0:e.detail>1?(o++,o>4&&(o=1)):o=1;if(i.isIE){var c=Math.abs(e.clientX-u)>5||Math.abs(e.clientY-a)>5;if(!f||c)o=1;f&&clearTimeout(f),f=setTimeout(function(){f=null},n[o-1]||600),o==1&&(u=e.clientX,a=e.clientY)}e._clicks=o,r[s]("mousedown",e);if(o>4)o=0;else if(o>1)return r[s](l[o],e)}function h(e){o=2,f&&clearTimeout(f),f=setTimeout(function(){f=null},n[o-1]||600),r[s]("mousedown",e),r[s](l[o],e)}var o=0,u,a,f,l={2:"dblclick",3:"tripleclick",4:"quadclick"};Array.isArray(e)||(e=[e]),e.forEach(function(e){t.addListener(e,"mousedown",c),i.isOldIE&&t.addListener(e,"dblclick",h)})};var u=!i.isMac||!i.isOpera||"KeyboardEvent"in window?function(e){return 0|(e.ctrlKey?1:0)|(e.altKey?2:0)|(e.shiftKey?4:0)|(e.metaKey?8:0)}:function(e){return 0|(e.metaKey?1:0)|(e.altKey?2:0)|(e.shiftKey?4:0)|(e.ctrlKey?8:0)};t.getModifierString=function(e){return r.KEY_MODS[u(e)]},t.addCommandKeyListener=function(e,n){var r=t.addListener;if(i.isOldGecko||i.isOpera&&!("KeyboardEvent"in window)){var o=null;r(e,"keydown",function(e){o=e.keyCode}),r(e,"keypress",function(e){return a(n,e,o)})}else{var u=null;r(e,"keydown",function(e){s[e.keyCode]=(s[e.keyCode]||0)+1;var t=a(n,e,e.keyCode);return u=e.defaultPrevented,t}),r(e,"keypress",function(e){u&&(e.ctrlKey||e.altKey||e.shiftKey||e.metaKey)&&(t.stopEvent(e),u=null)}),r(e,"keyup",function(e){s[e.keyCode]=null}),s||(f(),r(window,"focus",f))}};if(typeof window=="object"&&window.postMessage&&!i.isOldIE){var l=1;t.nextTick=function(e,n){n=n||window;var r="zero-timeout-message-"+l;t.addListener(n,"message",function i(s){s.data==r&&(t.stopPropagation(s),t.removeListener(n,"message",i),e())}),n.postMessage(r,"*")}}t.nextFrame=typeof window=="object"&&(window.requestAnimationFrame||window.mozRequestAnimationFrame||window.webkitRequestAnimationFrame||window.msRequestAnimationFrame||window.oRequestAnimationFrame),t.nextFrame?t.nextFrame=t.nextFrame.bind(window):t.nextFrame=function(e){setTimeout(e,17)}}),ace.define("ace/lib/lang",["require","exports","module"],function(e,t,n){"use strict";t.last=function(e){return e[e.length-1]},t.stringReverse=function(e){return e.split("").reverse().join("")},t.stringRepeat=function(e,t){var n="";while(t>0){t&1&&(n+=e);if(t>>=1)e+=e}return n};var r=/^\s\s*/,i=/\s\s*$/;t.stringTrimLeft=function(e){return e.replace(r,"")},t.stringTrimRight=function(e){return e.replace(i,"")},t.copyObject=function(e){var t={};for(var n in e)t[n]=e[n];return t},t.copyArray=function(e){var t=[];for(var n=0,r=e.length;nh.length?e=e.substr(9):e.substr(0,4)==h.substr(0,4)?e=e.substr(4,e.length-h.length+1):e.charAt(e.length-1)==h.charAt(0)&&(e=e.slice(0,-1)),e!=h.charAt(0)&&e.charAt(e.length-1)==h.charAt(0)&&(e=e.slice(0,-1)),e&&t.onTextInput(e)),p&&(p=!1),L&&(L=!1)},O=function(e){if(m)return;var t=c.value;A(t),T()},M=function(e,t,n){var r=e.clipboardData||window.clipboardData;if(!r||f)return;var i=l||n?"Text":"text/plain";try{return t?r.setData(i,t)!==!1:r.getData(i)}catch(e){if(!n)return M(e,t,!0)}},_=function(e,n){var s=t.getCopyText();if(!s)return r.preventDefault(e);M(e,s)?(i.isIOS&&(d=n,c.value="\n aa"+s+"a a\n",c.setSelectionRange(4,4+s.length),p={value:s}),n?t.onCut():t.onCopy(),i.isIOS||r.preventDefault(e)):(p=!0,c.value=s,c.select(),setTimeout(function(){p=!1,T(),x(),n?t.onCut():t.onCopy()}))},D=function(e){_(e,!0)},P=function(e){_(e,!1)},H=function(e){var n=M(e);typeof n=="string"?(n&&t.onPaste(n,e),i.isIE&&setTimeout(x),r.preventDefault(e)):(c.value="",v=!0)};r.addCommandKeyListener(c,t.onCommandKey.bind(t)),r.addListener(c,"select",C),r.addListener(c,"input",O),r.addListener(c,"cut",D),r.addListener(c,"copy",P),r.addListener(c,"paste",H);var B=function(e){if(m||!t.onCompositionStart||t.$readOnly)return;m={},m.canUndo=t.session.$undoManager,t.onCompositionStart(),setTimeout(j,0),t.on("mousedown",F),m.canUndo&&!t.selection.isEmpty()&&(t.insert(""),t.session.markUndoGroup(),t.selection.clearSelection()),t.session.markUndoGroup()},j=function(){if(!m||!t.onCompositionUpdate||t.$readOnly)return;var e=c.value.replace(/\x01/g,"");if(m.lastValue===e)return;t.onCompositionUpdate(e),m.lastValue&&t.undo(),m.canUndo&&(m.lastValue=e);if(m.lastValue){var n=t.selection.getRange();t.insert(m.lastValue),t.session.markUndoGroup(),m.range=t.selection.getRange(),t.selection.setRange(n),t.selection.clearSelection()}},F=function(e){if(!t.onCompositionEnd||t.$readOnly)return;var n=m;m=!1;var r=setTimeout(function(){r=null;var e=c.value.replace(/\x01/g,"");if(m)return;e==n.lastValue?T():!n.lastValue&&e&&(T(),A(e))});k=function(i){return r&&clearTimeout(r),i=i.replace(/\x01/g,""),i==n.lastValue?"":(n.lastValue&&r&&t.undo(),i)},t.onCompositionEnd(),t.removeListener("mousedown",F),e.type=="compositionend"&&n.range&&t.selection.setRange(n.range);var s=!!i.isChrome&&i.isChrome>=53||!!i.isWebKit&&i.isWebKit>=603;s&&O()},I=o.delayedCall(j,50);r.addListener(c,"compositionstart",B),i.isGecko?r.addListener(c,"text",function(){I.schedule()}):(r.addListener(c,"keyup",function(){I.schedule()}),r.addListener(c,"keydown",function(){I.schedule()})),r.addListener(c,"compositionend",F),this.getElement=function(){return c},this.setReadOnly=function(e){c.readOnly=e},this.onContextMenu=function(e){L=!0,x(t.selection.isEmpty()),t._emit("nativecontextmenu",{target:t,domEvent:e}),this.moveToMouse(e,!0)},this.moveToMouse=function(e,n){g||(g=c.style.cssText),c.style.cssText=(n?"z-index:100000;":"")+"height:"+c.style.height+";"+(i.isIE?"opacity:0.1;":"");var o=t.container.getBoundingClientRect(),u=s.computedStyle(t.container),a=o.top+(parseInt(u.borderTopWidth)||0),f=o.left+(parseInt(o.borderLeftWidth)||0),l=o.bottom-a-c.clientHeight-2,h=function(e){c.style.left=e.clientX-f-2+"px",c.style.top=Math.min(e.clientY-a-2,l)+"px"};h(e);if(e.type!="mousedown")return;t.renderer.$keepTextAreaAtCursor&&(t.renderer.$keepTextAreaAtCursor=null),clearTimeout(q),i.isWin&&r.capture(t.container,h,R)},this.onContextMenuClose=R;var q,U=function(e){t.textInput.onContextMenu(e),R()};r.addListener(c,"mouseup",U),r.addListener(c,"mousedown",function(e){e.preventDefault(),R()}),r.addListener(t.renderer.scroller,"contextmenu",U),r.addListener(c,"contextmenu",U);if(i.isIOS){var z=null,W=!1;e.addEventListener("keydown",function(e){z&&clearTimeout(z),W=!0}),e.addEventListener("keyup",function(e){z=setTimeout(function(){W=!1},100)});var X=function(e){if(document.activeElement!==c)return;if(W)return;if(d)return setTimeout(function(){d=!1},100);var n=c.selectionStart,r=c.selectionEnd;c.setSelectionRange(4,5);if(n==r)switch(n){case 0:t.onCommandKey(null,0,u.up);break;case 1:t.onCommandKey(null,0,u.home);break;case 2:t.onCommandKey(null,a.option,u.left);break;case 4:t.onCommandKey(null,0,u.left);break;case 5:t.onCommandKey(null,0,u.right);break;case 7:t.onCommandKey(null,a.option,u.right);break;case 8:t.onCommandKey(null,0,u.end);break;case 9:t.onCommandKey(null,0,u.down)}else{switch(r){case 6:t.onCommandKey(null,a.shift,u.right);break;case 7:t.onCommandKey(null,a.shift|a.option,u.right);break;case 8:t.onCommandKey(null,a.shift,u.end);break;case 9:t.onCommandKey(null,a.shift,u.down)}switch(n){case 0:t.onCommandKey(null,a.shift,u.up);break;case 1:t.onCommandKey(null,a.shift,u.home);break;case 2:t.onCommandKey(null,a.shift|a.option,u.left);break;case 3:t.onCommandKey(null,a.shift,u.left)}}};document.addEventListener("selectionchange",X),t.on("destroy",function(){document.removeEventListener("selectionchange",X)})}};t.TextInput=c}),ace.define("ace/keyboard/textinput",["require","exports","module","ace/lib/event","ace/lib/useragent","ace/lib/dom","ace/lib/lang","ace/keyboard/textinput_ios"],function(e,t,n){"use strict";var r=e("../lib/event"),i=e("../lib/useragent"),s=e("../lib/dom"),o=e("../lib/lang"),u=i.isChrome<18,a=i.isIE,f=e("./textinput_ios").TextInput,l=function(e,t){function w(e){if(p)return;p=!0;if(T)t=0,r=e?0:n.value.length-1;else var t=e?2:1,r=2;try{n.setSelectionRange(t,r)}catch(i){}p=!1}function E(){if(p)return;n.value=l,i.isWebKit&&b.schedule()}function F(){clearTimeout(j),j=setTimeout(function(){d&&(n.style.cssText=d,d=""),t.renderer.$keepTextAreaAtCursor==null&&(t.renderer.$keepTextAreaAtCursor=!0,t.renderer.$moveTextAreaToCursor())},0)}if(i.isIOS)return f.call(this,e,t);var n=s.createElement("textarea");n.className="ace_text-input",n.setAttribute("wrap","off"),n.setAttribute("autocorrect","off"),n.setAttribute("autocapitalize","off"),n.setAttribute("spellcheck",!1),n.style.opacity="0",e.insertBefore(n,e.firstChild);var l="\u2028\u2028",c=!1,h=!1,p=!1,d="",v=!0;try{var m=document.activeElement===n}catch(g){}r.addListener(n,"blur",function(e){t.onBlur(e),m=!1}),r.addListener(n,"focus",function(e){m=!0,t.onFocus(e),w()}),this.focus=function(){if(d)return n.focus();var e=n.style.top;n.style.position="fixed",n.style.top="0px",n.focus(),setTimeout(function(){n.style.position="",n.style.top=="0px"&&(n.style.top=e)},0)},this.blur=function(){n.blur()},this.isFocused=function(){return m};var y=o.delayedCall(function(){m&&w(v)}),b=o.delayedCall(function(){p||(n.value=l,m&&w())});i.isWebKit||t.addEventListener("changeSelection",function(){t.selection.isEmpty()!=v&&(v=!v,y.schedule())}),E(),m&&t.onFocus();var S=function(e){return e.selectionStart===0&&e.selectionEnd===e.value.length},x=function(e){c?c=!1:S(n)?(t.selectAll(),w()):T&&w(t.selection.isEmpty())},T=null;this.setInputHandler=function(e){T=e},this.getInputHandler=function(){return T};var N=!1,C=function(e){T&&(e=T(e),T=null),h?(w(),e&&t.onPaste(e),h=!1):e==l.charAt(0)?N?t.execCommand("del",{source:"ace"}):t.execCommand("backspace",{source:"ace"}):(e.substring(0,2)==l?e=e.substr(2):e.charAt(0)==l.charAt(0)?e=e.substr(1):e.charAt(e.length-1)==l.charAt(0)&&(e=e.slice(0,-1)),e.charAt(e.length-1)==l.charAt(0)&&(e=e.slice(0,-1)),e&&t.onTextInput(e)),N&&(N=!1)},k=function(e){if(p)return;var t=n.value;C(t),E()},L=function(e,t,n){var r=e.clipboardData||window.clipboardData;if(!r||u)return;var i=a||n?"Text":"text/plain";try{return t?r.setData(i,t)!==!1:r.getData(i)}catch(e){if(!n)return L(e,t,!0)}},A=function(e,i){var s=t.getCopyText();if(!s)return r.preventDefault(e);L(e,s)?(i?t.onCut():t.onCopy(),r.preventDefault(e)):(c=!0,n.value=s,n.select(),setTimeout(function(){c=!1,E(),w(),i?t.onCut():t.onCopy()}))},O=function(e){A(e,!0)},M=function(e){A(e,!1)},_=function(e){var s=L(e);typeof s=="string"?(s&&t.onPaste(s,e),i.isIE&&setTimeout(w),r.preventDefault(e)):(n.value="",h=!0)};r.addCommandKeyListener(n,t.onCommandKey.bind(t)),r.addListener(n,"select",x),r.addListener(n,"input",k),r.addListener(n,"cut",O),r.addListener(n,"copy",M),r.addListener(n,"paste",_),(!("oncut"in n)||!("oncopy"in n)||!("onpaste"in n))&&r.addListener(e,"keydown",function(e){if(i.isMac&&!e.metaKey||!e.ctrlKey)return;switch(e.keyCode){case 67:M(e);break;case 86:_(e);break;case 88:O(e)}});var D=function(e){if(p||!t.onCompositionStart||t.$readOnly)return;p={},p.canUndo=t.session.$undoManager,t.onCompositionStart(),setTimeout(P,0),t.on("mousedown",H),p.canUndo&&!t.selection.isEmpty()&&(t.insert(""),t.session.markUndoGroup(),t.selection.clearSelection()),t.session.markUndoGroup()},P=function(){if(!p||!t.onCompositionUpdate||t.$readOnly)return;var e=n.value.replace(/\u2028/g,"");if(p.lastValue===e)return;t.onCompositionUpdate(e),p.lastValue&&t.undo(),p.canUndo&&(p.lastValue=e);if(p.lastValue){var r=t.selection.getRange();t.insert(p.lastValue),t.session.markUndoGroup(),p.range=t.selection.getRange(),t.selection.setRange(r),t.selection.clearSelection()}},H=function(e){if(!t.onCompositionEnd||t.$readOnly)return;var r=p;p=!1;var s=setTimeout(function(){s=null;var e=n.value.replace(/\u2028/g,"");if(p)return;e==r.lastValue?E():!r.lastValue&&e&&(E(),C(e))});T=function(n){return s&&clearTimeout(s),n=n.replace(/\u2028/g,""),n==r.lastValue?"":(r.lastValue&&s&&t.undo(),n)},t.onCompositionEnd(),t.removeListener("mousedown",H),e.type=="compositionend"&&r.range&&t.selection.setRange(r.range);var o=!!i.isChrome&&i.isChrome>=53||!!i.isWebKit&&i.isWebKit>=603;o&&k()},B=o.delayedCall(P,50);r.addListener(n,"compositionstart",D),i.isGecko?r.addListener(n,"text",function(){B.schedule()}):(r.addListener(n,"keyup",function(){B.schedule()}),r.addListener(n,"keydown",function(){B.schedule()})),r.addListener(n,"compositionend",H),this.getElement=function(){return n},this.setReadOnly=function(e){n.readOnly=e},this.onContextMenu=function(e){N=!0,w(t.selection.isEmpty()),t._emit("nativecontextmenu",{target:t,domEvent:e}),this.moveToMouse(e,!0)},this.moveToMouse=function(e,o){d||(d=n.style.cssText),n.style.cssText=(o?"z-index:100000;":"")+"height:"+n.style.height+";"+(i.isIE?"opacity:0.1;":"");var u=t.container.getBoundingClientRect(),a=s.computedStyle(t.container),f=u.top+(parseInt(a.borderTopWidth)||0),l=u.left+(parseInt(u.borderLeftWidth)||0),c=u.bottom-f-n.clientHeight-2,h=function(e){n.style.left=e.clientX-l-2+"px",n.style.top=Math.min(e.clientY-f-2,c)+"px"};h(e);if(e.type!="mousedown")return;t.renderer.$keepTextAreaAtCursor&&(t.renderer.$keepTextAreaAtCursor=null),clearTimeout(j),i.isWin&&r.capture(t.container,h,F)},this.onContextMenuClose=F;var j,I=function(e){t.textInput.onContextMenu(e),F()};r.addListener(n,"mouseup",I),r.addListener(n,"mousedown",function(e){e.preventDefault(),F()}),r.addListener(t.renderer.scroller,"contextmenu",I),r.addListener(n,"contextmenu",I)};t.TextInput=l}),ace.define("ace/mouse/default_handlers",["require","exports","module","ace/lib/dom","ace/lib/event","ace/lib/useragent"],function(e,t,n){"use strict";function u(e){e.$clickSelection=null;var t=e.editor;t.setDefaultHandler("mousedown",this.onMouseDown.bind(e)),t.setDefaultHandler("dblclick",this.onDoubleClick.bind(e)),t.setDefaultHandler("tripleclick",this.onTripleClick.bind(e)),t.setDefaultHandler("quadclick",this.onQuadClick.bind(e)),t.setDefaultHandler("mousewheel",this.onMouseWheel.bind(e)),t.setDefaultHandler("touchmove",this.onTouchMove.bind(e));var n=["select","startSelect","selectEnd","selectAllEnd","selectByWordsEnd","selectByLinesEnd","dragWait","dragWaitEnd","focusWait"];n.forEach(function(t){e[t]=this[t]},this),e.selectByLines=this.extendSelectionBy.bind(e,"getLineRange"),e.selectByWords=this.extendSelectionBy.bind(e,"getWordRange")}function a(e,t,n,r){return Math.sqrt(Math.pow(n-e,2)+Math.pow(r-t,2))}function f(e,t){if(e.start.row==e.end.row)var n=2*t.column-e.start.column-e.end.column;else if(e.start.row==e.end.row-1&&!e.start.column&&!e.end.column)var n=t.column-4;else var n=2*t.row-e.start.row-e.end.row;return n<0?{cursor:e.start,anchor:e.end}:{cursor:e.end,anchor:e.start}}var r=e("../lib/dom"),i=e("../lib/event"),s=e("../lib/useragent"),o=0;(function(){this.onMouseDown=function(e){var t=e.inSelection(),n=e.getDocumentPosition();this.mousedownEvent=e;var r=this.editor,i=e.getButton();if(i!==0){var o=r.getSelectionRange(),u=o.isEmpty();r.$blockScrolling++,(u||i==1)&&r.selection.moveToPosition(n),r.$blockScrolling--,i==2&&(r.textInput.onContextMenu(e.domEvent),s.isMozilla||e.preventDefault());return}this.mousedownEvent.time=Date.now();if(t&&!r.isFocused()){r.focus();if(this.$focusTimout&&!this.$clickSelection&&!r.inMultiSelectMode){this.setState("focusWait"),this.captureMouse(e);return}}return this.captureMouse(e),this.startSelect(n,e.domEvent._clicks>1),e.preventDefault()},this.startSelect=function(e,t){e=e||this.editor.renderer.screenToTextCoordinates(this.x,this.y);var n=this.editor;n.$blockScrolling++,this.mousedownEvent.getShiftKey()?n.selection.selectToPosition(e):t||n.selection.moveToPosition(e),t||this.select(),n.renderer.scroller.setCapture&&n.renderer.scroller.setCapture(),n.setStyle("ace_selecting"),this.setState("select"),n.$blockScrolling--},this.select=function(){var e,t=this.editor,n=t.renderer.screenToTextCoordinates(this.x,this.y);t.$blockScrolling++;if(this.$clickSelection){var r=this.$clickSelection.comparePoint(n);if(r==-1)e=this.$clickSelection.end;else if(r==1)e=this.$clickSelection.start;else{var i=f(this.$clickSelection,n);n=i.cursor,e=i.anchor}t.selection.setSelectionAnchor(e.row,e.column)}t.selection.selectToPosition(n),t.$blockScrolling--,t.renderer.scrollCursorIntoView()},this.extendSelectionBy=function(e){var t,n=this.editor,r=n.renderer.screenToTextCoordinates(this.x,this.y),i=n.selection[e](r.row,r.column);n.$blockScrolling++;if(this.$clickSelection){var s=this.$clickSelection.comparePoint(i.start),o=this.$clickSelection.comparePoint(i.end);if(s==-1&&o<=0){t=this.$clickSelection.end;if(i.end.row!=r.row||i.end.column!=r.column)r=i.start}else if(o==1&&s>=0){t=this.$clickSelection.start;if(i.start.row!=r.row||i.start.column!=r.column)r=i.end}else if(s==-1&&o==1)r=i.end,t=i.start;else{var u=f(this.$clickSelection,r);r=u.cursor,t=u.anchor}n.selection.setSelectionAnchor(t.row,t.column)}n.selection.selectToPosition(r),n.$blockScrolling--,n.renderer.scrollCursorIntoView()},this.selectEnd=this.selectAllEnd=this.selectByWordsEnd=this.selectByLinesEnd=function(){this.$clickSelection=null,this.editor.unsetStyle("ace_selecting"),this.editor.renderer.scroller.releaseCapture&&this.editor.renderer.scroller.releaseCapture()},this.focusWait=function(){var e=a(this.mousedownEvent.x,this.mousedownEvent.y,this.x,this.y),t=Date.now();(e>o||t-this.mousedownEvent.time>this.$focusTimout)&&this.startSelect(this.mousedownEvent.getDocumentPosition())},this.onDoubleClick=function(e){var t=e.getDocumentPosition(),n=this.editor,r=n.session,i=r.getBracketRange(t);i?(i.isEmpty()&&(i.start.column--,i.end.column++),this.setState("select")):(i=n.selection.getWordRange(t.row,t.column),this.setState("selectByWords")),this.$clickSelection=i,this.select()},this.onTripleClick=function(e){var t=e.getDocumentPosition(),n=this.editor;this.setState("selectByLines");var r=n.getSelectionRange();r.isMultiLine()&&r.contains(t.row,t.column)?(this.$clickSelection=n.selection.getLineRange(r.start.row),this.$clickSelection.end=n.selection.getLineRange(r.end.row).end):this.$clickSelection=n.selection.getLineRange(t.row),this.select()},this.onQuadClick=function(e){var t=this.editor;t.selectAll(),this.$clickSelection=t.getSelectionRange(),this.setState("selectAll")},this.onMouseWheel=function(e){if(e.getAccelKey())return;e.getShiftKey()&&e.wheelY&&!e.wheelX&&(e.wheelX=e.wheelY,e.wheelY=0);var t=e.domEvent.timeStamp,n=t-(this.$lastScrollTime||0),r=this.editor,i=r.renderer.isScrollableBy(e.wheelX*e.speed,e.wheelY*e.speed);if(i||n<200)return this.$lastScrollTime=t,r.renderer.scrollBy(e.wheelX*e.speed,e.wheelY*e.speed),e.stop()},this.onTouchMove=function(e){var t=e.domEvent.timeStamp,n=t-(this.$lastScrollTime||0),r=this.editor,i=r.renderer.isScrollableBy(e.wheelX*e.speed,e.wheelY*e.speed);if(i||n<200)return this.$lastScrollTime=t,r.renderer.scrollBy(e.wheelX*e.speed,e.wheelY*e.speed),e.stop()}}).call(u.prototype),t.DefaultHandlers=u}),ace.define("ace/tooltip",["require","exports","module","ace/lib/oop","ace/lib/dom"],function(e,t,n){"use strict";function s(e){this.isOpen=!1,this.$element=null,this.$parentNode=e}var r=e("./lib/oop"),i=e("./lib/dom");(function(){this.$init=function(){return this.$element=i.createElement("div"),this.$element.className="ace_tooltip",this.$element.style.display="none",this.$parentNode.appendChild(this.$element),this.$element},this.getElement=function(){return this.$element||this.$init()},this.setText=function(e){i.setInnerText(this.getElement(),e)},this.setHtml=function(e){this.getElement().innerHTML=e},this.setPosition=function(e,t){this.getElement().style.left=e+"px",this.getElement().style.top=t+"px"},this.setClassName=function(e){i.addCssClass(this.getElement(),e)},this.show=function(e,t,n){e!=null&&this.setText(e),t!=null&&n!=null&&this.setPosition(t,n),this.isOpen||(this.getElement().style.display="block",this.isOpen=!0)},this.hide=function(){this.isOpen&&(this.getElement().style.display="none",this.isOpen=!1)},this.getHeight=function(){return this.getElement().offsetHeight},this.getWidth=function(){return this.getElement().offsetWidth},this.destroy=function(){this.isOpen=!1,this.$element&&this.$element.parentNode&&this.$element.parentNode.removeChild(this.$element)}}).call(s.prototype),t.Tooltip=s}),ace.define("ace/mouse/default_gutter_handler",["require","exports","module","ace/lib/dom","ace/lib/oop","ace/lib/event","ace/tooltip"],function(e,t,n){"use strict";function u(e){function l(){var r=u.getDocumentPosition().row,s=n.$annotations[r];if(!s)return c();var o=t.session.getLength();if(r==o){var a=t.renderer.pixelToScreenCoordinates(0,u.y).row,l=u.$pos;if(a>t.session.documentToScreenRow(l.row,l.column))return c()}if(f==s)return;f=s.text.join("
"),i.setHtml(f),i.show(),t._signal("showGutterTooltip",i),t.on("mousewheel",c);if(e.$tooltipFollowsMouse)h(u);else{var p=u.domEvent.target,d=p.getBoundingClientRect(),v=i.getElement().style;v.left=d.right+"px",v.top=d.bottom+"px"}}function c(){o&&(o=clearTimeout(o)),f&&(i.hide(),f=null,t._signal("hideGutterTooltip",i),t.removeEventListener("mousewheel",c))}function h(e){i.setPosition(e.x,e.y)}var t=e.editor,n=t.renderer.$gutterLayer,i=new a(t.container);e.editor.setDefaultHandler("guttermousedown",function(r){if(!t.isFocused()||r.getButton()!=0)return;var i=n.getRegion(r);if(i=="foldWidgets")return;var s=r.getDocumentPosition().row,o=t.session.selection;if(r.getShiftKey())o.selectTo(s,0);else{if(r.domEvent.detail==2)return t.selectAll(),r.preventDefault();e.$clickSelection=t.selection.getLineRange(s)}return e.setState("selectByLines"),e.captureMouse(r),r.preventDefault()});var o,u,f;e.editor.setDefaultHandler("guttermousemove",function(t){var n=t.domEvent.target||t.domEvent.srcElement;if(r.hasCssClass(n,"ace_fold-widget"))return c();f&&e.$tooltipFollowsMouse&&h(t),u=t;if(o)return;o=setTimeout(function(){o=null,u&&!e.isMousePressed?l():c()},50)}),s.addListener(t.renderer.$gutter,"mouseout",function(e){u=null;if(!f||o)return;o=setTimeout(function(){o=null,c()},50)}),t.on("changeSession",c)}function a(e){o.call(this,e)}var r=e("../lib/dom"),i=e("../lib/oop"),s=e("../lib/event"),o=e("../tooltip").Tooltip;i.inherits(a,o),function(){this.setPosition=function(e,t){var n=window.innerWidth||document.documentElement.clientWidth,r=window.innerHeight||document.documentElement.clientHeight,i=this.getWidth(),s=this.getHeight();e+=15,t+=15,e+i>n&&(e-=e+i-n),t+s>r&&(t-=20+s),o.prototype.setPosition.call(this,e,t)}}.call(a.prototype),t.GutterHandler=u}),ace.define("ace/mouse/mouse_event",["require","exports","module","ace/lib/event","ace/lib/useragent"],function(e,t,n){"use strict";var r=e("../lib/event"),i=e("../lib/useragent"),s=t.MouseEvent=function(e,t){this.domEvent=e,this.editor=t,this.x=this.clientX=e.clientX,this.y=this.clientY=e.clientY,this.$pos=null,this.$inSelection=null,this.propagationStopped=!1,this.defaultPrevented=!1};(function(){this.stopPropagation=function(){r.stopPropagation(this.domEvent),this.propagationStopped=!0},this.preventDefault=function(){r.preventDefault(this.domEvent),this.defaultPrevented=!0},this.stop=function(){this.stopPropagation(),this.preventDefault()},this.getDocumentPosition=function(){return this.$pos?this.$pos:(this.$pos=this.editor.renderer.screenToTextCoordinates(this.clientX,this.clientY),this.$pos)},this.inSelection=function(){if(this.$inSelection!==null)return this.$inSelection;var e=this.editor,t=e.getSelectionRange();if(t.isEmpty())this.$inSelection=!1;else{var n=this.getDocumentPosition();this.$inSelection=t.contains(n.row,n.column)}return this.$inSelection},this.getButton=function(){return r.getButton(this.domEvent)},this.getShiftKey=function(){return this.domEvent.shiftKey},this.getAccelKey=i.isMac?function(){return this.domEvent.metaKey}:function(){return this.domEvent.ctrlKey}}).call(s.prototype)}),ace.define("ace/mouse/dragdrop_handler",["require","exports","module","ace/lib/dom","ace/lib/event","ace/lib/useragent"],function(e,t,n){"use strict";function f(e){function T(e,n){var r=Date.now(),i=!n||e.row!=n.row,s=!n||e.column!=n.column;if(!S||i||s)t.$blockScrolling+=1,t.moveCursorToPosition(e),t.$blockScrolling-=1,S=r,x={x:p,y:d};else{var o=l(x.x,x.y,p,d);o>a?S=null:r-S>=u&&(t.renderer.scrollCursorIntoView(),S=null)}}function N(e,n){var r=Date.now(),i=t.renderer.layerConfig.lineHeight,s=t.renderer.layerConfig.characterWidth,u=t.renderer.scroller.getBoundingClientRect(),a={x:{left:p-u.left,right:u.right-p},y:{top:d-u.top,bottom:u.bottom-d}},f=Math.min(a.x.left,a.x.right),l=Math.min(a.y.top,a.y.bottom),c={row:e.row,column:e.column};f/s<=2&&(c.column+=a.x.left=o&&t.renderer.scrollCursorIntoView(c):E=r:E=null}function C(){var e=g;g=t.renderer.screenToTextCoordinates(p,d),T(g,e),N(g,e)}function k(){m=t.selection.toOrientedRange(),h=t.session.addMarker(m,"ace_selection",t.getSelectionStyle()),t.clearSelection(),t.isFocused()&&t.renderer.$cursorLayer.setBlinking(!1),clearInterval(v),C(),v=setInterval(C,20),y=0,i.addListener(document,"mousemove",O)}function L(){clearInterval(v),t.session.removeMarker(h),h=null,t.$blockScrolling+=1,t.selection.fromOrientedRange(m),t.$blockScrolling-=1,t.isFocused()&&!w&&t.renderer.$cursorLayer.setBlinking(!t.getReadOnly()),m=null,g=null,y=0,E=null,S=null,i.removeListener(document,"mousemove",O)}function O(){A==null&&(A=setTimeout(function(){A!=null&&h&&L()},20))}function M(e){var t=e.types;return!t||Array.prototype.some.call(t,function(e){return e=="text/plain"||e=="Text"})}function _(e){var t=["copy","copymove","all","uninitialized"],n=["move","copymove","linkmove","all","uninitialized"],r=s.isMac?e.altKey:e.ctrlKey,i="uninitialized";try{i=e.dataTransfer.effectAllowed.toLowerCase()}catch(e){}var o="none";return r&&t.indexOf(i)>=0?o="copy":n.indexOf(i)>=0?o="move":t.indexOf(i)>=0&&(o="copy"),o}var t=e.editor,n=r.createElement("img");n.src="data:image/gif;base64,R0lGODlhAQABAAAAACH5BAEKAAEALAAAAAABAAEAAAICTAEAOw==",s.isOpera&&(n.style.cssText="width:1px;height:1px;position:fixed;top:0;left:0;z-index:2147483647;opacity:0;");var f=["dragWait","dragWaitEnd","startDrag","dragReadyEnd","onMouseDrag"];f.forEach(function(t){e[t]=this[t]},this),t.addEventListener("mousedown",this.onMouseDown.bind(e));var c=t.container,h,p,d,v,m,g,y=0,b,w,E,S,x;this.onDragStart=function(e){if(this.cancelDrag||!c.draggable){var r=this;return setTimeout(function(){r.startSelect(),r.captureMouse(e)},0),e.preventDefault()}m=t.getSelectionRange();var i=e.dataTransfer;i.effectAllowed=t.getReadOnly()?"copy":"copyMove",s.isOpera&&(t.container.appendChild(n),n.scrollTop=0),i.setDragImage&&i.setDragImage(n,0,0),s.isOpera&&t.container.removeChild(n),i.clearData(),i.setData("Text",t.session.getTextRange()),w=!0,this.setState("drag")},this.onDragEnd=function(e){c.draggable=!1,w=!1,this.setState(null);if(!t.getReadOnly()){var n=e.dataTransfer.dropEffect;!b&&n=="move"&&t.session.remove(t.getSelectionRange()),t.renderer.$cursorLayer.setBlinking(!0)}this.editor.unsetStyle("ace_dragging"),this.editor.renderer.setCursorStyle("")},this.onDragEnter=function(e){if(t.getReadOnly()||!M(e.dataTransfer))return;return p=e.clientX,d=e.clientY,h||k(),y++,e.dataTransfer.dropEffect=b=_(e),i.preventDefault(e)},this.onDragOver=function(e){if(t.getReadOnly()||!M(e.dataTransfer))return;return p=e.clientX,d=e.clientY,h||(k(),y++),A!==null&&(A=null),e.dataTransfer.dropEffect=b=_(e),i.preventDefault(e)},this.onDragLeave=function(e){y--;if(y<=0&&h)return L(),b=null,i.preventDefault(e)},this.onDrop=function(e){if(!g)return;var n=e.dataTransfer;if(w)switch(b){case"move":m.contains(g.row,g.column)?m={start:g,end:g}:m=t.moveText(m,g);break;case"copy":m=t.moveText(m,g,!0)}else{var r=n.getData("Text");m={start:g,end:t.session.insert(g,r)},t.focus(),b=null}return L(),i.preventDefault(e)},i.addListener(c,"dragstart",this.onDragStart.bind(e)),i.addListener(c,"dragend",this.onDragEnd.bind(e)),i.addListener(c,"dragenter",this.onDragEnter.bind(e)),i.addListener(c,"dragover",this.onDragOver.bind(e)),i.addListener(c,"dragleave",this.onDragLeave.bind(e)),i.addListener(c,"drop",this.onDrop.bind(e));var A=null}function l(e,t,n,r){return Math.sqrt(Math.pow(n-e,2)+Math.pow(r-t,2))}var r=e("../lib/dom"),i=e("../lib/event"),s=e("../lib/useragent"),o=200,u=200,a=5;(function(){this.dragWait=function(){var e=Date.now()-this.mousedownEvent.time;e>this.editor.getDragDelay()&&this.startDrag()},this.dragWaitEnd=function(){var e=this.editor.container;e.draggable=!1,this.startSelect(this.mousedownEvent.getDocumentPosition()),this.selectEnd()},this.dragReadyEnd=function(e){this.editor.renderer.$cursorLayer.setBlinking(!this.editor.getReadOnly()),this.editor.unsetStyle("ace_dragging"),this.editor.renderer.setCursorStyle(""),this.dragWaitEnd()},this.startDrag=function(){this.cancelDrag=!1;var e=this.editor,t=e.container;t.draggable=!0,e.renderer.$cursorLayer.setBlinking(!1),e.setStyle("ace_dragging");var n=s.isWin?"default":"move";e.renderer.setCursorStyle(n),this.setState("dragReady")},this.onMouseDrag=function(e){var t=this.editor.container;if(s.isIE&&this.state=="dragReady"){var n=l(this.mousedownEvent.x,this.mousedownEvent.y,this.x,this.y);n>3&&t.dragDrop()}if(this.state==="dragWait"){var n=l(this.mousedownEvent.x,this.mousedownEvent.y,this.x,this.y);n>0&&(t.draggable=!1,this.startSelect(this.mousedownEvent.getDocumentPosition()))}},this.onMouseDown=function(e){if(!this.$dragEnabled)return;this.mousedownEvent=e;var t=this.editor,n=e.inSelection(),r=e.getButton(),i=e.domEvent.detail||1;if(i===1&&r===0&&n){if(e.editor.inMultiSelectMode&&(e.getAccelKey()||e.getShiftKey()))return;this.mousedownEvent.time=Date.now();var o=e.domEvent.target||e.domEvent.srcElement;"unselectable"in o&&(o.unselectable="on");if(t.getDragDelay()){if(s.isWebKit){this.cancelDrag=!0;var u=t.container;u.draggable=!0}this.setState("dragWait")}else this.startDrag();this.captureMouse(e,this.onMouseDrag.bind(this)),e.defaultPrevented=!0}}}).call(f.prototype),t.DragdropHandler=f}),ace.define("ace/lib/net",["require","exports","module","ace/lib/dom"],function(e,t,n){"use strict";var r=e("./dom");t.get=function(e,t){var n=new XMLHttpRequest;n.open("GET",e,!0),n.onreadystatechange=function(){n.readyState===4&&t(n.responseText)},n.send(null)},t.loadScript=function(e,t){var n=r.getDocumentHead(),i=document.createElement("script");i.src=e,n.appendChild(i),i.onload=i.onreadystatechange=function(e,n){if(n||!i.readyState||i.readyState=="loaded"||i.readyState=="complete")i=i.onload=i.onreadystatechange=null,n||t()}},t.qualifyURL=function(e){var t=document.createElement("a");return t.href=e,t.href}}),ace.define("ace/lib/event_emitter",["require","exports","module"],function(e,t,n){"use strict";var r={},i=function(){this.propagationStopped=!0},s=function(){this.defaultPrevented=!0};r._emit=r._dispatchEvent=function(e,t){this._eventRegistry||(this._eventRegistry={}),this._defaultHandlers||(this._defaultHandlers={});var n=this._eventRegistry[e]||[],r=this._defaultHandlers[e];if(!n.length&&!r)return;if(typeof t!="object"||!t)t={};t.type||(t.type=e),t.stopPropagation||(t.stopPropagation=i),t.preventDefault||(t.preventDefault=s),n=n.slice();for(var o=0;o1&&(i=n[n.length-2]);var o=a[t+"Path"];return o==null?o=a.basePath:r=="/"&&(t=r=""),o&&o.slice(-1)!="/"&&(o+="/"),o+t+r+i+this.get("suffix")},t.setModuleUrl=function(e,t){return a.$moduleUrls[e]=t},t.$loading={},t.loadModule=function(n,r){var i,o;Array.isArray(n)&&(o=n[0],n=n[1]);try{i=e(n)}catch(u){}if(i&&!t.$loading[n])return r&&r(i);t.$loading[n]||(t.$loading[n]=[]),t.$loading[n].push(r);if(t.$loading[n].length>1)return;var a=function(){e([n],function(e){t._emit("load.module",{name:n,module:e});var r=t.$loading[n];t.$loading[n]=null,r.forEach(function(t){t&&t(e)})})};if(!t.get("packaged"))return a();s.loadScript(t.moduleUrl(n,o),a)},t.init=f}),ace.define("ace/mouse/mouse_handler",["require","exports","module","ace/lib/event","ace/lib/useragent","ace/mouse/default_handlers","ace/mouse/default_gutter_handler","ace/mouse/mouse_event","ace/mouse/dragdrop_handler","ace/config"],function(e,t,n){"use strict";var r=e("../lib/event"),i=e("../lib/useragent"),s=e("./default_handlers").DefaultHandlers,o=e("./default_gutter_handler").GutterHandler,u=e("./mouse_event").MouseEvent,a=e("./dragdrop_handler").DragdropHandler,f=e("../config"),l=function(e){var t=this;this.editor=e,new s(this),new o(this),new a(this);var n=function(t){var n=!document.hasFocus||!document.hasFocus()||!e.isFocused()&&document.activeElement==(e.textInput&&e.textInput.getElement());n&&window.focus(),e.focus()},u=e.renderer.getMouseEventTarget();r.addListener(u,"click",this.onMouseEvent.bind(this,"click")),r.addListener(u,"mousemove",this.onMouseMove.bind(this,"mousemove")),r.addMultiMouseDownListener([u,e.renderer.scrollBarV&&e.renderer.scrollBarV.inner,e.renderer.scrollBarH&&e.renderer.scrollBarH.inner,e.textInput&&e.textInput.getElement()].filter(Boolean),[400,300,250],this,"onMouseEvent"),r.addMouseWheelListener(e.container,this.onMouseWheel.bind(this,"mousewheel")),r.addTouchMoveListener(e.container,this.onTouchMove.bind(this,"touchmove"));var f=e.renderer.$gutter;r.addListener(f,"mousedown",this.onMouseEvent.bind(this,"guttermousedown")),r.addListener(f,"click",this.onMouseEvent.bind(this,"gutterclick")),r.addListener(f,"dblclick",this.onMouseEvent.bind(this,"gutterdblclick")),r.addListener(f,"mousemove",this.onMouseEvent.bind(this,"guttermousemove")),r.addListener(u,"mousedown",n),r.addListener(f,"mousedown",n),i.isIE&&e.renderer.scrollBarV&&(r.addListener(e.renderer.scrollBarV.element,"mousedown",n),r.addListener(e.renderer.scrollBarH.element,"mousedown",n)),e.on("mousemove",function(n){if(t.state||t.$dragDelay||!t.$dragEnabled)return;var r=e.renderer.screenToTextCoordinates(n.x,n.y),i=e.session.selection.getRange(),s=e.renderer;!i.isEmpty()&&i.insideStart(r.row,r.column)?s.setCursorStyle("default"):s.setCursorStyle("")})};(function(){this.onMouseEvent=function(e,t){this.editor._emit(e,new u(t,this.editor))},this.onMouseMove=function(e,t){var n=this.editor._eventRegistry&&this.editor._eventRegistry.mousemove;if(!n||!n.length)return;this.editor._emit(e,new u(t,this.editor))},this.onMouseWheel=function(e,t){var n=new u(t,this.editor);n.speed=this.$scrollSpeed*2,n.wheelX=t.wheelX,n.wheelY=t.wheelY,this.editor._emit(e,n)},this.onTouchMove=function(e,t){var n=new u(t,this.editor);n.speed=1,n.wheelX=t.wheelX,n.wheelY=t.wheelY,this.editor._emit(e,n)},this.setState=function(e){this.state=e},this.captureMouse=function(e,t){this.x=e.x,this.y=e.y,this.isMousePressed=!0;var n=this.editor.renderer;n.$keepTextAreaAtCursor&&(n.$keepTextAreaAtCursor=null);var s=this,o=function(e){if(!e)return;if(i.isWebKit&&!e.which&&s.releaseMouse)return s.releaseMouse();s.x=e.clientX,s.y=e.clientY,t&&t(e),s.mouseEvent=new u(e,s.editor),s.$mouseMoved=!0},a=function(e){clearInterval(l),f(),s[s.state+"End"]&&s[s.state+"End"](e),s.state="",n.$keepTextAreaAtCursor==null&&(n.$keepTextAreaAtCursor=!0,n.$moveTextAreaToCursor()),s.isMousePressed=!1,s.$onCaptureMouseMove=s.releaseMouse=null,e&&s.onMouseEvent("mouseup",e)},f=function(){s[s.state]&&s[s.state](),s.$mouseMoved=!1};if(i.isOldIE&&e.domEvent.type=="dblclick")return setTimeout(function(){a(e)});s.$onCaptureMouseMove=o,s.releaseMouse=r.capture(this.editor.container,o,a);var l=setInterval(f,20)},this.releaseMouse=null,this.cancelContextMenu=function(){var e=function(t){if(t&&t.domEvent&&t.domEvent.type!="contextmenu")return;this.editor.off("nativecontextmenu",e),t&&t.domEvent&&r.stopEvent(t.domEvent)}.bind(this);setTimeout(e,10),this.editor.on("nativecontextmenu",e)}}).call(l.prototype),f.defineOptions(l.prototype,"mouseHandler",{scrollSpeed:{initialValue:2},dragDelay:{initialValue:i.isMac?150:0},dragEnabled:{initialValue:!0},focusTimout:{initialValue:0},tooltipFollowsMouse:{initialValue:!0}}),t.MouseHandler=l}),ace.define("ace/mouse/fold_handler",["require","exports","module"],function(e,t,n){"use strict";function r(e){e.on("click",function(t){var n=t.getDocumentPosition(),r=e.session,i=r.getFoldAt(n.row,n.column,1);i&&(t.getAccelKey()?r.removeFold(i):r.expandFold(i),t.stop())}),e.on("gutterclick",function(t){var n=e.renderer.$gutterLayer.getRegion(t);if(n=="foldWidgets"){var r=t.getDocumentPosition().row,i=e.session;i.foldWidgets&&i.foldWidgets[r]&&e.session.onFoldWidgetClick(r,t),e.isFocused()||e.focus(),t.stop()}}),e.on("gutterdblclick",function(t){var n=e.renderer.$gutterLayer.getRegion(t);if(n=="foldWidgets"){var r=t.getDocumentPosition().row,i=e.session,s=i.getParentFoldRangeData(r,!0),o=s.range||s.firstRange;if(o){r=o.start.row;var u=i.getFoldAt(r,i.getLine(r).length,1);u?i.removeFold(u):(i.addFold("...",o),e.renderer.scrollCursorIntoView({row:o.start.row,column:0}))}t.stop()}})}t.FoldHandler=r}),ace.define("ace/keyboard/keybinding",["require","exports","module","ace/lib/keys","ace/lib/event"],function(e,t,n){"use strict";var r=e("../lib/keys"),i=e("../lib/event"),s=function(e){this.$editor=e,this.$data={editor:e},this.$handlers=[],this.setDefaultHandler(e.commands)};(function(){this.setDefaultHandler=function(e){this.removeKeyboardHandler(this.$defaultHandler),this.$defaultHandler=e,this.addKeyboardHandler(e,0)},this.setKeyboardHandler=function(e){var t=this.$handlers;if(t[t.length-1]==e)return;while(t[t.length-1]&&t[t.length-1]!=this.$defaultHandler)this.removeKeyboardHandler(t[t.length-1]);this.addKeyboardHandler(e,1)},this.addKeyboardHandler=function(e,t){if(!e)return;typeof e=="function"&&!e.handleKeyboard&&(e.handleKeyboard=e);var n=this.$handlers.indexOf(e);n!=-1&&this.$handlers.splice(n,1),t==undefined?this.$handlers.push(e):this.$handlers.splice(t,0,e),n==-1&&e.attach&&e.attach(this.$editor)},this.removeKeyboardHandler=function(e){var t=this.$handlers.indexOf(e);return t==-1?!1:(this.$handlers.splice(t,1),e.detach&&e.detach(this.$editor),!0)},this.getKeyboardHandler=function(){return this.$handlers[this.$handlers.length-1]},this.getStatusText=function(){var e=this.$data,t=e.editor;return this.$handlers.map(function(n){return n.getStatusText&&n.getStatusText(t,e)||""}).filter(Boolean).join(" ")},this.$callKeyboardHandlers=function(e,t,n,r){var s,o=!1,u=this.$editor.commands;for(var a=this.$handlers.length;a--;){s=this.$handlers[a].handleKeyboard(this.$data,e,t,n,r);if(!s||!s.command)continue;s.command=="null"?o=!0:o=u.exec(s.command,this.$editor,s.args,r),o&&r&&e!=-1&&s.passEvent!=1&&s.command.passEvent!=1&&i.stopEvent(r);if(o)break}return!o&&e==-1&&(s={command:"insertstring"},o=u.exec("insertstring",this.$editor,t)),o&&this.$editor._signal&&this.$editor._signal("keyboardActivity",s),o},this.onCommandKey=function(e,t,n){var i=r.keyCodeToString(n);this.$callKeyboardHandlers(t,i,n,e)},this.onTextInput=function(e){this.$callKeyboardHandlers(-1,e)}}).call(s.prototype),t.KeyBinding=s}),ace.define("ace/range",["require","exports","module"],function(e,t,n){"use strict";var r=function(e,t){return e.row-t.row||e.column-t.column},i=function(e,t,n,r){this.start={row:e,column:t},this.end={row:n,column:r}};(function(){this.isEqual=function(e){return this.start.row===e.start.row&&this.end.row===e.end.row&&this.start.column===e.start.column&&this.end.column===e.end.column},this.toString=function(){return"Range: ["+this.start.row+"/"+this.start.column+"] -> ["+this.end.row+"/"+this.end.column+"]"},this.contains=function(e,t){return this.compare(e,t)==0},this.compareRange=function(e){var t,n=e.end,r=e.start;return t=this.compare(n.row,n.column),t==1?(t=this.compare(r.row,r.column),t==1?2:t==0?1:0):t==-1?-2:(t=this.compare(r.row,r.column),t==-1?-1:t==1?42:0)},this.comparePoint=function(e){return this.compare(e.row,e.column)},this.containsRange=function(e){return this.comparePoint(e.start)==0&&this.comparePoint(e.end)==0},this.intersects=function(e){var t=this.compareRange(e);return t==-1||t==0||t==1},this.isEnd=function(e,t){return this.end.row==e&&this.end.column==t},this.isStart=function(e,t){return this.start.row==e&&this.start.column==t},this.setStart=function(e,t){typeof e=="object"?(this.start.column=e.column,this.start.row=e.row):(this.start.row=e,this.start.column=t)},this.setEnd=function(e,t){typeof e=="object"?(this.end.column=e.column,this.end.row=e.row):(this.end.row=e,this.end.column=t)},this.inside=function(e,t){return this.compare(e,t)==0?this.isEnd(e,t)||this.isStart(e,t)?!1:!0:!1},this.insideStart=function(e,t){return this.compare(e,t)==0?this.isEnd(e,t)?!1:!0:!1},this.insideEnd=function(e,t){return this.compare(e,t)==0?this.isStart(e,t)?!1:!0:!1},this.compare=function(e,t){return!this.isMultiLine()&&e===this.start.row?tthis.end.column?1:0:ethis.end.row?1:this.start.row===e?t>=this.start.column?0:-1:this.end.row===e?t<=this.end.column?0:1:0},this.compareStart=function(e,t){return this.start.row==e&&this.start.column==t?-1:this.compare(e,t)},this.compareEnd=function(e,t){return this.end.row==e&&this.end.column==t?1:this.compare(e,t)},this.compareInside=function(e,t){return this.end.row==e&&this.end.column==t?1:this.start.row==e&&this.start.column==t?-1:this.compare(e,t)},this.clipRows=function(e,t){if(this.end.row>t)var n={row:t+1,column:0};else if(this.end.rowt)var r={row:t+1,column:0};else if(this.start.rowt.row||e.row==t.row&&e.column>t.column},this.getRange=function(){var e=this.anchor,t=this.lead;return this.isEmpty()?o.fromPoints(t,t):this.isBackwards()?o.fromPoints(t,e):o.fromPoints(e,t)},this.clearSelection=function(){this.$isEmpty||(this.$isEmpty=!0,this._emit("changeSelection"))},this.selectAll=function(){var e=this.doc.getLength()-1;this.setSelectionAnchor(0,0),this.moveCursorTo(e,this.doc.getLine(e).length)},this.setRange=this.setSelectionRange=function(e,t){t?(this.setSelectionAnchor(e.end.row,e.end.column),this.selectTo(e.start.row,e.start.column)):(this.setSelectionAnchor(e.start.row,e.start.column),this.selectTo(e.end.row,e.end.column)),this.getRange().isEmpty()&&(this.$isEmpty=!0),this.$desiredColumn=null},this.$moveSelection=function(e){var t=this.lead;this.$isEmpty&&this.setSelectionAnchor(t.row,t.column),e.call(this)},this.selectTo=function(e,t){this.$moveSelection(function(){this.moveCursorTo(e,t)})},this.selectToPosition=function(e){this.$moveSelection(function(){this.moveCursorToPosition(e)})},this.moveTo=function(e,t){this.clearSelection(),this.moveCursorTo(e,t)},this.moveToPosition=function(e){this.clearSelection(),this.moveCursorToPosition(e)},this.selectUp=function(){this.$moveSelection(this.moveCursorUp)},this.selectDown=function(){this.$moveSelection(this.moveCursorDown)},this.selectRight=function(){this.$moveSelection(this.moveCursorRight)},this.selectLeft=function(){this.$moveSelection(this.moveCursorLeft)},this.selectLineStart=function(){this.$moveSelection(this.moveCursorLineStart)},this.selectLineEnd=function(){this.$moveSelection(this.moveCursorLineEnd)},this.selectFileEnd=function(){this.$moveSelection(this.moveCursorFileEnd)},this.selectFileStart=function(){this.$moveSelection(this.moveCursorFileStart)},this.selectWordRight=function(){this.$moveSelection(this.moveCursorWordRight)},this.selectWordLeft=function(){this.$moveSelection(this.moveCursorWordLeft)},this.getWordRange=function(e,t){if(typeof t=="undefined"){var n=e||this.lead;e=n.row,t=n.column}return this.session.getWordRange(e,t)},this.selectWord=function(){this.setSelectionRange(this.getWordRange())},this.selectAWord=function(){var e=this.getCursor(),t=this.session.getAWordRange(e.row,e.column);this.setSelectionRange(t)},this.getLineRange=function(e,t){var n=typeof e=="number"?e:this.lead.row,r,i=this.session.getFoldLine(n);return i?(n=i.start.row,r=i.end.row):r=n,t===!0?new o(n,0,r,this.session.getLine(r).length):new o(n,0,r+1,0)},this.selectLine=function(){this.setSelectionRange(this.getLineRange())},this.moveCursorUp=function(){this.moveCursorBy(-1,0)},this.moveCursorDown=function(){this.moveCursorBy(1,0)},this.wouldMoveIntoSoftTab=function(e,t,n){var r=e.column,i=e.column+t;return n<0&&(r=e.column-t,i=e.column),this.session.isTabStop(e)&&this.doc.getLine(e.row).slice(r,i).split(" ").length-1==t},this.moveCursorLeft=function(){var e=this.lead.getPosition(),t;if(t=this.session.getFoldAt(e.row,e.column,-1))this.moveCursorTo(t.start.row,t.start.column);else if(e.column===0)e.row>0&&this.moveCursorTo(e.row-1,this.doc.getLine(e.row-1).length);else{var n=this.session.getTabSize();this.wouldMoveIntoSoftTab(e,n,-1)&&!this.session.getNavigateWithinSoftTabs()?this.moveCursorBy(0,-n):this.moveCursorBy(0,-1)}},this.moveCursorRight=function(){var e=this.lead.getPosition(),t;if(t=this.session.getFoldAt(e.row,e.column,1))this.moveCursorTo(t.end.row,t.end.column);else if(this.lead.column==this.doc.getLine(this.lead.row).length)this.lead.row0&&(t.column=r)}}this.moveCursorTo(t.row,t.column)},this.moveCursorFileEnd=function(){var e=this.doc.getLength()-1,t=this.doc.getLine(e).length;this.moveCursorTo(e,t)},this.moveCursorFileStart=function(){this.moveCursorTo(0,0)},this.moveCursorLongWordRight=function(){var e=this.lead.row,t=this.lead.column,n=this.doc.getLine(e),r=n.substring(t),i;this.session.nonTokenRe.lastIndex=0,this.session.tokenRe.lastIndex=0;var s=this.session.getFoldAt(e,t,1);if(s){this.moveCursorTo(s.end.row,s.end.column);return}if(i=this.session.nonTokenRe.exec(r))t+=this.session.nonTokenRe.lastIndex,this.session.nonTokenRe.lastIndex=0,r=n.substring(t);if(t>=n.length){this.moveCursorTo(e,n.length),this.moveCursorRight(),e0&&this.moveCursorWordLeft();return}if(o=this.session.tokenRe.exec(s))t-=this.session.tokenRe.lastIndex,this.session.tokenRe.lastIndex=0;this.moveCursorTo(e,t)},this.$shortWordEndIndex=function(e){var t,n=0,r,i=/\s/,s=this.session.tokenRe;s.lastIndex=0;if(t=this.session.tokenRe.exec(e))n=this.session.tokenRe.lastIndex;else{while((r=e[n])&&i.test(r))n++;if(n<1){s.lastIndex=0;while((r=e[n])&&!s.test(r)){s.lastIndex=0,n++;if(i.test(r)){if(n>2){n--;break}while((r=e[n])&&i.test(r))n++;if(n>2)break}}}}return s.lastIndex=0,n},this.moveCursorShortWordRight=function(){var e=this.lead.row,t=this.lead.column,n=this.doc.getLine(e),r=n.substring(t),i=this.session.getFoldAt(e,t,1);if(i)return this.moveCursorTo(i.end.row,i.end.column);if(t==n.length){var s=this.doc.getLength();do e++,r=this.doc.getLine(e);while(e0&&/^\s*$/.test(r));t=r.length,/\s+$/.test(r)||(r="")}var s=i.stringReverse(r),o=this.$shortWordEndIndex(s);return this.moveCursorTo(e,t-o)},this.moveCursorWordRight=function(){this.session.$selectLongWords?this.moveCursorLongWordRight():this.moveCursorShortWordRight()},this.moveCursorWordLeft=function(){this.session.$selectLongWords?this.moveCursorLongWordLeft():this.moveCursorShortWordLeft()},this.moveCursorBy=function(e,t){var n=this.session.documentToScreenPosition(this.lead.row,this.lead.column);t===0&&(this.$desiredColumn?n.column=this.$desiredColumn:this.$desiredColumn=n.column);var r=this.session.screenToDocumentPosition(n.row+e,n.column);e!==0&&t===0&&r.row===this.lead.row&&r.column===this.lead.column&&this.session.lineWidgets&&this.session.lineWidgets[r.row]&&(r.row>0||e>0)&&r.row++,this.moveCursorTo(r.row,r.column+t,t===0)},this.moveCursorToPosition=function(e){this.moveCursorTo(e.row,e.column)},this.moveCursorTo=function(e,t,n){var r=this.session.getFoldAt(e,t,1);r&&(e=r.start.row,t=r.start.column),this.$keepDesiredColumnOnChange=!0,this.lead.setPosition(e,t),this.$keepDesiredColumnOnChange=!1,n||(this.$desiredColumn=null)},this.moveCursorToScreen=function(e,t,n){var r=this.session.screenToDocumentPosition(e,t);this.moveCursorTo(r.row,r.column,n)},this.detach=function(){this.lead.detach(),this.anchor.detach(),this.session=this.doc=null},this.fromOrientedRange=function(e){this.setSelectionRange(e,e.cursor==e.start),this.$desiredColumn=e.desiredColumn||this.$desiredColumn},this.toOrientedRange=function(e){var t=this.getRange();return e?(e.start.column=t.start.column,e.start.row=t.start.row,e.end.column=t.end.column,e.end.row=t.end.row):e=t,e.cursor=this.isBackwards()?e.start:e.end,e.desiredColumn=this.$desiredColumn,e},this.getRangeOfMovements=function(e){var t=this.getCursor();try{e(this);var n=this.getCursor();return o.fromPoints(t,n)}catch(r){return o.fromPoints(t,t)}finally{this.moveCursorToPosition(t)}},this.toJSON=function(){if(this.rangeCount)var e=this.ranges.map(function(e){var t=e.clone();return t.isBackwards=e.cursor==e.start,t});else{var e=this.getRange();e.isBackwards=this.isBackwards()}return e},this.fromJSON=function(e){if(e.start==undefined){if(this.rangeList){this.toSingleRange(e[0]);for(var t=e.length;t--;){var n=o.fromPoints(e[t].start,e[t].end);e[t].isBackwards&&(n.cursor=n.start),this.addRange(n,!0)}return}e=e[0]}this.rangeList&&this.toSingleRange(e),this.setSelectionRange(e,e.isBackwards)},this.isEqual=function(e){if((e.length||this.rangeCount)&&e.length!=this.rangeCount)return!1;if(!e.length||!this.ranges)return this.getRange().isEqual(e);for(var t=this.ranges.length;t--;)if(!this.ranges[t].isEqual(e[t]))return!1;return!0}}).call(u.prototype),t.Selection=u}),ace.define("ace/tokenizer",["require","exports","module","ace/config"],function(e,t,n){"use strict";var r=e("./config"),i=2e3,s=function(e){this.states=e,this.regExps={},this.matchMappings={};for(var t in this.states){var n=this.states[t],r=[],i=0,s=this.matchMappings[t]={defaultToken:"text"},o="g",u=[];for(var a=0;a1?f.onMatch=this.$applyToken:f.onMatch=f.token),c>1&&(/\\\d/.test(f.regex)?l=f.regex.replace(/\\([0-9]+)/g,function(e,t){return"\\"+(parseInt(t,10)+i+1)}):(c=1,l=this.removeCapturingGroups(f.regex)),!f.splitRegex&&typeof f.token!="string"&&u.push(f)),s[i]=a,i+=c,r.push(l),f.onMatch||(f.onMatch=null)}r.length||(s[0]=0,r.push("$")),u.forEach(function(e){e.splitRegex=this.createSplitterRegexp(e.regex,o)},this),this.regExps[t]=new RegExp("("+r.join(")|(")+")|($)",o)}};(function(){this.$setMaxTokenCount=function(e){i=e|0},this.$applyToken=function(e){var t=this.splitRegex.exec(e).slice(1),n=this.token.apply(this,t);if(typeof n=="string")return[{type:n,value:e}];var r=[];for(var i=0,s=n.length;il){var g=e.substring(l,m-v.length);h.type==p?h.value+=g:(h.type&&f.push(h),h={type:p,value:g})}for(var y=0;yi){c>2*e.length&&this.reportError("infinite loop with in ace tokenizer",{startState:t,line:e});while(l1&&n[0]!==r&&n.unshift("#tmp",r),{tokens:f,state:n.length?n:r}},this.reportError=r.reportError}).call(s.prototype),t.Tokenizer=s}),ace.define("ace/mode/text_highlight_rules",["require","exports","module","ace/lib/lang"],function(e,t,n){"use strict";var r=e("../lib/lang"),i=function(){this.$rules={start:[{token:"empty_line",regex:"^$"},{defaultToken:"text"}]}};(function(){this.addRules=function(e,t){if(!t){for(var n in e)this.$rules[n]=e[n];return}for(var n in e){var r=e[n];for(var i=0;i=this.$rowTokens.length){this.$row+=1,e||(e=this.$session.getLength());if(this.$row>=e)return this.$row=e-1,null;this.$rowTokens=this.$session.getTokens(this.$row),this.$tokenIndex=0}return this.$rowTokens[this.$tokenIndex]},this.getCurrentToken=function(){return this.$rowTokens[this.$tokenIndex]},this.getCurrentTokenRow=function(){return this.$row},this.getCurrentTokenColumn=function(){var e=this.$rowTokens,t=this.$tokenIndex,n=e[t].start;if(n!==undefined)return n;n=0;while(t>0)t-=1,n+=e[t].value.length;return n},this.getCurrentTokenPosition=function(){return{row:this.$row,column:this.getCurrentTokenColumn()}}}).call(r.prototype),t.TokenIterator=r}),ace.define("ace/mode/behaviour/cstyle",["require","exports","module","ace/lib/oop","ace/mode/behaviour","ace/token_iterator","ace/lib/lang"],function(e,t,n){"use strict";var r=e("../../lib/oop"),i=e("../behaviour").Behaviour,s=e("../../token_iterator").TokenIterator,o=e("../../lib/lang"),u=["text","paren.rparen","punctuation.operator"],a=["text","paren.rparen","punctuation.operator","comment"],f,l={},c={'"':'"',"'":"'"},h=function(e){var t=-1;e.multiSelect&&(t=e.selection.index,l.rangeCount!=e.multiSelect.rangeCount&&(l={rangeCount:e.multiSelect.rangeCount}));if(l[t])return f=l[t];f=l[t]={autoInsertedBrackets:0,autoInsertedRow:-1,autoInsertedLineEnd:"",maybeInsertedBrackets:0,maybeInsertedRow:-1,maybeInsertedLineStart:"",maybeInsertedLineEnd:""}},p=function(e,t,n,r){var i=e.end.row-e.start.row;return{text:n+t+r,selection:[0,e.start.column+1,i,e.end.column+(i?0:1)]}},d=function(e){this.add("braces","insertion",function(t,n,r,i,s){var u=r.getCursorPosition(),a=i.doc.getLine(u.row);if(s=="{"){h(r);var l=r.getSelectionRange(),c=i.doc.getTextRange(l);if(c!==""&&c!=="{"&&r.getWrapBehavioursEnabled())return p(l,c,"{","}");if(d.isSaneInsertion(r,i))return/[\]\}\)]/.test(a[u.column])||r.inMultiSelectMode||e&&e.braces?(d.recordAutoInsert(r,i,"}"),{text:"{}",selection:[1,1]}):(d.recordMaybeInsert(r,i,"{"),{text:"{",selection:[1,1]})}else if(s=="}"){h(r);var v=a.substring(u.column,u.column+1);if(v=="}"){var m=i.$findOpeningBracket("}",{column:u.column+1,row:u.row});if(m!==null&&d.isAutoInsertedClosing(u,a,s))return d.popAutoInsertedClosing(),{text:"",selection:[1,1]}}}else{if(s=="\n"||s=="\r\n"){h(r);var g="";d.isMaybeInsertedClosing(u,a)&&(g=o.stringRepeat("}",f.maybeInsertedBrackets),d.clearMaybeInsertedClosing());var v=a.substring(u.column,u.column+1);if(v==="}"){var y=i.findMatchingBracket({row:u.row,column:u.column+1},"}");if(!y)return null;var b=this.$getIndent(i.getLine(y.row))}else{if(!g){d.clearMaybeInsertedClosing();return}var b=this.$getIndent(a)}var w=b+i.getTabString();return{text:"\n"+w+"\n"+b+g,selection:[1,w.length,1,w.length]}}d.clearMaybeInsertedClosing()}}),this.add("braces","deletion",function(e,t,n,r,i){var s=r.doc.getTextRange(i);if(!i.isMultiLine()&&s=="{"){h(n);var o=r.doc.getLine(i.start.row),u=o.substring(i.end.column,i.end.column+1);if(u=="}")return i.end.column++,i;f.maybeInsertedBrackets--}}),this.add("parens","insertion",function(e,t,n,r,i){if(i=="("){h(n);var s=n.getSelectionRange(),o=r.doc.getTextRange(s);if(o!==""&&n.getWrapBehavioursEnabled())return p(s,o,"(",")");if(d.isSaneInsertion(n,r))return d.recordAutoInsert(n,r,")"),{text:"()",selection:[1,1]}}else if(i==")"){h(n);var u=n.getCursorPosition(),a=r.doc.getLine(u.row),f=a.substring(u.column,u.column+1);if(f==")"){var l=r.$findOpeningBracket(")",{column:u.column+1,row:u.row});if(l!==null&&d.isAutoInsertedClosing(u,a,i))return d.popAutoInsertedClosing(),{text:"",selection:[1,1]}}}}),this.add("parens","deletion",function(e,t,n,r,i){var s=r.doc.getTextRange(i);if(!i.isMultiLine()&&s=="("){h(n);var o=r.doc.getLine(i.start.row),u=o.substring(i.start.column+1,i.start.column+2);if(u==")")return i.end.column++,i}}),this.add("brackets","insertion",function(e,t,n,r,i){if(i=="["){h(n);var s=n.getSelectionRange(),o=r.doc.getTextRange(s);if(o!==""&&n.getWrapBehavioursEnabled())return p(s,o,"[","]");if(d.isSaneInsertion(n,r))return d.recordAutoInsert(n,r,"]"),{text:"[]",selection:[1,1]}}else if(i=="]"){h(n);var u=n.getCursorPosition(),a=r.doc.getLine(u.row),f=a.substring(u.column,u.column+1);if(f=="]"){var l=r.$findOpeningBracket("]",{column:u.column+1,row:u.row});if(l!==null&&d.isAutoInsertedClosing(u,a,i))return d.popAutoInsertedClosing(),{text:"",selection:[1,1]}}}}),this.add("brackets","deletion",function(e,t,n,r,i){var s=r.doc.getTextRange(i);if(!i.isMultiLine()&&s=="["){h(n);var o=r.doc.getLine(i.start.row),u=o.substring(i.start.column+1,i.start.column+2);if(u=="]")return i.end.column++,i}}),this.add("string_dquotes","insertion",function(e,t,n,r,i){var s=r.$mode.$quotes||c;if(i.length==1&&s[i]){if(this.lineCommentStart&&this.lineCommentStart.indexOf(i)!=-1)return;h(n);var o=i,u=n.getSelectionRange(),a=r.doc.getTextRange(u);if(a!==""&&(a.length!=1||!s[a])&&n.getWrapBehavioursEnabled())return p(u,a,o,o);if(!a){var f=n.getCursorPosition(),l=r.doc.getLine(f.row),d=l.substring(f.column-1,f.column),v=l.substring(f.column,f.column+1),m=r.getTokenAt(f.row,f.column),g=r.getTokenAt(f.row,f.column+1);if(d=="\\"&&m&&/escape/.test(m.type))return null;var y=m&&/string|escape/.test(m.type),b=!g||/string|escape/.test(g.type),w;if(v==o)w=y!==b,w&&/string\.end/.test(g.type)&&(w=!1);else{if(y&&!b)return null;if(y&&b)return null;var E=r.$mode.tokenRe;E.lastIndex=0;var S=E.test(d);E.lastIndex=0;var x=E.test(d);if(S||x)return null;if(v&&!/[\s;,.})\]\\]/.test(v))return null;w=!0}return{text:w?o+o:"",selection:[1,1]}}}}),this.add("string_dquotes","deletion",function(e,t,n,r,i){var s=r.doc.getTextRange(i);if(!i.isMultiLine()&&(s=='"'||s=="'")){h(n);var o=r.doc.getLine(i.start.row),u=o.substring(i.start.column+1,i.start.column+2);if(u==s)return i.end.column++,i}})};d.isSaneInsertion=function(e,t){var n=e.getCursorPosition(),r=new s(t,n.row,n.column);if(!this.$matchTokenType(r.getCurrentToken()||"text",u)){var i=new s(t,n.row,n.column+1);if(!this.$matchTokenType(i.getCurrentToken()||"text",u))return!1}return r.stepForward(),r.getCurrentTokenRow()!==n.row||this.$matchTokenType(r.getCurrentToken()||"text",a)},d.$matchTokenType=function(e,t){return t.indexOf(e.type||e)>-1},d.recordAutoInsert=function(e,t,n){var r=e.getCursorPosition(),i=t.doc.getLine(r.row);this.isAutoInsertedClosing(r,i,f.autoInsertedLineEnd[0])||(f.autoInsertedBrackets=0),f.autoInsertedRow=r.row,f.autoInsertedLineEnd=n+i.substr(r.column),f.autoInsertedBrackets++},d.recordMaybeInsert=function(e,t,n){var r=e.getCursorPosition(),i=t.doc.getLine(r.row);this.isMaybeInsertedClosing(r,i)||(f.maybeInsertedBrackets=0),f.maybeInsertedRow=r.row,f.maybeInsertedLineStart=i.substr(0,r.column)+n,f.maybeInsertedLineEnd=i.substr(r.column),f.maybeInsertedBrackets++},d.isAutoInsertedClosing=function(e,t,n){return f.autoInsertedBrackets>0&&e.row===f.autoInsertedRow&&n===f.autoInsertedLineEnd[0]&&t.substr(e.column)===f.autoInsertedLineEnd},d.isMaybeInsertedClosing=function(e,t){return f.maybeInsertedBrackets>0&&e.row===f.maybeInsertedRow&&t.substr(e.column)===f.maybeInsertedLineEnd&&t.substr(0,e.column)==f.maybeInsertedLineStart},d.popAutoInsertedClosing=function(){f.autoInsertedLineEnd=f.autoInsertedLineEnd.substr(1),f.autoInsertedBrackets--},d.clearMaybeInsertedClosing=function(){f&&(f.maybeInsertedBrackets=0,f.maybeInsertedRow=-1)},r.inherits(d,i),t.CstyleBehaviour=d}),ace.define("ace/unicode",["require","exports","module"],function(e,t,n){"use strict";function r(e){var n=/\w{4}/g;for(var r in e)t.packages[r]=e[r].replace(n,"\\u$&")}t.packages={},r({L:"0041-005A0061-007A00AA00B500BA00C0-00D600D8-00F600F8-02C102C6-02D102E0-02E402EC02EE0370-037403760377037A-037D03860388-038A038C038E-03A103A3-03F503F7-0481048A-05250531-055605590561-058705D0-05EA05F0-05F20621-064A066E066F0671-06D306D506E506E606EE06EF06FA-06FC06FF07100712-072F074D-07A507B107CA-07EA07F407F507FA0800-0815081A082408280904-0939093D09500958-0961097109720979-097F0985-098C098F09900993-09A809AA-09B009B209B6-09B909BD09CE09DC09DD09DF-09E109F009F10A05-0A0A0A0F0A100A13-0A280A2A-0A300A320A330A350A360A380A390A59-0A5C0A5E0A72-0A740A85-0A8D0A8F-0A910A93-0AA80AAA-0AB00AB20AB30AB5-0AB90ABD0AD00AE00AE10B05-0B0C0B0F0B100B13-0B280B2A-0B300B320B330B35-0B390B3D0B5C0B5D0B5F-0B610B710B830B85-0B8A0B8E-0B900B92-0B950B990B9A0B9C0B9E0B9F0BA30BA40BA8-0BAA0BAE-0BB90BD00C05-0C0C0C0E-0C100C12-0C280C2A-0C330C35-0C390C3D0C580C590C600C610C85-0C8C0C8E-0C900C92-0CA80CAA-0CB30CB5-0CB90CBD0CDE0CE00CE10D05-0D0C0D0E-0D100D12-0D280D2A-0D390D3D0D600D610D7A-0D7F0D85-0D960D9A-0DB10DB3-0DBB0DBD0DC0-0DC60E01-0E300E320E330E40-0E460E810E820E840E870E880E8A0E8D0E94-0E970E99-0E9F0EA1-0EA30EA50EA70EAA0EAB0EAD-0EB00EB20EB30EBD0EC0-0EC40EC60EDC0EDD0F000F40-0F470F49-0F6C0F88-0F8B1000-102A103F1050-1055105A-105D106110651066106E-10701075-1081108E10A0-10C510D0-10FA10FC1100-1248124A-124D1250-12561258125A-125D1260-1288128A-128D1290-12B012B2-12B512B8-12BE12C012C2-12C512C8-12D612D8-13101312-13151318-135A1380-138F13A0-13F41401-166C166F-167F1681-169A16A0-16EA1700-170C170E-17111720-17311740-17511760-176C176E-17701780-17B317D717DC1820-18771880-18A818AA18B0-18F51900-191C1950-196D1970-19741980-19AB19C1-19C71A00-1A161A20-1A541AA71B05-1B331B45-1B4B1B83-1BA01BAE1BAF1C00-1C231C4D-1C4F1C5A-1C7D1CE9-1CEC1CEE-1CF11D00-1DBF1E00-1F151F18-1F1D1F20-1F451F48-1F4D1F50-1F571F591F5B1F5D1F5F-1F7D1F80-1FB41FB6-1FBC1FBE1FC2-1FC41FC6-1FCC1FD0-1FD31FD6-1FDB1FE0-1FEC1FF2-1FF41FF6-1FFC2071207F2090-209421022107210A-211321152119-211D212421262128212A-212D212F-2139213C-213F2145-2149214E218321842C00-2C2E2C30-2C5E2C60-2CE42CEB-2CEE2D00-2D252D30-2D652D6F2D80-2D962DA0-2DA62DA8-2DAE2DB0-2DB62DB8-2DBE2DC0-2DC62DC8-2DCE2DD0-2DD62DD8-2DDE2E2F300530063031-3035303B303C3041-3096309D-309F30A1-30FA30FC-30FF3105-312D3131-318E31A0-31B731F0-31FF3400-4DB54E00-9FCBA000-A48CA4D0-A4FDA500-A60CA610-A61FA62AA62BA640-A65FA662-A66EA67F-A697A6A0-A6E5A717-A71FA722-A788A78BA78CA7FB-A801A803-A805A807-A80AA80C-A822A840-A873A882-A8B3A8F2-A8F7A8FBA90A-A925A930-A946A960-A97CA984-A9B2A9CFAA00-AA28AA40-AA42AA44-AA4BAA60-AA76AA7AAA80-AAAFAAB1AAB5AAB6AAB9-AABDAAC0AAC2AADB-AADDABC0-ABE2AC00-D7A3D7B0-D7C6D7CB-D7FBF900-FA2DFA30-FA6DFA70-FAD9FB00-FB06FB13-FB17FB1DFB1F-FB28FB2A-FB36FB38-FB3CFB3EFB40FB41FB43FB44FB46-FBB1FBD3-FD3DFD50-FD8FFD92-FDC7FDF0-FDFBFE70-FE74FE76-FEFCFF21-FF3AFF41-FF5AFF66-FFBEFFC2-FFC7FFCA-FFCFFFD2-FFD7FFDA-FFDC",Ll:"0061-007A00AA00B500BA00DF-00F600F8-00FF01010103010501070109010B010D010F01110113011501170119011B011D011F01210123012501270129012B012D012F01310133013501370138013A013C013E014001420144014601480149014B014D014F01510153015501570159015B015D015F01610163016501670169016B016D016F0171017301750177017A017C017E-0180018301850188018C018D019201950199-019B019E01A101A301A501A801AA01AB01AD01B001B401B601B901BA01BD-01BF01C601C901CC01CE01D001D201D401D601D801DA01DC01DD01DF01E101E301E501E701E901EB01ED01EF01F001F301F501F901FB01FD01FF02010203020502070209020B020D020F02110213021502170219021B021D021F02210223022502270229022B022D022F02310233-0239023C023F0240024202470249024B024D024F-02930295-02AF037103730377037B-037D039003AC-03CE03D003D103D5-03D703D903DB03DD03DF03E103E303E503E703E903EB03ED03EF-03F303F503F803FB03FC0430-045F04610463046504670469046B046D046F04710473047504770479047B047D047F0481048B048D048F04910493049504970499049B049D049F04A104A304A504A704A904AB04AD04AF04B104B304B504B704B904BB04BD04BF04C204C404C604C804CA04CC04CE04CF04D104D304D504D704D904DB04DD04DF04E104E304E504E704E904EB04ED04EF04F104F304F504F704F904FB04FD04FF05010503050505070509050B050D050F05110513051505170519051B051D051F0521052305250561-05871D00-1D2B1D62-1D771D79-1D9A1E011E031E051E071E091E0B1E0D1E0F1E111E131E151E171E191E1B1E1D1E1F1E211E231E251E271E291E2B1E2D1E2F1E311E331E351E371E391E3B1E3D1E3F1E411E431E451E471E491E4B1E4D1E4F1E511E531E551E571E591E5B1E5D1E5F1E611E631E651E671E691E6B1E6D1E6F1E711E731E751E771E791E7B1E7D1E7F1E811E831E851E871E891E8B1E8D1E8F1E911E931E95-1E9D1E9F1EA11EA31EA51EA71EA91EAB1EAD1EAF1EB11EB31EB51EB71EB91EBB1EBD1EBF1EC11EC31EC51EC71EC91ECB1ECD1ECF1ED11ED31ED51ED71ED91EDB1EDD1EDF1EE11EE31EE51EE71EE91EEB1EED1EEF1EF11EF31EF51EF71EF91EFB1EFD1EFF-1F071F10-1F151F20-1F271F30-1F371F40-1F451F50-1F571F60-1F671F70-1F7D1F80-1F871F90-1F971FA0-1FA71FB0-1FB41FB61FB71FBE1FC2-1FC41FC61FC71FD0-1FD31FD61FD71FE0-1FE71FF2-1FF41FF61FF7210A210E210F2113212F21342139213C213D2146-2149214E21842C30-2C5E2C612C652C662C682C6A2C6C2C712C732C742C76-2C7C2C812C832C852C872C892C8B2C8D2C8F2C912C932C952C972C992C9B2C9D2C9F2CA12CA32CA52CA72CA92CAB2CAD2CAF2CB12CB32CB52CB72CB92CBB2CBD2CBF2CC12CC32CC52CC72CC92CCB2CCD2CCF2CD12CD32CD52CD72CD92CDB2CDD2CDF2CE12CE32CE42CEC2CEE2D00-2D25A641A643A645A647A649A64BA64DA64FA651A653A655A657A659A65BA65DA65FA663A665A667A669A66BA66DA681A683A685A687A689A68BA68DA68FA691A693A695A697A723A725A727A729A72BA72DA72F-A731A733A735A737A739A73BA73DA73FA741A743A745A747A749A74BA74DA74FA751A753A755A757A759A75BA75DA75FA761A763A765A767A769A76BA76DA76FA771-A778A77AA77CA77FA781A783A785A787A78CFB00-FB06FB13-FB17FF41-FF5A",Lu:"0041-005A00C0-00D600D8-00DE01000102010401060108010A010C010E01100112011401160118011A011C011E01200122012401260128012A012C012E01300132013401360139013B013D013F0141014301450147014A014C014E01500152015401560158015A015C015E01600162016401660168016A016C016E017001720174017601780179017B017D018101820184018601870189-018B018E-0191019301940196-0198019C019D019F01A001A201A401A601A701A901AC01AE01AF01B1-01B301B501B701B801BC01C401C701CA01CD01CF01D101D301D501D701D901DB01DE01E001E201E401E601E801EA01EC01EE01F101F401F6-01F801FA01FC01FE02000202020402060208020A020C020E02100212021402160218021A021C021E02200222022402260228022A022C022E02300232023A023B023D023E02410243-02460248024A024C024E03700372037603860388-038A038C038E038F0391-03A103A3-03AB03CF03D2-03D403D803DA03DC03DE03E003E203E403E603E803EA03EC03EE03F403F703F903FA03FD-042F04600462046404660468046A046C046E04700472047404760478047A047C047E0480048A048C048E04900492049404960498049A049C049E04A004A204A404A604A804AA04AC04AE04B004B204B404B604B804BA04BC04BE04C004C104C304C504C704C904CB04CD04D004D204D404D604D804DA04DC04DE04E004E204E404E604E804EA04EC04EE04F004F204F404F604F804FA04FC04FE05000502050405060508050A050C050E05100512051405160518051A051C051E0520052205240531-055610A0-10C51E001E021E041E061E081E0A1E0C1E0E1E101E121E141E161E181E1A1E1C1E1E1E201E221E241E261E281E2A1E2C1E2E1E301E321E341E361E381E3A1E3C1E3E1E401E421E441E461E481E4A1E4C1E4E1E501E521E541E561E581E5A1E5C1E5E1E601E621E641E661E681E6A1E6C1E6E1E701E721E741E761E781E7A1E7C1E7E1E801E821E841E861E881E8A1E8C1E8E1E901E921E941E9E1EA01EA21EA41EA61EA81EAA1EAC1EAE1EB01EB21EB41EB61EB81EBA1EBC1EBE1EC01EC21EC41EC61EC81ECA1ECC1ECE1ED01ED21ED41ED61ED81EDA1EDC1EDE1EE01EE21EE41EE61EE81EEA1EEC1EEE1EF01EF21EF41EF61EF81EFA1EFC1EFE1F08-1F0F1F18-1F1D1F28-1F2F1F38-1F3F1F48-1F4D1F591F5B1F5D1F5F1F68-1F6F1FB8-1FBB1FC8-1FCB1FD8-1FDB1FE8-1FEC1FF8-1FFB21022107210B-210D2110-211221152119-211D212421262128212A-212D2130-2133213E213F214521832C00-2C2E2C602C62-2C642C672C692C6B2C6D-2C702C722C752C7E-2C802C822C842C862C882C8A2C8C2C8E2C902C922C942C962C982C9A2C9C2C9E2CA02CA22CA42CA62CA82CAA2CAC2CAE2CB02CB22CB42CB62CB82CBA2CBC2CBE2CC02CC22CC42CC62CC82CCA2CCC2CCE2CD02CD22CD42CD62CD82CDA2CDC2CDE2CE02CE22CEB2CEDA640A642A644A646A648A64AA64CA64EA650A652A654A656A658A65AA65CA65EA662A664A666A668A66AA66CA680A682A684A686A688A68AA68CA68EA690A692A694A696A722A724A726A728A72AA72CA72EA732A734A736A738A73AA73CA73EA740A742A744A746A748A74AA74CA74EA750A752A754A756A758A75AA75CA75EA760A762A764A766A768A76AA76CA76EA779A77BA77DA77EA780A782A784A786A78BFF21-FF3A",Lt:"01C501C801CB01F21F88-1F8F1F98-1F9F1FA8-1FAF1FBC1FCC1FFC",Lm:"02B0-02C102C6-02D102E0-02E402EC02EE0374037A0559064006E506E607F407F507FA081A0824082809710E460EC610FC17D718431AA71C78-1C7D1D2C-1D611D781D9B-1DBF2071207F2090-20942C7D2D6F2E2F30053031-3035303B309D309E30FC-30FEA015A4F8-A4FDA60CA67FA717-A71FA770A788A9CFAA70AADDFF70FF9EFF9F",Lo:"01BB01C0-01C3029405D0-05EA05F0-05F20621-063F0641-064A066E066F0671-06D306D506EE06EF06FA-06FC06FF07100712-072F074D-07A507B107CA-07EA0800-08150904-0939093D09500958-096109720979-097F0985-098C098F09900993-09A809AA-09B009B209B6-09B909BD09CE09DC09DD09DF-09E109F009F10A05-0A0A0A0F0A100A13-0A280A2A-0A300A320A330A350A360A380A390A59-0A5C0A5E0A72-0A740A85-0A8D0A8F-0A910A93-0AA80AAA-0AB00AB20AB30AB5-0AB90ABD0AD00AE00AE10B05-0B0C0B0F0B100B13-0B280B2A-0B300B320B330B35-0B390B3D0B5C0B5D0B5F-0B610B710B830B85-0B8A0B8E-0B900B92-0B950B990B9A0B9C0B9E0B9F0BA30BA40BA8-0BAA0BAE-0BB90BD00C05-0C0C0C0E-0C100C12-0C280C2A-0C330C35-0C390C3D0C580C590C600C610C85-0C8C0C8E-0C900C92-0CA80CAA-0CB30CB5-0CB90CBD0CDE0CE00CE10D05-0D0C0D0E-0D100D12-0D280D2A-0D390D3D0D600D610D7A-0D7F0D85-0D960D9A-0DB10DB3-0DBB0DBD0DC0-0DC60E01-0E300E320E330E40-0E450E810E820E840E870E880E8A0E8D0E94-0E970E99-0E9F0EA1-0EA30EA50EA70EAA0EAB0EAD-0EB00EB20EB30EBD0EC0-0EC40EDC0EDD0F000F40-0F470F49-0F6C0F88-0F8B1000-102A103F1050-1055105A-105D106110651066106E-10701075-1081108E10D0-10FA1100-1248124A-124D1250-12561258125A-125D1260-1288128A-128D1290-12B012B2-12B512B8-12BE12C012C2-12C512C8-12D612D8-13101312-13151318-135A1380-138F13A0-13F41401-166C166F-167F1681-169A16A0-16EA1700-170C170E-17111720-17311740-17511760-176C176E-17701780-17B317DC1820-18421844-18771880-18A818AA18B0-18F51900-191C1950-196D1970-19741980-19AB19C1-19C71A00-1A161A20-1A541B05-1B331B45-1B4B1B83-1BA01BAE1BAF1C00-1C231C4D-1C4F1C5A-1C771CE9-1CEC1CEE-1CF12135-21382D30-2D652D80-2D962DA0-2DA62DA8-2DAE2DB0-2DB62DB8-2DBE2DC0-2DC62DC8-2DCE2DD0-2DD62DD8-2DDE3006303C3041-3096309F30A1-30FA30FF3105-312D3131-318E31A0-31B731F0-31FF3400-4DB54E00-9FCBA000-A014A016-A48CA4D0-A4F7A500-A60BA610-A61FA62AA62BA66EA6A0-A6E5A7FB-A801A803-A805A807-A80AA80C-A822A840-A873A882-A8B3A8F2-A8F7A8FBA90A-A925A930-A946A960-A97CA984-A9B2AA00-AA28AA40-AA42AA44-AA4BAA60-AA6FAA71-AA76AA7AAA80-AAAFAAB1AAB5AAB6AAB9-AABDAAC0AAC2AADBAADCABC0-ABE2AC00-D7A3D7B0-D7C6D7CB-D7FBF900-FA2DFA30-FA6DFA70-FAD9FB1DFB1F-FB28FB2A-FB36FB38-FB3CFB3EFB40FB41FB43FB44FB46-FBB1FBD3-FD3DFD50-FD8FFD92-FDC7FDF0-FDFBFE70-FE74FE76-FEFCFF66-FF6FFF71-FF9DFFA0-FFBEFFC2-FFC7FFCA-FFCFFFD2-FFD7FFDA-FFDC",M:"0300-036F0483-04890591-05BD05BF05C105C205C405C505C70610-061A064B-065E067006D6-06DC06DE-06E406E706E806EA-06ED07110730-074A07A6-07B007EB-07F30816-0819081B-08230825-08270829-082D0900-0903093C093E-094E0951-0955096209630981-098309BC09BE-09C409C709C809CB-09CD09D709E209E30A01-0A030A3C0A3E-0A420A470A480A4B-0A4D0A510A700A710A750A81-0A830ABC0ABE-0AC50AC7-0AC90ACB-0ACD0AE20AE30B01-0B030B3C0B3E-0B440B470B480B4B-0B4D0B560B570B620B630B820BBE-0BC20BC6-0BC80BCA-0BCD0BD70C01-0C030C3E-0C440C46-0C480C4A-0C4D0C550C560C620C630C820C830CBC0CBE-0CC40CC6-0CC80CCA-0CCD0CD50CD60CE20CE30D020D030D3E-0D440D46-0D480D4A-0D4D0D570D620D630D820D830DCA0DCF-0DD40DD60DD8-0DDF0DF20DF30E310E34-0E3A0E47-0E4E0EB10EB4-0EB90EBB0EBC0EC8-0ECD0F180F190F350F370F390F3E0F3F0F71-0F840F860F870F90-0F970F99-0FBC0FC6102B-103E1056-1059105E-10601062-10641067-106D1071-10741082-108D108F109A-109D135F1712-17141732-1734175217531772177317B6-17D317DD180B-180D18A91920-192B1930-193B19B0-19C019C819C91A17-1A1B1A55-1A5E1A60-1A7C1A7F1B00-1B041B34-1B441B6B-1B731B80-1B821BA1-1BAA1C24-1C371CD0-1CD21CD4-1CE81CED1CF21DC0-1DE61DFD-1DFF20D0-20F02CEF-2CF12DE0-2DFF302A-302F3099309AA66F-A672A67CA67DA6F0A6F1A802A806A80BA823-A827A880A881A8B4-A8C4A8E0-A8F1A926-A92DA947-A953A980-A983A9B3-A9C0AA29-AA36AA43AA4CAA4DAA7BAAB0AAB2-AAB4AAB7AAB8AABEAABFAAC1ABE3-ABEAABECABEDFB1EFE00-FE0FFE20-FE26",Mn:"0300-036F0483-04870591-05BD05BF05C105C205C405C505C70610-061A064B-065E067006D6-06DC06DF-06E406E706E806EA-06ED07110730-074A07A6-07B007EB-07F30816-0819081B-08230825-08270829-082D0900-0902093C0941-0948094D0951-095509620963098109BC09C1-09C409CD09E209E30A010A020A3C0A410A420A470A480A4B-0A4D0A510A700A710A750A810A820ABC0AC1-0AC50AC70AC80ACD0AE20AE30B010B3C0B3F0B41-0B440B4D0B560B620B630B820BC00BCD0C3E-0C400C46-0C480C4A-0C4D0C550C560C620C630CBC0CBF0CC60CCC0CCD0CE20CE30D41-0D440D4D0D620D630DCA0DD2-0DD40DD60E310E34-0E3A0E47-0E4E0EB10EB4-0EB90EBB0EBC0EC8-0ECD0F180F190F350F370F390F71-0F7E0F80-0F840F860F870F90-0F970F99-0FBC0FC6102D-10301032-10371039103A103D103E10581059105E-10601071-1074108210851086108D109D135F1712-17141732-1734175217531772177317B7-17BD17C617C9-17D317DD180B-180D18A91920-19221927192819321939-193B1A171A181A561A58-1A5E1A601A621A65-1A6C1A73-1A7C1A7F1B00-1B031B341B36-1B3A1B3C1B421B6B-1B731B801B811BA2-1BA51BA81BA91C2C-1C331C361C371CD0-1CD21CD4-1CE01CE2-1CE81CED1DC0-1DE61DFD-1DFF20D0-20DC20E120E5-20F02CEF-2CF12DE0-2DFF302A-302F3099309AA66FA67CA67DA6F0A6F1A802A806A80BA825A826A8C4A8E0-A8F1A926-A92DA947-A951A980-A982A9B3A9B6-A9B9A9BCAA29-AA2EAA31AA32AA35AA36AA43AA4CAAB0AAB2-AAB4AAB7AAB8AABEAABFAAC1ABE5ABE8ABEDFB1EFE00-FE0FFE20-FE26",Mc:"0903093E-09400949-094C094E0982098309BE-09C009C709C809CB09CC09D70A030A3E-0A400A830ABE-0AC00AC90ACB0ACC0B020B030B3E0B400B470B480B4B0B4C0B570BBE0BBF0BC10BC20BC6-0BC80BCA-0BCC0BD70C01-0C030C41-0C440C820C830CBE0CC0-0CC40CC70CC80CCA0CCB0CD50CD60D020D030D3E-0D400D46-0D480D4A-0D4C0D570D820D830DCF-0DD10DD8-0DDF0DF20DF30F3E0F3F0F7F102B102C10311038103B103C105610571062-10641067-106D108310841087-108C108F109A-109C17B617BE-17C517C717C81923-19261929-192B193019311933-193819B0-19C019C819C91A19-1A1B1A551A571A611A631A641A6D-1A721B041B351B3B1B3D-1B411B431B441B821BA11BA61BA71BAA1C24-1C2B1C341C351CE11CF2A823A824A827A880A881A8B4-A8C3A952A953A983A9B4A9B5A9BAA9BBA9BD-A9C0AA2FAA30AA33AA34AA4DAA7BABE3ABE4ABE6ABE7ABE9ABEAABEC",Me:"0488048906DE20DD-20E020E2-20E4A670-A672",N:"0030-003900B200B300B900BC-00BE0660-066906F0-06F907C0-07C90966-096F09E6-09EF09F4-09F90A66-0A6F0AE6-0AEF0B66-0B6F0BE6-0BF20C66-0C6F0C78-0C7E0CE6-0CEF0D66-0D750E50-0E590ED0-0ED90F20-0F331040-10491090-10991369-137C16EE-16F017E0-17E917F0-17F91810-18191946-194F19D0-19DA1A80-1A891A90-1A991B50-1B591BB0-1BB91C40-1C491C50-1C5920702074-20792080-20892150-21822185-21892460-249B24EA-24FF2776-27932CFD30073021-30293038-303A3192-31953220-32293251-325F3280-328932B1-32BFA620-A629A6E6-A6EFA830-A835A8D0-A8D9A900-A909A9D0-A9D9AA50-AA59ABF0-ABF9FF10-FF19",Nd:"0030-00390660-066906F0-06F907C0-07C90966-096F09E6-09EF0A66-0A6F0AE6-0AEF0B66-0B6F0BE6-0BEF0C66-0C6F0CE6-0CEF0D66-0D6F0E50-0E590ED0-0ED90F20-0F291040-10491090-109917E0-17E91810-18191946-194F19D0-19DA1A80-1A891A90-1A991B50-1B591BB0-1BB91C40-1C491C50-1C59A620-A629A8D0-A8D9A900-A909A9D0-A9D9AA50-AA59ABF0-ABF9FF10-FF19",Nl:"16EE-16F02160-21822185-218830073021-30293038-303AA6E6-A6EF",No:"00B200B300B900BC-00BE09F4-09F90BF0-0BF20C78-0C7E0D70-0D750F2A-0F331369-137C17F0-17F920702074-20792080-20892150-215F21892460-249B24EA-24FF2776-27932CFD3192-31953220-32293251-325F3280-328932B1-32BFA830-A835",P:"0021-00230025-002A002C-002F003A003B003F0040005B-005D005F007B007D00A100AB00B700BB00BF037E0387055A-055F0589058A05BE05C005C305C605F305F40609060A060C060D061B061E061F066A-066D06D40700-070D07F7-07F90830-083E0964096509700DF40E4F0E5A0E5B0F04-0F120F3A-0F3D0F850FD0-0FD4104A-104F10FB1361-13681400166D166E169B169C16EB-16ED1735173617D4-17D617D8-17DA1800-180A1944194519DE19DF1A1E1A1F1AA0-1AA61AA8-1AAD1B5A-1B601C3B-1C3F1C7E1C7F1CD32010-20272030-20432045-20512053-205E207D207E208D208E2329232A2768-277527C527C627E6-27EF2983-299829D8-29DB29FC29FD2CF9-2CFC2CFE2CFF2E00-2E2E2E302E313001-30033008-30113014-301F3030303D30A030FBA4FEA4FFA60D-A60FA673A67EA6F2-A6F7A874-A877A8CEA8CFA8F8-A8FAA92EA92FA95FA9C1-A9CDA9DEA9DFAA5C-AA5FAADEAADFABEBFD3EFD3FFE10-FE19FE30-FE52FE54-FE61FE63FE68FE6AFE6BFF01-FF03FF05-FF0AFF0C-FF0FFF1AFF1BFF1FFF20FF3B-FF3DFF3FFF5BFF5DFF5F-FF65",Pd:"002D058A05BE140018062010-20152E172E1A301C303030A0FE31FE32FE58FE63FF0D",Ps:"0028005B007B0F3A0F3C169B201A201E2045207D208D23292768276A276C276E27702772277427C527E627E827EA27EC27EE2983298529872989298B298D298F299129932995299729D829DA29FC2E222E242E262E283008300A300C300E3010301430163018301A301DFD3EFE17FE35FE37FE39FE3BFE3DFE3FFE41FE43FE47FE59FE5BFE5DFF08FF3BFF5BFF5FFF62",Pe:"0029005D007D0F3B0F3D169C2046207E208E232A2769276B276D276F27712773277527C627E727E927EB27ED27EF298429862988298A298C298E2990299229942996299829D929DB29FD2E232E252E272E293009300B300D300F3011301530173019301B301E301FFD3FFE18FE36FE38FE3AFE3CFE3EFE40FE42FE44FE48FE5AFE5CFE5EFF09FF3DFF5DFF60FF63",Pi:"00AB2018201B201C201F20392E022E042E092E0C2E1C2E20",Pf:"00BB2019201D203A2E032E052E0A2E0D2E1D2E21",Pc:"005F203F20402054FE33FE34FE4D-FE4FFF3F",Po:"0021-00230025-0027002A002C002E002F003A003B003F0040005C00A100B700BF037E0387055A-055F058905C005C305C605F305F40609060A060C060D061B061E061F066A-066D06D40700-070D07F7-07F90830-083E0964096509700DF40E4F0E5A0E5B0F04-0F120F850FD0-0FD4104A-104F10FB1361-1368166D166E16EB-16ED1735173617D4-17D617D8-17DA1800-18051807-180A1944194519DE19DF1A1E1A1F1AA0-1AA61AA8-1AAD1B5A-1B601C3B-1C3F1C7E1C7F1CD3201620172020-20272030-2038203B-203E2041-20432047-205120532055-205E2CF9-2CFC2CFE2CFF2E002E012E06-2E082E0B2E0E-2E162E182E192E1B2E1E2E1F2E2A-2E2E2E302E313001-3003303D30FBA4FEA4FFA60D-A60FA673A67EA6F2-A6F7A874-A877A8CEA8CFA8F8-A8FAA92EA92FA95FA9C1-A9CDA9DEA9DFAA5C-AA5FAADEAADFABEBFE10-FE16FE19FE30FE45FE46FE49-FE4CFE50-FE52FE54-FE57FE5F-FE61FE68FE6AFE6BFF01-FF03FF05-FF07FF0AFF0CFF0EFF0FFF1AFF1BFF1FFF20FF3CFF61FF64FF65",S:"0024002B003C-003E005E0060007C007E00A2-00A900AC00AE-00B100B400B600B800D700F702C2-02C502D2-02DF02E5-02EB02ED02EF-02FF03750384038503F604820606-0608060B060E060F06E906FD06FE07F609F209F309FA09FB0AF10B700BF3-0BFA0C7F0CF10CF20D790E3F0F01-0F030F13-0F170F1A-0F1F0F340F360F380FBE-0FC50FC7-0FCC0FCE0FCF0FD5-0FD8109E109F13601390-139917DB194019E0-19FF1B61-1B6A1B74-1B7C1FBD1FBF-1FC11FCD-1FCF1FDD-1FDF1FED-1FEF1FFD1FFE20442052207A-207C208A-208C20A0-20B8210021012103-21062108210921142116-2118211E-2123212521272129212E213A213B2140-2144214A-214D214F2190-2328232B-23E82400-24262440-244A249C-24E92500-26CD26CF-26E126E326E8-26FF2701-27042706-2709270C-27272729-274B274D274F-27522756-275E2761-276727942798-27AF27B1-27BE27C0-27C427C7-27CA27CC27D0-27E527F0-29822999-29D729DC-29FB29FE-2B4C2B50-2B592CE5-2CEA2E80-2E992E9B-2EF32F00-2FD52FF0-2FFB300430123013302030363037303E303F309B309C319031913196-319F31C0-31E33200-321E322A-32503260-327F328A-32B032C0-32FE3300-33FF4DC0-4DFFA490-A4C6A700-A716A720A721A789A78AA828-A82BA836-A839AA77-AA79FB29FDFCFDFDFE62FE64-FE66FE69FF04FF0BFF1C-FF1EFF3EFF40FF5CFF5EFFE0-FFE6FFE8-FFEEFFFCFFFD",Sm:"002B003C-003E007C007E00AC00B100D700F703F60606-060820442052207A-207C208A-208C2140-2144214B2190-2194219A219B21A021A321A621AE21CE21CF21D221D421F4-22FF2308-230B23202321237C239B-23B323DC-23E125B725C125F8-25FF266F27C0-27C427C7-27CA27CC27D0-27E527F0-27FF2900-29822999-29D729DC-29FB29FE-2AFF2B30-2B442B47-2B4CFB29FE62FE64-FE66FF0BFF1C-FF1EFF5CFF5EFFE2FFE9-FFEC",Sc:"002400A2-00A5060B09F209F309FB0AF10BF90E3F17DB20A0-20B8A838FDFCFE69FF04FFE0FFE1FFE5FFE6",Sk:"005E006000A800AF00B400B802C2-02C502D2-02DF02E5-02EB02ED02EF-02FF0375038403851FBD1FBF-1FC11FCD-1FCF1FDD-1FDF1FED-1FEF1FFD1FFE309B309CA700-A716A720A721A789A78AFF3EFF40FFE3",So:"00A600A700A900AE00B000B60482060E060F06E906FD06FE07F609FA0B700BF3-0BF80BFA0C7F0CF10CF20D790F01-0F030F13-0F170F1A-0F1F0F340F360F380FBE-0FC50FC7-0FCC0FCE0FCF0FD5-0FD8109E109F13601390-1399194019E0-19FF1B61-1B6A1B74-1B7C210021012103-21062108210921142116-2118211E-2123212521272129212E213A213B214A214C214D214F2195-2199219C-219F21A121A221A421A521A7-21AD21AF-21CD21D021D121D321D5-21F32300-2307230C-231F2322-2328232B-237B237D-239A23B4-23DB23E2-23E82400-24262440-244A249C-24E92500-25B625B8-25C025C2-25F72600-266E2670-26CD26CF-26E126E326E8-26FF2701-27042706-2709270C-27272729-274B274D274F-27522756-275E2761-276727942798-27AF27B1-27BE2800-28FF2B00-2B2F2B452B462B50-2B592CE5-2CEA2E80-2E992E9B-2EF32F00-2FD52FF0-2FFB300430123013302030363037303E303F319031913196-319F31C0-31E33200-321E322A-32503260-327F328A-32B032C0-32FE3300-33FF4DC0-4DFFA490-A4C6A828-A82BA836A837A839AA77-AA79FDFDFFE4FFE8FFEDFFEEFFFCFFFD",Z:"002000A01680180E2000-200A20282029202F205F3000",Zs:"002000A01680180E2000-200A202F205F3000",Zl:"2028",Zp:"2029",C:"0000-001F007F-009F00AD03780379037F-0383038B038D03A20526-05300557055805600588058B-059005C8-05CF05EB-05EF05F5-0605061C061D0620065F06DD070E070F074B074C07B2-07BF07FB-07FF082E082F083F-08FF093A093B094F095609570973-097809800984098D098E0991099209A909B109B3-09B509BA09BB09C509C609C909CA09CF-09D609D8-09DB09DE09E409E509FC-0A000A040A0B-0A0E0A110A120A290A310A340A370A3A0A3B0A3D0A43-0A460A490A4A0A4E-0A500A52-0A580A5D0A5F-0A650A76-0A800A840A8E0A920AA90AB10AB40ABA0ABB0AC60ACA0ACE0ACF0AD1-0ADF0AE40AE50AF00AF2-0B000B040B0D0B0E0B110B120B290B310B340B3A0B3B0B450B460B490B4A0B4E-0B550B58-0B5B0B5E0B640B650B72-0B810B840B8B-0B8D0B910B96-0B980B9B0B9D0BA0-0BA20BA5-0BA70BAB-0BAD0BBA-0BBD0BC3-0BC50BC90BCE0BCF0BD1-0BD60BD8-0BE50BFB-0C000C040C0D0C110C290C340C3A-0C3C0C450C490C4E-0C540C570C5A-0C5F0C640C650C70-0C770C800C810C840C8D0C910CA90CB40CBA0CBB0CC50CC90CCE-0CD40CD7-0CDD0CDF0CE40CE50CF00CF3-0D010D040D0D0D110D290D3A-0D3C0D450D490D4E-0D560D58-0D5F0D640D650D76-0D780D800D810D840D97-0D990DB20DBC0DBE0DBF0DC7-0DC90DCB-0DCE0DD50DD70DE0-0DF10DF5-0E000E3B-0E3E0E5C-0E800E830E850E860E890E8B0E8C0E8E-0E930E980EA00EA40EA60EA80EA90EAC0EBA0EBE0EBF0EC50EC70ECE0ECF0EDA0EDB0EDE-0EFF0F480F6D-0F700F8C-0F8F0F980FBD0FCD0FD9-0FFF10C6-10CF10FD-10FF1249124E124F12571259125E125F1289128E128F12B112B612B712BF12C112C612C712D7131113161317135B-135E137D-137F139A-139F13F5-13FF169D-169F16F1-16FF170D1715-171F1737-173F1754-175F176D17711774-177F17B417B517DE17DF17EA-17EF17FA-17FF180F181A-181F1878-187F18AB-18AF18F6-18FF191D-191F192C-192F193C-193F1941-1943196E196F1975-197F19AC-19AF19CA-19CF19DB-19DD1A1C1A1D1A5F1A7D1A7E1A8A-1A8F1A9A-1A9F1AAE-1AFF1B4C-1B4F1B7D-1B7F1BAB-1BAD1BBA-1BFF1C38-1C3A1C4A-1C4C1C80-1CCF1CF3-1CFF1DE7-1DFC1F161F171F1E1F1F1F461F471F4E1F4F1F581F5A1F5C1F5E1F7E1F7F1FB51FC51FD41FD51FDC1FF01FF11FF51FFF200B-200F202A-202E2060-206F20722073208F2095-209F20B9-20CF20F1-20FF218A-218F23E9-23FF2427-243F244B-245F26CE26E226E4-26E727002705270A270B2728274C274E2753-2755275F27602795-279727B027BF27CB27CD-27CF2B4D-2B4F2B5A-2BFF2C2F2C5F2CF2-2CF82D26-2D2F2D66-2D6E2D70-2D7F2D97-2D9F2DA72DAF2DB72DBF2DC72DCF2DD72DDF2E32-2E7F2E9A2EF4-2EFF2FD6-2FEF2FFC-2FFF3040309730983100-3104312E-3130318F31B8-31BF31E4-31EF321F32FF4DB6-4DBF9FCC-9FFFA48D-A48FA4C7-A4CFA62C-A63FA660A661A674-A67BA698-A69FA6F8-A6FFA78D-A7FAA82C-A82FA83A-A83FA878-A87FA8C5-A8CDA8DA-A8DFA8FC-A8FFA954-A95EA97D-A97FA9CEA9DA-A9DDA9E0-A9FFAA37-AA3FAA4EAA4FAA5AAA5BAA7C-AA7FAAC3-AADAAAE0-ABBFABEEABEFABFA-ABFFD7A4-D7AFD7C7-D7CAD7FC-F8FFFA2EFA2FFA6EFA6FFADA-FAFFFB07-FB12FB18-FB1CFB37FB3DFB3FFB42FB45FBB2-FBD2FD40-FD4FFD90FD91FDC8-FDEFFDFEFDFFFE1A-FE1FFE27-FE2FFE53FE67FE6C-FE6FFE75FEFD-FF00FFBF-FFC1FFC8FFC9FFD0FFD1FFD8FFD9FFDD-FFDFFFE7FFEF-FFFBFFFEFFFF",Cc:"0000-001F007F-009F",Cf:"00AD0600-060306DD070F17B417B5200B-200F202A-202E2060-2064206A-206FFEFFFFF9-FFFB",Co:"E000-F8FF",Cs:"D800-DFFF",Cn:"03780379037F-0383038B038D03A20526-05300557055805600588058B-059005C8-05CF05EB-05EF05F5-05FF06040605061C061D0620065F070E074B074C07B2-07BF07FB-07FF082E082F083F-08FF093A093B094F095609570973-097809800984098D098E0991099209A909B109B3-09B509BA09BB09C509C609C909CA09CF-09D609D8-09DB09DE09E409E509FC-0A000A040A0B-0A0E0A110A120A290A310A340A370A3A0A3B0A3D0A43-0A460A490A4A0A4E-0A500A52-0A580A5D0A5F-0A650A76-0A800A840A8E0A920AA90AB10AB40ABA0ABB0AC60ACA0ACE0ACF0AD1-0ADF0AE40AE50AF00AF2-0B000B040B0D0B0E0B110B120B290B310B340B3A0B3B0B450B460B490B4A0B4E-0B550B58-0B5B0B5E0B640B650B72-0B810B840B8B-0B8D0B910B96-0B980B9B0B9D0BA0-0BA20BA5-0BA70BAB-0BAD0BBA-0BBD0BC3-0BC50BC90BCE0BCF0BD1-0BD60BD8-0BE50BFB-0C000C040C0D0C110C290C340C3A-0C3C0C450C490C4E-0C540C570C5A-0C5F0C640C650C70-0C770C800C810C840C8D0C910CA90CB40CBA0CBB0CC50CC90CCE-0CD40CD7-0CDD0CDF0CE40CE50CF00CF3-0D010D040D0D0D110D290D3A-0D3C0D450D490D4E-0D560D58-0D5F0D640D650D76-0D780D800D810D840D97-0D990DB20DBC0DBE0DBF0DC7-0DC90DCB-0DCE0DD50DD70DE0-0DF10DF5-0E000E3B-0E3E0E5C-0E800E830E850E860E890E8B0E8C0E8E-0E930E980EA00EA40EA60EA80EA90EAC0EBA0EBE0EBF0EC50EC70ECE0ECF0EDA0EDB0EDE-0EFF0F480F6D-0F700F8C-0F8F0F980FBD0FCD0FD9-0FFF10C6-10CF10FD-10FF1249124E124F12571259125E125F1289128E128F12B112B612B712BF12C112C612C712D7131113161317135B-135E137D-137F139A-139F13F5-13FF169D-169F16F1-16FF170D1715-171F1737-173F1754-175F176D17711774-177F17DE17DF17EA-17EF17FA-17FF180F181A-181F1878-187F18AB-18AF18F6-18FF191D-191F192C-192F193C-193F1941-1943196E196F1975-197F19AC-19AF19CA-19CF19DB-19DD1A1C1A1D1A5F1A7D1A7E1A8A-1A8F1A9A-1A9F1AAE-1AFF1B4C-1B4F1B7D-1B7F1BAB-1BAD1BBA-1BFF1C38-1C3A1C4A-1C4C1C80-1CCF1CF3-1CFF1DE7-1DFC1F161F171F1E1F1F1F461F471F4E1F4F1F581F5A1F5C1F5E1F7E1F7F1FB51FC51FD41FD51FDC1FF01FF11FF51FFF2065-206920722073208F2095-209F20B9-20CF20F1-20FF218A-218F23E9-23FF2427-243F244B-245F26CE26E226E4-26E727002705270A270B2728274C274E2753-2755275F27602795-279727B027BF27CB27CD-27CF2B4D-2B4F2B5A-2BFF2C2F2C5F2CF2-2CF82D26-2D2F2D66-2D6E2D70-2D7F2D97-2D9F2DA72DAF2DB72DBF2DC72DCF2DD72DDF2E32-2E7F2E9A2EF4-2EFF2FD6-2FEF2FFC-2FFF3040309730983100-3104312E-3130318F31B8-31BF31E4-31EF321F32FF4DB6-4DBF9FCC-9FFFA48D-A48FA4C7-A4CFA62C-A63FA660A661A674-A67BA698-A69FA6F8-A6FFA78D-A7FAA82C-A82FA83A-A83FA878-A87FA8C5-A8CDA8DA-A8DFA8FC-A8FFA954-A95EA97D-A97FA9CEA9DA-A9DDA9E0-A9FFAA37-AA3FAA4EAA4FAA5AAA5BAA7C-AA7FAAC3-AADAAAE0-ABBFABEEABEFABFA-ABFFD7A4-D7AFD7C7-D7CAD7FC-D7FFFA2EFA2FFA6EFA6FFADA-FAFFFB07-FB12FB18-FB1CFB37FB3DFB3FFB42FB45FBB2-FBD2FD40-FD4FFD90FD91FDC8-FDEFFDFEFDFFFE1A-FE1FFE27-FE2FFE53FE67FE6C-FE6FFE75FEFDFEFEFF00FFBF-FFC1FFC8FFC9FFD0FFD1FFD8FFD9FFDD-FFDFFFE7FFEF-FFF8FFFEFFFF"})}),ace.define("ace/mode/text",["require","exports","module","ace/tokenizer","ace/mode/text_highlight_rules","ace/mode/behaviour/cstyle","ace/unicode","ace/lib/lang","ace/token_iterator","ace/range"],function(e,t,n){"use strict";var r=e("../tokenizer").Tokenizer,i=e("./text_highlight_rules").TextHighlightRules,s=e("./behaviour/cstyle").CstyleBehaviour,o=e("../unicode"),u=e("../lib/lang"),a=e("../token_iterator").TokenIterator,f=e("../range").Range,l=function(){this.HighlightRules=i};(function(){this.$defaultBehaviour=new s,this.tokenRe=new RegExp("^["+o.packages.L+o.packages.Mn+o.packages.Mc+o.packages.Nd+o.packages.Pc+"\\$_]+","g"),this.nonTokenRe=new RegExp("^(?:[^"+o.packages.L+o.packages.Mn+o.packages.Mc+o.packages.Nd+o.packages.Pc+"\\$_]|\\s])+","g"),this.getTokenizer=function(){return this.$tokenizer||(this.$highlightRules=this.$highlightRules||new this.HighlightRules(this.$highlightRuleConfig),this.$tokenizer=new r(this.$highlightRules.getRules())),this.$tokenizer},this.lineCommentStart="",this.blockComment="",this.toggleCommentLines=function(e,t,n,r){function w(e){for(var t=n;t<=r;t++)e(i.getLine(t),t)}var i=t.doc,s=!0,o=!0,a=Infinity,f=t.getTabSize(),l=!1;if(!this.lineCommentStart){if(!this.blockComment)return!1;var c=this.blockComment.start,h=this.blockComment.end,p=new RegExp("^(\\s*)(?:"+u.escapeRegExp(c)+")"),d=new RegExp("(?:"+u.escapeRegExp(h)+")\\s*$"),v=function(e,t){if(g(e,t))return;if(!s||/\S/.test(e))i.insertInLine({row:t,column:e.length},h),i.insertInLine({row:t,column:a},c)},m=function(e,t){var n;(n=e.match(d))&&i.removeInLine(t,e.length-n[0].length,e.length),(n=e.match(p))&&i.removeInLine(t,n[1].length,n[0].length)},g=function(e,n){if(p.test(e))return!0;var r=t.getTokens(n);for(var i=0;i2?r%f!=f-1:r%f==0}}var E=Infinity;w(function(e,t){var n=e.search(/\S/);n!==-1?(ne.length&&(E=e.length)}),a==Infinity&&(a=E,s=!1,o=!1),l&&a%f!=0&&(a=Math.floor(a/f)*f),w(o?m:v)},this.toggleBlockComment=function(e,t,n,r){var i=this.blockComment;if(!i)return;!i.start&&i[0]&&(i=i[0]);var s=new a(t,r.row,r.column),o=s.getCurrentToken(),u=t.selection,l=t.selection.toOrientedRange(),c,h;if(o&&/comment/.test(o.type)){var p,d;while(o&&/comment/.test(o.type)){var v=o.value.indexOf(i.start);if(v!=-1){var m=s.getCurrentTokenRow(),g=s.getCurrentTokenColumn()+v;p=new f(m,g,m,g+i.start.length);break}o=s.stepBackward()}var s=new a(t,r.row,r.column),o=s.getCurrentToken();while(o&&/comment/.test(o.type)){var v=o.value.indexOf(i.end);if(v!=-1){var m=s.getCurrentTokenRow(),g=s.getCurrentTokenColumn()+v;d=new f(m,g,m,g+i.end.length);break}o=s.stepForward()}d&&t.remove(d),p&&(t.remove(p),c=p.start.row,h=-i.start.length)}else h=i.start.length,c=n.start.row,t.insert(n.end,i.end),t.insert(n.start,i.start);l.start.row==c&&(l.start.column+=h),l.end.row==c&&(l.end.column+=h),t.selection.fromOrientedRange(l)},this.getNextLineIndent=function(e,t,n){return this.$getIndent(t)},this.checkOutdent=function(e,t,n){return!1},this.autoOutdent=function(e,t,n){},this.$getIndent=function(e){return e.match(/^\s*/)[0]},this.createWorker=function(e){return null},this.createModeDelegates=function(e){this.$embeds=[],this.$modes={};for(var t in e)e[t]&&(this.$embeds.push(t),this.$modes[t]=new e[t]);var n=["toggleBlockComment","toggleCommentLines","getNextLineIndent","checkOutdent","autoOutdent","transformAction","getCompletions"];for(var t=0;t=0&&t.row=0&&t.column<=e[t.row].length}function s(e,t){t.action!="insert"&&t.action!="remove"&&r(t,"delta.action must be 'insert' or 'remove'"),t.lines instanceof Array||r(t,"delta.lines must be an Array"),(!t.start||!t.end)&&r(t,"delta.start/end must be an present");var n=t.start;i(e,t.start)||r(t,"delta.start must be contained in document");var s=t.end;t.action=="remove"&&!i(e,s)&&r(t,"delta.end must contained in document for 'remove' actions");var o=s.row-n.row,u=s.column-(o==0?n.column:0);(o!=t.lines.length-1||t.lines[o].length!=u)&&r(t,"delta.range must match delta lines")}t.applyDelta=function(e,t,n){var r=t.start.row,i=t.start.column,s=e[r]||"";switch(t.action){case"insert":var o=t.lines;if(o.length===1)e[r]=s.substring(0,i)+t.lines[0]+s.substring(i);else{var u=[r,1].concat(t.lines);e.splice.apply(e,u),e[r]=s.substring(0,i)+e[r],e[r+t.lines.length-1]+=s.substring(i)}break;case"remove":var a=t.end.column,f=t.end.row;r===f?e[r]=s.substring(0,i)+s.substring(a):e.splice(r,f-r+1,s.substring(0,i)+e[f].substring(a))}}}),ace.define("ace/anchor",["require","exports","module","ace/lib/oop","ace/lib/event_emitter"],function(e,t,n){"use strict";var r=e("./lib/oop"),i=e("./lib/event_emitter").EventEmitter,s=t.Anchor=function(e,t,n){this.$onChange=this.onChange.bind(this),this.attach(e),typeof n=="undefined"?this.setPosition(t.row,t.column):this.setPosition(t,n)};(function(){function e(e,t,n){var r=n?e.column<=t.column:e.columnthis.row)return;var n=t(e,{row:this.row,column:this.column},this.$insertRight);this.setPosition(n.row,n.column,!0)},this.setPosition=function(e,t,n){var r;n?r={row:e,column:t}:r=this.$clipPositionToDocument(e,t);if(this.row==r.row&&this.column==r.column)return;var i={row:this.row,column:this.column};this.row=r.row,this.column=r.column,this._signal("change",{old:i,value:r})},this.detach=function(){this.document.removeEventListener("change",this.$onChange)},this.attach=function(e){this.document=e||this.document,this.document.on("change",this.$onChange)},this.$clipPositionToDocument=function(e,t){var n={};return e>=this.document.getLength()?(n.row=Math.max(0,this.document.getLength()-1),n.column=this.document.getLine(n.row).length):e<0?(n.row=0,n.column=0):(n.row=e,n.column=Math.min(this.document.getLine(n.row).length,Math.max(0,t))),t<0&&(n.column=0),n}}).call(s.prototype)}),ace.define("ace/document",["require","exports","module","ace/lib/oop","ace/apply_delta","ace/lib/event_emitter","ace/range","ace/anchor"],function(e,t,n){"use strict";var r=e("./lib/oop"),i=e("./apply_delta").applyDelta,s=e("./lib/event_emitter").EventEmitter,o=e("./range").Range,u=e("./anchor").Anchor,a=function(e){this.$lines=[""],e.length===0?this.$lines=[""]:Array.isArray(e)?this.insertMergedLines({row:0,column:0},e):this.insert({row:0,column:0},e)};(function(){r.implement(this,s),this.setValue=function(e){var t=this.getLength()-1;this.remove(new o(0,0,t,this.getLine(t).length)),this.insert({row:0,column:0},e)},this.getValue=function(){return this.getAllLines().join(this.getNewLineCharacter())},this.createAnchor=function(e,t){return new u(this,e,t)},"aaa".split(/a/).length===0?this.$split=function(e){return e.replace(/\r\n|\r/g,"\n").split("\n")}:this.$split=function(e){return e.split(/\r\n|\r|\n/)},this.$detectNewLine=function(e){var t=e.match(/^.*?(\r\n|\r|\n)/m);this.$autoNewLine=t?t[1]:"\n",this._signal("changeNewLineMode")},this.getNewLineCharacter=function(){switch(this.$newLineMode){case"windows":return"\r\n";case"unix":return"\n";default:return this.$autoNewLine||"\n"}},this.$autoNewLine="",this.$newLineMode="auto",this.setNewLineMode=function(e){if(this.$newLineMode===e)return;this.$newLineMode=e,this._signal("changeNewLineMode")},this.getNewLineMode=function(){return this.$newLineMode},this.isNewLine=function(e){return e=="\r\n"||e=="\r"||e=="\n"},this.getLine=function(e){return this.$lines[e]||""},this.getLines=function(e,t){return this.$lines.slice(e,t+1)},this.getAllLines=function(){return this.getLines(0,this.getLength())},this.getLength=function(){return this.$lines.length},this.getTextRange=function(e){return this.getLinesForRange(e).join(this.getNewLineCharacter())},this.getLinesForRange=function(e){var t;if(e.start.row===e.end.row)t=[this.getLine(e.start.row).substring(e.start.column,e.end.column)];else{t=this.getLines(e.start.row,e.end.row),t[0]=(t[0]||"").substring(e.start.column);var n=t.length-1;e.end.row-e.start.row==n&&(t[n]=t[n].substring(0,e.end.column))}return t},this.insertLines=function(e,t){return console.warn("Use of document.insertLines is deprecated. Use the insertFullLines method instead."),this.insertFullLines(e,t)},this.removeLines=function(e,t){return console.warn("Use of document.removeLines is deprecated. Use the removeFullLines method instead."),this.removeFullLines(e,t)},this.insertNewLine=function(e){return console.warn("Use of document.insertNewLine is deprecated. Use insertMergedLines(position, ['', '']) instead."),this.insertMergedLines(e,["",""])},this.insert=function(e,t){return this.getLength()<=1&&this.$detectNewLine(t),this.insertMergedLines(e,this.$split(t))},this.insertInLine=function(e,t){var n=this.clippedPos(e.row,e.column),r=this.pos(e.row,e.column+t.length);return this.applyDelta({start:n,end:r,action:"insert",lines:[t]},!0),this.clonePos(r)},this.clippedPos=function(e,t){var n=this.getLength();e===undefined?e=n:e<0?e=0:e>=n&&(e=n-1,t=undefined);var r=this.getLine(e);return t==undefined&&(t=r.length),t=Math.min(Math.max(t,0),r.length),{row:e,column:t}},this.clonePos=function(e){return{row:e.row,column:e.column}},this.pos=function(e,t){return{row:e,column:t}},this.$clipPosition=function(e){var t=this.getLength();return e.row>=t?(e.row=Math.max(0,t-1),e.column=this.getLine(t-1).length):(e.row=Math.max(0,e.row),e.column=Math.min(Math.max(e.column,0),this.getLine(e.row).length)),e},this.insertFullLines=function(e,t){e=Math.min(Math.max(e,0),this.getLength());var n=0;e0,r=t=0&&this.applyDelta({start:this.pos(e,this.getLine(e).length),end:this.pos(e+1,0),action:"remove",lines:["",""]})},this.replace=function(e,t){e instanceof o||(e=o.fromPoints(e.start,e.end));if(t.length===0&&e.isEmpty())return e.start;if(t==this.getTextRange(e))return e.end;this.remove(e);var n;return t?n=this.insert(e.start,t):n=e.start,n},this.applyDeltas=function(e){for(var t=0;t=0;t--)this.revertDelta(e[t])},this.applyDelta=function(e,t){var n=e.action=="insert";if(n?e.lines.length<=1&&!e.lines[0]:!o.comparePoints(e.start,e.end))return;n&&e.lines.length>2e4&&this.$splitAndapplyLargeDelta(e,2e4),i(this.$lines,e,t),this._signal("change",e)},this.$splitAndapplyLargeDelta=function(e,t){var n=e.lines,r=n.length,i=e.start.row,s=e.start.column,o=0,u=0;do{o=u,u+=t-1;var a=n.slice(o,u);if(u>r){e.lines=a,e.start.row=i+o,e.start.column=s;break}a.push(""),this.applyDelta({start:this.pos(i+o,s),end:this.pos(i+u,s=0),action:e.action,lines:a},!0)}while(!0)},this.revertDelta=function(e){this.applyDelta({start:this.clonePos(e.start),end:this.clonePos(e.end),action:e.action=="insert"?"remove":"insert",lines:e.lines.slice()})},this.indexToPosition=function(e,t){var n=this.$lines||this.getAllLines(),r=this.getNewLineCharacter().length;for(var i=t||0,s=n.length;i20){n.running=setTimeout(n.$worker,20);break}}n.currentLine=t,r==-1&&(r=t),s<=r&&n.fireUpdateEvent(s,r)}};(function(){r.implement(this,i),this.setTokenizer=function(e){this.tokenizer=e,this.lines=[],this.states=[],this.start(0)},this.setDocument=function(e){this.doc=e,this.lines=[],this.states=[],this.stop()},this.fireUpdateEvent=function(e,t){var n={first:e,last:t};this._signal("update",{data:n})},this.start=function(e){this.currentLine=Math.min(e||0,this.currentLine,this.doc.getLength()),this.lines.splice(this.currentLine,this.lines.length),this.states.splice(this.currentLine,this.states.length),this.stop(),this.running=setTimeout(this.$worker,700)},this.scheduleStart=function(){this.running||(this.running=setTimeout(this.$worker,700))},this.$updateOnChange=function(e){var t=e.start.row,n=e.end.row-t;if(n===0)this.lines[t]=null;else if(e.action=="remove")this.lines.splice(t,n+1,null),this.states.splice(t,n+1,null);else{var r=Array(n+1);r.unshift(t,1),this.lines.splice.apply(this.lines,r),this.states.splice.apply(this.states,r)}this.currentLine=Math.min(t,this.currentLine,this.doc.getLength()),this.stop()},this.stop=function(){this.running&&clearTimeout(this.running),this.running=!1},this.getTokens=function(e){return this.lines[e]||this.$tokenizeRow(e)},this.getState=function(e){return this.currentLine==e&&this.$tokenizeRow(e),this.states[e]||"start"},this.$tokenizeRow=function(e){var t=this.doc.getLine(e),n=this.states[e-1],r=this.tokenizer.getLineTokens(t,n,e);return this.states[e]+""!=r.state+""?(this.states[e]=r.state,this.lines[e+1]=null,this.currentLine>e+1&&(this.currentLine=e+1)):this.currentLine==e&&(this.currentLine=e+1),this.lines[e]=r.tokens}}).call(s.prototype),t.BackgroundTokenizer=s}),ace.define("ace/search_highlight",["require","exports","module","ace/lib/lang","ace/lib/oop","ace/range"],function(e,t,n){"use strict";var r=e("./lib/lang"),i=e("./lib/oop"),s=e("./range").Range,o=function(e,t,n){this.setRegexp(e),this.clazz=t,this.type=n||"text"};(function(){this.MAX_RANGES=500,this.setRegexp=function(e){if(this.regExp+""==e+"")return;this.regExp=e,this.cache=[]},this.update=function(e,t,n,i){if(!this.regExp)return;var o=i.firstRow,u=i.lastRow;for(var a=o;a<=u;a++){var f=this.cache[a];f==null&&(f=r.getMatchOffsets(n.getLine(a),this.regExp),f.length>this.MAX_RANGES&&(f=f.slice(0,this.MAX_RANGES)),f=f.map(function(e){return new s(a,e.offset,a,e.offset+e.length)}),this.cache[a]=f.length?f:"");for(var l=f.length;l--;)t.drawSingleLineMarker(e,f[l].toScreenRange(n),this.clazz,i)}}}).call(o.prototype),t.SearchHighlight=o}),ace.define("ace/edit_session/fold_line",["require","exports","module","ace/range"],function(e,t,n){"use strict";function i(e,t){this.foldData=e,Array.isArray(t)?this.folds=t:t=this.folds=[t];var n=t[t.length-1];this.range=new r(t[0].start.row,t[0].start.column,n.end.row,n.end.column),this.start=this.range.start,this.end=this.range.end,this.folds.forEach(function(e){e.setFoldLine(this)},this)}var r=e("../range").Range;(function(){this.shiftRow=function(e){this.start.row+=e,this.end.row+=e,this.folds.forEach(function(t){t.start.row+=e,t.end.row+=e})},this.addFold=function(e){if(e.sameRow){if(e.start.rowthis.endRow)throw new Error("Can't add a fold to this FoldLine as it has no connection");this.folds.push(e),this.folds.sort(function(e,t){return-e.range.compareEnd(t.start.row,t.start.column)}),this.range.compareEnd(e.start.row,e.start.column)>0?(this.end.row=e.end.row,this.end.column=e.end.column):this.range.compareStart(e.end.row,e.end.column)<0&&(this.start.row=e.start.row,this.start.column=e.start.column)}else if(e.start.row==this.end.row)this.folds.push(e),this.end.row=e.end.row,this.end.column=e.end.column;else{if(e.end.row!=this.start.row)throw new Error("Trying to add fold to FoldRow that doesn't have a matching row");this.folds.unshift(e),this.start.row=e.start.row,this.start.column=e.start.column}e.foldLine=this},this.containsRow=function(e){return e>=this.start.row&&e<=this.end.row},this.walk=function(e,t,n){var r=0,i=this.folds,s,o,u,a=!0;t==null&&(t=this.end.row,n=this.end.column);for(var f=0;f0)continue;var a=i(e,o.start);return u===0?t&&a!==0?-s-2:s:a>0||a===0&&!t?s:-s-1}return-s-1},this.add=function(e){var t=!e.isEmpty(),n=this.pointIndex(e.start,t);n<0&&(n=-n-1);var r=this.pointIndex(e.end,t,n);return r<0?r=-r-1:r++,this.ranges.splice(n,r-n,e)},this.addList=function(e){var t=[];for(var n=e.length;n--;)t.push.apply(t,this.add(e[n]));return t},this.substractPoint=function(e){var t=this.pointIndex(e);if(t>=0)return this.ranges.splice(t,1)},this.merge=function(){var e=[],t=this.ranges;t=t.sort(function(e,t){return i(e.start,t.start)});var n=t[0],r;for(var s=1;s=0},this.containsPoint=function(e){return this.pointIndex(e)>=0},this.rangeAtPoint=function(e){var t=this.pointIndex(e);if(t>=0)return this.ranges[t]},this.clipRows=function(e,t){var n=this.ranges;if(n[0].start.row>t||n[n.length-1].start.rowr)break;l.start.row==r&&l.start.column>=t.column&&(l.start.column!=t.column||!this.$insertRight)&&(l.start.column+=o,l.start.row+=s);if(l.end.row==r&&l.end.column>=t.column){if(l.end.column==t.column&&this.$insertRight)continue;l.end.column==t.column&&o>0&&al.start.column&&l.end.column==u[a+1].start.column&&(l.end.column-=o),l.end.column+=o,l.end.row+=s}}if(s!=0&&a=e)return i;if(i.end.row>e)return null}return null},this.getNextFoldLine=function(e,t){var n=this.$foldData,r=0;t&&(r=n.indexOf(t)),r==-1&&(r=0);for(r;r=e)return i}return null},this.getFoldedRowCount=function(e,t){var n=this.$foldData,r=t-e+1;for(var i=0;i=t){u=e?r-=t-u:r=0);break}o>=e&&(u>=e?r-=o-u:r-=o-e+1)}return r},this.$addFoldLine=function(e){return this.$foldData.push(e),this.$foldData.sort(function(e,t){return e.start.row-t.start.row}),e},this.addFold=function(e,t){var n=this.$foldData,r=!1,o;e instanceof s?o=e:(o=new s(t,e),o.collapseChildren=t.collapseChildren),this.$clipRangeToDocument(o.range);var u=o.start.row,a=o.start.column,f=o.end.row,l=o.end.column;if(u0&&(this.removeFolds(p),p.forEach(function(e){o.addSubFold(e)}));for(var d=0;d0&&this.foldAll(e.start.row+1,e.end.row,e.collapseChildren-1),e.subFolds=[]},this.expandFolds=function(e){e.forEach(function(e){this.expandFold(e)},this)},this.unfold=function(e,t){var n,i;e==null?(n=new r(0,0,this.getLength(),0),t=!0):typeof e=="number"?n=new r(e,0,e,this.getLine(e).length):"row"in e?n=r.fromPoints(e,e):n=e,i=this.getFoldsInRangeList(n);if(t)this.removeFolds(i);else{var s=i;while(s.length)this.expandFolds(s),s=this.getFoldsInRangeList(n)}if(i.length)return i},this.isRowFolded=function(e,t){return!!this.getFoldLine(e,t)},this.getRowFoldEnd=function(e,t){var n=this.getFoldLine(e,t);return n?n.end.row:e},this.getRowFoldStart=function(e,t){var n=this.getFoldLine(e,t);return n?n.start.row:e},this.getFoldDisplayLine=function(e,t,n,r,i){r==null&&(r=e.start.row),i==null&&(i=0),t==null&&(t=e.end.row),n==null&&(n=this.getLine(t).length);var s=this.doc,o="";return e.walk(function(e,t,n,u){if(tl)break}while(s&&a.test(s.type));s=i.stepBackward()}else s=i.getCurrentToken();return f.end.row=i.getCurrentTokenRow(),f.end.column=i.getCurrentTokenColumn()+s.value.length-2,f}},this.foldAll=function(e,t,n){n==undefined&&(n=1e5);var r=this.foldWidgets;if(!r)return;t=t||this.getLength(),e=e||0;for(var i=e;i=e){i=s.end.row;try{var o=this.addFold("...",s);o&&(o.collapseChildren=n)}catch(u){}}}},this.$foldStyles={manual:1,markbegin:1,markbeginend:1},this.$foldStyle="markbegin",this.setFoldStyle=function(e){if(!this.$foldStyles[e])throw new Error("invalid fold style: "+e+"["+Object.keys(this.$foldStyles).join(", ")+"]");if(this.$foldStyle==e)return;this.$foldStyle=e,e=="manual"&&this.unfold();var t=this.$foldMode;this.$setFolding(null),this.$setFolding(t)},this.$setFolding=function(e){if(this.$foldMode==e)return;this.$foldMode=e,this.off("change",this.$updateFoldWidgets),this.off("tokenizerUpdate",this.$tokenizerUpdateFoldWidgets),this._signal("changeAnnotation");if(!e||this.$foldStyle=="manual"){this.foldWidgets=null;return}this.foldWidgets=[],this.getFoldWidget=e.getFoldWidget.bind(e,this,this.$foldStyle),this.getFoldWidgetRange=e.getFoldWidgetRange.bind(e,this,this.$foldStyle),this.$updateFoldWidgets=this.updateFoldWidgets.bind(this),this.$tokenizerUpdateFoldWidgets=this.tokenizerUpdateFoldWidgets.bind(this),this.on("change",this.$updateFoldWidgets),this.on("tokenizerUpdate",this.$tokenizerUpdateFoldWidgets)},this.getParentFoldRangeData=function(e,t){var n=this.foldWidgets;if(!n||t&&n[e])return{};var r=e-1,i;while(r>=0){var s=n[r];s==null&&(s=n[r]=this.getFoldWidget(r));if(s=="start"){var o=this.getFoldWidgetRange(r);i||(i=o);if(o&&o.end.row>=e)break}r--}return{range:r!==-1&&o,firstRange:i}},this.onFoldWidgetClick=function(e,t){t=t.domEvent;var n={children:t.shiftKey,all:t.ctrlKey||t.metaKey,siblings:t.altKey},r=this.$toggleFoldWidget(e,n);if(!r){var i=t.target||t.srcElement;i&&/ace_fold-widget/.test(i.className)&&(i.className+=" ace_invalid")}},this.$toggleFoldWidget=function(e,t){if(!this.getFoldWidget)return;var n=this.getFoldWidget(e),r=this.getLine(e),i=n==="end"?-1:1,s=this.getFoldAt(e,i===-1?0:r.length,i);if(s)return t.children||t.all?this.removeFold(s):this.expandFold(s),s;var o=this.getFoldWidgetRange(e,!0);if(o&&!o.isMultiLine()){s=this.getFoldAt(o.start.row,o.start.column,1);if(s&&o.isEqual(s.range))return this.removeFold(s),s}if(t.siblings){var u=this.getParentFoldRangeData(e);if(u.range)var a=u.range.start.row+1,f=u.range.end.row;this.foldAll(a,f,t.all?1e4:0)}else t.children?(f=o?o.end.row:this.getLength(),this.foldAll(e+1,f,t.all?1e4:0)):o&&(t.all&&(o.collapseChildren=1e4),this.addFold("...",o));return o},this.toggleFoldWidget=function(e){var t=this.selection.getCursor().row;t=this.getRowFoldStart(t);var n=this.$toggleFoldWidget(t,{});if(n)return;var r=this.getParentFoldRangeData(t,!0);n=r.range||r.firstRange;if(n){t=n.start.row;var i=this.getFoldAt(t,this.getLine(t).length,1);i?this.removeFold(i):this.addFold("...",n)}},this.updateFoldWidgets=function(e){var t=e.start.row,n=e.end.row-t;if(n===0)this.foldWidgets[t]=null;else if(e.action=="remove")this.foldWidgets.splice(t,n+1,null);else{var r=Array(n+1);r.unshift(t,1),this.foldWidgets.splice.apply(this.foldWidgets,r)}},this.tokenizerUpdateFoldWidgets=function(e){var t=e.data;t.first!=t.last&&this.foldWidgets.length>t.first&&this.foldWidgets.splice(t.first,this.foldWidgets.length)}}var r=e("../range").Range,i=e("./fold_line").FoldLine,s=e("./fold").Fold,o=e("../token_iterator").TokenIterator;t.Folding=u}),ace.define("ace/edit_session/bracket_match",["require","exports","module","ace/token_iterator","ace/range"],function(e,t,n){"use strict";function s(){this.findMatchingBracket=function(e,t){if(e.column==0)return null;var n=t||this.getLine(e.row).charAt(e.column-1);if(n=="")return null;var r=n.match(/([\(\[\{])|([\)\]\}])/);return r?r[1]?this.$findClosingBracket(r[1],e):this.$findOpeningBracket(r[2],e):null},this.getBracketRange=function(e){var t=this.getLine(e.row),n=!0,r,s=t.charAt(e.column-1),o=s&&s.match(/([\(\[\{])|([\)\]\}])/);o||(s=t.charAt(e.column),e={row:e.row,column:e.column+1},o=s&&s.match(/([\(\[\{])|([\)\]\}])/),n=!1);if(!o)return null;if(o[1]){var u=this.$findClosingBracket(o[1],e);if(!u)return null;r=i.fromPoints(e,u),n||(r.end.column++,r.start.column--),r.cursor=r.end}else{var u=this.$findOpeningBracket(o[2],e);if(!u)return null;r=i.fromPoints(u,e),n||(r.start.column++,r.end.column--),r.cursor=r.start}return r},this.$brackets={")":"(","(":")","]":"[","[":"]","{":"}","}":"{"},this.$findOpeningBracket=function(e,t,n){var i=this.$brackets[e],s=1,o=new r(this,t.row,t.column),u=o.getCurrentToken();u||(u=o.stepForward());if(!u)return;n||(n=new RegExp("(\\.?"+u.type.replace(".","\\.").replace("rparen",".paren").replace(/\b(?:end)\b/,"(?:start|begin|end)")+")+"));var a=t.column-o.getCurrentTokenColumn()-2,f=u.value;for(;;){while(a>=0){var l=f.charAt(a);if(l==i){s-=1;if(s==0)return{row:o.getCurrentTokenRow(),column:a+o.getCurrentTokenColumn()}}else l==e&&(s+=1);a-=1}do u=o.stepBackward();while(u&&!n.test(u.type));if(u==null)break;f=u.value,a=f.length-1}return null},this.$findClosingBracket=function(e,t,n){var i=this.$brackets[e],s=1,o=new r(this,t.row,t.column),u=o.getCurrentToken();u||(u=o.stepForward());if(!u)return;n||(n=new RegExp("(\\.?"+u.type.replace(".","\\.").replace("lparen",".paren").replace(/\b(?:start|begin)\b/,"(?:start|begin|end)")+")+"));var a=t.column-o.getCurrentTokenColumn();for(;;){var f=u.value,l=f.length;while(a=4352&&e<=4447||e>=4515&&e<=4519||e>=4602&&e<=4607||e>=9001&&e<=9002||e>=11904&&e<=11929||e>=11931&&e<=12019||e>=12032&&e<=12245||e>=12272&&e<=12283||e>=12288&&e<=12350||e>=12353&&e<=12438||e>=12441&&e<=12543||e>=12549&&e<=12589||e>=12593&&e<=12686||e>=12688&&e<=12730||e>=12736&&e<=12771||e>=12784&&e<=12830||e>=12832&&e<=12871||e>=12880&&e<=13054||e>=13056&&e<=19903||e>=19968&&e<=42124||e>=42128&&e<=42182||e>=43360&&e<=43388||e>=44032&&e<=55203||e>=55216&&e<=55238||e>=55243&&e<=55291||e>=63744&&e<=64255||e>=65040&&e<=65049||e>=65072&&e<=65106||e>=65108&&e<=65126||e>=65128&&e<=65131||e>=65281&&e<=65376||e>=65504&&e<=65510}r.implement(this,o),this.setDocument=function(e){this.doc&&this.doc.removeListener("change",this.$onChange),this.doc=e,e.on("change",this.$onChange),this.bgTokenizer&&this.bgTokenizer.setDocument(this.getDocument()),this.resetCaches()},this.getDocument=function(){return this.doc},this.$resetRowCache=function(e){if(!e){this.$docRowCache=[],this.$screenRowCache=[];return}var t=this.$docRowCache.length,n=this.$getRowCacheIndex(this.$docRowCache,e)+1;t>n&&(this.$docRowCache.splice(n,t),this.$screenRowCache.splice(n,t))},this.$getRowCacheIndex=function(e,t){var n=0,r=e.length-1;while(n<=r){var i=n+r>>1,s=e[i];if(t>s)n=i+1;else{if(!(t=t)break}return r=n[s],r?(r.index=s,r.start=i-r.value.length,r):null},this.setUndoManager=function(e){this.$undoManager=e,this.$deltas=[],this.$deltasDoc=[],this.$deltasFold=[],this.$informUndoManager&&this.$informUndoManager.cancel();if(e){var t=this;this.$syncInformUndoManager=function(){t.$informUndoManager.cancel(),t.$deltasFold.length&&(t.$deltas.push({group:"fold",deltas:t.$deltasFold}),t.$deltasFold=[]),t.$deltasDoc.length&&(t.$deltas.push({group:"doc",deltas:t.$deltasDoc}),t.$deltasDoc=[]),t.$deltas.length>0&&e.execute({action:"aceupdate",args:[t.$deltas,t],merge:t.mergeUndoDeltas}),t.mergeUndoDeltas=!1,t.$deltas=[]},this.$informUndoManager=i.delayedCall(this.$syncInformUndoManager)}},this.markUndoGroup=function(){this.$syncInformUndoManager&&this.$syncInformUndoManager()},this.$defaultUndoManager={undo:function(){},redo:function(){},reset:function(){}},this.getUndoManager=function(){return this.$undoManager||this.$defaultUndoManager},this.getTabString=function(){return this.getUseSoftTabs()?i.stringRepeat(" ",this.getTabSize()):" "},this.setUseSoftTabs=function(e){this.setOption("useSoftTabs",e)},this.getUseSoftTabs=function(){return this.$useSoftTabs&&!this.$mode.$indentWithTabs},this.setTabSize=function(e){this.setOption("tabSize",e)},this.getTabSize=function(){return this.$tabSize},this.isTabStop=function(e){return this.$useSoftTabs&&e.column%this.$tabSize===0},this.setNavigateWithinSoftTabs=function(e){this.setOption("navigateWithinSoftTabs",e)},this.getNavigateWithinSoftTabs=function(){return this.$navigateWithinSoftTabs},this.$overwrite=!1,this.setOverwrite=function(e){this.setOption("overwrite",e)},this.getOverwrite=function(){return this.$overwrite},this.toggleOverwrite=function(){this.setOverwrite(!this.$overwrite)},this.addGutterDecoration=function(e,t){this.$decorations[e]||(this.$decorations[e]=""),this.$decorations[e]+=" "+t,this._signal("changeBreakpoint",{})},this.removeGutterDecoration=function(e,t){this.$decorations[e]=(this.$decorations[e]||"").replace(" "+t,""),this._signal("changeBreakpoint",{})},this.getBreakpoints=function(){return this.$breakpoints},this.setBreakpoints=function(e){this.$breakpoints=[];for(var t=0;t0&&(r=!!n.charAt(t-1).match(this.tokenRe)),r||(r=!!n.charAt(t).match(this.tokenRe));if(r)var i=this.tokenRe;else if(/^\s+$/.test(n.slice(t-1,t+1)))var i=/\s/;else var i=this.nonTokenRe;var s=t;if(s>0){do s--;while(s>=0&&n.charAt(s).match(i));s++}var o=t;while(oe&&(e=t.screenWidth)}),this.lineWidgetWidth=e},this.$computeWidth=function(e){if(this.$modified||e){this.$modified=!1;if(this.$useWrapMode)return this.screenWidth=this.$wrapLimit;var t=this.doc.getAllLines(),n=this.$rowLengthCache,r=0,i=0,s=this.$foldData[i],o=s?s.start.row:Infinity,u=t.length;for(var a=0;ao){a=s.end.row+1;if(a>=u)break;s=this.$foldData[i++],o=s?s.start.row:Infinity}n[a]==null&&(n[a]=this.$getStringScreenWidth(t[a])[0]),n[a]>r&&(r=n[a])}this.screenWidth=r}},this.getLine=function(e){return this.doc.getLine(e)},this.getLines=function(e,t){return this.doc.getLines(e,t)},this.getLength=function(){return this.doc.getLength()},this.getTextRange=function(e){return this.doc.getTextRange(e||this.selection.getRange())},this.insert=function(e,t){return this.doc.insert(e,t)},this.remove=function(e){return this.doc.remove(e)},this.removeFullLines=function(e,t){return this.doc.removeFullLines(e,t)},this.undoChanges=function(e,t){if(!e.length)return;this.$fromUndo=!0;var n=null;for(var r=e.length-1;r!=-1;r--){var i=e[r];i.group=="doc"?(this.doc.revertDeltas(i.deltas),n=this.$getUndoSelection(i.deltas,!0,n)):i.deltas.forEach(function(e){this.addFolds(e.folds)},this)}return this.$fromUndo=!1,n&&this.$undoSelect&&!t&&this.selection.setSelectionRange(n),n},this.redoChanges=function(e,t){if(!e.length)return;this.$fromUndo=!0;var n=null;for(var r=0;re.end.column&&(s.start.column+=u),s.end.row==e.end.row&&s.end.column>e.end.column&&(s.end.column+=u)),o&&s.start.row>=e.end.row&&(s.start.row+=o,s.end.row+=o)}s.end=this.insert(s.start,r);if(i.length){var a=e.start,l=s.start,o=l.row-a.row,u=l.column-a.column;this.addFolds(i.map(function(e){return e=e.clone(),e.start.row==a.row&&(e.start.column+=u),e.end.row==a.row&&(e.end.column+=u),e.start.row+=o,e.end.row+=o,e}))}return s},this.indentRows=function(e,t,n){n=n.replace(/\t/g,this.getTabString());for(var r=e;r<=t;r++)this.doc.insertInLine({row:r,column:0},n)},this.outdentRows=function(e){var t=e.collapseRows(),n=new f(0,0,0,0),r=this.getTabSize();for(var i=t.start.row;i<=t.end.row;++i){var s=this.getLine(i);n.start.row=i,n.end.row=i;for(var o=0;o0){var r=this.getRowFoldEnd(t+n);if(r>this.doc.getLength()-1)return 0;var i=r-t}else{e=this.$clipRowToDocument(e),t=this.$clipRowToDocument(t);var i=t-e+1}var s=new f(e,0,t,Number.MAX_VALUE),o=this.getFoldsInRange(s).map(function(e){return e=e.clone(),e.start.row+=i,e.end.row+=i,e}),u=n==0?this.doc.getLines(e,t):this.doc.removeFullLines(e,t);return this.doc.insertFullLines(e+i,u),o.length&&this.addFolds(o),i},this.moveLinesUp=function(e,t){return this.$moveLines(e,t,-1)},this.moveLinesDown=function(e,t){return this.$moveLines(e,t,1)},this.duplicateLines=function(e,t){return this.$moveLines(e,t,0)},this.$clipRowToDocument=function(e){return Math.max(0,Math.min(e,this.doc.getLength()-1))},this.$clipColumnToRow=function(e,t){return t<0?0:Math.min(this.doc.getLine(e).length,t)},this.$clipPositionToDocument=function(e,t){t=Math.max(0,t);if(e<0)e=0,t=0;else{var n=this.doc.getLength();e>=n?(e=n-1,t=this.doc.getLine(n-1).length):t=Math.min(this.doc.getLine(e).length,t)}return{row:e,column:t}},this.$clipRangeToDocument=function(e){e.start.row<0?(e.start.row=0,e.start.column=0):e.start.column=this.$clipColumnToRow(e.start.row,e.start.column);var t=this.doc.getLength()-1;return e.end.row>t?(e.end.row=t,e.end.column=this.doc.getLine(t).length):e.end.column=this.$clipColumnToRow(e.end.row,e.end.column),e},this.$wrapLimit=80,this.$useWrapMode=!1,this.$wrapLimitRange={min:null,max:null},this.setUseWrapMode=function(e){if(e!=this.$useWrapMode){this.$useWrapMode=e,this.$modified=!0,this.$resetRowCache(0);if(e){var t=this.getLength();this.$wrapData=Array(t),this.$updateWrapData(0,t-1)}this._signal("changeWrapMode")}},this.getUseWrapMode=function(){return this.$useWrapMode},this.setWrapLimitRange=function(e,t){if(this.$wrapLimitRange.min!==e||this.$wrapLimitRange.max!==t)this.$wrapLimitRange={min:e,max:t},this.$modified=!0,this.$useWrapMode&&this._signal("changeWrapMode")},this.adjustWrapLimit=function(e,t){var n=this.$wrapLimitRange;n.max<0&&(n={min:t,max:t});var r=this.$constrainWrapLimit(e,n.min,n.max);return r!=this.$wrapLimit&&r>1?(this.$wrapLimit=r,this.$modified=!0,this.$useWrapMode&&(this.$updateWrapData(0,this.getLength()-1),this.$resetRowCache(0),this._signal("changeWrapLimit")),!0):!1},this.$constrainWrapLimit=function(e,t,n){return t&&(e=Math.max(t,e)),n&&(e=Math.min(n,e)),e},this.getWrapLimit=function(){return this.$wrapLimit},this.setWrapLimit=function(e){this.setWrapLimitRange(e,e)},this.getWrapLimitRange=function(){return{min:this.$wrapLimitRange.min,max:this.$wrapLimitRange.max}},this.$updateInternalDataOnChange=function(e){var t=this.$useWrapMode,n=e.action,r=e.start,i=e.end,s=r.row,o=i.row,u=o-s,a=null;this.$updating=!0;if(u!=0)if(n==="remove"){this[t?"$wrapData":"$rowLengthCache"].splice(s,u);var f=this.$foldData;a=this.getFoldsInRange(e),this.removeFolds(a);var l=this.getFoldLine(i.row),c=0;if(l){l.addRemoveChars(i.row,i.column,r.column-i.column),l.shiftRow(-u);var h=this.getFoldLine(s);h&&h!==l&&(h.merge(l),l=h),c=f.indexOf(l)+1}for(c;c=i.row&&l.shiftRow(-u)}o=s}else{var p=Array(u);p.unshift(s,0);var d=t?this.$wrapData:this.$rowLengthCache;d.splice.apply(d,p);var f=this.$foldData,l=this.getFoldLine(s),c=0;if(l){var v=l.range.compareInside(r.row,r.column);v==0?(l=l.split(r.row,r.column),l&&(l.shiftRow(u),l.addRemoveChars(o,0,i.column-r.column))):v==-1&&(l.addRemoveChars(s,0,i.column-r.column),l.shiftRow(u)),c=f.indexOf(l)+1}for(c;c=s&&l.shiftRow(u)}}else{u=Math.abs(e.start.column-e.end.column),n==="remove"&&(a=this.getFoldsInRange(e),this.removeFolds(a),u=-u);var l=this.getFoldLine(s);l&&l.addRemoveChars(s,r.column,u)}return t&&this.$wrapData.length!=this.doc.getLength()&&console.error("doc.getLength() and $wrapData.length have to be the same!"),this.$updating=!1,t?this.$updateWrapData(s,o):this.$updateRowLengthCache(s,o),a},this.$updateRowLengthCache=function(e,t,n){this.$rowLengthCache[e]=null,this.$rowLengthCache[t]=null},this.$updateWrapData=function(e,t){var r=this.doc.getAllLines(),i=this.getTabSize(),s=this.$wrapData,o=this.$wrapLimit,a,f,l=e;t=Math.min(t,r.length-1);while(l<=t)f=this.getFoldLine(l,f),f?(a=[],f.walk(function(e,t,i,s){var o;if(e!=null){o=this.$getDisplayTokens(e,a.length),o[0]=n;for(var f=1;fr-b){var w=a+r-b;if(e[w-1]>=p&&e[w]>=p){y(w);continue}if(e[w]==n||e[w]==u){for(w;w!=a-1;w--)if(e[w]==n)break;if(w>a){y(w);continue}w=a+r;for(w;w>2)),a-1);while(w>E&&e[w]E&&e[w]E&&e[w]==l)w--}else while(w>E&&e[w]E){y(++w);continue}w=a+r,e[w]==t&&w--,y(w-b)}return s},this.$getDisplayTokens=function(n,r){var i=[],s;r=r||0;for(var o=0;o39&&u<48||u>57&&u<64?i.push(l):u>=4352&&m(u)?i.push(e,t):i.push(e)}return i},this.$getStringScreenWidth=function(e,t,n){if(t==0)return[0,0];t==null&&(t=Infinity),n=n||0;var r,i;for(i=0;i=4352&&m(r)?n+=2:n+=1;if(n>t)break}return[n,i]},this.lineWidgets=null,this.getRowLength=function(e){if(this.lineWidgets)var t=this.lineWidgets[e]&&this.lineWidgets[e].rowCount||0;else t=0;return!this.$useWrapMode||!this.$wrapData[e]?1+t:this.$wrapData[e].length+1+t},this.getRowLineCount=function(e){return!this.$useWrapMode||!this.$wrapData[e]?1:this.$wrapData[e].length+1},this.getRowWrapIndent=function(e){if(this.$useWrapMode){var t=this.screenToDocumentPosition(e,Number.MAX_VALUE),n=this.$wrapData[t.row];return n.length&&n[0]=0)var o=a[f],r=this.$docRowCache[f],c=e>a[l-1];else var c=!l;var h=this.getLength()-1,p=this.getNextFoldLine(r),d=p?p.start.row:Infinity;while(o<=e){u=this.getRowLength(r);if(o+u>e||r>=h)break;o+=u,r++,r>d&&(r=p.end.row+1,p=this.getNextFoldLine(r,p),d=p?p.start.row:Infinity),c&&(this.$docRowCache.push(r),this.$screenRowCache.push(o))}if(p&&p.start.row<=r)n=this.getFoldDisplayLine(p),r=p.start.row;else{if(o+u<=e||r>h)return{row:h,column:this.getLine(h).length};n=this.getLine(r),p=null}var v=0;if(this.$useWrapMode){var m=this.$wrapData[r];if(m){var g=Math.floor(e-o);s=m[g],g>0&&m.length&&(v=m.indent,i=m[g-1]||m[m.length-1],n=n.substring(i))}}return i+=this.$getStringScreenWidth(n,t-v)[1],this.$useWrapMode&&i>=s&&(i=s-1),p?p.idxToPosition(i):{row:r,column:i}},this.documentToScreenPosition=function(e,t){if(typeof t=="undefined")var n=this.$clipPositionToDocument(e.row,e.column);else n=this.$clipPositionToDocument(e,t);e=n.row,t=n.column;var r=0,i=null,s=null;s=this.getFoldAt(e,t,1),s&&(e=s.start.row,t=s.start.column);var o,u=0,a=this.$docRowCache,f=this.$getRowCacheIndex(a,e),l=a.length;if(l&&f>=0)var u=a[f],r=this.$screenRowCache[f],c=e>a[l-1];else var c=!l;var h=this.getNextFoldLine(u),p=h?h.start.row:Infinity;while(u=p){o=h.end.row+1;if(o>e)break;h=this.getNextFoldLine(o,h),p=h?h.start.row:Infinity}else o=u+1;r+=this.getRowLength(u),u=o,c&&(this.$docRowCache.push(u),this.$screenRowCache.push(r))}var d="";h&&u>=p?(d=this.getFoldDisplayLine(h,e,t),i=h.start.row):(d=this.getLine(e).substring(0,t),i=e);var v=0;if(this.$useWrapMode){var m=this.$wrapData[i];if(m){var g=0;while(d.length>=m[g])r++,g++;d=d.substring(m[g-1]||0,d.length),v=g>0?m.indent:0}}return{row:r,column:v+this.$getStringScreenWidth(d)[0]}},this.documentToScreenColumn=function(e,t){return this.documentToScreenPosition(e,t).column},this.documentToScreenRow=function(e,t){return this.documentToScreenPosition(e,t).row},this.getScreenLength=function(){var e=0,t=null;if(!this.$useWrapMode){e=this.getLength();var n=this.$foldData;for(var r=0;ro&&(s=t.end.row+1,t=this.$foldData[r++],o=t?t.start.row:Infinity)}}return this.lineWidgets&&(e+=this.$getWidgetScreenLength()),e},this.$setFontMetrics=function(e){if(!this.$enableVarChar)return;this.$getStringScreenWidth=function(t,n,r){if(n===0)return[0,0];n||(n=Infinity),r=r||0;var i,s;for(s=0;sn)break}return[r,s]}},this.destroy=function(){this.bgTokenizer&&(this.bgTokenizer.setDocument(null),this.bgTokenizer=null),this.$stopWorker()}}.call(p.prototype),e("./edit_session/folding").Folding.call(p.prototype),e("./edit_session/bracket_match").BracketMatch.call(p.prototype),s.defineOptions(p.prototype,"session",{wrap:{set:function(e){!e||e=="off"?e=!1:e=="free"?e=!0:e=="printMargin"?e=-1:typeof e=="string"&&(e=parseInt(e,10)||!1);if(this.$wrap==e)return;this.$wrap=e;if(!e)this.setUseWrapMode(!1);else{var t=typeof e=="number"?e:null;this.setWrapLimitRange(t,t),this.setUseWrapMode(!0)}},get:function(){return this.getUseWrapMode()?this.$wrap==-1?"printMargin":this.getWrapLimitRange().min?this.$wrap:"free":"off"},handlesSet:!0},wrapMethod:{set:function(e){e=e=="auto"?this.$mode.type!="text":e!="text",e!=this.$wrapAsCode&&(this.$wrapAsCode=e,this.$useWrapMode&&(this.$modified=!0,this.$resetRowCache(0),this.$updateWrapData(0,this.getLength()-1)))},initialValue:"auto"},indentedSoftWrap:{initialValue:!0},firstLineNumber:{set:function(){this._signal("changeBreakpoint")},initialValue:1},useWorker:{set:function(e){this.$useWorker=e,this.$stopWorker(),e&&this.$startWorker()},initialValue:!0},useSoftTabs:{initialValue:!0},tabSize:{set:function(e){if(isNaN(e)||this.$tabSize===e)return;this.$modified=!0,this.$rowLengthCache=[],this.$tabSize=e,this._signal("changeTabSize")},initialValue:4,handlesSet:!0},navigateWithinSoftTabs:{initialValue:!1},overwrite:{set:function(e){this._signal("changeOverwrite")},initialValue:!1},newLineMode:{set:function(e){this.doc.setNewLineMode(e)},get:function(){return this.doc.getNewLineMode()},handlesSet:!0},mode:{set:function(e){this.setMode(e)},get:function(){return this.$modeId}}}),t.EditSession=p}),ace.define("ace/search",["require","exports","module","ace/lib/lang","ace/lib/oop","ace/range"],function(e,t,n){"use strict";function u(e,t){function n(e){return/\w/.test(e)||t.regExp?"\\b":""}return n(e[0])+e+n(e[e.length-1])}var r=e("./lib/lang"),i=e("./lib/oop"),s=e("./range").Range,o=function(){this.$options={}};(function(){this.set=function(e){return i.mixin(this.$options,e),this},this.getOptions=function(){return r.copyObject(this.$options)},this.setOptions=function(e){this.$options=e},this.find=function(e){var t=this.$options,n=this.$matchIterator(e,t);if(!n)return!1;var r=null;return n.forEach(function(e,n,i,o){return r=new s(e,n,i,o),n==o&&t.start&&t.start.start&&t.skipCurrent!=0&&r.isEqual(t.start)?(r=null,!1):!0}),r},this.findAll=function(e){var t=this.$options;if(!t.needle)return[];this.$assembleRegExp(t);var n=t.range,i=n?e.getLines(n.start.row,n.end.row):e.doc.getAllLines(),o=[],u=t.re;if(t.$isMultiLine){var a=u.length,f=i.length-a,l;e:for(var c=u.offset||0;c<=f;c++){for(var h=0;hv)continue;o.push(l=new s(c,v,c+a-1,m)),a>2&&(c=c+a-2)}}else for(var g=0;gE&&o[h].end.row==n.end.row)h--;o=o.slice(g,h+1);for(g=0,h=o.length;g=u;n--)if(c(n,Number.MAX_VALUE,e))return;if(t.wrap==0)return;for(n=a,u=o.row;n>=u;n--)if(c(n,Number.MAX_VALUE,e))return};else var f=function(e){var n=o.row;if(c(n,o.column,e))return;for(n+=1;n<=a;n++)if(c(n,0,e))return;if(t.wrap==0)return;for(n=u,a=o.row;n<=a;n++)if(c(n,0,e))return};if(t.$isMultiLine)var l=n.length,c=function(t,i,s){var o=r?t-l+1:t;if(o<0)return;var u=e.getLine(o),a=u.search(n[0]);if(!r&&ai)return;if(s(o,a,o+l-1,c))return!0};else if(r)var c=function(t,r,i){var s=e.getLine(t),o=[],u,a=0;n.lastIndex=0;while(u=n.exec(s)){var f=u[0].length;a=u.index;if(!f){if(a>=s.length)break;n.lastIndex=a+=1}if(u.index+f>r)break;o.push(u.index,f)}for(var l=o.length-1;l>=0;l-=2){var c=o[l-1],f=o[l];if(i(t,c,t,c+f))return!0}};else var c=function(t,r,i){var s=e.getLine(t),o,u=r;n.lastIndex=r;while(o=n.exec(s)){var a=o[0].length;u=o.index;if(i(t,u,t,u+a))return!0;if(!a){n.lastIndex=u+=1;if(u>=s.length)return!1}}};return{forEach:f}}}).call(o.prototype),t.Search=o}),ace.define("ace/keyboard/hash_handler",["require","exports","module","ace/lib/keys","ace/lib/useragent"],function(e,t,n){"use strict";function o(e,t){this.platform=t||(i.isMac?"mac":"win"),this.commands={},this.commandKeyBinding={},this.addCommands(e),this.$singleCommand=!0}function u(e,t){o.call(this,e,t),this.$singleCommand=!1}var r=e("../lib/keys"),i=e("../lib/useragent"),s=r.KEY_MODS;u.prototype=o.prototype,function(){function e(e){return typeof e=="object"&&e.bindKey&&e.bindKey.position||(e.isDefault?-100:0)}this.addCommand=function(e){this.commands[e.name]&&this.removeCommand(e),this.commands[e.name]=e,e.bindKey&&this._buildKeyHash(e)},this.removeCommand=function(e,t){var n=e&&(typeof e=="string"?e:e.name);e=this.commands[n],t||delete this.commands[n];var r=this.commandKeyBinding;for(var i in r){var s=r[i];if(s==e)delete r[i];else if(Array.isArray(s)){var o=s.indexOf(e);o!=-1&&(s.splice(o,1),s.length==1&&(r[i]=s[0]))}}},this.bindKey=function(e,t,n){typeof e=="object"&&e&&(n==undefined&&(n=e.position),e=e[this.platform]);if(!e)return;if(typeof t=="function")return this.addCommand({exec:t,bindKey:e,name:t.name||e});e.split("|").forEach(function(e){var r="";if(e.indexOf(" ")!=-1){var i=e.split(/\s+/);e=i.pop(),i.forEach(function(e){var t=this.parseKeys(e),n=s[t.hashId]+t.key;r+=(r?" ":"")+n,this._addCommandToBinding(r,"chainKeys")},this),r+=" "}var o=this.parseKeys(e),u=s[o.hashId]+o.key;this._addCommandToBinding(r+u,t,n)},this)},this._addCommandToBinding=function(t,n,r){var i=this.commandKeyBinding,s;if(!n)delete i[t];else if(!i[t]||this.$singleCommand)i[t]=n;else{Array.isArray(i[t])?(s=i[t].indexOf(n))!=-1&&i[t].splice(s,1):i[t]=[i[t]],typeof r!="number"&&(r=e(n));var o=i[t];for(s=0;sr)break}o.splice(s,0,n)}},this.addCommands=function(e){e&&Object.keys(e).forEach(function(t){var n=e[t];if(!n)return;if(typeof n=="string")return this.bindKey(n,t);typeof n=="function"&&(n={exec:n});if(typeof n!="object")return;n.name||(n.name=t),this.addCommand(n)},this)},this.removeCommands=function(e){Object.keys(e).forEach(function(t){this.removeCommand(e[t])},this)},this.bindKeys=function(e){Object.keys(e).forEach(function(t){this.bindKey(t,e[t])},this)},this._buildKeyHash=function(e){this.bindKey(e.bindKey,e)},this.parseKeys=function(e){var t=e.toLowerCase().split(/[\-\+]([\-\+])?/).filter(function(e){return e}),n=t.pop(),i=r[n];if(r.FUNCTION_KEYS[i])n=r.FUNCTION_KEYS[i].toLowerCase();else{if(!t.length)return{key:n,hashId:-1};if(t.length==1&&t[0]=="shift")return{key:n.toUpperCase(),hashId:-1}}var s=0;for(var o=t.length;o--;){var u=r.KEY_MODS[t[o]];if(u==null)return typeof console!="undefined"&&console.error("invalid modifier "+t[o]+" in "+e),!1;s|=u}return{key:n,hashId:s}},this.findKeyCommand=function(t,n){var r=s[t]+n;return this.commandKeyBinding[r]},this.handleKeyboard=function(e,t,n,r){if(r<0)return;var i=s[t]+n,o=this.commandKeyBinding[i];e.$keyChain&&(e.$keyChain+=" "+i,o=this.commandKeyBinding[e.$keyChain]||o);if(o)if(o=="chainKeys"||o[o.length-1]=="chainKeys")return e.$keyChain=e.$keyChain||i,{command:"null"};if(e.$keyChain)if(!!t&&t!=4||n.length!=1){if(t==-1||r>0)e.$keyChain=""}else e.$keyChain=e.$keyChain.slice(0,-i.length-1);return{command:o}},this.getStatusText=function(e,t){return t.$keyChain||""}}.call(o.prototype),t.HashHandler=o,t.MultiHashHandler=u}),ace.define("ace/commands/command_manager",["require","exports","module","ace/lib/oop","ace/keyboard/hash_handler","ace/lib/event_emitter"],function(e,t,n){"use strict";var r=e("../lib/oop"),i=e("../keyboard/hash_handler").MultiHashHandler,s=e("../lib/event_emitter").EventEmitter,o=function(e,t){i.call(this,t,e),this.byName=this.commands,this.setDefaultHandler("exec",function(e){return e.command.exec(e.editor,e.args||{})})};r.inherits(o,i),function(){r.implement(this,s),this.exec=function(e,t,n){if(Array.isArray(e)){for(var r=e.length;r--;)if(this.exec(e[r],t,n))return!0;return!1}typeof e=="string"&&(e=this.commands[e]);if(!e)return!1;if(t&&t.$readOnly&&!e.readOnly)return!1;if(e.isAvailable&&!e.isAvailable(t))return!1;var i={editor:t,command:e,args:n};return i.returnValue=this._emit("exec",i),this._signal("afterExec",i),i.returnValue===!1?!1:!0},this.toggleRecording=function(e){if(this.$inReplay)return;return e&&e._emit("changeStatus"),this.recording?(this.macro.pop(),this.removeEventListener("exec",this.$addCommandToMacro),this.macro.length||(this.macro=this.oldMacro),this.recording=!1):(this.$addCommandToMacro||(this.$addCommandToMacro=function(e){this.macro.push([e.command,e.args])}.bind(this)),this.oldMacro=this.macro,this.macro=[],this.on("exec",this.$addCommandToMacro),this.recording=!0)},this.replay=function(e){if(this.$inReplay||!this.macro)return;if(this.recording)return this.toggleRecording(e);try{this.$inReplay=!0,this.macro.forEach(function(t){typeof t=="string"?this.exec(t,e):this.exec(t[0],e,t[1])},this)}finally{this.$inReplay=!1}},this.trimMacro=function(e){return e.map(function(e){return typeof e[0]!="string"&&(e[0]=e[0].name),e[1]||(e=e[0]),e})}}.call(o.prototype),t.CommandManager=o}),ace.define("ace/commands/default_commands",["require","exports","module","ace/lib/lang","ace/config","ace/range"],function(e,t,n){"use strict";function o(e,t){return{win:e,mac:t}}var r=e("../lib/lang"),i=e("../config"),s=e("../range").Range;t.commands=[{name:"showSettingsMenu",bindKey:o("Ctrl-,","Command-,"),exec:function(e){i.loadModule("ace/ext/settings_menu",function(t){t.init(e),e.showSettingsMenu()})},readOnly:!0},{name:"goToNextError",bindKey:o("Alt-E","F4"),exec:function(e){i.loadModule("ace/ext/error_marker",function(t){t.showErrorMarker(e,1)})},scrollIntoView:"animate",readOnly:!0},{name:"goToPreviousError",bindKey:o("Alt-Shift-E","Shift-F4"),exec:function(e){i.loadModule("ace/ext/error_marker",function(t){t.showErrorMarker(e,-1)})},scrollIntoView:"animate",readOnly:!0},{name:"selectall",bindKey:o("Ctrl-A","Command-A"),exec:function(e){e.selectAll()},readOnly:!0},{name:"centerselection",bindKey:o(null,"Ctrl-L"),exec:function(e){e.centerSelection()},readOnly:!0},{name:"gotoline",bindKey:o("Ctrl-L","Command-L"),exec:function(e){var t=parseInt(prompt("Enter line number:"),10);isNaN(t)||e.gotoLine(t)},readOnly:!0},{name:"fold",bindKey:o("Alt-L|Ctrl-F1","Command-Alt-L|Command-F1"),exec:function(e){e.session.toggleFold(!1)},multiSelectAction:"forEach",scrollIntoView:"center",readOnly:!0},{name:"unfold",bindKey:o("Alt-Shift-L|Ctrl-Shift-F1","Command-Alt-Shift-L|Command-Shift-F1"),exec:function(e){e.session.toggleFold(!0)},multiSelectAction:"forEach",scrollIntoView:"center",readOnly:!0},{name:"toggleFoldWidget",bindKey:o("F2","F2"),exec:function(e){e.session.toggleFoldWidget()},multiSelectAction:"forEach",scrollIntoView:"center",readOnly:!0},{name:"toggleParentFoldWidget",bindKey:o("Alt-F2","Alt-F2"),exec:function(e){e.session.toggleFoldWidget(!0)},multiSelectAction:"forEach",scrollIntoView:"center",readOnly:!0},{name:"foldall",bindKey:o(null,"Ctrl-Command-Option-0"),exec:function(e){e.session.foldAll()},scrollIntoView:"center",readOnly:!0},{name:"foldOther",bindKey:o("Alt-0","Command-Option-0"),exec:function(e){e.session.foldAll(),e.session.unfold(e.selection.getAllRanges())},scrollIntoView:"center",readOnly:!0},{name:"unfoldall",bindKey:o("Alt-Shift-0","Command-Option-Shift-0"),exec:function(e){e.session.unfold()},scrollIntoView:"center",readOnly:!0},{name:"findnext",bindKey:o("Ctrl-K","Command-G"),exec:function(e){e.findNext()},multiSelectAction:"forEach",scrollIntoView:"center",readOnly:!0},{name:"findprevious",bindKey:o("Ctrl-Shift-K","Command-Shift-G"),exec:function(e){e.findPrevious()},multiSelectAction:"forEach",scrollIntoView:"center",readOnly:!0},{name:"selectOrFindNext",bindKey:o("Alt-K","Ctrl-G"),exec:function(e){e.selection.isEmpty()?e.selection.selectWord():e.findNext()},readOnly:!0},{name:"selectOrFindPrevious",bindKey:o("Alt-Shift-K","Ctrl-Shift-G"),exec:function(e){e.selection.isEmpty()?e.selection.selectWord():e.findPrevious()},readOnly:!0},{name:"find",bindKey:o("Ctrl-F","Command-F"),exec:function(e){i.loadModule("ace/ext/searchbox",function(t){t.Search(e)})},readOnly:!0},{name:"overwrite",bindKey:"Insert",exec:function(e){e.toggleOverwrite()},readOnly:!0},{name:"selecttostart",bindKey:o("Ctrl-Shift-Home","Command-Shift-Home|Command-Shift-Up"),exec:function(e){e.getSelection().selectFileStart()},multiSelectAction:"forEach",readOnly:!0,scrollIntoView:"animate",aceCommandGroup:"fileJump"},{name:"gotostart",bindKey:o("Ctrl-Home","Command-Home|Command-Up"),exec:function(e){e.navigateFileStart()},multiSelectAction:"forEach",readOnly:!0,scrollIntoView:"animate",aceCommandGroup:"fileJump"},{name:"selectup",bindKey:o("Shift-Up","Shift-Up|Ctrl-Shift-P"),exec:function(e){e.getSelection().selectUp()},multiSelectAction:"forEach",scrollIntoView:"cursor",readOnly:!0},{name:"golineup",bindKey:o("Up","Up|Ctrl-P"),exec:function(e,t){e.navigateUp(t.times)},multiSelectAction:"forEach",scrollIntoView:"cursor",readOnly:!0},{name:"selecttoend",bindKey:o("Ctrl-Shift-End","Command-Shift-End|Command-Shift-Down"),exec:function(e){e.getSelection().selectFileEnd()},multiSelectAction:"forEach",readOnly:!0,scrollIntoView:"animate",aceCommandGroup:"fileJump"},{name:"gotoend",bindKey:o("Ctrl-End","Command-End|Command-Down"),exec:function(e){e.navigateFileEnd()},multiSelectAction:"forEach",readOnly:!0,scrollIntoView:"animate",aceCommandGroup:"fileJump"},{name:"selectdown",bindKey:o("Shift-Down","Shift-Down|Ctrl-Shift-N"),exec:function(e){e.getSelection().selectDown()},multiSelectAction:"forEach",scrollIntoView:"cursor",readOnly:!0},{name:"golinedown",bindKey:o("Down","Down|Ctrl-N"),exec:function(e,t){e.navigateDown(t.times)},multiSelectAction:"forEach",scrollIntoView:"cursor",readOnly:!0},{name:"selectwordleft",bindKey:o("Ctrl-Shift-Left","Option-Shift-Left"),exec:function(e){e.getSelection().selectWordLeft()},multiSelectAction:"forEach",scrollIntoView:"cursor",readOnly:!0},{name:"gotowordleft",bindKey:o("Ctrl-Left","Option-Left"),exec:function(e){e.navigateWordLeft()},multiSelectAction:"forEach",scrollIntoView:"cursor",readOnly:!0},{name:"selecttolinestart",bindKey:o("Alt-Shift-Left","Command-Shift-Left|Ctrl-Shift-A"),exec:function(e){e.getSelection().selectLineStart()},multiSelectAction:"forEach",scrollIntoView:"cursor",readOnly:!0},{name:"gotolinestart",bindKey:o("Alt-Left|Home","Command-Left|Home|Ctrl-A"),exec:function(e){e.navigateLineStart()},multiSelectAction:"forEach",scrollIntoView:"cursor",readOnly:!0},{name:"selectleft",bindKey:o("Shift-Left","Shift-Left|Ctrl-Shift-B"),exec:function(e){e.getSelection().selectLeft()},multiSelectAction:"forEach",scrollIntoView:"cursor",readOnly:!0},{name:"gotoleft",bindKey:o("Left","Left|Ctrl-B"),exec:function(e,t){e.navigateLeft(t.times)},multiSelectAction:"forEach",scrollIntoView:"cursor",readOnly:!0},{name:"selectwordright",bindKey:o("Ctrl-Shift-Right","Option-Shift-Right"),exec:function(e){e.getSelection().selectWordRight()},multiSelectAction:"forEach",scrollIntoView:"cursor",readOnly:!0},{name:"gotowordright",bindKey:o("Ctrl-Right","Option-Right"),exec:function(e){e.navigateWordRight()},multiSelectAction:"forEach",scrollIntoView:"cursor",readOnly:!0},{name:"selecttolineend",bindKey:o("Alt-Shift-Right","Command-Shift-Right|Shift-End|Ctrl-Shift-E"),exec:function(e){e.getSelection().selectLineEnd()},multiSelectAction:"forEach",scrollIntoView:"cursor",readOnly:!0},{name:"gotolineend",bindKey:o("Alt-Right|End","Command-Right|End|Ctrl-E"),exec:function(e){e.navigateLineEnd()},multiSelectAction:"forEach",scrollIntoView:"cursor",readOnly:!0},{name:"selectright",bindKey:o("Shift-Right","Shift-Right"),exec:function(e){e.getSelection().selectRight()},multiSelectAction:"forEach",scrollIntoView:"cursor",readOnly:!0},{name:"gotoright",bindKey:o("Right","Right|Ctrl-F"),exec:function(e,t){e.navigateRight(t.times)},multiSelectAction:"forEach",scrollIntoView:"cursor",readOnly:!0},{name:"selectpagedown",bindKey:"Shift-PageDown",exec:function(e){e.selectPageDown()},readOnly:!0},{name:"pagedown",bindKey:o(null,"Option-PageDown"),exec:function(e){e.scrollPageDown()},readOnly:!0},{name:"gotopagedown",bindKey:o("PageDown","PageDown|Ctrl-V"),exec:function(e){e.gotoPageDown()},readOnly:!0},{name:"selectpageup",bindKey:"Shift-PageUp",exec:function(e){e.selectPageUp()},readOnly:!0},{name:"pageup",bindKey:o(null,"Option-PageUp"),exec:function(e){e.scrollPageUp()},readOnly:!0},{name:"gotopageup",bindKey:"PageUp",exec:function(e){e.gotoPageUp()},readOnly:!0},{name:"scrollup",bindKey:o("Ctrl-Up",null),exec:function(e){e.renderer.scrollBy(0,-2*e.renderer.layerConfig.lineHeight)},readOnly:!0},{name:"scrolldown",bindKey:o("Ctrl-Down",null),exec:function(e){e.renderer.scrollBy(0,2*e.renderer.layerConfig.lineHeight)},readOnly:!0},{name:"selectlinestart",bindKey:"Shift-Home",exec:function(e){e.getSelection().selectLineStart()},multiSelectAction:"forEach",scrollIntoView:"cursor",readOnly:!0},{name:"selectlineend",bindKey:"Shift-End",exec:function(e){e.getSelection().selectLineEnd()},multiSelectAction:"forEach",scrollIntoView:"cursor",readOnly:!0},{name:"togglerecording",bindKey:o("Ctrl-Alt-E","Command-Option-E"),exec:function(e){e.commands.toggleRecording(e)},readOnly:!0},{name:"replaymacro",bindKey:o("Ctrl-Shift-E","Command-Shift-E"),exec:function(e){e.commands.replay(e)},readOnly:!0},{name:"jumptomatching",bindKey:o("Ctrl-P","Ctrl-P"),exec:function(e){e.jumpToMatching()},multiSelectAction:"forEach",scrollIntoView:"animate",readOnly:!0},{name:"selecttomatching",bindKey:o("Ctrl-Shift-P","Ctrl-Shift-P"),exec:function(e){e.jumpToMatching(!0)},multiSelectAction:"forEach",scrollIntoView:"animate",readOnly:!0},{name:"expandToMatching",bindKey:o("Ctrl-Shift-M","Ctrl-Shift-M"),exec:function(e){e.jumpToMatching(!0,!0)},multiSelectAction:"forEach",scrollIntoView:"animate",readOnly:!0},{name:"passKeysToBrowser",bindKey:o(null,null),exec:function(){},passEvent:!0,readOnly:!0},{name:"copy",exec:function(e){},readOnly:!0},{name:"cut",exec:function(e){var t=e.getSelectionRange();e._emit("cut",t),e.selection.isEmpty()||(e.session.remove(t),e.clearSelection())},scrollIntoView:"cursor",multiSelectAction:"forEach"},{name:"paste",exec:function(e,t){e.$handlePaste(t)},scrollIntoView:"cursor"},{name:"removeline",bindKey:o("Ctrl-D","Command-D"),exec:function(e){e.removeLines()},scrollIntoView:"cursor",multiSelectAction:"forEachLine"},{name:"duplicateSelection",bindKey:o("Ctrl-Shift-D","Command-Shift-D"),exec:function(e){e.duplicateSelection()},scrollIntoView:"cursor",multiSelectAction:"forEach"},{name:"sortlines",bindKey:o("Ctrl-Alt-S","Command-Alt-S"),exec:function(e){e.sortLines()},scrollIntoView:"selection",multiSelectAction:"forEachLine"},{name:"togglecomment",bindKey:o("Ctrl-/","Command-/"),exec:function(e){e.toggleCommentLines()},multiSelectAction:"forEachLine",scrollIntoView:"selectionPart"},{name:"toggleBlockComment",bindKey:o("Ctrl-Shift-/","Command-Shift-/"),exec:function(e){e.toggleBlockComment()},multiSelectAction:"forEach",scrollIntoView:"selectionPart"},{name:"modifyNumberUp",bindKey:o("Ctrl-Shift-Up","Alt-Shift-Up"),exec:function(e){e.modifyNumber(1)},scrollIntoView:"cursor",multiSelectAction:"forEach"},{name:"modifyNumberDown",bindKey:o("Ctrl-Shift-Down","Alt-Shift-Down"),exec:function(e){e.modifyNumber(-1)},scrollIntoView:"cursor",multiSelectAction:"forEach"},{name:"replace",bindKey:o("Ctrl-H","Command-Option-F"),exec:function(e){i.loadModule("ace/ext/searchbox",function(t){t.Search(e,!0)})}},{name:"undo",bindKey:o("Ctrl-Z","Command-Z"),exec:function(e){e.undo()}},{name:"redo",bindKey:o("Ctrl-Shift-Z|Ctrl-Y","Command-Shift-Z|Command-Y"),exec:function(e){e.redo()}},{name:"copylinesup",bindKey:o("Alt-Shift-Up","Command-Option-Up"),exec:function(e){e.copyLinesUp()},scrollIntoView:"cursor"},{name:"movelinesup",bindKey:o("Alt-Up","Option-Up"),exec:function(e){e.moveLinesUp()},scrollIntoView:"cursor"},{name:"copylinesdown",bindKey:o("Alt-Shift-Down","Command-Option-Down"),exec:function(e){e.copyLinesDown()},scrollIntoView:"cursor"},{name:"movelinesdown",bindKey:o("Alt-Down","Option-Down"),exec:function(e){e.moveLinesDown()},scrollIntoView:"cursor"},{name:"del",bindKey:o("Delete","Delete|Ctrl-D|Shift-Delete"),exec:function(e){e.remove("right")},multiSelectAction:"forEach",scrollIntoView:"cursor"},{name:"backspace",bindKey:o("Shift-Backspace|Backspace","Ctrl-Backspace|Shift-Backspace|Backspace|Ctrl-H"),exec:function(e){e.remove("left")},multiSelectAction:"forEach",scrollIntoView:"cursor"},{name:"cut_or_delete",bindKey:o("Shift-Delete",null),exec:function(e){if(!e.selection.isEmpty())return!1;e.remove("left")},multiSelectAction:"forEach",scrollIntoView:"cursor"},{name:"removetolinestart",bindKey:o("Alt-Backspace","Command-Backspace"),exec:function(e){e.removeToLineStart()},multiSelectAction:"forEach",scrollIntoView:"cursor"},{name:"removetolineend",bindKey:o("Alt-Delete","Ctrl-K"),exec:function(e){e.removeToLineEnd()},multiSelectAction:"forEach",scrollIntoView:"cursor"},{name:"removewordleft",bindKey:o("Ctrl-Backspace","Alt-Backspace|Ctrl-Alt-Backspace"),exec:function(e){e.removeWordLeft()},multiSelectAction:"forEach",scrollIntoView:"cursor"},{name:"removewordright",bindKey:o("Ctrl-Delete","Alt-Delete"),exec:function(e){e.removeWordRight()},multiSelectAction:"forEach",scrollIntoView:"cursor"},{name:"outdent",bindKey:o("Shift-Tab","Shift-Tab"),exec:function(e){e.blockOutdent()},multiSelectAction:"forEach",scrollIntoView:"selectionPart"},{name:"indent",bindKey:o("Tab","Tab"),exec:function(e){e.indent()},multiSelectAction:"forEach",scrollIntoView:"selectionPart"},{name:"blockoutdent",bindKey:o("Ctrl-[","Ctrl-["),exec:function(e){e.blockOutdent()},multiSelectAction:"forEachLine",scrollIntoView:"selectionPart"},{name:"blockindent",bindKey:o("Ctrl-]","Ctrl-]"),exec:function(e){e.blockIndent()},multiSelectAction:"forEachLine",scrollIntoView:"selectionPart"},{name:"insertstring",exec:function(e,t){e.insert(t)},multiSelectAction:"forEach",scrollIntoView:"cursor"},{name:"inserttext",exec:function(e,t){e.insert(r.stringRepeat(t.text||"",t.times||1))},multiSelectAction:"forEach",scrollIntoView:"cursor"},{name:"splitline",bindKey:o(null,"Ctrl-O"),exec:function(e){e.splitLine()},multiSelectAction:"forEach",scrollIntoView:"cursor"},{name:"transposeletters",bindKey:o("Alt-Shift-X","Ctrl-T"),exec:function(e){e.transposeLetters()},multiSelectAction:function(e){e.transposeSelections(1)},scrollIntoView:"cursor"},{name:"touppercase",bindKey:o("Ctrl-U","Ctrl-U"),exec:function(e){e.toUpperCase()},multiSelectAction:"forEach",scrollIntoView:"cursor"},{name:"tolowercase",bindKey:o("Ctrl-Shift-U","Ctrl-Shift-U"),exec:function(e){e.toLowerCase()},multiSelectAction:"forEach",scrollIntoView:"cursor"},{name:"expandtoline",bindKey:o("Ctrl-Shift-L","Command-Shift-L"),exec:function(e){var t=e.selection.getRange();t.start.column=t.end.column=0,t.end.row++,e.selection.setRange(t,!1)},multiSelectAction:"forEach",scrollIntoView:"cursor",readOnly:!0},{name:"joinlines",bindKey:o(null,null),exec:function(e){var t=e.selection.isBackwards(),n=t?e.selection.getSelectionLead():e.selection.getSelectionAnchor(),i=t?e.selection.getSelectionAnchor():e.selection.getSelectionLead(),o=e.session.doc.getLine(n.row).length,u=e.session.doc.getTextRange(e.selection.getRange()),a=u.replace(/\n\s*/," ").length,f=e.session.doc.getLine(n.row);for(var l=n.row+1;l<=i.row+1;l++){var c=r.stringTrimLeft(r.stringTrimRight(e.session.doc.getLine(l)));c.length!==0&&(c=" "+c),f+=c}i.row+10?(e.selection.moveCursorTo(n.row,n.column),e.selection.selectTo(n.row,n.column+a)):(o=e.session.doc.getLine(n.row).length>o?o+1:o,e.selection.moveCursorTo(n.row,o))},multiSelectAction:"forEach",readOnly:!0},{name:"invertSelection",bindKey:o(null,null),exec:function(e){var t=e.session.doc.getLength()-1,n=e.session.doc.getLine(t).length,r=e.selection.rangeList.ranges,i=[];r.length<1&&(r=[e.selection.getRange()]);for(var o=0;o0&&this.$blockScrolling--;var n=t&&t.scrollIntoView;if(n){switch(n){case"center-animate":n="animate";case"center":this.renderer.scrollCursorIntoView(null,.5);break;case"animate":case"cursor":this.renderer.scrollCursorIntoView();break;case"selectionPart":var r=this.selection.getRange(),i=this.renderer.layerConfig;(r.start.row>=i.lastRow||r.end.row<=i.firstRow)&&this.renderer.scrollSelectionIntoView(this.selection.anchor,this.selection.lead);break;default:}n=="animate"&&this.renderer.animateScrolling(this.curOp.scrollTop)}this.prevOp=this.curOp,this.curOp=null}},this.$mergeableCommands=["backspace","del","insertstring"],this.$historyTracker=function(e){if(!this.$mergeUndoDeltas)return;var t=this.prevOp,n=this.$mergeableCommands,r=t.command&&e.command.name==t.command.name;if(e.command.name=="insertstring"){var i=e.args;this.mergeNextCommand===undefined&&(this.mergeNextCommand=!0),r=r&&this.mergeNextCommand&&(!/\s/.test(i)||/\s/.test(t.args)),this.mergeNextCommand=!0}else r=r&&n.indexOf(e.command.name)!==-1;this.$mergeUndoDeltas!="always"&&Date.now()-this.sequenceStartTime>2e3&&(r=!1),r?this.session.mergeUndoDeltas=!0:n.indexOf(e.command.name)!==-1&&(this.sequenceStartTime=Date.now())},this.setKeyboardHandler=function(e,t){if(e&&typeof e=="string"){this.$keybindingId=e;var n=this;g.loadModule(["keybinding",e],function(r){n.$keybindingId==e&&n.keyBinding.setKeyboardHandler(r&&r.handler),t&&t()})}else this.$keybindingId=null,this.keyBinding.setKeyboardHandler(e),t&&t()},this.getKeyboardHandler=function(){return this.keyBinding.getKeyboardHandler()},this.setSession=function(e){if(this.session==e)return;this.curOp&&this.endOperation(),this.curOp={};var t=this.session;if(t){this.session.off("change",this.$onDocumentChange),this.session.off("changeMode",this.$onChangeMode),this.session.off("tokenizerUpdate",this.$onTokenizerUpdate),this.session.off("changeTabSize",this.$onChangeTabSize),this.session.off("changeWrapLimit",this.$onChangeWrapLimit),this.session.off("changeWrapMode",this.$onChangeWrapMode),this.session.off("changeFold",this.$onChangeFold),this.session.off("changeFrontMarker",this.$onChangeFrontMarker),this.session.off("changeBackMarker",this.$onChangeBackMarker),this.session.off("changeBreakpoint",this.$onChangeBreakpoint),this.session.off("changeAnnotation",this.$onChangeAnnotation),this.session.off("changeOverwrite",this.$onCursorChange),this.session.off("changeScrollTop",this.$onScrollTopChange),this.session.off("changeScrollLeft",this.$onScrollLeftChange);var n=this.session.getSelection();n.off("changeCursor",this.$onCursorChange),n.off("changeSelection",this.$onSelectionChange)}this.session=e,e?(this.$onDocumentChange=this.onDocumentChange.bind(this),e.on("change",this.$onDocumentChange),this.renderer.setSession(e),this.$onChangeMode=this.onChangeMode.bind(this),e.on("changeMode",this.$onChangeMode),this.$onTokenizerUpdate=this.onTokenizerUpdate.bind(this),e.on("tokenizerUpdate",this.$onTokenizerUpdate),this.$onChangeTabSize=this.renderer.onChangeTabSize.bind(this.renderer),e.on("changeTabSize",this.$onChangeTabSize),this.$onChangeWrapLimit=this.onChangeWrapLimit.bind(this),e.on("changeWrapLimit",this.$onChangeWrapLimit),this.$onChangeWrapMode=this.onChangeWrapMode.bind(this),e.on("changeWrapMode",this.$onChangeWrapMode),this.$onChangeFold=this.onChangeFold.bind(this),e.on("changeFold",this.$onChangeFold),this.$onChangeFrontMarker=this.onChangeFrontMarker.bind(this),this.session.on("changeFrontMarker",this.$onChangeFrontMarker),this.$onChangeBackMarker=this.onChangeBackMarker.bind(this),this.session.on("changeBackMarker",this.$onChangeBackMarker),this.$onChangeBreakpoint=this.onChangeBreakpoint.bind(this),this.session.on("changeBreakpoint",this.$onChangeBreakpoint),this.$onChangeAnnotation=this.onChangeAnnotation.bind(this),this.session.on("changeAnnotation",this.$onChangeAnnotation),this.$onCursorChange=this.onCursorChange.bind(this),this.session.on("changeOverwrite",this.$onCursorChange),this.$onScrollTopChange=this.onScrollTopChange.bind(this),this.session.on("changeScrollTop",this.$onScrollTopChange),this.$onScrollLeftChange=this.onScrollLeftChange.bind(this),this.session.on("changeScrollLeft",this.$onScrollLeftChange),this.selection=e.getSelection(),this.selection.on("changeCursor",this.$onCursorChange),this.$onSelectionChange=this.onSelectionChange.bind(this),this.selection.on("changeSelection",this.$onSelectionChange),this.onChangeMode(),this.$blockScrolling+=1,this.onCursorChange(),this.$blockScrolling-=1,this.onScrollTopChange(),this.onScrollLeftChange(),this.onSelectionChange(),this.onChangeFrontMarker(),this.onChangeBackMarker(),this.onChangeBreakpoint(),this.onChangeAnnotation(),this.session.getUseWrapMode()&&this.renderer.adjustWrapLimit(),this.renderer.updateFull()):(this.selection=null,this.renderer.setSession(e)),this._signal("changeSession",{session:e,oldSession:t}),this.curOp=null,t&&t._signal("changeEditor",{oldEditor:this}),e&&e._signal("changeEditor",{editor:this}),e&&e.bgTokenizer&&e.bgTokenizer.scheduleStart()},this.getSession=function(){return this.session},this.setValue=function(e,t){return this.session.doc.setValue(e),t?t==1?this.navigateFileEnd():t==-1&&this.navigateFileStart():this.selectAll(),e},this.getValue=function(){return this.session.getValue()},this.getSelection=function(){return this.selection},this.resize=function(e){this.renderer.onResize(e)},this.setTheme=function(e,t){this.renderer.setTheme(e,t)},this.getTheme=function(){return this.renderer.getTheme()},this.setStyle=function(e){this.renderer.setStyle(e)},this.unsetStyle=function(e){this.renderer.unsetStyle(e)},this.getFontSize=function(){return this.getOption("fontSize")||i.computedStyle(this.container,"fontSize")},this.setFontSize=function(e){this.setOption("fontSize",e)},this.$highlightBrackets=function(){this.session.$bracketHighlight&&(this.session.removeMarker(this.session.$bracketHighlight),this.session.$bracketHighlight=null);if(this.$highlightPending)return;var e=this;this.$highlightPending=!0,setTimeout(function(){e.$highlightPending=!1;var t=e.session;if(!t||!t.bgTokenizer)return;var n=t.findMatchingBracket(e.getCursorPosition());if(n)var r=new p(n.row,n.column,n.row,n.column+1);else if(t.$mode.getMatching)var r=t.$mode.getMatching(e.session);r&&(t.$bracketHighlight=t.addMarker(r,"ace_bracket","text"))},50)},this.$highlightTags=function(){if(this.$highlightTagPending)return;var e=this;this.$highlightTagPending=!0,setTimeout(function(){e.$highlightTagPending=!1;var t=e.session;if(!t||!t.bgTokenizer)return;var n=e.getCursorPosition(),r=new y(e.session,n.row,n.column),i=r.getCurrentToken();if(!i||!/\b(?:tag-open|tag-name)/.test(i.type)){t.removeMarker(t.$tagHighlight),t.$tagHighlight=null;return}if(i.type.indexOf("tag-open")!=-1){i=r.stepForward();if(!i)return}var s=i.value,o=0,u=r.stepBackward();if(u.value=="<"){do u=i,i=r.stepForward(),i&&i.value===s&&i.type.indexOf("tag-name")!==-1&&(u.value==="<"?o++:u.value==="=0)}else{do i=u,u=r.stepBackward(),i&&i.value===s&&i.type.indexOf("tag-name")!==-1&&(u.value==="<"?o++:u.value==="1)&&(t=!1)}if(e.$highlightLineMarker&&!t)e.removeMarker(e.$highlightLineMarker.id),e.$highlightLineMarker=null;else if(!e.$highlightLineMarker&&t){var n=new p(t.row,t.column,t.row,Infinity);n.id=e.addMarker(n,"ace_active-line","screenLine"),e.$highlightLineMarker=n}else t&&(e.$highlightLineMarker.start.row=t.row,e.$highlightLineMarker.end.row=t.row,e.$highlightLineMarker.start.column=t.column,e._signal("changeBackMarker"))},this.onSelectionChange=function(e){var t=this.session;t.$selectionMarker&&t.removeMarker(t.$selectionMarker),t.$selectionMarker=null;if(!this.selection.isEmpty()){var n=this.selection.getRange(),r=this.getSelectionStyle();t.$selectionMarker=t.addMarker(n,"ace_selection",r)}else this.$updateHighlightActiveLine();var i=this.$highlightSelectedWord&&this.$getSelectionHighLightRegexp();this.session.highlight(i),this._signal("changeSelection")},this.$getSelectionHighLightRegexp=function(){var e=this.session,t=this.getSelectionRange();if(t.isEmpty()||t.isMultiLine())return;var n=t.start.column-1,r=t.end.column+1,i=e.getLine(t.start.row),s=i.length,o=i.substring(Math.max(n,0),Math.min(r,s));if(n>=0&&/^[\w\d]/.test(o)||r<=s&&/[\w\d]$/.test(o))return;o=i.substring(t.start.column,t.end.column);if(!/^[\w\d]+$/.test(o))return;var u=this.$search.$assembleRegExp({wholeWord:!0,caseSensitive:!0,needle:o});return u},this.onChangeFrontMarker=function(){this.renderer.updateFrontMarkers()},this.onChangeBackMarker=function(){this.renderer.updateBackMarkers()},this.onChangeBreakpoint=function(){this.renderer.updateBreakpoints()},this.onChangeAnnotation=function(){this.renderer.setAnnotations(this.session.getAnnotations())},this.onChangeMode=function(e){this.renderer.updateText(),this._emit("changeMode",e)},this.onChangeWrapLimit=function(){this.renderer.updateFull()},this.onChangeWrapMode=function(){this.renderer.onResize(!0)},this.onChangeFold=function(){this.$updateHighlightActiveLine(),this.renderer.updateFull()},this.getSelectedText=function(){return this.session.getTextRange(this.getSelectionRange())},this.getCopyText=function(){var e=this.getSelectedText();return this._signal("copy",e),e},this.onCopy=function(){this.commands.exec("copy",this)},this.onCut=function(){this.commands.exec("cut",this)},this.onPaste=function(e,t){var n={text:e,event:t};this.commands.exec("paste",this,n)},this.$handlePaste=function(e){typeof e=="string"&&(e={text:e}),this._signal("paste",e);var t=e.text;if(!this.inMultiSelectMode||this.inVirtualSelectionMode)this.insert(t);else{var n=t.split(/\r\n|\r|\n/),r=this.selection.rangeList.ranges;if(n.length>r.length||n.length<2||!n[1])return this.commands.exec("insertstring",this,t);for(var i=r.length;i--;){var s=r[i];s.isEmpty()||this.session.remove(s),this.session.insert(s.start,n[i])}}},this.execCommand=function(e,t){return this.commands.exec(e,this,t)},this.insert=function(e,t){var n=this.session,r=n.getMode(),i=this.getCursorPosition();if(this.getBehavioursEnabled()&&!t){var s=r.transformAction(n.getState(i.row),"insertion",this,n,e);s&&(e!==s.text&&(this.session.mergeUndoDeltas=!1,this.$mergeNextCommand=!1),e=s.text)}e==" "&&(e=this.session.getTabString());if(!this.selection.isEmpty()){var o=this.getSelectionRange();i=this.session.remove(o),this.clearSelection()}else if(this.session.getOverwrite()&&e.indexOf("\n")==-1){var o=new p.fromPoints(i,i);o.end.column+=e.length,this.session.remove(o)}if(e=="\n"||e=="\r\n"){var u=n.getLine(i.row);if(i.column>u.search(/\S|$/)){var a=u.substr(i.column).search(/\S|$/);n.doc.removeInLine(i.row,i.column,i.column+a)}}this.clearSelection();var f=i.column,l=n.getState(i.row),u=n.getLine(i.row),c=r.checkOutdent(l,u,e),h=n.insert(i,e);s&&s.selection&&(s.selection.length==2?this.selection.setSelectionRange(new p(i.row,f+s.selection[0],i.row,f+s.selection[1])):this.selection.setSelectionRange(new p(i.row+s.selection[0],s.selection[1],i.row+s.selection[2],s.selection[3])));if(n.getDocument().isNewLine(e)){var d=r.getNextLineIndent(l,u.slice(0,i.column),n.getTabString());n.insert({row:i.row+1,column:0},d)}c&&r.autoOutdent(l,n,i.row)},this.onTextInput=function(e){this.keyBinding.onTextInput(e)},this.onCommandKey=function(e,t,n){this.keyBinding.onCommandKey(e,t,n)},this.setOverwrite=function(e){this.session.setOverwrite(e)},this.getOverwrite=function(){return this.session.getOverwrite()},this.toggleOverwrite=function(){this.session.toggleOverwrite()},this.setScrollSpeed=function(e){this.setOption("scrollSpeed",e)},this.getScrollSpeed=function(){return this.getOption("scrollSpeed")},this.setDragDelay=function(e){this.setOption("dragDelay",e)},this.getDragDelay=function(){return this.getOption("dragDelay")},this.setSelectionStyle=function(e){this.setOption("selectionStyle",e)},this.getSelectionStyle=function(){return this.getOption("selectionStyle")},this.setHighlightActiveLine=function(e){this.setOption("highlightActiveLine",e)},this.getHighlightActiveLine=function(){return this.getOption("highlightActiveLine")},this.setHighlightGutterLine=function(e){this.setOption("highlightGutterLine",e)},this.getHighlightGutterLine=function(){return this.getOption("highlightGutterLine")},this.setHighlightSelectedWord=function(e){this.setOption("highlightSelectedWord",e)},this.getHighlightSelectedWord=function(){return this.$highlightSelectedWord},this.setAnimatedScroll=function(e){this.renderer.setAnimatedScroll(e)},this.getAnimatedScroll=function(){return this.renderer.getAnimatedScroll()},this.setShowInvisibles=function(e){this.renderer.setShowInvisibles(e)},this.getShowInvisibles=function(){return this.renderer.getShowInvisibles()},this.setDisplayIndentGuides=function(e){this.renderer.setDisplayIndentGuides(e)},this.getDisplayIndentGuides=function(){return this.renderer.getDisplayIndentGuides()},this.setShowPrintMargin=function(e){this.renderer.setShowPrintMargin(e)},this.getShowPrintMargin=function(){return this.renderer.getShowPrintMargin()},this.setPrintMarginColumn=function(e){this.renderer.setPrintMarginColumn(e)},this.getPrintMarginColumn=function(){return this.renderer.getPrintMarginColumn()},this.setReadOnly=function(e){this.setOption("readOnly",e)},this.getReadOnly=function(){return this.getOption("readOnly")},this.setBehavioursEnabled=function(e){this.setOption("behavioursEnabled",e)},this.getBehavioursEnabled=function(){return this.getOption("behavioursEnabled")},this.setWrapBehavioursEnabled=function(e){this.setOption("wrapBehavioursEnabled",e)},this.getWrapBehavioursEnabled=function(){return this.getOption("wrapBehavioursEnabled")},this.setShowFoldWidgets=function(e){this.setOption("showFoldWidgets",e)},this.getShowFoldWidgets=function(){return this.getOption("showFoldWidgets")},this.setFadeFoldWidgets=function(e){this.setOption("fadeFoldWidgets",e)},this.getFadeFoldWidgets=function(){return this.getOption("fadeFoldWidgets")},this.remove=function(e){this.selection.isEmpty()&&(e=="left"?this.selection.selectLeft():this.selection.selectRight());var t=this.getSelectionRange();if(this.getBehavioursEnabled()){var n=this.session,r=n.getState(t.start.row),i=n.getMode().transformAction(r,"deletion",this,n,t);if(t.end.column===0){var s=n.getTextRange(t);if(s[s.length-1]=="\n"){var o=n.getLine(t.end.row);/^\s+$/.test(o)&&(t.end.column=o.length)}}i&&(t=i)}this.session.remove(t),this.clearSelection()},this.removeWordRight=function(){this.selection.isEmpty()&&this.selection.selectWordRight(),this.session.remove(this.getSelectionRange()),this.clearSelection()},this.removeWordLeft=function(){this.selection.isEmpty()&&this.selection.selectWordLeft(),this.session.remove(this.getSelectionRange()),this.clearSelection()},this.removeToLineStart=function(){this.selection.isEmpty()&&this.selection.selectLineStart(),this.session.remove(this.getSelectionRange()),this.clearSelection()},this.removeToLineEnd=function(){this.selection.isEmpty()&&this.selection.selectLineEnd();var e=this.getSelectionRange();e.start.column==e.end.column&&e.start.row==e.end.row&&(e.end.column=0,e.end.row++),this.session.remove(e),this.clearSelection()},this.splitLine=function(){this.selection.isEmpty()||(this.session.remove(this.getSelectionRange()),this.clearSelection());var e=this.getCursorPosition();this.insert("\n"),this.moveCursorToPosition(e)},this.transposeLetters=function(){if(!this.selection.isEmpty())return;var e=this.getCursorPosition(),t=e.column;if(t===0)return;var n=this.session.getLine(e.row),r,i;tt.toLowerCase()?1:0});var r=new p(0,0,0,0);for(var i=e.first;i<=e.last;i++){var s=t.getLine(i);r.start.row=i,r.end.row=i,r.end.column=s.length,t.replace(r,n[i-e.first])}},this.toggleCommentLines=function(){var e=this.session.getState(this.getCursorPosition().row),t=this.$getSelectedRows();this.session.getMode().toggleCommentLines(e,this.session,t.first,t.last)},this.toggleBlockComment=function(){var e=this.getCursorPosition(),t=this.session.getState(e.row),n=this.getSelectionRange();this.session.getMode().toggleBlockComment(t,this.session,n,e)},this.getNumberAt=function(e,t){var n=/[\-]?[0-9]+(?:\.[0-9]+)?/g;n.lastIndex=0;var r=this.session.getLine(e);while(n.lastIndex=t){var s={value:i[0],start:i.index,end:i.index+i[0].length};return s}}return null},this.modifyNumber=function(e){var t=this.selection.getCursor().row,n=this.selection.getCursor().column,r=new p(t,n-1,t,n),i=this.session.getTextRange(r);if(!isNaN(parseFloat(i))&&isFinite(i)){var s=this.getNumberAt(t,n);if(s){var o=s.value.indexOf(".")>=0?s.start+s.value.indexOf(".")+1:s.end,u=s.start+s.value.length-o,a=parseFloat(s.value);a*=Math.pow(10,u),o!==s.end&&np+1)break;p=d.last}l--,u=this.session.$moveLines(h,p,t?0:e),t&&e==-1&&(c=l+1);while(c<=l)o[c].moveBy(u,0),c++;t||(u=0),a+=u}i.fromOrientedRange(i.ranges[0]),i.rangeList.attach(this.session),this.inVirtualSelectionMode=!1}},this.$getSelectedRows=function(e){return e=(e||this.getSelectionRange()).collapseRows(),{first:this.session.getRowFoldStart(e.start.row),last:this.session.getRowFoldEnd(e.end.row)}},this.onCompositionStart=function(e){this.renderer.showComposition(this.getCursorPosition())},this.onCompositionUpdate=function(e){this.renderer.setCompositionText(e)},this.onCompositionEnd=function(){this.renderer.hideComposition()},this.getFirstVisibleRow=function(){return this.renderer.getFirstVisibleRow()},this.getLastVisibleRow=function(){return this.renderer.getLastVisibleRow()},this.isRowVisible=function(e){return e>=this.getFirstVisibleRow()&&e<=this.getLastVisibleRow()},this.isRowFullyVisible=function(e){return e>=this.renderer.getFirstFullyVisibleRow()&&e<=this.renderer.getLastFullyVisibleRow()},this.$getVisibleRowCount=function(){return this.renderer.getScrollBottomRow()-this.renderer.getScrollTopRow()+1},this.$moveByPage=function(e,t){var n=this.renderer,r=this.renderer.layerConfig,i=e*Math.floor(r.height/r.lineHeight);this.$blockScrolling++,t===!0?this.selection.$moveSelection(function(){this.moveCursorBy(i,0)}):t===!1&&(this.selection.moveCursorBy(i,0),this.selection.clearSelection()),this.$blockScrolling--;var s=n.scrollTop;n.scrollBy(0,i*r.lineHeight),t!=null&&n.scrollCursorIntoView(null,.5),n.animateScrolling(s)},this.selectPageDown=function(){this.$moveByPage(1,!0)},this.selectPageUp=function(){this.$moveByPage(-1,!0)},this.gotoPageDown=function(){this.$moveByPage(1,!1)},this.gotoPageUp=function(){this.$moveByPage(-1,!1)},this.scrollPageDown=function(){this.$moveByPage(1)},this.scrollPageUp=function(){this.$moveByPage(-1)},this.scrollToRow=function(e){this.renderer.scrollToRow(e)},this.scrollToLine=function(e,t,n,r){this.renderer.scrollToLine(e,t,n,r)},this.centerSelection=function(){var e=this.getSelectionRange(),t={row:Math.floor(e.start.row+(e.end.row-e.start.row)/2),column:Math.floor(e.start.column+(e.end.column-e.start.column)/2)};this.renderer.alignCursor(t,.5)},this.getCursorPosition=function(){return this.selection.getCursor()},this.getCursorPositionScreen=function(){return this.session.documentToScreenPosition(this.getCursorPosition())},this.getSelectionRange=function(){return this.selection.getRange()},this.selectAll=function(){this.$blockScrolling+=1,this.selection.selectAll(),this.$blockScrolling-=1},this.clearSelection=function(){this.selection.clearSelection()},this.moveCursorTo=function(e,t){this.selection.moveCursorTo(e,t)},this.moveCursorToPosition=function(e){this.selection.moveCursorToPosition(e)},this.jumpToMatching=function(e,t){var n=this.getCursorPosition(),r=new y(this.session,n.row,n.column),i=r.getCurrentToken(),s=i||r.stepForward();if(!s)return;var o,u=!1,a={},f=n.column-s.start,l,c={")":"(","(":"(","]":"[","[":"[","{":"{","}":"{"};do{if(s.value.match(/[{}()\[\]]/g))for(;f=0;--s)this.$tryReplace(n[s],e)&&r++;return this.selection.setSelectionRange(i),this.$blockScrolling-=1,r},this.$tryReplace=function(e,t){var n=this.session.getTextRange(e);return t=this.$search.replace(n,t),t!==null?(e.end=this.session.replace(e,t),e):null},this.getLastSearchOptions=function(){return this.$search.getOptions()},this.find=function(e,t,n){t||(t={}),typeof e=="string"||e instanceof RegExp?t.needle=e:typeof e=="object"&&r.mixin(t,e);var i=this.selection.getRange();t.needle==null&&(e=this.session.getTextRange(i)||this.$search.$options.needle,e||(i=this.session.getWordRange(i.start.row,i.start.column),e=this.session.getTextRange(i)),this.$search.set({needle:e})),this.$search.set(t),t.start||this.$search.set({start:i});var s=this.$search.find(this.session);if(t.preventScroll)return s;if(s)return this.revealRange(s,n),s;t.backwards?i.start=i.end:i.end=i.start,this.selection.setRange(i)},this.findNext=function(e,t){this.find({skipCurrent:!0,backwards:!1},e,t)},this.findPrevious=function(e,t){this.find(e,{skipCurrent:!0,backwards:!0},t)},this.revealRange=function(e,t){this.$blockScrolling+=1,this.session.unfold(e),this.selection.setSelectionRange(e),this.$blockScrolling-=1;var n=this.renderer.scrollTop;this.renderer.scrollSelectionIntoView(e.start,e.end,.5),t!==!1&&this.renderer.animateScrolling(n)},this.undo=function(){this.$blockScrolling++,this.session.getUndoManager().undo(),this.$blockScrolling--,this.renderer.scrollCursorIntoView(null,.5)},this.redo=function(){this.$blockScrolling++,this.session.getUndoManager().redo(),this.$blockScrolling--,this.renderer.scrollCursorIntoView(null,.5)},this.destroy=function(){this.renderer.destroy(),this._signal("destroy",this),this.session&&this.session.destroy()},this.setAutoScrollEditorIntoView=function(e){if(!e)return;var t,n=this,r=!1;this.$scrollAnchor||(this.$scrollAnchor=document.createElement("div"));var i=this.$scrollAnchor;i.style.cssText="position:absolute",this.container.insertBefore(i,this.container.firstChild);var s=this.on("changeSelection",function(){r=!0}),o=this.renderer.on("beforeRender",function(){r&&(t=n.renderer.container.getBoundingClientRect())}),u=this.renderer.on("afterRender",function(){if(r&&t&&(n.isFocused()||n.searchBox&&n.searchBox.isFocused())){var e=n.renderer,s=e.$cursorLayer.$pixelPos,o=e.layerConfig,u=s.top-o.offset;s.top>=0&&u+t.top<0?r=!0:s.topwindow.innerHeight?r=!1:r=null,r!=null&&(i.style.top=u+"px",i.style.left=s.left+"px",i.style.height=o.lineHeight+"px",i.scrollIntoView(r)),r=t=null}});this.setAutoScrollEditorIntoView=function(e){if(e)return;delete this.setAutoScrollEditorIntoView,this.off("changeSelection",s),this.renderer.off("afterRender",u),this.renderer.off("beforeRender",o)}},this.$resetCursorStyle=function(){var e=this.$cursorStyle||"ace",t=this.renderer.$cursorLayer;if(!t)return;t.setSmoothBlinking(/smooth/.test(e)),t.isBlinking=!this.$readOnly&&e!="wide",i.setCssClass(t.element,"ace_slim-cursors",/slim/.test(e))}}.call(b.prototype),g.defineOptions(b.prototype,"editor",{selectionStyle:{set:function(e){this.onSelectionChange(),this._signal("changeSelectionStyle",{data:e})},initialValue:"line"},highlightActiveLine:{set:function(){this.$updateHighlightActiveLine()},initialValue:!0},highlightSelectedWord:{set:function(e){this.$onSelectionChange()},initialValue:!0},readOnly:{set:function(e){this.$resetCursorStyle()},initialValue:!1},cursorStyle:{set:function(e){this.$resetCursorStyle()},values:["ace","slim","smooth","wide"],initialValue:"ace"},mergeUndoDeltas:{values:[!1,!0,"always"],initialValue:!0},behavioursEnabled:{initialValue:!0},wrapBehavioursEnabled:{initialValue:!0},autoScrollEditorIntoView:{set:function(e){this.setAutoScrollEditorIntoView(e)}},keyboardHandler:{set:function(e){this.setKeyboardHandler(e)},get:function(){return this.keybindingId},handlesSet:!0},hScrollBarAlwaysVisible:"renderer",vScrollBarAlwaysVisible:"renderer",highlightGutterLine:"renderer",animatedScroll:"renderer",showInvisibles:"renderer",showPrintMargin:"renderer",printMarginColumn:"renderer",printMargin:"renderer",fadeFoldWidgets:"renderer",showFoldWidgets:"renderer",showLineNumbers:"renderer",showGutter:"renderer",displayIndentGuides:"renderer",fontSize:"renderer",fontFamily:"renderer",maxLines:"renderer",minLines:"renderer",scrollPastEnd:"renderer",fixedWidthGutter:"renderer",theme:"renderer",scrollSpeed:"$mouseHandler",dragDelay:"$mouseHandler",dragEnabled:"$mouseHandler",focusTimout:"$mouseHandler",tooltipFollowsMouse:"$mouseHandler",firstLineNumber:"session",overwrite:"session",newLineMode:"session",useWorker:"session",useSoftTabs:"session",tabSize:"session",wrap:"session",indentedSoftWrap:"session",foldStyle:"session",mode:"session"}),t.Editor=b}),ace.define("ace/undomanager",["require","exports","module"],function(e,t,n){"use strict";var r=function(){this.reset()};(function(){function e(e){return{action:e.action,start:e.start,end:e.end,lines:e.lines.length==1?null:e.lines,text:e.lines.length==1?e.lines[0]:null}}function t(e){return{action:e.action,start:e.start,end:e.end,lines:e.lines||[e.text]}}function n(e,t){var n=new Array(e.length);for(var r=0;r0},this.hasRedo=function(){return this.$redoStack.length>0},this.markClean=function(){this.dirtyCounter=0},this.isClean=function(){return this.dirtyCounter===0},this.$serializeDeltas=function(t){return n(t,e)},this.$deserializeDeltas=function(e){return n(e,t)}}).call(r.prototype),t.UndoManager=r}),ace.define("ace/layer/gutter",["require","exports","module","ace/lib/dom","ace/lib/oop","ace/lib/lang","ace/lib/event_emitter"],function(e,t,n){"use strict";var r=e("../lib/dom"),i=e("../lib/oop"),s=e("../lib/lang"),o=e("../lib/event_emitter").EventEmitter,u=function(e){this.element=r.createElement("div"),this.element.className="ace_layer ace_gutter-layer",e.appendChild(this.element),this.setShowFoldWidgets(this.$showFoldWidgets),this.gutterWidth=0,this.$annotations=[],this.$updateAnnotations=this.$updateAnnotations.bind(this),this.$cells=[]};(function(){i.implement(this,o),this.setSession=function(e){this.session&&this.session.removeEventListener("change",this.$updateAnnotations),this.session=e,e&&e.on("change",this.$updateAnnotations)},this.addGutterDecoration=function(e,t){window.console&&console.warn&&console.warn("deprecated use session.addGutterDecoration"),this.session.addGutterDecoration(e,t)},this.removeGutterDecoration=function(e,t){window.console&&console.warn&&console.warn("deprecated use session.removeGutterDecoration"),this.session.removeGutterDecoration(e,t)},this.setAnnotations=function(e){this.$annotations=[];for(var t=0;to&&(v=s.end.row+1,s=t.getNextFoldLine(v,s),o=s?s.start.row:Infinity);if(v>i){while(this.$cells.length>d+1)p=this.$cells.pop(),this.element.removeChild(p.element);break}p=this.$cells[++d],p||(p={element:null,textNode:null,foldWidget:null},p.element=r.createElement("div"),p.textNode=document.createTextNode(""),p.element.appendChild(p.textNode),this.element.appendChild(p.element),this.$cells[d]=p);var m="ace_gutter-cell ";a[v]&&(m+=a[v]),f[v]&&(m+=f[v]),this.$annotations[v]&&(m+=this.$annotations[v].className),p.element.className!=m&&(p.element.className=m);var g=t.getRowLength(v)*e.lineHeight+"px";g!=p.element.style.height&&(p.element.style.height=g);if(u){var y=u[v];y==null&&(y=u[v]=t.getFoldWidget(v))}if(y){p.foldWidget||(p.foldWidget=r.createElement("span"),p.element.appendChild(p.foldWidget));var m="ace_fold-widget ace_"+y;y=="start"&&v==o&&vn.right-t.right)return"foldWidgets"}}).call(u.prototype),t.Gutter=u}),ace.define("ace/layer/marker",["require","exports","module","ace/range","ace/lib/dom"],function(e,t,n){"use strict";var r=e("../range").Range,i=e("../lib/dom"),s=function(e){this.element=i.createElement("div"),this.element.className="ace_layer ace_marker-layer",e.appendChild(this.element)};(function(){function e(e,t,n,r){return(e?1:0)|(t?2:0)|(n?4:0)|(r?8:0)}this.$padding=0,this.setPadding=function(e){this.$padding=e},this.setSession=function(e){this.session=e},this.setMarkers=function(e){this.markers=e},this.update=function(e){if(!e)return;this.config=e;var t=[];for(var n in this.markers){var r=this.markers[n];if(!r.range){r.update(t,this,this.session,e);continue}var i=r.range.clipRows(e.firstRow,e.lastRow);if(i.isEmpty())continue;i=i.toScreenRange(this.session);if(r.renderer){var s=this.$getTop(i.start.row,e),o=this.$padding+i.start.column*e.characterWidth;r.renderer(t,i,o,s,e)}else r.type=="fullLine"?this.drawFullLineMarker(t,i,r.clazz,e):r.type=="screenLine"?this.drawScreenLineMarker(t,i,r.clazz,e):i.isMultiLine()?r.type=="text"?this.drawTextMarker(t,i,r.clazz,e):this.drawMultiLineMarker(t,i,r.clazz,e):this.drawSingleLineMarker(t,i,r.clazz+" ace_start"+" ace_br15",e)}this.element.innerHTML=t.join("")},this.$getTop=function(e,t){return(e-t.firstRowScreen)*t.lineHeight},this.drawTextMarker=function(t,n,i,s,o){var u=this.session,a=n.start.row,f=n.end.row,l=a,c=0,h=0,p=u.getScreenLastRowColumn(l),d=new r(l,n.start.column,l,h);for(;l<=f;l++)d.start.row=d.end.row=l,d.start.column=l==a?n.start.column:u.getRowWrapIndent(l),d.end.column=p,c=h,h=p,p=l+1p,l==f),s,l==f?0:1,o)},this.drawMultiLineMarker=function(e,t,n,r,i){var s=this.$padding,o=r.lineHeight,u=this.$getTop(t.start.row,r),a=s+t.start.column*r.characterWidth;i=i||"",e.push("
"),u=this.$getTop(t.end.row,r);var f=t.end.column*r.characterWidth;e.push("
"),o=(t.end.row-t.start.row-1)*r.lineHeight;if(o<=0)return;u=this.$getTop(t.start.row+1,r);var l=(t.start.column?1:0)|(t.end.column?0:8);e.push("
")},this.drawSingleLineMarker=function(e,t,n,r,i,s){var o=r.lineHeight,u=(t.end.column+(i||0)-t.start.column)*r.characterWidth,a=this.$getTop(t.start.row,r),f=this.$padding+t.start.column*r.characterWidth;e.push("
")},this.drawFullLineMarker=function(e,t,n,r,i){var s=this.$getTop(t.start.row,r),o=r.lineHeight;t.start.row!=t.end.row&&(o+=this.$getTop(t.end.row,r)-s),e.push("
")},this.drawScreenLineMarker=function(e,t,n,r,i){var s=this.$getTop(t.start.row,r),o=r.lineHeight;e.push("
")}}).call(s.prototype),t.Marker=s}),ace.define("ace/layer/text",["require","exports","module","ace/lib/oop","ace/lib/dom","ace/lib/lang","ace/lib/useragent","ace/lib/event_emitter"],function(e,t,n){"use strict";var r=e("../lib/oop"),i=e("../lib/dom"),s=e("../lib/lang"),o=e("../lib/useragent"),u=e("../lib/event_emitter").EventEmitter,a=function(e){this.element=i.createElement("div"),this.element.className="ace_layer ace_text-layer",e.appendChild(this.element),this.$updateEolChar=this.$updateEolChar.bind(this)};(function(){r.implement(this,u),this.EOF_CHAR="\u00b6",this.EOL_CHAR_LF="\u00ac",this.EOL_CHAR_CRLF="\u00a4",this.EOL_CHAR=this.EOL_CHAR_LF,this.TAB_CHAR="\u2014",this.SPACE_CHAR="\u00b7",this.$padding=0,this.$updateEolChar=function(){var e=this.session.doc.getNewLineCharacter()=="\n"?this.EOL_CHAR_LF:this.EOL_CHAR_CRLF;if(this.EOL_CHAR!=e)return this.EOL_CHAR=e,!0},this.setPadding=function(e){this.$padding=e,this.element.style.padding="0 "+e+"px"},this.getLineHeight=function(){return this.$fontMetrics.$characterSize.height||0},this.getCharacterWidth=function(){return this.$fontMetrics.$characterSize.width||0},this.$setFontMetrics=function(e){this.$fontMetrics=e,this.$fontMetrics.on("changeCharacterSize",function(e){this._signal("changeCharacterSize",e)}.bind(this)),this.$pollSizeChanges()},this.checkForSizeChanges=function(){this.$fontMetrics.checkForSizeChanges()},this.$pollSizeChanges=function(){return this.$pollSizeChangesTimer=this.$fontMetrics.$pollSizeChanges()},this.setSession=function(e){this.session=e,e&&this.$computeTabString()},this.showInvisibles=!1,this.setShowInvisibles=function(e){return this.showInvisibles==e?!1:(this.showInvisibles=e,this.$computeTabString(),!0)},this.displayIndentGuides=!0,this.setDisplayIndentGuides=function(e){return this.displayIndentGuides==e?!1:(this.displayIndentGuides=e,this.$computeTabString(),!0)},this.$tabStrings=[],this.onChangeTabSize=this.$computeTabString=function(){var e=this.session.getTabSize();this.tabSize=e;var t=this.$tabStrings=[0];for(var n=1;n"+s.stringRepeat(this.TAB_CHAR,n)+""):t.push(s.stringRepeat(" ",n));if(this.displayIndentGuides){this.$indentGuideRe=/\s\S| \t|\t |\s$/;var r="ace_indent-guide",i="",o="";if(this.showInvisibles){r+=" ace_invisible",i=" ace_invisible_space",o=" ace_invisible_tab";var u=s.stringRepeat(this.SPACE_CHAR,this.tabSize),a=s.stringRepeat(this.TAB_CHAR,this.tabSize)}else var u=s.stringRepeat(" ",this.tabSize),a=u;this.$tabStrings[" "]=""+u+"",this.$tabStrings[" "]=""+a+""}},this.updateLines=function(e,t,n){(this.config.lastRow!=e.lastRow||this.config.firstRow!=e.firstRow)&&this.scrollLines(e),this.config=e;var r=Math.max(t,e.firstRow),i=Math.min(n,e.lastRow),s=this.element.childNodes,o=0;for(var u=e.firstRow;uf&&(u=a.end.row+1,a=this.session.getNextFoldLine(u,a),f=a?a.start.row:Infinity);if(u>i)break;var l=s[o++];if(l){var c=[];this.$renderLine(c,u,!this.$useLineGroups(),u==f?a:!1),l.style.height=e.lineHeight*this.session.getRowLength(u)+"px",l.innerHTML=c.join("")}u++}},this.scrollLines=function(e){var t=this.config;this.config=e;if(!t||t.lastRow0;r--)n.removeChild(n.firstChild);if(t.lastRow>e.lastRow)for(var r=this.session.getFoldedRowCount(e.lastRow+1,t.lastRow);r>0;r--)n.removeChild(n.lastChild);if(e.firstRowt.lastRow){var i=this.$renderLinesFragment(e,t.lastRow+1,e.lastRow);n.appendChild(i)}},this.$renderLinesFragment=function(e,t,n){var r=this.element.ownerDocument.createDocumentFragment(),s=t,o=this.session.getNextFoldLine(s),u=o?o.start.row:Infinity;for(;;){s>u&&(s=o.end.row+1,o=this.session.getNextFoldLine(s,o),u=o?o.start.row:Infinity);if(s>n)break;var a=i.createElement("div"),f=[];this.$renderLine(f,s,!1,s==u?o:!1),a.innerHTML=f.join("");if(this.$useLineGroups())a.className="ace_line_group",r.appendChild(a),a.style.height=e.lineHeight*this.session.getRowLength(s)+"px";else while(a.firstChild)r.appendChild(a.firstChild);s++}return r},this.update=function(e){this.config=e;var t=[],n=e.firstRow,r=e.lastRow,i=n,s=this.session.getNextFoldLine(i),o=s?s.start.row:Infinity;for(;;){i>o&&(i=s.end.row+1,s=this.session.getNextFoldLine(i,s),o=s?s.start.row:Infinity);if(i>r)break;this.$useLineGroups()&&t.push("
"),this.$renderLine(t,i,!1,i==o?s:!1),this.$useLineGroups()&&t.push("
"),i++}this.element.innerHTML=t.join("")},this.$textToken={text:!0,rparen:!0,lparen:!0},this.$renderToken=function(e,t,n,r){var i=this,o=/\t|&|<|>|( +)|([\x00-\x1f\x80-\xa0\xad\u1680\u180E\u2000-\u200f\u2028\u2029\u202F\u205F\u3000\uFEFF\uFFF9-\uFFFC])|[\u1100-\u115F\u11A3-\u11A7\u11FA-\u11FF\u2329-\u232A\u2E80-\u2E99\u2E9B-\u2EF3\u2F00-\u2FD5\u2FF0-\u2FFB\u3000-\u303E\u3041-\u3096\u3099-\u30FF\u3105-\u312D\u3131-\u318E\u3190-\u31BA\u31C0-\u31E3\u31F0-\u321E\u3220-\u3247\u3250-\u32FE\u3300-\u4DBF\u4E00-\uA48C\uA490-\uA4C6\uA960-\uA97C\uAC00-\uD7A3\uD7B0-\uD7C6\uD7CB-\uD7FB\uF900-\uFAFF\uFE10-\uFE19\uFE30-\uFE52\uFE54-\uFE66\uFE68-\uFE6B\uFF01-\uFF60\uFFE0-\uFFE6]/g,u=function(e,n,r,o,u){if(n)return i.showInvisibles?""+s.stringRepeat(i.SPACE_CHAR,e.length)+"":e;if(e=="&")return"&";if(e=="<")return"<";if(e==">")return">";if(e==" "){var a=i.session.getScreenTabSize(t+o);return t+=a-1,i.$tabStrings[a]}if(e=="\u3000"){var f=i.showInvisibles?"ace_cjk ace_invisible ace_invisible_space":"ace_cjk",l=i.showInvisibles?i.SPACE_CHAR:"";return t+=1,""+l+""}return r?""+i.SPACE_CHAR+"":(t+=1,""+e+"")},a=r.replace(o,u);if(!this.$textToken[n.type]){var f="ace_"+n.type.replace(/\./g," ace_"),l="";n.type=="fold"&&(l=" style='width:"+n.value.length*this.config.characterWidth+"px;' "),e.push("",a,"")}else e.push(a);return t+r.length},this.renderIndentGuide=function(e,t,n){var r=t.search(this.$indentGuideRe);return r<=0||r>=n?t:t[0]==" "?(r-=r%this.tabSize,e.push(s.stringRepeat(this.$tabStrings[" "],r/this.tabSize)),t.substr(r)):t[0]==" "?(e.push(s.stringRepeat(this.$tabStrings[" "],r)),t.substr(r)):t},this.$renderWrappedLine=function(e,t,n,r){var i=0,o=0,u=n[0],a=0;for(var f=0;f=u)a=this.$renderToken(e,a,l,c.substring(0,u-i)),c=c.substring(u-i),i=u,r||e.push("
","
"),e.push(s.stringRepeat("\u00a0",n.indent)),o++,a=0,u=n[o]||Number.MAX_VALUE;c.length!=0&&(i+=c.length,a=this.$renderToken(e,a,l,c))}}},this.$renderSimpleLine=function(e,t){var n=0,r=t[0],i=r.value;this.displayIndentGuides&&(i=this.renderIndentGuide(e,i)),i&&(n=this.$renderToken(e,n,r,i));for(var s=1;s");if(i.length){var s=this.session.getRowSplitData(t);s&&s.length?this.$renderWrappedLine(e,i,s,n):this.$renderSimpleLine(e,i)}this.showInvisibles&&(r&&(t=r.end.row),e.push("",t==this.session.getLength()-1?this.EOF_CHAR:this.EOL_CHAR,"")),n||e.push("
")},this.$getFoldLineTokens=function(e,t){function i(e,t,n){var i=0,s=0;while(s+e[i].value.lengthn-t&&(o=o.substring(0,n-t)),r.push({type:e[i].type,value:o}),s=t+o.length,i+=1}while(sn?r.push({type:e[i].type,value:o.substring(0,n-s)}):r.push(e[i]),s+=o.length,i+=1}}var n=this.session,r=[],s=n.getTokens(e);return t.walk(function(e,t,o,u,a){e!=null?r.push({type:"fold",value:e}):(a&&(s=n.getTokens(t)),s.length&&i(s,u,o))},t.end.row,this.session.getLine(t.end.row).length),r},this.$useLineGroups=function(){return this.session.getUseWrapMode()},this.destroy=function(){clearInterval(this.$pollSizeChangesTimer),this.$measureNode&&this.$measureNode.parentNode.removeChild(this.$measureNode),delete this.$measureNode}}).call(a.prototype),t.Text=a}),ace.define("ace/layer/cursor",["require","exports","module","ace/lib/dom"],function(e,t,n){"use strict";var r=e("../lib/dom"),i,s=function(e){this.element=r.createElement("div"),this.element.className="ace_layer ace_cursor-layer",e.appendChild(this.element),i===undefined&&(i=!("opacity"in this.element.style)),this.isVisible=!1,this.isBlinking=!0,this.blinkInterval=1e3,this.smoothBlinking=!1,this.cursors=[],this.cursor=this.addCursor(),r.addCssClass(this.element,"ace_hidden-cursors"),this.$updateCursors=(i?this.$updateVisibility:this.$updateOpacity).bind(this)};(function(){this.$updateVisibility=function(e){var t=this.cursors;for(var n=t.length;n--;)t[n].style.visibility=e?"":"hidden"},this.$updateOpacity=function(e){var t=this.cursors;for(var n=t.length;n--;)t[n].style.opacity=e?"":"0"},this.$padding=0,this.setPadding=function(e){this.$padding=e},this.setSession=function(e){this.session=e},this.setBlinking=function(e){e!=this.isBlinking&&(this.isBlinking=e,this.restartTimer())},this.setBlinkInterval=function(e){e!=this.blinkInterval&&(this.blinkInterval=e,this.restartTimer())},this.setSmoothBlinking=function(e){e!=this.smoothBlinking&&!i&&(this.smoothBlinking=e,r.setCssClass(this.element,"ace_smooth-blinking",e),this.$updateCursors(!0),this.$updateCursors=this.$updateOpacity.bind(this),this.restartTimer())},this.addCursor=function(){var e=r.createElement("div");return e.className="ace_cursor",this.element.appendChild(e),this.cursors.push(e),e},this.removeCursor=function(){if(this.cursors.length>1){var e=this.cursors.pop();return e.parentNode.removeChild(e),e}},this.hideCursor=function(){this.isVisible=!1,r.addCssClass(this.element,"ace_hidden-cursors"),this.restartTimer()},this.showCursor=function(){this.isVisible=!0,r.removeCssClass(this.element,"ace_hidden-cursors"),this.restartTimer()},this.restartTimer=function(){var e=this.$updateCursors;clearInterval(this.intervalId),clearTimeout(this.timeoutId),this.smoothBlinking&&r.removeCssClass(this.element,"ace_smooth-blinking"),e(!0);if(!this.isBlinking||!this.blinkInterval||!this.isVisible)return;this.smoothBlinking&&setTimeout(function(){r.addCssClass(this.element,"ace_smooth-blinking")}.bind(this));var t=function(){this.timeoutId=setTimeout(function(){e(!1)},.6*this.blinkInterval)}.bind(this);this.intervalId=setInterval(function(){e(!0),t()},this.blinkInterval),t()},this.getPixelPosition=function(e,t){if(!this.config||!this.session)return{left:0,top:0};e||(e=this.session.selection.getCursor());var n=this.session.documentToScreenPosition(e),r=this.$padding+n.column*this.config.characterWidth,i=(n.row-(t?this.config.firstRowScreen:0))*this.config.lineHeight;return{left:r,top:i}},this.update=function(e){this.config=e;var t=this.session.$selectionMarkers,n=0,r=0;if(t===undefined||t.length===0)t=[{cursor:null}];for(var n=0,i=t.length;ne.height+e.offset||s.top<0)&&n>1)continue;var o=(this.cursors[r++]||this.addCursor()).style;this.drawCursor?this.drawCursor(o,s,e,t[n],this.session):(o.left=s.left+"px",o.top=s.top+"px",o.width=e.characterWidth+"px",o.height=e.lineHeight+"px")}while(this.cursors.length>r)this.removeCursor();var u=this.session.getOverwrite();this.$setOverwrite(u),this.$pixelPos=s,this.restartTimer()},this.drawCursor=null,this.$setOverwrite=function(e){e!=this.overwrite&&(this.overwrite=e,e?r.addCssClass(this.element,"ace_overwrite-cursors"):r.removeCssClass(this.element,"ace_overwrite-cursors"))},this.destroy=function(){clearInterval(this.intervalId),clearTimeout(this.timeoutId)}}).call(s.prototype),t.Cursor=s}),ace.define("ace/scrollbar",["require","exports","module","ace/lib/oop","ace/lib/dom","ace/lib/event","ace/lib/event_emitter"],function(e,t,n){"use strict";var r=e("./lib/oop"),i=e("./lib/dom"),s=e("./lib/event"),o=e("./lib/event_emitter").EventEmitter,u=32768,a=function(e){this.element=i.createElement("div"),this.element.className="ace_scrollbar ace_scrollbar"+this.classSuffix,this.inner=i.createElement("div"),this.inner.className="ace_scrollbar-inner",this.element.appendChild(this.inner),e.appendChild(this.element),this.setVisible(!1),this.skipEvent=!1,s.addListener(this.element,"scroll",this.onScroll.bind(this)),s.addListener(this.element,"mousedown",s.preventDefault)};(function(){r.implement(this,o),this.setVisible=function(e){this.element.style.display=e?"":"none",this.isVisible=e,this.coeff=1}}).call(a.prototype);var f=function(e,t){a.call(this,e),this.scrollTop=0,this.scrollHeight=0,t.$scrollbarWidth=this.width=i.scrollbarWidth(e.ownerDocument),this.inner.style.width=this.element.style.width=(this.width||15)+5+"px",this.$minWidth=0};r.inherits(f,a),function(){this.classSuffix="-v",this.onScroll=function(){if(!this.skipEvent){this.scrollTop=this.element.scrollTop;if(this.coeff!=1){var e=this.element.clientHeight/this.scrollHeight;this.scrollTop=this.scrollTop*(1-e)/(this.coeff-e)}this._emit("scroll",{data:this.scrollTop})}this.skipEvent=!1},this.getWidth=function(){return Math.max(this.isVisible?this.width:0,this.$minWidth||0)},this.setHeight=function(e){this.element.style.height=e+"px"},this.setInnerHeight=this.setScrollHeight=function(e){this.scrollHeight=e,e>u?(this.coeff=u/e,e=u):this.coeff!=1&&(this.coeff=1),this.inner.style.height=e+"px"},this.setScrollTop=function(e){this.scrollTop!=e&&(this.skipEvent=!0,this.scrollTop=e,this.element.scrollTop=e*this.coeff)}}.call(f.prototype);var l=function(e,t){a.call(this,e),this.scrollLeft=0,this.height=t.$scrollbarWidth,this.inner.style.height=this.element.style.height=(this.height||15)+5+"px"};r.inherits(l,a),function(){this.classSuffix="-h",this.onScroll=function(){this.skipEvent||(this.scrollLeft=this.element.scrollLeft,this._emit("scroll",{data:this.scrollLeft})),this.skipEvent=!1},this.getHeight=function(){return this.isVisible?this.height:0},this.setWidth=function(e){this.element.style.width=e+"px"},this.setInnerWidth=function(e){this.inner.style.width=e+"px"},this.setScrollWidth=function(e){this.inner.style.width=e+"px"},this.setScrollLeft=function(e){this.scrollLeft!=e&&(this.skipEvent=!0,this.scrollLeft=this.element.scrollLeft=e)}}.call(l.prototype),t.ScrollBar=f,t.ScrollBarV=f,t.ScrollBarH=l,t.VScrollBar=f,t.HScrollBar=l}),ace.define("ace/renderloop",["require","exports","module","ace/lib/event"],function(e,t,n){"use strict";var r=e("./lib/event"),i=function(e,t){this.onRender=e,this.pending=!1,this.changes=0,this.window=t||window};(function(){this.schedule=function(e){this.changes=this.changes|e;if(!this.pending&&this.changes){this.pending=!0;var t=this;r.nextFrame(function(){t.pending=!1;var e;while(e=t.changes)t.changes=0,t.onRender(e)},this.window)}}}).call(i.prototype),t.RenderLoop=i}),ace.define("ace/layer/font_metrics",["require","exports","module","ace/lib/oop","ace/lib/dom","ace/lib/lang","ace/lib/useragent","ace/lib/event_emitter"],function(e,t,n){var r=e("../lib/oop"),i=e("../lib/dom"),s=e("../lib/lang"),o=e("../lib/useragent"),u=e("../lib/event_emitter").EventEmitter,a=0,f=t.FontMetrics=function(e){this.el=i.createElement("div"),this.$setMeasureNodeStyles(this.el.style,!0),this.$main=i.createElement("div"),this.$setMeasureNodeStyles(this.$main.style),this.$measureNode=i.createElement("div"),this.$setMeasureNodeStyles(this.$measureNode.style),this.el.appendChild(this.$main),this.el.appendChild(this.$measureNode),e.appendChild(this.el),a||this.$testFractionalRect(),this.$measureNode.innerHTML=s.stringRepeat("X",a),this.$characterSize={width:0,height:0},this.checkForSizeChanges()};(function(){r.implement(this,u),this.$characterSize={width:0,height:0},this.$testFractionalRect=function(){var e=i.createElement("div");this.$setMeasureNodeStyles(e.style),e.style.width="0.2px",document.documentElement.appendChild(e);var t=e.getBoundingClientRect().width;t>0&&t<1?a=50:a=100,e.parentNode.removeChild(e)},this.$setMeasureNodeStyles=function(e,t){e.width=e.height="auto",e.left=e.top="0px",e.visibility="hidden",e.position="absolute",e.whiteSpace="pre",o.isIE<8?e["font-family"]="inherit":e.font="inherit",e.overflow=t?"hidden":"visible"},this.checkForSizeChanges=function(){var e=this.$measureSizes();if(e&&(this.$characterSize.width!==e.width||this.$characterSize.height!==e.height)){this.$measureNode.style.fontWeight="bold";var t=this.$measureSizes();this.$measureNode.style.fontWeight="",this.$characterSize=e,this.charSizes=Object.create(null),this.allowBoldFonts=t&&t.width===e.width&&t.height===e.height,this._emit("changeCharacterSize",{data:e})}},this.$pollSizeChanges=function(){if(this.$pollSizeChangesTimer)return this.$pollSizeChangesTimer;var e=this;return this.$pollSizeChangesTimer=setInterval(function(){e.checkForSizeChanges()},500)},this.setPolling=function(e){e?this.$pollSizeChanges():this.$pollSizeChangesTimer&&(clearInterval(this.$pollSizeChangesTimer),this.$pollSizeChangesTimer=0)},this.$measureSizes=function(){if(a===50){var e=null;try{e=this.$measureNode.getBoundingClientRect()}catch(t){e={width:0,height:0}}var n={height:e.height,width:e.width/a}}else var n={height:this.$measureNode.clientHeight,width:this.$measureNode.clientWidth/a};return n.width===0||n.height===0?null:n},this.$measureCharWidth=function(e){this.$main.innerHTML=s.stringRepeat(e,a);var t=this.$main.getBoundingClientRect();return t.width/a},this.getCharacterWidth=function(e){var t=this.charSizes[e];return t===undefined&&(t=this.charSizes[e]=this.$measureCharWidth(e)/this.$characterSize.width),t},this.destroy=function(){clearInterval(this.$pollSizeChangesTimer),this.el&&this.el.parentNode&&this.el.parentNode.removeChild(this.el)}}).call(f.prototype)}),ace.define("ace/virtual_renderer",["require","exports","module","ace/lib/oop","ace/lib/dom","ace/config","ace/lib/useragent","ace/layer/gutter","ace/layer/marker","ace/layer/text","ace/layer/cursor","ace/scrollbar","ace/scrollbar","ace/renderloop","ace/layer/font_metrics","ace/lib/event_emitter"],function(e,t,n){"use strict";var r=e("./lib/oop"),i=e("./lib/dom"),s=e("./config"),o=e("./lib/useragent"),u=e("./layer/gutter").Gutter,a=e("./layer/marker").Marker,f=e("./layer/text").Text,l=e("./layer/cursor").Cursor,c=e("./scrollbar").HScrollBar,h=e("./scrollbar").VScrollBar,p=e("./renderloop").RenderLoop,d=e("./layer/font_metrics").FontMetrics,v=e("./lib/event_emitter").EventEmitter,m='.ace_editor {position: relative;overflow: hidden;font: 12px/normal \'Monaco\', \'Menlo\', \'Ubuntu Mono\', \'Consolas\', \'source-code-pro\', monospace;direction: ltr;text-align: left;-webkit-tap-highlight-color: rgba(0, 0, 0, 0);}.ace_scroller {position: absolute;overflow: hidden;top: 0;bottom: 0;background-color: inherit;-ms-user-select: none;-moz-user-select: none;-webkit-user-select: none;user-select: none;cursor: text;}.ace_content {position: absolute;-moz-box-sizing: border-box;-webkit-box-sizing: border-box;box-sizing: border-box;min-width: 100%;}.ace_dragging .ace_scroller:before{position: absolute;top: 0;left: 0;right: 0;bottom: 0;content: \'\';background: rgba(250, 250, 250, 0.01);z-index: 1000;}.ace_dragging.ace_dark .ace_scroller:before{background: rgba(0, 0, 0, 0.01);}.ace_selecting, .ace_selecting * {cursor: text !important;}.ace_gutter {position: absolute;overflow : hidden;width: auto;top: 0;bottom: 0;left: 0;cursor: default;z-index: 4;-ms-user-select: none;-moz-user-select: none;-webkit-user-select: none;user-select: none;}.ace_gutter-active-line {position: absolute;left: 0;right: 0;}.ace_scroller.ace_scroll-left {box-shadow: 17px 0 16px -16px rgba(0, 0, 0, 0.4) inset;}.ace_gutter-cell {padding-left: 19px;padding-right: 6px;background-repeat: no-repeat;}.ace_gutter-cell.ace_error {background-image: url("data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAMAAAAoLQ9TAAABOFBMVEX/////////QRswFAb/Ui4wFAYwFAYwFAaWGAfDRymzOSH/PxswFAb/SiUwFAYwFAbUPRvjQiDllog5HhHdRybsTi3/Tyv9Tir+Syj/UC3////XurebMBIwFAb/RSHbPx/gUzfdwL3kzMivKBAwFAbbvbnhPx66NhowFAYwFAaZJg8wFAaxKBDZurf/RB6mMxb/SCMwFAYwFAbxQB3+RB4wFAb/Qhy4Oh+4QifbNRcwFAYwFAYwFAb/QRzdNhgwFAYwFAbav7v/Uy7oaE68MBK5LxLewr/r2NXewLswFAaxJw4wFAbkPRy2PyYwFAaxKhLm1tMwFAazPiQwFAaUGAb/QBrfOx3bvrv/VC/maE4wFAbRPBq6MRO8Qynew8Dp2tjfwb0wFAbx6eju5+by6uns4uH9/f36+vr/GkHjAAAAYnRSTlMAGt+64rnWu/bo8eAA4InH3+DwoN7j4eLi4xP99Nfg4+b+/u9B/eDs1MD1mO7+4PHg2MXa347g7vDizMLN4eG+Pv7i5evs/v79yu7S3/DV7/498Yv24eH+4ufQ3Ozu/v7+y13sRqwAAADLSURBVHjaZc/XDsFgGIBhtDrshlitmk2IrbHFqL2pvXf/+78DPokj7+Fz9qpU/9UXJIlhmPaTaQ6QPaz0mm+5gwkgovcV6GZzd5JtCQwgsxoHOvJO15kleRLAnMgHFIESUEPmawB9ngmelTtipwwfASilxOLyiV5UVUyVAfbG0cCPHig+GBkzAENHS0AstVF6bacZIOzgLmxsHbt2OecNgJC83JERmePUYq8ARGkJx6XtFsdddBQgZE2nPR6CICZhawjA4Fb/chv+399kfR+MMMDGOQAAAABJRU5ErkJggg==");background-repeat: no-repeat;background-position: 2px center;}.ace_gutter-cell.ace_warning {background-image: url("data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAMAAAAoLQ9TAAAAmVBMVEX///8AAAD///8AAAAAAABPSzb/5sAAAAB/blH/73z/ulkAAAAAAAD85pkAAAAAAAACAgP/vGz/rkDerGbGrV7/pkQICAf////e0IsAAAD/oED/qTvhrnUAAAD/yHD/njcAAADuv2r/nz//oTj/p064oGf/zHAAAAA9Nir/tFIAAAD/tlTiuWf/tkIAAACynXEAAAAAAAAtIRW7zBpBAAAAM3RSTlMAABR1m7RXO8Ln31Z36zT+neXe5OzooRDfn+TZ4p3h2hTf4t3k3ucyrN1K5+Xaks52Sfs9CXgrAAAAjklEQVR42o3PbQ+CIBQFYEwboPhSYgoYunIqqLn6/z8uYdH8Vmdnu9vz4WwXgN/xTPRD2+sgOcZjsge/whXZgUaYYvT8QnuJaUrjrHUQreGczuEafQCO/SJTufTbroWsPgsllVhq3wJEk2jUSzX3CUEDJC84707djRc5MTAQxoLgupWRwW6UB5fS++NV8AbOZgnsC7BpEAAAAABJRU5ErkJggg==");background-position: 2px center;}.ace_gutter-cell.ace_info {background-image: url("data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAAAAAA6mKC9AAAAGXRFWHRTb2Z0d2FyZQBBZG9iZSBJbWFnZVJlYWR5ccllPAAAAAJ0Uk5TAAB2k804AAAAPklEQVQY02NgIB68QuO3tiLznjAwpKTgNyDbMegwisCHZUETUZV0ZqOquBpXj2rtnpSJT1AEnnRmL2OgGgAAIKkRQap2htgAAAAASUVORK5CYII=");background-position: 2px center;}.ace_dark .ace_gutter-cell.ace_info {background-image: url("data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQBAMAAADt3eJSAAAAJFBMVEUAAAChoaGAgIAqKiq+vr6tra1ZWVmUlJSbm5s8PDxubm56enrdgzg3AAAAAXRSTlMAQObYZgAAAClJREFUeNpjYMAPdsMYHegyJZFQBlsUlMFVCWUYKkAZMxZAGdxlDMQBAG+TBP4B6RyJAAAAAElFTkSuQmCC");}.ace_scrollbar {position: absolute;right: 0;bottom: 0;z-index: 6;}.ace_scrollbar-inner {position: absolute;cursor: text;left: 0;top: 0;}.ace_scrollbar-v{overflow-x: hidden;overflow-y: scroll;top: 0;}.ace_scrollbar-h {overflow-x: scroll;overflow-y: hidden;left: 0;}.ace_print-margin {position: absolute;height: 100%;}.ace_text-input {position: absolute;z-index: 0;width: 0.5em;height: 1em;opacity: 0;background: transparent;-moz-appearance: none;appearance: none;border: none;resize: none;outline: none;overflow: hidden;font: inherit;padding: 0 1px;margin: 0 -1px;text-indent: -1em;-ms-user-select: text;-moz-user-select: text;-webkit-user-select: text;user-select: text;white-space: pre!important;}.ace_text-input.ace_composition {background: inherit;color: inherit;z-index: 1000;opacity: 1;text-indent: 0;}.ace_layer {z-index: 1;position: absolute;overflow: hidden;word-wrap: normal;white-space: pre;height: 100%;width: 100%;-moz-box-sizing: border-box;-webkit-box-sizing: border-box;box-sizing: border-box;pointer-events: none;}.ace_gutter-layer {position: relative;width: auto;text-align: right;pointer-events: auto;}.ace_text-layer {font: inherit !important;}.ace_cjk {display: inline-block;text-align: center;}.ace_cursor-layer {z-index: 4;}.ace_cursor {z-index: 4;position: absolute;-moz-box-sizing: border-box;-webkit-box-sizing: border-box;box-sizing: border-box;border-left: 2px solid;transform: translatez(0);}.ace_multiselect .ace_cursor {border-left-width: 1px;}.ace_slim-cursors .ace_cursor {border-left-width: 1px;}.ace_overwrite-cursors .ace_cursor {border-left-width: 0;border-bottom: 1px solid;}.ace_hidden-cursors .ace_cursor {opacity: 0.2;}.ace_smooth-blinking .ace_cursor {-webkit-transition: opacity 0.18s;transition: opacity 0.18s;}.ace_marker-layer .ace_step, .ace_marker-layer .ace_stack {position: absolute;z-index: 3;}.ace_marker-layer .ace_selection {position: absolute;z-index: 5;}.ace_marker-layer .ace_bracket {position: absolute;z-index: 6;}.ace_marker-layer .ace_active-line {position: absolute;z-index: 2;}.ace_marker-layer .ace_selected-word {position: absolute;z-index: 4;-moz-box-sizing: border-box;-webkit-box-sizing: border-box;box-sizing: border-box;}.ace_line .ace_fold {-moz-box-sizing: border-box;-webkit-box-sizing: border-box;box-sizing: border-box;display: inline-block;height: 11px;margin-top: -2px;vertical-align: middle;background-image:url("data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABEAAAAJCAYAAADU6McMAAAAGXRFWHRTb2Z0d2FyZQBBZG9iZSBJbWFnZVJlYWR5ccllPAAAAJpJREFUeNpi/P//PwOlgAXGYGRklAVSokD8GmjwY1wasKljQpYACtpCFeADcHVQfQyMQAwzwAZI3wJKvCLkfKBaMSClBlR7BOQikCFGQEErIH0VqkabiGCAqwUadAzZJRxQr/0gwiXIal8zQQPnNVTgJ1TdawL0T5gBIP1MUJNhBv2HKoQHHjqNrA4WO4zY0glyNKLT2KIfIMAAQsdgGiXvgnYAAAAASUVORK5CYII="),url("data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAEAAAA3CAYAAADNNiA5AAAAGXRFWHRTb2Z0d2FyZQBBZG9iZSBJbWFnZVJlYWR5ccllPAAAACJJREFUeNpi+P//fxgTAwPDBxDxD078RSX+YeEyDFMCIMAAI3INmXiwf2YAAAAASUVORK5CYII=");background-repeat: no-repeat, repeat-x;background-position: center center, top left;color: transparent;border: 1px solid black;border-radius: 2px;cursor: pointer;pointer-events: auto;}.ace_dark .ace_fold {}.ace_fold:hover{background-image:url("data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABEAAAAJCAYAAADU6McMAAAAGXRFWHRTb2Z0d2FyZQBBZG9iZSBJbWFnZVJlYWR5ccllPAAAAJpJREFUeNpi/P//PwOlgAXGYGRklAVSokD8GmjwY1wasKljQpYACtpCFeADcHVQfQyMQAwzwAZI3wJKvCLkfKBaMSClBlR7BOQikCFGQEErIH0VqkabiGCAqwUadAzZJRxQr/0gwiXIal8zQQPnNVTgJ1TdawL0T5gBIP1MUJNhBv2HKoQHHjqNrA4WO4zY0glyNKLT2KIfIMAAQsdgGiXvgnYAAAAASUVORK5CYII="),url("data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAEAAAA3CAYAAADNNiA5AAAAGXRFWHRTb2Z0d2FyZQBBZG9iZSBJbWFnZVJlYWR5ccllPAAAACBJREFUeNpi+P//fz4TAwPDZxDxD5X4i5fLMEwJgAADAEPVDbjNw87ZAAAAAElFTkSuQmCC");}.ace_tooltip {background-color: #FFF;background-image: -webkit-linear-gradient(top, transparent, rgba(0, 0, 0, 0.1));background-image: linear-gradient(to bottom, transparent, rgba(0, 0, 0, 0.1));border: 1px solid gray;border-radius: 1px;box-shadow: 0 1px 2px rgba(0, 0, 0, 0.3);color: black;max-width: 100%;padding: 3px 4px;position: fixed;z-index: 999999;-moz-box-sizing: border-box;-webkit-box-sizing: border-box;box-sizing: border-box;cursor: default;white-space: pre;word-wrap: break-word;line-height: normal;font-style: normal;font-weight: normal;letter-spacing: normal;pointer-events: none;}.ace_folding-enabled > .ace_gutter-cell {padding-right: 13px;}.ace_fold-widget {-moz-box-sizing: border-box;-webkit-box-sizing: border-box;box-sizing: border-box;margin: 0 -12px 0 1px;display: none;width: 11px;vertical-align: top;background-image: url("data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAUAAAAFCAYAAACNbyblAAAANElEQVR42mWKsQ0AMAzC8ixLlrzQjzmBiEjp0A6WwBCSPgKAXoLkqSot7nN3yMwR7pZ32NzpKkVoDBUxKAAAAABJRU5ErkJggg==");background-repeat: no-repeat;background-position: center;border-radius: 3px;border: 1px solid transparent;cursor: pointer;}.ace_folding-enabled .ace_fold-widget {display: inline-block; }.ace_fold-widget.ace_end {background-image: url("data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAUAAAAFCAYAAACNbyblAAAANElEQVR42m3HwQkAMAhD0YzsRchFKI7sAikeWkrxwScEB0nh5e7KTPWimZki4tYfVbX+MNl4pyZXejUO1QAAAABJRU5ErkJggg==");}.ace_fold-widget.ace_closed {background-image: url("data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAMAAAAGCAYAAAAG5SQMAAAAOUlEQVR42jXKwQkAMAgDwKwqKD4EwQ26sSOkVWjgIIHAzPiCgaqiqnJHZnKICBERHN194O5b9vbLuAVRL+l0YWnZAAAAAElFTkSuQmCCXA==");}.ace_fold-widget:hover {border: 1px solid rgba(0, 0, 0, 0.3);background-color: rgba(255, 255, 255, 0.2);box-shadow: 0 1px 1px rgba(255, 255, 255, 0.7);}.ace_fold-widget:active {border: 1px solid rgba(0, 0, 0, 0.4);background-color: rgba(0, 0, 0, 0.05);box-shadow: 0 1px 1px rgba(255, 255, 255, 0.8);}.ace_dark .ace_fold-widget {background-image: url("data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAUAAAAFCAYAAACNbyblAAAAHklEQVQIW2P4//8/AzoGEQ7oGCaLLAhWiSwB146BAQCSTPYocqT0AAAAAElFTkSuQmCC");}.ace_dark .ace_fold-widget.ace_end {background-image: url("data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAUAAAAFCAYAAACNbyblAAAAH0lEQVQIW2P4//8/AxQ7wNjIAjDMgC4AxjCVKBirIAAF0kz2rlhxpAAAAABJRU5ErkJggg==");}.ace_dark .ace_fold-widget.ace_closed {background-image: url("data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAMAAAAFCAYAAACAcVaiAAAAHElEQVQIW2P4//+/AxAzgDADlOOAznHAKgPWAwARji8UIDTfQQAAAABJRU5ErkJggg==");}.ace_dark .ace_fold-widget:hover {box-shadow: 0 1px 1px rgba(255, 255, 255, 0.2);background-color: rgba(255, 255, 255, 0.1);}.ace_dark .ace_fold-widget:active {box-shadow: 0 1px 1px rgba(255, 255, 255, 0.2);}.ace_fold-widget.ace_invalid {background-color: #FFB4B4;border-color: #DE5555;}.ace_fade-fold-widgets .ace_fold-widget {-webkit-transition: opacity 0.4s ease 0.05s;transition: opacity 0.4s ease 0.05s;opacity: 0;}.ace_fade-fold-widgets:hover .ace_fold-widget {-webkit-transition: opacity 0.05s ease 0.05s;transition: opacity 0.05s ease 0.05s;opacity:1;}.ace_underline {text-decoration: underline;}.ace_bold {font-weight: bold;}.ace_nobold .ace_bold {font-weight: normal;}.ace_italic {font-style: italic;}.ace_error-marker {background-color: rgba(255, 0, 0,0.2);position: absolute;z-index: 9;}.ace_highlight-marker {background-color: rgba(255, 255, 0,0.2);position: absolute;z-index: 8;}.ace_br1 {border-top-left-radius : 3px;}.ace_br2 {border-top-right-radius : 3px;}.ace_br3 {border-top-left-radius : 3px; border-top-right-radius: 3px;}.ace_br4 {border-bottom-right-radius: 3px;}.ace_br5 {border-top-left-radius : 3px; border-bottom-right-radius: 3px;}.ace_br6 {border-top-right-radius : 3px; border-bottom-right-radius: 3px;}.ace_br7 {border-top-left-radius : 3px; border-top-right-radius: 3px; border-bottom-right-radius: 3px;}.ace_br8 {border-bottom-left-radius : 3px;}.ace_br9 {border-top-left-radius : 3px; border-bottom-left-radius: 3px;}.ace_br10{border-top-right-radius : 3px; border-bottom-left-radius: 3px;}.ace_br11{border-top-left-radius : 3px; border-top-right-radius: 3px; border-bottom-left-radius: 3px;}.ace_br12{border-bottom-right-radius: 3px; border-bottom-left-radius: 3px;}.ace_br13{border-top-left-radius : 3px; border-bottom-right-radius: 3px; border-bottom-left-radius: 3px;}.ace_br14{border-top-right-radius : 3px; border-bottom-right-radius: 3px; border-bottom-left-radius: 3px;}.ace_br15{border-top-left-radius : 3px; border-top-right-radius: 3px; border-bottom-right-radius: 3px; border-bottom-left-radius: 3px;}.ace_text-input-ios {position: absolute !important;top: -100000px !important;left: -100000px !important;}';i.importCssString(m,"ace_editor.css");var g=function(e,t){var n=this;this.container=e||i.createElement("div"),this.$keepTextAreaAtCursor=!o.isOldIE,i.addCssClass(this.container,"ace_editor"),this.setTheme(t),this.$gutter=i.createElement("div"),this.$gutter.className="ace_gutter",this.container.appendChild(this.$gutter),this.scroller=i.createElement("div"),this.scroller.className="ace_scroller",this.container.appendChild(this.scroller),this.content=i.createElement("div"),this.content.className="ace_content",this.scroller.appendChild(this.content),this.$gutterLayer=new u(this.$gutter),this.$gutterLayer.on("changeGutterWidth",this.onGutterResize.bind(this)),this.$markerBack=new a(this.content);var r=this.$textLayer=new f(this.content);this.canvas=r.element,this.$markerFront=new a(this.content),this.$cursorLayer=new l(this.content),this.$horizScroll=!1,this.$vScroll=!1,this.scrollBar=this.scrollBarV=new h(this.container,this),this.scrollBarH=new c(this.container,this),this.scrollBarV.addEventListener("scroll",function(e){n.$scrollAnimation||n.session.setScrollTop(e.data-n.scrollMargin.top)}),this.scrollBarH.addEventListener("scroll",function(e){n.$scrollAnimation||n.session.setScrollLeft(e.data-n.scrollMargin.left)}),this.scrollTop=0,this.scrollLeft=0,this.cursorPos={row:0,column:0},this.$fontMetrics=new d(this.container),this.$textLayer.$setFontMetrics(this.$fontMetrics),this.$textLayer.addEventListener("changeCharacterSize",function(e){n.updateCharacterSize(),n.onResize(!0,n.gutterWidth,n.$size.width,n.$size.height),n._signal("changeCharacterSize",e)}),this.$size={width:0,height:0,scrollerHeight:0,scrollerWidth:0,$dirty:!0},this.layerConfig={width:1,padding:0,firstRow:0,firstRowScreen:0,lastRow:0,lineHeight:0,characterWidth:0,minHeight:1,maxHeight:1,offset:0,height:1,gutterOffset:1},this.scrollMargin={left:0,right:0,top:0,bottom:0,v:0,h:0},this.$loop=new p(this.$renderChanges.bind(this),this.container.ownerDocument.defaultView),this.$loop.schedule(this.CHANGE_FULL),this.updateCharacterSize(),this.setPadding(4),s.resetOptions(this),s._emit("renderer",this)};(function(){this.CHANGE_CURSOR=1,this.CHANGE_MARKER=2,this.CHANGE_GUTTER=4,this.CHANGE_SCROLL=8,this.CHANGE_LINES=16,this.CHANGE_TEXT=32,this.CHANGE_SIZE=64,this.CHANGE_MARKER_BACK=128,this.CHANGE_MARKER_FRONT=256,this.CHANGE_FULL=512,this.CHANGE_H_SCROLL=1024,r.implement(this,v),this.updateCharacterSize=function(){this.$textLayer.allowBoldFonts!=this.$allowBoldFonts&&(this.$allowBoldFonts=this.$textLayer.allowBoldFonts,this.setStyle("ace_nobold",!this.$allowBoldFonts)),this.layerConfig.characterWidth=this.characterWidth=this.$textLayer.getCharacterWidth(),this.layerConfig.lineHeight=this.lineHeight=this.$textLayer.getLineHeight(),this.$updatePrintMargin()},this.setSession=function(e){this.session&&this.session.doc.off("changeNewLineMode",this.onChangeNewLineMode),this.session=e,e&&this.scrollMargin.top&&e.getScrollTop()<=0&&e.setScrollTop(-this.scrollMargin.top),this.$cursorLayer.setSession(e),this.$markerBack.setSession(e),this.$markerFront.setSession(e),this.$gutterLayer.setSession(e),this.$textLayer.setSession(e);if(!e)return;this.$loop.schedule(this.CHANGE_FULL),this.session.$setFontMetrics(this.$fontMetrics),this.scrollBarH.scrollLeft=this.scrollBarV.scrollTop=null,this.onChangeNewLineMode=this.onChangeNewLineMode.bind(this),this.onChangeNewLineMode(),this.session.doc.on("changeNewLineMode",this.onChangeNewLineMode)},this.updateLines=function(e,t,n){t===undefined&&(t=Infinity),this.$changedLines?(this.$changedLines.firstRow>e&&(this.$changedLines.firstRow=e),this.$changedLines.lastRowthis.layerConfig.lastRow)return;this.$loop.schedule(this.CHANGE_LINES)},this.onChangeNewLineMode=function(){this.$loop.schedule(this.CHANGE_TEXT),this.$textLayer.$updateEolChar()},this.onChangeTabSize=function(){this.$loop.schedule(this.CHANGE_TEXT|this.CHANGE_MARKER),this.$textLayer.onChangeTabSize()},this.updateText=function(){this.$loop.schedule(this.CHANGE_TEXT)},this.updateFull=function(e){e?this.$renderChanges(this.CHANGE_FULL,!0):this.$loop.schedule(this.CHANGE_FULL)},this.updateFontSize=function(){this.$textLayer.checkForSizeChanges()},this.$changes=0,this.$updateSizeAsync=function(){this.$loop.pending?this.$size.$dirty=!0:this.onResize()},this.onResize=function(e,t,n,r){if(this.resizing>2)return;this.resizing>0?this.resizing++:this.resizing=e?1:0;var i=this.container;r||(r=i.clientHeight||i.scrollHeight),n||(n=i.clientWidth||i.scrollWidth);var s=this.$updateCachedSize(e,t,n,r);if(!this.$size.scrollerHeight||!n&&!r)return this.resizing=0;e&&(this.$gutterLayer.$padding=null),e?this.$renderChanges(s|this.$changes,!0):this.$loop.schedule(s|this.$changes),this.resizing&&(this.resizing=0),this.scrollBarV.scrollLeft=this.scrollBarV.scrollTop=null},this.$updateCachedSize=function(e,t,n,r){r-=this.$extraHeight||0;var i=0,s=this.$size,o={width:s.width,height:s.height,scrollerHeight:s.scrollerHeight,scrollerWidth:s.scrollerWidth};r&&(e||s.height!=r)&&(s.height=r,i|=this.CHANGE_SIZE,s.scrollerHeight=s.height,this.$horizScroll&&(s.scrollerHeight-=this.scrollBarH.getHeight()),this.scrollBarV.element.style.bottom=this.scrollBarH.getHeight()+"px",i|=this.CHANGE_SCROLL);if(n&&(e||s.width!=n)){i|=this.CHANGE_SIZE,s.width=n,t==null&&(t=this.$showGutter?this.$gutter.offsetWidth:0),this.gutterWidth=t,this.scrollBarH.element.style.left=this.scroller.style.left=t+"px",s.scrollerWidth=Math.max(0,n-t-this.scrollBarV.getWidth()),this.scrollBarH.element.style.right=this.scroller.style.right=this.scrollBarV.getWidth()+"px",this.scroller.style.bottom=this.scrollBarH.getHeight()+"px";if(this.session&&this.session.getUseWrapMode()&&this.adjustWrapLimit()||e)i|=this.CHANGE_FULL}return s.$dirty=!n||!r,i&&this._signal("resize",o),i},this.onGutterResize=function(){var e=this.$showGutter?this.$gutter.offsetWidth:0;e!=this.gutterWidth&&(this.$changes|=this.$updateCachedSize(!0,e,this.$size.width,this.$size.height)),this.session.getUseWrapMode()&&this.adjustWrapLimit()?this.$loop.schedule(this.CHANGE_FULL):this.$size.$dirty?this.$loop.schedule(this.CHANGE_FULL):(this.$computeLayerConfig(),this.$loop.schedule(this.CHANGE_MARKER))},this.adjustWrapLimit=function(){var e=this.$size.scrollerWidth-this.$padding*2,t=Math.floor(e/this.characterWidth);return this.session.adjustWrapLimit(t,this.$showPrintMargin&&this.$printMarginColumn)},this.setAnimatedScroll=function(e){this.setOption("animatedScroll",e)},this.getAnimatedScroll=function(){return this.$animatedScroll},this.setShowInvisibles=function(e){this.setOption("showInvisibles",e)},this.getShowInvisibles=function(){return this.getOption("showInvisibles")},this.getDisplayIndentGuides=function(){return this.getOption("displayIndentGuides")},this.setDisplayIndentGuides=function(e){this.setOption("displayIndentGuides",e)},this.setShowPrintMargin=function(e){this.setOption("showPrintMargin",e)},this.getShowPrintMargin=function(){return this.getOption("showPrintMargin")},this.setPrintMarginColumn=function(e){this.setOption("printMarginColumn",e)},this.getPrintMarginColumn=function(){return this.getOption("printMarginColumn")},this.getShowGutter=function(){return this.getOption("showGutter")},this.setShowGutter=function(e){return this.setOption("showGutter",e)},this.getFadeFoldWidgets=function(){return this.getOption("fadeFoldWidgets")},this.setFadeFoldWidgets=function(e){this.setOption("fadeFoldWidgets",e)},this.setHighlightGutterLine=function(e){this.setOption("highlightGutterLine",e)},this.getHighlightGutterLine=function(){return this.getOption("highlightGutterLine")},this.$updateGutterLineHighlight=function(){var e=this.$cursorLayer.$pixelPos,t=this.layerConfig.lineHeight;if(this.session.getUseWrapMode()){var n=this.session.selection.getCursor();n.column=0,e=this.$cursorLayer.getPixelPosition(n,!0),t*=this.session.getRowLength(n.row)}this.$gutterLineHighlight.style.top=e.top-this.layerConfig.offset+"px",this.$gutterLineHighlight.style.height=t+"px"},this.$updatePrintMargin=function(){if(!this.$showPrintMargin&&!this.$printMarginEl)return;if(!this.$printMarginEl){var e=i.createElement("div");e.className="ace_layer ace_print-margin-layer",this.$printMarginEl=i.createElement("div"),this.$printMarginEl.className="ace_print-margin",e.appendChild(this.$printMarginEl),this.content.insertBefore(e,this.content.firstChild)}var t=this.$printMarginEl.style;t.left=this.characterWidth*this.$printMarginColumn+this.$padding+"px",t.visibility=this.$showPrintMargin?"visible":"hidden",this.session&&this.session.$wrap==-1&&this.adjustWrapLimit()},this.getContainerElement=function(){return this.container},this.getMouseEventTarget=function(){return this.scroller},this.getTextAreaContainer=function(){return this.container},this.$moveTextAreaToCursor=function(){if(!this.$keepTextAreaAtCursor)return;var e=this.layerConfig,t=this.$cursorLayer.$pixelPos.top,n=this.$cursorLayer.$pixelPos.left;t-=e.offset;var r=this.textarea.style,i=this.lineHeight;if(t<0||t>e.height-i){r.top=r.left="0";return}var s=this.characterWidth;if(this.$composition){var o=this.textarea.value.replace(/^\x01+/,"");s*=this.session.$getStringScreenWidth(o)[0]+2,i+=2}n-=this.scrollLeft,n>this.$size.scrollerWidth-s&&(n=this.$size.scrollerWidth-s),n+=this.gutterWidth,r.height=i+"px",r.width=s+"px",r.left=Math.min(n,this.$size.scrollerWidth-s)+"px",r.top=Math.min(t,this.$size.height-i)+"px"},this.getFirstVisibleRow=function(){return this.layerConfig.firstRow},this.getFirstFullyVisibleRow=function(){return this.layerConfig.firstRow+(this.layerConfig.offset===0?0:1)},this.getLastFullyVisibleRow=function(){var e=this.layerConfig,t=e.lastRow,n=this.session.documentToScreenRow(t,0)*e.lineHeight;return n-this.session.getScrollTop()>e.height-e.lineHeight?t-1:t},this.getLastVisibleRow=function(){return this.layerConfig.lastRow},this.$padding=null,this.setPadding=function(e){this.$padding=e,this.$textLayer.setPadding(e),this.$cursorLayer.setPadding(e),this.$markerFront.setPadding(e),this.$markerBack.setPadding(e),this.$loop.schedule(this.CHANGE_FULL),this.$updatePrintMargin()},this.setScrollMargin=function(e,t,n,r){var i=this.scrollMargin;i.top=e|0,i.bottom=t|0,i.right=r|0,i.left=n|0,i.v=i.top+i.bottom,i.h=i.left+i.right,i.top&&this.scrollTop<=0&&this.session&&this.session.setScrollTop(-i.top),this.updateFull()},this.getHScrollBarAlwaysVisible=function(){return this.$hScrollBarAlwaysVisible},this.setHScrollBarAlwaysVisible=function(e){this.setOption("hScrollBarAlwaysVisible",e)},this.getVScrollBarAlwaysVisible=function(){return this.$vScrollBarAlwaysVisible},this.setVScrollBarAlwaysVisible=function(e){this.setOption("vScrollBarAlwaysVisible",e)},this.$updateScrollBarV=function(){var e=this.layerConfig.maxHeight,t=this.$size.scrollerHeight;!this.$maxLines&&this.$scrollPastEnd&&(e-=(t-this.lineHeight)*this.$scrollPastEnd,this.scrollTop>e-t&&(e=this.scrollTop+t,this.scrollBarV.scrollTop=null)),this.scrollBarV.setScrollHeight(e+this.scrollMargin.v),this.scrollBarV.setScrollTop(this.scrollTop+this.scrollMargin.top)},this.$updateScrollBarH=function(){this.scrollBarH.setScrollWidth(this.layerConfig.width+2*this.$padding+this.scrollMargin.h),this.scrollBarH.setScrollLeft(this.scrollLeft+this.scrollMargin.left)},this.$frozen=!1,this.freeze=function(){this.$frozen=!0},this.unfreeze=function(){this.$frozen=!1},this.$renderChanges=function(e,t){this.$changes&&(e|=this.$changes,this.$changes=0);if(!this.session||!this.container.offsetWidth||this.$frozen||!e&&!t){this.$changes|=e;return}if(this.$size.$dirty)return this.$changes|=e,this.onResize(!0);this.lineHeight||this.$textLayer.checkForSizeChanges(),this._signal("beforeRender");var n=this.layerConfig;if(e&this.CHANGE_FULL||e&this.CHANGE_SIZE||e&this.CHANGE_TEXT||e&this.CHANGE_LINES||e&this.CHANGE_SCROLL||e&this.CHANGE_H_SCROLL){e|=this.$computeLayerConfig();if(n.firstRow!=this.layerConfig.firstRow&&n.firstRowScreen==this.layerConfig.firstRowScreen){var r=this.scrollTop+(n.firstRow-this.layerConfig.firstRow)*this.lineHeight;r>0&&(this.scrollTop=r,e|=this.CHANGE_SCROLL,e|=this.$computeLayerConfig())}n=this.layerConfig,this.$updateScrollBarV(),e&this.CHANGE_H_SCROLL&&this.$updateScrollBarH(),this.$gutterLayer.element.style.marginTop=-n.offset+"px",this.content.style.marginTop=-n.offset+"px",this.content.style.width=n.width+2*this.$padding+"px",this.content.style.height=n.minHeight+"px"}e&this.CHANGE_H_SCROLL&&(this.content.style.marginLeft=-this.scrollLeft+"px",this.scroller.className=this.scrollLeft<=0?"ace_scroller":"ace_scroller ace_scroll-left");if(e&this.CHANGE_FULL){this.$textLayer.update(n),this.$showGutter&&this.$gutterLayer.update(n),this.$markerBack.update(n),this.$markerFront.update(n),this.$cursorLayer.update(n),this.$moveTextAreaToCursor(),this.$highlightGutterLine&&this.$updateGutterLineHighlight(),this._signal("afterRender");return}if(e&this.CHANGE_SCROLL){e&this.CHANGE_TEXT||e&this.CHANGE_LINES?this.$textLayer.update(n):this.$textLayer.scrollLines(n),this.$showGutter&&this.$gutterLayer.update(n),this.$markerBack.update(n),this.$markerFront.update(n),this.$cursorLayer.update(n),this.$highlightGutterLine&&this.$updateGutterLineHighlight(),this.$moveTextAreaToCursor(),this._signal("afterRender");return}e&this.CHANGE_TEXT?(this.$textLayer.update(n),this.$showGutter&&this.$gutterLayer.update(n)):e&this.CHANGE_LINES?(this.$updateLines()||e&this.CHANGE_GUTTER&&this.$showGutter)&&this.$gutterLayer.update(n):(e&this.CHANGE_TEXT||e&this.CHANGE_GUTTER)&&this.$showGutter&&this.$gutterLayer.update(n),e&this.CHANGE_CURSOR&&(this.$cursorLayer.update(n),this.$moveTextAreaToCursor(),this.$highlightGutterLine&&this.$updateGutterLineHighlight()),e&(this.CHANGE_MARKER|this.CHANGE_MARKER_FRONT)&&this.$markerFront.update(n),e&(this.CHANGE_MARKER|this.CHANGE_MARKER_BACK)&&this.$markerBack.update(n),this._signal("afterRender")},this.$autosize=function(){var e=this.session.getScreenLength()*this.lineHeight,t=this.$maxLines*this.lineHeight,n=Math.min(t,Math.max((this.$minLines||1)*this.lineHeight,e))+this.scrollMargin.v+(this.$extraHeight||0);this.$horizScroll&&(n+=this.scrollBarH.getHeight()),this.$maxPixelHeight&&n>this.$maxPixelHeight&&(n=this.$maxPixelHeight);var r=e>t;if(n!=this.desiredHeight||this.$size.height!=this.desiredHeight||r!=this.$vScroll){r!=this.$vScroll&&(this.$vScroll=r,this.scrollBarV.setVisible(r));var i=this.container.clientWidth;this.container.style.height=n+"px",this.$updateCachedSize(!0,this.$gutterWidth,i,n),this.desiredHeight=n,this._signal("autosize")}},this.$computeLayerConfig=function(){var e=this.session,t=this.$size,n=t.height<=2*this.lineHeight,r=this.session.getScreenLength(),i=r*this.lineHeight,s=this.$getLongestLine(),o=!n&&(this.$hScrollBarAlwaysVisible||t.scrollerWidth-s-2*this.$padding<0),u=this.$horizScroll!==o;u&&(this.$horizScroll=o,this.scrollBarH.setVisible(o));var a=this.$vScroll;this.$maxLines&&this.lineHeight>1&&this.$autosize();var f=this.scrollTop%this.lineHeight,l=t.scrollerHeight+this.lineHeight,c=!this.$maxLines&&this.$scrollPastEnd?(t.scrollerHeight-this.lineHeight)*this.$scrollPastEnd:0;i+=c;var h=this.scrollMargin;this.session.setScrollTop(Math.max(-h.top,Math.min(this.scrollTop,i-t.scrollerHeight+h.bottom))),this.session.setScrollLeft(Math.max(-h.left,Math.min(this.scrollLeft,s+2*this.$padding-t.scrollerWidth+h.right)));var p=!n&&(this.$vScrollBarAlwaysVisible||t.scrollerHeight-i+c<0||this.scrollTop>h.top),d=a!==p;d&&(this.$vScroll=p,this.scrollBarV.setVisible(p));var v=Math.ceil(l/this.lineHeight)-1,m=Math.max(0,Math.round((this.scrollTop-f)/this.lineHeight)),g=m+v,y,b,w=this.lineHeight;m=e.screenToDocumentRow(m,0);var E=e.getFoldLine(m);E&&(m=E.start.row),y=e.documentToScreenRow(m,0),b=e.getRowLength(m)*w,g=Math.min(e.screenToDocumentRow(g,0),e.getLength()-1),l=t.scrollerHeight+e.getRowLength(g)*w+b,f=this.scrollTop-y*w;var S=0;this.layerConfig.width!=s&&(S=this.CHANGE_H_SCROLL);if(u||d)S=this.$updateCachedSize(!0,this.gutterWidth,t.width,t.height),this._signal("scrollbarVisibilityChanged"),d&&(s=this.$getLongestLine());return this.layerConfig={width:s,padding:this.$padding,firstRow:m,firstRowScreen:y,lastRow:g,lineHeight:w,characterWidth:this.characterWidth,minHeight:l,maxHeight:i,offset:f,gutterOffset:w?Math.max(0,Math.ceil((f+t.height-t.scrollerHeight)/w)):0,height:this.$size.scrollerHeight},S},this.$updateLines=function(){if(!this.$changedLines)return;var e=this.$changedLines.firstRow,t=this.$changedLines.lastRow;this.$changedLines=null;var n=this.layerConfig;if(e>n.lastRow+1)return;if(ts?(t&&a+o>s+this.lineHeight&&(s-=t*this.$size.scrollerHeight),s===0&&(s=-this.scrollMargin.top),this.session.setScrollTop(s)):a+this.$size.scrollerHeight-ui?(i=1-this.scrollMargin.top)return!0;if(t>0&&this.session.getScrollTop()+this.$size.scrollerHeight-this.layerConfig.maxHeight<-1+this.scrollMargin.bottom)return!0;if(e<0&&this.session.getScrollLeft()>=1-this.scrollMargin.left)return!0;if(e>0&&this.session.getScrollLeft()+this.$size.scrollerWidth-this.layerConfig.width<-1+this.scrollMargin.right)return!0},this.pixelToScreenCoordinates=function(e,t){var n=this.scroller.getBoundingClientRect(),r=(e+this.scrollLeft-n.left-this.$padding)/this.characterWidth,i=Math.floor((t+this.scrollTop-n.top)/this.lineHeight),s=Math.round(r);return{row:i,column:s,side:r-s>0?1:-1}},this.screenToTextCoordinates=function(e,t){var n=this.scroller.getBoundingClientRect(),r=Math.round((e+this.scrollLeft-n.left-this.$padding)/this.characterWidth),i=(t+this.scrollTop-n.top)/this.lineHeight;return this.session.screenToDocumentPosition(i,Math.max(r,0))},this.textToScreenCoordinates=function(e,t){var n=this.scroller.getBoundingClientRect(),r=this.session.documentToScreenPosition(e,t),i=this.$padding+Math.round(r.column*this.characterWidth),s=r.row*this.lineHeight;return{pageX:n.left+i-this.scrollLeft,pageY:n.top+s-this.scrollTop}},this.visualizeFocus=function(){i.addCssClass(this.container,"ace_focus")},this.visualizeBlur=function(){i.removeCssClass(this.container,"ace_focus")},this.showComposition=function(e){this.$composition||(this.$composition={keepTextAreaAtCursor:this.$keepTextAreaAtCursor,cssText:this.textarea.style.cssText}),this.$keepTextAreaAtCursor=!0,i.addCssClass(this.textarea,"ace_composition"),this.textarea.style.cssText="",this.$moveTextAreaToCursor()},this.setCompositionText=function(e){this.$moveTextAreaToCursor()},this.hideComposition=function(){if(!this.$composition)return;i.removeCssClass(this.textarea,"ace_composition"),this.$keepTextAreaAtCursor=this.$composition.keepTextAreaAtCursor,this.textarea.style.cssText=this.$composition.cssText,this.$composition=null},this.setTheme=function(e,t){function o(r){if(n.$themeId!=e)return t&&t();if(!r||!r.cssClass)throw new Error("couldn't load module "+e+" or it didn't call define");i.importCssString(r.cssText,r.cssClass,n.container.ownerDocument),n.theme&&i.removeCssClass(n.container,n.theme.cssClass);var s="padding"in r?r.padding:"padding"in(n.theme||{})?4:n.$padding;n.$padding&&s!=n.$padding&&n.setPadding(s),n.$theme=r.cssClass,n.theme=r,i.addCssClass(n.container,r.cssClass),i.setCssClass(n.container,"ace_dark",r.isDark),n.$size&&(n.$size.width=0,n.$updateSizeAsync()),n._dispatchEvent("themeLoaded",{theme:r}),t&&t()}var n=this;this.$themeId=e,n._dispatchEvent("themeChange",{theme:e});if(!e||typeof e=="string"){var r=e||this.$options.theme.initialValue;s.loadModule(["theme",r],o)}else o(e)},this.getTheme=function(){return this.$themeId},this.setStyle=function(e,t){i.setCssClass(this.container,e,t!==!1)},this.unsetStyle=function(e){i.removeCssClass(this.container,e)},this.setCursorStyle=function(e){this.scroller.style.cursor!=e&&(this.scroller.style.cursor=e)},this.setMouseCursor=function(e){this.scroller.style.cursor=e},this.destroy=function(){this.$textLayer.destroy(),this.$cursorLayer.destroy()}}).call(g.prototype),s.defineOptions(g.prototype,"renderer",{animatedScroll:{initialValue:!1},showInvisibles:{set:function(e){this.$textLayer.setShowInvisibles(e)&&this.$loop.schedule(this.CHANGE_TEXT)},initialValue:!1},showPrintMargin:{set:function(){this.$updatePrintMargin()},initialValue:!0},printMarginColumn:{set:function(){this.$updatePrintMargin()},initialValue:80},printMargin:{set:function(e){typeof e=="number"&&(this.$printMarginColumn=e),this.$showPrintMargin=!!e,this.$updatePrintMargin()},get:function(){return this.$showPrintMargin&&this.$printMarginColumn}},showGutter:{set:function(e){this.$gutter.style.display=e?"block":"none",this.$loop.schedule(this.CHANGE_FULL),this.onGutterResize()},initialValue:!0},fadeFoldWidgets:{set:function(e){i.setCssClass(this.$gutter,"ace_fade-fold-widgets",e)},initialValue:!1},showFoldWidgets:{set:function(e){this.$gutterLayer.setShowFoldWidgets(e)},initialValue:!0},showLineNumbers:{set:function(e){this.$gutterLayer.setShowLineNumbers(e),this.$loop.schedule(this.CHANGE_GUTTER)},initialValue:!0},displayIndentGuides:{set:function(e){this.$textLayer.setDisplayIndentGuides(e)&&this.$loop.schedule(this.CHANGE_TEXT)},initialValue:!0},highlightGutterLine:{set:function(e){if(!this.$gutterLineHighlight){this.$gutterLineHighlight=i.createElement("div"),this.$gutterLineHighlight.className="ace_gutter-active-line",this.$gutter.appendChild(this.$gutterLineHighlight);return}this.$gutterLineHighlight.style.display=e?"":"none",this.$cursorLayer.$pixelPos&&this.$updateGutterLineHighlight()},initialValue:!1,value:!0},hScrollBarAlwaysVisible:{set:function(e){(!this.$hScrollBarAlwaysVisible||!this.$horizScroll)&&this.$loop.schedule(this.CHANGE_SCROLL)},initialValue:!1},vScrollBarAlwaysVisible:{set:function(e){(!this.$vScrollBarAlwaysVisible||!this.$vScroll)&&this.$loop.schedule(this.CHANGE_SCROLL)},initialValue:!1},fontSize:{set:function(e){typeof e=="number"&&(e+="px"),this.container.style.fontSize=e,this.updateFontSize()},initialValue:12},fontFamily:{set:function(e){this.container.style.fontFamily=e,this.updateFontSize()}},maxLines:{set:function(e){this.updateFull()}},minLines:{set:function(e){this.updateFull()}},maxPixelHeight:{set:function(e){this.updateFull()},initialValue:0},scrollPastEnd:{set:function(e){e=+e||0;if(this.$scrollPastEnd==e)return;this.$scrollPastEnd=e,this.$loop.schedule(this.CHANGE_SCROLL)},initialValue:0,handlesSet:!0},fixedWidthGutter:{set:function(e){this.$gutterLayer.$fixedWidth=!!e,this.$loop.schedule(this.CHANGE_GUTTER)}},theme:{set:function(e){this.setTheme(e)},get:function(){return this.$themeId||this.theme},initialValue:"./theme/textmate",handlesSet:!0}}),t.VirtualRenderer=g}),ace.define("ace/worker/worker_client",["require","exports","module","ace/lib/oop","ace/lib/net","ace/lib/event_emitter","ace/config"],function(e,t,n){"use strict";function u(e){var t="importScripts('"+i.qualifyURL(e)+"');";try{return new Blob([t],{type:"application/javascript"})}catch(n){var r=window.BlobBuilder||window.WebKitBlobBuilder||window.MozBlobBuilder,s=new r;return s.append(t),s.getBlob("application/javascript")}}function a(e){var t=u(e),n=window.URL||window.webkitURL,r=n.createObjectURL(t);return new Worker(r)}var r=e("../lib/oop"),i=e("../lib/net"),s=e("../lib/event_emitter").EventEmitter,o=e("../config"),f=function(t,n,r,i,s){this.$sendDeltaQueue=this.$sendDeltaQueue.bind(this),this.changeListener=this.changeListener.bind(this),this.onMessage=this.onMessage.bind(this),e.nameToUrl&&!e.toUrl&&(e.toUrl=e.nameToUrl);if(o.get("packaged")||!e.toUrl)i=i||o.moduleUrl(n,"worker");else{var u=this.$normalizePath;i=i||u(e.toUrl("ace/worker/worker.js",null,"_"));var f={};t.forEach(function(t){f[t]=u(e.toUrl(t,null,"_").replace(/(\.js)?(\?.*)?$/,""))})}this.$worker=a(i),s&&this.send("importScripts",s),this.$worker.postMessage({init:!0,tlns:f,module:n,classname:r}),this.callbackId=1,this.callbacks={},this.$worker.onmessage=this.onMessage};(function(){r.implement(this,s),this.onMessage=function(e){var t=e.data;switch(t.type){case"event":this._signal(t.name,{data:t.data});break;case"call":var n=this.callbacks[t.id];n&&(n(t.data),delete this.callbacks[t.id]);break;case"error":this.reportError(t.data);break;case"log":window.console&&console.log&&console.log.apply(console,t.data)}},this.reportError=function(e){window.console&&console.error&&console.error(e)},this.$normalizePath=function(e){return i.qualifyURL(e)},this.terminate=function(){this._signal("terminate",{}),this.deltaQueue=null,this.$worker.terminate(),this.$worker=null,this.$doc&&this.$doc.off("change",this.changeListener),this.$doc=null},this.send=function(e,t){this.$worker.postMessage({command:e,args:t})},this.call=function(e,t,n){if(n){var r=this.callbackId++;this.callbacks[r]=n,t.push(r)}this.send(e,t)},this.emit=function(e,t){try{this.$worker.postMessage({event:e,data:{data:t.data}})}catch(n){console.error(n.stack)}},this.attachToDocument=function(e){this.$doc&&this.terminate(),this.$doc=e,this.call("setValue",[e.getValue()]),e.on("change",this.changeListener)},this.changeListener=function(e){this.deltaQueue||(this.deltaQueue=[],setTimeout(this.$sendDeltaQueue,0)),e.action=="insert"?this.deltaQueue.push(e.start,e.lines):this.deltaQueue.push(e.start,e.end)},this.$sendDeltaQueue=function(){var e=this.deltaQueue;if(!e)return;this.deltaQueue=null,e.length>50&&e.length>this.$doc.getLength()>>1?this.call("setValue",[this.$doc.getValue()]):this.emit("change",{data:e})}}).call(f.prototype);var l=function(e,t,n){this.$sendDeltaQueue=this.$sendDeltaQueue.bind(this),this.changeListener=this.changeListener.bind(this),this.callbackId=1,this.callbacks={},this.messageBuffer=[];var r=null,i=!1,u=Object.create(s),a=this;this.$worker={},this.$worker.terminate=function(){},this.$worker.postMessage=function(e){a.messageBuffer.push(e),r&&(i?setTimeout(f):f())},this.setEmitSync=function(e){i=e};var f=function(){var e=a.messageBuffer.shift();e.command?r[e.command].apply(r,e.args):e.event&&u._signal(e.event,e.data)};u.postMessage=function(e){a.onMessage({data:e})},u.callback=function(e,t){this.postMessage({type:"call",id:t,data:e})},u.emit=function(e,t){this.postMessage({type:"event",name:e,data:t})},o.loadModule(["worker",t],function(e){r=new e[n](u);while(a.messageBuffer.length)f()})};l.prototype=f.prototype,t.UIWorkerClient=l,t.WorkerClient=f,t.createWorker=a}),ace.define("ace/placeholder",["require","exports","module","ace/range","ace/lib/event_emitter","ace/lib/oop"],function(e,t,n){"use strict";var r=e("./range").Range,i=e("./lib/event_emitter").EventEmitter,s=e("./lib/oop"),o=function(e,t,n,r,i,s){var o=this;this.length=t,this.session=e,this.doc=e.getDocument(),this.mainClass=i,this.othersClass=s,this.$onUpdate=this.onUpdate.bind(this),this.doc.on("change",this.$onUpdate),this.$others=r,this.$onCursorChange=function(){setTimeout(function(){o.onCursorChange()})},this.$pos=n;var u=e.getUndoManager().$undoStack||e.getUndoManager().$undostack||{length:-1};this.$undoStackDepth=u.length,this.setup(),e.selection.on("changeCursor",this.$onCursorChange)};(function(){s.implement(this,i),this.setup=function(){var e=this,t=this.doc,n=this.session;this.selectionBefore=n.selection.toJSON(),n.selection.inMultiSelectMode&&n.selection.toSingleRange(),this.pos=t.createAnchor(this.$pos.row,this.$pos.column);var i=this.pos;i.$insertRight=!0,i.detach(),i.markerId=n.addMarker(new r(i.row,i.column,i.row,i.column+this.length),this.mainClass,null,!1),this.others=[],this.$others.forEach(function(n){var r=t.createAnchor(n.row,n.column);r.$insertRight=!0,r.detach(),e.others.push(r)}),n.setUndoSelect(!1)},this.showOtherMarkers=function(){if(this.othersActive)return;var e=this.session,t=this;this.othersActive=!0,this.others.forEach(function(n){n.markerId=e.addMarker(new r(n.row,n.column,n.row,n.column+t.length),t.othersClass,null,!1)})},this.hideOtherMarkers=function(){if(!this.othersActive)return;this.othersActive=!1;for(var e=0;e=this.pos.column&&t.start.column<=this.pos.column+this.length+1,s=t.start.column-this.pos.column;this.updateAnchors(e),i&&(this.length+=n);if(i&&!this.session.$fromUndo)if(e.action==="insert")for(var o=this.others.length-1;o>=0;o--){var u=this.others[o],a={row:u.row,column:u.column+s};this.doc.insertMergedLines(a,e.lines)}else if(e.action==="remove")for(var o=this.others.length-1;o>=0;o--){var u=this.others[o],a={row:u.row,column:u.column+s};this.doc.remove(new r(a.row,a.column,a.row,a.column-n))}this.$updating=!1,this.updateMarkers()},this.updateAnchors=function(e){this.pos.onChange(e);for(var t=this.others.length;t--;)this.others[t].onChange(e);this.updateMarkers()},this.updateMarkers=function(){if(this.$updating)return;var e=this,t=this.session,n=function(n,i){t.removeMarker(n.markerId),n.markerId=t.addMarker(new r(n.row,n.column,n.row,n.column+e.length),i,null,!1)};n(this.pos,this.mainClass);for(var i=this.others.length;i--;)n(this.others[i],this.othersClass)},this.onCursorChange=function(e){if(this.$updating||!this.session)return;var t=this.session.selection.getCursor();t.row===this.pos.row&&t.column>=this.pos.column&&t.column<=this.pos.column+this.length?(this.showOtherMarkers(),this._emit("cursorEnter",e)):(this.hideOtherMarkers(),this._emit("cursorLeave",e))},this.detach=function(){this.session.removeMarker(this.pos&&this.pos.markerId),this.hideOtherMarkers(),this.doc.removeEventListener("change",this.$onUpdate),this.session.selection.removeEventListener("changeCursor",this.$onCursorChange),this.session.setUndoSelect(!0),this.session=null},this.cancel=function(){if(this.$undoStackDepth===-1)return;var e=this.session.getUndoManager(),t=(e.$undoStack||e.$undostack).length-this.$undoStackDepth;for(var n=0;n1&&!this.inMultiSelectMode&&(this._signal("multiSelect"),this.inMultiSelectMode=!0,this.session.$undoSelect=!1,this.rangeList.attach(this.session)),t||this.fromOrientedRange(e)},this.toSingleRange=function(e){e=e||this.ranges[0];var t=this.rangeList.removeAll();t.length&&this.$onRemoveRange(t),e&&this.fromOrientedRange(e)},this.substractPoint=function(e){var t=this.rangeList.substractPoint(e);if(t)return this.$onRemoveRange(t),t[0]},this.mergeOverlappingRanges=function(){var e=this.rangeList.merge();e.length?this.$onRemoveRange(e):this.ranges[0]&&this.fromOrientedRange(this.ranges[0])},this.$onAddRange=function(e){this.rangeCount=this.rangeList.ranges.length,this.ranges.unshift(e),this._signal("addRange",{range:e})},this.$onRemoveRange=function(e){this.rangeCount=this.rangeList.ranges.length;if(this.rangeCount==1&&this.inMultiSelectMode){var t=this.rangeList.ranges.pop();e.push(t),this.rangeCount=0}for(var n=e.length;n--;){var r=this.ranges.indexOf(e[n]);this.ranges.splice(r,1)}this._signal("removeRange",{ranges:e}),this.rangeCount===0&&this.inMultiSelectMode&&(this.inMultiSelectMode=!1,this._signal("singleSelect"),this.session.$undoSelect=!0,this.rangeList.detach(this.session)),t=t||this.ranges[0],t&&!t.isEqual(this.getRange())&&this.fromOrientedRange(t)},this.$initRangeList=function(){if(this.rangeList)return;this.rangeList=new r,this.ranges=[],this.rangeCount=0},this.getAllRanges=function(){return this.rangeCount?this.rangeList.ranges.concat():[this.getRange()]},this.splitIntoLines=function(){if(this.rangeCount>1){var e=this.rangeList.ranges,t=e[e.length-1],n=i.fromPoints(e[0].start,t.end);this.toSingleRange(),this.setSelectionRange(n,t.cursor==t.start)}else{var n=this.getRange(),r=this.isBackwards(),s=n.start.row,o=n.end.row;if(s==o){if(r)var u=n.end,a=n.start;else var u=n.start,a=n.end;this.addRange(i.fromPoints(a,a)),this.addRange(i.fromPoints(u,u));return}var f=[],l=this.getLineRange(s,!0);l.start.column=n.start.column,f.push(l);for(var c=s+1;c1){var e=this.rangeList.ranges,t=e[e.length-1],n=i.fromPoints(e[0].start,t.end);this.toSingleRange(),this.setSelectionRange(n,t.cursor==t.start)}else{var r=this.session.documentToScreenPosition(this.selectionLead),s=this.session.documentToScreenPosition(this.selectionAnchor),o=this.rectangularRangeBlock(r,s);o.forEach(this.addRange,this)}},this.rectangularRangeBlock=function(e,t,n){var r=[],s=e.column0)d--;if(d>0){var m=0;while(r[m].isEmpty())m++}for(var g=d;g>=m;g--)r[g].isEmpty()&&r.splice(g,1)}return r}}.call(s.prototype);var d=e("./editor").Editor;(function(){this.updateSelectionMarkers=function(){this.renderer.updateCursor(),this.renderer.updateBackMarkers()},this.addSelectionMarker=function(e){e.cursor||(e.cursor=e.end);var t=this.getSelectionStyle();return e.marker=this.session.addMarker(e,"ace_selection",t),this.session.$selectionMarkers.push(e),this.session.selectionMarkerCount=this.session.$selectionMarkers.length,e},this.removeSelectionMarker=function(e){if(!e.marker)return;this.session.removeMarker(e.marker);var t=this.session.$selectionMarkers.indexOf(e);t!=-1&&this.session.$selectionMarkers.splice(t,1),this.session.selectionMarkerCount=this.session.$selectionMarkers.length},this.removeSelectionMarkers=function(e){var t=this.session.$selectionMarkers;for(var n=e.length;n--;){var r=e[n];if(!r.marker)continue;this.session.removeMarker(r.marker);var i=t.indexOf(r);i!=-1&&t.splice(i,1)}this.session.selectionMarkerCount=t.length},this.$onAddRange=function(e){this.addSelectionMarker(e.range),this.renderer.updateCursor(),this.renderer.updateBackMarkers()},this.$onRemoveRange=function(e){this.removeSelectionMarkers(e.ranges),this.renderer.updateCursor(),this.renderer.updateBackMarkers()},this.$onMultiSelect=function(e){if(this.inMultiSelectMode)return;this.inMultiSelectMode=!0,this.setStyle("ace_multiselect"),this.keyBinding.addKeyboardHandler(f.keyboardHandler),this.commands.setDefaultHandler("exec",this.$onMultiSelectExec),this.renderer.updateCursor(),this.renderer.updateBackMarkers()},this.$onSingleSelect=function(e){if(this.session.multiSelect.inVirtualMode)return;this.inMultiSelectMode=!1,this.unsetStyle("ace_multiselect"),this.keyBinding.removeKeyboardHandler(f.keyboardHandler),this.commands.removeDefaultHandler("exec",this.$onMultiSelectExec),this.renderer.updateCursor(),this.renderer.updateBackMarkers(),this._emit("changeSelection")},this.$onMultiSelectExec=function(e){var t=e.command,n=e.editor;if(!n.multiSelect)return;if(!t.multiSelectAction){var r=t.exec(n,e.args||{});n.multiSelect.addRange(n.multiSelect.toOrientedRange()),n.multiSelect.mergeOverlappingRanges()}else t.multiSelectAction=="forEach"?r=n.forEachSelection(t,e.args):t.multiSelectAction=="forEachLine"?r=n.forEachSelection(t,e.args,!0):t.multiSelectAction=="single"?(n.exitMultiSelectMode(),r=t.exec(n,e.args||{})):r=t.multiSelectAction(n,e.args||{});return r},this.forEachSelection=function(e,t,n){if(this.inVirtualSelectionMode)return;var r=n&&n.keepOrder,i=n==1||n&&n.$byLines,o=this.session,u=this.selection,a=u.rangeList,f=(r?u:a).ranges,l;if(!f.length)return e.exec?e.exec(this,t||{}):e(this,t||{});var c=u._eventRegistry;u._eventRegistry={};var h=new s(o);this.inVirtualSelectionMode=!0;for(var p=f.length;p--;){if(i)while(p>0&&f[p].start.row==f[p-1].end.row)p--;h.fromOrientedRange(f[p]),h.index=p,this.selection=o.selection=h;var d=e.exec?e.exec(this,t||{}):e(this,t||{});!l&&d!==undefined&&(l=d),h.toOrientedRange(f[p])}h.detach(),this.selection=o.selection=u,this.inVirtualSelectionMode=!1,u._eventRegistry=c,u.mergeOverlappingRanges();var v=this.renderer.$scrollAnimation;return this.onCursorChange(),this.onSelectionChange(),v&&v.from==v.to&&this.renderer.animateScrolling(v.from),l},this.exitMultiSelectMode=function(){if(!this.inMultiSelectMode||this.inVirtualSelectionMode)return;this.multiSelect.toSingleRange()},this.getSelectedText=function(){var e="";if(this.inMultiSelectMode&&!this.inVirtualSelectionMode){var t=this.multiSelect.rangeList.ranges,n=[];for(var r=0;r0);u<0&&(u=0),f>=c&&(f=c-1)}var p=this.session.removeFullLines(u,f);p=this.$reAlignText(p,l),this.session.insert({row:u,column:0},p.join("\n")+"\n"),l||(o.start.column=0,o.end.column=p[p.length-1].length),this.selection.setRange(o)}else{s.forEach(function(e){t.substractPoint(e.cursor)});var d=0,v=Infinity,m=n.map(function(t){var n=t.cursor,r=e.getLine(n.row),i=r.substr(n.column).search(/\S/g);return i==-1&&(i=0),n.column>d&&(d=n.column),io?e.insert(r,a.stringRepeat(" ",s-o)):e.remove(new i(r.row,r.column,r.row,r.column-s+o)),t.start.column=t.end.column=d,t.start.row=t.end.row=r.row,t.cursor=t.end}),t.fromOrientedRange(n[0]),this.renderer.updateCursor(),this.renderer.updateBackMarkers()}},this.$reAlignText=function(e,t){function u(e){return a.stringRepeat(" ",e)}function f(e){return e[2]?u(i)+e[2]+u(s-e[2].length+o)+e[4].replace(/^([=:])\s+/,"$1 "):e[0]}function l(e){return e[2]?u(i+s-e[2].length)+e[2]+u(o," ")+e[4].replace(/^([=:])\s+/,"$1 "):e[0]}function c(e){return e[2]?u(i)+e[2]+u(o)+e[4].replace(/^([=:])\s+/,"$1 "):e[0]}var n=!0,r=!0,i,s,o;return e.map(function(e){var t=e.match(/(\s*)(.*?)(\s*)([=:].*)/);return t?i==null?(i=t[1].length,s=t[2].length,o=t[3].length,t):(i+s+o!=t[1].length+t[2].length+t[3].length&&(r=!1),i!=t[1].length&&(n=!1),i>t[1].length&&(i=t[1].length),st[3].length&&(o=t[3].length),t):[e]}).map(t?f:n?r?l:f:c)}}).call(d.prototype),t.onSessionChange=function(e){var t=e.session;t&&!t.multiSelect&&(t.$selectionMarkers=[],t.selection.$initRangeList(),t.multiSelect=t.selection),this.multiSelect=t&&t.multiSelect;var n=e.oldSession;n&&(n.multiSelect.off("addRange",this.$onAddRange),n.multiSelect.off("removeRange",this.$onRemoveRange),n.multiSelect.off("multiSelect",this.$onMultiSelect),n.multiSelect.off("singleSelect",this.$onSingleSelect),n.multiSelect.lead.off("change",this.$checkMultiselectChange),n.multiSelect.anchor.off("change",this.$checkMultiselectChange)),t&&(t.multiSelect.on("addRange",this.$onAddRange),t.multiSelect.on("removeRange",this.$onRemoveRange),t.multiSelect.on("multiSelect",this.$onMultiSelect),t.multiSelect.on("singleSelect",this.$onSingleSelect),t.multiSelect.lead.on("change",this.$checkMultiselectChange),t.multiSelect.anchor.on("change",this.$checkMultiselectChange)),t&&this.inMultiSelectMode!=t.selection.inMultiSelectMode&&(t.selection.inMultiSelectMode?this.$onMultiSelect():this.$onSingleSelect())},t.MultiSelect=m,e("./config").defineOptions(d.prototype,"editor",{enableMultiselect:{set:function(e){m(this),e?(this.on("changeSession",this.$multiselectOnSessionChange),this.on("mousedown",o)):(this.off("changeSession",this.$multiselectOnSessionChange),this.off("mousedown",o))},value:!0},enableBlockSelect:{set:function(e){this.$blockSelectEnabled=e},value:!0}})}),ace.define("ace/mode/folding/fold_mode",["require","exports","module","ace/range"],function(e,t,n){"use strict";var r=e("../../range").Range,i=t.FoldMode=function(){};(function(){this.foldingStartMarker=null,this.foldingStopMarker=null,this.getFoldWidget=function(e,t,n){var r=e.getLine(n);return this.foldingStartMarker.test(r)?"start":t=="markbeginend"&&this.foldingStopMarker&&this.foldingStopMarker.test(r)?"end":""},this.getFoldWidgetRange=function(e,t,n){return null},this.indentationBlock=function(e,t,n){var i=/\S/,s=e.getLine(t),o=s.search(i);if(o==-1)return;var u=n||s.length,a=e.getLength(),f=t,l=t;while(++tf){var h=e.getLine(l).length;return new r(f,u,l,h)}},this.openingBracketBlock=function(e,t,n,i,s){var o={row:n,column:i+1},u=e.$findClosingBracket(t,o,s);if(!u)return;var a=e.foldWidgets[u.row];return a==null&&(a=e.getFoldWidget(u.row)),a=="start"&&u.row>o.row&&(u.row--,u.column=e.getLine(u.row).length),r.fromPoints(o,u)},this.closingBracketBlock=function(e,t,n,i,s){var o={row:n,column:i},u=e.$findOpeningBracket(t,o);if(!u)return;return u.column++,o.column--,r.fromPoints(u,o)}}).call(i.prototype)}),ace.define("ace/theme/textmate",["require","exports","module","ace/lib/dom"],function(e,t,n){"use strict";t.isDark=!1,t.cssClass="ace-tm",t.cssText='.ace-tm .ace_gutter {background: #f0f0f0;color: #333;}.ace-tm .ace_print-margin {width: 1px;background: #e8e8e8;}.ace-tm .ace_fold {background-color: #6B72E6;}.ace-tm {background-color: #FFFFFF;color: black;}.ace-tm .ace_cursor {color: black;}.ace-tm .ace_invisible {color: rgb(191, 191, 191);}.ace-tm .ace_storage,.ace-tm .ace_keyword {color: blue;}.ace-tm .ace_constant {color: rgb(197, 6, 11);}.ace-tm .ace_constant.ace_buildin {color: rgb(88, 72, 246);}.ace-tm .ace_constant.ace_language {color: rgb(88, 92, 246);}.ace-tm .ace_constant.ace_library {color: rgb(6, 150, 14);}.ace-tm .ace_invalid {background-color: rgba(255, 0, 0, 0.1);color: red;}.ace-tm .ace_support.ace_function {color: rgb(60, 76, 114);}.ace-tm .ace_support.ace_constant {color: rgb(6, 150, 14);}.ace-tm .ace_support.ace_type,.ace-tm .ace_support.ace_class {color: rgb(109, 121, 222);}.ace-tm .ace_keyword.ace_operator {color: rgb(104, 118, 135);}.ace-tm .ace_string {color: rgb(3, 106, 7);}.ace-tm .ace_comment {color: rgb(76, 136, 107);}.ace-tm .ace_comment.ace_doc {color: rgb(0, 102, 255);}.ace-tm .ace_comment.ace_doc.ace_tag {color: rgb(128, 159, 191);}.ace-tm .ace_constant.ace_numeric {color: rgb(0, 0, 205);}.ace-tm .ace_variable {color: rgb(49, 132, 149);}.ace-tm .ace_xml-pe {color: rgb(104, 104, 91);}.ace-tm .ace_entity.ace_name.ace_function {color: #0000A2;}.ace-tm .ace_heading {color: rgb(12, 7, 255);}.ace-tm .ace_list {color:rgb(185, 6, 144);}.ace-tm .ace_meta.ace_tag {color:rgb(0, 22, 142);}.ace-tm .ace_string.ace_regex {color: rgb(255, 0, 0)}.ace-tm .ace_marker-layer .ace_selection {background: rgb(181, 213, 255);}.ace-tm.ace_multiselect .ace_selection.ace_start {box-shadow: 0 0 3px 0px white;}.ace-tm .ace_marker-layer .ace_step {background: rgb(252, 255, 0);}.ace-tm .ace_marker-layer .ace_stack {background: rgb(164, 229, 101);}.ace-tm .ace_marker-layer .ace_bracket {margin: -1px 0 0 -1px;border: 1px solid rgb(192, 192, 192);}.ace-tm .ace_marker-layer .ace_active-line {background: rgba(0, 0, 0, 0.07);}.ace-tm .ace_gutter-active-line {background-color : #dcdcdc;}.ace-tm .ace_marker-layer .ace_selected-word {background: rgb(250, 250, 255);border: 1px solid rgb(200, 200, 250);}.ace-tm .ace_indent-guide {background: url("data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAEAAAACCAYAAACZgbYnAAAAE0lEQVQImWP4////f4bLly//BwAmVgd1/w11/gAAAABJRU5ErkJggg==") right repeat-y;}';var r=e("../lib/dom");r.importCssString(t.cssText,t.cssClass)}),ace.define("ace/line_widgets",["require","exports","module","ace/lib/oop","ace/lib/dom","ace/range"],function(e,t,n){"use strict";function o(e){this.session=e,this.session.widgetManager=this,this.session.getRowLength=this.getRowLength,this.session.$getWidgetScreenLength=this.$getWidgetScreenLength,this.updateOnChange=this.updateOnChange.bind(this),this.renderWidgets=this.renderWidgets.bind(this),this.measureWidgets=this.measureWidgets.bind(this),this.session._changedWidgets=[],this.$onChangeEditor=this.$onChangeEditor.bind(this),this.session.on("change",this.updateOnChange),this.session.on("changeFold",this.updateOnFold),this.session.on("changeEditor",this.$onChangeEditor)}var r=e("./lib/oop"),i=e("./lib/dom"),s=e("./range").Range;(function(){this.getRowLength=function(e){var t;return this.lineWidgets?t=this.lineWidgets[e]&&this.lineWidgets[e].rowCount||0:t=0,!this.$useWrapMode||!this.$wrapData[e]?1+t:this.$wrapData[e].length+1+t},this.$getWidgetScreenLength=function(){var e=0;return this.lineWidgets.forEach(function(t){t&&t.rowCount&&!t.hidden&&(e+=t.rowCount)}),e},this.$onChangeEditor=function(e){this.attach(e.editor)},this.attach=function(e){e&&e.widgetManager&&e.widgetManager!=this&&e.widgetManager.detach();if(this.editor==e)return;this.detach(),this.editor=e,e&&(e.widgetManager=this,e.renderer.on("beforeRender",this.measureWidgets),e.renderer.on("afterRender",this.renderWidgets))},this.detach=function(e){var t=this.editor;if(!t)return;this.editor=null,t.widgetManager=null,t.renderer.off("beforeRender",this.measureWidgets),t.renderer.off("afterRender",this.renderWidgets);var n=this.session.lineWidgets;n&&n.forEach(function(e){e&&e.el&&e.el.parentNode&&(e._inDocument=!1,e.el.parentNode.removeChild(e.el))})},this.updateOnFold=function(e,t){var n=t.lineWidgets;if(!n||!e.action)return;var r=e.data,i=r.start.row,s=r.end.row,o=e.action=="add";for(var u=i+1;u0&&!r[i])i--;this.firstRow=n.firstRow,this.lastRow=n.lastRow,t.$cursorLayer.config=n;for(var o=i;o<=s;o++){var u=r[o];if(!u||!u.el)continue;if(u.hidden){u.el.style.top=-100-(u.pixelHeight||0)+"px";continue}u._inDocument||(u._inDocument=!0,t.container.appendChild(u.el));var a=t.$cursorLayer.getPixelPosition({row:o,column:0},!0).top;u.coverLine||(a+=n.lineHeight*this.session.getRowLineCount(u.row)),u.el.style.top=a-n.offset+"px";var f=u.coverGutter?0:t.gutterWidth;u.fixedWidth||(f-=t.scrollLeft),u.el.style.left=f+"px",u.fullWidth&&u.screenWidth&&(u.el.style.minWidth=n.width+2*n.padding+"px"),u.fixedWidth?u.el.style.right=t.scrollBar.getWidth()+"px":u.el.style.right=""}}}).call(o.prototype),t.LineWidgets=o}),ace.define("ace/ext/error_marker",["require","exports","module","ace/line_widgets","ace/lib/dom","ace/range"],function(e,t,n){"use strict";function o(e,t,n){var r=0,i=e.length-1;while(r<=i){var s=r+i>>1,o=n(t,e[s]);if(o>0)r=s+1;else{if(!(o<0))return s;i=s-1}}return-(r+1)}function u(e,t,n){var r=e.getAnnotations().sort(s.comparePoints);if(!r.length)return;var i=o(r,{row:t,column:-1},s.comparePoints);i<0&&(i=-i-1),i>=r.length?i=n>0?0:r.length-1:i===0&&n<0&&(i=r.length-1);var u=r[i];if(!u||!n)return;if(u.row===t){do u=r[i+=n];while(u&&u.row===t);if(!u)return r.slice()}var a=[];t=u.row;do a[n<0?"unshift":"push"](u),u=r[i+=n];while(u&&u.row==t);return a.length&&a}var r=e("../line_widgets").LineWidgets,i=e("../lib/dom"),s=e("../range").Range;t.showErrorMarker=function(e,t){var n=e.session;n.widgetManager||(n.widgetManager=new r(n),n.widgetManager.attach(e));var s=e.getCursorPosition(),o=s.row,a=n.widgetManager.getWidgetsAtRow(o).filter(function(e){return e.type=="errorMarker"})[0];a?a.destroy():o-=t;var f=u(n,o,t),l;if(f){var c=f[0];s.column=(c.pos&&typeof c.column!="number"?c.pos.sc:c.column)||0,s.row=c.row,l=e.renderer.$gutterLayer.$annotations[s.row]}else{if(a)return;l={text:["Looks good!"],className:"ace_ok"}}e.session.unfold(s.row),e.selection.moveToPosition(s);var h={row:s.row,fixedWidth:!0,coverGutter:!0,el:i.createElement("div"),type:"errorMarker"},p=h.el.appendChild(i.createElement("div")),d=h.el.appendChild(i.createElement("div"));d.className="error_widget_arrow "+l.className;var v=e.renderer.$cursorLayer.getPixelPosition(s).left;d.style.left=v+e.renderer.gutterWidth-5+"px",h.el.className="error_widget_wrapper",p.className="error_widget "+l.className,p.innerHTML=l.text.join("
"),p.appendChild(i.createElement("div"));var m=function(e,t,n){if(t===0&&(n==="esc"||n==="return"))return h.destroy(),{command:"null"}};h.destroy=function(){if(e.$mouseHandler.isMousePressed)return;e.keyBinding.removeKeyboardHandler(m),n.widgetManager.removeLineWidget(h),e.off("changeSelection",h.destroy),e.off("changeSession",h.destroy),e.off("mouseup",h.destroy),e.off("change",h.destroy)},e.keyBinding.addKeyboardHandler(m),e.on("changeSelection",h.destroy),e.on("changeSession",h.destroy),e.on("mouseup",h.destroy),e.on("change",h.destroy),e.session.widgetManager.addLineWidget(h),h.el.onmousedown=e.focus.bind(e),e.renderer.scrollCursorIntoView(null,.5,{bottom:h.el.offsetHeight})},i.importCssString(" .error_widget_wrapper { background: inherit; color: inherit; border:none } .error_widget { border-top: solid 2px; border-bottom: solid 2px; margin: 5px 0; padding: 10px 40px; white-space: pre-wrap; } .error_widget.ace_error, .error_widget_arrow.ace_error{ border-color: #ff5a5a } .error_widget.ace_warning, .error_widget_arrow.ace_warning{ border-color: #F1D817 } .error_widget.ace_info, .error_widget_arrow.ace_info{ border-color: #5a5a5a } .error_widget.ace_ok, .error_widget_arrow.ace_ok{ border-color: #5aaa5a } .error_widget_arrow { position: absolute; border: solid 5px; border-top-color: transparent!important; border-right-color: transparent!important; border-left-color: transparent!important; top: -5px; }","")}),ace.define("ace/ace",["require","exports","module","ace/lib/fixoldbrowsers","ace/lib/dom","ace/lib/event","ace/editor","ace/edit_session","ace/undomanager","ace/virtual_renderer","ace/worker/worker_client","ace/keyboard/hash_handler","ace/placeholder","ace/multi_select","ace/mode/folding/fold_mode","ace/theme/textmate","ace/ext/error_marker","ace/config"],function(e,t,n){"use strict";e("./lib/fixoldbrowsers");var r=e("./lib/dom"),i=e("./lib/event"),s=e("./editor").Editor,o=e("./edit_session").EditSession,u=e("./undomanager").UndoManager,a=e("./virtual_renderer").VirtualRenderer;e("./worker/worker_client"),e("./keyboard/hash_handler"),e("./placeholder"),e("./multi_select"),e("./mode/folding/fold_mode"),e("./theme/textmate"),e("./ext/error_marker"),t.config=e("./config"),t.require=e,typeof define=="function"&&(t.define=define),t.edit=function(e){if(typeof e=="string"){var n=e;e=document.getElementById(n);if(!e)throw new Error("ace.edit can't find div #"+n)}if(e&&e.env&&e.env.editor instanceof s)return e.env.editor;var o="";if(e&&/input|textarea/i.test(e.tagName)){var u=e;o=u.value,e=r.createElement("pre"),u.parentNode.replaceChild(e,u)}else e&&(o=r.getInnerText(e),e.innerHTML="");var f=t.createEditSession(o),l=new s(new a(e));l.setSession(f);var c={document:f,editor:l,onResize:l.resize.bind(l,null)};return u&&(c.textarea=u),i.addListener(window,"resize",c.onResize),l.on("destroy",function(){i.removeListener(window,"resize",c.onResize),c.editor.container.env=null}),l.container.env=l.env=c,l},t.createEditSession=function(e,t){var n=new o(e,t);return n.setUndoManager(new u),n},t.EditSession=o,t.UndoManager=u,t.version="1.2.8"}); + (function() { + ace.require(["ace/ace"], function(a) { + if (a) { + a.config.init(true); + a.define = ace.define; + } + if (!window.ace) + window.ace = a; + for (var key in a) if (a.hasOwnProperty(key)) + window.ace[key] = a[key]; + }); + })(); + \ No newline at end of file diff --git a/src/UmbracoUrlHandling/Umbraco/lib/ace-builds/src-min-noconflict/ext-language_tools.js b/src/UmbracoUrlHandling/Umbraco/lib/ace-builds/src-min-noconflict/ext-language_tools.js new file mode 100644 index 0000000..3af07b2 --- /dev/null +++ b/src/UmbracoUrlHandling/Umbraco/lib/ace-builds/src-min-noconflict/ext-language_tools.js @@ -0,0 +1,5 @@ +ace.define("ace/snippets",["require","exports","module","ace/lib/oop","ace/lib/event_emitter","ace/lib/lang","ace/range","ace/anchor","ace/keyboard/hash_handler","ace/tokenizer","ace/lib/dom","ace/editor"],function(e,t,n){"use strict";var r=e("./lib/oop"),i=e("./lib/event_emitter").EventEmitter,s=e("./lib/lang"),o=e("./range").Range,u=e("./anchor").Anchor,a=e("./keyboard/hash_handler").HashHandler,f=e("./tokenizer").Tokenizer,l=o.comparePoints,c=function(){this.snippetMap={},this.snippetNameMap={}};(function(){r.implement(this,i),this.getTokenizer=function(){function e(e,t,n){return e=e.substr(1),/^\d+$/.test(e)&&!n.inFormatString?[{tabstopId:parseInt(e,10)}]:[{text:e}]}function t(e){return"(?:[^\\\\"+e+"]|\\\\.)"}return c.$tokenizer=new f({start:[{regex:/:/,onMatch:function(e,t,n){return n.length&&n[0].expectIf?(n[0].expectIf=!1,n[0].elseBranch=n[0],[n[0]]):":"}},{regex:/\\./,onMatch:function(e,t,n){var r=e[1];return r=="}"&&n.length?e=r:"`$\\".indexOf(r)!=-1?e=r:n.inFormatString&&(r=="n"?e="\n":r=="t"?e="\n":"ulULE".indexOf(r)!=-1&&(e={changeCase:r,local:r>"a"})),[e]}},{regex:/}/,onMatch:function(e,t,n){return[n.length?n.shift():e]}},{regex:/\$(?:\d+|\w+)/,onMatch:e},{regex:/\$\{[\dA-Z_a-z]+/,onMatch:function(t,n,r){var i=e(t.substr(1),n,r);return r.unshift(i[0]),i},next:"snippetVar"},{regex:/\n/,token:"newline",merge:!1}],snippetVar:[{regex:"\\|"+t("\\|")+"*\\|",onMatch:function(e,t,n){n[0].choices=e.slice(1,-1).split(",")},next:"start"},{regex:"/("+t("/")+"+)/(?:("+t("/")+"*)/)(\\w*):?",onMatch:function(e,t,n){var r=n[0];return r.fmtString=e,e=this.splitRegex.exec(e),r.guard=e[1],r.fmt=e[2],r.flag=e[3],""},next:"start"},{regex:"`"+t("`")+"*`",onMatch:function(e,t,n){return n[0].code=e.splice(1,-1),""},next:"start"},{regex:"\\?",onMatch:function(e,t,n){n[0]&&(n[0].expectIf=!0)},next:"start"},{regex:"([^:}\\\\]|\\\\.)*:?",token:"",next:"start"}],formatString:[{regex:"/("+t("/")+"+)/",token:"regex"},{regex:"",onMatch:function(e,t,n){n.inFormatString=!0},next:"start"}]}),c.prototype.getTokenizer=function(){return c.$tokenizer},c.$tokenizer},this.tokenizeTmSnippet=function(e,t){return this.getTokenizer().getLineTokens(e,t).tokens.map(function(e){return e.value||e})},this.$getDefaultValue=function(e,t){if(/^[A-Z]\d+$/.test(t)){var n=t.substr(1);return(this.variables[t[0]+"__"]||{})[n]}if(/^\d+$/.test(t))return(this.variables.__||{})[t];t=t.replace(/^TM_/,"");if(!e)return;var r=e.session;switch(t){case"CURRENT_WORD":var i=r.getWordRange();case"SELECTION":case"SELECTED_TEXT":return r.getTextRange(i);case"CURRENT_LINE":return r.getLine(e.getCursorPosition().row);case"PREV_LINE":return r.getLine(e.getCursorPosition().row-1);case"LINE_INDEX":return e.getCursorPosition().column;case"LINE_NUMBER":return e.getCursorPosition().row+1;case"SOFT_TABS":return r.getUseSoftTabs()?"YES":"NO";case"TAB_SIZE":return r.getTabSize();case"FILENAME":case"FILEPATH":return"";case"FULLNAME":return"Ace"}},this.variables={},this.getVariableValue=function(e,t){return this.variables.hasOwnProperty(t)?this.variables[t](e,t)||"":this.$getDefaultValue(e,t)||""},this.tmStrFormat=function(e,t,n){var r=t.flag||"",i=t.guard;i=new RegExp(i,r.replace(/[^gi]/,""));var s=this.tokenizeTmSnippet(t.fmt,"formatString"),o=this,u=e.replace(i,function(){o.variables.__=arguments;var e=o.resolveVariables(s,n),t="E";for(var r=0;r1?(y=t[t.length-1].length,g+=t.length-1):y+=e.length,b+=e}else e.start?e.end={row:g,column:y}:e.start={row:g,column:y}});var w=e.getSelectionRange(),E=e.session.replace(w,b),S=new h(e),x=e.inVirtualSelectionMode&&e.selection.index;S.addTabstops(u,w.start,E,x)},this.insertSnippet=function(e,t){var n=this;if(e.inVirtualSelectionMode)return n.insertSnippetForSelection(e,t);e.forEachSelection(function(){n.insertSnippetForSelection(e,t)},null,{keepOrder:!0}),e.tabstopManager&&e.tabstopManager.tabNext()},this.$getScope=function(e){var t=e.session.$mode.$id||"";t=t.split("/").pop();if(t==="html"||t==="php"){t==="php"&&!e.session.$mode.inlinePhp&&(t="html");var n=e.getCursorPosition(),r=e.session.getState(n.row);typeof r=="object"&&(r=r[0]),r.substring&&(r.substring(0,3)=="js-"?t="javascript":r.substring(0,4)=="css-"?t="css":r.substring(0,4)=="php-"&&(t="php"))}return t},this.getActiveScopes=function(e){var t=this.$getScope(e),n=[t],r=this.snippetMap;return r[t]&&r[t].includeScopes&&n.push.apply(n,r[t].includeScopes),n.push("_"),n},this.expandWithTab=function(e,t){var n=this,r=e.forEachSelection(function(){return n.expandSnippetForSelection(e,t)},null,{keepOrder:!0});return r&&e.tabstopManager&&e.tabstopManager.tabNext(),r},this.expandSnippetForSelection=function(e,t){var n=e.getCursorPosition(),r=e.session.getLine(n.row),i=r.substring(0,n.column),s=r.substr(n.column),o=this.snippetMap,u;return this.getActiveScopes(e).some(function(e){var t=o[e];return t&&(u=this.findMatchingSnippet(t,i,s)),!!u},this),u?t&&t.dryRun?!0:(e.session.doc.removeInLine(n.row,n.column-u.replaceBefore.length,n.column+u.replaceAfter.length),this.variables.M__=u.matchBefore,this.variables.T__=u.matchAfter,this.insertSnippetForSelection(e,u.content),this.variables.M__=this.variables.T__=null,!0):!1},this.findMatchingSnippet=function(e,t,n){for(var r=e.length;r--;){var i=e[r];if(i.startRe&&!i.startRe.test(t))continue;if(i.endRe&&!i.endRe.test(n))continue;if(!i.startRe&&!i.endRe)continue;return i.matchBefore=i.startRe?i.startRe.exec(t):[""],i.matchAfter=i.endRe?i.endRe.exec(n):[""],i.replaceBefore=i.triggerRe?i.triggerRe.exec(t)[0]:"",i.replaceAfter=i.endTriggerRe?i.endTriggerRe.exec(n)[0]:"",i}},this.snippetMap={},this.snippetNameMap={},this.register=function(e,t){function o(e){return e&&!/^\^?\(.*\)\$?$|^\\b$/.test(e)&&(e="(?:"+e+")"),e||""}function u(e,t,n){return e=o(e),t=o(t),n?(e=t+e,e&&e[e.length-1]!="$"&&(e+="$")):(e+=t,e&&e[0]!="^"&&(e="^"+e)),new RegExp(e)}function a(e){e.scope||(e.scope=t||"_"),t=e.scope,n[t]||(n[t]=[],r[t]={});var o=r[t];if(e.name){var a=o[e.name];a&&i.unregister(a),o[e.name]=e}n[t].push(e),e.tabTrigger&&!e.trigger&&(!e.guard&&/^\w/.test(e.tabTrigger)&&(e.guard="\\b"),e.trigger=s.escapeRegExp(e.tabTrigger));if(!e.trigger&&!e.guard&&!e.endTrigger&&!e.endGuard)return;e.startRe=u(e.trigger,e.guard,!0),e.triggerRe=new RegExp(e.trigger,"",!0),e.endRe=u(e.endTrigger,e.endGuard,!0),e.endTriggerRe=new RegExp(e.endTrigger,"",!0)}var n=this.snippetMap,r=this.snippetNameMap,i=this;e||(e=[]),e&&e.content?a(e):Array.isArray(e)&&e.forEach(a),this._signal("registerSnippets",{scope:t})},this.unregister=function(e,t){function i(e){var i=r[e.scope||t];if(i&&i[e.name]){delete i[e.name];var s=n[e.scope||t],o=s&&s.indexOf(e);o>=0&&s.splice(o,1)}}var n=this.snippetMap,r=this.snippetNameMap;e.content?i(e):Array.isArray(e)&&e.forEach(i)},this.parseSnippetFile=function(e){e=e.replace(/\r/g,"");var t=[],n={},r=/^#.*|^({[\s\S]*})\s*$|^(\S+) (.*)$|^((?:\n*\t.*)+)/gm,i;while(i=r.exec(e)){if(i[1])try{n=JSON.parse(i[1]),t.push(n)}catch(s){}if(i[4])n.content=i[4].replace(/^\t/gm,""),t.push(n),n={};else{var o=i[2],u=i[3];if(o=="regex"){var a=/\/((?:[^\/\\]|\\.)*)|$/g;n.guard=a.exec(u)[1],n.trigger=a.exec(u)[1],n.endTrigger=a.exec(u)[1],n.endGuard=a.exec(u)[1]}else o=="snippet"?(n.tabTrigger=u.match(/^\S*/)[0],n.name||(n.name=u)):n[o]=u}}return t},this.getSnippetByName=function(e,t){var n=this.snippetNameMap,r;return this.getActiveScopes(t).some(function(t){var i=n[t];return i&&(r=i[e]),!!r},this),r}}).call(c.prototype);var h=function(e){if(e.tabstopManager)return e.tabstopManager;e.tabstopManager=this,this.$onChange=this.onChange.bind(this),this.$onChangeSelection=s.delayedCall(this.onChangeSelection.bind(this)).schedule,this.$onChangeSession=this.onChangeSession.bind(this),this.$onAfterExec=this.onAfterExec.bind(this),this.attach(e)};(function(){this.attach=function(e){this.index=0,this.ranges=[],this.tabstops=[],this.$openTabstops=null,this.selectedTabstop=null,this.editor=e,this.editor.on("change",this.$onChange),this.editor.on("changeSelection",this.$onChangeSelection),this.editor.on("changeSession",this.$onChangeSession),this.editor.commands.on("afterExec",this.$onAfterExec),this.editor.keyBinding.addKeyboardHandler(this.keyboardHandler)},this.detach=function(){this.tabstops.forEach(this.removeTabstopMarkers,this),this.ranges=null,this.tabstops=null,this.selectedTabstop=null,this.editor.removeListener("change",this.$onChange),this.editor.removeListener("changeSelection",this.$onChangeSelection),this.editor.removeListener("changeSession",this.$onChangeSession),this.editor.commands.removeListener("afterExec",this.$onAfterExec),this.editor.keyBinding.removeKeyboardHandler(this.keyboardHandler),this.editor.tabstopManager=null,this.editor=null},this.onChange=function(e){var t=e,n=e.action[0]=="r",r=e.start,i=e.end,s=r.row,o=i.row,u=o-s,a=i.column-r.column;n&&(u=-u,a=-a);if(!this.$inChange&&n){var f=this.selectedTabstop,c=f&&!f.some(function(e){return l(e.start,r)<=0&&l(e.end,i)>=0});if(c)return this.detach()}var h=this.ranges;for(var p=0;p0){this.removeRange(d),p--;continue}d.start.row==s&&d.start.column>r.column&&(d.start.column+=a),d.end.row==s&&d.end.column>=r.column&&(d.end.column+=a),d.start.row>=s&&(d.start.row+=u),d.end.row>=s&&(d.end.row+=u),l(d.start,d.end)>0&&this.removeRange(d)}h.length||this.detach()},this.updateLinkedFields=function(){var e=this.selectedTabstop;if(!e||!e.hasLinkedRanges)return;this.$inChange=!0;var n=this.editor.session,r=n.getTextRange(e.firstNonLinked);for(var i=e.length;i--;){var s=e[i];if(!s.linked)continue;var o=t.snippetManager.tmStrFormat(r,s.original);n.replace(s,o)}this.$inChange=!1},this.onAfterExec=function(e){e.command&&!e.command.readOnly&&this.updateLinkedFields()},this.onChangeSelection=function(){if(!this.editor)return;var e=this.editor.selection.lead,t=this.editor.selection.anchor,n=this.editor.selection.isEmpty();for(var r=this.ranges.length;r--;){if(this.ranges[r].linked)continue;var i=this.ranges[r].contains(e.row,e.column),s=n||this.ranges[r].contains(t.row,t.column);if(i&&s)return}this.detach()},this.onChangeSession=function(){this.detach()},this.tabNext=function(e){var t=this.tabstops.length,n=this.index+(e||1);n=Math.min(Math.max(n,1),t),n==t&&(n=0),this.selectTabstop(n),n===0&&this.detach()},this.selectTabstop=function(e){this.$openTabstops=null;var t=this.tabstops[this.index];t&&this.addTabstopMarkers(t),this.index=e,t=this.tabstops[this.index];if(!t||!t.length)return;this.selectedTabstop=t;if(!this.editor.inVirtualSelectionMode){var n=this.editor.multiSelect;n.toSingleRange(t.firstNonLinked.clone());for(var r=t.length;r--;){if(t.hasLinkedRanges&&t[r].linked)continue;n.addRange(t[r].clone(),!0)}n.ranges[0]&&n.addRange(n.ranges[0].clone())}else this.editor.selection.setRange(t.firstNonLinked);this.editor.keyBinding.addKeyboardHandler(this.keyboardHandler)},this.addTabstops=function(e,t,n){this.$openTabstops||(this.$openTabstops=[]);if(!e[0]){var r=o.fromPoints(n,n);v(r.start,t),v(r.end,t),e[0]=[r],e[0].index=0}var i=this.index,s=[i+1,0],u=this.ranges;e.forEach(function(e,n){var r=this.$openTabstops[n]||e;for(var i=e.length;i--;){var a=e[i],f=o.fromPoints(a.start,a.end||a.start);d(f.start,t),d(f.end,t),f.original=a,f.tabstop=r,u.push(f),r!=e?r.unshift(f):r[i]=f,a.fmtString?(f.linked=!0,r.hasLinkedRanges=!0):r.firstNonLinked||(r.firstNonLinked=f)}r.firstNonLinked||(r.hasLinkedRanges=!1),r===e&&(s.push(r),this.$openTabstops[n]=r),this.addTabstopMarkers(r)},this),s.length>2&&(this.tabstops.length&&s.push(s.splice(2,1)[0]),this.tabstops.splice.apply(this.tabstops,s))},this.addTabstopMarkers=function(e){var t=this.editor.session;e.forEach(function(e){e.markerId||(e.markerId=t.addMarker(e,"ace_snippet-marker","text"))})},this.removeTabstopMarkers=function(e){var t=this.editor.session;e.forEach(function(e){t.removeMarker(e.markerId),e.markerId=null})},this.removeRange=function(e){var t=e.tabstop.indexOf(e);e.tabstop.splice(t,1),t=this.ranges.indexOf(e),this.ranges.splice(t,1),this.editor.session.removeMarker(e.markerId),e.tabstop.length||(t=this.tabstops.indexOf(e.tabstop),t!=-1&&this.tabstops.splice(t,1),this.tabstops.length||this.detach())},this.keyboardHandler=new a,this.keyboardHandler.bindKeys({Tab:function(e){if(t.snippetManager&&t.snippetManager.expandWithTab(e))return;e.tabstopManager.tabNext(1)},"Shift-Tab":function(e){e.tabstopManager.tabNext(-1)},Esc:function(e){e.tabstopManager.detach()},Return:function(e){return!1}})}).call(h.prototype);var p={};p.onChange=u.prototype.onChange,p.setPosition=function(e,t){this.pos.row=e,this.pos.column=t},p.update=function(e,t,n){this.$insertRight=n,this.pos=e,this.onChange(t)};var d=function(e,t){e.row==0&&(e.column+=t.column),e.row+=t.row},v=function(e,t){e.row==t.row&&(e.column-=t.column),e.row-=t.row};e("./lib/dom").importCssString(".ace_snippet-marker { -moz-box-sizing: border-box; box-sizing: border-box; background: rgba(194, 193, 208, 0.09); border: 1px dotted rgba(211, 208, 235, 0.62); position: absolute;}"),t.snippetManager=new c;var m=e("./editor").Editor;(function(){this.insertSnippet=function(e,n){return t.snippetManager.insertSnippet(this,e,n)},this.expandSnippet=function(e){return t.snippetManager.expandWithTab(this,e)}}).call(m.prototype)}),ace.define("ace/autocomplete/popup",["require","exports","module","ace/virtual_renderer","ace/editor","ace/range","ace/lib/event","ace/lib/lang","ace/lib/dom"],function(e,t,n){"use strict";var r=e("../virtual_renderer").VirtualRenderer,i=e("../editor").Editor,s=e("../range").Range,o=e("../lib/event"),u=e("../lib/lang"),a=e("../lib/dom"),f=function(e){var t=new r(e);t.$maxLines=4;var n=new i(t);return n.setHighlightActiveLine(!1),n.setShowPrintMargin(!1),n.renderer.setShowGutter(!1),n.renderer.setHighlightGutterLine(!1),n.$mouseHandler.$focusWaitTimout=0,n.$highlightTagPending=!0,n},l=function(e){var t=a.createElement("div"),n=new f(t);e&&e.appendChild(t),t.style.display="none",n.renderer.content.style.cursor="default",n.renderer.setStyle("ace_autocomplete"),n.setOption("displayIndentGuides",!1),n.setOption("dragDelay",150);var r=function(){};n.focus=r,n.$isFocused=!0,n.renderer.$cursorLayer.restartTimer=r,n.renderer.$cursorLayer.element.style.opacity=0,n.renderer.$maxLines=8,n.renderer.$keepTextAreaAtCursor=!1,n.setHighlightActiveLine(!1),n.session.highlight(""),n.session.$searchHighlight.clazz="ace_highlight-marker",n.on("mousedown",function(e){var t=e.getDocumentPosition();n.selection.moveToPosition(t),c.start.row=c.end.row=t.row,e.stop()});var i,l=new s(-1,0,-1,Infinity),c=new s(-1,0,-1,Infinity);c.id=n.session.addMarker(c,"ace_active-line","fullLine"),n.setSelectOnHover=function(e){e?l.id&&(n.session.removeMarker(l.id),l.id=null):l.id=n.session.addMarker(l,"ace_line-hover","fullLine")},n.setSelectOnHover(!1),n.on("mousemove",function(e){if(!i){i=e;return}if(i.x==e.x&&i.y==e.y)return;i=e,i.scrollTop=n.renderer.scrollTop;var t=i.getDocumentPosition().row;l.start.row!=t&&(l.id||n.setRow(t),p(t))}),n.renderer.on("beforeRender",function(){if(i&&l.start.row!=-1){i.$pos=null;var e=i.getDocumentPosition().row;l.id||n.setRow(e),p(e,!0)}}),n.renderer.on("afterRender",function(){var e=n.getRow(),t=n.renderer.$textLayer,r=t.element.childNodes[e-t.config.firstRow];if(r==t.selectedNode)return;t.selectedNode&&a.removeCssClass(t.selectedNode,"ace_selected"),t.selectedNode=r,r&&a.addCssClass(r,"ace_selected")});var h=function(){p(-1)},p=function(e,t){e!==l.start.row&&(l.start.row=l.end.row=e,t||n.session._emit("changeBackMarker"),n._emit("changeHoverMarker"))};n.getHoveredRow=function(){return l.start.row},o.addListener(n.container,"mouseout",h),n.on("hide",h),n.on("changeSelection",h),n.session.doc.getLength=function(){return n.data.length},n.session.doc.getLine=function(e){var t=n.data[e];return typeof t=="string"?t:t&&t.value||""};var d=n.session.bgTokenizer;return d.$tokenizeRow=function(e){var t=n.data[e],r=[];if(!t)return r;typeof t=="string"&&(t={value:t}),t.caption||(t.caption=t.value||t.name);var i=-1,s,o;for(var u=0;ua-2&&(f=f.substr(0,a-t.caption.length-3)+"\u2026"),r.push({type:"rightAlignedText",value:f})}return r},d.$updateOnChange=r,d.start=r,n.session.$computeWidth=function(){return this.screenWidth=0},n.$blockScrolling=Infinity,n.isOpen=!1,n.isTopdown=!1,n.autoSelect=!0,n.data=[],n.setData=function(e){n.setValue(u.stringRepeat("\n",e.length),-1),n.data=e||[],n.setRow(0)},n.getData=function(e){return n.data[e]},n.getRow=function(){return c.start.row},n.setRow=function(e){e=Math.max(this.autoSelect?0:-1,Math.min(this.data.length,e)),c.start.row!=e&&(n.selection.clearSelection(),c.start.row=c.end.row=e||0,n.session._emit("changeBackMarker"),n.moveCursorTo(e||0,0),n.isOpen&&n._signal("select"))},n.on("changeSelection",function(){n.isOpen&&n.setRow(n.selection.lead.row),n.renderer.scrollCursorIntoView()}),n.hide=function(){this.container.style.display="none",this._signal("hide"),n.isOpen=!1},n.show=function(e,t,r){var s=this.container,o=window.innerHeight,u=window.innerWidth,a=this.renderer,f=a.$maxLines*t*1.4,l=e.top+this.$borderSize,c=l>o/2&&!r;c&&l+t+f>o?(a.$maxPixelHeight=l-2*this.$borderSize,s.style.top="",s.style.bottom=o-l+"px",n.isTopdown=!1):(l+=t,a.$maxPixelHeight=o-l-.2*t,s.style.top=l+"px",s.style.bottom="",n.isTopdown=!0),s.style.display="",this.renderer.$textLayer.checkForSizeChanges();var h=e.left;h+s.offsetWidth>u&&(h=u-s.offsetWidth),s.style.left=h+"px",this._signal("show"),i=null,n.isOpen=!0},n.getTextLeftOffset=function(){return this.$borderSize+this.renderer.$padding+this.$imageSize},n.$imageSize=0,n.$borderSize=1,n};a.importCssString(".ace_editor.ace_autocomplete .ace_marker-layer .ace_active-line { background-color: #CAD6FA; z-index: 1;}.ace_editor.ace_autocomplete .ace_line-hover { border: 1px solid #abbffe; margin-top: -1px; background: rgba(233,233,253,0.4);}.ace_editor.ace_autocomplete .ace_line-hover { position: absolute; z-index: 2;}.ace_editor.ace_autocomplete .ace_scroller { background: none; border: none; box-shadow: none;}.ace_rightAlignedText { color: gray; display: inline-block; position: absolute; right: 4px; text-align: right; z-index: -1;}.ace_editor.ace_autocomplete .ace_completion-highlight{ color: #000; text-shadow: 0 0 0.01em;}.ace_editor.ace_autocomplete { width: 280px; z-index: 200000; background: #fbfbfb; color: #444; border: 1px lightgray solid; position: fixed; box-shadow: 2px 3px 5px rgba(0,0,0,.2); line-height: 1.4;}"),t.AcePopup=l}),ace.define("ace/autocomplete/util",["require","exports","module"],function(e,t,n){"use strict";t.parForEach=function(e,t,n){var r=0,i=e.length;i===0&&n();for(var s=0;s=0;s--){if(!n.test(e[s]))break;i.push(e[s])}return i.reverse().join("")},t.retrieveFollowingIdentifier=function(e,t,n){n=n||r;var i=[];for(var s=t;s=n?-1:t+1;break;case"start":t=0;break;case"end":t=n}this.popup.setRow(t)},this.insertMatch=function(e,t){e||(e=this.popup.getData(this.popup.getRow()));if(!e)return!1;if(e.completer&&e.completer.insertMatch)e.completer.insertMatch(this.editor,e);else{if(this.completions.filterText){var n=this.editor.selection.getAllRanges();for(var r=0,i;i=n[r];r++)i.start.column-=this.completions.filterText.length,this.editor.session.remove(i)}e.snippet?f.insertSnippet(this.editor,e.snippet):this.editor.execCommand("insertstring",e.value||e)}this.detach()},this.commands={Up:function(e){e.completer.goTo("up")},Down:function(e){e.completer.goTo("down")},"Ctrl-Up|Ctrl-Home":function(e){e.completer.goTo("start")},"Ctrl-Down|Ctrl-End":function(e){e.completer.goTo("end")},Esc:function(e){e.completer.detach()},Return:function(e){return e.completer.insertMatch()},"Shift-Return":function(e){e.completer.insertMatch(null,{deleteSuffix:!0})},Tab:function(e){var t=e.completer.insertMatch();if(!!t||!!e.tabstopManager)return t;e.completer.goTo("down")},PageUp:function(e){e.completer.popup.gotoPageUp()},PageDown:function(e){e.completer.popup.gotoPageDown()}},this.gatherCompletions=function(e,t){var n=e.getSession(),r=e.getCursorPosition(),i=s.getCompletionPrefix(e);this.base=n.doc.createAnchor(r.row,r.column-i.length),this.base.$insertRight=!0;var o=[],u=e.completers.length;return e.completers.forEach(function(a,f){a.getCompletions(e,n,r,i,function(n,r){!n&&r&&(o=o.concat(r)),t(null,{prefix:s.getCompletionPrefix(e),matches:o,finished:--u===0})})}),!0},this.showPopup=function(e){this.editor&&this.detach(),this.activated=!0,this.editor=e,e.completer!=this&&(e.completer&&e.completer.detach(),e.completer=this),e.on("changeSelection",this.changeListener),e.on("blur",this.blurListener),e.on("mousedown",this.mousedownListener),e.on("mousewheel",this.mousewheelListener),this.updateCompletions()},this.updateCompletions=function(e){if(e&&this.base&&this.completions){var t=this.editor.getCursorPosition(),n=this.editor.session.getTextRange({start:this.base,end:t});if(n==this.completions.filterText)return;this.completions.setFilter(n);if(!this.completions.filtered.length)return this.detach();if(this.completions.filtered.length==1&&this.completions.filtered[0].value==n&&!this.completions.filtered[0].snippet)return this.detach();this.openPopup(this.editor,n,e);return}var r=this.gatherCompletionsId;this.gatherCompletions(this.editor,function(t,n){var i=function(){if(!n.finished)return;return this.detach()}.bind(this),s=n.prefix,o=n&&n.matches;if(!o||!o.length)return i();if(s.indexOf(n.prefix)!==0||r!=this.gatherCompletionsId)return;this.completions=new c(o),this.exactMatch&&(this.completions.exactMatch=!0),this.completions.setFilter(s);var u=this.completions.filtered;if(!u.length)return i();if(u.length==1&&u[0].value==s&&!u[0].snippet)return i();if(this.autoInsert&&u.length==1&&n.finished)return this.insertMatch(u[0]);this.openPopup(this.editor,s,e)}.bind(this))},this.cancelContextMenu=function(){this.editor.$mouseHandler.cancelContextMenu()},this.updateDocTooltip=function(){var e=this.popup,t=e.data,n=t&&(t[e.getHoveredRow()]||t[e.getRow()]),r=null;if(!n||!this.editor||!this.popup.isOpen)return this.hideDocTooltip();this.editor.completers.some(function(e){return e.getDocTooltip&&(r=e.getDocTooltip(n)),r}),r||(r=n),typeof r=="string"&&(r={docText:r});if(!r||!r.docHTML&&!r.docText)return this.hideDocTooltip();this.showDocTooltip(r)},this.showDocTooltip=function(e){this.tooltipNode||(this.tooltipNode=a.createElement("div"),this.tooltipNode.className="ace_tooltip ace_doc-tooltip",this.tooltipNode.style.margin=0,this.tooltipNode.style.pointerEvents="auto",this.tooltipNode.tabIndex=-1,this.tooltipNode.onblur=this.blurListener.bind(this),this.tooltipNode.onclick=this.onTooltipClick.bind(this));var t=this.tooltipNode;e.docHTML?t.innerHTML=e.docHTML:e.docText&&(t.textContent=e.docText),t.parentNode||document.body.appendChild(t);var n=this.popup,r=n.container.getBoundingClientRect();t.style.top=n.container.style.top,t.style.bottom=n.container.style.bottom,window.innerWidth-r.right<320?(t.style.right=window.innerWidth-r.left+"px",t.style.left=""):(t.style.left=r.right+1+"px",t.style.right=""),t.style.display="block"},this.hideDocTooltip=function(){this.tooltipTimer.cancel();if(!this.tooltipNode)return;var e=this.tooltipNode;!this.editor.isFocused()&&document.activeElement==e&&this.editor.focus(),this.tooltipNode=null,e.parentNode&&e.parentNode.removeChild(e)},this.onTooltipClick=function(e){var t=e.target;while(t&&t!=this.tooltipNode){if(t.nodeName=="A"&&t.href){t.rel="noreferrer",t.target="_blank";break}t=t.parentNode}}}).call(l.prototype),l.startCommand={name:"startAutocomplete",exec:function(e){e.completer||(e.completer=new l),e.completer.autoInsert=!1,e.completer.autoSelect=!0,e.completer.showPopup(e),e.completer.cancelContextMenu()},bindKey:"Ctrl-Space|Ctrl-Shift-Space|Alt-Space"};var c=function(e,t){this.all=e,this.filtered=e,this.filterText=t||"",this.exactMatch=!1};(function(){this.setFilter=function(e){if(e.length>this.filterText&&e.lastIndexOf(this.filterText,0)===0)var t=this.filtered;else var t=this.all;this.filterText=e,t=this.filterCompletions(t,this.filterText),t=t.sort(function(e,t){return t.exactMatch-e.exactMatch||t.score-e.score});var n=null;t=t.filter(function(e){var t=e.snippet||e.caption||e.value;return t===n?!1:(n=t,!0)}),this.filtered=t},this.filterCompletions=function(e,t){var n=[],r=t.toUpperCase(),i=t.toLowerCase();e:for(var s=0,o;o=e[s];s++){var u=o.value||o.caption||o.snippet;if(!u)continue;var a=-1,f=0,l=0,c,h;if(this.exactMatch){if(t!==u.substr(0,t.length))continue e}else for(var p=0;p=0?v<0||d0&&(a===-1&&(l+=10),l+=h),f|=1<",o.escapeHTML(e.caption),"","
",o.escapeHTML(e.snippet)].join(""))}},c=[l,a,f];t.setCompleters=function(e){c.length=0,e&&c.push.apply(c,e)},t.addCompleter=function(e){c.push(e)},t.textCompleter=a,t.keyWordCompleter=f,t.snippetCompleter=l;var h={name:"expandSnippet",exec:function(e){return r.expandWithTab(e)},bindKey:"Tab"},p=function(e,t){d(t.session.$mode)},d=function(e){var t=e.$id;r.files||(r.files={}),v(t),e.modes&&e.modes.forEach(d)},v=function(e){if(!e||r.files[e])return;var t=e.replace("mode","snippets");r.files[e]={},s.loadModule(t,function(t){t&&(r.files[e]=t,!t.snippets&&t.snippetText&&(t.snippets=r.parseSnippetFile(t.snippetText)),r.register(t.snippets||[],t.scope),t.includeScopes&&(r.snippetMap[t.scope].includeScopes=t.includeScopes,t.includeScopes.forEach(function(e){v("ace/mode/"+e)})))})},m=function(e){var t=e.editor,n=t.completer&&t.completer.activated;if(e.command.name==="backspace")n&&!u.getCompletionPrefix(t)&&t.completer.detach();else if(e.command.name==="insertstring"){var r=u.getCompletionPrefix(t);r&&!n&&(t.completer||(t.completer=new i),t.completer.autoInsert=!1,t.completer.showPopup(t))}},g=e("../editor").Editor;e("../config").defineOptions(g.prototype,"editor",{enableBasicAutocompletion:{set:function(e){e?(this.completers||(this.completers=Array.isArray(e)?e:c),this.commands.addCommand(i.startCommand)):this.commands.removeCommand(i.startCommand)},value:!1},enableLiveAutocompletion:{set:function(e){e?(this.completers||(this.completers=Array.isArray(e)?e:c),this.commands.on("afterExec",m)):this.commands.removeListener("afterExec",m)},value:!1},enableSnippets:{set:function(e){e?(this.commands.addCommand(h),this.on("changeMode",p),p(null,this)):(this.commands.removeCommand(h),this.off("changeMode",p))},value:!1}})}); + (function() { + ace.require(["ace/ext/language_tools"], function() {}); + })(); + \ No newline at end of file diff --git a/src/UmbracoUrlHandling/Umbraco/lib/ace-builds/src-min-noconflict/ext-searchbox.js b/src/UmbracoUrlHandling/Umbraco/lib/ace-builds/src-min-noconflict/ext-searchbox.js new file mode 100644 index 0000000..3e0eed2 --- /dev/null +++ b/src/UmbracoUrlHandling/Umbraco/lib/ace-builds/src-min-noconflict/ext-searchbox.js @@ -0,0 +1,5 @@ +ace.define("ace/ext/searchbox",["require","exports","module","ace/lib/dom","ace/lib/lang","ace/lib/event","ace/keyboard/hash_handler","ace/lib/keys"],function(e,t,n){"use strict";var r=e("../lib/dom"),i=e("../lib/lang"),s=e("../lib/event"),o='.ace_search {background-color: #ddd;color: #666;border: 1px solid #cbcbcb;border-top: 0 none;overflow: hidden;margin: 0;padding: 4px 6px 0 4px;position: absolute;top: 0;z-index: 99;white-space: normal;}.ace_search.left {border-left: 0 none;border-radius: 0px 0px 5px 0px;left: 0;}.ace_search.right {border-radius: 0px 0px 0px 5px;border-right: 0 none;right: 0;}.ace_search_form, .ace_replace_form {margin: 0 20px 4px 0;overflow: hidden;line-height: 1.9;}.ace_replace_form {margin-right: 0;}.ace_search_form.ace_nomatch {outline: 1px solid red;}.ace_search_field {border-radius: 3px 0 0 3px;background-color: white;color: black;border: 1px solid #cbcbcb;border-right: 0 none;box-sizing: border-box!important;outline: 0;padding: 0;font-size: inherit;margin: 0;line-height: inherit;padding: 0 6px;min-width: 17em;vertical-align: top;}.ace_searchbtn {border: 1px solid #cbcbcb;line-height: inherit;display: inline-block;padding: 0 6px;background: #fff;border-right: 0 none;border-left: 1px solid #dcdcdc;cursor: pointer;margin: 0;position: relative;box-sizing: content-box!important;color: #666;}.ace_searchbtn:last-child {border-radius: 0 3px 3px 0;border-right: 1px solid #cbcbcb;}.ace_searchbtn:disabled {background: none;cursor: default;}.ace_searchbtn:hover {background-color: #eef1f6;}.ace_searchbtn.prev, .ace_searchbtn.next {padding: 0px 0.7em}.ace_searchbtn.prev:after, .ace_searchbtn.next:after {content: "";border: solid 2px #888;width: 0.5em;height: 0.5em;border-width: 2px 0 0 2px;display:inline-block;transform: rotate(-45deg);}.ace_searchbtn.next:after {border-width: 0 2px 2px 0 ;}.ace_searchbtn_close {background: url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAA4AAAAcCAYAAABRVo5BAAAAZ0lEQVR42u2SUQrAMAhDvazn8OjZBilCkYVVxiis8H4CT0VrAJb4WHT3C5xU2a2IQZXJjiQIRMdkEoJ5Q2yMqpfDIo+XY4k6h+YXOyKqTIj5REaxloNAd0xiKmAtsTHqW8sR2W5f7gCu5nWFUpVjZwAAAABJRU5ErkJggg==) no-repeat 50% 0;border-radius: 50%;border: 0 none;color: #656565;cursor: pointer;font: 16px/16px Arial;padding: 0;height: 14px;width: 14px;top: 9px;right: 7px;position: absolute;}.ace_searchbtn_close:hover {background-color: #656565;background-position: 50% 100%;color: white;}.ace_button {margin-left: 2px;cursor: pointer;-webkit-user-select: none;-moz-user-select: none;-o-user-select: none;-ms-user-select: none;user-select: none;overflow: hidden;opacity: 0.7;border: 1px solid rgba(100,100,100,0.23);padding: 1px;box-sizing: border-box!important;color: black;}.ace_button:hover {background-color: #eee;opacity:1;}.ace_button:active {background-color: #ddd;}.ace_button.checked {border-color: #3399ff;opacity:1;}.ace_search_options{margin-bottom: 3px;text-align: right;-webkit-user-select: none;-moz-user-select: none;-o-user-select: none;-ms-user-select: none;user-select: none;clear: both;}.ace_search_counter {float: left;font-family: arial;padding: 0 8px;}',u=e("../keyboard/hash_handler").HashHandler,a=e("../lib/keys"),f=999;r.importCssString(o,"ace_searchbox");var l=''.replace(/> +/g,">"),c=function(e,t,n){var i=r.createElement("div");i.innerHTML=l,this.element=i.firstChild,this.setSession=this.setSession.bind(this),this.$init(),this.setEditor(e)};(function(){this.setEditor=function(e){e.searchBox=this,e.renderer.scroller.appendChild(this.element),this.editor=e},this.setSession=function(e){debugger;this.searchRange=null,this.$syncOptions(!0)},this.$initElements=function(e){this.searchBox=e.querySelector(".ace_search_form"),this.replaceBox=e.querySelector(".ace_replace_form"),this.searchOption=e.querySelector("[action=searchInSelection]"),this.replaceOption=e.querySelector("[action=toggleReplace]"),this.regExpOption=e.querySelector("[action=toggleRegexpMode]"),this.caseSensitiveOption=e.querySelector("[action=toggleCaseSensitive]"),this.wholeWordOption=e.querySelector("[action=toggleWholeWords]"),this.searchInput=this.searchBox.querySelector(".ace_search_field"),this.replaceInput=this.replaceBox.querySelector(".ace_search_field"),this.searchCounter=e.querySelector(".ace_search_counter")},this.$init=function(){var e=this.element;this.$initElements(e);var t=this;s.addListener(e,"mousedown",function(e){setTimeout(function(){t.activeInput.focus()},0),s.stopPropagation(e)}),s.addListener(e,"click",function(e){var n=e.target||e.srcElement,r=n.getAttribute("action");r&&t[r]?t[r]():t.$searchBarKb.commands[r]&&t.$searchBarKb.commands[r].exec(t),s.stopPropagation(e)}),s.addCommandKeyListener(e,function(e,n,r){var i=a.keyCodeToString(r),o=t.$searchBarKb.findKeyCommand(n,i);o&&o.exec&&(o.exec(t),s.stopEvent(e))}),this.$onChange=i.delayedCall(function(){t.find(!1,!1)}),s.addListener(this.searchInput,"input",function(){t.$onChange.schedule(20)}),s.addListener(this.searchInput,"focus",function(){t.activeInput=t.searchInput,t.searchInput.value&&t.highlight()}),s.addListener(this.replaceInput,"focus",function(){t.activeInput=t.replaceInput,t.searchInput.value&&t.highlight()})},this.$closeSearchBarKb=new u([{bindKey:"Esc",name:"closeSearchBar",exec:function(e){e.searchBox.hide()}}]),this.$searchBarKb=new u,this.$searchBarKb.bindKeys({"Ctrl-f|Command-f":function(e){var t=e.isReplace=!e.isReplace;e.replaceBox.style.display=t?"":"none",e.replaceOption.checked=!1,e.$syncOptions(),e.searchInput.focus()},"Ctrl-H|Command-Option-F":function(e){e.replaceOption.checked=!0,e.$syncOptions(),e.replaceInput.focus()},"Ctrl-G|Command-G":function(e){e.findNext()},"Ctrl-Shift-G|Command-Shift-G":function(e){e.findPrev()},esc:function(e){setTimeout(function(){e.hide()})},Return:function(e){e.activeInput==e.replaceInput&&e.replace(),e.findNext()},"Shift-Return":function(e){e.activeInput==e.replaceInput&&e.replace(),e.findPrev()},"Alt-Return":function(e){e.activeInput==e.replaceInput&&e.replaceAll(),e.findAll()},Tab:function(e){(e.activeInput==e.replaceInput?e.searchInput:e.replaceInput).focus()}}),this.$searchBarKb.addCommands([{name:"toggleRegexpMode",bindKey:{win:"Alt-R|Alt-/",mac:"Ctrl-Alt-R|Ctrl-Alt-/"},exec:function(e){e.regExpOption.checked=!e.regExpOption.checked,e.$syncOptions()}},{name:"toggleCaseSensitive",bindKey:{win:"Alt-C|Alt-I",mac:"Ctrl-Alt-R|Ctrl-Alt-I"},exec:function(e){e.caseSensitiveOption.checked=!e.caseSensitiveOption.checked,e.$syncOptions()}},{name:"toggleWholeWords",bindKey:{win:"Alt-B|Alt-W",mac:"Ctrl-Alt-B|Ctrl-Alt-W"},exec:function(e){e.wholeWordOption.checked=!e.wholeWordOption.checked,e.$syncOptions()}},{name:"toggleReplace",exec:function(e){e.replaceOption.checked=!e.replaceOption.checked,e.$syncOptions()}},{name:"searchInSelection",exec:function(e){e.searchOption.checked=!e.searchRange,e.setSearchRange(e.searchOption.checked&&e.editor.getSelectionRange()),e.$syncOptions()}}]),this.setSearchRange=function(e){this.searchRange=e,e?this.searchRangeMarker=this.editor.session.addMarker(e,"ace_active-line"):this.searchRangeMarker&&(this.editor.session.removeMarker(this.searchRangeMarker),this.searchRangeMarker=null)},this.$syncOptions=function(e){r.setCssClass(this.replaceOption,"checked",this.searchRange),r.setCssClass(this.searchOption,"checked",this.searchOption.checked),this.replaceOption.textContent=this.replaceOption.checked?"-":"+",r.setCssClass(this.regExpOption,"checked",this.regExpOption.checked),r.setCssClass(this.wholeWordOption,"checked",this.wholeWordOption.checked),r.setCssClass(this.caseSensitiveOption,"checked",this.caseSensitiveOption.checked),this.replaceBox.style.display=this.replaceOption.checked?"":"none",this.find(!1,!1,e)},this.highlight=function(e){this.editor.session.highlight(e||this.editor.$search.$options.re),this.editor.renderer.updateBackMarkers()},this.find=function(e,t,n){var i=this.editor.find(this.searchInput.value,{skipCurrent:e,backwards:t,wrap:!0,regExp:this.regExpOption.checked,caseSensitive:this.caseSensitiveOption.checked,wholeWord:this.wholeWordOption.checked,preventScroll:n,range:this.searchRange}),s=!i&&this.searchInput.value;r.setCssClass(this.searchBox,"ace_nomatch",s),this.editor._emit("findSearchBox",{match:!s}),this.highlight(),this.updateCounter()},this.updateCounter=function(){var e=this.editor,t=e.$search.$options.re,n=0,r=0;if(t){var i=this.searchRange?e.session.getTextRange(this.searchRange):e.getValue(),s=e.session.doc.positionToIndex(e.selection.anchor);this.searchRange&&(s-=e.session.doc.positionToIndex(this.searchRange.start));var o=t.lastIndex=0,u;while(u=t.exec(i)){n++,o=u.index,o<=s&&r++;if(n>f)break;if(!u[0]){t.lastIndex=o+=1;if(o>=i.length)break}}}this.searchCounter.textContent=r+" of "+(n>f?f+"+":n)},this.findNext=function(){this.find(!0,!1)},this.findPrev=function(){this.find(!0,!0)},this.findAll=function(){var e=this.editor.findAll(this.searchInput.value,{regExp:this.regExpOption.checked,caseSensitive:this.caseSensitiveOption.checked,wholeWord:this.wholeWordOption.checked}),t=!e&&this.searchInput.value;r.setCssClass(this.searchBox,"ace_nomatch",t),this.editor._emit("findSearchBox",{match:!t}),this.highlight(),this.hide()},this.replace=function(){this.editor.getReadOnly()||this.editor.replace(this.replaceInput.value)},this.replaceAndFindNext=function(){this.editor.getReadOnly()||(this.editor.replace(this.replaceInput.value),this.findNext())},this.replaceAll=function(){this.editor.getReadOnly()||this.editor.replaceAll(this.replaceInput.value)},this.hide=function(){this.active=!1,this.setSearchRange(null),this.editor.off("changeSession",this.setSession),this.element.style.display="none",this.editor.keyBinding.removeKeyboardHandler(this.$closeSearchBarKb),this.editor.focus()},this.show=function(e,t){this.active=!0,this.editor.on("changeSession",this.setSession),this.element.style.display="",this.replaceOption.checked=t,e&&(this.searchInput.value=e),this.searchInput.focus(),this.searchInput.select(),this.editor.keyBinding.addKeyboardHandler(this.$closeSearchBarKb),this.$syncOptions(!0)},this.isFocused=function(){var e=document.activeElement;return e==this.searchInput||e==this.replaceInput}}).call(c.prototype),t.SearchBox=c,t.Search=function(e,t){var n=e.searchBox||new c(e);n.show(e.session.getTextRange(),t)}}); + (function() { + ace.require(["ace/ext/searchbox"], function() {}); + })(); + \ No newline at end of file diff --git a/src/UmbracoUrlHandling/Umbraco/lib/ace-builds/src-min-noconflict/ext-settings_menu.js b/src/UmbracoUrlHandling/Umbraco/lib/ace-builds/src-min-noconflict/ext-settings_menu.js new file mode 100644 index 0000000..8aa6539 --- /dev/null +++ b/src/UmbracoUrlHandling/Umbraco/lib/ace-builds/src-min-noconflict/ext-settings_menu.js @@ -0,0 +1,5 @@ +ace.define("ace/ext/menu_tools/element_generator",["require","exports","module"],function(e,t,n){"use strict";n.exports.createOption=function(t){var n,r=document.createElement("option");for(n in t)t.hasOwnProperty(n)&&(n==="selected"?r.setAttribute(n,t[n]):r[n]=t[n]);return r},n.exports.createCheckbox=function(t,n,r){var i=document.createElement("input");return i.setAttribute("type","checkbox"),i.setAttribute("id",t),i.setAttribute("name",t),i.setAttribute("value",n),i.setAttribute("class",r),n&&i.setAttribute("checked","checked"),i},n.exports.createInput=function(t,n,r){var i=document.createElement("input");return i.setAttribute("type","text"),i.setAttribute("id",t),i.setAttribute("name",t),i.setAttribute("value",n),i.setAttribute("class",r),i},n.exports.createLabel=function(t,n){var r=document.createElement("label");return r.setAttribute("for",n),r.textContent=t,r},n.exports.createSelection=function(t,r,i){var s=document.createElement("select");return s.setAttribute("id",t),s.setAttribute("name",t),s.setAttribute("class",i),r.forEach(function(e){s.appendChild(n.exports.createOption(e))}),s}}),ace.define("ace/ext/modelist",["require","exports","module"],function(e,t,n){"use strict";function i(e){var t=a.text,n=e.split(/[\/\\]/).pop();for(var i=0;i",onMatch:function(e,t,n){return t==n[0]&&n.shift(),e.length==2&&(n[0]==this.nextState&&n[1]--,(!n[1]||n[1]<0)&&n.splice(0,2)),this.next=n[0]||"start",[{type:this.token,value:e}]},nextState:"jsx"},n,f("jsxAttributes"),{token:"entity.other.attribute-name.xml",regex:e},{token:"keyword.operator.attribute-equals.xml",regex:"="},{token:"text.tag-whitespace.xml",regex:"\\s+"},{token:"string.attribute-value.xml",regex:"'",stateName:"jsx_attr_q",push:[{token:"string.attribute-value.xml",regex:"'",next:"pop"},{include:"reference"},{defaultToken:"string.attribute-value.xml"}]},{token:"string.attribute-value.xml",regex:'"',stateName:"jsx_attr_qq",push:[{token:"string.attribute-value.xml",regex:'"',next:"pop"},{include:"reference"},{defaultToken:"string.attribute-value.xml"}]},t],this.$rules.reference=[{token:"constant.language.escape.reference.xml",regex:"(?:&#[0-9]+;)|(?:&#x[0-9a-fA-F]+;)|(?:&[a-zA-Z0-9_:\\.-]+;)"}]}function f(e){return[{token:"comment",regex:/\/\*/,next:[i.getTagRule(),{token:"comment",regex:"\\*\\/",next:e||"pop"},{defaultToken:"comment",caseInsensitive:!0}]},{token:"comment",regex:"\\/\\/",next:[i.getTagRule(),{token:"comment",regex:"$|^",next:e||"pop"},{defaultToken:"comment",caseInsensitive:!0}]}]}var r=e("../lib/oop"),i=e("./doc_comment_highlight_rules").DocCommentHighlightRules,s=e("./text_highlight_rules").TextHighlightRules,o="[a-zA-Z\\$_\u00a1-\uffff][a-zA-Z\\d\\$_\u00a1-\uffff]*",u=function(e){var t=this.createKeywordMapper({"variable.language":"Array|Boolean|Date|Function|Iterator|Number|Object|RegExp|String|Proxy|Namespace|QName|XML|XMLList|ArrayBuffer|Float32Array|Float64Array|Int16Array|Int32Array|Int8Array|Uint16Array|Uint32Array|Uint8Array|Uint8ClampedArray|Error|EvalError|InternalError|RangeError|ReferenceError|StopIteration|SyntaxError|TypeError|URIError|decodeURI|decodeURIComponent|encodeURI|encodeURIComponent|eval|isFinite|isNaN|parseFloat|parseInt|JSON|Math|this|arguments|prototype|window|document",keyword:"const|yield|import|get|set|async|await|break|case|catch|continue|default|delete|do|else|finally|for|function|if|in|of|instanceof|new|return|switch|throw|try|typeof|let|var|while|with|debugger|__parent__|__count__|escape|unescape|with|__proto__|class|enum|extends|super|export|implements|private|public|interface|package|protected|static","storage.type":"const|let|var|function","constant.language":"null|Infinity|NaN|undefined","support.function":"alert","constant.language.boolean":"true|false"},"identifier"),n="case|do|else|finally|in|instanceof|return|throw|try|typeof|yield|void",r="\\\\(?:x[0-9a-fA-F]{2}|u[0-9a-fA-F]{4}|u{[0-9a-fA-F]{1,6}}|[0-2][0-7]{0,2}|3[0-7][0-7]?|[4-7][0-7]?|.)";this.$rules={no_regex:[i.getStartRule("doc-start"),f("no_regex"),{token:"string",regex:"'(?=.)",next:"qstring"},{token:"string",regex:'"(?=.)',next:"qqstring"},{token:"constant.numeric",regex:/0(?:[xX][0-9a-fA-F]+|[oO][0-7]+|[bB][01]+)\b/},{token:"constant.numeric",regex:/(?:\d\d*(?:\.\d*)?|\.\d+)(?:[eE][+-]?\d+\b)?/},{token:["storage.type","punctuation.operator","support.function","punctuation.operator","entity.name.function","text","keyword.operator"],regex:"("+o+")(\\.)(prototype)(\\.)("+o+")(\\s*)(=)",next:"function_arguments"},{token:["storage.type","punctuation.operator","entity.name.function","text","keyword.operator","text","storage.type","text","paren.lparen"],regex:"("+o+")(\\.)("+o+")(\\s*)(=)(\\s*)(function)(\\s*)(\\()",next:"function_arguments"},{token:["entity.name.function","text","keyword.operator","text","storage.type","text","paren.lparen"],regex:"("+o+")(\\s*)(=)(\\s*)(function)(\\s*)(\\()",next:"function_arguments"},{token:["storage.type","punctuation.operator","entity.name.function","text","keyword.operator","text","storage.type","text","entity.name.function","text","paren.lparen"],regex:"("+o+")(\\.)("+o+")(\\s*)(=)(\\s*)(function)(\\s+)(\\w+)(\\s*)(\\()",next:"function_arguments"},{token:["storage.type","text","entity.name.function","text","paren.lparen"],regex:"(function)(\\s+)("+o+")(\\s*)(\\()",next:"function_arguments"},{token:["entity.name.function","text","punctuation.operator","text","storage.type","text","paren.lparen"],regex:"("+o+")(\\s*)(:)(\\s*)(function)(\\s*)(\\()",next:"function_arguments"},{token:["text","text","storage.type","text","paren.lparen"],regex:"(:)(\\s*)(function)(\\s*)(\\()",next:"function_arguments"},{token:"keyword",regex:"from(?=\\s*('|\"))"},{token:"keyword",regex:"(?:"+n+")\\b",next:"start"},{token:["support.constant"],regex:/that\b/},{token:["storage.type","punctuation.operator","support.function.firebug"],regex:/(console)(\.)(warn|info|log|error|time|trace|timeEnd|assert)\b/},{token:t,regex:o},{token:"punctuation.operator",regex:/[.](?![.])/,next:"property"},{token:"storage.type",regex:/=>/},{token:"keyword.operator",regex:/--|\+\+|\.{3}|===|==|=|!=|!==|<+=?|>+=?|!|&&|\|\||\?:|[!$%&*+\-~\/^]=?/,next:"start"},{token:"punctuation.operator",regex:/[?:,;.]/,next:"start"},{token:"paren.lparen",regex:/[\[({]/,next:"start"},{token:"paren.rparen",regex:/[\])}]/},{token:"comment",regex:/^#!.*$/}],property:[{token:"text",regex:"\\s+"},{token:["storage.type","punctuation.operator","entity.name.function","text","keyword.operator","text","storage.type","text","entity.name.function","text","paren.lparen"],regex:"("+o+")(\\.)("+o+")(\\s*)(=)(\\s*)(function)(?:(\\s+)(\\w+))?(\\s*)(\\()",next:"function_arguments"},{token:"punctuation.operator",regex:/[.](?![.])/},{token:"support.function",regex:/(s(?:h(?:ift|ow(?:Mod(?:elessDialog|alDialog)|Help))|croll(?:X|By(?:Pages|Lines)?|Y|To)?|t(?:op|rike)|i(?:n|zeToContent|debar|gnText)|ort|u(?:p|b(?:str(?:ing)?)?)|pli(?:ce|t)|e(?:nd|t(?:Re(?:sizable|questHeader)|M(?:i(?:nutes|lliseconds)|onth)|Seconds|Ho(?:tKeys|urs)|Year|Cursor|Time(?:out)?|Interval|ZOptions|Date|UTC(?:M(?:i(?:nutes|lliseconds)|onth)|Seconds|Hours|Date|FullYear)|FullYear|Active)|arch)|qrt|lice|avePreferences|mall)|h(?:ome|andleEvent)|navigate|c(?:har(?:CodeAt|At)|o(?:s|n(?:cat|textual|firm)|mpile)|eil|lear(?:Timeout|Interval)?|a(?:ptureEvents|ll)|reate(?:StyleSheet|Popup|EventObject))|t(?:o(?:GMTString|S(?:tring|ource)|U(?:TCString|pperCase)|Lo(?:caleString|werCase))|est|a(?:n|int(?:Enabled)?))|i(?:s(?:NaN|Finite)|ndexOf|talics)|d(?:isableExternalCapture|ump|etachEvent)|u(?:n(?:shift|taint|escape|watch)|pdateCommands)|j(?:oin|avaEnabled)|p(?:o(?:p|w)|ush|lugins.refresh|a(?:ddings|rse(?:Int|Float)?)|r(?:int|ompt|eference))|e(?:scape|nableExternalCapture|val|lementFromPoint|x(?:p|ec(?:Script|Command)?))|valueOf|UTC|queryCommand(?:State|Indeterm|Enabled|Value)|f(?:i(?:nd|le(?:ModifiedDate|Size|CreatedDate|UpdatedDate)|xed)|o(?:nt(?:size|color)|rward)|loor|romCharCode)|watch|l(?:ink|o(?:ad|g)|astIndexOf)|a(?:sin|nchor|cos|t(?:tachEvent|ob|an(?:2)?)|pply|lert|b(?:s|ort))|r(?:ou(?:nd|teEvents)|e(?:size(?:By|To)|calc|turnValue|place|verse|l(?:oad|ease(?:Capture|Events)))|andom)|g(?:o|et(?:ResponseHeader|M(?:i(?:nutes|lliseconds)|onth)|Se(?:conds|lection)|Hours|Year|Time(?:zoneOffset)?|Da(?:y|te)|UTC(?:M(?:i(?:nutes|lliseconds)|onth)|Seconds|Hours|Da(?:y|te)|FullYear)|FullYear|A(?:ttention|llResponseHeaders)))|m(?:in|ove(?:B(?:y|elow)|To(?:Absolute)?|Above)|ergeAttributes|a(?:tch|rgins|x))|b(?:toa|ig|o(?:ld|rderWidths)|link|ack))\b(?=\()/},{token:"support.function.dom",regex:/(s(?:ub(?:stringData|mit)|plitText|e(?:t(?:NamedItem|Attribute(?:Node)?)|lect))|has(?:ChildNodes|Feature)|namedItem|c(?:l(?:ick|o(?:se|neNode))|reate(?:C(?:omment|DATASection|aption)|T(?:Head|extNode|Foot)|DocumentFragment|ProcessingInstruction|E(?:ntityReference|lement)|Attribute))|tabIndex|i(?:nsert(?:Row|Before|Cell|Data)|tem)|open|delete(?:Row|C(?:ell|aption)|T(?:Head|Foot)|Data)|focus|write(?:ln)?|a(?:dd|ppend(?:Child|Data))|re(?:set|place(?:Child|Data)|move(?:NamedItem|Child|Attribute(?:Node)?)?)|get(?:NamedItem|Element(?:sBy(?:Name|TagName|ClassName)|ById)|Attribute(?:Node)?)|blur)\b(?=\()/},{token:"support.constant",regex:/(s(?:ystemLanguage|cr(?:ipts|ollbars|een(?:X|Y|Top|Left))|t(?:yle(?:Sheets)?|atus(?:Text|bar)?)|ibling(?:Below|Above)|ource|uffixes|e(?:curity(?:Policy)?|l(?:ection|f)))|h(?:istory|ost(?:name)?|as(?:h|Focus))|y|X(?:MLDocument|SLDocument)|n(?:ext|ame(?:space(?:s|URI)|Prop))|M(?:IN_VALUE|AX_VALUE)|c(?:haracterSet|o(?:n(?:structor|trollers)|okieEnabled|lorDepth|mp(?:onents|lete))|urrent|puClass|l(?:i(?:p(?:boardData)?|entInformation)|osed|asses)|alle(?:e|r)|rypto)|t(?:o(?:olbar|p)|ext(?:Transform|Indent|Decoration|Align)|ags)|SQRT(?:1_2|2)|i(?:n(?:ner(?:Height|Width)|put)|ds|gnoreCase)|zIndex|o(?:scpu|n(?:readystatechange|Line)|uter(?:Height|Width)|p(?:sProfile|ener)|ffscreenBuffering)|NEGATIVE_INFINITY|d(?:i(?:splay|alog(?:Height|Top|Width|Left|Arguments)|rectories)|e(?:scription|fault(?:Status|Ch(?:ecked|arset)|View)))|u(?:ser(?:Profile|Language|Agent)|n(?:iqueID|defined)|pdateInterval)|_content|p(?:ixelDepth|ort|ersonalbar|kcs11|l(?:ugins|atform)|a(?:thname|dding(?:Right|Bottom|Top|Left)|rent(?:Window|Layer)?|ge(?:X(?:Offset)?|Y(?:Offset)?))|r(?:o(?:to(?:col|type)|duct(?:Sub)?|mpter)|e(?:vious|fix)))|e(?:n(?:coding|abledPlugin)|x(?:ternal|pando)|mbeds)|v(?:isibility|endor(?:Sub)?|Linkcolor)|URLUnencoded|P(?:I|OSITIVE_INFINITY)|f(?:ilename|o(?:nt(?:Size|Family|Weight)|rmName)|rame(?:s|Element)|gColor)|E|whiteSpace|l(?:i(?:stStyleType|n(?:eHeight|kColor))|o(?:ca(?:tion(?:bar)?|lName)|wsrc)|e(?:ngth|ft(?:Context)?)|a(?:st(?:M(?:odified|atch)|Index|Paren)|yer(?:s|X)|nguage))|a(?:pp(?:MinorVersion|Name|Co(?:deName|re)|Version)|vail(?:Height|Top|Width|Left)|ll|r(?:ity|guments)|Linkcolor|bove)|r(?:ight(?:Context)?|e(?:sponse(?:XML|Text)|adyState))|global|x|m(?:imeTypes|ultiline|enubar|argin(?:Right|Bottom|Top|Left))|L(?:N(?:10|2)|OG(?:10E|2E))|b(?:o(?:ttom|rder(?:Width|RightWidth|BottomWidth|Style|Color|TopWidth|LeftWidth))|ufferDepth|elow|ackground(?:Color|Image)))\b/},{token:"identifier",regex:o},{regex:"",token:"empty",next:"no_regex"}],start:[i.getStartRule("doc-start"),f("start"),{token:"string.regexp",regex:"\\/",next:"regex"},{token:"text",regex:"\\s+|^$",next:"start"},{token:"empty",regex:"",next:"no_regex"}],regex:[{token:"regexp.keyword.operator",regex:"\\\\(?:u[\\da-fA-F]{4}|x[\\da-fA-F]{2}|.)"},{token:"string.regexp",regex:"/[sxngimy]*",next:"no_regex"},{token:"invalid",regex:/\{\d+\b,?\d*\}[+*]|[+*$^?][+*]|[$^][?]|\?{3,}/},{token:"constant.language.escape",regex:/\(\?[:=!]|\)|\{\d+\b,?\d*\}|[+*]\?|[()$^+*?.]/},{token:"constant.language.delimiter",regex:/\|/},{token:"constant.language.escape",regex:/\[\^?/,next:"regex_character_class"},{token:"empty",regex:"$",next:"no_regex"},{defaultToken:"string.regexp"}],regex_character_class:[{token:"regexp.charclass.keyword.operator",regex:"\\\\(?:u[\\da-fA-F]{4}|x[\\da-fA-F]{2}|.)"},{token:"constant.language.escape",regex:"]",next:"regex"},{token:"constant.language.escape",regex:"-"},{token:"empty",regex:"$",next:"no_regex"},{defaultToken:"string.regexp.charachterclass"}],function_arguments:[{token:"variable.parameter",regex:o},{token:"punctuation.operator",regex:"[, ]+"},{token:"punctuation.operator",regex:"$"},{token:"empty",regex:"",next:"no_regex"}],qqstring:[{token:"constant.language.escape",regex:r},{token:"string",regex:"\\\\$",consumeLineEnd:!0},{token:"string",regex:'"|$',next:"no_regex"},{defaultToken:"string"}],qstring:[{token:"constant.language.escape",regex:r},{token:"string",regex:"\\\\$",consumeLineEnd:!0},{token:"string",regex:"'|$",next:"no_regex"},{defaultToken:"string"}]};if(!e||!e.noES6)this.$rules.no_regex.unshift({regex:"[{}]",onMatch:function(e,t,n){this.next=e=="{"?this.nextState:"";if(e=="{"&&n.length)n.unshift("start",t);else if(e=="}"&&n.length){n.shift(),this.next=n.shift();if(this.next.indexOf("string")!=-1||this.next.indexOf("jsx")!=-1)return"paren.quasi.end"}return e=="{"?"paren.lparen":"paren.rparen"},nextState:"start"},{token:"string.quasi.start",regex:/`/,push:[{token:"constant.language.escape",regex:r},{token:"paren.quasi.start",regex:/\${/,push:"start"},{token:"string.quasi.end",regex:/`/,next:"pop"},{defaultToken:"string.quasi"}]}),(!e||e.jsx!=0)&&a.call(this);this.embedRules(i,"doc-",[i.getEndRule("no_regex")]),this.normalizeRules()};r.inherits(u,s),t.JavaScriptHighlightRules=u}),ace.define("ace/mode/matching_brace_outdent",["require","exports","module","ace/range"],function(e,t,n){"use strict";var r=e("../range").Range,i=function(){};(function(){this.checkOutdent=function(e,t){return/^\s+$/.test(e)?/^\s*\}/.test(t):!1},this.autoOutdent=function(e,t){var n=e.getLine(t),i=n.match(/^(\s*\})/);if(!i)return 0;var s=i[1].length,o=e.findMatchingBracket({row:t,column:s});if(!o||o.row==t)return 0;var u=this.$getIndent(e.getLine(o.row));e.replace(new r(t,0,t,s-1),u)},this.$getIndent=function(e){return e.match(/^\s*/)[0]}}).call(i.prototype),t.MatchingBraceOutdent=i}),ace.define("ace/mode/folding/cstyle",["require","exports","module","ace/lib/oop","ace/range","ace/mode/folding/fold_mode"],function(e,t,n){"use strict";var r=e("../../lib/oop"),i=e("../../range").Range,s=e("./fold_mode").FoldMode,o=t.FoldMode=function(e){e&&(this.foldingStartMarker=new RegExp(this.foldingStartMarker.source.replace(/\|[^|]*?$/,"|"+e.start)),this.foldingStopMarker=new RegExp(this.foldingStopMarker.source.replace(/\|[^|]*?$/,"|"+e.end)))};r.inherits(o,s),function(){this.foldingStartMarker=/(\{|\[)[^\}\]]*$|^\s*(\/\*)/,this.foldingStopMarker=/^[^\[\{]*(\}|\])|^[\s\*]*(\*\/)/,this.singleLineBlockCommentRe=/^\s*(\/\*).*\*\/\s*$/,this.tripleStarBlockCommentRe=/^\s*(\/\*\*\*).*\*\/\s*$/,this.startRegionRe=/^\s*(\/\*|\/\/)#?region\b/,this._getFoldWidgetBase=this.getFoldWidget,this.getFoldWidget=function(e,t,n){var r=e.getLine(n);if(this.singleLineBlockCommentRe.test(r)&&!this.startRegionRe.test(r)&&!this.tripleStarBlockCommentRe.test(r))return"";var i=this._getFoldWidgetBase(e,t,n);return!i&&this.startRegionRe.test(r)?"start":i},this.getFoldWidgetRange=function(e,t,n,r){var i=e.getLine(n);if(this.startRegionRe.test(i))return this.getCommentRegionBlock(e,i,n);var s=i.match(this.foldingStartMarker);if(s){var o=s.index;if(s[1])return this.openingBracketBlock(e,s[1],n,o);var u=e.getCommentFoldRange(n,o+s[0].length,1);return u&&!u.isMultiLine()&&(r?u=this.getSectionRange(e,n):t!="all"&&(u=null)),u}if(t==="markbegin")return;var s=i.match(this.foldingStopMarker);if(s){var o=s.index+s[0].length;return s[1]?this.closingBracketBlock(e,s[1],n,o):e.getCommentFoldRange(n,o,-1)}},this.getSectionRange=function(e,t){var n=e.getLine(t),r=n.search(/\S/),s=t,o=n.length;t+=1;var u=t,a=e.getLength();while(++tf)break;var l=this.getFoldWidgetRange(e,"all",t);if(l){if(l.start.row<=s)break;if(l.isMultiLine())t=l.end.row;else if(r==f)break}u=t}return new i(s,o,u,e.getLine(u).length)},this.getCommentRegionBlock=function(e,t,n){var r=t.search(/\s*$/),s=e.getLength(),o=n,u=/^\s*(?:\/\*|\/\/|--)#?(end)?region\b/,a=1;while(++no)return new i(o,r,l,t.length)}}.call(o.prototype)}),ace.define("ace/mode/javascript",["require","exports","module","ace/lib/oop","ace/mode/text","ace/mode/javascript_highlight_rules","ace/mode/matching_brace_outdent","ace/worker/worker_client","ace/mode/behaviour/cstyle","ace/mode/folding/cstyle"],function(e,t,n){"use strict";var r=e("../lib/oop"),i=e("./text").Mode,s=e("./javascript_highlight_rules").JavaScriptHighlightRules,o=e("./matching_brace_outdent").MatchingBraceOutdent,u=e("../worker/worker_client").WorkerClient,a=e("./behaviour/cstyle").CstyleBehaviour,f=e("./folding/cstyle").FoldMode,l=function(){this.HighlightRules=s,this.$outdent=new o,this.$behaviour=new a,this.foldingRules=new f};r.inherits(l,i),function(){this.lineCommentStart="//",this.blockComment={start:"/*",end:"*/"},this.$quotes={'"':'"',"'":"'","`":"`"},this.getNextLineIndent=function(e,t,n){var r=this.$getIndent(t),i=this.getTokenizer().getLineTokens(t,e),s=i.tokens,o=i.state;if(s.length&&s[s.length-1].type=="comment")return r;if(e=="start"||e=="no_regex"){var u=t.match(/^.*(?:\bcase\b.*:|[\{\(\[])\s*$/);u&&(r+=n)}else if(e=="doc-start"){if(o=="start"||o=="no_regex")return"";var u=t.match(/^\s*(\/?)\*/);u&&(u[1]&&(r+=" "),r+="* ")}return r},this.checkOutdent=function(e,t,n){return this.$outdent.checkOutdent(t,n)},this.autoOutdent=function(e,t,n){this.$outdent.autoOutdent(t,n)},this.createWorker=function(e){var t=new u(["ace"],"ace/mode/javascript_worker","JavaScriptWorker");return t.attachToDocument(e.getDocument()),t.on("annotate",function(t){e.setAnnotations(t.data)}),t.on("terminate",function(){e.clearAnnotations()}),t},this.$id="ace/mode/javascript"}.call(l.prototype),t.Mode=l}) \ No newline at end of file diff --git a/src/UmbracoUrlHandling/Umbraco/lib/ace-builds/src-min-noconflict/mode-razor.js b/src/UmbracoUrlHandling/Umbraco/lib/ace-builds/src-min-noconflict/mode-razor.js new file mode 100644 index 0000000..9dfc264 --- /dev/null +++ b/src/UmbracoUrlHandling/Umbraco/lib/ace-builds/src-min-noconflict/mode-razor.js @@ -0,0 +1 @@ +ace.define("ace/mode/doc_comment_highlight_rules",["require","exports","module","ace/lib/oop","ace/mode/text_highlight_rules"],function(e,t,n){"use strict";var r=e("../lib/oop"),i=e("./text_highlight_rules").TextHighlightRules,s=function(){this.$rules={start:[{token:"comment.doc.tag",regex:"@[\\w\\d_]+"},s.getTagRule(),{defaultToken:"comment.doc",caseInsensitive:!0}]}};r.inherits(s,i),s.getTagRule=function(e){return{token:"comment.doc.tag.storage.type",regex:"\\b(?:TODO|FIXME|XXX|HACK)\\b"}},s.getStartRule=function(e){return{token:"comment.doc",regex:"\\/\\*(?=\\*)",next:e}},s.getEndRule=function(e){return{token:"comment.doc",regex:"\\*\\/",next:e}},t.DocCommentHighlightRules=s}),ace.define("ace/mode/javascript_highlight_rules",["require","exports","module","ace/lib/oop","ace/mode/doc_comment_highlight_rules","ace/mode/text_highlight_rules"],function(e,t,n){"use strict";function a(){var e=o.replace("\\d","\\d\\-"),t={onMatch:function(e,t,n){var r=e.charAt(1)=="/"?2:1;if(r==1)t!=this.nextState?n.unshift(this.next,this.nextState,0):n.unshift(this.next),n[2]++;else if(r==2&&t==this.nextState){n[1]--;if(!n[1]||n[1]<0)n.shift(),n.shift()}return[{type:"meta.tag.punctuation."+(r==1?"":"end-")+"tag-open.xml",value:e.slice(0,r)},{type:"meta.tag.tag-name.xml",value:e.substr(r)}]},regex:"",onMatch:function(e,t,n){return t==n[0]&&n.shift(),e.length==2&&(n[0]==this.nextState&&n[1]--,(!n[1]||n[1]<0)&&n.splice(0,2)),this.next=n[0]||"start",[{type:this.token,value:e}]},nextState:"jsx"},n,f("jsxAttributes"),{token:"entity.other.attribute-name.xml",regex:e},{token:"keyword.operator.attribute-equals.xml",regex:"="},{token:"text.tag-whitespace.xml",regex:"\\s+"},{token:"string.attribute-value.xml",regex:"'",stateName:"jsx_attr_q",push:[{token:"string.attribute-value.xml",regex:"'",next:"pop"},{include:"reference"},{defaultToken:"string.attribute-value.xml"}]},{token:"string.attribute-value.xml",regex:'"',stateName:"jsx_attr_qq",push:[{token:"string.attribute-value.xml",regex:'"',next:"pop"},{include:"reference"},{defaultToken:"string.attribute-value.xml"}]},t],this.$rules.reference=[{token:"constant.language.escape.reference.xml",regex:"(?:&#[0-9]+;)|(?:&#x[0-9a-fA-F]+;)|(?:&[a-zA-Z0-9_:\\.-]+;)"}]}function f(e){return[{token:"comment",regex:/\/\*/,next:[i.getTagRule(),{token:"comment",regex:"\\*\\/",next:e||"pop"},{defaultToken:"comment",caseInsensitive:!0}]},{token:"comment",regex:"\\/\\/",next:[i.getTagRule(),{token:"comment",regex:"$|^",next:e||"pop"},{defaultToken:"comment",caseInsensitive:!0}]}]}var r=e("../lib/oop"),i=e("./doc_comment_highlight_rules").DocCommentHighlightRules,s=e("./text_highlight_rules").TextHighlightRules,o="[a-zA-Z\\$_\u00a1-\uffff][a-zA-Z\\d\\$_\u00a1-\uffff]*",u=function(e){var t=this.createKeywordMapper({"variable.language":"Array|Boolean|Date|Function|Iterator|Number|Object|RegExp|String|Proxy|Namespace|QName|XML|XMLList|ArrayBuffer|Float32Array|Float64Array|Int16Array|Int32Array|Int8Array|Uint16Array|Uint32Array|Uint8Array|Uint8ClampedArray|Error|EvalError|InternalError|RangeError|ReferenceError|StopIteration|SyntaxError|TypeError|URIError|decodeURI|decodeURIComponent|encodeURI|encodeURIComponent|eval|isFinite|isNaN|parseFloat|parseInt|JSON|Math|this|arguments|prototype|window|document",keyword:"const|yield|import|get|set|async|await|break|case|catch|continue|default|delete|do|else|finally|for|function|if|in|of|instanceof|new|return|switch|throw|try|typeof|let|var|while|with|debugger|__parent__|__count__|escape|unescape|with|__proto__|class|enum|extends|super|export|implements|private|public|interface|package|protected|static","storage.type":"const|let|var|function","constant.language":"null|Infinity|NaN|undefined","support.function":"alert","constant.language.boolean":"true|false"},"identifier"),n="case|do|else|finally|in|instanceof|return|throw|try|typeof|yield|void",r="\\\\(?:x[0-9a-fA-F]{2}|u[0-9a-fA-F]{4}|u{[0-9a-fA-F]{1,6}}|[0-2][0-7]{0,2}|3[0-7][0-7]?|[4-7][0-7]?|.)";this.$rules={no_regex:[i.getStartRule("doc-start"),f("no_regex"),{token:"string",regex:"'(?=.)",next:"qstring"},{token:"string",regex:'"(?=.)',next:"qqstring"},{token:"constant.numeric",regex:/0(?:[xX][0-9a-fA-F]+|[oO][0-7]+|[bB][01]+)\b/},{token:"constant.numeric",regex:/(?:\d\d*(?:\.\d*)?|\.\d+)(?:[eE][+-]?\d+\b)?/},{token:["storage.type","punctuation.operator","support.function","punctuation.operator","entity.name.function","text","keyword.operator"],regex:"("+o+")(\\.)(prototype)(\\.)("+o+")(\\s*)(=)",next:"function_arguments"},{token:["storage.type","punctuation.operator","entity.name.function","text","keyword.operator","text","storage.type","text","paren.lparen"],regex:"("+o+")(\\.)("+o+")(\\s*)(=)(\\s*)(function)(\\s*)(\\()",next:"function_arguments"},{token:["entity.name.function","text","keyword.operator","text","storage.type","text","paren.lparen"],regex:"("+o+")(\\s*)(=)(\\s*)(function)(\\s*)(\\()",next:"function_arguments"},{token:["storage.type","punctuation.operator","entity.name.function","text","keyword.operator","text","storage.type","text","entity.name.function","text","paren.lparen"],regex:"("+o+")(\\.)("+o+")(\\s*)(=)(\\s*)(function)(\\s+)(\\w+)(\\s*)(\\()",next:"function_arguments"},{token:["storage.type","text","entity.name.function","text","paren.lparen"],regex:"(function)(\\s+)("+o+")(\\s*)(\\()",next:"function_arguments"},{token:["entity.name.function","text","punctuation.operator","text","storage.type","text","paren.lparen"],regex:"("+o+")(\\s*)(:)(\\s*)(function)(\\s*)(\\()",next:"function_arguments"},{token:["text","text","storage.type","text","paren.lparen"],regex:"(:)(\\s*)(function)(\\s*)(\\()",next:"function_arguments"},{token:"keyword",regex:"from(?=\\s*('|\"))"},{token:"keyword",regex:"(?:"+n+")\\b",next:"start"},{token:["support.constant"],regex:/that\b/},{token:["storage.type","punctuation.operator","support.function.firebug"],regex:/(console)(\.)(warn|info|log|error|time|trace|timeEnd|assert)\b/},{token:t,regex:o},{token:"punctuation.operator",regex:/[.](?![.])/,next:"property"},{token:"storage.type",regex:/=>/},{token:"keyword.operator",regex:/--|\+\+|\.{3}|===|==|=|!=|!==|<+=?|>+=?|!|&&|\|\||\?:|[!$%&*+\-~\/^]=?/,next:"start"},{token:"punctuation.operator",regex:/[?:,;.]/,next:"start"},{token:"paren.lparen",regex:/[\[({]/,next:"start"},{token:"paren.rparen",regex:/[\])}]/},{token:"comment",regex:/^#!.*$/}],property:[{token:"text",regex:"\\s+"},{token:["storage.type","punctuation.operator","entity.name.function","text","keyword.operator","text","storage.type","text","entity.name.function","text","paren.lparen"],regex:"("+o+")(\\.)("+o+")(\\s*)(=)(\\s*)(function)(?:(\\s+)(\\w+))?(\\s*)(\\()",next:"function_arguments"},{token:"punctuation.operator",regex:/[.](?![.])/},{token:"support.function",regex:/(s(?:h(?:ift|ow(?:Mod(?:elessDialog|alDialog)|Help))|croll(?:X|By(?:Pages|Lines)?|Y|To)?|t(?:op|rike)|i(?:n|zeToContent|debar|gnText)|ort|u(?:p|b(?:str(?:ing)?)?)|pli(?:ce|t)|e(?:nd|t(?:Re(?:sizable|questHeader)|M(?:i(?:nutes|lliseconds)|onth)|Seconds|Ho(?:tKeys|urs)|Year|Cursor|Time(?:out)?|Interval|ZOptions|Date|UTC(?:M(?:i(?:nutes|lliseconds)|onth)|Seconds|Hours|Date|FullYear)|FullYear|Active)|arch)|qrt|lice|avePreferences|mall)|h(?:ome|andleEvent)|navigate|c(?:har(?:CodeAt|At)|o(?:s|n(?:cat|textual|firm)|mpile)|eil|lear(?:Timeout|Interval)?|a(?:ptureEvents|ll)|reate(?:StyleSheet|Popup|EventObject))|t(?:o(?:GMTString|S(?:tring|ource)|U(?:TCString|pperCase)|Lo(?:caleString|werCase))|est|a(?:n|int(?:Enabled)?))|i(?:s(?:NaN|Finite)|ndexOf|talics)|d(?:isableExternalCapture|ump|etachEvent)|u(?:n(?:shift|taint|escape|watch)|pdateCommands)|j(?:oin|avaEnabled)|p(?:o(?:p|w)|ush|lugins.refresh|a(?:ddings|rse(?:Int|Float)?)|r(?:int|ompt|eference))|e(?:scape|nableExternalCapture|val|lementFromPoint|x(?:p|ec(?:Script|Command)?))|valueOf|UTC|queryCommand(?:State|Indeterm|Enabled|Value)|f(?:i(?:nd|le(?:ModifiedDate|Size|CreatedDate|UpdatedDate)|xed)|o(?:nt(?:size|color)|rward)|loor|romCharCode)|watch|l(?:ink|o(?:ad|g)|astIndexOf)|a(?:sin|nchor|cos|t(?:tachEvent|ob|an(?:2)?)|pply|lert|b(?:s|ort))|r(?:ou(?:nd|teEvents)|e(?:size(?:By|To)|calc|turnValue|place|verse|l(?:oad|ease(?:Capture|Events)))|andom)|g(?:o|et(?:ResponseHeader|M(?:i(?:nutes|lliseconds)|onth)|Se(?:conds|lection)|Hours|Year|Time(?:zoneOffset)?|Da(?:y|te)|UTC(?:M(?:i(?:nutes|lliseconds)|onth)|Seconds|Hours|Da(?:y|te)|FullYear)|FullYear|A(?:ttention|llResponseHeaders)))|m(?:in|ove(?:B(?:y|elow)|To(?:Absolute)?|Above)|ergeAttributes|a(?:tch|rgins|x))|b(?:toa|ig|o(?:ld|rderWidths)|link|ack))\b(?=\()/},{token:"support.function.dom",regex:/(s(?:ub(?:stringData|mit)|plitText|e(?:t(?:NamedItem|Attribute(?:Node)?)|lect))|has(?:ChildNodes|Feature)|namedItem|c(?:l(?:ick|o(?:se|neNode))|reate(?:C(?:omment|DATASection|aption)|T(?:Head|extNode|Foot)|DocumentFragment|ProcessingInstruction|E(?:ntityReference|lement)|Attribute))|tabIndex|i(?:nsert(?:Row|Before|Cell|Data)|tem)|open|delete(?:Row|C(?:ell|aption)|T(?:Head|Foot)|Data)|focus|write(?:ln)?|a(?:dd|ppend(?:Child|Data))|re(?:set|place(?:Child|Data)|move(?:NamedItem|Child|Attribute(?:Node)?)?)|get(?:NamedItem|Element(?:sBy(?:Name|TagName|ClassName)|ById)|Attribute(?:Node)?)|blur)\b(?=\()/},{token:"support.constant",regex:/(s(?:ystemLanguage|cr(?:ipts|ollbars|een(?:X|Y|Top|Left))|t(?:yle(?:Sheets)?|atus(?:Text|bar)?)|ibling(?:Below|Above)|ource|uffixes|e(?:curity(?:Policy)?|l(?:ection|f)))|h(?:istory|ost(?:name)?|as(?:h|Focus))|y|X(?:MLDocument|SLDocument)|n(?:ext|ame(?:space(?:s|URI)|Prop))|M(?:IN_VALUE|AX_VALUE)|c(?:haracterSet|o(?:n(?:structor|trollers)|okieEnabled|lorDepth|mp(?:onents|lete))|urrent|puClass|l(?:i(?:p(?:boardData)?|entInformation)|osed|asses)|alle(?:e|r)|rypto)|t(?:o(?:olbar|p)|ext(?:Transform|Indent|Decoration|Align)|ags)|SQRT(?:1_2|2)|i(?:n(?:ner(?:Height|Width)|put)|ds|gnoreCase)|zIndex|o(?:scpu|n(?:readystatechange|Line)|uter(?:Height|Width)|p(?:sProfile|ener)|ffscreenBuffering)|NEGATIVE_INFINITY|d(?:i(?:splay|alog(?:Height|Top|Width|Left|Arguments)|rectories)|e(?:scription|fault(?:Status|Ch(?:ecked|arset)|View)))|u(?:ser(?:Profile|Language|Agent)|n(?:iqueID|defined)|pdateInterval)|_content|p(?:ixelDepth|ort|ersonalbar|kcs11|l(?:ugins|atform)|a(?:thname|dding(?:Right|Bottom|Top|Left)|rent(?:Window|Layer)?|ge(?:X(?:Offset)?|Y(?:Offset)?))|r(?:o(?:to(?:col|type)|duct(?:Sub)?|mpter)|e(?:vious|fix)))|e(?:n(?:coding|abledPlugin)|x(?:ternal|pando)|mbeds)|v(?:isibility|endor(?:Sub)?|Linkcolor)|URLUnencoded|P(?:I|OSITIVE_INFINITY)|f(?:ilename|o(?:nt(?:Size|Family|Weight)|rmName)|rame(?:s|Element)|gColor)|E|whiteSpace|l(?:i(?:stStyleType|n(?:eHeight|kColor))|o(?:ca(?:tion(?:bar)?|lName)|wsrc)|e(?:ngth|ft(?:Context)?)|a(?:st(?:M(?:odified|atch)|Index|Paren)|yer(?:s|X)|nguage))|a(?:pp(?:MinorVersion|Name|Co(?:deName|re)|Version)|vail(?:Height|Top|Width|Left)|ll|r(?:ity|guments)|Linkcolor|bove)|r(?:ight(?:Context)?|e(?:sponse(?:XML|Text)|adyState))|global|x|m(?:imeTypes|ultiline|enubar|argin(?:Right|Bottom|Top|Left))|L(?:N(?:10|2)|OG(?:10E|2E))|b(?:o(?:ttom|rder(?:Width|RightWidth|BottomWidth|Style|Color|TopWidth|LeftWidth))|ufferDepth|elow|ackground(?:Color|Image)))\b/},{token:"identifier",regex:o},{regex:"",token:"empty",next:"no_regex"}],start:[i.getStartRule("doc-start"),f("start"),{token:"string.regexp",regex:"\\/",next:"regex"},{token:"text",regex:"\\s+|^$",next:"start"},{token:"empty",regex:"",next:"no_regex"}],regex:[{token:"regexp.keyword.operator",regex:"\\\\(?:u[\\da-fA-F]{4}|x[\\da-fA-F]{2}|.)"},{token:"string.regexp",regex:"/[sxngimy]*",next:"no_regex"},{token:"invalid",regex:/\{\d+\b,?\d*\}[+*]|[+*$^?][+*]|[$^][?]|\?{3,}/},{token:"constant.language.escape",regex:/\(\?[:=!]|\)|\{\d+\b,?\d*\}|[+*]\?|[()$^+*?.]/},{token:"constant.language.delimiter",regex:/\|/},{token:"constant.language.escape",regex:/\[\^?/,next:"regex_character_class"},{token:"empty",regex:"$",next:"no_regex"},{defaultToken:"string.regexp"}],regex_character_class:[{token:"regexp.charclass.keyword.operator",regex:"\\\\(?:u[\\da-fA-F]{4}|x[\\da-fA-F]{2}|.)"},{token:"constant.language.escape",regex:"]",next:"regex"},{token:"constant.language.escape",regex:"-"},{token:"empty",regex:"$",next:"no_regex"},{defaultToken:"string.regexp.charachterclass"}],function_arguments:[{token:"variable.parameter",regex:o},{token:"punctuation.operator",regex:"[, ]+"},{token:"punctuation.operator",regex:"$"},{token:"empty",regex:"",next:"no_regex"}],qqstring:[{token:"constant.language.escape",regex:r},{token:"string",regex:"\\\\$",consumeLineEnd:!0},{token:"string",regex:'"|$',next:"no_regex"},{defaultToken:"string"}],qstring:[{token:"constant.language.escape",regex:r},{token:"string",regex:"\\\\$",consumeLineEnd:!0},{token:"string",regex:"'|$",next:"no_regex"},{defaultToken:"string"}]};if(!e||!e.noES6)this.$rules.no_regex.unshift({regex:"[{}]",onMatch:function(e,t,n){this.next=e=="{"?this.nextState:"";if(e=="{"&&n.length)n.unshift("start",t);else if(e=="}"&&n.length){n.shift(),this.next=n.shift();if(this.next.indexOf("string")!=-1||this.next.indexOf("jsx")!=-1)return"paren.quasi.end"}return e=="{"?"paren.lparen":"paren.rparen"},nextState:"start"},{token:"string.quasi.start",regex:/`/,push:[{token:"constant.language.escape",regex:r},{token:"paren.quasi.start",regex:/\${/,push:"start"},{token:"string.quasi.end",regex:/`/,next:"pop"},{defaultToken:"string.quasi"}]}),(!e||e.jsx!=0)&&a.call(this);this.embedRules(i,"doc-",[i.getEndRule("no_regex")]),this.normalizeRules()};r.inherits(u,s),t.JavaScriptHighlightRules=u}),ace.define("ace/mode/matching_brace_outdent",["require","exports","module","ace/range"],function(e,t,n){"use strict";var r=e("../range").Range,i=function(){};(function(){this.checkOutdent=function(e,t){return/^\s+$/.test(e)?/^\s*\}/.test(t):!1},this.autoOutdent=function(e,t){var n=e.getLine(t),i=n.match(/^(\s*\})/);if(!i)return 0;var s=i[1].length,o=e.findMatchingBracket({row:t,column:s});if(!o||o.row==t)return 0;var u=this.$getIndent(e.getLine(o.row));e.replace(new r(t,0,t,s-1),u)},this.$getIndent=function(e){return e.match(/^\s*/)[0]}}).call(i.prototype),t.MatchingBraceOutdent=i}),ace.define("ace/mode/folding/cstyle",["require","exports","module","ace/lib/oop","ace/range","ace/mode/folding/fold_mode"],function(e,t,n){"use strict";var r=e("../../lib/oop"),i=e("../../range").Range,s=e("./fold_mode").FoldMode,o=t.FoldMode=function(e){e&&(this.foldingStartMarker=new RegExp(this.foldingStartMarker.source.replace(/\|[^|]*?$/,"|"+e.start)),this.foldingStopMarker=new RegExp(this.foldingStopMarker.source.replace(/\|[^|]*?$/,"|"+e.end)))};r.inherits(o,s),function(){this.foldingStartMarker=/(\{|\[)[^\}\]]*$|^\s*(\/\*)/,this.foldingStopMarker=/^[^\[\{]*(\}|\])|^[\s\*]*(\*\/)/,this.singleLineBlockCommentRe=/^\s*(\/\*).*\*\/\s*$/,this.tripleStarBlockCommentRe=/^\s*(\/\*\*\*).*\*\/\s*$/,this.startRegionRe=/^\s*(\/\*|\/\/)#?region\b/,this._getFoldWidgetBase=this.getFoldWidget,this.getFoldWidget=function(e,t,n){var r=e.getLine(n);if(this.singleLineBlockCommentRe.test(r)&&!this.startRegionRe.test(r)&&!this.tripleStarBlockCommentRe.test(r))return"";var i=this._getFoldWidgetBase(e,t,n);return!i&&this.startRegionRe.test(r)?"start":i},this.getFoldWidgetRange=function(e,t,n,r){var i=e.getLine(n);if(this.startRegionRe.test(i))return this.getCommentRegionBlock(e,i,n);var s=i.match(this.foldingStartMarker);if(s){var o=s.index;if(s[1])return this.openingBracketBlock(e,s[1],n,o);var u=e.getCommentFoldRange(n,o+s[0].length,1);return u&&!u.isMultiLine()&&(r?u=this.getSectionRange(e,n):t!="all"&&(u=null)),u}if(t==="markbegin")return;var s=i.match(this.foldingStopMarker);if(s){var o=s.index+s[0].length;return s[1]?this.closingBracketBlock(e,s[1],n,o):e.getCommentFoldRange(n,o,-1)}},this.getSectionRange=function(e,t){var n=e.getLine(t),r=n.search(/\S/),s=t,o=n.length;t+=1;var u=t,a=e.getLength();while(++tf)break;var l=this.getFoldWidgetRange(e,"all",t);if(l){if(l.start.row<=s)break;if(l.isMultiLine())t=l.end.row;else if(r==f)break}u=t}return new i(s,o,u,e.getLine(u).length)},this.getCommentRegionBlock=function(e,t,n){var r=t.search(/\s*$/),s=e.getLength(),o=n,u=/^\s*(?:\/\*|\/\/|--)#?(end)?region\b/,a=1;while(++no)return new i(o,r,l,t.length)}}.call(o.prototype)}),ace.define("ace/mode/javascript",["require","exports","module","ace/lib/oop","ace/mode/text","ace/mode/javascript_highlight_rules","ace/mode/matching_brace_outdent","ace/worker/worker_client","ace/mode/behaviour/cstyle","ace/mode/folding/cstyle"],function(e,t,n){"use strict";var r=e("../lib/oop"),i=e("./text").Mode,s=e("./javascript_highlight_rules").JavaScriptHighlightRules,o=e("./matching_brace_outdent").MatchingBraceOutdent,u=e("../worker/worker_client").WorkerClient,a=e("./behaviour/cstyle").CstyleBehaviour,f=e("./folding/cstyle").FoldMode,l=function(){this.HighlightRules=s,this.$outdent=new o,this.$behaviour=new a,this.foldingRules=new f};r.inherits(l,i),function(){this.lineCommentStart="//",this.blockComment={start:"/*",end:"*/"},this.$quotes={'"':'"',"'":"'","`":"`"},this.getNextLineIndent=function(e,t,n){var r=this.$getIndent(t),i=this.getTokenizer().getLineTokens(t,e),s=i.tokens,o=i.state;if(s.length&&s[s.length-1].type=="comment")return r;if(e=="start"||e=="no_regex"){var u=t.match(/^.*(?:\bcase\b.*:|[\{\(\[])\s*$/);u&&(r+=n)}else if(e=="doc-start"){if(o=="start"||o=="no_regex")return"";var u=t.match(/^\s*(\/?)\*/);u&&(u[1]&&(r+=" "),r+="* ")}return r},this.checkOutdent=function(e,t,n){return this.$outdent.checkOutdent(t,n)},this.autoOutdent=function(e,t,n){this.$outdent.autoOutdent(t,n)},this.createWorker=function(e){var t=new u(["ace"],"ace/mode/javascript_worker","JavaScriptWorker");return t.attachToDocument(e.getDocument()),t.on("annotate",function(t){e.setAnnotations(t.data)}),t.on("terminate",function(){e.clearAnnotations()}),t},this.$id="ace/mode/javascript"}.call(l.prototype),t.Mode=l}),ace.define("ace/mode/css_highlight_rules",["require","exports","module","ace/lib/oop","ace/lib/lang","ace/mode/text_highlight_rules"],function(e,t,n){"use strict";var r=e("../lib/oop"),i=e("../lib/lang"),s=e("./text_highlight_rules").TextHighlightRules,o=t.supportType="align-content|align-items|align-self|all|animation|animation-delay|animation-direction|animation-duration|animation-fill-mode|animation-iteration-count|animation-name|animation-play-state|animation-timing-function|backface-visibility|background|background-attachment|background-blend-mode|background-clip|background-color|background-image|background-origin|background-position|background-repeat|background-size|border|border-bottom|border-bottom-color|border-bottom-left-radius|border-bottom-right-radius|border-bottom-style|border-bottom-width|border-collapse|border-color|border-image|border-image-outset|border-image-repeat|border-image-slice|border-image-source|border-image-width|border-left|border-left-color|border-left-style|border-left-width|border-radius|border-right|border-right-color|border-right-style|border-right-width|border-spacing|border-style|border-top|border-top-color|border-top-left-radius|border-top-right-radius|border-top-style|border-top-width|border-width|bottom|box-shadow|box-sizing|caption-side|clear|clip|color|column-count|column-fill|column-gap|column-rule|column-rule-color|column-rule-style|column-rule-width|column-span|column-width|columns|content|counter-increment|counter-reset|cursor|direction|display|empty-cells|filter|flex|flex-basis|flex-direction|flex-flow|flex-grow|flex-shrink|flex-wrap|float|font|font-family|font-size|font-size-adjust|font-stretch|font-style|font-variant|font-weight|hanging-punctuation|height|justify-content|left|letter-spacing|line-height|list-style|list-style-image|list-style-position|list-style-type|margin|margin-bottom|margin-left|margin-right|margin-top|max-height|max-width|min-height|min-width|nav-down|nav-index|nav-left|nav-right|nav-up|opacity|order|outline|outline-color|outline-offset|outline-style|outline-width|overflow|overflow-x|overflow-y|padding|padding-bottom|padding-left|padding-right|padding-top|page-break-after|page-break-before|page-break-inside|perspective|perspective-origin|position|quotes|resize|right|tab-size|table-layout|text-align|text-align-last|text-decoration|text-decoration-color|text-decoration-line|text-decoration-style|text-indent|text-justify|text-overflow|text-shadow|text-transform|top|transform|transform-origin|transform-style|transition|transition-delay|transition-duration|transition-property|transition-timing-function|unicode-bidi|vertical-align|visibility|white-space|width|word-break|word-spacing|word-wrap|z-index",u=t.supportFunction="rgb|rgba|url|attr|counter|counters",a=t.supportConstant="absolute|after-edge|after|all-scroll|all|alphabetic|always|antialiased|armenian|auto|avoid-column|avoid-page|avoid|balance|baseline|before-edge|before|below|bidi-override|block-line-height|block|bold|bolder|border-box|both|bottom|box|break-all|break-word|capitalize|caps-height|caption|center|central|char|circle|cjk-ideographic|clone|close-quote|col-resize|collapse|column|consider-shifts|contain|content-box|cover|crosshair|cubic-bezier|dashed|decimal-leading-zero|decimal|default|disabled|disc|disregard-shifts|distribute-all-lines|distribute-letter|distribute-space|distribute|dotted|double|e-resize|ease-in|ease-in-out|ease-out|ease|ellipsis|end|exclude-ruby|fill|fixed|georgian|glyphs|grid-height|groove|hand|hanging|hebrew|help|hidden|hiragana-iroha|hiragana|horizontal|icon|ideograph-alpha|ideograph-numeric|ideograph-parenthesis|ideograph-space|ideographic|inactive|include-ruby|inherit|initial|inline-block|inline-box|inline-line-height|inline-table|inline|inset|inside|inter-ideograph|inter-word|invert|italic|justify|katakana-iroha|katakana|keep-all|last|left|lighter|line-edge|line-through|line|linear|list-item|local|loose|lower-alpha|lower-greek|lower-latin|lower-roman|lowercase|lr-tb|ltr|mathematical|max-height|max-size|medium|menu|message-box|middle|move|n-resize|ne-resize|newspaper|no-change|no-close-quote|no-drop|no-open-quote|no-repeat|none|normal|not-allowed|nowrap|nw-resize|oblique|open-quote|outset|outside|overline|padding-box|page|pointer|pre-line|pre-wrap|pre|preserve-3d|progress|relative|repeat-x|repeat-y|repeat|replaced|reset-size|ridge|right|round|row-resize|rtl|s-resize|scroll|se-resize|separate|slice|small-caps|small-caption|solid|space|square|start|static|status-bar|step-end|step-start|steps|stretch|strict|sub|super|sw-resize|table-caption|table-cell|table-column-group|table-column|table-footer-group|table-header-group|table-row-group|table-row|table|tb-rl|text-after-edge|text-before-edge|text-bottom|text-size|text-top|text|thick|thin|transparent|underline|upper-alpha|upper-latin|upper-roman|uppercase|use-script|vertical-ideographic|vertical-text|visible|w-resize|wait|whitespace|z-index|zero",f=t.supportConstantColor="aliceblue|antiquewhite|aqua|aquamarine|azure|beige|bisque|black|blanchedalmond|blue|blueviolet|brown|burlywood|cadetblue|chartreuse|chocolate|coral|cornflowerblue|cornsilk|crimson|cyan|darkblue|darkcyan|darkgoldenrod|darkgray|darkgreen|darkgrey|darkkhaki|darkmagenta|darkolivegreen|darkorange|darkorchid|darkred|darksalmon|darkseagreen|darkslateblue|darkslategray|darkslategrey|darkturquoise|darkviolet|deeppink|deepskyblue|dimgray|dimgrey|dodgerblue|firebrick|floralwhite|forestgreen|fuchsia|gainsboro|ghostwhite|gold|goldenrod|gray|green|greenyellow|grey|honeydew|hotpink|indianred|indigo|ivory|khaki|lavender|lavenderblush|lawngreen|lemonchiffon|lightblue|lightcoral|lightcyan|lightgoldenrodyellow|lightgray|lightgreen|lightgrey|lightpink|lightsalmon|lightseagreen|lightskyblue|lightslategray|lightslategrey|lightsteelblue|lightyellow|lime|limegreen|linen|magenta|maroon|mediumaquamarine|mediumblue|mediumorchid|mediumpurple|mediumseagreen|mediumslateblue|mediumspringgreen|mediumturquoise|mediumvioletred|midnightblue|mintcream|mistyrose|moccasin|navajowhite|navy|oldlace|olive|olivedrab|orange|orangered|orchid|palegoldenrod|palegreen|paleturquoise|palevioletred|papayawhip|peachpuff|peru|pink|plum|powderblue|purple|rebeccapurple|red|rosybrown|royalblue|saddlebrown|salmon|sandybrown|seagreen|seashell|sienna|silver|skyblue|slateblue|slategray|slategrey|snow|springgreen|steelblue|tan|teal|thistle|tomato|turquoise|violet|wheat|white|whitesmoke|yellow|yellowgreen",l=t.supportConstantFonts="arial|century|comic|courier|cursive|fantasy|garamond|georgia|helvetica|impact|lucida|symbol|system|tahoma|times|trebuchet|utopia|verdana|webdings|sans-serif|serif|monospace",c=t.numRe="\\-?(?:(?:[0-9]+(?:\\.[0-9]+)?)|(?:\\.[0-9]+))",h=t.pseudoElements="(\\:+)\\b(after|before|first-letter|first-line|moz-selection|selection)\\b",p=t.pseudoClasses="(:)\\b(active|checked|disabled|empty|enabled|first-child|first-of-type|focus|hover|indeterminate|invalid|last-child|last-of-type|link|not|nth-child|nth-last-child|nth-last-of-type|nth-of-type|only-child|only-of-type|required|root|target|valid|visited)\\b",d=function(){var e=this.createKeywordMapper({"support.function":u,"support.constant":a,"support.type":o,"support.constant.color":f,"support.constant.fonts":l},"text",!0);this.$rules={start:[{include:["strings","url","comments"]},{token:"paren.lparen",regex:"\\{",next:"ruleset"},{token:"paren.rparen",regex:"\\}"},{token:"string",regex:"@",next:"media"},{token:"keyword",regex:"#[a-z0-9-_]+"},{token:"keyword",regex:"%"},{token:"variable",regex:"\\.[a-z0-9-_]+"},{token:"string",regex:":[a-z0-9-_]+"},{token:"constant.numeric",regex:c},{token:"constant",regex:"[a-z0-9-_]+"},{caseInsensitive:!0}],media:[{include:["strings","url","comments"]},{token:"paren.lparen",regex:"\\{",next:"start"},{token:"paren.rparen",regex:"\\}",next:"start"},{token:"string",regex:";",next:"start"},{token:"keyword",regex:"(?:media|supports|document|charset|import|namespace|media|supports|document|page|font|keyframes|viewport|counter-style|font-feature-values|swash|ornaments|annotation|stylistic|styleset|character-variant)"}],comments:[{token:"comment",regex:"\\/\\*",push:[{token:"comment",regex:"\\*\\/",next:"pop"},{defaultToken:"comment"}]}],ruleset:[{regex:"-(webkit|ms|moz|o)-",token:"text"},{token:"paren.rparen",regex:"\\}",next:"start"},{include:["strings","url","comments"]},{token:["constant.numeric","keyword"],regex:"("+c+")(ch|cm|deg|em|ex|fr|gd|grad|Hz|in|kHz|mm|ms|pc|pt|px|rad|rem|s|turn|vh|vm|vw|%)"},{token:"constant.numeric",regex:c},{token:"constant.numeric",regex:"#[a-f0-9]{6}"},{token:"constant.numeric",regex:"#[a-f0-9]{3}"},{token:["punctuation","entity.other.attribute-name.pseudo-element.css"],regex:h},{token:["punctuation","entity.other.attribute-name.pseudo-class.css"],regex:p},{include:"url"},{token:e,regex:"\\-?[a-zA-Z_][a-zA-Z0-9_\\-]*"},{caseInsensitive:!0}],url:[{token:"support.function",regex:"(?:url(:?-prefix)?|domain|regexp)\\(",push:[{token:"support.function",regex:"\\)",next:"pop"},{defaultToken:"string"}]}],strings:[{token:"string.start",regex:"'",push:[{token:"string.end",regex:"'|$",next:"pop"},{include:"escapes"},{token:"constant.language.escape",regex:/\\$/,consumeLineEnd:!0},{defaultToken:"string"}]},{token:"string.start",regex:'"',push:[{token:"string.end",regex:'"|$',next:"pop"},{include:"escapes"},{token:"constant.language.escape",regex:/\\$/,consumeLineEnd:!0},{defaultToken:"string"}]}],escapes:[{token:"constant.language.escape",regex:/\\([a-fA-F\d]{1,6}|[^a-fA-F\d])/}]},this.normalizeRules()};r.inherits(d,s),t.CssHighlightRules=d}),ace.define("ace/mode/css_completions",["require","exports","module"],function(e,t,n){"use strict";var r={background:{"#$0":1},"background-color":{"#$0":1,transparent:1,fixed:1},"background-image":{"url('/$0')":1},"background-repeat":{repeat:1,"repeat-x":1,"repeat-y":1,"no-repeat":1,inherit:1},"background-position":{bottom:2,center:2,left:2,right:2,top:2,inherit:2},"background-attachment":{scroll:1,fixed:1},"background-size":{cover:1,contain:1},"background-clip":{"border-box":1,"padding-box":1,"content-box":1},"background-origin":{"border-box":1,"padding-box":1,"content-box":1},border:{"solid $0":1,"dashed $0":1,"dotted $0":1,"#$0":1},"border-color":{"#$0":1},"border-style":{solid:2,dashed:2,dotted:2,"double":2,groove:2,hidden:2,inherit:2,inset:2,none:2,outset:2,ridged:2},"border-collapse":{collapse:1,separate:1},bottom:{px:1,em:1,"%":1},clear:{left:1,right:1,both:1,none:1},color:{"#$0":1,"rgb(#$00,0,0)":1},cursor:{"default":1,pointer:1,move:1,text:1,wait:1,help:1,progress:1,"n-resize":1,"ne-resize":1,"e-resize":1,"se-resize":1,"s-resize":1,"sw-resize":1,"w-resize":1,"nw-resize":1},display:{none:1,block:1,inline:1,"inline-block":1,"table-cell":1},"empty-cells":{show:1,hide:1},"float":{left:1,right:1,none:1},"font-family":{Arial:2,"Comic Sans MS":2,Consolas:2,"Courier New":2,Courier:2,Georgia:2,Monospace:2,"Sans-Serif":2,"Segoe UI":2,Tahoma:2,"Times New Roman":2,"Trebuchet MS":2,Verdana:1},"font-size":{px:1,em:1,"%":1},"font-weight":{bold:1,normal:1},"font-style":{italic:1,normal:1},"font-variant":{normal:1,"small-caps":1},height:{px:1,em:1,"%":1},left:{px:1,em:1,"%":1},"letter-spacing":{normal:1},"line-height":{normal:1},"list-style-type":{none:1,disc:1,circle:1,square:1,decimal:1,"decimal-leading-zero":1,"lower-roman":1,"upper-roman":1,"lower-greek":1,"lower-latin":1,"upper-latin":1,georgian:1,"lower-alpha":1,"upper-alpha":1},margin:{px:1,em:1,"%":1},"margin-right":{px:1,em:1,"%":1},"margin-left":{px:1,em:1,"%":1},"margin-top":{px:1,em:1,"%":1},"margin-bottom":{px:1,em:1,"%":1},"max-height":{px:1,em:1,"%":1},"max-width":{px:1,em:1,"%":1},"min-height":{px:1,em:1,"%":1},"min-width":{px:1,em:1,"%":1},overflow:{hidden:1,visible:1,auto:1,scroll:1},"overflow-x":{hidden:1,visible:1,auto:1,scroll:1},"overflow-y":{hidden:1,visible:1,auto:1,scroll:1},padding:{px:1,em:1,"%":1},"padding-top":{px:1,em:1,"%":1},"padding-right":{px:1,em:1,"%":1},"padding-bottom":{px:1,em:1,"%":1},"padding-left":{px:1,em:1,"%":1},"page-break-after":{auto:1,always:1,avoid:1,left:1,right:1},"page-break-before":{auto:1,always:1,avoid:1,left:1,right:1},position:{absolute:1,relative:1,fixed:1,"static":1},right:{px:1,em:1,"%":1},"table-layout":{fixed:1,auto:1},"text-decoration":{none:1,underline:1,"line-through":1,blink:1},"text-align":{left:1,right:1,center:1,justify:1},"text-transform":{capitalize:1,uppercase:1,lowercase:1,none:1},top:{px:1,em:1,"%":1},"vertical-align":{top:1,bottom:1},visibility:{hidden:1,visible:1},"white-space":{nowrap:1,normal:1,pre:1,"pre-line":1,"pre-wrap":1},width:{px:1,em:1,"%":1},"word-spacing":{normal:1},filter:{"alpha(opacity=$0100)":1},"text-shadow":{"$02px 2px 2px #777":1},"text-overflow":{"ellipsis-word":1,clip:1,ellipsis:1},"-moz-border-radius":1,"-moz-border-radius-topright":1,"-moz-border-radius-bottomright":1,"-moz-border-radius-topleft":1,"-moz-border-radius-bottomleft":1,"-webkit-border-radius":1,"-webkit-border-top-right-radius":1,"-webkit-border-top-left-radius":1,"-webkit-border-bottom-right-radius":1,"-webkit-border-bottom-left-radius":1,"-moz-box-shadow":1,"-webkit-box-shadow":1,transform:{"rotate($00deg)":1,"skew($00deg)":1},"-moz-transform":{"rotate($00deg)":1,"skew($00deg)":1},"-webkit-transform":{"rotate($00deg)":1,"skew($00deg)":1}},i=function(){};(function(){this.completionsDefined=!1,this.defineCompletions=function(){if(document){var e=document.createElement("c").style;for(var t in e){if(typeof e[t]!="string")continue;var n=t.replace(/[A-Z]/g,function(e){return"-"+e.toLowerCase()});r.hasOwnProperty(n)||(r[n]=1)}}this.completionsDefined=!0},this.getCompletions=function(e,t,n,r){this.completionsDefined||this.defineCompletions();var i=t.getTokenAt(n.row,n.column);if(!i)return[];if(e==="ruleset"){var s=t.getLine(n.row).substr(0,n.column);return/:[^;]+$/.test(s)?(/([\w\-]+):[^:]*$/.test(s),this.getPropertyValueCompletions(e,t,n,r)):this.getPropertyCompletions(e,t,n,r)}return[]},this.getPropertyCompletions=function(e,t,n,i){var s=Object.keys(r);return s.map(function(e){return{caption:e,snippet:e+": $0",meta:"property",score:Number.MAX_VALUE}})},this.getPropertyValueCompletions=function(e,t,n,i){var s=t.getLine(n.row).substr(0,n.column),o=(/([\w\-]+):[^:]*$/.exec(s)||{})[1];if(!o)return[];var u=[];return o in r&&typeof r[o]=="object"&&(u=Object.keys(r[o])),u.map(function(e){return{caption:e,snippet:e,meta:"property value",score:Number.MAX_VALUE}})}}).call(i.prototype),t.CssCompletions=i}),ace.define("ace/mode/behaviour/css",["require","exports","module","ace/lib/oop","ace/mode/behaviour","ace/mode/behaviour/cstyle","ace/token_iterator"],function(e,t,n){"use strict";var r=e("../../lib/oop"),i=e("../behaviour").Behaviour,s=e("./cstyle").CstyleBehaviour,o=e("../../token_iterator").TokenIterator,u=function(){this.inherit(s),this.add("colon","insertion",function(e,t,n,r,i){if(i===":"){var s=n.getCursorPosition(),u=new o(r,s.row,s.column),a=u.getCurrentToken();a&&a.value.match(/\s+/)&&(a=u.stepBackward());if(a&&a.type==="support.type"){var f=r.doc.getLine(s.row),l=f.substring(s.column,s.column+1);if(l===":")return{text:"",selection:[1,1]};if(!f.substring(s.column).match(/^\s*;/))return{text:":;",selection:[1,1]}}}}),this.add("colon","deletion",function(e,t,n,r,i){var s=r.doc.getTextRange(i);if(!i.isMultiLine()&&s===":"){var u=n.getCursorPosition(),a=new o(r,u.row,u.column),f=a.getCurrentToken();f&&f.value.match(/\s+/)&&(f=a.stepBackward());if(f&&f.type==="support.type"){var l=r.doc.getLine(i.start.row),c=l.substring(i.end.column,i.end.column+1);if(c===";")return i.end.column++,i}}}),this.add("semicolon","insertion",function(e,t,n,r,i){if(i===";"){var s=n.getCursorPosition(),o=r.doc.getLine(s.row),u=o.substring(s.column,s.column+1);if(u===";")return{text:"",selection:[1,1]}}})};r.inherits(u,s),t.CssBehaviour=u}),ace.define("ace/mode/css",["require","exports","module","ace/lib/oop","ace/mode/text","ace/mode/css_highlight_rules","ace/mode/matching_brace_outdent","ace/worker/worker_client","ace/mode/css_completions","ace/mode/behaviour/css","ace/mode/folding/cstyle"],function(e,t,n){"use strict";var r=e("../lib/oop"),i=e("./text").Mode,s=e("./css_highlight_rules").CssHighlightRules,o=e("./matching_brace_outdent").MatchingBraceOutdent,u=e("../worker/worker_client").WorkerClient,a=e("./css_completions").CssCompletions,f=e("./behaviour/css").CssBehaviour,l=e("./folding/cstyle").FoldMode,c=function(){this.HighlightRules=s,this.$outdent=new o,this.$behaviour=new f,this.$completer=new a,this.foldingRules=new l};r.inherits(c,i),function(){this.foldingRules="cStyle",this.blockComment={start:"/*",end:"*/"},this.getNextLineIndent=function(e,t,n){var r=this.$getIndent(t),i=this.getTokenizer().getLineTokens(t,e).tokens;if(i.length&&i[i.length-1].type=="comment")return r;var s=t.match(/^.*\{\s*$/);return s&&(r+=n),r},this.checkOutdent=function(e,t,n){return this.$outdent.checkOutdent(t,n)},this.autoOutdent=function(e,t,n){this.$outdent.autoOutdent(t,n)},this.getCompletions=function(e,t,n,r){return this.$completer.getCompletions(e,t,n,r)},this.createWorker=function(e){var t=new u(["ace"],"ace/mode/css_worker","Worker");return t.attachToDocument(e.getDocument()),t.on("annotate",function(t){e.setAnnotations(t.data)}),t.on("terminate",function(){e.clearAnnotations()}),t},this.$id="ace/mode/css"}.call(c.prototype),t.Mode=c}),ace.define("ace/mode/xml_highlight_rules",["require","exports","module","ace/lib/oop","ace/mode/text_highlight_rules"],function(e,t,n){"use strict";var r=e("../lib/oop"),i=e("./text_highlight_rules").TextHighlightRules,s=function(e){var t="[_:a-zA-Z\u00c0-\uffff][-_:.a-zA-Z0-9\u00c0-\uffff]*";this.$rules={start:[{token:"string.cdata.xml",regex:"<\\!\\[CDATA\\[",next:"cdata"},{token:["punctuation.instruction.xml","keyword.instruction.xml"],regex:"(<\\?)("+t+")",next:"processing_instruction"},{token:"comment.start.xml",regex:"<\\!--",next:"comment"},{token:["xml-pe.doctype.xml","xml-pe.doctype.xml"],regex:"(<\\!)(DOCTYPE)(?=[\\s])",next:"doctype",caseInsensitive:!0},{include:"tag"},{token:"text.end-tag-open.xml",regex:"",next:"start"}],doctype:[{include:"whitespace"},{include:"string"},{token:"xml-pe.doctype.xml",regex:">",next:"start"},{token:"xml-pe.xml",regex:"[-_a-zA-Z0-9:]+"},{token:"punctuation.int-subset",regex:"\\[",push:"int_subset"}],int_subset:[{token:"text.xml",regex:"\\s+"},{token:"punctuation.int-subset.xml",regex:"]",next:"pop"},{token:["punctuation.markup-decl.xml","keyword.markup-decl.xml"],regex:"(<\\!)("+t+")",push:[{token:"text",regex:"\\s+"},{token:"punctuation.markup-decl.xml",regex:">",next:"pop"},{include:"string"}]}],cdata:[{token:"string.cdata.xml",regex:"\\]\\]>",next:"start"},{token:"text.xml",regex:"\\s+"},{token:"text.xml",regex:"(?:[^\\]]|\\](?!\\]>))+"}],comment:[{token:"comment.end.xml",regex:"-->",next:"start"},{defaultToken:"comment.xml"}],reference:[{token:"constant.language.escape.reference.xml",regex:"(?:&#[0-9]+;)|(?:&#x[0-9a-fA-F]+;)|(?:&[a-zA-Z0-9_:\\.-]+;)"}],attr_reference:[{token:"constant.language.escape.reference.attribute-value.xml",regex:"(?:&#[0-9]+;)|(?:&#x[0-9a-fA-F]+;)|(?:&[a-zA-Z0-9_:\\.-]+;)"}],tag:[{token:["meta.tag.punctuation.tag-open.xml","meta.tag.punctuation.end-tag-open.xml","meta.tag.tag-name.xml"],regex:"(?:(<)|(",next:"start"}]}],tag_whitespace:[{token:"text.tag-whitespace.xml",regex:"\\s+"}],whitespace:[{token:"text.whitespace.xml",regex:"\\s+"}],string:[{token:"string.xml",regex:"'",push:[{token:"string.xml",regex:"'",next:"pop"},{defaultToken:"string.xml"}]},{token:"string.xml",regex:'"',push:[{token:"string.xml",regex:'"',next:"pop"},{defaultToken:"string.xml"}]}],attributes:[{token:"entity.other.attribute-name.xml",regex:t},{token:"keyword.operator.attribute-equals.xml",regex:"="},{include:"tag_whitespace"},{include:"attribute_value"}],attribute_value:[{token:"string.attribute-value.xml",regex:"'",push:[{token:"string.attribute-value.xml",regex:"'",next:"pop"},{include:"attr_reference"},{defaultToken:"string.attribute-value.xml"}]},{token:"string.attribute-value.xml",regex:'"',push:[{token:"string.attribute-value.xml",regex:'"',next:"pop"},{include:"attr_reference"},{defaultToken:"string.attribute-value.xml"}]}]},this.constructor===s&&this.normalizeRules()};(function(){this.embedTagRules=function(e,t,n){this.$rules.tag.unshift({token:["meta.tag.punctuation.tag-open.xml","meta.tag."+n+".tag-name.xml"],regex:"(<)("+n+"(?=\\s|>|$))",next:[{include:"attributes"},{token:"meta.tag.punctuation.tag-close.xml",regex:"/?>",next:t+"start"}]}),this.$rules[n+"-end"]=[{include:"attributes"},{token:"meta.tag.punctuation.tag-close.xml",regex:"/?>",next:"start",onMatch:function(e,t,n){return n.splice(0),this.token}}],this.embedRules(e,t,[{token:["meta.tag.punctuation.end-tag-open.xml","meta.tag."+n+".tag-name.xml"],regex:"(|$))",next:n+"-end"},{token:"string.cdata.xml",regex:"<\\!\\[CDATA\\["},{token:"string.cdata.xml",regex:"\\]\\]>"}])}}).call(i.prototype),r.inherits(s,i),t.XmlHighlightRules=s}),ace.define("ace/mode/html_highlight_rules",["require","exports","module","ace/lib/oop","ace/lib/lang","ace/mode/css_highlight_rules","ace/mode/javascript_highlight_rules","ace/mode/xml_highlight_rules"],function(e,t,n){"use strict";var r=e("../lib/oop"),i=e("../lib/lang"),s=e("./css_highlight_rules").CssHighlightRules,o=e("./javascript_highlight_rules").JavaScriptHighlightRules,u=e("./xml_highlight_rules").XmlHighlightRules,a=i.createMap({a:"anchor",button:"form",form:"form",img:"image",input:"form",label:"form",option:"form",script:"script",select:"form",textarea:"form",style:"style",table:"table",tbody:"table",td:"table",tfoot:"table",th:"table",tr:"table"}),f=function(){u.call(this),this.addRules({attributes:[{include:"tag_whitespace"},{token:"entity.other.attribute-name.xml",regex:"[-_a-zA-Z0-9:.]+"},{token:"keyword.operator.attribute-equals.xml",regex:"=",push:[{include:"tag_whitespace"},{token:"string.unquoted.attribute-value.html",regex:"[^<>='\"`\\s]+",next:"pop"},{token:"empty",regex:"",next:"pop"}]},{include:"attribute_value"}],tag:[{token:function(e,t){var n=a[t];return["meta.tag.punctuation."+(e=="<"?"":"end-")+"tag-open.xml","meta.tag"+(n?"."+n:"")+".tag-name.xml"]},regex:"(",next:"start"}]}),this.embedTagRules(s,"css-","style"),this.embedTagRules((new o({jsx:!1})).getRules(),"js-","script"),this.constructor===f&&this.normalizeRules()};r.inherits(f,u),t.HtmlHighlightRules=f}),ace.define("ace/mode/behaviour/xml",["require","exports","module","ace/lib/oop","ace/mode/behaviour","ace/token_iterator","ace/lib/lang"],function(e,t,n){"use strict";function u(e,t){return e.type.lastIndexOf(t+".xml")>-1}var r=e("../../lib/oop"),i=e("../behaviour").Behaviour,s=e("../../token_iterator").TokenIterator,o=e("../../lib/lang"),a=function(){this.add("string_dquotes","insertion",function(e,t,n,r,i){if(i=='"'||i=="'"){var o=i,a=r.doc.getTextRange(n.getSelectionRange());if(a!==""&&a!=="'"&&a!='"'&&n.getWrapBehavioursEnabled())return{text:o+a+o,selection:!1};var f=n.getCursorPosition(),l=r.doc.getLine(f.row),c=l.substring(f.column,f.column+1),h=new s(r,f.row,f.column),p=h.getCurrentToken();if(c==o&&(u(p,"attribute-value")||u(p,"string")))return{text:"",selection:[1,1]};p||(p=h.stepBackward());if(!p)return;while(u(p,"tag-whitespace")||u(p,"whitespace"))p=h.stepBackward();var d=!c||c.match(/\s/);if(u(p,"attribute-equals")&&(d||c==">")||u(p,"decl-attribute-equals")&&(d||c=="?"))return{text:o+o,selection:[1,1]}}}),this.add("string_dquotes","deletion",function(e,t,n,r,i){var s=r.doc.getTextRange(i);if(!i.isMultiLine()&&(s=='"'||s=="'")){var o=r.doc.getLine(i.start.row),u=o.substring(i.start.column+1,i.start.column+2);if(u==s)return i.end.column++,i}}),this.add("autoclosing","insertion",function(e,t,n,r,i){if(i==">"){var o=n.getSelectionRange().start,a=new s(r,o.row,o.column),f=a.getCurrentToken()||a.stepBackward();if(!f||!(u(f,"tag-name")||u(f,"tag-whitespace")||u(f,"attribute-name")||u(f,"attribute-equals")||u(f,"attribute-value")))return;if(u(f,"reference.attribute-value"))return;if(u(f,"attribute-value")){var l=f.value.charAt(0);if(l=='"'||l=="'"){var c=f.value.charAt(f.value.length-1),h=a.getCurrentTokenColumn()+f.value.length;if(h>o.column||h==o.column&&l!=c)return}}while(!u(f,"tag-name")){f=a.stepBackward();if(f.value=="<"){f=a.stepForward();break}}var p=a.getCurrentTokenRow(),d=a.getCurrentTokenColumn();if(u(a.stepBackward(),"end-tag-open"))return;var v=f.value;p==o.row&&(v=v.substring(0,o.column-d));if(this.voidElements.hasOwnProperty(v.toLowerCase()))return;return{text:">",selection:[1,1]}}}),this.add("autoindent","insertion",function(e,t,n,r,i){if(i=="\n"){var o=n.getCursorPosition(),u=r.getLine(o.row),a=new s(r,o.row,o.column),f=a.getCurrentToken();if(f&&f.type.indexOf("tag-close")!==-1){if(f.value=="/>")return;while(f&&f.type.indexOf("tag-name")===-1)f=a.stepBackward();if(!f)return;var l=f.value,c=a.getCurrentTokenRow();f=a.stepBackward();if(!f||f.type.indexOf("end-tag")!==-1)return;if(this.voidElements&&!this.voidElements[l]){var h=r.getTokenAt(o.row,o.column+1),u=r.getLine(c),p=this.$getIndent(u),d=p+r.getTabString();return h&&h.value==="-1}var r=e("../../lib/oop"),i=e("../../lib/lang"),s=e("../../range").Range,o=e("./fold_mode").FoldMode,u=e("../../token_iterator").TokenIterator,a=t.FoldMode=function(e,t){o.call(this),this.voidElements=e||{},this.optionalEndTags=r.mixin({},this.voidElements),t&&r.mixin(this.optionalEndTags,t)};r.inherits(a,o);var f=function(){this.tagName="",this.closing=!1,this.selfClosing=!1,this.start={row:0,column:0},this.end={row:0,column:0}};(function(){this.getFoldWidget=function(e,t,n){var r=this._getFirstTagInLine(e,n);return r?r.closing||!r.tagName&&r.selfClosing?t=="markbeginend"?"end":"":!r.tagName||r.selfClosing||this.voidElements.hasOwnProperty(r.tagName.toLowerCase())?"":this._findEndTagInLine(e,n,r.tagName,r.end.column)?"":"start":this.getCommentFoldWidget(e,n)},this.getCommentFoldWidget=function(e,t){return/comment/.test(e.getState(t))&&/";break}}return r}if(l(s,"tag-close"))return r.selfClosing=s.value=="/>",r;r.start.column+=s.value.length}return null},this._findEndTagInLine=function(e,t,n,r){var i=e.getTokens(t),s=0;for(var o=0;o",n.end.row=e.getCurrentTokenRow(),n.end.column=e.getCurrentTokenColumn()+t.value.length,e.stepForward(),n;while(t=e.stepForward());return null},this._readTagBackward=function(e){var t=e.getCurrentToken();if(!t)return null;var n=new f;do{if(l(t,"tag-open"))return n.closing=l(t,"end-tag-open"),n.start.row=e.getCurrentTokenRow(),n.start.column=e.getCurrentTokenColumn(),e.stepBackward(),n;l(t,"tag-name")?n.tagName=t.value:l(t,"tag-close")&&(n.selfClosing=t.value=="/>",n.end.row=e.getCurrentTokenRow(),n.end.column=e.getCurrentTokenColumn()+t.value.length)}while(t=e.stepBackward());return null},this._pop=function(e,t){while(e.length){var n=e[e.length-1];if(!t||n.tagName==t.tagName)return e.pop();if(this.optionalEndTags.hasOwnProperty(n.tagName)){e.pop();continue}return null}},this.getFoldWidgetRange=function(e,t,n){var r=this._getFirstTagInLine(e,n);if(!r)return this.getCommentFoldWidget(e,n)&&e.getCommentFoldRange(n,e.getLine(n).length);var i=r.closing||r.selfClosing,o=[],a;if(!i){var f=new u(e,n,r.start.column),l={row:n,column:r.start.column+r.tagName.length+2};r.start.row==r.end.row&&(l.column=r.end.column);while(a=this._readTagForward(f)){if(a.selfClosing){if(!o.length)return a.start.column+=a.tagName.length+2,a.end.column-=2,s.fromPoints(a.start,a.end);continue}if(a.closing){this._pop(o,a);if(o.length==0)return s.fromPoints(l,a.start)}else o.push(a)}}else{var f=new u(e,n,r.end.column),c={row:n,column:r.start.column};while(a=this._readTagBackward(f)){if(a.selfClosing){if(!o.length)return a.start.column+=a.tagName.length+2,a.end.column-=2,s.fromPoints(a.start,a.end);continue}if(!a.closing){this._pop(o,a);if(o.length==0)return a.start.column+=a.tagName.length+2,a.start.row==a.end.row&&a.start.column-1}function l(e,t){var n=new r(e,t.row,t.column),i=n.getCurrentToken();while(i&&!f(i,"tag-name"))i=n.stepBackward();if(i)return i.value}function c(e,t){var n=new r(e,t.row,t.column),i=n.getCurrentToken();while(i&&!f(i,"attribute-name"))i=n.stepBackward();if(i)return i.value}var r=e("../token_iterator").TokenIterator,i=["accesskey","class","contenteditable","contextmenu","dir","draggable","dropzone","hidden","id","inert","itemid","itemprop","itemref","itemscope","itemtype","lang","spellcheck","style","tabindex","title","translate"],s=["onabort","onblur","oncancel","oncanplay","oncanplaythrough","onchange","onclick","onclose","oncontextmenu","oncuechange","ondblclick","ondrag","ondragend","ondragenter","ondragleave","ondragover","ondragstart","ondrop","ondurationchange","onemptied","onended","onerror","onfocus","oninput","oninvalid","onkeydown","onkeypress","onkeyup","onload","onloadeddata","onloadedmetadata","onloadstart","onmousedown","onmousemove","onmouseout","onmouseover","onmouseup","onmousewheel","onpause","onplay","onplaying","onprogress","onratechange","onreset","onscroll","onseeked","onseeking","onselect","onshow","onstalled","onsubmit","onsuspend","ontimeupdate","onvolumechange","onwaiting"],o=i.concat(s),u={html:{manifest:1},head:{},title:{},base:{href:1,target:1},link:{href:1,hreflang:1,rel:{stylesheet:1,icon:1},media:{all:1,screen:1,print:1},type:{"text/css":1,"image/png":1,"image/jpeg":1,"image/gif":1},sizes:1},meta:{"http-equiv":{"content-type":1},name:{description:1,keywords:1},content:{"text/html; charset=UTF-8":1},charset:1},style:{type:1,media:{all:1,screen:1,print:1},scoped:1},script:{charset:1,type:{"text/javascript":1},src:1,defer:1,async:1},noscript:{href:1},body:{onafterprint:1,onbeforeprint:1,onbeforeunload:1,onhashchange:1,onmessage:1,onoffline:1,onpopstate:1,onredo:1,onresize:1,onstorage:1,onundo:1,onunload:1},section:{},nav:{},article:{pubdate:1},aside:{},h1:{},h2:{},h3:{},h4:{},h5:{},h6:{},header:{},footer:{},address:{},main:{},p:{},hr:{},pre:{},blockquote:{cite:1},ol:{start:1,reversed:1},ul:{},li:{value:1},dl:{},dt:{},dd:{},figure:{},figcaption:{},div:{},a:{href:1,target:{_blank:1,top:1},ping:1,rel:{nofollow:1,alternate:1,author:1,bookmark:1,help:1,license:1,next:1,noreferrer:1,prefetch:1,prev:1,search:1,tag:1},media:1,hreflang:1,type:1},em:{},strong:{},small:{},s:{},cite:{},q:{cite:1},dfn:{},abbr:{},data:{},time:{datetime:1},code:{},"var":{},samp:{},kbd:{},sub:{},sup:{},i:{},b:{},u:{},mark:{},ruby:{},rt:{},rp:{},bdi:{},bdo:{},span:{},br:{},wbr:{},ins:{cite:1,datetime:1},del:{cite:1,datetime:1},img:{alt:1,src:1,height:1,width:1,usemap:1,ismap:1},iframe:{name:1,src:1,height:1,width:1,sandbox:{"allow-same-origin":1,"allow-top-navigation":1,"allow-forms":1,"allow-scripts":1},seamless:{seamless:1}},embed:{src:1,height:1,width:1,type:1},object:{param:1,data:1,type:1,height:1,width:1,usemap:1,name:1,form:1,classid:1},param:{name:1,value:1},video:{src:1,autobuffer:1,autoplay:{autoplay:1},loop:{loop:1},controls:{controls:1},width:1,height:1,poster:1,muted:{muted:1},preload:{auto:1,metadata:1,none:1}},audio:{src:1,autobuffer:1,autoplay:{autoplay:1},loop:{loop:1},controls:{controls:1},muted:{muted:1},preload:{auto:1,metadata:1,none:1}},source:{src:1,type:1,media:1},track:{kind:1,src:1,srclang:1,label:1,"default":1},canvas:{width:1,height:1},map:{name:1},area:{shape:1,coords:1,href:1,hreflang:1,alt:1,target:1,media:1,rel:1,ping:1,type:1},svg:{},math:{},table:{summary:1},caption:{},colgroup:{span:1},col:{span:1},tbody:{},thead:{},tfoot:{},tr:{},td:{headers:1,rowspan:1,colspan:1},th:{headers:1,rowspan:1,colspan:1,scope:1},form:{"accept-charset":1,action:1,autocomplete:1,enctype:{"multipart/form-data":1,"application/x-www-form-urlencoded":1},method:{get:1,post:1},name:1,novalidate:1,target:{_blank:1,top:1}},fieldset:{disabled:1,form:1,name:1},legend:{},label:{form:1,"for":1},input:{type:{text:1,password:1,hidden:1,checkbox:1,submit:1,radio:1,file:1,button:1,reset:1,image:31,color:1,date:1,datetime:1,"datetime-local":1,email:1,month:1,number:1,range:1,search:1,tel:1,time:1,url:1,week:1},accept:1,alt:1,autocomplete:{on:1,off:1},autofocus:{autofocus:1},checked:{checked:1},disabled:{disabled:1},form:1,formaction:1,formenctype:{"application/x-www-form-urlencoded":1,"multipart/form-data":1,"text/plain":1},formmethod:{get:1,post:1},formnovalidate:{formnovalidate:1},formtarget:{_blank:1,_self:1,_parent:1,_top:1},height:1,list:1,max:1,maxlength:1,min:1,multiple:{multiple:1},name:1,pattern:1,placeholder:1,readonly:{readonly:1},required:{required:1},size:1,src:1,step:1,width:1,files:1,value:1},button:{autofocus:1,disabled:{disabled:1},form:1,formaction:1,formenctype:1,formmethod:1,formnovalidate:1,formtarget:1,name:1,value:1,type:{button:1,submit:1}},select:{autofocus:1,disabled:1,form:1,multiple:{multiple:1},name:1,size:1,readonly:{readonly:1}},datalist:{},optgroup:{disabled:1,label:1},option:{disabled:1,selected:1,label:1,value:1},textarea:{autofocus:{autofocus:1},disabled:{disabled:1},form:1,maxlength:1,name:1,placeholder:1,readonly:{readonly:1},required:{required:1},rows:1,cols:1,wrap:{on:1,off:1,hard:1,soft:1}},keygen:{autofocus:1,challenge:{challenge:1},disabled:{disabled:1},form:1,keytype:{rsa:1,dsa:1,ec:1},name:1},output:{"for":1,form:1,name:1},progress:{value:1,max:1},meter:{value:1,min:1,max:1,low:1,high:1,optimum:1},details:{open:1},summary:{},command:{type:1,label:1,icon:1,disabled:1,checked:1,radiogroup:1,command:1},menu:{type:1,label:1},dialog:{open:1}},a=Object.keys(u),h=function(){};(function(){this.getCompletions=function(e,t,n,r){var i=t.getTokenAt(n.row,n.column);if(!i)return[];if(f(i,"tag-name")||f(i,"tag-open")||f(i,"end-tag-open"))return this.getTagCompletions(e,t,n,r);if(f(i,"tag-whitespace")||f(i,"attribute-name"))return this.getAttributeCompletions(e,t,n,r);if(f(i,"attribute-value"))return this.getAttributeValueCompletions(e,t,n,r);var s=t.getLine(n.row).substr(0,n.column);return/&[a-z]*$/i.test(s)?this.getHTMLEntityCompletions(e,t,n,r):[]},this.getTagCompletions=function(e,t,n,r){return a.map(function(e){return{value:e,meta:"tag",score:Number.MAX_VALUE}})},this.getAttributeCompletions=function(e,t,n,r){var i=l(t,n);if(!i)return[];var s=o;return i in u&&(s=s.concat(Object.keys(u[i]))),s.map(function(e){return{caption:e,snippet:e+'="$0"',meta:"attribute",score:Number.MAX_VALUE}})},this.getAttributeValueCompletions=function(e,t,n,r){var i=l(t,n),s=c(t,n);if(!i)return[];var o=[];return i in u&&s in u[i]&&typeof u[i][s]=="object"&&(o=Object.keys(u[i][s])),o.map(function(e){return{caption:e,snippet:e,meta:"attribute value",score:Number.MAX_VALUE}})},this.getHTMLEntityCompletions=function(e,t,n,r){var i=["Aacute;","aacute;","Acirc;","acirc;","acute;","AElig;","aelig;","Agrave;","agrave;","alefsym;","Alpha;","alpha;","amp;","and;","ang;","Aring;","aring;","asymp;","Atilde;","atilde;","Auml;","auml;","bdquo;","Beta;","beta;","brvbar;","bull;","cap;","Ccedil;","ccedil;","cedil;","cent;","Chi;","chi;","circ;","clubs;","cong;","copy;","crarr;","cup;","curren;","Dagger;","dagger;","dArr;","darr;","deg;","Delta;","delta;","diams;","divide;","Eacute;","eacute;","Ecirc;","ecirc;","Egrave;","egrave;","empty;","emsp;","ensp;","Epsilon;","epsilon;","equiv;","Eta;","eta;","ETH;","eth;","Euml;","euml;","euro;","exist;","fnof;","forall;","frac12;","frac14;","frac34;","frasl;","Gamma;","gamma;","ge;","gt;","hArr;","harr;","hearts;","hellip;","Iacute;","iacute;","Icirc;","icirc;","iexcl;","Igrave;","igrave;","image;","infin;","int;","Iota;","iota;","iquest;","isin;","Iuml;","iuml;","Kappa;","kappa;","Lambda;","lambda;","lang;","laquo;","lArr;","larr;","lceil;","ldquo;","le;","lfloor;","lowast;","loz;","lrm;","lsaquo;","lsquo;","lt;","macr;","mdash;","micro;","middot;","minus;","Mu;","mu;","nabla;","nbsp;","ndash;","ne;","ni;","not;","notin;","nsub;","Ntilde;","ntilde;","Nu;","nu;","Oacute;","oacute;","Ocirc;","ocirc;","OElig;","oelig;","Ograve;","ograve;","oline;","Omega;","omega;","Omicron;","omicron;","oplus;","or;","ordf;","ordm;","Oslash;","oslash;","Otilde;","otilde;","otimes;","Ouml;","ouml;","para;","part;","permil;","perp;","Phi;","phi;","Pi;","pi;","piv;","plusmn;","pound;","Prime;","prime;","prod;","prop;","Psi;","psi;","quot;","radic;","rang;","raquo;","rArr;","rarr;","rceil;","rdquo;","real;","reg;","rfloor;","Rho;","rho;","rlm;","rsaquo;","rsquo;","sbquo;","Scaron;","scaron;","sdot;","sect;","shy;","Sigma;","sigma;","sigmaf;","sim;","spades;","sub;","sube;","sum;","sup;","sup1;","sup2;","sup3;","supe;","szlig;","Tau;","tau;","there4;","Theta;","theta;","thetasym;","thinsp;","THORN;","thorn;","tilde;","times;","trade;","Uacute;","uacute;","uArr;","uarr;","Ucirc;","ucirc;","Ugrave;","ugrave;","uml;","upsih;","Upsilon;","upsilon;","Uuml;","uuml;","weierp;","Xi;","xi;","Yacute;","yacute;","yen;","Yuml;","yuml;","Zeta;","zeta;","zwj;","zwnj;"];return i.map(function(e){return{caption:e,snippet:e,meta:"html entity",score:Number.MAX_VALUE}})}}).call(h.prototype),t.HtmlCompletions=h}),ace.define("ace/mode/html",["require","exports","module","ace/lib/oop","ace/lib/lang","ace/mode/text","ace/mode/javascript","ace/mode/css","ace/mode/html_highlight_rules","ace/mode/behaviour/xml","ace/mode/folding/html","ace/mode/html_completions","ace/worker/worker_client"],function(e,t,n){"use strict";var r=e("../lib/oop"),i=e("../lib/lang"),s=e("./text").Mode,o=e("./javascript").Mode,u=e("./css").Mode,a=e("./html_highlight_rules").HtmlHighlightRules,f=e("./behaviour/xml").XmlBehaviour,l=e("./folding/html").FoldMode,c=e("./html_completions").HtmlCompletions,h=e("../worker/worker_client").WorkerClient,p=["area","base","br","col","embed","hr","img","input","keygen","link","meta","menuitem","param","source","track","wbr"],d=["li","dt","dd","p","rt","rp","optgroup","option","colgroup","td","th"],v=function(e){this.fragmentContext=e&&e.fragmentContext,this.HighlightRules=a,this.$behaviour=new f,this.$completer=new c,this.createModeDelegates({"js-":o,"css-":u}),this.foldingRules=new l(this.voidElements,i.arrayToMap(d))};r.inherits(v,s),function(){this.blockComment={start:""},this.voidElements=i.arrayToMap(p),this.getNextLineIndent=function(e,t,n){return this.$getIndent(t)},this.checkOutdent=function(e,t,n){return!1},this.getCompletions=function(e,t,n,r){return this.$completer.getCompletions(e,t,n,r)},this.createWorker=function(e){if(this.constructor!=v)return;var t=new h(["ace"],"ace/mode/html_worker","Worker");return t.attachToDocument(e.getDocument()),this.fragmentContext&&t.call("setOptions",[{context:this.fragmentContext}]),t.on("error",function(t){e.setAnnotations(t.data)}),t.on("terminate",function(){e.clearAnnotations()}),t},this.$id="ace/mode/html"}.call(v.prototype),t.Mode=v}),ace.define("ace/mode/csharp_highlight_rules",["require","exports","module","ace/lib/oop","ace/mode/doc_comment_highlight_rules","ace/mode/text_highlight_rules"],function(e,t,n){"use strict";var r=e("../lib/oop"),i=e("./doc_comment_highlight_rules").DocCommentHighlightRules,s=e("./text_highlight_rules").TextHighlightRules,o=function(){var e=this.createKeywordMapper({"variable.language":"this",keyword:"abstract|event|new|struct|as|explicit|null|switch|base|extern|object|this|bool|false|operator|throw|break|finally|out|true|byte|fixed|override|try|case|float|params|typeof|catch|for|private|uint|char|foreach|protected|ulong|checked|goto|public|unchecked|class|if|readonly|unsafe|const|implicit|ref|ushort|continue|in|return|using|decimal|int|sbyte|virtual|default|interface|sealed|volatile|delegate|internal|short|void|do|is|sizeof|while|double|lock|stackalloc|else|long|static|enum|namespace|string|var|dynamic","constant.language":"null|true|false"},"identifier");this.$rules={start:[{token:"comment",regex:"\\/\\/.*$"},i.getStartRule("doc-start"),{token:"comment",regex:"\\/\\*",next:"comment"},{token:"string",regex:/'(?:.|\\(:?u[\da-fA-F]+|x[\da-fA-F]+|[tbrf'"n]))?'/},{token:"string",start:'"',end:'"|$',next:[{token:"constant.language.escape",regex:/\\(:?u[\da-fA-F]+|x[\da-fA-F]+|[tbrf'"n])/},{token:"invalid",regex:/\\./}]},{token:"string",start:'@"',end:'"',next:[{token:"constant.language.escape",regex:'""'}]},{token:"string",start:/\$"/,end:'"|$',next:[{token:"constant.language.escape",regex:/\\(:?$)|{{/},{token:"constant.language.escape",regex:/\\(:?u[\da-fA-F]+|x[\da-fA-F]+|[tbrf'"n])/},{token:"invalid",regex:/\\./}]},{token:"constant.numeric",regex:"0[xX][0-9a-fA-F]+\\b"},{token:"constant.numeric",regex:"[+-]?\\d+(?:(?:\\.\\d*)?(?:[eE][+-]?\\d+)?)?\\b"},{token:"constant.language.boolean",regex:"(?:true|false)\\b"},{token:e,regex:"[a-zA-Z_$][a-zA-Z0-9_$]*\\b"},{token:"keyword.operator",regex:"!|\\$|%|&|\\*|\\-\\-|\\-|\\+\\+|\\+|~|===|==|=|!=|!==|<=|>=|<<=|>>=|>>>=|<>|<|>|!|&&|\\|\\||\\?\\:|\\*=|%=|\\+=|\\-=|&=|\\^=|\\b(?:in|instanceof|new|delete|typeof|void)"},{token:"keyword",regex:"^\\s*#(if|else|elif|endif|define|undef|warning|error|line|region|endregion|pragma)"},{token:"punctuation.operator",regex:"\\?|\\:|\\,|\\;|\\."},{token:"paren.lparen",regex:"[[({]"},{token:"paren.rparen",regex:"[\\])}]"},{token:"text",regex:"\\s+"}],comment:[{token:"comment",regex:"\\*\\/",next:"start"},{defaultToken:"comment"}]},this.embedRules(i,"doc-",[i.getEndRule("start")]),this.normalizeRules()};r.inherits(o,s),t.CSharpHighlightRules=o}),ace.define("ace/mode/razor_highlight_rules",["require","exports","module","ace/lib/oop","ace/lib/lang","ace/mode/doc_comment_highlight_rules","ace/mode/html_highlight_rules","ace/mode/csharp_highlight_rules"],function(e,t,n){"use strict";var r=e("../lib/oop"),i=e("../lib/lang"),s=e("./doc_comment_highlight_rules").DocCommentHighlightRules,o=e("./html_highlight_rules").HtmlHighlightRules,u=e("./csharp_highlight_rules").CSharpHighlightRules,a="razor-block-",f=function(){u.call(this);var e=function(e,t){return typeof t=="function"?t(e):t},t="in-braces";this.$rules.start.unshift({regex:"[\\[({]",onMatch:function(e,n,r){var i=/razor-[^\-]+-/.exec(n)[0];return r.unshift(e),r.unshift(i+t),this.next=i+t,"paren.lparen"}},{start:"@\\*",end:"\\*@",token:"comment"});var n={"{":"}","[":"]","(":")"};this.$rules[t]=i.deepCopy(this.$rules.start),this.$rules[t].unshift({regex:"[\\])}]",onMatch:function(t,r,i){var s=i[1];return n[s]!==t?"invalid.illegal":(i.shift(),i.shift(),this.next=e(t,i[0])||"start","paren.rparen")}})};r.inherits(f,u);var l=function(){o.call(this);var e={regex:"@[({]|@functions{",onMatch:function(e,t,n){return n.unshift(e),n.unshift("razor-block-start"),this.next="razor-block-start","punctuation.block.razor"}},t={"@{":"}","@(":")","@functions{":"}"},n={regex:"[})]",onMatch:function(e,n,r){var i=r[1];return t[i]!==e?"invalid.illegal":(r.shift(),r.shift(),this.next=r.shift()||"start","punctuation.block.razor")}},r={regex:"@(?![{(])",onMatch:function(e,t,n){return n.unshift("razor-short-start"),this.next="razor-short-start","punctuation.short.razor"}},i={token:"",regex:"(?=[^A-Za-z_\\.()\\[\\]])",next:"pop"},s={regex:"@(?=if)",onMatch:function(e,t,n){return n.unshift(function(e){return e!=="}"?"start":n.shift()||"start"}),this.next="razor-block-start","punctuation.control.razor"}},u=[{start:"@\\*",end:"\\*@",token:"comment"},{token:["meta.directive.razor","text","identifier"],regex:"^(\\s*@model)(\\s+)(.+)$"},e,r];for(var a in this.$rules)this.$rules[a].unshift.apply(this.$rules[a],u);this.embedRules(f,"razor-block-",[n],["start"]),this.embedRules(f,"razor-short-",[i],["start"]),this.normalizeRules()};r.inherits(l,o),t.RazorHighlightRules=l,t.RazorLangHighlightRules=f}),ace.define("ace/mode/razor_completions",["require","exports","module","ace/token_iterator"],function(e,t,n){"use strict";var r=e("../token_iterator").TokenIterator,i=["abstract","as","base","bool","break","byte","case","catch","char","checked","class","const","continue","decimal","default","delegate","do","double","else","enum","event","explicit","extern","false","finally","fixed","float","for","foreach","goto","if","implicit","in","int","interface","internal","is","lock","long","namespace","new","null","object","operator","out","override","params","private","protected","public","readonly","ref","return","sbyte","sealed","short","sizeof","stackalloc","static","string","struct","switch","this","throw","true","try","typeof","uint","ulong","unchecked","unsafe","ushort","using","var","virtual","void","volatile","while"],s=["Html","Model","Url","Layout"],o=function(){};(function(){this.getCompletions=function(e,t,n,r){if(e.lastIndexOf("razor-short-start")==-1&&e.lastIndexOf("razor-block-start")==-1)return[];var i=t.getTokenAt(n.row,n.column);if(!i)return[];if(e.lastIndexOf("razor-short-start")!=-1)return this.getShortStartCompletions(e,t,n,r);if(e.lastIndexOf("razor-block-start")!=-1)return this.getKeywordCompletions(e,t,n,r)},this.getShortStartCompletions=function(e,t,n,r){return s.map(function(e){return{value:e,meta:"keyword",score:Number.MAX_VALUE}})},this.getKeywordCompletions=function(e,t,n,r){return s.concat(i).map(function(e){return{value:e,meta:"keyword",score:Number.MAX_VALUE}})}}).call(o.prototype),t.RazorCompletions=o}),ace.define("ace/mode/razor",["require","exports","module","ace/lib/oop","ace/mode/html","ace/mode/razor_highlight_rules","ace/mode/razor_completions","ace/mode/html_completions"],function(e,t,n){"use strict";var r=e("../lib/oop"),i=e("./html").Mode,s=e("./razor_highlight_rules").RazorHighlightRules,o=e("./razor_completions").RazorCompletions,u=e("./html_completions").HtmlCompletions,a=function(){i.call(this),this.$highlightRules=new s,this.$completer=new o,this.$htmlCompleter=new u};r.inherits(a,i),function(){this.getCompletions=function(e,t,n,r){var i=this.$completer.getCompletions(e,t,n,r),s=this.$htmlCompleter.getCompletions(e,t,n,r);return i.concat(s)},this.createWorker=function(e){return null},this.$id="ace/mode/razor"}.call(a.prototype),t.Mode=a}) \ No newline at end of file diff --git a/src/UmbracoUrlHandling/Umbraco/lib/ace-builds/src-min-noconflict/snippets/javascript.js b/src/UmbracoUrlHandling/Umbraco/lib/ace-builds/src-min-noconflict/snippets/javascript.js new file mode 100644 index 0000000..09f0fe0 --- /dev/null +++ b/src/UmbracoUrlHandling/Umbraco/lib/ace-builds/src-min-noconflict/snippets/javascript.js @@ -0,0 +1 @@ +ace.define("ace/snippets/javascript",["require","exports","module"],function(e,t,n){"use strict";t.snippetText='# Prototype\nsnippet proto\n ${1:class_name}.prototype.${2:method_name} = function(${3:first_argument}) {\n ${4:// body...}\n };\n# Function\nsnippet fun\n function ${1?:function_name}(${2:argument}) {\n ${3:// body...}\n }\n# Anonymous Function\nregex /((=)\\s*|(:)\\s*|(\\()|\\b)/f/(\\))?/\nsnippet f\n function${M1?: ${1:functionName}}($2) {\n ${0:$TM_SELECTED_TEXT}\n }${M2?;}${M3?,}${M4?)}\n# Immediate function\ntrigger \\(?f\\(\nendTrigger \\)?\nsnippet f(\n (function(${1}) {\n ${0:${TM_SELECTED_TEXT:/* code */}}\n }(${1}));\n# if\nsnippet if\n if (${1:true}) {\n ${0}\n }\n# if ... else\nsnippet ife\n if (${1:true}) {\n ${2}\n } else {\n ${0}\n }\n# tertiary conditional\nsnippet ter\n ${1:/* condition */} ? ${2:a} : ${3:b}\n# switch\nsnippet switch\n switch (${1:expression}) {\n case \'${3:case}\':\n ${4:// code}\n break;\n ${5}\n default:\n ${2:// code}\n }\n# case\nsnippet case\n case \'${1:case}\':\n ${2:// code}\n break;\n ${3}\n\n# while (...) {...}\nsnippet wh\n while (${1:/* condition */}) {\n ${0:/* code */}\n }\n# try\nsnippet try\n try {\n ${0:/* code */}\n } catch (e) {}\n# do...while\nsnippet do\n do {\n ${2:/* code */}\n } while (${1:/* condition */});\n# Object Method\nsnippet :f\nregex /([,{[])|^\\s*/:f/\n ${1:method_name}: function(${2:attribute}) {\n ${0}\n }${3:,}\n# setTimeout function\nsnippet setTimeout\nregex /\\b/st|timeout|setTimeo?u?t?/\n setTimeout(function() {${3:$TM_SELECTED_TEXT}}, ${1:10});\n# Get Elements\nsnippet gett\n getElementsBy${1:TagName}(\'${2}\')${3}\n# Get Element\nsnippet get\n getElementBy${1:Id}(\'${2}\')${3}\n# console.log (Firebug)\nsnippet cl\n console.log(${1});\n# return\nsnippet ret\n return ${1:result}\n# for (property in object ) { ... }\nsnippet fori\n for (var ${1:prop} in ${2:Things}) {\n ${0:$2[$1]}\n }\n# hasOwnProperty\nsnippet has\n hasOwnProperty(${1})\n# docstring\nsnippet /**\n /**\n * ${1:description}\n *\n */\nsnippet @par\nregex /^\\s*\\*\\s*/@(para?m?)?/\n @param {${1:type}} ${2:name} ${3:description}\nsnippet @ret\n @return {${1:type}} ${2:description}\n# JSON.parse\nsnippet jsonp\n JSON.parse(${1:jstr});\n# JSON.stringify\nsnippet jsons\n JSON.stringify(${1:object});\n# self-defining function\nsnippet sdf\n var ${1:function_name} = function(${2:argument}) {\n ${3:// initial code ...}\n\n $1 = function($2) {\n ${4:// main code}\n };\n }\n# singleton\nsnippet sing\n function ${1:Singleton} (${2:argument}) {\n // the cached instance\n var instance;\n\n // rewrite the constructor\n $1 = function $1($2) {\n return instance;\n };\n \n // carry over the prototype properties\n $1.prototype = this;\n\n // the instance\n instance = new $1();\n\n // reset the constructor pointer\n instance.constructor = $1;\n\n ${3:// code ...}\n\n return instance;\n }\n# class\nsnippet class\nregex /^\\s*/clas{0,2}/\n var ${1:class} = function(${20}) {\n $40$0\n };\n \n (function() {\n ${60:this.prop = ""}\n }).call(${1:class}.prototype);\n \n exports.${1:class} = ${1:class};\n# \nsnippet for-\n for (var ${1:i} = ${2:Things}.length; ${1:i}--; ) {\n ${0:${2:Things}[${1:i}];}\n }\n# for (...) {...}\nsnippet for\n for (var ${1:i} = 0; $1 < ${2:Things}.length; $1++) {\n ${3:$2[$1]}$0\n }\n# for (...) {...} (Improved Native For-Loop)\nsnippet forr\n for (var ${1:i} = ${2:Things}.length - 1; $1 >= 0; $1--) {\n ${3:$2[$1]}$0\n }\n\n\n#modules\nsnippet def\n define(function(require, exports, module) {\n "use strict";\n var ${1/.*\\///} = require("${1}");\n \n $TM_SELECTED_TEXT\n });\nsnippet req\nguard ^\\s*\n var ${1/.*\\///} = require("${1}");\n $0\nsnippet requ\nguard ^\\s*\n var ${1/.*\\/(.)/\\u$1/} = require("${1}").${1/.*\\/(.)/\\u$1/};\n $0\n',t.scope="javascript"}) \ No newline at end of file diff --git a/src/UmbracoUrlHandling/Umbraco/lib/ace-builds/src-min-noconflict/snippets/text.js b/src/UmbracoUrlHandling/Umbraco/lib/ace-builds/src-min-noconflict/snippets/text.js new file mode 100644 index 0000000..233803d --- /dev/null +++ b/src/UmbracoUrlHandling/Umbraco/lib/ace-builds/src-min-noconflict/snippets/text.js @@ -0,0 +1 @@ +ace.define("ace/snippets/text",["require","exports","module"],function(e,t,n){"use strict";t.snippetText=undefined,t.scope="text"}) \ No newline at end of file diff --git a/src/UmbracoUrlHandling/Umbraco/lib/ace-builds/src-min-noconflict/theme-chrome.js b/src/UmbracoUrlHandling/Umbraco/lib/ace-builds/src-min-noconflict/theme-chrome.js new file mode 100644 index 0000000..29b01c7 --- /dev/null +++ b/src/UmbracoUrlHandling/Umbraco/lib/ace-builds/src-min-noconflict/theme-chrome.js @@ -0,0 +1 @@ +ace.define("ace/theme/chrome",["require","exports","module","ace/lib/dom"],function(e,t,n){t.isDark=!1,t.cssClass="ace-chrome",t.cssText='.ace-chrome .ace_gutter {background: #ebebeb;color: #333;overflow : hidden;}.ace-chrome .ace_print-margin {width: 1px;background: #e8e8e8;}.ace-chrome {background-color: #FFFFFF;color: black;}.ace-chrome .ace_cursor {color: black;}.ace-chrome .ace_invisible {color: rgb(191, 191, 191);}.ace-chrome .ace_constant.ace_buildin {color: rgb(88, 72, 246);}.ace-chrome .ace_constant.ace_language {color: rgb(88, 92, 246);}.ace-chrome .ace_constant.ace_library {color: rgb(6, 150, 14);}.ace-chrome .ace_invalid {background-color: rgb(153, 0, 0);color: white;}.ace-chrome .ace_fold {}.ace-chrome .ace_support.ace_function {color: rgb(60, 76, 114);}.ace-chrome .ace_support.ace_constant {color: rgb(6, 150, 14);}.ace-chrome .ace_support.ace_type,.ace-chrome .ace_support.ace_class.ace-chrome .ace_support.ace_other {color: rgb(109, 121, 222);}.ace-chrome .ace_variable.ace_parameter {font-style:italic;color:#FD971F;}.ace-chrome .ace_keyword.ace_operator {color: rgb(104, 118, 135);}.ace-chrome .ace_comment {color: #236e24;}.ace-chrome .ace_comment.ace_doc {color: #236e24;}.ace-chrome .ace_comment.ace_doc.ace_tag {color: #236e24;}.ace-chrome .ace_constant.ace_numeric {color: rgb(0, 0, 205);}.ace-chrome .ace_variable {color: rgb(49, 132, 149);}.ace-chrome .ace_xml-pe {color: rgb(104, 104, 91);}.ace-chrome .ace_entity.ace_name.ace_function {color: #0000A2;}.ace-chrome .ace_heading {color: rgb(12, 7, 255);}.ace-chrome .ace_list {color:rgb(185, 6, 144);}.ace-chrome .ace_marker-layer .ace_selection {background: rgb(181, 213, 255);}.ace-chrome .ace_marker-layer .ace_step {background: rgb(252, 255, 0);}.ace-chrome .ace_marker-layer .ace_stack {background: rgb(164, 229, 101);}.ace-chrome .ace_marker-layer .ace_bracket {margin: -1px 0 0 -1px;border: 1px solid rgb(192, 192, 192);}.ace-chrome .ace_marker-layer .ace_active-line {background: rgba(0, 0, 0, 0.07);}.ace-chrome .ace_gutter-active-line {background-color : #dcdcdc;}.ace-chrome .ace_marker-layer .ace_selected-word {background: rgb(250, 250, 255);border: 1px solid rgb(200, 200, 250);}.ace-chrome .ace_storage,.ace-chrome .ace_keyword,.ace-chrome .ace_meta.ace_tag {color: rgb(147, 15, 128);}.ace-chrome .ace_string.ace_regex {color: rgb(255, 0, 0)}.ace-chrome .ace_string {color: #1A1AA6;}.ace-chrome .ace_entity.ace_other.ace_attribute-name {color: #994409;}.ace-chrome .ace_indent-guide {background: url("data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAEAAAACCAYAAACZgbYnAAAAE0lEQVQImWP4////f4bLly//BwAmVgd1/w11/gAAAABJRU5ErkJggg==") right repeat-y;}';var r=e("../lib/dom");r.importCssString(t.cssText,t.cssClass)}) \ No newline at end of file diff --git a/src/UmbracoUrlHandling/Umbraco/lib/ace-builds/src-min-noconflict/worker-javascript.js b/src/UmbracoUrlHandling/Umbraco/lib/ace-builds/src-min-noconflict/worker-javascript.js new file mode 100644 index 0000000..ea75203 --- /dev/null +++ b/src/UmbracoUrlHandling/Umbraco/lib/ace-builds/src-min-noconflict/worker-javascript.js @@ -0,0 +1 @@ +"no use strict";(function(e){function t(e,t){var n=e,r="";while(n){var i=t[n];if(typeof i=="string")return i+r;if(i)return i.location.replace(/\/*$/,"/")+(r||i.main||i.name);if(i===!1)return"";var s=n.lastIndexOf("/");if(s===-1)break;r=n.substr(s)+r,n=n.slice(0,s)}return e}if(typeof e.window!="undefined"&&e.document)return;if(e.require&&e.define)return;e.console||(e.console=function(){var e=Array.prototype.slice.call(arguments,0);postMessage({type:"log",data:e})},e.console.error=e.console.warn=e.console.log=e.console.trace=e.console),e.window=e,e.ace=e,e.onerror=function(e,t,n,r,i){postMessage({type:"error",data:{message:e,data:i.data,file:t,line:n,col:r,stack:i.stack}})},e.normalizeModule=function(t,n){if(n.indexOf("!")!==-1){var r=n.split("!");return e.normalizeModule(t,r[0])+"!"+e.normalizeModule(t,r[1])}if(n.charAt(0)=="."){var i=t.split("/").slice(0,-1).join("/");n=(i?i+"/":"")+n;while(n.indexOf(".")!==-1&&s!=n){var s=n;n=n.replace(/^\.\//,"").replace(/\/\.\//,"/").replace(/[^\/]+\/\.\.\//,"")}}return n},e.require=function(r,i){i||(i=r,r=null);if(!i.charAt)throw new Error("worker.js require() accepts only (parentId, id) as arguments");i=e.normalizeModule(r,i);var s=e.require.modules[i];if(s)return s.initialized||(s.initialized=!0,s.exports=s.factory().exports),s.exports;if(!e.require.tlns)return console.log("unable to load "+i);var o=t(i,e.require.tlns);return o.slice(-3)!=".js"&&(o+=".js"),e.require.id=i,e.require.modules[i]={},importScripts(o),e.require(r,i)},e.require.modules={},e.require.tlns={},e.define=function(t,n,r){arguments.length==2?(r=n,typeof t!="string"&&(n=t,t=e.require.id)):arguments.length==1&&(r=t,n=[],t=e.require.id);if(typeof r!="function"){e.require.modules[t]={exports:r,initialized:!0};return}n.length||(n=["require","exports","module"]);var i=function(n){return e.require(t,n)};e.require.modules[t]={exports:{},factory:function(){var e=this,t=r.apply(this,n.map(function(t){switch(t){case"require":return i;case"exports":return e.exports;case"module":return e;default:return i(t)}}));return t&&(e.exports=t),e}}},e.define.amd={},require.tlns={},e.initBaseUrls=function(t){for(var n in t)require.tlns[n]=t[n]},e.initSender=function(){var n=e.require("ace/lib/event_emitter").EventEmitter,r=e.require("ace/lib/oop"),i=function(){};return function(){r.implement(this,n),this.callback=function(e,t){postMessage({type:"call",id:t,data:e})},this.emit=function(e,t){postMessage({type:"event",name:e,data:t})}}.call(i.prototype),new i};var n=e.main=null,r=e.sender=null;e.onmessage=function(t){var i=t.data;if(i.event&&r)r._signal(i.event,i.data);else if(i.command)if(n[i.command])n[i.command].apply(n,i.args);else{if(!e[i.command])throw new Error("Unknown command:"+i.command);e[i.command].apply(e,i.args)}else if(i.init){e.initBaseUrls(i.tlns),require("ace/lib/es5-shim"),r=e.sender=e.initSender();var s=require(i.module)[i.classname];n=e.main=new s(r)}}})(this),ace.define("ace/lib/oop",["require","exports","module"],function(e,t,n){"use strict";t.inherits=function(e,t){e.super_=t,e.prototype=Object.create(t.prototype,{constructor:{value:e,enumerable:!1,writable:!0,configurable:!0}})},t.mixin=function(e,t){for(var n in t)e[n]=t[n];return e},t.implement=function(e,n){t.mixin(e,n)}}),ace.define("ace/range",["require","exports","module"],function(e,t,n){"use strict";var r=function(e,t){return e.row-t.row||e.column-t.column},i=function(e,t,n,r){this.start={row:e,column:t},this.end={row:n,column:r}};(function(){this.isEqual=function(e){return this.start.row===e.start.row&&this.end.row===e.end.row&&this.start.column===e.start.column&&this.end.column===e.end.column},this.toString=function(){return"Range: ["+this.start.row+"/"+this.start.column+"] -> ["+this.end.row+"/"+this.end.column+"]"},this.contains=function(e,t){return this.compare(e,t)==0},this.compareRange=function(e){var t,n=e.end,r=e.start;return t=this.compare(n.row,n.column),t==1?(t=this.compare(r.row,r.column),t==1?2:t==0?1:0):t==-1?-2:(t=this.compare(r.row,r.column),t==-1?-1:t==1?42:0)},this.comparePoint=function(e){return this.compare(e.row,e.column)},this.containsRange=function(e){return this.comparePoint(e.start)==0&&this.comparePoint(e.end)==0},this.intersects=function(e){var t=this.compareRange(e);return t==-1||t==0||t==1},this.isEnd=function(e,t){return this.end.row==e&&this.end.column==t},this.isStart=function(e,t){return this.start.row==e&&this.start.column==t},this.setStart=function(e,t){typeof e=="object"?(this.start.column=e.column,this.start.row=e.row):(this.start.row=e,this.start.column=t)},this.setEnd=function(e,t){typeof e=="object"?(this.end.column=e.column,this.end.row=e.row):(this.end.row=e,this.end.column=t)},this.inside=function(e,t){return this.compare(e,t)==0?this.isEnd(e,t)||this.isStart(e,t)?!1:!0:!1},this.insideStart=function(e,t){return this.compare(e,t)==0?this.isEnd(e,t)?!1:!0:!1},this.insideEnd=function(e,t){return this.compare(e,t)==0?this.isStart(e,t)?!1:!0:!1},this.compare=function(e,t){return!this.isMultiLine()&&e===this.start.row?tthis.end.column?1:0:ethis.end.row?1:this.start.row===e?t>=this.start.column?0:-1:this.end.row===e?t<=this.end.column?0:1:0},this.compareStart=function(e,t){return this.start.row==e&&this.start.column==t?-1:this.compare(e,t)},this.compareEnd=function(e,t){return this.end.row==e&&this.end.column==t?1:this.compare(e,t)},this.compareInside=function(e,t){return this.end.row==e&&this.end.column==t?1:this.start.row==e&&this.start.column==t?-1:this.compare(e,t)},this.clipRows=function(e,t){if(this.end.row>t)var n={row:t+1,column:0};else if(this.end.rowt)var r={row:t+1,column:0};else if(this.start.row=0&&t.row=0&&t.column<=e[t.row].length}function s(e,t){t.action!="insert"&&t.action!="remove"&&r(t,"delta.action must be 'insert' or 'remove'"),t.lines instanceof Array||r(t,"delta.lines must be an Array"),(!t.start||!t.end)&&r(t,"delta.start/end must be an present");var n=t.start;i(e,t.start)||r(t,"delta.start must be contained in document");var s=t.end;t.action=="remove"&&!i(e,s)&&r(t,"delta.end must contained in document for 'remove' actions");var o=s.row-n.row,u=s.column-(o==0?n.column:0);(o!=t.lines.length-1||t.lines[o].length!=u)&&r(t,"delta.range must match delta lines")}t.applyDelta=function(e,t,n){var r=t.start.row,i=t.start.column,s=e[r]||"";switch(t.action){case"insert":var o=t.lines;if(o.length===1)e[r]=s.substring(0,i)+t.lines[0]+s.substring(i);else{var u=[r,1].concat(t.lines);e.splice.apply(e,u),e[r]=s.substring(0,i)+e[r],e[r+t.lines.length-1]+=s.substring(i)}break;case"remove":var a=t.end.column,f=t.end.row;r===f?e[r]=s.substring(0,i)+s.substring(a):e.splice(r,f-r+1,s.substring(0,i)+e[f].substring(a))}}}),ace.define("ace/lib/event_emitter",["require","exports","module"],function(e,t,n){"use strict";var r={},i=function(){this.propagationStopped=!0},s=function(){this.defaultPrevented=!0};r._emit=r._dispatchEvent=function(e,t){this._eventRegistry||(this._eventRegistry={}),this._defaultHandlers||(this._defaultHandlers={});var n=this._eventRegistry[e]||[],r=this._defaultHandlers[e];if(!n.length&&!r)return;if(typeof t!="object"||!t)t={};t.type||(t.type=e),t.stopPropagation||(t.stopPropagation=i),t.preventDefault||(t.preventDefault=s),n=n.slice();for(var o=0;othis.row)return;var n=t(e,{row:this.row,column:this.column},this.$insertRight);this.setPosition(n.row,n.column,!0)},this.setPosition=function(e,t,n){var r;n?r={row:e,column:t}:r=this.$clipPositionToDocument(e,t);if(this.row==r.row&&this.column==r.column)return;var i={row:this.row,column:this.column};this.row=r.row,this.column=r.column,this._signal("change",{old:i,value:r})},this.detach=function(){this.document.removeEventListener("change",this.$onChange)},this.attach=function(e){this.document=e||this.document,this.document.on("change",this.$onChange)},this.$clipPositionToDocument=function(e,t){var n={};return e>=this.document.getLength()?(n.row=Math.max(0,this.document.getLength()-1),n.column=this.document.getLine(n.row).length):e<0?(n.row=0,n.column=0):(n.row=e,n.column=Math.min(this.document.getLine(n.row).length,Math.max(0,t))),t<0&&(n.column=0),n}}).call(s.prototype)}),ace.define("ace/document",["require","exports","module","ace/lib/oop","ace/apply_delta","ace/lib/event_emitter","ace/range","ace/anchor"],function(e,t,n){"use strict";var r=e("./lib/oop"),i=e("./apply_delta").applyDelta,s=e("./lib/event_emitter").EventEmitter,o=e("./range").Range,u=e("./anchor").Anchor,a=function(e){this.$lines=[""],e.length===0?this.$lines=[""]:Array.isArray(e)?this.insertMergedLines({row:0,column:0},e):this.insert({row:0,column:0},e)};(function(){r.implement(this,s),this.setValue=function(e){var t=this.getLength()-1;this.remove(new o(0,0,t,this.getLine(t).length)),this.insert({row:0,column:0},e)},this.getValue=function(){return this.getAllLines().join(this.getNewLineCharacter())},this.createAnchor=function(e,t){return new u(this,e,t)},"aaa".split(/a/).length===0?this.$split=function(e){return e.replace(/\r\n|\r/g,"\n").split("\n")}:this.$split=function(e){return e.split(/\r\n|\r|\n/)},this.$detectNewLine=function(e){var t=e.match(/^.*?(\r\n|\r|\n)/m);this.$autoNewLine=t?t[1]:"\n",this._signal("changeNewLineMode")},this.getNewLineCharacter=function(){switch(this.$newLineMode){case"windows":return"\r\n";case"unix":return"\n";default:return this.$autoNewLine||"\n"}},this.$autoNewLine="",this.$newLineMode="auto",this.setNewLineMode=function(e){if(this.$newLineMode===e)return;this.$newLineMode=e,this._signal("changeNewLineMode")},this.getNewLineMode=function(){return this.$newLineMode},this.isNewLine=function(e){return e=="\r\n"||e=="\r"||e=="\n"},this.getLine=function(e){return this.$lines[e]||""},this.getLines=function(e,t){return this.$lines.slice(e,t+1)},this.getAllLines=function(){return this.getLines(0,this.getLength())},this.getLength=function(){return this.$lines.length},this.getTextRange=function(e){return this.getLinesForRange(e).join(this.getNewLineCharacter())},this.getLinesForRange=function(e){var t;if(e.start.row===e.end.row)t=[this.getLine(e.start.row).substring(e.start.column,e.end.column)];else{t=this.getLines(e.start.row,e.end.row),t[0]=(t[0]||"").substring(e.start.column);var n=t.length-1;e.end.row-e.start.row==n&&(t[n]=t[n].substring(0,e.end.column))}return t},this.insertLines=function(e,t){return console.warn("Use of document.insertLines is deprecated. Use the insertFullLines method instead."),this.insertFullLines(e,t)},this.removeLines=function(e,t){return console.warn("Use of document.removeLines is deprecated. Use the removeFullLines method instead."),this.removeFullLines(e,t)},this.insertNewLine=function(e){return console.warn("Use of document.insertNewLine is deprecated. Use insertMergedLines(position, ['', '']) instead."),this.insertMergedLines(e,["",""])},this.insert=function(e,t){return this.getLength()<=1&&this.$detectNewLine(t),this.insertMergedLines(e,this.$split(t))},this.insertInLine=function(e,t){var n=this.clippedPos(e.row,e.column),r=this.pos(e.row,e.column+t.length);return this.applyDelta({start:n,end:r,action:"insert",lines:[t]},!0),this.clonePos(r)},this.clippedPos=function(e,t){var n=this.getLength();e===undefined?e=n:e<0?e=0:e>=n&&(e=n-1,t=undefined);var r=this.getLine(e);return t==undefined&&(t=r.length),t=Math.min(Math.max(t,0),r.length),{row:e,column:t}},this.clonePos=function(e){return{row:e.row,column:e.column}},this.pos=function(e,t){return{row:e,column:t}},this.$clipPosition=function(e){var t=this.getLength();return e.row>=t?(e.row=Math.max(0,t-1),e.column=this.getLine(t-1).length):(e.row=Math.max(0,e.row),e.column=Math.min(Math.max(e.column,0),this.getLine(e.row).length)),e},this.insertFullLines=function(e,t){e=Math.min(Math.max(e,0),this.getLength());var n=0;e0,r=t=0&&this.applyDelta({start:this.pos(e,this.getLine(e).length),end:this.pos(e+1,0),action:"remove",lines:["",""]})},this.replace=function(e,t){e instanceof o||(e=o.fromPoints(e.start,e.end));if(t.length===0&&e.isEmpty())return e.start;if(t==this.getTextRange(e))return e.end;this.remove(e);var n;return t?n=this.insert(e.start,t):n=e.start,n},this.applyDeltas=function(e){for(var t=0;t=0;t--)this.revertDelta(e[t])},this.applyDelta=function(e,t){var n=e.action=="insert";if(n?e.lines.length<=1&&!e.lines[0]:!o.comparePoints(e.start,e.end))return;n&&e.lines.length>2e4&&this.$splitAndapplyLargeDelta(e,2e4),i(this.$lines,e,t),this._signal("change",e)},this.$splitAndapplyLargeDelta=function(e,t){var n=e.lines,r=n.length,i=e.start.row,s=e.start.column,o=0,u=0;do{o=u,u+=t-1;var a=n.slice(o,u);if(u>r){e.lines=a,e.start.row=i+o,e.start.column=s;break}a.push(""),this.applyDelta({start:this.pos(i+o,s),end:this.pos(i+u,s=0),action:e.action,lines:a},!0)}while(!0)},this.revertDelta=function(e){this.applyDelta({start:this.clonePos(e.start),end:this.clonePos(e.end),action:e.action=="insert"?"remove":"insert",lines:e.lines.slice()})},this.indexToPosition=function(e,t){var n=this.$lines||this.getAllLines(),r=this.getNewLineCharacter().length;for(var i=t||0,s=n.length;i0){t&1&&(n+=e);if(t>>=1)e+=e}return n};var r=/^\s\s*/,i=/\s\s*$/;t.stringTrimLeft=function(e){return e.replace(r,"")},t.stringTrimRight=function(e){return e.replace(i,"")},t.copyObject=function(e){var t={};for(var n in e)t[n]=e[n];return t},t.copyArray=function(e){var t=[];for(var n=0,r=e.length;n0&&this._events[e].length>n&&(this._events[e].warned=!0,console.error("(node) warning: possible EventEmitter memory leak detected. %d listeners added. Use emitter.setMaxListeners() to increase limit.",this._events[e].length),typeof console.trace=="function"&&console.trace())}return this},r.prototype.on=r.prototype.addListener,r.prototype.once=function(e,t){function r(){this.removeListener(e,r),n||(n=!0,t.apply(this,arguments))}if(!i(t))throw TypeError("listener must be a function");var n=!1;return r.listener=t,this.on(e,r),this},r.prototype.removeListener=function(e,t){var n,r,s,u;if(!i(t))throw TypeError("listener must be a function");if(!this._events||!this._events[e])return this;n=this._events[e],s=n.length,r=-1;if(n===t||i(n.listener)&&n.listener===t)delete this._events[e],this._events.removeListener&&this.emit("removeListener",e,t);else if(o(n)){for(u=s;u-->0;)if(n[u]===t||n[u].listener&&n[u].listener===t){r=u;break}if(r<0)return this;n.length===1?(n.length=0,delete this._events[e]):n.splice(r,1),this._events.removeListener&&this.emit("removeListener",e,t)}return this},r.prototype.removeAllListeners=function(e){var t,n;if(!this._events)return this;if(!this._events.removeListener)return arguments.length===0?this._events={}:this._events[e]&&delete this._events[e],this;if(arguments.length===0){for(t in this._events){if(t==="removeListener")continue;this.removeAllListeners(t)}return this.removeAllListeners("removeListener"),this._events={},this}n=this._events[e];if(i(n))this.removeListener(e,n);else while(n.length)this.removeListener(e,n[n.length-1]);return delete this._events[e],this},r.prototype.listeners=function(e){var t;return!this._events||!this._events[e]?t=[]:i(this._events[e])?t=[this._events[e]]:t=this._events[e].slice(),t},r.listenerCount=function(e,t){var n;return!e._events||!e._events[t]?n=0:i(e._events[t])?n=1:n=e._events[t].length,n}},{}],"/node_modules/jshint/data/ascii-identifier-data.js":[function(e,t,n){var r=[];for(var i=0;i<128;i++)r[i]=i===36||i>=65&&i<=90||i===95||i>=97&&i<=122;var s=[];for(var i=0;i<128;i++)s[i]=r[i]||i>=48&&i<=57;t.exports={asciiIdentifierStartTable:r,asciiIdentifierPartTable:s}},{}],"/node_modules/jshint/lodash.js":[function(e,t,n){(function(e){(function(){function $(e,t,n){var r=e.length,i=n?r:-1;while(n?i--:++ir&&(r=i)}return r}function Dt(e,t){var n=-1,r=e.length;while(++ns?0:s+t),n=n===r||n>s?s:+n||0,n<0&&(n+=s),s=t>n?0:n-t>>>0,t>>>=0;var o=Array(s);while(++i>>1,o=e[s];(n?o<=t:o2&&n[i-2],o=i>2&&n[2],u=i>1&&n[i-1];typeof s=="function"?(s=on(s,u,5),i-=2):(s=typeof u=="function"?u:null,i-=s?1:0),o&&Tn(n[0],n[1],o)&&(s=i<3?null:s,i=1);while(++rf))return!1;while(c&&++a-1&&e%1==0&&e-1&&e%1==0&&e<=Nt}function kn(e){return e===e&&(e===0?1/e>0:!Jn(e))}function Ln(e){var t,n=Ct.support;if(!Y(e)||rt.call(e)!=d||!nt.call(e,"constructor")&&(t=e.constructor,typeof t=="function"&&!(t instanceof t)))return!1;var i;return Ut(e,function(e,t){i=t}),i===r||nt.call(e,i)}function An(e){var t=ir(e),n=t.length,r=n&&e.length,i=Ct.support,s=r&&Cn(r)&&(Xn(e)||i.nonEnumArgs&&Wn(e)),o=-1,u=[];while(++o>>0,r=Array(n);while(++t-1:gn(e,t,n)>-1):!1}function qn(e,t,n){var r=Xn(e)?Ot:qt;return t=mn(t,n,3),r(e,function(e,n,r){return!t(e,n,r)})}function Rn(e,t,n){var i=Xn(e)?Dt:tn;n&&Tn(e,t,n)&&(t=null);if(typeof t!="function"||n!==r)t=mn(t,n,3);return i(e,t)}function Un(e,t){if(typeof e!="function")throw new TypeError(s);return t=yt(t===r?e.length-1:+t||0,0),function(){var n=arguments,r=-1,i=yt(n.length-t,0),s=Array(i);while(++r0;while(++r>>1,Tt=dt?dt.BYTES_PER_ELEMENT:0,Nt=Math.pow(2,53)-1,kt=Ct.support={};(function(e){var t=function(){this.x=e},n={0:e,length:e},r=[];t.prototype={valueOf:e,y:e};for(var i in new t)r.push(i);kt.funcDecomp=/\bthis\b/.test(function(){return this}),kt.funcNames=typeof Function.name=="string";try{kt.nonEnumArgs=!ht.call(arguments,1)}catch(s){kt.nonEnumArgs=!0}})(1,0);var Ht=vt||function(e,t){return t==null?e:Bt(t,bn(t),Bt(t,rr(t),e))},It=fn(zt),Rt=ln();ot||(un=!st||!pt?fr(null):function(e){var t=e.byteLength,n=dt?ut(t/Tt):0,r=n*Tt,i=new st(t);if(n){var s=new dt(i,0,n);s.set(new dt(e,0,n))}return t!=r&&(s=new pt(i,r),s.set(new pt(e,r))),i});var yn=Yt("length"),bn=at?function(e){return at(On(e))}:fr([]),_n=cn(!0),jn=Un(Bn),Fn=hn(At,It),Xn=mt||function(e){return Y(e)&&Cn(e.length)&&rt.call(e)==u},$n=K(/x/)||pt&&!K(pt)?function(e){return rt.call(e)==c}:K,Gn=ft?function(e){if(!e||rt.call(e)!=d)return!1;var t=e.valueOf,n=Kn(t)&&(n=ft(t))&&ft(n);return n?e==n||ft(e)==n:Ln(e)}:Ln,tr=an(function(e,t,n){return n?Pt(e,t,n):Ht(e,t)}),rr=gt?function(e){if(e)var t=e.constructor,n=e.length;return typeof t=="function"&&t.prototype===e||typeof e!="function"&&Cn(n)?An(e):Jn(e)?gt(e):[]}:An,sr=an(Qt);Ct.assign=tr,Ct.callback=ar,Ct.constant=fr,Ct.forEach=Fn,Ct.keys=rr,Ct.keysIn=ir,Ct.merge=sr,Ct.property=cr,Ct.reject=qn,Ct.restParam=Un,Ct.slice=Hn,Ct.toPlainObject=er,Ct.unzip=Bn,Ct.values=or,Ct.zip=jn,Ct.each=Fn,Ct.extend=tr,Ct.iteratee=ar,Ct.clone=zn,Ct.escapeRegExp=ur,Ct.findLastIndex=_n,Ct.has=nr,Ct.identity=lr,Ct.includes=In,Ct.indexOf=Dn,Ct.isArguments=Wn,Ct.isArray=Xn,Ct.isEmpty=Vn,Ct.isFunction=$n,Ct.isNative=Kn,Ct.isNumber=Qn,Ct.isObject=Jn,Ct.isPlainObject=Gn,Ct.isString=Yn,Ct.isTypedArray=Zn,Ct.last=Pn,Ct.some=Rn,Ct.any=Rn,Ct.contains=In,Ct.include=In,Ct.VERSION=i,q&&R?X?(R.exports=Ct)._=Ct:q._=Ct:V._=Ct}).call(this)}).call(this,typeof global!="undefined"?global:typeof self!="undefined"?self:typeof window!="undefined"?window:{})},{}],"/node_modules/jshint/src/jshint.js":[function(e,t,n){var r=e("../lodash"),i=e("events"),s=e("./vars.js"),o=e("./messages.js"),u=e("./lex.js").Lexer,a=e("./reg.js"),f=e("./state.js").state,l=e("./style.js"),c=e("./options.js"),h=e("./scope-manager.js"),p=function(){"use strict";function k(e,t){return e=e.trim(),/^[+-]W\d{3}$/g.test(e)?!0:c.validNames.indexOf(e)===-1&&t.type!=="jslint"&&!r.has(c.removed,e)?(q("E001",t,e),!1):!0}function L(e){return Object.prototype.toString.call(e)==="[object String]"}function A(e,t){return e?!e.identifier||e.value!==t?!1:!0:!1}function O(e){if(!e.reserved)return!1;var t=e.meta;if(t&&t.isFutureReservedWord&&f.inES5()){if(!t.es5)return!1;if(t.strictOnly&&!f.option.strict&&!f.isStrict())return!1;if(e.isProperty)return!1}return!0}function M(e,t){return e.replace(/\{([^{}]*)\}/g,function(e,n){var r=t[n];return typeof r=="string"||typeof r=="number"?r:e})}function D(e,t){Object.keys(t).forEach(function(n){if(r.has(p.blacklist,n))return;e[n]=t[n]})}function P(){if(f.option.enforceall){for(var e in c.bool.enforcing)f.option[e]===undefined&&!c.noenforceall[e]&&(f.option[e]=!0);for(var t in c.bool.relaxing)f.option[t]===undefined&&(f.option[t]=!1)}}function H(){P(),!f.option.esversion&&!f.option.moz&&(f.option.es3?f.option.esversion=3:f.option.esnext?f.option.esversion=6:f.option.esversion=5),f.inES5()&&D(S,s.ecmaIdentifiers[5]),f.inES6()&&D(S,s.ecmaIdentifiers[6]),f.option.module&&(f.option.strict===!0&&(f.option.strict="global"),f.inES6()||F("W134",f.tokens.next,"module",6)),f.option.couch&&D(S,s.couch),f.option.qunit&&D(S,s.qunit),f.option.rhino&&D(S,s.rhino),f.option.shelljs&&(D(S,s.shelljs),D(S,s.node)),f.option.typed&&D(S,s.typed),f.option.phantom&&(D(S,s.phantom),f.option.strict===!0&&(f.option.strict="global")),f.option.prototypejs&&D(S,s.prototypejs),f.option.node&&(D(S,s.node),D(S,s.typed),f.option.strict===!0&&(f.option.strict="global")),f.option.devel&&D(S,s.devel),f.option.dojo&&D(S,s.dojo),f.option.browser&&(D(S,s.browser),D(S,s.typed)),f.option.browserify&&(D(S,s.browser),D(S,s.typed),D(S,s.browserify),f.option.strict===!0&&(f.option.strict="global")),f.option.nonstandard&&D(S,s.nonstandard),f.option.jasmine&&D(S,s.jasmine),f.option.jquery&&D(S,s.jquery),f.option.mootools&&D(S,s.mootools),f.option.worker&&D(S,s.worker),f.option.wsh&&D(S,s.wsh),f.option.globalstrict&&f.option.strict!==!1&&(f.option.strict="global"),f.option.yui&&D(S,s.yui),f.option.mocha&&D(S,s.mocha)}function B(e,t,n){var r=Math.floor(t/f.lines.length*100),i=o.errors[e].desc;throw{name:"JSHintError",line:t,character:n,message:i+" ("+r+"% scanned).",raw:i,code:e}}function j(){var e=f.ignoredLines;if(r.isEmpty(e))return;p.errors=r.reject(p.errors,function(t){return e[t.line]})}function F(e,t,n,r,i,s){var u,a,l,c;if(/^W\d{3}$/.test(e)){if(f.ignored[e])return;c=o.warnings[e]}else/E\d{3}/.test(e)?c=o.errors[e]:/I\d{3}/.test(e)&&(c=o.info[e]);return t=t||f.tokens.next||{},t.id==="(end)"&&(t=f.tokens.curr),a=t.line||0,u=t.from||0,l={id:"(error)",raw:c.desc,code:c.code,evidence:f.lines[a-1]||"",line:a,character:u,scope:p.scope,a:n,b:r,c:i,d:s},l.reason=M(c.desc,l),p.errors.push(l),j(),p.errors.length>=f.option.maxerr&&B("E043",a,u),l}function I(e,t,n,r,i,s,o){return F(e,{line:t,from:n},r,i,s,o)}function q(e,t,n,r,i,s){F(e,t,n,r,i,s)}function R(e,t,n,r,i,s,o){return q(e,{line:t,from:n},r,i,s,o)}function U(e,t){var n;return n={id:"(internal)",elem:e,value:t},p.internals.push(n),n}function z(){var e=f.tokens.next,t=e.body.match(/(-\s+)?[^\s,:]+(?:\s*:\s*(-\s+)?[^\s,]+)?/g)||[],i={};if(e.type==="globals"){t.forEach(function(n,r){n=n.split(":");var s=(n[0]||"").trim(),o=(n[1]||"").trim();if(s==="-"||!s.length){if(r>0&&r===t.length-1)return;q("E002",e);return}s.charAt(0)==="-"?(s=s.slice(1),o=!1,p.blacklist[s]=s,delete S[s]):i[s]=o==="true"}),D(S,i);for(var s in i)r.has(i,s)&&(n[s]=e)}e.type==="exported"&&t.forEach(function(n,r){if(!n.length){if(r>0&&r===t.length-1)return;q("E002",e);return}f.funct["(scope)"].addExported(n)}),e.type==="members"&&(E=E||{},t.forEach(function(e){var t=e.charAt(0),n=e.charAt(e.length-1);t===n&&(t==='"'||t==="'")&&(e=e.substr(1,e.length-2).replace('\\"','"')),E[e]=!1}));var o=["maxstatements","maxparams","maxdepth","maxcomplexity","maxerr","maxlen","indent"];if(e.type==="jshint"||e.type==="jslint")t.forEach(function(t){t=t.split(":");var n=(t[0]||"").trim(),i=(t[1]||"").trim();if(!k(n,e))return;if(o.indexOf(n)>=0){if(i!=="false"){i=+i;if(typeof i!="number"||!isFinite(i)||i<=0||Math.floor(i)!==i){q("E032",e,t[1].trim());return}f.option[n]=i}else f.option[n]=n==="indent"?4:!1;return}if(n==="validthis"){if(f.funct["(global)"])return void q("E009");if(i!=="true"&&i!=="false")return void q("E002",e);f.option.validthis=i==="true";return}if(n==="quotmark"){switch(i){case"true":case"false":f.option.quotmark=i==="true";break;case"double":case"single":f.option.quotmark=i;break;default:q("E002",e)}return}if(n==="shadow"){switch(i){case"true":f.option.shadow=!0;break;case"outer":f.option.shadow="outer";break;case"false":case"inner":f.option.shadow="inner";break;default:q("E002",e)}return}if(n==="unused"){switch(i){case"true":f.option.unused=!0;break;case"false":f.option.unused=!1;break;case"vars":case"strict":f.option.unused=i;break;default:q("E002",e)}return}if(n==="latedef"){switch(i){case"true":f.option.latedef=!0;break;case"false":f.option.latedef=!1;break;case"nofunc":f.option.latedef="nofunc";break;default:q("E002",e)}return}if(n==="ignore"){switch(i){case"line":f.ignoredLines[e.line]=!0,j();break;default:q("E002",e)}return}if(n==="strict"){switch(i){case"true":f.option.strict=!0;break;case"false":f.option.strict=!1;break;case"func":case"global":case"implied":f.option.strict=i;break;default:q("E002",e)}return}n==="module"&&(zt(f.funct)||q("E055",f.tokens.next,"module"));var s={es3:3,es5:5,esnext:6};if(r.has(s,n)){switch(i){case"true":f.option.moz=!1,f.option.esversion=s[n];break;case"false":f.option.moz||(f.option.esversion=5);break;default:q("E002",e)}return}if(n==="esversion"){switch(i){case"5":f.inES5(!0)&&F("I003");case"3":case"6":f.option.moz=!1,f.option.esversion=+i;break;case"2015":f.option.moz=!1,f.option.esversion=6;break;default:q("E002",e)}zt(f.funct)||q("E055",f.tokens.next,"esversion");return}var u=/^([+-])(W\d{3})$/g.exec(n);if(u){f.ignored[u[2]]=u[1]==="-";return}var a;if(i==="true"||i==="false"){e.type==="jslint"?(a=c.renamed[n]||n,f.option[a]=i==="true",c.inverted[a]!==undefined&&(f.option[a]=!f.option[a])):f.option[n]=i==="true",n==="newcap"&&(f.option["(explicitNewcap)"]=!0);return}q("E002",e)}),H()}function W(e){var t=e||0,n=y.length,r;if(t="a"&&t<="z"||t>="A"&&t<="Z")e.identifier=e.reserved=!0;return e}function ut(e,t){var n=nt(e,150);return ot(n),n.nud=typeof t=="function"?t:function(){this.arity="unary",this.right=Q(150);if(this.id==="++"||this.id==="--")f.option.plusplus?F("W016",this,this.id):this.right&&(!this.right.identifier||O(this.right))&&this.right.id!=="."&&this.right.id!=="["&&F("W017",this),this.right&&this.right.isMetaProperty?q("E031",this):this.right&&this.right.identifier&&f.funct["(scope)"].block.modify(this.right.value,this);return this},n}function at(e,t){var n=rt(e);return n.type=e,n.nud=t,n}function ft(e,t){var n=at(e,t);return n.identifier=!0,n.reserved=!0,n}function lt(e,t){var n=at(e,t&&t.nud||function(){return this});return t=t||{},t.isFutureReservedWord=!0,n.value=e,n.identifier=!0,n.reserved=!0,n.meta=t,n}function ct(e,t){return ft(e,function(){return typeof t=="function"&&t(this),this})}function ht(e,t,n,r){var i=nt(e,n);return ot(i),i.infix=!0,i.led=function(i){return r||Y(f.tokens.prev,f.tokens.curr),(e==="in"||e==="instanceof")&&i.id==="!"&&F("W018",i,"!"),typeof t=="function"?t(i,this):(this.left=i,this.right=Q(n),this)},i}function pt(e){var t=nt(e,42);return t.led=function(e){return Y(f.tokens.prev,f.tokens.curr),this.left=e,this.right=Xt({type:"arrow",loneArg:e}),this},t}function dt(e,t){var n=nt(e,100);return n.led=function(e){Y(f.tokens.prev,f.tokens.curr),this.left=e;var n=this.right=Q(100);return A(e,"NaN")||A(n,"NaN")?F("W019",this):t&&t.apply(this,[e,n]),(!e||!n)&&B("E041",f.tokens.curr.line),e.id==="!"&&F("W018",e,"!"),n.id==="!"&&F("W018",n,"!"),this},n}function vt(e){return e&&(e.type==="(number)"&&+e.value===0||e.type==="(string)"&&e.value===""||e.type==="null"&&!f.option.eqnull||e.type==="true"||e.type==="false"||e.type==="undefined")}function gt(e,t,n){var i;return n.option.notypeof?!1:!e||!t?!1:(i=n.inES6()?mt.es6:mt.es3,t.type==="(identifier)"&&t.value==="typeof"&&e.type==="(string)"?!r.contains(i,e.value):!1)}function yt(e,t){var n=!1;return e.type==="this"&&t.funct["(context)"]===null?n=!0:e.type==="(identifier)"&&(t.option.node&&e.value==="global"?n=!0:t.option.browser&&(e.value==="window"||e.value==="document")&&(n=!0)),n}function bt(e){function n(e){if(typeof e!="object")return;return e.right==="prototype"?e:n(e.left)}function r(e){while(!e.identifier&&typeof e.left=="object")e=e.left;if(e.identifier&&t.indexOf(e.value)>=0)return e.value}var t=["Array","ArrayBuffer","Boolean","Collator","DataView","Date","DateTimeFormat","Error","EvalError","Float32Array","Float64Array","Function","Infinity","Intl","Int16Array","Int32Array","Int8Array","Iterator","Number","NumberFormat","Object","RangeError","ReferenceError","RegExp","StopIteration","String","SyntaxError","TypeError","Uint16Array","Uint32Array","Uint8Array","Uint8ClampedArray","URIError"],i=n(e);if(i)return r(i)}function wt(e,t,n){var r=n&&n.allowDestructuring;t=t||e;if(f.option.freeze){var i=bt(e);i&&F("W121",e,i)}return e.identifier&&!e.isMetaProperty&&f.funct["(scope)"].block.reassign(e.value,e),e.id==="."?((!e.left||e.left.value==="arguments"&&!f.isStrict())&&F("E031",t),f.nameStack.set(f.tokens.prev),!0):e.id==="{"||e.id==="["?(r&&f.tokens.curr.left.destructAssign?f.tokens.curr.left.destructAssign.forEach(function(e){e.id&&f.funct["(scope)"].block.modify(e.id,e.token)}):e.id==="{"||!e.left?F("E031",t):e.left.value==="arguments"&&!f.isStrict()&&F("E031",t),e.id==="["&&f.nameStack.set(e.right),!0):e.isMetaProperty?(q("E031",t),!0):e.identifier&&!O(e)?(f.funct["(scope)"].labeltype(e.value)==="exception"&&F("W022",e),f.nameStack.set(e),!0):(e===f.syntax["function"]&&F("W023",f.tokens.curr),!1)}function Et(e,t,n){var r=ht(e,typeof t=="function"?t:function(e,t){t.left=e;if(e&&wt(e,t,{allowDestructuring:!0}))return t.right=Q(10),t;q("E031",t)},n);return r.exps=!0,r.assign=!0,r}function St(e,t,n){var r=nt(e,n);return ot(r),r.led=typeof t=="function"?t:function(e){return f.option.bitwise&&F("W016",this,this.id),this.left=e,this.right=Q(n),this},r}function xt(e){return Et(e,function(e,t){f.option.bitwise&&F("W016",t,t.id);if(e&&wt(e,t))return t.right=Q(10),t;q("E031",t)},20)}function Tt(e){var t=nt(e,150);return t.led=function(e){return f.option.plusplus?F("W016",this,this.id):(!e.identifier||O(e))&&e.id!=="."&&e.id!=="["&&F("W017",this),e.isMetaProperty?q("E031",this):e&&e.identifier&&f.funct["(scope)"].block.modify(e.value,e),this.left=e,this},t}function Nt(e,t,n){if(!f.tokens.next.identifier)return;n||V();var r=f.tokens.curr,i=f.tokens.curr.value;return O(r)?t&&f.inES5()?i:e&&i==="undefined"?i:(F("W024",f.tokens.curr,f.tokens.curr.id),i):i}function Ct(e,t){var n=Nt(e,t,!1);if(n)return n;if(f.tokens.next.value==="..."){f.inES6(!0)||F("W119",f.tokens.next,"spread/rest operator","6"),V();if(pn(f.tokens.next,"...")){F("E024",f.tokens.next,"...");while(pn(f.tokens.next,"..."))V()}if(!f.tokens.next.identifier){F("E024",f.tokens.curr,"...");return}return Ct(e,t)}q("E030",f.tokens.next,f.tokens.next.value),f.tokens.next.id!==";"&&V()}function kt(e){var t=0,n;if(f.tokens.next.id!==";"||e.inBracelessBlock)return;for(;;){do n=W(t),t+=1;while(n.id!=="(end)"&&n.id==="(comment)");if(n.reach)return;if(n.id!=="(endline)"){if(n.id==="function"){f.option.latedef===!0&&F("W026",n);break}F("W027",n,n.value,e.value);break}}}function Lt(){if(f.tokens.next.id!==";"){if(f.tokens.next.isUnclosed)return V();var e=G(f.tokens.next)===f.tokens.curr.line&&f.tokens.next.id!=="(end)",t=pn(f.tokens.next,"}");e&&!t?R("E058",f.tokens.curr.line,f.tokens.curr.character):f.option.asi||(t&&!f.option.lastsemic||!e)&&I("W033",f.tokens.curr.line,f.tokens.curr.character)}else V(";")}function At(){var e=g,t,n=f.tokens.next,r=!1;if(n.id===";"){V(";");return}var i=O(n);i&&n.meta&&n.meta.isFutureReservedWord&&W().id===":"&&(F("W024",n,n.id),i=!1),n.identifier&&!i&&W().id===":"&&(V(),V(":"),r=!0,f.funct["(scope)"].stack(),f.funct["(scope)"].block.addBreakLabel(n.value,{token:f.tokens.curr}),!f.tokens.next.labelled&&f.tokens.next.value!=="{"&&F("W028",f.tokens.next,n.value,f.tokens.next.value),f.tokens.next.label=n.value,n=f.tokens.next);if(n.id==="{"){var s=f.funct["(verb)"]==="case"&&f.tokens.curr.value===":";_t(!0,!0,!1,!1,s);return}return t=Q(0,!0),t&&(!t.identifier||t.value!=="function")&&(t.type!=="(punctuator)"||!t.left||!t.left.identifier||t.left.value!=="function")&&!f.isStrict()&&f.option.strict==="global"&&F("E007"),n.block||(!f.option.expr&&(!t||!t.exps)?F("W030",f.tokens.curr):f.option.nonew&&t&&t.left&&t.id==="("&&t.left.id==="new"&&F("W031",n),Lt()),g=e,r&&f.funct["(scope)"].unstack(),t}function Ot(){var e=[],t;while(!f.tokens.next.reach&&f.tokens.next.id!=="(end)")f.tokens.next.id===";"?(t=W(),(!t||t.id!=="("&&t.id!=="[")&&F("W032"),V(";")):e.push(At());return e}function Mt(){var e,t,n;while(f.tokens.next.id==="(string)"){t=W(0);if(t.id==="(endline)"){e=1;do n=W(e++);while(n.id==="(endline)");if(n.id===";")t=n;else{if(n.value==="["||n.value===".")break;(!f.option.asi||n.value==="(")&&F("W033",f.tokens.next)}}else{if(t.id==="."||t.id==="[")break;t.id!==";"&&F("W033",t)}V();var r=f.tokens.curr.value;(f.directive[r]||r==="use strict"&&f.option.strict==="implied")&&F("W034",f.tokens.curr,r),f.directive[r]=!0,t.id===";"&&V(";")}f.isStrict()&&(f.option["(explicitNewcap)"]||(f.option.newcap=!0),f.option.undef=!0)}function _t(e,t,n,i,s){var o,u=m,a=g,l,c,h,p;m=e,c=f.tokens.next;var d=f.funct["(metrics)"];d.nestedBlockDepth+=1,d.verifyMaxNestedBlockDepthPerFunction();if(f.tokens.next.id==="{"){V("{"),f.funct["(scope)"].stack(),h=f.tokens.curr.line;if(f.tokens.next.id!=="}"){g+=f.option.indent;while(!e&&f.tokens.next.from>g)g+=f.option.indent;if(n){l={};for(p in f.directive)r.has(f.directive,p)&&(l[p]=f.directive[p]);Mt(),f.option.strict&&f.funct["(context)"]["(global)"]&&!l["use strict"]&&!f.isStrict()&&F("E007")}o=Ot(),d.statementCount+=o.length,g-=f.option.indent}V("}",c),n&&(f.funct["(scope)"].validateParams(),l&&(f.directive=l)),f.funct["(scope)"].unstack(),g=a}else if(!e)if(n){f.funct["(scope)"].stack(),l={},t&&!i&&!f.inMoz()&&q("W118",f.tokens.curr,"function closure expressions");if(!t)for(p in f.directive)r.has(f.directive,p)&&(l[p]=f.directive[p]);Q(10),f.option.strict&&f.funct["(context)"]["(global)"]&&!l["use strict"]&&!f.isStrict()&&F("E007"),f.funct["(scope)"].unstack()}else q("E021",f.tokens.next,"{",f.tokens.next.value);else f.funct["(noblockscopedvar)"]=f.tokens.next.id!=="for",f.funct["(scope)"].stack(),(!t||f.option.curly)&&F("W116",f.tokens.next,"{",f.tokens.next.value),f.tokens.next.inBracelessBlock=!0,g+=f.option.indent,o=[At()],g-=f.option.indent,f.funct["(scope)"].unstack(),delete f.funct["(noblockscopedvar)"];switch(f.funct["(verb)"]){case"break":case"continue":case"return":case"throw":if(s)break;default:f.funct["(verb)"]=null}return m=u,e&&f.option.noempty&&(!o||o.length===0)&&F("W035",f.tokens.prev),d.nestedBlockDepth-=1,o}function Dt(e){E&&typeof E[e]!="boolean"&&F("W036",f.tokens.curr,e),typeof w[e]=="number"?w[e]+=1:w[e]=1}function Bt(){var e={};e.exps=!0,f.funct["(comparray)"].stack();var t=!1;return f.tokens.next.value!=="for"&&(t=!0,f.inMoz()||F("W116",f.tokens.next,"for",f.tokens.next.value),f.funct["(comparray)"].setState("use"),e.right=Q(10)),V("for"),f.tokens.next.value==="each"&&(V("each"),f.inMoz()||F("W118",f.tokens.curr,"for each")),V("("),f.funct["(comparray)"].setState("define"),e.left=Q(130),r.contains(["in","of"],f.tokens.next.value)?V():q("E045",f.tokens.curr),f.funct["(comparray)"].setState("generate"),Q(10),V(")"),f.tokens.next.value==="if"&&(V("if"),V("("),f.funct["(comparray)"].setState("filter"),e.filter=Q(10),V(")")),t||(f.funct["(comparray)"].setState("use"),e.right=Q(10)),V("]"),f.funct["(comparray)"].unstack(),e}function jt(){return f.funct["(statement)"]&&f.funct["(statement)"].type==="class"||f.funct["(context)"]&&f.funct["(context)"]["(verb)"]==="class"}function Ft(e){return e.identifier||e.id==="(string)"||e.id==="(number)"}function It(e){var t,n=!0;return typeof e=="object"?t=e:(n=e,t=Nt(!1,!0,n)),t?typeof t=="object"&&(t.id==="(string)"||t.id==="(identifier)"?t=t.value:t.id==="(number)"&&(t=t.value.toString())):f.tokens.next.id==="(string)"?(t=f.tokens.next.value,n||V()):f.tokens.next.id==="(number)"&&(t=f.tokens.next.value.toString(),n||V()),t==="hasOwnProperty"&&F("W001"),t}function qt(e){function h(e){f.funct["(scope)"].addParam.apply(f.funct["(scope)"],e)}var t,n=[],i,s=[],o,u=!1,a=!1,l=0,c=e&&e.loneArg;if(c&&c.identifier===!0)return f.funct["(scope)"].addParam(c.value,c),{arity:1,params:[c.value]};t=f.tokens.next,(!e||!e.parsedOpening)&&V("(");if(f.tokens.next.id===")"){V(")");return}for(;;){l++;var p=[];if(r.contains(["{","["],f.tokens.next.id)){s=Gt();for(o in s)o=s[o],o.id&&(n.push(o.id),p.push([o.id,o.token]))}else{pn(f.tokens.next,"...")&&(a=!0),i=Ct(!0);if(i)n.push(i),p.push([i,f.tokens.curr]);else while(!hn(f.tokens.next,[",",")"]))V()}u&&f.tokens.next.id!=="="&&q("W138",f.tokens.current),f.tokens.next.id==="="&&(f.inES6()||F("W119",f.tokens.next,"default parameters","6"),V("="),u=!0,Q(10)),p.forEach(h);if(f.tokens.next.id!==",")return V(")",t),{arity:l,params:n};a&&F("W131",f.tokens.next),tt()}}function Rt(e,t,n){var i={"(name)":e,"(breakage)":0,"(loopage)":0,"(tokens)":{},"(properties)":{},"(catch)":!1,"(global)":!1,"(line)":null,"(character)":null,"(metrics)":null,"(statement)":null,"(context)":null,"(scope)":null,"(comparray)":null,"(generator)":null,"(arrow)":null,"(params)":null};return t&&r.extend(i,{"(line)":t.line,"(character)":t.character,"(metrics)":Vt(t)}),r.extend(i,n),i["(context)"]&&(i["(scope)"]=i["(context)"]["(scope)"],i["(comparray)"]=i["(context)"]["(comparray)"]),i}function Ut(e){return"(scope)"in e}function zt(e){return e["(global)"]&&!e["(verb)"]}function Wt(e){function i(){if(f.tokens.curr.template&&f.tokens.curr.tail&&f.tokens.curr.context===t)return!0;var e=f.tokens.next.template&&f.tokens.next.tail&&f.tokens.next.context===t;return e&&V(),e||f.tokens.next.isUnclosed}var t=this.context,n=this.noSubst,r=this.depth;if(!n)while(!i())!f.tokens.next.template||f.tokens.next.depth>r?Q(0):V();return{id:"(template)",type:"(template)",tag:e}}function Xt(e){var t,n,r,i,s,o,u,a,l=f.option,c=f.ignored;e&&(r=e.name,i=e.statement,s=e.classExprBinding,o=e.type==="generator",u=e.type==="arrow",a=e.ignoreLoopFunc),f.option=Object.create(f.option),f.ignored=Object.create(f.ignored),f.funct=Rt(r||f.nameStack.infer(),f.tokens.next,{"(statement)":i,"(context)":f.funct,"(arrow)":u,"(generator)":o}),t=f.funct,n=f.tokens.curr,n.funct=f.funct,v.push(f.funct),f.funct["(scope)"].stack("functionouter");var h=r||s;h&&f.funct["(scope)"].block.add(h,s?"class":"function",f.tokens.curr,!1),f.funct["(scope)"].stack("functionparams");var p=qt(e);return p?(f.funct["(params)"]=p.params,f.funct["(metrics)"].arity=p.arity,f.funct["(metrics)"].verifyMaxParametersPerFunction()):f.funct["(metrics)"].arity=0,u&&(f.inES6(!0)||F("W119",f.tokens.curr,"arrow function syntax (=>)","6"),e.loneArg||V("=>")),_t(!1,!0,!0,u),!f.option.noyield&&o&&f.funct["(generator)"]!=="yielded"&&F("W124",f.tokens.curr),f.funct["(metrics)"].verifyMaxStatementsPerFunction(),f.funct["(metrics)"].verifyMaxComplexityPerFunction(),f.funct["(unusedOption)"]=f.option.unused,f.option=l,f.ignored=c,f.funct["(last)"]=f.tokens.curr.line,f.funct["(lastcharacter)"]=f.tokens.curr.character,f.funct["(scope)"].unstack(),f.funct["(scope)"].unstack(),f.funct=f.funct["(context)"],!a&&!f.option.loopfunc&&f.funct["(loopage)"]&&t["(isCapturing)"]&&F("W083",n),t}function Vt(e){return{statementCount:0,nestedBlockDepth:-1,ComplexityCount:1,arity:0,verifyMaxStatementsPerFunction:function(){f.option.maxstatements&&this.statementCount>f.option.maxstatements&&F("W071",e,this.statementCount)},verifyMaxParametersPerFunction:function(){r.isNumber(f.option.maxparams)&&this.arity>f.option.maxparams&&F("W072",e,this.arity)},verifyMaxNestedBlockDepthPerFunction:function(){f.option.maxdepth&&this.nestedBlockDepth>0&&this.nestedBlockDepth===f.option.maxdepth+1&&F("W073",null,this.nestedBlockDepth)},verifyMaxComplexityPerFunction:function(){var t=f.option.maxcomplexity,n=this.ComplexityCount;t&&n>t&&F("W074",e,n)}}}function $t(){f.funct["(metrics)"].ComplexityCount+=1}function Jt(e){var t,n;e&&(t=e.id,n=e.paren,t===","&&(e=e.exprs[e.exprs.length-1])&&(t=e.id,n=n||e.paren));switch(t){case"=":case"+=":case"-=":case"*=":case"%=":case"&=":case"|=":case"^=":case"/=":!n&&!f.option.boss&&F("W084")}}function Kt(e){if(f.inES5())for(var t in e)e[t]&&e[t].setterToken&&!e[t].getterToken&&F("W078",e[t].setterToken)}function Qt(e,t){if(pn(f.tokens.next,".")){var n=f.tokens.curr.id;V(".");var r=Ct();return f.tokens.curr.isMetaProperty=!0,e!==r?q("E057",f.tokens.prev,n,r):t(),f.tokens.curr}}function Gt(e){var t=e&&e.assignment;return f.inES6()||F("W104",f.tokens.curr,t?"destructuring assignment":"destructuring binding","6"),Yt(e)}function Yt(e){var t,n=[],r=e&&e.openingParsed,i=e&&e.assignment,s=i?{assignment:i}:null,o=r?f.tokens.curr:f.tokens.next,u=function(){var e;if(hn(f.tokens.next,["[","{"])){t=Yt(s);for(var r in t)r=t[r],n.push({id:r.id,token:r.token})}else if(pn(f.tokens.next,","))n.push({id:null,token:f.tokens.curr});else{if(!pn(f.tokens.next,"(")){var o=pn(f.tokens.next,"...");if(i){var a=o?W(0):f.tokens.next;a.identifier||F("E030",a,a.value);var l=Q(155);l&&(wt(l),l.identifier&&(e=l.value))}else e=Ct();return e&&n.push({id:e,token:f.tokens.curr}),o}V("("),u(),V(")")}return!1},a=function(){var e;pn(f.tokens.next,"[")?(V("["),Q(10),V("]"),V(":"),u()):f.tokens.next.id==="(string)"||f.tokens.next.id==="(number)"?(V(),V(":"),u()):(e=Ct(),pn(f.tokens.next,":")?(V(":"),u()):e&&(i&&wt(f.tokens.curr),n.push({id:e,token:f.tokens.curr})))};if(pn(o,"[")){r||V("["),pn(f.tokens.next,"]")&&F("W137",f.tokens.curr);var l=!1;while(!pn(f.tokens.next,"]"))u()&&!l&&pn(f.tokens.next,",")&&(F("W130",f.tokens.next),l=!0),pn(f.tokens.next,"=")&&(pn(f.tokens.prev,"...")?V("]"):V("="),f.tokens.next.id==="undefined"&&F("W080",f.tokens.prev,f.tokens.prev.value),Q(10)),pn(f.tokens.next,"]")||V(",");V("]")}else if(pn(o,"{")){r||V("{"),pn(f.tokens.next,"}")&&F("W137",f.tokens.curr);while(!pn(f.tokens.next,"}")){a(),pn(f.tokens.next,"=")&&(V("="),f.tokens.next.id==="undefined"&&F("W080",f.tokens.prev,f.tokens.prev.value),Q(10));if(!pn(f.tokens.next,"}")){V(",");if(pn(f.tokens.next,"}"))break}}V("}")}return n}function Zt(e,t){var n=t.first;if(!n)return;r.zip(e,Array.isArray(n)?n:[n]).forEach(function(e){var t=e[0],n=e[1];t&&n?t.first=n:t&&t.first&&!n&&F("W080",t.first,t.first.value)})}function en(e,t,n){var i=n&&n.prefix,s=n&&n.inexport,o=e==="let",u=e==="const",a,l,c,h;f.inES6()||F("W104",f.tokens.curr,e,"6"),o&&f.tokens.next.value==="("?(f.inMoz()||F("W118",f.tokens.next,"let block"),V("("),f.funct["(scope)"].stack(),h=!0):f.funct["(noblockscopedvar)"]&&q("E048",f.tokens.curr,u?"Const":"Let"),t.first=[];for(;;){var p=[];r.contains(["{","["],f.tokens.next.value)?(a=Gt(),l=!1):(a=[{id:Ct(),token:f.tokens.curr}],l=!0),!i&&u&&f.tokens.next.id!=="="&&F("E012",f.tokens.curr,f.tokens.curr.value);for(var d in a)a.hasOwnProperty(d)&&(d=a[d],f.funct["(scope)"].block.isGlobal()&&S[d.id]===!1&&F("W079",d.token,d.id),d.id&&!f.funct["(noblockscopedvar)"]&&(f.funct["(scope)"].addlabel(d.id,{type:e,token:d.token}),p.push(d.token),l&&s&&f.funct["(scope)"].setExported(d.token.value,d.token)));f.tokens.next.id==="="&&(V("="),!i&&f.tokens.next.id==="undefined"&&F("W080",f.tokens.prev,f.tokens.prev.value),!i&&W(0).id==="="&&f.tokens.next.identifier&&F("W120",f.tokens.next,f.tokens.next.value),c=Q(i?120:10),l?a[0].first=c:Zt(p,c)),t.first=t.first.concat(p);if(f.tokens.next.id!==",")break;tt()}return h&&(V(")"),_t(!0,!0),t.block=!0,f.funct["(scope)"].unstack()),t}function sn(e){return f.inES6()||F("W104",f.tokens.curr,"class","6"),e?(this.name=Ct(),f.funct["(scope)"].addlabel(this.name,{type:"class",token:f.tokens.curr})):f.tokens.next.identifier&&f.tokens.next.value!=="extends"?(this.name=Ct(),this.namedExpr=!0):this.name=f.nameStack.infer(),on(this),this}function on(e){var t=f.inClassBody;f.tokens.next.value==="extends"&&(V("extends"),e.heritage=Q(10)),f.inClassBody=!0,V("{"),e.body=un(e),V("}"),f.inClassBody=t}function un(e){var t,n,r,i,s=Object.create(null),o=Object.create(null),u;for(var a=0;f.tokens.next.id!=="}";++a){t=f.tokens.next,n=!1,r=!1,i=null;if(t.id===";"){F("W032"),V(";");continue}t.id==="*"&&(r=!0,V("*"),t=f.tokens.next);if(t.id==="[")t=cn(),u=!0;else{if(!Ft(t)){F("W052",f.tokens.next,f.tokens.next.value||f.tokens.next.type),V();continue}V(),u=!1;if(t.identifier&&t.value==="static"){pn(f.tokens.next,"*")&&(r=!0,V("*"));if(Ft(f.tokens.next)||f.tokens.next.id==="[")u=f.tokens.next.id==="[",n=!0,t=f.tokens.next,f.tokens.next.id==="["?t=cn():V()}t.identifier&&(t.value==="get"||t.value==="set")&&(Ft(f.tokens.next)||f.tokens.next.id==="[")&&(u=f.tokens.next.id==="[",i=t,t=f.tokens.next,f.tokens.next.id==="["?t=cn():V())}if(!pn(f.tokens.next,"(")){q("E054",f.tokens.next,f.tokens.next.value);while(f.tokens.next.id!=="}"&&!pn(f.tokens.next,"("))V();f.tokens.next.value!=="("&&Xt({statement:e})}u||(i?ln(i.value,n?o:s,t.value,t,!0,n):(t.value==="constructor"?f.nameStack.set(e):f.nameStack.set(t),fn(n?o:s,t.value,t,!0,n)));if(i&&t.value==="constructor"){var l=i.value==="get"?"class getter method":"class setter method";q("E049",t,l,"constructor")}else t.value==="prototype"&&q("E049",t,"class method","prototype");It(t),Xt({statement:e,type:r?"generator":null,classExprBinding:e.namedExpr?e.name:null})}Kt(s)}function fn(e,t,n,r,i){var s=["key","class method","static class method"];s=s[(r||!1)+(i||!1)],n.identifier&&(t=n.value),e[t]&&t!=="__proto__"?F("W075",f.tokens.next,s,t):e[t]=Object.create(null),e[t].basic=!0,e[t].basictkn=n}function ln(e,t,n,r,i,s){var o=e==="get"?"getterToken":"setterToken",u="";i?(s&&(u+="static "),u+=e+"ter method"):u="key",f.tokens.curr.accessorType=e,f.nameStack.set(r),t[n]?(t[n].basic||t[n][o])&&n!=="__proto__"&&F("W075",f.tokens.next,u,n):t[n]=Object.create(null),t[n][o]=r}function cn(){V("["),f.inES6()||F("W119",f.tokens.curr,"computed property names","6");var e=Q(10);return V("]"),e}function hn(e,t){return e.type==="(punctuator)"?r.contains(t,e.value):!1}function pn(e,t){return e.type==="(punctuator)"&&e.value===t}function dn(){var e=an();e.notJson?(!f.inES6()&&e.isDestAssign&&F("W104",f.tokens.curr,"destructuring assignment","6"),Ot()):(f.option.laxbreak=!0,f.jsonMode=!0,mn())}function mn(){function e(){var e={},t=f.tokens.next;V("{");if(f.tokens.next.id!=="}")for(;;){if(f.tokens.next.id==="(end)")q("E026",f.tokens.next,t.line);else{if(f.tokens.next.id==="}"){F("W094",f.tokens.curr);break}f.tokens.next.id===","?q("E028",f.tokens.next):f.tokens.next.id!=="(string)"&&F("W095",f.tokens.next,f.tokens.next.value)}e[f.tokens.next.value]===!0?F("W075",f.tokens.next,"key",f.tokens.next.value):f.tokens.next.value==="__proto__"&&!f.option.proto||f.tokens.next.value==="__iterator__"&&!f.option.iterator?F("W096",f.tokens.next,f.tokens.next.value):e[f.tokens.next.value]=!0,V(),V(":"),mn();if(f.tokens.next.id!==",")break;V(",")}V("}")}function t(){var e=f.tokens.next;V("[");if(f.tokens.next.id!=="]")for(;;){if(f.tokens.next.id==="(end)")q("E027",f.tokens.next,e.line);else{if(f.tokens.next.id==="]"){F("W094",f.tokens.curr);break}f.tokens.next.id===","&&q("E028",f.tokens.next)}mn();if(f.tokens.next.id!==",")break;V(",")}V("]")}switch(f.tokens.next.id){case"{":e();break;case"[":t();break;case"true":case"false":case"null":case"(number)":case"(string)":V();break;case"-":V("-"),V("(number)");break;default:q("E003",f.tokens.next)}}var e,t={"<":!0,"<=":!0,"==":!0,"===":!0,"!==":!0,"!=":!0,">":!0,">=":!0,"+":!0,"-":!0,"*":!0,"/":!0,"%":!0},n,d=["closure","exception","global","label","outer","unused","var"],v,m,g,y,b,w,E,S,x,T,N=[],C=new i.EventEmitter,mt={};mt.legacy=["xml","unknown"],mt.es3=["undefined","boolean","number","string","function","object"],mt.es3=mt.es3.concat(mt.legacy),mt.es6=mt.es3.concat("symbol"),at("(number)",function(){return this}),at("(string)",function(){return this}),f.syntax["(identifier)"]={type:"(identifier)",lbp:0,identifier:!0,nud:function(){var e=this.value;return f.tokens.next.id==="=>"?this:(f.funct["(comparray)"].check(e)||f.funct["(scope)"].block.use(e,f.tokens.curr),this)},led:function(){q("E033",f.tokens.next,f.tokens.next.value)}};var Pt={lbp:0,identifier:!1,template:!0};f.syntax["(template)"]=r.extend({type:"(template)",nud:Wt,led:Wt,noSubst:!1},Pt),f.syntax["(template middle)"]=r.extend({type:"(template middle)",middle:!0,noSubst:!1},Pt),f.syntax["(template tail)"]=r.extend({type:"(template tail)",tail:!0,noSubst:!1},Pt),f.syntax["(no subst template)"]=r.extend({type:"(template)",nud:Wt,led:Wt,noSubst:!0,tail:!0},Pt),at("(regexp)",function(){return this}),rt("(endline)"),rt("(begin)"),rt("(end)").reach=!0,rt("(error)").reach=!0,rt("}").reach=!0,rt(")"),rt("]"),rt('"').reach=!0,rt("'").reach=!0,rt(";"),rt(":").reach=!0,rt("#"),ft("else"),ft("case").reach=!0,ft("catch"),ft("default").reach=!0,ft("finally"),ct("arguments",function(e){f.isStrict()&&f.funct["(global)"]&&F("E008",e)}),ct("eval"),ct("false"),ct("Infinity"),ct("null"),ct("this",function(e){f.isStrict()&&!jt()&&!f.option.validthis&&(f.funct["(statement)"]&&f.funct["(name)"].charAt(0)>"Z"||f.funct["(global)"])&&F("W040",e)}),ct("true"),ct("undefined"),Et("=","assign",20),Et("+=","assignadd",20),Et("-=","assignsub",20),Et("*=","assignmult",20),Et("/=","assigndiv",20).nud=function(){q("E014")},Et("%=","assignmod",20),xt("&="),xt("|="),xt("^="),xt("<<="),xt(">>="),xt(">>>="),ht(",",function(e,t){var n;t.exprs=[e],f.option.nocomma&&F("W127");if(!tt({peek:!0}))return t;for(;;){if(!(n=Q(10)))break;t.exprs.push(n);if(f.tokens.next.value!==","||!tt())break}return t},10,!0),ht("?",function(e,t){return $t(),t.left=e,t.right=Q(10),V(":"),t["else"]=Q(10),t},30);var Ht=40;ht("||",function(e,t){return $t(),t.left=e,t.right=Q(Ht),t},Ht),ht("&&","and",50),St("|","bitor",70),St("^","bitxor",80),St("&","bitand",90),dt("==",function(e,t){var n=f.option.eqnull&&((e&&e.value)==="null"||(t&&t.value)==="null");switch(!0){case!n&&f.option.eqeqeq:this.from=this.character,F("W116",this,"===","==");break;case vt(e):F("W041",this,"===",e.value);break;case vt(t):F("W041",this,"===",t.value);break;case gt(t,e,f):F("W122",this,t.value);break;case gt(e,t,f):F("W122",this,e.value)}return this}),dt("===",function(e,t){return gt(t,e,f)?F("W122",this,t.value):gt(e,t,f)&&F("W122",this,e.value),this}),dt("!=",function(e,t){var n=f.option.eqnull&&((e&&e.value)==="null"||(t&&t.value)==="null");return!n&&f.option.eqeqeq?(this.from=this.character,F("W116",this,"!==","!=")):vt(e)?F("W041",this,"!==",e.value):vt(t)?F("W041",this,"!==",t.value):gt(t,e,f)?F("W122",this,t.value):gt(e,t,f)&&F("W122",this,e.value),this}),dt("!==",function(e,t){return gt(t,e,f)?F("W122",this,t.value):gt(e,t,f)&&F("W122",this,e.value),this}),dt("<"),dt(">"),dt("<="),dt(">="),St("<<","shiftleft",120),St(">>","shiftright",120),St(">>>","shiftrightunsigned",120),ht("in","in",120),ht("instanceof","instanceof",120),ht("+",function(e,t){var n;return t.left=e,t.right=n=Q(130),e&&n&&e.id==="(string)"&&n.id==="(string)"?(e.value+=n.value,e.character=n.character,!f.option.scripturl&&a.javascriptURL.test(e.value)&&F("W050",e),e):t},130),ut("+","num"),ut("+++",function(){return F("W007"),this.arity="unary",this.right=Q(150),this}),ht("+++",function(e){return F("W007"),this.left=e,this.right=Q(130),this},130),ht("-","sub",130),ut("-","neg"),ut("---",function(){return F("W006"),this.arity="unary",this.right=Q(150),this}),ht("---",function(e){return F("W006"),this.left=e,this.right=Q(130),this},130),ht("*","mult",140),ht("/","div",140),ht("%","mod",140),Tt("++"),ut("++","preinc"),f.syntax["++"].exps=!0,Tt("--"),ut("--","predec"),f.syntax["--"].exps=!0,ut("delete",function(){var e=Q(10);return e?(e.id!=="."&&e.id!=="["&&F("W051"),this.first=e,e.identifier&&!f.isStrict()&&(e.forgiveUndef=!0),this):this}).exps=!0,ut("~",function(){return f.option.bitwise&&F("W016",this,"~"),this.arity="unary",this.right=Q(150),this}),ut("...",function(){return f.inES6(!0)||F("W119",this,"spread/rest operator","6"),!f.tokens.next.identifier&&f.tokens.next.type!=="(string)"&&!hn(f.tokens.next,["[","("])&&q("E030",f.tokens.next,f.tokens.next.value),Q(150),this}),ut("!",function(){return this.arity="unary",this.right=Q(150),this.right||B("E041",this.line||0),t[this.right.id]===!0&&F("W018",this,"!"),this}),ut("typeof",function(){var e=Q(150);return this.first=this.right=e,e||B("E041",this.line||0,this.character||0),e.identifier&&(e.forgiveUndef=!0),this}),ut("new",function(){var e=Qt("target",function(){f.inES6(!0)||F("W119",f.tokens.prev,"new.target","6");var e,t=f.funct;while(t){e=!t["(global)"];if(!t["(arrow)"])break;t=t["(context)"]}e||F("W136",f.tokens.prev,"new.target")});if(e)return e;var t=Q(155),n;if(t&&t.id!=="function")if(t.identifier){t["new"]=!0;switch(t.value){case"Number":case"String":case"Boolean":case"Math":case"JSON":F("W053",f.tokens.prev,t.value);break;case"Symbol":f.inES6()&&F("W053",f.tokens.prev,t.value);break;case"Function":f.option.evil||F("W054");break;case"Date":case"RegExp":case"this":break;default:t.id!=="function"&&(n=t.value.substr(0,1),f.option.newcap&&(n<"A"||n>"Z")&&!f.funct["(scope)"].isPredefined(t.value)&&F("W055",f.tokens.curr))}}else t.id!=="."&&t.id!=="["&&t.id!=="("&&F("W056",f.tokens.curr);else f.option.supernew||F("W057",this);return f.tokens.next.id!=="("&&!f.option.supernew&&F("W058",f.tokens.curr,f.tokens.curr.value),this.first=this.right=t,this}),f.syntax["new"].exps=!0,ut("void").exps=!0,ht(".",function(e,t){var n=Ct(!1,!0);return typeof n=="string"&&Dt(n),t.left=e,t.right=n,n&&n==="hasOwnProperty"&&f.tokens.next.value==="="&&F("W001"),!e||e.value!=="arguments"||n!=="callee"&&n!=="caller"?!f.option.evil&&e&&e.value==="document"&&(n==="write"||n==="writeln")&&F("W060",e):f.option.noarg?F("W059",e,n):f.isStrict()&&q("E008"),!f.option.evil&&(n==="eval"||n==="execScript")&&yt(e,f)&&F("W061"),t},160,!0),ht("(",function(e,t){f.option.immed&&e&&!e.immed&&e.id==="function"&&F("W062");var n=0,r=[];e&&e.type==="(identifier)"&&e.value.match(/^[A-Z]([A-Z0-9_$]*[a-z][A-Za-z0-9_$]*)?$/)&&"Array Number String Boolean Date Object Error Symbol".indexOf(e.value)===-1&&(e.value==="Math"?F("W063",e):f.option.newcap&&F("W064",e));if(f.tokens.next.id!==")")for(;;){r[r.length]=Q(10),n+=1;if(f.tokens.next.id!==",")break;tt()}return V(")"),typeof e=="object"&&(!f.inES5()&&e.value==="parseInt"&&n===1&&F("W065",f.tokens.curr),f.option.evil||(e.value==="eval"||e.value==="Function"||e.value==="execScript"?(F("W061",e),r[0]&&[0].id==="(string)"&&U(e,r[0].value)):!r[0]||r[0].id!=="(string)"||e.value!=="setTimeout"&&e.value!=="setInterval"?r[0]&&r[0].id==="(string)"&&e.value==="."&&e.left.value==="window"&&(e.right==="setTimeout"||e.right==="setInterval")&&(F("W066",e),U(e,r[0].value)):(F("W066",e),U(e,r[0].value))),!e.identifier&&e.id!=="."&&e.id!=="["&&e.id!=="=>"&&e.id!=="("&&e.id!=="&&"&&e.id!=="||"&&e.id!=="?"&&(!f.inES6()||!e["(name)"])&&F("W067",t)),t.left=e,t},155,!0).exps=!0,ut("(",function(){var e=f.tokens.next,t,n=-1,r,i,s,o,u=1,a=f.tokens.curr,l=f.tokens.prev,c=!f.option.singleGroups;do e.value==="("?u+=1:e.value===")"&&(u-=1),n+=1,t=e,e=W(n);while((u!==0||t.value!==")")&&e.value!==";"&&e.type!=="(end)");f.tokens.next.id==="function"&&(i=f.tokens.next.immed=!0);if(e.value==="=>")return Xt({type:"arrow",parsedOpening:!0});var h=[];if(f.tokens.next.id!==")")for(;;){h.push(Q(10));if(f.tokens.next.id!==",")break;f.option.nocomma&&F("W127"),tt()}V(")",this),f.option.immed&&h[0]&&h[0].id==="function"&&f.tokens.next.id!=="("&&f.tokens.next.id!=="."&&f.tokens.next.id!=="["&&F("W068",this);if(!h.length)return;return h.length>1?(r=Object.create(f.syntax[","]),r.exprs=h,s=h[0],o=h[h.length-1],c||(c=l.assign||l.delim)):(r=s=o=h[0],c||(c=a.beginsStmt&&(r.id==="{"||i||Ut(r))||i&&(!J()||f.tokens.prev.id!=="}")||Ut(r)&&!J()||r.id==="{"&&l.id==="=>"||r.type==="(number)"&&pn(e,".")&&/^\d+$/.test(r.value))),r&&(!c&&(s.left||s.right||r.exprs)&&(c=!K(l)&&s.lbp<=l.lbp||!J()&&o.lbp"),ht("[",function(e,t){var n=Q(10),r;return n&&n.type==="(string)"&&(!f.option.evil&&(n.value==="eval"||n.value==="execScript")&&yt(e,f)&&F("W061"),Dt(n.value),!f.option.sub&&a.identifier.test(n.value)&&(r=f.syntax[n.value],(!r||!O(r))&&F("W069",f.tokens.prev,n.value))),V("]",t),n&&n.value==="hasOwnProperty"&&f.tokens.next.value==="="&&F("W001"),t.left=e,t.right=n,t},160,!0),ut("[",function(){var e=an();if(e.isCompArray)return!f.option.esnext&&!f.inMoz()&&F("W118",f.tokens.curr,"array comprehension"),Bt();if(e.isDestAssign)return this.destructAssign=Gt({openingParsed:!0,assignment:!0}),this;var t=f.tokens.curr.line!==G(f.tokens.next);this.first=[],t&&(g+=f.option.indent,f.tokens.next.from===g+f.option.indent&&(g+=f.option.indent));while(f.tokens.next.id!=="(end)"){while(f.tokens.next.id===","){if(!f.option.elision){if(!!f.inES5()){F("W128");do V(",");while(f.tokens.next.id===",");continue}F("W070")}V(",")}if(f.tokens.next.id==="]")break;this.first.push(Q(10));if(f.tokens.next.id!==",")break;tt({allowTrailing:!0});if(f.tokens.next.id==="]"&&!f.inES5()){F("W070",f.tokens.curr);break}}return t&&(g-=f.option.indent),V("]",this),this}),function(e){e.nud=function(){var e,t,n,r,i,s=!1,o,u=Object.create(null);e=f.tokens.curr.line!==G(f.tokens.next),e&&(g+=f.option.indent,f.tokens.next.from===g+f.option.indent&&(g+=f.option.indent));var a=an();if(a.isDestAssign)return this.destructAssign=Gt({openingParsed:!0,assignment:!0}),this;for(;;){if(f.tokens.next.id==="}")break;o=f.tokens.next.value;if(!f.tokens.next.identifier||X().id!==","&&X().id!=="}")if(W().id===":"||o!=="get"&&o!=="set"){f.tokens.next.value==="*"&&f.tokens.next.type==="(punctuator)"?(f.inES6()||F("W104",f.tokens.next,"generator functions","6"),V("*"),s=!0):s=!1;if(f.tokens.next.id==="[")n=cn(),f.nameStack.set(n);else{f.nameStack.set(f.tokens.next),n=It(),fn(u,n,f.tokens.next);if(typeof n!="string")break}f.tokens.next.value==="("?(f.inES6()||F("W104",f.tokens.curr,"concise methods","6"),Xt({type:s?"generator":null})):(V(":"),Q(10))}else V(o),f.inES5()||q("E034"),n=It(),!n&&!f.inES6()&&q("E035"),n&&ln(o,u,n,f.tokens.curr),i=f.tokens.next,t=Xt(),r=t["(params)"],o==="get"&&n&&r?F("W076",i,r[0],n):o==="set"&&n&&(!r||r.length!==1)&&F("W077",i,n);else f.inES6()||F("W104",f.tokens.next,"object short notation","6"),n=It(!0),fn(u,n,f.tokens.next),Q(10);Dt(n);if(f.tokens.next.id!==",")break;tt({allowTrailing:!0,property:!0}),f.tokens.next.id===","?F("W070",f.tokens.curr):f.tokens.next.id==="}"&&!f.inES5()&&F("W070",f.tokens.curr)}return e&&(g-=f.option.indent),V("}",this),Kt(u),this},e.fud=function(){q("E036",f.tokens.curr)}}(rt("{"));var tn=it("const",function(e){return en("const",this,e)});tn.exps=!0;var nn=it("let",function(e){return en("let",this,e)});nn.exps=!0;var rn=it("var",function(e){var t=e&&e.prefix,n=e&&e.inexport,i,o,u,a=e&&e.implied,l=!e||!e.ignore;this.first=[];for(;;){var c=[];r.contains(["{","["],f.tokens.next.value)?(i=Gt(),o=!1):(i=[{id:Ct(),token:f.tokens.curr}],o=!0),(!t||!a)&&l&&f.option.varstmt&&F("W132",this),this.first=this.first.concat(c);for(var h in i)i.hasOwnProperty(h)&&(h=i[h],!a&&f.funct["(global)"]&&(S[h.id]===!1?F("W079",h.token,h.id):f.option.futurehostile===!1&&(!f.inES5()&&s.ecmaIdentifiers[5][h.id]===!1||!f.inES6()&&s.ecmaIdentifiers[6][h.id]===!1)&&F("W129",h.token,h.id)),h.id&&(a==="for"?(f.funct["(scope)"].has(h.id)||l&&F("W088",h.token,h.id),f.funct["(scope)"].block.use(h.id,h.token)):(f.funct["(scope)"].addlabel(h.id,{type:"var",token:h.token}),o&&n&&f.funct["(scope)"].setExported(h.id,h.token)),c.push(h.token)));f.tokens.next.id==="="&&(f.nameStack.set(f.tokens.curr),V("="),!t&&l&&!f.funct["(loopage)"]&&f.tokens.next.id==="undefined"&&F("W080",f.tokens.prev,f.tokens.prev.value),W(0).id==="="&&f.tokens.next.identifier&&(!t&&l&&!f.funct["(params)"]||f.funct["(params)"].indexOf(f.tokens.next.value)===-1)&&F("W120",f.tokens.next,f.tokens.next.value),u=Q(t?120:10),o?i[0].first=u:Zt(c,u));if(f.tokens.next.id!==",")break;tt()}return this});rn.exps=!0,st("class",function(){return sn.call(this,!0)}),st("function",function(e){var t=e&&e.inexport,n=!1;f.tokens.next.value==="*"&&(V("*"),f.inES6({strict:!0})?n=!0:F("W119",f.tokens.curr,"function*","6")),m&&F("W082",f.tokens.curr);var r=Nt();return f.funct["(scope)"].addlabel(r,{type:"function",token:f.tokens.curr}),r===undefined?F("W025"):t&&f.funct["(scope)"].setExported(r,f.tokens.prev),Xt({name:r,statement:this,type:n?"generator":null,ignoreLoopFunc:m}),f.tokens.next.id==="("&&f.tokens.next.line===f.tokens.curr.line&&q("E039"),this}),ut("function",function(){var e=!1;f.tokens.next.value==="*"&&(f.inES6()||F("W119",f.tokens.curr,"function*","6"),V("*"),e=!0);var t=Nt();return Xt({name:t,type:e?"generator":null}),this}),st("if",function(){var e=f.tokens.next;$t(),f.condition=!0,V("(");var t=Q(0);Jt(t);var n=null;f.option.forin&&f.forinifcheckneeded&&(f.forinifcheckneeded=!1,n=f.forinifchecks[f.forinifchecks.length-1],t.type==="(punctuator)"&&t.value==="!"?n.type="(negative)":n.type="(positive)"),V(")",e),f.condition=!1;var r=_t(!0,!0);return n&&n.type==="(negative)"&&r&&r[0]&&r[0].type==="(identifier)"&&r[0].value==="continue"&&(n.type="(negative-with-continue)"),f.tokens.next.id==="else"&&(V("else"),f.tokens.next.id==="if"||f.tokens.next.id==="switch"?At():_t(!0,!0)),this}),st("try",function(){function t(){V("catch"),V("("),f.funct["(scope)"].stack("catchparams");if(hn(f.tokens.next,["[","{"])){var e=Gt();r.each(e,function(e){e.id&&f.funct["(scope)"].addParam(e.id,e,"exception")})}else f.tokens.next.type!=="(identifier)"?F("E030",f.tokens.next,f.tokens.next.value):f.funct["(scope)"].addParam(Ct(),f.tokens.curr,"exception");f.tokens.next.value==="if"&&(f.inMoz()||F("W118",f.tokens.curr,"catch filter"),V("if"),Q(0)),V(")"),_t(!1),f.funct["(scope)"].unstack()}var e;_t(!0);while(f.tokens.next.id==="catch")$t(),e&&!f.inMoz()&&F("W118",f.tokens.next,"multiple catch blocks"),t(),e=!0;if(f.tokens.next.id==="finally"){V("finally"),_t(!0);return}return e||q("E021",f.tokens.next,"catch",f.tokens.next.value),this}),st("while",function(){var e=f.tokens.next;return f.funct["(breakage)"]+=1,f.funct["(loopage)"]+=1,$t(),V("("),Jt(Q(0)),V(")",e),_t(!0,!0),f.funct["(breakage)"]-=1,f.funct["(loopage)"]-=1,this}).labelled=!0,st("with",function(){var e=f.tokens.next;return f.isStrict()?q("E010",f.tokens.curr):f.option.withstmt||F("W085",f.tokens.curr),V("("),Q(0),V(")",e),_t(!0,!0),this}),st("switch",function(){var e=f.tokens.next,t=!1,n=!1;f.funct["(breakage)"]+=1,V("("),Jt(Q(0)),V(")",e),e=f.tokens.next,V("{"),f.tokens.next.from===g&&(n=!0),n||(g+=f.option.indent),this.cases=[];for(;;)switch(f.tokens.next.id){case"case":switch(f.funct["(verb)"]){case"yield":case"break":case"case":case"continue":case"return":case"switch":case"throw":break;default:f.tokens.curr.caseFallsThrough||F("W086",f.tokens.curr,"case")}V("case"),this.cases.push(Q(0)),$t(),t=!0,V(":"),f.funct["(verb)"]="case";break;case"default":switch(f.funct["(verb)"]){case"yield":case"break":case"continue":case"return":case"throw":break;default:this.cases.length&&(f.tokens.curr.caseFallsThrough||F("W086",f.tokens.curr,"default"))}V("default"),t=!0,V(":");break;case"}":n||(g-=f.option.indent),V("}",e),f.funct["(breakage)"]-=1,f.funct["(verb)"]=undefined;return;case"(end)":q("E023",f.tokens.next,"}");return;default:g+=f.option.indent;if(t)switch(f.tokens.curr.id){case",":q("E040");return;case":":t=!1,Ot();break;default:q("E025",f.tokens.curr);return}else{if(f.tokens.curr.id!==":"){q("E021",f.tokens.next,"case",f.tokens.next.value);return}V(":"),q("E024",f.tokens.curr,":"),Ot()}g-=f.option.indent}return this}).labelled=!0,it("debugger",function(){return f.option.debug||F("W087",this),this}).exps=!0,function(){var e=it("do",function(){f.funct["(breakage)"]+=1,f.funct["(loopage)"]+=1,$t(),this.first=_t(!0,!0),V("while");var e=f.tokens.next;return V("("),Jt(Q(0)),V(")",e),f.funct["(breakage)"]-=1,f.funct["(loopage)"]-=1,this});e.labelled=!0,e.exps=!0}(),st("for",function(){var e,t=f.tokens.next,n=!1,i=null;t.value==="each"&&(i=t,V("each"),f.inMoz()||F("W118",f.tokens.curr,"for each")),$t(),V("(");var s,o=0,u=["in","of"],a=0,l,c;hn(f.tokens.next,["{","["])&&++a;do{s=W(o),++o,hn(s,["{","["])?++a:hn(s,["}","]"])&&--a;if(a<0)break;a===0&&(!l&&pn(s,",")?l=s:!c&&pn(s,"=")&&(c=s))}while(a>0||!r.contains(u,s.value)&&s.value!==";"&&s.type!=="(end)");if(r.contains(u,s.value)){!f.inES6()&&s.value==="of"&&F("W104",s,"for of","6");var h=!c&&!l;c&&q("W133",l,s.value,"initializer is forbidden"),l&&q("W133",l,s.value,"more than one ForBinding"),f.tokens.next.id==="var"?(V("var"),f.tokens.curr.fud({prefix:!0})):f.tokens.next.id==="let"||f.tokens.next.id==="const"?(V(f.tokens.next.id),n=!0,f.funct["(scope)"].stack(),f.tokens.curr.fud({prefix:!0})):Object.create(rn).fud({prefix:!0,implied:"for",ignore:!h}),V(s.value),Q(20),V(")",t),s.value==="in"&&f.option.forin&&(f.forinifcheckneeded=!0,f.forinifchecks===undefined&&(f.forinifchecks=[]),f.forinifchecks.push({type:"(none)"})),f.funct["(breakage)"]+=1,f.funct["(loopage)"]+=1,e=_t(!0,!0);if(s.value==="in"&&f.option.forin){if(f.forinifchecks&&f.forinifchecks.length>0){var p=f.forinifchecks.pop();(e&&e.length>0&&(typeof e[0]!="object"||e[0].value!=="if")||p.type==="(positive)"&&e.length>1||p.type==="(negative)")&&F("W089",this)}f.forinifcheckneeded=!1}f.funct["(breakage)"]-=1,f.funct["(loopage)"]-=1}else{i&&q("E045",i);if(f.tokens.next.id!==";")if(f.tokens.next.id==="var")V("var"),f.tokens.curr.fud();else if(f.tokens.next.id==="let")V("let"),n=!0,f.funct["(scope)"].stack(),f.tokens.curr.fud();else for(;;){Q(0,"for");if(f.tokens.next.id!==",")break;l()}Z(f.tokens.curr),V(";"),f.funct["(loopage)"]+=1,f.tokens.next.id!==";"&&Jt(Q(0)),Z(f.tokens.curr),V(";"),f.tokens.next.id===";"&&q("E021",f.tokens.next,")",";");if(f.tokens.next.id!==")")for(;;){Q(0,"for");if(f.tokens.next.id!==",")break;l()}V(")",t),f.funct["(breakage)"]+=1,_t(!0,!0),f.funct["(breakage)"]-=1,f.funct["(loopage)"]-=1}return n&&f.funct["(scope)"].unstack(),this}).labelled=!0,it("break",function(){var e=f.tokens.next.value;return f.option.asi||Z(this),f.tokens.next.id!==";"&&!f.tokens.next.reach&&f.tokens.curr.line===G(f.tokens.next)?(f.funct["(scope)"].funct.hasBreakLabel(e)||F("W090",f.tokens.next,e),this.first=f.tokens.next,V()):f.funct["(breakage)"]===0&&F("W052",f.tokens.next,this.value),kt(this),this}).exps=!0,it("continue",function(){var e=f.tokens.next.value;return f.funct["(breakage)"]===0&&F("W052",f.tokens.next,this.value),f.funct["(loopage)"]||F("W052",f.tokens.next,this.value),f.option.asi||Z(this),f.tokens.next.id!==";"&&!f.tokens.next.reach&&f.tokens.curr.line===G(f.tokens.next)&&(f.funct["(scope)"].funct.hasBreakLabel(e)||F("W090",f.tokens.next,e),this.first=f.tokens.next,V()),kt(this),this}).exps=!0,it("return",function(){return this.line===G(f.tokens.next)?f.tokens.next.id!==";"&&!f.tokens.next.reach&&(this.first=Q(0),this.first&&this.first.type==="(punctuator)"&&this.first.value==="="&&!this.first.paren&&!f.option.boss&&I("W093",this.first.line,this.first.character)):f.tokens.next.type==="(punctuator)"&&["[","{","+","-"].indexOf(f.tokens.next.value)>-1&&Z(this),kt(this),this}).exps=!0,function(e){e.exps=!0,e.lbp=25}(ut("yield",function(){var e=f.tokens.prev;f.inES6(!0)&&!f.funct["(generator)"]?("(catch)"!==f.funct["(name)"]||!f.funct["(context)"]["(generator)"])&&q("E046",f.tokens.curr,"yield"):f.inES6()||F("W104",f.tokens.curr,"yield","6"),f.funct["(generator)"]="yielded";var t=!1;f.tokens.next.value==="*"&&(t=!0,V("*"));if(this.line===G(f.tokens.next)||!f.inMoz()){if(t||f.tokens.next.id!==";"&&!f.option.asi&&!f.tokens.next.reach&&f.tokens.next.nud)Y(f.tokens.curr,f.tokens.next),this.first=Q(10),this.first.type==="(punctuator)"&&this.first.value==="="&&!this.first.paren&&!f.option.boss&&I("W093",this.first.line,this.first.character);f.inMoz()&&f.tokens.next.id!==")"&&(e.lbp>30||!e.assign&&!J()||e.id==="yield")&&q("E050",this)}else f.option.asi||Z(this);return this})),it("throw",function(){return Z(this),this.first=Q(20),kt(this),this}).exps=!0,it("import",function(){f.inES6()||F("W119",f.tokens.curr,"import","6");if(f.tokens.next.type==="(string)")return V("(string)"),this;if(f.tokens.next.identifier){this.name=Ct(),f.funct["(scope)"].addlabel(this.name,{type:"const",token:f.tokens.curr});if(f.tokens.next.value!==",")return V("from"),V("(string)"),this;V(",")}if(f.tokens.next.id==="*")V("*"),V("as"),f.tokens.next.identifier&&(this.name=Ct(),f.funct["(scope)"].addlabel(this.name,{type:"const",token:f.tokens.curr}));else{V("{");for(;;){if(f.tokens.next.value==="}"){V("}");break}var e;f.tokens.next.type==="default"?(e="default",V("default")):e=Ct(),f.tokens.next.value==="as"&&(V("as"),e=Ct()),f.funct["(scope)"].addlabel(e,{type:"const",token:f.tokens.curr});if(f.tokens.next.value!==","){if(f.tokens.next.value==="}"){V("}");break}q("E024",f.tokens.next,f.tokens.next.value);break}V(",")}}return V("from"),V("(string)"),this}).exps=!0,it("export",function(){var e=!0,t,n;f.inES6()||(F("W119",f.tokens.curr,"export","6"),e=!1),f.funct["(scope)"].block.isGlobal()||(q("E053",f.tokens.curr),e=!1);if(f.tokens.next.value==="*")return V("*"),V("from"),V("(string)"),this;if(f.tokens.next.type==="default"){f.nameStack.set(f.tokens.next),V("default");var r=f.tokens.next.id;if(r==="function"||r==="class")this.block=!0;return t=W(),Q(10),n=t.value,this.block&&(f.funct["(scope)"].addlabel(n,{type:r,token:t}),f.funct["(scope)"].setExported(n,t)),this}if(f.tokens.next.value==="{"){V("{");var i=[];for(;;){f.tokens.next.identifier||q("E030",f.tokens.next,f.tokens.next.value),V(),i.push(f.tokens.curr),f.tokens.next.value==="as"&&(V("as"),f.tokens.next.identifier||q("E030",f.tokens.next,f.tokens.next.value),V());if(f.tokens.next.value!==","){if(f.tokens.next.value==="}"){V("}");break}q("E024",f.tokens.next,f.tokens.next.value);break}V(",")}return f.tokens.next.value==="from"?(V("from"),V("(string)")):e&&i.forEach(function(e){f.funct["(scope)"].setExported(e.value,e)}),this}if(f.tokens.next.id==="var")V("var"),f.tokens.curr.fud({inexport:!0});else if(f.tokens.next.id==="let")V("let"),f.tokens.curr.fud({inexport:!0});else if(f.tokens.next.id==="const")V("const"),f.tokens.curr.fud({inexport:!0});else if(f.tokens.next.id==="function")this.block=!0,V("function"),f.syntax["function"].fud({inexport:!0});else if(f.tokens.next.id==="class"){this.block=!0,V("class");var s=f.tokens.next;f.syntax["class"].fud(),f.funct["(scope)"].setExported(s.value,s)}else q("E024",f.tokens.next,f.tokens.next.value);return this}).exps=!0,lt("abstract"),lt("boolean"),lt("byte"),lt("char"),lt("class",{es5:!0,nud:sn}),lt("double"),lt("enum",{es5:!0}),lt("export",{es5:!0}),lt("extends",{es5:!0}),lt("final"),lt("float"),lt("goto"),lt("implements",{es5:!0,strictOnly:!0}),lt("import",{es5:!0}),lt("int"),lt("interface",{es5:!0,strictOnly:!0}),lt("long"),lt("native"),lt("package",{es5:!0,strictOnly:!0}),lt("private",{es5:!0,strictOnly:!0}),lt("protected",{es5:!0,strictOnly:!0}),lt("public",{es5:!0,strictOnly:!0}),lt("short"),lt("static",{es5:!0,strictOnly:!0}),lt("super",{es5:!0}),lt("synchronized"),lt("transient"),lt("volatile");var an=function(){var e,t,n,r=-1,i=0,s={};hn(f.tokens.curr,["[","{"])&&(i+=1);do{n=r===-1?f.tokens.curr:e,e=r===-1?f.tokens.next:W(r),t=W(r+1),r+=1,hn(e,["[","{"])?i+=1:hn(e,["]","}"])&&(i-=1);if(i===1&&e.identifier&&e.value==="for"&&!pn(n,".")){s.isCompArray=!0,s.notJson=!0;break}if(i===0&&hn(e,["}","]"])){if(t.value==="="){s.isDestAssign=!0,s.notJson=!0;break}if(t.value==="."){s.notJson=!0;break}}pn(e,";")&&(s.isBlock=!0,s.notJson=!0)}while(i>0&&e.id!=="(end)");return s},vn=function(){function i(e){var t=n.variables.filter(function(t){if(t.value===e)return t.undef=!1,e}).length;return t!==0}function s(e){var t=n.variables.filter(function(t){if(t.value===e&&!t.undef)return t.unused===!0&&(t.unused=!1),e}).length;return t===0}var e=function(){this.mode="use",this.variables=[]},t=[],n;return{stack:function(){n=new e,t.push(n)},unstack:function(){n.variables.filter(function(e){e.unused&&F("W098",e.token,e.raw_text||e.value),e.undef&&f.funct["(scope)"].block.use(e.value,e.token)}),t.splice(-1,1),n=t[t.length-1]},setState:function(e){r.contains(["use","define","generate","filter"],e)&&(n.mode=e)},check:function(e){if(!n)return;return n&&n.mode==="use"?(s(e)&&n.variables.push({funct:f.funct,token:f.tokens.curr,value:e,undef:!0,unused:!1}),!0):n&&n.mode==="define"?(i(e)||n.variables.push({funct:f.funct,token:f.tokens.curr,value:e,undef:!1,unused:!0}),!0):n&&n.mode==="generate"?(f.funct["(scope)"].block.use(e,f.tokens.curr),!0):n&&n.mode==="filter"?(s(e)&&f.funct["(scope)"].block.use(e,f.tokens.curr),!0):!1}}},gn=function(e){return e.replace(/[-\/\\^$*+?.()|[\]{}]/g,"\\$&")},yn=function(t,i,o){function U(e,t){if(!e)return;!Array.isArray(e)&&typeof e=="object"&&(e=Object.keys(e)),e.forEach(t)}var a,l,c,d,A,O,M={},P={};i=r.clone(i),f.reset(),i&&i.scope?p.scope=i.scope:(p.errors=[],p.undefs=[],p.internals=[],p.blacklist={},p.scope="(main)"),S=Object.create(null),D(S,s.ecmaIdentifiers[3]),D(S,s.reservedVars),D(S,o||{}),n=Object.create(null);var j=Object.create(null);if(i){U(i.predef||null,function(e){var t,n;e[0]==="-"?(t=e.slice(1),p.blacklist[t]=t,delete S[t]):(n=Object.getOwnPropertyDescriptor(i.predef,e),S[e]=n?n.value:!1)}),U(i.exported||null,function(e){j[e]=!0}),delete i.predef,delete i.exported,O=Object.keys(i);for(c=0;c0&&(e.implieds=u),T.length>0&&(e.urls=T),o=f.funct["(scope)"].getUsedOrDefinedGlobals(),o.length>0&&(e.globals=o);for(r=1;r0&&(e.unused=a);for(s in w)if(typeof w[s]=="number"){e.member=w;break}return e},yn.jshint=yn,yn}();typeof n=="object"&&n&&(n.JSHINT=p)},{"../lodash":"/node_modules/jshint/lodash.js","./lex.js":"/node_modules/jshint/src/lex.js","./messages.js":"/node_modules/jshint/src/messages.js","./options.js":"/node_modules/jshint/src/options.js","./reg.js":"/node_modules/jshint/src/reg.js","./scope-manager.js":"/node_modules/jshint/src/scope-manager.js","./state.js":"/node_modules/jshint/src/state.js","./style.js":"/node_modules/jshint/src/style.js","./vars.js":"/node_modules/jshint/src/vars.js",events:"/node_modules/browserify/node_modules/events/events.js"}],"/node_modules/jshint/src/lex.js":[function(e,t,n){"use strict";function h(){var e=[];return{push:function(t){e.push(t)},check:function(){for(var t=0;t0&&this.context[this.context.length-1].type===e},pushContext:function(e){this.context.push({type:e})},popContext:function(){return this.context.pop()},isContext:function(e){return this.context.length>0&&this.context[this.context.length-1]===e},currentContext:function(){return this.context.length>0&&this.context[this.context.length-1]},getLines:function(){return this._lines=o.lines,this._lines},setLines:function(e){this._lines=e,o.lines=this._lines},peek:function(e){return this.input.charAt(e||0)},skip:function(e){e=e||1,this.char+=e,this.input=this.input.slice(e)},on:function(e,t){e.split(" ").forEach(function(e){this.emitter.on(e,t)}.bind(this))},trigger:function(){this.emitter.emit.apply(this.emitter,Array.prototype.slice.call(arguments))},triggerAsync:function(e,t,n,r){n.push(function(){r()&&this.trigger(e,t)}.bind(this))},scanPunctuator:function(){var e=this.peek(),t,n,r;switch(e){case".":if(/^[0-9]$/.test(this.peek(1)))return null;if(this.peek(1)==="."&&this.peek(2)===".")return{type:l.Punctuator,value:"..."};case"(":case")":case";":case",":case"[":case"]":case":":case"~":case"?":return{type:l.Punctuator,value:e};case"{":return this.pushContext(c.Block),{type:l.Punctuator,value:e};case"}":return this.inContext(c.Block)&&this.popContext(),{type:l.Punctuator,value:e};case"#":return{type:l.Punctuator,value:e};case"":return null}return t=this.peek(1),n=this.peek(2),r=this.peek(3),e===">"&&t===">"&&n===">"&&r==="="?{type:l.Punctuator,value:">>>="}:e==="="&&t==="="&&n==="="?{type:l.Punctuator,value:"==="}:e==="!"&&t==="="&&n==="="?{type:l.Punctuator,value:"!=="}:e===">"&&t===">"&&n===">"?{type:l.Punctuator,value:">>>"}:e==="<"&&t==="<"&&n==="="?{type:l.Punctuator,value:"<<="}:e===">"&&t===">"&&n==="="?{type:l.Punctuator,value:">>="}:e==="="&&t===">"?{type:l.Punctuator,value:e+t}:e===t&&"+-<>&|".indexOf(e)>=0?{type:l.Punctuator,value:e+t}:"<>=!+-*%&|^".indexOf(e)>=0?t==="="?{type:l.Punctuator,value:e+t}:{type:l.Punctuator,value:e}:e==="/"?t==="="?{type:l.Punctuator,value:"/="}:{type:l.Punctuator,value:"/"}:null},scanComments:function(){function u(e,t,n){var r=["jshint","jslint","members","member","globals","global","exported"],i=!1,u=e+t,a="plain";return n=n||{},n.isMultiline&&(u+="*/"),t=t.replace(/\n/g," "),e==="/*"&&s.fallsThrough.test(t)&&(i=!0,a="falls through"),r.forEach(function(n){if(i)return;if(e==="//"&&n!=="jshint")return;t.charAt(n.length)===" "&&t.substr(0,n.length)===n&&(i=!0,e+=n,t=t.substr(n.length)),!i&&t.charAt(0)===" "&&t.charAt(n.length+1)===" "&&t.substr(1,n.length)===n&&(i=!0,e=e+" "+n,t=t.substr(n.length+1));if(!i)return;switch(n){case"member":a="members";break;case"global":a="globals";break;default:var r=t.split(":").map(function(e){return e.replace(/^\s+/,"").replace(/\s+$/,"")});if(r.length===2)switch(r[0]){case"ignore":switch(r[1]){case"start":o.ignoringLinterErrors=!0,i=!1;break;case"end":o.ignoringLinterErrors=!1,i=!1}}a=n}}),{type:l.Comment,commentType:a,value:u,body:t,isSpecial:i,isMultiline:n.isMultiline||!1,isMalformed:n.isMalformed||!1}}var e=this.peek(),t=this.peek(1),n=this.input.substr(2),r=this.line,i=this.char,o=this;if(e==="*"&&t==="/")return this.trigger("error",{code:"E018",line:r,character:i}),this.skip(2),null;if(e!=="/"||t!=="*"&&t!=="/")return null;if(t==="/")return this.skip(this.input.length),u("//",n);var a="";if(t==="*"){this.inComment=!0,this.skip(2);while(this.peek()!=="*"||this.peek(1)!=="/")if(this.peek()===""){a+="\n";if(!this.nextLine())return this.trigger("error",{code:"E017",line:r,character:i}),this.inComment=!1,u("/*",a,{isMultiline:!0,isMalformed:!0})}else a+=this.peek(),this.skip();return this.skip(2),this.inComment=!1,u("/*",a,{isMultiline:!0})}},scanKeyword:function(){var e=/^[a-zA-Z_$][a-zA-Z0-9_$]*/.exec(this.input),t=["if","in","do","var","for","new","try","let","this","else","case","void","with","enum","while","break","catch","throw","const","yield","class","super","return","typeof","delete","switch","export","import","default","finally","extends","function","continue","debugger","instanceof"];return e&&t.indexOf(e[0])>=0?{type:l.Keyword,value:e[0]}:null},scanIdentifier:function(){function i(e){return e>256}function s(e){return e>256}function o(e){return/^[0-9a-fA-F]$/.test(e)}function p(e){return e.replace(/\\u([0-9a-fA-F]{4})/g,function(e,t){return String.fromCharCode(parseInt(t,16))})}var e="",t=0,n,r,u=function(){t+=1;if(this.peek(t)!=="u")return null;var e=this.peek(t+1),n=this.peek(t+2),r=this.peek(t+3),i=this.peek(t+4),u;return o(e)&&o(n)&&o(r)&&o(i)?(u=parseInt(e+n+r+i,16),f[u]||s(u)?(t+=5,"\\u"+e+n+r+i):null):null}.bind(this),c=function(){var e=this.peek(t),n=e.charCodeAt(0);return n===92?u():n<128?a[n]?(t+=1,e):null:i(n)?(t+=1,e):null}.bind(this),h=function(){var e=this.peek(t),n=e.charCodeAt(0);return n===92?u():n<128?f[n]?(t+=1,e):null:s(n)?(t+=1,e):null}.bind(this);r=c();if(r===null)return null;e=r;for(;;){r=h();if(r===null)break;e+=r}switch(e){case"true":case"false":n=l.BooleanLiteral;break;case"null":n=l.NullLiteral;break;default:n=l.Identifier}return{type:n,value:p(e),text:e,tokenLength:e.length}},scanNumericLiteral:function(){function f(e){return/^[0-9]$/.test(e)}function c(e){return/^[0-7]$/.test(e)}function h(e){return/^[01]$/.test(e)}function p(e){return/^[0-9a-fA-F]$/.test(e)}function d(e){return e==="$"||e==="_"||e==="\\"||e>="a"&&e<="z"||e>="A"&&e<="Z"}var e=0,t="",n=this.input.length,r=this.peek(e),i,s=f,u=10,a=!1;if(r!=="."&&!f(r))return null;if(r!=="."){t=this.peek(e),e+=1,r=this.peek(e);if(t==="0"){if(r==="x"||r==="X")s=p,u=16,e+=1,t+=r;if(r==="o"||r==="O")s=c,u=8,o.inES6(!0)||this.trigger("warning",{code:"W119",line:this.line,character:this.char,data:["Octal integer literal","6"]}),e+=1,t+=r;if(r==="b"||r==="B")s=h,u=2,o.inES6(!0)||this.trigger("warning",{code:"W119",line:this.line,character:this.char,data:["Binary integer literal","6"]}),e+=1,t+=r;c(r)&&(s=c,u=8,a=!0,i=!1,e+=1,t+=r),!c(r)&&f(r)&&(e+=1,t+=r)}while(e=0&&i<=7&&o.isStrict()});break;case"u":var s=this.input.substr(1,4),u=parseInt(s,16);isNaN(u)&&this.trigger("warning",{code:"W052",line:this.line,character:this.char,data:["u"+s]}),r=String.fromCharCode(u),n=5;break;case"v":this.triggerAsync("warning",{code:"W114",line:this.line,character:this.char,data:["\\v"]},e,function(){return o.jsonMode}),r=" ";break;case"x":var a=parseInt(this.input.substr(1,2),16);this.triggerAsync("warning",{code:"W114",line:this.line,character:this.char,data:["\\x-"]},e,function(){return o.jsonMode}),r=String.fromCharCode(a),n=3;break;case"\\":r="\\\\";break;case'"':r='\\"';break;case"/":break;case"":t=!0,r=""}return{"char":r,jump:n,allowNewLine:t}},scanTemplateLiteral:function(e){var t,n="",r,i=this.line,s=this.char,u=this.templateStarts.length;if(!o.inES6(!0))return null;if(this.peek()==="`")t=l.TemplateHead,this.templateStarts.push({line:this.line,"char":this.char}),u=this.templateStarts.length,this.skip(1),this.pushContext(c.Template);else{if(!this.inContext(c.Template)||this.peek()!=="}")return null;t=l.TemplateMiddle}while(this.peek()!=="`"){while((r=this.peek())===""){n+="\n";if(!this.nextLine()){var a=this.templateStarts.pop();return this.trigger("error",{code:"E052",line:a.line,character:a.char}),{type:t,value:n,startLine:i,startChar:s,isUnclosed:!0,depth:u,context:this.popContext()}}}if(r==="$"&&this.peek(1)==="{")return n+="${",this.skip(2),{type:t,value:n,startLine:i,startChar:s,isUnclosed:!1,depth:u,context:this.currentContext()};if(r==="\\"){var f=this.scanEscapeSequence(e);n+=f.char,this.skip(f.jump)}else r!=="`"&&(n+=r,this.skip(1))}return t=t===l.TemplateHead?l.NoSubstTemplate:l.TemplateTail,this.skip(1),this.templateStarts.pop(),{type:t,value:n,startLine:i,startChar:s,isUnclosed:!1,depth:u,context:this.popContext()}},scanStringLiteral:function(e){var t=this.peek();if(t!=='"'&&t!=="'")return null;this.triggerAsync("warning",{code:"W108",line:this.line,character:this.char},e,function(){return o.jsonMode&&t!=='"'});var n="",r=this.line,i=this.char,s=!1;this.skip();while(this.peek()!==t)if(this.peek()===""){s?(s=!1,this.triggerAsync("warning",{code:"W043",line:this.line,character:this.char},e,function(){return!o.option.multistr}),this.triggerAsync("warning",{code:"W042",line:this.line,character:this.char},e,function(){return o.jsonMode&&o.option.multistr})):this.trigger("warning",{code:"W112",line:this.line,character:this.char});if(!this.nextLine())return this.trigger("error",{code:"E029",line:r,character:i}),{type:l.StringLiteral,value:n,startLine:r,startChar:i,isUnclosed:!0,quote:t}}else{s=!1;var u=this.peek(),a=1;u<" "&&this.trigger("warning",{code:"W113",line:this.line,character:this.char,data:[""]});if(u==="\\"){var f=this.scanEscapeSequence(e);u=f.char,a=f.jump,s=f.allowNewLine}n+=u,this.skip(a)}return this.skip(),{type:l.StringLiteral,value:n,startLine:r,startChar:i,isUnclosed:!1,quote:t}},scanRegExp:function(){var e=0,t=this.input.length,n=this.peek(),r=n,i="",s=[],o=!1,u=!1,a,f=function(){n<" "&&(o=!0,this.trigger("warning",{code:"W048",line:this.line,character:this.char})),n==="<"&&(o=!0,this.trigger("warning",{code:"W049",line:this.line,character:this.char,data:[n]}))}.bind(this);if(!this.prereg||n!=="/")return null;e+=1,a=!1;while(e=this.getLines().length)return!1;this.input=this.getLines()[this.line],this.line+=1,this.char=1,this.from=1;var t=this.input.trim(),n=function(){return r.some(arguments,function(e){return t.indexOf(e)===0})},i=function(){return r.some(arguments,function(e){return t.indexOf(e,t.length-e.length)!==-1})};this.ignoringLinterErrors===!0&&!n("/*","//")&&(!this.inComment||!i("*/"))&&(this.input=""),e=this.scanNonBreakingSpaces(),e>=0&&this.trigger("warning",{code:"W125",line:this.line,character:e+1}),this.input=this.input.replace(/\t/g,o.tab),e=this.scanUnsafeChars(),e>=0&&this.trigger("warning",{code:"W100",line:this.line,character:e});if(!this.ignoringLinterErrors&&o.option.maxlen&&o.option.maxlen=0;--t){var n=a[t]["(labels)"];if(n[e])return n}}function x(e){for(var t=a.length-1;t>=0;t--){var n=a[t];if(n["(usages)"][e])return n["(usages)"][e];if(n===l)break}return!1}function T(t,n){if(e.option.shadow!=="outer")return;var r=l["(type)"]==="global",i=u["(type)"]==="functionparams",s=!r;for(var o=0;o1?a[a.length-2]:null,n=u===l,i=u["(type)"]==="functionparams",f=u["(type)"]==="functionouter",p,d,g=u["(usages)"],y=u["(labels)"],E=Object.keys(g);g.__proto__&&E.indexOf("__proto__")===-1&&E.push("__proto__");for(p=0;p=0;s--){var o=a[s];if(o["(labels)"][e]&&(!n||o["(labels)"][e]["(blockscoped)"]))return o["(labels)"][e]["(type)"];var u=r?a[s-1]:o;if(u&&u["(type)"]==="functionparams")return null}return null},hasBreakLabel:function(e){for(var t=a.length-1;t>=0;t--){var n=a[t];if(n["(breakLabels)"][e])return!0;if(n["(type)"]==="functionparams")return!1}return!1},has:function(e,t){return Boolean(this.labeltype(e,t))},add:function(e,t,n,r){u["(labels)"][e]={"(type)":t,"(token)":n,"(blockscoped)":!1,"(function)":l,"(unused)":r}}},block:{isGlobal:function(){return u["(type)"]==="global"},use:function(t,n){var r=l["(parent)"];r&&r["(labels)"][t]&&r["(labels)"][t]["(type)"]==="param"&&(C.funct.has(t,{excludeParams:!0,onlyBlockscoped:!0})||(r["(labels)"][t]["(unused)"]=!1)),n&&(e.ignored.W117||e.option.undef===!1)&&(n.ignoreUndef=!0),g(t),n&&(n["(function)"]=l,u["(usages)"][t]["(tokens)"].push(n))},reassign:function(e,t){this.modify(e,t),u["(usages)"][e]["(reassigned)"].push(t)},modify:function(e,t){g(e),u["(usages)"][e]["(modified)"].push(t)},add:function(e,t,n,r){u["(labels)"][e]={"(type)":t,"(token)":n,"(blockscoped)":!0,"(unused)":r}},addBreakLabel:function(t,n){var r=n.token;C.funct.hasBreakLabel(t)?v("E011",r,t):e.option.shadow==="outer"&&(C.funct.has(t)?v("W004",r,t):T(t,r)),u["(breakLabels)"][t]=r}}};return C};t.exports=o},{"../lodash":"/node_modules/jshint/lodash.js",events:"/node_modules/browserify/node_modules/events/events.js"}],"/node_modules/jshint/src/state.js":[function(e,t,n){"use strict";var r=e("./name-stack.js"),i={syntax:{},isStrict:function(){return this.directive["use strict"]||this.inClassBody||this.option.module||this.option.strict==="implied"},inMoz:function(){return this.option.moz},inES6:function(){return this.option.moz||this.option.esversion>=6},inES5:function(e){return e?(!this.option.esversion||this.option.esversion===5)&&!this.option.moz:!this.option.esversion||this.option.esversion>=5||this.option.moz},reset:function(){this.tokens={prev:null,next:null,curr:null},this.option={},this.funct=null,this.ignored={},this.directive={},this.jsonMode=!1,this.jsonWarnings=[],this.lines=[],this.tab="",this.cache={},this.ignoredLines={},this.forinifcheckneeded=!1,this.nameStack=new r,this.inClassBody=!1}};n.state=i},{"./name-stack.js":"/node_modules/jshint/src/name-stack.js"}],"/node_modules/jshint/src/style.js":[function(e,t,n){"use strict";n.register=function(e){e.on("Identifier",function(n){if(e.getOption("proto"))return;n.name==="__proto__"&&e.warn("W103",{line:n.line,"char":n.char,data:[n.name,"6"]})}),e.on("Identifier",function(n){if(e.getOption("iterator"))return;n.name==="__iterator__"&&e.warn("W103",{line:n.line,"char":n.char,data:[n.name]})}),e.on("Identifier",function(n){if(!e.getOption("camelcase"))return;n.name.replace(/^_+|_+$/g,"").indexOf("_")>-1&&!n.name.match(/^[A-Z0-9_]*$/)&&e.warn("W106",{line:n.line,"char":n.from,data:[n.name]})}),e.on("String",function(n){var r=e.getOption("quotmark"),i;if(!r)return;r==="single"&&n.quote!=="'"&&(i="W109"),r==="double"&&n.quote!=='"'&&(i="W108"),r===!0&&(e.getCache("quotmark")||e.setCache("quotmark",n.quote),e.getCache("quotmark")!==n.quote&&(i="W110")),i&&e.warn(i,{line:n.line,"char":n.char})}),e.on("Number",function(n){n.value.charAt(0)==="."&&e.warn("W008",{line:n.line,"char":n.char,data:[n.value]}),n.value.substr(n.value.length-1)==="."&&e.warn("W047",{line:n.line,"char":n.char,data:[n.value]}),/^00+/.test(n.value)&&e.warn("W046",{line:n.line,"char":n.char,data:[n.value]})}),e.on("String",function(n){var r=/^(?:javascript|jscript|ecmascript|vbscript|livescript)\s*:/i;if(e.getOption("scripturl"))return;r.test(n.value)&&e.warn("W107",{line:n.line,"char":n.char})})}},{}],"/node_modules/jshint/src/vars.js":[function(e,t,n){"use strict";n.reservedVars={arguments:!1,NaN:!1},n.ecmaIdentifiers={3:{Array:!1,Boolean:!1,Date:!1,decodeURI:!1,decodeURIComponent:!1,encodeURI:!1,encodeURIComponent:!1,Error:!1,eval:!1,EvalError:!1,Function:!1,hasOwnProperty:!1,isFinite:!1,isNaN:!1,Math:!1,Number:!1,Object:!1,parseInt:!1,parseFloat:!1,RangeError:!1,ReferenceError:!1,RegExp:!1,String:!1,SyntaxError:!1,TypeError:!1,URIError:!1},5:{JSON:!1},6:{Map:!1,Promise:!1,Proxy:!1,Reflect:!1,Set:!1,Symbol:!1,WeakMap:!1,WeakSet:!1}},n.browser={Audio:!1,Blob:!1,addEventListener:!1,applicationCache:!1,atob:!1,blur:!1,btoa:!1,cancelAnimationFrame:!1,CanvasGradient:!1,CanvasPattern:!1,CanvasRenderingContext2D:!1,CSS:!1,clearInterval:!1,clearTimeout:!1,close:!1,closed:!1,Comment:!1,CustomEvent:!1,DOMParser:!1,defaultStatus:!1,Document:!1,document:!1,DocumentFragment:!1,Element:!1,ElementTimeControl:!1,Event:!1,event:!1,fetch:!1,FileReader:!1,FormData:!1,focus:!1,frames:!1,getComputedStyle:!1,HTMLElement:!1,HTMLAnchorElement:!1,HTMLBaseElement:!1,HTMLBlockquoteElement:!1,HTMLBodyElement:!1,HTMLBRElement:!1,HTMLButtonElement:!1,HTMLCanvasElement:!1,HTMLCollection:!1,HTMLDirectoryElement:!1,HTMLDivElement:!1,HTMLDListElement:!1,HTMLFieldSetElement:!1,HTMLFontElement:!1,HTMLFormElement:!1,HTMLFrameElement:!1,HTMLFrameSetElement:!1,HTMLHeadElement:!1,HTMLHeadingElement:!1,HTMLHRElement:!1,HTMLHtmlElement:!1,HTMLIFrameElement:!1,HTMLImageElement:!1,HTMLInputElement:!1,HTMLIsIndexElement:!1,HTMLLabelElement:!1,HTMLLayerElement:!1,HTMLLegendElement:!1,HTMLLIElement:!1,HTMLLinkElement:!1,HTMLMapElement:!1,HTMLMenuElement:!1,HTMLMetaElement:!1,HTMLModElement:!1,HTMLObjectElement:!1,HTMLOListElement:!1,HTMLOptGroupElement:!1,HTMLOptionElement:!1,HTMLParagraphElement:!1,HTMLParamElement:!1,HTMLPreElement:!1,HTMLQuoteElement:!1,HTMLScriptElement:!1,HTMLSelectElement:!1,HTMLStyleElement:!1,HTMLTableCaptionElement:!1,HTMLTableCellElement:!1,HTMLTableColElement:!1,HTMLTableElement:!1,HTMLTableRowElement:!1,HTMLTableSectionElement:!1,HTMLTemplateElement:!1,HTMLTextAreaElement:!1,HTMLTitleElement:!1,HTMLUListElement:!1,HTMLVideoElement:!1,history:!1,Image:!1,Intl:!1,length:!1,localStorage:!1,location:!1,matchMedia:!1,MessageChannel:!1,MessageEvent:!1,MessagePort:!1,MouseEvent:!1,moveBy:!1,moveTo:!1,MutationObserver:!1,name:!1,Node:!1,NodeFilter:!1,NodeList:!1,Notification:!1,navigator:!1,onbeforeunload:!0,onblur:!0,onerror:!0,onfocus:!0,onload:!0,onresize:!0,onunload:!0,open:!1,openDatabase:!1,opener:!1,Option:!1,parent:!1,performance:!1,print:!1,Range:!1,requestAnimationFrame:!1,removeEventListener:!1,resizeBy:!1,resizeTo:!1,screen:!1,scroll:!1,scrollBy:!1,scrollTo:!1,sessionStorage:!1,setInterval:!1,setTimeout:!1,SharedWorker:!1,status:!1,SVGAElement:!1,SVGAltGlyphDefElement:!1,SVGAltGlyphElement:!1,SVGAltGlyphItemElement:!1,SVGAngle:!1,SVGAnimateColorElement:!1,SVGAnimateElement:!1,SVGAnimateMotionElement:!1,SVGAnimateTransformElement:!1,SVGAnimatedAngle:!1,SVGAnimatedBoolean:!1,SVGAnimatedEnumeration:!1,SVGAnimatedInteger:!1,SVGAnimatedLength:!1,SVGAnimatedLengthList:!1,SVGAnimatedNumber:!1,SVGAnimatedNumberList:!1,SVGAnimatedPathData:!1,SVGAnimatedPoints:!1,SVGAnimatedPreserveAspectRatio:!1,SVGAnimatedRect:!1,SVGAnimatedString:!1,SVGAnimatedTransformList:!1,SVGAnimationElement:!1,SVGCSSRule:!1,SVGCircleElement:!1,SVGClipPathElement:!1,SVGColor:!1,SVGColorProfileElement:!1,SVGColorProfileRule:!1,SVGComponentTransferFunctionElement:!1,SVGCursorElement:!1,SVGDefsElement:!1,SVGDescElement:!1,SVGDocument:!1,SVGElement:!1,SVGElementInstance:!1,SVGElementInstanceList:!1,SVGEllipseElement:!1,SVGExternalResourcesRequired:!1,SVGFEBlendElement:!1,SVGFEColorMatrixElement:!1,SVGFEComponentTransferElement:!1,SVGFECompositeElement:!1,SVGFEConvolveMatrixElement:!1,SVGFEDiffuseLightingElement:!1,SVGFEDisplacementMapElement:!1,SVGFEDistantLightElement:!1,SVGFEFloodElement:!1,SVGFEFuncAElement:!1,SVGFEFuncBElement:!1,SVGFEFuncGElement:!1,SVGFEFuncRElement:!1,SVGFEGaussianBlurElement:!1,SVGFEImageElement:!1,SVGFEMergeElement:!1,SVGFEMergeNodeElement:!1,SVGFEMorphologyElement:!1,SVGFEOffsetElement:!1,SVGFEPointLightElement:!1,SVGFESpecularLightingElement:!1,SVGFESpotLightElement:!1,SVGFETileElement:!1,SVGFETurbulenceElement:!1,SVGFilterElement:!1,SVGFilterPrimitiveStandardAttributes:!1,SVGFitToViewBox:!1,SVGFontElement:!1,SVGFontFaceElement:!1,SVGFontFaceFormatElement:!1,SVGFontFaceNameElement:!1,SVGFontFaceSrcElement:!1,SVGFontFaceUriElement:!1,SVGForeignObjectElement:!1,SVGGElement:!1,SVGGlyphElement:!1,SVGGlyphRefElement:!1,SVGGradientElement:!1,SVGHKernElement:!1,SVGICCColor:!1,SVGImageElement:!1,SVGLangSpace:!1,SVGLength:!1,SVGLengthList:!1,SVGLineElement:!1,SVGLinearGradientElement:!1,SVGLocatable:!1,SVGMPathElement:!1,SVGMarkerElement:!1,SVGMaskElement:!1,SVGMatrix:!1,SVGMetadataElement:!1,SVGMissingGlyphElement:!1,SVGNumber:!1,SVGNumberList:!1,SVGPaint:!1,SVGPathElement:!1,SVGPathSeg:!1,SVGPathSegArcAbs:!1,SVGPathSegArcRel:!1,SVGPathSegClosePath:!1,SVGPathSegCurvetoCubicAbs:!1,SVGPathSegCurvetoCubicRel:!1,SVGPathSegCurvetoCubicSmoothAbs:!1,SVGPathSegCurvetoCubicSmoothRel:!1,SVGPathSegCurvetoQuadraticAbs:!1,SVGPathSegCurvetoQuadraticRel:!1,SVGPathSegCurvetoQuadraticSmoothAbs:!1,SVGPathSegCurvetoQuadraticSmoothRel:!1,SVGPathSegLinetoAbs:!1,SVGPathSegLinetoHorizontalAbs:!1,SVGPathSegLinetoHorizontalRel:!1,SVGPathSegLinetoRel:!1,SVGPathSegLinetoVerticalAbs:!1,SVGPathSegLinetoVerticalRel:!1,SVGPathSegList:!1,SVGPathSegMovetoAbs:!1,SVGPathSegMovetoRel:!1,SVGPatternElement:!1,SVGPoint:!1,SVGPointList:!1,SVGPolygonElement:!1,SVGPolylineElement:!1,SVGPreserveAspectRatio:!1,SVGRadialGradientElement:!1,SVGRect:!1,SVGRectElement:!1,SVGRenderingIntent:!1,SVGSVGElement:!1,SVGScriptElement:!1,SVGSetElement:!1,SVGStopElement:!1,SVGStringList:!1,SVGStylable:!1,SVGStyleElement:!1,SVGSwitchElement:!1,SVGSymbolElement:!1,SVGTRefElement:!1,SVGTSpanElement:!1,SVGTests:!1,SVGTextContentElement:!1,SVGTextElement:!1,SVGTextPathElement:!1,SVGTextPositioningElement:!1,SVGTitleElement:!1,SVGTransform:!1,SVGTransformList:!1,SVGTransformable:!1,SVGURIReference:!1,SVGUnitTypes:!1,SVGUseElement:!1,SVGVKernElement:!1,SVGViewElement:!1,SVGViewSpec:!1,SVGZoomAndPan:!1,Text:!1,TextDecoder:!1,TextEncoder:!1,TimeEvent:!1,top:!1,URL:!1,WebGLActiveInfo:!1,WebGLBuffer:!1,WebGLContextEvent:!1,WebGLFramebuffer:!1,WebGLProgram:!1,WebGLRenderbuffer:!1,WebGLRenderingContext:!1,WebGLShader:!1,WebGLShaderPrecisionFormat:!1,WebGLTexture:!1,WebGLUniformLocation:!1,WebSocket:!1,window:!1,Window:!1,Worker:!1,XDomainRequest:!1,XMLHttpRequest:!1,XMLSerializer:!1,XPathEvaluator:!1,XPathException:!1,XPathExpression:!1,XPathNamespace:!1,XPathNSResolver:!1,XPathResult:!1},n.devel={alert:!1,confirm:!1,console:!1,Debug:!1,opera:!1,prompt:!1},n.worker={importScripts:!0,postMessage:!0,self:!0,FileReaderSync:!0},n.nonstandard={escape:!1,unescape:!1},n.couch={require:!1,respond:!1,getRow:!1,emit:!1,send:!1,start:!1,sum:!1,log:!1,exports:!1,module:!1,provides:!1},n.node={__filename:!1,__dirname:!1,GLOBAL:!1,global:!1,module:!1,require:!1,Buffer:!0,console:!0,exports:!0,process:!0,setTimeout:!0,clearTimeout:!0,setInterval:!0,clearInterval:!0,setImmediate:!0,clearImmediate:!0},n.browserify={__filename:!1,__dirname:!1,global:!1,module:!1,require:!1,Buffer:!0,exports:!0,process:!0},n.phantom={phantom:!0,require:!0,WebPage:!0,console:!0,exports:!0},n.qunit={asyncTest:!1,deepEqual:!1,equal:!1,expect:!1,module:!1,notDeepEqual:!1,notEqual:!1,notPropEqual:!1,notStrictEqual:!1,ok:!1,propEqual:!1,QUnit:!1,raises:!1,start:!1,stop:!1,strictEqual:!1,test:!1,"throws":!1},n.rhino={defineClass:!1,deserialize:!1,gc:!1,help:!1,importClass:!1,importPackage:!1,java:!1,load:!1,loadClass:!1,Packages:!1,print:!1,quit:!1,readFile:!1,readUrl:!1,runCommand:!1,seal:!1,serialize:!1,spawn:!1,sync:!1,toint32:!1,version:!1},n.shelljs={target:!1,echo:!1,exit:!1,cd:!1,pwd:!1,ls:!1,find:!1,cp:!1,rm:!1,mv:!1,mkdir:!1,test:!1,cat:!1,sed:!1,grep:!1,which:!1,dirs:!1,pushd:!1,popd:!1,env:!1,exec:!1,chmod:!1,config:!1,error:!1,tempdir:!1},n.typed={ArrayBuffer:!1,ArrayBufferView:!1,DataView:!1,Float32Array:!1,Float64Array:!1,Int16Array:!1,Int32Array:!1,Int8Array:!1,Uint16Array:!1,Uint32Array:!1,Uint8Array:!1,Uint8ClampedArray:!1},n.wsh={ActiveXObject:!0,Enumerator:!0,GetObject:!0,ScriptEngine:!0,ScriptEngineBuildVersion:!0,ScriptEngineMajorVersion:!0,ScriptEngineMinorVersion:!0,VBArray:!0,WSH:!0,WScript:!0,XDomainRequest:!0},n.dojo={dojo:!1,dijit:!1,dojox:!1,define:!1,require:!1},n.jquery={$:!1,jQuery:!1},n.mootools={$:!1,$$:!1,Asset:!1,Browser:!1,Chain:!1,Class:!1,Color:!1,Cookie:!1,Core:!1,Document:!1,DomReady:!1,DOMEvent:!1,DOMReady:!1,Drag:!1,Element:!1,Elements:!1,Event:!1,Events:!1,Fx:!1,Group:!1,Hash:!1,HtmlTable:!1,IFrame:!1,IframeShim:!1,InputValidator:!1,instanceOf:!1,Keyboard:!1,Locale:!1,Mask:!1,MooTools:!1,Native:!1,Options:!1,OverText:!1,Request:!1,Scroller:!1,Slick:!1,Slider:!1,Sortables:!1,Spinner:!1,Swiff:!1,Tips:!1,Type:!1,typeOf:!1,URI:!1,Window:!1},n.prototypejs={$:!1,$$:!1,$A:!1,$F:!1,$H:!1,$R:!1,$break:!1,$continue:!1,$w:!1,Abstract:!1,Ajax:!1,Class:!1,Enumerable:!1,Element:!1,Event:!1,Field:!1,Form:!1,Hash:!1,Insertion:!1,ObjectRange:!1,PeriodicalExecuter:!1,Position:!1,Prototype:!1,Selector:!1,Template:!1,Toggle:!1,Try:!1,Autocompleter:!1,Builder:!1,Control:!1,Draggable:!1,Draggables:!1,Droppables:!1,Effect:!1,Sortable:!1,SortableObserver:!1,Sound:!1,Scriptaculous:!1},n.yui={YUI:!1,Y:!1,YUI_config:!1},n.mocha={mocha:!1,describe:!1,xdescribe:!1,it:!1,xit:!1,context:!1,xcontext:!1,before:!1,after:!1,beforeEach:!1,afterEach:!1,suite:!1,test:!1,setup:!1,teardown:!1,suiteSetup:!1,suiteTeardown:!1},n.jasmine={jasmine:!1,describe:!1,xdescribe:!1,it:!1,xit:!1,beforeEach:!1,afterEach:!1,setFixtures:!1,loadFixtures:!1,spyOn:!1,expect:!1,runs:!1,waitsFor:!1,waits:!1,beforeAll:!1,afterAll:!1,fail:!1,fdescribe:!1,fit:!1,pending:!1}},{}]},{},["/node_modules/jshint/src/jshint.js"])}),ace.define("ace/mode/javascript_worker",["require","exports","module","ace/lib/oop","ace/worker/mirror","ace/mode/javascript/jshint"],function(require,exports,module){"use strict";function startRegex(e){return RegExp("^("+e.join("|")+")")}var oop=require("../lib/oop"),Mirror=require("../worker/mirror").Mirror,lint=require("./javascript/jshint").JSHINT,disabledWarningsRe=startRegex(["Bad for in variable '(.+)'.",'Missing "use strict"']),errorsRe=startRegex(["Unexpected","Expected ","Confusing (plus|minus)","\\{a\\} unterminated regular expression","Unclosed ","Unmatched ","Unbegun comment","Bad invocation","Missing space after","Missing operator at"]),infoRe=startRegex(["Expected an assignment","Bad escapement of EOL","Unexpected comma","Unexpected space","Missing radix parameter.","A leading decimal point can","\\['{a}'\\] is better written in dot notation.","'{a}' used out of scope"]),JavaScriptWorker=exports.JavaScriptWorker=function(e){Mirror.call(this,e),this.setTimeout(500),this.setOptions()};oop.inherits(JavaScriptWorker,Mirror),function(){this.setOptions=function(e){this.options=e||{esnext:!0,moz:!0,devel:!0,browser:!0,node:!0,laxcomma:!0,laxbreak:!0,lastsemic:!0,onevar:!1,passfail:!1,maxerr:100,expr:!0,multistr:!0,globalstrict:!0},this.doc.getValue()&&this.deferredUpdate.schedule(100)},this.changeOptions=function(e){oop.mixin(this.options,e),this.doc.getValue()&&this.deferredUpdate.schedule(100)},this.isValidJS=function(str){try{eval("throw 0;"+str)}catch(e){if(e===0)return!0}return!1},this.onUpdate=function(){var e=this.doc.getValue();e=e.replace(/^#!.*\n/,"\n");if(!e)return this.sender.emit("annotate",[]);var t=[],n=this.isValidJS(e)?"warning":"error";lint(e,this.options,this.options.globals);var r=lint.errors,i=!1;for(var s=0;s0||-1)*Math.floor(Math.abs(e))),e}function B(e){var t=typeof e;return e===null||t==="undefined"||t==="boolean"||t==="number"||t==="string"}function j(e){var t,n,r;if(B(e))return e;n=e.valueOf;if(typeof n=="function"){t=n.call(e);if(B(t))return t}r=e.toString;if(typeof r=="function"){t=r.call(e);if(B(t))return t}throw new TypeError}Function.prototype.bind||(Function.prototype.bind=function(t){var n=this;if(typeof n!="function")throw new TypeError("Function.prototype.bind called on incompatible "+n);var i=u.call(arguments,1),s=function(){if(this instanceof s){var e=n.apply(this,i.concat(u.call(arguments)));return Object(e)===e?e:this}return n.apply(t,i.concat(u.call(arguments)))};return n.prototype&&(r.prototype=n.prototype,s.prototype=new r,r.prototype=null),s});var i=Function.prototype.call,s=Array.prototype,o=Object.prototype,u=s.slice,a=i.bind(o.toString),f=i.bind(o.hasOwnProperty),l,c,h,p,d;if(d=f(o,"__defineGetter__"))l=i.bind(o.__defineGetter__),c=i.bind(o.__defineSetter__),h=i.bind(o.__lookupGetter__),p=i.bind(o.__lookupSetter__);if([1,2].splice(0).length!=2)if(!function(){function e(e){var t=new Array(e+2);return t[0]=t[1]=0,t}var t=[],n;t.splice.apply(t,e(20)),t.splice.apply(t,e(26)),n=t.length,t.splice(5,0,"XXX"),n+1==t.length;if(n+1==t.length)return!0}())Array.prototype.splice=function(e,t){var n=this.length;e>0?e>n&&(e=n):e==void 0?e=0:e<0&&(e=Math.max(n+e,0)),e+ta)for(h=l;h--;)this[f+h]=this[a+h];if(s&&e===c)this.length=c,this.push.apply(this,i);else{this.length=c+s;for(h=0;h>>0;if(a(t)!="[object Function]")throw new TypeError;while(++s>>0,s=Array(i),o=arguments[1];if(a(t)!="[object Function]")throw new TypeError(t+" is not a function");for(var u=0;u>>0,s=[],o,u=arguments[1];if(a(t)!="[object Function]")throw new TypeError(t+" is not a function");for(var f=0;f>>0,s=arguments[1];if(a(t)!="[object Function]")throw new TypeError(t+" is not a function");for(var o=0;o>>0,s=arguments[1];if(a(t)!="[object Function]")throw new TypeError(t+" is not a function");for(var o=0;o>>0;if(a(t)!="[object Function]")throw new TypeError(t+" is not a function");if(!i&&arguments.length==1)throw new TypeError("reduce of empty array with no initial value");var s=0,o;if(arguments.length>=2)o=arguments[1];else do{if(s in r){o=r[s++];break}if(++s>=i)throw new TypeError("reduce of empty array with no initial value")}while(!0);for(;s>>0;if(a(t)!="[object Function]")throw new TypeError(t+" is not a function");if(!i&&arguments.length==1)throw new TypeError("reduceRight of empty array with no initial value");var s,o=i-1;if(arguments.length>=2)s=arguments[1];else do{if(o in r){s=r[o--];break}if(--o<0)throw new TypeError("reduceRight of empty array with no initial value")}while(!0);do o in this&&(s=t.call(void 0,s,r[o],o,n));while(o--);return s});if(!Array.prototype.indexOf||[0,1].indexOf(1,2)!=-1)Array.prototype.indexOf=function(t){var n=g&&a(this)=="[object String]"?this.split(""):F(this),r=n.length>>>0;if(!r)return-1;var i=0;arguments.length>1&&(i=H(arguments[1])),i=i>=0?i:Math.max(0,r+i);for(;i>>0;if(!r)return-1;var i=r-1;arguments.length>1&&(i=Math.min(i,H(arguments[1]))),i=i>=0?i:r-Math.abs(i);for(;i>=0;i--)if(i in n&&t===n[i])return i;return-1};Object.getPrototypeOf||(Object.getPrototypeOf=function(t){return t.__proto__||(t.constructor?t.constructor.prototype:o)});if(!Object.getOwnPropertyDescriptor){var y="Object.getOwnPropertyDescriptor called on a non-object: ";Object.getOwnPropertyDescriptor=function(t,n){if(typeof t!="object"&&typeof t!="function"||t===null)throw new TypeError(y+t);if(!f(t,n))return;var r,i,s;r={enumerable:!0,configurable:!0};if(d){var u=t.__proto__;t.__proto__=o;var i=h(t,n),s=p(t,n);t.__proto__=u;if(i||s)return i&&(r.get=i),s&&(r.set=s),r}return r.value=t[n],r}}Object.getOwnPropertyNames||(Object.getOwnPropertyNames=function(t){return Object.keys(t)});if(!Object.create){var b;Object.prototype.__proto__===null?b=function(){return{__proto__:null}}:b=function(){var e={};for(var t in e)e[t]=null;return e.constructor=e.hasOwnProperty=e.propertyIsEnumerable=e.isPrototypeOf=e.toLocaleString=e.toString=e.valueOf=e.__proto__=null,e},Object.create=function(t,n){var r;if(t===null)r=b();else{if(typeof t!="object")throw new TypeError("typeof prototype["+typeof t+"] != 'object'");var i=function(){};i.prototype=t,r=new i,r.__proto__=t}return n!==void 0&&Object.defineProperties(r,n),r}}if(Object.defineProperty){var E=w({}),S=typeof document=="undefined"||w(document.createElement("div"));if(!E||!S)var x=Object.defineProperty}if(!Object.defineProperty||x){var T="Property description must be an object: ",N="Object.defineProperty called on non-object: ",C="getters & setters can not be defined on this javascript engine";Object.defineProperty=function(t,n,r){if(typeof t!="object"&&typeof t!="function"||t===null)throw new TypeError(N+t);if(typeof r!="object"&&typeof r!="function"||r===null)throw new TypeError(T+r);if(x)try{return x.call(Object,t,n,r)}catch(i){}if(f(r,"value"))if(d&&(h(t,n)||p(t,n))){var s=t.__proto__;t.__proto__=o,delete t[n],t[n]=r.value,t.__proto__=s}else t[n]=r.value;else{if(!d)throw new TypeError(C);f(r,"get")&&l(t,n,r.get),f(r,"set")&&c(t,n,r.set)}return t}}Object.defineProperties||(Object.defineProperties=function(t,n){for(var r in n)f(n,r)&&Object.defineProperty(t,r,n[r]);return t}),Object.seal||(Object.seal=function(t){return t}),Object.freeze||(Object.freeze=function(t){return t});try{Object.freeze(function(){})}catch(k){Object.freeze=function(t){return function(n){return typeof n=="function"?n:t(n)}}(Object.freeze)}Object.preventExtensions||(Object.preventExtensions=function(t){return t}),Object.isSealed||(Object.isSealed=function(t){return!1}),Object.isFrozen||(Object.isFrozen=function(t){return!1}),Object.isExtensible||(Object.isExtensible=function(t){if(Object(t)===t)throw new TypeError;var n="";while(f(t,n))n+="?";t[n]=!0;var r=f(t,n);return delete t[n],r});if(!Object.keys){var L=!0,A=["toString","toLocaleString","valueOf","hasOwnProperty","isPrototypeOf","propertyIsEnumerable","constructor"],O=A.length;for(var M in{toString:null})L=!1;Object.keys=function I(e){if(typeof e!="object"&&typeof e!="function"||e===null)throw new TypeError("Object.keys called on a non-object");var I=[];for(var t in e)f(e,t)&&I.push(t);if(L)for(var n=0,r=O;n=0&&(g=b(f,c))}function e(){g&&(b.cancel(g),g=null)}function f(){h?(a.next(),d()):a.pause()}var g,h,i=this,j=i.slides=[],k=-1;i.currentSlide=null;var l=!1;i.select=function(e,f){function g(){if(!l){if(i.currentSlide&&angular.isString(f)&&!a.noTransition&&e.$element){e.$element.addClass(f);{e.$element[0].offsetWidth}angular.forEach(j,function(a){angular.extend(a,{direction:"",entering:!1,leaving:!1,active:!1})}),angular.extend(e,{direction:f,active:!0,entering:!0}),angular.extend(i.currentSlide||{},{direction:f,leaving:!0}),a.$currentTransition=c(e.$element,{}),function(b,c){a.$currentTransition.then(function(){h(b,c)},function(){h(b,c)})}(e,i.currentSlide)}else h(e,i.currentSlide);i.currentSlide=e,k=m,d()}}function h(b,c){angular.extend(b,{direction:"",active:!0,leaving:!1,entering:!1}),angular.extend(c||{},{direction:"",active:!1,leaving:!1,entering:!1}),a.$currentTransition=null}var m=j.indexOf(e);void 0===f&&(f=m>k?"next":"prev"),e&&e!==i.currentSlide&&(a.$currentTransition?(a.$currentTransition.cancel(),b(g)):g())},a.$on("$destroy",function(){l=!0}),i.indexOfSlide=function(a){return j.indexOf(a)},a.next=function(){var b=(k+1)%j.length;return a.$currentTransition?void 0:i.select(j[b],"next")},a.prev=function(){var b=0>k-1?j.length-1:k-1;return a.$currentTransition?void 0:i.select(j[b],"prev")},a.select=function(a){i.select(a)},a.isActive=function(a){return i.currentSlide===a},a.slides=function(){return j},a.$watch("interval",d),a.$on("$destroy",e),a.play=function(){h||(h=!0,d())},a.pause=function(){a.noPause||(h=!1,e())},i.addSlide=function(b,c){b.$element=c,j.push(b),1===j.length||b.active?(i.select(j[j.length-1]),1==j.length&&a.play()):b.active=!1},i.removeSlide=function(a){var b=j.indexOf(a);j.splice(b,1),j.length>0&&a.active?b>=j.length?i.select(j[b-1]):i.select(j[b]):k>b&&k--}}]).directive("carousel",[function(){return{restrict:"EA",transclude:!0,replace:!0,controller:"CarouselController",require:"carousel",templateUrl:"template/carousel/carousel.html",scope:{interval:"=",noTransition:"=",noPause:"="}}}]).directive("slide",["$parse",function(a){return{require:"^carousel",restrict:"EA",transclude:!0,replace:!0,templateUrl:"template/carousel/slide.html",scope:{},link:function(b,c,d,e){if(d.active){var f=a(d.active),g=f.assign,h=b.active=f(b.$parent);b.$watch(function(){var a=f(b.$parent);return a!==b.active&&(a!==h?h=b.active=a:g(b.$parent,a=h=b.active)),a})}e.addSlide(b,c),b.$on("$destroy",function(){e.removeSlide(b)}),b.$watch("active",function(a){a&&e.select(b)})}}}]),angular.module("ui.bootstrap.position",[]).factory("$position",["$document","$window",function(a,b){function c(a,c){return a.currentStyle?a.currentStyle[c]:b.getComputedStyle?b.getComputedStyle(a)[c]:a.style[c]}function d(a){return"static"===(c(a,"position")||"static")}var e=function(b){for(var c=a[0],e=b.offsetParent||c;e&&e!==c&&d(e);)e=e.offsetParent;return e||c};return{position:function(b){var c=this.offset(b),d={top:0,left:0},f=e(b[0]);f!=a[0]&&(d=this.offset(angular.element(f)),d.top+=f.clientTop-f.scrollTop,d.left+=f.clientLeft-f.scrollLeft);var g=b[0].getBoundingClientRect();return{width:g.width||b.prop("offsetWidth"),height:g.height||b.prop("offsetHeight"),top:c.top-d.top,left:c.left-d.left}},offset:function(c){var d=c[0].getBoundingClientRect();return{width:d.width||c.prop("offsetWidth"),height:d.height||c.prop("offsetHeight"),top:d.top+(b.pageYOffset||a[0].body.scrollTop||a[0].documentElement.scrollTop),left:d.left+(b.pageXOffset||a[0].body.scrollLeft||a[0].documentElement.scrollLeft)}}}}]),angular.module("ui.bootstrap.datepicker",["ui.bootstrap.position"]).constant("datepickerConfig",{dayFormat:"dd",monthFormat:"MMMM",yearFormat:"yyyy",dayHeaderFormat:"EEE",dayTitleFormat:"MMMM yyyy",monthTitleFormat:"yyyy",showWeeks:!0,startingDay:0,yearRange:20,minDate:null,maxDate:null}).controller("DatepickerController",["$scope","$attrs","dateFilter","datepickerConfig",function(a,b,c,d){function e(b,c){return angular.isDefined(b)?a.$parent.$eval(b):c}function f(a,b){return new Date(a,b,0).getDate()}function g(a,b){for(var c=new Array(b),d=a,e=0;b>e;)c[e++]=new Date(d),d.setDate(d.getDate()+1);return c}function h(a,b,d,e){return{date:a,label:c(a,b),selected:!!d,secondary:!!e}}var i={day:e(b.dayFormat,d.dayFormat),month:e(b.monthFormat,d.monthFormat),year:e(b.yearFormat,d.yearFormat),dayHeader:e(b.dayHeaderFormat,d.dayHeaderFormat),dayTitle:e(b.dayTitleFormat,d.dayTitleFormat),monthTitle:e(b.monthTitleFormat,d.monthTitleFormat)},j=e(b.startingDay,d.startingDay),k=e(b.yearRange,d.yearRange);this.minDate=d.minDate?new Date(d.minDate):null,this.maxDate=d.maxDate?new Date(d.maxDate):null,this.modes=[{name:"day",getVisibleDates:function(a,b){var d=a.getFullYear(),e=a.getMonth(),k=new Date(d,e,1),l=j-k.getDay(),m=l>0?7-l:-l,n=new Date(k),o=0;m>0&&(n.setDate(-m+1),o+=m),o+=f(d,e+1),o+=(7-o%7)%7;for(var p=g(n,o),q=new Array(7),r=0;o>r;r++){var s=new Date(p[r]);p[r]=h(s,i.day,b&&b.getDate()===s.getDate()&&b.getMonth()===s.getMonth()&&b.getFullYear()===s.getFullYear(),s.getMonth()!==e)}for(var t=0;7>t;t++)q[t]=c(p[t].date,i.dayHeader);return{objects:p,title:c(a,i.dayTitle),labels:q}},compare:function(a,b){return new Date(a.getFullYear(),a.getMonth(),a.getDate())-new Date(b.getFullYear(),b.getMonth(),b.getDate())},split:7,step:{months:1}},{name:"month",getVisibleDates:function(a,b){for(var d=new Array(12),e=a.getFullYear(),f=0;12>f;f++){var g=new Date(e,f,1);d[f]=h(g,i.month,b&&b.getMonth()===f&&b.getFullYear()===e)}return{objects:d,title:c(a,i.monthTitle)}},compare:function(a,b){return new Date(a.getFullYear(),a.getMonth())-new Date(b.getFullYear(),b.getMonth())},split:3,step:{years:1}},{name:"year",getVisibleDates:function(a,b){for(var c=new Array(k),d=a.getFullYear(),e=parseInt((d-1)/k,10)*k+1,f=0;k>f;f++){var g=new Date(e+f,0,1);c[f]=h(g,i.year,b&&b.getFullYear()===g.getFullYear())}return{objects:c,title:[c[0].label,c[k-1].label].join(" - ")}},compare:function(a,b){return a.getFullYear()-b.getFullYear()},split:5,step:{years:k}}],this.isDisabled=function(b,c){var d=this.modes[c||0];return this.minDate&&d.compare(b,this.minDate)<0||this.maxDate&&d.compare(b,this.maxDate)>0||a.dateDisabled&&a.dateDisabled({date:b,mode:d.name})}}]).directive("datepicker",["dateFilter","$parse","datepickerConfig","$log",function(a,b,c,d){return{restrict:"EA",replace:!0,templateUrl:"template/datepicker/datepicker.html",scope:{dateDisabled:"&"},require:["datepicker","?^ngModel"],controller:"DatepickerController",link:function(a,e,f,g){function h(){a.showWeekNumbers=0===o&&q}function i(a,b){for(var c=[];a.length>0;)c.push(a.splice(0,b));return c}function j(b){var c=null,e=!0;n.$modelValue&&(c=new Date(n.$modelValue),isNaN(c)?(e=!1,d.error('Datepicker directive: "ng-model" value must be a Date object, a number of milliseconds since 01.01.1970 or a string representing an RFC2822 or ISO 8601 date.')):b&&(p=c)),n.$setValidity("date",e);var f=m.modes[o],g=f.getVisibleDates(p,c);angular.forEach(g.objects,function(a){a.disabled=m.isDisabled(a.date,o)}),n.$setValidity("date-disabled",!c||!m.isDisabled(c)),a.rows=i(g.objects,f.split),a.labels=g.labels||[],a.title=g.title}function k(a){o=a,h(),j()}function l(a){var b=new Date(a);b.setDate(b.getDate()+4-(b.getDay()||7));var c=b.getTime();return b.setMonth(0),b.setDate(1),Math.floor(Math.round((c-b)/864e5)/7)+1}var m=g[0],n=g[1];if(n){var o=0,p=new Date,q=c.showWeeks;f.showWeeks?a.$parent.$watch(b(f.showWeeks),function(a){q=!!a,h()}):h(),f.min&&a.$parent.$watch(b(f.min),function(a){m.minDate=a?new Date(a):null,j()}),f.max&&a.$parent.$watch(b(f.max),function(a){m.maxDate=a?new Date(a):null,j()}),n.$render=function(){j(!0)},a.select=function(a){if(0===o){var b=n.$modelValue?new Date(n.$modelValue):new Date(0,0,0,0,0,0,0);b.setFullYear(a.getFullYear(),a.getMonth(),a.getDate()),n.$setViewValue(b),j(!0)}else p=a,k(o-1)},a.move=function(a){var b=m.modes[o].step;p.setMonth(p.getMonth()+a*(b.months||0)),p.setFullYear(p.getFullYear()+a*(b.years||0)),j()},a.toggleMode=function(){k((o+1)%m.modes.length)},a.getWeekNumber=function(b){return 0===o&&a.showWeekNumbers&&7===b.length?l(b[0].date):null}}}}}]).constant("datepickerPopupConfig",{dateFormat:"yyyy-MM-dd",currentText:"Today",toggleWeeksText:"Weeks",clearText:"Clear",closeText:"Done",closeOnDateSelection:!0,appendToBody:!1,showButtonBar:!0}).directive("datepickerPopup",["$compile","$parse","$document","$position","dateFilter","datepickerPopupConfig","datepickerConfig",function(a,b,c,d,e,f,g){return{restrict:"EA",require:"ngModel",link:function(h,i,j,k){function l(a){u?u(h,!!a):q.isOpen=!!a}function m(a){if(a){if(angular.isDate(a))return k.$setValidity("date",!0),a;if(angular.isString(a)){var b=new Date(a);return isNaN(b)?(k.$setValidity("date",!1),void 0):(k.$setValidity("date",!0),b)}return k.$setValidity("date",!1),void 0}return k.$setValidity("date",!0),null}function n(a,c,d){a&&(h.$watch(b(a),function(a){q[c]=a}),y.attr(d||c,c))}function o(){q.position=s?d.offset(i):d.position(i),q.position.top=q.position.top+i.prop("offsetHeight")}var p,q=h.$new(),r=angular.isDefined(j.closeOnDateSelection)?h.$eval(j.closeOnDateSelection):f.closeOnDateSelection,s=angular.isDefined(j.datepickerAppendToBody)?h.$eval(j.datepickerAppendToBody):f.appendToBody;j.$observe("datepickerPopup",function(a){p=a||f.dateFormat,k.$render()}),q.showButtonBar=angular.isDefined(j.showButtonBar)?h.$eval(j.showButtonBar):f.showButtonBar,h.$on("$destroy",function(){C.remove(),q.$destroy()}),j.$observe("currentText",function(a){q.currentText=angular.isDefined(a)?a:f.currentText}),j.$observe("toggleWeeksText",function(a){q.toggleWeeksText=angular.isDefined(a)?a:f.toggleWeeksText}),j.$observe("clearText",function(a){q.clearText=angular.isDefined(a)?a:f.clearText}),j.$observe("closeText",function(a){q.closeText=angular.isDefined(a)?a:f.closeText});var t,u;j.isOpen&&(t=b(j.isOpen),u=t.assign,h.$watch(t,function(a){q.isOpen=!!a})),q.isOpen=t?t(h):!1;var v=function(a){q.isOpen&&a.target!==i[0]&&q.$apply(function(){l(!1)})},w=function(){q.$apply(function(){l(!0)})},x=angular.element("
");x.attr({"ng-model":"date","ng-change":"dateSelection()"});var y=angular.element(x.children()[0]),z={};j.datepickerOptions&&(z=h.$eval(j.datepickerOptions),y.attr(angular.extend({},z))),k.$parsers.unshift(m),q.dateSelection=function(a){angular.isDefined(a)&&(q.date=a),k.$setViewValue(q.date),k.$render(),r&&l(!1)},i.bind("input change keyup",function(){q.$apply(function(){q.date=k.$modelValue})}),k.$render=function(){var a=k.$viewValue?e(k.$viewValue,p):"";i.val(a),q.date=k.$modelValue},n(j.min,"min"),n(j.max,"max"),j.showWeeks?n(j.showWeeks,"showWeeks","show-weeks"):(q.showWeeks="show-weeks"in z?z["show-weeks"]:g.showWeeks,y.attr("show-weeks","showWeeks")),j.dateDisabled&&y.attr("date-disabled",j.dateDisabled);var A=!1,B=!1;q.$watch("isOpen",function(a){a?(o(),c.bind("click",v),B&&i.unbind("focus",w),i[0].focus(),A=!0):(A&&c.unbind("click",v),i.bind("focus",w),B=!0),u&&u(h,a)}),q.today=function(){q.dateSelection(new Date)},q.clear=function(){q.dateSelection(null)};var C=a(x)(q);s?c.find("body").append(C):i.after(C)}}}]).directive("datepickerPopupWrap",function(){return{restrict:"EA",replace:!0,transclude:!0,templateUrl:"template/datepicker/popup.html",link:function(a,b){b.bind("click",function(a){a.preventDefault(),a.stopPropagation()})}}}),angular.module("ui.bootstrap.dropdownToggle",[]).directive("dropdownToggle",["$document","$location",function(a){var b=null,c=angular.noop;return{restrict:"CA",link:function(d,e){d.$watch("$location.path",function(){c()}),e.parent().bind("click",function(){c()}),e.bind("click",function(d){var f=e===b;d.preventDefault(),d.stopPropagation(),b&&c(),f||e.hasClass("disabled")||e.prop("disabled")||(e.parent().addClass("open"),b=e,c=function(d){d&&(d.preventDefault(),d.stopPropagation()),a.unbind("click",c),e.parent().removeClass("open"),c=angular.noop,b=null},a.bind("click",c))})}}}]),angular.module("ui.bootstrap.modal",["ui.bootstrap.transition"]).factory("$$stackedMap",function(){return{createNew:function(){var a=[];return{add:function(b,c){a.push({key:b,value:c})},get:function(b){for(var c=0;c0)}function i(){if(k&&-1==g()){var a=l;j(k,l,150,function(){a.$destroy(),a=null}),k=void 0,l=void 0}}function j(c,d,e,f){function g(){g.done||(g.done=!0,c.remove(),f&&f())}d.animate=!1;var h=a.transitionEndEventName;if(h){var i=b(g,e);c.bind(h,function(){b.cancel(i),g(),d.$apply()})}else b(g,0)}var k,l,m="modal-open",n=f.createNew(),o={};return e.$watch(g,function(a){l&&(l.index=a)}),c.bind("keydown",function(a){var b;27===a.which&&(b=n.top(),b&&b.value.keyboard&&e.$apply(function(){o.dismiss(b.key)}))}),o.open=function(a,b){n.add(a,{deferred:b.deferred,modalScope:b.scope,backdrop:b.backdrop,keyboard:b.keyboard});var f=c.find("body").eq(0),h=g();h>=0&&!k&&(l=e.$new(!0),l.index=h,k=d("
")(l),f.append(k));var i=angular.element("
");i.attr("window-class",b.windowClass),i.attr("index",n.length()-1),i.attr("animate","animate"),i.html(b.content);var j=d(i)(b.scope);n.top().value.modalDomEl=j,f.append(j),f.addClass(m)},o.close=function(a,b){var c=n.get(a).value;c&&(c.deferred.resolve(b),h(a))},o.dismiss=function(a,b){var c=n.get(a).value;c&&(c.deferred.reject(b),h(a))},o.dismissAll=function(a){for(var b=this.getTop();b;)this.dismiss(b.key,a),b=this.getTop()},o.getTop=function(){return n.top()},o}]).provider("$modal",function(){var a={options:{backdrop:!0,keyboard:!0},$get:["$injector","$rootScope","$q","$http","$templateCache","$controller","$modalStack",function(b,c,d,e,f,g,h){function i(a){return a.template?d.when(a.template):e.get(a.templateUrl,{cache:f}).then(function(a){return a.data})}function j(a){var c=[];return angular.forEach(a,function(a){(angular.isFunction(a)||angular.isArray(a))&&c.push(d.when(b.invoke(a)))}),c}var k={};return k.open=function(b){var e=d.defer(),f=d.defer(),k={result:e.promise,opened:f.promise,close:function(a){h.close(k,a)},dismiss:function(a){h.dismiss(k,a)}};if(b=angular.extend({},a.options,b),b.resolve=b.resolve||{},!b.template&&!b.templateUrl)throw new Error("One of template or templateUrl options is required.");var l=d.all([i(b)].concat(j(b.resolve)));return l.then(function(a){var d=(b.scope||c).$new();d.$close=k.close,d.$dismiss=k.dismiss;var f,i={},j=1;b.controller&&(i.$scope=d,i.$modalInstance=k,angular.forEach(b.resolve,function(b,c){i[c]=a[j++]}),f=g(b.controller,i)),h.open(k,{scope:d,deferred:e,content:a[0],backdrop:b.backdrop,keyboard:b.keyboard,windowClass:b.windowClass})},function(a){e.reject(a)}),l.then(function(){f.resolve(!0)},function(){f.reject(!1)}),k},k}]};return a}),angular.module("ui.bootstrap.pagination",[]).controller("PaginationController",["$scope","$attrs","$parse","$interpolate",function(a,b,c,d){var e=this,f=b.numPages?c(b.numPages).assign:angular.noop;this.init=function(d){b.itemsPerPage?a.$parent.$watch(c(b.itemsPerPage),function(b){e.itemsPerPage=parseInt(b,10),a.totalPages=e.calculateTotalPages()}):this.itemsPerPage=d},this.noPrevious=function(){return 1===this.page},this.noNext=function(){return this.page===a.totalPages},this.isActive=function(a){return this.page===a},this.calculateTotalPages=function(){var b=this.itemsPerPage<1?1:Math.ceil(a.totalItems/this.itemsPerPage);return Math.max(b||0,1)},this.getAttributeValue=function(b,c,e){return angular.isDefined(b)?e?d(b)(a.$parent):a.$parent.$eval(b):c},this.render=function(){this.page=parseInt(a.page,10)||1,this.page>0&&this.page<=a.totalPages&&(a.pages=this.getPages(this.page,a.totalPages))},a.selectPage=function(b){!e.isActive(b)&&b>0&&b<=a.totalPages&&(a.page=b,a.onSelectPage({page:b}))},a.$watch("page",function(){e.render()}),a.$watch("totalItems",function(){a.totalPages=e.calculateTotalPages()}),a.$watch("totalPages",function(b){f(a.$parent,b),e.page>b?a.selectPage(b):e.render()})}]).constant("paginationConfig",{itemsPerPage:10,boundaryLinks:!1,directionLinks:!0,firstText:"First",previousText:"Previous",nextText:"Next",lastText:"Last",rotate:!0}).directive("pagination",["$parse","paginationConfig",function(a,b){return{restrict:"EA",scope:{page:"=",totalItems:"=",onSelectPage:" &"},controller:"PaginationController",templateUrl:"template/pagination/pagination.html",replace:!0,link:function(c,d,e,f){function g(a,b,c,d){return{number:a,text:b,active:c,disabled:d}}var h,i=f.getAttributeValue(e.boundaryLinks,b.boundaryLinks),j=f.getAttributeValue(e.directionLinks,b.directionLinks),k=f.getAttributeValue(e.firstText,b.firstText,!0),l=f.getAttributeValue(e.previousText,b.previousText,!0),m=f.getAttributeValue(e.nextText,b.nextText,!0),n=f.getAttributeValue(e.lastText,b.lastText,!0),o=f.getAttributeValue(e.rotate,b.rotate);f.init(b.itemsPerPage),e.maxSize&&c.$parent.$watch(a(e.maxSize),function(a){h=parseInt(a,10),f.render()}),f.getPages=function(a,b){var c=[],d=1,e=b,p=angular.isDefined(h)&&b>h;p&&(o?(d=Math.max(a-Math.floor(h/2),1),e=d+h-1,e>b&&(e=b,d=e-h+1)):(d=(Math.ceil(a/h)-1)*h+1,e=Math.min(d+h-1,b)));for(var q=d;e>=q;q++){var r=g(q,q,f.isActive(q),!1);c.push(r)}if(p&&!o){if(d>1){var s=g(d-1,"...",!1,!1);c.unshift(s)}if(b>e){var t=g(e+1,"...",!1,!1);c.push(t)}}if(j){var u=g(a-1,l,!1,f.noPrevious());c.unshift(u);var v=g(a+1,m,!1,f.noNext());c.push(v)}if(i){var w=g(1,k,!1,f.noPrevious());c.unshift(w);var x=g(b,n,!1,f.noNext());c.push(x)}return c}}}}]).constant("pagerConfig",{itemsPerPage:10,previousText:"« Previous",nextText:"Next »",align:!0}).directive("pager",["pagerConfig",function(a){return{restrict:"EA",scope:{page:"=",totalItems:"=",onSelectPage:" &"},controller:"PaginationController",templateUrl:"template/pagination/pager.html",replace:!0,link:function(b,c,d,e){function f(a,b,c,d,e){return{number:a,text:b,disabled:c,previous:i&&d,next:i&&e}}var g=e.getAttributeValue(d.previousText,a.previousText,!0),h=e.getAttributeValue(d.nextText,a.nextText,!0),i=e.getAttributeValue(d.align,a.align);e.init(a.itemsPerPage),e.getPages=function(a){return[f(a-1,g,e.noPrevious(),!0,!1),f(a+1,h,e.noNext(),!1,!0)]}}}}]),angular.module("ui.bootstrap.tooltip",["ui.bootstrap.position","ui.bootstrap.bindHtml"]).provider("$tooltip",function(){function a(a){var b=/[A-Z]/g,c="-";return a.replace(b,function(a,b){return(b?c:"")+a.toLowerCase()})}var b={placement:"top",animation:!0,popupDelay:0},c={mouseenter:"mouseleave",click:"click",focus:"blur"},d={};this.options=function(a){angular.extend(d,a)},this.setTriggers=function(a){angular.extend(c,a)},this.$get=["$window","$compile","$timeout","$parse","$document","$position","$interpolate",function(e,f,g,h,i,j,k){return function(e,l,m){function n(a){var b=a||o.trigger||m,d=c[b]||b;return{show:b,hide:d}}var o=angular.extend({},b,d),p=a(e),q=k.startSymbol(),r=k.endSymbol(),s="
';return{restrict:"EA",scope:!0,compile:function(){var a=f(s);return function(b,c,d){function f(){b.tt_isOpen?m():k()}function k(){(!z||b.$eval(d[l+"Enable"]))&&(b.tt_popupDelay?(v=g(p,b.tt_popupDelay,!1),v.then(function(a){a()})):p()())}function m(){b.$apply(function(){q()})}function p(){return b.tt_content?(r(),u&&g.cancel(u),t.css({top:0,left:0,display:"block"}),w?i.find("body").append(t):c.after(t),A(),b.tt_isOpen=!0,b.$digest(),A):angular.noop}function q(){b.tt_isOpen=!1,g.cancel(v),b.tt_animation?u=g(s,500):s()}function r(){t&&s(),t=a(b,function(){}),b.$digest()}function s(){t&&(t.remove(),t=null)}var t,u,v,w=angular.isDefined(o.appendToBody)?o.appendToBody:!1,x=n(void 0),y=!1,z=angular.isDefined(d[l+"Enable"]),A=function(){var a,d,e,f;switch(a=w?j.offset(c):j.position(c),d=t.prop("offsetWidth"),e=t.prop("offsetHeight"),b.tt_placement){case"right":f={top:a.top+a.height/2-e/2,left:a.left+a.width};break;case"bottom":f={top:a.top+a.height,left:a.left+a.width/2-d/2};break;case"left":f={top:a.top+a.height/2-e/2,left:a.left-d};break;default:f={top:a.top-e,left:a.left+a.width/2-d/2}}f.top+="px",f.left+="px",t.css(f)};b.tt_isOpen=!1,d.$observe(e,function(a){b.tt_content=a,!a&&b.tt_isOpen&&q()}),d.$observe(l+"Title",function(a){b.tt_title=a}),d.$observe(l+"Placement",function(a){b.tt_placement=angular.isDefined(a)?a:o.placement}),d.$observe(l+"PopupDelay",function(a){var c=parseInt(a,10);b.tt_popupDelay=isNaN(c)?o.popupDelay:c});var B=function(){y&&(c.unbind(x.show,k),c.unbind(x.hide,m))};d.$observe(l+"Trigger",function(a){B(),x=n(a),x.show===x.hide?c.bind(x.show,f):(c.bind(x.show,k),c.bind(x.hide,m)),y=!0});var C=b.$eval(d[l+"Animation"]);b.tt_animation=angular.isDefined(C)?!!C:o.animation,d.$observe(l+"AppendToBody",function(a){w=angular.isDefined(a)?h(a)(b):w}),w&&b.$on("$locationChangeSuccess",function(){b.tt_isOpen&&q()}),b.$on("$destroy",function(){g.cancel(u),g.cancel(v),B(),s()})}}}}}]}).directive("tooltipPopup",function(){return{restrict:"EA",replace:!0,scope:{content:"@",placement:"@",animation:"&",isOpen:"&"},templateUrl:"template/tooltip/tooltip-popup.html"}}).directive("tooltip",["$tooltip",function(a){return a("tooltip","tooltip","mouseenter")}]).directive("tooltipHtmlUnsafePopup",function(){return{restrict:"EA",replace:!0,scope:{content:"@",placement:"@",animation:"&",isOpen:"&"},templateUrl:"template/tooltip/tooltip-html-unsafe-popup.html"}}).directive("tooltipHtmlUnsafe",["$tooltip",function(a){return a("tooltipHtmlUnsafe","tooltip","mouseenter")}]),angular.module("ui.bootstrap.popover",["ui.bootstrap.tooltip"]).directive("popoverPopup",function(){return{restrict:"EA",replace:!0,scope:{title:"@",content:"@",placement:"@",animation:"&",isOpen:"&"},templateUrl:"template/popover/popover.html"}}).directive("popover",["$tooltip",function(a){return a("popover","popover","click")}]),angular.module("ui.bootstrap.progressbar",["ui.bootstrap.transition"]).constant("progressConfig",{animate:!0,max:100}).controller("ProgressController",["$scope","$attrs","progressConfig","$transition",function(a,b,c,d){var e=this,f=[],g=angular.isDefined(b.max)?a.$parent.$eval(b.max):c.max,h=angular.isDefined(b.animate)?a.$parent.$eval(b.animate):c.animate;this.addBar=function(a,b){var c=0,d=a.$parent.$index;angular.isDefined(d)&&f[d]&&(c=f[d].value),f.push(a),this.update(b,a.value,c),a.$watch("value",function(a,c){a!==c&&e.update(b,a,c)}),a.$on("$destroy",function(){e.removeBar(a)})},this.update=function(a,b,c){var e=this.getPercentage(b);h?(a.css("width",this.getPercentage(c)+"%"),d(a,{width:e+"%"})):a.css({transition:"none",width:e+"%"})},this.removeBar=function(a){f.splice(f.indexOf(a),1)},this.getPercentage=function(a){return Math.round(100*a/g)}}]).directive("progress",function(){return{restrict:"EA",replace:!0,transclude:!0,controller:"ProgressController",require:"progress",scope:{},template:'
'}}).directive("bar",function(){return{restrict:"EA",replace:!0,transclude:!0,require:"^progress",scope:{value:"=",type:"@"},templateUrl:"template/progressbar/bar.html",link:function(a,b,c,d){d.addBar(a,b)}}}).directive("progressbar",function(){return{restrict:"EA",replace:!0,transclude:!0,controller:"ProgressController",scope:{value:"=",type:"@"},templateUrl:"template/progressbar/progressbar.html",link:function(a,b,c,d){d.addBar(a,angular.element(b.children()[0]))}}}),angular.module("ui.bootstrap.rating",[]).constant("ratingConfig",{max:5,stateOn:null,stateOff:null}).controller("RatingController",["$scope","$attrs","$parse","ratingConfig",function(a,b,c,d){this.maxRange=angular.isDefined(b.max)?a.$parent.$eval(b.max):d.max,this.stateOn=angular.isDefined(b.stateOn)?a.$parent.$eval(b.stateOn):d.stateOn,this.stateOff=angular.isDefined(b.stateOff)?a.$parent.$eval(b.stateOff):d.stateOff,this.createRateObjects=function(a){for(var b={stateOn:this.stateOn,stateOff:this.stateOff},c=0,d=a.length;d>c;c++)a[c]=angular.extend({index:c},b,a[c]);return a},a.range=angular.isDefined(b.ratingStates)?this.createRateObjects(angular.copy(a.$parent.$eval(b.ratingStates))):this.createRateObjects(new Array(this.maxRange)),a.rate=function(b){a.value===b||a.readonly||(a.value=b) +},a.enter=function(b){a.readonly||(a.val=b),a.onHover({value:b})},a.reset=function(){a.val=angular.copy(a.value),a.onLeave()},a.$watch("value",function(b){a.val=b}),a.readonly=!1,b.readonly&&a.$parent.$watch(c(b.readonly),function(b){a.readonly=!!b})}]).directive("rating",function(){return{restrict:"EA",scope:{value:"=",onHover:"&",onLeave:"&"},controller:"RatingController",templateUrl:"template/rating/rating.html",replace:!0}}),angular.module("ui.bootstrap.tabs",[]).controller("TabsetController",["$scope",function(a){var b=this,c=b.tabs=a.tabs=[];b.select=function(a){angular.forEach(c,function(a){a.active=!1}),a.active=!0},b.addTab=function(a){c.push(a),(1===c.length||a.active)&&b.select(a)},b.removeTab=function(a){var d=c.indexOf(a);if(a.active&&c.length>1){var e=d==c.length-1?d-1:d+1;b.select(c[e])}c.splice(d,1)}}]).directive("tabset",function(){return{restrict:"EA",transclude:!0,replace:!0,scope:{},controller:"TabsetController",templateUrl:"template/tabs/tabset.html",link:function(a,b,c){a.vertical=angular.isDefined(c.vertical)?a.$parent.$eval(c.vertical):!1,a.justified=angular.isDefined(c.justified)?a.$parent.$eval(c.justified):!1,a.type=angular.isDefined(c.type)?a.$parent.$eval(c.type):"tabs"}}}).directive("tab",["$parse",function(a){return{require:"^tabset",restrict:"EA",replace:!0,templateUrl:"template/tabs/tab.html",transclude:!0,scope:{heading:"@",onSelect:"&select",onDeselect:"&deselect"},controller:function(){},compile:function(b,c,d){return function(b,c,e,f){var g,h;e.active?(g=a(e.active),h=g.assign,b.$parent.$watch(g,function(a,c){a!==c&&(b.active=!!a)}),b.active=g(b.$parent)):h=g=angular.noop,b.$watch("active",function(a){h(b.$parent,a),a?(f.select(b),b.onSelect()):b.onDeselect()}),b.disabled=!1,e.disabled&&b.$parent.$watch(a(e.disabled),function(a){b.disabled=!!a}),b.select=function(){b.disabled||(b.active=!0)},f.addTab(b),b.$on("$destroy",function(){f.removeTab(b)}),b.$transcludeFn=d}}}}]).directive("tabHeadingTransclude",[function(){return{restrict:"A",require:"^tab",link:function(a,b){a.$watch("headingElement",function(a){a&&(b.html(""),b.append(a))})}}}]).directive("tabContentTransclude",function(){function a(a){return a.tagName&&(a.hasAttribute("tab-heading")||a.hasAttribute("data-tab-heading")||"tab-heading"===a.tagName.toLowerCase()||"data-tab-heading"===a.tagName.toLowerCase())}return{restrict:"A",require:"^tabset",link:function(b,c,d){var e=b.$eval(d.tabContentTransclude);e.$transcludeFn(e.$parent,function(b){angular.forEach(b,function(b){a(b)?e.headingElement=b:c.append(b)})})}}}),angular.module("ui.bootstrap.timepicker",[]).constant("timepickerConfig",{hourStep:1,minuteStep:1,showMeridian:!0,meridians:null,readonlyInput:!1,mousewheel:!0}).directive("timepicker",["$parse","$log","timepickerConfig","$locale",function(a,b,c,d){return{restrict:"EA",require:"?^ngModel",replace:!0,scope:{},templateUrl:"template/timepicker/timepicker.html",link:function(e,f,g,h){function i(){var a=parseInt(e.hours,10),b=e.showMeridian?a>0&&13>a:a>=0&&24>a;return b?(e.showMeridian&&(12===a&&(a=0),e.meridian===q[1]&&(a+=12)),a):void 0}function j(){var a=parseInt(e.minutes,10);return a>=0&&60>a?a:void 0}function k(a){return angular.isDefined(a)&&a.toString().length<2?"0"+a:a}function l(a){m(),h.$setViewValue(new Date(p)),n(a)}function m(){h.$setValidity("time",!0),e.invalidHours=!1,e.invalidMinutes=!1}function n(a){var b=p.getHours(),c=p.getMinutes();e.showMeridian&&(b=0===b||12===b?12:b%12),e.hours="h"===a?b:k(b),e.minutes="m"===a?c:k(c),e.meridian=p.getHours()<12?q[0]:q[1]}function o(a){var b=new Date(p.getTime()+6e4*a);p.setHours(b.getHours(),b.getMinutes()),l()}if(h){var p=new Date,q=angular.isDefined(g.meridians)?e.$parent.$eval(g.meridians):c.meridians||d.DATETIME_FORMATS.AMPMS,r=c.hourStep;g.hourStep&&e.$parent.$watch(a(g.hourStep),function(a){r=parseInt(a,10)});var s=c.minuteStep;g.minuteStep&&e.$parent.$watch(a(g.minuteStep),function(a){s=parseInt(a,10)}),e.showMeridian=c.showMeridian,g.showMeridian&&e.$parent.$watch(a(g.showMeridian),function(a){if(e.showMeridian=!!a,h.$error.time){var b=i(),c=j();angular.isDefined(b)&&angular.isDefined(c)&&(p.setHours(b),l())}else n()});var t=f.find("input"),u=t.eq(0),v=t.eq(1),w=angular.isDefined(g.mousewheel)?e.$eval(g.mousewheel):c.mousewheel;if(w){var x=function(a){a.originalEvent&&(a=a.originalEvent);var b=a.wheelDelta?a.wheelDelta:-a.deltaY;return a.detail||b>0};u.bind("mousewheel wheel",function(a){e.$apply(x(a)?e.incrementHours():e.decrementHours()),a.preventDefault()}),v.bind("mousewheel wheel",function(a){e.$apply(x(a)?e.incrementMinutes():e.decrementMinutes()),a.preventDefault()})}if(e.readonlyInput=angular.isDefined(g.readonlyInput)?e.$eval(g.readonlyInput):c.readonlyInput,e.readonlyInput)e.updateHours=angular.noop,e.updateMinutes=angular.noop;else{var y=function(a,b){h.$setViewValue(null),h.$setValidity("time",!1),angular.isDefined(a)&&(e.invalidHours=a),angular.isDefined(b)&&(e.invalidMinutes=b)};e.updateHours=function(){var a=i();angular.isDefined(a)?(p.setHours(a),l("h")):y(!0)},u.bind("blur",function(){!e.validHours&&e.hours<10&&e.$apply(function(){e.hours=k(e.hours)})}),e.updateMinutes=function(){var a=j();angular.isDefined(a)?(p.setMinutes(a),l("m")):y(void 0,!0)},v.bind("blur",function(){!e.invalidMinutes&&e.minutes<10&&e.$apply(function(){e.minutes=k(e.minutes)})})}h.$render=function(){var a=h.$modelValue?new Date(h.$modelValue):null;isNaN(a)?(h.$setValidity("time",!1),b.error('Timepicker directive: "ng-model" value must be a Date object, a number of milliseconds since 01.01.1970 or a string representing an RFC2822 or ISO 8601 date.')):(a&&(p=a),m(),n())},e.incrementHours=function(){o(60*r)},e.decrementHours=function(){o(60*-r)},e.incrementMinutes=function(){o(s)},e.decrementMinutes=function(){o(-s)},e.toggleMeridian=function(){o(720*(p.getHours()<12?1:-1))}}}}}]),angular.module("ui.bootstrap.typeahead",["ui.bootstrap.position","ui.bootstrap.bindHtml"]).factory("typeaheadParser",["$parse",function(a){var b=/^\s*(.*?)(?:\s+as\s+(.*?))?\s+for\s+(?:([\$\w][\$\w\d]*))\s+in\s+(.*)$/;return{parse:function(c){var d=c.match(b);if(!d)throw new Error("Expected typeahead specification in form of '_modelValue_ (as _label_)? for _item_ in _collection_' but got '"+c+"'.");return{itemName:d[3],source:a(d[4]),viewMapper:a(d[2]||d[1]),modelMapper:a(d[1])}}}}]).directive("typeahead",["$compile","$parse","$q","$timeout","$document","$position","typeaheadParser",function(a,b,c,d,e,f,g){var h=[9,13,27,38,40];return{require:"ngModel",link:function(i,j,k,l){var m,n=i.$eval(k.typeaheadMinLength)||1,o=i.$eval(k.typeaheadWaitMs)||0,p=i.$eval(k.typeaheadEditable)!==!1,q=b(k.typeaheadLoading).assign||angular.noop,r=b(k.typeaheadOnSelect),s=k.typeaheadInputFormatter?b(k.typeaheadInputFormatter):void 0,t=k.typeaheadAppendToBody?b(k.typeaheadAppendToBody):!1,u=b(k.ngModel).assign,v=g.parse(k.typeahead),w=angular.element("
");w.attr({matches:"matches",active:"activeIdx",select:"select(activeIdx)",query:"query",position:"position"}),angular.isDefined(k.typeaheadTemplateUrl)&&w.attr("template-url",k.typeaheadTemplateUrl);var x=i.$new();i.$on("$destroy",function(){x.$destroy()});var y=function(){x.matches=[],x.activeIdx=-1},z=function(a){var b={$viewValue:a};q(i,!0),c.when(v.source(i,b)).then(function(c){if(a===l.$viewValue&&m){if(c.length>0){x.activeIdx=0,x.matches.length=0;for(var d=0;d=n?o>0?(A&&d.cancel(A),A=d(function(){z(a)},o)):z(a):(q(i,!1),y()),p?a:a?(l.$setValidity("editable",!1),void 0):(l.$setValidity("editable",!0),a)}),l.$formatters.push(function(a){var b,c,d={};return s?(d.$model=a,s(i,d)):(d[v.itemName]=a,b=v.viewMapper(i,d),d[v.itemName]=void 0,c=v.viewMapper(i,d),b!==c?b:a)}),x.select=function(a){var b,c,d={};d[v.itemName]=c=x.matches[a].model,b=v.modelMapper(i,d),u(i,b),l.$setValidity("editable",!0),r(i,{$item:c,$model:b,$label:v.viewMapper(i,d)}),y(),j[0].focus()},j.bind("keydown",function(a){0!==x.matches.length&&-1!==h.indexOf(a.which)&&(a.preventDefault(),40===a.which?(x.activeIdx=(x.activeIdx+1)%x.matches.length,x.$digest()):38===a.which?(x.activeIdx=(x.activeIdx?x.activeIdx:x.matches.length)-1,x.$digest()):13===a.which||9===a.which?x.$apply(function(){x.select(x.activeIdx)}):27===a.which&&(a.stopPropagation(),y(),x.$digest()))}),j.bind("blur",function(){m=!1});var B=function(a){j[0]!==a.target&&(y(),x.$digest())};e.bind("click",B),i.$on("$destroy",function(){e.unbind("click",B)});var C=a(w)(x);t?e.find("body").append(C):j.after(C)}}}]).directive("typeaheadPopup",function(){return{restrict:"EA",scope:{matches:"=",query:"=",active:"=",position:"=",select:"&"},replace:!0,templateUrl:"template/typeahead/typeahead-popup.html",link:function(a,b,c){a.templateUrl=c.templateUrl,a.isOpen=function(){return a.matches.length>0},a.isActive=function(b){return a.active==b},a.selectActive=function(b){a.active=b},a.selectMatch=function(b){a.select({activeIdx:b})}}}}).directive("typeaheadMatch",["$http","$templateCache","$compile","$parse",function(a,b,c,d){return{restrict:"EA",scope:{index:"=",match:"=",query:"="},link:function(e,f,g){var h=d(g.templateUrl)(e.$parent)||"template/typeahead/typeahead-match.html";a.get(h,{cache:b}).success(function(a){f.replaceWith(c(a.trim())(e))})}}}]).filter("typeaheadHighlight",function(){function a(a){return a.replace(/([.?*+^$[\]\\(){}|-])/g,"\\$1")}return function(b,c){return c?b.replace(new RegExp(a(c),"gi"),"$&"):b}}),angular.module("template/accordion/accordion-group.html",[]).run(["$templateCache",function(a){a.put("template/accordion/accordion-group.html",'
\n
\n

\n {{heading}}\n

\n
\n
\n
\n
\n
')}]),angular.module("template/accordion/accordion.html",[]).run(["$templateCache",function(a){a.put("template/accordion/accordion.html",'
')}]),angular.module("template/alert/alert.html",[]).run(["$templateCache",function(a){a.put("template/alert/alert.html","
\n \n
\n
\n")}]),angular.module("template/carousel/carousel.html",[]).run(["$templateCache",function(a){a.put("template/carousel/carousel.html",'\n')}]),angular.module("template/carousel/slide.html",[]).run(["$templateCache",function(a){a.put("template/carousel/slide.html","
\n")}]),angular.module("template/datepicker/datepicker.html",[]).run(["$templateCache",function(a){a.put("template/datepicker/datepicker.html",'\n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n
#{{label}}
{{ getWeekNumber(row) }}\n \n
\n')}]),angular.module("template/datepicker/popup.html",[]).run(["$templateCache",function(a){a.put("template/datepicker/popup.html","
    \n
  • \n"+'
  • \n \n \n \n \n \n \n
  • \n
\n')}]),angular.module("template/modal/backdrop.html",[]).run(["$templateCache",function(a){a.put("template/modal/backdrop.html",'')}]),angular.module("template/modal/window.html",[]).run(["$templateCache",function(a){a.put("template/modal/window.html",'')}]),angular.module("template/pagination/pager.html",[]).run(["$templateCache",function(a){a.put("template/pagination/pager.html",'')}]),angular.module("template/pagination/pagination.html",[]).run(["$templateCache",function(a){a.put("template/pagination/pagination.html",'')}]),angular.module("template/tooltip/tooltip-html-unsafe-popup.html",[]).run(["$templateCache",function(a){a.put("template/tooltip/tooltip-html-unsafe-popup.html",'
\n
\n
\n
\n')}]),angular.module("template/tooltip/tooltip-popup.html",[]).run(["$templateCache",function(a){a.put("template/tooltip/tooltip-popup.html",'
\n
\n
\n
\n')}]),angular.module("template/popover/popover.html",[]).run(["$templateCache",function(a){a.put("template/popover/popover.html",'
\n
\n\n
\n

\n
\n
\n
\n')}]),angular.module("template/progressbar/bar.html",[]).run(["$templateCache",function(a){a.put("template/progressbar/bar.html",'
')}]),angular.module("template/progressbar/progress.html",[]).run(["$templateCache",function(a){a.put("template/progressbar/progress.html",'
')}]),angular.module("template/progressbar/progressbar.html",[]).run(["$templateCache",function(a){a.put("template/progressbar/progressbar.html",'
')}]),angular.module("template/rating/rating.html",[]).run(["$templateCache",function(a){a.put("template/rating/rating.html",'\n \n')}]),angular.module("template/tabs/tab.html",[]).run(["$templateCache",function(a){a.put("template/tabs/tab.html",'
  • \n {{heading}}\n
  • \n')}]),angular.module("template/tabs/tabset-titles.html",[]).run(["$templateCache",function(a){a.put("template/tabs/tabset-titles.html","
      \n
    \n")}]),angular.module("template/tabs/tabset.html",[]).run(["$templateCache",function(a){a.put("template/tabs/tabset.html",'\n
    \n \n
    \n
    \n
    \n
    \n
    \n')}]),angular.module("template/timepicker/timepicker.html",[]).run(["$templateCache",function(a){a.put("template/timepicker/timepicker.html",'\n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n
     
    \n \n :\n \n
     
    \n')}]),angular.module("template/typeahead/typeahead-match.html",[]).run(["$templateCache",function(a){a.put("template/typeahead/typeahead-match.html",'')}]),angular.module("template/typeahead/typeahead-popup.html",[]).run(["$templateCache",function(a){a.put("template/typeahead/typeahead-popup.html","
      \n"+'
    • \n
      \n
    • \n
    ')}]); \ No newline at end of file diff --git a/src/UmbracoUrlHandling/Umbraco/lib/angular-dynamic-locale/tmhDynamicLocale.min.js b/src/UmbracoUrlHandling/Umbraco/lib/angular-dynamic-locale/tmhDynamicLocale.min.js new file mode 100644 index 0000000..53478b9 --- /dev/null +++ b/src/UmbracoUrlHandling/Umbraco/lib/angular-dynamic-locale/tmhDynamicLocale.min.js @@ -0,0 +1,8 @@ +/** + * Angular Dynamic Locale - 0.1.27 + * https://github.com/lgalfaso/angular-dynamic-locale + * License: MIT + */ + +!function(a,b){"function"==typeof define&&define.amd?define([],function(){return b()}):"object"==typeof exports?module.exports=b():b()}(this,function(){"use strict";return angular.module("tmh.dynamicLocale",[]).config(["$provide",function(a){function b(a){return a.$stateful=!0,a}a.decorator("dateFilter",["$delegate",b]),a.decorator("numberFilter",["$delegate",b]),a.decorator("currencyFilter",["$delegate",b])}]).constant("tmhDynamicLocale.STORAGE_KEY","tmhDynamicLocale.locale").provider("tmhDynamicLocale",["tmhDynamicLocale.STORAGE_KEY",function(a){function b(a,b,c,d){var e=document.createElement("script"),f=document.getElementsByTagName("body")[0],g=!1;e.type="text/javascript",e.readyState?e.onreadystatechange=function(){("complete"===e.readyState||"loaded"===e.readyState)&&(e.onreadystatechange=null,d(function(){g||(g=!0,f.removeChild(e),b())},30,!1))}:(e.onload=function(){g||(g=!0,f.removeChild(e),b())},e.onerror=function(){g||(g=!0,f.removeChild(e),c())}),e.src=a,e.async=!0,f.appendChild(e)}function c(a,c,d,g,h,k,l){function m(a,b){f===d&&(angular.forEach(a,function(c,d){b[d]?angular.isArray(b[d])&&(a[d].length=b[d].length):delete a[d]}),angular.forEach(b,function(c,d){angular.isArray(b[d])||angular.isObject(b[d])?(a[d]||(a[d]=angular.isArray(b[d])?[]:{}),m(a[d],b[d])):a[d]=b[d]}))}if(j[d])return f=d,j[d];var n,o=h.defer();return d===f?o.resolve(c):(n=k.get(d))?(f=d,g.$evalAsync(function(){m(c,n),e.put(i,d),g.$broadcast("$localeChangeSuccess",d,c),o.resolve(c)})):(f=d,j[d]=o.promise,b(a,function(){var a=angular.injector(["ngLocale"]),b=a.get("$locale");m(c,b),k.put(d,b),delete j[d],g.$apply(function(){e.put(i,d),g.$broadcast("$localeChangeSuccess",d,c),o.resolve(c)})},function(){delete j[d],g.$apply(function(){f===d&&(f=c.id),g.$broadcast("$localeChangeError",d),o.reject(d)})},l)),o.promise}var d,e,f,g="angular/i18n/angular-locale_{{locale}}.js",h="tmhDynamicLocaleStorageCache",i=a,j={};this.localeLocationPattern=function(a){return a?(g=a,this):g},this.useStorage=function(a){h=a},this.useCookieStorage=function(){this.useStorage("$cookieStore")},this.defaultLocale=function(a){d=a},this.storageKey=function(a){return a?(i=a,this):i},this.$get=["$rootScope","$injector","$interpolate","$locale","$q","tmhDynamicLocaleCache","$timeout",function(a,b,j,k,l,m,n){function o(b){return c(p({locale:b,angularVersion:angular.version.full}),k,b,a,l,m,n)}var p=j(g);return e=b.get(h),a.$evalAsync(function(){var a;(a=e.get(i)||d)&&o(a)}),{set:o,get:function(){return f}}}]}]).provider("tmhDynamicLocaleCache",function(){this.$get=["$cacheFactory",function(a){return a("tmh.dynamicLocales")}]}).provider("tmhDynamicLocaleStorageCache",function(){this.$get=["$cacheFactory",function(a){return a("tmh.dynamicLocales.store")}]}).run(["tmhDynamicLocale",angular.noop]),"tmh.dynamicLocale"}); +//# sourceMappingURL=tmhDynamicLocale.min.js.map \ No newline at end of file diff --git a/src/UmbracoUrlHandling/Umbraco/lib/angular-dynamic-locale/tmhDynamicLocale.min.js.map b/src/UmbracoUrlHandling/Umbraco/lib/angular-dynamic-locale/tmhDynamicLocale.min.js.map new file mode 100644 index 0000000..4ca2884 --- /dev/null +++ b/src/UmbracoUrlHandling/Umbraco/lib/angular-dynamic-locale/tmhDynamicLocale.min.js.map @@ -0,0 +1 @@ +{"version":3,"file":"tmhDynamicLocale.min.js","sources":["src/tmhDynamicLocale.js"],"names":["root","factory","define","amd","exports","module","this","angular","config","$provide","makeStateful","$delegate","$stateful","decorator","constant","provider","STORAGE_KEY","loadScript","url","callback","errorCallback","$timeout","script","document","createElement","body","getElementsByTagName","removed","type","readyState","onreadystatechange","removeChild","onload","onerror","src","async","appendChild","loadLocale","localeUrl","$locale","localeId","$rootScope","$q","localeCache","overrideValues","oldObject","newObject","activeLocale","forEach","value","key","isArray","length","isObject","promiseCache","cachedLocale","deferred","defer","resolve","get","$evalAsync","storage","put","storageKey","$broadcast","promise","localInjector","injector","externalLocale","$apply","id","reject","defaultLocale","localeLocationPattern","storageFactory","useStorage","storageName","useCookieStorage","$get","$injector","interpolate","locale","tmhDynamicLocaleCache","loadLocaleFn","localeLocation","angularVersion","version","full","initialLocale","set","$cacheFactory","run","noop"],"mappings":";;;;;;CAAC,SAAUA,EAAMC,GACO,kBAAXC,SAAyBA,OAAOC,IAEzCD,UAAW,WACT,MAAQD,OAEkB,gBAAZG,SAIhBC,OAAOD,QAAUH,IAEjBA,KAEFK,KAAM,WACR,YAkOA,OAjOAC,SAAQF,OAAO,wBAAyBG,QAAQ,WAAY,SAASC,GACnE,QAASC,GAAaC,GAEpB,MADAA,GAAUC,WAAY,EACfD,EAGTF,EAASI,UAAU,cAAe,YAAaH,IAC/CD,EAASI,UAAU,gBAAiB,YAAaH,IACjDD,EAASI,UAAU,kBAAmB,YAAaH,OAGpDI,SAAS,+BAAgC,2BACzCC,SAAS,oBAAqB,+BAAgC,SAASC,GAgBtE,QAASC,GAAWC,EAAKC,EAAUC,EAAeC,GAChD,GAAIC,GAASC,SAASC,cAAc,UAClCC,EAAOF,SAASG,qBAAqB,QAAQ,GAC7CC,GAAU,CAEZL,GAAOM,KAAO,kBACVN,EAAOO,WACTP,EAAOQ,mBAAqB,YACA,aAAtBR,EAAOO,YACe,WAAtBP,EAAOO,cACTP,EAAOQ,mBAAqB,KAC5BT,EACE,WACMM,IACJA,GAAU,EACVF,EAAKM,YAAYT,GACjBH,MACC,IAAI,MAIbG,EAAOU,OAAS,WACVL,IACJA,GAAU,EACVF,EAAKM,YAAYT,GACjBH,MAEFG,EAAOW,QAAU,WACXN,IACJA,GAAU,EACVF,EAAKM,YAAYT,GACjBF,OAGJE,EAAOY,IAAMhB,EACbI,EAAOa,OAAQ,EACfV,EAAKW,YAAYd,GAcnB,QAASe,GAAWC,EAAWC,EAASC,EAAUC,EAAYC,EAAIC,EAAatB,GAE7E,QAASuB,GAAeC,EAAWC,GAC7BC,IAAiBP,IAGrBjC,QAAQyC,QAAQH,EAAW,SAASI,EAAOC,GACpCJ,EAAUI,GAEJ3C,QAAQ4C,QAAQL,EAAUI,MACnCL,EAAUK,GAAKE,OAASN,EAAUI,GAAKE,cAFhCP,GAAUK,KAKrB3C,QAAQyC,QAAQF,EAAW,SAASG,EAAOC,GACrC3C,QAAQ4C,QAAQL,EAAUI,KAAS3C,QAAQ8C,SAASP,EAAUI,KAC3DL,EAAUK,KACbL,EAAUK,GAAO3C,QAAQ4C,QAAQL,EAAUI,WAE7CN,EAAeC,EAAUK,GAAMJ,EAAUI,KAEzCL,EAAUK,GAAOJ,EAAUI,MAMjC,GAAII,EAAad,GAEf,MADAO,GAAeP,EACRc,EAAad,EAGtB,IAAIe,GACFC,EAAWd,EAAGe,OAwChB,OAvCIjB,KAAaO,EACfS,EAASE,QAAQnB,IACPgB,EAAeZ,EAAYgB,IAAInB,KACzCO,EAAeP,EACfC,EAAWmB,WAAW,WACpBhB,EAAeL,EAASgB,GACxBM,EAAQC,IAAIC,EAAYvB,GACxBC,EAAWuB,WAAW,uBAAwBxB,EAAUD,GACxDiB,EAASE,QAAQnB,OAGnBQ,EAAeP,EACfc,EAAad,GAAYgB,EAASS,QAClChD,EAAWqB,EAAW,WAEpB,GAAI4B,GAAgB3D,QAAQ4D,UAAU,aACpCC,EAAiBF,EAAcP,IAAI,UAErCf,GAAeL,EAAS6B,GACxBzB,EAAYmB,IAAItB,EAAU4B,SACnBd,GAAad,GAEpBC,EAAW4B,OAAO,WAChBR,EAAQC,IAAIC,EAAYvB,GACxBC,EAAWuB,WAAW,uBAAwBxB,EAAUD,GACxDiB,EAASE,QAAQnB,MAElB,iBACMe,GAAad,GAEpBC,EAAW4B,OAAO,WACZtB,IAAiBP,IACnBO,EAAeR,EAAQ+B,IAEzB7B,EAAWuB,WAAW,qBAAsBxB,GAC5CgB,EAASe,OAAO/B,MAEjBnB,IAEEmC,EAASS,QAxIlB,GAAIO,GAGFX,EAGAd,EALA0B,EAAwB,4CACxBC,EAAiB,+BAEjBX,EAAa/C,EACbsC,IAsIFhD,MAAKmE,sBAAwB,SAASxB,GACpC,MAAIA,IACFwB,EAAwBxB,EACjB3C,MAEAmE,GAIXnE,KAAKqE,WAAa,SAASC,GACzBF,EAAiBE,GAGnBtE,KAAKuE,iBAAmB,WACtBvE,KAAKqE,WAAW,iBAGlBrE,KAAKkE,cAAgB,SAASvB,GAC5BuB,EAAgBvB,GAGlB3C,KAAKyD,WAAa,SAASd,GACzB,MAAIA,IACFc,EAAad,EACN3C,MAEAyD,GAIXzD,KAAKwE,MAAQ,aAAc,YAAa,eAAgB,UAAW,KAAM,wBAAyB,WAAY,SAASrC,EAAYsC,EAAWC,EAAaC,EAAQvC,EAAIwC,EAAuB7D,GA4B5L,QAAS8D,GAAa3C,GACpB,MAAOH,GAAW+C,GAAgBH,OAAQzC,EAAU6C,eAAgB9E,QAAQ+E,QAAQC,OAAQN,EAAQzC,EAAUC,EAAYC,EAAIwC,EAAuB7D,GA5BvJ,GAAI+D,GAAiBJ,EAAYP,EASjC,OAPAZ,GAAUkB,EAAUpB,IAAIe,GACxBjC,EAAWmB,WAAW,WACpB,GAAI4B,IACCA,EAAiB3B,EAAQF,IAAII,IAAeS,IAC/CW,EAAaK,MAWfC,IAAKN,EAKLxB,IAAK,WACH,MAAOZ,UAQXhC,SAAS,wBAAyB,WACpCT,KAAKwE,MAAQ,gBAAiB,SAASY,GACrC,MAAOA,GAAc,0BAEtB3E,SAAS,+BAAgC,WAC1CT,KAAKwE,MAAQ,gBAAiB,SAASY,GACrC,MAAOA,GAAc,gCAEtBC,KAAK,mBAAoBpF,QAAQqF,OAE7B"} \ No newline at end of file diff --git a/src/UmbracoUrlHandling/Umbraco/lib/angular-local-storage/angular-local-storage.min.js b/src/UmbracoUrlHandling/Umbraco/lib/angular-local-storage/angular-local-storage.min.js new file mode 100644 index 0000000..b0111f1 --- /dev/null +++ b/src/UmbracoUrlHandling/Umbraco/lib/angular-local-storage/angular-local-storage.min.js @@ -0,0 +1,9 @@ +/** + * An Angular module that gives you access to the browsers local storage + * @version v0.2.6 - 2016-03-16 + * @link https://github.com/grevory/angular-local-storage + * @author grevory + * @license MIT License, http://www.opensource.org/licenses/MIT + */ +!function(a,b){var c=b.isDefined,d=b.isUndefined,e=b.isNumber,f=b.isObject,g=b.isArray,h=b.extend,i=b.toJson;b.module("LocalStorageModule",[]).provider("localStorageService",function(){this.prefix="ls",this.storageType="localStorage",this.cookie={expiry:30,path:"/"},this.notify={setItem:!0,removeItem:!1},this.setPrefix=function(a){return this.prefix=a,this},this.setStorageType=function(a){return this.storageType=a,this},this.setStorageCookie=function(a,b){return this.cookie.expiry=a,this.cookie.path=b,this},this.setStorageCookieDomain=function(a){return this.cookie.domain=a,this},this.setNotify=function(a,b){return this.notify={setItem:a,removeItem:b},this},this.$get=["$rootScope","$window","$document","$parse",function(a,b,j,k){var l,m=this,n=m.prefix,o=m.cookie,p=m.notify,q=m.storageType;j?j[0]&&(j=j[0]):j=document,"."!==n.substr(-1)&&(n=n?n+".":"");var r=function(a){return n+a},s=function(){try{var c=q in b&&null!==b[q],d=r("__"+Math.round(1e7*Math.random()));return c&&(l=b[q],l.setItem(d,""),l.removeItem(d)),c}catch(e){return q="cookie",a.$broadcast("LocalStorageModule.notification.error",e.message),!1}}(),t=function(b,c){if(c=d(c)?null:i(c),!s||"cookie"===m.storageType)return s||a.$broadcast("LocalStorageModule.notification.warning","LOCAL_STORAGE_NOT_SUPPORTED"),p.setItem&&a.$broadcast("LocalStorageModule.notification.setitem",{key:b,newvalue:c,storageType:"cookie"}),z(b,c);try{l&&l.setItem(r(b),c),p.setItem&&a.$broadcast("LocalStorageModule.notification.setitem",{key:b,newvalue:c,storageType:m.storageType})}catch(e){return a.$broadcast("LocalStorageModule.notification.error",e.message),z(b,c)}return!0},u=function(b){if(!s||"cookie"===m.storageType)return s||a.$broadcast("LocalStorageModule.notification.warning","LOCAL_STORAGE_NOT_SUPPORTED"),A(b);var c=l?l.getItem(r(b)):null;if(!c||"null"===c)return null;try{return JSON.parse(c)}catch(d){return c}},v=function(){var b,c;for(b=0;b0||(j.cookie="test").indexOf.call(j.cookie,"test")>-1)}catch(c){return a.$broadcast("LocalStorageModule.notification.error",c.message),!1}}(),z=function(b,c,h){if(d(c))return!1;if((g(c)||f(c))&&(c=i(c)),!y)return a.$broadcast("LocalStorageModule.notification.error","COOKIES_NOT_SUPPORTED"),!1;try{var k="",l=new Date,m="";if(null===c?(l.setTime(l.getTime()+-864e5),k="; expires="+l.toGMTString(),c=""):e(h)&&0!==h?(l.setTime(l.getTime()+24*h*60*60*1e3),k="; expires="+l.toGMTString()):0!==o.expiry&&(l.setTime(l.getTime()+24*o.expiry*60*60*1e3),k="; expires="+l.toGMTString()),b){var n="; path="+o.path;o.domain&&(m="; domain="+o.domain),j.cookie=r(b)+"="+encodeURIComponent(c)+k+n+m}}catch(p){return a.$broadcast("LocalStorageModule.notification.error",p.message),!1}return!0},A=function(b){if(!y)return a.$broadcast("LocalStorageModule.notification.error","COOKIES_NOT_SUPPORTED"),!1;for(var c=j.cookie&&j.cookie.split(";")||[],d=0;d + + + + + */ + factory('$cookies', ['$rootScope', '$browser', function ($rootScope, $browser) { + var cookies = {}, + lastCookies = {}, + lastBrowserCookies, + runEval = false, + copy = angular.copy, + isUndefined = angular.isUndefined; + + //creates a poller fn that copies all cookies from the $browser to service & inits the service + $browser.addPollFn(function() { + var currentCookies = $browser.cookies(); + if (lastBrowserCookies != currentCookies) { //relies on browser.cookies() impl + lastBrowserCookies = currentCookies; + copy(currentCookies, lastCookies); + copy(currentCookies, cookies); + if (runEval) $rootScope.$apply(); + } + })(); + + runEval = true; + + //at the end of each eval, push cookies + //TODO: this should happen before the "delayed" watches fire, because if some cookies are not + // strings or browser refuses to store some cookies, we update the model in the push fn. + $rootScope.$watch(push); + + return cookies; + + + /** + * Pushes all the cookies from the service to the browser and verifies if all cookies were stored. + */ + function push() { + var name, + value, + browserCookies, + updated; + + //delete any cookies deleted in $cookies + for (name in lastCookies) { + if (isUndefined(cookies[name])) { + $browser.cookies(name, undefined); + } + } + + //update all cookies updated in $cookies + for(name in cookies) { + value = cookies[name]; + if (!angular.isString(value)) { + if (angular.isDefined(lastCookies[name])) { + cookies[name] = lastCookies[name]; + } else { + delete cookies[name]; + } + } else if (value !== lastCookies[name]) { + $browser.cookies(name, value); + updated = true; + } + } + + //verify what was actually stored + if (updated){ + updated = false; + browserCookies = $browser.cookies(); + + for (name in cookies) { + if (cookies[name] !== browserCookies[name]) { + //delete or reset all cookies that the browser dropped from $cookies + if (isUndefined(browserCookies[name])) { + delete cookies[name]; + } else { + cookies[name] = browserCookies[name]; + } + updated = true; + } + } + } + } + }]). + + + /** + * @ngdoc object + * @name ngCookies.$cookieStore + * @requires $cookies + * + * @description + * Provides a key-value (string-object) storage, that is backed by session cookies. + * Objects put or retrieved from this storage are automatically serialized or + * deserialized by angular's toJson/fromJson. + * @example + */ + factory('$cookieStore', ['$cookies', function($cookies) { + + return { + /** + * @ngdoc method + * @name ngCookies.$cookieStore#get + * @methodOf ngCookies.$cookieStore + * + * @description + * Returns the value of given cookie key + * + * @param {string} key Id to use for lookup. + * @returns {Object} Deserialized cookie value. + */ + get: function(key) { + var value = $cookies[key]; + return value ? angular.fromJson(value) : value; + }, + + /** + * @ngdoc method + * @name ngCookies.$cookieStore#put + * @methodOf ngCookies.$cookieStore + * + * @description + * Sets a value for given cookie key + * + * @param {string} key Id for the `value`. + * @param {Object} value Value to be stored. + */ + put: function(key, value) { + $cookies[key] = angular.toJson(value); + }, + + /** + * @ngdoc method + * @name ngCookies.$cookieStore#remove + * @methodOf ngCookies.$cookieStore + * + * @description + * Remove given cookie + * + * @param {string} key Id of the key-value pair to delete. + */ + remove: function(key) { + delete $cookies[key]; + } + }; + + }]); + + +})(window, window.angular); diff --git a/src/UmbracoUrlHandling/Umbraco/lib/angular/1.1.5/angular-cookies.min.js b/src/UmbracoUrlHandling/Umbraco/lib/angular/1.1.5/angular-cookies.min.js new file mode 100644 index 0000000..9d90826 --- /dev/null +++ b/src/UmbracoUrlHandling/Umbraco/lib/angular/1.1.5/angular-cookies.min.js @@ -0,0 +1,7 @@ +/* + AngularJS v1.1.5 + (c) 2010-2012 Google, Inc. http://angularjs.org + License: MIT +*/ +(function(m,f,l){'use strict';f.module("ngCookies",["ng"]).factory("$cookies",["$rootScope","$browser",function(d,b){var c={},g={},h,i=!1,j=f.copy,k=f.isUndefined;b.addPollFn(function(){var a=b.cookies();h!=a&&(h=a,j(a,g),j(a,c),i&&d.$apply())})();i=!0;d.$watch(function(){var a,e,d;for(a in g)k(c[a])&&b.cookies(a,l);for(a in c)e=c[a],f.isString(e)?e!==g[a]&&(b.cookies(a,e),d=!0):f.isDefined(g[a])?c[a]=g[a]:delete c[a];if(d)for(a in e=b.cookies(),c)c[a]!==e[a]&&(k(e[a])?delete c[a]:c[a]=e[a])});return c}]).factory("$cookieStore", +["$cookies",function(d){return{get:function(b){return(b=d[b])?f.fromJson(b):b},put:function(b,c){d[b]=f.toJson(c)},remove:function(b){delete d[b]}}}])})(window,window.angular); diff --git a/src/UmbracoUrlHandling/Umbraco/lib/angular/1.1.5/angular-loader.js b/src/UmbracoUrlHandling/Umbraco/lib/angular/1.1.5/angular-loader.js new file mode 100644 index 0000000..4d7184f --- /dev/null +++ b/src/UmbracoUrlHandling/Umbraco/lib/angular/1.1.5/angular-loader.js @@ -0,0 +1,304 @@ +/** + * @license AngularJS v1.1.5 + * (c) 2010-2012 Google, Inc. http://angularjs.org + * License: MIT + */ + +( + +/** + * @ngdoc interface + * @name angular.Module + * @description + * + * Interface for configuring angular {@link angular.module modules}. + */ + +function setupModuleLoader(window) { + + function ensure(obj, name, factory) { + return obj[name] || (obj[name] = factory()); + } + + return ensure(ensure(window, 'angular', Object), 'module', function() { + /** @type {Object.} */ + var modules = {}; + + /** + * @ngdoc function + * @name angular.module + * @description + * + * The `angular.module` is a global place for creating and registering Angular modules. All + * modules (angular core or 3rd party) that should be available to an application must be + * registered using this mechanism. + * + * + * # Module + * + * A module is a collocation of services, directives, filters, and configuration information. Module + * is used to configure the {@link AUTO.$injector $injector}. + * + *
    +     * // Create a new module
    +     * var myModule = angular.module('myModule', []);
    +     *
    +     * // register a new service
    +     * myModule.value('appName', 'MyCoolApp');
    +     *
    +     * // configure existing services inside initialization blocks.
    +     * myModule.config(function($locationProvider) {
    +'use strict';
    +     *   // Configure existing providers
    +     *   $locationProvider.hashPrefix('!');
    +     * });
    +     * 
    + * + * Then you can create an injector and load your modules like this: + * + *
    +     * var injector = angular.injector(['ng', 'MyModule'])
    +     * 
    + * + * However it's more likely that you'll just use + * {@link ng.directive:ngApp ngApp} or + * {@link angular.bootstrap} to simplify this process for you. + * + * @param {!string} name The name of the module to create or retrieve. + * @param {Array.=} requires If specified then new module is being created. If unspecified then the + * the module is being retrieved for further configuration. + * @param {Function} configFn Optional configuration function for the module. Same as + * {@link angular.Module#config Module#config()}. + * @returns {module} new module with the {@link angular.Module} api. + */ + return function module(name, requires, configFn) { + if (requires && modules.hasOwnProperty(name)) { + modules[name] = null; + } + return ensure(modules, name, function() { + if (!requires) { + throw Error('No module: ' + name); + } + + /** @type {!Array.>} */ + var invokeQueue = []; + + /** @type {!Array.} */ + var runBlocks = []; + + var config = invokeLater('$injector', 'invoke'); + + /** @type {angular.Module} */ + var moduleInstance = { + // Private state + _invokeQueue: invokeQueue, + _runBlocks: runBlocks, + + /** + * @ngdoc property + * @name angular.Module#requires + * @propertyOf angular.Module + * @returns {Array.} List of module names which must be loaded before this module. + * @description + * Holds the list of modules which the injector will load before the current module is loaded. + */ + requires: requires, + + /** + * @ngdoc property + * @name angular.Module#name + * @propertyOf angular.Module + * @returns {string} Name of the module. + * @description + */ + name: name, + + + /** + * @ngdoc method + * @name angular.Module#provider + * @methodOf angular.Module + * @param {string} name service name + * @param {Function} providerType Construction function for creating new instance of the service. + * @description + * See {@link AUTO.$provide#provider $provide.provider()}. + */ + provider: invokeLater('$provide', 'provider'), + + /** + * @ngdoc method + * @name angular.Module#factory + * @methodOf angular.Module + * @param {string} name service name + * @param {Function} providerFunction Function for creating new instance of the service. + * @description + * See {@link AUTO.$provide#factory $provide.factory()}. + */ + factory: invokeLater('$provide', 'factory'), + + /** + * @ngdoc method + * @name angular.Module#service + * @methodOf angular.Module + * @param {string} name service name + * @param {Function} constructor A constructor function that will be instantiated. + * @description + * See {@link AUTO.$provide#service $provide.service()}. + */ + service: invokeLater('$provide', 'service'), + + /** + * @ngdoc method + * @name angular.Module#value + * @methodOf angular.Module + * @param {string} name service name + * @param {*} object Service instance object. + * @description + * See {@link AUTO.$provide#value $provide.value()}. + */ + value: invokeLater('$provide', 'value'), + + /** + * @ngdoc method + * @name angular.Module#constant + * @methodOf angular.Module + * @param {string} name constant name + * @param {*} object Constant value. + * @description + * Because the constant are fixed, they get applied before other provide methods. + * See {@link AUTO.$provide#constant $provide.constant()}. + */ + constant: invokeLater('$provide', 'constant', 'unshift'), + + /** + * @ngdoc method + * @name angular.Module#animation + * @methodOf angular.Module + * @param {string} name animation name + * @param {Function} animationFactory Factory function for creating new instance of an animation. + * @description + * + * Defines an animation hook that can be later used with {@link ng.directive:ngAnimate ngAnimate} + * alongside {@link ng.directive:ngAnimate#Description common ng directives} as well as custom directives. + *
    +           * module.animation('animation-name', function($inject1, $inject2) {
    +           *   return {
    +           *     //this gets called in preparation to setup an animation
    +           *     setup : function(element) { ... },
    +           *
    +           *     //this gets called once the animation is run
    +           *     start : function(element, done, memo) { ... }
    +           *   }
    +           * })
    +           * 
    + * + * See {@link ng.$animationProvider#register $animationProvider.register()} and + * {@link ng.directive:ngAnimate ngAnimate} for more information. + */ + animation: invokeLater('$animationProvider', 'register'), + + /** + * @ngdoc method + * @name angular.Module#filter + * @methodOf angular.Module + * @param {string} name Filter name. + * @param {Function} filterFactory Factory function for creating new instance of filter. + * @description + * See {@link ng.$filterProvider#register $filterProvider.register()}. + */ + filter: invokeLater('$filterProvider', 'register'), + + /** + * @ngdoc method + * @name angular.Module#controller + * @methodOf angular.Module + * @param {string} name Controller name. + * @param {Function} constructor Controller constructor function. + * @description + * See {@link ng.$controllerProvider#register $controllerProvider.register()}. + */ + controller: invokeLater('$controllerProvider', 'register'), + + /** + * @ngdoc method + * @name angular.Module#directive + * @methodOf angular.Module + * @param {string} name directive name + * @param {Function} directiveFactory Factory function for creating new instance of + * directives. + * @description + * See {@link ng.$compileProvider#directive $compileProvider.directive()}. + */ + directive: invokeLater('$compileProvider', 'directive'), + + /** + * @ngdoc method + * @name angular.Module#config + * @methodOf angular.Module + * @param {Function} configFn Execute this function on module load. Useful for service + * configuration. + * @description + * Use this method to register work which needs to be performed on module loading. + */ + config: config, + + /** + * @ngdoc method + * @name angular.Module#run + * @methodOf angular.Module + * @param {Function} initializationFn Execute this function after injector creation. + * Useful for application initialization. + * @description + * Use this method to register work which should be performed when the injector is done + * loading all modules. + */ + run: function(block) { + runBlocks.push(block); + return this; + } + }; + + if (configFn) { + config(configFn); + } + + return moduleInstance; + + /** + * @param {string} provider + * @param {string} method + * @param {String=} insertMethod + * @returns {angular.Module} + */ + function invokeLater(provider, method, insertMethod) { + return function() { + invokeQueue[insertMethod || 'push']([provider, method, arguments]); + return moduleInstance; + } + } + }); + }; + }); + +} + +)(window); + +/** + * Closure compiler type information + * + * @typedef { { + * requires: !Array., + * invokeQueue: !Array.>, + * + * service: function(string, Function):angular.Module, + * factory: function(string, Function):angular.Module, + * value: function(string, *):angular.Module, + * + * filter: function(string, Function):angular.Module, + * + * init: function(Function):angular.Module + * } } + */ +angular.Module; + diff --git a/src/UmbracoUrlHandling/Umbraco/lib/angular/1.1.5/angular-loader.min.js b/src/UmbracoUrlHandling/Umbraco/lib/angular/1.1.5/angular-loader.min.js new file mode 100644 index 0000000..0c262d4 --- /dev/null +++ b/src/UmbracoUrlHandling/Umbraco/lib/angular/1.1.5/angular-loader.min.js @@ -0,0 +1,7 @@ +/* + AngularJS v1.1.5 + (c) 2010-2012 Google, Inc. http://angularjs.org + License: MIT +*/ +(function(i){'use strict';function d(c,b,e){return c[b]||(c[b]=e())}return d(d(i,"angular",Object),"module",function(){var c={};return function(b,e,f){e&&c.hasOwnProperty(b)&&(c[b]=null);return d(c,b,function(){function a(a,b,d){return function(){c[d||"push"]([a,b,arguments]);return g}}if(!e)throw Error("No module: "+b);var c=[],d=[],h=a("$injector","invoke"),g={_invokeQueue:c,_runBlocks:d,requires:e,name:b,provider:a("$provide","provider"),factory:a("$provide","factory"),service:a("$provide","service"), +value:a("$provide","value"),constant:a("$provide","constant","unshift"),animation:a("$animationProvider","register"),filter:a("$filterProvider","register"),controller:a("$controllerProvider","register"),directive:a("$compileProvider","directive"),config:h,run:function(a){d.push(a);return this}};f&&h(f);return g})}})})(window); diff --git a/src/UmbracoUrlHandling/Umbraco/lib/angular/1.1.5/angular-mobile.js b/src/UmbracoUrlHandling/Umbraco/lib/angular/1.1.5/angular-mobile.js new file mode 100644 index 0000000..8cfb20c --- /dev/null +++ b/src/UmbracoUrlHandling/Umbraco/lib/angular/1.1.5/angular-mobile.js @@ -0,0 +1,462 @@ +/** + * @license AngularJS v1.1.5 + * (c) 2010-2012 Google, Inc. http://angularjs.org + * License: MIT + */ +(function(window, angular, undefined) { +'use strict'; + +/** + * @ngdoc overview + * @name ngMobile + * @description + * Touch events and other mobile helpers. + * Based on jQuery Mobile touch event handling (jquerymobile.com) + */ + +// define ngMobile module +var ngMobile = angular.module('ngMobile', []); + +/** + * @ngdoc directive + * @name ngMobile.directive:ngClick + * + * @description + * A more powerful replacement for the default ngClick designed to be used on touchscreen + * devices. Most mobile browsers wait about 300ms after a tap-and-release before sending + * the click event. This version handles them immediately, and then prevents the + * following click event from propagating. + * + * This directive can fall back to using an ordinary click event, and so works on desktop + * browsers as well as mobile. + * + * This directive also sets the CSS class `ng-click-active` while the element is being held + * down (by a mouse click or touch) so you can restyle the depressed element if you wish. + * + * @element ANY + * @param {expression} ngClick {@link guide/expression Expression} to evaluate + * upon tap. (Event object is available as `$event`) + * + * @example + + + + count: {{ count }} + + + */ + +ngMobile.config(['$provide', function($provide) { + $provide.decorator('ngClickDirective', ['$delegate', function($delegate) { + // drop the default ngClick directive + $delegate.shift(); + return $delegate; + }]); +}]); + +ngMobile.directive('ngClick', ['$parse', '$timeout', '$rootElement', + function($parse, $timeout, $rootElement) { + var TAP_DURATION = 750; // Shorter than 750ms is a tap, longer is a taphold or drag. + var MOVE_TOLERANCE = 12; // 12px seems to work in most mobile browsers. + var PREVENT_DURATION = 2500; // 2.5 seconds maximum from preventGhostClick call to click + var CLICKBUSTER_THRESHOLD = 25; // 25 pixels in any dimension is the limit for busting clicks. + + var ACTIVE_CLASS_NAME = 'ng-click-active'; + var lastPreventedTime; + var touchCoordinates; + + + // TAP EVENTS AND GHOST CLICKS + // + // Why tap events? + // Mobile browsers detect a tap, then wait a moment (usually ~300ms) to see if you're + // double-tapping, and then fire a click event. + // + // This delay sucks and makes mobile apps feel unresponsive. + // So we detect touchstart, touchmove, touchcancel and touchend ourselves and determine when + // the user has tapped on something. + // + // What happens when the browser then generates a click event? + // The browser, of course, also detects the tap and fires a click after a delay. This results in + // tapping/clicking twice. So we do "clickbusting" to prevent it. + // + // How does it work? + // We attach global touchstart and click handlers, that run during the capture (early) phase. + // So the sequence for a tap is: + // - global touchstart: Sets an "allowable region" at the point touched. + // - element's touchstart: Starts a touch + // (- touchmove or touchcancel ends the touch, no click follows) + // - element's touchend: Determines if the tap is valid (didn't move too far away, didn't hold + // too long) and fires the user's tap handler. The touchend also calls preventGhostClick(). + // - preventGhostClick() removes the allowable region the global touchstart created. + // - The browser generates a click event. + // - The global click handler catches the click, and checks whether it was in an allowable region. + // - If preventGhostClick was called, the region will have been removed, the click is busted. + // - If the region is still there, the click proceeds normally. Therefore clicks on links and + // other elements without ngTap on them work normally. + // + // This is an ugly, terrible hack! + // Yeah, tell me about it. The alternatives are using the slow click events, or making our users + // deal with the ghost clicks, so I consider this the least of evils. Fortunately Angular + // encapsulates this ugly logic away from the user. + // + // Why not just put click handlers on the element? + // We do that too, just to be sure. The problem is that the tap event might have caused the DOM + // to change, so that the click fires in the same position but something else is there now. So + // the handlers are global and care only about coordinates and not elements. + + // Checks if the coordinates are close enough to be within the region. + function hit(x1, y1, x2, y2) { + return Math.abs(x1 - x2) < CLICKBUSTER_THRESHOLD && Math.abs(y1 - y2) < CLICKBUSTER_THRESHOLD; + } + + // Checks a list of allowable regions against a click location. + // Returns true if the click should be allowed. + // Splices out the allowable region from the list after it has been used. + function checkAllowableRegions(touchCoordinates, x, y) { + for (var i = 0; i < touchCoordinates.length; i += 2) { + if (hit(touchCoordinates[i], touchCoordinates[i+1], x, y)) { + touchCoordinates.splice(i, i + 2); + return true; // allowable region + } + } + return false; // No allowable region; bust it. + } + + // Global click handler that prevents the click if it's in a bustable zone and preventGhostClick + // was called recently. + function onClick(event) { + if (Date.now() - lastPreventedTime > PREVENT_DURATION) { + return; // Too old. + } + + var touches = event.touches && event.touches.length ? event.touches : [event]; + var x = touches[0].clientX; + var y = touches[0].clientY; + // Work around desktop Webkit quirk where clicking a label will fire two clicks (on the label + // and on the input element). Depending on the exact browser, this second click we don't want + // to bust has either (0,0) or negative coordinates. + if (x < 1 && y < 1) { + return; // offscreen + } + + // Look for an allowable region containing this click. + // If we find one, that means it was created by touchstart and not removed by + // preventGhostClick, so we don't bust it. + if (checkAllowableRegions(touchCoordinates, x, y)) { + return; + } + + // If we didn't find an allowable region, bust the click. + event.stopPropagation(); + event.preventDefault(); + } + + + // Global touchstart handler that creates an allowable region for a click event. + // This allowable region can be removed by preventGhostClick if we want to bust it. + function onTouchStart(event) { + var touches = event.touches && event.touches.length ? event.touches : [event]; + var x = touches[0].clientX; + var y = touches[0].clientY; + touchCoordinates.push(x, y); + + $timeout(function() { + // Remove the allowable region. + for (var i = 0; i < touchCoordinates.length; i += 2) { + if (touchCoordinates[i] == x && touchCoordinates[i+1] == y) { + touchCoordinates.splice(i, i + 2); + return; + } + } + }, PREVENT_DURATION, false); + } + + // On the first call, attaches some event handlers. Then whenever it gets called, it creates a + // zone around the touchstart where clicks will get busted. + function preventGhostClick(x, y) { + if (!touchCoordinates) { + $rootElement[0].addEventListener('click', onClick, true); + $rootElement[0].addEventListener('touchstart', onTouchStart, true); + touchCoordinates = []; + } + + lastPreventedTime = Date.now(); + + checkAllowableRegions(touchCoordinates, x, y); + } + + // Actual linking function. + return function(scope, element, attr) { + var clickHandler = $parse(attr.ngClick), + tapping = false, + tapElement, // Used to blur the element after a tap. + startTime, // Used to check if the tap was held too long. + touchStartX, + touchStartY; + + function resetState() { + tapping = false; + element.removeClass(ACTIVE_CLASS_NAME); + } + + element.bind('touchstart', function(event) { + tapping = true; + tapElement = event.target ? event.target : event.srcElement; // IE uses srcElement. + // Hack for Safari, which can target text nodes instead of containers. + if(tapElement.nodeType == 3) { + tapElement = tapElement.parentNode; + } + + element.addClass(ACTIVE_CLASS_NAME); + + startTime = Date.now(); + + var touches = event.touches && event.touches.length ? event.touches : [event]; + var e = touches[0].originalEvent || touches[0]; + touchStartX = e.clientX; + touchStartY = e.clientY; + }); + + element.bind('touchmove', function(event) { + resetState(); + }); + + element.bind('touchcancel', function(event) { + resetState(); + }); + + element.bind('touchend', function(event) { + var diff = Date.now() - startTime; + + var touches = (event.changedTouches && event.changedTouches.length) ? event.changedTouches : + ((event.touches && event.touches.length) ? event.touches : [event]); + var e = touches[0].originalEvent || touches[0]; + var x = e.clientX; + var y = e.clientY; + var dist = Math.sqrt( Math.pow(x - touchStartX, 2) + Math.pow(y - touchStartY, 2) ); + + if (tapping && diff < TAP_DURATION && dist < MOVE_TOLERANCE) { + // Call preventGhostClick so the clickbuster will catch the corresponding click. + preventGhostClick(x, y); + + // Blur the focused element (the button, probably) before firing the callback. + // This doesn't work perfectly on Android Chrome, but seems to work elsewhere. + // I couldn't get anything to work reliably on Android Chrome. + if (tapElement) { + tapElement.blur(); + } + + scope.$apply(function() { + // TODO(braden): This is sending the touchend, not a tap or click. Is that kosher? + clickHandler(scope, {$event: event}); + }); + } + + resetState(); + }); + + // Hack for iOS Safari's benefit. It goes searching for onclick handlers and is liable to click + // something else nearby. + element.onclick = function(event) { }; + + // Fallback click handler. + // Busted clicks don't get this far, and adding this handler allows ng-tap to be used on + // desktop as well, to allow more portable sites. + element.bind('click', function(event) { + scope.$apply(function() { + clickHandler(scope, {$event: event}); + }); + }); + +/* + element.bind('mousedown', function(event) { + element.addClass(ACTIVE_CLASS_NAME); + }); + + element.bind('mousemove mouseup', function(event) { + element.removeClass(ACTIVE_CLASS_NAME); + }); +*/ + + }; +}]); + +/** + * @ngdoc directive + * @name ngMobile.directive:ngSwipeLeft + * + * @description + * Specify custom behavior when an element is swiped to the left on a touchscreen device. + * A leftward swipe is a quick, right-to-left slide of the finger. + * Though ngSwipeLeft is designed for touch-based devices, it will work with a mouse click and drag too. + * + * @element ANY + * @param {expression} ngSwipeLeft {@link guide/expression Expression} to evaluate + * upon left swipe. (Event object is available as `$event`) + * + * @example + + +
    + Some list content, like an email in the inbox +
    +
    + + +
    +
    +
    + */ + +/** + * @ngdoc directive + * @name ngMobile.directive:ngSwipeRight + * + * @description + * Specify custom behavior when an element is swiped to the right on a touchscreen device. + * A rightward swipe is a quick, left-to-right slide of the finger. + * Though ngSwipeRight is designed for touch-based devices, it will work with a mouse click and drag too. + * + * @element ANY + * @param {expression} ngSwipeRight {@link guide/expression Expression} to evaluate + * upon right swipe. (Event object is available as `$event`) + * + * @example + + +
    + Some list content, like an email in the inbox +
    +
    + + +
    +
    +
    + */ + +function makeSwipeDirective(directiveName, direction) { + ngMobile.directive(directiveName, ['$parse', function($parse) { + // The maximum vertical delta for a swipe should be less than 75px. + var MAX_VERTICAL_DISTANCE = 75; + // Vertical distance should not be more than a fraction of the horizontal distance. + var MAX_VERTICAL_RATIO = 0.3; + // At least a 30px lateral motion is necessary for a swipe. + var MIN_HORIZONTAL_DISTANCE = 30; + // The total distance in any direction before we make the call on swipe vs. scroll. + var MOVE_BUFFER_RADIUS = 10; + + function getCoordinates(event) { + var touches = event.touches && event.touches.length ? event.touches : [event]; + var e = (event.changedTouches && event.changedTouches[0]) || + (event.originalEvent && event.originalEvent.changedTouches && + event.originalEvent.changedTouches[0]) || + touches[0].originalEvent || touches[0]; + + return { + x: e.clientX, + y: e.clientY + }; + } + + return function(scope, element, attr) { + var swipeHandler = $parse(attr[directiveName]); + var startCoords, valid; + var totalX, totalY; + var lastX, lastY; + + function validSwipe(event) { + // Check that it's within the coordinates. + // Absolute vertical distance must be within tolerances. + // Horizontal distance, we take the current X - the starting X. + // This is negative for leftward swipes and positive for rightward swipes. + // After multiplying by the direction (-1 for left, +1 for right), legal swipes + // (ie. same direction as the directive wants) will have a positive delta and + // illegal ones a negative delta. + // Therefore this delta must be positive, and larger than the minimum. + if (!startCoords) return false; + var coords = getCoordinates(event); + var deltaY = Math.abs(coords.y - startCoords.y); + var deltaX = (coords.x - startCoords.x) * direction; + return valid && // Short circuit for already-invalidated swipes. + deltaY < MAX_VERTICAL_DISTANCE && + deltaX > 0 && + deltaX > MIN_HORIZONTAL_DISTANCE && + deltaY / deltaX < MAX_VERTICAL_RATIO; + } + + element.bind('touchstart mousedown', function(event) { + startCoords = getCoordinates(event); + valid = true; + totalX = 0; + totalY = 0; + lastX = startCoords.x; + lastY = startCoords.y; + }); + + element.bind('touchcancel', function(event) { + valid = false; + }); + + element.bind('touchmove mousemove', function(event) { + if (!valid) return; + + // Android will send a touchcancel if it thinks we're starting to scroll. + // So when the total distance (+ or - or both) exceeds 10px in either direction, + // we either: + // - On totalX > totalY, we send preventDefault() and treat this as a swipe. + // - On totalY > totalX, we let the browser handle it as a scroll. + + // Invalidate a touch while it's in progress if it strays too far away vertically. + // We don't want a scroll down and back up while drifting sideways to be a swipe just + // because you happened to end up vertically close in the end. + if (!startCoords) return; + var coords = getCoordinates(event); + + if (Math.abs(coords.y - startCoords.y) > MAX_VERTICAL_DISTANCE) { + valid = false; + return; + } + + totalX += Math.abs(coords.x - lastX); + totalY += Math.abs(coords.y - lastY); + + lastX = coords.x; + lastY = coords.y; + + if (totalX < MOVE_BUFFER_RADIUS && totalY < MOVE_BUFFER_RADIUS) { + return; + } + + // One of totalX or totalY has exceeded the buffer, so decide on swipe vs. scroll. + if (totalY > totalX) { + valid = false; + return; + } else { + event.preventDefault(); + } + }); + + element.bind('touchend mouseup', function(event) { + if (validSwipe(event)) { + // Prevent this swipe from bubbling up to any other elements with ngSwipes. + event.stopPropagation(); + scope.$apply(function() { + swipeHandler(scope, {$event:event}); + }); + } + }); + }; + }]); +} + +// Left is negative X-coordinate, right is positive. +makeSwipeDirective('ngSwipeLeft', -1); +makeSwipeDirective('ngSwipeRight', 1); + + + +})(window, window.angular); diff --git a/src/UmbracoUrlHandling/Umbraco/lib/angular/1.1.5/angular-mobile.min.js b/src/UmbracoUrlHandling/Umbraco/lib/angular/1.1.5/angular-mobile.min.js new file mode 100644 index 0000000..bc777ea --- /dev/null +++ b/src/UmbracoUrlHandling/Umbraco/lib/angular/1.1.5/angular-mobile.min.js @@ -0,0 +1,11 @@ +/* + AngularJS v1.1.5 + (c) 2010-2012 Google, Inc. http://angularjs.org + License: MIT +*/ +(function(u,s){'use strict';function k(i,t){j.directive(i,["$parse",function(l){function g(b){var h=b.touches&&b.touches.length?b.touches:[b],b=b.changedTouches&&b.changedTouches[0]||b.originalEvent&&b.originalEvent.changedTouches&&b.originalEvent.changedTouches[0]||h[0].originalEvent||h[0];return{x:b.clientX,y:b.clientY}}var m=75,j=0.3,p=30;return function(b,h,n){function o(e){if(!a)return!1;var b=g(e),e=Math.abs(b.y-a.y),b=(b.x-a.x)*t;return c&&e0&&b>p&&e/bm?c=!1:(f+=Math.abs(d.x-q),e+=Math.abs(d.y-r),q=d.x,r=d.y,f<10&&e<10||(e>f?c=!1:b.preventDefault()))}});h.bind("touchend mouseup",function(a){o(a)&&(a.stopPropagation(),b.$apply(function(){d(b,{$event:a})}))})}}])}var j=s.module("ngMobile",[]);j.config(["$provide",function(i){i.decorator("ngClickDirective",["$delegate",function(i){i.shift(); +return i}])}]);j.directive("ngClick",["$parse","$timeout","$rootElement",function(i,j,l){function g(a,c,b){for(var e=0;eb)){var c=a.touches&&a.touches.length?a.touches:[a],f=c[0].clientX,c=c[0].clientY;!(f<1&&c<1)&&!g(d,f,c)&&(a.stopPropagation(),a.preventDefault())}}function k(a){var a=a.touches&&a.touches.length?a.touches:[a],c=a[0].clientX,f=a[0].clientY;d.push(c,f);j(function(){for(var a= +0;a + * describe('$exceptionHandlerProvider', function() { + * + * it('should capture log messages and exceptions', function() { + * + * module(function($exceptionHandlerProvider) { + * $exceptionHandlerProvider.mode('log'); + * }); + * + * inject(function($log, $exceptionHandler, $timeout) { + * $timeout(function() { $log.log(1); }); + * $timeout(function() { $log.log(2); throw 'banana peel'; }); + * $timeout(function() { $log.log(3); }); + * expect($exceptionHandler.errors).toEqual([]); + * expect($log.assertEmpty()); + * $timeout.flush(); + * expect($exceptionHandler.errors).toEqual(['banana peel']); + * expect($log.log.logs).toEqual([[1], [2], [3]]); + * }); + * }); + * }); + * + */ + +angular.mock.$ExceptionHandlerProvider = function() { + var handler; + + /** + * @ngdoc method + * @name ngMock.$exceptionHandlerProvider#mode + * @methodOf ngMock.$exceptionHandlerProvider + * + * @description + * Sets the logging mode. + * + * @param {string} mode Mode of operation, defaults to `rethrow`. + * + * - `rethrow`: If any errors are passed into the handler in tests, it typically + * means that there is a bug in the application or test, so this mock will + * make these tests fail. + * - `log`: Sometimes it is desirable to test that an error is thrown, for this case the `log` mode stores an + * array of errors in `$exceptionHandler.errors`, to allow later assertion of them. + * See {@link ngMock.$log#assertEmpty assertEmpty()} and + * {@link ngMock.$log#reset reset()} + */ + this.mode = function(mode) { + switch(mode) { + case 'rethrow': + handler = function(e) { + throw e; + }; + break; + case 'log': + var errors = []; + + handler = function(e) { + if (arguments.length == 1) { + errors.push(e); + } else { + errors.push([].slice.call(arguments, 0)); + } + }; + + handler.errors = errors; + break; + default: + throw Error("Unknown mode '" + mode + "', only 'log'/'rethrow' modes are allowed!"); + } + }; + + this.$get = function() { + return handler; + }; + + this.mode('rethrow'); +}; + + +/** + * @ngdoc service + * @name ngMock.$log + * + * @description + * Mock implementation of {@link ng.$log} that gathers all logged messages in arrays + * (one array per logging level). These arrays are exposed as `logs` property of each of the + * level-specific log function, e.g. for level `error` the array is exposed as `$log.error.logs`. + * + */ +angular.mock.$LogProvider = function() { + + function concat(array1, array2, index) { + return array1.concat(Array.prototype.slice.call(array2, index)); + } + + + this.$get = function () { + var $log = { + log: function() { $log.log.logs.push(concat([], arguments, 0)); }, + warn: function() { $log.warn.logs.push(concat([], arguments, 0)); }, + info: function() { $log.info.logs.push(concat([], arguments, 0)); }, + error: function() { $log.error.logs.push(concat([], arguments, 0)); } + }; + + /** + * @ngdoc method + * @name ngMock.$log#reset + * @methodOf ngMock.$log + * + * @description + * Reset all of the logging arrays to empty. + */ + $log.reset = function () { + /** + * @ngdoc property + * @name ngMock.$log#log.logs + * @propertyOf ngMock.$log + * + * @description + * Array of messages logged using {@link ngMock.$log#log}. + * + * @example + *
    +       * $log.log('Some Log');
    +       * var first = $log.log.logs.unshift();
    +       * 
    + */ + $log.log.logs = []; + /** + * @ngdoc property + * @name ngMock.$log#warn.logs + * @propertyOf ngMock.$log + * + * @description + * Array of messages logged using {@link ngMock.$log#warn}. + * + * @example + *
    +       * $log.warn('Some Warning');
    +       * var first = $log.warn.logs.unshift();
    +       * 
    + */ + $log.warn.logs = []; + /** + * @ngdoc property + * @name ngMock.$log#info.logs + * @propertyOf ngMock.$log + * + * @description + * Array of messages logged using {@link ngMock.$log#info}. + * + * @example + *
    +       * $log.info('Some Info');
    +       * var first = $log.info.logs.unshift();
    +       * 
    + */ + $log.info.logs = []; + /** + * @ngdoc property + * @name ngMock.$log#error.logs + * @propertyOf ngMock.$log + * + * @description + * Array of messages logged using {@link ngMock.$log#error}. + * + * @example + *
    +       * $log.log('Some Error');
    +       * var first = $log.error.logs.unshift();
    +       * 
    + */ + $log.error.logs = []; + }; + + /** + * @ngdoc method + * @name ngMock.$log#assertEmpty + * @methodOf ngMock.$log + * + * @description + * Assert that the all of the logging methods have no logged messages. If messages present, an exception is thrown. + */ + $log.assertEmpty = function() { + var errors = []; + angular.forEach(['error', 'warn', 'info', 'log'], function(logLevel) { + angular.forEach($log[logLevel].logs, function(log) { + angular.forEach(log, function (logItem) { + errors.push('MOCK $log (' + logLevel + '): ' + String(logItem) + '\n' + (logItem.stack || '')); + }); + }); + }); + if (errors.length) { + errors.unshift("Expected $log to be empty! Either a message was logged unexpectedly, or an expected " + + "log message was not checked and removed:"); + errors.push(''); + throw new Error(errors.join('\n---------\n')); + } + }; + + $log.reset(); + return $log; + }; +}; + + +(function() { + var R_ISO8061_STR = /^(\d{4})-?(\d\d)-?(\d\d)(?:T(\d\d)(?:\:?(\d\d)(?:\:?(\d\d)(?:\.(\d{3}))?)?)?(Z|([+-])(\d\d):?(\d\d)))?$/; + + function jsonStringToDate(string){ + var match; + if (match = string.match(R_ISO8061_STR)) { + var date = new Date(0), + tzHour = 0, + tzMin = 0; + if (match[9]) { + tzHour = int(match[9] + match[10]); + tzMin = int(match[9] + match[11]); + } + date.setUTCFullYear(int(match[1]), int(match[2]) - 1, int(match[3])); + date.setUTCHours(int(match[4]||0) - tzHour, int(match[5]||0) - tzMin, int(match[6]||0), int(match[7]||0)); + return date; + } + return string; + } + + function int(str) { + return parseInt(str, 10); + } + + function padNumber(num, digits, trim) { + var neg = ''; + if (num < 0) { + neg = '-'; + num = -num; + } + num = '' + num; + while(num.length < digits) num = '0' + num; + if (trim) + num = num.substr(num.length - digits); + return neg + num; + } + + + /** + * @ngdoc object + * @name angular.mock.TzDate + * @description + * + * *NOTE*: this is not an injectable instance, just a globally available mock class of `Date`. + * + * Mock of the Date type which has its timezone specified via constructor arg. + * + * The main purpose is to create Date-like instances with timezone fixed to the specified timezone + * offset, so that we can test code that depends on local timezone settings without dependency on + * the time zone settings of the machine where the code is running. + * + * @param {number} offset Offset of the *desired* timezone in hours (fractions will be honored) + * @param {(number|string)} timestamp Timestamp representing the desired time in *UTC* + * + * @example + * !!!! WARNING !!!!! + * This is not a complete Date object so only methods that were implemented can be called safely. + * To make matters worse, TzDate instances inherit stuff from Date via a prototype. + * + * We do our best to intercept calls to "unimplemented" methods, but since the list of methods is + * incomplete we might be missing some non-standard methods. This can result in errors like: + * "Date.prototype.foo called on incompatible Object". + * + *
    +   * var newYearInBratislava = new TzDate(-1, '2009-12-31T23:00:00Z');
    +   * newYearInBratislava.getTimezoneOffset() => -60;
    +   * newYearInBratislava.getFullYear() => 2010;
    +   * newYearInBratislava.getMonth() => 0;
    +   * newYearInBratislava.getDate() => 1;
    +   * newYearInBratislava.getHours() => 0;
    +   * newYearInBratislava.getMinutes() => 0;
    +   * newYearInBratislava.getSeconds() => 0;
    +   * 
    + * + */ + angular.mock.TzDate = function (offset, timestamp) { + var self = new Date(0); + if (angular.isString(timestamp)) { + var tsStr = timestamp; + + self.origDate = jsonStringToDate(timestamp); + + timestamp = self.origDate.getTime(); + if (isNaN(timestamp)) + throw { + name: "Illegal Argument", + message: "Arg '" + tsStr + "' passed into TzDate constructor is not a valid date string" + }; + } else { + self.origDate = new Date(timestamp); + } + + var localOffset = new Date(timestamp).getTimezoneOffset(); + self.offsetDiff = localOffset*60*1000 - offset*1000*60*60; + self.date = new Date(timestamp + self.offsetDiff); + + self.getTime = function() { + return self.date.getTime() - self.offsetDiff; + }; + + self.toLocaleDateString = function() { + return self.date.toLocaleDateString(); + }; + + self.getFullYear = function() { + return self.date.getFullYear(); + }; + + self.getMonth = function() { + return self.date.getMonth(); + }; + + self.getDate = function() { + return self.date.getDate(); + }; + + self.getHours = function() { + return self.date.getHours(); + }; + + self.getMinutes = function() { + return self.date.getMinutes(); + }; + + self.getSeconds = function() { + return self.date.getSeconds(); + }; + + self.getMilliseconds = function() { + return self.date.getMilliseconds(); + }; + + self.getTimezoneOffset = function() { + return offset * 60; + }; + + self.getUTCFullYear = function() { + return self.origDate.getUTCFullYear(); + }; + + self.getUTCMonth = function() { + return self.origDate.getUTCMonth(); + }; + + self.getUTCDate = function() { + return self.origDate.getUTCDate(); + }; + + self.getUTCHours = function() { + return self.origDate.getUTCHours(); + }; + + self.getUTCMinutes = function() { + return self.origDate.getUTCMinutes(); + }; + + self.getUTCSeconds = function() { + return self.origDate.getUTCSeconds(); + }; + + self.getUTCMilliseconds = function() { + return self.origDate.getUTCMilliseconds(); + }; + + self.getDay = function() { + return self.date.getDay(); + }; + + // provide this method only on browsers that already have it + if (self.toISOString) { + self.toISOString = function() { + return padNumber(self.origDate.getUTCFullYear(), 4) + '-' + + padNumber(self.origDate.getUTCMonth() + 1, 2) + '-' + + padNumber(self.origDate.getUTCDate(), 2) + 'T' + + padNumber(self.origDate.getUTCHours(), 2) + ':' + + padNumber(self.origDate.getUTCMinutes(), 2) + ':' + + padNumber(self.origDate.getUTCSeconds(), 2) + '.' + + padNumber(self.origDate.getUTCMilliseconds(), 3) + 'Z' + } + } + + //hide all methods not implemented in this mock that the Date prototype exposes + var unimplementedMethods = ['getUTCDay', + 'getYear', 'setDate', 'setFullYear', 'setHours', 'setMilliseconds', + 'setMinutes', 'setMonth', 'setSeconds', 'setTime', 'setUTCDate', 'setUTCFullYear', + 'setUTCHours', 'setUTCMilliseconds', 'setUTCMinutes', 'setUTCMonth', 'setUTCSeconds', + 'setYear', 'toDateString', 'toGMTString', 'toJSON', 'toLocaleFormat', 'toLocaleString', + 'toLocaleTimeString', 'toSource', 'toString', 'toTimeString', 'toUTCString', 'valueOf']; + + angular.forEach(unimplementedMethods, function(methodName) { + self[methodName] = function() { + throw Error("Method '" + methodName + "' is not implemented in the TzDate mock"); + }; + }); + + return self; + }; + + //make "tzDateInstance instanceof Date" return true + angular.mock.TzDate.prototype = Date.prototype; +})(); + +/** + * @ngdoc function + * @name angular.mock.createMockWindow + * @description + * + * This function creates a mock window object useful for controlling access ot setTimeout, but mocking out + * sufficient window's properties to allow Angular to execute. + * + * @example + * + *
    +    beforeEach(module(function($provide) {
    +      $provide.value('$window', window = angular.mock.createMockWindow());
    +    }));
    +
    +    it('should do something', inject(function($window) {
    +      var val = null;
    +      $window.setTimeout(function() { val = 123; }, 10);
    +      expect(val).toEqual(null);
    +      window.setTimeout.expect(10).process();
    +      expect(val).toEqual(123);
    +    });
    + * 
    + * + */ +angular.mock.createMockWindow = function() { + var mockWindow = {}; + var setTimeoutQueue = []; + + mockWindow.document = window.document; + mockWindow.getComputedStyle = angular.bind(window, window.getComputedStyle); + mockWindow.scrollTo = angular.bind(window, window.scrollTo); + mockWindow.navigator = window.navigator; + mockWindow.setTimeout = function(fn, delay) { + setTimeoutQueue.push({fn: fn, delay: delay}); + }; + mockWindow.setTimeout.queue = setTimeoutQueue; + mockWindow.setTimeout.expect = function(delay) { + if (setTimeoutQueue.length > 0) { + return { + process: function() { + var tick = setTimeoutQueue.shift(); + expect(tick.delay).toEqual(delay); + tick.fn(); + } + }; + } else { + expect('SetTimoutQueue empty. Expecting delay of ').toEqual(delay); + } + }; + + return mockWindow; +}; + +/** + * @ngdoc function + * @name angular.mock.dump + * @description + * + * *NOTE*: this is not an injectable instance, just a globally available function. + * + * Method for serializing common angular objects (scope, elements, etc..) into strings, useful for debugging. + * + * This method is also available on window, where it can be used to display objects on debug console. + * + * @param {*} object - any object to turn into string. + * @return {string} a serialized string of the argument + */ +angular.mock.dump = function(object) { + return serialize(object); + + function serialize(object) { + var out; + + if (angular.isElement(object)) { + object = angular.element(object); + out = angular.element('
    '); + angular.forEach(object, function(element) { + out.append(angular.element(element).clone()); + }); + out = out.html(); + } else if (angular.isArray(object)) { + out = []; + angular.forEach(object, function(o) { + out.push(serialize(o)); + }); + out = '[ ' + out.join(', ') + ' ]'; + } else if (angular.isObject(object)) { + if (angular.isFunction(object.$eval) && angular.isFunction(object.$apply)) { + out = serializeScope(object); + } else if (object instanceof Error) { + out = object.stack || ('' + object.name + ': ' + object.message); + } else { + out = angular.toJson(object, true); + } + } else { + out = String(object); + } + + return out; + } + + function serializeScope(scope, offset) { + offset = offset || ' '; + var log = [offset + 'Scope(' + scope.$id + '): {']; + for ( var key in scope ) { + if (scope.hasOwnProperty(key) && !key.match(/^(\$|this)/)) { + log.push(' ' + key + ': ' + angular.toJson(scope[key])); + } + } + var child = scope.$$childHead; + while(child) { + log.push(serializeScope(child, offset + ' ')); + child = child.$$nextSibling; + } + log.push('}'); + return log.join('\n' + offset); + } +}; + +/** + * @ngdoc object + * @name ngMock.$httpBackend + * @description + * Fake HTTP backend implementation suitable for unit testing applications that use the + * {@link ng.$http $http service}. + * + * *Note*: For fake HTTP backend implementation suitable for end-to-end testing or backend-less + * development please see {@link ngMockE2E.$httpBackend e2e $httpBackend mock}. + * + * During unit testing, we want our unit tests to run quickly and have no external dependencies so + * we don’t want to send {@link https://developer.mozilla.org/en/xmlhttprequest XHR} or + * {@link http://en.wikipedia.org/wiki/JSONP JSONP} requests to a real server. All we really need is + * to verify whether a certain request has been sent or not, or alternatively just let the + * application make requests, respond with pre-trained responses and assert that the end result is + * what we expect it to be. + * + * This mock implementation can be used to respond with static or dynamic responses via the + * `expect` and `when` apis and their shortcuts (`expectGET`, `whenPOST`, etc). + * + * When an Angular application needs some data from a server, it calls the $http service, which + * sends the request to a real server using $httpBackend service. With dependency injection, it is + * easy to inject $httpBackend mock (which has the same API as $httpBackend) and use it to verify + * the requests and respond with some testing data without sending a request to real server. + * + * There are two ways to specify what test data should be returned as http responses by the mock + * backend when the code under test makes http requests: + * + * - `$httpBackend.expect` - specifies a request expectation + * - `$httpBackend.when` - specifies a backend definition + * + * + * # Request Expectations vs Backend Definitions + * + * Request expectations provide a way to make assertions about requests made by the application and + * to define responses for those requests. The test will fail if the expected requests are not made + * or they are made in the wrong order. + * + * Backend definitions allow you to define a fake backend for your application which doesn't assert + * if a particular request was made or not, it just returns a trained response if a request is made. + * The test will pass whether or not the request gets made during testing. + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + *
    Request expectationsBackend definitions
    Syntax.expect(...).respond(...).when(...).respond(...)
    Typical usagestrict unit testsloose (black-box) unit testing
    Fulfills multiple requestsNOYES
    Order of requests mattersYESNO
    Request requiredYESNO
    Response requiredoptional (see below)YES
    + * + * In cases where both backend definitions and request expectations are specified during unit + * testing, the request expectations are evaluated first. + * + * If a request expectation has no response specified, the algorithm will search your backend + * definitions for an appropriate response. + * + * If a request didn't match any expectation or if the expectation doesn't have the response + * defined, the backend definitions are evaluated in sequential order to see if any of them match + * the request. The response from the first matched definition is returned. + * + * + * # Flushing HTTP requests + * + * The $httpBackend used in production, always responds to requests with responses asynchronously. + * If we preserved this behavior in unit testing, we'd have to create async unit tests, which are + * hard to write, follow and maintain. At the same time the testing mock, can't respond + * synchronously because that would change the execution of the code under test. For this reason the + * mock $httpBackend has a `flush()` method, which allows the test to explicitly flush pending + * requests and thus preserving the async api of the backend, while allowing the test to execute + * synchronously. + * + * + * # Unit testing with mock $httpBackend + * + *
    +   // controller
    +   function MyController($scope, $http) {
    +     $http.get('/auth.py').success(function(data) {
    +       $scope.user = data;
    +     });
    +
    +     this.saveMessage = function(message) {
    +       $scope.status = 'Saving...';
    +       $http.post('/add-msg.py', message).success(function(response) {
    +         $scope.status = '';
    +       }).error(function() {
    +         $scope.status = 'ERROR!';
    +       });
    +     };
    +   }
    +
    +   // testing controller
    +   var $httpBackend;
    +
    +   beforeEach(inject(function($injector) {
    +     $httpBackend = $injector.get('$httpBackend');
    +
    +     // backend definition common for all tests
    +     $httpBackend.when('GET', '/auth.py').respond({userId: 'userX'}, {'A-Token': 'xxx'});
    +   }));
    +
    +
    +   afterEach(function() {
    +     $httpBackend.verifyNoOutstandingExpectation();
    +     $httpBackend.verifyNoOutstandingRequest();
    +   });
    +
    +
    +   it('should fetch authentication token', function() {
    +     $httpBackend.expectGET('/auth.py');
    +     var controller = scope.$new(MyController);
    +     $httpBackend.flush();
    +   });
    +
    +
    +   it('should send msg to server', function() {
    +     // now you don’t care about the authentication, but
    +     // the controller will still send the request and
    +     // $httpBackend will respond without you having to
    +     // specify the expectation and response for this request
    +     $httpBackend.expectPOST('/add-msg.py', 'message content').respond(201, '');
    +
    +     var controller = scope.$new(MyController);
    +     $httpBackend.flush();
    +     controller.saveMessage('message content');
    +     expect(controller.status).toBe('Saving...');
    +     $httpBackend.flush();
    +     expect(controller.status).toBe('');
    +   });
    +
    +
    +   it('should send auth header', function() {
    +     $httpBackend.expectPOST('/add-msg.py', undefined, function(headers) {
    +       // check if the header was send, if it wasn't the expectation won't
    +       // match the request and the test will fail
    +       return headers['Authorization'] == 'xxx';
    +     }).respond(201, '');
    +
    +     var controller = scope.$new(MyController);
    +     controller.saveMessage('whatever');
    +     $httpBackend.flush();
    +   });
    +   
    + */ +angular.mock.$HttpBackendProvider = function() { + this.$get = ['$rootScope', createHttpBackendMock]; +}; + +/** + * General factory function for $httpBackend mock. + * Returns instance for unit testing (when no arguments specified): + * - passing through is disabled + * - auto flushing is disabled + * + * Returns instance for e2e testing (when `$delegate` and `$browser` specified): + * - passing through (delegating request to real backend) is enabled + * - auto flushing is enabled + * + * @param {Object=} $delegate Real $httpBackend instance (allow passing through if specified) + * @param {Object=} $browser Auto-flushing enabled if specified + * @return {Object} Instance of $httpBackend mock + */ +function createHttpBackendMock($rootScope, $delegate, $browser) { + var definitions = [], + expectations = [], + responses = [], + responsesPush = angular.bind(responses, responses.push); + + function createResponse(status, data, headers) { + if (angular.isFunction(status)) return status; + + return function() { + return angular.isNumber(status) + ? [status, data, headers] + : [200, status, data]; + }; + } + + // TODO(vojta): change params to: method, url, data, headers, callback + function $httpBackend(method, url, data, callback, headers, timeout) { + var xhr = new MockXhr(), + expectation = expectations[0], + wasExpected = false; + + function prettyPrint(data) { + return (angular.isString(data) || angular.isFunction(data) || data instanceof RegExp) + ? data + : angular.toJson(data); + } + + function wrapResponse(wrapped) { + if (!$browser && timeout && timeout.then) timeout.then(handleTimeout); + + return handleResponse; + + function handleResponse() { + var response = wrapped.response(method, url, data, headers); + xhr.$$respHeaders = response[2]; + callback(response[0], response[1], xhr.getAllResponseHeaders()); + } + + function handleTimeout() { + for (var i = 0, ii = responses.length; i < ii; i++) { + if (responses[i] === handleResponse) { + responses.splice(i, 1); + callback(-1, undefined, ''); + break; + } + } + } + } + + if (expectation && expectation.match(method, url)) { + if (!expectation.matchData(data)) + throw Error('Expected ' + expectation + ' with different data\n' + + 'EXPECTED: ' + prettyPrint(expectation.data) + '\nGOT: ' + data); + + if (!expectation.matchHeaders(headers)) + throw Error('Expected ' + expectation + ' with different headers\n' + + 'EXPECTED: ' + prettyPrint(expectation.headers) + '\nGOT: ' + + prettyPrint(headers)); + + expectations.shift(); + + if (expectation.response) { + responses.push(wrapResponse(expectation)); + return; + } + wasExpected = true; + } + + var i = -1, definition; + while ((definition = definitions[++i])) { + if (definition.match(method, url, data, headers || {})) { + if (definition.response) { + // if $browser specified, we do auto flush all requests + ($browser ? $browser.defer : responsesPush)(wrapResponse(definition)); + } else if (definition.passThrough) { + $delegate(method, url, data, callback, headers, timeout); + } else throw Error('No response defined !'); + return; + } + } + throw wasExpected ? + Error('No response defined !') : + Error('Unexpected request: ' + method + ' ' + url + '\n' + + (expectation ? 'Expected ' + expectation : 'No more request expected')); + } + + /** + * @ngdoc method + * @name ngMock.$httpBackend#when + * @methodOf ngMock.$httpBackend + * @description + * Creates a new backend definition. + * + * @param {string} method HTTP method. + * @param {string|RegExp} url HTTP url. + * @param {(string|RegExp)=} data HTTP request body. + * @param {(Object|function(Object))=} headers HTTP headers or function that receives http header + * object and returns true if the headers match the current definition. + * @returns {requestHandler} Returns an object with `respond` method that control how a matched + * request is handled. + * + * - respond – `{function([status,] data[, headers])|function(function(method, url, data, headers)}` + * – The respond method takes a set of static data to be returned or a function that can return + * an array containing response status (number), response data (string) and response headers + * (Object). + */ + $httpBackend.when = function(method, url, data, headers) { + var definition = new MockHttpExpectation(method, url, data, headers), + chain = { + respond: function(status, data, headers) { + definition.response = createResponse(status, data, headers); + } + }; + + if ($browser) { + chain.passThrough = function() { + definition.passThrough = true; + }; + } + + definitions.push(definition); + return chain; + }; + + /** + * @ngdoc method + * @name ngMock.$httpBackend#whenGET + * @methodOf ngMock.$httpBackend + * @description + * Creates a new backend definition for GET requests. For more info see `when()`. + * + * @param {string|RegExp} url HTTP url. + * @param {(Object|function(Object))=} headers HTTP headers. + * @returns {requestHandler} Returns an object with `respond` method that control how a matched + * request is handled. + */ + + /** + * @ngdoc method + * @name ngMock.$httpBackend#whenHEAD + * @methodOf ngMock.$httpBackend + * @description + * Creates a new backend definition for HEAD requests. For more info see `when()`. + * + * @param {string|RegExp} url HTTP url. + * @param {(Object|function(Object))=} headers HTTP headers. + * @returns {requestHandler} Returns an object with `respond` method that control how a matched + * request is handled. + */ + + /** + * @ngdoc method + * @name ngMock.$httpBackend#whenDELETE + * @methodOf ngMock.$httpBackend + * @description + * Creates a new backend definition for DELETE requests. For more info see `when()`. + * + * @param {string|RegExp} url HTTP url. + * @param {(Object|function(Object))=} headers HTTP headers. + * @returns {requestHandler} Returns an object with `respond` method that control how a matched + * request is handled. + */ + + /** + * @ngdoc method + * @name ngMock.$httpBackend#whenPOST + * @methodOf ngMock.$httpBackend + * @description + * Creates a new backend definition for POST requests. For more info see `when()`. + * + * @param {string|RegExp} url HTTP url. + * @param {(string|RegExp)=} data HTTP request body. + * @param {(Object|function(Object))=} headers HTTP headers. + * @returns {requestHandler} Returns an object with `respond` method that control how a matched + * request is handled. + */ + + /** + * @ngdoc method + * @name ngMock.$httpBackend#whenPUT + * @methodOf ngMock.$httpBackend + * @description + * Creates a new backend definition for PUT requests. For more info see `when()`. + * + * @param {string|RegExp} url HTTP url. + * @param {(string|RegExp)=} data HTTP request body. + * @param {(Object|function(Object))=} headers HTTP headers. + * @returns {requestHandler} Returns an object with `respond` method that control how a matched + * request is handled. + */ + + /** + * @ngdoc method + * @name ngMock.$httpBackend#whenJSONP + * @methodOf ngMock.$httpBackend + * @description + * Creates a new backend definition for JSONP requests. For more info see `when()`. + * + * @param {string|RegExp} url HTTP url. + * @returns {requestHandler} Returns an object with `respond` method that control how a matched + * request is handled. + */ + createShortMethods('when'); + + + /** + * @ngdoc method + * @name ngMock.$httpBackend#expect + * @methodOf ngMock.$httpBackend + * @description + * Creates a new request expectation. + * + * @param {string} method HTTP method. + * @param {string|RegExp} url HTTP url. + * @param {(string|RegExp)=} data HTTP request body. + * @param {(Object|function(Object))=} headers HTTP headers or function that receives http header + * object and returns true if the headers match the current expectation. + * @returns {requestHandler} Returns an object with `respond` method that control how a matched + * request is handled. + * + * - respond – `{function([status,] data[, headers])|function(function(method, url, data, headers)}` + * – The respond method takes a set of static data to be returned or a function that can return + * an array containing response status (number), response data (string) and response headers + * (Object). + */ + $httpBackend.expect = function(method, url, data, headers) { + var expectation = new MockHttpExpectation(method, url, data, headers); + expectations.push(expectation); + return { + respond: function(status, data, headers) { + expectation.response = createResponse(status, data, headers); + } + }; + }; + + + /** + * @ngdoc method + * @name ngMock.$httpBackend#expectGET + * @methodOf ngMock.$httpBackend + * @description + * Creates a new request expectation for GET requests. For more info see `expect()`. + * + * @param {string|RegExp} url HTTP url. + * @param {Object=} headers HTTP headers. + * @returns {requestHandler} Returns an object with `respond` method that control how a matched + * request is handled. See #expect for more info. + */ + + /** + * @ngdoc method + * @name ngMock.$httpBackend#expectHEAD + * @methodOf ngMock.$httpBackend + * @description + * Creates a new request expectation for HEAD requests. For more info see `expect()`. + * + * @param {string|RegExp} url HTTP url. + * @param {Object=} headers HTTP headers. + * @returns {requestHandler} Returns an object with `respond` method that control how a matched + * request is handled. + */ + + /** + * @ngdoc method + * @name ngMock.$httpBackend#expectDELETE + * @methodOf ngMock.$httpBackend + * @description + * Creates a new request expectation for DELETE requests. For more info see `expect()`. + * + * @param {string|RegExp} url HTTP url. + * @param {Object=} headers HTTP headers. + * @returns {requestHandler} Returns an object with `respond` method that control how a matched + * request is handled. + */ + + /** + * @ngdoc method + * @name ngMock.$httpBackend#expectPOST + * @methodOf ngMock.$httpBackend + * @description + * Creates a new request expectation for POST requests. For more info see `expect()`. + * + * @param {string|RegExp} url HTTP url. + * @param {(string|RegExp)=} data HTTP request body. + * @param {Object=} headers HTTP headers. + * @returns {requestHandler} Returns an object with `respond` method that control how a matched + * request is handled. + */ + + /** + * @ngdoc method + * @name ngMock.$httpBackend#expectPUT + * @methodOf ngMock.$httpBackend + * @description + * Creates a new request expectation for PUT requests. For more info see `expect()`. + * + * @param {string|RegExp} url HTTP url. + * @param {(string|RegExp)=} data HTTP request body. + * @param {Object=} headers HTTP headers. + * @returns {requestHandler} Returns an object with `respond` method that control how a matched + * request is handled. + */ + + /** + * @ngdoc method + * @name ngMock.$httpBackend#expectPATCH + * @methodOf ngMock.$httpBackend + * @description + * Creates a new request expectation for PATCH requests. For more info see `expect()`. + * + * @param {string|RegExp} url HTTP url. + * @param {(string|RegExp)=} data HTTP request body. + * @param {Object=} headers HTTP headers. + * @returns {requestHandler} Returns an object with `respond` method that control how a matched + * request is handled. + */ + + /** + * @ngdoc method + * @name ngMock.$httpBackend#expectJSONP + * @methodOf ngMock.$httpBackend + * @description + * Creates a new request expectation for JSONP requests. For more info see `expect()`. + * + * @param {string|RegExp} url HTTP url. + * @returns {requestHandler} Returns an object with `respond` method that control how a matched + * request is handled. + */ + createShortMethods('expect'); + + + /** + * @ngdoc method + * @name ngMock.$httpBackend#flush + * @methodOf ngMock.$httpBackend + * @description + * Flushes all pending requests using the trained responses. + * + * @param {number=} count Number of responses to flush (in the order they arrived). If undefined, + * all pending requests will be flushed. If there are no pending requests when the flush method + * is called an exception is thrown (as this typically a sign of programming error). + */ + $httpBackend.flush = function(count) { + $rootScope.$digest(); + if (!responses.length) throw Error('No pending request to flush !'); + + if (angular.isDefined(count)) { + while (count--) { + if (!responses.length) throw Error('No more pending request to flush !'); + responses.shift()(); + } + } else { + while (responses.length) { + responses.shift()(); + } + } + $httpBackend.verifyNoOutstandingExpectation(); + }; + + + /** + * @ngdoc method + * @name ngMock.$httpBackend#verifyNoOutstandingExpectation + * @methodOf ngMock.$httpBackend + * @description + * Verifies that all of the requests defined via the `expect` api were made. If any of the + * requests were not made, verifyNoOutstandingExpectation throws an exception. + * + * Typically, you would call this method following each test case that asserts requests using an + * "afterEach" clause. + * + *
    +   *   afterEach($httpBackend.verifyExpectations);
    +   * 
    + */ + $httpBackend.verifyNoOutstandingExpectation = function() { + $rootScope.$digest(); + if (expectations.length) { + throw Error('Unsatisfied requests: ' + expectations.join(', ')); + } + }; + + + /** + * @ngdoc method + * @name ngMock.$httpBackend#verifyNoOutstandingRequest + * @methodOf ngMock.$httpBackend + * @description + * Verifies that there are no outstanding requests that need to be flushed. + * + * Typically, you would call this method following each test case that asserts requests using an + * "afterEach" clause. + * + *
    +   *   afterEach($httpBackend.verifyNoOutstandingRequest);
    +   * 
    + */ + $httpBackend.verifyNoOutstandingRequest = function() { + if (responses.length) { + throw Error('Unflushed requests: ' + responses.length); + } + }; + + + /** + * @ngdoc method + * @name ngMock.$httpBackend#resetExpectations + * @methodOf ngMock.$httpBackend + * @description + * Resets all request expectations, but preserves all backend definitions. Typically, you would + * call resetExpectations during a multiple-phase test when you want to reuse the same instance of + * $httpBackend mock. + */ + $httpBackend.resetExpectations = function() { + expectations.length = 0; + responses.length = 0; + }; + + return $httpBackend; + + + function createShortMethods(prefix) { + angular.forEach(['GET', 'DELETE', 'JSONP'], function(method) { + $httpBackend[prefix + method] = function(url, headers) { + return $httpBackend[prefix](method, url, undefined, headers) + } + }); + + angular.forEach(['PUT', 'POST', 'PATCH'], function(method) { + $httpBackend[prefix + method] = function(url, data, headers) { + return $httpBackend[prefix](method, url, data, headers) + } + }); + } +} + +function MockHttpExpectation(method, url, data, headers) { + + this.data = data; + this.headers = headers; + + this.match = function(m, u, d, h) { + if (method != m) return false; + if (!this.matchUrl(u)) return false; + if (angular.isDefined(d) && !this.matchData(d)) return false; + if (angular.isDefined(h) && !this.matchHeaders(h)) return false; + return true; + }; + + this.matchUrl = function(u) { + if (!url) return true; + if (angular.isFunction(url.test)) return url.test(u); + return url == u; + }; + + this.matchHeaders = function(h) { + if (angular.isUndefined(headers)) return true; + if (angular.isFunction(headers)) return headers(h); + return angular.equals(headers, h); + }; + + this.matchData = function(d) { + if (angular.isUndefined(data)) return true; + if (data && angular.isFunction(data.test)) return data.test(d); + if (data && !angular.isString(data)) return angular.toJson(data) == d; + return data == d; + }; + + this.toString = function() { + return method + ' ' + url; + }; +} + +function MockXhr() { + + // hack for testing $http, $httpBackend + MockXhr.$$lastInstance = this; + + this.open = function(method, url, async) { + this.$$method = method; + this.$$url = url; + this.$$async = async; + this.$$reqHeaders = {}; + this.$$respHeaders = {}; + }; + + this.send = function(data) { + this.$$data = data; + }; + + this.setRequestHeader = function(key, value) { + this.$$reqHeaders[key] = value; + }; + + this.getResponseHeader = function(name) { + // the lookup must be case insensitive, that's why we try two quick lookups and full scan at last + var header = this.$$respHeaders[name]; + if (header) return header; + + name = angular.lowercase(name); + header = this.$$respHeaders[name]; + if (header) return header; + + header = undefined; + angular.forEach(this.$$respHeaders, function(headerVal, headerName) { + if (!header && angular.lowercase(headerName) == name) header = headerVal; + }); + return header; + }; + + this.getAllResponseHeaders = function() { + var lines = []; + + angular.forEach(this.$$respHeaders, function(value, key) { + lines.push(key + ': ' + value); + }); + return lines.join('\n'); + }; + + this.abort = angular.noop; +} + + +/** + * @ngdoc function + * @name ngMock.$timeout + * @description + * + * This service is just a simple decorator for {@link ng.$timeout $timeout} service + * that adds a "flush" and "verifyNoPendingTasks" methods. + */ + +angular.mock.$TimeoutDecorator = function($delegate, $browser) { + + /** + * @ngdoc method + * @name ngMock.$timeout#flush + * @methodOf ngMock.$timeout + * @description + * + * Flushes the queue of pending tasks. + */ + $delegate.flush = function() { + $browser.defer.flush(); + }; + + /** + * @ngdoc method + * @name ngMock.$timeout#verifyNoPendingTasks + * @methodOf ngMock.$timeout + * @description + * + * Verifies that there are no pending tasks that need to be flushed. + */ + $delegate.verifyNoPendingTasks = function() { + if ($browser.deferredFns.length) { + throw Error('Deferred tasks to flush (' + $browser.deferredFns.length + '): ' + + formatPendingTasksAsString($browser.deferredFns)); + } + }; + + function formatPendingTasksAsString(tasks) { + var result = []; + angular.forEach(tasks, function(task) { + result.push('{id: ' + task.id + ', ' + 'time: ' + task.time + '}'); + }); + + return result.join(', '); + } + + return $delegate; +}; + +/** + * + */ +angular.mock.$RootElementProvider = function() { + this.$get = function() { + return angular.element('
    '); + } +}; + +/** + * @ngdoc overview + * @name ngMock + * @description + * + * The `ngMock` is an angular module which is used with `ng` module and adds unit-test configuration as well as useful + * mocks to the {@link AUTO.$injector $injector}. + */ +angular.module('ngMock', ['ng']).provider({ + $browser: angular.mock.$BrowserProvider, + $exceptionHandler: angular.mock.$ExceptionHandlerProvider, + $log: angular.mock.$LogProvider, + $httpBackend: angular.mock.$HttpBackendProvider, + $rootElement: angular.mock.$RootElementProvider +}).config(function($provide) { + $provide.decorator('$timeout', angular.mock.$TimeoutDecorator); +}); + +/** + * @ngdoc overview + * @name ngMockE2E + * @description + * + * The `ngMockE2E` is an angular module which contains mocks suitable for end-to-end testing. + * Currently there is only one mock present in this module - + * the {@link ngMockE2E.$httpBackend e2e $httpBackend} mock. + */ +angular.module('ngMockE2E', ['ng']).config(function($provide) { + $provide.decorator('$httpBackend', angular.mock.e2e.$httpBackendDecorator); +}); + +/** + * @ngdoc object + * @name ngMockE2E.$httpBackend + * @description + * Fake HTTP backend implementation suitable for end-to-end testing or backend-less development of + * applications that use the {@link ng.$http $http service}. + * + * *Note*: For fake http backend implementation suitable for unit testing please see + * {@link ngMock.$httpBackend unit-testing $httpBackend mock}. + * + * This implementation can be used to respond with static or dynamic responses via the `when` api + * and its shortcuts (`whenGET`, `whenPOST`, etc) and optionally pass through requests to the + * real $httpBackend for specific requests (e.g. to interact with certain remote apis or to fetch + * templates from a webserver). + * + * As opposed to unit-testing, in an end-to-end testing scenario or in scenario when an application + * is being developed with the real backend api replaced with a mock, it is often desirable for + * certain category of requests to bypass the mock and issue a real http request (e.g. to fetch + * templates or static files from the webserver). To configure the backend with this behavior + * use the `passThrough` request handler of `when` instead of `respond`. + * + * Additionally, we don't want to manually have to flush mocked out requests like we do during unit + * testing. For this reason the e2e $httpBackend automatically flushes mocked out requests + * automatically, closely simulating the behavior of the XMLHttpRequest object. + * + * To setup the application to run with this http backend, you have to create a module that depends + * on the `ngMockE2E` and your application modules and defines the fake backend: + * + *
    + *   myAppDev = angular.module('myAppDev', ['myApp', 'ngMockE2E']);
    + *   myAppDev.run(function($httpBackend) {
    + *     phones = [{name: 'phone1'}, {name: 'phone2'}];
    + *
    + *     // returns the current list of phones
    + *     $httpBackend.whenGET('/phones').respond(phones);
    + *
    + *     // adds a new phone to the phones array
    + *     $httpBackend.whenPOST('/phones').respond(function(method, url, data) {
    + *       phones.push(angular.fromJSON(data));
    + *     });
    + *     $httpBackend.whenGET(/^\/templates\//).passThrough();
    + *     //...
    + *   });
    + * 
    + * + * Afterwards, bootstrap your app with this new module. + */ + +/** + * @ngdoc method + * @name ngMockE2E.$httpBackend#when + * @methodOf ngMockE2E.$httpBackend + * @description + * Creates a new backend definition. + * + * @param {string} method HTTP method. + * @param {string|RegExp} url HTTP url. + * @param {(string|RegExp)=} data HTTP request body. + * @param {(Object|function(Object))=} headers HTTP headers or function that receives http header + * object and returns true if the headers match the current definition. + * @returns {requestHandler} Returns an object with `respond` and `passThrough` methods that + * control how a matched request is handled. + * + * - respond – `{function([status,] data[, headers])|function(function(method, url, data, headers)}` + * – The respond method takes a set of static data to be returned or a function that can return + * an array containing response status (number), response data (string) and response headers + * (Object). + * - passThrough – `{function()}` – Any request matching a backend definition with `passThrough` + * handler, will be pass through to the real backend (an XHR request will be made to the + * server. + */ + +/** + * @ngdoc method + * @name ngMockE2E.$httpBackend#whenGET + * @methodOf ngMockE2E.$httpBackend + * @description + * Creates a new backend definition for GET requests. For more info see `when()`. + * + * @param {string|RegExp} url HTTP url. + * @param {(Object|function(Object))=} headers HTTP headers. + * @returns {requestHandler} Returns an object with `respond` and `passThrough` methods that + * control how a matched request is handled. + */ + +/** + * @ngdoc method + * @name ngMockE2E.$httpBackend#whenHEAD + * @methodOf ngMockE2E.$httpBackend + * @description + * Creates a new backend definition for HEAD requests. For more info see `when()`. + * + * @param {string|RegExp} url HTTP url. + * @param {(Object|function(Object))=} headers HTTP headers. + * @returns {requestHandler} Returns an object with `respond` and `passThrough` methods that + * control how a matched request is handled. + */ + +/** + * @ngdoc method + * @name ngMockE2E.$httpBackend#whenDELETE + * @methodOf ngMockE2E.$httpBackend + * @description + * Creates a new backend definition for DELETE requests. For more info see `when()`. + * + * @param {string|RegExp} url HTTP url. + * @param {(Object|function(Object))=} headers HTTP headers. + * @returns {requestHandler} Returns an object with `respond` and `passThrough` methods that + * control how a matched request is handled. + */ + +/** + * @ngdoc method + * @name ngMockE2E.$httpBackend#whenPOST + * @methodOf ngMockE2E.$httpBackend + * @description + * Creates a new backend definition for POST requests. For more info see `when()`. + * + * @param {string|RegExp} url HTTP url. + * @param {(string|RegExp)=} data HTTP request body. + * @param {(Object|function(Object))=} headers HTTP headers. + * @returns {requestHandler} Returns an object with `respond` and `passThrough` methods that + * control how a matched request is handled. + */ + +/** + * @ngdoc method + * @name ngMockE2E.$httpBackend#whenPUT + * @methodOf ngMockE2E.$httpBackend + * @description + * Creates a new backend definition for PUT requests. For more info see `when()`. + * + * @param {string|RegExp} url HTTP url. + * @param {(string|RegExp)=} data HTTP request body. + * @param {(Object|function(Object))=} headers HTTP headers. + * @returns {requestHandler} Returns an object with `respond` and `passThrough` methods that + * control how a matched request is handled. + */ + +/** + * @ngdoc method + * @name ngMockE2E.$httpBackend#whenPATCH + * @methodOf ngMockE2E.$httpBackend + * @description + * Creates a new backend definition for PATCH requests. For more info see `when()`. + * + * @param {string|RegExp} url HTTP url. + * @param {(string|RegExp)=} data HTTP request body. + * @param {(Object|function(Object))=} headers HTTP headers. + * @returns {requestHandler} Returns an object with `respond` and `passThrough` methods that + * control how a matched request is handled. + */ + +/** + * @ngdoc method + * @name ngMockE2E.$httpBackend#whenJSONP + * @methodOf ngMockE2E.$httpBackend + * @description + * Creates a new backend definition for JSONP requests. For more info see `when()`. + * + * @param {string|RegExp} url HTTP url. + * @returns {requestHandler} Returns an object with `respond` and `passThrough` methods that + * control how a matched request is handled. + */ +angular.mock.e2e = {}; +angular.mock.e2e.$httpBackendDecorator = ['$rootScope', '$delegate', '$browser', createHttpBackendMock]; + + +angular.mock.clearDataCache = function() { + var key, + cache = angular.element.cache; + + for(key in cache) { + if (cache.hasOwnProperty(key)) { + var handle = cache[key].handle; + + handle && angular.element(handle.elem).unbind(); + delete cache[key]; + } + } +}; + + +window.jstestdriver && (function(window) { + /** + * Global method to output any number of objects into JSTD console. Useful for debugging. + */ + window.dump = function() { + var args = []; + angular.forEach(arguments, function(arg) { + args.push(angular.mock.dump(arg)); + }); + jstestdriver.console.log.apply(jstestdriver.console, args); + if (window.console) { + window.console.log.apply(window.console, args); + } + }; +})(window); + + +(window.jasmine || window.mocha) && (function(window) { + + var currentSpec = null; + + beforeEach(function() { + currentSpec = this; + }); + + afterEach(function() { + var injector = currentSpec.$injector; + + currentSpec.$injector = null; + currentSpec.$modules = null; + currentSpec = null; + + if (injector) { + injector.get('$rootElement').unbind(); + injector.get('$browser').pollFns.length = 0; + } + + angular.mock.clearDataCache(); + + // clean up jquery's fragment cache + angular.forEach(angular.element.fragments, function(val, key) { + delete angular.element.fragments[key]; + }); + + MockXhr.$$lastInstance = null; + + angular.forEach(angular.callbacks, function(val, key) { + delete angular.callbacks[key]; + }); + angular.callbacks.counter = 0; + }); + + function isSpecRunning() { + return currentSpec && (window.mocha || currentSpec.queue.running); + } + + /** + * @ngdoc function + * @name angular.mock.module + * @description + * + * *NOTE*: This function is also published on window for easy access.
    + * + * This function registers a module configuration code. It collects the configuration information + * which will be used when the injector is created by {@link angular.mock.inject inject}. + * + * See {@link angular.mock.inject inject} for usage example + * + * @param {...(string|Function)} fns any number of modules which are represented as string + * aliases or as anonymous module initialization functions. The modules are used to + * configure the injector. The 'ng' and 'ngMock' modules are automatically loaded. + */ + window.module = angular.mock.module = function() { + var moduleFns = Array.prototype.slice.call(arguments, 0); + return isSpecRunning() ? workFn() : workFn; + ///////////////////// + function workFn() { + if (currentSpec.$injector) { + throw Error('Injector already created, can not register a module!'); + } else { + var modules = currentSpec.$modules || (currentSpec.$modules = []); + angular.forEach(moduleFns, function(module) { + modules.push(module); + }); + } + } + }; + + /** + * @ngdoc function + * @name angular.mock.inject + * @description + * + * *NOTE*: This function is also published on window for easy access.
    + * + * The inject function wraps a function into an injectable function. The inject() creates new + * instance of {@link AUTO.$injector $injector} per test, which is then used for + * resolving references. + * + * See also {@link angular.mock.module module} + * + * Example of what a typical jasmine tests looks like with the inject method. + *
    +   *
    +   *   angular.module('myApplicationModule', [])
    +   *       .value('mode', 'app')
    +   *       .value('version', 'v1.0.1');
    +   *
    +   *
    +   *   describe('MyApp', function() {
    +   *
    +   *     // You need to load modules that you want to test,
    +   *     // it loads only the "ng" module by default.
    +   *     beforeEach(module('myApplicationModule'));
    +   *
    +   *
    +   *     // inject() is used to inject arguments of all given functions
    +   *     it('should provide a version', inject(function(mode, version) {
    +   *       expect(version).toEqual('v1.0.1');
    +   *       expect(mode).toEqual('app');
    +   *     }));
    +   *
    +   *
    +   *     // The inject and module method can also be used inside of the it or beforeEach
    +   *     it('should override a version and test the new version is injected', function() {
    +   *       // module() takes functions or strings (module aliases)
    +   *       module(function($provide) {
    +   *         $provide.value('version', 'overridden'); // override version here
    +   *       });
    +   *
    +   *       inject(function(version) {
    +   *         expect(version).toEqual('overridden');
    +   *       });
    +   *     ));
    +   *   });
    +   *
    +   * 
    + * + * @param {...Function} fns any number of functions which will be injected using the injector. + */ + window.inject = angular.mock.inject = function() { + var blockFns = Array.prototype.slice.call(arguments, 0); + var errorForStack = new Error('Declaration Location'); + return isSpecRunning() ? workFn() : workFn; + ///////////////////// + function workFn() { + var modules = currentSpec.$modules || []; + + modules.unshift('ngMock'); + modules.unshift('ng'); + var injector = currentSpec.$injector; + if (!injector) { + injector = currentSpec.$injector = angular.injector(modules); + } + for(var i = 0, ii = blockFns.length; i < ii; i++) { + try { + injector.invoke(blockFns[i] || angular.noop, this); + } catch (e) { + if(e.stack && errorForStack) e.stack += '\n' + errorForStack.stack; + throw e; + } finally { + errorForStack = null; + } + } + } + }; +})(window); diff --git a/src/UmbracoUrlHandling/Umbraco/lib/angular/1.1.5/angular-resource.js b/src/UmbracoUrlHandling/Umbraco/lib/angular/1.1.5/angular-resource.js new file mode 100644 index 0000000..acaa84c --- /dev/null +++ b/src/UmbracoUrlHandling/Umbraco/lib/angular/1.1.5/angular-resource.js @@ -0,0 +1,537 @@ +/** + * @license AngularJS v1.1.5 + * (c) 2010-2012 Google, Inc. http://angularjs.org + * License: MIT + */ +(function(window, angular, undefined) { +'use strict'; + +/** + * @ngdoc overview + * @name ngResource + * @description + */ + +/** + * @ngdoc object + * @name ngResource.$resource + * @requires $http + * + * @description + * A factory which creates a resource object that lets you interact with + * [RESTful](http://en.wikipedia.org/wiki/Representational_State_Transfer) server-side data sources. + * + * The returned resource object has action methods which provide high-level behaviors without + * the need to interact with the low level {@link ng.$http $http} service. + * + * # Installation + * To use $resource make sure you have included the `angular-resource.js` that comes in Angular + * package. You can also find this file on Google CDN, bower as well as at + * {@link http://code.angularjs.org/ code.angularjs.org}. + * + * Finally load the module in your application: + * + * angular.module('app', ['ngResource']); + * + * and you are ready to get started! + * + * @param {string} url A parametrized URL template with parameters prefixed by `:` as in + * `/user/:username`. If you are using a URL with a port number (e.g. + * `http://example.com:8080/api`), you'll need to escape the colon character before the port + * number, like this: `$resource('http://example.com\\:8080/api')`. + * + * If you are using a url with a suffix, just add the suffix, like this: + * `$resource('http://example.com/resource.json')` or `$resource('http://example.com/:id.json') + * or even `$resource('http://example.com/resource/:resource_id.:format')` + * If the parameter before the suffix is empty, :resource_id in this case, then the `/.` will be + * collapsed down to a single `.`. If you need this sequence to appear and not collapse then you + * can escape it with `/\.`. + * + * @param {Object=} paramDefaults Default values for `url` parameters. These can be overridden in + * `actions` methods. If any of the parameter value is a function, it will be executed every time + * when a param value needs to be obtained for a request (unless the param was overridden). + * + * Each key value in the parameter object is first bound to url template if present and then any + * excess keys are appended to the url search query after the `?`. + * + * Given a template `/path/:verb` and parameter `{verb:'greet', salutation:'Hello'}` results in + * URL `/path/greet?salutation=Hello`. + * + * If the parameter value is prefixed with `@` then the value of that parameter is extracted from + * the data object (useful for non-GET operations). + * + * @param {Object.=} actions Hash with declaration of custom action that should extend the + * default set of resource actions. The declaration should be created in the format of {@link + * ng.$http#Parameters $http.config}: + * + * {action1: {method:?, params:?, isArray:?, headers:?, ...}, + * action2: {method:?, params:?, isArray:?, headers:?, ...}, + * ...} + * + * Where: + * + * - **`action`** – {string} – The name of action. This name becomes the name of the method on your + * resource object. + * - **`method`** – {string} – HTTP request method. Valid methods are: `GET`, `POST`, `PUT`, `DELETE`, + * and `JSONP`. + * - **`params`** – {Object=} – Optional set of pre-bound parameters for this action. If any of the + * parameter value is a function, it will be executed every time when a param value needs to be + * obtained for a request (unless the param was overridden). + * - **`url`** – {string} – action specific `url` override. The url templating is supported just like + * for the resource-level urls. + * - **`isArray`** – {boolean=} – If true then the returned object for this action is an array, see + * `returns` section. + * - **`transformRequest`** – `{function(data, headersGetter)|Array.}` – + * transform function or an array of such functions. The transform function takes the http + * request body and headers and returns its transformed (typically serialized) version. + * - **`transformResponse`** – `{function(data, headersGetter)|Array.}` – + * transform function or an array of such functions. The transform function takes the http + * response body and headers and returns its transformed (typically deserialized) version. + * - **`cache`** – `{boolean|Cache}` – If true, a default $http cache will be used to cache the + * GET request, otherwise if a cache instance built with + * {@link ng.$cacheFactory $cacheFactory}, this cache will be used for + * caching. + * - **`timeout`** – `{number|Promise}` – timeout in milliseconds, or {@link ng.$q promise} that + * should abort the request when resolved. + * - **`withCredentials`** - `{boolean}` - whether to to set the `withCredentials` flag on the + * XHR object. See {@link https://developer.mozilla.org/en/http_access_control#section_5 + * requests with credentials} for more information. + * - **`responseType`** - `{string}` - see {@link + * https://developer.mozilla.org/en-US/docs/DOM/XMLHttpRequest#responseType requestType}. + * + * @returns {Object} A resource "class" object with methods for the default set of resource actions + * optionally extended with custom `actions`. The default set contains these actions: + * + * { 'get': {method:'GET'}, + * 'save': {method:'POST'}, + * 'query': {method:'GET', isArray:true}, + * 'remove': {method:'DELETE'}, + * 'delete': {method:'DELETE'} }; + * + * Calling these methods invoke an {@link ng.$http} with the specified http method, + * destination and parameters. When the data is returned from the server then the object is an + * instance of the resource class. The actions `save`, `remove` and `delete` are available on it + * as methods with the `$` prefix. This allows you to easily perform CRUD operations (create, + * read, update, delete) on server-side data like this: + *
    +        var User = $resource('/user/:userId', {userId:'@id'});
    +        var user = User.get({userId:123}, function() {
    +          user.abc = true;
    +          user.$save();
    +        });
    +     
    + * + * It is important to realize that invoking a $resource object method immediately returns an + * empty reference (object or array depending on `isArray`). Once the data is returned from the + * server the existing reference is populated with the actual data. This is a useful trick since + * usually the resource is assigned to a model which is then rendered by the view. Having an empty + * object results in no rendering, once the data arrives from the server then the object is + * populated with the data and the view automatically re-renders itself showing the new data. This + * means that in most case one never has to write a callback function for the action methods. + * + * The action methods on the class object or instance object can be invoked with the following + * parameters: + * + * - HTTP GET "class" actions: `Resource.action([parameters], [success], [error])` + * - non-GET "class" actions: `Resource.action([parameters], postData, [success], [error])` + * - non-GET instance actions: `instance.$action([parameters], [success], [error])` + * + * + * The Resource instances and collection have these additional properties: + * + * - `$then`: the `then` method of a {@link ng.$q promise} derived from the underlying + * {@link ng.$http $http} call. + * + * The success callback for the `$then` method will be resolved if the underlying `$http` requests + * succeeds. + * + * The success callback is called with a single object which is the {@link ng.$http http response} + * object extended with a new property `resource`. This `resource` property is a reference to the + * result of the resource action — resource object or array of resources. + * + * The error callback is called with the {@link ng.$http http response} object when an http + * error occurs. + * + * - `$resolved`: true if the promise has been resolved (either with success or rejection); + * Knowing if the Resource has been resolved is useful in data-binding. + * + * @example + * + * # Credit card resource + * + *
    +     // Define CreditCard class
    +     var CreditCard = $resource('/user/:userId/card/:cardId',
    +      {userId:123, cardId:'@id'}, {
    +       charge: {method:'POST', params:{charge:true}}
    +      });
    +
    +     // We can retrieve a collection from the server
    +     var cards = CreditCard.query(function() {
    +       // GET: /user/123/card
    +       // server returns: [ {id:456, number:'1234', name:'Smith'} ];
    +
    +       var card = cards[0];
    +       // each item is an instance of CreditCard
    +       expect(card instanceof CreditCard).toEqual(true);
    +       card.name = "J. Smith";
    +       // non GET methods are mapped onto the instances
    +       card.$save();
    +       // POST: /user/123/card/456 {id:456, number:'1234', name:'J. Smith'}
    +       // server returns: {id:456, number:'1234', name: 'J. Smith'};
    +
    +       // our custom method is mapped as well.
    +       card.$charge({amount:9.99});
    +       // POST: /user/123/card/456?amount=9.99&charge=true {id:456, number:'1234', name:'J. Smith'}
    +     });
    +
    +     // we can create an instance as well
    +     var newCard = new CreditCard({number:'0123'});
    +     newCard.name = "Mike Smith";
    +     newCard.$save();
    +     // POST: /user/123/card {number:'0123', name:'Mike Smith'}
    +     // server returns: {id:789, number:'01234', name: 'Mike Smith'};
    +     expect(newCard.id).toEqual(789);
    + * 
    + * + * The object returned from this function execution is a resource "class" which has "static" method + * for each action in the definition. + * + * Calling these methods invoke `$http` on the `url` template with the given `method`, `params` and `headers`. + * When the data is returned from the server then the object is an instance of the resource type and + * all of the non-GET methods are available with `$` prefix. This allows you to easily support CRUD + * operations (create, read, update, delete) on server-side data. + +
    +     var User = $resource('/user/:userId', {userId:'@id'});
    +     var user = User.get({userId:123}, function() {
    +       user.abc = true;
    +       user.$save();
    +     });
    +   
    + * + * It's worth noting that the success callback for `get`, `query` and other method gets passed + * in the response that came from the server as well as $http header getter function, so one + * could rewrite the above example and get access to http headers as: + * +
    +     var User = $resource('/user/:userId', {userId:'@id'});
    +     User.get({userId:123}, function(u, getResponseHeaders){
    +       u.abc = true;
    +       u.$save(function(u, putResponseHeaders) {
    +         //u => saved user object
    +         //putResponseHeaders => $http header getter
    +       });
    +     });
    +   
    + + * # Buzz client + + Let's look at what a buzz client created with the `$resource` service looks like: + + + + +
    + + +
    +
    +

    + + {{item.actor.name}} + Expand replies: {{item.links.replies[0].count}} +

    + {{item.object.content | html}} +
    + + {{reply.actor.name}}: {{reply.content | html}} +
    +
    +
    +
    + + +
    + */ +angular.module('ngResource', ['ng']). + factory('$resource', ['$http', '$parse', function($http, $parse) { + var DEFAULT_ACTIONS = { + 'get': {method:'GET'}, + 'save': {method:'POST'}, + 'query': {method:'GET', isArray:true}, + 'remove': {method:'DELETE'}, + 'delete': {method:'DELETE'} + }; + var noop = angular.noop, + forEach = angular.forEach, + extend = angular.extend, + copy = angular.copy, + isFunction = angular.isFunction, + getter = function(obj, path) { + return $parse(path)(obj); + }; + + /** + * We need our custom method because encodeURIComponent is too aggressive and doesn't follow + * http://www.ietf.org/rfc/rfc3986.txt with regards to the character set (pchar) allowed in path + * segments: + * segment = *pchar + * pchar = unreserved / pct-encoded / sub-delims / ":" / "@" + * pct-encoded = "%" HEXDIG HEXDIG + * unreserved = ALPHA / DIGIT / "-" / "." / "_" / "~" + * sub-delims = "!" / "$" / "&" / "'" / "(" / ")" + * / "*" / "+" / "," / ";" / "=" + */ + function encodeUriSegment(val) { + return encodeUriQuery(val, true). + replace(/%26/gi, '&'). + replace(/%3D/gi, '='). + replace(/%2B/gi, '+'); + } + + + /** + * This method is intended for encoding *key* or *value* parts of query component. We need a custom + * method because encodeURIComponent is too aggressive and encodes stuff that doesn't have to be + * encoded per http://tools.ietf.org/html/rfc3986: + * query = *( pchar / "/" / "?" ) + * pchar = unreserved / pct-encoded / sub-delims / ":" / "@" + * unreserved = ALPHA / DIGIT / "-" / "." / "_" / "~" + * pct-encoded = "%" HEXDIG HEXDIG + * sub-delims = "!" / "$" / "&" / "'" / "(" / ")" + * / "*" / "+" / "," / ";" / "=" + */ + function encodeUriQuery(val, pctEncodeSpaces) { + return encodeURIComponent(val). + replace(/%40/gi, '@'). + replace(/%3A/gi, ':'). + replace(/%24/g, '$'). + replace(/%2C/gi, ','). + replace(/%20/g, (pctEncodeSpaces ? '%20' : '+')); + } + + function Route(template, defaults) { + this.template = template; + this.defaults = defaults || {}; + this.urlParams = {}; + } + + Route.prototype = { + setUrlParams: function(config, params, actionUrl) { + var self = this, + url = actionUrl || self.template, + val, + encodedVal; + + var urlParams = self.urlParams = {}; + forEach(url.split(/\W/), function(param){ + if (param && (new RegExp("(^|[^\\\\]):" + param + "(\\W|$)").test(url))) { + urlParams[param] = true; + } + }); + url = url.replace(/\\:/g, ':'); + + params = params || {}; + forEach(self.urlParams, function(_, urlParam){ + val = params.hasOwnProperty(urlParam) ? params[urlParam] : self.defaults[urlParam]; + if (angular.isDefined(val) && val !== null) { + encodedVal = encodeUriSegment(val); + url = url.replace(new RegExp(":" + urlParam + "(\\W|$)", "g"), encodedVal + "$1"); + } else { + url = url.replace(new RegExp("(\/?):" + urlParam + "(\\W|$)", "g"), function(match, + leadingSlashes, tail) { + if (tail.charAt(0) == '/') { + return tail; + } else { + return leadingSlashes + tail; + } + }); + } + }); + + // strip trailing slashes and set the url + url = url.replace(/\/+$/, ''); + // then replace collapse `/.` if found in the last URL path segment before the query + // E.g. `http://url.com/id./format?q=x` becomes `http://url.com/id.format?q=x` + url = url.replace(/\/\.(?=\w+($|\?))/, '.'); + // replace escaped `/\.` with `/.` + config.url = url.replace(/\/\\\./, '/.'); + + + // set params - delegate param encoding to $http + forEach(params, function(value, key){ + if (!self.urlParams[key]) { + config.params = config.params || {}; + config.params[key] = value; + } + }); + } + }; + + + function ResourceFactory(url, paramDefaults, actions) { + var route = new Route(url); + + actions = extend({}, DEFAULT_ACTIONS, actions); + + function extractParams(data, actionParams){ + var ids = {}; + actionParams = extend({}, paramDefaults, actionParams); + forEach(actionParams, function(value, key){ + if (isFunction(value)) { value = value(); } + ids[key] = value && value.charAt && value.charAt(0) == '@' ? getter(data, value.substr(1)) : value; + }); + return ids; + } + + function Resource(value){ + copy(value || {}, this); + } + + forEach(actions, function(action, name) { + action.method = angular.uppercase(action.method); + var hasBody = action.method == 'POST' || action.method == 'PUT' || action.method == 'PATCH'; + Resource[name] = function(a1, a2, a3, a4) { + var params = {}; + var data; + var success = noop; + var error = null; + var promise; + + switch(arguments.length) { + case 4: + error = a4; + success = a3; + //fallthrough + case 3: + case 2: + if (isFunction(a2)) { + if (isFunction(a1)) { + success = a1; + error = a2; + break; + } + + success = a2; + error = a3; + //fallthrough + } else { + params = a1; + data = a2; + success = a3; + break; + } + case 1: + if (isFunction(a1)) success = a1; + else if (hasBody) data = a1; + else params = a1; + break; + case 0: break; + default: + throw "Expected between 0-4 arguments [params, data, success, error], got " + + arguments.length + " arguments."; + } + + var value = this instanceof Resource ? this : (action.isArray ? [] : new Resource(data)); + var httpConfig = {}, + promise; + + forEach(action, function(value, key) { + if (key != 'params' && key != 'isArray' ) { + httpConfig[key] = copy(value); + } + }); + httpConfig.data = data; + route.setUrlParams(httpConfig, extend({}, extractParams(data, action.params || {}), params), action.url); + + function markResolved() { value.$resolved = true; } + + promise = $http(httpConfig); + value.$resolved = false; + + promise.then(markResolved, markResolved); + value.$then = promise.then(function(response) { + var data = response.data; + var then = value.$then, resolved = value.$resolved; + + if (data) { + if (action.isArray) { + value.length = 0; + forEach(data, function(item) { + value.push(new Resource(item)); + }); + } else { + copy(data, value); + value.$then = then; + value.$resolved = resolved; + } + } + + (success||noop)(value, response.headers); + + response.resource = value; + return response; + }, error).then; + + return value; + }; + + + Resource.prototype['$' + name] = function(a1, a2, a3) { + var params = extractParams(this), + success = noop, + error; + + switch(arguments.length) { + case 3: params = a1; success = a2; error = a3; break; + case 2: + case 1: + if (isFunction(a1)) { + success = a1; + error = a2; + } else { + params = a1; + success = a2 || noop; + } + case 0: break; + default: + throw "Expected between 1-3 arguments [params, success, error], got " + + arguments.length + " arguments."; + } + var data = hasBody ? this : undefined; + Resource[name].call(this, params, data, success, error); + }; + }); + + Resource.bind = function(additionalParamDefaults){ + return ResourceFactory(url, extend({}, paramDefaults, additionalParamDefaults), actions); + }; + + return Resource; + } + + return ResourceFactory; + }]); + + +})(window, window.angular); diff --git a/src/UmbracoUrlHandling/Umbraco/lib/angular/1.1.5/angular-resource.min.js b/src/UmbracoUrlHandling/Umbraco/lib/angular/1.1.5/angular-resource.min.js new file mode 100644 index 0000000..a8848fa --- /dev/null +++ b/src/UmbracoUrlHandling/Umbraco/lib/angular/1.1.5/angular-resource.min.js @@ -0,0 +1,11 @@ +/* + AngularJS v1.1.5 + (c) 2010-2012 Google, Inc. http://angularjs.org + License: MIT +*/ +(function(B,f,w){'use strict';f.module("ngResource",["ng"]).factory("$resource",["$http","$parse",function(x,y){function u(b,d){this.template=b;this.defaults=d||{};this.urlParams={}}function v(b,d,e){function j(c,b){var p={},b=m({},d,b);l(b,function(a,b){k(a)&&(a=a());var g;a&&a.charAt&&a.charAt(0)=="@"?(g=a.substr(1),g=y(g)(c)):g=a;p[b]=g});return p}function c(c){t(c||{},this)}var n=new u(b),e=m({},z,e);l(e,function(b,d){b.method=f.uppercase(b.method);var p=b.method=="POST"||b.method=="PUT"||b.method== +"PATCH";c[d]=function(a,d,g,A){function f(){h.$resolved=!0}var i={},e,o=q,r=null;switch(arguments.length){case 4:r=A,o=g;case 3:case 2:if(k(d)){if(k(a)){o=a;r=d;break}o=d;r=g}else{i=a;e=d;o=g;break}case 1:k(a)?o=a:p?e=a:i=a;break;case 0:break;default:throw"Expected between 0-4 arguments [params, data, success, error], got "+arguments.length+" arguments.";}var h=this instanceof c?this:b.isArray?[]:new c(e),s={};l(b,function(a,b){b!="params"&&b!="isArray"&&(s[b]=t(a))});s.data=e;n.setUrlParams(s,m({}, +j(e,b.params||{}),i),b.url);i=x(s);h.$resolved=!1;i.then(f,f);h.$then=i.then(function(a){var d=a.data,g=h.$then,e=h.$resolved;if(d)b.isArray?(h.length=0,l(d,function(a){h.push(new c(a))})):(t(d,h),h.$then=g,h.$resolved=e);(o||q)(h,a.headers);a.resource=h;return a},r).then;return h};c.prototype["$"+d]=function(a,b,g){var e=j(this),f=q,i;switch(arguments.length){case 3:e=a;f=b;i=g;break;case 2:case 1:k(a)?(f=a,i=b):(e=a,f=b||q);case 0:break;default:throw"Expected between 1-3 arguments [params, success, error], got "+ +arguments.length+" arguments.";}c[d].call(this,e,p?this:w,f,i)}});c.bind=function(c){return v(b,m({},d,c),e)};return c}var z={get:{method:"GET"},save:{method:"POST"},query:{method:"GET",isArray:!0},remove:{method:"DELETE"},"delete":{method:"DELETE"}},q=f.noop,l=f.forEach,m=f.extend,t=f.copy,k=f.isFunction;u.prototype={setUrlParams:function(b,d,e){var j=this,c=e||j.template,n,k,m=j.urlParams={};l(c.split(/\W/),function(b){b&&RegExp("(^|[^\\\\]):"+b+"(\\W|$)").test(c)&&(m[b]=!0)});c=c.replace(/\\:/g, +":");d=d||{};l(j.urlParams,function(b,a){n=d.hasOwnProperty(a)?d[a]:j.defaults[a];f.isDefined(n)&&n!==null?(k=encodeURIComponent(n).replace(/%40/gi,"@").replace(/%3A/gi,":").replace(/%24/g,"$").replace(/%2C/gi,",").replace(/%20/g,"%20").replace(/%26/gi,"&").replace(/%3D/gi,"=").replace(/%2B/gi,"+"),c=c.replace(RegExp(":"+a+"(\\W|$)","g"),k+"$1")):c=c.replace(RegExp("(/?):"+a+"(\\W|$)","g"),function(b,a,c){return c.charAt(0)=="/"?c:a+c})});c=c.replace(/\/+$/,"");c=c.replace(/\/\.(?=\w+($|\?))/,"."); +b.url=c.replace(/\/\\\./,"/.");l(d,function(c,a){if(!j.urlParams[a])b.params=b.params||{},b.params[a]=c})}};return v}])})(window,window.angular); diff --git a/src/UmbracoUrlHandling/Umbraco/lib/angular/1.1.5/angular-sanitize.js b/src/UmbracoUrlHandling/Umbraco/lib/angular/1.1.5/angular-sanitize.js new file mode 100644 index 0000000..8bb03a7 --- /dev/null +++ b/src/UmbracoUrlHandling/Umbraco/lib/angular/1.1.5/angular-sanitize.js @@ -0,0 +1,558 @@ +/** + * @license AngularJS v1.1.5 + * (c) 2010-2012 Google, Inc. http://angularjs.org + * License: MIT + */ +(function(window, angular, undefined) { +'use strict'; + +/** + * @ngdoc overview + * @name ngSanitize + * @description + */ + +/* + * HTML Parser By Misko Hevery (misko@hevery.com) + * based on: HTML Parser By John Resig (ejohn.org) + * Original code by Erik Arvidsson, Mozilla Public License + * http://erik.eae.net/simplehtmlparser/simplehtmlparser.js + * + * // Use like so: + * htmlParser(htmlString, { + * start: function(tag, attrs, unary) {}, + * end: function(tag) {}, + * chars: function(text) {}, + * comment: function(text) {} + * }); + * + */ + + +/** + * @ngdoc service + * @name ngSanitize.$sanitize + * @function + * + * @description + * The input is sanitized by parsing the html into tokens. All safe tokens (from a whitelist) are + * then serialized back to properly escaped html string. This means that no unsafe input can make + * it into the returned string, however, since our parser is more strict than a typical browser + * parser, it's possible that some obscure input, which would be recognized as valid HTML by a + * browser, won't make it through the sanitizer. + * + * @param {string} html Html input. + * @returns {string} Sanitized html. + * + * @example + + + +
    + Snippet: + + + + + + + + + + + + + + + + + + + + + +
    FilterSourceRendered
    html filter +
    <div ng-bind-html="snippet">
    </div>
    +
    +
    +
    no filter
    <div ng-bind="snippet">
    </div>
    unsafe html filter
    <div ng-bind-html-unsafe="snippet">
    </div>
    +
    +
    + + it('should sanitize the html snippet ', function() { + expect(using('#html-filter').element('div').html()). + toBe('

    an html\nclick here\nsnippet

    '); + }); + + it('should escape snippet without any filter', function() { + expect(using('#escaped-html').element('div').html()). + toBe("<p style=\"color:blue\">an html\n" + + "<em onmouseover=\"this.textContent='PWN3D!'\">click here</em>\n" + + "snippet</p>"); + }); + + it('should inline raw snippet if filtered as unsafe', function() { + expect(using('#html-unsafe-filter').element("div").html()). + toBe("

    an html\n" + + "click here\n" + + "snippet

    "); + }); + + it('should update', function() { + input('snippet').enter('new text'); + expect(using('#html-filter').binding('snippet')).toBe('new text'); + expect(using('#escaped-html').element('div').html()).toBe("new <b>text</b>"); + expect(using('#html-unsafe-filter').binding("snippet")).toBe('new text'); + }); +
    +
    + */ +var $sanitize = function(html) { + var buf = []; + htmlParser(html, htmlSanitizeWriter(buf)); + return buf.join(''); +}; + + +// Regular Expressions for parsing tags and attributes +var START_TAG_REGEXP = /^<\s*([\w:-]+)((?:\s+[\w:-]+(?:\s*=\s*(?:(?:"[^"]*")|(?:'[^']*')|[^>\s]+))?)*)\s*(\/?)\s*>/, + END_TAG_REGEXP = /^<\s*\/\s*([\w:-]+)[^>]*>/, + ATTR_REGEXP = /([\w:-]+)(?:\s*=\s*(?:(?:"((?:[^"])*)")|(?:'((?:[^'])*)')|([^>\s]+)))?/g, + BEGIN_TAG_REGEXP = /^/g, + CDATA_REGEXP = //g, + URI_REGEXP = /^((ftp|https?):\/\/|mailto:|tel:|#)/, + NON_ALPHANUMERIC_REGEXP = /([^\#-~| |!])/g; // Match everything outside of normal chars and " (quote character) + + +// Good source of info about elements and attributes +// http://dev.w3.org/html5/spec/Overview.html#semantics +// http://simon.html5.org/html-elements + +// Safe Void Elements - HTML5 +// http://dev.w3.org/html5/spec/Overview.html#void-elements +var voidElements = makeMap("area,br,col,hr,img,wbr"); + +// Elements that you can, intentionally, leave open (and which close themselves) +// http://dev.w3.org/html5/spec/Overview.html#optional-tags +var optionalEndTagBlockElements = makeMap("colgroup,dd,dt,li,p,tbody,td,tfoot,th,thead,tr"), + optionalEndTagInlineElements = makeMap("rp,rt"), + optionalEndTagElements = angular.extend({}, optionalEndTagInlineElements, optionalEndTagBlockElements); + +// Safe Block Elements - HTML5 +var blockElements = angular.extend({}, optionalEndTagBlockElements, makeMap("address,article,aside," + + "blockquote,caption,center,del,dir,div,dl,figure,figcaption,footer,h1,h2,h3,h4,h5,h6," + + "header,hgroup,hr,ins,map,menu,nav,ol,pre,script,section,table,ul")); + +// Inline Elements - HTML5 +var inlineElements = angular.extend({}, optionalEndTagInlineElements, makeMap("a,abbr,acronym,b,bdi,bdo," + + "big,br,cite,code,del,dfn,em,font,i,img,ins,kbd,label,map,mark,q,ruby,rp,rt,s,samp,small," + + "span,strike,strong,sub,sup,time,tt,u,var")); + + +// Special Elements (can contain anything) +var specialElements = makeMap("script,style"); + +var validElements = angular.extend({}, voidElements, blockElements, inlineElements, optionalEndTagElements); + +//Attributes that have href and hence need to be sanitized +var uriAttrs = makeMap("background,cite,href,longdesc,src,usemap"); +var validAttrs = angular.extend({}, uriAttrs, makeMap( + 'abbr,align,alt,axis,bgcolor,border,cellpadding,cellspacing,class,clear,'+ + 'color,cols,colspan,compact,coords,dir,face,headers,height,hreflang,hspace,'+ + 'ismap,lang,language,nohref,nowrap,rel,rev,rows,rowspan,rules,'+ + 'scope,scrolling,shape,span,start,summary,target,title,type,'+ + 'valign,value,vspace,width')); + +function makeMap(str) { + var obj = {}, items = str.split(','), i; + for (i = 0; i < items.length; i++) obj[items[i]] = true; + return obj; +} + + +/** + * @example + * htmlParser(htmlString, { + * start: function(tag, attrs, unary) {}, + * end: function(tag) {}, + * chars: function(text) {}, + * comment: function(text) {} + * }); + * + * @param {string} html string + * @param {object} handler + */ +function htmlParser( html, handler ) { + var index, chars, match, stack = [], last = html; + stack.last = function() { return stack[ stack.length - 1 ]; }; + + while ( html ) { + chars = true; + + // Make sure we're not in a script or style element + if ( !stack.last() || !specialElements[ stack.last() ] ) { + + // Comment + if ( html.indexOf(""); + + if ( index >= 0 ) { + if (handler.comment) handler.comment( html.substring( 4, index ) ); + html = html.substring( index + 3 ); + chars = false; + } + + // end tag + } else if ( BEGING_END_TAGE_REGEXP.test(html) ) { + match = html.match( END_TAG_REGEXP ); + + if ( match ) { + html = html.substring( match[0].length ); + match[0].replace( END_TAG_REGEXP, parseEndTag ); + chars = false; + } + + // start tag + } else if ( BEGIN_TAG_REGEXP.test(html) ) { + match = html.match( START_TAG_REGEXP ); + + if ( match ) { + html = html.substring( match[0].length ); + match[0].replace( START_TAG_REGEXP, parseStartTag ); + chars = false; + } + } + + if ( chars ) { + index = html.indexOf("<"); + + var text = index < 0 ? html : html.substring( 0, index ); + html = index < 0 ? "" : html.substring( index ); + + if (handler.chars) handler.chars( decodeEntities(text) ); + } + + } else { + html = html.replace(new RegExp("(.*)<\\s*\\/\\s*" + stack.last() + "[^>]*>", 'i'), function(all, text){ + text = text. + replace(COMMENT_REGEXP, "$1"). + replace(CDATA_REGEXP, "$1"); + + if (handler.chars) handler.chars( decodeEntities(text) ); + + return ""; + }); + + parseEndTag( "", stack.last() ); + } + + if ( html == last ) { + throw "Parse Error: " + html; + } + last = html; + } + + // Clean up any remaining tags + parseEndTag(); + + function parseStartTag( tag, tagName, rest, unary ) { + tagName = angular.lowercase(tagName); + if ( blockElements[ tagName ] ) { + while ( stack.last() && inlineElements[ stack.last() ] ) { + parseEndTag( "", stack.last() ); + } + } + + if ( optionalEndTagElements[ tagName ] && stack.last() == tagName ) { + parseEndTag( "", tagName ); + } + + unary = voidElements[ tagName ] || !!unary; + + if ( !unary ) + stack.push( tagName ); + + var attrs = {}; + + rest.replace(ATTR_REGEXP, function(match, name, doubleQuotedValue, singleQoutedValue, unqoutedValue) { + var value = doubleQuotedValue + || singleQoutedValue + || unqoutedValue + || ''; + + attrs[name] = decodeEntities(value); + }); + if (handler.start) handler.start( tagName, attrs, unary ); + } + + function parseEndTag( tag, tagName ) { + var pos = 0, i; + tagName = angular.lowercase(tagName); + if ( tagName ) + // Find the closest opened tag of the same type + for ( pos = stack.length - 1; pos >= 0; pos-- ) + if ( stack[ pos ] == tagName ) + break; + + if ( pos >= 0 ) { + // Close all the open elements, up the stack + for ( i = stack.length - 1; i >= pos; i-- ) + if (handler.end) handler.end( stack[ i ] ); + + // Remove the open elements from the stack + stack.length = pos; + } + } +} + +/** + * decodes all entities into regular string + * @param value + * @returns {string} A string with decoded entities. + */ +var hiddenPre=document.createElement("pre"); +function decodeEntities(value) { + hiddenPre.innerHTML=value.replace(//g, '>'); +} + +/** + * create an HTML/XML writer which writes to buffer + * @param {Array} buf use buf.jain('') to get out sanitized html string + * @returns {object} in the form of { + * start: function(tag, attrs, unary) {}, + * end: function(tag) {}, + * chars: function(text) {}, + * comment: function(text) {} + * } + */ +function htmlSanitizeWriter(buf){ + var ignore = false; + var out = angular.bind(buf, buf.push); + return { + start: function(tag, attrs, unary){ + tag = angular.lowercase(tag); + if (!ignore && specialElements[tag]) { + ignore = tag; + } + if (!ignore && validElements[tag] == true) { + out('<'); + out(tag); + angular.forEach(attrs, function(value, key){ + var lkey=angular.lowercase(key); + if (validAttrs[lkey]==true && (uriAttrs[lkey]!==true || value.match(URI_REGEXP))) { + out(' '); + out(key); + out('="'); + out(encodeEntities(value)); + out('"'); + } + }); + out(unary ? '/>' : '>'); + } + }, + end: function(tag){ + tag = angular.lowercase(tag); + if (!ignore && validElements[tag] == true) { + out(''); + } + if (tag == ignore) { + ignore = false; + } + }, + chars: function(chars){ + if (!ignore) { + out(encodeEntities(chars)); + } + } + }; +} + + +// define ngSanitize module and register $sanitize service +angular.module('ngSanitize', []).value('$sanitize', $sanitize); + +/** + * @ngdoc directive + * @name ngSanitize.directive:ngBindHtml + * + * @description + * Creates a binding that will sanitize the result of evaluating the `expression` with the + * {@link ngSanitize.$sanitize $sanitize} service and innerHTML the result into the current element. + * + * See {@link ngSanitize.$sanitize $sanitize} docs for examples. + * + * @element ANY + * @param {expression} ngBindHtml {@link guide/expression Expression} to evaluate. + */ +angular.module('ngSanitize').directive('ngBindHtml', ['$sanitize', function($sanitize) { + return function(scope, element, attr) { + element.addClass('ng-binding').data('$binding', attr.ngBindHtml); + scope.$watch(attr.ngBindHtml, function ngBindHtmlWatchAction(value) { + value = $sanitize(value); + element.html(value || ''); + }); + }; +}]); + +/** + * @ngdoc filter + * @name ngSanitize.filter:linky + * @function + * + * @description + * Finds links in text input and turns them into html links. Supports http/https/ftp/mailto and + * plain email address links. + * + * @param {string} text Input text. + * @param {string} target Window (_blank|_self|_parent|_top) or named frame to open links in. + * @returns {string} Html-linkified text. + * + * @usage + + * + * @example + + + +
    + Snippet: + + + + + + + + + + + + + + + + + + + + + +
    FilterSourceRendered
    linky filter +
    <div ng-bind-html="snippet | linky">
    </div>
    +
    +
    +
    linky target +
    <div ng-bind-html="snippetWithTarget | linky:'_blank'">
    </div>
    +
    +
    +
    no filter
    <div ng-bind="snippet">
    </div>
    + + + it('should linkify the snippet with urls', function() { + expect(using('#linky-filter').binding('snippet | linky')). + toBe('Pretty text with some links: ' + + 'http://angularjs.org/, ' + + 'us@somewhere.org, ' + + 'another@somewhere.org, ' + + 'and one more: ftp://127.0.0.1/.'); + }); + + it ('should not linkify snippet without the linky filter', function() { + expect(using('#escaped-html').binding('snippet')). + toBe("Pretty text with some links:\n" + + "http://angularjs.org/,\n" + + "mailto:us@somewhere.org,\n" + + "another@somewhere.org,\n" + + "and one more: ftp://127.0.0.1/."); + }); + + it('should update', function() { + input('snippet').enter('new http://link.'); + expect(using('#linky-filter').binding('snippet | linky')). + toBe('new http://link.'); + expect(using('#escaped-html').binding('snippet')).toBe('new http://link.'); + }); + + it('should work with the target property', function() { + expect(using('#linky-target').binding("snippetWithTarget | linky:'_blank'")). + toBe('http://angularjs.org/'); + }); + + + */ +angular.module('ngSanitize').filter('linky', function() { + var LINKY_URL_REGEXP = /((ftp|https?):\/\/|(mailto:)?[A-Za-z0-9._%+-]+@)\S*[^\s\.\;\,\(\)\{\}\<\>]/, + MAILTO_REGEXP = /^mailto:/; + + return function(text, target) { + if (!text) return text; + var match; + var raw = text; + var html = []; + // TODO(vojta): use $sanitize instead + var writer = htmlSanitizeWriter(html); + var url; + var i; + var properties = {}; + if (angular.isDefined(target)) { + properties.target = target; + } + while ((match = raw.match(LINKY_URL_REGEXP))) { + // We can not end in these as they are sometimes found at the end of the sentence + url = match[0]; + // if we did not match ftp/http/mailto then assume mailto + if (match[2] == match[3]) url = 'mailto:' + url; + i = match.index; + writer.chars(raw.substr(0, i)); + properties.href = url; + writer.start('a', properties); + writer.chars(match[0].replace(MAILTO_REGEXP, '')); + writer.end('a'); + raw = raw.substring(i + match[0].length); + } + writer.chars(raw); + return html.join(''); + }; +}); + + +})(window, window.angular); diff --git a/src/UmbracoUrlHandling/Umbraco/lib/angular/1.1.5/angular-sanitize.min.js b/src/UmbracoUrlHandling/Umbraco/lib/angular/1.1.5/angular-sanitize.min.js new file mode 100644 index 0000000..593c4ef --- /dev/null +++ b/src/UmbracoUrlHandling/Umbraco/lib/angular/1.1.5/angular-sanitize.min.js @@ -0,0 +1,13 @@ +/* + AngularJS v1.1.5 + (c) 2010-2012 Google, Inc. http://angularjs.org + License: MIT +*/ +(function(I,h){'use strict';function i(a){var d={},a=a.split(","),c;for(c=0;c=0;c--)if(e[c]==b)break;if(c>=0){for(g=e.length-1;g>=c;g--)d.end&&d.end(e[g]);e.length= +c}}var b,f,e=[],j=a;for(e.last=function(){return e[e.length-1]};a;){f=!0;if(!e.last()||!q[e.last()]){if(a.indexOf("<\!--")===0)b=a.indexOf("--\>"),b>=0&&(d.comment&&d.comment(a.substring(4,b)),a=a.substring(b+3),f=!1);else if(B.test(a)){if(b=a.match(r))a=a.substring(b[0].length),b[0].replace(r,g),f=!1}else if(C.test(a)&&(b=a.match(s)))a=a.substring(b[0].length),b[0].replace(s,c),f=!1;f&&(b=a.indexOf("<"),f=b<0?a:a.substring(0,b),a=b<0?"":a.substring(b),d.chars&&d.chars(k(f)))}else a=a.replace(RegExp("(.*)<\\s*\\/\\s*"+ +e.last()+"[^>]*>","i"),function(a,b){b=b.replace(D,"$1").replace(E,"$1");d.chars&&d.chars(k(b));return""}),g("",e.last());if(a==j)throw"Parse Error: "+a;j=a}g()}function k(a){l.innerHTML=a.replace(//g,">")}function u(a){var d=!1,c=h.bind(a,a.push);return{start:function(a,b,f){a=h.lowercase(a);!d&&q[a]&&(d=a);!d&&v[a]== +!0&&(c("<"),c(a),h.forEach(b,function(a,b){var d=h.lowercase(b);if(G[d]==!0&&(w[d]!==!0||a.match(H)))c(" "),c(b),c('="'),c(t(a)),c('"')}),c(f?"/>":">"))},end:function(a){a=h.lowercase(a);!d&&v[a]==!0&&(c(""));a==d&&(d=!1)},chars:function(a){d||c(t(a))}}}var s=/^<\s*([\w:-]+)((?:\s+[\w:-]+(?:\s*=\s*(?:(?:"[^"]*")|(?:'[^']*')|[^>\s]+))?)*)\s*(\/?)\s*>/,r=/^<\s*\/\s*([\w:-]+)[^>]*>/,A=/([\w:-]+)(?:\s*=\s*(?:(?:"((?:[^"])*)")|(?:'((?:[^'])*)')|([^>\s]+)))?/g,C=/^/g, +E=//g,H=/^((ftp|https?):\/\/|mailto:|tel:|#)/,F=/([^\#-~| |!])/g,p=i("area,br,col,hr,img,wbr"),x=i("colgroup,dd,dt,li,p,tbody,td,tfoot,th,thead,tr"),y=i("rp,rt"),o=h.extend({},y,x),m=h.extend({},x,i("address,article,aside,blockquote,caption,center,del,dir,div,dl,figure,figcaption,footer,h1,h2,h3,h4,h5,h6,header,hgroup,hr,ins,map,menu,nav,ol,pre,script,section,table,ul")),n=h.extend({},y,i("a,abbr,acronym,b,bdi,bdo,big,br,cite,code,del,dfn,em,font,i,img,ins,kbd,label,map,mark,q,ruby,rp,rt,s,samp,small,span,strike,strong,sub,sup,time,tt,u,var")), +q=i("script,style"),v=h.extend({},p,m,n,o),w=i("background,cite,href,longdesc,src,usemap"),G=h.extend({},w,i("abbr,align,alt,axis,bgcolor,border,cellpadding,cellspacing,class,clear,color,cols,colspan,compact,coords,dir,face,headers,height,hreflang,hspace,ismap,lang,language,nohref,nowrap,rel,rev,rows,rowspan,rules,scope,scrolling,shape,span,start,summary,target,title,type,valign,value,vspace,width")),l=document.createElement("pre");h.module("ngSanitize",[]).value("$sanitize",function(a){var d=[]; +z(a,u(d));return d.join("")});h.module("ngSanitize").directive("ngBindHtml",["$sanitize",function(a){return function(d,c,g){c.addClass("ng-binding").data("$binding",g.ngBindHtml);d.$watch(g.ngBindHtml,function(b){b=a(b);c.html(b||"")})}}]);h.module("ngSanitize").filter("linky",function(){var a=/((ftp|https?):\/\/|(mailto:)?[A-Za-z0-9._%+-]+@)\S*[^\s\.\;\,\(\)\{\}\<\>]/,d=/^mailto:/;return function(c,g){if(!c)return c;var b,f=c,e=[],j=u(e),i,k,l={};if(h.isDefined(g))l.target=g;for(;b=f.match(a);)i= +b[0],b[2]==b[3]&&(i="mailto:"+i),k=b.index,j.chars(f.substr(0,k)),l.href=i,j.start("a",l),j.chars(b[0].replace(d,"")),j.end("a"),f=f.substring(k+b[0].length);j.chars(f);return e.join("")}})})(window,window.angular); diff --git a/src/UmbracoUrlHandling/Umbraco/lib/angular/1.1.5/angular-scenario.js b/src/UmbracoUrlHandling/Umbraco/lib/angular/1.1.5/angular-scenario.js new file mode 100644 index 0000000..3ead003 --- /dev/null +++ b/src/UmbracoUrlHandling/Umbraco/lib/angular/1.1.5/angular-scenario.js @@ -0,0 +1,28463 @@ +/*! + * jQuery JavaScript Library v1.8.2 + * http://jquery.com/ + * + * Includes Sizzle.js + * http://sizzlejs.com/ + * + * Copyright 2012 jQuery Foundation and other contributors + * Released under the MIT license + * http://jquery.org/license + * + * Date: Thu Sep 20 2012 21:13:05 GMT-0400 (Eastern Daylight Time) + */ +(function( window, undefined ) { +'use strict'; +var + // A central reference to the root jQuery(document) + rootjQuery, + + // The deferred used on DOM ready + readyList, + + // Use the correct document accordingly with window argument (sandbox) + document = window.document, + location = window.location, + navigator = window.navigator, + + // Map over jQuery in case of overwrite + _jQuery = window.jQuery, + + // Map over the $ in case of overwrite + _$ = window.$, + + // Save a reference to some core methods + core_push = Array.prototype.push, + core_slice = Array.prototype.slice, + core_indexOf = Array.prototype.indexOf, + core_toString = Object.prototype.toString, + core_hasOwn = Object.prototype.hasOwnProperty, + core_trim = String.prototype.trim, + + // Define a local copy of jQuery + jQuery = function( selector, context ) { + // The jQuery object is actually just the init constructor 'enhanced' + return new jQuery.fn.init( selector, context, rootjQuery ); + }, + + // Used for matching numbers + core_pnum = /[\-+]?(?:\d*\.|)\d+(?:[eE][\-+]?\d+|)/.source, + + // Used for detecting and trimming whitespace + core_rnotwhite = /\S/, + core_rspace = /\s+/, + + // Make sure we trim BOM and NBSP (here's looking at you, Safari 5.0 and IE) + rtrim = /^[\s\uFEFF\xA0]+|[\s\uFEFF\xA0]+$/g, + + // A simple way to check for HTML strings + // Prioritize #id over to avoid XSS via location.hash (#9521) + rquickExpr = /^(?:[^#<]*(<[\w\W]+>)[^>]*$|#([\w\-]*)$)/, + + // Match a standalone tag + rsingleTag = /^<(\w+)\s*\/?>(?:<\/\1>|)$/, + + // JSON RegExp + rvalidchars = /^[\],:{}\s]*$/, + rvalidbraces = /(?:^|:|,)(?:\s*\[)+/g, + rvalidescape = /\\(?:["\\\/bfnrt]|u[\da-fA-F]{4})/g, + rvalidtokens = /"[^"\\\r\n]*"|true|false|null|-?(?:\d\d*\.|)\d+(?:[eE][\-+]?\d+|)/g, + + // Matches dashed string for camelizing + rmsPrefix = /^-ms-/, + rdashAlpha = /-([\da-z])/gi, + + // Used by jQuery.camelCase as callback to replace() + fcamelCase = function( all, letter ) { + return ( letter + "" ).toUpperCase(); + }, + + // The ready event handler and self cleanup method + DOMContentLoaded = function() { + if ( document.addEventListener ) { + document.removeEventListener( "DOMContentLoaded", DOMContentLoaded, false ); + jQuery.ready(); + } else if ( document.readyState === "complete" ) { + // we're here because readyState === "complete" in oldIE + // which is good enough for us to call the dom ready! + document.detachEvent( "onreadystatechange", DOMContentLoaded ); + jQuery.ready(); + } + }, + + // [[Class]] -> type pairs + class2type = {}; + +jQuery.fn = jQuery.prototype = { + constructor: jQuery, + init: function( selector, context, rootjQuery ) { + var match, elem, ret, doc; + + // Handle $(""), $(null), $(undefined), $(false) + if ( !selector ) { + return this; + } + + // Handle $(DOMElement) + if ( selector.nodeType ) { + this.context = this[0] = selector; + this.length = 1; + return this; + } + + // Handle HTML strings + if ( typeof selector === "string" ) { + if ( selector.charAt(0) === "<" && selector.charAt( selector.length - 1 ) === ">" && selector.length >= 3 ) { + // Assume that strings that start and end with <> are HTML and skip the regex check + match = [ null, selector, null ]; + + } else { + match = rquickExpr.exec( selector ); + } + + // Match html or make sure no context is specified for #id + if ( match && (match[1] || !context) ) { + + // HANDLE: $(html) -> $(array) + if ( match[1] ) { + context = context instanceof jQuery ? context[0] : context; + doc = ( context && context.nodeType ? context.ownerDocument || context : document ); + + // scripts is true for back-compat + selector = jQuery.parseHTML( match[1], doc, true ); + if ( rsingleTag.test( match[1] ) && jQuery.isPlainObject( context ) ) { + this.attr.call( selector, context, true ); + } + + return jQuery.merge( this, selector ); + + // HANDLE: $(#id) + } else { + elem = document.getElementById( match[2] ); + + // Check parentNode to catch when Blackberry 4.6 returns + // nodes that are no longer in the document #6963 + if ( elem && elem.parentNode ) { + // Handle the case where IE and Opera return items + // by name instead of ID + if ( elem.id !== match[2] ) { + return rootjQuery.find( selector ); + } + + // Otherwise, we inject the element directly into the jQuery object + this.length = 1; + this[0] = elem; + } + + this.context = document; + this.selector = selector; + return this; + } + + // HANDLE: $(expr, $(...)) + } else if ( !context || context.jquery ) { + return ( context || rootjQuery ).find( selector ); + + // HANDLE: $(expr, context) + // (which is just equivalent to: $(context).find(expr) + } else { + return this.constructor( context ).find( selector ); + } + + // HANDLE: $(function) + // Shortcut for document ready + } else if ( jQuery.isFunction( selector ) ) { + return rootjQuery.ready( selector ); + } + + if ( selector.selector !== undefined ) { + this.selector = selector.selector; + this.context = selector.context; + } + + return jQuery.makeArray( selector, this ); + }, + + // Start with an empty selector + selector: "", + + // The current version of jQuery being used + jquery: "1.8.2", + + // The default length of a jQuery object is 0 + length: 0, + + // The number of elements contained in the matched element set + size: function() { + return this.length; + }, + + toArray: function() { + return core_slice.call( this ); + }, + + // Get the Nth element in the matched element set OR + // Get the whole matched element set as a clean array + get: function( num ) { + return num == null ? + + // Return a 'clean' array + this.toArray() : + + // Return just the object + ( num < 0 ? this[ this.length + num ] : this[ num ] ); + }, + + // Take an array of elements and push it onto the stack + // (returning the new matched element set) + pushStack: function( elems, name, selector ) { + + // Build a new jQuery matched element set + var ret = jQuery.merge( this.constructor(), elems ); + + // Add the old object onto the stack (as a reference) + ret.prevObject = this; + + ret.context = this.context; + + if ( name === "find" ) { + ret.selector = this.selector + ( this.selector ? " " : "" ) + selector; + } else if ( name ) { + ret.selector = this.selector + "." + name + "(" + selector + ")"; + } + + // Return the newly-formed element set + return ret; + }, + + // Execute a callback for every element in the matched set. + // (You can seed the arguments with an array of args, but this is + // only used internally.) + each: function( callback, args ) { + return jQuery.each( this, callback, args ); + }, + + ready: function( fn ) { + // Add the callback + jQuery.ready.promise().done( fn ); + + return this; + }, + + eq: function( i ) { + i = +i; + return i === -1 ? + this.slice( i ) : + this.slice( i, i + 1 ); + }, + + first: function() { + return this.eq( 0 ); + }, + + last: function() { + return this.eq( -1 ); + }, + + slice: function() { + return this.pushStack( core_slice.apply( this, arguments ), + "slice", core_slice.call(arguments).join(",") ); + }, + + map: function( callback ) { + return this.pushStack( jQuery.map(this, function( elem, i ) { + return callback.call( elem, i, elem ); + })); + }, + + end: function() { + return this.prevObject || this.constructor(null); + }, + + // For internal use only. + // Behaves like an Array's method, not like a jQuery method. + push: core_push, + sort: [].sort, + splice: [].splice +}; + +// Give the init function the jQuery prototype for later instantiation +jQuery.fn.init.prototype = jQuery.fn; + +jQuery.extend = jQuery.fn.extend = function() { + var options, name, src, copy, copyIsArray, clone, + target = arguments[0] || {}, + i = 1, + length = arguments.length, + deep = false; + + // Handle a deep copy situation + if ( typeof target === "boolean" ) { + deep = target; + target = arguments[1] || {}; + // skip the boolean and the target + i = 2; + } + + // Handle case when target is a string or something (possible in deep copy) + if ( typeof target !== "object" && !jQuery.isFunction(target) ) { + target = {}; + } + + // extend jQuery itself if only one argument is passed + if ( length === i ) { + target = this; + --i; + } + + for ( ; i < length; i++ ) { + // Only deal with non-null/undefined values + if ( (options = arguments[ i ]) != null ) { + // Extend the base object + for ( name in options ) { + src = target[ name ]; + copy = options[ name ]; + + // Prevent never-ending loop + if ( target === copy ) { + continue; + } + + // Recurse if we're merging plain objects or arrays + if ( deep && copy && ( jQuery.isPlainObject(copy) || (copyIsArray = jQuery.isArray(copy)) ) ) { + if ( copyIsArray ) { + copyIsArray = false; + clone = src && jQuery.isArray(src) ? src : []; + + } else { + clone = src && jQuery.isPlainObject(src) ? src : {}; + } + + // Never move original objects, clone them + target[ name ] = jQuery.extend( deep, clone, copy ); + + // Don't bring in undefined values + } else if ( copy !== undefined ) { + target[ name ] = copy; + } + } + } + } + + // Return the modified object + return target; +}; + +jQuery.extend({ + noConflict: function( deep ) { + if ( window.$ === jQuery ) { + window.$ = _$; + } + + if ( deep && window.jQuery === jQuery ) { + window.jQuery = _jQuery; + } + + return jQuery; + }, + + // Is the DOM ready to be used? Set to true once it occurs. + isReady: false, + + // A counter to track how many items to wait for before + // the ready event fires. See #6781 + readyWait: 1, + + // Hold (or release) the ready event + holdReady: function( hold ) { + if ( hold ) { + jQuery.readyWait++; + } else { + jQuery.ready( true ); + } + }, + + // Handle when the DOM is ready + ready: function( wait ) { + + // Abort if there are pending holds or we're already ready + if ( wait === true ? --jQuery.readyWait : jQuery.isReady ) { + return; + } + + // Make sure body exists, at least, in case IE gets a little overzealous (ticket #5443). + if ( !document.body ) { + return setTimeout( jQuery.ready, 1 ); + } + + // Remember that the DOM is ready + jQuery.isReady = true; + + // If a normal DOM Ready event fired, decrement, and wait if need be + if ( wait !== true && --jQuery.readyWait > 0 ) { + return; + } + + // If there are functions bound, to execute + readyList.resolveWith( document, [ jQuery ] ); + + // Trigger any bound ready events + if ( jQuery.fn.trigger ) { + jQuery( document ).trigger("ready").off("ready"); + } + }, + + // See test/unit/core.js for details concerning isFunction. + // Since version 1.3, DOM methods and functions like alert + // aren't supported. They return false on IE (#2968). + isFunction: function( obj ) { + return jQuery.type(obj) === "function"; + }, + + isArray: Array.isArray || function( obj ) { + return jQuery.type(obj) === "array"; + }, + + isWindow: function( obj ) { + return obj != null && obj == obj.window; + }, + + isNumeric: function( obj ) { + return !isNaN( parseFloat(obj) ) && isFinite( obj ); + }, + + type: function( obj ) { + return obj == null ? + String( obj ) : + class2type[ core_toString.call(obj) ] || "object"; + }, + + isPlainObject: function( obj ) { + // Must be an Object. + // Because of IE, we also have to check the presence of the constructor property. + // Make sure that DOM nodes and window objects don't pass through, as well + if ( !obj || jQuery.type(obj) !== "object" || obj.nodeType || jQuery.isWindow( obj ) ) { + return false; + } + + try { + // Not own constructor property must be Object + if ( obj.constructor && + !core_hasOwn.call(obj, "constructor") && + !core_hasOwn.call(obj.constructor.prototype, "isPrototypeOf") ) { + return false; + } + } catch ( e ) { + // IE8,9 Will throw exceptions on certain host objects #9897 + return false; + } + + // Own properties are enumerated firstly, so to speed up, + // if last one is own, then all properties are own. + + var key; + for ( key in obj ) {} + + return key === undefined || core_hasOwn.call( obj, key ); + }, + + isEmptyObject: function( obj ) { + var name; + for ( name in obj ) { + return false; + } + return true; + }, + + error: function( msg ) { + throw new Error( msg ); + }, + + // data: string of html + // context (optional): If specified, the fragment will be created in this context, defaults to document + // scripts (optional): If true, will include scripts passed in the html string + parseHTML: function( data, context, scripts ) { + var parsed; + if ( !data || typeof data !== "string" ) { + return null; + } + if ( typeof context === "boolean" ) { + scripts = context; + context = 0; + } + context = context || document; + + // Single tag + if ( (parsed = rsingleTag.exec( data )) ) { + return [ context.createElement( parsed[1] ) ]; + } + + parsed = jQuery.buildFragment( [ data ], context, scripts ? null : [] ); + return jQuery.merge( [], + (parsed.cacheable ? jQuery.clone( parsed.fragment ) : parsed.fragment).childNodes ); + }, + + parseJSON: function( data ) { + if ( !data || typeof data !== "string") { + return null; + } + + // Make sure leading/trailing whitespace is removed (IE can't handle it) + data = jQuery.trim( data ); + + // Attempt to parse using the native JSON parser first + if ( window.JSON && window.JSON.parse ) { + return window.JSON.parse( data ); + } + + // Make sure the incoming data is actual JSON + // Logic borrowed from http://json.org/json2.js + if ( rvalidchars.test( data.replace( rvalidescape, "@" ) + .replace( rvalidtokens, "]" ) + .replace( rvalidbraces, "")) ) { + + return ( new Function( "return " + data ) )(); + + } + jQuery.error( "Invalid JSON: " + data ); + }, + + // Cross-browser xml parsing + parseXML: function( data ) { + var xml, tmp; + if ( !data || typeof data !== "string" ) { + return null; + } + try { + if ( window.DOMParser ) { // Standard + tmp = new DOMParser(); + xml = tmp.parseFromString( data , "text/xml" ); + } else { // IE + xml = new ActiveXObject( "Microsoft.XMLDOM" ); + xml.async = "false"; + xml.loadXML( data ); + } + } catch( e ) { + xml = undefined; + } + if ( !xml || !xml.documentElement || xml.getElementsByTagName( "parsererror" ).length ) { + jQuery.error( "Invalid XML: " + data ); + } + return xml; + }, + + noop: function() {}, + + // Evaluates a script in a global context + // Workarounds based on findings by Jim Driscoll + // http://weblogs.java.net/blog/driscoll/archive/2009/09/08/eval-javascript-global-context + globalEval: function( data ) { + if ( data && core_rnotwhite.test( data ) ) { + // We use execScript on Internet Explorer + // We use an anonymous function so that context is window + // rather than jQuery in Firefox + ( window.execScript || function( data ) { + window[ "eval" ].call( window, data ); + } )( data ); + } + }, + + // Convert dashed to camelCase; used by the css and data modules + // Microsoft forgot to hump their vendor prefix (#9572) + camelCase: function( string ) { + return string.replace( rmsPrefix, "ms-" ).replace( rdashAlpha, fcamelCase ); + }, + + nodeName: function( elem, name ) { + return elem.nodeName && elem.nodeName.toLowerCase() === name.toLowerCase(); + }, + + // args is for internal usage only + each: function( obj, callback, args ) { + var name, + i = 0, + length = obj.length, + isObj = length === undefined || jQuery.isFunction( obj ); + + if ( args ) { + if ( isObj ) { + for ( name in obj ) { + if ( callback.apply( obj[ name ], args ) === false ) { + break; + } + } + } else { + for ( ; i < length; ) { + if ( callback.apply( obj[ i++ ], args ) === false ) { + break; + } + } + } + + // A special, fast, case for the most common use of each + } else { + if ( isObj ) { + for ( name in obj ) { + if ( callback.call( obj[ name ], name, obj[ name ] ) === false ) { + break; + } + } + } else { + for ( ; i < length; ) { + if ( callback.call( obj[ i ], i, obj[ i++ ] ) === false ) { + break; + } + } + } + } + + return obj; + }, + + // Use native String.trim function wherever possible + trim: core_trim && !core_trim.call("\uFEFF\xA0") ? + function( text ) { + return text == null ? + "" : + core_trim.call( text ); + } : + + // Otherwise use our own trimming functionality + function( text ) { + return text == null ? + "" : + ( text + "" ).replace( rtrim, "" ); + }, + + // results is for internal usage only + makeArray: function( arr, results ) { + var type, + ret = results || []; + + if ( arr != null ) { + // The window, strings (and functions) also have 'length' + // Tweaked logic slightly to handle Blackberry 4.7 RegExp issues #6930 + type = jQuery.type( arr ); + + if ( arr.length == null || type === "string" || type === "function" || type === "regexp" || jQuery.isWindow( arr ) ) { + core_push.call( ret, arr ); + } else { + jQuery.merge( ret, arr ); + } + } + + return ret; + }, + + inArray: function( elem, arr, i ) { + var len; + + if ( arr ) { + if ( core_indexOf ) { + return core_indexOf.call( arr, elem, i ); + } + + len = arr.length; + i = i ? i < 0 ? Math.max( 0, len + i ) : i : 0; + + for ( ; i < len; i++ ) { + // Skip accessing in sparse arrays + if ( i in arr && arr[ i ] === elem ) { + return i; + } + } + } + + return -1; + }, + + merge: function( first, second ) { + var l = second.length, + i = first.length, + j = 0; + + if ( typeof l === "number" ) { + for ( ; j < l; j++ ) { + first[ i++ ] = second[ j ]; + } + + } else { + while ( second[j] !== undefined ) { + first[ i++ ] = second[ j++ ]; + } + } + + first.length = i; + + return first; + }, + + grep: function( elems, callback, inv ) { + var retVal, + ret = [], + i = 0, + length = elems.length; + inv = !!inv; + + // Go through the array, only saving the items + // that pass the validator function + for ( ; i < length; i++ ) { + retVal = !!callback( elems[ i ], i ); + if ( inv !== retVal ) { + ret.push( elems[ i ] ); + } + } + + return ret; + }, + + // arg is for internal usage only + map: function( elems, callback, arg ) { + var value, key, + ret = [], + i = 0, + length = elems.length, + // jquery objects are treated as arrays + isArray = elems instanceof jQuery || length !== undefined && typeof length === "number" && ( ( length > 0 && elems[ 0 ] && elems[ length -1 ] ) || length === 0 || jQuery.isArray( elems ) ) ; + + // Go through the array, translating each of the items to their + if ( isArray ) { + for ( ; i < length; i++ ) { + value = callback( elems[ i ], i, arg ); + + if ( value != null ) { + ret[ ret.length ] = value; + } + } + + // Go through every key on the object, + } else { + for ( key in elems ) { + value = callback( elems[ key ], key, arg ); + + if ( value != null ) { + ret[ ret.length ] = value; + } + } + } + + // Flatten any nested arrays + return ret.concat.apply( [], ret ); + }, + + // A global GUID counter for objects + guid: 1, + + // Bind a function to a context, optionally partially applying any + // arguments. + proxy: function( fn, context ) { + var tmp, args, proxy; + + if ( typeof context === "string" ) { + tmp = fn[ context ]; + context = fn; + fn = tmp; + } + + // Quick check to determine if target is callable, in the spec + // this throws a TypeError, but we will just return undefined. + if ( !jQuery.isFunction( fn ) ) { + return undefined; + } + + // Simulated bind + args = core_slice.call( arguments, 2 ); + proxy = function() { + return fn.apply( context, args.concat( core_slice.call( arguments ) ) ); + }; + + // Set the guid of unique handler to the same of original handler, so it can be removed + proxy.guid = fn.guid = fn.guid || jQuery.guid++; + + return proxy; + }, + + // Multifunctional method to get and set values of a collection + // The value/s can optionally be executed if it's a function + access: function( elems, fn, key, value, chainable, emptyGet, pass ) { + var exec, + bulk = key == null, + i = 0, + length = elems.length; + + // Sets many values + if ( key && typeof key === "object" ) { + for ( i in key ) { + jQuery.access( elems, fn, i, key[i], 1, emptyGet, value ); + } + chainable = 1; + + // Sets one value + } else if ( value !== undefined ) { + // Optionally, function values get executed if exec is true + exec = pass === undefined && jQuery.isFunction( value ); + + if ( bulk ) { + // Bulk operations only iterate when executing function values + if ( exec ) { + exec = fn; + fn = function( elem, key, value ) { + return exec.call( jQuery( elem ), value ); + }; + + // Otherwise they run against the entire set + } else { + fn.call( elems, value ); + fn = null; + } + } + + if ( fn ) { + for (; i < length; i++ ) { + fn( elems[i], key, exec ? value.call( elems[i], i, fn( elems[i], key ) ) : value, pass ); + } + } + + chainable = 1; + } + + return chainable ? + elems : + + // Gets + bulk ? + fn.call( elems ) : + length ? fn( elems[0], key ) : emptyGet; + }, + + now: function() { + return ( new Date() ).getTime(); + } +}); + +jQuery.ready.promise = function( obj ) { + if ( !readyList ) { + + readyList = jQuery.Deferred(); + + // Catch cases where $(document).ready() is called after the browser event has already occurred. + // we once tried to use readyState "interactive" here, but it caused issues like the one + // discovered by ChrisS here: http://bugs.jquery.com/ticket/12282#comment:15 + if ( document.readyState === "complete" ) { + // Handle it asynchronously to allow scripts the opportunity to delay ready + setTimeout( jQuery.ready, 1 ); + + // Standards-based browsers support DOMContentLoaded + } else if ( document.addEventListener ) { + // Use the handy event callback + document.addEventListener( "DOMContentLoaded", DOMContentLoaded, false ); + + // A fallback to window.onload, that will always work + window.addEventListener( "load", jQuery.ready, false ); + + // If IE event model is used + } else { + // Ensure firing before onload, maybe late but safe also for iframes + document.attachEvent( "onreadystatechange", DOMContentLoaded ); + + // A fallback to window.onload, that will always work + window.attachEvent( "onload", jQuery.ready ); + + // If IE and not a frame + // continually check to see if the document is ready + var top = false; + + try { + top = window.frameElement == null && document.documentElement; + } catch(e) {} + + if ( top && top.doScroll ) { + (function doScrollCheck() { + if ( !jQuery.isReady ) { + + try { + // Use the trick by Diego Perini + // http://javascript.nwbox.com/IEContentLoaded/ + top.doScroll("left"); + } catch(e) { + return setTimeout( doScrollCheck, 50 ); + } + + // and execute any waiting functions + jQuery.ready(); + } + })(); + } + } + } + return readyList.promise( obj ); +}; + +// Populate the class2type map +jQuery.each("Boolean Number String Function Array Date RegExp Object".split(" "), function(i, name) { + class2type[ "[object " + name + "]" ] = name.toLowerCase(); +}); + +// All jQuery objects should point back to these +rootjQuery = jQuery(document); +// String to Object options format cache +var optionsCache = {}; + +// Convert String-formatted options into Object-formatted ones and store in cache +function createOptions( options ) { + var object = optionsCache[ options ] = {}; + jQuery.each( options.split( core_rspace ), function( _, flag ) { + object[ flag ] = true; + }); + return object; +} + +/* + * Create a callback list using the following parameters: + * + * options: an optional list of space-separated options that will change how + * the callback list behaves or a more traditional option object + * + * By default a callback list will act like an event callback list and can be + * "fired" multiple times. + * + * Possible options: + * + * once: will ensure the callback list can only be fired once (like a Deferred) + * + * memory: will keep track of previous values and will call any callback added + * after the list has been fired right away with the latest "memorized" + * values (like a Deferred) + * + * unique: will ensure a callback can only be added once (no duplicate in the list) + * + * stopOnFalse: interrupt callings when a callback returns false + * + */ +jQuery.Callbacks = function( options ) { + + // Convert options from String-formatted to Object-formatted if needed + // (we check in cache first) + options = typeof options === "string" ? + ( optionsCache[ options ] || createOptions( options ) ) : + jQuery.extend( {}, options ); + + var // Last fire value (for non-forgettable lists) + memory, + // Flag to know if list was already fired + fired, + // Flag to know if list is currently firing + firing, + // First callback to fire (used internally by add and fireWith) + firingStart, + // End of the loop when firing + firingLength, + // Index of currently firing callback (modified by remove if needed) + firingIndex, + // Actual callback list + list = [], + // Stack of fire calls for repeatable lists + stack = !options.once && [], + // Fire callbacks + fire = function( data ) { + memory = options.memory && data; + fired = true; + firingIndex = firingStart || 0; + firingStart = 0; + firingLength = list.length; + firing = true; + for ( ; list && firingIndex < firingLength; firingIndex++ ) { + if ( list[ firingIndex ].apply( data[ 0 ], data[ 1 ] ) === false && options.stopOnFalse ) { + memory = false; // To prevent further calls using add + break; + } + } + firing = false; + if ( list ) { + if ( stack ) { + if ( stack.length ) { + fire( stack.shift() ); + } + } else if ( memory ) { + list = []; + } else { + self.disable(); + } + } + }, + // Actual Callbacks object + self = { + // Add a callback or a collection of callbacks to the list + add: function() { + if ( list ) { + // First, we save the current length + var start = list.length; + (function add( args ) { + jQuery.each( args, function( _, arg ) { + var type = jQuery.type( arg ); + if ( type === "function" && ( !options.unique || !self.has( arg ) ) ) { + list.push( arg ); + } else if ( arg && arg.length && type !== "string" ) { + // Inspect recursively + add( arg ); + } + }); + })( arguments ); + // Do we need to add the callbacks to the + // current firing batch? + if ( firing ) { + firingLength = list.length; + // With memory, if we're not firing then + // we should call right away + } else if ( memory ) { + firingStart = start; + fire( memory ); + } + } + return this; + }, + // Remove a callback from the list + remove: function() { + if ( list ) { + jQuery.each( arguments, function( _, arg ) { + var index; + while( ( index = jQuery.inArray( arg, list, index ) ) > -1 ) { + list.splice( index, 1 ); + // Handle firing indexes + if ( firing ) { + if ( index <= firingLength ) { + firingLength--; + } + if ( index <= firingIndex ) { + firingIndex--; + } + } + } + }); + } + return this; + }, + // Control if a given callback is in the list + has: function( fn ) { + return jQuery.inArray( fn, list ) > -1; + }, + // Remove all callbacks from the list + empty: function() { + list = []; + return this; + }, + // Have the list do nothing anymore + disable: function() { + list = stack = memory = undefined; + return this; + }, + // Is it disabled? + disabled: function() { + return !list; + }, + // Lock the list in its current state + lock: function() { + stack = undefined; + if ( !memory ) { + self.disable(); + } + return this; + }, + // Is it locked? + locked: function() { + return !stack; + }, + // Call all callbacks with the given context and arguments + fireWith: function( context, args ) { + args = args || []; + args = [ context, args.slice ? args.slice() : args ]; + if ( list && ( !fired || stack ) ) { + if ( firing ) { + stack.push( args ); + } else { + fire( args ); + } + } + return this; + }, + // Call all the callbacks with the given arguments + fire: function() { + self.fireWith( this, arguments ); + return this; + }, + // To know if the callbacks have already been called at least once + fired: function() { + return !!fired; + } + }; + + return self; +}; +jQuery.extend({ + + Deferred: function( func ) { + var tuples = [ + // action, add listener, listener list, final state + [ "resolve", "done", jQuery.Callbacks("once memory"), "resolved" ], + [ "reject", "fail", jQuery.Callbacks("once memory"), "rejected" ], + [ "notify", "progress", jQuery.Callbacks("memory") ] + ], + state = "pending", + promise = { + state: function() { + return state; + }, + always: function() { + deferred.done( arguments ).fail( arguments ); + return this; + }, + then: function( /* fnDone, fnFail, fnProgress */ ) { + var fns = arguments; + return jQuery.Deferred(function( newDefer ) { + jQuery.each( tuples, function( i, tuple ) { + var action = tuple[ 0 ], + fn = fns[ i ]; + // deferred[ done | fail | progress ] for forwarding actions to newDefer + deferred[ tuple[1] ]( jQuery.isFunction( fn ) ? + function() { + var returned = fn.apply( this, arguments ); + if ( returned && jQuery.isFunction( returned.promise ) ) { + returned.promise() + .done( newDefer.resolve ) + .fail( newDefer.reject ) + .progress( newDefer.notify ); + } else { + newDefer[ action + "With" ]( this === deferred ? newDefer : this, [ returned ] ); + } + } : + newDefer[ action ] + ); + }); + fns = null; + }).promise(); + }, + // Get a promise for this deferred + // If obj is provided, the promise aspect is added to the object + promise: function( obj ) { + return obj != null ? jQuery.extend( obj, promise ) : promise; + } + }, + deferred = {}; + + // Keep pipe for back-compat + promise.pipe = promise.then; + + // Add list-specific methods + jQuery.each( tuples, function( i, tuple ) { + var list = tuple[ 2 ], + stateString = tuple[ 3 ]; + + // promise[ done | fail | progress ] = list.add + promise[ tuple[1] ] = list.add; + + // Handle state + if ( stateString ) { + list.add(function() { + // state = [ resolved | rejected ] + state = stateString; + + // [ reject_list | resolve_list ].disable; progress_list.lock + }, tuples[ i ^ 1 ][ 2 ].disable, tuples[ 2 ][ 2 ].lock ); + } + + // deferred[ resolve | reject | notify ] = list.fire + deferred[ tuple[0] ] = list.fire; + deferred[ tuple[0] + "With" ] = list.fireWith; + }); + + // Make the deferred a promise + promise.promise( deferred ); + + // Call given func if any + if ( func ) { + func.call( deferred, deferred ); + } + + // All done! + return deferred; + }, + + // Deferred helper + when: function( subordinate /* , ..., subordinateN */ ) { + var i = 0, + resolveValues = core_slice.call( arguments ), + length = resolveValues.length, + + // the count of uncompleted subordinates + remaining = length !== 1 || ( subordinate && jQuery.isFunction( subordinate.promise ) ) ? length : 0, + + // the master Deferred. If resolveValues consist of only a single Deferred, just use that. + deferred = remaining === 1 ? subordinate : jQuery.Deferred(), + + // Update function for both resolve and progress values + updateFunc = function( i, contexts, values ) { + return function( value ) { + contexts[ i ] = this; + values[ i ] = arguments.length > 1 ? core_slice.call( arguments ) : value; + if( values === progressValues ) { + deferred.notifyWith( contexts, values ); + } else if ( !( --remaining ) ) { + deferred.resolveWith( contexts, values ); + } + }; + }, + + progressValues, progressContexts, resolveContexts; + + // add listeners to Deferred subordinates; treat others as resolved + if ( length > 1 ) { + progressValues = new Array( length ); + progressContexts = new Array( length ); + resolveContexts = new Array( length ); + for ( ; i < length; i++ ) { + if ( resolveValues[ i ] && jQuery.isFunction( resolveValues[ i ].promise ) ) { + resolveValues[ i ].promise() + .done( updateFunc( i, resolveContexts, resolveValues ) ) + .fail( deferred.reject ) + .progress( updateFunc( i, progressContexts, progressValues ) ); + } else { + --remaining; + } + } + } + + // if we're not waiting on anything, resolve the master + if ( !remaining ) { + deferred.resolveWith( resolveContexts, resolveValues ); + } + + return deferred.promise(); + } +}); +jQuery.support = (function() { + + var support, + all, + a, + select, + opt, + input, + fragment, + eventName, + i, + isSupported, + clickFn, + div = document.createElement("div"); + + // Preliminary tests + div.setAttribute( "className", "t" ); + div.innerHTML = "
    a"; + + all = div.getElementsByTagName("*"); + a = div.getElementsByTagName("a")[ 0 ]; + a.style.cssText = "top:1px;float:left;opacity:.5"; + + // Can't get basic test support + if ( !all || !all.length ) { + return {}; + } + + // First batch of supports tests + select = document.createElement("select"); + opt = select.appendChild( document.createElement("option") ); + input = div.getElementsByTagName("input")[ 0 ]; + + support = { + // IE strips leading whitespace when .innerHTML is used + leadingWhitespace: ( div.firstChild.nodeType === 3 ), + + // Make sure that tbody elements aren't automatically inserted + // IE will insert them into empty tables + tbody: !div.getElementsByTagName("tbody").length, + + // Make sure that link elements get serialized correctly by innerHTML + // This requires a wrapper element in IE + htmlSerialize: !!div.getElementsByTagName("link").length, + + // Get the style information from getAttribute + // (IE uses .cssText instead) + style: /top/.test( a.getAttribute("style") ), + + // Make sure that URLs aren't manipulated + // (IE normalizes it by default) + hrefNormalized: ( a.getAttribute("href") === "/a" ), + + // Make sure that element opacity exists + // (IE uses filter instead) + // Use a regex to work around a WebKit issue. See #5145 + opacity: /^0.5/.test( a.style.opacity ), + + // Verify style float existence + // (IE uses styleFloat instead of cssFloat) + cssFloat: !!a.style.cssFloat, + + // Make sure that if no value is specified for a checkbox + // that it defaults to "on". + // (WebKit defaults to "" instead) + checkOn: ( input.value === "on" ), + + // Make sure that a selected-by-default option has a working selected property. + // (WebKit defaults to false instead of true, IE too, if it's in an optgroup) + optSelected: opt.selected, + + // Test setAttribute on camelCase class. If it works, we need attrFixes when doing get/setAttribute (ie6/7) + getSetAttribute: div.className !== "t", + + // Tests for enctype support on a form(#6743) + enctype: !!document.createElement("form").enctype, + + // Makes sure cloning an html5 element does not cause problems + // Where outerHTML is undefined, this still works + html5Clone: document.createElement("nav").cloneNode( true ).outerHTML !== "<:nav>", + + // jQuery.support.boxModel DEPRECATED in 1.8 since we don't support Quirks Mode + boxModel: ( document.compatMode === "CSS1Compat" ), + + // Will be defined later + submitBubbles: true, + changeBubbles: true, + focusinBubbles: false, + deleteExpando: true, + noCloneEvent: true, + inlineBlockNeedsLayout: false, + shrinkWrapBlocks: false, + reliableMarginRight: true, + boxSizingReliable: true, + pixelPosition: false + }; + + // Make sure checked status is properly cloned + input.checked = true; + support.noCloneChecked = input.cloneNode( true ).checked; + + // Make sure that the options inside disabled selects aren't marked as disabled + // (WebKit marks them as disabled) + select.disabled = true; + support.optDisabled = !opt.disabled; + + // Test to see if it's possible to delete an expando from an element + // Fails in Internet Explorer + try { + delete div.test; + } catch( e ) { + support.deleteExpando = false; + } + + if ( !div.addEventListener && div.attachEvent && div.fireEvent ) { + div.attachEvent( "onclick", clickFn = function() { + // Cloning a node shouldn't copy over any + // bound event handlers (IE does this) + support.noCloneEvent = false; + }); + div.cloneNode( true ).fireEvent("onclick"); + div.detachEvent( "onclick", clickFn ); + } + + // Check if a radio maintains its value + // after being appended to the DOM + input = document.createElement("input"); + input.value = "t"; + input.setAttribute( "type", "radio" ); + support.radioValue = input.value === "t"; + + input.setAttribute( "checked", "checked" ); + + // #11217 - WebKit loses check when the name is after the checked attribute + input.setAttribute( "name", "t" ); + + div.appendChild( input ); + fragment = document.createDocumentFragment(); + fragment.appendChild( div.lastChild ); + + // WebKit doesn't clone checked state correctly in fragments + support.checkClone = fragment.cloneNode( true ).cloneNode( true ).lastChild.checked; + + // Check if a disconnected checkbox will retain its checked + // value of true after appended to the DOM (IE6/7) + support.appendChecked = input.checked; + + fragment.removeChild( input ); + fragment.appendChild( div ); + + // Technique from Juriy Zaytsev + // http://perfectionkills.com/detecting-event-support-without-browser-sniffing/ + // We only care about the case where non-standard event systems + // are used, namely in IE. Short-circuiting here helps us to + // avoid an eval call (in setAttribute) which can cause CSP + // to go haywire. See: https://developer.mozilla.org/en/Security/CSP + if ( div.attachEvent ) { + for ( i in { + submit: true, + change: true, + focusin: true + }) { + eventName = "on" + i; + isSupported = ( eventName in div ); + if ( !isSupported ) { + div.setAttribute( eventName, "return;" ); + isSupported = ( typeof div[ eventName ] === "function" ); + } + support[ i + "Bubbles" ] = isSupported; + } + } + + // Run tests that need a body at doc ready + jQuery(function() { + var container, div, tds, marginDiv, + divReset = "padding:0;margin:0;border:0;display:block;overflow:hidden;", + body = document.getElementsByTagName("body")[0]; + + if ( !body ) { + // Return for frameset docs that don't have a body + return; + } + + container = document.createElement("div"); + container.style.cssText = "visibility:hidden;border:0;width:0;height:0;position:static;top:0;margin-top:1px"; + body.insertBefore( container, body.firstChild ); + + // Construct the test element + div = document.createElement("div"); + container.appendChild( div ); + + // Check if table cells still have offsetWidth/Height when they are set + // to display:none and there are still other visible table cells in a + // table row; if so, offsetWidth/Height are not reliable for use when + // determining if an element has been hidden directly using + // display:none (it is still safe to use offsets if a parent element is + // hidden; don safety goggles and see bug #4512 for more information). + // (only IE 8 fails this test) + div.innerHTML = "
    t
    "; + tds = div.getElementsByTagName("td"); + tds[ 0 ].style.cssText = "padding:0;margin:0;border:0;display:none"; + isSupported = ( tds[ 0 ].offsetHeight === 0 ); + + tds[ 0 ].style.display = ""; + tds[ 1 ].style.display = "none"; + + // Check if empty table cells still have offsetWidth/Height + // (IE <= 8 fail this test) + support.reliableHiddenOffsets = isSupported && ( tds[ 0 ].offsetHeight === 0 ); + + // Check box-sizing and margin behavior + div.innerHTML = ""; + div.style.cssText = "box-sizing:border-box;-moz-box-sizing:border-box;-webkit-box-sizing:border-box;padding:1px;border:1px;display:block;width:4px;margin-top:1%;position:absolute;top:1%;"; + support.boxSizing = ( div.offsetWidth === 4 ); + support.doesNotIncludeMarginInBodyOffset = ( body.offsetTop !== 1 ); + + // NOTE: To any future maintainer, we've window.getComputedStyle + // because jsdom on node.js will break without it. + if ( window.getComputedStyle ) { + support.pixelPosition = ( window.getComputedStyle( div, null ) || {} ).top !== "1%"; + support.boxSizingReliable = ( window.getComputedStyle( div, null ) || { width: "4px" } ).width === "4px"; + + // Check if div with explicit width and no margin-right incorrectly + // gets computed margin-right based on width of container. For more + // info see bug #3333 + // Fails in WebKit before Feb 2011 nightlies + // WebKit Bug 13343 - getComputedStyle returns wrong value for margin-right + marginDiv = document.createElement("div"); + marginDiv.style.cssText = div.style.cssText = divReset; + marginDiv.style.marginRight = marginDiv.style.width = "0"; + div.style.width = "1px"; + div.appendChild( marginDiv ); + support.reliableMarginRight = + !parseFloat( ( window.getComputedStyle( marginDiv, null ) || {} ).marginRight ); + } + + if ( typeof div.style.zoom !== "undefined" ) { + // Check if natively block-level elements act like inline-block + // elements when setting their display to 'inline' and giving + // them layout + // (IE < 8 does this) + div.innerHTML = ""; + div.style.cssText = divReset + "width:1px;padding:1px;display:inline;zoom:1"; + support.inlineBlockNeedsLayout = ( div.offsetWidth === 3 ); + + // Check if elements with layout shrink-wrap their children + // (IE 6 does this) + div.style.display = "block"; + div.style.overflow = "visible"; + div.innerHTML = "
    "; + div.firstChild.style.width = "5px"; + support.shrinkWrapBlocks = ( div.offsetWidth !== 3 ); + + container.style.zoom = 1; + } + + // Null elements to avoid leaks in IE + body.removeChild( container ); + container = div = tds = marginDiv = null; + }); + + // Null elements to avoid leaks in IE + fragment.removeChild( div ); + all = a = select = opt = input = fragment = div = null; + + return support; +})(); +var rbrace = /(?:\{[\s\S]*\}|\[[\s\S]*\])$/, + rmultiDash = /([A-Z])/g; + +jQuery.extend({ + cache: {}, + + deletedIds: [], + + // Remove at next major release (1.9/2.0) + uuid: 0, + + // Unique for each copy of jQuery on the page + // Non-digits removed to match rinlinejQuery + expando: "jQuery" + ( jQuery.fn.jquery + Math.random() ).replace( /\D/g, "" ), + + // The following elements throw uncatchable exceptions if you + // attempt to add expando properties to them. + noData: { + "embed": true, + // Ban all objects except for Flash (which handle expandos) + "object": "clsid:D27CDB6E-AE6D-11cf-96B8-444553540000", + "applet": true + }, + + hasData: function( elem ) { + elem = elem.nodeType ? jQuery.cache[ elem[jQuery.expando] ] : elem[ jQuery.expando ]; + return !!elem && !isEmptyDataObject( elem ); + }, + + data: function( elem, name, data, pvt /* Internal Use Only */ ) { + if ( !jQuery.acceptData( elem ) ) { + return; + } + + var thisCache, ret, + internalKey = jQuery.expando, + getByName = typeof name === "string", + + // We have to handle DOM nodes and JS objects differently because IE6-7 + // can't GC object references properly across the DOM-JS boundary + isNode = elem.nodeType, + + // Only DOM nodes need the global jQuery cache; JS object data is + // attached directly to the object so GC can occur automatically + cache = isNode ? jQuery.cache : elem, + + // Only defining an ID for JS objects if its cache already exists allows + // the code to shortcut on the same path as a DOM node with no cache + id = isNode ? elem[ internalKey ] : elem[ internalKey ] && internalKey; + + // Avoid doing any more work than we need to when trying to get data on an + // object that has no data at all + if ( (!id || !cache[id] || (!pvt && !cache[id].data)) && getByName && data === undefined ) { + return; + } + + if ( !id ) { + // Only DOM nodes need a new unique ID for each element since their data + // ends up in the global cache + if ( isNode ) { + elem[ internalKey ] = id = jQuery.deletedIds.pop() || jQuery.guid++; + } else { + id = internalKey; + } + } + + if ( !cache[ id ] ) { + cache[ id ] = {}; + + // Avoids exposing jQuery metadata on plain JS objects when the object + // is serialized using JSON.stringify + if ( !isNode ) { + cache[ id ].toJSON = jQuery.noop; + } + } + + // An object can be passed to jQuery.data instead of a key/value pair; this gets + // shallow copied over onto the existing cache + if ( typeof name === "object" || typeof name === "function" ) { + if ( pvt ) { + cache[ id ] = jQuery.extend( cache[ id ], name ); + } else { + cache[ id ].data = jQuery.extend( cache[ id ].data, name ); + } + } + + thisCache = cache[ id ]; + + // jQuery data() is stored in a separate object inside the object's internal data + // cache in order to avoid key collisions between internal data and user-defined + // data. + if ( !pvt ) { + if ( !thisCache.data ) { + thisCache.data = {}; + } + + thisCache = thisCache.data; + } + + if ( data !== undefined ) { + thisCache[ jQuery.camelCase( name ) ] = data; + } + + // Check for both converted-to-camel and non-converted data property names + // If a data property was specified + if ( getByName ) { + + // First Try to find as-is property data + ret = thisCache[ name ]; + + // Test for null|undefined property data + if ( ret == null ) { + + // Try to find the camelCased property + ret = thisCache[ jQuery.camelCase( name ) ]; + } + } else { + ret = thisCache; + } + + return ret; + }, + + removeData: function( elem, name, pvt /* Internal Use Only */ ) { + if ( !jQuery.acceptData( elem ) ) { + return; + } + + var thisCache, i, l, + + isNode = elem.nodeType, + + // See jQuery.data for more information + cache = isNode ? jQuery.cache : elem, + id = isNode ? elem[ jQuery.expando ] : jQuery.expando; + + // If there is already no cache entry for this object, there is no + // purpose in continuing + if ( !cache[ id ] ) { + return; + } + + if ( name ) { + + thisCache = pvt ? cache[ id ] : cache[ id ].data; + + if ( thisCache ) { + + // Support array or space separated string names for data keys + if ( !jQuery.isArray( name ) ) { + + // try the string as a key before any manipulation + if ( name in thisCache ) { + name = [ name ]; + } else { + + // split the camel cased version by spaces unless a key with the spaces exists + name = jQuery.camelCase( name ); + if ( name in thisCache ) { + name = [ name ]; + } else { + name = name.split(" "); + } + } + } + + for ( i = 0, l = name.length; i < l; i++ ) { + delete thisCache[ name[i] ]; + } + + // If there is no data left in the cache, we want to continue + // and let the cache object itself get destroyed + if ( !( pvt ? isEmptyDataObject : jQuery.isEmptyObject )( thisCache ) ) { + return; + } + } + } + + // See jQuery.data for more information + if ( !pvt ) { + delete cache[ id ].data; + + // Don't destroy the parent cache unless the internal data object + // had been the only thing left in it + if ( !isEmptyDataObject( cache[ id ] ) ) { + return; + } + } + + // Destroy the cache + if ( isNode ) { + jQuery.cleanData( [ elem ], true ); + + // Use delete when supported for expandos or `cache` is not a window per isWindow (#10080) + } else if ( jQuery.support.deleteExpando || cache != cache.window ) { + delete cache[ id ]; + + // When all else fails, null + } else { + cache[ id ] = null; + } + }, + + // For internal use only. + _data: function( elem, name, data ) { + return jQuery.data( elem, name, data, true ); + }, + + // A method for determining if a DOM node can handle the data expando + acceptData: function( elem ) { + var noData = elem.nodeName && jQuery.noData[ elem.nodeName.toLowerCase() ]; + + // nodes accept data unless otherwise specified; rejection can be conditional + return !noData || noData !== true && elem.getAttribute("classid") === noData; + } +}); + +jQuery.fn.extend({ + data: function( key, value ) { + var parts, part, attr, name, l, + elem = this[0], + i = 0, + data = null; + + // Gets all values + if ( key === undefined ) { + if ( this.length ) { + data = jQuery.data( elem ); + + if ( elem.nodeType === 1 && !jQuery._data( elem, "parsedAttrs" ) ) { + attr = elem.attributes; + for ( l = attr.length; i < l; i++ ) { + name = attr[i].name; + + if ( !name.indexOf( "data-" ) ) { + name = jQuery.camelCase( name.substring(5) ); + + dataAttr( elem, name, data[ name ] ); + } + } + jQuery._data( elem, "parsedAttrs", true ); + } + } + + return data; + } + + // Sets multiple values + if ( typeof key === "object" ) { + return this.each(function() { + jQuery.data( this, key ); + }); + } + + parts = key.split( ".", 2 ); + parts[1] = parts[1] ? "." + parts[1] : ""; + part = parts[1] + "!"; + + return jQuery.access( this, function( value ) { + + if ( value === undefined ) { + data = this.triggerHandler( "getData" + part, [ parts[0] ] ); + + // Try to fetch any internally stored data first + if ( data === undefined && elem ) { + data = jQuery.data( elem, key ); + data = dataAttr( elem, key, data ); + } + + return data === undefined && parts[1] ? + this.data( parts[0] ) : + data; + } + + parts[1] = value; + this.each(function() { + var self = jQuery( this ); + + self.triggerHandler( "setData" + part, parts ); + jQuery.data( this, key, value ); + self.triggerHandler( "changeData" + part, parts ); + }); + }, null, value, arguments.length > 1, null, false ); + }, + + removeData: function( key ) { + return this.each(function() { + jQuery.removeData( this, key ); + }); + } +}); + +function dataAttr( elem, key, data ) { + // If nothing was found internally, try to fetch any + // data from the HTML5 data-* attribute + if ( data === undefined && elem.nodeType === 1 ) { + + var name = "data-" + key.replace( rmultiDash, "-$1" ).toLowerCase(); + + data = elem.getAttribute( name ); + + if ( typeof data === "string" ) { + try { + data = data === "true" ? true : + data === "false" ? false : + data === "null" ? null : + // Only convert to a number if it doesn't change the string + +data + "" === data ? +data : + rbrace.test( data ) ? jQuery.parseJSON( data ) : + data; + } catch( e ) {} + + // Make sure we set the data so it isn't changed later + jQuery.data( elem, key, data ); + + } else { + data = undefined; + } + } + + return data; +} + +// checks a cache object for emptiness +function isEmptyDataObject( obj ) { + var name; + for ( name in obj ) { + + // if the public data object is empty, the private is still empty + if ( name === "data" && jQuery.isEmptyObject( obj[name] ) ) { + continue; + } + if ( name !== "toJSON" ) { + return false; + } + } + + return true; +} +jQuery.extend({ + queue: function( elem, type, data ) { + var queue; + + if ( elem ) { + type = ( type || "fx" ) + "queue"; + queue = jQuery._data( elem, type ); + + // Speed up dequeue by getting out quickly if this is just a lookup + if ( data ) { + if ( !queue || jQuery.isArray(data) ) { + queue = jQuery._data( elem, type, jQuery.makeArray(data) ); + } else { + queue.push( data ); + } + } + return queue || []; + } + }, + + dequeue: function( elem, type ) { + type = type || "fx"; + + var queue = jQuery.queue( elem, type ), + startLength = queue.length, + fn = queue.shift(), + hooks = jQuery._queueHooks( elem, type ), + next = function() { + jQuery.dequeue( elem, type ); + }; + + // If the fx queue is dequeued, always remove the progress sentinel + if ( fn === "inprogress" ) { + fn = queue.shift(); + startLength--; + } + + if ( fn ) { + + // Add a progress sentinel to prevent the fx queue from being + // automatically dequeued + if ( type === "fx" ) { + queue.unshift( "inprogress" ); + } + + // clear up the last queue stop function + delete hooks.stop; + fn.call( elem, next, hooks ); + } + + if ( !startLength && hooks ) { + hooks.empty.fire(); + } + }, + + // not intended for public consumption - generates a queueHooks object, or returns the current one + _queueHooks: function( elem, type ) { + var key = type + "queueHooks"; + return jQuery._data( elem, key ) || jQuery._data( elem, key, { + empty: jQuery.Callbacks("once memory").add(function() { + jQuery.removeData( elem, type + "queue", true ); + jQuery.removeData( elem, key, true ); + }) + }); + } +}); + +jQuery.fn.extend({ + queue: function( type, data ) { + var setter = 2; + + if ( typeof type !== "string" ) { + data = type; + type = "fx"; + setter--; + } + + if ( arguments.length < setter ) { + return jQuery.queue( this[0], type ); + } + + return data === undefined ? + this : + this.each(function() { + var queue = jQuery.queue( this, type, data ); + + // ensure a hooks for this queue + jQuery._queueHooks( this, type ); + + if ( type === "fx" && queue[0] !== "inprogress" ) { + jQuery.dequeue( this, type ); + } + }); + }, + dequeue: function( type ) { + return this.each(function() { + jQuery.dequeue( this, type ); + }); + }, + // Based off of the plugin by Clint Helfers, with permission. + // http://blindsignals.com/index.php/2009/07/jquery-delay/ + delay: function( time, type ) { + time = jQuery.fx ? jQuery.fx.speeds[ time ] || time : time; + type = type || "fx"; + + return this.queue( type, function( next, hooks ) { + var timeout = setTimeout( next, time ); + hooks.stop = function() { + clearTimeout( timeout ); + }; + }); + }, + clearQueue: function( type ) { + return this.queue( type || "fx", [] ); + }, + // Get a promise resolved when queues of a certain type + // are emptied (fx is the type by default) + promise: function( type, obj ) { + var tmp, + count = 1, + defer = jQuery.Deferred(), + elements = this, + i = this.length, + resolve = function() { + if ( !( --count ) ) { + defer.resolveWith( elements, [ elements ] ); + } + }; + + if ( typeof type !== "string" ) { + obj = type; + type = undefined; + } + type = type || "fx"; + + while( i-- ) { + tmp = jQuery._data( elements[ i ], type + "queueHooks" ); + if ( tmp && tmp.empty ) { + count++; + tmp.empty.add( resolve ); + } + } + resolve(); + return defer.promise( obj ); + } +}); +var nodeHook, boolHook, fixSpecified, + rclass = /[\t\r\n]/g, + rreturn = /\r/g, + rtype = /^(?:button|input)$/i, + rfocusable = /^(?:button|input|object|select|textarea)$/i, + rclickable = /^a(?:rea|)$/i, + rboolean = /^(?:autofocus|autoplay|async|checked|controls|defer|disabled|hidden|loop|multiple|open|readonly|required|scoped|selected)$/i, + getSetAttribute = jQuery.support.getSetAttribute; + +jQuery.fn.extend({ + attr: function( name, value ) { + return jQuery.access( this, jQuery.attr, name, value, arguments.length > 1 ); + }, + + removeAttr: function( name ) { + return this.each(function() { + jQuery.removeAttr( this, name ); + }); + }, + + prop: function( name, value ) { + return jQuery.access( this, jQuery.prop, name, value, arguments.length > 1 ); + }, + + removeProp: function( name ) { + name = jQuery.propFix[ name ] || name; + return this.each(function() { + // try/catch handles cases where IE balks (such as removing a property on window) + try { + this[ name ] = undefined; + delete this[ name ]; + } catch( e ) {} + }); + }, + + addClass: function( value ) { + var classNames, i, l, elem, + setClass, c, cl; + + if ( jQuery.isFunction( value ) ) { + return this.each(function( j ) { + jQuery( this ).addClass( value.call(this, j, this.className) ); + }); + } + + if ( value && typeof value === "string" ) { + classNames = value.split( core_rspace ); + + for ( i = 0, l = this.length; i < l; i++ ) { + elem = this[ i ]; + + if ( elem.nodeType === 1 ) { + if ( !elem.className && classNames.length === 1 ) { + elem.className = value; + + } else { + setClass = " " + elem.className + " "; + + for ( c = 0, cl = classNames.length; c < cl; c++ ) { + if ( setClass.indexOf( " " + classNames[ c ] + " " ) < 0 ) { + setClass += classNames[ c ] + " "; + } + } + elem.className = jQuery.trim( setClass ); + } + } + } + } + + return this; + }, + + removeClass: function( value ) { + var removes, className, elem, c, cl, i, l; + + if ( jQuery.isFunction( value ) ) { + return this.each(function( j ) { + jQuery( this ).removeClass( value.call(this, j, this.className) ); + }); + } + if ( (value && typeof value === "string") || value === undefined ) { + removes = ( value || "" ).split( core_rspace ); + + for ( i = 0, l = this.length; i < l; i++ ) { + elem = this[ i ]; + if ( elem.nodeType === 1 && elem.className ) { + + className = (" " + elem.className + " ").replace( rclass, " " ); + + // loop over each item in the removal list + for ( c = 0, cl = removes.length; c < cl; c++ ) { + // Remove until there is nothing to remove, + while ( className.indexOf(" " + removes[ c ] + " ") >= 0 ) { + className = className.replace( " " + removes[ c ] + " " , " " ); + } + } + elem.className = value ? jQuery.trim( className ) : ""; + } + } + } + + return this; + }, + + toggleClass: function( value, stateVal ) { + var type = typeof value, + isBool = typeof stateVal === "boolean"; + + if ( jQuery.isFunction( value ) ) { + return this.each(function( i ) { + jQuery( this ).toggleClass( value.call(this, i, this.className, stateVal), stateVal ); + }); + } + + return this.each(function() { + if ( type === "string" ) { + // toggle individual class names + var className, + i = 0, + self = jQuery( this ), + state = stateVal, + classNames = value.split( core_rspace ); + + while ( (className = classNames[ i++ ]) ) { + // check each className given, space separated list + state = isBool ? state : !self.hasClass( className ); + self[ state ? "addClass" : "removeClass" ]( className ); + } + + } else if ( type === "undefined" || type === "boolean" ) { + if ( this.className ) { + // store className if set + jQuery._data( this, "__className__", this.className ); + } + + // toggle whole className + this.className = this.className || value === false ? "" : jQuery._data( this, "__className__" ) || ""; + } + }); + }, + + hasClass: function( selector ) { + var className = " " + selector + " ", + i = 0, + l = this.length; + for ( ; i < l; i++ ) { + if ( this[i].nodeType === 1 && (" " + this[i].className + " ").replace(rclass, " ").indexOf( className ) >= 0 ) { + return true; + } + } + + return false; + }, + + val: function( value ) { + var hooks, ret, isFunction, + elem = this[0]; + + if ( !arguments.length ) { + if ( elem ) { + hooks = jQuery.valHooks[ elem.type ] || jQuery.valHooks[ elem.nodeName.toLowerCase() ]; + + if ( hooks && "get" in hooks && (ret = hooks.get( elem, "value" )) !== undefined ) { + return ret; + } + + ret = elem.value; + + return typeof ret === "string" ? + // handle most common string cases + ret.replace(rreturn, "") : + // handle cases where value is null/undef or number + ret == null ? "" : ret; + } + + return; + } + + isFunction = jQuery.isFunction( value ); + + return this.each(function( i ) { + var val, + self = jQuery(this); + + if ( this.nodeType !== 1 ) { + return; + } + + if ( isFunction ) { + val = value.call( this, i, self.val() ); + } else { + val = value; + } + + // Treat null/undefined as ""; convert numbers to string + if ( val == null ) { + val = ""; + } else if ( typeof val === "number" ) { + val += ""; + } else if ( jQuery.isArray( val ) ) { + val = jQuery.map(val, function ( value ) { + return value == null ? "" : value + ""; + }); + } + + hooks = jQuery.valHooks[ this.type ] || jQuery.valHooks[ this.nodeName.toLowerCase() ]; + + // If set returns undefined, fall back to normal setting + if ( !hooks || !("set" in hooks) || hooks.set( this, val, "value" ) === undefined ) { + this.value = val; + } + }); + } +}); + +jQuery.extend({ + valHooks: { + option: { + get: function( elem ) { + // attributes.value is undefined in Blackberry 4.7 but + // uses .value. See #6932 + var val = elem.attributes.value; + return !val || val.specified ? elem.value : elem.text; + } + }, + select: { + get: function( elem ) { + var value, i, max, option, + index = elem.selectedIndex, + values = [], + options = elem.options, + one = elem.type === "select-one"; + + // Nothing was selected + if ( index < 0 ) { + return null; + } + + // Loop through all the selected options + i = one ? index : 0; + max = one ? index + 1 : options.length; + for ( ; i < max; i++ ) { + option = options[ i ]; + + // Don't return options that are disabled or in a disabled optgroup + if ( option.selected && (jQuery.support.optDisabled ? !option.disabled : option.getAttribute("disabled") === null) && + (!option.parentNode.disabled || !jQuery.nodeName( option.parentNode, "optgroup" )) ) { + + // Get the specific value for the option + value = jQuery( option ).val(); + + // We don't need an array for one selects + if ( one ) { + return value; + } + + // Multi-Selects return an array + values.push( value ); + } + } + + // Fixes Bug #2551 -- select.val() broken in IE after form.reset() + if ( one && !values.length && options.length ) { + return jQuery( options[ index ] ).val(); + } + + return values; + }, + + set: function( elem, value ) { + var values = jQuery.makeArray( value ); + + jQuery(elem).find("option").each(function() { + this.selected = jQuery.inArray( jQuery(this).val(), values ) >= 0; + }); + + if ( !values.length ) { + elem.selectedIndex = -1; + } + return values; + } + } + }, + + // Unused in 1.8, left in so attrFn-stabbers won't die; remove in 1.9 + attrFn: {}, + + attr: function( elem, name, value, pass ) { + var ret, hooks, notxml, + nType = elem.nodeType; + + // don't get/set attributes on text, comment and attribute nodes + if ( !elem || nType === 3 || nType === 8 || nType === 2 ) { + return; + } + + if ( pass && jQuery.isFunction( jQuery.fn[ name ] ) ) { + return jQuery( elem )[ name ]( value ); + } + + // Fallback to prop when attributes are not supported + if ( typeof elem.getAttribute === "undefined" ) { + return jQuery.prop( elem, name, value ); + } + + notxml = nType !== 1 || !jQuery.isXMLDoc( elem ); + + // All attributes are lowercase + // Grab necessary hook if one is defined + if ( notxml ) { + name = name.toLowerCase(); + hooks = jQuery.attrHooks[ name ] || ( rboolean.test( name ) ? boolHook : nodeHook ); + } + + if ( value !== undefined ) { + + if ( value === null ) { + jQuery.removeAttr( elem, name ); + return; + + } else if ( hooks && "set" in hooks && notxml && (ret = hooks.set( elem, value, name )) !== undefined ) { + return ret; + + } else { + elem.setAttribute( name, value + "" ); + return value; + } + + } else if ( hooks && "get" in hooks && notxml && (ret = hooks.get( elem, name )) !== null ) { + return ret; + + } else { + + ret = elem.getAttribute( name ); + + // Non-existent attributes return null, we normalize to undefined + return ret === null ? + undefined : + ret; + } + }, + + removeAttr: function( elem, value ) { + var propName, attrNames, name, isBool, + i = 0; + + if ( value && elem.nodeType === 1 ) { + + attrNames = value.split( core_rspace ); + + for ( ; i < attrNames.length; i++ ) { + name = attrNames[ i ]; + + if ( name ) { + propName = jQuery.propFix[ name ] || name; + isBool = rboolean.test( name ); + + // See #9699 for explanation of this approach (setting first, then removal) + // Do not do this for boolean attributes (see #10870) + if ( !isBool ) { + jQuery.attr( elem, name, "" ); + } + elem.removeAttribute( getSetAttribute ? name : propName ); + + // Set corresponding property to false for boolean attributes + if ( isBool && propName in elem ) { + elem[ propName ] = false; + } + } + } + } + }, + + attrHooks: { + type: { + set: function( elem, value ) { + // We can't allow the type property to be changed (since it causes problems in IE) + if ( rtype.test( elem.nodeName ) && elem.parentNode ) { + jQuery.error( "type property can't be changed" ); + } else if ( !jQuery.support.radioValue && value === "radio" && jQuery.nodeName(elem, "input") ) { + // Setting the type on a radio button after the value resets the value in IE6-9 + // Reset value to it's default in case type is set after value + // This is for element creation + var val = elem.value; + elem.setAttribute( "type", value ); + if ( val ) { + elem.value = val; + } + return value; + } + } + }, + // Use the value property for back compat + // Use the nodeHook for button elements in IE6/7 (#1954) + value: { + get: function( elem, name ) { + if ( nodeHook && jQuery.nodeName( elem, "button" ) ) { + return nodeHook.get( elem, name ); + } + return name in elem ? + elem.value : + null; + }, + set: function( elem, value, name ) { + if ( nodeHook && jQuery.nodeName( elem, "button" ) ) { + return nodeHook.set( elem, value, name ); + } + // Does not return so that setAttribute is also used + elem.value = value; + } + } + }, + + propFix: { + tabindex: "tabIndex", + readonly: "readOnly", + "for": "htmlFor", + "class": "className", + maxlength: "maxLength", + cellspacing: "cellSpacing", + cellpadding: "cellPadding", + rowspan: "rowSpan", + colspan: "colSpan", + usemap: "useMap", + frameborder: "frameBorder", + contenteditable: "contentEditable" + }, + + prop: function( elem, name, value ) { + var ret, hooks, notxml, + nType = elem.nodeType; + + // don't get/set properties on text, comment and attribute nodes + if ( !elem || nType === 3 || nType === 8 || nType === 2 ) { + return; + } + + notxml = nType !== 1 || !jQuery.isXMLDoc( elem ); + + if ( notxml ) { + // Fix name and attach hooks + name = jQuery.propFix[ name ] || name; + hooks = jQuery.propHooks[ name ]; + } + + if ( value !== undefined ) { + if ( hooks && "set" in hooks && (ret = hooks.set( elem, value, name )) !== undefined ) { + return ret; + + } else { + return ( elem[ name ] = value ); + } + + } else { + if ( hooks && "get" in hooks && (ret = hooks.get( elem, name )) !== null ) { + return ret; + + } else { + return elem[ name ]; + } + } + }, + + propHooks: { + tabIndex: { + get: function( elem ) { + // elem.tabIndex doesn't always return the correct value when it hasn't been explicitly set + // http://fluidproject.org/blog/2008/01/09/getting-setting-and-removing-tabindex-values-with-javascript/ + var attributeNode = elem.getAttributeNode("tabindex"); + + return attributeNode && attributeNode.specified ? + parseInt( attributeNode.value, 10 ) : + rfocusable.test( elem.nodeName ) || rclickable.test( elem.nodeName ) && elem.href ? + 0 : + undefined; + } + } + } +}); + +// Hook for boolean attributes +boolHook = { + get: function( elem, name ) { + // Align boolean attributes with corresponding properties + // Fall back to attribute presence where some booleans are not supported + var attrNode, + property = jQuery.prop( elem, name ); + return property === true || typeof property !== "boolean" && ( attrNode = elem.getAttributeNode(name) ) && attrNode.nodeValue !== false ? + name.toLowerCase() : + undefined; + }, + set: function( elem, value, name ) { + var propName; + if ( value === false ) { + // Remove boolean attributes when set to false + jQuery.removeAttr( elem, name ); + } else { + // value is true since we know at this point it's type boolean and not false + // Set boolean attributes to the same name and set the DOM property + propName = jQuery.propFix[ name ] || name; + if ( propName in elem ) { + // Only set the IDL specifically if it already exists on the element + elem[ propName ] = true; + } + + elem.setAttribute( name, name.toLowerCase() ); + } + return name; + } +}; + +// IE6/7 do not support getting/setting some attributes with get/setAttribute +if ( !getSetAttribute ) { + + fixSpecified = { + name: true, + id: true, + coords: true + }; + + // Use this for any attribute in IE6/7 + // This fixes almost every IE6/7 issue + nodeHook = jQuery.valHooks.button = { + get: function( elem, name ) { + var ret; + ret = elem.getAttributeNode( name ); + return ret && ( fixSpecified[ name ] ? ret.value !== "" : ret.specified ) ? + ret.value : + undefined; + }, + set: function( elem, value, name ) { + // Set the existing or create a new attribute node + var ret = elem.getAttributeNode( name ); + if ( !ret ) { + ret = document.createAttribute( name ); + elem.setAttributeNode( ret ); + } + return ( ret.value = value + "" ); + } + }; + + // Set width and height to auto instead of 0 on empty string( Bug #8150 ) + // This is for removals + jQuery.each([ "width", "height" ], function( i, name ) { + jQuery.attrHooks[ name ] = jQuery.extend( jQuery.attrHooks[ name ], { + set: function( elem, value ) { + if ( value === "" ) { + elem.setAttribute( name, "auto" ); + return value; + } + } + }); + }); + + // Set contenteditable to false on removals(#10429) + // Setting to empty string throws an error as an invalid value + jQuery.attrHooks.contenteditable = { + get: nodeHook.get, + set: function( elem, value, name ) { + if ( value === "" ) { + value = "false"; + } + nodeHook.set( elem, value, name ); + } + }; +} + + +// Some attributes require a special call on IE +if ( !jQuery.support.hrefNormalized ) { + jQuery.each([ "href", "src", "width", "height" ], function( i, name ) { + jQuery.attrHooks[ name ] = jQuery.extend( jQuery.attrHooks[ name ], { + get: function( elem ) { + var ret = elem.getAttribute( name, 2 ); + return ret === null ? undefined : ret; + } + }); + }); +} + +if ( !jQuery.support.style ) { + jQuery.attrHooks.style = { + get: function( elem ) { + // Return undefined in the case of empty string + // Normalize to lowercase since IE uppercases css property names + return elem.style.cssText.toLowerCase() || undefined; + }, + set: function( elem, value ) { + return ( elem.style.cssText = value + "" ); + } + }; +} + +// Safari mis-reports the default selected property of an option +// Accessing the parent's selectedIndex property fixes it +if ( !jQuery.support.optSelected ) { + jQuery.propHooks.selected = jQuery.extend( jQuery.propHooks.selected, { + get: function( elem ) { + var parent = elem.parentNode; + + if ( parent ) { + parent.selectedIndex; + + // Make sure that it also works with optgroups, see #5701 + if ( parent.parentNode ) { + parent.parentNode.selectedIndex; + } + } + return null; + } + }); +} + +// IE6/7 call enctype encoding +if ( !jQuery.support.enctype ) { + jQuery.propFix.enctype = "encoding"; +} + +// Radios and checkboxes getter/setter +if ( !jQuery.support.checkOn ) { + jQuery.each([ "radio", "checkbox" ], function() { + jQuery.valHooks[ this ] = { + get: function( elem ) { + // Handle the case where in Webkit "" is returned instead of "on" if a value isn't specified + return elem.getAttribute("value") === null ? "on" : elem.value; + } + }; + }); +} +jQuery.each([ "radio", "checkbox" ], function() { + jQuery.valHooks[ this ] = jQuery.extend( jQuery.valHooks[ this ], { + set: function( elem, value ) { + if ( jQuery.isArray( value ) ) { + return ( elem.checked = jQuery.inArray( jQuery(elem).val(), value ) >= 0 ); + } + } + }); +}); +var rformElems = /^(?:textarea|input|select)$/i, + rtypenamespace = /^([^\.]*|)(?:\.(.+)|)$/, + rhoverHack = /(?:^|\s)hover(\.\S+|)\b/, + rkeyEvent = /^key/, + rmouseEvent = /^(?:mouse|contextmenu)|click/, + rfocusMorph = /^(?:focusinfocus|focusoutblur)$/, + hoverHack = function( events ) { + return jQuery.event.special.hover ? events : events.replace( rhoverHack, "mouseenter$1 mouseleave$1" ); + }; + +/* + * Helper functions for managing events -- not part of the public interface. + * Props to Dean Edwards' addEvent library for many of the ideas. + */ +jQuery.event = { + + add: function( elem, types, handler, data, selector ) { + + var elemData, eventHandle, events, + t, tns, type, namespaces, handleObj, + handleObjIn, handlers, special; + + // Don't attach events to noData or text/comment nodes (allow plain objects tho) + if ( elem.nodeType === 3 || elem.nodeType === 8 || !types || !handler || !(elemData = jQuery._data( elem )) ) { + return; + } + + // Caller can pass in an object of custom data in lieu of the handler + if ( handler.handler ) { + handleObjIn = handler; + handler = handleObjIn.handler; + selector = handleObjIn.selector; + } + + // Make sure that the handler has a unique ID, used to find/remove it later + if ( !handler.guid ) { + handler.guid = jQuery.guid++; + } + + // Init the element's event structure and main handler, if this is the first + events = elemData.events; + if ( !events ) { + elemData.events = events = {}; + } + eventHandle = elemData.handle; + if ( !eventHandle ) { + elemData.handle = eventHandle = function( e ) { + // Discard the second event of a jQuery.event.trigger() and + // when an event is called after a page has unloaded + return typeof jQuery !== "undefined" && (!e || jQuery.event.triggered !== e.type) ? + jQuery.event.dispatch.apply( eventHandle.elem, arguments ) : + undefined; + }; + // Add elem as a property of the handle fn to prevent a memory leak with IE non-native events + eventHandle.elem = elem; + } + + // Handle multiple events separated by a space + // jQuery(...).bind("mouseover mouseout", fn); + types = jQuery.trim( hoverHack(types) ).split( " " ); + for ( t = 0; t < types.length; t++ ) { + + tns = rtypenamespace.exec( types[t] ) || []; + type = tns[1]; + namespaces = ( tns[2] || "" ).split( "." ).sort(); + + // If event changes its type, use the special event handlers for the changed type + special = jQuery.event.special[ type ] || {}; + + // If selector defined, determine special event api type, otherwise given type + type = ( selector ? special.delegateType : special.bindType ) || type; + + // Update special based on newly reset type + special = jQuery.event.special[ type ] || {}; + + // handleObj is passed to all event handlers + handleObj = jQuery.extend({ + type: type, + origType: tns[1], + data: data, + handler: handler, + guid: handler.guid, + selector: selector, + needsContext: selector && jQuery.expr.match.needsContext.test( selector ), + namespace: namespaces.join(".") + }, handleObjIn ); + + // Init the event handler queue if we're the first + handlers = events[ type ]; + if ( !handlers ) { + handlers = events[ type ] = []; + handlers.delegateCount = 0; + + // Only use addEventListener/attachEvent if the special events handler returns false + if ( !special.setup || special.setup.call( elem, data, namespaces, eventHandle ) === false ) { + // Bind the global event handler to the element + if ( elem.addEventListener ) { + elem.addEventListener( type, eventHandle, false ); + + } else if ( elem.attachEvent ) { + elem.attachEvent( "on" + type, eventHandle ); + } + } + } + + if ( special.add ) { + special.add.call( elem, handleObj ); + + if ( !handleObj.handler.guid ) { + handleObj.handler.guid = handler.guid; + } + } + + // Add to the element's handler list, delegates in front + if ( selector ) { + handlers.splice( handlers.delegateCount++, 0, handleObj ); + } else { + handlers.push( handleObj ); + } + + // Keep track of which events have ever been used, for event optimization + jQuery.event.global[ type ] = true; + } + + // Nullify elem to prevent memory leaks in IE + elem = null; + }, + + global: {}, + + // Detach an event or set of events from an element + remove: function( elem, types, handler, selector, mappedTypes ) { + + var t, tns, type, origType, namespaces, origCount, + j, events, special, eventType, handleObj, + elemData = jQuery.hasData( elem ) && jQuery._data( elem ); + + if ( !elemData || !(events = elemData.events) ) { + return; + } + + // Once for each type.namespace in types; type may be omitted + types = jQuery.trim( hoverHack( types || "" ) ).split(" "); + for ( t = 0; t < types.length; t++ ) { + tns = rtypenamespace.exec( types[t] ) || []; + type = origType = tns[1]; + namespaces = tns[2]; + + // Unbind all events (on this namespace, if provided) for the element + if ( !type ) { + for ( type in events ) { + jQuery.event.remove( elem, type + types[ t ], handler, selector, true ); + } + continue; + } + + special = jQuery.event.special[ type ] || {}; + type = ( selector? special.delegateType : special.bindType ) || type; + eventType = events[ type ] || []; + origCount = eventType.length; + namespaces = namespaces ? new RegExp("(^|\\.)" + namespaces.split(".").sort().join("\\.(?:.*\\.|)") + "(\\.|$)") : null; + + // Remove matching events + for ( j = 0; j < eventType.length; j++ ) { + handleObj = eventType[ j ]; + + if ( ( mappedTypes || origType === handleObj.origType ) && + ( !handler || handler.guid === handleObj.guid ) && + ( !namespaces || namespaces.test( handleObj.namespace ) ) && + ( !selector || selector === handleObj.selector || selector === "**" && handleObj.selector ) ) { + eventType.splice( j--, 1 ); + + if ( handleObj.selector ) { + eventType.delegateCount--; + } + if ( special.remove ) { + special.remove.call( elem, handleObj ); + } + } + } + + // Remove generic event handler if we removed something and no more handlers exist + // (avoids potential for endless recursion during removal of special event handlers) + if ( eventType.length === 0 && origCount !== eventType.length ) { + if ( !special.teardown || special.teardown.call( elem, namespaces, elemData.handle ) === false ) { + jQuery.removeEvent( elem, type, elemData.handle ); + } + + delete events[ type ]; + } + } + + // Remove the expando if it's no longer used + if ( jQuery.isEmptyObject( events ) ) { + delete elemData.handle; + + // removeData also checks for emptiness and clears the expando if empty + // so use it instead of delete + jQuery.removeData( elem, "events", true ); + } + }, + + // Events that are safe to short-circuit if no handlers are attached. + // Native DOM events should not be added, they may have inline handlers. + customEvent: { + "getData": true, + "setData": true, + "changeData": true + }, + + trigger: function( event, data, elem, onlyHandlers ) { + // Don't do events on text and comment nodes + if ( elem && (elem.nodeType === 3 || elem.nodeType === 8) ) { + return; + } + + // Event object or event type + var cache, exclusive, i, cur, old, ontype, special, handle, eventPath, bubbleType, + type = event.type || event, + namespaces = []; + + // focus/blur morphs to focusin/out; ensure we're not firing them right now + if ( rfocusMorph.test( type + jQuery.event.triggered ) ) { + return; + } + + if ( type.indexOf( "!" ) >= 0 ) { + // Exclusive events trigger only for the exact event (no namespaces) + type = type.slice(0, -1); + exclusive = true; + } + + if ( type.indexOf( "." ) >= 0 ) { + // Namespaced trigger; create a regexp to match event type in handle() + namespaces = type.split("."); + type = namespaces.shift(); + namespaces.sort(); + } + + if ( (!elem || jQuery.event.customEvent[ type ]) && !jQuery.event.global[ type ] ) { + // No jQuery handlers for this event type, and it can't have inline handlers + return; + } + + // Caller can pass in an Event, Object, or just an event type string + event = typeof event === "object" ? + // jQuery.Event object + event[ jQuery.expando ] ? event : + // Object literal + new jQuery.Event( type, event ) : + // Just the event type (string) + new jQuery.Event( type ); + + event.type = type; + event.isTrigger = true; + event.exclusive = exclusive; + event.namespace = namespaces.join( "." ); + event.namespace_re = event.namespace? new RegExp("(^|\\.)" + namespaces.join("\\.(?:.*\\.|)") + "(\\.|$)") : null; + ontype = type.indexOf( ":" ) < 0 ? "on" + type : ""; + + // Handle a global trigger + if ( !elem ) { + + // TODO: Stop taunting the data cache; remove global events and always attach to document + cache = jQuery.cache; + for ( i in cache ) { + if ( cache[ i ].events && cache[ i ].events[ type ] ) { + jQuery.event.trigger( event, data, cache[ i ].handle.elem, true ); + } + } + return; + } + + // Clean up the event in case it is being reused + event.result = undefined; + if ( !event.target ) { + event.target = elem; + } + + // Clone any incoming data and prepend the event, creating the handler arg list + data = data != null ? jQuery.makeArray( data ) : []; + data.unshift( event ); + + // Allow special events to draw outside the lines + special = jQuery.event.special[ type ] || {}; + if ( special.trigger && special.trigger.apply( elem, data ) === false ) { + return; + } + + // Determine event propagation path in advance, per W3C events spec (#9951) + // Bubble up to document, then to window; watch for a global ownerDocument var (#9724) + eventPath = [[ elem, special.bindType || type ]]; + if ( !onlyHandlers && !special.noBubble && !jQuery.isWindow( elem ) ) { + + bubbleType = special.delegateType || type; + cur = rfocusMorph.test( bubbleType + type ) ? elem : elem.parentNode; + for ( old = elem; cur; cur = cur.parentNode ) { + eventPath.push([ cur, bubbleType ]); + old = cur; + } + + // Only add window if we got to document (e.g., not plain obj or detached DOM) + if ( old === (elem.ownerDocument || document) ) { + eventPath.push([ old.defaultView || old.parentWindow || window, bubbleType ]); + } + } + + // Fire handlers on the event path + for ( i = 0; i < eventPath.length && !event.isPropagationStopped(); i++ ) { + + cur = eventPath[i][0]; + event.type = eventPath[i][1]; + + handle = ( jQuery._data( cur, "events" ) || {} )[ event.type ] && jQuery._data( cur, "handle" ); + if ( handle ) { + handle.apply( cur, data ); + } + // Note that this is a bare JS function and not a jQuery handler + handle = ontype && cur[ ontype ]; + if ( handle && jQuery.acceptData( cur ) && handle.apply && handle.apply( cur, data ) === false ) { + event.preventDefault(); + } + } + event.type = type; + + // If nobody prevented the default action, do it now + if ( !onlyHandlers && !event.isDefaultPrevented() ) { + + if ( (!special._default || special._default.apply( elem.ownerDocument, data ) === false) && + !(type === "click" && jQuery.nodeName( elem, "a" )) && jQuery.acceptData( elem ) ) { + + // Call a native DOM method on the target with the same name name as the event. + // Can't use an .isFunction() check here because IE6/7 fails that test. + // Don't do default actions on window, that's where global variables be (#6170) + // IE<9 dies on focus/blur to hidden element (#1486) + if ( ontype && elem[ type ] && ((type !== "focus" && type !== "blur") || event.target.offsetWidth !== 0) && !jQuery.isWindow( elem ) ) { + + // Don't re-trigger an onFOO event when we call its FOO() method + old = elem[ ontype ]; + + if ( old ) { + elem[ ontype ] = null; + } + + // Prevent re-triggering of the same event, since we already bubbled it above + jQuery.event.triggered = type; + elem[ type ](); + jQuery.event.triggered = undefined; + + if ( old ) { + elem[ ontype ] = old; + } + } + } + } + + return event.result; + }, + + dispatch: function( event ) { + + // Make a writable jQuery.Event from the native event object + event = jQuery.event.fix( event || window.event ); + + var i, j, cur, ret, selMatch, matched, matches, handleObj, sel, related, + handlers = ( (jQuery._data( this, "events" ) || {} )[ event.type ] || []), + delegateCount = handlers.delegateCount, + args = core_slice.call( arguments ), + run_all = !event.exclusive && !event.namespace, + special = jQuery.event.special[ event.type ] || {}, + handlerQueue = []; + + // Use the fix-ed jQuery.Event rather than the (read-only) native event + args[0] = event; + event.delegateTarget = this; + + // Call the preDispatch hook for the mapped type, and let it bail if desired + if ( special.preDispatch && special.preDispatch.call( this, event ) === false ) { + return; + } + + // Determine handlers that should run if there are delegated events + // Avoid non-left-click bubbling in Firefox (#3861) + if ( delegateCount && !(event.button && event.type === "click") ) { + + for ( cur = event.target; cur != this; cur = cur.parentNode || this ) { + + // Don't process clicks (ONLY) on disabled elements (#6911, #8165, #11382, #11764) + if ( cur.disabled !== true || event.type !== "click" ) { + selMatch = {}; + matches = []; + for ( i = 0; i < delegateCount; i++ ) { + handleObj = handlers[ i ]; + sel = handleObj.selector; + + if ( selMatch[ sel ] === undefined ) { + selMatch[ sel ] = handleObj.needsContext ? + jQuery( sel, this ).index( cur ) >= 0 : + jQuery.find( sel, this, null, [ cur ] ).length; + } + if ( selMatch[ sel ] ) { + matches.push( handleObj ); + } + } + if ( matches.length ) { + handlerQueue.push({ elem: cur, matches: matches }); + } + } + } + } + + // Add the remaining (directly-bound) handlers + if ( handlers.length > delegateCount ) { + handlerQueue.push({ elem: this, matches: handlers.slice( delegateCount ) }); + } + + // Run delegates first; they may want to stop propagation beneath us + for ( i = 0; i < handlerQueue.length && !event.isPropagationStopped(); i++ ) { + matched = handlerQueue[ i ]; + event.currentTarget = matched.elem; + + for ( j = 0; j < matched.matches.length && !event.isImmediatePropagationStopped(); j++ ) { + handleObj = matched.matches[ j ]; + + // Triggered event must either 1) be non-exclusive and have no namespace, or + // 2) have namespace(s) a subset or equal to those in the bound event (both can have no namespace). + if ( run_all || (!event.namespace && !handleObj.namespace) || event.namespace_re && event.namespace_re.test( handleObj.namespace ) ) { + + event.data = handleObj.data; + event.handleObj = handleObj; + + ret = ( (jQuery.event.special[ handleObj.origType ] || {}).handle || handleObj.handler ) + .apply( matched.elem, args ); + + if ( ret !== undefined ) { + event.result = ret; + if ( ret === false ) { + event.preventDefault(); + event.stopPropagation(); + } + } + } + } + } + + // Call the postDispatch hook for the mapped type + if ( special.postDispatch ) { + special.postDispatch.call( this, event ); + } + + return event.result; + }, + + // Includes some event props shared by KeyEvent and MouseEvent + // *** attrChange attrName relatedNode srcElement are not normalized, non-W3C, deprecated, will be removed in 1.8 *** + props: "attrChange attrName relatedNode srcElement altKey bubbles cancelable ctrlKey currentTarget eventPhase metaKey relatedTarget shiftKey target timeStamp view which".split(" "), + + fixHooks: {}, + + keyHooks: { + props: "char charCode key keyCode".split(" "), + filter: function( event, original ) { + + // Add which for key events + if ( event.which == null ) { + event.which = original.charCode != null ? original.charCode : original.keyCode; + } + + return event; + } + }, + + mouseHooks: { + props: "button buttons clientX clientY fromElement offsetX offsetY pageX pageY screenX screenY toElement".split(" "), + filter: function( event, original ) { + var eventDoc, doc, body, + button = original.button, + fromElement = original.fromElement; + + // Calculate pageX/Y if missing and clientX/Y available + if ( event.pageX == null && original.clientX != null ) { + eventDoc = event.target.ownerDocument || document; + doc = eventDoc.documentElement; + body = eventDoc.body; + + event.pageX = original.clientX + ( doc && doc.scrollLeft || body && body.scrollLeft || 0 ) - ( doc && doc.clientLeft || body && body.clientLeft || 0 ); + event.pageY = original.clientY + ( doc && doc.scrollTop || body && body.scrollTop || 0 ) - ( doc && doc.clientTop || body && body.clientTop || 0 ); + } + + // Add relatedTarget, if necessary + if ( !event.relatedTarget && fromElement ) { + event.relatedTarget = fromElement === event.target ? original.toElement : fromElement; + } + + // Add which for click: 1 === left; 2 === middle; 3 === right + // Note: button is not normalized, so don't use it + if ( !event.which && button !== undefined ) { + event.which = ( button & 1 ? 1 : ( button & 2 ? 3 : ( button & 4 ? 2 : 0 ) ) ); + } + + return event; + } + }, + + fix: function( event ) { + if ( event[ jQuery.expando ] ) { + return event; + } + + // Create a writable copy of the event object and normalize some properties + var i, prop, + originalEvent = event, + fixHook = jQuery.event.fixHooks[ event.type ] || {}, + copy = fixHook.props ? this.props.concat( fixHook.props ) : this.props; + + event = jQuery.Event( originalEvent ); + + for ( i = copy.length; i; ) { + prop = copy[ --i ]; + event[ prop ] = originalEvent[ prop ]; + } + + // Fix target property, if necessary (#1925, IE 6/7/8 & Safari2) + if ( !event.target ) { + event.target = originalEvent.srcElement || document; + } + + // Target should not be a text node (#504, Safari) + if ( event.target.nodeType === 3 ) { + event.target = event.target.parentNode; + } + + // For mouse/key events, metaKey==false if it's undefined (#3368, #11328; IE6/7/8) + event.metaKey = !!event.metaKey; + + return fixHook.filter? fixHook.filter( event, originalEvent ) : event; + }, + + special: { + load: { + // Prevent triggered image.load events from bubbling to window.load + noBubble: true + }, + + focus: { + delegateType: "focusin" + }, + blur: { + delegateType: "focusout" + }, + + beforeunload: { + setup: function( data, namespaces, eventHandle ) { + // We only want to do this special case on windows + if ( jQuery.isWindow( this ) ) { + this.onbeforeunload = eventHandle; + } + }, + + teardown: function( namespaces, eventHandle ) { + if ( this.onbeforeunload === eventHandle ) { + this.onbeforeunload = null; + } + } + } + }, + + simulate: function( type, elem, event, bubble ) { + // Piggyback on a donor event to simulate a different one. + // Fake originalEvent to avoid donor's stopPropagation, but if the + // simulated event prevents default then we do the same on the donor. + var e = jQuery.extend( + new jQuery.Event(), + event, + { type: type, + isSimulated: true, + originalEvent: {} + } + ); + if ( bubble ) { + jQuery.event.trigger( e, null, elem ); + } else { + jQuery.event.dispatch.call( elem, e ); + } + if ( e.isDefaultPrevented() ) { + event.preventDefault(); + } + } +}; + +// Some plugins are using, but it's undocumented/deprecated and will be removed. +// The 1.7 special event interface should provide all the hooks needed now. +jQuery.event.handle = jQuery.event.dispatch; + +jQuery.removeEvent = document.removeEventListener ? + function( elem, type, handle ) { + if ( elem.removeEventListener ) { + elem.removeEventListener( type, handle, false ); + } + } : + function( elem, type, handle ) { + var name = "on" + type; + + if ( elem.detachEvent ) { + + // #8545, #7054, preventing memory leaks for custom events in IE6-8 – + // detachEvent needed property on element, by name of that event, to properly expose it to GC + if ( typeof elem[ name ] === "undefined" ) { + elem[ name ] = null; + } + + elem.detachEvent( name, handle ); + } + }; + +jQuery.Event = function( src, props ) { + // Allow instantiation without the 'new' keyword + if ( !(this instanceof jQuery.Event) ) { + return new jQuery.Event( src, props ); + } + + // Event object + if ( src && src.type ) { + this.originalEvent = src; + this.type = src.type; + + // Events bubbling up the document may have been marked as prevented + // by a handler lower down the tree; reflect the correct value. + this.isDefaultPrevented = ( src.defaultPrevented || src.returnValue === false || + src.getPreventDefault && src.getPreventDefault() ) ? returnTrue : returnFalse; + + // Event type + } else { + this.type = src; + } + + // Put explicitly provided properties onto the event object + if ( props ) { + jQuery.extend( this, props ); + } + + // Create a timestamp if incoming event doesn't have one + this.timeStamp = src && src.timeStamp || jQuery.now(); + + // Mark it as fixed + this[ jQuery.expando ] = true; +}; + +function returnFalse() { + return false; +} +function returnTrue() { + return true; +} + +// jQuery.Event is based on DOM3 Events as specified by the ECMAScript Language Binding +// http://www.w3.org/TR/2003/WD-DOM-Level-3-Events-20030331/ecma-script-binding.html +jQuery.Event.prototype = { + preventDefault: function() { + this.isDefaultPrevented = returnTrue; + + var e = this.originalEvent; + if ( !e ) { + return; + } + + // if preventDefault exists run it on the original event + if ( e.preventDefault ) { + e.preventDefault(); + + // otherwise set the returnValue property of the original event to false (IE) + } else { + e.returnValue = false; + } + }, + stopPropagation: function() { + this.isPropagationStopped = returnTrue; + + var e = this.originalEvent; + if ( !e ) { + return; + } + // if stopPropagation exists run it on the original event + if ( e.stopPropagation ) { + e.stopPropagation(); + } + // otherwise set the cancelBubble property of the original event to true (IE) + e.cancelBubble = true; + }, + stopImmediatePropagation: function() { + this.isImmediatePropagationStopped = returnTrue; + this.stopPropagation(); + }, + isDefaultPrevented: returnFalse, + isPropagationStopped: returnFalse, + isImmediatePropagationStopped: returnFalse +}; + +// Create mouseenter/leave events using mouseover/out and event-time checks +jQuery.each({ + mouseenter: "mouseover", + mouseleave: "mouseout" +}, function( orig, fix ) { + jQuery.event.special[ orig ] = { + delegateType: fix, + bindType: fix, + + handle: function( event ) { + var ret, + target = this, + related = event.relatedTarget, + handleObj = event.handleObj, + selector = handleObj.selector; + + // For mousenter/leave call the handler if related is outside the target. + // NB: No relatedTarget if the mouse left/entered the browser window + if ( !related || (related !== target && !jQuery.contains( target, related )) ) { + event.type = handleObj.origType; + ret = handleObj.handler.apply( this, arguments ); + event.type = fix; + } + return ret; + } + }; +}); + +// IE submit delegation +if ( !jQuery.support.submitBubbles ) { + + jQuery.event.special.submit = { + setup: function() { + // Only need this for delegated form submit events + if ( jQuery.nodeName( this, "form" ) ) { + return false; + } + + // Lazy-add a submit handler when a descendant form may potentially be submitted + jQuery.event.add( this, "click._submit keypress._submit", function( e ) { + // Node name check avoids a VML-related crash in IE (#9807) + var elem = e.target, + form = jQuery.nodeName( elem, "input" ) || jQuery.nodeName( elem, "button" ) ? elem.form : undefined; + if ( form && !jQuery._data( form, "_submit_attached" ) ) { + jQuery.event.add( form, "submit._submit", function( event ) { + event._submit_bubble = true; + }); + jQuery._data( form, "_submit_attached", true ); + } + }); + // return undefined since we don't need an event listener + }, + + postDispatch: function( event ) { + // If form was submitted by the user, bubble the event up the tree + if ( event._submit_bubble ) { + delete event._submit_bubble; + if ( this.parentNode && !event.isTrigger ) { + jQuery.event.simulate( "submit", this.parentNode, event, true ); + } + } + }, + + teardown: function() { + // Only need this for delegated form submit events + if ( jQuery.nodeName( this, "form" ) ) { + return false; + } + + // Remove delegated handlers; cleanData eventually reaps submit handlers attached above + jQuery.event.remove( this, "._submit" ); + } + }; +} + +// IE change delegation and checkbox/radio fix +if ( !jQuery.support.changeBubbles ) { + + jQuery.event.special.change = { + + setup: function() { + + if ( rformElems.test( this.nodeName ) ) { + // IE doesn't fire change on a check/radio until blur; trigger it on click + // after a propertychange. Eat the blur-change in special.change.handle. + // This still fires onchange a second time for check/radio after blur. + if ( this.type === "checkbox" || this.type === "radio" ) { + jQuery.event.add( this, "propertychange._change", function( event ) { + if ( event.originalEvent.propertyName === "checked" ) { + this._just_changed = true; + } + }); + jQuery.event.add( this, "click._change", function( event ) { + if ( this._just_changed && !event.isTrigger ) { + this._just_changed = false; + } + // Allow triggered, simulated change events (#11500) + jQuery.event.simulate( "change", this, event, true ); + }); + } + return false; + } + // Delegated event; lazy-add a change handler on descendant inputs + jQuery.event.add( this, "beforeactivate._change", function( e ) { + var elem = e.target; + + if ( rformElems.test( elem.nodeName ) && !jQuery._data( elem, "_change_attached" ) ) { + jQuery.event.add( elem, "change._change", function( event ) { + if ( this.parentNode && !event.isSimulated && !event.isTrigger ) { + jQuery.event.simulate( "change", this.parentNode, event, true ); + } + }); + jQuery._data( elem, "_change_attached", true ); + } + }); + }, + + handle: function( event ) { + var elem = event.target; + + // Swallow native change events from checkbox/radio, we already triggered them above + if ( this !== elem || event.isSimulated || event.isTrigger || (elem.type !== "radio" && elem.type !== "checkbox") ) { + return event.handleObj.handler.apply( this, arguments ); + } + }, + + teardown: function() { + jQuery.event.remove( this, "._change" ); + + return !rformElems.test( this.nodeName ); + } + }; +} + +// Create "bubbling" focus and blur events +if ( !jQuery.support.focusinBubbles ) { + jQuery.each({ focus: "focusin", blur: "focusout" }, function( orig, fix ) { + + // Attach a single capturing handler while someone wants focusin/focusout + var attaches = 0, + handler = function( event ) { + jQuery.event.simulate( fix, event.target, jQuery.event.fix( event ), true ); + }; + + jQuery.event.special[ fix ] = { + setup: function() { + if ( attaches++ === 0 ) { + document.addEventListener( orig, handler, true ); + } + }, + teardown: function() { + if ( --attaches === 0 ) { + document.removeEventListener( orig, handler, true ); + } + } + }; + }); +} + +jQuery.fn.extend({ + + on: function( types, selector, data, fn, /*INTERNAL*/ one ) { + var origFn, type; + + // Types can be a map of types/handlers + if ( typeof types === "object" ) { + // ( types-Object, selector, data ) + if ( typeof selector !== "string" ) { // && selector != null + // ( types-Object, data ) + data = data || selector; + selector = undefined; + } + for ( type in types ) { + this.on( type, selector, data, types[ type ], one ); + } + return this; + } + + if ( data == null && fn == null ) { + // ( types, fn ) + fn = selector; + data = selector = undefined; + } else if ( fn == null ) { + if ( typeof selector === "string" ) { + // ( types, selector, fn ) + fn = data; + data = undefined; + } else { + // ( types, data, fn ) + fn = data; + data = selector; + selector = undefined; + } + } + if ( fn === false ) { + fn = returnFalse; + } else if ( !fn ) { + return this; + } + + if ( one === 1 ) { + origFn = fn; + fn = function( event ) { + // Can use an empty set, since event contains the info + jQuery().off( event ); + return origFn.apply( this, arguments ); + }; + // Use same guid so caller can remove using origFn + fn.guid = origFn.guid || ( origFn.guid = jQuery.guid++ ); + } + return this.each( function() { + jQuery.event.add( this, types, fn, data, selector ); + }); + }, + one: function( types, selector, data, fn ) { + return this.on( types, selector, data, fn, 1 ); + }, + off: function( types, selector, fn ) { + var handleObj, type; + if ( types && types.preventDefault && types.handleObj ) { + // ( event ) dispatched jQuery.Event + handleObj = types.handleObj; + jQuery( types.delegateTarget ).off( + handleObj.namespace ? handleObj.origType + "." + handleObj.namespace : handleObj.origType, + handleObj.selector, + handleObj.handler + ); + return this; + } + if ( typeof types === "object" ) { + // ( types-object [, selector] ) + for ( type in types ) { + this.off( type, selector, types[ type ] ); + } + return this; + } + if ( selector === false || typeof selector === "function" ) { + // ( types [, fn] ) + fn = selector; + selector = undefined; + } + if ( fn === false ) { + fn = returnFalse; + } + return this.each(function() { + jQuery.event.remove( this, types, fn, selector ); + }); + }, + + bind: function( types, data, fn ) { + return this.on( types, null, data, fn ); + }, + unbind: function( types, fn ) { + return this.off( types, null, fn ); + }, + + live: function( types, data, fn ) { + jQuery( this.context ).on( types, this.selector, data, fn ); + return this; + }, + die: function( types, fn ) { + jQuery( this.context ).off( types, this.selector || "**", fn ); + return this; + }, + + delegate: function( selector, types, data, fn ) { + return this.on( types, selector, data, fn ); + }, + undelegate: function( selector, types, fn ) { + // ( namespace ) or ( selector, types [, fn] ) + return arguments.length === 1 ? this.off( selector, "**" ) : this.off( types, selector || "**", fn ); + }, + + trigger: function( type, data ) { + return this.each(function() { + jQuery.event.trigger( type, data, this ); + }); + }, + triggerHandler: function( type, data ) { + if ( this[0] ) { + return jQuery.event.trigger( type, data, this[0], true ); + } + }, + + toggle: function( fn ) { + // Save reference to arguments for access in closure + var args = arguments, + guid = fn.guid || jQuery.guid++, + i = 0, + toggler = function( event ) { + // Figure out which function to execute + var lastToggle = ( jQuery._data( this, "lastToggle" + fn.guid ) || 0 ) % i; + jQuery._data( this, "lastToggle" + fn.guid, lastToggle + 1 ); + + // Make sure that clicks stop + event.preventDefault(); + + // and execute the function + return args[ lastToggle ].apply( this, arguments ) || false; + }; + + // link all the functions, so any of them can unbind this click handler + toggler.guid = guid; + while ( i < args.length ) { + args[ i++ ].guid = guid; + } + + return this.click( toggler ); + }, + + hover: function( fnOver, fnOut ) { + return this.mouseenter( fnOver ).mouseleave( fnOut || fnOver ); + } +}); + +jQuery.each( ("blur focus focusin focusout load resize scroll unload click dblclick " + + "mousedown mouseup mousemove mouseover mouseout mouseenter mouseleave " + + "change select submit keydown keypress keyup error contextmenu").split(" "), function( i, name ) { + + // Handle event binding + jQuery.fn[ name ] = function( data, fn ) { + if ( fn == null ) { + fn = data; + data = null; + } + + return arguments.length > 0 ? + this.on( name, null, data, fn ) : + this.trigger( name ); + }; + + if ( rkeyEvent.test( name ) ) { + jQuery.event.fixHooks[ name ] = jQuery.event.keyHooks; + } + + if ( rmouseEvent.test( name ) ) { + jQuery.event.fixHooks[ name ] = jQuery.event.mouseHooks; + } +}); +/*! + * Sizzle CSS Selector Engine + * Copyright 2012 jQuery Foundation and other contributors + * Released under the MIT license + * http://sizzlejs.com/ + */ +(function( window, undefined ) { + +var cachedruns, + assertGetIdNotName, + Expr, + getText, + isXML, + contains, + compile, + sortOrder, + hasDuplicate, + outermostContext, + + baseHasDuplicate = true, + strundefined = "undefined", + + expando = ( "sizcache" + Math.random() ).replace( ".", "" ), + + Token = String, + document = window.document, + docElem = document.documentElement, + dirruns = 0, + done = 0, + pop = [].pop, + push = [].push, + slice = [].slice, + // Use a stripped-down indexOf if a native one is unavailable + indexOf = [].indexOf || function( elem ) { + var i = 0, + len = this.length; + for ( ; i < len; i++ ) { + if ( this[i] === elem ) { + return i; + } + } + return -1; + }, + + // Augment a function for special use by Sizzle + markFunction = function( fn, value ) { + fn[ expando ] = value == null || value; + return fn; + }, + + createCache = function() { + var cache = {}, + keys = []; + + return markFunction(function( key, value ) { + // Only keep the most recent entries + if ( keys.push( key ) > Expr.cacheLength ) { + delete cache[ keys.shift() ]; + } + + return (cache[ key ] = value); + }, cache ); + }, + + classCache = createCache(), + tokenCache = createCache(), + compilerCache = createCache(), + + // Regex + + // Whitespace characters http://www.w3.org/TR/css3-selectors/#whitespace + whitespace = "[\\x20\\t\\r\\n\\f]", + // http://www.w3.org/TR/css3-syntax/#characters + characterEncoding = "(?:\\\\.|[-\\w]|[^\\x00-\\xa0])+", + + // Loosely modeled on CSS identifier characters + // An unquoted value should be a CSS identifier (http://www.w3.org/TR/css3-selectors/#attribute-selectors) + // Proper syntax: http://www.w3.org/TR/CSS21/syndata.html#value-def-identifier + identifier = characterEncoding.replace( "w", "w#" ), + + // Acceptable operators http://www.w3.org/TR/selectors/#attribute-selectors + operators = "([*^$|!~]?=)", + attributes = "\\[" + whitespace + "*(" + characterEncoding + ")" + whitespace + + "*(?:" + operators + whitespace + "*(?:(['\"])((?:\\\\.|[^\\\\])*?)\\3|(" + identifier + ")|)|)" + whitespace + "*\\]", + + // Prefer arguments not in parens/brackets, + // then attribute selectors and non-pseudos (denoted by :), + // then anything else + // These preferences are here to reduce the number of selectors + // needing tokenize in the PSEUDO preFilter + pseudos = ":(" + characterEncoding + ")(?:\\((?:(['\"])((?:\\\\.|[^\\\\])*?)\\2|([^()[\\]]*|(?:(?:" + attributes + ")|[^:]|\\\\.)*|.*))\\)|)", + + // For matchExpr.POS and matchExpr.needsContext + pos = ":(even|odd|eq|gt|lt|nth|first|last)(?:\\(" + whitespace + + "*((?:-\\d)?\\d*)" + whitespace + "*\\)|)(?=[^-]|$)", + + // Leading and non-escaped trailing whitespace, capturing some non-whitespace characters preceding the latter + rtrim = new RegExp( "^" + whitespace + "+|((?:^|[^\\\\])(?:\\\\.)*)" + whitespace + "+$", "g" ), + + rcomma = new RegExp( "^" + whitespace + "*," + whitespace + "*" ), + rcombinators = new RegExp( "^" + whitespace + "*([\\x20\\t\\r\\n\\f>+~])" + whitespace + "*" ), + rpseudo = new RegExp( pseudos ), + + // Easily-parseable/retrievable ID or TAG or CLASS selectors + rquickExpr = /^(?:#([\w\-]+)|(\w+)|\.([\w\-]+))$/, + + rnot = /^:not/, + rsibling = /[\x20\t\r\n\f]*[+~]/, + rendsWithNot = /:not\($/, + + rheader = /h\d/i, + rinputs = /input|select|textarea|button/i, + + rbackslash = /\\(?!\\)/g, + + matchExpr = { + "ID": new RegExp( "^#(" + characterEncoding + ")" ), + "CLASS": new RegExp( "^\\.(" + characterEncoding + ")" ), + "NAME": new RegExp( "^\\[name=['\"]?(" + characterEncoding + ")['\"]?\\]" ), + "TAG": new RegExp( "^(" + characterEncoding.replace( "w", "w*" ) + ")" ), + "ATTR": new RegExp( "^" + attributes ), + "PSEUDO": new RegExp( "^" + pseudos ), + "POS": new RegExp( pos, "i" ), + "CHILD": new RegExp( "^:(only|nth|first|last)-child(?:\\(" + whitespace + + "*(even|odd|(([+-]|)(\\d*)n|)" + whitespace + "*(?:([+-]|)" + whitespace + + "*(\\d+)|))" + whitespace + "*\\)|)", "i" ), + // For use in libraries implementing .is() + "needsContext": new RegExp( "^" + whitespace + "*[>+~]|" + pos, "i" ) + }, + + // Support + + // Used for testing something on an element + assert = function( fn ) { + var div = document.createElement("div"); + + try { + return fn( div ); + } catch (e) { + return false; + } finally { + // release memory in IE + div = null; + } + }, + + // Check if getElementsByTagName("*") returns only elements + assertTagNameNoComments = assert(function( div ) { + div.appendChild( document.createComment("") ); + return !div.getElementsByTagName("*").length; + }), + + // Check if getAttribute returns normalized href attributes + assertHrefNotNormalized = assert(function( div ) { + div.innerHTML = ""; + return div.firstChild && typeof div.firstChild.getAttribute !== strundefined && + div.firstChild.getAttribute("href") === "#"; + }), + + // Check if attributes should be retrieved by attribute nodes + assertAttributes = assert(function( div ) { + div.innerHTML = ""; + var type = typeof div.lastChild.getAttribute("multiple"); + // IE8 returns a string for some attributes even when not present + return type !== "boolean" && type !== "string"; + }), + + // Check if getElementsByClassName can be trusted + assertUsableClassName = assert(function( div ) { + // Opera can't find a second classname (in 9.6) + div.innerHTML = ""; + if ( !div.getElementsByClassName || !div.getElementsByClassName("e").length ) { + return false; + } + + // Safari 3.2 caches class attributes and doesn't catch changes + div.lastChild.className = "e"; + return div.getElementsByClassName("e").length === 2; + }), + + // Check if getElementById returns elements by name + // Check if getElementsByName privileges form controls or returns elements by ID + assertUsableName = assert(function( div ) { + // Inject content + div.id = expando + 0; + div.innerHTML = "
    "; + docElem.insertBefore( div, docElem.firstChild ); + + // Test + var pass = document.getElementsByName && + // buggy browsers will return fewer than the correct 2 + document.getElementsByName( expando ).length === 2 + + // buggy browsers will return more than the correct 0 + document.getElementsByName( expando + 0 ).length; + assertGetIdNotName = !document.getElementById( expando ); + + // Cleanup + docElem.removeChild( div ); + + return pass; + }); + +// If slice is not available, provide a backup +try { + slice.call( docElem.childNodes, 0 )[0].nodeType; +} catch ( e ) { + slice = function( i ) { + var elem, + results = []; + for ( ; (elem = this[i]); i++ ) { + results.push( elem ); + } + return results; + }; +} + +function Sizzle( selector, context, results, seed ) { + results = results || []; + context = context || document; + var match, elem, xml, m, + nodeType = context.nodeType; + + if ( !selector || typeof selector !== "string" ) { + return results; + } + + if ( nodeType !== 1 && nodeType !== 9 ) { + return []; + } + + xml = isXML( context ); + + if ( !xml && !seed ) { + if ( (match = rquickExpr.exec( selector )) ) { + // Speed-up: Sizzle("#ID") + if ( (m = match[1]) ) { + if ( nodeType === 9 ) { + elem = context.getElementById( m ); + // Check parentNode to catch when Blackberry 4.6 returns + // nodes that are no longer in the document #6963 + if ( elem && elem.parentNode ) { + // Handle the case where IE, Opera, and Webkit return items + // by name instead of ID + if ( elem.id === m ) { + results.push( elem ); + return results; + } + } else { + return results; + } + } else { + // Context is not a document + if ( context.ownerDocument && (elem = context.ownerDocument.getElementById( m )) && + contains( context, elem ) && elem.id === m ) { + results.push( elem ); + return results; + } + } + + // Speed-up: Sizzle("TAG") + } else if ( match[2] ) { + push.apply( results, slice.call(context.getElementsByTagName( selector ), 0) ); + return results; + + // Speed-up: Sizzle(".CLASS") + } else if ( (m = match[3]) && assertUsableClassName && context.getElementsByClassName ) { + push.apply( results, slice.call(context.getElementsByClassName( m ), 0) ); + return results; + } + } + } + + // All others + return select( selector.replace( rtrim, "$1" ), context, results, seed, xml ); +} + +Sizzle.matches = function( expr, elements ) { + return Sizzle( expr, null, null, elements ); +}; + +Sizzle.matchesSelector = function( elem, expr ) { + return Sizzle( expr, null, null, [ elem ] ).length > 0; +}; + +// Returns a function to use in pseudos for input types +function createInputPseudo( type ) { + return function( elem ) { + var name = elem.nodeName.toLowerCase(); + return name === "input" && elem.type === type; + }; +} + +// Returns a function to use in pseudos for buttons +function createButtonPseudo( type ) { + return function( elem ) { + var name = elem.nodeName.toLowerCase(); + return (name === "input" || name === "button") && elem.type === type; + }; +} + +// Returns a function to use in pseudos for positionals +function createPositionalPseudo( fn ) { + return markFunction(function( argument ) { + argument = +argument; + return markFunction(function( seed, matches ) { + var j, + matchIndexes = fn( [], seed.length, argument ), + i = matchIndexes.length; + + // Match elements found at the specified indexes + while ( i-- ) { + if ( seed[ (j = matchIndexes[i]) ] ) { + seed[j] = !(matches[j] = seed[j]); + } + } + }); + }); +} + +/** + * Utility function for retrieving the text value of an array of DOM nodes + * @param {Array|Element} elem + */ +getText = Sizzle.getText = function( elem ) { + var node, + ret = "", + i = 0, + nodeType = elem.nodeType; + + if ( nodeType ) { + if ( nodeType === 1 || nodeType === 9 || nodeType === 11 ) { + // Use textContent for elements + // innerText usage removed for consistency of new lines (see #11153) + if ( typeof elem.textContent === "string" ) { + return elem.textContent; + } else { + // Traverse its children + for ( elem = elem.firstChild; elem; elem = elem.nextSibling ) { + ret += getText( elem ); + } + } + } else if ( nodeType === 3 || nodeType === 4 ) { + return elem.nodeValue; + } + // Do not include comment or processing instruction nodes + } else { + + // If no nodeType, this is expected to be an array + for ( ; (node = elem[i]); i++ ) { + // Do not traverse comment nodes + ret += getText( node ); + } + } + return ret; +}; + +isXML = Sizzle.isXML = function( elem ) { + // documentElement is verified for cases where it doesn't yet exist + // (such as loading iframes in IE - #4833) + var documentElement = elem && (elem.ownerDocument || elem).documentElement; + return documentElement ? documentElement.nodeName !== "HTML" : false; +}; + +// Element contains another +contains = Sizzle.contains = docElem.contains ? + function( a, b ) { + var adown = a.nodeType === 9 ? a.documentElement : a, + bup = b && b.parentNode; + return a === bup || !!( bup && bup.nodeType === 1 && adown.contains && adown.contains(bup) ); + } : + docElem.compareDocumentPosition ? + function( a, b ) { + return b && !!( a.compareDocumentPosition( b ) & 16 ); + } : + function( a, b ) { + while ( (b = b.parentNode) ) { + if ( b === a ) { + return true; + } + } + return false; + }; + +Sizzle.attr = function( elem, name ) { + var val, + xml = isXML( elem ); + + if ( !xml ) { + name = name.toLowerCase(); + } + if ( (val = Expr.attrHandle[ name ]) ) { + return val( elem ); + } + if ( xml || assertAttributes ) { + return elem.getAttribute( name ); + } + val = elem.getAttributeNode( name ); + return val ? + typeof elem[ name ] === "boolean" ? + elem[ name ] ? name : null : + val.specified ? val.value : null : + null; +}; + +Expr = Sizzle.selectors = { + + // Can be adjusted by the user + cacheLength: 50, + + createPseudo: markFunction, + + match: matchExpr, + + // IE6/7 return a modified href + attrHandle: assertHrefNotNormalized ? + {} : + { + "href": function( elem ) { + return elem.getAttribute( "href", 2 ); + }, + "type": function( elem ) { + return elem.getAttribute("type"); + } + }, + + find: { + "ID": assertGetIdNotName ? + function( id, context, xml ) { + if ( typeof context.getElementById !== strundefined && !xml ) { + var m = context.getElementById( id ); + // Check parentNode to catch when Blackberry 4.6 returns + // nodes that are no longer in the document #6963 + return m && m.parentNode ? [m] : []; + } + } : + function( id, context, xml ) { + if ( typeof context.getElementById !== strundefined && !xml ) { + var m = context.getElementById( id ); + + return m ? + m.id === id || typeof m.getAttributeNode !== strundefined && m.getAttributeNode("id").value === id ? + [m] : + undefined : + []; + } + }, + + "TAG": assertTagNameNoComments ? + function( tag, context ) { + if ( typeof context.getElementsByTagName !== strundefined ) { + return context.getElementsByTagName( tag ); + } + } : + function( tag, context ) { + var results = context.getElementsByTagName( tag ); + + // Filter out possible comments + if ( tag === "*" ) { + var elem, + tmp = [], + i = 0; + + for ( ; (elem = results[i]); i++ ) { + if ( elem.nodeType === 1 ) { + tmp.push( elem ); + } + } + + return tmp; + } + return results; + }, + + "NAME": assertUsableName && function( tag, context ) { + if ( typeof context.getElementsByName !== strundefined ) { + return context.getElementsByName( name ); + } + }, + + "CLASS": assertUsableClassName && function( className, context, xml ) { + if ( typeof context.getElementsByClassName !== strundefined && !xml ) { + return context.getElementsByClassName( className ); + } + } + }, + + relative: { + ">": { dir: "parentNode", first: true }, + " ": { dir: "parentNode" }, + "+": { dir: "previousSibling", first: true }, + "~": { dir: "previousSibling" } + }, + + preFilter: { + "ATTR": function( match ) { + match[1] = match[1].replace( rbackslash, "" ); + + // Move the given value to match[3] whether quoted or unquoted + match[3] = ( match[4] || match[5] || "" ).replace( rbackslash, "" ); + + if ( match[2] === "~=" ) { + match[3] = " " + match[3] + " "; + } + + return match.slice( 0, 4 ); + }, + + "CHILD": function( match ) { + /* matches from matchExpr["CHILD"] + 1 type (only|nth|...) + 2 argument (even|odd|\d*|\d*n([+-]\d+)?|...) + 3 xn-component of xn+y argument ([+-]?\d*n|) + 4 sign of xn-component + 5 x of xn-component + 6 sign of y-component + 7 y of y-component + */ + match[1] = match[1].toLowerCase(); + + if ( match[1] === "nth" ) { + // nth-child requires argument + if ( !match[2] ) { + Sizzle.error( match[0] ); + } + + // numeric x and y parameters for Expr.filter.CHILD + // remember that false/true cast respectively to 0/1 + match[3] = +( match[3] ? match[4] + (match[5] || 1) : 2 * ( match[2] === "even" || match[2] === "odd" ) ); + match[4] = +( ( match[6] + match[7] ) || match[2] === "odd" ); + + // other types prohibit arguments + } else if ( match[2] ) { + Sizzle.error( match[0] ); + } + + return match; + }, + + "PSEUDO": function( match ) { + var unquoted, excess; + if ( matchExpr["CHILD"].test( match[0] ) ) { + return null; + } + + if ( match[3] ) { + match[2] = match[3]; + } else if ( (unquoted = match[4]) ) { + // Only check arguments that contain a pseudo + if ( rpseudo.test(unquoted) && + // Get excess from tokenize (recursively) + (excess = tokenize( unquoted, true )) && + // advance to the next closing parenthesis + (excess = unquoted.indexOf( ")", unquoted.length - excess ) - unquoted.length) ) { + + // excess is a negative index + unquoted = unquoted.slice( 0, excess ); + match[0] = match[0].slice( 0, excess ); + } + match[2] = unquoted; + } + + // Return only captures needed by the pseudo filter method (type and argument) + return match.slice( 0, 3 ); + } + }, + + filter: { + "ID": assertGetIdNotName ? + function( id ) { + id = id.replace( rbackslash, "" ); + return function( elem ) { + return elem.getAttribute("id") === id; + }; + } : + function( id ) { + id = id.replace( rbackslash, "" ); + return function( elem ) { + var node = typeof elem.getAttributeNode !== strundefined && elem.getAttributeNode("id"); + return node && node.value === id; + }; + }, + + "TAG": function( nodeName ) { + if ( nodeName === "*" ) { + return function() { return true; }; + } + nodeName = nodeName.replace( rbackslash, "" ).toLowerCase(); + + return function( elem ) { + return elem.nodeName && elem.nodeName.toLowerCase() === nodeName; + }; + }, + + "CLASS": function( className ) { + var pattern = classCache[ expando ][ className ]; + if ( !pattern ) { + pattern = classCache( className, new RegExp("(^|" + whitespace + ")" + className + "(" + whitespace + "|$)") ); + } + return function( elem ) { + return pattern.test( elem.className || (typeof elem.getAttribute !== strundefined && elem.getAttribute("class")) || "" ); + }; + }, + + "ATTR": function( name, operator, check ) { + return function( elem, context ) { + var result = Sizzle.attr( elem, name ); + + if ( result == null ) { + return operator === "!="; + } + if ( !operator ) { + return true; + } + + result += ""; + + return operator === "=" ? result === check : + operator === "!=" ? result !== check : + operator === "^=" ? check && result.indexOf( check ) === 0 : + operator === "*=" ? check && result.indexOf( check ) > -1 : + operator === "$=" ? check && result.substr( result.length - check.length ) === check : + operator === "~=" ? ( " " + result + " " ).indexOf( check ) > -1 : + operator === "|=" ? result === check || result.substr( 0, check.length + 1 ) === check + "-" : + false; + }; + }, + + "CHILD": function( type, argument, first, last ) { + + if ( type === "nth" ) { + return function( elem ) { + var node, diff, + parent = elem.parentNode; + + if ( first === 1 && last === 0 ) { + return true; + } + + if ( parent ) { + diff = 0; + for ( node = parent.firstChild; node; node = node.nextSibling ) { + if ( node.nodeType === 1 ) { + diff++; + if ( elem === node ) { + break; + } + } + } + } + + // Incorporate the offset (or cast to NaN), then check against cycle size + diff -= last; + return diff === first || ( diff % first === 0 && diff / first >= 0 ); + }; + } + + return function( elem ) { + var node = elem; + + switch ( type ) { + case "only": + case "first": + while ( (node = node.previousSibling) ) { + if ( node.nodeType === 1 ) { + return false; + } + } + + if ( type === "first" ) { + return true; + } + + node = elem; + + /* falls through */ + case "last": + while ( (node = node.nextSibling) ) { + if ( node.nodeType === 1 ) { + return false; + } + } + + return true; + } + }; + }, + + "PSEUDO": function( pseudo, argument ) { + // pseudo-class names are case-insensitive + // http://www.w3.org/TR/selectors/#pseudo-classes + // Prioritize by case sensitivity in case custom pseudos are added with uppercase letters + // Remember that setFilters inherits from pseudos + var args, + fn = Expr.pseudos[ pseudo ] || Expr.setFilters[ pseudo.toLowerCase() ] || + Sizzle.error( "unsupported pseudo: " + pseudo ); + + // The user may use createPseudo to indicate that + // arguments are needed to create the filter function + // just as Sizzle does + if ( fn[ expando ] ) { + return fn( argument ); + } + + // But maintain support for old signatures + if ( fn.length > 1 ) { + args = [ pseudo, pseudo, "", argument ]; + return Expr.setFilters.hasOwnProperty( pseudo.toLowerCase() ) ? + markFunction(function( seed, matches ) { + var idx, + matched = fn( seed, argument ), + i = matched.length; + while ( i-- ) { + idx = indexOf.call( seed, matched[i] ); + seed[ idx ] = !( matches[ idx ] = matched[i] ); + } + }) : + function( elem ) { + return fn( elem, 0, args ); + }; + } + + return fn; + } + }, + + pseudos: { + "not": markFunction(function( selector ) { + // Trim the selector passed to compile + // to avoid treating leading and trailing + // spaces as combinators + var input = [], + results = [], + matcher = compile( selector.replace( rtrim, "$1" ) ); + + return matcher[ expando ] ? + markFunction(function( seed, matches, context, xml ) { + var elem, + unmatched = matcher( seed, null, xml, [] ), + i = seed.length; + + // Match elements unmatched by `matcher` + while ( i-- ) { + if ( (elem = unmatched[i]) ) { + seed[i] = !(matches[i] = elem); + } + } + }) : + function( elem, context, xml ) { + input[0] = elem; + matcher( input, null, xml, results ); + return !results.pop(); + }; + }), + + "has": markFunction(function( selector ) { + return function( elem ) { + return Sizzle( selector, elem ).length > 0; + }; + }), + + "contains": markFunction(function( text ) { + return function( elem ) { + return ( elem.textContent || elem.innerText || getText( elem ) ).indexOf( text ) > -1; + }; + }), + + "enabled": function( elem ) { + return elem.disabled === false; + }, + + "disabled": function( elem ) { + return elem.disabled === true; + }, + + "checked": function( elem ) { + // In CSS3, :checked should return both checked and selected elements + // http://www.w3.org/TR/2011/REC-css3-selectors-20110929/#checked + var nodeName = elem.nodeName.toLowerCase(); + return (nodeName === "input" && !!elem.checked) || (nodeName === "option" && !!elem.selected); + }, + + "selected": function( elem ) { + // Accessing this property makes selected-by-default + // options in Safari work properly + if ( elem.parentNode ) { + elem.parentNode.selectedIndex; + } + + return elem.selected === true; + }, + + "parent": function( elem ) { + return !Expr.pseudos["empty"]( elem ); + }, + + "empty": function( elem ) { + // http://www.w3.org/TR/selectors/#empty-pseudo + // :empty is only affected by element nodes and content nodes(including text(3), cdata(4)), + // not comment, processing instructions, or others + // Thanks to Diego Perini for the nodeName shortcut + // Greater than "@" means alpha characters (specifically not starting with "#" or "?") + var nodeType; + elem = elem.firstChild; + while ( elem ) { + if ( elem.nodeName > "@" || (nodeType = elem.nodeType) === 3 || nodeType === 4 ) { + return false; + } + elem = elem.nextSibling; + } + return true; + }, + + "header": function( elem ) { + return rheader.test( elem.nodeName ); + }, + + "text": function( elem ) { + var type, attr; + // IE6 and 7 will map elem.type to 'text' for new HTML5 types (search, etc) + // use getAttribute instead to test this case + return elem.nodeName.toLowerCase() === "input" && + (type = elem.type) === "text" && + ( (attr = elem.getAttribute("type")) == null || attr.toLowerCase() === type ); + }, + + // Input types + "radio": createInputPseudo("radio"), + "checkbox": createInputPseudo("checkbox"), + "file": createInputPseudo("file"), + "password": createInputPseudo("password"), + "image": createInputPseudo("image"), + + "submit": createButtonPseudo("submit"), + "reset": createButtonPseudo("reset"), + + "button": function( elem ) { + var name = elem.nodeName.toLowerCase(); + return name === "input" && elem.type === "button" || name === "button"; + }, + + "input": function( elem ) { + return rinputs.test( elem.nodeName ); + }, + + "focus": function( elem ) { + var doc = elem.ownerDocument; + return elem === doc.activeElement && (!doc.hasFocus || doc.hasFocus()) && !!(elem.type || elem.href); + }, + + "active": function( elem ) { + return elem === elem.ownerDocument.activeElement; + }, + + // Positional types + "first": createPositionalPseudo(function( matchIndexes, length, argument ) { + return [ 0 ]; + }), + + "last": createPositionalPseudo(function( matchIndexes, length, argument ) { + return [ length - 1 ]; + }), + + "eq": createPositionalPseudo(function( matchIndexes, length, argument ) { + return [ argument < 0 ? argument + length : argument ]; + }), + + "even": createPositionalPseudo(function( matchIndexes, length, argument ) { + for ( var i = 0; i < length; i += 2 ) { + matchIndexes.push( i ); + } + return matchIndexes; + }), + + "odd": createPositionalPseudo(function( matchIndexes, length, argument ) { + for ( var i = 1; i < length; i += 2 ) { + matchIndexes.push( i ); + } + return matchIndexes; + }), + + "lt": createPositionalPseudo(function( matchIndexes, length, argument ) { + for ( var i = argument < 0 ? argument + length : argument; --i >= 0; ) { + matchIndexes.push( i ); + } + return matchIndexes; + }), + + "gt": createPositionalPseudo(function( matchIndexes, length, argument ) { + for ( var i = argument < 0 ? argument + length : argument; ++i < length; ) { + matchIndexes.push( i ); + } + return matchIndexes; + }) + } +}; + +function siblingCheck( a, b, ret ) { + if ( a === b ) { + return ret; + } + + var cur = a.nextSibling; + + while ( cur ) { + if ( cur === b ) { + return -1; + } + + cur = cur.nextSibling; + } + + return 1; +} + +sortOrder = docElem.compareDocumentPosition ? + function( a, b ) { + if ( a === b ) { + hasDuplicate = true; + return 0; + } + + return ( !a.compareDocumentPosition || !b.compareDocumentPosition ? + a.compareDocumentPosition : + a.compareDocumentPosition(b) & 4 + ) ? -1 : 1; + } : + function( a, b ) { + // The nodes are identical, we can exit early + if ( a === b ) { + hasDuplicate = true; + return 0; + + // Fallback to using sourceIndex (in IE) if it's available on both nodes + } else if ( a.sourceIndex && b.sourceIndex ) { + return a.sourceIndex - b.sourceIndex; + } + + var al, bl, + ap = [], + bp = [], + aup = a.parentNode, + bup = b.parentNode, + cur = aup; + + // If the nodes are siblings (or identical) we can do a quick check + if ( aup === bup ) { + return siblingCheck( a, b ); + + // If no parents were found then the nodes are disconnected + } else if ( !aup ) { + return -1; + + } else if ( !bup ) { + return 1; + } + + // Otherwise they're somewhere else in the tree so we need + // to build up a full list of the parentNodes for comparison + while ( cur ) { + ap.unshift( cur ); + cur = cur.parentNode; + } + + cur = bup; + + while ( cur ) { + bp.unshift( cur ); + cur = cur.parentNode; + } + + al = ap.length; + bl = bp.length; + + // Start walking down the tree looking for a discrepancy + for ( var i = 0; i < al && i < bl; i++ ) { + if ( ap[i] !== bp[i] ) { + return siblingCheck( ap[i], bp[i] ); + } + } + + // We ended someplace up the tree so do a sibling check + return i === al ? + siblingCheck( a, bp[i], -1 ) : + siblingCheck( ap[i], b, 1 ); + }; + +// Always assume the presence of duplicates if sort doesn't +// pass them to our comparison function (as in Google Chrome). +[0, 0].sort( sortOrder ); +baseHasDuplicate = !hasDuplicate; + +// Document sorting and removing duplicates +Sizzle.uniqueSort = function( results ) { + var elem, + i = 1; + + hasDuplicate = baseHasDuplicate; + results.sort( sortOrder ); + + if ( hasDuplicate ) { + for ( ; (elem = results[i]); i++ ) { + if ( elem === results[ i - 1 ] ) { + results.splice( i--, 1 ); + } + } + } + + return results; +}; + +Sizzle.error = function( msg ) { + throw new Error( "Syntax error, unrecognized expression: " + msg ); +}; + +function tokenize( selector, parseOnly ) { + var matched, match, tokens, type, soFar, groups, preFilters, + cached = tokenCache[ expando ][ selector ]; + + if ( cached ) { + return parseOnly ? 0 : cached.slice( 0 ); + } + + soFar = selector; + groups = []; + preFilters = Expr.preFilter; + + while ( soFar ) { + + // Comma and first run + if ( !matched || (match = rcomma.exec( soFar )) ) { + if ( match ) { + soFar = soFar.slice( match[0].length ); + } + groups.push( tokens = [] ); + } + + matched = false; + + // Combinators + if ( (match = rcombinators.exec( soFar )) ) { + tokens.push( matched = new Token( match.shift() ) ); + soFar = soFar.slice( matched.length ); + + // Cast descendant combinators to space + matched.type = match[0].replace( rtrim, " " ); + } + + // Filters + for ( type in Expr.filter ) { + if ( (match = matchExpr[ type ].exec( soFar )) && (!preFilters[ type ] || + // The last two arguments here are (context, xml) for backCompat + (match = preFilters[ type ]( match, document, true ))) ) { + + tokens.push( matched = new Token( match.shift() ) ); + soFar = soFar.slice( matched.length ); + matched.type = type; + matched.matches = match; + } + } + + if ( !matched ) { + break; + } + } + + // Return the length of the invalid excess + // if we're just parsing + // Otherwise, throw an error or return tokens + return parseOnly ? + soFar.length : + soFar ? + Sizzle.error( selector ) : + // Cache the tokens + tokenCache( selector, groups ).slice( 0 ); +} + +function addCombinator( matcher, combinator, base ) { + var dir = combinator.dir, + checkNonElements = base && combinator.dir === "parentNode", + doneName = done++; + + return combinator.first ? + // Check against closest ancestor/preceding element + function( elem, context, xml ) { + while ( (elem = elem[ dir ]) ) { + if ( checkNonElements || elem.nodeType === 1 ) { + return matcher( elem, context, xml ); + } + } + } : + + // Check against all ancestor/preceding elements + function( elem, context, xml ) { + // We can't set arbitrary data on XML nodes, so they don't benefit from dir caching + if ( !xml ) { + var cache, + dirkey = dirruns + " " + doneName + " ", + cachedkey = dirkey + cachedruns; + while ( (elem = elem[ dir ]) ) { + if ( checkNonElements || elem.nodeType === 1 ) { + if ( (cache = elem[ expando ]) === cachedkey ) { + return elem.sizset; + } else if ( typeof cache === "string" && cache.indexOf(dirkey) === 0 ) { + if ( elem.sizset ) { + return elem; + } + } else { + elem[ expando ] = cachedkey; + if ( matcher( elem, context, xml ) ) { + elem.sizset = true; + return elem; + } + elem.sizset = false; + } + } + } + } else { + while ( (elem = elem[ dir ]) ) { + if ( checkNonElements || elem.nodeType === 1 ) { + if ( matcher( elem, context, xml ) ) { + return elem; + } + } + } + } + }; +} + +function elementMatcher( matchers ) { + return matchers.length > 1 ? + function( elem, context, xml ) { + var i = matchers.length; + while ( i-- ) { + if ( !matchers[i]( elem, context, xml ) ) { + return false; + } + } + return true; + } : + matchers[0]; +} + +function condense( unmatched, map, filter, context, xml ) { + var elem, + newUnmatched = [], + i = 0, + len = unmatched.length, + mapped = map != null; + + for ( ; i < len; i++ ) { + if ( (elem = unmatched[i]) ) { + if ( !filter || filter( elem, context, xml ) ) { + newUnmatched.push( elem ); + if ( mapped ) { + map.push( i ); + } + } + } + } + + return newUnmatched; +} + +function setMatcher( preFilter, selector, matcher, postFilter, postFinder, postSelector ) { + if ( postFilter && !postFilter[ expando ] ) { + postFilter = setMatcher( postFilter ); + } + if ( postFinder && !postFinder[ expando ] ) { + postFinder = setMatcher( postFinder, postSelector ); + } + return markFunction(function( seed, results, context, xml ) { + // Positional selectors apply to seed elements, so it is invalid to follow them with relative ones + if ( seed && postFinder ) { + return; + } + + var i, elem, postFilterIn, + preMap = [], + postMap = [], + preexisting = results.length, + + // Get initial elements from seed or context + elems = seed || multipleContexts( selector || "*", context.nodeType ? [ context ] : context, [], seed ), + + // Prefilter to get matcher input, preserving a map for seed-results synchronization + matcherIn = preFilter && ( seed || !selector ) ? + condense( elems, preMap, preFilter, context, xml ) : + elems, + + matcherOut = matcher ? + // If we have a postFinder, or filtered seed, or non-seed postFilter or preexisting results, + postFinder || ( seed ? preFilter : preexisting || postFilter ) ? + + // ...intermediate processing is necessary + [] : + + // ...otherwise use results directly + results : + matcherIn; + + // Find primary matches + if ( matcher ) { + matcher( matcherIn, matcherOut, context, xml ); + } + + // Apply postFilter + if ( postFilter ) { + postFilterIn = condense( matcherOut, postMap ); + postFilter( postFilterIn, [], context, xml ); + + // Un-match failing elements by moving them back to matcherIn + i = postFilterIn.length; + while ( i-- ) { + if ( (elem = postFilterIn[i]) ) { + matcherOut[ postMap[i] ] = !(matcherIn[ postMap[i] ] = elem); + } + } + } + + // Keep seed and results synchronized + if ( seed ) { + // Ignore postFinder because it can't coexist with seed + i = preFilter && matcherOut.length; + while ( i-- ) { + if ( (elem = matcherOut[i]) ) { + seed[ preMap[i] ] = !(results[ preMap[i] ] = elem); + } + } + } else { + matcherOut = condense( + matcherOut === results ? + matcherOut.splice( preexisting, matcherOut.length ) : + matcherOut + ); + if ( postFinder ) { + postFinder( null, results, matcherOut, xml ); + } else { + push.apply( results, matcherOut ); + } + } + }); +} + +function matcherFromTokens( tokens ) { + var checkContext, matcher, j, + len = tokens.length, + leadingRelative = Expr.relative[ tokens[0].type ], + implicitRelative = leadingRelative || Expr.relative[" "], + i = leadingRelative ? 1 : 0, + + // The foundational matcher ensures that elements are reachable from top-level context(s) + matchContext = addCombinator( function( elem ) { + return elem === checkContext; + }, implicitRelative, true ), + matchAnyContext = addCombinator( function( elem ) { + return indexOf.call( checkContext, elem ) > -1; + }, implicitRelative, true ), + matchers = [ function( elem, context, xml ) { + return ( !leadingRelative && ( xml || context !== outermostContext ) ) || ( + (checkContext = context).nodeType ? + matchContext( elem, context, xml ) : + matchAnyContext( elem, context, xml ) ); + } ]; + + for ( ; i < len; i++ ) { + if ( (matcher = Expr.relative[ tokens[i].type ]) ) { + matchers = [ addCombinator( elementMatcher( matchers ), matcher ) ]; + } else { + // The concatenated values are (context, xml) for backCompat + matcher = Expr.filter[ tokens[i].type ].apply( null, tokens[i].matches ); + + // Return special upon seeing a positional matcher + if ( matcher[ expando ] ) { + // Find the next relative operator (if any) for proper handling + j = ++i; + for ( ; j < len; j++ ) { + if ( Expr.relative[ tokens[j].type ] ) { + break; + } + } + return setMatcher( + i > 1 && elementMatcher( matchers ), + i > 1 && tokens.slice( 0, i - 1 ).join("").replace( rtrim, "$1" ), + matcher, + i < j && matcherFromTokens( tokens.slice( i, j ) ), + j < len && matcherFromTokens( (tokens = tokens.slice( j )) ), + j < len && tokens.join("") + ); + } + matchers.push( matcher ); + } + } + + return elementMatcher( matchers ); +} + +function matcherFromGroupMatchers( elementMatchers, setMatchers ) { + var bySet = setMatchers.length > 0, + byElement = elementMatchers.length > 0, + superMatcher = function( seed, context, xml, results, expandContext ) { + var elem, j, matcher, + setMatched = [], + matchedCount = 0, + i = "0", + unmatched = seed && [], + outermost = expandContext != null, + contextBackup = outermostContext, + // We must always have either seed elements or context + elems = seed || byElement && Expr.find["TAG"]( "*", expandContext && context.parentNode || context ), + // Nested matchers should use non-integer dirruns + dirrunsUnique = (dirruns += contextBackup == null ? 1 : Math.E); + + if ( outermost ) { + outermostContext = context !== document && context; + cachedruns = superMatcher.el; + } + + // Add elements passing elementMatchers directly to results + for ( ; (elem = elems[i]) != null; i++ ) { + if ( byElement && elem ) { + for ( j = 0; (matcher = elementMatchers[j]); j++ ) { + if ( matcher( elem, context, xml ) ) { + results.push( elem ); + break; + } + } + if ( outermost ) { + dirruns = dirrunsUnique; + cachedruns = ++superMatcher.el; + } + } + + // Track unmatched elements for set filters + if ( bySet ) { + // They will have gone through all possible matchers + if ( (elem = !matcher && elem) ) { + matchedCount--; + } + + // Lengthen the array for every element, matched or not + if ( seed ) { + unmatched.push( elem ); + } + } + } + + // Apply set filters to unmatched elements + matchedCount += i; + if ( bySet && i !== matchedCount ) { + for ( j = 0; (matcher = setMatchers[j]); j++ ) { + matcher( unmatched, setMatched, context, xml ); + } + + if ( seed ) { + // Reintegrate element matches to eliminate the need for sorting + if ( matchedCount > 0 ) { + while ( i-- ) { + if ( !(unmatched[i] || setMatched[i]) ) { + setMatched[i] = pop.call( results ); + } + } + } + + // Discard index placeholder values to get only actual matches + setMatched = condense( setMatched ); + } + + // Add matches to results + push.apply( results, setMatched ); + + // Seedless set matches succeeding multiple successful matchers stipulate sorting + if ( outermost && !seed && setMatched.length > 0 && + ( matchedCount + setMatchers.length ) > 1 ) { + + Sizzle.uniqueSort( results ); + } + } + + // Override manipulation of globals by nested matchers + if ( outermost ) { + dirruns = dirrunsUnique; + outermostContext = contextBackup; + } + + return unmatched; + }; + + superMatcher.el = 0; + return bySet ? + markFunction( superMatcher ) : + superMatcher; +} + +compile = Sizzle.compile = function( selector, group /* Internal Use Only */ ) { + var i, + setMatchers = [], + elementMatchers = [], + cached = compilerCache[ expando ][ selector ]; + + if ( !cached ) { + // Generate a function of recursive functions that can be used to check each element + if ( !group ) { + group = tokenize( selector ); + } + i = group.length; + while ( i-- ) { + cached = matcherFromTokens( group[i] ); + if ( cached[ expando ] ) { + setMatchers.push( cached ); + } else { + elementMatchers.push( cached ); + } + } + + // Cache the compiled function + cached = compilerCache( selector, matcherFromGroupMatchers( elementMatchers, setMatchers ) ); + } + return cached; +}; + +function multipleContexts( selector, contexts, results, seed ) { + var i = 0, + len = contexts.length; + for ( ; i < len; i++ ) { + Sizzle( selector, contexts[i], results, seed ); + } + return results; +} + +function select( selector, context, results, seed, xml ) { + var i, tokens, token, type, find, + match = tokenize( selector ), + j = match.length; + + if ( !seed ) { + // Try to minimize operations if there is only one group + if ( match.length === 1 ) { + + // Take a shortcut and set the context if the root selector is an ID + tokens = match[0] = match[0].slice( 0 ); + if ( tokens.length > 2 && (token = tokens[0]).type === "ID" && + context.nodeType === 9 && !xml && + Expr.relative[ tokens[1].type ] ) { + + context = Expr.find["ID"]( token.matches[0].replace( rbackslash, "" ), context, xml )[0]; + if ( !context ) { + return results; + } + + selector = selector.slice( tokens.shift().length ); + } + + // Fetch a seed set for right-to-left matching + for ( i = matchExpr["POS"].test( selector ) ? -1 : tokens.length - 1; i >= 0; i-- ) { + token = tokens[i]; + + // Abort if we hit a combinator + if ( Expr.relative[ (type = token.type) ] ) { + break; + } + if ( (find = Expr.find[ type ]) ) { + // Search, expanding context for leading sibling combinators + if ( (seed = find( + token.matches[0].replace( rbackslash, "" ), + rsibling.test( tokens[0].type ) && context.parentNode || context, + xml + )) ) { + + // If seed is empty or no tokens remain, we can return early + tokens.splice( i, 1 ); + selector = seed.length && tokens.join(""); + if ( !selector ) { + push.apply( results, slice.call( seed, 0 ) ); + return results; + } + + break; + } + } + } + } + } + + // Compile and execute a filtering function + // Provide `match` to avoid retokenization if we modified the selector above + compile( selector, match )( + seed, + context, + xml, + results, + rsibling.test( selector ) + ); + return results; +} + +if ( document.querySelectorAll ) { + (function() { + var disconnectedMatch, + oldSelect = select, + rescape = /'|\\/g, + rattributeQuotes = /\=[\x20\t\r\n\f]*([^'"\]]*)[\x20\t\r\n\f]*\]/g, + + // qSa(:focus) reports false when true (Chrome 21), + // A support test would require too much code (would include document ready) + rbuggyQSA = [":focus"], + + // matchesSelector(:focus) reports false when true (Chrome 21), + // matchesSelector(:active) reports false when true (IE9/Opera 11.5) + // A support test would require too much code (would include document ready) + // just skip matchesSelector for :active + rbuggyMatches = [ ":active", ":focus" ], + matches = docElem.matchesSelector || + docElem.mozMatchesSelector || + docElem.webkitMatchesSelector || + docElem.oMatchesSelector || + docElem.msMatchesSelector; + + // Build QSA regex + // Regex strategy adopted from Diego Perini + assert(function( div ) { + // Select is set to empty string on purpose + // This is to test IE's treatment of not explictly + // setting a boolean content attribute, + // since its presence should be enough + // http://bugs.jquery.com/ticket/12359 + div.innerHTML = ""; + + // IE8 - Some boolean attributes are not treated correctly + if ( !div.querySelectorAll("[selected]").length ) { + rbuggyQSA.push( "\\[" + whitespace + "*(?:checked|disabled|ismap|multiple|readonly|selected|value)" ); + } + + // Webkit/Opera - :checked should return selected option elements + // http://www.w3.org/TR/2011/REC-css3-selectors-20110929/#checked + // IE8 throws error here (do not put tests after this one) + if ( !div.querySelectorAll(":checked").length ) { + rbuggyQSA.push(":checked"); + } + }); + + assert(function( div ) { + + // Opera 10-12/IE9 - ^= $= *= and empty values + // Should not select anything + div.innerHTML = "

    "; + if ( div.querySelectorAll("[test^='']").length ) { + rbuggyQSA.push( "[*^$]=" + whitespace + "*(?:\"\"|'')" ); + } + + // FF 3.5 - :enabled/:disabled and hidden elements (hidden elements are still enabled) + // IE8 throws error here (do not put tests after this one) + div.innerHTML = ""; + if ( !div.querySelectorAll(":enabled").length ) { + rbuggyQSA.push(":enabled", ":disabled"); + } + }); + + // rbuggyQSA always contains :focus, so no need for a length check + rbuggyQSA = /* rbuggyQSA.length && */ new RegExp( rbuggyQSA.join("|") ); + + select = function( selector, context, results, seed, xml ) { + // Only use querySelectorAll when not filtering, + // when this is not xml, + // and when no QSA bugs apply + if ( !seed && !xml && (!rbuggyQSA || !rbuggyQSA.test( selector )) ) { + var groups, i, + old = true, + nid = expando, + newContext = context, + newSelector = context.nodeType === 9 && selector; + + // qSA works strangely on Element-rooted queries + // We can work around this by specifying an extra ID on the root + // and working up from there (Thanks to Andrew Dupont for the technique) + // IE 8 doesn't work on object elements + if ( context.nodeType === 1 && context.nodeName.toLowerCase() !== "object" ) { + groups = tokenize( selector ); + + if ( (old = context.getAttribute("id")) ) { + nid = old.replace( rescape, "\\$&" ); + } else { + context.setAttribute( "id", nid ); + } + nid = "[id='" + nid + "'] "; + + i = groups.length; + while ( i-- ) { + groups[i] = nid + groups[i].join(""); + } + newContext = rsibling.test( selector ) && context.parentNode || context; + newSelector = groups.join(","); + } + + if ( newSelector ) { + try { + push.apply( results, slice.call( newContext.querySelectorAll( + newSelector + ), 0 ) ); + return results; + } catch(qsaError) { + } finally { + if ( !old ) { + context.removeAttribute("id"); + } + } + } + } + + return oldSelect( selector, context, results, seed, xml ); + }; + + if ( matches ) { + assert(function( div ) { + // Check to see if it's possible to do matchesSelector + // on a disconnected node (IE 9) + disconnectedMatch = matches.call( div, "div" ); + + // This should fail with an exception + // Gecko does not error, returns false instead + try { + matches.call( div, "[test!='']:sizzle" ); + rbuggyMatches.push( "!=", pseudos ); + } catch ( e ) {} + }); + + // rbuggyMatches always contains :active and :focus, so no need for a length check + rbuggyMatches = /* rbuggyMatches.length && */ new RegExp( rbuggyMatches.join("|") ); + + Sizzle.matchesSelector = function( elem, expr ) { + // Make sure that attribute selectors are quoted + expr = expr.replace( rattributeQuotes, "='$1']" ); + + // rbuggyMatches always contains :active, so no need for an existence check + if ( !isXML( elem ) && !rbuggyMatches.test( expr ) && (!rbuggyQSA || !rbuggyQSA.test( expr )) ) { + try { + var ret = matches.call( elem, expr ); + + // IE 9's matchesSelector returns false on disconnected nodes + if ( ret || disconnectedMatch || + // As well, disconnected nodes are said to be in a document + // fragment in IE 9 + elem.document && elem.document.nodeType !== 11 ) { + return ret; + } + } catch(e) {} + } + + return Sizzle( expr, null, null, [ elem ] ).length > 0; + }; + } + })(); +} + +// Deprecated +Expr.pseudos["nth"] = Expr.pseudos["eq"]; + +// Back-compat +function setFilters() {} +Expr.filters = setFilters.prototype = Expr.pseudos; +Expr.setFilters = new setFilters(); + +// Override sizzle attribute retrieval +Sizzle.attr = jQuery.attr; +jQuery.find = Sizzle; +jQuery.expr = Sizzle.selectors; +jQuery.expr[":"] = jQuery.expr.pseudos; +jQuery.unique = Sizzle.uniqueSort; +jQuery.text = Sizzle.getText; +jQuery.isXMLDoc = Sizzle.isXML; +jQuery.contains = Sizzle.contains; + + +})( window ); +var runtil = /Until$/, + rparentsprev = /^(?:parents|prev(?:Until|All))/, + isSimple = /^.[^:#\[\.,]*$/, + rneedsContext = jQuery.expr.match.needsContext, + // methods guaranteed to produce a unique set when starting from a unique set + guaranteedUnique = { + children: true, + contents: true, + next: true, + prev: true + }; + +jQuery.fn.extend({ + find: function( selector ) { + var i, l, length, n, r, ret, + self = this; + + if ( typeof selector !== "string" ) { + return jQuery( selector ).filter(function() { + for ( i = 0, l = self.length; i < l; i++ ) { + if ( jQuery.contains( self[ i ], this ) ) { + return true; + } + } + }); + } + + ret = this.pushStack( "", "find", selector ); + + for ( i = 0, l = this.length; i < l; i++ ) { + length = ret.length; + jQuery.find( selector, this[i], ret ); + + if ( i > 0 ) { + // Make sure that the results are unique + for ( n = length; n < ret.length; n++ ) { + for ( r = 0; r < length; r++ ) { + if ( ret[r] === ret[n] ) { + ret.splice(n--, 1); + break; + } + } + } + } + } + + return ret; + }, + + has: function( target ) { + var i, + targets = jQuery( target, this ), + len = targets.length; + + return this.filter(function() { + for ( i = 0; i < len; i++ ) { + if ( jQuery.contains( this, targets[i] ) ) { + return true; + } + } + }); + }, + + not: function( selector ) { + return this.pushStack( winnow(this, selector, false), "not", selector); + }, + + filter: function( selector ) { + return this.pushStack( winnow(this, selector, true), "filter", selector ); + }, + + is: function( selector ) { + return !!selector && ( + typeof selector === "string" ? + // If this is a positional/relative selector, check membership in the returned set + // so $("p:first").is("p:last") won't return true for a doc with two "p". + rneedsContext.test( selector ) ? + jQuery( selector, this.context ).index( this[0] ) >= 0 : + jQuery.filter( selector, this ).length > 0 : + this.filter( selector ).length > 0 ); + }, + + closest: function( selectors, context ) { + var cur, + i = 0, + l = this.length, + ret = [], + pos = rneedsContext.test( selectors ) || typeof selectors !== "string" ? + jQuery( selectors, context || this.context ) : + 0; + + for ( ; i < l; i++ ) { + cur = this[i]; + + while ( cur && cur.ownerDocument && cur !== context && cur.nodeType !== 11 ) { + if ( pos ? pos.index(cur) > -1 : jQuery.find.matchesSelector(cur, selectors) ) { + ret.push( cur ); + break; + } + cur = cur.parentNode; + } + } + + ret = ret.length > 1 ? jQuery.unique( ret ) : ret; + + return this.pushStack( ret, "closest", selectors ); + }, + + // Determine the position of an element within + // the matched set of elements + index: function( elem ) { + + // No argument, return index in parent + if ( !elem ) { + return ( this[0] && this[0].parentNode ) ? this.prevAll().length : -1; + } + + // index in selector + if ( typeof elem === "string" ) { + return jQuery.inArray( this[0], jQuery( elem ) ); + } + + // Locate the position of the desired element + return jQuery.inArray( + // If it receives a jQuery object, the first element is used + elem.jquery ? elem[0] : elem, this ); + }, + + add: function( selector, context ) { + var set = typeof selector === "string" ? + jQuery( selector, context ) : + jQuery.makeArray( selector && selector.nodeType ? [ selector ] : selector ), + all = jQuery.merge( this.get(), set ); + + return this.pushStack( isDisconnected( set[0] ) || isDisconnected( all[0] ) ? + all : + jQuery.unique( all ) ); + }, + + addBack: function( selector ) { + return this.add( selector == null ? + this.prevObject : this.prevObject.filter(selector) + ); + } +}); + +jQuery.fn.andSelf = jQuery.fn.addBack; + +// A painfully simple check to see if an element is disconnected +// from a document (should be improved, where feasible). +function isDisconnected( node ) { + return !node || !node.parentNode || node.parentNode.nodeType === 11; +} + +function sibling( cur, dir ) { + do { + cur = cur[ dir ]; + } while ( cur && cur.nodeType !== 1 ); + + return cur; +} + +jQuery.each({ + parent: function( elem ) { + var parent = elem.parentNode; + return parent && parent.nodeType !== 11 ? parent : null; + }, + parents: function( elem ) { + return jQuery.dir( elem, "parentNode" ); + }, + parentsUntil: function( elem, i, until ) { + return jQuery.dir( elem, "parentNode", until ); + }, + next: function( elem ) { + return sibling( elem, "nextSibling" ); + }, + prev: function( elem ) { + return sibling( elem, "previousSibling" ); + }, + nextAll: function( elem ) { + return jQuery.dir( elem, "nextSibling" ); + }, + prevAll: function( elem ) { + return jQuery.dir( elem, "previousSibling" ); + }, + nextUntil: function( elem, i, until ) { + return jQuery.dir( elem, "nextSibling", until ); + }, + prevUntil: function( elem, i, until ) { + return jQuery.dir( elem, "previousSibling", until ); + }, + siblings: function( elem ) { + return jQuery.sibling( ( elem.parentNode || {} ).firstChild, elem ); + }, + children: function( elem ) { + return jQuery.sibling( elem.firstChild ); + }, + contents: function( elem ) { + return jQuery.nodeName( elem, "iframe" ) ? + elem.contentDocument || elem.contentWindow.document : + jQuery.merge( [], elem.childNodes ); + } +}, function( name, fn ) { + jQuery.fn[ name ] = function( until, selector ) { + var ret = jQuery.map( this, fn, until ); + + if ( !runtil.test( name ) ) { + selector = until; + } + + if ( selector && typeof selector === "string" ) { + ret = jQuery.filter( selector, ret ); + } + + ret = this.length > 1 && !guaranteedUnique[ name ] ? jQuery.unique( ret ) : ret; + + if ( this.length > 1 && rparentsprev.test( name ) ) { + ret = ret.reverse(); + } + + return this.pushStack( ret, name, core_slice.call( arguments ).join(",") ); + }; +}); + +jQuery.extend({ + filter: function( expr, elems, not ) { + if ( not ) { + expr = ":not(" + expr + ")"; + } + + return elems.length === 1 ? + jQuery.find.matchesSelector(elems[0], expr) ? [ elems[0] ] : [] : + jQuery.find.matches(expr, elems); + }, + + dir: function( elem, dir, until ) { + var matched = [], + cur = elem[ dir ]; + + while ( cur && cur.nodeType !== 9 && (until === undefined || cur.nodeType !== 1 || !jQuery( cur ).is( until )) ) { + if ( cur.nodeType === 1 ) { + matched.push( cur ); + } + cur = cur[dir]; + } + return matched; + }, + + sibling: function( n, elem ) { + var r = []; + + for ( ; n; n = n.nextSibling ) { + if ( n.nodeType === 1 && n !== elem ) { + r.push( n ); + } + } + + return r; + } +}); + +// Implement the identical functionality for filter and not +function winnow( elements, qualifier, keep ) { + + // Can't pass null or undefined to indexOf in Firefox 4 + // Set to 0 to skip string check + qualifier = qualifier || 0; + + if ( jQuery.isFunction( qualifier ) ) { + return jQuery.grep(elements, function( elem, i ) { + var retVal = !!qualifier.call( elem, i, elem ); + return retVal === keep; + }); + + } else if ( qualifier.nodeType ) { + return jQuery.grep(elements, function( elem, i ) { + return ( elem === qualifier ) === keep; + }); + + } else if ( typeof qualifier === "string" ) { + var filtered = jQuery.grep(elements, function( elem ) { + return elem.nodeType === 1; + }); + + if ( isSimple.test( qualifier ) ) { + return jQuery.filter(qualifier, filtered, !keep); + } else { + qualifier = jQuery.filter( qualifier, filtered ); + } + } + + return jQuery.grep(elements, function( elem, i ) { + return ( jQuery.inArray( elem, qualifier ) >= 0 ) === keep; + }); +} +function createSafeFragment( document ) { + var list = nodeNames.split( "|" ), + safeFrag = document.createDocumentFragment(); + + if ( safeFrag.createElement ) { + while ( list.length ) { + safeFrag.createElement( + list.pop() + ); + } + } + return safeFrag; +} + +var nodeNames = "abbr|article|aside|audio|bdi|canvas|data|datalist|details|figcaption|figure|footer|" + + "header|hgroup|mark|meter|nav|output|progress|section|summary|time|video", + rinlinejQuery = / jQuery\d+="(?:null|\d+)"/g, + rleadingWhitespace = /^\s+/, + rxhtmlTag = /<(?!area|br|col|embed|hr|img|input|link|meta|param)(([\w:]+)[^>]*)\/>/gi, + rtagName = /<([\w:]+)/, + rtbody = /]", "i"), + rcheckableType = /^(?:checkbox|radio)$/, + // checked="checked" or checked + rchecked = /checked\s*(?:[^=]|=\s*.checked.)/i, + rscriptType = /\/(java|ecma)script/i, + rcleanScript = /^\s*\s*$/g, + wrapMap = { + option: [ 1, "" ], + legend: [ 1, "
    ", "
    " ], + thead: [ 1, "", "
    " ], + tr: [ 2, "", "
    " ], + td: [ 3, "", "
    " ], + col: [ 2, "", "
    " ], + area: [ 1, "", "" ], + _default: [ 0, "", "" ] + }, + safeFragment = createSafeFragment( document ), + fragmentDiv = safeFragment.appendChild( document.createElement("div") ); + +wrapMap.optgroup = wrapMap.option; +wrapMap.tbody = wrapMap.tfoot = wrapMap.colgroup = wrapMap.caption = wrapMap.thead; +wrapMap.th = wrapMap.td; + +// IE6-8 can't serialize link, script, style, or any html5 (NoScope) tags, +// unless wrapped in a div with non-breaking characters in front of it. +if ( !jQuery.support.htmlSerialize ) { + wrapMap._default = [ 1, "X
    ", "
    " ]; +} + +jQuery.fn.extend({ + text: function( value ) { + return jQuery.access( this, function( value ) { + return value === undefined ? + jQuery.text( this ) : + this.empty().append( ( this[0] && this[0].ownerDocument || document ).createTextNode( value ) ); + }, null, value, arguments.length ); + }, + + wrapAll: function( html ) { + if ( jQuery.isFunction( html ) ) { + return this.each(function(i) { + jQuery(this).wrapAll( html.call(this, i) ); + }); + } + + if ( this[0] ) { + // The elements to wrap the target around + var wrap = jQuery( html, this[0].ownerDocument ).eq(0).clone(true); + + if ( this[0].parentNode ) { + wrap.insertBefore( this[0] ); + } + + wrap.map(function() { + var elem = this; + + while ( elem.firstChild && elem.firstChild.nodeType === 1 ) { + elem = elem.firstChild; + } + + return elem; + }).append( this ); + } + + return this; + }, + + wrapInner: function( html ) { + if ( jQuery.isFunction( html ) ) { + return this.each(function(i) { + jQuery(this).wrapInner( html.call(this, i) ); + }); + } + + return this.each(function() { + var self = jQuery( this ), + contents = self.contents(); + + if ( contents.length ) { + contents.wrapAll( html ); + + } else { + self.append( html ); + } + }); + }, + + wrap: function( html ) { + var isFunction = jQuery.isFunction( html ); + + return this.each(function(i) { + jQuery( this ).wrapAll( isFunction ? html.call(this, i) : html ); + }); + }, + + unwrap: function() { + return this.parent().each(function() { + if ( !jQuery.nodeName( this, "body" ) ) { + jQuery( this ).replaceWith( this.childNodes ); + } + }).end(); + }, + + append: function() { + return this.domManip(arguments, true, function( elem ) { + if ( this.nodeType === 1 || this.nodeType === 11 ) { + this.appendChild( elem ); + } + }); + }, + + prepend: function() { + return this.domManip(arguments, true, function( elem ) { + if ( this.nodeType === 1 || this.nodeType === 11 ) { + this.insertBefore( elem, this.firstChild ); + } + }); + }, + + before: function() { + if ( !isDisconnected( this[0] ) ) { + return this.domManip(arguments, false, function( elem ) { + this.parentNode.insertBefore( elem, this ); + }); + } + + if ( arguments.length ) { + var set = jQuery.clean( arguments ); + return this.pushStack( jQuery.merge( set, this ), "before", this.selector ); + } + }, + + after: function() { + if ( !isDisconnected( this[0] ) ) { + return this.domManip(arguments, false, function( elem ) { + this.parentNode.insertBefore( elem, this.nextSibling ); + }); + } + + if ( arguments.length ) { + var set = jQuery.clean( arguments ); + return this.pushStack( jQuery.merge( this, set ), "after", this.selector ); + } + }, + + // keepData is for internal use only--do not document + remove: function( selector, keepData ) { + var elem, + i = 0; + + for ( ; (elem = this[i]) != null; i++ ) { + if ( !selector || jQuery.filter( selector, [ elem ] ).length ) { + if ( !keepData && elem.nodeType === 1 ) { + jQuery.cleanData( elem.getElementsByTagName("*") ); + jQuery.cleanData( [ elem ] ); + } + + if ( elem.parentNode ) { + elem.parentNode.removeChild( elem ); + } + } + } + + return this; + }, + + empty: function() { + var elem, + i = 0; + + for ( ; (elem = this[i]) != null; i++ ) { + // Remove element nodes and prevent memory leaks + if ( elem.nodeType === 1 ) { + jQuery.cleanData( elem.getElementsByTagName("*") ); + } + + // Remove any remaining nodes + while ( elem.firstChild ) { + elem.removeChild( elem.firstChild ); + } + } + + return this; + }, + + clone: function( dataAndEvents, deepDataAndEvents ) { + dataAndEvents = dataAndEvents == null ? false : dataAndEvents; + deepDataAndEvents = deepDataAndEvents == null ? dataAndEvents : deepDataAndEvents; + + return this.map( function () { + return jQuery.clone( this, dataAndEvents, deepDataAndEvents ); + }); + }, + + html: function( value ) { + return jQuery.access( this, function( value ) { + var elem = this[0] || {}, + i = 0, + l = this.length; + + if ( value === undefined ) { + return elem.nodeType === 1 ? + elem.innerHTML.replace( rinlinejQuery, "" ) : + undefined; + } + + // See if we can take a shortcut and just use innerHTML + if ( typeof value === "string" && !rnoInnerhtml.test( value ) && + ( jQuery.support.htmlSerialize || !rnoshimcache.test( value ) ) && + ( jQuery.support.leadingWhitespace || !rleadingWhitespace.test( value ) ) && + !wrapMap[ ( rtagName.exec( value ) || ["", ""] )[1].toLowerCase() ] ) { + + value = value.replace( rxhtmlTag, "<$1>" ); + + try { + for (; i < l; i++ ) { + // Remove element nodes and prevent memory leaks + elem = this[i] || {}; + if ( elem.nodeType === 1 ) { + jQuery.cleanData( elem.getElementsByTagName( "*" ) ); + elem.innerHTML = value; + } + } + + elem = 0; + + // If using innerHTML throws an exception, use the fallback method + } catch(e) {} + } + + if ( elem ) { + this.empty().append( value ); + } + }, null, value, arguments.length ); + }, + + replaceWith: function( value ) { + if ( !isDisconnected( this[0] ) ) { + // Make sure that the elements are removed from the DOM before they are inserted + // this can help fix replacing a parent with child elements + if ( jQuery.isFunction( value ) ) { + return this.each(function(i) { + var self = jQuery(this), old = self.html(); + self.replaceWith( value.call( this, i, old ) ); + }); + } + + if ( typeof value !== "string" ) { + value = jQuery( value ).detach(); + } + + return this.each(function() { + var next = this.nextSibling, + parent = this.parentNode; + + jQuery( this ).remove(); + + if ( next ) { + jQuery(next).before( value ); + } else { + jQuery(parent).append( value ); + } + }); + } + + return this.length ? + this.pushStack( jQuery(jQuery.isFunction(value) ? value() : value), "replaceWith", value ) : + this; + }, + + detach: function( selector ) { + return this.remove( selector, true ); + }, + + domManip: function( args, table, callback ) { + + // Flatten any nested arrays + args = [].concat.apply( [], args ); + + var results, first, fragment, iNoClone, + i = 0, + value = args[0], + scripts = [], + l = this.length; + + // We can't cloneNode fragments that contain checked, in WebKit + if ( !jQuery.support.checkClone && l > 1 && typeof value === "string" && rchecked.test( value ) ) { + return this.each(function() { + jQuery(this).domManip( args, table, callback ); + }); + } + + if ( jQuery.isFunction(value) ) { + return this.each(function(i) { + var self = jQuery(this); + args[0] = value.call( this, i, table ? self.html() : undefined ); + self.domManip( args, table, callback ); + }); + } + + if ( this[0] ) { + results = jQuery.buildFragment( args, this, scripts ); + fragment = results.fragment; + first = fragment.firstChild; + + if ( fragment.childNodes.length === 1 ) { + fragment = first; + } + + if ( first ) { + table = table && jQuery.nodeName( first, "tr" ); + + // Use the original fragment for the last item instead of the first because it can end up + // being emptied incorrectly in certain situations (#8070). + // Fragments from the fragment cache must always be cloned and never used in place. + for ( iNoClone = results.cacheable || l - 1; i < l; i++ ) { + callback.call( + table && jQuery.nodeName( this[i], "table" ) ? + findOrAppend( this[i], "tbody" ) : + this[i], + i === iNoClone ? + fragment : + jQuery.clone( fragment, true, true ) + ); + } + } + + // Fix #11809: Avoid leaking memory + fragment = first = null; + + if ( scripts.length ) { + jQuery.each( scripts, function( i, elem ) { + if ( elem.src ) { + if ( jQuery.ajax ) { + jQuery.ajax({ + url: elem.src, + type: "GET", + dataType: "script", + async: false, + global: false, + "throws": true + }); + } else { + jQuery.error("no ajax"); + } + } else { + jQuery.globalEval( ( elem.text || elem.textContent || elem.innerHTML || "" ).replace( rcleanScript, "" ) ); + } + + if ( elem.parentNode ) { + elem.parentNode.removeChild( elem ); + } + }); + } + } + + return this; + } +}); + +function findOrAppend( elem, tag ) { + return elem.getElementsByTagName( tag )[0] || elem.appendChild( elem.ownerDocument.createElement( tag ) ); +} + +function cloneCopyEvent( src, dest ) { + + if ( dest.nodeType !== 1 || !jQuery.hasData( src ) ) { + return; + } + + var type, i, l, + oldData = jQuery._data( src ), + curData = jQuery._data( dest, oldData ), + events = oldData.events; + + if ( events ) { + delete curData.handle; + curData.events = {}; + + for ( type in events ) { + for ( i = 0, l = events[ type ].length; i < l; i++ ) { + jQuery.event.add( dest, type, events[ type ][ i ] ); + } + } + } + + // make the cloned public data object a copy from the original + if ( curData.data ) { + curData.data = jQuery.extend( {}, curData.data ); + } +} + +function cloneFixAttributes( src, dest ) { + var nodeName; + + // We do not need to do anything for non-Elements + if ( dest.nodeType !== 1 ) { + return; + } + + // clearAttributes removes the attributes, which we don't want, + // but also removes the attachEvent events, which we *do* want + if ( dest.clearAttributes ) { + dest.clearAttributes(); + } + + // mergeAttributes, in contrast, only merges back on the + // original attributes, not the events + if ( dest.mergeAttributes ) { + dest.mergeAttributes( src ); + } + + nodeName = dest.nodeName.toLowerCase(); + + if ( nodeName === "object" ) { + // IE6-10 improperly clones children of object elements using classid. + // IE10 throws NoModificationAllowedError if parent is null, #12132. + if ( dest.parentNode ) { + dest.outerHTML = src.outerHTML; + } + + // This path appears unavoidable for IE9. When cloning an object + // element in IE9, the outerHTML strategy above is not sufficient. + // If the src has innerHTML and the destination does not, + // copy the src.innerHTML into the dest.innerHTML. #10324 + if ( jQuery.support.html5Clone && (src.innerHTML && !jQuery.trim(dest.innerHTML)) ) { + dest.innerHTML = src.innerHTML; + } + + } else if ( nodeName === "input" && rcheckableType.test( src.type ) ) { + // IE6-8 fails to persist the checked state of a cloned checkbox + // or radio button. Worse, IE6-7 fail to give the cloned element + // a checked appearance if the defaultChecked value isn't also set + + dest.defaultChecked = dest.checked = src.checked; + + // IE6-7 get confused and end up setting the value of a cloned + // checkbox/radio button to an empty string instead of "on" + if ( dest.value !== src.value ) { + dest.value = src.value; + } + + // IE6-8 fails to return the selected option to the default selected + // state when cloning options + } else if ( nodeName === "option" ) { + dest.selected = src.defaultSelected; + + // IE6-8 fails to set the defaultValue to the correct value when + // cloning other types of input fields + } else if ( nodeName === "input" || nodeName === "textarea" ) { + dest.defaultValue = src.defaultValue; + + // IE blanks contents when cloning scripts + } else if ( nodeName === "script" && dest.text !== src.text ) { + dest.text = src.text; + } + + // Event data gets referenced instead of copied if the expando + // gets copied too + dest.removeAttribute( jQuery.expando ); +} + +jQuery.buildFragment = function( args, context, scripts ) { + var fragment, cacheable, cachehit, + first = args[ 0 ]; + + // Set context from what may come in as undefined or a jQuery collection or a node + // Updated to fix #12266 where accessing context[0] could throw an exception in IE9/10 & + // also doubles as fix for #8950 where plain objects caused createDocumentFragment exception + context = context || document; + context = !context.nodeType && context[0] || context; + context = context.ownerDocument || context; + + // Only cache "small" (1/2 KB) HTML strings that are associated with the main document + // Cloning options loses the selected state, so don't cache them + // IE 6 doesn't like it when you put or elements in a fragment + // Also, WebKit does not clone 'checked' attributes on cloneNode, so don't cache + // Lastly, IE6,7,8 will not correctly reuse cached fragments that were created from unknown elems #10501 + if ( args.length === 1 && typeof first === "string" && first.length < 512 && context === document && + first.charAt(0) === "<" && !rnocache.test( first ) && + (jQuery.support.checkClone || !rchecked.test( first )) && + (jQuery.support.html5Clone || !rnoshimcache.test( first )) ) { + + // Mark cacheable and look for a hit + cacheable = true; + fragment = jQuery.fragments[ first ]; + cachehit = fragment !== undefined; + } + + if ( !fragment ) { + fragment = context.createDocumentFragment(); + jQuery.clean( args, context, fragment, scripts ); + + // Update the cache, but only store false + // unless this is a second parsing of the same content + if ( cacheable ) { + jQuery.fragments[ first ] = cachehit && fragment; + } + } + + return { fragment: fragment, cacheable: cacheable }; +}; + +jQuery.fragments = {}; + +jQuery.each({ + appendTo: "append", + prependTo: "prepend", + insertBefore: "before", + insertAfter: "after", + replaceAll: "replaceWith" +}, function( name, original ) { + jQuery.fn[ name ] = function( selector ) { + var elems, + i = 0, + ret = [], + insert = jQuery( selector ), + l = insert.length, + parent = this.length === 1 && this[0].parentNode; + + if ( (parent == null || parent && parent.nodeType === 11 && parent.childNodes.length === 1) && l === 1 ) { + insert[ original ]( this[0] ); + return this; + } else { + for ( ; i < l; i++ ) { + elems = ( i > 0 ? this.clone(true) : this ).get(); + jQuery( insert[i] )[ original ]( elems ); + ret = ret.concat( elems ); + } + + return this.pushStack( ret, name, insert.selector ); + } + }; +}); + +function getAll( elem ) { + if ( typeof elem.getElementsByTagName !== "undefined" ) { + return elem.getElementsByTagName( "*" ); + + } else if ( typeof elem.querySelectorAll !== "undefined" ) { + return elem.querySelectorAll( "*" ); + + } else { + return []; + } +} + +// Used in clean, fixes the defaultChecked property +function fixDefaultChecked( elem ) { + if ( rcheckableType.test( elem.type ) ) { + elem.defaultChecked = elem.checked; + } +} + +jQuery.extend({ + clone: function( elem, dataAndEvents, deepDataAndEvents ) { + var srcElements, + destElements, + i, + clone; + + if ( jQuery.support.html5Clone || jQuery.isXMLDoc(elem) || !rnoshimcache.test( "<" + elem.nodeName + ">" ) ) { + clone = elem.cloneNode( true ); + + // IE<=8 does not properly clone detached, unknown element nodes + } else { + fragmentDiv.innerHTML = elem.outerHTML; + fragmentDiv.removeChild( clone = fragmentDiv.firstChild ); + } + + if ( (!jQuery.support.noCloneEvent || !jQuery.support.noCloneChecked) && + (elem.nodeType === 1 || elem.nodeType === 11) && !jQuery.isXMLDoc(elem) ) { + // IE copies events bound via attachEvent when using cloneNode. + // Calling detachEvent on the clone will also remove the events + // from the original. In order to get around this, we use some + // proprietary methods to clear the events. Thanks to MooTools + // guys for this hotness. + + cloneFixAttributes( elem, clone ); + + // Using Sizzle here is crazy slow, so we use getElementsByTagName instead + srcElements = getAll( elem ); + destElements = getAll( clone ); + + // Weird iteration because IE will replace the length property + // with an element if you are cloning the body and one of the + // elements on the page has a name or id of "length" + for ( i = 0; srcElements[i]; ++i ) { + // Ensure that the destination node is not null; Fixes #9587 + if ( destElements[i] ) { + cloneFixAttributes( srcElements[i], destElements[i] ); + } + } + } + + // Copy the events from the original to the clone + if ( dataAndEvents ) { + cloneCopyEvent( elem, clone ); + + if ( deepDataAndEvents ) { + srcElements = getAll( elem ); + destElements = getAll( clone ); + + for ( i = 0; srcElements[i]; ++i ) { + cloneCopyEvent( srcElements[i], destElements[i] ); + } + } + } + + srcElements = destElements = null; + + // Return the cloned set + return clone; + }, + + clean: function( elems, context, fragment, scripts ) { + var i, j, elem, tag, wrap, depth, div, hasBody, tbody, len, handleScript, jsTags, + safe = context === document && safeFragment, + ret = []; + + // Ensure that context is a document + if ( !context || typeof context.createDocumentFragment === "undefined" ) { + context = document; + } + + // Use the already-created safe fragment if context permits + for ( i = 0; (elem = elems[i]) != null; i++ ) { + if ( typeof elem === "number" ) { + elem += ""; + } + + if ( !elem ) { + continue; + } + + // Convert html string into DOM nodes + if ( typeof elem === "string" ) { + if ( !rhtml.test( elem ) ) { + elem = context.createTextNode( elem ); + } else { + // Ensure a safe container in which to render the html + safe = safe || createSafeFragment( context ); + div = context.createElement("div"); + safe.appendChild( div ); + + // Fix "XHTML"-style tags in all browsers + elem = elem.replace(rxhtmlTag, "<$1>"); + + // Go to html and back, then peel off extra wrappers + tag = ( rtagName.exec( elem ) || ["", ""] )[1].toLowerCase(); + wrap = wrapMap[ tag ] || wrapMap._default; + depth = wrap[0]; + div.innerHTML = wrap[1] + elem + wrap[2]; + + // Move to the right depth + while ( depth-- ) { + div = div.lastChild; + } + + // Remove IE's autoinserted from table fragments + if ( !jQuery.support.tbody ) { + + // String was a , *may* have spurious + hasBody = rtbody.test(elem); + tbody = tag === "table" && !hasBody ? + div.firstChild && div.firstChild.childNodes : + + // String was a bare or + wrap[1] === "
    " && !hasBody ? + div.childNodes : + []; + + for ( j = tbody.length - 1; j >= 0 ; --j ) { + if ( jQuery.nodeName( tbody[ j ], "tbody" ) && !tbody[ j ].childNodes.length ) { + tbody[ j ].parentNode.removeChild( tbody[ j ] ); + } + } + } + + // IE completely kills leading whitespace when innerHTML is used + if ( !jQuery.support.leadingWhitespace && rleadingWhitespace.test( elem ) ) { + div.insertBefore( context.createTextNode( rleadingWhitespace.exec(elem)[0] ), div.firstChild ); + } + + elem = div.childNodes; + + // Take out of fragment container (we need a fresh div each time) + div.parentNode.removeChild( div ); + } + } + + if ( elem.nodeType ) { + ret.push( elem ); + } else { + jQuery.merge( ret, elem ); + } + } + + // Fix #11356: Clear elements from safeFragment + if ( div ) { + elem = div = safe = null; + } + + // Reset defaultChecked for any radios and checkboxes + // about to be appended to the DOM in IE 6/7 (#8060) + if ( !jQuery.support.appendChecked ) { + for ( i = 0; (elem = ret[i]) != null; i++ ) { + if ( jQuery.nodeName( elem, "input" ) ) { + fixDefaultChecked( elem ); + } else if ( typeof elem.getElementsByTagName !== "undefined" ) { + jQuery.grep( elem.getElementsByTagName("input"), fixDefaultChecked ); + } + } + } + + // Append elements to a provided document fragment + if ( fragment ) { + // Special handling of each script element + handleScript = function( elem ) { + // Check if we consider it executable + if ( !elem.type || rscriptType.test( elem.type ) ) { + // Detach the script and store it in the scripts array (if provided) or the fragment + // Return truthy to indicate that it has been handled + return scripts ? + scripts.push( elem.parentNode ? elem.parentNode.removeChild( elem ) : elem ) : + fragment.appendChild( elem ); + } + }; + + for ( i = 0; (elem = ret[i]) != null; i++ ) { + // Check if we're done after handling an executable script + if ( !( jQuery.nodeName( elem, "script" ) && handleScript( elem ) ) ) { + // Append to fragment and handle embedded scripts + fragment.appendChild( elem ); + if ( typeof elem.getElementsByTagName !== "undefined" ) { + // handleScript alters the DOM, so use jQuery.merge to ensure snapshot iteration + jsTags = jQuery.grep( jQuery.merge( [], elem.getElementsByTagName("script") ), handleScript ); + + // Splice the scripts into ret after their former ancestor and advance our index beyond them + ret.splice.apply( ret, [i + 1, 0].concat( jsTags ) ); + i += jsTags.length; + } + } + } + } + + return ret; + }, + + cleanData: function( elems, /* internal */ acceptData ) { + var data, id, elem, type, + i = 0, + internalKey = jQuery.expando, + cache = jQuery.cache, + deleteExpando = jQuery.support.deleteExpando, + special = jQuery.event.special; + + for ( ; (elem = elems[i]) != null; i++ ) { + + if ( acceptData || jQuery.acceptData( elem ) ) { + + id = elem[ internalKey ]; + data = id && cache[ id ]; + + if ( data ) { + if ( data.events ) { + for ( type in data.events ) { + if ( special[ type ] ) { + jQuery.event.remove( elem, type ); + + // This is a shortcut to avoid jQuery.event.remove's overhead + } else { + jQuery.removeEvent( elem, type, data.handle ); + } + } + } + + // Remove cache only if it was not already removed by jQuery.event.remove + if ( cache[ id ] ) { + + delete cache[ id ]; + + // IE does not allow us to delete expando properties from nodes, + // nor does it have a removeAttribute function on Document nodes; + // we must handle all of these cases + if ( deleteExpando ) { + delete elem[ internalKey ]; + + } else if ( elem.removeAttribute ) { + elem.removeAttribute( internalKey ); + + } else { + elem[ internalKey ] = null; + } + + jQuery.deletedIds.push( id ); + } + } + } + } + } +}); +// Limit scope pollution from any deprecated API +(function() { + +var matched, browser; + +// Use of jQuery.browser is frowned upon. +// More details: http://api.jquery.com/jQuery.browser +// jQuery.uaMatch maintained for back-compat +jQuery.uaMatch = function( ua ) { + ua = ua.toLowerCase(); + + var match = /(chrome)[ \/]([\w.]+)/.exec( ua ) || + /(webkit)[ \/]([\w.]+)/.exec( ua ) || + /(opera)(?:.*version|)[ \/]([\w.]+)/.exec( ua ) || + /(msie) ([\w.]+)/.exec( ua ) || + ua.indexOf("compatible") < 0 && /(mozilla)(?:.*? rv:([\w.]+)|)/.exec( ua ) || + []; + + return { + browser: match[ 1 ] || "", + version: match[ 2 ] || "0" + }; +}; + +matched = jQuery.uaMatch( navigator.userAgent ); +browser = {}; + +if ( matched.browser ) { + browser[ matched.browser ] = true; + browser.version = matched.version; +} + +// Chrome is Webkit, but Webkit is also Safari. +if ( browser.chrome ) { + browser.webkit = true; +} else if ( browser.webkit ) { + browser.safari = true; +} + +jQuery.browser = browser; + +jQuery.sub = function() { + function jQuerySub( selector, context ) { + return new jQuerySub.fn.init( selector, context ); + } + jQuery.extend( true, jQuerySub, this ); + jQuerySub.superclass = this; + jQuerySub.fn = jQuerySub.prototype = this(); + jQuerySub.fn.constructor = jQuerySub; + jQuerySub.sub = this.sub; + jQuerySub.fn.init = function init( selector, context ) { + if ( context && context instanceof jQuery && !(context instanceof jQuerySub) ) { + context = jQuerySub( context ); + } + + return jQuery.fn.init.call( this, selector, context, rootjQuerySub ); + }; + jQuerySub.fn.init.prototype = jQuerySub.fn; + var rootjQuerySub = jQuerySub(document); + return jQuerySub; +}; + +})(); +var curCSS, iframe, iframeDoc, + ralpha = /alpha\([^)]*\)/i, + ropacity = /opacity=([^)]*)/, + rposition = /^(top|right|bottom|left)$/, + // swappable if display is none or starts with table except "table", "table-cell", or "table-caption" + // see here for display values: https://developer.mozilla.org/en-US/docs/CSS/display + rdisplayswap = /^(none|table(?!-c[ea]).+)/, + rmargin = /^margin/, + rnumsplit = new RegExp( "^(" + core_pnum + ")(.*)$", "i" ), + rnumnonpx = new RegExp( "^(" + core_pnum + ")(?!px)[a-z%]+$", "i" ), + rrelNum = new RegExp( "^([-+])=(" + core_pnum + ")", "i" ), + elemdisplay = {}, + + cssShow = { position: "absolute", visibility: "hidden", display: "block" }, + cssNormalTransform = { + letterSpacing: 0, + fontWeight: 400 + }, + + cssExpand = [ "Top", "Right", "Bottom", "Left" ], + cssPrefixes = [ "Webkit", "O", "Moz", "ms" ], + + eventsToggle = jQuery.fn.toggle; + +// return a css property mapped to a potentially vendor prefixed property +function vendorPropName( style, name ) { + + // shortcut for names that are not vendor prefixed + if ( name in style ) { + return name; + } + + // check for vendor prefixed names + var capName = name.charAt(0).toUpperCase() + name.slice(1), + origName = name, + i = cssPrefixes.length; + + while ( i-- ) { + name = cssPrefixes[ i ] + capName; + if ( name in style ) { + return name; + } + } + + return origName; +} + +function isHidden( elem, el ) { + elem = el || elem; + return jQuery.css( elem, "display" ) === "none" || !jQuery.contains( elem.ownerDocument, elem ); +} + +function showHide( elements, show ) { + var elem, display, + values = [], + index = 0, + length = elements.length; + + for ( ; index < length; index++ ) { + elem = elements[ index ]; + if ( !elem.style ) { + continue; + } + values[ index ] = jQuery._data( elem, "olddisplay" ); + if ( show ) { + // Reset the inline display of this element to learn if it is + // being hidden by cascaded rules or not + if ( !values[ index ] && elem.style.display === "none" ) { + elem.style.display = ""; + } + + // Set elements which have been overridden with display: none + // in a stylesheet to whatever the default browser style is + // for such an element + if ( elem.style.display === "" && isHidden( elem ) ) { + values[ index ] = jQuery._data( elem, "olddisplay", css_defaultDisplay(elem.nodeName) ); + } + } else { + display = curCSS( elem, "display" ); + + if ( !values[ index ] && display !== "none" ) { + jQuery._data( elem, "olddisplay", display ); + } + } + } + + // Set the display of most of the elements in a second loop + // to avoid the constant reflow + for ( index = 0; index < length; index++ ) { + elem = elements[ index ]; + if ( !elem.style ) { + continue; + } + if ( !show || elem.style.display === "none" || elem.style.display === "" ) { + elem.style.display = show ? values[ index ] || "" : "none"; + } + } + + return elements; +} + +jQuery.fn.extend({ + css: function( name, value ) { + return jQuery.access( this, function( elem, name, value ) { + return value !== undefined ? + jQuery.style( elem, name, value ) : + jQuery.css( elem, name ); + }, name, value, arguments.length > 1 ); + }, + show: function() { + return showHide( this, true ); + }, + hide: function() { + return showHide( this ); + }, + toggle: function( state, fn2 ) { + var bool = typeof state === "boolean"; + + if ( jQuery.isFunction( state ) && jQuery.isFunction( fn2 ) ) { + return eventsToggle.apply( this, arguments ); + } + + return this.each(function() { + if ( bool ? state : isHidden( this ) ) { + jQuery( this ).show(); + } else { + jQuery( this ).hide(); + } + }); + } +}); + +jQuery.extend({ + // Add in style property hooks for overriding the default + // behavior of getting and setting a style property + cssHooks: { + opacity: { + get: function( elem, computed ) { + if ( computed ) { + // We should always get a number back from opacity + var ret = curCSS( elem, "opacity" ); + return ret === "" ? "1" : ret; + + } + } + } + }, + + // Exclude the following css properties to add px + cssNumber: { + "fillOpacity": true, + "fontWeight": true, + "lineHeight": true, + "opacity": true, + "orphans": true, + "widows": true, + "zIndex": true, + "zoom": true + }, + + // Add in properties whose names you wish to fix before + // setting or getting the value + cssProps: { + // normalize float css property + "float": jQuery.support.cssFloat ? "cssFloat" : "styleFloat" + }, + + // Get and set the style property on a DOM Node + style: function( elem, name, value, extra ) { + // Don't set styles on text and comment nodes + if ( !elem || elem.nodeType === 3 || elem.nodeType === 8 || !elem.style ) { + return; + } + + // Make sure that we're working with the right name + var ret, type, hooks, + origName = jQuery.camelCase( name ), + style = elem.style; + + name = jQuery.cssProps[ origName ] || ( jQuery.cssProps[ origName ] = vendorPropName( style, origName ) ); + + // gets hook for the prefixed version + // followed by the unprefixed version + hooks = jQuery.cssHooks[ name ] || jQuery.cssHooks[ origName ]; + + // Check if we're setting a value + if ( value !== undefined ) { + type = typeof value; + + // convert relative number strings (+= or -=) to relative numbers. #7345 + if ( type === "string" && (ret = rrelNum.exec( value )) ) { + value = ( ret[1] + 1 ) * ret[2] + parseFloat( jQuery.css( elem, name ) ); + // Fixes bug #9237 + type = "number"; + } + + // Make sure that NaN and null values aren't set. See: #7116 + if ( value == null || type === "number" && isNaN( value ) ) { + return; + } + + // If a number was passed in, add 'px' to the (except for certain CSS properties) + if ( type === "number" && !jQuery.cssNumber[ origName ] ) { + value += "px"; + } + + // If a hook was provided, use that value, otherwise just set the specified value + if ( !hooks || !("set" in hooks) || (value = hooks.set( elem, value, extra )) !== undefined ) { + // Wrapped to prevent IE from throwing errors when 'invalid' values are provided + // Fixes bug #5509 + try { + style[ name ] = value; + } catch(e) {} + } + + } else { + // If a hook was provided get the non-computed value from there + if ( hooks && "get" in hooks && (ret = hooks.get( elem, false, extra )) !== undefined ) { + return ret; + } + + // Otherwise just get the value from the style object + return style[ name ]; + } + }, + + css: function( elem, name, numeric, extra ) { + var val, num, hooks, + origName = jQuery.camelCase( name ); + + // Make sure that we're working with the right name + name = jQuery.cssProps[ origName ] || ( jQuery.cssProps[ origName ] = vendorPropName( elem.style, origName ) ); + + // gets hook for the prefixed version + // followed by the unprefixed version + hooks = jQuery.cssHooks[ name ] || jQuery.cssHooks[ origName ]; + + // If a hook was provided get the computed value from there + if ( hooks && "get" in hooks ) { + val = hooks.get( elem, true, extra ); + } + + // Otherwise, if a way to get the computed value exists, use that + if ( val === undefined ) { + val = curCSS( elem, name ); + } + + //convert "normal" to computed value + if ( val === "normal" && name in cssNormalTransform ) { + val = cssNormalTransform[ name ]; + } + + // Return, converting to number if forced or a qualifier was provided and val looks numeric + if ( numeric || extra !== undefined ) { + num = parseFloat( val ); + return numeric || jQuery.isNumeric( num ) ? num || 0 : val; + } + return val; + }, + + // A method for quickly swapping in/out CSS properties to get correct calculations + swap: function( elem, options, callback ) { + var ret, name, + old = {}; + + // Remember the old values, and insert the new ones + for ( name in options ) { + old[ name ] = elem.style[ name ]; + elem.style[ name ] = options[ name ]; + } + + ret = callback.call( elem ); + + // Revert the old values + for ( name in options ) { + elem.style[ name ] = old[ name ]; + } + + return ret; + } +}); + +// NOTE: To any future maintainer, we've window.getComputedStyle +// because jsdom on node.js will break without it. +if ( window.getComputedStyle ) { + curCSS = function( elem, name ) { + var ret, width, minWidth, maxWidth, + computed = window.getComputedStyle( elem, null ), + style = elem.style; + + if ( computed ) { + + ret = computed[ name ]; + if ( ret === "" && !jQuery.contains( elem.ownerDocument, elem ) ) { + ret = jQuery.style( elem, name ); + } + + // A tribute to the "awesome hack by Dean Edwards" + // Chrome < 17 and Safari 5.0 uses "computed value" instead of "used value" for margin-right + // Safari 5.1.7 (at least) returns percentage for a larger set of values, but width seems to be reliably pixels + // this is against the CSSOM draft spec: http://dev.w3.org/csswg/cssom/#resolved-values + if ( rnumnonpx.test( ret ) && rmargin.test( name ) ) { + width = style.width; + minWidth = style.minWidth; + maxWidth = style.maxWidth; + + style.minWidth = style.maxWidth = style.width = ret; + ret = computed.width; + + style.width = width; + style.minWidth = minWidth; + style.maxWidth = maxWidth; + } + } + + return ret; + }; +} else if ( document.documentElement.currentStyle ) { + curCSS = function( elem, name ) { + var left, rsLeft, + ret = elem.currentStyle && elem.currentStyle[ name ], + style = elem.style; + + // Avoid setting ret to empty string here + // so we don't default to auto + if ( ret == null && style && style[ name ] ) { + ret = style[ name ]; + } + + // From the awesome hack by Dean Edwards + // http://erik.eae.net/archives/2007/07/27/18.54.15/#comment-102291 + + // If we're not dealing with a regular pixel number + // but a number that has a weird ending, we need to convert it to pixels + // but not position css attributes, as those are proportional to the parent element instead + // and we can't measure the parent instead because it might trigger a "stacking dolls" problem + if ( rnumnonpx.test( ret ) && !rposition.test( name ) ) { + + // Remember the original values + left = style.left; + rsLeft = elem.runtimeStyle && elem.runtimeStyle.left; + + // Put in the new values to get a computed value out + if ( rsLeft ) { + elem.runtimeStyle.left = elem.currentStyle.left; + } + style.left = name === "fontSize" ? "1em" : ret; + ret = style.pixelLeft + "px"; + + // Revert the changed values + style.left = left; + if ( rsLeft ) { + elem.runtimeStyle.left = rsLeft; + } + } + + return ret === "" ? "auto" : ret; + }; +} + +function setPositiveNumber( elem, value, subtract ) { + var matches = rnumsplit.exec( value ); + return matches ? + Math.max( 0, matches[ 1 ] - ( subtract || 0 ) ) + ( matches[ 2 ] || "px" ) : + value; +} + +function augmentWidthOrHeight( elem, name, extra, isBorderBox ) { + var i = extra === ( isBorderBox ? "border" : "content" ) ? + // If we already have the right measurement, avoid augmentation + 4 : + // Otherwise initialize for horizontal or vertical properties + name === "width" ? 1 : 0, + + val = 0; + + for ( ; i < 4; i += 2 ) { + // both box models exclude margin, so add it if we want it + if ( extra === "margin" ) { + // we use jQuery.css instead of curCSS here + // because of the reliableMarginRight CSS hook! + val += jQuery.css( elem, extra + cssExpand[ i ], true ); + } + + // From this point on we use curCSS for maximum performance (relevant in animations) + if ( isBorderBox ) { + // border-box includes padding, so remove it if we want content + if ( extra === "content" ) { + val -= parseFloat( curCSS( elem, "padding" + cssExpand[ i ] ) ) || 0; + } + + // at this point, extra isn't border nor margin, so remove border + if ( extra !== "margin" ) { + val -= parseFloat( curCSS( elem, "border" + cssExpand[ i ] + "Width" ) ) || 0; + } + } else { + // at this point, extra isn't content, so add padding + val += parseFloat( curCSS( elem, "padding" + cssExpand[ i ] ) ) || 0; + + // at this point, extra isn't content nor padding, so add border + if ( extra !== "padding" ) { + val += parseFloat( curCSS( elem, "border" + cssExpand[ i ] + "Width" ) ) || 0; + } + } + } + + return val; +} + +function getWidthOrHeight( elem, name, extra ) { + + // Start with offset property, which is equivalent to the border-box value + var val = name === "width" ? elem.offsetWidth : elem.offsetHeight, + valueIsBorderBox = true, + isBorderBox = jQuery.support.boxSizing && jQuery.css( elem, "boxSizing" ) === "border-box"; + + // some non-html elements return undefined for offsetWidth, so check for null/undefined + // svg - https://bugzilla.mozilla.org/show_bug.cgi?id=649285 + // MathML - https://bugzilla.mozilla.org/show_bug.cgi?id=491668 + if ( val <= 0 || val == null ) { + // Fall back to computed then uncomputed css if necessary + val = curCSS( elem, name ); + if ( val < 0 || val == null ) { + val = elem.style[ name ]; + } + + // Computed unit is not pixels. Stop here and return. + if ( rnumnonpx.test(val) ) { + return val; + } + + // we need the check for style in case a browser which returns unreliable values + // for getComputedStyle silently falls back to the reliable elem.style + valueIsBorderBox = isBorderBox && ( jQuery.support.boxSizingReliable || val === elem.style[ name ] ); + + // Normalize "", auto, and prepare for extra + val = parseFloat( val ) || 0; + } + + // use the active box-sizing model to add/subtract irrelevant styles + return ( val + + augmentWidthOrHeight( + elem, + name, + extra || ( isBorderBox ? "border" : "content" ), + valueIsBorderBox + ) + ) + "px"; +} + + +// Try to determine the default display value of an element +function css_defaultDisplay( nodeName ) { + if ( elemdisplay[ nodeName ] ) { + return elemdisplay[ nodeName ]; + } + + var elem = jQuery( "<" + nodeName + ">" ).appendTo( document.body ), + display = elem.css("display"); + elem.remove(); + + // If the simple way fails, + // get element's real default display by attaching it to a temp iframe + if ( display === "none" || display === "" ) { + // Use the already-created iframe if possible + iframe = document.body.appendChild( + iframe || jQuery.extend( document.createElement("iframe"), { + frameBorder: 0, + width: 0, + height: 0 + }) + ); + + // Create a cacheable copy of the iframe document on first call. + // IE and Opera will allow us to reuse the iframeDoc without re-writing the fake HTML + // document to it; WebKit & Firefox won't allow reusing the iframe document. + if ( !iframeDoc || !iframe.createElement ) { + iframeDoc = ( iframe.contentWindow || iframe.contentDocument ).document; + iframeDoc.write(""); + iframeDoc.close(); + } + + elem = iframeDoc.body.appendChild( iframeDoc.createElement(nodeName) ); + + display = curCSS( elem, "display" ); + document.body.removeChild( iframe ); + } + + // Store the correct default display + elemdisplay[ nodeName ] = display; + + return display; +} + +jQuery.each([ "height", "width" ], function( i, name ) { + jQuery.cssHooks[ name ] = { + get: function( elem, computed, extra ) { + if ( computed ) { + // certain elements can have dimension info if we invisibly show them + // however, it must have a current display style that would benefit from this + if ( elem.offsetWidth === 0 && rdisplayswap.test( curCSS( elem, "display" ) ) ) { + return jQuery.swap( elem, cssShow, function() { + return getWidthOrHeight( elem, name, extra ); + }); + } else { + return getWidthOrHeight( elem, name, extra ); + } + } + }, + + set: function( elem, value, extra ) { + return setPositiveNumber( elem, value, extra ? + augmentWidthOrHeight( + elem, + name, + extra, + jQuery.support.boxSizing && jQuery.css( elem, "boxSizing" ) === "border-box" + ) : 0 + ); + } + }; +}); + +if ( !jQuery.support.opacity ) { + jQuery.cssHooks.opacity = { + get: function( elem, computed ) { + // IE uses filters for opacity + return ropacity.test( (computed && elem.currentStyle ? elem.currentStyle.filter : elem.style.filter) || "" ) ? + ( 0.01 * parseFloat( RegExp.$1 ) ) + "" : + computed ? "1" : ""; + }, + + set: function( elem, value ) { + var style = elem.style, + currentStyle = elem.currentStyle, + opacity = jQuery.isNumeric( value ) ? "alpha(opacity=" + value * 100 + ")" : "", + filter = currentStyle && currentStyle.filter || style.filter || ""; + + // IE has trouble with opacity if it does not have layout + // Force it by setting the zoom level + style.zoom = 1; + + // if setting opacity to 1, and no other filters exist - attempt to remove filter attribute #6652 + if ( value >= 1 && jQuery.trim( filter.replace( ralpha, "" ) ) === "" && + style.removeAttribute ) { + + // Setting style.filter to null, "" & " " still leave "filter:" in the cssText + // if "filter:" is present at all, clearType is disabled, we want to avoid this + // style.removeAttribute is IE Only, but so apparently is this code path... + style.removeAttribute( "filter" ); + + // if there there is no filter style applied in a css rule, we are done + if ( currentStyle && !currentStyle.filter ) { + return; + } + } + + // otherwise, set new filter values + style.filter = ralpha.test( filter ) ? + filter.replace( ralpha, opacity ) : + filter + " " + opacity; + } + }; +} + +// These hooks cannot be added until DOM ready because the support test +// for it is not run until after DOM ready +jQuery(function() { + if ( !jQuery.support.reliableMarginRight ) { + jQuery.cssHooks.marginRight = { + get: function( elem, computed ) { + // WebKit Bug 13343 - getComputedStyle returns wrong value for margin-right + // Work around by temporarily setting element display to inline-block + return jQuery.swap( elem, { "display": "inline-block" }, function() { + if ( computed ) { + return curCSS( elem, "marginRight" ); + } + }); + } + }; + } + + // Webkit bug: https://bugs.webkit.org/show_bug.cgi?id=29084 + // getComputedStyle returns percent when specified for top/left/bottom/right + // rather than make the css module depend on the offset module, we just check for it here + if ( !jQuery.support.pixelPosition && jQuery.fn.position ) { + jQuery.each( [ "top", "left" ], function( i, prop ) { + jQuery.cssHooks[ prop ] = { + get: function( elem, computed ) { + if ( computed ) { + var ret = curCSS( elem, prop ); + // if curCSS returns percentage, fallback to offset + return rnumnonpx.test( ret ) ? jQuery( elem ).position()[ prop ] + "px" : ret; + } + } + }; + }); + } + +}); + +if ( jQuery.expr && jQuery.expr.filters ) { + jQuery.expr.filters.hidden = function( elem ) { + return ( elem.offsetWidth === 0 && elem.offsetHeight === 0 ) || (!jQuery.support.reliableHiddenOffsets && ((elem.style && elem.style.display) || curCSS( elem, "display" )) === "none"); + }; + + jQuery.expr.filters.visible = function( elem ) { + return !jQuery.expr.filters.hidden( elem ); + }; +} + +// These hooks are used by animate to expand properties +jQuery.each({ + margin: "", + padding: "", + border: "Width" +}, function( prefix, suffix ) { + jQuery.cssHooks[ prefix + suffix ] = { + expand: function( value ) { + var i, + + // assumes a single number if not a string + parts = typeof value === "string" ? value.split(" ") : [ value ], + expanded = {}; + + for ( i = 0; i < 4; i++ ) { + expanded[ prefix + cssExpand[ i ] + suffix ] = + parts[ i ] || parts[ i - 2 ] || parts[ 0 ]; + } + + return expanded; + } + }; + + if ( !rmargin.test( prefix ) ) { + jQuery.cssHooks[ prefix + suffix ].set = setPositiveNumber; + } +}); +var r20 = /%20/g, + rbracket = /\[\]$/, + rCRLF = /\r?\n/g, + rinput = /^(?:color|date|datetime|datetime-local|email|hidden|month|number|password|range|search|tel|text|time|url|week)$/i, + rselectTextarea = /^(?:select|textarea)/i; + +jQuery.fn.extend({ + serialize: function() { + return jQuery.param( this.serializeArray() ); + }, + serializeArray: function() { + return this.map(function(){ + return this.elements ? jQuery.makeArray( this.elements ) : this; + }) + .filter(function(){ + return this.name && !this.disabled && + ( this.checked || rselectTextarea.test( this.nodeName ) || + rinput.test( this.type ) ); + }) + .map(function( i, elem ){ + var val = jQuery( this ).val(); + + return val == null ? + null : + jQuery.isArray( val ) ? + jQuery.map( val, function( val, i ){ + return { name: elem.name, value: val.replace( rCRLF, "\r\n" ) }; + }) : + { name: elem.name, value: val.replace( rCRLF, "\r\n" ) }; + }).get(); + } +}); + +//Serialize an array of form elements or a set of +//key/values into a query string +jQuery.param = function( a, traditional ) { + var prefix, + s = [], + add = function( key, value ) { + // If value is a function, invoke it and return its value + value = jQuery.isFunction( value ) ? value() : ( value == null ? "" : value ); + s[ s.length ] = encodeURIComponent( key ) + "=" + encodeURIComponent( value ); + }; + + // Set traditional to true for jQuery <= 1.3.2 behavior. + if ( traditional === undefined ) { + traditional = jQuery.ajaxSettings && jQuery.ajaxSettings.traditional; + } + + // If an array was passed in, assume that it is an array of form elements. + if ( jQuery.isArray( a ) || ( a.jquery && !jQuery.isPlainObject( a ) ) ) { + // Serialize the form elements + jQuery.each( a, function() { + add( this.name, this.value ); + }); + + } else { + // If traditional, encode the "old" way (the way 1.3.2 or older + // did it), otherwise encode params recursively. + for ( prefix in a ) { + buildParams( prefix, a[ prefix ], traditional, add ); + } + } + + // Return the resulting serialization + return s.join( "&" ).replace( r20, "+" ); +}; + +function buildParams( prefix, obj, traditional, add ) { + var name; + + if ( jQuery.isArray( obj ) ) { + // Serialize array item. + jQuery.each( obj, function( i, v ) { + if ( traditional || rbracket.test( prefix ) ) { + // Treat each array item as a scalar. + add( prefix, v ); + + } else { + // If array item is non-scalar (array or object), encode its + // numeric index to resolve deserialization ambiguity issues. + // Note that rack (as of 1.0.0) can't currently deserialize + // nested arrays properly, and attempting to do so may cause + // a server error. Possible fixes are to modify rack's + // deserialization algorithm or to provide an option or flag + // to force array serialization to be shallow. + buildParams( prefix + "[" + ( typeof v === "object" ? i : "" ) + "]", v, traditional, add ); + } + }); + + } else if ( !traditional && jQuery.type( obj ) === "object" ) { + // Serialize object item. + for ( name in obj ) { + buildParams( prefix + "[" + name + "]", obj[ name ], traditional, add ); + } + + } else { + // Serialize scalar item. + add( prefix, obj ); + } +} +var + // Document location + ajaxLocParts, + ajaxLocation, + + rhash = /#.*$/, + rheaders = /^(.*?):[ \t]*([^\r\n]*)\r?$/mg, // IE leaves an \r character at EOL + // #7653, #8125, #8152: local protocol detection + rlocalProtocol = /^(?:about|app|app\-storage|.+\-extension|file|res|widget):$/, + rnoContent = /^(?:GET|HEAD)$/, + rprotocol = /^\/\//, + rquery = /\?/, + rscript = /)<[^<]*)*<\/script>/gi, + rts = /([?&])_=[^&]*/, + rurl = /^([\w\+\.\-]+:)(?:\/\/([^\/?#:]*)(?::(\d+)|)|)/, + + // Keep a copy of the old load method + _load = jQuery.fn.load, + + /* Prefilters + * 1) They are useful to introduce custom dataTypes (see ajax/jsonp.js for an example) + * 2) These are called: + * - BEFORE asking for a transport + * - AFTER param serialization (s.data is a string if s.processData is true) + * 3) key is the dataType + * 4) the catchall symbol "*" can be used + * 5) execution will start with transport dataType and THEN continue down to "*" if needed + */ + prefilters = {}, + + /* Transports bindings + * 1) key is the dataType + * 2) the catchall symbol "*" can be used + * 3) selection will start with transport dataType and THEN go to "*" if needed + */ + transports = {}, + + // Avoid comment-prolog char sequence (#10098); must appease lint and evade compression + allTypes = ["*/"] + ["*"]; + +// #8138, IE may throw an exception when accessing +// a field from window.location if document.domain has been set +try { + ajaxLocation = location.href; +} catch( e ) { + // Use the href attribute of an A element + // since IE will modify it given document.location + ajaxLocation = document.createElement( "a" ); + ajaxLocation.href = ""; + ajaxLocation = ajaxLocation.href; +} + +// Segment location into parts +ajaxLocParts = rurl.exec( ajaxLocation.toLowerCase() ) || []; + +// Base "constructor" for jQuery.ajaxPrefilter and jQuery.ajaxTransport +function addToPrefiltersOrTransports( structure ) { + + // dataTypeExpression is optional and defaults to "*" + return function( dataTypeExpression, func ) { + + if ( typeof dataTypeExpression !== "string" ) { + func = dataTypeExpression; + dataTypeExpression = "*"; + } + + var dataType, list, placeBefore, + dataTypes = dataTypeExpression.toLowerCase().split( core_rspace ), + i = 0, + length = dataTypes.length; + + if ( jQuery.isFunction( func ) ) { + // For each dataType in the dataTypeExpression + for ( ; i < length; i++ ) { + dataType = dataTypes[ i ]; + // We control if we're asked to add before + // any existing element + placeBefore = /^\+/.test( dataType ); + if ( placeBefore ) { + dataType = dataType.substr( 1 ) || "*"; + } + list = structure[ dataType ] = structure[ dataType ] || []; + // then we add to the structure accordingly + list[ placeBefore ? "unshift" : "push" ]( func ); + } + } + }; +} + +// Base inspection function for prefilters and transports +function inspectPrefiltersOrTransports( structure, options, originalOptions, jqXHR, + dataType /* internal */, inspected /* internal */ ) { + + dataType = dataType || options.dataTypes[ 0 ]; + inspected = inspected || {}; + + inspected[ dataType ] = true; + + var selection, + list = structure[ dataType ], + i = 0, + length = list ? list.length : 0, + executeOnly = ( structure === prefilters ); + + for ( ; i < length && ( executeOnly || !selection ); i++ ) { + selection = list[ i ]( options, originalOptions, jqXHR ); + // If we got redirected to another dataType + // we try there if executing only and not done already + if ( typeof selection === "string" ) { + if ( !executeOnly || inspected[ selection ] ) { + selection = undefined; + } else { + options.dataTypes.unshift( selection ); + selection = inspectPrefiltersOrTransports( + structure, options, originalOptions, jqXHR, selection, inspected ); + } + } + } + // If we're only executing or nothing was selected + // we try the catchall dataType if not done already + if ( ( executeOnly || !selection ) && !inspected[ "*" ] ) { + selection = inspectPrefiltersOrTransports( + structure, options, originalOptions, jqXHR, "*", inspected ); + } + // unnecessary when only executing (prefilters) + // but it'll be ignored by the caller in that case + return selection; +} + +// A special extend for ajax options +// that takes "flat" options (not to be deep extended) +// Fixes #9887 +function ajaxExtend( target, src ) { + var key, deep, + flatOptions = jQuery.ajaxSettings.flatOptions || {}; + for ( key in src ) { + if ( src[ key ] !== undefined ) { + ( flatOptions[ key ] ? target : ( deep || ( deep = {} ) ) )[ key ] = src[ key ]; + } + } + if ( deep ) { + jQuery.extend( true, target, deep ); + } +} + +jQuery.fn.load = function( url, params, callback ) { + if ( typeof url !== "string" && _load ) { + return _load.apply( this, arguments ); + } + + // Don't do a request if no elements are being requested + if ( !this.length ) { + return this; + } + + var selector, type, response, + self = this, + off = url.indexOf(" "); + + if ( off >= 0 ) { + selector = url.slice( off, url.length ); + url = url.slice( 0, off ); + } + + // If it's a function + if ( jQuery.isFunction( params ) ) { + + // We assume that it's the callback + callback = params; + params = undefined; + + // Otherwise, build a param string + } else if ( params && typeof params === "object" ) { + type = "POST"; + } + + // Request the remote document + jQuery.ajax({ + url: url, + + // if "type" variable is undefined, then "GET" method will be used + type: type, + dataType: "html", + data: params, + complete: function( jqXHR, status ) { + if ( callback ) { + self.each( callback, response || [ jqXHR.responseText, status, jqXHR ] ); + } + } + }).done(function( responseText ) { + + // Save response for use in complete callback + response = arguments; + + // See if a selector was specified + self.html( selector ? + + // Create a dummy div to hold the results + jQuery("
    ") + + // inject the contents of the document in, removing the scripts + // to avoid any 'Permission Denied' errors in IE + .append( responseText.replace( rscript, "" ) ) + + // Locate the specified elements + .find( selector ) : + + // If not, just inject the full result + responseText ); + + }); + + return this; +}; + +// Attach a bunch of functions for handling common AJAX events +jQuery.each( "ajaxStart ajaxStop ajaxComplete ajaxError ajaxSuccess ajaxSend".split( " " ), function( i, o ){ + jQuery.fn[ o ] = function( f ){ + return this.on( o, f ); + }; +}); + +jQuery.each( [ "get", "post" ], function( i, method ) { + jQuery[ method ] = function( url, data, callback, type ) { + // shift arguments if data argument was omitted + if ( jQuery.isFunction( data ) ) { + type = type || callback; + callback = data; + data = undefined; + } + + return jQuery.ajax({ + type: method, + url: url, + data: data, + success: callback, + dataType: type + }); + }; +}); + +jQuery.extend({ + + getScript: function( url, callback ) { + return jQuery.get( url, undefined, callback, "script" ); + }, + + getJSON: function( url, data, callback ) { + return jQuery.get( url, data, callback, "json" ); + }, + + // Creates a full fledged settings object into target + // with both ajaxSettings and settings fields. + // If target is omitted, writes into ajaxSettings. + ajaxSetup: function( target, settings ) { + if ( settings ) { + // Building a settings object + ajaxExtend( target, jQuery.ajaxSettings ); + } else { + // Extending ajaxSettings + settings = target; + target = jQuery.ajaxSettings; + } + ajaxExtend( target, settings ); + return target; + }, + + ajaxSettings: { + url: ajaxLocation, + isLocal: rlocalProtocol.test( ajaxLocParts[ 1 ] ), + global: true, + type: "GET", + contentType: "application/x-www-form-urlencoded; charset=UTF-8", + processData: true, + async: true, + /* + timeout: 0, + data: null, + dataType: null, + username: null, + password: null, + cache: null, + throws: false, + traditional: false, + headers: {}, + */ + + accepts: { + xml: "application/xml, text/xml", + html: "text/html", + text: "text/plain", + json: "application/json, text/javascript", + "*": allTypes + }, + + contents: { + xml: /xml/, + html: /html/, + json: /json/ + }, + + responseFields: { + xml: "responseXML", + text: "responseText" + }, + + // List of data converters + // 1) key format is "source_type destination_type" (a single space in-between) + // 2) the catchall symbol "*" can be used for source_type + converters: { + + // Convert anything to text + "* text": window.String, + + // Text to html (true = no transformation) + "text html": true, + + // Evaluate text as a json expression + "text json": jQuery.parseJSON, + + // Parse text as xml + "text xml": jQuery.parseXML + }, + + // For options that shouldn't be deep extended: + // you can add your own custom options here if + // and when you create one that shouldn't be + // deep extended (see ajaxExtend) + flatOptions: { + context: true, + url: true + } + }, + + ajaxPrefilter: addToPrefiltersOrTransports( prefilters ), + ajaxTransport: addToPrefiltersOrTransports( transports ), + + // Main method + ajax: function( url, options ) { + + // If url is an object, simulate pre-1.5 signature + if ( typeof url === "object" ) { + options = url; + url = undefined; + } + + // Force options to be an object + options = options || {}; + + var // ifModified key + ifModifiedKey, + // Response headers + responseHeadersString, + responseHeaders, + // transport + transport, + // timeout handle + timeoutTimer, + // Cross-domain detection vars + parts, + // To know if global events are to be dispatched + fireGlobals, + // Loop variable + i, + // Create the final options object + s = jQuery.ajaxSetup( {}, options ), + // Callbacks context + callbackContext = s.context || s, + // Context for global events + // It's the callbackContext if one was provided in the options + // and if it's a DOM node or a jQuery collection + globalEventContext = callbackContext !== s && + ( callbackContext.nodeType || callbackContext instanceof jQuery ) ? + jQuery( callbackContext ) : jQuery.event, + // Deferreds + deferred = jQuery.Deferred(), + completeDeferred = jQuery.Callbacks( "once memory" ), + // Status-dependent callbacks + statusCode = s.statusCode || {}, + // Headers (they are sent all at once) + requestHeaders = {}, + requestHeadersNames = {}, + // The jqXHR state + state = 0, + // Default abort message + strAbort = "canceled", + // Fake xhr + jqXHR = { + + readyState: 0, + + // Caches the header + setRequestHeader: function( name, value ) { + if ( !state ) { + var lname = name.toLowerCase(); + name = requestHeadersNames[ lname ] = requestHeadersNames[ lname ] || name; + requestHeaders[ name ] = value; + } + return this; + }, + + // Raw string + getAllResponseHeaders: function() { + return state === 2 ? responseHeadersString : null; + }, + + // Builds headers hashtable if needed + getResponseHeader: function( key ) { + var match; + if ( state === 2 ) { + if ( !responseHeaders ) { + responseHeaders = {}; + while( ( match = rheaders.exec( responseHeadersString ) ) ) { + responseHeaders[ match[1].toLowerCase() ] = match[ 2 ]; + } + } + match = responseHeaders[ key.toLowerCase() ]; + } + return match === undefined ? null : match; + }, + + // Overrides response content-type header + overrideMimeType: function( type ) { + if ( !state ) { + s.mimeType = type; + } + return this; + }, + + // Cancel the request + abort: function( statusText ) { + statusText = statusText || strAbort; + if ( transport ) { + transport.abort( statusText ); + } + done( 0, statusText ); + return this; + } + }; + + // Callback for when everything is done + // It is defined here because jslint complains if it is declared + // at the end of the function (which would be more logical and readable) + function done( status, nativeStatusText, responses, headers ) { + var isSuccess, success, error, response, modified, + statusText = nativeStatusText; + + // Called once + if ( state === 2 ) { + return; + } + + // State is "done" now + state = 2; + + // Clear timeout if it exists + if ( timeoutTimer ) { + clearTimeout( timeoutTimer ); + } + + // Dereference transport for early garbage collection + // (no matter how long the jqXHR object will be used) + transport = undefined; + + // Cache response headers + responseHeadersString = headers || ""; + + // Set readyState + jqXHR.readyState = status > 0 ? 4 : 0; + + // Get response data + if ( responses ) { + response = ajaxHandleResponses( s, jqXHR, responses ); + } + + // If successful, handle type chaining + if ( status >= 200 && status < 300 || status === 304 ) { + + // Set the If-Modified-Since and/or If-None-Match header, if in ifModified mode. + if ( s.ifModified ) { + + modified = jqXHR.getResponseHeader("Last-Modified"); + if ( modified ) { + jQuery.lastModified[ ifModifiedKey ] = modified; + } + modified = jqXHR.getResponseHeader("Etag"); + if ( modified ) { + jQuery.etag[ ifModifiedKey ] = modified; + } + } + + // If not modified + if ( status === 304 ) { + + statusText = "notmodified"; + isSuccess = true; + + // If we have data + } else { + + isSuccess = ajaxConvert( s, response ); + statusText = isSuccess.state; + success = isSuccess.data; + error = isSuccess.error; + isSuccess = !error; + } + } else { + // We extract error from statusText + // then normalize statusText and status for non-aborts + error = statusText; + if ( !statusText || status ) { + statusText = "error"; + if ( status < 0 ) { + status = 0; + } + } + } + + // Set data for the fake xhr object + jqXHR.status = status; + jqXHR.statusText = ( nativeStatusText || statusText ) + ""; + + // Success/Error + if ( isSuccess ) { + deferred.resolveWith( callbackContext, [ success, statusText, jqXHR ] ); + } else { + deferred.rejectWith( callbackContext, [ jqXHR, statusText, error ] ); + } + + // Status-dependent callbacks + jqXHR.statusCode( statusCode ); + statusCode = undefined; + + if ( fireGlobals ) { + globalEventContext.trigger( "ajax" + ( isSuccess ? "Success" : "Error" ), + [ jqXHR, s, isSuccess ? success : error ] ); + } + + // Complete + completeDeferred.fireWith( callbackContext, [ jqXHR, statusText ] ); + + if ( fireGlobals ) { + globalEventContext.trigger( "ajaxComplete", [ jqXHR, s ] ); + // Handle the global AJAX counter + if ( !( --jQuery.active ) ) { + jQuery.event.trigger( "ajaxStop" ); + } + } + } + + // Attach deferreds + deferred.promise( jqXHR ); + jqXHR.success = jqXHR.done; + jqXHR.error = jqXHR.fail; + jqXHR.complete = completeDeferred.add; + + // Status-dependent callbacks + jqXHR.statusCode = function( map ) { + if ( map ) { + var tmp; + if ( state < 2 ) { + for ( tmp in map ) { + statusCode[ tmp ] = [ statusCode[tmp], map[tmp] ]; + } + } else { + tmp = map[ jqXHR.status ]; + jqXHR.always( tmp ); + } + } + return this; + }; + + // Remove hash character (#7531: and string promotion) + // Add protocol if not provided (#5866: IE7 issue with protocol-less urls) + // We also use the url parameter if available + s.url = ( ( url || s.url ) + "" ).replace( rhash, "" ).replace( rprotocol, ajaxLocParts[ 1 ] + "//" ); + + // Extract dataTypes list + s.dataTypes = jQuery.trim( s.dataType || "*" ).toLowerCase().split( core_rspace ); + + // A cross-domain request is in order when we have a protocol:host:port mismatch + if ( s.crossDomain == null ) { + parts = rurl.exec( s.url.toLowerCase() ) || false; + s.crossDomain = parts && ( parts.join(":") + ( parts[ 3 ] ? "" : parts[ 1 ] === "http:" ? 80 : 443 ) ) !== + ( ajaxLocParts.join(":") + ( ajaxLocParts[ 3 ] ? "" : ajaxLocParts[ 1 ] === "http:" ? 80 : 443 ) ); + } + + // Convert data if not already a string + if ( s.data && s.processData && typeof s.data !== "string" ) { + s.data = jQuery.param( s.data, s.traditional ); + } + + // Apply prefilters + inspectPrefiltersOrTransports( prefilters, s, options, jqXHR ); + + // If request was aborted inside a prefilter, stop there + if ( state === 2 ) { + return jqXHR; + } + + // We can fire global events as of now if asked to + fireGlobals = s.global; + + // Uppercase the type + s.type = s.type.toUpperCase(); + + // Determine if request has content + s.hasContent = !rnoContent.test( s.type ); + + // Watch for a new set of requests + if ( fireGlobals && jQuery.active++ === 0 ) { + jQuery.event.trigger( "ajaxStart" ); + } + + // More options handling for requests with no content + if ( !s.hasContent ) { + + // If data is available, append data to url + if ( s.data ) { + s.url += ( rquery.test( s.url ) ? "&" : "?" ) + s.data; + // #9682: remove data so that it's not used in an eventual retry + delete s.data; + } + + // Get ifModifiedKey before adding the anti-cache parameter + ifModifiedKey = s.url; + + // Add anti-cache in url if needed + if ( s.cache === false ) { + + var ts = jQuery.now(), + // try replacing _= if it is there + ret = s.url.replace( rts, "$1_=" + ts ); + + // if nothing was replaced, add timestamp to the end + s.url = ret + ( ( ret === s.url ) ? ( rquery.test( s.url ) ? "&" : "?" ) + "_=" + ts : "" ); + } + } + + // Set the correct header, if data is being sent + if ( s.data && s.hasContent && s.contentType !== false || options.contentType ) { + jqXHR.setRequestHeader( "Content-Type", s.contentType ); + } + + // Set the If-Modified-Since and/or If-None-Match header, if in ifModified mode. + if ( s.ifModified ) { + ifModifiedKey = ifModifiedKey || s.url; + if ( jQuery.lastModified[ ifModifiedKey ] ) { + jqXHR.setRequestHeader( "If-Modified-Since", jQuery.lastModified[ ifModifiedKey ] ); + } + if ( jQuery.etag[ ifModifiedKey ] ) { + jqXHR.setRequestHeader( "If-None-Match", jQuery.etag[ ifModifiedKey ] ); + } + } + + // Set the Accepts header for the server, depending on the dataType + jqXHR.setRequestHeader( + "Accept", + s.dataTypes[ 0 ] && s.accepts[ s.dataTypes[0] ] ? + s.accepts[ s.dataTypes[0] ] + ( s.dataTypes[ 0 ] !== "*" ? ", " + allTypes + "; q=0.01" : "" ) : + s.accepts[ "*" ] + ); + + // Check for headers option + for ( i in s.headers ) { + jqXHR.setRequestHeader( i, s.headers[ i ] ); + } + + // Allow custom headers/mimetypes and early abort + if ( s.beforeSend && ( s.beforeSend.call( callbackContext, jqXHR, s ) === false || state === 2 ) ) { + // Abort if not done already and return + return jqXHR.abort(); + + } + + // aborting is no longer a cancellation + strAbort = "abort"; + + // Install callbacks on deferreds + for ( i in { success: 1, error: 1, complete: 1 } ) { + jqXHR[ i ]( s[ i ] ); + } + + // Get transport + transport = inspectPrefiltersOrTransports( transports, s, options, jqXHR ); + + // If no transport, we auto-abort + if ( !transport ) { + done( -1, "No Transport" ); + } else { + jqXHR.readyState = 1; + // Send global event + if ( fireGlobals ) { + globalEventContext.trigger( "ajaxSend", [ jqXHR, s ] ); + } + // Timeout + if ( s.async && s.timeout > 0 ) { + timeoutTimer = setTimeout( function(){ + jqXHR.abort( "timeout" ); + }, s.timeout ); + } + + try { + state = 1; + transport.send( requestHeaders, done ); + } catch (e) { + // Propagate exception as error if not done + if ( state < 2 ) { + done( -1, e ); + // Simply rethrow otherwise + } else { + throw e; + } + } + } + + return jqXHR; + }, + + // Counter for holding the number of active queries + active: 0, + + // Last-Modified header cache for next request + lastModified: {}, + etag: {} + +}); + +/* Handles responses to an ajax request: + * - sets all responseXXX fields accordingly + * - finds the right dataType (mediates between content-type and expected dataType) + * - returns the corresponding response + */ +function ajaxHandleResponses( s, jqXHR, responses ) { + + var ct, type, finalDataType, firstDataType, + contents = s.contents, + dataTypes = s.dataTypes, + responseFields = s.responseFields; + + // Fill responseXXX fields + for ( type in responseFields ) { + if ( type in responses ) { + jqXHR[ responseFields[type] ] = responses[ type ]; + } + } + + // Remove auto dataType and get content-type in the process + while( dataTypes[ 0 ] === "*" ) { + dataTypes.shift(); + if ( ct === undefined ) { + ct = s.mimeType || jqXHR.getResponseHeader( "content-type" ); + } + } + + // Check if we're dealing with a known content-type + if ( ct ) { + for ( type in contents ) { + if ( contents[ type ] && contents[ type ].test( ct ) ) { + dataTypes.unshift( type ); + break; + } + } + } + + // Check to see if we have a response for the expected dataType + if ( dataTypes[ 0 ] in responses ) { + finalDataType = dataTypes[ 0 ]; + } else { + // Try convertible dataTypes + for ( type in responses ) { + if ( !dataTypes[ 0 ] || s.converters[ type + " " + dataTypes[0] ] ) { + finalDataType = type; + break; + } + if ( !firstDataType ) { + firstDataType = type; + } + } + // Or just use first one + finalDataType = finalDataType || firstDataType; + } + + // If we found a dataType + // We add the dataType to the list if needed + // and return the corresponding response + if ( finalDataType ) { + if ( finalDataType !== dataTypes[ 0 ] ) { + dataTypes.unshift( finalDataType ); + } + return responses[ finalDataType ]; + } +} + +// Chain conversions given the request and the original response +function ajaxConvert( s, response ) { + + var conv, conv2, current, tmp, + // Work with a copy of dataTypes in case we need to modify it for conversion + dataTypes = s.dataTypes.slice(), + prev = dataTypes[ 0 ], + converters = {}, + i = 0; + + // Apply the dataFilter if provided + if ( s.dataFilter ) { + response = s.dataFilter( response, s.dataType ); + } + + // Create converters map with lowercased keys + if ( dataTypes[ 1 ] ) { + for ( conv in s.converters ) { + converters[ conv.toLowerCase() ] = s.converters[ conv ]; + } + } + + // Convert to each sequential dataType, tolerating list modification + for ( ; (current = dataTypes[++i]); ) { + + // There's only work to do if current dataType is non-auto + if ( current !== "*" ) { + + // Convert response if prev dataType is non-auto and differs from current + if ( prev !== "*" && prev !== current ) { + + // Seek a direct converter + conv = converters[ prev + " " + current ] || converters[ "* " + current ]; + + // If none found, seek a pair + if ( !conv ) { + for ( conv2 in converters ) { + + // If conv2 outputs current + tmp = conv2.split(" "); + if ( tmp[ 1 ] === current ) { + + // If prev can be converted to accepted input + conv = converters[ prev + " " + tmp[ 0 ] ] || + converters[ "* " + tmp[ 0 ] ]; + if ( conv ) { + // Condense equivalence converters + if ( conv === true ) { + conv = converters[ conv2 ]; + + // Otherwise, insert the intermediate dataType + } else if ( converters[ conv2 ] !== true ) { + current = tmp[ 0 ]; + dataTypes.splice( i--, 0, current ); + } + + break; + } + } + } + } + + // Apply converter (if not an equivalence) + if ( conv !== true ) { + + // Unless errors are allowed to bubble, catch and return them + if ( conv && s["throws"] ) { + response = conv( response ); + } else { + try { + response = conv( response ); + } catch ( e ) { + return { state: "parsererror", error: conv ? e : "No conversion from " + prev + " to " + current }; + } + } + } + } + + // Update prev for next iteration + prev = current; + } + } + + return { state: "success", data: response }; +} +var oldCallbacks = [], + rquestion = /\?/, + rjsonp = /(=)\?(?=&|$)|\?\?/, + nonce = jQuery.now(); + +// Default jsonp settings +jQuery.ajaxSetup({ + jsonp: "callback", + jsonpCallback: function() { + var callback = oldCallbacks.pop() || ( jQuery.expando + "_" + ( nonce++ ) ); + this[ callback ] = true; + return callback; + } +}); + +// Detect, normalize options and install callbacks for jsonp requests +jQuery.ajaxPrefilter( "json jsonp", function( s, originalSettings, jqXHR ) { + + var callbackName, overwritten, responseContainer, + data = s.data, + url = s.url, + hasCallback = s.jsonp !== false, + replaceInUrl = hasCallback && rjsonp.test( url ), + replaceInData = hasCallback && !replaceInUrl && typeof data === "string" && + !( s.contentType || "" ).indexOf("application/x-www-form-urlencoded") && + rjsonp.test( data ); + + // Handle iff the expected data type is "jsonp" or we have a parameter to set + if ( s.dataTypes[ 0 ] === "jsonp" || replaceInUrl || replaceInData ) { + + // Get callback name, remembering preexisting value associated with it + callbackName = s.jsonpCallback = jQuery.isFunction( s.jsonpCallback ) ? + s.jsonpCallback() : + s.jsonpCallback; + overwritten = window[ callbackName ]; + + // Insert callback into url or form data + if ( replaceInUrl ) { + s.url = url.replace( rjsonp, "$1" + callbackName ); + } else if ( replaceInData ) { + s.data = data.replace( rjsonp, "$1" + callbackName ); + } else if ( hasCallback ) { + s.url += ( rquestion.test( url ) ? "&" : "?" ) + s.jsonp + "=" + callbackName; + } + + // Use data converter to retrieve json after script execution + s.converters["script json"] = function() { + if ( !responseContainer ) { + jQuery.error( callbackName + " was not called" ); + } + return responseContainer[ 0 ]; + }; + + // force json dataType + s.dataTypes[ 0 ] = "json"; + + // Install callback + window[ callbackName ] = function() { + responseContainer = arguments; + }; + + // Clean-up function (fires after converters) + jqXHR.always(function() { + // Restore preexisting value + window[ callbackName ] = overwritten; + + // Save back as free + if ( s[ callbackName ] ) { + // make sure that re-using the options doesn't screw things around + s.jsonpCallback = originalSettings.jsonpCallback; + + // save the callback name for future use + oldCallbacks.push( callbackName ); + } + + // Call if it was a function and we have a response + if ( responseContainer && jQuery.isFunction( overwritten ) ) { + overwritten( responseContainer[ 0 ] ); + } + + responseContainer = overwritten = undefined; + }); + + // Delegate to script + return "script"; + } +}); +// Install script dataType +jQuery.ajaxSetup({ + accepts: { + script: "text/javascript, application/javascript, application/ecmascript, application/x-ecmascript" + }, + contents: { + script: /javascript|ecmascript/ + }, + converters: { + "text script": function( text ) { + jQuery.globalEval( text ); + return text; + } + } +}); + +// Handle cache's special case and global +jQuery.ajaxPrefilter( "script", function( s ) { + if ( s.cache === undefined ) { + s.cache = false; + } + if ( s.crossDomain ) { + s.type = "GET"; + s.global = false; + } +}); + +// Bind script tag hack transport +jQuery.ajaxTransport( "script", function(s) { + + // This transport only deals with cross domain requests + if ( s.crossDomain ) { + + var script, + head = document.head || document.getElementsByTagName( "head" )[0] || document.documentElement; + + return { + + send: function( _, callback ) { + + script = document.createElement( "script" ); + + script.async = "async"; + + if ( s.scriptCharset ) { + script.charset = s.scriptCharset; + } + + script.src = s.url; + + // Attach handlers for all browsers + script.onload = script.onreadystatechange = function( _, isAbort ) { + + if ( isAbort || !script.readyState || /loaded|complete/.test( script.readyState ) ) { + + // Handle memory leak in IE + script.onload = script.onreadystatechange = null; + + // Remove the script + if ( head && script.parentNode ) { + head.removeChild( script ); + } + + // Dereference the script + script = undefined; + + // Callback if not abort + if ( !isAbort ) { + callback( 200, "success" ); + } + } + }; + // Use insertBefore instead of appendChild to circumvent an IE6 bug. + // This arises when a base node is used (#2709 and #4378). + head.insertBefore( script, head.firstChild ); + }, + + abort: function() { + if ( script ) { + script.onload( 0, 1 ); + } + } + }; + } +}); +var xhrCallbacks, + // #5280: Internet Explorer will keep connections alive if we don't abort on unload + xhrOnUnloadAbort = window.ActiveXObject ? function() { + // Abort all pending requests + for ( var key in xhrCallbacks ) { + xhrCallbacks[ key ]( 0, 1 ); + } + } : false, + xhrId = 0; + +// Functions to create xhrs +function createStandardXHR() { + try { + return new window.XMLHttpRequest(); + } catch( e ) {} +} + +function createActiveXHR() { + try { + return new window.ActiveXObject( "Microsoft.XMLHTTP" ); + } catch( e ) {} +} + +// Create the request object +// (This is still attached to ajaxSettings for backward compatibility) +jQuery.ajaxSettings.xhr = window.ActiveXObject ? + /* Microsoft failed to properly + * implement the XMLHttpRequest in IE7 (can't request local files), + * so we use the ActiveXObject when it is available + * Additionally XMLHttpRequest can be disabled in IE7/IE8 so + * we need a fallback. + */ + function() { + return !this.isLocal && createStandardXHR() || createActiveXHR(); + } : + // For all other browsers, use the standard XMLHttpRequest object + createStandardXHR; + +// Determine support properties +(function( xhr ) { + jQuery.extend( jQuery.support, { + ajax: !!xhr, + cors: !!xhr && ( "withCredentials" in xhr ) + }); +})( jQuery.ajaxSettings.xhr() ); + +// Create transport if the browser can provide an xhr +if ( jQuery.support.ajax ) { + + jQuery.ajaxTransport(function( s ) { + // Cross domain only allowed if supported through XMLHttpRequest + if ( !s.crossDomain || jQuery.support.cors ) { + + var callback; + + return { + send: function( headers, complete ) { + + // Get a new xhr + var handle, i, + xhr = s.xhr(); + + // Open the socket + // Passing null username, generates a login popup on Opera (#2865) + if ( s.username ) { + xhr.open( s.type, s.url, s.async, s.username, s.password ); + } else { + xhr.open( s.type, s.url, s.async ); + } + + // Apply custom fields if provided + if ( s.xhrFields ) { + for ( i in s.xhrFields ) { + xhr[ i ] = s.xhrFields[ i ]; + } + } + + // Override mime type if needed + if ( s.mimeType && xhr.overrideMimeType ) { + xhr.overrideMimeType( s.mimeType ); + } + + // X-Requested-With header + // For cross-domain requests, seeing as conditions for a preflight are + // akin to a jigsaw puzzle, we simply never set it to be sure. + // (it can always be set on a per-request basis or even using ajaxSetup) + // For same-domain requests, won't change header if already provided. + if ( !s.crossDomain && !headers["X-Requested-With"] ) { + headers[ "X-Requested-With" ] = "XMLHttpRequest"; + } + + // Need an extra try/catch for cross domain requests in Firefox 3 + try { + for ( i in headers ) { + xhr.setRequestHeader( i, headers[ i ] ); + } + } catch( _ ) {} + + // Do send the request + // This may raise an exception which is actually + // handled in jQuery.ajax (so no try/catch here) + xhr.send( ( s.hasContent && s.data ) || null ); + + // Listener + callback = function( _, isAbort ) { + + var status, + statusText, + responseHeaders, + responses, + xml; + + // Firefox throws exceptions when accessing properties + // of an xhr when a network error occurred + // http://helpful.knobs-dials.com/index.php/Component_returned_failure_code:_0x80040111_(NS_ERROR_NOT_AVAILABLE) + try { + + // Was never called and is aborted or complete + if ( callback && ( isAbort || xhr.readyState === 4 ) ) { + + // Only called once + callback = undefined; + + // Do not keep as active anymore + if ( handle ) { + xhr.onreadystatechange = jQuery.noop; + if ( xhrOnUnloadAbort ) { + delete xhrCallbacks[ handle ]; + } + } + + // If it's an abort + if ( isAbort ) { + // Abort it manually if needed + if ( xhr.readyState !== 4 ) { + xhr.abort(); + } + } else { + status = xhr.status; + responseHeaders = xhr.getAllResponseHeaders(); + responses = {}; + xml = xhr.responseXML; + + // Construct response list + if ( xml && xml.documentElement /* #4958 */ ) { + responses.xml = xml; + } + + // When requesting binary data, IE6-9 will throw an exception + // on any attempt to access responseText (#11426) + try { + responses.text = xhr.responseText; + } catch( _ ) { + } + + // Firefox throws an exception when accessing + // statusText for faulty cross-domain requests + try { + statusText = xhr.statusText; + } catch( e ) { + // We normalize with Webkit giving an empty statusText + statusText = ""; + } + + // Filter status for non standard behaviors + + // If the request is local and we have data: assume a success + // (success with no data won't get notified, that's the best we + // can do given current implementations) + if ( !status && s.isLocal && !s.crossDomain ) { + status = responses.text ? 200 : 404; + // IE - #1450: sometimes returns 1223 when it should be 204 + } else if ( status === 1223 ) { + status = 204; + } + } + } + } catch( firefoxAccessException ) { + if ( !isAbort ) { + complete( -1, firefoxAccessException ); + } + } + + // Call complete if needed + if ( responses ) { + complete( status, statusText, responses, responseHeaders ); + } + }; + + if ( !s.async ) { + // if we're in sync mode we fire the callback + callback(); + } else if ( xhr.readyState === 4 ) { + // (IE6 & IE7) if it's in cache and has been + // retrieved directly we need to fire the callback + setTimeout( callback, 0 ); + } else { + handle = ++xhrId; + if ( xhrOnUnloadAbort ) { + // Create the active xhrs callbacks list if needed + // and attach the unload handler + if ( !xhrCallbacks ) { + xhrCallbacks = {}; + jQuery( window ).unload( xhrOnUnloadAbort ); + } + // Add to list of active xhrs callbacks + xhrCallbacks[ handle ] = callback; + } + xhr.onreadystatechange = callback; + } + }, + + abort: function() { + if ( callback ) { + callback(0,1); + } + } + }; + } + }); +} +var fxNow, timerId, + rfxtypes = /^(?:toggle|show|hide)$/, + rfxnum = new RegExp( "^(?:([-+])=|)(" + core_pnum + ")([a-z%]*)$", "i" ), + rrun = /queueHooks$/, + animationPrefilters = [ defaultPrefilter ], + tweeners = { + "*": [function( prop, value ) { + var end, unit, + tween = this.createTween( prop, value ), + parts = rfxnum.exec( value ), + target = tween.cur(), + start = +target || 0, + scale = 1, + maxIterations = 20; + + if ( parts ) { + end = +parts[2]; + unit = parts[3] || ( jQuery.cssNumber[ prop ] ? "" : "px" ); + + // We need to compute starting value + if ( unit !== "px" && start ) { + // Iteratively approximate from a nonzero starting point + // Prefer the current property, because this process will be trivial if it uses the same units + // Fallback to end or a simple constant + start = jQuery.css( tween.elem, prop, true ) || end || 1; + + do { + // If previous iteration zeroed out, double until we get *something* + // Use a string for doubling factor so we don't accidentally see scale as unchanged below + scale = scale || ".5"; + + // Adjust and apply + start = start / scale; + jQuery.style( tween.elem, prop, start + unit ); + + // Update scale, tolerating zero or NaN from tween.cur() + // And breaking the loop if scale is unchanged or perfect, or if we've just had enough + } while ( scale !== (scale = tween.cur() / target) && scale !== 1 && --maxIterations ); + } + + tween.unit = unit; + tween.start = start; + // If a +=/-= token was provided, we're doing a relative animation + tween.end = parts[1] ? start + ( parts[1] + 1 ) * end : end; + } + return tween; + }] + }; + +// Animations created synchronously will run synchronously +function createFxNow() { + setTimeout(function() { + fxNow = undefined; + }, 0 ); + return ( fxNow = jQuery.now() ); +} + +function createTweens( animation, props ) { + jQuery.each( props, function( prop, value ) { + var collection = ( tweeners[ prop ] || [] ).concat( tweeners[ "*" ] ), + index = 0, + length = collection.length; + for ( ; index < length; index++ ) { + if ( collection[ index ].call( animation, prop, value ) ) { + + // we're done with this property + return; + } + } + }); +} + +function Animation( elem, properties, options ) { + var result, + index = 0, + tweenerIndex = 0, + length = animationPrefilters.length, + deferred = jQuery.Deferred().always( function() { + // don't match elem in the :animated selector + delete tick.elem; + }), + tick = function() { + var currentTime = fxNow || createFxNow(), + remaining = Math.max( 0, animation.startTime + animation.duration - currentTime ), + percent = 1 - ( remaining / animation.duration || 0 ), + index = 0, + length = animation.tweens.length; + + for ( ; index < length ; index++ ) { + animation.tweens[ index ].run( percent ); + } + + deferred.notifyWith( elem, [ animation, percent, remaining ]); + + if ( percent < 1 && length ) { + return remaining; + } else { + deferred.resolveWith( elem, [ animation ] ); + return false; + } + }, + animation = deferred.promise({ + elem: elem, + props: jQuery.extend( {}, properties ), + opts: jQuery.extend( true, { specialEasing: {} }, options ), + originalProperties: properties, + originalOptions: options, + startTime: fxNow || createFxNow(), + duration: options.duration, + tweens: [], + createTween: function( prop, end, easing ) { + var tween = jQuery.Tween( elem, animation.opts, prop, end, + animation.opts.specialEasing[ prop ] || animation.opts.easing ); + animation.tweens.push( tween ); + return tween; + }, + stop: function( gotoEnd ) { + var index = 0, + // if we are going to the end, we want to run all the tweens + // otherwise we skip this part + length = gotoEnd ? animation.tweens.length : 0; + + for ( ; index < length ; index++ ) { + animation.tweens[ index ].run( 1 ); + } + + // resolve when we played the last frame + // otherwise, reject + if ( gotoEnd ) { + deferred.resolveWith( elem, [ animation, gotoEnd ] ); + } else { + deferred.rejectWith( elem, [ animation, gotoEnd ] ); + } + return this; + } + }), + props = animation.props; + + propFilter( props, animation.opts.specialEasing ); + + for ( ; index < length ; index++ ) { + result = animationPrefilters[ index ].call( animation, elem, props, animation.opts ); + if ( result ) { + return result; + } + } + + createTweens( animation, props ); + + if ( jQuery.isFunction( animation.opts.start ) ) { + animation.opts.start.call( elem, animation ); + } + + jQuery.fx.timer( + jQuery.extend( tick, { + anim: animation, + queue: animation.opts.queue, + elem: elem + }) + ); + + // attach callbacks from options + return animation.progress( animation.opts.progress ) + .done( animation.opts.done, animation.opts.complete ) + .fail( animation.opts.fail ) + .always( animation.opts.always ); +} + +function propFilter( props, specialEasing ) { + var index, name, easing, value, hooks; + + // camelCase, specialEasing and expand cssHook pass + for ( index in props ) { + name = jQuery.camelCase( index ); + easing = specialEasing[ name ]; + value = props[ index ]; + if ( jQuery.isArray( value ) ) { + easing = value[ 1 ]; + value = props[ index ] = value[ 0 ]; + } + + if ( index !== name ) { + props[ name ] = value; + delete props[ index ]; + } + + hooks = jQuery.cssHooks[ name ]; + if ( hooks && "expand" in hooks ) { + value = hooks.expand( value ); + delete props[ name ]; + + // not quite $.extend, this wont overwrite keys already present. + // also - reusing 'index' from above because we have the correct "name" + for ( index in value ) { + if ( !( index in props ) ) { + props[ index ] = value[ index ]; + specialEasing[ index ] = easing; + } + } + } else { + specialEasing[ name ] = easing; + } + } +} + +jQuery.Animation = jQuery.extend( Animation, { + + tweener: function( props, callback ) { + if ( jQuery.isFunction( props ) ) { + callback = props; + props = [ "*" ]; + } else { + props = props.split(" "); + } + + var prop, + index = 0, + length = props.length; + + for ( ; index < length ; index++ ) { + prop = props[ index ]; + tweeners[ prop ] = tweeners[ prop ] || []; + tweeners[ prop ].unshift( callback ); + } + }, + + prefilter: function( callback, prepend ) { + if ( prepend ) { + animationPrefilters.unshift( callback ); + } else { + animationPrefilters.push( callback ); + } + } +}); + +function defaultPrefilter( elem, props, opts ) { + var index, prop, value, length, dataShow, tween, hooks, oldfire, + anim = this, + style = elem.style, + orig = {}, + handled = [], + hidden = elem.nodeType && isHidden( elem ); + + // handle queue: false promises + if ( !opts.queue ) { + hooks = jQuery._queueHooks( elem, "fx" ); + if ( hooks.unqueued == null ) { + hooks.unqueued = 0; + oldfire = hooks.empty.fire; + hooks.empty.fire = function() { + if ( !hooks.unqueued ) { + oldfire(); + } + }; + } + hooks.unqueued++; + + anim.always(function() { + // doing this makes sure that the complete handler will be called + // before this completes + anim.always(function() { + hooks.unqueued--; + if ( !jQuery.queue( elem, "fx" ).length ) { + hooks.empty.fire(); + } + }); + }); + } + + // height/width overflow pass + if ( elem.nodeType === 1 && ( "height" in props || "width" in props ) ) { + // Make sure that nothing sneaks out + // Record all 3 overflow attributes because IE does not + // change the overflow attribute when overflowX and + // overflowY are set to the same value + opts.overflow = [ style.overflow, style.overflowX, style.overflowY ]; + + // Set display property to inline-block for height/width + // animations on inline elements that are having width/height animated + if ( jQuery.css( elem, "display" ) === "inline" && + jQuery.css( elem, "float" ) === "none" ) { + + // inline-level elements accept inline-block; + // block-level elements need to be inline with layout + if ( !jQuery.support.inlineBlockNeedsLayout || css_defaultDisplay( elem.nodeName ) === "inline" ) { + style.display = "inline-block"; + + } else { + style.zoom = 1; + } + } + } + + if ( opts.overflow ) { + style.overflow = "hidden"; + if ( !jQuery.support.shrinkWrapBlocks ) { + anim.done(function() { + style.overflow = opts.overflow[ 0 ]; + style.overflowX = opts.overflow[ 1 ]; + style.overflowY = opts.overflow[ 2 ]; + }); + } + } + + + // show/hide pass + for ( index in props ) { + value = props[ index ]; + if ( rfxtypes.exec( value ) ) { + delete props[ index ]; + if ( value === ( hidden ? "hide" : "show" ) ) { + continue; + } + handled.push( index ); + } + } + + length = handled.length; + if ( length ) { + dataShow = jQuery._data( elem, "fxshow" ) || jQuery._data( elem, "fxshow", {} ); + if ( hidden ) { + jQuery( elem ).show(); + } else { + anim.done(function() { + jQuery( elem ).hide(); + }); + } + anim.done(function() { + var prop; + jQuery.removeData( elem, "fxshow", true ); + for ( prop in orig ) { + jQuery.style( elem, prop, orig[ prop ] ); + } + }); + for ( index = 0 ; index < length ; index++ ) { + prop = handled[ index ]; + tween = anim.createTween( prop, hidden ? dataShow[ prop ] : 0 ); + orig[ prop ] = dataShow[ prop ] || jQuery.style( elem, prop ); + + if ( !( prop in dataShow ) ) { + dataShow[ prop ] = tween.start; + if ( hidden ) { + tween.end = tween.start; + tween.start = prop === "width" || prop === "height" ? 1 : 0; + } + } + } + } +} + +function Tween( elem, options, prop, end, easing ) { + return new Tween.prototype.init( elem, options, prop, end, easing ); +} +jQuery.Tween = Tween; + +Tween.prototype = { + constructor: Tween, + init: function( elem, options, prop, end, easing, unit ) { + this.elem = elem; + this.prop = prop; + this.easing = easing || "swing"; + this.options = options; + this.start = this.now = this.cur(); + this.end = end; + this.unit = unit || ( jQuery.cssNumber[ prop ] ? "" : "px" ); + }, + cur: function() { + var hooks = Tween.propHooks[ this.prop ]; + + return hooks && hooks.get ? + hooks.get( this ) : + Tween.propHooks._default.get( this ); + }, + run: function( percent ) { + var eased, + hooks = Tween.propHooks[ this.prop ]; + + if ( this.options.duration ) { + this.pos = eased = jQuery.easing[ this.easing ]( + percent, this.options.duration * percent, 0, 1, this.options.duration + ); + } else { + this.pos = eased = percent; + } + this.now = ( this.end - this.start ) * eased + this.start; + + if ( this.options.step ) { + this.options.step.call( this.elem, this.now, this ); + } + + if ( hooks && hooks.set ) { + hooks.set( this ); + } else { + Tween.propHooks._default.set( this ); + } + return this; + } +}; + +Tween.prototype.init.prototype = Tween.prototype; + +Tween.propHooks = { + _default: { + get: function( tween ) { + var result; + + if ( tween.elem[ tween.prop ] != null && + (!tween.elem.style || tween.elem.style[ tween.prop ] == null) ) { + return tween.elem[ tween.prop ]; + } + + // passing any value as a 4th parameter to .css will automatically + // attempt a parseFloat and fallback to a string if the parse fails + // so, simple values such as "10px" are parsed to Float. + // complex values such as "rotate(1rad)" are returned as is. + result = jQuery.css( tween.elem, tween.prop, false, "" ); + // Empty strings, null, undefined and "auto" are converted to 0. + return !result || result === "auto" ? 0 : result; + }, + set: function( tween ) { + // use step hook for back compat - use cssHook if its there - use .style if its + // available and use plain properties where available + if ( jQuery.fx.step[ tween.prop ] ) { + jQuery.fx.step[ tween.prop ]( tween ); + } else if ( tween.elem.style && ( tween.elem.style[ jQuery.cssProps[ tween.prop ] ] != null || jQuery.cssHooks[ tween.prop ] ) ) { + jQuery.style( tween.elem, tween.prop, tween.now + tween.unit ); + } else { + tween.elem[ tween.prop ] = tween.now; + } + } + } +}; + +// Remove in 2.0 - this supports IE8's panic based approach +// to setting things on disconnected nodes + +Tween.propHooks.scrollTop = Tween.propHooks.scrollLeft = { + set: function( tween ) { + if ( tween.elem.nodeType && tween.elem.parentNode ) { + tween.elem[ tween.prop ] = tween.now; + } + } +}; + +jQuery.each([ "toggle", "show", "hide" ], function( i, name ) { + var cssFn = jQuery.fn[ name ]; + jQuery.fn[ name ] = function( speed, easing, callback ) { + return speed == null || typeof speed === "boolean" || + // special check for .toggle( handler, handler, ... ) + ( !i && jQuery.isFunction( speed ) && jQuery.isFunction( easing ) ) ? + cssFn.apply( this, arguments ) : + this.animate( genFx( name, true ), speed, easing, callback ); + }; +}); + +jQuery.fn.extend({ + fadeTo: function( speed, to, easing, callback ) { + + // show any hidden elements after setting opacity to 0 + return this.filter( isHidden ).css( "opacity", 0 ).show() + + // animate to the value specified + .end().animate({ opacity: to }, speed, easing, callback ); + }, + animate: function( prop, speed, easing, callback ) { + var empty = jQuery.isEmptyObject( prop ), + optall = jQuery.speed( speed, easing, callback ), + doAnimation = function() { + // Operate on a copy of prop so per-property easing won't be lost + var anim = Animation( this, jQuery.extend( {}, prop ), optall ); + + // Empty animations resolve immediately + if ( empty ) { + anim.stop( true ); + } + }; + + return empty || optall.queue === false ? + this.each( doAnimation ) : + this.queue( optall.queue, doAnimation ); + }, + stop: function( type, clearQueue, gotoEnd ) { + var stopQueue = function( hooks ) { + var stop = hooks.stop; + delete hooks.stop; + stop( gotoEnd ); + }; + + if ( typeof type !== "string" ) { + gotoEnd = clearQueue; + clearQueue = type; + type = undefined; + } + if ( clearQueue && type !== false ) { + this.queue( type || "fx", [] ); + } + + return this.each(function() { + var dequeue = true, + index = type != null && type + "queueHooks", + timers = jQuery.timers, + data = jQuery._data( this ); + + if ( index ) { + if ( data[ index ] && data[ index ].stop ) { + stopQueue( data[ index ] ); + } + } else { + for ( index in data ) { + if ( data[ index ] && data[ index ].stop && rrun.test( index ) ) { + stopQueue( data[ index ] ); + } + } + } + + for ( index = timers.length; index--; ) { + if ( timers[ index ].elem === this && (type == null || timers[ index ].queue === type) ) { + timers[ index ].anim.stop( gotoEnd ); + dequeue = false; + timers.splice( index, 1 ); + } + } + + // start the next in the queue if the last step wasn't forced + // timers currently will call their complete callbacks, which will dequeue + // but only if they were gotoEnd + if ( dequeue || !gotoEnd ) { + jQuery.dequeue( this, type ); + } + }); + } +}); + +// Generate parameters to create a standard animation +function genFx( type, includeWidth ) { + var which, + attrs = { height: type }, + i = 0; + + // if we include width, step value is 1 to do all cssExpand values, + // if we don't include width, step value is 2 to skip over Left and Right + includeWidth = includeWidth? 1 : 0; + for( ; i < 4 ; i += 2 - includeWidth ) { + which = cssExpand[ i ]; + attrs[ "margin" + which ] = attrs[ "padding" + which ] = type; + } + + if ( includeWidth ) { + attrs.opacity = attrs.width = type; + } + + return attrs; +} + +// Generate shortcuts for custom animations +jQuery.each({ + slideDown: genFx("show"), + slideUp: genFx("hide"), + slideToggle: genFx("toggle"), + fadeIn: { opacity: "show" }, + fadeOut: { opacity: "hide" }, + fadeToggle: { opacity: "toggle" } +}, function( name, props ) { + jQuery.fn[ name ] = function( speed, easing, callback ) { + return this.animate( props, speed, easing, callback ); + }; +}); + +jQuery.speed = function( speed, easing, fn ) { + var opt = speed && typeof speed === "object" ? jQuery.extend( {}, speed ) : { + complete: fn || !fn && easing || + jQuery.isFunction( speed ) && speed, + duration: speed, + easing: fn && easing || easing && !jQuery.isFunction( easing ) && easing + }; + + opt.duration = jQuery.fx.off ? 0 : typeof opt.duration === "number" ? opt.duration : + opt.duration in jQuery.fx.speeds ? jQuery.fx.speeds[ opt.duration ] : jQuery.fx.speeds._default; + + // normalize opt.queue - true/undefined/null -> "fx" + if ( opt.queue == null || opt.queue === true ) { + opt.queue = "fx"; + } + + // Queueing + opt.old = opt.complete; + + opt.complete = function() { + if ( jQuery.isFunction( opt.old ) ) { + opt.old.call( this ); + } + + if ( opt.queue ) { + jQuery.dequeue( this, opt.queue ); + } + }; + + return opt; +}; + +jQuery.easing = { + linear: function( p ) { + return p; + }, + swing: function( p ) { + return 0.5 - Math.cos( p*Math.PI ) / 2; + } +}; + +jQuery.timers = []; +jQuery.fx = Tween.prototype.init; +jQuery.fx.tick = function() { + var timer, + timers = jQuery.timers, + i = 0; + + for ( ; i < timers.length; i++ ) { + timer = timers[ i ]; + // Checks the timer has not already been removed + if ( !timer() && timers[ i ] === timer ) { + timers.splice( i--, 1 ); + } + } + + if ( !timers.length ) { + jQuery.fx.stop(); + } +}; + +jQuery.fx.timer = function( timer ) { + if ( timer() && jQuery.timers.push( timer ) && !timerId ) { + timerId = setInterval( jQuery.fx.tick, jQuery.fx.interval ); + } +}; + +jQuery.fx.interval = 13; + +jQuery.fx.stop = function() { + clearInterval( timerId ); + timerId = null; +}; + +jQuery.fx.speeds = { + slow: 600, + fast: 200, + // Default speed + _default: 400 +}; + +// Back Compat <1.8 extension point +jQuery.fx.step = {}; + +if ( jQuery.expr && jQuery.expr.filters ) { + jQuery.expr.filters.animated = function( elem ) { + return jQuery.grep(jQuery.timers, function( fn ) { + return elem === fn.elem; + }).length; + }; +} +var rroot = /^(?:body|html)$/i; + +jQuery.fn.offset = function( options ) { + if ( arguments.length ) { + return options === undefined ? + this : + this.each(function( i ) { + jQuery.offset.setOffset( this, options, i ); + }); + } + + var docElem, body, win, clientTop, clientLeft, scrollTop, scrollLeft, + box = { top: 0, left: 0 }, + elem = this[ 0 ], + doc = elem && elem.ownerDocument; + + if ( !doc ) { + return; + } + + if ( (body = doc.body) === elem ) { + return jQuery.offset.bodyOffset( elem ); + } + + docElem = doc.documentElement; + + // Make sure it's not a disconnected DOM node + if ( !jQuery.contains( docElem, elem ) ) { + return box; + } + + // If we don't have gBCR, just use 0,0 rather than error + // BlackBerry 5, iOS 3 (original iPhone) + if ( typeof elem.getBoundingClientRect !== "undefined" ) { + box = elem.getBoundingClientRect(); + } + win = getWindow( doc ); + clientTop = docElem.clientTop || body.clientTop || 0; + clientLeft = docElem.clientLeft || body.clientLeft || 0; + scrollTop = win.pageYOffset || docElem.scrollTop; + scrollLeft = win.pageXOffset || docElem.scrollLeft; + return { + top: box.top + scrollTop - clientTop, + left: box.left + scrollLeft - clientLeft + }; +}; + +jQuery.offset = { + + bodyOffset: function( body ) { + var top = body.offsetTop, + left = body.offsetLeft; + + if ( jQuery.support.doesNotIncludeMarginInBodyOffset ) { + top += parseFloat( jQuery.css(body, "marginTop") ) || 0; + left += parseFloat( jQuery.css(body, "marginLeft") ) || 0; + } + + return { top: top, left: left }; + }, + + setOffset: function( elem, options, i ) { + var position = jQuery.css( elem, "position" ); + + // set position first, in-case top/left are set even on static elem + if ( position === "static" ) { + elem.style.position = "relative"; + } + + var curElem = jQuery( elem ), + curOffset = curElem.offset(), + curCSSTop = jQuery.css( elem, "top" ), + curCSSLeft = jQuery.css( elem, "left" ), + calculatePosition = ( position === "absolute" || position === "fixed" ) && jQuery.inArray("auto", [curCSSTop, curCSSLeft]) > -1, + props = {}, curPosition = {}, curTop, curLeft; + + // need to be able to calculate position if either top or left is auto and position is either absolute or fixed + if ( calculatePosition ) { + curPosition = curElem.position(); + curTop = curPosition.top; + curLeft = curPosition.left; + } else { + curTop = parseFloat( curCSSTop ) || 0; + curLeft = parseFloat( curCSSLeft ) || 0; + } + + if ( jQuery.isFunction( options ) ) { + options = options.call( elem, i, curOffset ); + } + + if ( options.top != null ) { + props.top = ( options.top - curOffset.top ) + curTop; + } + if ( options.left != null ) { + props.left = ( options.left - curOffset.left ) + curLeft; + } + + if ( "using" in options ) { + options.using.call( elem, props ); + } else { + curElem.css( props ); + } + } +}; + + +jQuery.fn.extend({ + + position: function() { + if ( !this[0] ) { + return; + } + + var elem = this[0], + + // Get *real* offsetParent + offsetParent = this.offsetParent(), + + // Get correct offsets + offset = this.offset(), + parentOffset = rroot.test(offsetParent[0].nodeName) ? { top: 0, left: 0 } : offsetParent.offset(); + + // Subtract element margins + // note: when an element has margin: auto the offsetLeft and marginLeft + // are the same in Safari causing offset.left to incorrectly be 0 + offset.top -= parseFloat( jQuery.css(elem, "marginTop") ) || 0; + offset.left -= parseFloat( jQuery.css(elem, "marginLeft") ) || 0; + + // Add offsetParent borders + parentOffset.top += parseFloat( jQuery.css(offsetParent[0], "borderTopWidth") ) || 0; + parentOffset.left += parseFloat( jQuery.css(offsetParent[0], "borderLeftWidth") ) || 0; + + // Subtract the two offsets + return { + top: offset.top - parentOffset.top, + left: offset.left - parentOffset.left + }; + }, + + offsetParent: function() { + return this.map(function() { + var offsetParent = this.offsetParent || document.body; + while ( offsetParent && (!rroot.test(offsetParent.nodeName) && jQuery.css(offsetParent, "position") === "static") ) { + offsetParent = offsetParent.offsetParent; + } + return offsetParent || document.body; + }); + } +}); + + +// Create scrollLeft and scrollTop methods +jQuery.each( {scrollLeft: "pageXOffset", scrollTop: "pageYOffset"}, function( method, prop ) { + var top = /Y/.test( prop ); + + jQuery.fn[ method ] = function( val ) { + return jQuery.access( this, function( elem, method, val ) { + var win = getWindow( elem ); + + if ( val === undefined ) { + return win ? (prop in win) ? win[ prop ] : + win.document.documentElement[ method ] : + elem[ method ]; + } + + if ( win ) { + win.scrollTo( + !top ? val : jQuery( win ).scrollLeft(), + top ? val : jQuery( win ).scrollTop() + ); + + } else { + elem[ method ] = val; + } + }, method, val, arguments.length, null ); + }; +}); + +function getWindow( elem ) { + return jQuery.isWindow( elem ) ? + elem : + elem.nodeType === 9 ? + elem.defaultView || elem.parentWindow : + false; +} +// Create innerHeight, innerWidth, height, width, outerHeight and outerWidth methods +jQuery.each( { Height: "height", Width: "width" }, function( name, type ) { + jQuery.each( { padding: "inner" + name, content: type, "": "outer" + name }, function( defaultExtra, funcName ) { + // margin is only for outerHeight, outerWidth + jQuery.fn[ funcName ] = function( margin, value ) { + var chainable = arguments.length && ( defaultExtra || typeof margin !== "boolean" ), + extra = defaultExtra || ( margin === true || value === true ? "margin" : "border" ); + + return jQuery.access( this, function( elem, type, value ) { + var doc; + + if ( jQuery.isWindow( elem ) ) { + // As of 5/8/2012 this will yield incorrect results for Mobile Safari, but there + // isn't a whole lot we can do. See pull request at this URL for discussion: + // https://github.com/jquery/jquery/pull/764 + return elem.document.documentElement[ "client" + name ]; + } + + // Get document width or height + if ( elem.nodeType === 9 ) { + doc = elem.documentElement; + + // Either scroll[Width/Height] or offset[Width/Height] or client[Width/Height], whichever is greatest + // unfortunately, this causes bug #3838 in IE6/8 only, but there is currently no good, small way to fix it. + return Math.max( + elem.body[ "scroll" + name ], doc[ "scroll" + name ], + elem.body[ "offset" + name ], doc[ "offset" + name ], + doc[ "client" + name ] + ); + } + + return value === undefined ? + // Get width or height on the element, requesting but not forcing parseFloat + jQuery.css( elem, type, value, extra ) : + + // Set width or height on the element + jQuery.style( elem, type, value, extra ); + }, type, chainable ? margin : undefined, chainable, null ); + }; + }); +}); +// Expose jQuery to the global object +window.jQuery = window.$ = jQuery; + +// Expose jQuery as an AMD module, but only for AMD loaders that +// understand the issues with loading multiple versions of jQuery +// in a page that all might call define(). The loader will indicate +// they have special allowances for multiple jQuery versions by +// specifying define.amd.jQuery = true. Register as a named module, +// since jQuery can be concatenated with other files that may use define, +// but not use a proper concatenation script that understands anonymous +// AMD modules. A named AMD is safest and most robust way to register. +// Lowercase jquery is used because AMD module names are derived from +// file names, and jQuery is normally delivered in a lowercase file name. +// Do this after creating the global so that if an AMD module wants to call +// noConflict to hide this version of jQuery, it will work. +if ( typeof define === "function" && define.amd && define.amd.jQuery ) { + define( "jquery", [], function () { return jQuery; } ); +} + +})( window ); + +/** + * @license AngularJS v1.1.5 + * (c) 2010-2012 Google, Inc. http://angularjs.org + * License: MIT + */ +(function(window, document){ + var _jQuery = window.jQuery.noConflict(true); + +//////////////////////////////////// + +/** + * @ngdoc function + * @name angular.lowercase + * @function + * + * @description Converts the specified string to lowercase. + * @param {string} string String to be converted to lowercase. + * @returns {string} Lowercased string. + */ +var lowercase = function(string){return isString(string) ? string.toLowerCase() : string;}; + + +/** + * @ngdoc function + * @name angular.uppercase + * @function + * + * @description Converts the specified string to uppercase. + * @param {string} string String to be converted to uppercase. + * @returns {string} Uppercased string. + */ +var uppercase = function(string){return isString(string) ? string.toUpperCase() : string;}; + + +var manualLowercase = function(s) { + return isString(s) + ? s.replace(/[A-Z]/g, function(ch) {return String.fromCharCode(ch.charCodeAt(0) | 32);}) + : s; +}; +var manualUppercase = function(s) { + return isString(s) + ? s.replace(/[a-z]/g, function(ch) {return String.fromCharCode(ch.charCodeAt(0) & ~32);}) + : s; +}; + + +// String#toLowerCase and String#toUpperCase don't produce correct results in browsers with Turkish +// locale, for this reason we need to detect this case and redefine lowercase/uppercase methods +// with correct but slower alternatives. +if ('i' !== 'I'.toLowerCase()) { + lowercase = manualLowercase; + uppercase = manualUppercase; +} + + +var /** holds major version number for IE or NaN for real browsers */ + msie = int((/msie (\d+)/.exec(lowercase(navigator.userAgent)) || [])[1]), + jqLite, // delay binding since jQuery could be loaded after us. + jQuery, // delay binding + slice = [].slice, + push = [].push, + toString = Object.prototype.toString, + + + _angular = window.angular, + /** @name angular */ + angular = window.angular || (window.angular = {}), + angularModule, + nodeName_, + uid = ['0', '0', '0']; + +/** + * @ngdoc function + * @name angular.noConflict + * @function + * + * @description + * Restores the previous global value of angular and returns the current instance. Other libraries may already use the + * angular namespace. Or a previous version of angular is already loaded on the page. In these cases you may want to + * restore the previous namespace and keep a reference to angular. + * + * @return {Object} The current angular namespace + */ +function noConflict() { + var a = window.angular; + window.angular = _angular; + return a; +} + +/** + * @private + * @param {*} obj + * @return {boolean} Returns true if `obj` is an array or array-like object (NodeList, Arguments, ...) + */ +function isArrayLike(obj) { + if (!obj || (typeof obj.length !== 'number')) return false; + + // We have on object which has length property. Should we treat it as array? + if (typeof obj.hasOwnProperty != 'function' && + typeof obj.constructor != 'function') { + // This is here for IE8: it is a bogus object treat it as array; + return true; + } else { + return obj instanceof JQLite || // JQLite + (jQuery && obj instanceof jQuery) || // jQuery + toString.call(obj) !== '[object Object]' || // some browser native object + typeof obj.callee === 'function'; // arguments (on IE8 looks like regular obj) + } +} + +/** + * @ngdoc function + * @name angular.forEach + * @function + * + * @description + * Invokes the `iterator` function once for each item in `obj` collection, which can be either an + * object or an array. The `iterator` function is invoked with `iterator(value, key)`, where `value` + * is the value of an object property or an array element and `key` is the object property key or + * array element index. Specifying a `context` for the function is optional. + * + * Note: this function was previously known as `angular.foreach`. + * +
    +     var values = {name: 'misko', gender: 'male'};
    +     var log = [];
    +     angular.forEach(values, function(value, key){
    +       this.push(key + ': ' + value);
    +     }, log);
    +     expect(log).toEqual(['name: misko', 'gender:male']);
    +   
    + * + * @param {Object|Array} obj Object to iterate over. + * @param {Function} iterator Iterator function. + * @param {Object=} context Object to become context (`this`) for the iterator function. + * @returns {Object|Array} Reference to `obj`. + */ +function forEach(obj, iterator, context) { + var key; + if (obj) { + if (isFunction(obj)){ + for (key in obj) { + if (key != 'prototype' && key != 'length' && key != 'name' && obj.hasOwnProperty(key)) { + iterator.call(context, obj[key], key); + } + } + } else if (obj.forEach && obj.forEach !== forEach) { + obj.forEach(iterator, context); + } else if (isArrayLike(obj)) { + for (key = 0; key < obj.length; key++) + iterator.call(context, obj[key], key); + } else { + for (key in obj) { + if (obj.hasOwnProperty(key)) { + iterator.call(context, obj[key], key); + } + } + } + } + return obj; +} + +function sortedKeys(obj) { + var keys = []; + for (var key in obj) { + if (obj.hasOwnProperty(key)) { + keys.push(key); + } + } + return keys.sort(); +} + +function forEachSorted(obj, iterator, context) { + var keys = sortedKeys(obj); + for ( var i = 0; i < keys.length; i++) { + iterator.call(context, obj[keys[i]], keys[i]); + } + return keys; +} + + +/** + * when using forEach the params are value, key, but it is often useful to have key, value. + * @param {function(string, *)} iteratorFn + * @returns {function(*, string)} + */ +function reverseParams(iteratorFn) { + return function(value, key) { iteratorFn(key, value) }; +} + +/** + * A consistent way of creating unique IDs in angular. The ID is a sequence of alpha numeric + * characters such as '012ABC'. The reason why we are not using simply a number counter is that + * the number string gets longer over time, and it can also overflow, where as the nextId + * will grow much slower, it is a string, and it will never overflow. + * + * @returns an unique alpha-numeric string + */ +function nextUid() { + var index = uid.length; + var digit; + + while(index) { + index--; + digit = uid[index].charCodeAt(0); + if (digit == 57 /*'9'*/) { + uid[index] = 'A'; + return uid.join(''); + } + if (digit == 90 /*'Z'*/) { + uid[index] = '0'; + } else { + uid[index] = String.fromCharCode(digit + 1); + return uid.join(''); + } + } + uid.unshift('0'); + return uid.join(''); +} + + +/** + * Set or clear the hashkey for an object. + * @param obj object + * @param h the hashkey (!truthy to delete the hashkey) + */ +function setHashKey(obj, h) { + if (h) { + obj.$$hashKey = h; + } + else { + delete obj.$$hashKey; + } +} + +/** + * @ngdoc function + * @name angular.extend + * @function + * + * @description + * Extends the destination object `dst` by copying all of the properties from the `src` object(s) + * to `dst`. You can specify multiple `src` objects. + * + * @param {Object} dst Destination object. + * @param {...Object} src Source object(s). + * @returns {Object} Reference to `dst`. + */ +function extend(dst) { + var h = dst.$$hashKey; + forEach(arguments, function(obj){ + if (obj !== dst) { + forEach(obj, function(value, key){ + dst[key] = value; + }); + } + }); + + setHashKey(dst,h); + return dst; +} + +function int(str) { + return parseInt(str, 10); +} + + +function inherit(parent, extra) { + return extend(new (extend(function() {}, {prototype:parent}))(), extra); +} + +var START_SPACE = /^\s*/; +var END_SPACE = /\s*$/; +function stripWhitespace(str) { + return isString(str) ? str.replace(START_SPACE, '').replace(END_SPACE, '') : str; +} + +/** + * @ngdoc function + * @name angular.noop + * @function + * + * @description + * A function that performs no operations. This function can be useful when writing code in the + * functional style. +
    +     function foo(callback) {
    +       var result = calculateResult();
    +       (callback || angular.noop)(result);
    +     }
    +   
    + */ +function noop() {} +noop.$inject = []; + + +/** + * @ngdoc function + * @name angular.identity + * @function + * + * @description + * A function that returns its first argument. This function is useful when writing code in the + * functional style. + * +
    +     function transformer(transformationFn, value) {
    +       return (transformationFn || identity)(value);
    +     };
    +   
    + */ +function identity($) {return $;} +identity.$inject = []; + + +function valueFn(value) {return function() {return value;};} + +/** + * @ngdoc function + * @name angular.isUndefined + * @function + * + * @description + * Determines if a reference is undefined. + * + * @param {*} value Reference to check. + * @returns {boolean} True if `value` is undefined. + */ +function isUndefined(value){return typeof value == 'undefined';} + + +/** + * @ngdoc function + * @name angular.isDefined + * @function + * + * @description + * Determines if a reference is defined. + * + * @param {*} value Reference to check. + * @returns {boolean} True if `value` is defined. + */ +function isDefined(value){return typeof value != 'undefined';} + + +/** + * @ngdoc function + * @name angular.isObject + * @function + * + * @description + * Determines if a reference is an `Object`. Unlike `typeof` in JavaScript, `null`s are not + * considered to be objects. + * + * @param {*} value Reference to check. + * @returns {boolean} True if `value` is an `Object` but not `null`. + */ +function isObject(value){return value != null && typeof value == 'object';} + + +/** + * @ngdoc function + * @name angular.isString + * @function + * + * @description + * Determines if a reference is a `String`. + * + * @param {*} value Reference to check. + * @returns {boolean} True if `value` is a `String`. + */ +function isString(value){return typeof value == 'string';} + + +/** + * @ngdoc function + * @name angular.isNumber + * @function + * + * @description + * Determines if a reference is a `Number`. + * + * @param {*} value Reference to check. + * @returns {boolean} True if `value` is a `Number`. + */ +function isNumber(value){return typeof value == 'number';} + + +/** + * @ngdoc function + * @name angular.isDate + * @function + * + * @description + * Determines if a value is a date. + * + * @param {*} value Reference to check. + * @returns {boolean} True if `value` is a `Date`. + */ +function isDate(value){ + return toString.apply(value) == '[object Date]'; +} + + +/** + * @ngdoc function + * @name angular.isArray + * @function + * + * @description + * Determines if a reference is an `Array`. + * + * @param {*} value Reference to check. + * @returns {boolean} True if `value` is an `Array`. + */ +function isArray(value) { + return toString.apply(value) == '[object Array]'; +} + + +/** + * @ngdoc function + * @name angular.isFunction + * @function + * + * @description + * Determines if a reference is a `Function`. + * + * @param {*} value Reference to check. + * @returns {boolean} True if `value` is a `Function`. + */ +function isFunction(value){return typeof value == 'function';} + + +/** + * Checks if `obj` is a window object. + * + * @private + * @param {*} obj Object to check + * @returns {boolean} True if `obj` is a window obj. + */ +function isWindow(obj) { + return obj && obj.document && obj.location && obj.alert && obj.setInterval; +} + + +function isScope(obj) { + return obj && obj.$evalAsync && obj.$watch; +} + + +function isFile(obj) { + return toString.apply(obj) === '[object File]'; +} + + +function isBoolean(value) { + return typeof value == 'boolean'; +} + + +function trim(value) { + return isString(value) ? value.replace(/^\s*/, '').replace(/\s*$/, '') : value; +} + +/** + * @ngdoc function + * @name angular.isElement + * @function + * + * @description + * Determines if a reference is a DOM element (or wrapped jQuery element). + * + * @param {*} value Reference to check. + * @returns {boolean} True if `value` is a DOM element (or wrapped jQuery element). + */ +function isElement(node) { + return node && + (node.nodeName // we are a direct element + || (node.bind && node.find)); // we have a bind and find method part of jQuery API +} + +/** + * @param str 'key1,key2,...' + * @returns {object} in the form of {key1:true, key2:true, ...} + */ +function makeMap(str){ + var obj = {}, items = str.split(","), i; + for ( i = 0; i < items.length; i++ ) + obj[ items[i] ] = true; + return obj; +} + + +if (msie < 9) { + nodeName_ = function(element) { + element = element.nodeName ? element : element[0]; + return (element.scopeName && element.scopeName != 'HTML') + ? uppercase(element.scopeName + ':' + element.nodeName) : element.nodeName; + }; +} else { + nodeName_ = function(element) { + return element.nodeName ? element.nodeName : element[0].nodeName; + }; +} + + +function map(obj, iterator, context) { + var results = []; + forEach(obj, function(value, index, list) { + results.push(iterator.call(context, value, index, list)); + }); + return results; +} + + +/** + * @description + * Determines the number of elements in an array, the number of properties an object has, or + * the length of a string. + * + * Note: This function is used to augment the Object type in Angular expressions. See + * {@link angular.Object} for more information about Angular arrays. + * + * @param {Object|Array|string} obj Object, array, or string to inspect. + * @param {boolean} [ownPropsOnly=false] Count only "own" properties in an object + * @returns {number} The size of `obj` or `0` if `obj` is neither an object nor an array. + */ +function size(obj, ownPropsOnly) { + var size = 0, key; + + if (isArray(obj) || isString(obj)) { + return obj.length; + } else if (isObject(obj)){ + for (key in obj) + if (!ownPropsOnly || obj.hasOwnProperty(key)) + size++; + } + + return size; +} + + +function includes(array, obj) { + return indexOf(array, obj) != -1; +} + +function indexOf(array, obj) { + if (array.indexOf) return array.indexOf(obj); + + for ( var i = 0; i < array.length; i++) { + if (obj === array[i]) return i; + } + return -1; +} + +function arrayRemove(array, value) { + var index = indexOf(array, value); + if (index >=0) + array.splice(index, 1); + return value; +} + +function isLeafNode (node) { + if (node) { + switch (node.nodeName) { + case "OPTION": + case "PRE": + case "TITLE": + return true; + } + } + return false; +} + +/** + * @ngdoc function + * @name angular.copy + * @function + * + * @description + * Creates a deep copy of `source`, which should be an object or an array. + * + * * If no destination is supplied, a copy of the object or array is created. + * * If a destination is provided, all of its elements (for array) or properties (for objects) + * are deleted and then all elements/properties from the source are copied to it. + * * If `source` is not an object or array, `source` is returned. + * + * Note: this function is used to augment the Object type in Angular expressions. See + * {@link ng.$filter} for more information about Angular arrays. + * + * @param {*} source The source that will be used to make a copy. + * Can be any type, including primitives, `null`, and `undefined`. + * @param {(Object|Array)=} destination Destination into which the source is copied. If + * provided, must be of the same type as `source`. + * @returns {*} The copy or updated `destination`, if `destination` was specified. + */ +function copy(source, destination){ + if (isWindow(source) || isScope(source)) throw Error("Can't copy Window or Scope"); + if (!destination) { + destination = source; + if (source) { + if (isArray(source)) { + destination = copy(source, []); + } else if (isDate(source)) { + destination = new Date(source.getTime()); + } else if (isObject(source)) { + destination = copy(source, {}); + } + } + } else { + if (source === destination) throw Error("Can't copy equivalent objects or arrays"); + if (isArray(source)) { + destination.length = 0; + for ( var i = 0; i < source.length; i++) { + destination.push(copy(source[i])); + } + } else { + var h = destination.$$hashKey; + forEach(destination, function(value, key){ + delete destination[key]; + }); + for ( var key in source) { + destination[key] = copy(source[key]); + } + setHashKey(destination,h); + } + } + return destination; +} + +/** + * Create a shallow copy of an object + */ +function shallowCopy(src, dst) { + dst = dst || {}; + + for(var key in src) { + if (src.hasOwnProperty(key) && key.substr(0, 2) !== '$$') { + dst[key] = src[key]; + } + } + + return dst; +} + + +/** + * @ngdoc function + * @name angular.equals + * @function + * + * @description + * Determines if two objects or two values are equivalent. Supports value types, arrays and + * objects. + * + * Two objects or values are considered equivalent if at least one of the following is true: + * + * * Both objects or values pass `===` comparison. + * * Both objects or values are of the same type and all of their properties pass `===` comparison. + * * Both values are NaN. (In JavasScript, NaN == NaN => false. But we consider two NaN as equal) + * + * During a property comparison, properties of `function` type and properties with names + * that begin with `$` are ignored. + * + * Scope and DOMWindow objects are being compared only by identify (`===`). + * + * @param {*} o1 Object or value to compare. + * @param {*} o2 Object or value to compare. + * @returns {boolean} True if arguments are equal. + */ +function equals(o1, o2) { + if (o1 === o2) return true; + if (o1 === null || o2 === null) return false; + if (o1 !== o1 && o2 !== o2) return true; // NaN === NaN + var t1 = typeof o1, t2 = typeof o2, length, key, keySet; + if (t1 == t2) { + if (t1 == 'object') { + if (isArray(o1)) { + if ((length = o1.length) == o2.length) { + for(key=0; key 2 ? sliceArgs(arguments, 2) : []; + if (isFunction(fn) && !(fn instanceof RegExp)) { + return curryArgs.length + ? function() { + return arguments.length + ? fn.apply(self, curryArgs.concat(slice.call(arguments, 0))) + : fn.apply(self, curryArgs); + } + : function() { + return arguments.length + ? fn.apply(self, arguments) + : fn.call(self); + }; + } else { + // in IE, native methods are not functions so they cannot be bound (note: they don't need to be) + return fn; + } +} + + +function toJsonReplacer(key, value) { + var val = value; + + if (/^\$+/.test(key)) { + val = undefined; + } else if (isWindow(value)) { + val = '$WINDOW'; + } else if (value && document === value) { + val = '$DOCUMENT'; + } else if (isScope(value)) { + val = '$SCOPE'; + } + + return val; +} + + +/** + * @ngdoc function + * @name angular.toJson + * @function + * + * @description + * Serializes input into a JSON-formatted string. + * + * @param {Object|Array|Date|string|number} obj Input to be serialized into JSON. + * @param {boolean=} pretty If set to true, the JSON output will contain newlines and whitespace. + * @returns {string} Jsonified string representing `obj`. + */ +function toJson(obj, pretty) { + return JSON.stringify(obj, toJsonReplacer, pretty ? ' ' : null); +} + + +/** + * @ngdoc function + * @name angular.fromJson + * @function + * + * @description + * Deserializes a JSON string. + * + * @param {string} json JSON string to deserialize. + * @returns {Object|Array|Date|string|number} Deserialized thingy. + */ +function fromJson(json) { + return isString(json) + ? JSON.parse(json) + : json; +} + + +function toBoolean(value) { + if (value && value.length !== 0) { + var v = lowercase("" + value); + value = !(v == 'f' || v == '0' || v == 'false' || v == 'no' || v == 'n' || v == '[]'); + } else { + value = false; + } + return value; +} + +/** + * @returns {string} Returns the string representation of the element. + */ +function startingTag(element) { + element = jqLite(element).clone(); + try { + // turns out IE does not let you set .html() on elements which + // are not allowed to have children. So we just ignore it. + element.html(''); + } catch(e) {} + // As Per DOM Standards + var TEXT_NODE = 3; + var elemHtml = jqLite('
    ').append(element).html(); + try { + return element[0].nodeType === TEXT_NODE ? lowercase(elemHtml) : + elemHtml. + match(/^(<[^>]+>)/)[1]. + replace(/^<([\w\-]+)/, function(match, nodeName) { return '<' + lowercase(nodeName); }); + } catch(e) { + return lowercase(elemHtml); + } + +} + + +///////////////////////////////////////////////// + +/** + * Parses an escaped url query string into key-value pairs. + * @returns Object.<(string|boolean)> + */ +function parseKeyValue(/**string*/keyValue) { + var obj = {}, key_value, key; + forEach((keyValue || "").split('&'), function(keyValue){ + if (keyValue) { + key_value = keyValue.split('='); + key = decodeURIComponent(key_value[0]); + obj[key] = isDefined(key_value[1]) ? decodeURIComponent(key_value[1]) : true; + } + }); + return obj; +} + +function toKeyValue(obj) { + var parts = []; + forEach(obj, function(value, key) { + parts.push(encodeUriQuery(key, true) + (value === true ? '' : '=' + encodeUriQuery(value, true))); + }); + return parts.length ? parts.join('&') : ''; +} + + +/** + * We need our custom method because encodeURIComponent is too aggressive and doesn't follow + * http://www.ietf.org/rfc/rfc3986.txt with regards to the character set (pchar) allowed in path + * segments: + * segment = *pchar + * pchar = unreserved / pct-encoded / sub-delims / ":" / "@" + * pct-encoded = "%" HEXDIG HEXDIG + * unreserved = ALPHA / DIGIT / "-" / "." / "_" / "~" + * sub-delims = "!" / "$" / "&" / "'" / "(" / ")" + * / "*" / "+" / "," / ";" / "=" + */ +function encodeUriSegment(val) { + return encodeUriQuery(val, true). + replace(/%26/gi, '&'). + replace(/%3D/gi, '='). + replace(/%2B/gi, '+'); +} + + +/** + * This method is intended for encoding *key* or *value* parts of query component. We need a custom + * method because encodeURIComponent is too aggressive and encodes stuff that doesn't have to be + * encoded per http://tools.ietf.org/html/rfc3986: + * query = *( pchar / "/" / "?" ) + * pchar = unreserved / pct-encoded / sub-delims / ":" / "@" + * unreserved = ALPHA / DIGIT / "-" / "." / "_" / "~" + * pct-encoded = "%" HEXDIG HEXDIG + * sub-delims = "!" / "$" / "&" / "'" / "(" / ")" + * / "*" / "+" / "," / ";" / "=" + */ +function encodeUriQuery(val, pctEncodeSpaces) { + return encodeURIComponent(val). + replace(/%40/gi, '@'). + replace(/%3A/gi, ':'). + replace(/%24/g, '$'). + replace(/%2C/gi, ','). + replace(/%20/g, (pctEncodeSpaces ? '%20' : '+')); +} + + +/** + * @ngdoc directive + * @name ng.directive:ngApp + * + * @element ANY + * @param {angular.Module} ngApp an optional application + * {@link angular.module module} name to load. + * + * @description + * + * Use this directive to auto-bootstrap an application. Only + * one directive can be used per HTML document. The directive + * designates the root of the application and is typically placed + * at the root of the page. + * + * In the example below if the `ngApp` directive would not be placed + * on the `html` element then the document would not be compiled + * and the `{{ 1+2 }}` would not be resolved to `3`. + * + * `ngApp` is the easiest way to bootstrap an application. + * + + + I can add: 1 + 2 = {{ 1+2 }} + + + * + */ +function angularInit(element, bootstrap) { + var elements = [element], + appElement, + module, + names = ['ng:app', 'ng-app', 'x-ng-app', 'data-ng-app'], + NG_APP_CLASS_REGEXP = /\sng[:\-]app(:\s*([\w\d_]+);?)?\s/; + + function append(element) { + element && elements.push(element); + } + + forEach(names, function(name) { + names[name] = true; + append(document.getElementById(name)); + name = name.replace(':', '\\:'); + if (element.querySelectorAll) { + forEach(element.querySelectorAll('.' + name), append); + forEach(element.querySelectorAll('.' + name + '\\:'), append); + forEach(element.querySelectorAll('[' + name + ']'), append); + } + }); + + forEach(elements, function(element) { + if (!appElement) { + var className = ' ' + element.className + ' '; + var match = NG_APP_CLASS_REGEXP.exec(className); + if (match) { + appElement = element; + module = (match[2] || '').replace(/\s+/g, ','); + } else { + forEach(element.attributes, function(attr) { + if (!appElement && names[attr.name]) { + appElement = element; + module = attr.value; + } + }); + } + } + }); + if (appElement) { + bootstrap(appElement, module ? [module] : []); + } +} + +/** + * @ngdoc function + * @name angular.bootstrap + * @description + * Use this function to manually start up angular application. + * + * See: {@link guide/bootstrap Bootstrap} + * + * @param {Element} element DOM element which is the root of angular application. + * @param {Array=} modules an array of module declarations. See: {@link angular.module modules} + * @returns {AUTO.$injector} Returns the newly created injector for this app. + */ +function bootstrap(element, modules) { + var resumeBootstrapInternal = function() { + element = jqLite(element); + modules = modules || []; + modules.unshift(['$provide', function($provide) { + $provide.value('$rootElement', element); + }]); + modules.unshift('ng'); + var injector = createInjector(modules); + injector.invoke(['$rootScope', '$rootElement', '$compile', '$injector', '$animator', + function(scope, element, compile, injector, animator) { + scope.$apply(function() { + element.data('$injector', injector); + compile(element)(scope); + }); + animator.enabled(true); + }] + ); + return injector; + }; + + var NG_DEFER_BOOTSTRAP = /^NG_DEFER_BOOTSTRAP!/; + + if (window && !NG_DEFER_BOOTSTRAP.test(window.name)) { + return resumeBootstrapInternal(); + } + + window.name = window.name.replace(NG_DEFER_BOOTSTRAP, ''); + angular.resumeBootstrap = function(extraModules) { + forEach(extraModules, function(module) { + modules.push(module); + }); + resumeBootstrapInternal(); + }; +} + +var SNAKE_CASE_REGEXP = /[A-Z]/g; +function snake_case(name, separator){ + separator = separator || '_'; + return name.replace(SNAKE_CASE_REGEXP, function(letter, pos) { + return (pos ? separator : '') + letter.toLowerCase(); + }); +} + +function bindJQuery() { + // bind to jQuery if present; + jQuery = window.jQuery; + // reset to jQuery or default to us. + if (jQuery) { + jqLite = jQuery; + extend(jQuery.fn, { + scope: JQLitePrototype.scope, + controller: JQLitePrototype.controller, + injector: JQLitePrototype.injector, + inheritedData: JQLitePrototype.inheritedData + }); + JQLitePatchJQueryRemove('remove', true); + JQLitePatchJQueryRemove('empty'); + JQLitePatchJQueryRemove('html'); + } else { + jqLite = JQLite; + } + angular.element = jqLite; +} + +/** + * throw error if the argument is falsy. + */ +function assertArg(arg, name, reason) { + if (!arg) { + throw new Error("Argument '" + (name || '?') + "' is " + (reason || "required")); + } + return arg; +} + +function assertArgFn(arg, name, acceptArrayAnnotation) { + if (acceptArrayAnnotation && isArray(arg)) { + arg = arg[arg.length - 1]; + } + + assertArg(isFunction(arg), name, 'not a function, got ' + + (arg && typeof arg == 'object' ? arg.constructor.name || 'Object' : typeof arg)); + return arg; +} + +/** + * @ngdoc interface + * @name angular.Module + * @description + * + * Interface for configuring angular {@link angular.module modules}. + */ + +function setupModuleLoader(window) { + + function ensure(obj, name, factory) { + return obj[name] || (obj[name] = factory()); + } + + return ensure(ensure(window, 'angular', Object), 'module', function() { + /** @type {Object.} */ + var modules = {}; + + /** + * @ngdoc function + * @name angular.module + * @description + * + * The `angular.module` is a global place for creating and registering Angular modules. All + * modules (angular core or 3rd party) that should be available to an application must be + * registered using this mechanism. + * + * + * # Module + * + * A module is a collocation of services, directives, filters, and configuration information. Module + * is used to configure the {@link AUTO.$injector $injector}. + * + *
    +     * // Create a new module
    +     * var myModule = angular.module('myModule', []);
    +     *
    +     * // register a new service
    +     * myModule.value('appName', 'MyCoolApp');
    +     *
    +     * // configure existing services inside initialization blocks.
    +     * myModule.config(function($locationProvider) {
    +     *   // Configure existing providers
    +     *   $locationProvider.hashPrefix('!');
    +     * });
    +     * 
    + * + * Then you can create an injector and load your modules like this: + * + *
    +     * var injector = angular.injector(['ng', 'MyModule'])
    +     * 
    + * + * However it's more likely that you'll just use + * {@link ng.directive:ngApp ngApp} or + * {@link angular.bootstrap} to simplify this process for you. + * + * @param {!string} name The name of the module to create or retrieve. + * @param {Array.=} requires If specified then new module is being created. If unspecified then the + * the module is being retrieved for further configuration. + * @param {Function} configFn Optional configuration function for the module. Same as + * {@link angular.Module#config Module#config()}. + * @returns {module} new module with the {@link angular.Module} api. + */ + return function module(name, requires, configFn) { + if (requires && modules.hasOwnProperty(name)) { + modules[name] = null; + } + return ensure(modules, name, function() { + if (!requires) { + throw Error('No module: ' + name); + } + + /** @type {!Array.>} */ + var invokeQueue = []; + + /** @type {!Array.} */ + var runBlocks = []; + + var config = invokeLater('$injector', 'invoke'); + + /** @type {angular.Module} */ + var moduleInstance = { + // Private state + _invokeQueue: invokeQueue, + _runBlocks: runBlocks, + + /** + * @ngdoc property + * @name angular.Module#requires + * @propertyOf angular.Module + * @returns {Array.} List of module names which must be loaded before this module. + * @description + * Holds the list of modules which the injector will load before the current module is loaded. + */ + requires: requires, + + /** + * @ngdoc property + * @name angular.Module#name + * @propertyOf angular.Module + * @returns {string} Name of the module. + * @description + */ + name: name, + + + /** + * @ngdoc method + * @name angular.Module#provider + * @methodOf angular.Module + * @param {string} name service name + * @param {Function} providerType Construction function for creating new instance of the service. + * @description + * See {@link AUTO.$provide#provider $provide.provider()}. + */ + provider: invokeLater('$provide', 'provider'), + + /** + * @ngdoc method + * @name angular.Module#factory + * @methodOf angular.Module + * @param {string} name service name + * @param {Function} providerFunction Function for creating new instance of the service. + * @description + * See {@link AUTO.$provide#factory $provide.factory()}. + */ + factory: invokeLater('$provide', 'factory'), + + /** + * @ngdoc method + * @name angular.Module#service + * @methodOf angular.Module + * @param {string} name service name + * @param {Function} constructor A constructor function that will be instantiated. + * @description + * See {@link AUTO.$provide#service $provide.service()}. + */ + service: invokeLater('$provide', 'service'), + + /** + * @ngdoc method + * @name angular.Module#value + * @methodOf angular.Module + * @param {string} name service name + * @param {*} object Service instance object. + * @description + * See {@link AUTO.$provide#value $provide.value()}. + */ + value: invokeLater('$provide', 'value'), + + /** + * @ngdoc method + * @name angular.Module#constant + * @methodOf angular.Module + * @param {string} name constant name + * @param {*} object Constant value. + * @description + * Because the constant are fixed, they get applied before other provide methods. + * See {@link AUTO.$provide#constant $provide.constant()}. + */ + constant: invokeLater('$provide', 'constant', 'unshift'), + + /** + * @ngdoc method + * @name angular.Module#animation + * @methodOf angular.Module + * @param {string} name animation name + * @param {Function} animationFactory Factory function for creating new instance of an animation. + * @description + * + * Defines an animation hook that can be later used with {@link ng.directive:ngAnimate ngAnimate} + * alongside {@link ng.directive:ngAnimate#Description common ng directives} as well as custom directives. + *
    +           * module.animation('animation-name', function($inject1, $inject2) {
    +           *   return {
    +           *     //this gets called in preparation to setup an animation
    +           *     setup : function(element) { ... },
    +           *
    +           *     //this gets called once the animation is run
    +           *     start : function(element, done, memo) { ... }
    +           *   }
    +           * })
    +           * 
    + * + * See {@link ng.$animationProvider#register $animationProvider.register()} and + * {@link ng.directive:ngAnimate ngAnimate} for more information. + */ + animation: invokeLater('$animationProvider', 'register'), + + /** + * @ngdoc method + * @name angular.Module#filter + * @methodOf angular.Module + * @param {string} name Filter name. + * @param {Function} filterFactory Factory function for creating new instance of filter. + * @description + * See {@link ng.$filterProvider#register $filterProvider.register()}. + */ + filter: invokeLater('$filterProvider', 'register'), + + /** + * @ngdoc method + * @name angular.Module#controller + * @methodOf angular.Module + * @param {string} name Controller name. + * @param {Function} constructor Controller constructor function. + * @description + * See {@link ng.$controllerProvider#register $controllerProvider.register()}. + */ + controller: invokeLater('$controllerProvider', 'register'), + + /** + * @ngdoc method + * @name angular.Module#directive + * @methodOf angular.Module + * @param {string} name directive name + * @param {Function} directiveFactory Factory function for creating new instance of + * directives. + * @description + * See {@link ng.$compileProvider#directive $compileProvider.directive()}. + */ + directive: invokeLater('$compileProvider', 'directive'), + + /** + * @ngdoc method + * @name angular.Module#config + * @methodOf angular.Module + * @param {Function} configFn Execute this function on module load. Useful for service + * configuration. + * @description + * Use this method to register work which needs to be performed on module loading. + */ + config: config, + + /** + * @ngdoc method + * @name angular.Module#run + * @methodOf angular.Module + * @param {Function} initializationFn Execute this function after injector creation. + * Useful for application initialization. + * @description + * Use this method to register work which should be performed when the injector is done + * loading all modules. + */ + run: function(block) { + runBlocks.push(block); + return this; + } + }; + + if (configFn) { + config(configFn); + } + + return moduleInstance; + + /** + * @param {string} provider + * @param {string} method + * @param {String=} insertMethod + * @returns {angular.Module} + */ + function invokeLater(provider, method, insertMethod) { + return function() { + invokeQueue[insertMethod || 'push']([provider, method, arguments]); + return moduleInstance; + } + } + }); + }; + }); + +} + +/** + * @ngdoc property + * @name angular.version + * @description + * An object that contains information about the current AngularJS version. This object has the + * following properties: + * + * - `full` – `{string}` – Full version string, such as "0.9.18". + * - `major` – `{number}` – Major version number, such as "0". + * - `minor` – `{number}` – Minor version number, such as "9". + * - `dot` – `{number}` – Dot version number, such as "18". + * - `codeName` – `{string}` – Code name of the release, such as "jiggling-armfat". + */ +var version = { + full: '1.1.5', // all of these placeholder strings will be replaced by grunt's + major: 1, // package task + minor: 1, + dot: 5, + codeName: 'triangle-squarification' +}; + + +function publishExternalAPI(angular){ + extend(angular, { + 'bootstrap': bootstrap, + 'copy': copy, + 'extend': extend, + 'equals': equals, + 'element': jqLite, + 'forEach': forEach, + 'injector': createInjector, + 'noop':noop, + 'bind':bind, + 'toJson': toJson, + 'fromJson': fromJson, + 'identity':identity, + 'isUndefined': isUndefined, + 'isDefined': isDefined, + 'isString': isString, + 'isFunction': isFunction, + 'isObject': isObject, + 'isNumber': isNumber, + 'isElement': isElement, + 'isArray': isArray, + 'version': version, + 'isDate': isDate, + 'lowercase': lowercase, + 'uppercase': uppercase, + 'callbacks': {counter: 0}, + 'noConflict': noConflict + }); + + angularModule = setupModuleLoader(window); + try { + angularModule('ngLocale'); + } catch (e) { + angularModule('ngLocale', []).provider('$locale', $LocaleProvider); + } + + angularModule('ng', ['ngLocale'], ['$provide', + function ngModule($provide) { + $provide.provider('$compile', $CompileProvider). + directive({ + a: htmlAnchorDirective, + input: inputDirective, + textarea: inputDirective, + form: formDirective, + script: scriptDirective, + select: selectDirective, + style: styleDirective, + option: optionDirective, + ngBind: ngBindDirective, + ngBindHtmlUnsafe: ngBindHtmlUnsafeDirective, + ngBindTemplate: ngBindTemplateDirective, + ngClass: ngClassDirective, + ngClassEven: ngClassEvenDirective, + ngClassOdd: ngClassOddDirective, + ngCsp: ngCspDirective, + ngCloak: ngCloakDirective, + ngController: ngControllerDirective, + ngForm: ngFormDirective, + ngHide: ngHideDirective, + ngIf: ngIfDirective, + ngInclude: ngIncludeDirective, + ngInit: ngInitDirective, + ngNonBindable: ngNonBindableDirective, + ngPluralize: ngPluralizeDirective, + ngRepeat: ngRepeatDirective, + ngShow: ngShowDirective, + ngSubmit: ngSubmitDirective, + ngStyle: ngStyleDirective, + ngSwitch: ngSwitchDirective, + ngSwitchWhen: ngSwitchWhenDirective, + ngSwitchDefault: ngSwitchDefaultDirective, + ngOptions: ngOptionsDirective, + ngView: ngViewDirective, + ngTransclude: ngTranscludeDirective, + ngModel: ngModelDirective, + ngList: ngListDirective, + ngChange: ngChangeDirective, + required: requiredDirective, + ngRequired: requiredDirective, + ngValue: ngValueDirective + }). + directive(ngAttributeAliasDirectives). + directive(ngEventDirectives); + $provide.provider({ + $anchorScroll: $AnchorScrollProvider, + $animation: $AnimationProvider, + $animator: $AnimatorProvider, + $browser: $BrowserProvider, + $cacheFactory: $CacheFactoryProvider, + $controller: $ControllerProvider, + $document: $DocumentProvider, + $exceptionHandler: $ExceptionHandlerProvider, + $filter: $FilterProvider, + $interpolate: $InterpolateProvider, + $http: $HttpProvider, + $httpBackend: $HttpBackendProvider, + $location: $LocationProvider, + $log: $LogProvider, + $parse: $ParseProvider, + $route: $RouteProvider, + $routeParams: $RouteParamsProvider, + $rootScope: $RootScopeProvider, + $q: $QProvider, + $sniffer: $SnifferProvider, + $templateCache: $TemplateCacheProvider, + $timeout: $TimeoutProvider, + $window: $WindowProvider + }); + } + ]); +} + +////////////////////////////////// +//JQLite +////////////////////////////////// + +/** + * @ngdoc function + * @name angular.element + * @function + * + * @description + * Wraps a raw DOM element or HTML string as a [jQuery](http://jquery.com) element. + * `angular.element` can be either an alias for [jQuery](http://api.jquery.com/jQuery/) function, if + * jQuery is available, or a function that wraps the element or string in Angular's jQuery lite + * implementation (commonly referred to as jqLite). + * + * Real jQuery always takes precedence over jqLite, provided it was loaded before `DOMContentLoaded` + * event fired. + * + * jqLite is a tiny, API-compatible subset of jQuery that allows + * Angular to manipulate the DOM. jqLite implements only the most commonly needed functionality + * within a very small footprint, so only a subset of the jQuery API - methods, arguments and + * invocation styles - are supported. + * + * Note: All element references in Angular are always wrapped with jQuery or jqLite; they are never + * raw DOM references. + * + * ## Angular's jQuery lite provides the following methods: + * + * - [addClass()](http://api.jquery.com/addClass/) + * - [after()](http://api.jquery.com/after/) + * - [append()](http://api.jquery.com/append/) + * - [attr()](http://api.jquery.com/attr/) + * - [bind()](http://api.jquery.com/bind/) - Does not support namespaces + * - [children()](http://api.jquery.com/children/) - Does not support selectors + * - [clone()](http://api.jquery.com/clone/) + * - [contents()](http://api.jquery.com/contents/) + * - [css()](http://api.jquery.com/css/) + * - [data()](http://api.jquery.com/data/) + * - [eq()](http://api.jquery.com/eq/) + * - [find()](http://api.jquery.com/find/) - Limited to lookups by tag name + * - [hasClass()](http://api.jquery.com/hasClass/) + * - [html()](http://api.jquery.com/html/) + * - [next()](http://api.jquery.com/next/) - Does not support selectors + * - [parent()](http://api.jquery.com/parent/) - Does not support selectors + * - [prepend()](http://api.jquery.com/prepend/) + * - [prop()](http://api.jquery.com/prop/) + * - [ready()](http://api.jquery.com/ready/) + * - [remove()](http://api.jquery.com/remove/) + * - [removeAttr()](http://api.jquery.com/removeAttr/) + * - [removeClass()](http://api.jquery.com/removeClass/) + * - [removeData()](http://api.jquery.com/removeData/) + * - [replaceWith()](http://api.jquery.com/replaceWith/) + * - [text()](http://api.jquery.com/text/) + * - [toggleClass()](http://api.jquery.com/toggleClass/) + * - [triggerHandler()](http://api.jquery.com/triggerHandler/) - Passes a dummy event object to handlers. + * - [unbind()](http://api.jquery.com/unbind/) - Does not support namespaces + * - [val()](http://api.jquery.com/val/) + * - [wrap()](http://api.jquery.com/wrap/) + * + * ## In addition to the above, Angular provides additional methods to both jQuery and jQuery lite: + * + * - `controller(name)` - retrieves the controller of the current element or its parent. By default + * retrieves controller associated with the `ngController` directive. If `name` is provided as + * camelCase directive name, then the controller for this directive will be retrieved (e.g. + * `'ngModel'`). + * - `injector()` - retrieves the injector of the current element or its parent. + * - `scope()` - retrieves the {@link api/ng.$rootScope.Scope scope} of the current + * element or its parent. + * - `inheritedData()` - same as `data()`, but walks up the DOM until a value is found or the top + * parent element is reached. + * + * @param {string|DOMElement} element HTML string or DOMElement to be wrapped into jQuery. + * @returns {Object} jQuery object. + */ + +var jqCache = JQLite.cache = {}, + jqName = JQLite.expando = 'ng-' + new Date().getTime(), + jqId = 1, + addEventListenerFn = (window.document.addEventListener + ? function(element, type, fn) {element.addEventListener(type, fn, false);} + : function(element, type, fn) {element.attachEvent('on' + type, fn);}), + removeEventListenerFn = (window.document.removeEventListener + ? function(element, type, fn) {element.removeEventListener(type, fn, false); } + : function(element, type, fn) {element.detachEvent('on' + type, fn); }); + +function jqNextId() { return ++jqId; } + + +var SPECIAL_CHARS_REGEXP = /([\:\-\_]+(.))/g; +var MOZ_HACK_REGEXP = /^moz([A-Z])/; + +/** + * Converts snake_case to camelCase. + * Also there is special case for Moz prefix starting with upper case letter. + * @param name Name to normalize + */ +function camelCase(name) { + return name. + replace(SPECIAL_CHARS_REGEXP, function(_, separator, letter, offset) { + return offset ? letter.toUpperCase() : letter; + }). + replace(MOZ_HACK_REGEXP, 'Moz$1'); +} + +///////////////////////////////////////////// +// jQuery mutation patch +// +// In conjunction with bindJQuery intercepts all jQuery's DOM destruction apis and fires a +// $destroy event on all DOM nodes being removed. +// +///////////////////////////////////////////// + +function JQLitePatchJQueryRemove(name, dispatchThis) { + var originalJqFn = jQuery.fn[name]; + originalJqFn = originalJqFn.$original || originalJqFn; + removePatch.$original = originalJqFn; + jQuery.fn[name] = removePatch; + + function removePatch() { + var list = [this], + fireEvent = dispatchThis, + set, setIndex, setLength, + element, childIndex, childLength, children, + fns, events; + + while(list.length) { + set = list.shift(); + for(setIndex = 0, setLength = set.length; setIndex < setLength; setIndex++) { + element = jqLite(set[setIndex]); + if (fireEvent) { + element.triggerHandler('$destroy'); + } else { + fireEvent = !fireEvent; + } + for(childIndex = 0, childLength = (children = element.children()).length; + childIndex < childLength; + childIndex++) { + list.push(jQuery(children[childIndex])); + } + } + } + return originalJqFn.apply(this, arguments); + } +} + +///////////////////////////////////////////// +function JQLite(element) { + if (element instanceof JQLite) { + return element; + } + if (!(this instanceof JQLite)) { + if (isString(element) && element.charAt(0) != '<') { + throw Error('selectors not implemented'); + } + return new JQLite(element); + } + + if (isString(element)) { + var div = document.createElement('div'); + // Read about the NoScope elements here: + // http://msdn.microsoft.com/en-us/library/ms533897(VS.85).aspx + div.innerHTML = '
     
    ' + element; // IE insanity to make NoScope elements work! + div.removeChild(div.firstChild); // remove the superfluous div + JQLiteAddNodes(this, div.childNodes); + this.remove(); // detach the elements from the temporary DOM div. + } else { + JQLiteAddNodes(this, element); + } +} + +function JQLiteClone(element) { + return element.cloneNode(true); +} + +function JQLiteDealoc(element){ + JQLiteRemoveData(element); + for ( var i = 0, children = element.childNodes || []; i < children.length; i++) { + JQLiteDealoc(children[i]); + } +} + +function JQLiteUnbind(element, type, fn) { + var events = JQLiteExpandoStore(element, 'events'), + handle = JQLiteExpandoStore(element, 'handle'); + + if (!handle) return; //no listeners registered + + if (isUndefined(type)) { + forEach(events, function(eventHandler, type) { + removeEventListenerFn(element, type, eventHandler); + delete events[type]; + }); + } else { + if (isUndefined(fn)) { + removeEventListenerFn(element, type, events[type]); + delete events[type]; + } else { + arrayRemove(events[type], fn); + } + } +} + +function JQLiteRemoveData(element) { + var expandoId = element[jqName], + expandoStore = jqCache[expandoId]; + + if (expandoStore) { + if (expandoStore.handle) { + expandoStore.events.$destroy && expandoStore.handle({}, '$destroy'); + JQLiteUnbind(element); + } + delete jqCache[expandoId]; + element[jqName] = undefined; // ie does not allow deletion of attributes on elements. + } +} + +function JQLiteExpandoStore(element, key, value) { + var expandoId = element[jqName], + expandoStore = jqCache[expandoId || -1]; + + if (isDefined(value)) { + if (!expandoStore) { + element[jqName] = expandoId = jqNextId(); + expandoStore = jqCache[expandoId] = {}; + } + expandoStore[key] = value; + } else { + return expandoStore && expandoStore[key]; + } +} + +function JQLiteData(element, key, value) { + var data = JQLiteExpandoStore(element, 'data'), + isSetter = isDefined(value), + keyDefined = !isSetter && isDefined(key), + isSimpleGetter = keyDefined && !isObject(key); + + if (!data && !isSimpleGetter) { + JQLiteExpandoStore(element, 'data', data = {}); + } + + if (isSetter) { + data[key] = value; + } else { + if (keyDefined) { + if (isSimpleGetter) { + // don't create data in this case. + return data && data[key]; + } else { + extend(data, key); + } + } else { + return data; + } + } +} + +function JQLiteHasClass(element, selector) { + return ((" " + element.className + " ").replace(/[\n\t]/g, " "). + indexOf( " " + selector + " " ) > -1); +} + +function JQLiteRemoveClass(element, cssClasses) { + if (cssClasses) { + forEach(cssClasses.split(' '), function(cssClass) { + element.className = trim( + (" " + element.className + " ") + .replace(/[\n\t]/g, " ") + .replace(" " + trim(cssClass) + " ", " ") + ); + }); + } +} + +function JQLiteAddClass(element, cssClasses) { + if (cssClasses) { + forEach(cssClasses.split(' '), function(cssClass) { + if (!JQLiteHasClass(element, cssClass)) { + element.className = trim(element.className + ' ' + trim(cssClass)); + } + }); + } +} + +function JQLiteAddNodes(root, elements) { + if (elements) { + elements = (!elements.nodeName && isDefined(elements.length) && !isWindow(elements)) + ? elements + : [ elements ]; + for(var i=0; i < elements.length; i++) { + root.push(elements[i]); + } + } +} + +function JQLiteController(element, name) { + return JQLiteInheritedData(element, '$' + (name || 'ngController' ) + 'Controller'); +} + +function JQLiteInheritedData(element, name, value) { + element = jqLite(element); + + // if element is the document object work with the html element instead + // this makes $(document).scope() possible + if(element[0].nodeType == 9) { + element = element.find('html'); + } + + while (element.length) { + if (value = element.data(name)) return value; + element = element.parent(); + } +} + +////////////////////////////////////////// +// Functions which are declared directly. +////////////////////////////////////////// +var JQLitePrototype = JQLite.prototype = { + ready: function(fn) { + var fired = false; + + function trigger() { + if (fired) return; + fired = true; + fn(); + } + + // check if document already is loaded + if (document.readyState === 'complete'){ + setTimeout(trigger); + } else { + this.bind('DOMContentLoaded', trigger); // works for modern browsers and IE9 + // we can not use jqLite since we are not done loading and jQuery could be loaded later. + JQLite(window).bind('load', trigger); // fallback to window.onload for others + } + }, + toString: function() { + var value = []; + forEach(this, function(e){ value.push('' + e);}); + return '[' + value.join(', ') + ']'; + }, + + eq: function(index) { + return (index >= 0) ? jqLite(this[index]) : jqLite(this[this.length + index]); + }, + + length: 0, + push: push, + sort: [].sort, + splice: [].splice +}; + +////////////////////////////////////////// +// Functions iterating getter/setters. +// these functions return self on setter and +// value on get. +////////////////////////////////////////// +var BOOLEAN_ATTR = {}; +forEach('multiple,selected,checked,disabled,readOnly,required,open'.split(','), function(value) { + BOOLEAN_ATTR[lowercase(value)] = value; +}); +var BOOLEAN_ELEMENTS = {}; +forEach('input,select,option,textarea,button,form,details'.split(','), function(value) { + BOOLEAN_ELEMENTS[uppercase(value)] = true; +}); + +function getBooleanAttrName(element, name) { + // check dom last since we will most likely fail on name + var booleanAttr = BOOLEAN_ATTR[name.toLowerCase()]; + + // booleanAttr is here twice to minimize DOM access + return booleanAttr && BOOLEAN_ELEMENTS[element.nodeName] && booleanAttr; +} + +forEach({ + data: JQLiteData, + inheritedData: JQLiteInheritedData, + + scope: function(element) { + return JQLiteInheritedData(element, '$scope'); + }, + + controller: JQLiteController , + + injector: function(element) { + return JQLiteInheritedData(element, '$injector'); + }, + + removeAttr: function(element,name) { + element.removeAttribute(name); + }, + + hasClass: JQLiteHasClass, + + css: function(element, name, value) { + name = camelCase(name); + + if (isDefined(value)) { + element.style[name] = value; + } else { + var val; + + if (msie <= 8) { + // this is some IE specific weirdness that jQuery 1.6.4 does not sure why + val = element.currentStyle && element.currentStyle[name]; + if (val === '') val = 'auto'; + } + + val = val || element.style[name]; + + if (msie <= 8) { + // jquery weirdness :-/ + val = (val === '') ? undefined : val; + } + + return val; + } + }, + + attr: function(element, name, value){ + var lowercasedName = lowercase(name); + if (BOOLEAN_ATTR[lowercasedName]) { + if (isDefined(value)) { + if (!!value) { + element[name] = true; + element.setAttribute(name, lowercasedName); + } else { + element[name] = false; + element.removeAttribute(lowercasedName); + } + } else { + return (element[name] || + (element.attributes.getNamedItem(name)|| noop).specified) + ? lowercasedName + : undefined; + } + } else if (isDefined(value)) { + element.setAttribute(name, value); + } else if (element.getAttribute) { + // the extra argument "2" is to get the right thing for a.href in IE, see jQuery code + // some elements (e.g. Document) don't have get attribute, so return undefined + var ret = element.getAttribute(name, 2); + // normalize non-existing attributes to undefined (as jQuery) + return ret === null ? undefined : ret; + } + }, + + prop: function(element, name, value) { + if (isDefined(value)) { + element[name] = value; + } else { + return element[name]; + } + }, + + text: extend((msie < 9) + ? function(element, value) { + if (element.nodeType == 1 /** Element */) { + if (isUndefined(value)) + return element.innerText; + element.innerText = value; + } else { + if (isUndefined(value)) + return element.nodeValue; + element.nodeValue = value; + } + } + : function(element, value) { + if (isUndefined(value)) { + return element.textContent; + } + element.textContent = value; + }, {$dv:''}), + + val: function(element, value) { + if (isUndefined(value)) { + return element.value; + } + element.value = value; + }, + + html: function(element, value) { + if (isUndefined(value)) { + return element.innerHTML; + } + for (var i = 0, childNodes = element.childNodes; i < childNodes.length; i++) { + JQLiteDealoc(childNodes[i]); + } + element.innerHTML = value; + } +}, function(fn, name){ + /** + * Properties: writes return selection, reads return first value + */ + JQLite.prototype[name] = function(arg1, arg2) { + var i, key; + + // JQLiteHasClass has only two arguments, but is a getter-only fn, so we need to special-case it + // in a way that survives minification. + if (((fn.length == 2 && (fn !== JQLiteHasClass && fn !== JQLiteController)) ? arg1 : arg2) === undefined) { + if (isObject(arg1)) { + + // we are a write, but the object properties are the key/values + for(i=0; i < this.length; i++) { + if (fn === JQLiteData) { + // data() takes the whole object in jQuery + fn(this[i], arg1); + } else { + for (key in arg1) { + fn(this[i], key, arg1[key]); + } + } + } + // return self for chaining + return this; + } else { + // we are a read, so read the first child. + if (this.length) + return fn(this[0], arg1, arg2); + } + } else { + // we are a write, so apply to all children + for(i=0; i < this.length; i++) { + fn(this[i], arg1, arg2); + } + // return self for chaining + return this; + } + return fn.$dv; + }; +}); + +function createEventHandler(element, events) { + var eventHandler = function (event, type) { + if (!event.preventDefault) { + event.preventDefault = function() { + event.returnValue = false; //ie + }; + } + + if (!event.stopPropagation) { + event.stopPropagation = function() { + event.cancelBubble = true; //ie + }; + } + + if (!event.target) { + event.target = event.srcElement || document; + } + + if (isUndefined(event.defaultPrevented)) { + var prevent = event.preventDefault; + event.preventDefault = function() { + event.defaultPrevented = true; + prevent.call(event); + }; + event.defaultPrevented = false; + } + + event.isDefaultPrevented = function() { + return event.defaultPrevented || event.returnValue == false; + }; + + forEach(events[type || event.type], function(fn) { + fn.call(element, event); + }); + + // Remove monkey-patched methods (IE), + // as they would cause memory leaks in IE8. + if (msie <= 8) { + // IE7/8 does not allow to delete property on native object + event.preventDefault = null; + event.stopPropagation = null; + event.isDefaultPrevented = null; + } else { + // It shouldn't affect normal browsers (native methods are defined on prototype). + delete event.preventDefault; + delete event.stopPropagation; + delete event.isDefaultPrevented; + } + }; + eventHandler.elem = element; + return eventHandler; +} + +////////////////////////////////////////// +// Functions iterating traversal. +// These functions chain results into a single +// selector. +////////////////////////////////////////// +forEach({ + removeData: JQLiteRemoveData, + + dealoc: JQLiteDealoc, + + bind: function bindFn(element, type, fn){ + var events = JQLiteExpandoStore(element, 'events'), + handle = JQLiteExpandoStore(element, 'handle'); + + if (!events) JQLiteExpandoStore(element, 'events', events = {}); + if (!handle) JQLiteExpandoStore(element, 'handle', handle = createEventHandler(element, events)); + + forEach(type.split(' '), function(type){ + var eventFns = events[type]; + + if (!eventFns) { + if (type == 'mouseenter' || type == 'mouseleave') { + var contains = document.body.contains || document.body.compareDocumentPosition ? + function( a, b ) { + var adown = a.nodeType === 9 ? a.documentElement : a, + bup = b && b.parentNode; + return a === bup || !!( bup && bup.nodeType === 1 && ( + adown.contains ? + adown.contains( bup ) : + a.compareDocumentPosition && a.compareDocumentPosition( bup ) & 16 + )); + } : + function( a, b ) { + if ( b ) { + while ( (b = b.parentNode) ) { + if ( b === a ) { + return true; + } + } + } + return false; + }; + + events[type] = []; + + // Refer to jQuery's implementation of mouseenter & mouseleave + // Read about mouseenter and mouseleave: + // http://www.quirksmode.org/js/events_mouse.html#link8 + var eventmap = { mouseleave : "mouseout", mouseenter : "mouseover"} + bindFn(element, eventmap[type], function(event) { + var ret, target = this, related = event.relatedTarget; + // For mousenter/leave call the handler if related is outside the target. + // NB: No relatedTarget if the mouse left/entered the browser window + if ( !related || (related !== target && !contains(target, related)) ){ + handle(event, type); + } + + }); + + } else { + addEventListenerFn(element, type, handle); + events[type] = []; + } + eventFns = events[type] + } + eventFns.push(fn); + }); + }, + + unbind: JQLiteUnbind, + + replaceWith: function(element, replaceNode) { + var index, parent = element.parentNode; + JQLiteDealoc(element); + forEach(new JQLite(replaceNode), function(node){ + if (index) { + parent.insertBefore(node, index.nextSibling); + } else { + parent.replaceChild(node, element); + } + index = node; + }); + }, + + children: function(element) { + var children = []; + forEach(element.childNodes, function(element){ + if (element.nodeType === 1) + children.push(element); + }); + return children; + }, + + contents: function(element) { + return element.childNodes || []; + }, + + append: function(element, node) { + forEach(new JQLite(node), function(child){ + if (element.nodeType === 1 || element.nodeType === 11) { + element.appendChild(child); + } + }); + }, + + prepend: function(element, node) { + if (element.nodeType === 1) { + var index = element.firstChild; + forEach(new JQLite(node), function(child){ + if (index) { + element.insertBefore(child, index); + } else { + element.appendChild(child); + index = child; + } + }); + } + }, + + wrap: function(element, wrapNode) { + wrapNode = jqLite(wrapNode)[0]; + var parent = element.parentNode; + if (parent) { + parent.replaceChild(wrapNode, element); + } + wrapNode.appendChild(element); + }, + + remove: function(element) { + JQLiteDealoc(element); + var parent = element.parentNode; + if (parent) parent.removeChild(element); + }, + + after: function(element, newElement) { + var index = element, parent = element.parentNode; + forEach(new JQLite(newElement), function(node){ + parent.insertBefore(node, index.nextSibling); + index = node; + }); + }, + + addClass: JQLiteAddClass, + removeClass: JQLiteRemoveClass, + + toggleClass: function(element, selector, condition) { + if (isUndefined(condition)) { + condition = !JQLiteHasClass(element, selector); + } + (condition ? JQLiteAddClass : JQLiteRemoveClass)(element, selector); + }, + + parent: function(element) { + var parent = element.parentNode; + return parent && parent.nodeType !== 11 ? parent : null; + }, + + next: function(element) { + if (element.nextElementSibling) { + return element.nextElementSibling; + } + + // IE8 doesn't have nextElementSibling + var elm = element.nextSibling; + while (elm != null && elm.nodeType !== 1) { + elm = elm.nextSibling; + } + return elm; + }, + + find: function(element, selector) { + return element.getElementsByTagName(selector); + }, + + clone: JQLiteClone, + + triggerHandler: function(element, eventName) { + var eventFns = (JQLiteExpandoStore(element, 'events') || {})[eventName]; + var event; + + forEach(eventFns, function(fn) { + fn.call(element, {preventDefault: noop}); + }); + } +}, function(fn, name){ + /** + * chaining functions + */ + JQLite.prototype[name] = function(arg1, arg2) { + var value; + for(var i=0; i < this.length; i++) { + if (value == undefined) { + value = fn(this[i], arg1, arg2); + if (value !== undefined) { + // any function which returns a value needs to be wrapped + value = jqLite(value); + } + } else { + JQLiteAddNodes(value, fn(this[i], arg1, arg2)); + } + } + return value == undefined ? this : value; + }; +}); + +/** + * Computes a hash of an 'obj'. + * Hash of a: + * string is string + * number is number as string + * object is either result of calling $$hashKey function on the object or uniquely generated id, + * that is also assigned to the $$hashKey property of the object. + * + * @param obj + * @returns {string} hash string such that the same input will have the same hash string. + * The resulting string key is in 'type:hashKey' format. + */ +function hashKey(obj) { + var objType = typeof obj, + key; + + if (objType == 'object' && obj !== null) { + if (typeof (key = obj.$$hashKey) == 'function') { + // must invoke on object to keep the right this + key = obj.$$hashKey(); + } else if (key === undefined) { + key = obj.$$hashKey = nextUid(); + } + } else { + key = obj; + } + + return objType + ':' + key; +} + +/** + * HashMap which can use objects as keys + */ +function HashMap(array){ + forEach(array, this.put, this); +} +HashMap.prototype = { + /** + * Store key value pair + * @param key key to store can be any type + * @param value value to store can be any type + */ + put: function(key, value) { + this[hashKey(key)] = value; + }, + + /** + * @param key + * @returns the value for the key + */ + get: function(key) { + return this[hashKey(key)]; + }, + + /** + * Remove the key/value pair + * @param key + */ + remove: function(key) { + var value = this[key = hashKey(key)]; + delete this[key]; + return value; + } +}; + +/** + * @ngdoc function + * @name angular.injector + * @function + * + * @description + * Creates an injector function that can be used for retrieving services as well as for + * dependency injection (see {@link guide/di dependency injection}). + * + + * @param {Array.} modules A list of module functions or their aliases. See + * {@link angular.module}. The `ng` module must be explicitly added. + * @returns {function()} Injector function. See {@link AUTO.$injector $injector}. + * + * @example + * Typical usage + *
    + *   // create an injector
    + *   var $injector = angular.injector(['ng']);
    + *
    + *   // use the injector to kick off your application
    + *   // use the type inference to auto inject arguments, or use implicit injection
    + *   $injector.invoke(function($rootScope, $compile, $document){
    + *     $compile($document)($rootScope);
    + *     $rootScope.$digest();
    + *   });
    + * 
    + */ + + +/** + * @ngdoc overview + * @name AUTO + * @description + * + * Implicit module which gets automatically added to each {@link AUTO.$injector $injector}. + */ + +var FN_ARGS = /^function\s*[^\(]*\(\s*([^\)]*)\)/m; +var FN_ARG_SPLIT = /,/; +var FN_ARG = /^\s*(_?)(\S+?)\1\s*$/; +var STRIP_COMMENTS = /((\/\/.*$)|(\/\*[\s\S]*?\*\/))/mg; +function annotate(fn) { + var $inject, + fnText, + argDecl, + last; + + if (typeof fn == 'function') { + if (!($inject = fn.$inject)) { + $inject = []; + fnText = fn.toString().replace(STRIP_COMMENTS, ''); + argDecl = fnText.match(FN_ARGS); + forEach(argDecl[1].split(FN_ARG_SPLIT), function(arg){ + arg.replace(FN_ARG, function(all, underscore, name){ + $inject.push(name); + }); + }); + fn.$inject = $inject; + } + } else if (isArray(fn)) { + last = fn.length - 1; + assertArgFn(fn[last], 'fn'); + $inject = fn.slice(0, last); + } else { + assertArgFn(fn, 'fn', true); + } + return $inject; +} + +/////////////////////////////////////// + +/** + * @ngdoc object + * @name AUTO.$injector + * @function + * + * @description + * + * `$injector` is used to retrieve object instances as defined by + * {@link AUTO.$provide provider}, instantiate types, invoke methods, + * and load modules. + * + * The following always holds true: + * + *
    + *   var $injector = angular.injector();
    + *   expect($injector.get('$injector')).toBe($injector);
    + *   expect($injector.invoke(function($injector){
    + *     return $injector;
    + *   }).toBe($injector);
    + * 
    + * + * # Injection Function Annotation + * + * JavaScript does not have annotations, and annotations are needed for dependency injection. The + * following are all valid ways of annotating function with injection arguments and are equivalent. + * + *
    + *   // inferred (only works if code not minified/obfuscated)
    + *   $injector.invoke(function(serviceA){});
    + *
    + *   // annotated
    + *   function explicit(serviceA) {};
    + *   explicit.$inject = ['serviceA'];
    + *   $injector.invoke(explicit);
    + *
    + *   // inline
    + *   $injector.invoke(['serviceA', function(serviceA){}]);
    + * 
    + * + * ## Inference + * + * In JavaScript calling `toString()` on a function returns the function definition. The definition can then be + * parsed and the function arguments can be extracted. *NOTE:* This does not work with minification, and obfuscation + * tools since these tools change the argument names. + * + * ## `$inject` Annotation + * By adding a `$inject` property onto a function the injection parameters can be specified. + * + * ## Inline + * As an array of injection names, where the last item in the array is the function to call. + */ + +/** + * @ngdoc method + * @name AUTO.$injector#get + * @methodOf AUTO.$injector + * + * @description + * Return an instance of the service. + * + * @param {string} name The name of the instance to retrieve. + * @return {*} The instance. + */ + +/** + * @ngdoc method + * @name AUTO.$injector#invoke + * @methodOf AUTO.$injector + * + * @description + * Invoke the method and supply the method arguments from the `$injector`. + * + * @param {!function} fn The function to invoke. The function arguments come form the function annotation. + * @param {Object=} self The `this` for the invoked method. + * @param {Object=} locals Optional object. If preset then any argument names are read from this object first, before + * the `$injector` is consulted. + * @returns {*} the value returned by the invoked `fn` function. + */ + +/** + * @ngdoc method + * @name AUTO.$injector#has + * @methodOf AUTO.$injector + * + * @description + * Allows the user to query if the particular service exist. + * + * @param {string} Name of the service to query. + * @returns {boolean} returns true if injector has given service. + */ + +/** + * @ngdoc method + * @name AUTO.$injector#instantiate + * @methodOf AUTO.$injector + * @description + * Create a new instance of JS type. The method takes a constructor function invokes the new operator and supplies + * all of the arguments to the constructor function as specified by the constructor annotation. + * + * @param {function} Type Annotated constructor function. + * @param {Object=} locals Optional object. If preset then any argument names are read from this object first, before + * the `$injector` is consulted. + * @returns {Object} new instance of `Type`. + */ + +/** + * @ngdoc method + * @name AUTO.$injector#annotate + * @methodOf AUTO.$injector + * + * @description + * Returns an array of service names which the function is requesting for injection. This API is used by the injector + * to determine which services need to be injected into the function when the function is invoked. There are three + * ways in which the function can be annotated with the needed dependencies. + * + * # Argument names + * + * The simplest form is to extract the dependencies from the arguments of the function. This is done by converting + * the function into a string using `toString()` method and extracting the argument names. + *
    + *   // Given
    + *   function MyController($scope, $route) {
    + *     // ...
    + *   }
    + *
    + *   // Then
    + *   expect(injector.annotate(MyController)).toEqual(['$scope', '$route']);
    + * 
    + * + * This method does not work with code minfication / obfuscation. For this reason the following annotation strategies + * are supported. + * + * # The `$inject` property + * + * If a function has an `$inject` property and its value is an array of strings, then the strings represent names of + * services to be injected into the function. + *
    + *   // Given
    + *   var MyController = function(obfuscatedScope, obfuscatedRoute) {
    + *     // ...
    + *   }
    + *   // Define function dependencies
    + *   MyController.$inject = ['$scope', '$route'];
    + *
    + *   // Then
    + *   expect(injector.annotate(MyController)).toEqual(['$scope', '$route']);
    + * 
    + * + * # The array notation + * + * It is often desirable to inline Injected functions and that's when setting the `$inject` property is very + * inconvenient. In these situations using the array notation to specify the dependencies in a way that survives + * minification is a better choice: + * + *
    + *   // We wish to write this (not minification / obfuscation safe)
    + *   injector.invoke(function($compile, $rootScope) {
    + *     // ...
    + *   });
    + *
    + *   // We are forced to write break inlining
    + *   var tmpFn = function(obfuscatedCompile, obfuscatedRootScope) {
    + *     // ...
    + *   };
    + *   tmpFn.$inject = ['$compile', '$rootScope'];
    + *   injector.invoke(tmpFn);
    + *
    + *   // To better support inline function the inline annotation is supported
    + *   injector.invoke(['$compile', '$rootScope', function(obfCompile, obfRootScope) {
    + *     // ...
    + *   }]);
    + *
    + *   // Therefore
    + *   expect(injector.annotate(
    + *      ['$compile', '$rootScope', function(obfus_$compile, obfus_$rootScope) {}])
    + *    ).toEqual(['$compile', '$rootScope']);
    + * 
    + * + * @param {function|Array.} fn Function for which dependent service names need to be retrieved as described + * above. + * + * @returns {Array.} The names of the services which the function requires. + */ + + + + +/** + * @ngdoc object + * @name AUTO.$provide + * + * @description + * + * Use `$provide` to register new providers with the `$injector`. The providers are the factories for the instance. + * The providers share the same name as the instance they create with `Provider` suffixed to them. + * + * A provider is an object with a `$get()` method. The injector calls the `$get` method to create a new instance of + * a service. The Provider can have additional methods which would allow for configuration of the provider. + * + *
    + *   function GreetProvider() {
    + *     var salutation = 'Hello';
    + *
    + *     this.salutation = function(text) {
    + *       salutation = text;
    + *     };
    + *
    + *     this.$get = function() {
    + *       return function (name) {
    + *         return salutation + ' ' + name + '!';
    + *       };
    + *     };
    + *   }
    + *
    + *   describe('Greeter', function(){
    + *
    + *     beforeEach(module(function($provide) {
    + *       $provide.provider('greet', GreetProvider);
    + *     }));
    + *
    + *     it('should greet', inject(function(greet) {
    + *       expect(greet('angular')).toEqual('Hello angular!');
    + *     }));
    + *
    + *     it('should allow configuration of salutation', function() {
    + *       module(function(greetProvider) {
    + *         greetProvider.salutation('Ahoj');
    + *       });
    + *       inject(function(greet) {
    + *         expect(greet('angular')).toEqual('Ahoj angular!');
    + *       });
    + *     });
    + * 
    + */ + +/** + * @ngdoc method + * @name AUTO.$provide#provider + * @methodOf AUTO.$provide + * @description + * + * Register a provider for a service. The providers can be retrieved and can have additional configuration methods. + * + * @param {string} name The name of the instance. NOTE: the provider will be available under `name + 'Provider'` key. + * @param {(Object|function())} provider If the provider is: + * + * - `Object`: then it should have a `$get` method. The `$get` method will be invoked using + * {@link AUTO.$injector#invoke $injector.invoke()} when an instance needs to be created. + * - `Constructor`: a new instance of the provider will be created using + * {@link AUTO.$injector#instantiate $injector.instantiate()}, then treated as `object`. + * + * @returns {Object} registered provider instance + */ + +/** + * @ngdoc method + * @name AUTO.$provide#factory + * @methodOf AUTO.$provide + * @description + * + * A short hand for configuring services if only `$get` method is required. + * + * @param {string} name The name of the instance. + * @param {function()} $getFn The $getFn for the instance creation. Internally this is a short hand for + * `$provide.provider(name, {$get: $getFn})`. + * @returns {Object} registered provider instance + */ + + +/** + * @ngdoc method + * @name AUTO.$provide#service + * @methodOf AUTO.$provide + * @description + * + * A short hand for registering service of given class. + * + * @param {string} name The name of the instance. + * @param {Function} constructor A class (constructor function) that will be instantiated. + * @returns {Object} registered provider instance + */ + + +/** + * @ngdoc method + * @name AUTO.$provide#value + * @methodOf AUTO.$provide + * @description + * + * A short hand for configuring services if the `$get` method is a constant. + * + * @param {string} name The name of the instance. + * @param {*} value The value. + * @returns {Object} registered provider instance + */ + + +/** + * @ngdoc method + * @name AUTO.$provide#constant + * @methodOf AUTO.$provide + * @description + * + * A constant value, but unlike {@link AUTO.$provide#value value} it can be injected + * into configuration function (other modules) and it is not interceptable by + * {@link AUTO.$provide#decorator decorator}. + * + * @param {string} name The name of the constant. + * @param {*} value The constant value. + * @returns {Object} registered instance + */ + + +/** + * @ngdoc method + * @name AUTO.$provide#decorator + * @methodOf AUTO.$provide + * @description + * + * Decoration of service, allows the decorator to intercept the service instance creation. The + * returned instance may be the original instance, or a new instance which delegates to the + * original instance. + * + * @param {string} name The name of the service to decorate. + * @param {function()} decorator This function will be invoked when the service needs to be + * instantiated. The function is called using the {@link AUTO.$injector#invoke + * injector.invoke} method and is therefore fully injectable. Local injection arguments: + * + * * `$delegate` - The original service instance, which can be monkey patched, configured, + * decorated or delegated to. + */ + + +function createInjector(modulesToLoad) { + var INSTANTIATING = {}, + providerSuffix = 'Provider', + path = [], + loadedModules = new HashMap(), + providerCache = { + $provide: { + provider: supportObject(provider), + factory: supportObject(factory), + service: supportObject(service), + value: supportObject(value), + constant: supportObject(constant), + decorator: decorator + } + }, + providerInjector = (providerCache.$injector = + createInternalInjector(providerCache, function() { + throw Error("Unknown provider: " + path.join(' <- ')); + })), + instanceCache = {}, + instanceInjector = (instanceCache.$injector = + createInternalInjector(instanceCache, function(servicename) { + var provider = providerInjector.get(servicename + providerSuffix); + return instanceInjector.invoke(provider.$get, provider); + })); + + + forEach(loadModules(modulesToLoad), function(fn) { instanceInjector.invoke(fn || noop); }); + + return instanceInjector; + + //////////////////////////////////// + // $provider + //////////////////////////////////// + + function supportObject(delegate) { + return function(key, value) { + if (isObject(key)) { + forEach(key, reverseParams(delegate)); + } else { + return delegate(key, value); + } + } + } + + function provider(name, provider_) { + if (isFunction(provider_) || isArray(provider_)) { + provider_ = providerInjector.instantiate(provider_); + } + if (!provider_.$get) { + throw Error('Provider ' + name + ' must define $get factory method.'); + } + return providerCache[name + providerSuffix] = provider_; + } + + function factory(name, factoryFn) { return provider(name, { $get: factoryFn }); } + + function service(name, constructor) { + return factory(name, ['$injector', function($injector) { + return $injector.instantiate(constructor); + }]); + } + + function value(name, value) { return factory(name, valueFn(value)); } + + function constant(name, value) { + providerCache[name] = value; + instanceCache[name] = value; + } + + function decorator(serviceName, decorFn) { + var origProvider = providerInjector.get(serviceName + providerSuffix), + orig$get = origProvider.$get; + + origProvider.$get = function() { + var origInstance = instanceInjector.invoke(orig$get, origProvider); + return instanceInjector.invoke(decorFn, null, {$delegate: origInstance}); + }; + } + + //////////////////////////////////// + // Module Loading + //////////////////////////////////// + function loadModules(modulesToLoad){ + var runBlocks = []; + forEach(modulesToLoad, function(module) { + if (loadedModules.get(module)) return; + loadedModules.put(module, true); + if (isString(module)) { + var moduleFn = angularModule(module); + runBlocks = runBlocks.concat(loadModules(moduleFn.requires)).concat(moduleFn._runBlocks); + + try { + for(var invokeQueue = moduleFn._invokeQueue, i = 0, ii = invokeQueue.length; i < ii; i++) { + var invokeArgs = invokeQueue[i], + provider = providerInjector.get(invokeArgs[0]); + + provider[invokeArgs[1]].apply(provider, invokeArgs[2]); + } + } catch (e) { + if (e.message) e.message += ' from ' + module; + throw e; + } + } else if (isFunction(module)) { + try { + runBlocks.push(providerInjector.invoke(module)); + } catch (e) { + if (e.message) e.message += ' from ' + module; + throw e; + } + } else if (isArray(module)) { + try { + runBlocks.push(providerInjector.invoke(module)); + } catch (e) { + if (e.message) e.message += ' from ' + String(module[module.length - 1]); + throw e; + } + } else { + assertArgFn(module, 'module'); + } + }); + return runBlocks; + } + + //////////////////////////////////// + // internal Injector + //////////////////////////////////// + + function createInternalInjector(cache, factory) { + + function getService(serviceName) { + if (typeof serviceName !== 'string') { + throw Error('Service name expected'); + } + if (cache.hasOwnProperty(serviceName)) { + if (cache[serviceName] === INSTANTIATING) { + throw Error('Circular dependency: ' + path.join(' <- ')); + } + return cache[serviceName]; + } else { + try { + path.unshift(serviceName); + cache[serviceName] = INSTANTIATING; + return cache[serviceName] = factory(serviceName); + } finally { + path.shift(); + } + } + } + + function invoke(fn, self, locals){ + var args = [], + $inject = annotate(fn), + length, i, + key; + + for(i = 0, length = $inject.length; i < length; i++) { + key = $inject[i]; + args.push( + locals && locals.hasOwnProperty(key) + ? locals[key] + : getService(key) + ); + } + if (!fn.$inject) { + // this means that we must be an array. + fn = fn[length]; + } + + + // Performance optimization: http://jsperf.com/apply-vs-call-vs-invoke + switch (self ? -1 : args.length) { + case 0: return fn(); + case 1: return fn(args[0]); + case 2: return fn(args[0], args[1]); + case 3: return fn(args[0], args[1], args[2]); + case 4: return fn(args[0], args[1], args[2], args[3]); + case 5: return fn(args[0], args[1], args[2], args[3], args[4]); + case 6: return fn(args[0], args[1], args[2], args[3], args[4], args[5]); + case 7: return fn(args[0], args[1], args[2], args[3], args[4], args[5], args[6]); + case 8: return fn(args[0], args[1], args[2], args[3], args[4], args[5], args[6], args[7]); + case 9: return fn(args[0], args[1], args[2], args[3], args[4], args[5], args[6], args[7], args[8]); + case 10: return fn(args[0], args[1], args[2], args[3], args[4], args[5], args[6], args[7], args[8], args[9]); + default: return fn.apply(self, args); + } + } + + function instantiate(Type, locals) { + var Constructor = function() {}, + instance, returnedValue; + + // Check if Type is annotated and use just the given function at n-1 as parameter + // e.g. someModule.factory('greeter', ['$window', function(renamed$window) {}]); + Constructor.prototype = (isArray(Type) ? Type[Type.length - 1] : Type).prototype; + instance = new Constructor(); + returnedValue = invoke(Type, instance, locals); + + return isObject(returnedValue) ? returnedValue : instance; + } + + return { + invoke: invoke, + instantiate: instantiate, + get: getService, + annotate: annotate, + has: function(name) { + return providerCache.hasOwnProperty(name + providerSuffix) || cache.hasOwnProperty(name); + } + }; + } +} + +/** + * @ngdoc function + * @name ng.$anchorScroll + * @requires $window + * @requires $location + * @requires $rootScope + * + * @description + * When called, it checks current value of `$location.hash()` and scroll to related element, + * according to rules specified in + * {@link http://dev.w3.org/html5/spec/Overview.html#the-indicated-part-of-the-document Html5 spec}. + * + * It also watches the `$location.hash()` and scroll whenever it changes to match any anchor. + * This can be disabled by calling `$anchorScrollProvider.disableAutoScrolling()`. + */ +function $AnchorScrollProvider() { + + var autoScrollingEnabled = true; + + this.disableAutoScrolling = function() { + autoScrollingEnabled = false; + }; + + this.$get = ['$window', '$location', '$rootScope', function($window, $location, $rootScope) { + var document = $window.document; + + // helper function to get first anchor from a NodeList + // can't use filter.filter, as it accepts only instances of Array + // and IE can't convert NodeList to an array using [].slice + // TODO(vojta): use filter if we change it to accept lists as well + function getFirstAnchor(list) { + var result = null; + forEach(list, function(element) { + if (!result && lowercase(element.nodeName) === 'a') result = element; + }); + return result; + } + + function scroll() { + var hash = $location.hash(), elm; + + // empty hash, scroll to the top of the page + if (!hash) $window.scrollTo(0, 0); + + // element with given id + else if ((elm = document.getElementById(hash))) elm.scrollIntoView(); + + // first anchor with given name :-D + else if ((elm = getFirstAnchor(document.getElementsByName(hash)))) elm.scrollIntoView(); + + // no element and hash == 'top', scroll to the top of the page + else if (hash === 'top') $window.scrollTo(0, 0); + } + + // does not scroll when user clicks on anchor link that is currently on + // (no url change, no $location.hash() change), browser native does scroll + if (autoScrollingEnabled) { + $rootScope.$watch(function autoScrollWatch() {return $location.hash();}, + function autoScrollWatchAction() { + $rootScope.$evalAsync(scroll); + }); + } + + return scroll; + }]; +} + + +/** + * @ngdoc object + * @name ng.$animationProvider + * @description + * + * The $AnimationProvider provider allows developers to register and access custom JavaScript animations directly inside + * of a module. + * + */ +$AnimationProvider.$inject = ['$provide']; +function $AnimationProvider($provide) { + var suffix = 'Animation'; + + /** + * @ngdoc function + * @name ng.$animation#register + * @methodOf ng.$animationProvider + * + * @description + * Registers a new injectable animation factory function. The factory function produces the animation object which + * has these two properties: + * + * * `setup`: `function(Element):*` A function which receives the starting state of the element. The purpose + * of this function is to get the element ready for animation. Optionally the function returns an memento which + * is passed to the `start` function. + * * `start`: `function(Element, doneFunction, *)` The element to animate, the `doneFunction` to be called on + * element animation completion, and an optional memento from the `setup` function. + * + * @param {string} name The name of the animation. + * @param {function} factory The factory function that will be executed to return the animation object. + * + */ + this.register = function(name, factory) { + $provide.factory(camelCase(name) + suffix, factory); + }; + + this.$get = ['$injector', function($injector) { + /** + * @ngdoc function + * @name ng.$animation + * @function + * + * @description + * The $animation service is used to retrieve any defined animation functions. When executed, the $animation service + * will return a object that contains the setup and start functions that were defined for the animation. + * + * @param {String} name Name of the animation function to retrieve. Animation functions are registered and stored + * inside of the AngularJS DI so a call to $animate('custom') is the same as injecting `customAnimation` + * via dependency injection. + * @return {Object} the animation object which contains the `setup` and `start` functions that perform the animation. + */ + return function $animation(name) { + if (name) { + var animationName = camelCase(name) + suffix; + if ($injector.has(animationName)) { + return $injector.get(animationName); + } + } + }; + }]; +} + +// NOTE: this is a pseudo directive. + +/** + * @ngdoc directive + * @name ng.directive:ngAnimate + * + * @description + * The `ngAnimate` directive works as an attribute that is attached alongside pre-existing directives. + * It effects how the directive will perform DOM manipulation. This allows for complex animations to take place + * without burdening the directive which uses the animation with animation details. The built in directives + * `ngRepeat`, `ngInclude`, `ngSwitch`, `ngShow`, `ngHide` and `ngView` already accept `ngAnimate` directive. + * Custom directives can take advantage of animation through {@link ng.$animator $animator service}. + * + * Below is a more detailed breakdown of the supported callback events provided by pre-exisitng ng directives: + * + * | Directive | Supported Animations | + * |========================================================== |====================================================| + * | {@link ng.directive:ngRepeat#animations ngRepeat} | enter, leave and move | + * | {@link ng.directive:ngView#animations ngView} | enter and leave | + * | {@link ng.directive:ngInclude#animations ngInclude} | enter and leave | + * | {@link ng.directive:ngSwitch#animations ngSwitch} | enter and leave | + * | {@link ng.directive:ngIf#animations ngIf} | enter and leave | + * | {@link ng.directive:ngShow#animations ngShow & ngHide} | show and hide | + * + * You can find out more information about animations upon visiting each directive page. + * + * Below is an example of a directive that makes use of the ngAnimate attribute: + * + *
    + * 
    + * 
    + *
    + * 
    + * 
    + * 
    + * 
    + *
    + * 
    + * 
    + * 
    + * + * The `event1` and `event2` attributes refer to the animation events specific to the directive that has been assigned. + * + * Keep in mind that if an animation is running, no child element of such animation can also be animated. + * + *

    CSS-defined Animations

    + * By default, ngAnimate attaches two CSS classes per animation event to the DOM element to achieve the animation. + * It is up to you, the developer, to ensure that the animations take place using cross-browser CSS3 transitions as + * well as CSS animations. + * + * The following code below demonstrates how to perform animations using **CSS transitions** with ngAnimate: + * + *
    + * 
    + *
    + * 
    + *
    + * + * The following code below demonstrates how to perform animations using **CSS animations** with ngAnimate: + * + *
    + * 
    + *
    + * 
    + *
    + * + * ngAnimate will first examine any CSS animation code and then fallback to using CSS transitions. + * + * Upon DOM mutation, the event class is added first, then the browser is allowed to reflow the content and then, + * the active class is added to trigger the animation. The ngAnimate directive will automatically extract the duration + * of the animation to determine when the animation ends. Once the animation is over then both CSS classes will be + * removed from the DOM. If a browser does not support CSS transitions or CSS animations then the animation will start and end + * immediately resulting in a DOM element that is at it's final state. This final state is when the DOM element + * has no CSS transition/animation classes surrounding it. + * + *

    JavaScript-defined Animations

    + * In the event that you do not want to use CSS3 transitions or CSS3 animations or if you wish to offer animations to browsers that do not + * yet support them, then you can make use of JavaScript animations defined inside of your AngularJS module. + * + *
    + * var ngModule = angular.module('YourApp', []);
    + * ngModule.animation('animate-enter', function() {
    + *   return {
    + *     setup : function(element) {
    + *       //prepare the element for animation
    + *       element.css({ 'opacity': 0 });
    + *       var memo = "..."; //this value is passed to the start function
    + *       return memo;
    + *     },
    + *     start : function(element, done, memo) {
    + *       //start the animation
    + *       element.animate({
    + *         'opacity' : 1
    + *       }, function() {
    + *         //call when the animation is complete
    + *         done()
    + *       });
    + *     }
    + *   }
    + * });
    + * 
    + * + * As you can see, the JavaScript code follows a similar template to the CSS3 animations. Once defined, the animation + * can be used in the same way with the ngAnimate attribute. Keep in mind that, when using JavaScript-enabled + * animations, ngAnimate will also add in the same CSS classes that CSS-enabled animations do (even if you're not using + * CSS animations) to animated the element, but it will not attempt to find any CSS3 transition or animation duration/delay values. + * It will instead close off the animation once the provided done function is executed. So it's important that you + * make sure your animations remember to fire off the done function once the animations are complete. + * + * @param {expression} ngAnimate Used to configure the DOM manipulation animations. + * + */ + +var $AnimatorProvider = function() { + var NG_ANIMATE_CONTROLLER = '$ngAnimateController'; + var rootAnimateController = {running:true}; + + this.$get = ['$animation', '$window', '$sniffer', '$rootElement', '$rootScope', + function($animation, $window, $sniffer, $rootElement, $rootScope) { + $rootElement.data(NG_ANIMATE_CONTROLLER, rootAnimateController); + + /** + * @ngdoc function + * @name ng.$animator + * @function + * + * @description + * The $animator.create service provides the DOM manipulation API which is decorated with animations. + * + * @param {Scope} scope the scope for the ng-animate. + * @param {Attributes} attr the attributes object which contains the ngAnimate key / value pair. (The attributes are + * passed into the linking function of the directive using the `$animator`.) + * @return {object} the animator object which contains the enter, leave, move, show, hide and animate methods. + */ + var AnimatorService = function(scope, attrs) { + var animator = {}; + + /** + * @ngdoc function + * @name ng.animator#enter + * @methodOf ng.$animator + * @function + * + * @description + * Injects the element object into the DOM (inside of the parent element) and then runs the enter animation. + * + * @param {jQuery/jqLite element} element the element that will be the focus of the enter animation + * @param {jQuery/jqLite element} parent the parent element of the element that will be the focus of the enter animation + * @param {jQuery/jqLite element} after the sibling element (which is the previous element) of the element that will be the focus of the enter animation + */ + animator.enter = animateActionFactory('enter', insert, noop); + + /** + * @ngdoc function + * @name ng.animator#leave + * @methodOf ng.$animator + * @function + * + * @description + * Runs the leave animation operation and, upon completion, removes the element from the DOM. + * + * @param {jQuery/jqLite element} element the element that will be the focus of the leave animation + * @param {jQuery/jqLite element} parent the parent element of the element that will be the focus of the leave animation + */ + animator.leave = animateActionFactory('leave', noop, remove); + + /** + * @ngdoc function + * @name ng.animator#move + * @methodOf ng.$animator + * @function + * + * @description + * Fires the move DOM operation. Just before the animation starts, the animator will either append it into the parent container or + * add the element directly after the after element if present. Then the move animation will be run. + * + * @param {jQuery/jqLite element} element the element that will be the focus of the move animation + * @param {jQuery/jqLite element} parent the parent element of the element that will be the focus of the move animation + * @param {jQuery/jqLite element} after the sibling element (which is the previous element) of the element that will be the focus of the move animation + */ + animator.move = animateActionFactory('move', move, noop); + + /** + * @ngdoc function + * @name ng.animator#show + * @methodOf ng.$animator + * @function + * + * @description + * Reveals the element by setting the CSS property `display` to `block` and then starts the show animation directly after. + * + * @param {jQuery/jqLite element} element the element that will be rendered visible or hidden + */ + animator.show = animateActionFactory('show', show, noop); + + /** + * @ngdoc function + * @name ng.animator#hide + * @methodOf ng.$animator + * + * @description + * Starts the hide animation first and sets the CSS `display` property to `none` upon completion. + * + * @param {jQuery/jqLite element} element the element that will be rendered visible or hidden + */ + animator.hide = animateActionFactory('hide', noop, hide); + + /** + * @ngdoc function + * @name ng.animator#animate + * @methodOf ng.$animator + * + * @description + * Triggers a custom animation event to be executed on the given element + * + * @param {jQuery/jqLite element} element that will be animated + */ + animator.animate = function(event, element) { + animateActionFactory(event, noop, noop)(element); + } + return animator; + + function animateActionFactory(type, beforeFn, afterFn) { + return function(element, parent, after) { + var ngAnimateValue = scope.$eval(attrs.ngAnimate); + var className = ngAnimateValue + ? isObject(ngAnimateValue) ? ngAnimateValue[type] : ngAnimateValue + '-' + type + : ''; + var animationPolyfill = $animation(className); + var polyfillSetup = animationPolyfill && animationPolyfill.setup; + var polyfillStart = animationPolyfill && animationPolyfill.start; + var polyfillCancel = animationPolyfill && animationPolyfill.cancel; + + if (!className) { + beforeFn(element, parent, after); + afterFn(element, parent, after); + } else { + var activeClassName = className + '-active'; + + if (!parent) { + parent = after ? after.parent() : element.parent(); + } + if ((!$sniffer.transitions && !polyfillSetup && !polyfillStart) || + (parent.inheritedData(NG_ANIMATE_CONTROLLER) || noop).running) { + beforeFn(element, parent, after); + afterFn(element, parent, after); + return; + } + + var animationData = element.data(NG_ANIMATE_CONTROLLER) || {}; + if(animationData.running) { + (polyfillCancel || noop)(element); + animationData.done(); + } + + element.data(NG_ANIMATE_CONTROLLER, {running:true, done:done}); + element.addClass(className); + beforeFn(element, parent, after); + if (element.length == 0) return done(); + + var memento = (polyfillSetup || noop)(element); + + // $window.setTimeout(beginAnimation, 0); this was causing the element not to animate + // keep at 1 for animation dom rerender + $window.setTimeout(beginAnimation, 1); + } + + function parseMaxTime(str) { + var total = 0, values = isString(str) ? str.split(/\s*,\s*/) : []; + forEach(values, function(value) { + total = Math.max(parseFloat(value) || 0, total); + }); + return total; + } + + function beginAnimation() { + element.addClass(activeClassName); + if (polyfillStart) { + polyfillStart(element, done, memento); + } else if (isFunction($window.getComputedStyle)) { + //one day all browsers will have these properties + var w3cAnimationProp = 'animation'; + var w3cTransitionProp = 'transition'; + + //but some still use vendor-prefixed styles + var vendorAnimationProp = $sniffer.vendorPrefix + 'Animation'; + var vendorTransitionProp = $sniffer.vendorPrefix + 'Transition'; + + var durationKey = 'Duration', + delayKey = 'Delay', + animationIterationCountKey = 'IterationCount', + duration = 0; + + //we want all the styles defined before and after + var ELEMENT_NODE = 1; + forEach(element, function(element) { + if (element.nodeType == ELEMENT_NODE) { + var w3cProp = w3cTransitionProp, + vendorProp = vendorTransitionProp, + iterations = 1, + elementStyles = $window.getComputedStyle(element) || {}; + + //use CSS Animations over CSS Transitions + if(parseFloat(elementStyles[w3cAnimationProp + durationKey]) > 0 || + parseFloat(elementStyles[vendorAnimationProp + durationKey]) > 0) { + w3cProp = w3cAnimationProp; + vendorProp = vendorAnimationProp; + iterations = Math.max(parseInt(elementStyles[w3cProp + animationIterationCountKey]) || 0, + parseInt(elementStyles[vendorProp + animationIterationCountKey]) || 0, + iterations); + } + + var parsedDelay = Math.max(parseMaxTime(elementStyles[w3cProp + delayKey]), + parseMaxTime(elementStyles[vendorProp + delayKey])); + + var parsedDuration = Math.max(parseMaxTime(elementStyles[w3cProp + durationKey]), + parseMaxTime(elementStyles[vendorProp + durationKey])); + + duration = Math.max(parsedDelay + (iterations * parsedDuration), duration); + } + }); + $window.setTimeout(done, duration * 1000); + } else { + done(); + } + } + + function done() { + if(!done.run) { + done.run = true; + afterFn(element, parent, after); + element.removeClass(className); + element.removeClass(activeClassName); + element.removeData(NG_ANIMATE_CONTROLLER); + } + } + }; + } + + function show(element) { + element.css('display', ''); + } + + function hide(element) { + element.css('display', 'none'); + } + + function insert(element, parent, after) { + if (after) { + after.after(element); + } else { + parent.append(element); + } + } + + function remove(element) { + element.remove(); + } + + function move(element, parent, after) { + // Do not remove element before insert. Removing will cause data associated with the + // element to be dropped. Insert will implicitly do the remove. + insert(element, parent, after); + } + }; + + /** + * @ngdoc function + * @name ng.animator#enabled + * @methodOf ng.$animator + * @function + * + * @param {Boolean=} If provided then set the animation on or off. + * @return {Boolean} Current animation state. + * + * @description + * Globally enables/disables animations. + * + */ + AnimatorService.enabled = function(value) { + if (arguments.length) { + rootAnimateController.running = !value; + } + return !rootAnimateController.running; + }; + + return AnimatorService; + }]; +}; + +/** + * ! This is a private undocumented service ! + * + * @name ng.$browser + * @requires $log + * @description + * This object has two goals: + * + * - hide all the global state in the browser caused by the window object + * - abstract away all the browser specific features and inconsistencies + * + * For tests we provide {@link ngMock.$browser mock implementation} of the `$browser` + * service, which can be used for convenient testing of the application without the interaction with + * the real browser apis. + */ +/** + * @param {object} window The global window object. + * @param {object} document jQuery wrapped document. + * @param {function()} XHR XMLHttpRequest constructor. + * @param {object} $log console.log or an object with the same interface. + * @param {object} $sniffer $sniffer service + */ +function Browser(window, document, $log, $sniffer) { + var self = this, + rawDocument = document[0], + location = window.location, + history = window.history, + setTimeout = window.setTimeout, + clearTimeout = window.clearTimeout, + pendingDeferIds = {}; + + self.isMock = false; + + var outstandingRequestCount = 0; + var outstandingRequestCallbacks = []; + + // TODO(vojta): remove this temporary api + self.$$completeOutstandingRequest = completeOutstandingRequest; + self.$$incOutstandingRequestCount = function() { outstandingRequestCount++; }; + + /** + * Executes the `fn` function(supports currying) and decrements the `outstandingRequestCallbacks` + * counter. If the counter reaches 0, all the `outstandingRequestCallbacks` are executed. + */ + function completeOutstandingRequest(fn) { + try { + fn.apply(null, sliceArgs(arguments, 1)); + } finally { + outstandingRequestCount--; + if (outstandingRequestCount === 0) { + while(outstandingRequestCallbacks.length) { + try { + outstandingRequestCallbacks.pop()(); + } catch (e) { + $log.error(e); + } + } + } + } + } + + /** + * @private + * Note: this method is used only by scenario runner + * TODO(vojta): prefix this method with $$ ? + * @param {function()} callback Function that will be called when no outstanding request + */ + self.notifyWhenNoOutstandingRequests = function(callback) { + // force browser to execute all pollFns - this is needed so that cookies and other pollers fire + // at some deterministic time in respect to the test runner's actions. Leaving things up to the + // regular poller would result in flaky tests. + forEach(pollFns, function(pollFn){ pollFn(); }); + + if (outstandingRequestCount === 0) { + callback(); + } else { + outstandingRequestCallbacks.push(callback); + } + }; + + ////////////////////////////////////////////////////////////// + // Poll Watcher API + ////////////////////////////////////////////////////////////// + var pollFns = [], + pollTimeout; + + /** + * @name ng.$browser#addPollFn + * @methodOf ng.$browser + * + * @param {function()} fn Poll function to add + * + * @description + * Adds a function to the list of functions that poller periodically executes, + * and starts polling if not started yet. + * + * @returns {function()} the added function + */ + self.addPollFn = function(fn) { + if (isUndefined(pollTimeout)) startPoller(100, setTimeout); + pollFns.push(fn); + return fn; + }; + + /** + * @param {number} interval How often should browser call poll functions (ms) + * @param {function()} setTimeout Reference to a real or fake `setTimeout` function. + * + * @description + * Configures the poller to run in the specified intervals, using the specified + * setTimeout fn and kicks it off. + */ + function startPoller(interval, setTimeout) { + (function check() { + forEach(pollFns, function(pollFn){ pollFn(); }); + pollTimeout = setTimeout(check, interval); + })(); + } + + ////////////////////////////////////////////////////////////// + // URL API + ////////////////////////////////////////////////////////////// + + var lastBrowserUrl = location.href, + baseElement = document.find('base'); + + /** + * @name ng.$browser#url + * @methodOf ng.$browser + * + * @description + * GETTER: + * Without any argument, this method just returns current value of location.href. + * + * SETTER: + * With at least one argument, this method sets url to new value. + * If html5 history api supported, pushState/replaceState is used, otherwise + * location.href/location.replace is used. + * Returns its own instance to allow chaining + * + * NOTE: this api is intended for use only by the $location service. Please use the + * {@link ng.$location $location service} to change url. + * + * @param {string} url New url (when used as setter) + * @param {boolean=} replace Should new url replace current history record ? + */ + self.url = function(url, replace) { + // setter + if (url) { + if (lastBrowserUrl == url) return; + lastBrowserUrl = url; + if ($sniffer.history) { + if (replace) history.replaceState(null, '', url); + else { + history.pushState(null, '', url); + // Crazy Opera Bug: http://my.opera.com/community/forums/topic.dml?id=1185462 + baseElement.attr('href', baseElement.attr('href')); + } + } else { + if (replace) location.replace(url); + else location.href = url; + } + return self; + // getter + } else { + // the replacement is a workaround for https://bugzilla.mozilla.org/show_bug.cgi?id=407172 + return location.href.replace(/%27/g,"'"); + } + }; + + var urlChangeListeners = [], + urlChangeInit = false; + + function fireUrlChange() { + if (lastBrowserUrl == self.url()) return; + + lastBrowserUrl = self.url(); + forEach(urlChangeListeners, function(listener) { + listener(self.url()); + }); + } + + /** + * @name ng.$browser#onUrlChange + * @methodOf ng.$browser + * @TODO(vojta): refactor to use node's syntax for events + * + * @description + * Register callback function that will be called, when url changes. + * + * It's only called when the url is changed by outside of angular: + * - user types different url into address bar + * - user clicks on history (forward/back) button + * - user clicks on a link + * + * It's not called when url is changed by $browser.url() method + * + * The listener gets called with new url as parameter. + * + * NOTE: this api is intended for use only by the $location service. Please use the + * {@link ng.$location $location service} to monitor url changes in angular apps. + * + * @param {function(string)} listener Listener function to be called when url changes. + * @return {function(string)} Returns the registered listener fn - handy if the fn is anonymous. + */ + self.onUrlChange = function(callback) { + if (!urlChangeInit) { + // We listen on both (hashchange/popstate) when available, as some browsers (e.g. Opera) + // don't fire popstate when user change the address bar and don't fire hashchange when url + // changed by push/replaceState + + // html5 history api - popstate event + if ($sniffer.history) jqLite(window).bind('popstate', fireUrlChange); + // hashchange event + if ($sniffer.hashchange) jqLite(window).bind('hashchange', fireUrlChange); + // polling + else self.addPollFn(fireUrlChange); + + urlChangeInit = true; + } + + urlChangeListeners.push(callback); + return callback; + }; + + ////////////////////////////////////////////////////////////// + // Misc API + ////////////////////////////////////////////////////////////// + + /** + * Returns current + * (always relative - without domain) + * + * @returns {string=} + */ + self.baseHref = function() { + var href = baseElement.attr('href'); + return href ? href.replace(/^https?\:\/\/[^\/]*/, '') : ''; + }; + + ////////////////////////////////////////////////////////////// + // Cookies API + ////////////////////////////////////////////////////////////// + var lastCookies = {}; + var lastCookieString = ''; + var cookiePath = self.baseHref(); + + /** + * @name ng.$browser#cookies + * @methodOf ng.$browser + * + * @param {string=} name Cookie name + * @param {string=} value Cookie value + * + * @description + * The cookies method provides a 'private' low level access to browser cookies. + * It is not meant to be used directly, use the $cookie service instead. + * + * The return values vary depending on the arguments that the method was called with as follows: + *
      + *
    • cookies() -> hash of all cookies, this is NOT a copy of the internal state, so do not modify it
    • + *
    • cookies(name, value) -> set name to value, if value is undefined delete the cookie
    • + *
    • cookies(name) -> the same as (name, undefined) == DELETES (no one calls it right now that way)
    • + *
    + * + * @returns {Object} Hash of all cookies (if called without any parameter) + */ + self.cookies = function(name, value) { + var cookieLength, cookieArray, cookie, i, index; + + if (name) { + if (value === undefined) { + rawDocument.cookie = escape(name) + "=;path=" + cookiePath + ";expires=Thu, 01 Jan 1970 00:00:00 GMT"; + } else { + if (isString(value)) { + cookieLength = (rawDocument.cookie = escape(name) + '=' + escape(value) + ';path=' + cookiePath).length + 1; + + // per http://www.ietf.org/rfc/rfc2109.txt browser must allow at minimum: + // - 300 cookies + // - 20 cookies per unique domain + // - 4096 bytes per cookie + if (cookieLength > 4096) { + $log.warn("Cookie '"+ name +"' possibly not set or overflowed because it was too large ("+ + cookieLength + " > 4096 bytes)!"); + } + } + } + } else { + if (rawDocument.cookie !== lastCookieString) { + lastCookieString = rawDocument.cookie; + cookieArray = lastCookieString.split("; "); + lastCookies = {}; + + for (i = 0; i < cookieArray.length; i++) { + cookie = cookieArray[i]; + index = cookie.indexOf('='); + if (index > 0) { //ignore nameless cookies + var name = unescape(cookie.substring(0, index)); + // the first value that is seen for a cookie is the most + // specific one. values for the same cookie name that + // follow are for less specific paths. + if (lastCookies[name] === undefined) { + lastCookies[name] = unescape(cookie.substring(index + 1)); + } + } + } + } + return lastCookies; + } + }; + + + /** + * @name ng.$browser#defer + * @methodOf ng.$browser + * @param {function()} fn A function, who's execution should be defered. + * @param {number=} [delay=0] of milliseconds to defer the function execution. + * @returns {*} DeferId that can be used to cancel the task via `$browser.defer.cancel()`. + * + * @description + * Executes a fn asynchronously via `setTimeout(fn, delay)`. + * + * Unlike when calling `setTimeout` directly, in test this function is mocked and instead of using + * `setTimeout` in tests, the fns are queued in an array, which can be programmatically flushed + * via `$browser.defer.flush()`. + * + */ + self.defer = function(fn, delay) { + var timeoutId; + outstandingRequestCount++; + timeoutId = setTimeout(function() { + delete pendingDeferIds[timeoutId]; + completeOutstandingRequest(fn); + }, delay || 0); + pendingDeferIds[timeoutId] = true; + return timeoutId; + }; + + + /** + * @name ng.$browser#defer.cancel + * @methodOf ng.$browser.defer + * + * @description + * Cancels a defered task identified with `deferId`. + * + * @param {*} deferId Token returned by the `$browser.defer` function. + * @returns {boolean} Returns `true` if the task hasn't executed yet and was successfully canceled. + */ + self.defer.cancel = function(deferId) { + if (pendingDeferIds[deferId]) { + delete pendingDeferIds[deferId]; + clearTimeout(deferId); + completeOutstandingRequest(noop); + return true; + } + return false; + }; + +} + +function $BrowserProvider(){ + this.$get = ['$window', '$log', '$sniffer', '$document', + function( $window, $log, $sniffer, $document){ + return new Browser($window, $document, $log, $sniffer); + }]; +} + +/** + * @ngdoc object + * @name ng.$cacheFactory + * + * @description + * Factory that constructs cache objects. + * + * + * @param {string} cacheId Name or id of the newly created cache. + * @param {object=} options Options object that specifies the cache behavior. Properties: + * + * - `{number=}` `capacity` — turns the cache into LRU cache. + * + * @returns {object} Newly created cache object with the following set of methods: + * + * - `{object}` `info()` — Returns id, size, and options of cache. + * - `{{*}}` `put({string} key, {*} value)` — Puts a new key-value pair into the cache and returns it. + * - `{{*}}` `get({string} key)` — Returns cached value for `key` or undefined for cache miss. + * - `{void}` `remove({string} key)` — Removes a key-value pair from the cache. + * - `{void}` `removeAll()` — Removes all cached values. + * - `{void}` `destroy()` — Removes references to this cache from $cacheFactory. + * + */ +function $CacheFactoryProvider() { + + this.$get = function() { + var caches = {}; + + function cacheFactory(cacheId, options) { + if (cacheId in caches) { + throw Error('cacheId ' + cacheId + ' taken'); + } + + var size = 0, + stats = extend({}, options, {id: cacheId}), + data = {}, + capacity = (options && options.capacity) || Number.MAX_VALUE, + lruHash = {}, + freshEnd = null, + staleEnd = null; + + return caches[cacheId] = { + + put: function(key, value) { + var lruEntry = lruHash[key] || (lruHash[key] = {key: key}); + + refresh(lruEntry); + + if (isUndefined(value)) return; + if (!(key in data)) size++; + data[key] = value; + + if (size > capacity) { + this.remove(staleEnd.key); + } + + return value; + }, + + + get: function(key) { + var lruEntry = lruHash[key]; + + if (!lruEntry) return; + + refresh(lruEntry); + + return data[key]; + }, + + + remove: function(key) { + var lruEntry = lruHash[key]; + + if (!lruEntry) return; + + if (lruEntry == freshEnd) freshEnd = lruEntry.p; + if (lruEntry == staleEnd) staleEnd = lruEntry.n; + link(lruEntry.n,lruEntry.p); + + delete lruHash[key]; + delete data[key]; + size--; + }, + + + removeAll: function() { + data = {}; + size = 0; + lruHash = {}; + freshEnd = staleEnd = null; + }, + + + destroy: function() { + data = null; + stats = null; + lruHash = null; + delete caches[cacheId]; + }, + + + info: function() { + return extend({}, stats, {size: size}); + } + }; + + + /** + * makes the `entry` the freshEnd of the LRU linked list + */ + function refresh(entry) { + if (entry != freshEnd) { + if (!staleEnd) { + staleEnd = entry; + } else if (staleEnd == entry) { + staleEnd = entry.n; + } + + link(entry.n, entry.p); + link(entry, freshEnd); + freshEnd = entry; + freshEnd.n = null; + } + } + + + /** + * bidirectionally links two entries of the LRU linked list + */ + function link(nextEntry, prevEntry) { + if (nextEntry != prevEntry) { + if (nextEntry) nextEntry.p = prevEntry; //p stands for previous, 'prev' didn't minify + if (prevEntry) prevEntry.n = nextEntry; //n stands for next, 'next' didn't minify + } + } + } + + + cacheFactory.info = function() { + var info = {}; + forEach(caches, function(cache, cacheId) { + info[cacheId] = cache.info(); + }); + return info; + }; + + + cacheFactory.get = function(cacheId) { + return caches[cacheId]; + }; + + + return cacheFactory; + }; +} + +/** + * @ngdoc object + * @name ng.$templateCache + * + * @description + * Cache used for storing html templates. + * + * See {@link ng.$cacheFactory $cacheFactory}. + * + */ +function $TemplateCacheProvider() { + this.$get = ['$cacheFactory', function($cacheFactory) { + return $cacheFactory('templates'); + }]; +} + +/* ! VARIABLE/FUNCTION NAMING CONVENTIONS THAT APPLY TO THIS FILE! + * + * DOM-related variables: + * + * - "node" - DOM Node + * - "element" - DOM Element or Node + * - "$node" or "$element" - jqLite-wrapped node or element + * + * + * Compiler related stuff: + * + * - "linkFn" - linking fn of a single directive + * - "nodeLinkFn" - function that aggregates all linking fns for a particular node + * - "childLinkFn" - function that aggregates all linking fns for child nodes of a particular node + * - "compositeLinkFn" - function that aggregates all linking fns for a compilation root (nodeList) + */ + + +var NON_ASSIGNABLE_MODEL_EXPRESSION = 'Non-assignable model expression: '; + + +/** + * @ngdoc function + * @name ng.$compile + * @function + * + * @description + * Compiles a piece of HTML string or DOM into a template and produces a template function, which + * can then be used to link {@link ng.$rootScope.Scope scope} and the template together. + * + * The compilation is a process of walking the DOM tree and trying to match DOM elements to + * {@link ng.$compileProvider#directive directives}. For each match it + * executes corresponding template function and collects the + * instance functions into a single template function which is then returned. + * + * The template function can then be used once to produce the view or as it is the case with + * {@link ng.directive:ngRepeat repeater} many-times, in which + * case each call results in a view that is a DOM clone of the original template. + * + + + +
    +
    +
    +
    +
    +
    + + it('should auto compile', function() { + expect(element('div[compile]').text()).toBe('Hello Angular'); + input('html').enter('{{name}}!'); + expect(element('div[compile]').text()).toBe('Angular!'); + }); + +
    + + * + * + * @param {string|DOMElement} element Element or HTML string to compile into a template function. + * @param {function(angular.Scope[, cloneAttachFn]} transclude function available to directives. + * @param {number} maxPriority only apply directives lower then given priority (Only effects the + * root element(s), not their children) + * @returns {function(scope[, cloneAttachFn])} a link function which is used to bind template + * (a DOM element/tree) to a scope. Where: + * + * * `scope` - A {@link ng.$rootScope.Scope Scope} to bind to. + * * `cloneAttachFn` - If `cloneAttachFn` is provided, then the link function will clone the + * `template` and call the `cloneAttachFn` function allowing the caller to attach the + * cloned elements to the DOM document at the appropriate place. The `cloneAttachFn` is + * called as:
    `cloneAttachFn(clonedElement, scope)` where: + * + * * `clonedElement` - is a clone of the original `element` passed into the compiler. + * * `scope` - is the current scope with which the linking function is working with. + * + * Calling the linking function returns the element of the template. It is either the original element + * passed in, or the clone of the element if the `cloneAttachFn` is provided. + * + * After linking the view is not updated until after a call to $digest which typically is done by + * Angular automatically. + * + * If you need access to the bound view, there are two ways to do it: + * + * - If you are not asking the linking function to clone the template, create the DOM element(s) + * before you send them to the compiler and keep this reference around. + *
    + *     var element = $compile('

    {{total}}

    ')(scope); + *
    + * + * - if on the other hand, you need the element to be cloned, the view reference from the original + * example would not point to the clone, but rather to the original template that was cloned. In + * this case, you can access the clone via the cloneAttachFn: + *
    + *     var templateHTML = angular.element('

    {{total}}

    '), + * scope = ....; + * + * var clonedElement = $compile(templateHTML)(scope, function(clonedElement, scope) { + * //attach the clone to DOM document at the right place + * }); + * + * //now we have reference to the cloned DOM via `clone` + *
    + * + * + * For information on how the compiler works, see the + * {@link guide/compiler Angular HTML Compiler} section of the Developer Guide. + */ + + +/** + * @ngdoc service + * @name ng.$compileProvider + * @function + * + * @description + */ +$CompileProvider.$inject = ['$provide']; +function $CompileProvider($provide) { + var hasDirectives = {}, + Suffix = 'Directive', + COMMENT_DIRECTIVE_REGEXP = /^\s*directive\:\s*([\d\w\-_]+)\s+(.*)$/, + CLASS_DIRECTIVE_REGEXP = /(([\d\w\-_]+)(?:\:([^;]+))?;?)/, + MULTI_ROOT_TEMPLATE_ERROR = 'Template must have exactly one root element. was: ', + urlSanitizationWhitelist = /^\s*(https?|ftp|mailto|file):/; + + + /** + * @ngdoc function + * @name ng.$compileProvider#directive + * @methodOf ng.$compileProvider + * @function + * + * @description + * Register a new directives with the compiler. + * + * @param {string} name Name of the directive in camel-case. (ie ngBind which will match as + * ng-bind). + * @param {function} directiveFactory An injectable directive factory function. See {@link guide/directive} for more + * info. + * @returns {ng.$compileProvider} Self for chaining. + */ + this.directive = function registerDirective(name, directiveFactory) { + if (isString(name)) { + assertArg(directiveFactory, 'directive'); + if (!hasDirectives.hasOwnProperty(name)) { + hasDirectives[name] = []; + $provide.factory(name + Suffix, ['$injector', '$exceptionHandler', + function($injector, $exceptionHandler) { + var directives = []; + forEach(hasDirectives[name], function(directiveFactory) { + try { + var directive = $injector.invoke(directiveFactory); + if (isFunction(directive)) { + directive = { compile: valueFn(directive) }; + } else if (!directive.compile && directive.link) { + directive.compile = valueFn(directive.link); + } + directive.priority = directive.priority || 0; + directive.name = directive.name || name; + directive.require = directive.require || (directive.controller && directive.name); + directive.restrict = directive.restrict || 'A'; + directives.push(directive); + } catch (e) { + $exceptionHandler(e); + } + }); + return directives; + }]); + } + hasDirectives[name].push(directiveFactory); + } else { + forEach(name, reverseParams(registerDirective)); + } + return this; + }; + + + /** + * @ngdoc function + * @name ng.$compileProvider#urlSanitizationWhitelist + * @methodOf ng.$compileProvider + * @function + * + * @description + * Retrieves or overrides the default regular expression that is used for whitelisting of safe + * urls during a[href] sanitization. + * + * The sanitization is a security measure aimed at prevent XSS attacks via html links. + * + * Any url about to be assigned to a[href] via data-binding is first normalized and turned into an + * absolute url. Afterwards the url is matched against the `urlSanitizationWhitelist` regular + * expression. If a match is found the original url is written into the dom. Otherwise the + * absolute url is prefixed with `'unsafe:'` string and only then it is written into the DOM. + * + * @param {RegExp=} regexp New regexp to whitelist urls with. + * @returns {RegExp|ng.$compileProvider} Current RegExp if called without value or self for + * chaining otherwise. + */ + this.urlSanitizationWhitelist = function(regexp) { + if (isDefined(regexp)) { + urlSanitizationWhitelist = regexp; + return this; + } + return urlSanitizationWhitelist; + }; + + + this.$get = [ + '$injector', '$interpolate', '$exceptionHandler', '$http', '$templateCache', '$parse', + '$controller', '$rootScope', '$document', + function($injector, $interpolate, $exceptionHandler, $http, $templateCache, $parse, + $controller, $rootScope, $document) { + + var Attributes = function(element, attr) { + this.$$element = element; + this.$attr = attr || {}; + }; + + Attributes.prototype = { + $normalize: directiveNormalize, + + + /** + * Set a normalized attribute on the element in a way such that all directives + * can share the attribute. This function properly handles boolean attributes. + * @param {string} key Normalized key. (ie ngAttribute) + * @param {string|boolean} value The value to set. If `null` attribute will be deleted. + * @param {boolean=} writeAttr If false, does not write the value to DOM element attribute. + * Defaults to true. + * @param {string=} attrName Optional none normalized name. Defaults to key. + */ + $set: function(key, value, writeAttr, attrName) { + var booleanKey = getBooleanAttrName(this.$$element[0], key), + $$observers = this.$$observers, + normalizedVal; + + if (booleanKey) { + this.$$element.prop(key, value); + attrName = booleanKey; + } + + this[key] = value; + + // translate normalized key to actual key + if (attrName) { + this.$attr[key] = attrName; + } else { + attrName = this.$attr[key]; + if (!attrName) { + this.$attr[key] = attrName = snake_case(key, '-'); + } + } + + + // sanitize a[href] values + if (nodeName_(this.$$element[0]) === 'A' && key === 'href') { + urlSanitizationNode.setAttribute('href', value); + + // href property always returns normalized absolute url, so we can match against that + normalizedVal = urlSanitizationNode.href; + if (!normalizedVal.match(urlSanitizationWhitelist)) { + this[key] = value = 'unsafe:' + normalizedVal; + } + } + + + if (writeAttr !== false) { + if (value === null || value === undefined) { + this.$$element.removeAttr(attrName); + } else { + this.$$element.attr(attrName, value); + } + } + + // fire observers + $$observers && forEach($$observers[key], function(fn) { + try { + fn(value); + } catch (e) { + $exceptionHandler(e); + } + }); + }, + + + /** + * Observe an interpolated attribute. + * The observer will never be called, if given attribute is not interpolated. + * + * @param {string} key Normalized key. (ie ngAttribute) . + * @param {function(*)} fn Function that will be called whenever the attribute value changes. + * @returns {function(*)} the `fn` Function passed in. + */ + $observe: function(key, fn) { + var attrs = this, + $$observers = (attrs.$$observers || (attrs.$$observers = {})), + listeners = ($$observers[key] || ($$observers[key] = [])); + + listeners.push(fn); + $rootScope.$evalAsync(function() { + if (!listeners.$$inter) { + // no one registered attribute interpolation function, so lets call it manually + fn(attrs[key]); + } + }); + return fn; + } + }; + + var urlSanitizationNode = $document[0].createElement('a'), + startSymbol = $interpolate.startSymbol(), + endSymbol = $interpolate.endSymbol(), + denormalizeTemplate = (startSymbol == '{{' || endSymbol == '}}') + ? identity + : function denormalizeTemplate(template) { + return template.replace(/\{\{/g, startSymbol).replace(/}}/g, endSymbol); + }, + NG_ATTR_BINDING = /^ngAttr[A-Z]/; + + + return compile; + + //================================ + + function compile($compileNodes, transcludeFn, maxPriority) { + if (!($compileNodes instanceof jqLite)) { + // jquery always rewraps, whereas we need to preserve the original selector so that we can modify it. + $compileNodes = jqLite($compileNodes); + } + // We can not compile top level text elements since text nodes can be merged and we will + // not be able to attach scope data to them, so we will wrap them in + forEach($compileNodes, function(node, index){ + if (node.nodeType == 3 /* text node */ && node.nodeValue.match(/\S+/) /* non-empty */ ) { + $compileNodes[index] = jqLite(node).wrap('').parent()[0]; + } + }); + var compositeLinkFn = compileNodes($compileNodes, transcludeFn, $compileNodes, maxPriority); + return function publicLinkFn(scope, cloneConnectFn){ + assertArg(scope, 'scope'); + // important!!: we must call our jqLite.clone() since the jQuery one is trying to be smart + // and sometimes changes the structure of the DOM. + var $linkNode = cloneConnectFn + ? JQLitePrototype.clone.call($compileNodes) // IMPORTANT!!! + : $compileNodes; + + // Attach scope only to non-text nodes. + for(var i = 0, ii = $linkNode.length; i + addDirective(directives, + directiveNormalize(nodeName_(node).toLowerCase()), 'E', maxPriority); + + // iterate over the attributes + for (var attr, name, nName, ngAttrName, value, nAttrs = node.attributes, + j = 0, jj = nAttrs && nAttrs.length; j < jj; j++) { + attr = nAttrs[j]; + if (attr.specified) { + name = attr.name; + // support ngAttr attribute binding + ngAttrName = directiveNormalize(name); + if (NG_ATTR_BINDING.test(ngAttrName)) { + name = ngAttrName.substr(6).toLowerCase(); + } + nName = directiveNormalize(name.toLowerCase()); + attrsMap[nName] = name; + attrs[nName] = value = trim((msie && name == 'href') + ? decodeURIComponent(node.getAttribute(name, 2)) + : attr.value); + if (getBooleanAttrName(node, nName)) { + attrs[nName] = true; // presence means true + } + addAttrInterpolateDirective(node, directives, value, nName); + addDirective(directives, nName, 'A', maxPriority); + } + } + + // use class as directive + className = node.className; + if (isString(className) && className !== '') { + while (match = CLASS_DIRECTIVE_REGEXP.exec(className)) { + nName = directiveNormalize(match[2]); + if (addDirective(directives, nName, 'C', maxPriority)) { + attrs[nName] = trim(match[3]); + } + className = className.substr(match.index + match[0].length); + } + } + break; + case 3: /* Text Node */ + addTextInterpolateDirective(directives, node.nodeValue); + break; + case 8: /* Comment */ + try { + match = COMMENT_DIRECTIVE_REGEXP.exec(node.nodeValue); + if (match) { + nName = directiveNormalize(match[1]); + if (addDirective(directives, nName, 'M', maxPriority)) { + attrs[nName] = trim(match[2]); + } + } + } catch (e) { + // turns out that under some circumstances IE9 throws errors when one attempts to read comment's node value. + // Just ignore it and continue. (Can't seem to reproduce in test case.) + } + break; + } + + directives.sort(byPriority); + return directives; + } + + + /** + * Once the directives have been collected, their compile functions are executed. This method + * is responsible for inlining directive templates as well as terminating the application + * of the directives if the terminal directive has been reached. + * + * @param {Array} directives Array of collected directives to execute their compile function. + * this needs to be pre-sorted by priority order. + * @param {Node} compileNode The raw DOM node to apply the compile functions to + * @param {Object} templateAttrs The shared attribute function + * @param {function(angular.Scope[, cloneAttachFn]} transcludeFn A linking function, where the + * scope argument is auto-generated to the new child of the transcluded parent scope. + * @param {JQLite} jqCollection If we are working on the root of the compile tree then this + * argument has the root jqLite array so that we can replace nodes on it. + * @returns linkFn + */ + function applyDirectivesToNode(directives, compileNode, templateAttrs, transcludeFn, jqCollection) { + var terminalPriority = -Number.MAX_VALUE, + preLinkFns = [], + postLinkFns = [], + newScopeDirective = null, + newIsolateScopeDirective = null, + templateDirective = null, + $compileNode = templateAttrs.$$element = jqLite(compileNode), + directive, + directiveName, + $template, + transcludeDirective, + childTranscludeFn = transcludeFn, + controllerDirectives, + linkFn, + directiveValue; + + // executes all directives on the current element + for(var i = 0, ii = directives.length; i < ii; i++) { + directive = directives[i]; + $template = undefined; + + if (terminalPriority > directive.priority) { + break; // prevent further processing of directives + } + + if (directiveValue = directive.scope) { + assertNoDuplicate('isolated scope', newIsolateScopeDirective, directive, $compileNode); + if (isObject(directiveValue)) { + safeAddClass($compileNode, 'ng-isolate-scope'); + newIsolateScopeDirective = directive; + } + safeAddClass($compileNode, 'ng-scope'); + newScopeDirective = newScopeDirective || directive; + } + + directiveName = directive.name; + + if (directiveValue = directive.controller) { + controllerDirectives = controllerDirectives || {}; + assertNoDuplicate("'" + directiveName + "' controller", + controllerDirectives[directiveName], directive, $compileNode); + controllerDirectives[directiveName] = directive; + } + + if (directiveValue = directive.transclude) { + assertNoDuplicate('transclusion', transcludeDirective, directive, $compileNode); + transcludeDirective = directive; + terminalPriority = directive.priority; + if (directiveValue == 'element') { + $template = jqLite(compileNode); + $compileNode = templateAttrs.$$element = + jqLite(document.createComment(' ' + directiveName + ': ' + templateAttrs[directiveName] + ' ')); + compileNode = $compileNode[0]; + replaceWith(jqCollection, jqLite($template[0]), compileNode); + childTranscludeFn = compile($template, transcludeFn, terminalPriority); + } else { + $template = jqLite(JQLiteClone(compileNode)).contents(); + $compileNode.html(''); // clear contents + childTranscludeFn = compile($template, transcludeFn); + } + } + + if (directive.template) { + assertNoDuplicate('template', templateDirective, directive, $compileNode); + templateDirective = directive; + + directiveValue = (isFunction(directive.template)) + ? directive.template($compileNode, templateAttrs) + : directive.template; + + directiveValue = denormalizeTemplate(directiveValue); + + if (directive.replace) { + $template = jqLite('
    ' + + trim(directiveValue) + + '
    ').contents(); + compileNode = $template[0]; + + if ($template.length != 1 || compileNode.nodeType !== 1) { + throw new Error(MULTI_ROOT_TEMPLATE_ERROR + directiveValue); + } + + replaceWith(jqCollection, $compileNode, compileNode); + + var newTemplateAttrs = {$attr: {}}; + + // combine directives from the original node and from the template: + // - take the array of directives for this element + // - split it into two parts, those that were already applied and those that weren't + // - collect directives from the template, add them to the second group and sort them + // - append the second group with new directives to the first group + directives = directives.concat( + collectDirectives( + compileNode, + directives.splice(i + 1, directives.length - (i + 1)), + newTemplateAttrs + ) + ); + mergeTemplateAttributes(templateAttrs, newTemplateAttrs); + + ii = directives.length; + } else { + $compileNode.html(directiveValue); + } + } + + if (directive.templateUrl) { + assertNoDuplicate('template', templateDirective, directive, $compileNode); + templateDirective = directive; + nodeLinkFn = compileTemplateUrl(directives.splice(i, directives.length - i), + nodeLinkFn, $compileNode, templateAttrs, jqCollection, directive.replace, + childTranscludeFn); + ii = directives.length; + } else if (directive.compile) { + try { + linkFn = directive.compile($compileNode, templateAttrs, childTranscludeFn); + if (isFunction(linkFn)) { + addLinkFns(null, linkFn); + } else if (linkFn) { + addLinkFns(linkFn.pre, linkFn.post); + } + } catch (e) { + $exceptionHandler(e, startingTag($compileNode)); + } + } + + if (directive.terminal) { + nodeLinkFn.terminal = true; + terminalPriority = Math.max(terminalPriority, directive.priority); + } + + } + + nodeLinkFn.scope = newScopeDirective && newScopeDirective.scope; + nodeLinkFn.transclude = transcludeDirective && childTranscludeFn; + + // might be normal or delayed nodeLinkFn depending on if templateUrl is present + return nodeLinkFn; + + //////////////////// + + function addLinkFns(pre, post) { + if (pre) { + pre.require = directive.require; + preLinkFns.push(pre); + } + if (post) { + post.require = directive.require; + postLinkFns.push(post); + } + } + + + function getControllers(require, $element) { + var value, retrievalMethod = 'data', optional = false; + if (isString(require)) { + while((value = require.charAt(0)) == '^' || value == '?') { + require = require.substr(1); + if (value == '^') { + retrievalMethod = 'inheritedData'; + } + optional = optional || value == '?'; + } + value = $element[retrievalMethod]('$' + require + 'Controller'); + if (!value && !optional) { + throw Error("No controller: " + require); + } + return value; + } else if (isArray(require)) { + value = []; + forEach(require, function(require) { + value.push(getControllers(require, $element)); + }); + } + return value; + } + + + function nodeLinkFn(childLinkFn, scope, linkNode, $rootElement, boundTranscludeFn) { + var attrs, $element, i, ii, linkFn, controller; + + if (compileNode === linkNode) { + attrs = templateAttrs; + } else { + attrs = shallowCopy(templateAttrs, new Attributes(jqLite(linkNode), templateAttrs.$attr)); + } + $element = attrs.$$element; + + if (newIsolateScopeDirective) { + var LOCAL_REGEXP = /^\s*([@=&])(\??)\s*(\w*)\s*$/; + + var parentScope = scope.$parent || scope; + + forEach(newIsolateScopeDirective.scope, function(definiton, scopeName) { + var match = definiton.match(LOCAL_REGEXP) || [], + attrName = match[3] || scopeName, + optional = (match[2] == '?'), + mode = match[1], // @, =, or & + lastValue, + parentGet, parentSet; + + scope.$$isolateBindings[scopeName] = mode + attrName; + + switch (mode) { + + case '@': { + attrs.$observe(attrName, function(value) { + scope[scopeName] = value; + }); + attrs.$$observers[attrName].$$scope = parentScope; + if( attrs[attrName] ) { + // If the attribute has been provided then we trigger an interpolation to ensure the value is there for use in the link fn + scope[scopeName] = $interpolate(attrs[attrName])(parentScope); + } + break; + } + + case '=': { + if (optional && !attrs[attrName]) { + return; + } + parentGet = $parse(attrs[attrName]); + parentSet = parentGet.assign || function() { + // reset the change, or we will throw this exception on every $digest + lastValue = scope[scopeName] = parentGet(parentScope); + throw Error(NON_ASSIGNABLE_MODEL_EXPRESSION + attrs[attrName] + + ' (directive: ' + newIsolateScopeDirective.name + ')'); + }; + lastValue = scope[scopeName] = parentGet(parentScope); + scope.$watch(function parentValueWatch() { + var parentValue = parentGet(parentScope); + + if (parentValue !== scope[scopeName]) { + // we are out of sync and need to copy + if (parentValue !== lastValue) { + // parent changed and it has precedence + lastValue = scope[scopeName] = parentValue; + } else { + // if the parent can be assigned then do so + parentSet(parentScope, parentValue = lastValue = scope[scopeName]); + } + } + return parentValue; + }); + break; + } + + case '&': { + parentGet = $parse(attrs[attrName]); + scope[scopeName] = function(locals) { + return parentGet(parentScope, locals); + }; + break; + } + + default: { + throw Error('Invalid isolate scope definition for directive ' + + newIsolateScopeDirective.name + ': ' + definiton); + } + } + }); + } + + if (controllerDirectives) { + forEach(controllerDirectives, function(directive) { + var locals = { + $scope: scope, + $element: $element, + $attrs: attrs, + $transclude: boundTranscludeFn + }; + + controller = directive.controller; + if (controller == '@') { + controller = attrs[directive.name]; + } + + $element.data( + '$' + directive.name + 'Controller', + $controller(controller, locals)); + }); + } + + // PRELINKING + for(i = 0, ii = preLinkFns.length; i < ii; i++) { + try { + linkFn = preLinkFns[i]; + linkFn(scope, $element, attrs, + linkFn.require && getControllers(linkFn.require, $element)); + } catch (e) { + $exceptionHandler(e, startingTag($element)); + } + } + + // RECURSION + childLinkFn && childLinkFn(scope, linkNode.childNodes, undefined, boundTranscludeFn); + + // POSTLINKING + for(i = 0, ii = postLinkFns.length; i < ii; i++) { + try { + linkFn = postLinkFns[i]; + linkFn(scope, $element, attrs, + linkFn.require && getControllers(linkFn.require, $element)); + } catch (e) { + $exceptionHandler(e, startingTag($element)); + } + } + } + } + + + /** + * looks up the directive and decorates it with exception handling and proper parameters. We + * call this the boundDirective. + * + * @param {string} name name of the directive to look up. + * @param {string} location The directive must be found in specific format. + * String containing any of theses characters: + * + * * `E`: element name + * * `A': attribute + * * `C`: class + * * `M`: comment + * @returns true if directive was added. + */ + function addDirective(tDirectives, name, location, maxPriority) { + var match = false; + if (hasDirectives.hasOwnProperty(name)) { + for(var directive, directives = $injector.get(name + Suffix), + i = 0, ii = directives.length; i directive.priority) && + directive.restrict.indexOf(location) != -1) { + tDirectives.push(directive); + match = true; + } + } catch(e) { $exceptionHandler(e); } + } + } + return match; + } + + + /** + * When the element is replaced with HTML template then the new attributes + * on the template need to be merged with the existing attributes in the DOM. + * The desired effect is to have both of the attributes present. + * + * @param {object} dst destination attributes (original DOM) + * @param {object} src source attributes (from the directive template) + */ + function mergeTemplateAttributes(dst, src) { + var srcAttr = src.$attr, + dstAttr = dst.$attr, + $element = dst.$$element; + + // reapply the old attributes to the new element + forEach(dst, function(value, key) { + if (key.charAt(0) != '$') { + if (src[key]) { + value += (key === 'style' ? ';' : ' ') + src[key]; + } + dst.$set(key, value, true, srcAttr[key]); + } + }); + + // copy the new attributes on the old attrs object + forEach(src, function(value, key) { + if (key == 'class') { + safeAddClass($element, value); + dst['class'] = (dst['class'] ? dst['class'] + ' ' : '') + value; + } else if (key == 'style') { + $element.attr('style', $element.attr('style') + ';' + value); + } else if (key.charAt(0) != '$' && !dst.hasOwnProperty(key)) { + dst[key] = value; + dstAttr[key] = srcAttr[key]; + } + }); + } + + + function compileTemplateUrl(directives, beforeTemplateNodeLinkFn, $compileNode, tAttrs, + $rootElement, replace, childTranscludeFn) { + var linkQueue = [], + afterTemplateNodeLinkFn, + afterTemplateChildLinkFn, + beforeTemplateCompileNode = $compileNode[0], + origAsyncDirective = directives.shift(), + // The fact that we have to copy and patch the directive seems wrong! + derivedSyncDirective = extend({}, origAsyncDirective, { + controller: null, templateUrl: null, transclude: null, scope: null + }), + templateUrl = (isFunction(origAsyncDirective.templateUrl)) + ? origAsyncDirective.templateUrl($compileNode, tAttrs) + : origAsyncDirective.templateUrl; + + $compileNode.html(''); + + $http.get(templateUrl, {cache: $templateCache}). + success(function(content) { + var compileNode, tempTemplateAttrs, $template; + + content = denormalizeTemplate(content); + + if (replace) { + $template = jqLite('
    ' + trim(content) + '
    ').contents(); + compileNode = $template[0]; + + if ($template.length != 1 || compileNode.nodeType !== 1) { + throw new Error(MULTI_ROOT_TEMPLATE_ERROR + content); + } + + tempTemplateAttrs = {$attr: {}}; + replaceWith($rootElement, $compileNode, compileNode); + collectDirectives(compileNode, directives, tempTemplateAttrs); + mergeTemplateAttributes(tAttrs, tempTemplateAttrs); + } else { + compileNode = beforeTemplateCompileNode; + $compileNode.html(content); + } + + directives.unshift(derivedSyncDirective); + afterTemplateNodeLinkFn = applyDirectivesToNode(directives, compileNode, tAttrs, childTranscludeFn); + afterTemplateChildLinkFn = compileNodes($compileNode[0].childNodes, childTranscludeFn); + + + while(linkQueue.length) { + var scope = linkQueue.shift(), + beforeTemplateLinkNode = linkQueue.shift(), + linkRootElement = linkQueue.shift(), + controller = linkQueue.shift(), + linkNode = compileNode; + + if (beforeTemplateLinkNode !== beforeTemplateCompileNode) { + // it was cloned therefore we have to clone as well. + linkNode = JQLiteClone(compileNode); + replaceWith(linkRootElement, jqLite(beforeTemplateLinkNode), linkNode); + } + + afterTemplateNodeLinkFn(function() { + beforeTemplateNodeLinkFn(afterTemplateChildLinkFn, scope, linkNode, $rootElement, controller); + }, scope, linkNode, $rootElement, controller); + } + linkQueue = null; + }). + error(function(response, code, headers, config) { + throw Error('Failed to load template: ' + config.url); + }); + + return function delayedNodeLinkFn(ignoreChildLinkFn, scope, node, rootElement, controller) { + if (linkQueue) { + linkQueue.push(scope); + linkQueue.push(node); + linkQueue.push(rootElement); + linkQueue.push(controller); + } else { + afterTemplateNodeLinkFn(function() { + beforeTemplateNodeLinkFn(afterTemplateChildLinkFn, scope, node, rootElement, controller); + }, scope, node, rootElement, controller); + } + }; + } + + + /** + * Sorting function for bound directives. + */ + function byPriority(a, b) { + return b.priority - a.priority; + } + + + function assertNoDuplicate(what, previousDirective, directive, element) { + if (previousDirective) { + throw Error('Multiple directives [' + previousDirective.name + ', ' + + directive.name + '] asking for ' + what + ' on: ' + startingTag(element)); + } + } + + + function addTextInterpolateDirective(directives, text) { + var interpolateFn = $interpolate(text, true); + if (interpolateFn) { + directives.push({ + priority: 0, + compile: valueFn(function textInterpolateLinkFn(scope, node) { + var parent = node.parent(), + bindings = parent.data('$binding') || []; + bindings.push(interpolateFn); + safeAddClass(parent.data('$binding', bindings), 'ng-binding'); + scope.$watch(interpolateFn, function interpolateFnWatchAction(value) { + node[0].nodeValue = value; + }); + }) + }); + } + } + + + function addAttrInterpolateDirective(node, directives, value, name) { + var interpolateFn = $interpolate(value, true); + + // no interpolation found -> ignore + if (!interpolateFn) return; + + + directives.push({ + priority: 100, + compile: valueFn(function attrInterpolateLinkFn(scope, element, attr) { + var $$observers = (attr.$$observers || (attr.$$observers = {})); + + // we need to interpolate again, in case the attribute value has been updated + // (e.g. by another directive's compile function) + interpolateFn = $interpolate(attr[name], true); + + // if attribute was updated so that there is no interpolation going on we don't want to + // register any observers + if (!interpolateFn) return; + + attr[name] = interpolateFn(scope); + ($$observers[name] || ($$observers[name] = [])).$$inter = true; + (attr.$$observers && attr.$$observers[name].$$scope || scope). + $watch(interpolateFn, function interpolateFnWatchAction(value) { + attr.$set(name, value); + }); + }) + }); + } + + + /** + * This is a special jqLite.replaceWith, which can replace items which + * have no parents, provided that the containing jqLite collection is provided. + * + * @param {JqLite=} $rootElement The root of the compile tree. Used so that we can replace nodes + * in the root of the tree. + * @param {JqLite} $element The jqLite element which we are going to replace. We keep the shell, + * but replace its DOM node reference. + * @param {Node} newNode The new DOM node. + */ + function replaceWith($rootElement, $element, newNode) { + var oldNode = $element[0], + parent = oldNode.parentNode, + i, ii; + + if ($rootElement) { + for(i = 0, ii = $rootElement.length; i < ii; i++) { + if ($rootElement[i] == oldNode) { + $rootElement[i] = newNode; + break; + } + } + } + + if (parent) { + parent.replaceChild(newNode, oldNode); + } + + newNode[jqLite.expando] = oldNode[jqLite.expando]; + $element[0] = newNode; + } + }]; +} + +var PREFIX_REGEXP = /^(x[\:\-_]|data[\:\-_])/i; +/** + * Converts all accepted directives format into proper directive name. + * All of these will become 'myDirective': + * my:DiRective + * my-directive + * x-my-directive + * data-my:directive + * + * Also there is special case for Moz prefix starting with upper case letter. + * @param name Name to normalize + */ +function directiveNormalize(name) { + return camelCase(name.replace(PREFIX_REGEXP, '')); +} + +/** + * @ngdoc object + * @name ng.$compile.directive.Attributes + * @description + * + * A shared object between directive compile / linking functions which contains normalized DOM element + * attributes. The the values reflect current binding state `{{ }}`. The normalization is needed + * since all of these are treated as equivalent in Angular: + * + * + */ + +/** + * @ngdoc property + * @name ng.$compile.directive.Attributes#$attr + * @propertyOf ng.$compile.directive.Attributes + * @returns {object} A map of DOM element attribute names to the normalized name. This is + * needed to do reverse lookup from normalized name back to actual name. + */ + + +/** + * @ngdoc function + * @name ng.$compile.directive.Attributes#$set + * @methodOf ng.$compile.directive.Attributes + * @function + * + * @description + * Set DOM element attribute value. + * + * + * @param {string} name Normalized element attribute name of the property to modify. The name is + * revers translated using the {@link ng.$compile.directive.Attributes#$attr $attr} + * property to the original name. + * @param {string} value Value to set the attribute to. The value can be an interpolated string. + */ + + + +/** + * Closure compiler type information + */ + +function nodesetLinkingFn( + /* angular.Scope */ scope, + /* NodeList */ nodeList, + /* Element */ rootElement, + /* function(Function) */ boundTranscludeFn +){} + +function directiveLinkingFn( + /* nodesetLinkingFn */ nodesetLinkingFn, + /* angular.Scope */ scope, + /* Node */ node, + /* Element */ rootElement, + /* function(Function) */ boundTranscludeFn +){} + +/** + * @ngdoc object + * @name ng.$controllerProvider + * @description + * The {@link ng.$controller $controller service} is used by Angular to create new + * controllers. + * + * This provider allows controller registration via the + * {@link ng.$controllerProvider#register register} method. + */ +function $ControllerProvider() { + var controllers = {}, + CNTRL_REG = /^(\S+)(\s+as\s+(\w+))?$/; + + + /** + * @ngdoc function + * @name ng.$controllerProvider#register + * @methodOf ng.$controllerProvider + * @param {string} name Controller name + * @param {Function|Array} constructor Controller constructor fn (optionally decorated with DI + * annotations in the array notation). + */ + this.register = function(name, constructor) { + if (isObject(name)) { + extend(controllers, name) + } else { + controllers[name] = constructor; + } + }; + + + this.$get = ['$injector', '$window', function($injector, $window) { + + /** + * @ngdoc function + * @name ng.$controller + * @requires $injector + * + * @param {Function|string} constructor If called with a function then it's considered to be the + * controller constructor function. Otherwise it's considered to be a string which is used + * to retrieve the controller constructor using the following steps: + * + * * check if a controller with given name is registered via `$controllerProvider` + * * check if evaluating the string on the current scope returns a constructor + * * check `window[constructor]` on the global `window` object + * + * @param {Object} locals Injection locals for Controller. + * @return {Object} Instance of given controller. + * + * @description + * `$controller` service is responsible for instantiating controllers. + * + * It's just a simple call to {@link AUTO.$injector $injector}, but extracted into + * a service, so that one can override this service with {@link https://gist.github.com/1649788 + * BC version}. + */ + return function(expression, locals) { + var instance, match, constructor, identifier; + + if(isString(expression)) { + match = expression.match(CNTRL_REG), + constructor = match[1], + identifier = match[3]; + expression = controllers.hasOwnProperty(constructor) + ? controllers[constructor] + : getter(locals.$scope, constructor, true) || getter($window, constructor, true); + + assertArgFn(expression, constructor, true); + } + + instance = $injector.instantiate(expression, locals); + + if (identifier) { + if (typeof locals.$scope !== 'object') { + throw new Error('Can not export controller as "' + identifier + '". ' + + 'No scope object provided!'); + } + + locals.$scope[identifier] = instance; + } + + return instance; + }; + }]; +} + +/** + * @ngdoc object + * @name ng.$document + * @requires $window + * + * @description + * A {@link angular.element jQuery (lite)}-wrapped reference to the browser's `window.document` + * element. + */ +function $DocumentProvider(){ + this.$get = ['$window', function(window){ + return jqLite(window.document); + }]; +} + +/** + * @ngdoc function + * @name ng.$exceptionHandler + * @requires $log + * + * @description + * Any uncaught exception in angular expressions is delegated to this service. + * The default implementation simply delegates to `$log.error` which logs it into + * the browser console. + * + * In unit tests, if `angular-mocks.js` is loaded, this service is overridden by + * {@link ngMock.$exceptionHandler mock $exceptionHandler} which aids in testing. + * + * @param {Error} exception Exception associated with the error. + * @param {string=} cause optional information about the context in which + * the error was thrown. + * + */ +function $ExceptionHandlerProvider() { + this.$get = ['$log', function($log) { + return function(exception, cause) { + $log.error.apply($log, arguments); + }; + }]; +} + +/** + * @ngdoc object + * @name ng.$interpolateProvider + * @function + * + * @description + * + * Used for configuring the interpolation markup. Defaults to `{{` and `}}`. + */ +function $InterpolateProvider() { + var startSymbol = '{{'; + var endSymbol = '}}'; + + /** + * @ngdoc method + * @name ng.$interpolateProvider#startSymbol + * @methodOf ng.$interpolateProvider + * @description + * Symbol to denote start of expression in the interpolated string. Defaults to `{{`. + * + * @param {string=} value new value to set the starting symbol to. + * @returns {string|self} Returns the symbol when used as getter and self if used as setter. + */ + this.startSymbol = function(value){ + if (value) { + startSymbol = value; + return this; + } else { + return startSymbol; + } + }; + + /** + * @ngdoc method + * @name ng.$interpolateProvider#endSymbol + * @methodOf ng.$interpolateProvider + * @description + * Symbol to denote the end of expression in the interpolated string. Defaults to `}}`. + * + * @param {string=} value new value to set the ending symbol to. + * @returns {string|self} Returns the symbol when used as getter and self if used as setter. + */ + this.endSymbol = function(value){ + if (value) { + endSymbol = value; + return this; + } else { + return endSymbol; + } + }; + + + this.$get = ['$parse', '$exceptionHandler', function($parse, $exceptionHandler) { + var startSymbolLength = startSymbol.length, + endSymbolLength = endSymbol.length; + + /** + * @ngdoc function + * @name ng.$interpolate + * @function + * + * @requires $parse + * + * @description + * + * Compiles a string with markup into an interpolation function. This service is used by the + * HTML {@link ng.$compile $compile} service for data binding. See + * {@link ng.$interpolateProvider $interpolateProvider} for configuring the + * interpolation markup. + * + * +
    +         var $interpolate = ...; // injected
    +         var exp = $interpolate('Hello {{name}}!');
    +         expect(exp({name:'Angular'}).toEqual('Hello Angular!');
    +       
    + * + * + * @param {string} text The text with markup to interpolate. + * @param {boolean=} mustHaveExpression if set to true then the interpolation string must have + * embedded expression in order to return an interpolation function. Strings with no + * embedded expression will return null for the interpolation function. + * @returns {function(context)} an interpolation function which is used to compute the interpolated + * string. The function has these parameters: + * + * * `context`: an object against which any expressions embedded in the strings are evaluated + * against. + * + */ + function $interpolate(text, mustHaveExpression) { + var startIndex, + endIndex, + index = 0, + parts = [], + length = text.length, + hasInterpolation = false, + fn, + exp, + concat = []; + + while(index < length) { + if ( ((startIndex = text.indexOf(startSymbol, index)) != -1) && + ((endIndex = text.indexOf(endSymbol, startIndex + startSymbolLength)) != -1) ) { + (index != startIndex) && parts.push(text.substring(index, startIndex)); + parts.push(fn = $parse(exp = text.substring(startIndex + startSymbolLength, endIndex))); + fn.exp = exp; + index = endIndex + endSymbolLength; + hasInterpolation = true; + } else { + // we did not find anything, so we have to add the remainder to the parts array + (index != length) && parts.push(text.substring(index)); + index = length; + } + } + + if (!(length = parts.length)) { + // we added, nothing, must have been an empty string. + parts.push(''); + length = 1; + } + + if (!mustHaveExpression || hasInterpolation) { + concat.length = length; + fn = function(context) { + try { + for(var i = 0, ii = length, part; i=} search New search params - string or hash object + * @param {string=} paramValue If `search` is a string, then `paramValue` will override only a + * single search parameter. If the value is `null`, the parameter will be deleted. + * + * @return {string} search + */ + search: function(search, paramValue) { + if (isUndefined(search)) + return this.$$search; + + if (isDefined(paramValue)) { + if (paramValue === null) { + delete this.$$search[search]; + } else { + this.$$search[search] = paramValue; + } + } else { + this.$$search = isString(search) ? parseKeyValue(search) : search; + } + + this.$$compose(); + return this; + }, + + /** + * @ngdoc method + * @name ng.$location#hash + * @methodOf ng.$location + * + * @description + * This method is getter / setter. + * + * Return hash fragment when called without any parameter. + * + * Change hash fragment when called with parameter and return `$location`. + * + * @param {string=} hash New hash fragment + * @return {string} hash + */ + hash: locationGetterSetter('$$hash', identity), + + /** + * @ngdoc method + * @name ng.$location#replace + * @methodOf ng.$location + * + * @description + * If called, all changes to $location during current `$digest` will be replacing current history + * record, instead of adding new one. + */ + replace: function() { + this.$$replace = true; + return this; + } +}; + +function locationGetter(property) { + return function() { + return this[property]; + }; +} + + +function locationGetterSetter(property, preprocess) { + return function(value) { + if (isUndefined(value)) + return this[property]; + + this[property] = preprocess(value); + this.$$compose(); + + return this; + }; +} + + +/** + * @ngdoc object + * @name ng.$location + * + * @requires $browser + * @requires $sniffer + * @requires $rootElement + * + * @description + * The $location service parses the URL in the browser address bar (based on the + * {@link https://developer.mozilla.org/en/window.location window.location}) and makes the URL + * available to your application. Changes to the URL in the address bar are reflected into + * $location service and changes to $location are reflected into the browser address bar. + * + * **The $location service:** + * + * - Exposes the current URL in the browser address bar, so you can + * - Watch and observe the URL. + * - Change the URL. + * - Synchronizes the URL with the browser when the user + * - Changes the address bar. + * - Clicks the back or forward button (or clicks a History link). + * - Clicks on a link. + * - Represents the URL object as a set of methods (protocol, host, port, path, search, hash). + * + * For more information see {@link guide/dev_guide.services.$location Developer Guide: Angular + * Services: Using $location} + */ + +/** + * @ngdoc object + * @name ng.$locationProvider + * @description + * Use the `$locationProvider` to configure how the application deep linking paths are stored. + */ +function $LocationProvider(){ + var hashPrefix = '', + html5Mode = false; + + /** + * @ngdoc property + * @name ng.$locationProvider#hashPrefix + * @methodOf ng.$locationProvider + * @description + * @param {string=} prefix Prefix for hash part (containing path and search) + * @returns {*} current value if used as getter or itself (chaining) if used as setter + */ + this.hashPrefix = function(prefix) { + if (isDefined(prefix)) { + hashPrefix = prefix; + return this; + } else { + return hashPrefix; + } + }; + + /** + * @ngdoc property + * @name ng.$locationProvider#html5Mode + * @methodOf ng.$locationProvider + * @description + * @param {string=} mode Use HTML5 strategy if available. + * @returns {*} current value if used as getter or itself (chaining) if used as setter + */ + this.html5Mode = function(mode) { + if (isDefined(mode)) { + html5Mode = mode; + return this; + } else { + return html5Mode; + } + }; + + this.$get = ['$rootScope', '$browser', '$sniffer', '$rootElement', + function( $rootScope, $browser, $sniffer, $rootElement) { + var $location, + LocationMode, + baseHref = $browser.baseHref(), + initialUrl = $browser.url(), + appBase; + + if (html5Mode) { + appBase = baseHref ? serverBase(initialUrl) + baseHref : initialUrl; + LocationMode = $sniffer.history ? LocationHtml5Url : LocationHashbangInHtml5Url; + } else { + appBase = stripHash(initialUrl); + LocationMode = LocationHashbangUrl; + } + $location = new LocationMode(appBase, '#' + hashPrefix); + $location.$$parse($location.$$rewrite(initialUrl)); + + $rootElement.bind('click', function(event) { + // TODO(vojta): rewrite link when opening in new tab/window (in legacy browser) + // currently we open nice url link and redirect then + + if (event.ctrlKey || event.metaKey || event.which == 2) return; + + var elm = jqLite(event.target); + + // traverse the DOM up to find first A tag + while (lowercase(elm[0].nodeName) !== 'a') { + // ignore rewriting if no A tag (reached root element, or no parent - removed from document) + if (elm[0] === $rootElement[0] || !(elm = elm.parent())[0]) return; + } + + var absHref = elm.prop('href'); + var rewrittenUrl = $location.$$rewrite(absHref); + + if (absHref && !elm.attr('target') && rewrittenUrl && !event.isDefaultPrevented()) { + event.preventDefault(); + if (rewrittenUrl != $browser.url()) { + // update location manually + $location.$$parse(rewrittenUrl); + $rootScope.$apply(); + // hack to work around FF6 bug 684208 when scenario runner clicks on links + window.angular['ff-684208-preventDefault'] = true; + } + } + }); + + + // rewrite hashbang url <> html5 url + if ($location.absUrl() != initialUrl) { + $browser.url($location.absUrl(), true); + } + + // update $location when $browser url changes + $browser.onUrlChange(function(newUrl) { + if ($location.absUrl() != newUrl) { + if ($rootScope.$broadcast('$locationChangeStart', newUrl, $location.absUrl()).defaultPrevented) { + $browser.url($location.absUrl()); + return; + } + $rootScope.$evalAsync(function() { + var oldUrl = $location.absUrl(); + + $location.$$parse(newUrl); + afterLocationChange(oldUrl); + }); + if (!$rootScope.$$phase) $rootScope.$digest(); + } + }); + + // update browser + var changeCounter = 0; + $rootScope.$watch(function $locationWatch() { + var oldUrl = $browser.url(); + var currentReplace = $location.$$replace; + + if (!changeCounter || oldUrl != $location.absUrl()) { + changeCounter++; + $rootScope.$evalAsync(function() { + if ($rootScope.$broadcast('$locationChangeStart', $location.absUrl(), oldUrl). + defaultPrevented) { + $location.$$parse(oldUrl); + } else { + $browser.url($location.absUrl(), currentReplace); + afterLocationChange(oldUrl); + } + }); + } + $location.$$replace = false; + + return changeCounter; + }); + + return $location; + + function afterLocationChange(oldUrl) { + $rootScope.$broadcast('$locationChangeSuccess', $location.absUrl(), oldUrl); + } +}]; +} + +/** + * @ngdoc object + * @name ng.$log + * @requires $window + * + * @description + * Simple service for logging. Default implementation writes the message + * into the browser's console (if present). + * + * The main purpose of this service is to simplify debugging and troubleshooting. + * + * @example + + + function LogCtrl($scope, $log) { + $scope.$log = $log; + $scope.message = 'Hello World!'; + } + + +
    +

    Reload this page with open console, enter text and hit the log button...

    + Message: + + + + + +
    +
    +
    + */ + +/** + * @ngdoc object + * @name ng.$logProvider + * @description + * Use the `$logProvider` to configure how the application logs messages + */ +function $LogProvider(){ + var debug = true, + self = this; + + /** + * @ngdoc property + * @name ng.$logProvider#debugEnabled + * @methodOf ng.$logProvider + * @description + * @param {string=} flag enable or disable debug level messages + * @returns {*} current value if used as getter or itself (chaining) if used as setter + */ + this.debugEnabled = function(flag) { + if (isDefined(flag)) { + debug = flag; + return this; + } else { + return debug; + } + }; + + this.$get = ['$window', function($window){ + return { + /** + * @ngdoc method + * @name ng.$log#log + * @methodOf ng.$log + * + * @description + * Write a log message + */ + log: consoleLog('log'), + + /** + * @ngdoc method + * @name ng.$log#warn + * @methodOf ng.$log + * + * @description + * Write a warning message + */ + warn: consoleLog('warn'), + + /** + * @ngdoc method + * @name ng.$log#info + * @methodOf ng.$log + * + * @description + * Write an information message + */ + info: consoleLog('info'), + + /** + * @ngdoc method + * @name ng.$log#error + * @methodOf ng.$log + * + * @description + * Write an error message + */ + error: consoleLog('error'), + + /** + * @ngdoc method + * @name ng.$log#debug + * @methodOf ng.$log + * + * @description + * Write a debug message + */ + debug: (function () { + var fn = consoleLog('debug'); + + return function() { + if (debug) { + fn.apply(self, arguments); + } + } + }()) + }; + + function formatError(arg) { + if (arg instanceof Error) { + if (arg.stack) { + arg = (arg.message && arg.stack.indexOf(arg.message) === -1) + ? 'Error: ' + arg.message + '\n' + arg.stack + : arg.stack; + } else if (arg.sourceURL) { + arg = arg.message + '\n' + arg.sourceURL + ':' + arg.line; + } + } + return arg; + } + + function consoleLog(type) { + var console = $window.console || {}, + logFn = console[type] || console.log || noop; + + if (logFn.apply) { + return function() { + var args = []; + forEach(arguments, function(arg) { + args.push(formatError(arg)); + }); + return logFn.apply(console, args); + }; + } + + // we are IE which either doesn't have window.console => this is noop and we do nothing, + // or we are IE where console.log doesn't have apply so we log at least first 2 args + return function(arg1, arg2) { + logFn(arg1, arg2); + } + } + }]; +} + +var OPERATORS = { + 'null':function(){return null;}, + 'true':function(){return true;}, + 'false':function(){return false;}, + undefined:noop, + '+':function(self, locals, a,b){ + a=a(self, locals); b=b(self, locals); + if (isDefined(a)) { + if (isDefined(b)) { + return a + b; + } + return a; + } + return isDefined(b)?b:undefined;}, + '-':function(self, locals, a,b){a=a(self, locals); b=b(self, locals); return (isDefined(a)?a:0)-(isDefined(b)?b:0);}, + '*':function(self, locals, a,b){return a(self, locals)*b(self, locals);}, + '/':function(self, locals, a,b){return a(self, locals)/b(self, locals);}, + '%':function(self, locals, a,b){return a(self, locals)%b(self, locals);}, + '^':function(self, locals, a,b){return a(self, locals)^b(self, locals);}, + '=':noop, + '===':function(self, locals, a, b){return a(self, locals)===b(self, locals);}, + '!==':function(self, locals, a, b){return a(self, locals)!==b(self, locals);}, + '==':function(self, locals, a,b){return a(self, locals)==b(self, locals);}, + '!=':function(self, locals, a,b){return a(self, locals)!=b(self, locals);}, + '<':function(self, locals, a,b){return a(self, locals)':function(self, locals, a,b){return a(self, locals)>b(self, locals);}, + '<=':function(self, locals, a,b){return a(self, locals)<=b(self, locals);}, + '>=':function(self, locals, a,b){return a(self, locals)>=b(self, locals);}, + '&&':function(self, locals, a,b){return a(self, locals)&&b(self, locals);}, + '||':function(self, locals, a,b){return a(self, locals)||b(self, locals);}, + '&':function(self, locals, a,b){return a(self, locals)&b(self, locals);}, +// '|':function(self, locals, a,b){return a|b;}, + '|':function(self, locals, a,b){return b(self, locals)(self, locals, a(self, locals));}, + '!':function(self, locals, a){return !a(self, locals);} +}; +var ESCAPE = {"n":"\n", "f":"\f", "r":"\r", "t":"\t", "v":"\v", "'":"'", '"':'"'}; + +function lex(text, csp){ + var tokens = [], + token, + index = 0, + json = [], + ch, + lastCh = ':'; // can start regexp + + while (index < text.length) { + ch = text.charAt(index); + if (is('"\'')) { + readString(ch); + } else if (isNumber(ch) || is('.') && isNumber(peek())) { + readNumber(); + } else if (isIdent(ch)) { + readIdent(); + // identifiers can only be if the preceding char was a { or , + if (was('{,') && json[0]=='{' && + (token=tokens[tokens.length-1])) { + token.json = token.text.indexOf('.') == -1; + } + } else if (is('(){}[].,;:?')) { + tokens.push({ + index:index, + text:ch, + json:(was(':[,') && is('{[')) || is('}]:,') + }); + if (is('{[')) json.unshift(ch); + if (is('}]')) json.shift(); + index++; + } else if (isWhitespace(ch)) { + index++; + continue; + } else { + var ch2 = ch + peek(), + ch3 = ch2 + peek(2), + fn = OPERATORS[ch], + fn2 = OPERATORS[ch2], + fn3 = OPERATORS[ch3]; + if (fn3) { + tokens.push({index:index, text:ch3, fn:fn3}); + index += 3; + } else if (fn2) { + tokens.push({index:index, text:ch2, fn:fn2}); + index += 2; + } else if (fn) { + tokens.push({index:index, text:ch, fn:fn, json: was('[,:') && is('+-')}); + index += 1; + } else { + throwError("Unexpected next character ", index, index+1); + } + } + lastCh = ch; + } + return tokens; + + function is(chars) { + return chars.indexOf(ch) != -1; + } + + function was(chars) { + return chars.indexOf(lastCh) != -1; + } + + function peek(i) { + var num = i || 1; + return index + num < text.length ? text.charAt(index + num) : false; + } + function isNumber(ch) { + return '0' <= ch && ch <= '9'; + } + function isWhitespace(ch) { + return ch == ' ' || ch == '\r' || ch == '\t' || + ch == '\n' || ch == '\v' || ch == '\u00A0'; // IE treats non-breaking space as \u00A0 + } + function isIdent(ch) { + return 'a' <= ch && ch <= 'z' || + 'A' <= ch && ch <= 'Z' || + '_' == ch || ch == '$'; + } + function isExpOperator(ch) { + return ch == '-' || ch == '+' || isNumber(ch); + } + + function throwError(error, start, end) { + end = end || index; + throw Error("Lexer Error: " + error + " at column" + + (isDefined(start) + ? "s " + start + "-" + index + " [" + text.substring(start, end) + "]" + : " " + end) + + " in expression [" + text + "]."); + } + + function readNumber() { + var number = ""; + var start = index; + while (index < text.length) { + var ch = lowercase(text.charAt(index)); + if (ch == '.' || isNumber(ch)) { + number += ch; + } else { + var peekCh = peek(); + if (ch == 'e' && isExpOperator(peekCh)) { + number += ch; + } else if (isExpOperator(ch) && + peekCh && isNumber(peekCh) && + number.charAt(number.length - 1) == 'e') { + number += ch; + } else if (isExpOperator(ch) && + (!peekCh || !isNumber(peekCh)) && + number.charAt(number.length - 1) == 'e') { + throwError('Invalid exponent'); + } else { + break; + } + } + index++; + } + number = 1 * number; + tokens.push({index:start, text:number, json:true, + fn:function() {return number;}}); + } + function readIdent() { + var ident = "", + start = index, + lastDot, peekIndex, methodName, ch; + + while (index < text.length) { + ch = text.charAt(index); + if (ch == '.' || isIdent(ch) || isNumber(ch)) { + if (ch == '.') lastDot = index; + ident += ch; + } else { + break; + } + index++; + } + + //check if this is not a method invocation and if it is back out to last dot + if (lastDot) { + peekIndex = index; + while(peekIndex < text.length) { + ch = text.charAt(peekIndex); + if (ch == '(') { + methodName = ident.substr(lastDot - start + 1); + ident = ident.substr(0, lastDot - start); + index = peekIndex; + break; + } + if(isWhitespace(ch)) { + peekIndex++; + } else { + break; + } + } + } + + + var token = { + index:start, + text:ident + }; + + if (OPERATORS.hasOwnProperty(ident)) { + token.fn = token.json = OPERATORS[ident]; + } else { + var getter = getterFn(ident, csp); + token.fn = extend(function(self, locals) { + return (getter(self, locals)); + }, { + assign: function(self, value) { + return setter(self, ident, value); + } + }); + } + + tokens.push(token); + + if (methodName) { + tokens.push({ + index:lastDot, + text: '.', + json: false + }); + tokens.push({ + index: lastDot + 1, + text: methodName, + json: false + }); + } + } + + function readString(quote) { + var start = index; + index++; + var string = ""; + var rawString = quote; + var escape = false; + while (index < text.length) { + var ch = text.charAt(index); + rawString += ch; + if (escape) { + if (ch == 'u') { + var hex = text.substring(index + 1, index + 5); + if (!hex.match(/[\da-f]{4}/i)) + throwError( "Invalid unicode escape [\\u" + hex + "]"); + index += 4; + string += String.fromCharCode(parseInt(hex, 16)); + } else { + var rep = ESCAPE[ch]; + if (rep) { + string += rep; + } else { + string += ch; + } + } + escape = false; + } else if (ch == '\\') { + escape = true; + } else if (ch == quote) { + index++; + tokens.push({ + index:start, + text:rawString, + string:string, + json:true, + fn:function() { return string; } + }); + return; + } else { + string += ch; + } + index++; + } + throwError("Unterminated quote", start); + } +} + +///////////////////////////////////////// + +function parser(text, json, $filter, csp){ + var ZERO = valueFn(0), + value, + tokens = lex(text, csp), + assignment = _assignment, + functionCall = _functionCall, + fieldAccess = _fieldAccess, + objectIndex = _objectIndex, + filterChain = _filterChain; + + if(json){ + // The extra level of aliasing is here, just in case the lexer misses something, so that + // we prevent any accidental execution in JSON. + assignment = logicalOR; + functionCall = + fieldAccess = + objectIndex = + filterChain = + function() { throwError("is not valid json", {text:text, index:0}); }; + value = primary(); + } else { + value = statements(); + } + if (tokens.length !== 0) { + throwError("is an unexpected token", tokens[0]); + } + value.literal = !!value.literal; + value.constant = !!value.constant; + return value; + + /////////////////////////////////// + function throwError(msg, token) { + throw Error("Syntax Error: Token '" + token.text + + "' " + msg + " at column " + + (token.index + 1) + " of the expression [" + + text + "] starting at [" + text.substring(token.index) + "]."); + } + + function peekToken() { + if (tokens.length === 0) + throw Error("Unexpected end of expression: " + text); + return tokens[0]; + } + + function peek(e1, e2, e3, e4) { + if (tokens.length > 0) { + var token = tokens[0]; + var t = token.text; + if (t==e1 || t==e2 || t==e3 || t==e4 || + (!e1 && !e2 && !e3 && !e4)) { + return token; + } + } + return false; + } + + function expect(e1, e2, e3, e4){ + var token = peek(e1, e2, e3, e4); + if (token) { + if (json && !token.json) { + throwError("is not valid json", token); + } + tokens.shift(); + return token; + } + return false; + } + + function consume(e1){ + if (!expect(e1)) { + throwError("is unexpected, expecting [" + e1 + "]", peek()); + } + } + + function unaryFn(fn, right) { + return extend(function(self, locals) { + return fn(self, locals, right); + }, { + constant:right.constant + }); + } + + function ternaryFn(left, middle, right){ + return extend(function(self, locals){ + return left(self, locals) ? middle(self, locals) : right(self, locals); + }, { + constant: left.constant && middle.constant && right.constant + }); + } + + function binaryFn(left, fn, right) { + return extend(function(self, locals) { + return fn(self, locals, left, right); + }, { + constant:left.constant && right.constant + }); + } + + function statements() { + var statements = []; + while(true) { + if (tokens.length > 0 && !peek('}', ')', ';', ']')) + statements.push(filterChain()); + if (!expect(';')) { + // optimize for the common case where there is only one statement. + // TODO(size): maybe we should not support multiple statements? + return statements.length == 1 + ? statements[0] + : function(self, locals){ + var value; + for ( var i = 0; i < statements.length; i++) { + var statement = statements[i]; + if (statement) + value = statement(self, locals); + } + return value; + }; + } + } + } + + function _filterChain() { + var left = expression(); + var token; + while(true) { + if ((token = expect('|'))) { + left = binaryFn(left, token.fn, filter()); + } else { + return left; + } + } + } + + function filter() { + var token = expect(); + var fn = $filter(token.text); + var argsFn = []; + while(true) { + if ((token = expect(':'))) { + argsFn.push(expression()); + } else { + var fnInvoke = function(self, locals, input){ + var args = [input]; + for ( var i = 0; i < argsFn.length; i++) { + args.push(argsFn[i](self, locals)); + } + return fn.apply(self, args); + }; + return function() { + return fnInvoke; + }; + } + } + } + + function expression() { + return assignment(); + } + + function _assignment() { + var left = ternary(); + var right; + var token; + if ((token = expect('='))) { + if (!left.assign) { + throwError("implies assignment but [" + + text.substring(0, token.index) + "] can not be assigned to", token); + } + right = ternary(); + return function(scope, locals){ + return left.assign(scope, right(scope, locals), locals); + }; + } else { + return left; + } + } + + function ternary() { + var left = logicalOR(); + var middle; + var token; + if((token = expect('?'))){ + middle = ternary(); + if((token = expect(':'))){ + return ternaryFn(left, middle, ternary()); + } + else { + throwError('expected :', token); + } + } + else { + return left; + } + } + + function logicalOR() { + var left = logicalAND(); + var token; + while(true) { + if ((token = expect('||'))) { + left = binaryFn(left, token.fn, logicalAND()); + } else { + return left; + } + } + } + + function logicalAND() { + var left = equality(); + var token; + if ((token = expect('&&'))) { + left = binaryFn(left, token.fn, logicalAND()); + } + return left; + } + + function equality() { + var left = relational(); + var token; + if ((token = expect('==','!=','===','!=='))) { + left = binaryFn(left, token.fn, equality()); + } + return left; + } + + function relational() { + var left = additive(); + var token; + if ((token = expect('<', '>', '<=', '>='))) { + left = binaryFn(left, token.fn, relational()); + } + return left; + } + + function additive() { + var left = multiplicative(); + var token; + while ((token = expect('+','-'))) { + left = binaryFn(left, token.fn, multiplicative()); + } + return left; + } + + function multiplicative() { + var left = unary(); + var token; + while ((token = expect('*','/','%'))) { + left = binaryFn(left, token.fn, unary()); + } + return left; + } + + function unary() { + var token; + if (expect('+')) { + return primary(); + } else if ((token = expect('-'))) { + return binaryFn(ZERO, token.fn, unary()); + } else if ((token = expect('!'))) { + return unaryFn(token.fn, unary()); + } else { + return primary(); + } + } + + + function primary() { + var primary; + if (expect('(')) { + primary = filterChain(); + consume(')'); + } else if (expect('[')) { + primary = arrayDeclaration(); + } else if (expect('{')) { + primary = object(); + } else { + var token = expect(); + primary = token.fn; + if (!primary) { + throwError("not a primary expression", token); + } + if (token.json) { + primary.constant = primary.literal = true; + } + } + + var next, context; + while ((next = expect('(', '[', '.'))) { + if (next.text === '(') { + primary = functionCall(primary, context); + context = null; + } else if (next.text === '[') { + context = primary; + primary = objectIndex(primary); + } else if (next.text === '.') { + context = primary; + primary = fieldAccess(primary); + } else { + throwError("IMPOSSIBLE"); + } + } + return primary; + } + + function _fieldAccess(object) { + var field = expect().text; + var getter = getterFn(field, csp); + return extend( + function(scope, locals, self) { + return getter(self || object(scope, locals), locals); + }, + { + assign:function(scope, value, locals) { + return setter(object(scope, locals), field, value); + } + } + ); + } + + function _objectIndex(obj) { + var indexFn = expression(); + consume(']'); + return extend( + function(self, locals){ + var o = obj(self, locals), + i = indexFn(self, locals), + v, p; + + if (!o) return undefined; + v = o[i]; + if (v && v.then) { + p = v; + if (!('$$v' in v)) { + p.$$v = undefined; + p.then(function(val) { p.$$v = val; }); + } + v = v.$$v; + } + return v; + }, { + assign:function(self, value, locals){ + return obj(self, locals)[indexFn(self, locals)] = value; + } + }); + } + + function _functionCall(fn, contextGetter) { + var argsFn = []; + if (peekToken().text != ')') { + do { + argsFn.push(expression()); + } while (expect(',')); + } + consume(')'); + return function(scope, locals){ + var args = [], + context = contextGetter ? contextGetter(scope, locals) : scope; + + for ( var i = 0; i < argsFn.length; i++) { + args.push(argsFn[i](scope, locals)); + } + var fnPtr = fn(scope, locals, context) || noop; + // IE stupidity! + return fnPtr.apply + ? fnPtr.apply(context, args) + : fnPtr(args[0], args[1], args[2], args[3], args[4]); + }; + } + + // This is used with json array declaration + function arrayDeclaration () { + var elementFns = []; + var allConstant = true; + if (peekToken().text != ']') { + do { + var elementFn = expression(); + elementFns.push(elementFn); + if (!elementFn.constant) { + allConstant = false; + } + } while (expect(',')); + } + consume(']'); + return extend(function(self, locals){ + var array = []; + for ( var i = 0; i < elementFns.length; i++) { + array.push(elementFns[i](self, locals)); + } + return array; + }, { + literal:true, + constant:allConstant + }); + } + + function object () { + var keyValues = []; + var allConstant = true; + if (peekToken().text != '}') { + do { + var token = expect(), + key = token.string || token.text; + consume(":"); + var value = expression(); + keyValues.push({key:key, value:value}); + if (!value.constant) { + allConstant = false; + } + } while (expect(',')); + } + consume('}'); + return extend(function(self, locals){ + var object = {}; + for ( var i = 0; i < keyValues.length; i++) { + var keyValue = keyValues[i]; + object[keyValue.key] = keyValue.value(self, locals); + } + return object; + }, { + literal:true, + constant:allConstant + }); + } +} + +////////////////////////////////////////////////// +// Parser helper functions +////////////////////////////////////////////////// + +function setter(obj, path, setValue) { + var element = path.split('.'); + for (var i = 0; element.length > 1; i++) { + var key = element.shift(); + var propertyObj = obj[key]; + if (!propertyObj) { + propertyObj = {}; + obj[key] = propertyObj; + } + obj = propertyObj; + } + obj[element.shift()] = setValue; + return setValue; +} + +/** + * Return the value accessible from the object by path. Any undefined traversals are ignored + * @param {Object} obj starting object + * @param {string} path path to traverse + * @param {boolean=true} bindFnToScope + * @returns value as accessible by path + */ +//TODO(misko): this function needs to be removed +function getter(obj, path, bindFnToScope) { + if (!path) return obj; + var keys = path.split('.'); + var key; + var lastInstance = obj; + var len = keys.length; + + for (var i = 0; i < len; i++) { + key = keys[i]; + if (obj) { + obj = (lastInstance = obj)[key]; + } + } + if (!bindFnToScope && isFunction(obj)) { + return bind(lastInstance, obj); + } + return obj; +} + +var getterFnCache = {}; + +/** + * Implementation of the "Black Hole" variant from: + * - http://jsperf.com/angularjs-parse-getter/4 + * - http://jsperf.com/path-evaluation-simplified/7 + */ +function cspSafeGetterFn(key0, key1, key2, key3, key4) { + return function(scope, locals) { + var pathVal = (locals && locals.hasOwnProperty(key0)) ? locals : scope, + promise; + + if (pathVal === null || pathVal === undefined) return pathVal; + + pathVal = pathVal[key0]; + if (pathVal && pathVal.then) { + if (!("$$v" in pathVal)) { + promise = pathVal; + promise.$$v = undefined; + promise.then(function(val) { promise.$$v = val; }); + } + pathVal = pathVal.$$v; + } + if (!key1 || pathVal === null || pathVal === undefined) return pathVal; + + pathVal = pathVal[key1]; + if (pathVal && pathVal.then) { + if (!("$$v" in pathVal)) { + promise = pathVal; + promise.$$v = undefined; + promise.then(function(val) { promise.$$v = val; }); + } + pathVal = pathVal.$$v; + } + if (!key2 || pathVal === null || pathVal === undefined) return pathVal; + + pathVal = pathVal[key2]; + if (pathVal && pathVal.then) { + if (!("$$v" in pathVal)) { + promise = pathVal; + promise.$$v = undefined; + promise.then(function(val) { promise.$$v = val; }); + } + pathVal = pathVal.$$v; + } + if (!key3 || pathVal === null || pathVal === undefined) return pathVal; + + pathVal = pathVal[key3]; + if (pathVal && pathVal.then) { + if (!("$$v" in pathVal)) { + promise = pathVal; + promise.$$v = undefined; + promise.then(function(val) { promise.$$v = val; }); + } + pathVal = pathVal.$$v; + } + if (!key4 || pathVal === null || pathVal === undefined) return pathVal; + + pathVal = pathVal[key4]; + if (pathVal && pathVal.then) { + if (!("$$v" in pathVal)) { + promise = pathVal; + promise.$$v = undefined; + promise.then(function(val) { promise.$$v = val; }); + } + pathVal = pathVal.$$v; + } + return pathVal; + }; +} + +function getterFn(path, csp) { + if (getterFnCache.hasOwnProperty(path)) { + return getterFnCache[path]; + } + + var pathKeys = path.split('.'), + pathKeysLength = pathKeys.length, + fn; + + if (csp) { + fn = (pathKeysLength < 6) + ? cspSafeGetterFn(pathKeys[0], pathKeys[1], pathKeys[2], pathKeys[3], pathKeys[4]) + : function(scope, locals) { + var i = 0, val; + do { + val = cspSafeGetterFn( + pathKeys[i++], pathKeys[i++], pathKeys[i++], pathKeys[i++], pathKeys[i++] + )(scope, locals); + + locals = undefined; // clear after first iteration + scope = val; + } while (i < pathKeysLength); + return val; + } + } else { + var code = 'var l, fn, p;\n'; + forEach(pathKeys, function(key, index) { + code += 'if(s === null || s === undefined) return s;\n' + + 'l=s;\n' + + 's='+ (index + // we simply dereference 's' on any .dot notation + ? 's' + // but if we are first then we check locals first, and if so read it first + : '((k&&k.hasOwnProperty("' + key + '"))?k:s)') + '["' + key + '"]' + ';\n' + + 'if (s && s.then) {\n' + + ' if (!("$$v" in s)) {\n' + + ' p=s;\n' + + ' p.$$v = undefined;\n' + + ' p.then(function(v) {p.$$v=v;});\n' + + '}\n' + + ' s=s.$$v\n' + + '}\n'; + }); + code += 'return s;'; + fn = Function('s', 'k', code); // s=scope, k=locals + fn.toString = function() { return code; }; + } + + return getterFnCache[path] = fn; +} + +/////////////////////////////////// + +/** + * @ngdoc function + * @name ng.$parse + * @function + * + * @description + * + * Converts Angular {@link guide/expression expression} into a function. + * + *
    + *   var getter = $parse('user.name');
    + *   var setter = getter.assign;
    + *   var context = {user:{name:'angular'}};
    + *   var locals = {user:{name:'local'}};
    + *
    + *   expect(getter(context)).toEqual('angular');
    + *   setter(context, 'newValue');
    + *   expect(context.user.name).toEqual('newValue');
    + *   expect(getter(context, locals)).toEqual('local');
    + * 
    + * + * + * @param {string} expression String expression to compile. + * @returns {function(context, locals)} a function which represents the compiled expression: + * + * * `context` – `{object}` – an object against which any expressions embedded in the strings + * are evaluated against (typically a scope object). + * * `locals` – `{object=}` – local variables context object, useful for overriding values in + * `context`. + * + * The returned function also has the following properties: + * * `literal` – `{boolean}` – whether the expression's top-level node is a JavaScript + * literal. + * * `constant` – `{boolean}` – whether the expression is made entirely of JavaScript + * constant literals. + * * `assign` – `{?function(context, value)}` – if the expression is assignable, this will be + * set to a function to change its value on the given context. + * + */ +function $ParseProvider() { + var cache = {}; + this.$get = ['$filter', '$sniffer', function($filter, $sniffer) { + return function(exp) { + switch(typeof exp) { + case 'string': + return cache.hasOwnProperty(exp) + ? cache[exp] + : cache[exp] = parser(exp, false, $filter, $sniffer.csp); + case 'function': + return exp; + default: + return noop; + } + }; + }]; +} + +/** + * @ngdoc service + * @name ng.$q + * @requires $rootScope + * + * @description + * A promise/deferred implementation inspired by [Kris Kowal's Q](https://github.com/kriskowal/q). + * + * [The CommonJS Promise proposal](http://wiki.commonjs.org/wiki/Promises) describes a promise as an + * interface for interacting with an object that represents the result of an action that is + * performed asynchronously, and may or may not be finished at any given point in time. + * + * From the perspective of dealing with error handling, deferred and promise APIs are to + * asynchronous programming what `try`, `catch` and `throw` keywords are to synchronous programming. + * + *
    + *   // for the purpose of this example let's assume that variables `$q` and `scope` are
    + *   // available in the current lexical scope (they could have been injected or passed in).
    + *
    + *   function asyncGreet(name) {
    + *     var deferred = $q.defer();
    + *
    + *     setTimeout(function() {
    + *       // since this fn executes async in a future turn of the event loop, we need to wrap
    + *       // our code into an $apply call so that the model changes are properly observed.
    + *       scope.$apply(function() {
    + *         if (okToGreet(name)) {
    + *           deferred.resolve('Hello, ' + name + '!');
    + *         } else {
    + *           deferred.reject('Greeting ' + name + ' is not allowed.');
    + *         }
    + *       });
    + *     }, 1000);
    + *
    + *     return deferred.promise;
    + *   }
    + *
    + *   var promise = asyncGreet('Robin Hood');
    + *   promise.then(function(greeting) {
    + *     alert('Success: ' + greeting);
    + *   }, function(reason) {
    + *     alert('Failed: ' + reason);
    + *   });
    + * 
    + * + * At first it might not be obvious why this extra complexity is worth the trouble. The payoff + * comes in the way of + * [guarantees that promise and deferred APIs make](https://github.com/kriskowal/uncommonjs/blob/master/promises/specification.md). + * + * Additionally the promise api allows for composition that is very hard to do with the + * traditional callback ([CPS](http://en.wikipedia.org/wiki/Continuation-passing_style)) approach. + * For more on this please see the [Q documentation](https://github.com/kriskowal/q) especially the + * section on serial or parallel joining of promises. + * + * + * # The Deferred API + * + * A new instance of deferred is constructed by calling `$q.defer()`. + * + * The purpose of the deferred object is to expose the associated Promise instance as well as APIs + * that can be used for signaling the successful or unsuccessful completion of the task. + * + * **Methods** + * + * - `resolve(value)` – resolves the derived promise with the `value`. If the value is a rejection + * constructed via `$q.reject`, the promise will be rejected instead. + * - `reject(reason)` – rejects the derived promise with the `reason`. This is equivalent to + * resolving it with a rejection constructed via `$q.reject`. + * + * **Properties** + * + * - promise – `{Promise}` – promise object associated with this deferred. + * + * + * # The Promise API + * + * A new promise instance is created when a deferred instance is created and can be retrieved by + * calling `deferred.promise`. + * + * The purpose of the promise object is to allow for interested parties to get access to the result + * of the deferred task when it completes. + * + * **Methods** + * + * - `then(successCallback, errorCallback)` – regardless of when the promise was or will be resolved + * or rejected calls one of the success or error callbacks asynchronously as soon as the result + * is available. The callbacks are called with a single argument the result or rejection reason. + * + * This method *returns a new promise* which is resolved or rejected via the return value of the + * `successCallback` or `errorCallback`. + * + * - `always(callback)` – allows you to observe either the fulfillment or rejection of a promise, + * but to do so without modifying the final value. This is useful to release resources or do some + * clean-up that needs to be done whether the promise was rejected or resolved. See the [full + * specification](https://github.com/kriskowal/q/wiki/API-Reference#promisefinallycallback) for + * more information. + * + * # Chaining promises + * + * Because calling `then` api of a promise returns a new derived promise, it is easily possible + * to create a chain of promises: + * + *
    + *   promiseB = promiseA.then(function(result) {
    + *     return result + 1;
    + *   });
    + *
    + *   // promiseB will be resolved immediately after promiseA is resolved and its value will be
    + *   // the result of promiseA incremented by 1
    + * 
    + * + * It is possible to create chains of any length and since a promise can be resolved with another + * promise (which will defer its resolution further), it is possible to pause/defer resolution of + * the promises at any point in the chain. This makes it possible to implement powerful apis like + * $http's response interceptors. + * + * + * # Differences between Kris Kowal's Q and $q + * + * There are three main differences: + * + * - $q is integrated with the {@link ng.$rootScope.Scope} Scope model observation + * mechanism in angular, which means faster propagation of resolution or rejection into your + * models and avoiding unnecessary browser repaints, which would result in flickering UI. + * - $q promises are recognized by the templating engine in angular, which means that in templates + * you can treat promises attached to a scope as if they were the resulting values. + * - Q has many more features than $q, but that comes at a cost of bytes. $q is tiny, but contains + * all the important functionality needed for common async tasks. + * + * # Testing + * + *
    + *    it('should simulate promise', inject(function($q, $rootScope) {
    + *      var deferred = $q.defer();
    + *      var promise = deferred.promise;
    + *      var resolvedValue;
    + * 
    + *      promise.then(function(value) { resolvedValue = value; });
    + *      expect(resolvedValue).toBeUndefined();
    + * 
    + *      // Simulate resolving of promise
    + *      deferred.resolve(123);
    + *      // Note that the 'then' function does not get called synchronously.
    + *      // This is because we want the promise API to always be async, whether or not
    + *      // it got called synchronously or asynchronously.
    + *      expect(resolvedValue).toBeUndefined();
    + * 
    + *      // Propagate promise resolution to 'then' functions using $apply().
    + *      $rootScope.$apply();
    + *      expect(resolvedValue).toEqual(123);
    + *    });
    + *  
    + */ +function $QProvider() { + + this.$get = ['$rootScope', '$exceptionHandler', function($rootScope, $exceptionHandler) { + return qFactory(function(callback) { + $rootScope.$evalAsync(callback); + }, $exceptionHandler); + }]; +} + + +/** + * Constructs a promise manager. + * + * @param {function(function)} nextTick Function for executing functions in the next turn. + * @param {function(...*)} exceptionHandler Function into which unexpected exceptions are passed for + * debugging purposes. + * @returns {object} Promise manager. + */ +function qFactory(nextTick, exceptionHandler) { + + /** + * @ngdoc + * @name ng.$q#defer + * @methodOf ng.$q + * @description + * Creates a `Deferred` object which represents a task which will finish in the future. + * + * @returns {Deferred} Returns a new instance of deferred. + */ + var defer = function() { + var pending = [], + value, deferred; + + deferred = { + + resolve: function(val) { + if (pending) { + var callbacks = pending; + pending = undefined; + value = ref(val); + + if (callbacks.length) { + nextTick(function() { + var callback; + for (var i = 0, ii = callbacks.length; i < ii; i++) { + callback = callbacks[i]; + value.then(callback[0], callback[1]); + } + }); + } + } + }, + + + reject: function(reason) { + deferred.resolve(reject(reason)); + }, + + + promise: { + then: function(callback, errback) { + var result = defer(); + + var wrappedCallback = function(value) { + try { + result.resolve((callback || defaultCallback)(value)); + } catch(e) { + exceptionHandler(e); + result.reject(e); + } + }; + + var wrappedErrback = function(reason) { + try { + result.resolve((errback || defaultErrback)(reason)); + } catch(e) { + exceptionHandler(e); + result.reject(e); + } + }; + + if (pending) { + pending.push([wrappedCallback, wrappedErrback]); + } else { + value.then(wrappedCallback, wrappedErrback); + } + + return result.promise; + }, + always: function(callback) { + + function makePromise(value, resolved) { + var result = defer(); + if (resolved) { + result.resolve(value); + } else { + result.reject(value); + } + return result.promise; + } + + function handleCallback(value, isResolved) { + var callbackOutput = null; + try { + callbackOutput = (callback ||defaultCallback)(); + } catch(e) { + return makePromise(e, false); + } + if (callbackOutput && callbackOutput.then) { + return callbackOutput.then(function() { + return makePromise(value, isResolved); + }, function(error) { + return makePromise(error, false); + }); + } else { + return makePromise(value, isResolved); + } + } + + return this.then(function(value) { + return handleCallback(value, true); + }, function(error) { + return handleCallback(error, false); + }); + } + } + }; + + return deferred; + }; + + + var ref = function(value) { + if (value && value.then) return value; + return { + then: function(callback) { + var result = defer(); + nextTick(function() { + result.resolve(callback(value)); + }); + return result.promise; + } + }; + }; + + + /** + * @ngdoc + * @name ng.$q#reject + * @methodOf ng.$q + * @description + * Creates a promise that is resolved as rejected with the specified `reason`. This api should be + * used to forward rejection in a chain of promises. If you are dealing with the last promise in + * a promise chain, you don't need to worry about it. + * + * When comparing deferreds/promises to the familiar behavior of try/catch/throw, think of + * `reject` as the `throw` keyword in JavaScript. This also means that if you "catch" an error via + * a promise error callback and you want to forward the error to the promise derived from the + * current promise, you have to "rethrow" the error by returning a rejection constructed via + * `reject`. + * + *
    +   *   promiseB = promiseA.then(function(result) {
    +   *     // success: do something and resolve promiseB
    +   *     //          with the old or a new result
    +   *     return result;
    +   *   }, function(reason) {
    +   *     // error: handle the error if possible and
    +   *     //        resolve promiseB with newPromiseOrValue,
    +   *     //        otherwise forward the rejection to promiseB
    +   *     if (canHandle(reason)) {
    +   *      // handle the error and recover
    +   *      return newPromiseOrValue;
    +   *     }
    +   *     return $q.reject(reason);
    +   *   });
    +   * 
    + * + * @param {*} reason Constant, message, exception or an object representing the rejection reason. + * @returns {Promise} Returns a promise that was already resolved as rejected with the `reason`. + */ + var reject = function(reason) { + return { + then: function(callback, errback) { + var result = defer(); + nextTick(function() { + result.resolve((errback || defaultErrback)(reason)); + }); + return result.promise; + } + }; + }; + + + /** + * @ngdoc + * @name ng.$q#when + * @methodOf ng.$q + * @description + * Wraps an object that might be a value or a (3rd party) then-able promise into a $q promise. + * This is useful when you are dealing with an object that might or might not be a promise, or if + * the promise comes from a source that can't be trusted. + * + * @param {*} value Value or a promise + * @returns {Promise} Returns a promise of the passed value or promise + */ + var when = function(value, callback, errback) { + var result = defer(), + done; + + var wrappedCallback = function(value) { + try { + return (callback || defaultCallback)(value); + } catch (e) { + exceptionHandler(e); + return reject(e); + } + }; + + var wrappedErrback = function(reason) { + try { + return (errback || defaultErrback)(reason); + } catch (e) { + exceptionHandler(e); + return reject(e); + } + }; + + nextTick(function() { + ref(value).then(function(value) { + if (done) return; + done = true; + result.resolve(ref(value).then(wrappedCallback, wrappedErrback)); + }, function(reason) { + if (done) return; + done = true; + result.resolve(wrappedErrback(reason)); + }); + }); + + return result.promise; + }; + + + function defaultCallback(value) { + return value; + } + + + function defaultErrback(reason) { + return reject(reason); + } + + + /** + * @ngdoc + * @name ng.$q#all + * @methodOf ng.$q + * @description + * Combines multiple promises into a single promise that is resolved when all of the input + * promises are resolved. + * + * @param {Array.|Object.} promises An array or hash of promises. + * @returns {Promise} Returns a single promise that will be resolved with an array/hash of values, + * each value corresponding to the promise at the same index/key in the `promises` array/hash. If any of + * the promises is resolved with a rejection, this resulting promise will be resolved with the + * same rejection. + */ + function all(promises) { + var deferred = defer(), + counter = 0, + results = isArray(promises) ? [] : {}; + + forEach(promises, function(promise, key) { + counter++; + ref(promise).then(function(value) { + if (results.hasOwnProperty(key)) return; + results[key] = value; + if (!(--counter)) deferred.resolve(results); + }, function(reason) { + if (results.hasOwnProperty(key)) return; + deferred.reject(reason); + }); + }); + + if (counter === 0) { + deferred.resolve(results); + } + + return deferred.promise; + } + + return { + defer: defer, + reject: reject, + when: when, + all: all + }; +} + +/** + * @ngdoc object + * @name ng.$routeProvider + * @function + * + * @description + * + * Used for configuring routes. See {@link ng.$route $route} for an example. + */ +function $RouteProvider(){ + var routes = {}; + + /** + * @ngdoc method + * @name ng.$routeProvider#when + * @methodOf ng.$routeProvider + * + * @param {string} path Route path (matched against `$location.path`). If `$location.path` + * contains redundant trailing slash or is missing one, the route will still match and the + * `$location.path` will be updated to add or drop the trailing slash to exactly match the + * route definition. + * + * * `path` can contain named groups starting with a colon (`:name`). All characters up + * to the next slash are matched and stored in `$routeParams` under the given `name` + * when the route matches. + * * `path` can contain named groups starting with a star (`*name`). All characters are + * eagerly stored in `$routeParams` under the given `name` when the route matches. + * + * For example, routes like `/color/:color/largecode/*largecode/edit` will match + * `/color/brown/largecode/code/with/slashs/edit` and extract: + * + * * `color: brown` + * * `largecode: code/with/slashs`. + * + * + * @param {Object} route Mapping information to be assigned to `$route.current` on route + * match. + * + * Object properties: + * + * - `controller` – `{(string|function()=}` – Controller fn that should be associated with newly + * created scope or the name of a {@link angular.Module#controller registered controller} + * if passed as a string. + * - `controllerAs` – `{string=}` – A controller alias name. If present the controller will be + * published to scope under the `controllerAs` name. + * - `template` – `{string=|function()=}` – html template as a string or function that returns + * an html template as a string which should be used by {@link ng.directive:ngView ngView} or + * {@link ng.directive:ngInclude ngInclude} directives. + * This property takes precedence over `templateUrl`. + * + * If `template` is a function, it will be called with the following parameters: + * + * - `{Array.}` - route parameters extracted from the current + * `$location.path()` by applying the current route + * + * - `templateUrl` – `{string=|function()=}` – path or function that returns a path to an html + * template that should be used by {@link ng.directive:ngView ngView}. + * + * If `templateUrl` is a function, it will be called with the following parameters: + * + * - `{Array.}` - route parameters extracted from the current + * `$location.path()` by applying the current route + * + * - `resolve` - `{Object.=}` - An optional map of dependencies which should + * be injected into the controller. If any of these dependencies are promises, they will be + * resolved and converted to a value before the controller is instantiated and the + * `$routeChangeSuccess` event is fired. The map object is: + * + * - `key` – `{string}`: a name of a dependency to be injected into the controller. + * - `factory` - `{string|function}`: If `string` then it is an alias for a service. + * Otherwise if function, then it is {@link api/AUTO.$injector#invoke injected} + * and the return value is treated as the dependency. If the result is a promise, it is resolved + * before its value is injected into the controller. + * + * - `redirectTo` – {(string|function())=} – value to update + * {@link ng.$location $location} path with and trigger route redirection. + * + * If `redirectTo` is a function, it will be called with the following parameters: + * + * - `{Object.}` - route parameters extracted from the current + * `$location.path()` by applying the current route templateUrl. + * - `{string}` - current `$location.path()` + * - `{Object}` - current `$location.search()` + * + * The custom `redirectTo` function is expected to return a string which will be used + * to update `$location.path()` and `$location.search()`. + * + * - `[reloadOnSearch=true]` - {boolean=} - reload route when only $location.search() + * changes. + * + * If the option is set to `false` and url in the browser changes, then + * `$routeUpdate` event is broadcasted on the root scope. + * + * - `[caseInsensitiveMatch=false]` - {boolean=} - match routes without being case sensitive + * + * If the option is set to `true`, then the particular route can be matched without being + * case sensitive + * + * @returns {Object} self + * + * @description + * Adds a new route definition to the `$route` service. + */ + this.when = function(path, route) { + routes[path] = extend({reloadOnSearch: true, caseInsensitiveMatch: false}, route); + + // create redirection for trailing slashes + if (path) { + var redirectPath = (path[path.length-1] == '/') + ? path.substr(0, path.length-1) + : path +'/'; + + routes[redirectPath] = {redirectTo: path}; + } + + return this; + }; + + /** + * @ngdoc method + * @name ng.$routeProvider#otherwise + * @methodOf ng.$routeProvider + * + * @description + * Sets route definition that will be used on route change when no other route definition + * is matched. + * + * @param {Object} params Mapping information to be assigned to `$route.current`. + * @returns {Object} self + */ + this.otherwise = function(params) { + this.when(null, params); + return this; + }; + + + this.$get = ['$rootScope', '$location', '$routeParams', '$q', '$injector', '$http', '$templateCache', + function( $rootScope, $location, $routeParams, $q, $injector, $http, $templateCache) { + + /** + * @ngdoc object + * @name ng.$route + * @requires $location + * @requires $routeParams + * + * @property {Object} current Reference to the current route definition. + * The route definition contains: + * + * - `controller`: The controller constructor as define in route definition. + * - `locals`: A map of locals which is used by {@link ng.$controller $controller} service for + * controller instantiation. The `locals` contain + * the resolved values of the `resolve` map. Additionally the `locals` also contain: + * + * - `$scope` - The current route scope. + * - `$template` - The current route template HTML. + * + * @property {Array.} routes Array of all configured routes. + * + * @description + * Is used for deep-linking URLs to controllers and views (HTML partials). + * It watches `$location.url()` and tries to map the path to an existing route definition. + * + * You can define routes through {@link ng.$routeProvider $routeProvider}'s API. + * + * The `$route` service is typically used in conjunction with {@link ng.directive:ngView ngView} + * directive and the {@link ng.$routeParams $routeParams} service. + * + * @example + This example shows how changing the URL hash causes the `$route` to match a route against the + URL, and the `ngView` pulls in the partial. + + Note that this example is using {@link ng.directive:script inlined templates} + to get it working on jsfiddle as well. + + + +
    + Choose: + Moby | + Moby: Ch1 | + Gatsby | + Gatsby: Ch4 | + Scarlet Letter
    + +
    +
    + +
    $location.path() = {{$location.path()}}
    +
    $route.current.templateUrl = {{$route.current.templateUrl}}
    +
    $route.current.params = {{$route.current.params}}
    +
    $route.current.scope.name = {{$route.current.scope.name}}
    +
    $routeParams = {{$routeParams}}
    +
    +
    + + + controller: {{name}}
    + Book Id: {{params.bookId}}
    +
    + + + controller: {{name}}
    + Book Id: {{params.bookId}}
    + Chapter Id: {{params.chapterId}} +
    + + + angular.module('ngView', [], function($routeProvider, $locationProvider) { + $routeProvider.when('/Book/:bookId', { + templateUrl: 'book.html', + controller: BookCntl, + resolve: { + // I will cause a 1 second delay + delay: function($q, $timeout) { + var delay = $q.defer(); + $timeout(delay.resolve, 1000); + return delay.promise; + } + } + }); + $routeProvider.when('/Book/:bookId/ch/:chapterId', { + templateUrl: 'chapter.html', + controller: ChapterCntl + }); + + // configure html5 to get links working on jsfiddle + $locationProvider.html5Mode(true); + }); + + function MainCntl($scope, $route, $routeParams, $location) { + $scope.$route = $route; + $scope.$location = $location; + $scope.$routeParams = $routeParams; + } + + function BookCntl($scope, $routeParams) { + $scope.name = "BookCntl"; + $scope.params = $routeParams; + } + + function ChapterCntl($scope, $routeParams) { + $scope.name = "ChapterCntl"; + $scope.params = $routeParams; + } + + + + it('should load and compile correct template', function() { + element('a:contains("Moby: Ch1")').click(); + var content = element('.doc-example-live [ng-view]').text(); + expect(content).toMatch(/controller\: ChapterCntl/); + expect(content).toMatch(/Book Id\: Moby/); + expect(content).toMatch(/Chapter Id\: 1/); + + element('a:contains("Scarlet")').click(); + sleep(2); // promises are not part of scenario waiting + content = element('.doc-example-live [ng-view]').text(); + expect(content).toMatch(/controller\: BookCntl/); + expect(content).toMatch(/Book Id\: Scarlet/); + }); + +
    + */ + + /** + * @ngdoc event + * @name ng.$route#$routeChangeStart + * @eventOf ng.$route + * @eventType broadcast on root scope + * @description + * Broadcasted before a route change. At this point the route services starts + * resolving all of the dependencies needed for the route change to occurs. + * Typically this involves fetching the view template as well as any dependencies + * defined in `resolve` route property. Once all of the dependencies are resolved + * `$routeChangeSuccess` is fired. + * + * @param {Route} next Future route information. + * @param {Route} current Current route information. + */ + + /** + * @ngdoc event + * @name ng.$route#$routeChangeSuccess + * @eventOf ng.$route + * @eventType broadcast on root scope + * @description + * Broadcasted after a route dependencies are resolved. + * {@link ng.directive:ngView ngView} listens for the directive + * to instantiate the controller and render the view. + * + * @param {Object} angularEvent Synthetic event object. + * @param {Route} current Current route information. + * @param {Route|Undefined} previous Previous route information, or undefined if current is first route entered. + */ + + /** + * @ngdoc event + * @name ng.$route#$routeChangeError + * @eventOf ng.$route + * @eventType broadcast on root scope + * @description + * Broadcasted if any of the resolve promises are rejected. + * + * @param {Route} current Current route information. + * @param {Route} previous Previous route information. + * @param {Route} rejection Rejection of the promise. Usually the error of the failed promise. + */ + + /** + * @ngdoc event + * @name ng.$route#$routeUpdate + * @eventOf ng.$route + * @eventType broadcast on root scope + * @description + * + * The `reloadOnSearch` property has been set to false, and we are reusing the same + * instance of the Controller. + */ + + var forceReload = false, + $route = { + routes: routes, + + /** + * @ngdoc method + * @name ng.$route#reload + * @methodOf ng.$route + * + * @description + * Causes `$route` service to reload the current route even if + * {@link ng.$location $location} hasn't changed. + * + * As a result of that, {@link ng.directive:ngView ngView} + * creates new scope, reinstantiates the controller. + */ + reload: function() { + forceReload = true; + $rootScope.$evalAsync(updateRoute); + } + }; + + $rootScope.$on('$locationChangeSuccess', updateRoute); + + return $route; + + ///////////////////////////////////////////////////// + + /** + * @param on {string} current url + * @param when {string} route when template to match the url against + * @param whenProperties {Object} properties to define when's matching behavior + * @return {?Object} + */ + function switchRouteMatcher(on, when, whenProperties) { + // TODO(i): this code is convoluted and inefficient, we should construct the route matching + // regex only once and then reuse it + + // Escape regexp special characters. + when = '^' + when.replace(/[-\/\\^$:*+?.()|[\]{}]/g, "\\$&") + '$'; + + var regex = '', + params = [], + dst = {}; + + var re = /\\([:*])(\w+)/g, + paramMatch, + lastMatchedIndex = 0; + + while ((paramMatch = re.exec(when)) !== null) { + // Find each :param in `when` and replace it with a capturing group. + // Append all other sections of when unchanged. + regex += when.slice(lastMatchedIndex, paramMatch.index); + switch(paramMatch[1]) { + case ':': + regex += '([^\\/]*)'; + break; + case '*': + regex += '(.*)'; + break; + } + params.push(paramMatch[2]); + lastMatchedIndex = re.lastIndex; + } + // Append trailing path part. + regex += when.substr(lastMatchedIndex); + + var match = on.match(new RegExp(regex, whenProperties.caseInsensitiveMatch ? 'i' : '')); + if (match) { + forEach(params, function(name, index) { + dst[name] = match[index + 1]; + }); + } + return match ? dst : null; + } + + function updateRoute() { + var next = parseRoute(), + last = $route.current; + + if (next && last && next.$$route === last.$$route + && equals(next.pathParams, last.pathParams) && !next.reloadOnSearch && !forceReload) { + last.params = next.params; + copy(last.params, $routeParams); + $rootScope.$broadcast('$routeUpdate', last); + } else if (next || last) { + forceReload = false; + $rootScope.$broadcast('$routeChangeStart', next, last); + $route.current = next; + if (next) { + if (next.redirectTo) { + if (isString(next.redirectTo)) { + $location.path(interpolate(next.redirectTo, next.params)).search(next.params) + .replace(); + } else { + $location.url(next.redirectTo(next.pathParams, $location.path(), $location.search())) + .replace(); + } + } + } + + $q.when(next). + then(function() { + if (next) { + var locals = extend({}, next.resolve), + template; + + forEach(locals, function(value, key) { + locals[key] = isString(value) ? $injector.get(value) : $injector.invoke(value); + }); + + if (isDefined(template = next.template)) { + if (isFunction(template)) { + template = template(next.params); + } + } else if (isDefined(template = next.templateUrl)) { + if (isFunction(template)) { + template = template(next.params); + } + if (isDefined(template)) { + next.loadedTemplateUrl = template; + template = $http.get(template, {cache: $templateCache}). + then(function(response) { return response.data; }); + } + } + if (isDefined(template)) { + locals['$template'] = template; + } + return $q.all(locals); + } + }). + // after route change + then(function(locals) { + if (next == $route.current) { + if (next) { + next.locals = locals; + copy(next.params, $routeParams); + } + $rootScope.$broadcast('$routeChangeSuccess', next, last); + } + }, function(error) { + if (next == $route.current) { + $rootScope.$broadcast('$routeChangeError', next, last, error); + } + }); + } + } + + + /** + * @returns the current active route, by matching it against the URL + */ + function parseRoute() { + // Match a route + var params, match; + forEach(routes, function(route, path) { + if (!match && (params = switchRouteMatcher($location.path(), path, route))) { + match = inherit(route, { + params: extend({}, $location.search(), params), + pathParams: params}); + match.$$route = route; + } + }); + // No route matched; fallback to "otherwise" route + return match || routes[null] && inherit(routes[null], {params: {}, pathParams:{}}); + } + + /** + * @returns interpolation of the redirect path with the parameters + */ + function interpolate(string, params) { + var result = []; + forEach((string||'').split(':'), function(segment, i) { + if (i == 0) { + result.push(segment); + } else { + var segmentMatch = segment.match(/(\w+)(.*)/); + var key = segmentMatch[1]; + result.push(params[key]); + result.push(segmentMatch[2] || ''); + delete params[key]; + } + }); + return result.join(''); + } + }]; +} + +/** + * @ngdoc object + * @name ng.$routeParams + * @requires $route + * + * @description + * Current set of route parameters. The route parameters are a combination of the + * {@link ng.$location $location} `search()`, and `path()`. The `path` parameters + * are extracted when the {@link ng.$route $route} path is matched. + * + * In case of parameter name collision, `path` params take precedence over `search` params. + * + * The service guarantees that the identity of the `$routeParams` object will remain unchanged + * (but its properties will likely change) even when a route change occurs. + * + * @example + *
    + *  // Given:
    + *  // URL: http://server.com/index.html#/Chapter/1/Section/2?search=moby
    + *  // Route: /Chapter/:chapterId/Section/:sectionId
    + *  //
    + *  // Then
    + *  $routeParams ==> {chapterId:1, sectionId:2, search:'moby'}
    + * 
    + */ +function $RouteParamsProvider() { + this.$get = valueFn({}); +} + +/** + * DESIGN NOTES + * + * The design decisions behind the scope are heavily favored for speed and memory consumption. + * + * The typical use of scope is to watch the expressions, which most of the time return the same + * value as last time so we optimize the operation. + * + * Closures construction is expensive in terms of speed as well as memory: + * - No closures, instead use prototypical inheritance for API + * - Internal state needs to be stored on scope directly, which means that private state is + * exposed as $$____ properties + * + * Loop operations are optimized by using while(count--) { ... } + * - this means that in order to keep the same order of execution as addition we have to add + * items to the array at the beginning (shift) instead of at the end (push) + * + * Child scopes are created and removed often + * - Using an array would be slow since inserts in middle are expensive so we use linked list + * + * There are few watches then a lot of observers. This is why you don't want the observer to be + * implemented in the same way as watch. Watch requires return of initialization function which + * are expensive to construct. + */ + + +/** + * @ngdoc object + * @name ng.$rootScopeProvider + * @description + * + * Provider for the $rootScope service. + */ + +/** + * @ngdoc function + * @name ng.$rootScopeProvider#digestTtl + * @methodOf ng.$rootScopeProvider + * @description + * + * Sets the number of digest iterations the scope should attempt to execute before giving up and + * assuming that the model is unstable. + * + * The current default is 10 iterations. + * + * @param {number} limit The number of digest iterations. + */ + + +/** + * @ngdoc object + * @name ng.$rootScope + * @description + * + * Every application has a single root {@link ng.$rootScope.Scope scope}. + * All other scopes are child scopes of the root scope. Scopes provide mechanism for watching the model and provide + * event processing life-cycle. See {@link guide/scope developer guide on scopes}. + */ +function $RootScopeProvider(){ + var TTL = 10; + + this.digestTtl = function(value) { + if (arguments.length) { + TTL = value; + } + return TTL; + }; + + this.$get = ['$injector', '$exceptionHandler', '$parse', + function( $injector, $exceptionHandler, $parse) { + + /** + * @ngdoc function + * @name ng.$rootScope.Scope + * + * @description + * A root scope can be retrieved using the {@link ng.$rootScope $rootScope} key from the + * {@link AUTO.$injector $injector}. Child scopes are created using the + * {@link ng.$rootScope.Scope#$new $new()} method. (Most scopes are created automatically when + * compiled HTML template is executed.) + * + * Here is a simple scope snippet to show how you can interact with the scope. + *
    +     * 
    +     * 
    + * + * # Inheritance + * A scope can inherit from a parent scope, as in this example: + *
    +         var parent = $rootScope;
    +         var child = parent.$new();
    +
    +         parent.salutation = "Hello";
    +         child.name = "World";
    +         expect(child.salutation).toEqual('Hello');
    +
    +         child.salutation = "Welcome";
    +         expect(child.salutation).toEqual('Welcome');
    +         expect(parent.salutation).toEqual('Hello');
    +     * 
    + * + * + * @param {Object.=} providers Map of service factory which need to be provided + * for the current scope. Defaults to {@link ng}. + * @param {Object.=} instanceCache Provides pre-instantiated services which should + * append/override services provided by `providers`. This is handy when unit-testing and having + * the need to override a default service. + * @returns {Object} Newly created scope. + * + */ + function Scope() { + this.$id = nextUid(); + this.$$phase = this.$parent = this.$$watchers = + this.$$nextSibling = this.$$prevSibling = + this.$$childHead = this.$$childTail = null; + this['this'] = this.$root = this; + this.$$destroyed = false; + this.$$asyncQueue = []; + this.$$listeners = {}; + this.$$isolateBindings = {}; + } + + /** + * @ngdoc property + * @name ng.$rootScope.Scope#$id + * @propertyOf ng.$rootScope.Scope + * @returns {number} Unique scope ID (monotonically increasing alphanumeric sequence) useful for + * debugging. + */ + + + Scope.prototype = { + /** + * @ngdoc function + * @name ng.$rootScope.Scope#$new + * @methodOf ng.$rootScope.Scope + * @function + * + * @description + * Creates a new child {@link ng.$rootScope.Scope scope}. + * + * The parent scope will propagate the {@link ng.$rootScope.Scope#$digest $digest()} and + * {@link ng.$rootScope.Scope#$digest $digest()} events. The scope can be removed from the scope + * hierarchy using {@link ng.$rootScope.Scope#$destroy $destroy()}. + * + * {@link ng.$rootScope.Scope#$destroy $destroy()} must be called on a scope when it is desired for + * the scope and its child scopes to be permanently detached from the parent and thus stop + * participating in model change detection and listener notification by invoking. + * + * @param {boolean} isolate if true then the scope does not prototypically inherit from the + * parent scope. The scope is isolated, as it can not see parent scope properties. + * When creating widgets it is useful for the widget to not accidentally read parent + * state. + * + * @returns {Object} The newly created child scope. + * + */ + $new: function(isolate) { + var Child, + child; + + if (isFunction(isolate)) { + // TODO: remove at some point + throw Error('API-CHANGE: Use $controller to instantiate controllers.'); + } + if (isolate) { + child = new Scope(); + child.$root = this.$root; + } else { + Child = function() {}; // should be anonymous; This is so that when the minifier munges + // the name it does not become random set of chars. These will then show up as class + // name in the debugger. + Child.prototype = this; + child = new Child(); + child.$id = nextUid(); + } + child['this'] = child; + child.$$listeners = {}; + child.$parent = this; + child.$$watchers = child.$$nextSibling = child.$$childHead = child.$$childTail = null; + child.$$prevSibling = this.$$childTail; + if (this.$$childHead) { + this.$$childTail.$$nextSibling = child; + this.$$childTail = child; + } else { + this.$$childHead = this.$$childTail = child; + } + return child; + }, + + /** + * @ngdoc function + * @name ng.$rootScope.Scope#$watch + * @methodOf ng.$rootScope.Scope + * @function + * + * @description + * Registers a `listener` callback to be executed whenever the `watchExpression` changes. + * + * - The `watchExpression` is called on every call to {@link ng.$rootScope.Scope#$digest $digest()} and + * should return the value which will be watched. (Since {@link ng.$rootScope.Scope#$digest $digest()} + * reruns when it detects changes the `watchExpression` can execute multiple times per + * {@link ng.$rootScope.Scope#$digest $digest()} and should be idempotent.) + * - The `listener` is called only when the value from the current `watchExpression` and the + * previous call to `watchExpression` are not equal (with the exception of the initial run, + * see below). The inequality is determined according to + * {@link angular.equals} function. To save the value of the object for later comparison, the + * {@link angular.copy} function is used. It also means that watching complex options will + * have adverse memory and performance implications. + * - The watch `listener` may change the model, which may trigger other `listener`s to fire. This + * is achieved by rerunning the watchers until no changes are detected. The rerun iteration + * limit is 10 to prevent an infinite loop deadlock. + * + * + * If you want to be notified whenever {@link ng.$rootScope.Scope#$digest $digest} is called, + * you can register a `watchExpression` function with no `listener`. (Since `watchExpression` + * can execute multiple times per {@link ng.$rootScope.Scope#$digest $digest} cycle when a change is + * detected, be prepared for multiple calls to your listener.) + * + * After a watcher is registered with the scope, the `listener` fn is called asynchronously + * (via {@link ng.$rootScope.Scope#$evalAsync $evalAsync}) to initialize the + * watcher. In rare cases, this is undesirable because the listener is called when the result + * of `watchExpression` didn't change. To detect this scenario within the `listener` fn, you + * can compare the `newVal` and `oldVal`. If these two values are identical (`===`) then the + * listener was called due to initialization. + * + * + * # Example + *
    +           // let's assume that scope was dependency injected as the $rootScope
    +           var scope = $rootScope;
    +           scope.name = 'misko';
    +           scope.counter = 0;
    +
    +           expect(scope.counter).toEqual(0);
    +           scope.$watch('name', function(newValue, oldValue) { scope.counter = scope.counter + 1; });
    +           expect(scope.counter).toEqual(0);
    +
    +           scope.$digest();
    +           // no variable change
    +           expect(scope.counter).toEqual(0);
    +
    +           scope.name = 'adam';
    +           scope.$digest();
    +           expect(scope.counter).toEqual(1);
    +       * 
    + * + * + * + * @param {(function()|string)} watchExpression Expression that is evaluated on each + * {@link ng.$rootScope.Scope#$digest $digest} cycle. A change in the return value triggers a + * call to the `listener`. + * + * - `string`: Evaluated as {@link guide/expression expression} + * - `function(scope)`: called with current `scope` as a parameter. + * @param {(function()|string)=} listener Callback called whenever the return value of + * the `watchExpression` changes. + * + * - `string`: Evaluated as {@link guide/expression expression} + * - `function(newValue, oldValue, scope)`: called with current and previous values as parameters. + * + * @param {boolean=} objectEquality Compare object for equality rather than for reference. + * @returns {function()} Returns a deregistration function for this listener. + */ + $watch: function(watchExp, listener, objectEquality) { + var scope = this, + get = compileToFn(watchExp, 'watch'), + array = scope.$$watchers, + watcher = { + fn: listener, + last: initWatchVal, + get: get, + exp: watchExp, + eq: !!objectEquality + }; + + // in the case user pass string, we need to compile it, do we really need this ? + if (!isFunction(listener)) { + var listenFn = compileToFn(listener || noop, 'listener'); + watcher.fn = function(newVal, oldVal, scope) {listenFn(scope);}; + } + + if (typeof watchExp == 'string' && get.constant) { + var originalFn = watcher.fn; + watcher.fn = function(newVal, oldVal, scope) { + originalFn.call(this, newVal, oldVal, scope); + arrayRemove(array, watcher); + }; + } + + if (!array) { + array = scope.$$watchers = []; + } + // we use unshift since we use a while loop in $digest for speed. + // the while loop reads in reverse order. + array.unshift(watcher); + + return function() { + arrayRemove(array, watcher); + }; + }, + + + /** + * @ngdoc function + * @name ng.$rootScope.Scope#$watchCollection + * @methodOf ng.$rootScope.Scope + * @function + * + * @description + * Shallow watches the properties of an object and fires whenever any of the properties change + * (for arrays this implies watching the array items, for object maps this implies watching the properties). + * If a change is detected the `listener` callback is fired. + * + * - The `obj` collection is observed via standard $watch operation and is examined on every call to $digest() to + * see if any items have been added, removed, or moved. + * - The `listener` is called whenever anything within the `obj` has changed. Examples include adding new items + * into the object or array, removing and moving items around. + * + * + * # Example + *
    +          $scope.names = ['igor', 'matias', 'misko', 'james'];
    +          $scope.dataCount = 4;
    +
    +          $scope.$watchCollection('names', function(newNames, oldNames) {
    +            $scope.dataCount = newNames.length;
    +          });
    +
    +          expect($scope.dataCount).toEqual(4);
    +          $scope.$digest();
    +
    +          //still at 4 ... no changes
    +          expect($scope.dataCount).toEqual(4);
    +
    +          $scope.names.pop();
    +          $scope.$digest();
    +
    +          //now there's been a change
    +          expect($scope.dataCount).toEqual(3);
    +       * 
    + * + * + * @param {string|Function(scope)} obj Evaluated as {@link guide/expression expression}. The expression value + * should evaluate to an object or an array which is observed on each + * {@link ng.$rootScope.Scope#$digest $digest} cycle. Any shallow change within the collection will trigger + * a call to the `listener`. + * + * @param {function(newCollection, oldCollection, scope)} listener a callback function that is fired with both + * the `newCollection` and `oldCollection` as parameters. + * The `newCollection` object is the newly modified data obtained from the `obj` expression and the + * `oldCollection` object is a copy of the former collection data. + * The `scope` refers to the current scope. + * + * @returns {function()} Returns a de-registration function for this listener. When the de-registration function is executed + * then the internal watch operation is terminated. + */ + $watchCollection: function(obj, listener) { + var self = this; + var oldValue; + var newValue; + var changeDetected = 0; + var objGetter = $parse(obj); + var internalArray = []; + var internalObject = {}; + var oldLength = 0; + + function $watchCollectionWatch() { + newValue = objGetter(self); + var newLength, key; + + if (!isObject(newValue)) { + if (oldValue !== newValue) { + oldValue = newValue; + changeDetected++; + } + } else if (isArrayLike(newValue)) { + if (oldValue !== internalArray) { + // we are transitioning from something which was not an array into array. + oldValue = internalArray; + oldLength = oldValue.length = 0; + changeDetected++; + } + + newLength = newValue.length; + + if (oldLength !== newLength) { + // if lengths do not match we need to trigger change notification + changeDetected++; + oldValue.length = oldLength = newLength; + } + // copy the items to oldValue and look for changes. + for (var i = 0; i < newLength; i++) { + if (oldValue[i] !== newValue[i]) { + changeDetected++; + oldValue[i] = newValue[i]; + } + } + } else { + if (oldValue !== internalObject) { + // we are transitioning from something which was not an object into object. + oldValue = internalObject = {}; + oldLength = 0; + changeDetected++; + } + // copy the items to oldValue and look for changes. + newLength = 0; + for (key in newValue) { + if (newValue.hasOwnProperty(key)) { + newLength++; + if (oldValue.hasOwnProperty(key)) { + if (oldValue[key] !== newValue[key]) { + changeDetected++; + oldValue[key] = newValue[key]; + } + } else { + oldLength++; + oldValue[key] = newValue[key]; + changeDetected++; + } + } + } + if (oldLength > newLength) { + // we used to have more keys, need to find them and destroy them. + changeDetected++; + for(key in oldValue) { + if (oldValue.hasOwnProperty(key) && !newValue.hasOwnProperty(key)) { + oldLength--; + delete oldValue[key]; + } + } + } + } + return changeDetected; + } + + function $watchCollectionAction() { + listener(newValue, oldValue, self); + } + + return this.$watch($watchCollectionWatch, $watchCollectionAction); + }, + + /** + * @ngdoc function + * @name ng.$rootScope.Scope#$digest + * @methodOf ng.$rootScope.Scope + * @function + * + * @description + * Processes all of the {@link ng.$rootScope.Scope#$watch watchers} of the current scope and its children. + * Because a {@link ng.$rootScope.Scope#$watch watcher}'s listener can change the model, the + * `$digest()` keeps calling the {@link ng.$rootScope.Scope#$watch watchers} until no more listeners are + * firing. This means that it is possible to get into an infinite loop. This function will throw + * `'Maximum iteration limit exceeded.'` if the number of iterations exceeds 10. + * + * Usually you don't call `$digest()` directly in + * {@link ng.directive:ngController controllers} or in + * {@link ng.$compileProvider#directive directives}. + * Instead a call to {@link ng.$rootScope.Scope#$apply $apply()} (typically from within a + * {@link ng.$compileProvider#directive directives}) will force a `$digest()`. + * + * If you want to be notified whenever `$digest()` is called, + * you can register a `watchExpression` function with {@link ng.$rootScope.Scope#$watch $watch()} + * with no `listener`. + * + * You may have a need to call `$digest()` from within unit-tests, to simulate the scope + * life-cycle. + * + * # Example + *
    +           var scope = ...;
    +           scope.name = 'misko';
    +           scope.counter = 0;
    +
    +           expect(scope.counter).toEqual(0);
    +           scope.$watch('name', function(newValue, oldValue) {
    +             scope.counter = scope.counter + 1;
    +           });
    +           expect(scope.counter).toEqual(0);
    +
    +           scope.$digest();
    +           // no variable change
    +           expect(scope.counter).toEqual(0);
    +
    +           scope.name = 'adam';
    +           scope.$digest();
    +           expect(scope.counter).toEqual(1);
    +       * 
    + * + */ + $digest: function() { + var watch, value, last, + watchers, + asyncQueue = this.$$asyncQueue, + length, + dirty, ttl = TTL, + next, current, target = this, + watchLog = [], + logIdx, logMsg; + + beginPhase('$digest'); + + do { // "while dirty" loop + dirty = false; + current = target; + + while(asyncQueue.length) { + try { + current.$eval(asyncQueue.shift()); + } catch (e) { + $exceptionHandler(e); + } + } + + do { // "traverse the scopes" loop + if ((watchers = current.$$watchers)) { + // process our watches + length = watchers.length; + while (length--) { + try { + watch = watchers[length]; + // Most common watches are on primitives, in which case we can short + // circuit it with === operator, only when === fails do we use .equals + if ((value = watch.get(current)) !== (last = watch.last) && + !(watch.eq + ? equals(value, last) + : (typeof value == 'number' && typeof last == 'number' + && isNaN(value) && isNaN(last)))) { + dirty = true; + watch.last = watch.eq ? copy(value) : value; + watch.fn(value, ((last === initWatchVal) ? value : last), current); + if (ttl < 5) { + logIdx = 4 - ttl; + if (!watchLog[logIdx]) watchLog[logIdx] = []; + logMsg = (isFunction(watch.exp)) + ? 'fn: ' + (watch.exp.name || watch.exp.toString()) + : watch.exp; + logMsg += '; newVal: ' + toJson(value) + '; oldVal: ' + toJson(last); + watchLog[logIdx].push(logMsg); + } + } + } catch (e) { + $exceptionHandler(e); + } + } + } + + // Insanity Warning: scope depth-first traversal + // yes, this code is a bit crazy, but it works and we have tests to prove it! + // this piece should be kept in sync with the traversal in $broadcast + if (!(next = (current.$$childHead || (current !== target && current.$$nextSibling)))) { + while(current !== target && !(next = current.$$nextSibling)) { + current = current.$parent; + } + } + } while ((current = next)); + + if(dirty && !(ttl--)) { + clearPhase(); + throw Error(TTL + ' $digest() iterations reached. Aborting!\n' + + 'Watchers fired in the last 5 iterations: ' + toJson(watchLog)); + } + } while (dirty || asyncQueue.length); + + clearPhase(); + }, + + + /** + * @ngdoc event + * @name ng.$rootScope.Scope#$destroy + * @eventOf ng.$rootScope.Scope + * @eventType broadcast on scope being destroyed + * + * @description + * Broadcasted when a scope and its children are being destroyed. + */ + + /** + * @ngdoc function + * @name ng.$rootScope.Scope#$destroy + * @methodOf ng.$rootScope.Scope + * @function + * + * @description + * Removes the current scope (and all of its children) from the parent scope. Removal implies + * that calls to {@link ng.$rootScope.Scope#$digest $digest()} will no longer + * propagate to the current scope and its children. Removal also implies that the current + * scope is eligible for garbage collection. + * + * The `$destroy()` is usually used by directives such as + * {@link ng.directive:ngRepeat ngRepeat} for managing the + * unrolling of the loop. + * + * Just before a scope is destroyed a `$destroy` event is broadcasted on this scope. + * Application code can register a `$destroy` event handler that will give it chance to + * perform any necessary cleanup. + */ + $destroy: function() { + // we can't destroy the root scope or a scope that has been already destroyed + if ($rootScope == this || this.$$destroyed) return; + var parent = this.$parent; + + this.$broadcast('$destroy'); + this.$$destroyed = true; + + if (parent.$$childHead == this) parent.$$childHead = this.$$nextSibling; + if (parent.$$childTail == this) parent.$$childTail = this.$$prevSibling; + if (this.$$prevSibling) this.$$prevSibling.$$nextSibling = this.$$nextSibling; + if (this.$$nextSibling) this.$$nextSibling.$$prevSibling = this.$$prevSibling; + + // This is bogus code that works around Chrome's GC leak + // see: https://github.com/angular/angular.js/issues/1313#issuecomment-10378451 + this.$parent = this.$$nextSibling = this.$$prevSibling = this.$$childHead = + this.$$childTail = null; + }, + + /** + * @ngdoc function + * @name ng.$rootScope.Scope#$eval + * @methodOf ng.$rootScope.Scope + * @function + * + * @description + * Executes the `expression` on the current scope returning the result. Any exceptions in the + * expression are propagated (uncaught). This is useful when evaluating Angular expressions. + * + * # Example + *
    +           var scope = ng.$rootScope.Scope();
    +           scope.a = 1;
    +           scope.b = 2;
    +
    +           expect(scope.$eval('a+b')).toEqual(3);
    +           expect(scope.$eval(function(scope){ return scope.a + scope.b; })).toEqual(3);
    +       * 
    + * + * @param {(string|function())=} expression An angular expression to be executed. + * + * - `string`: execute using the rules as defined in {@link guide/expression expression}. + * - `function(scope)`: execute the function with the current `scope` parameter. + * + * @returns {*} The result of evaluating the expression. + */ + $eval: function(expr, locals) { + return $parse(expr)(this, locals); + }, + + /** + * @ngdoc function + * @name ng.$rootScope.Scope#$evalAsync + * @methodOf ng.$rootScope.Scope + * @function + * + * @description + * Executes the expression on the current scope at a later point in time. + * + * The `$evalAsync` makes no guarantees as to when the `expression` will be executed, only that: + * + * - it will execute in the current script execution context (before any DOM rendering). + * - at least one {@link ng.$rootScope.Scope#$digest $digest cycle} will be performed after + * `expression` execution. + * + * Any exceptions from the execution of the expression are forwarded to the + * {@link ng.$exceptionHandler $exceptionHandler} service. + * + * @param {(string|function())=} expression An angular expression to be executed. + * + * - `string`: execute using the rules as defined in {@link guide/expression expression}. + * - `function(scope)`: execute the function with the current `scope` parameter. + * + */ + $evalAsync: function(expr) { + this.$$asyncQueue.push(expr); + }, + + /** + * @ngdoc function + * @name ng.$rootScope.Scope#$apply + * @methodOf ng.$rootScope.Scope + * @function + * + * @description + * `$apply()` is used to execute an expression in angular from outside of the angular framework. + * (For example from browser DOM events, setTimeout, XHR or third party libraries). + * Because we are calling into the angular framework we need to perform proper scope life-cycle + * of {@link ng.$exceptionHandler exception handling}, + * {@link ng.$rootScope.Scope#$digest executing watches}. + * + * ## Life cycle + * + * # Pseudo-Code of `$apply()` + *
    +           function $apply(expr) {
    +             try {
    +               return $eval(expr);
    +             } catch (e) {
    +               $exceptionHandler(e);
    +             } finally {
    +               $root.$digest();
    +             }
    +           }
    +       * 
    + * + * + * Scope's `$apply()` method transitions through the following stages: + * + * 1. The {@link guide/expression expression} is executed using the + * {@link ng.$rootScope.Scope#$eval $eval()} method. + * 2. Any exceptions from the execution of the expression are forwarded to the + * {@link ng.$exceptionHandler $exceptionHandler} service. + * 3. The {@link ng.$rootScope.Scope#$watch watch} listeners are fired immediately after the expression + * was executed using the {@link ng.$rootScope.Scope#$digest $digest()} method. + * + * + * @param {(string|function())=} exp An angular expression to be executed. + * + * - `string`: execute using the rules as defined in {@link guide/expression expression}. + * - `function(scope)`: execute the function with current `scope` parameter. + * + * @returns {*} The result of evaluating the expression. + */ + $apply: function(expr) { + try { + beginPhase('$apply'); + return this.$eval(expr); + } catch (e) { + $exceptionHandler(e); + } finally { + clearPhase(); + try { + $rootScope.$digest(); + } catch (e) { + $exceptionHandler(e); + throw e; + } + } + }, + + /** + * @ngdoc function + * @name ng.$rootScope.Scope#$on + * @methodOf ng.$rootScope.Scope + * @function + * + * @description + * Listens on events of a given type. See {@link ng.$rootScope.Scope#$emit $emit} for discussion of + * event life cycle. + * + * The event listener function format is: `function(event, args...)`. The `event` object + * passed into the listener has the following attributes: + * + * - `targetScope` - `{Scope}`: the scope on which the event was `$emit`-ed or `$broadcast`-ed. + * - `currentScope` - `{Scope}`: the current scope which is handling the event. + * - `name` - `{string}`: Name of the event. + * - `stopPropagation` - `{function=}`: calling `stopPropagation` function will cancel further event + * propagation (available only for events that were `$emit`-ed). + * - `preventDefault` - `{function}`: calling `preventDefault` sets `defaultPrevented` flag to true. + * - `defaultPrevented` - `{boolean}`: true if `preventDefault` was called. + * + * @param {string} name Event name to listen on. + * @param {function(event, args...)} listener Function to call when the event is emitted. + * @returns {function()} Returns a deregistration function for this listener. + */ + $on: function(name, listener) { + var namedListeners = this.$$listeners[name]; + if (!namedListeners) { + this.$$listeners[name] = namedListeners = []; + } + namedListeners.push(listener); + + return function() { + namedListeners[indexOf(namedListeners, listener)] = null; + }; + }, + + + /** + * @ngdoc function + * @name ng.$rootScope.Scope#$emit + * @methodOf ng.$rootScope.Scope + * @function + * + * @description + * Dispatches an event `name` upwards through the scope hierarchy notifying the + * registered {@link ng.$rootScope.Scope#$on} listeners. + * + * The event life cycle starts at the scope on which `$emit` was called. All + * {@link ng.$rootScope.Scope#$on listeners} listening for `name` event on this scope get notified. + * Afterwards, the event traverses upwards toward the root scope and calls all registered + * listeners along the way. The event will stop propagating if one of the listeners cancels it. + * + * Any exception emitted from the {@link ng.$rootScope.Scope#$on listeners} will be passed + * onto the {@link ng.$exceptionHandler $exceptionHandler} service. + * + * @param {string} name Event name to emit. + * @param {...*} args Optional set of arguments which will be passed onto the event listeners. + * @return {Object} Event object, see {@link ng.$rootScope.Scope#$on} + */ + $emit: function(name, args) { + var empty = [], + namedListeners, + scope = this, + stopPropagation = false, + event = { + name: name, + targetScope: scope, + stopPropagation: function() {stopPropagation = true;}, + preventDefault: function() { + event.defaultPrevented = true; + }, + defaultPrevented: false + }, + listenerArgs = concat([event], arguments, 1), + i, length; + + do { + namedListeners = scope.$$listeners[name] || empty; + event.currentScope = scope; + for (i=0, length=namedListeners.length; i 7), + hasEvent: function(event) { + // IE9 implements 'input' event it's so fubared that we rather pretend that it doesn't have + // it. In particular the event is not fired when backspace or delete key are pressed or + // when cut operation is performed. + if (event == 'input' && msie == 9) return false; + + if (isUndefined(eventSupport[event])) { + var divElm = document.createElement('div'); + eventSupport[event] = 'on' + event in divElm; + } + + return eventSupport[event]; + }, + csp: document.securityPolicy ? document.securityPolicy.isActive : false, + vendorPrefix: vendorPrefix, + transitions : transitions, + animations : animations + }; + }]; +} + +/** + * @ngdoc object + * @name ng.$window + * + * @description + * A reference to the browser's `window` object. While `window` + * is globally available in JavaScript, it causes testability problems, because + * it is a global variable. In angular we always refer to it through the + * `$window` service, so it may be overridden, removed or mocked for testing. + * + * All expressions are evaluated with respect to current scope so they don't + * suffer from window globality. + * + * @example + + + +
    + + +
    +
    + + it('should display the greeting in the input box', function() { + input('greeting').enter('Hello, E2E Tests'); + // If we click the button it will block the test runner + // element(':button').click(); + }); + +
    + */ +function $WindowProvider(){ + this.$get = valueFn(window); +} + +/** + * Parse headers into key value object + * + * @param {string} headers Raw headers as a string + * @returns {Object} Parsed headers as key value object + */ +function parseHeaders(headers) { + var parsed = {}, key, val, i; + + if (!headers) return parsed; + + forEach(headers.split('\n'), function(line) { + i = line.indexOf(':'); + key = lowercase(trim(line.substr(0, i))); + val = trim(line.substr(i + 1)); + + if (key) { + if (parsed[key]) { + parsed[key] += ', ' + val; + } else { + parsed[key] = val; + } + } + }); + + return parsed; +} + + +var IS_SAME_DOMAIN_URL_MATCH = /^(([^:]+):)?\/\/(\w+:{0,1}\w*@)?([\w\.-]*)?(:([0-9]+))?(.*)$/; + + +/** + * Parse a request and location URL and determine whether this is a same-domain request. + * + * @param {string} requestUrl The url of the request. + * @param {string} locationUrl The current browser location url. + * @returns {boolean} Whether the request is for the same domain. + */ +function isSameDomain(requestUrl, locationUrl) { + var match = IS_SAME_DOMAIN_URL_MATCH.exec(requestUrl); + // if requestUrl is relative, the regex does not match. + if (match == null) return true; + + var domain1 = { + protocol: match[2], + host: match[4], + port: int(match[6]) || DEFAULT_PORTS[match[2]] || null, + // IE8 sets unmatched groups to '' instead of undefined. + relativeProtocol: match[2] === undefined || match[2] === '' + }; + + match = SERVER_MATCH.exec(locationUrl); + var domain2 = { + protocol: match[1], + host: match[3], + port: int(match[5]) || DEFAULT_PORTS[match[1]] || null + }; + + return (domain1.protocol == domain2.protocol || domain1.relativeProtocol) && + domain1.host == domain2.host && + (domain1.port == domain2.port || (domain1.relativeProtocol && + domain2.port == DEFAULT_PORTS[domain2.protocol])); +} + + +/** + * Returns a function that provides access to parsed headers. + * + * Headers are lazy parsed when first requested. + * @see parseHeaders + * + * @param {(string|Object)} headers Headers to provide access to. + * @returns {function(string=)} Returns a getter function which if called with: + * + * - if called with single an argument returns a single header value or null + * - if called with no arguments returns an object containing all headers. + */ +function headersGetter(headers) { + var headersObj = isObject(headers) ? headers : undefined; + + return function(name) { + if (!headersObj) headersObj = parseHeaders(headers); + + if (name) { + return headersObj[lowercase(name)] || null; + } + + return headersObj; + }; +} + + +/** + * Chain all given functions + * + * This function is used for both request and response transforming + * + * @param {*} data Data to transform. + * @param {function(string=)} headers Http headers getter fn. + * @param {(function|Array.)} fns Function or an array of functions. + * @returns {*} Transformed data. + */ +function transformData(data, headers, fns) { + if (isFunction(fns)) + return fns(data, headers); + + forEach(fns, function(fn) { + data = fn(data, headers); + }); + + return data; +} + + +function isSuccess(status) { + return 200 <= status && status < 300; +} + + +function $HttpProvider() { + var JSON_START = /^\s*(\[|\{[^\{])/, + JSON_END = /[\}\]]\s*$/, + PROTECTION_PREFIX = /^\)\]\}',?\n/, + CONTENT_TYPE_APPLICATION_JSON = {'Content-Type': 'application/json;charset=utf-8'}; + + var defaults = this.defaults = { + // transform incoming response data + transformResponse: [function(data) { + if (isString(data)) { + // strip json vulnerability protection prefix + data = data.replace(PROTECTION_PREFIX, ''); + if (JSON_START.test(data) && JSON_END.test(data)) + data = fromJson(data, true); + } + return data; + }], + + // transform outgoing request data + transformRequest: [function(d) { + return isObject(d) && !isFile(d) ? toJson(d) : d; + }], + + // default headers + headers: { + common: { + 'Accept': 'application/json, text/plain, */*' + }, + post: CONTENT_TYPE_APPLICATION_JSON, + put: CONTENT_TYPE_APPLICATION_JSON, + patch: CONTENT_TYPE_APPLICATION_JSON + }, + + xsrfCookieName: 'XSRF-TOKEN', + xsrfHeaderName: 'X-XSRF-TOKEN' + }; + + /** + * Are order by request. I.E. they are applied in the same order as + * array on request, but revers order on response. + */ + var interceptorFactories = this.interceptors = []; + /** + * For historical reasons, response interceptors ordered by the order in which + * they are applied to response. (This is in revers to interceptorFactories) + */ + var responseInterceptorFactories = this.responseInterceptors = []; + + this.$get = ['$httpBackend', '$browser', '$cacheFactory', '$rootScope', '$q', '$injector', + function($httpBackend, $browser, $cacheFactory, $rootScope, $q, $injector) { + + var defaultCache = $cacheFactory('$http'); + + /** + * Interceptors stored in reverse order. Inner interceptors before outer interceptors. + * The reversal is needed so that we can build up the interception chain around the + * server request. + */ + var reversedInterceptors = []; + + forEach(interceptorFactories, function(interceptorFactory) { + reversedInterceptors.unshift(isString(interceptorFactory) + ? $injector.get(interceptorFactory) : $injector.invoke(interceptorFactory)); + }); + + forEach(responseInterceptorFactories, function(interceptorFactory, index) { + var responseFn = isString(interceptorFactory) + ? $injector.get(interceptorFactory) + : $injector.invoke(interceptorFactory); + + /** + * Response interceptors go before "around" interceptors (no real reason, just + * had to pick one.) But they are already revesed, so we can't use unshift, hence + * the splice. + */ + reversedInterceptors.splice(index, 0, { + response: function(response) { + return responseFn($q.when(response)); + }, + responseError: function(response) { + return responseFn($q.reject(response)); + } + }); + }); + + + /** + * @ngdoc function + * @name ng.$http + * @requires $httpBackend + * @requires $browser + * @requires $cacheFactory + * @requires $rootScope + * @requires $q + * @requires $injector + * + * @description + * The `$http` service is a core Angular service that facilitates communication with the remote + * HTTP servers via the browser's {@link https://developer.mozilla.org/en/xmlhttprequest + * XMLHttpRequest} object or via {@link http://en.wikipedia.org/wiki/JSONP JSONP}. + * + * For unit testing applications that use `$http` service, see + * {@link ngMock.$httpBackend $httpBackend mock}. + * + * For a higher level of abstraction, please check out the {@link ngResource.$resource + * $resource} service. + * + * The $http API is based on the {@link ng.$q deferred/promise APIs} exposed by + * the $q service. While for simple usage patterns this doesn't matter much, for advanced usage + * it is important to familiarize yourself with these APIs and the guarantees they provide. + * + * + * # General usage + * The `$http` service is a function which takes a single argument — a configuration object — + * that is used to generate an HTTP request and returns a {@link ng.$q promise} + * with two $http specific methods: `success` and `error`. + * + *
    +     *   $http({method: 'GET', url: '/someUrl'}).
    +     *     success(function(data, status, headers, config) {
    +     *       // this callback will be called asynchronously
    +     *       // when the response is available
    +     *     }).
    +     *     error(function(data, status, headers, config) {
    +     *       // called asynchronously if an error occurs
    +     *       // or server returns response with an error status.
    +     *     });
    +     * 
    + * + * Since the returned value of calling the $http function is a `promise`, you can also use + * the `then` method to register callbacks, and these callbacks will receive a single argument – + * an object representing the response. See the API signature and type info below for more + * details. + * + * A response status code between 200 and 299 is considered a success status and + * will result in the success callback being called. Note that if the response is a redirect, + * XMLHttpRequest will transparently follow it, meaning that the error callback will not be + * called for such responses. + * + * # Shortcut methods + * + * Since all invocations of the $http service require passing in an HTTP method and URL, and + * POST/PUT requests require request data to be provided as well, shortcut methods + * were created: + * + *
    +     *   $http.get('/someUrl').success(successCallback);
    +     *   $http.post('/someUrl', data).success(successCallback);
    +     * 
    + * + * Complete list of shortcut methods: + * + * - {@link ng.$http#get $http.get} + * - {@link ng.$http#head $http.head} + * - {@link ng.$http#post $http.post} + * - {@link ng.$http#put $http.put} + * - {@link ng.$http#delete $http.delete} + * - {@link ng.$http#jsonp $http.jsonp} + * + * + * # Setting HTTP Headers + * + * The $http service will automatically add certain HTTP headers to all requests. These defaults + * can be fully configured by accessing the `$httpProvider.defaults.headers` configuration + * object, which currently contains this default configuration: + * + * - `$httpProvider.defaults.headers.common` (headers that are common for all requests): + * - `Accept: application/json, text/plain, * / *` + * - `$httpProvider.defaults.headers.post`: (header defaults for POST requests) + * - `Content-Type: application/json` + * - `$httpProvider.defaults.headers.put` (header defaults for PUT requests) + * - `Content-Type: application/json` + * + * To add or overwrite these defaults, simply add or remove a property from these configuration + * objects. To add headers for an HTTP method other than POST or PUT, simply add a new object + * with the lowercased HTTP method name as the key, e.g. + * `$httpProvider.defaults.headers.get['My-Header']='value'`. + * + * Additionally, the defaults can be set at runtime via the `$http.defaults` object in the same + * fashion. + * + * + * # Transforming Requests and Responses + * + * Both requests and responses can be transformed using transform functions. By default, Angular + * applies these transformations: + * + * Request transformations: + * + * - If the `data` property of the request configuration object contains an object, serialize it into + * JSON format. + * + * Response transformations: + * + * - If XSRF prefix is detected, strip it (see Security Considerations section below). + * - If JSON response is detected, deserialize it using a JSON parser. + * + * To globally augment or override the default transforms, modify the `$httpProvider.defaults.transformRequest` and + * `$httpProvider.defaults.transformResponse` properties. These properties are by default an + * array of transform functions, which allows you to `push` or `unshift` a new transformation function into the + * transformation chain. You can also decide to completely override any default transformations by assigning your + * transformation functions to these properties directly without the array wrapper. + * + * Similarly, to locally override the request/response transforms, augment the `transformRequest` and/or + * `transformResponse` properties of the configuration object passed into `$http`. + * + * + * # Caching + * + * To enable caching, set the configuration property `cache` to `true`. When the cache is + * enabled, `$http` stores the response from the server in local cache. Next time the + * response is served from the cache without sending a request to the server. + * + * Note that even if the response is served from cache, delivery of the data is asynchronous in + * the same way that real requests are. + * + * If there are multiple GET requests for the same URL that should be cached using the same + * cache, but the cache is not populated yet, only one request to the server will be made and + * the remaining requests will be fulfilled using the response from the first request. + * + * A custom default cache built with $cacheFactory can be provided in $http.defaults.cache. + * To skip it, set configuration property `cache` to `false`. + * + * + * # Interceptors + * + * Before you start creating interceptors, be sure to understand the + * {@link ng.$q $q and deferred/promise APIs}. + * + * For purposes of global error handling, authentication, or any kind of synchronous or + * asynchronous pre-processing of request or postprocessing of responses, it is desirable to be + * able to intercept requests before they are handed to the server and + * responses before they are handed over to the application code that + * initiated these requests. The interceptors leverage the {@link ng.$q + * promise APIs} to fulfill this need for both synchronous and asynchronous pre-processing. + * + * The interceptors are service factories that are registered with the `$httpProvider` by + * adding them to the `$httpProvider.interceptors` array. The factory is called and + * injected with dependencies (if specified) and returns the interceptor. + * + * There are two kinds of interceptors (and two kinds of rejection interceptors): + * + * * `request`: interceptors get called with http `config` object. The function is free to modify + * the `config` or create a new one. The function needs to return the `config` directly or as a + * promise. + * * `requestError`: interceptor gets called when a previous interceptor threw an error or resolved + * with a rejection. + * * `response`: interceptors get called with http `response` object. The function is free to modify + * the `response` or create a new one. The function needs to return the `response` directly or as a + * promise. + * * `responseError`: interceptor gets called when a previous interceptor threw an error or resolved + * with a rejection. + * + * + *
    +     *   // register the interceptor as a service
    +     *   $provide.factory('myHttpInterceptor', function($q, dependency1, dependency2) {
    +     *     return {
    +     *       // optional method
    +     *       'request': function(config) {
    +     *         // do something on success
    +     *         return config || $q.when(config);
    +     *       },
    +     *
    +     *       // optional method
    +     *      'requestError': function(rejection) {
    +     *         // do something on error
    +     *         if (canRecover(rejection)) {
    +     *           return responseOrNewPromise
    +     *         }
    +     *         return $q.reject(rejection);
    +     *       },
    +     *
    +     *
    +     *
    +     *       // optional method
    +     *       'response': function(response) {
    +     *         // do something on success
    +     *         return response || $q.when(response);
    +     *       },
    +     *
    +     *       // optional method
    +     *      'responseError': function(rejection) {
    +     *         // do something on error
    +     *         if (canRecover(rejection)) {
    +     *           return responseOrNewPromise
    +     *         }
    +     *         return $q.reject(rejection);
    +     *       };
    +     *     }
    +     *   });
    +     *
    +     *   $httpProvider.interceptors.push('myHttpInterceptor');
    +     *
    +     *
    +     *   // register the interceptor via an anonymous factory
    +     *   $httpProvider.interceptors.push(function($q, dependency1, dependency2) {
    +     *     return {
    +     *      'request': function(config) {
    +     *          // same as above
    +     *       },
    +     *       'response': function(response) {
    +     *          // same as above
    +     *       }
    +     *   });
    +     * 
    + * + * # Response interceptors (DEPRECATED) + * + * Before you start creating interceptors, be sure to understand the + * {@link ng.$q $q and deferred/promise APIs}. + * + * For purposes of global error handling, authentication or any kind of synchronous or + * asynchronous preprocessing of received responses, it is desirable to be able to intercept + * responses for http requests before they are handed over to the application code that + * initiated these requests. The response interceptors leverage the {@link ng.$q + * promise apis} to fulfil this need for both synchronous and asynchronous preprocessing. + * + * The interceptors are service factories that are registered with the $httpProvider by + * adding them to the `$httpProvider.responseInterceptors` array. The factory is called and + * injected with dependencies (if specified) and returns the interceptor — a function that + * takes a {@link ng.$q promise} and returns the original or a new promise. + * + *
    +     *   // register the interceptor as a service
    +     *   $provide.factory('myHttpInterceptor', function($q, dependency1, dependency2) {
    +     *     return function(promise) {
    +     *       return promise.then(function(response) {
    +     *         // do something on success
    +     *       }, function(response) {
    +     *         // do something on error
    +     *         if (canRecover(response)) {
    +     *           return responseOrNewPromise
    +     *         }
    +     *         return $q.reject(response);
    +     *       });
    +     *     }
    +     *   });
    +     *
    +     *   $httpProvider.responseInterceptors.push('myHttpInterceptor');
    +     *
    +     *
    +     *   // register the interceptor via an anonymous factory
    +     *   $httpProvider.responseInterceptors.push(function($q, dependency1, dependency2) {
    +     *     return function(promise) {
    +     *       // same as above
    +     *     }
    +     *   });
    +     * 
    + * + * + * # Security Considerations + * + * When designing web applications, consider security threats from: + * + * - {@link http://haacked.com/archive/2008/11/20/anatomy-of-a-subtle-json-vulnerability.aspx + * JSON vulnerability} + * - {@link http://en.wikipedia.org/wiki/Cross-site_request_forgery XSRF} + * + * Both server and the client must cooperate in order to eliminate these threats. Angular comes + * pre-configured with strategies that address these issues, but for this to work backend server + * cooperation is required. + * + * ## JSON Vulnerability Protection + * + * A {@link http://haacked.com/archive/2008/11/20/anatomy-of-a-subtle-json-vulnerability.aspx + * JSON vulnerability} allows third party website to turn your JSON resource URL into + * {@link http://en.wikipedia.org/wiki/JSONP JSONP} request under some conditions. To + * counter this your server can prefix all JSON requests with following string `")]}',\n"`. + * Angular will automatically strip the prefix before processing it as JSON. + * + * For example if your server needs to return: + *
    +     * ['one','two']
    +     * 
    + * + * which is vulnerable to attack, your server can return: + *
    +     * )]}',
    +     * ['one','two']
    +     * 
    + * + * Angular will strip the prefix, before processing the JSON. + * + * + * ## Cross Site Request Forgery (XSRF) Protection + * + * {@link http://en.wikipedia.org/wiki/Cross-site_request_forgery XSRF} is a technique by which + * an unauthorized site can gain your user's private data. Angular provides a mechanism + * to counter XSRF. When performing XHR requests, the $http service reads a token from a cookie + * (by default, `XSRF-TOKEN`) and sets it as an HTTP header (`X-XSRF-TOKEN`). Since only + * JavaScript that runs on your domain could read the cookie, your server can be assured that + * the XHR came from JavaScript running on your domain. The header will not be set for + * cross-domain requests. + * + * To take advantage of this, your server needs to set a token in a JavaScript readable session + * cookie called `XSRF-TOKEN` on the first HTTP GET request. On subsequent XHR requests the + * server can verify that the cookie matches `X-XSRF-TOKEN` HTTP header, and therefore be sure + * that only JavaScript running on your domain could have sent the request. The token must be + * unique for each user and must be verifiable by the server (to prevent the JavaScript from making + * up its own tokens). We recommend that the token is a digest of your site's authentication + * cookie with a {@link https://en.wikipedia.org/wiki/Salt_(cryptography) salt} for added security. + * + * The name of the headers can be specified using the xsrfHeaderName and xsrfCookieName + * properties of either $httpProvider.defaults, or the per-request config object. + * + * + * @param {object} config Object describing the request to be made and how it should be + * processed. The object has following properties: + * + * - **method** – `{string}` – HTTP method (e.g. 'GET', 'POST', etc) + * - **url** – `{string}` – Absolute or relative URL of the resource that is being requested. + * - **params** – `{Object.}` – Map of strings or objects which will be turned to + * `?key1=value1&key2=value2` after the url. If the value is not a string, it will be JSONified. + * - **data** – `{string|Object}` – Data to be sent as the request message data. + * - **headers** – `{Object}` – Map of strings representing HTTP headers to send to the server. + * - **xsrfHeaderName** – `{string}` – Name of HTTP header to populate with the XSRF token. + * - **xsrfCookieName** – `{string}` – Name of cookie containing the XSRF token. + * - **transformRequest** – `{function(data, headersGetter)|Array.}` – + * transform function or an array of such functions. The transform function takes the http + * request body and headers and returns its transformed (typically serialized) version. + * - **transformResponse** – `{function(data, headersGetter)|Array.}` – + * transform function or an array of such functions. The transform function takes the http + * response body and headers and returns its transformed (typically deserialized) version. + * - **cache** – `{boolean|Cache}` – If true, a default $http cache will be used to cache the + * GET request, otherwise if a cache instance built with + * {@link ng.$cacheFactory $cacheFactory}, this cache will be used for + * caching. + * - **timeout** – `{number|Promise}` – timeout in milliseconds, or {@link ng.$q promise} + * that should abort the request when resolved. + * - **withCredentials** - `{boolean}` - whether to to set the `withCredentials` flag on the + * XHR object. See {@link https://developer.mozilla.org/en/http_access_control#section_5 + * requests with credentials} for more information. + * - **responseType** - `{string}` - see {@link + * https://developer.mozilla.org/en-US/docs/DOM/XMLHttpRequest#responseType requestType}. + * + * @returns {HttpPromise} Returns a {@link ng.$q promise} object with the + * standard `then` method and two http specific methods: `success` and `error`. The `then` + * method takes two arguments a success and an error callback which will be called with a + * response object. The `success` and `error` methods take a single argument - a function that + * will be called when the request succeeds or fails respectively. The arguments passed into + * these functions are destructured representation of the response object passed into the + * `then` method. The response object has these properties: + * + * - **data** – `{string|Object}` – The response body transformed with the transform functions. + * - **status** – `{number}` – HTTP status code of the response. + * - **headers** – `{function([headerName])}` – Header getter function. + * - **config** – `{Object}` – The configuration object that was used to generate the request. + * + * @property {Array.} pendingRequests Array of config objects for currently pending + * requests. This is primarily meant to be used for debugging purposes. + * + * + * @example + + +
    + + +
    + + + +
    http status code: {{status}}
    +
    http response data: {{data}}
    +
    +
    + + function FetchCtrl($scope, $http, $templateCache) { + $scope.method = 'GET'; + $scope.url = 'http-hello.html'; + + $scope.fetch = function() { + $scope.code = null; + $scope.response = null; + + $http({method: $scope.method, url: $scope.url, cache: $templateCache}). + success(function(data, status) { + $scope.status = status; + $scope.data = data; + }). + error(function(data, status) { + $scope.data = data || "Request failed"; + $scope.status = status; + }); + }; + + $scope.updateModel = function(method, url) { + $scope.method = method; + $scope.url = url; + }; + } + + + Hello, $http! + + + it('should make an xhr GET request', function() { + element(':button:contains("Sample GET")').click(); + element(':button:contains("fetch")').click(); + expect(binding('status')).toBe('200'); + expect(binding('data')).toMatch(/Hello, \$http!/); + }); + + it('should make a JSONP request to angularjs.org', function() { + element(':button:contains("Sample JSONP")').click(); + element(':button:contains("fetch")').click(); + expect(binding('status')).toBe('200'); + expect(binding('data')).toMatch(/Super Hero!/); + }); + + it('should make JSONP request to invalid URL and invoke the error handler', + function() { + element(':button:contains("Invalid JSONP")').click(); + element(':button:contains("fetch")').click(); + expect(binding('status')).toBe('0'); + expect(binding('data')).toBe('Request failed'); + }); + +
    + */ + function $http(requestConfig) { + var config = { + transformRequest: defaults.transformRequest, + transformResponse: defaults.transformResponse + }; + var headers = {}; + + extend(config, requestConfig); + config.headers = headers; + config.method = uppercase(config.method); + + extend(headers, + defaults.headers.common, + defaults.headers[lowercase(config.method)], + requestConfig.headers); + + var xsrfValue = isSameDomain(config.url, $browser.url()) + ? $browser.cookies()[config.xsrfCookieName || defaults.xsrfCookieName] + : undefined; + if (xsrfValue) { + headers[(config.xsrfHeaderName || defaults.xsrfHeaderName)] = xsrfValue; + } + + + var serverRequest = function(config) { + var reqData = transformData(config.data, headersGetter(headers), config.transformRequest); + + // strip content-type if data is undefined + if (isUndefined(config.data)) { + delete headers['Content-Type']; + } + + if (isUndefined(config.withCredentials) && !isUndefined(defaults.withCredentials)) { + config.withCredentials = defaults.withCredentials; + } + + // send request + return sendReq(config, reqData, headers).then(transformResponse, transformResponse); + }; + + var chain = [serverRequest, undefined]; + var promise = $q.when(config); + + // apply interceptors + forEach(reversedInterceptors, function(interceptor) { + if (interceptor.request || interceptor.requestError) { + chain.unshift(interceptor.request, interceptor.requestError); + } + if (interceptor.response || interceptor.responseError) { + chain.push(interceptor.response, interceptor.responseError); + } + }); + + while(chain.length) { + var thenFn = chain.shift(); + var rejectFn = chain.shift(); + + promise = promise.then(thenFn, rejectFn); + } + + promise.success = function(fn) { + promise.then(function(response) { + fn(response.data, response.status, response.headers, config); + }); + return promise; + }; + + promise.error = function(fn) { + promise.then(null, function(response) { + fn(response.data, response.status, response.headers, config); + }); + return promise; + }; + + return promise; + + function transformResponse(response) { + // make a copy since the response must be cacheable + var resp = extend({}, response, { + data: transformData(response.data, response.headers, config.transformResponse) + }); + return (isSuccess(response.status)) + ? resp + : $q.reject(resp); + } + } + + $http.pendingRequests = []; + + /** + * @ngdoc method + * @name ng.$http#get + * @methodOf ng.$http + * + * @description + * Shortcut method to perform `GET` request. + * + * @param {string} url Relative or absolute URL specifying the destination of the request + * @param {Object=} config Optional configuration object + * @returns {HttpPromise} Future object + */ + + /** + * @ngdoc method + * @name ng.$http#delete + * @methodOf ng.$http + * + * @description + * Shortcut method to perform `DELETE` request. + * + * @param {string} url Relative or absolute URL specifying the destination of the request + * @param {Object=} config Optional configuration object + * @returns {HttpPromise} Future object + */ + + /** + * @ngdoc method + * @name ng.$http#head + * @methodOf ng.$http + * + * @description + * Shortcut method to perform `HEAD` request. + * + * @param {string} url Relative or absolute URL specifying the destination of the request + * @param {Object=} config Optional configuration object + * @returns {HttpPromise} Future object + */ + + /** + * @ngdoc method + * @name ng.$http#jsonp + * @methodOf ng.$http + * + * @description + * Shortcut method to perform `JSONP` request. + * + * @param {string} url Relative or absolute URL specifying the destination of the request. + * Should contain `JSON_CALLBACK` string. + * @param {Object=} config Optional configuration object + * @returns {HttpPromise} Future object + */ + createShortMethods('get', 'delete', 'head', 'jsonp'); + + /** + * @ngdoc method + * @name ng.$http#post + * @methodOf ng.$http + * + * @description + * Shortcut method to perform `POST` request. + * + * @param {string} url Relative or absolute URL specifying the destination of the request + * @param {*} data Request content + * @param {Object=} config Optional configuration object + * @returns {HttpPromise} Future object + */ + + /** + * @ngdoc method + * @name ng.$http#put + * @methodOf ng.$http + * + * @description + * Shortcut method to perform `PUT` request. + * + * @param {string} url Relative or absolute URL specifying the destination of the request + * @param {*} data Request content + * @param {Object=} config Optional configuration object + * @returns {HttpPromise} Future object + */ + createShortMethodsWithData('post', 'put'); + + /** + * @ngdoc property + * @name ng.$http#defaults + * @propertyOf ng.$http + * + * @description + * Runtime equivalent of the `$httpProvider.defaults` property. Allows configuration of + * default headers, withCredentials as well as request and response transformations. + * + * See "Setting HTTP Headers" and "Transforming Requests and Responses" sections above. + */ + $http.defaults = defaults; + + + return $http; + + + function createShortMethods(names) { + forEach(arguments, function(name) { + $http[name] = function(url, config) { + return $http(extend(config || {}, { + method: name, + url: url + })); + }; + }); + } + + + function createShortMethodsWithData(name) { + forEach(arguments, function(name) { + $http[name] = function(url, data, config) { + return $http(extend(config || {}, { + method: name, + url: url, + data: data + })); + }; + }); + } + + + /** + * Makes the request. + * + * !!! ACCESSES CLOSURE VARS: + * $httpBackend, defaults, $log, $rootScope, defaultCache, $http.pendingRequests + */ + function sendReq(config, reqData, reqHeaders) { + var deferred = $q.defer(), + promise = deferred.promise, + cache, + cachedResp, + url = buildUrl(config.url, config.params); + + $http.pendingRequests.push(config); + promise.then(removePendingReq, removePendingReq); + + + if ((config.cache || defaults.cache) && config.cache !== false && config.method == 'GET') { + cache = isObject(config.cache) ? config.cache + : isObject(defaults.cache) ? defaults.cache + : defaultCache; + } + + if (cache) { + cachedResp = cache.get(url); + if (cachedResp) { + if (cachedResp.then) { + // cached request has already been sent, but there is no response yet + cachedResp.then(removePendingReq, removePendingReq); + return cachedResp; + } else { + // serving from cache + if (isArray(cachedResp)) { + resolvePromise(cachedResp[1], cachedResp[0], copy(cachedResp[2])); + } else { + resolvePromise(cachedResp, 200, {}); + } + } + } else { + // put the promise for the non-transformed response into cache as a placeholder + cache.put(url, promise); + } + } + + // if we won't have the response in cache, send the request to the backend + if (!cachedResp) { + $httpBackend(config.method, url, reqData, done, reqHeaders, config.timeout, + config.withCredentials, config.responseType); + } + + return promise; + + + /** + * Callback registered to $httpBackend(): + * - caches the response if desired + * - resolves the raw $http promise + * - calls $apply + */ + function done(status, response, headersString) { + if (cache) { + if (isSuccess(status)) { + cache.put(url, [status, response, parseHeaders(headersString)]); + } else { + // remove promise from the cache + cache.remove(url); + } + } + + resolvePromise(response, status, headersString); + if (!$rootScope.$$phase) $rootScope.$apply(); + } + + + /** + * Resolves the raw $http promise. + */ + function resolvePromise(response, status, headers) { + // normalize internal statuses to 0 + status = Math.max(status, 0); + + (isSuccess(status) ? deferred.resolve : deferred.reject)({ + data: response, + status: status, + headers: headersGetter(headers), + config: config + }); + } + + + function removePendingReq() { + var idx = indexOf($http.pendingRequests, config); + if (idx !== -1) $http.pendingRequests.splice(idx, 1); + } + } + + + function buildUrl(url, params) { + if (!params) return url; + var parts = []; + forEachSorted(params, function(value, key) { + if (value == null || value == undefined) return; + if (!isArray(value)) value = [value]; + + forEach(value, function(v) { + if (isObject(v)) { + v = toJson(v); + } + parts.push(encodeUriQuery(key) + '=' + + encodeUriQuery(v)); + }); + }); + return url + ((url.indexOf('?') == -1) ? '?' : '&') + parts.join('&'); + } + + + }]; +} + +var XHR = window.XMLHttpRequest || function() { + try { return new ActiveXObject("Msxml2.XMLHTTP.6.0"); } catch (e1) {} + try { return new ActiveXObject("Msxml2.XMLHTTP.3.0"); } catch (e2) {} + try { return new ActiveXObject("Msxml2.XMLHTTP"); } catch (e3) {} + throw new Error("This browser does not support XMLHttpRequest."); +}; + + +/** + * @ngdoc object + * @name ng.$httpBackend + * @requires $browser + * @requires $window + * @requires $document + * + * @description + * HTTP backend used by the {@link ng.$http service} that delegates to + * XMLHttpRequest object or JSONP and deals with browser incompatibilities. + * + * You should never need to use this service directly, instead use the higher-level abstractions: + * {@link ng.$http $http} or {@link ngResource.$resource $resource}. + * + * During testing this implementation is swapped with {@link ngMock.$httpBackend mock + * $httpBackend} which can be trained with responses. + */ +function $HttpBackendProvider() { + this.$get = ['$browser', '$window', '$document', function($browser, $window, $document) { + return createHttpBackend($browser, XHR, $browser.defer, $window.angular.callbacks, + $document[0], $window.location.protocol.replace(':', '')); + }]; +} + +function createHttpBackend($browser, XHR, $browserDefer, callbacks, rawDocument, locationProtocol) { + // TODO(vojta): fix the signature + return function(method, url, post, callback, headers, timeout, withCredentials, responseType) { + var status; + $browser.$$incOutstandingRequestCount(); + url = url || $browser.url(); + + if (lowercase(method) == 'jsonp') { + var callbackId = '_' + (callbacks.counter++).toString(36); + callbacks[callbackId] = function(data) { + callbacks[callbackId].data = data; + }; + + var jsonpDone = jsonpReq(url.replace('JSON_CALLBACK', 'angular.callbacks.' + callbackId), + function() { + if (callbacks[callbackId].data) { + completeRequest(callback, 200, callbacks[callbackId].data); + } else { + completeRequest(callback, status || -2); + } + delete callbacks[callbackId]; + }); + } else { + var xhr = new XHR(); + xhr.open(method, url, true); + forEach(headers, function(value, key) { + if (value) xhr.setRequestHeader(key, value); + }); + + // In IE6 and 7, this might be called synchronously when xhr.send below is called and the + // response is in the cache. the promise api will ensure that to the app code the api is + // always async + xhr.onreadystatechange = function() { + if (xhr.readyState == 4) { + var responseHeaders = xhr.getAllResponseHeaders(); + + // TODO(vojta): remove once Firefox 21 gets released. + // begin: workaround to overcome Firefox CORS http response headers bug + // https://bugzilla.mozilla.org/show_bug.cgi?id=608735 + // Firefox already patched in nightly. Should land in Firefox 21. + + // CORS "simple response headers" http://www.w3.org/TR/cors/ + var value, + simpleHeaders = ["Cache-Control", "Content-Language", "Content-Type", + "Expires", "Last-Modified", "Pragma"]; + if (!responseHeaders) { + responseHeaders = ""; + forEach(simpleHeaders, function (header) { + var value = xhr.getResponseHeader(header); + if (value) { + responseHeaders += header + ": " + value + "\n"; + } + }); + } + // end of the workaround. + + // responseText is the old-school way of retrieving response (supported by IE8 & 9) + // response and responseType properties were introduced in XHR Level2 spec (supported by IE10) + completeRequest(callback, + status || xhr.status, + (xhr.responseType ? xhr.response : xhr.responseText), + responseHeaders); + } + }; + + if (withCredentials) { + xhr.withCredentials = true; + } + + if (responseType) { + xhr.responseType = responseType; + } + + xhr.send(post || ''); + } + + if (timeout > 0) { + var timeoutId = $browserDefer(timeoutRequest, timeout); + } else if (timeout && timeout.then) { + timeout.then(timeoutRequest); + } + + + function timeoutRequest() { + status = -1; + jsonpDone && jsonpDone(); + xhr && xhr.abort(); + } + + function completeRequest(callback, status, response, headersString) { + // URL_MATCH is defined in src/service/location.js + var protocol = (url.match(SERVER_MATCH) || ['', locationProtocol])[1]; + + // cancel timeout and subsequent timeout promise resolution + timeoutId && $browserDefer.cancel(timeoutId); + jsonpDone = xhr = null; + + // fix status code for file protocol (it's always 0) + status = (protocol == 'file') ? (response ? 200 : 404) : status; + + // normalize IE bug (http://bugs.jquery.com/ticket/1450) + status = status == 1223 ? 204 : status; + + callback(status, response, headersString); + $browser.$$completeOutstandingRequest(noop); + } + }; + + function jsonpReq(url, done) { + // we can't use jQuery/jqLite here because jQuery does crazy shit with script elements, e.g.: + // - fetches local scripts via XHR and evals them + // - adds and immediately removes script elements from the document + var script = rawDocument.createElement('script'), + doneWrapper = function() { + rawDocument.body.removeChild(script); + if (done) done(); + }; + + script.type = 'text/javascript'; + script.src = url; + + if (msie) { + script.onreadystatechange = function() { + if (/loaded|complete/.test(script.readyState)) doneWrapper(); + }; + } else { + script.onload = script.onerror = doneWrapper; + } + + rawDocument.body.appendChild(script); + return doneWrapper; + } +} + +/** + * @ngdoc object + * @name ng.$locale + * + * @description + * $locale service provides localization rules for various Angular components. As of right now the + * only public api is: + * + * * `id` – `{string}` – locale id formatted as `languageId-countryId` (e.g. `en-us`) + */ +function $LocaleProvider(){ + this.$get = function() { + return { + id: 'en-us', + + NUMBER_FORMATS: { + DECIMAL_SEP: '.', + GROUP_SEP: ',', + PATTERNS: [ + { // Decimal Pattern + minInt: 1, + minFrac: 0, + maxFrac: 3, + posPre: '', + posSuf: '', + negPre: '-', + negSuf: '', + gSize: 3, + lgSize: 3 + },{ //Currency Pattern + minInt: 1, + minFrac: 2, + maxFrac: 2, + posPre: '\u00A4', + posSuf: '', + negPre: '(\u00A4', + negSuf: ')', + gSize: 3, + lgSize: 3 + } + ], + CURRENCY_SYM: '$' + }, + + DATETIME_FORMATS: { + MONTH: 'January,February,March,April,May,June,July,August,September,October,November,December' + .split(','), + SHORTMONTH: 'Jan,Feb,Mar,Apr,May,Jun,Jul,Aug,Sep,Oct,Nov,Dec'.split(','), + DAY: 'Sunday,Monday,Tuesday,Wednesday,Thursday,Friday,Saturday'.split(','), + SHORTDAY: 'Sun,Mon,Tue,Wed,Thu,Fri,Sat'.split(','), + AMPMS: ['AM','PM'], + medium: 'MMM d, y h:mm:ss a', + short: 'M/d/yy h:mm a', + fullDate: 'EEEE, MMMM d, y', + longDate: 'MMMM d, y', + mediumDate: 'MMM d, y', + shortDate: 'M/d/yy', + mediumTime: 'h:mm:ss a', + shortTime: 'h:mm a' + }, + + pluralCat: function(num) { + if (num === 1) { + return 'one'; + } + return 'other'; + } + }; + }; +} + +function $TimeoutProvider() { + this.$get = ['$rootScope', '$browser', '$q', '$exceptionHandler', + function($rootScope, $browser, $q, $exceptionHandler) { + var deferreds = {}; + + + /** + * @ngdoc function + * @name ng.$timeout + * @requires $browser + * + * @description + * Angular's wrapper for `window.setTimeout`. The `fn` function is wrapped into a try/catch + * block and delegates any exceptions to + * {@link ng.$exceptionHandler $exceptionHandler} service. + * + * The return value of registering a timeout function is a promise, which will be resolved when + * the timeout is reached and the timeout function is executed. + * + * To cancel a timeout request, call `$timeout.cancel(promise)`. + * + * In tests you can use {@link ngMock.$timeout `$timeout.flush()`} to + * synchronously flush the queue of deferred functions. + * + * @param {function()} fn A function, whose execution should be delayed. + * @param {number=} [delay=0] Delay in milliseconds. + * @param {boolean=} [invokeApply=true] If set to `false` skips model dirty checking, otherwise + * will invoke `fn` within the {@link ng.$rootScope.Scope#$apply $apply} block. + * @returns {Promise} Promise that will be resolved when the timeout is reached. The value this + * promise will be resolved with is the return value of the `fn` function. + */ + function timeout(fn, delay, invokeApply) { + var deferred = $q.defer(), + promise = deferred.promise, + skipApply = (isDefined(invokeApply) && !invokeApply), + timeoutId, cleanup; + + timeoutId = $browser.defer(function() { + try { + deferred.resolve(fn()); + } catch(e) { + deferred.reject(e); + $exceptionHandler(e); + } + + if (!skipApply) $rootScope.$apply(); + }, delay); + + cleanup = function() { + delete deferreds[promise.$$timeoutId]; + }; + + promise.$$timeoutId = timeoutId; + deferreds[timeoutId] = deferred; + promise.then(cleanup, cleanup); + + return promise; + } + + + /** + * @ngdoc function + * @name ng.$timeout#cancel + * @methodOf ng.$timeout + * + * @description + * Cancels a task associated with the `promise`. As a result of this, the promise will be + * resolved with a rejection. + * + * @param {Promise=} promise Promise returned by the `$timeout` function. + * @returns {boolean} Returns `true` if the task hasn't executed yet and was successfully + * canceled. + */ + timeout.cancel = function(promise) { + if (promise && promise.$$timeoutId in deferreds) { + deferreds[promise.$$timeoutId].reject('canceled'); + return $browser.defer.cancel(promise.$$timeoutId); + } + return false; + }; + + return timeout; + }]; +} + +/** + * @ngdoc object + * @name ng.$filterProvider + * @description + * + * Filters are just functions which transform input to an output. However filters need to be Dependency Injected. To + * achieve this a filter definition consists of a factory function which is annotated with dependencies and is + * responsible for creating a filter function. + * + *
    + *   // Filter registration
    + *   function MyModule($provide, $filterProvider) {
    + *     // create a service to demonstrate injection (not always needed)
    + *     $provide.value('greet', function(name){
    + *       return 'Hello ' + name + '!';
    + *     });
    + *
    + *     // register a filter factory which uses the
    + *     // greet service to demonstrate DI.
    + *     $filterProvider.register('greet', function(greet){
    + *       // return the filter function which uses the greet service
    + *       // to generate salutation
    + *       return function(text) {
    + *         // filters need to be forgiving so check input validity
    + *         return text && greet(text) || text;
    + *       };
    + *     });
    + *   }
    + * 
    + * + * The filter function is registered with the `$injector` under the filter name suffixe with `Filter`. + *
    + *   it('should be the same instance', inject(
    + *     function($filterProvider) {
    + *       $filterProvider.register('reverse', function(){
    + *         return ...;
    + *       });
    + *     },
    + *     function($filter, reverseFilter) {
    + *       expect($filter('reverse')).toBe(reverseFilter);
    + *     });
    + * 
    + * + * + * For more information about how angular filters work, and how to create your own filters, see + * {@link guide/dev_guide.templates.filters Understanding Angular Filters} in the angular Developer + * Guide. + */ +/** + * @ngdoc method + * @name ng.$filterProvider#register + * @methodOf ng.$filterProvider + * @description + * Register filter factory function. + * + * @param {String} name Name of the filter. + * @param {function} fn The filter factory function which is injectable. + */ + + +/** + * @ngdoc function + * @name ng.$filter + * @function + * @description + * Filters are used for formatting data displayed to the user. + * + * The general syntax in templates is as follows: + * + * {{ expression [| filter_name[:parameter_value] ... ] }} + * + * @param {String} name Name of the filter function to retrieve + * @return {Function} the filter function + */ +$FilterProvider.$inject = ['$provide']; +function $FilterProvider($provide) { + var suffix = 'Filter'; + + function register(name, factory) { + return $provide.factory(name + suffix, factory); + } + this.register = register; + + this.$get = ['$injector', function($injector) { + return function(name) { + return $injector.get(name + suffix); + } + }]; + + //////////////////////////////////////// + + register('currency', currencyFilter); + register('date', dateFilter); + register('filter', filterFilter); + register('json', jsonFilter); + register('limitTo', limitToFilter); + register('lowercase', lowercaseFilter); + register('number', numberFilter); + register('orderBy', orderByFilter); + register('uppercase', uppercaseFilter); +} + +/** + * @ngdoc filter + * @name ng.filter:filter + * @function + * + * @description + * Selects a subset of items from `array` and returns it as a new array. + * + * Note: This function is used to augment the `Array` type in Angular expressions. See + * {@link ng.$filter} for more information about Angular arrays. + * + * @param {Array} array The source array. + * @param {string|Object|function()} expression The predicate to be used for selecting items from + * `array`. + * + * Can be one of: + * + * - `string`: Predicate that results in a substring match using the value of `expression` + * string. All strings or objects with string properties in `array` that contain this string + * will be returned. The predicate can be negated by prefixing the string with `!`. + * + * - `Object`: A pattern object can be used to filter specific properties on objects contained + * by `array`. For example `{name:"M", phone:"1"}` predicate will return an array of items + * which have property `name` containing "M" and property `phone` containing "1". A special + * property name `$` can be used (as in `{$:"text"}`) to accept a match against any + * property of the object. That's equivalent to the simple substring match with a `string` + * as described above. + * + * - `function`: A predicate function can be used to write arbitrary filters. The function is + * called for each element of `array`. The final result is an array of those elements that + * the predicate returned true for. + * + * @param {function(expected, actual)|true|undefined} comparator Comparator which is used in + * determining if the expected value (from the filter expression) and actual value (from + * the object in the array) should be considered a match. + * + * Can be one of: + * + * - `function(expected, actual)`: + * The function will be given the object value and the predicate value to compare and + * should return true if the item should be included in filtered result. + * + * - `true`: A shorthand for `function(expected, actual) { return angular.equals(expected, actual)}`. + * this is essentially strict comparison of expected and actual. + * + * - `false|undefined`: A short hand for a function which will look for a substring match in case + * insensitive way. + * + * @example + + +
    + + Search: +
    + + + + + +
    NamePhone
    {{friend.name}}{{friend.phone}}
    +
    + Any:
    + Name only
    + Phone only
    + Equality
    + + + + + + +
    NamePhone
    {{friend.name}}{{friend.phone}}
    + + + it('should search across all fields when filtering with a string', function() { + input('searchText').enter('m'); + expect(repeater('#searchTextResults tr', 'friend in friends').column('friend.name')). + toEqual(['Mary', 'Mike', 'Adam']); + + input('searchText').enter('76'); + expect(repeater('#searchTextResults tr', 'friend in friends').column('friend.name')). + toEqual(['John', 'Julie']); + }); + + it('should search in specific fields when filtering with a predicate object', function() { + input('search.$').enter('i'); + expect(repeater('#searchObjResults tr', 'friend in friends').column('friend.name')). + toEqual(['Mary', 'Mike', 'Julie', 'Juliette']); + }); + it('should use a equal comparison when comparator is true', function() { + input('search.name').enter('Julie'); + input('strict').check(); + expect(repeater('#searchObjResults tr', 'friend in friends').column('friend.name')). + toEqual(['Julie']); + }); + + + */ +function filterFilter() { + return function(array, expression, comperator) { + if (!isArray(array)) return array; + var predicates = []; + predicates.check = function(value) { + for (var j = 0; j < predicates.length; j++) { + if(!predicates[j](value)) { + return false; + } + } + return true; + }; + switch(typeof comperator) { + case "function": + break; + case "boolean": + if(comperator == true) { + comperator = function(obj, text) { + return angular.equals(obj, text); + } + break; + } + default: + comperator = function(obj, text) { + text = (''+text).toLowerCase(); + return (''+obj).toLowerCase().indexOf(text) > -1 + }; + } + var search = function(obj, text){ + if (typeof text == 'string' && text.charAt(0) === '!') { + return !search(obj, text.substr(1)); + } + switch (typeof obj) { + case "boolean": + case "number": + case "string": + return comperator(obj, text); + case "object": + switch (typeof text) { + case "object": + return comperator(obj, text); + break; + default: + for ( var objKey in obj) { + if (objKey.charAt(0) !== '$' && search(obj[objKey], text)) { + return true; + } + } + break; + } + return false; + case "array": + for ( var i = 0; i < obj.length; i++) { + if (search(obj[i], text)) { + return true; + } + } + return false; + default: + return false; + } + }; + switch (typeof expression) { + case "boolean": + case "number": + case "string": + expression = {$:expression}; + case "object": + for (var key in expression) { + if (key == '$') { + (function() { + if (!expression[key]) return; + var path = key + predicates.push(function(value) { + return search(value, expression[path]); + }); + })(); + } else { + (function() { + if (!expression[key]) return; + var path = key; + predicates.push(function(value) { + return search(getter(value,path), expression[path]); + }); + })(); + } + } + break; + case 'function': + predicates.push(expression); + break; + default: + return array; + } + var filtered = []; + for ( var j = 0; j < array.length; j++) { + var value = array[j]; + if (predicates.check(value)) { + filtered.push(value); + } + } + return filtered; + } +} + +/** + * @ngdoc filter + * @name ng.filter:currency + * @function + * + * @description + * Formats a number as a currency (ie $1,234.56). When no currency symbol is provided, default + * symbol for current locale is used. + * + * @param {number} amount Input to filter. + * @param {string=} symbol Currency symbol or identifier to be displayed. + * @returns {string} Formatted number. + * + * + * @example + + + +
    +
    + default currency symbol ($): {{amount | currency}}
    + custom currency identifier (USD$): {{amount | currency:"USD$"}} +
    +
    + + it('should init with 1234.56', function() { + expect(binding('amount | currency')).toBe('$1,234.56'); + expect(binding('amount | currency:"USD$"')).toBe('USD$1,234.56'); + }); + it('should update', function() { + input('amount').enter('-1234'); + expect(binding('amount | currency')).toBe('($1,234.00)'); + expect(binding('amount | currency:"USD$"')).toBe('(USD$1,234.00)'); + }); + +
    + */ +currencyFilter.$inject = ['$locale']; +function currencyFilter($locale) { + var formats = $locale.NUMBER_FORMATS; + return function(amount, currencySymbol){ + if (isUndefined(currencySymbol)) currencySymbol = formats.CURRENCY_SYM; + return formatNumber(amount, formats.PATTERNS[1], formats.GROUP_SEP, formats.DECIMAL_SEP, 2). + replace(/\u00A4/g, currencySymbol); + }; +} + +/** + * @ngdoc filter + * @name ng.filter:number + * @function + * + * @description + * Formats a number as text. + * + * If the input is not a number an empty string is returned. + * + * @param {number|string} number Number to format. + * @param {(number|string)=} [fractionSize=2] Number of decimal places to round the number to. + * @returns {string} Number rounded to decimalPlaces and places a “,” after each third digit. + * + * @example + + + +
    + Enter number:
    + Default formatting: {{val | number}}
    + No fractions: {{val | number:0}}
    + Negative number: {{-val | number:4}} +
    +
    + + it('should format numbers', function() { + expect(binding('val | number')).toBe('1,234.568'); + expect(binding('val | number:0')).toBe('1,235'); + expect(binding('-val | number:4')).toBe('-1,234.5679'); + }); + + it('should update', function() { + input('val').enter('3374.333'); + expect(binding('val | number')).toBe('3,374.333'); + expect(binding('val | number:0')).toBe('3,374'); + expect(binding('-val | number:4')).toBe('-3,374.3330'); + }); + +
    + */ + + +numberFilter.$inject = ['$locale']; +function numberFilter($locale) { + var formats = $locale.NUMBER_FORMATS; + return function(number, fractionSize) { + return formatNumber(number, formats.PATTERNS[0], formats.GROUP_SEP, formats.DECIMAL_SEP, + fractionSize); + }; +} + +var DECIMAL_SEP = '.'; +function formatNumber(number, pattern, groupSep, decimalSep, fractionSize) { + if (isNaN(number) || !isFinite(number)) return ''; + + var isNegative = number < 0; + number = Math.abs(number); + var numStr = number + '', + formatedText = '', + parts = []; + + var hasExponent = false; + if (numStr.indexOf('e') !== -1) { + var match = numStr.match(/([\d\.]+)e(-?)(\d+)/); + if (match && match[2] == '-' && match[3] > fractionSize + 1) { + numStr = '0'; + } else { + formatedText = numStr; + hasExponent = true; + } + } + + if (!hasExponent) { + var fractionLen = (numStr.split(DECIMAL_SEP)[1] || '').length; + + // determine fractionSize if it is not specified + if (isUndefined(fractionSize)) { + fractionSize = Math.min(Math.max(pattern.minFrac, fractionLen), pattern.maxFrac); + } + + var pow = Math.pow(10, fractionSize); + number = Math.round(number * pow) / pow; + var fraction = ('' + number).split(DECIMAL_SEP); + var whole = fraction[0]; + fraction = fraction[1] || ''; + + var pos = 0, + lgroup = pattern.lgSize, + group = pattern.gSize; + + if (whole.length >= (lgroup + group)) { + pos = whole.length - lgroup; + for (var i = 0; i < pos; i++) { + if ((pos - i)%group === 0 && i !== 0) { + formatedText += groupSep; + } + formatedText += whole.charAt(i); + } + } + + for (i = pos; i < whole.length; i++) { + if ((whole.length - i)%lgroup === 0 && i !== 0) { + formatedText += groupSep; + } + formatedText += whole.charAt(i); + } + + // format fraction part. + while(fraction.length < fractionSize) { + fraction += '0'; + } + + if (fractionSize && fractionSize !== "0") formatedText += decimalSep + fraction.substr(0, fractionSize); + } + + parts.push(isNegative ? pattern.negPre : pattern.posPre); + parts.push(formatedText); + parts.push(isNegative ? pattern.negSuf : pattern.posSuf); + return parts.join(''); +} + +function padNumber(num, digits, trim) { + var neg = ''; + if (num < 0) { + neg = '-'; + num = -num; + } + num = '' + num; + while(num.length < digits) num = '0' + num; + if (trim) + num = num.substr(num.length - digits); + return neg + num; +} + + +function dateGetter(name, size, offset, trim) { + offset = offset || 0; + return function(date) { + var value = date['get' + name](); + if (offset > 0 || value > -offset) + value += offset; + if (value === 0 && offset == -12 ) value = 12; + return padNumber(value, size, trim); + }; +} + +function dateStrGetter(name, shortForm) { + return function(date, formats) { + var value = date['get' + name](); + var get = uppercase(shortForm ? ('SHORT' + name) : name); + + return formats[get][value]; + }; +} + +function timeZoneGetter(date) { + var zone = -1 * date.getTimezoneOffset(); + var paddedZone = (zone >= 0) ? "+" : ""; + + paddedZone += padNumber(Math[zone > 0 ? 'floor' : 'ceil'](zone / 60), 2) + + padNumber(Math.abs(zone % 60), 2); + + return paddedZone; +} + +function ampmGetter(date, formats) { + return date.getHours() < 12 ? formats.AMPMS[0] : formats.AMPMS[1]; +} + +var DATE_FORMATS = { + yyyy: dateGetter('FullYear', 4), + yy: dateGetter('FullYear', 2, 0, true), + y: dateGetter('FullYear', 1), + MMMM: dateStrGetter('Month'), + MMM: dateStrGetter('Month', true), + MM: dateGetter('Month', 2, 1), + M: dateGetter('Month', 1, 1), + dd: dateGetter('Date', 2), + d: dateGetter('Date', 1), + HH: dateGetter('Hours', 2), + H: dateGetter('Hours', 1), + hh: dateGetter('Hours', 2, -12), + h: dateGetter('Hours', 1, -12), + mm: dateGetter('Minutes', 2), + m: dateGetter('Minutes', 1), + ss: dateGetter('Seconds', 2), + s: dateGetter('Seconds', 1), + // while ISO 8601 requires fractions to be prefixed with `.` or `,` + // we can be just safely rely on using `sss` since we currently don't support single or two digit fractions + sss: dateGetter('Milliseconds', 3), + EEEE: dateStrGetter('Day'), + EEE: dateStrGetter('Day', true), + a: ampmGetter, + Z: timeZoneGetter +}; + +var DATE_FORMATS_SPLIT = /((?:[^yMdHhmsaZE']+)|(?:'(?:[^']|'')*')|(?:E+|y+|M+|d+|H+|h+|m+|s+|a|Z))(.*)/, + NUMBER_STRING = /^\d+$/; + +/** + * @ngdoc filter + * @name ng.filter:date + * @function + * + * @description + * Formats `date` to a string based on the requested `format`. + * + * `format` string can be composed of the following elements: + * + * * `'yyyy'`: 4 digit representation of year (e.g. AD 1 => 0001, AD 2010 => 2010) + * * `'yy'`: 2 digit representation of year, padded (00-99). (e.g. AD 2001 => 01, AD 2010 => 10) + * * `'y'`: 1 digit representation of year, e.g. (AD 1 => 1, AD 199 => 199) + * * `'MMMM'`: Month in year (January-December) + * * `'MMM'`: Month in year (Jan-Dec) + * * `'MM'`: Month in year, padded (01-12) + * * `'M'`: Month in year (1-12) + * * `'dd'`: Day in month, padded (01-31) + * * `'d'`: Day in month (1-31) + * * `'EEEE'`: Day in Week,(Sunday-Saturday) + * * `'EEE'`: Day in Week, (Sun-Sat) + * * `'HH'`: Hour in day, padded (00-23) + * * `'H'`: Hour in day (0-23) + * * `'hh'`: Hour in am/pm, padded (01-12) + * * `'h'`: Hour in am/pm, (1-12) + * * `'mm'`: Minute in hour, padded (00-59) + * * `'m'`: Minute in hour (0-59) + * * `'ss'`: Second in minute, padded (00-59) + * * `'s'`: Second in minute (0-59) + * * `'.sss' or ',sss'`: Millisecond in second, padded (000-999) + * * `'a'`: am/pm marker + * * `'Z'`: 4 digit (+sign) representation of the timezone offset (-1200-+1200) + * + * `format` string can also be one of the following predefined + * {@link guide/i18n localizable formats}: + * + * * `'medium'`: equivalent to `'MMM d, y h:mm:ss a'` for en_US locale + * (e.g. Sep 3, 2010 12:05:08 pm) + * * `'short'`: equivalent to `'M/d/yy h:mm a'` for en_US locale (e.g. 9/3/10 12:05 pm) + * * `'fullDate'`: equivalent to `'EEEE, MMMM d,y'` for en_US locale + * (e.g. Friday, September 3, 2010) + * * `'longDate'`: equivalent to `'MMMM d, y'` for en_US locale (e.g. September 3, 2010 + * * `'mediumDate'`: equivalent to `'MMM d, y'` for en_US locale (e.g. Sep 3, 2010) + * * `'shortDate'`: equivalent to `'M/d/yy'` for en_US locale (e.g. 9/3/10) + * * `'mediumTime'`: equivalent to `'h:mm:ss a'` for en_US locale (e.g. 12:05:08 pm) + * * `'shortTime'`: equivalent to `'h:mm a'` for en_US locale (e.g. 12:05 pm) + * + * `format` string can contain literal values. These need to be quoted with single quotes (e.g. + * `"h 'in the morning'"`). In order to output single quote, use two single quotes in a sequence + * (e.g. `"h o''clock"`). + * + * @param {(Date|number|string)} date Date to format either as Date object, milliseconds (string or + * number) or various ISO 8601 datetime string formats (e.g. yyyy-MM-ddTHH:mm:ss.SSSZ and its + * shorter versions like yyyy-MM-ddTHH:mmZ, yyyy-MM-dd or yyyyMMddTHHmmssZ). If no timezone is + * specified in the string input, the time is considered to be in the local timezone. + * @param {string=} format Formatting rules (see Description). If not specified, + * `mediumDate` is used. + * @returns {string} Formatted string or the input if input is not recognized as date/millis. + * + * @example + + + {{1288323623006 | date:'medium'}}: + {{1288323623006 | date:'medium'}}
    + {{1288323623006 | date:'yyyy-MM-dd HH:mm:ss Z'}}: + {{1288323623006 | date:'yyyy-MM-dd HH:mm:ss Z'}}
    + {{1288323623006 | date:'MM/dd/yyyy @ h:mma'}}: + {{'1288323623006' | date:'MM/dd/yyyy @ h:mma'}}
    +
    + + it('should format date', function() { + expect(binding("1288323623006 | date:'medium'")). + toMatch(/Oct 2\d, 2010 \d{1,2}:\d{2}:\d{2} (AM|PM)/); + expect(binding("1288323623006 | date:'yyyy-MM-dd HH:mm:ss Z'")). + toMatch(/2010\-10\-2\d \d{2}:\d{2}:\d{2} (\-|\+)?\d{4}/); + expect(binding("'1288323623006' | date:'MM/dd/yyyy @ h:mma'")). + toMatch(/10\/2\d\/2010 @ \d{1,2}:\d{2}(AM|PM)/); + }); + +
    + */ +dateFilter.$inject = ['$locale']; +function dateFilter($locale) { + + + var R_ISO8601_STR = /^(\d{4})-?(\d\d)-?(\d\d)(?:T(\d\d)(?::?(\d\d)(?::?(\d\d)(?:\.(\d+))?)?)?(Z|([+-])(\d\d):?(\d\d))?)?$/; + // 1 2 3 4 5 6 7 8 9 10 11 + function jsonStringToDate(string) { + var match; + if (match = string.match(R_ISO8601_STR)) { + var date = new Date(0), + tzHour = 0, + tzMin = 0, + dateSetter = match[8] ? date.setUTCFullYear : date.setFullYear, + timeSetter = match[8] ? date.setUTCHours : date.setHours; + + if (match[9]) { + tzHour = int(match[9] + match[10]); + tzMin = int(match[9] + match[11]); + } + dateSetter.call(date, int(match[1]), int(match[2]) - 1, int(match[3])); + var h = int(match[4]||0) - tzHour; + var m = int(match[5]||0) - tzMin + var s = int(match[6]||0); + var ms = Math.round(parseFloat('0.' + (match[7]||0)) * 1000); + timeSetter.call(date, h, m, s, ms); + return date; + } + return string; + } + + + return function(date, format) { + var text = '', + parts = [], + fn, match; + + format = format || 'mediumDate'; + format = $locale.DATETIME_FORMATS[format] || format; + if (isString(date)) { + if (NUMBER_STRING.test(date)) { + date = int(date); + } else { + date = jsonStringToDate(date); + } + } + + if (isNumber(date)) { + date = new Date(date); + } + + if (!isDate(date)) { + return date; + } + + while(format) { + match = DATE_FORMATS_SPLIT.exec(format); + if (match) { + parts = concat(parts, match, 1); + format = parts.pop(); + } else { + parts.push(format); + format = null; + } + } + + forEach(parts, function(value){ + fn = DATE_FORMATS[value]; + text += fn ? fn(date, $locale.DATETIME_FORMATS) + : value.replace(/(^'|'$)/g, '').replace(/''/g, "'"); + }); + + return text; + }; +} + + +/** + * @ngdoc filter + * @name ng.filter:json + * @function + * + * @description + * Allows you to convert a JavaScript object into JSON string. + * + * This filter is mostly useful for debugging. When using the double curly {{value}} notation + * the binding is automatically converted to JSON. + * + * @param {*} object Any JavaScript object (including arrays and primitive types) to filter. + * @returns {string} JSON string. + * + * + * @example: + + +
    {{ {'name':'value'} | json }}
    +
    + + it('should jsonify filtered objects', function() { + expect(binding("{'name':'value'}")).toMatch(/\{\n "name": ?"value"\n}/); + }); + +
    + * + */ +function jsonFilter() { + return function(object) { + return toJson(object, true); + }; +} + + +/** + * @ngdoc filter + * @name ng.filter:lowercase + * @function + * @description + * Converts string to lowercase. + * @see angular.lowercase + */ +var lowercaseFilter = valueFn(lowercase); + + +/** + * @ngdoc filter + * @name ng.filter:uppercase + * @function + * @description + * Converts string to uppercase. + * @see angular.uppercase + */ +var uppercaseFilter = valueFn(uppercase); + +/** + * @ngdoc function + * @name ng.filter:limitTo + * @function + * + * @description + * Creates a new array or string containing only a specified number of elements. The elements + * are taken from either the beginning or the end of the source array or string, as specified by + * the value and sign (positive or negative) of `limit`. + * + * Note: This function is used to augment the `Array` type in Angular expressions. See + * {@link ng.$filter} for more information about Angular arrays. + * + * @param {Array|string} input Source array or string to be limited. + * @param {string|number} limit The length of the returned array or string. If the `limit` number + * is positive, `limit` number of items from the beginning of the source array/string are copied. + * If the number is negative, `limit` number of items from the end of the source array/string + * are copied. The `limit` will be trimmed if it exceeds `array.length` + * @returns {Array|string} A new sub-array or substring of length `limit` or less if input array + * had less than `limit` elements. + * + * @example + + + +
    + Limit {{numbers}} to: +

    Output numbers: {{ numbers | limitTo:numLimit }}

    + Limit {{letters}} to: +

    Output letters: {{ letters | limitTo:letterLimit }}

    +
    +
    + + it('should limit the number array to first three items', function() { + expect(element('.doc-example-live input[ng-model=numLimit]').val()).toBe('3'); + expect(element('.doc-example-live input[ng-model=letterLimit]').val()).toBe('3'); + expect(binding('numbers | limitTo:numLimit')).toEqual('[1,2,3]'); + expect(binding('letters | limitTo:letterLimit')).toEqual('abc'); + }); + + it('should update the output when -3 is entered', function() { + input('numLimit').enter(-3); + input('letterLimit').enter(-3); + expect(binding('numbers | limitTo:numLimit')).toEqual('[7,8,9]'); + expect(binding('letters | limitTo:letterLimit')).toEqual('ghi'); + }); + + it('should not exceed the maximum size of input array', function() { + input('numLimit').enter(100); + input('letterLimit').enter(100); + expect(binding('numbers | limitTo:numLimit')).toEqual('[1,2,3,4,5,6,7,8,9]'); + expect(binding('letters | limitTo:letterLimit')).toEqual('abcdefghi'); + }); + +
    + */ +function limitToFilter(){ + return function(input, limit) { + if (!isArray(input) && !isString(input)) return input; + + limit = int(limit); + + if (isString(input)) { + //NaN check on limit + if (limit) { + return limit >= 0 ? input.slice(0, limit) : input.slice(limit, input.length); + } else { + return ""; + } + } + + var out = [], + i, n; + + // if abs(limit) exceeds maximum length, trim it + if (limit > input.length) + limit = input.length; + else if (limit < -input.length) + limit = -input.length; + + if (limit > 0) { + i = 0; + n = limit; + } else { + i = input.length + limit; + n = input.length; + } + + for (; i} expression A predicate to be + * used by the comparator to determine the order of elements. + * + * Can be one of: + * + * - `function`: Getter function. The result of this function will be sorted using the + * `<`, `=`, `>` operator. + * - `string`: An Angular expression which evaluates to an object to order by, such as 'name' + * to sort by a property called 'name'. Optionally prefixed with `+` or `-` to control + * ascending or descending sort order (for example, +name or -name). + * - `Array`: An array of function or string predicates. The first predicate in the array + * is used for sorting, but when two items are equivalent, the next predicate is used. + * + * @param {boolean=} reverse Reverse the order the array. + * @returns {Array} Sorted copy of the source array. + * + * @example + + + +
    +
    Sorting predicate = {{predicate}}; reverse = {{reverse}}
    +
    + [ unsorted ] + + + + + + + + + + + +
    Name + (^)Phone NumberAge
    {{friend.name}}{{friend.phone}}{{friend.age}}
    +
    +
    + + it('should be reverse ordered by aged', function() { + expect(binding('predicate')).toBe('-age'); + expect(repeater('table.friend', 'friend in friends').column('friend.age')). + toEqual(['35', '29', '21', '19', '10']); + expect(repeater('table.friend', 'friend in friends').column('friend.name')). + toEqual(['Adam', 'Julie', 'Mike', 'Mary', 'John']); + }); + + it('should reorder the table when user selects different predicate', function() { + element('.doc-example-live a:contains("Name")').click(); + expect(repeater('table.friend', 'friend in friends').column('friend.name')). + toEqual(['Adam', 'John', 'Julie', 'Mary', 'Mike']); + expect(repeater('table.friend', 'friend in friends').column('friend.age')). + toEqual(['35', '10', '29', '19', '21']); + + element('.doc-example-live a:contains("Phone")').click(); + expect(repeater('table.friend', 'friend in friends').column('friend.phone')). + toEqual(['555-9876', '555-8765', '555-5678', '555-4321', '555-1212']); + expect(repeater('table.friend', 'friend in friends').column('friend.name')). + toEqual(['Mary', 'Julie', 'Adam', 'Mike', 'John']); + }); + +
    + */ +orderByFilter.$inject = ['$parse']; +function orderByFilter($parse){ + return function(array, sortPredicate, reverseOrder) { + if (!isArray(array)) return array; + if (!sortPredicate) return array; + sortPredicate = isArray(sortPredicate) ? sortPredicate: [sortPredicate]; + sortPredicate = map(sortPredicate, function(predicate){ + var descending = false, get = predicate || identity; + if (isString(predicate)) { + if ((predicate.charAt(0) == '+' || predicate.charAt(0) == '-')) { + descending = predicate.charAt(0) == '-'; + predicate = predicate.substring(1); + } + get = $parse(predicate); + } + return reverseComparator(function(a,b){ + return compare(get(a),get(b)); + }, descending); + }); + var arrayCopy = []; + for ( var i = 0; i < array.length; i++) { arrayCopy.push(array[i]); } + return arrayCopy.sort(reverseComparator(comparator, reverseOrder)); + + function comparator(o1, o2){ + for ( var i = 0; i < sortPredicate.length; i++) { + var comp = sortPredicate[i](o1, o2); + if (comp !== 0) return comp; + } + return 0; + } + function reverseComparator(comp, descending) { + return toBoolean(descending) + ? function(a,b){return comp(b,a);} + : comp; + } + function compare(v1, v2){ + var t1 = typeof v1; + var t2 = typeof v2; + if (t1 == t2) { + if (t1 == "string") v1 = v1.toLowerCase(); + if (t1 == "string") v2 = v2.toLowerCase(); + if (v1 === v2) return 0; + return v1 < v2 ? -1 : 1; + } else { + return t1 < t2 ? -1 : 1; + } + } + } +} + +function ngDirective(directive) { + if (isFunction(directive)) { + directive = { + link: directive + } + } + directive.restrict = directive.restrict || 'AC'; + return valueFn(directive); +} + +/** + * @ngdoc directive + * @name ng.directive:a + * @restrict E + * + * @description + * Modifies the default behavior of html A tag, so that the default action is prevented when href + * attribute is empty. + * + * The reasoning for this change is to allow easy creation of action links with `ngClick` directive + * without changing the location or causing page reloads, e.g.: + * `Save` + */ +var htmlAnchorDirective = valueFn({ + restrict: 'E', + compile: function(element, attr) { + + if (msie <= 8) { + + // turn link into a stylable link in IE + // but only if it doesn't have name attribute, in which case it's an anchor + if (!attr.href && !attr.name) { + attr.$set('href', ''); + } + + // add a comment node to anchors to workaround IE bug that causes element content to be reset + // to new attribute content if attribute is updated with value containing @ and element also + // contains value with @ + // see issue #1949 + element.append(document.createComment('IE fix')); + } + + return function(scope, element) { + element.bind('click', function(event){ + // if we have no href url, then don't navigate anywhere. + if (!element.attr('href')) { + event.preventDefault(); + } + }); + } + } +}); + +/** + * @ngdoc directive + * @name ng.directive:ngHref + * @restrict A + * + * @description + * Using Angular markup like {{hash}} in an href attribute makes + * the page open to a wrong URL, if the user clicks that link before + * angular has a chance to replace the {{hash}} with actual URL, the + * link will be broken and will most likely return a 404 error. + * The `ngHref` directive solves this problem. + * + * The buggy way to write it: + *
    + * 
    + * 
    + * + * The correct way to write it: + *
    + * 
    + * 
    + * + * @element A + * @param {template} ngHref any string which can contain `{{}}` markup. + * + * @example + * This example uses `link` variable inside `href` attribute: + + +
    +
    link 1 (link, don't reload)
    + link 2 (link, don't reload)
    + link 3 (link, reload!)
    + anchor (link, don't reload)
    + anchor (no link)
    + link (link, change location) + + + it('should execute ng-click but not reload when href without value', function() { + element('#link-1').click(); + expect(input('value').val()).toEqual('1'); + expect(element('#link-1').attr('href')).toBe(""); + }); + + it('should execute ng-click but not reload when href empty string', function() { + element('#link-2').click(); + expect(input('value').val()).toEqual('2'); + expect(element('#link-2').attr('href')).toBe(""); + }); + + it('should execute ng-click and change url when ng-href specified', function() { + expect(element('#link-3').attr('href')).toBe("/123"); + + element('#link-3').click(); + expect(browser().window().path()).toEqual('/123'); + }); + + it('should execute ng-click but not reload when href empty string and name specified', function() { + element('#link-4').click(); + expect(input('value').val()).toEqual('4'); + expect(element('#link-4').attr('href')).toBe(''); + }); + + it('should execute ng-click but not reload when no href but name specified', function() { + element('#link-5').click(); + expect(input('value').val()).toEqual('5'); + expect(element('#link-5').attr('href')).toBe(undefined); + }); + + it('should only change url when only ng-href', function() { + input('value').enter('6'); + expect(element('#link-6').attr('href')).toBe('6'); + + element('#link-6').click(); + expect(browser().location().url()).toEqual('/6'); + }); + + + */ + +/** + * @ngdoc directive + * @name ng.directive:ngSrc + * @restrict A + * + * @description + * Using Angular markup like `{{hash}}` in a `src` attribute doesn't + * work right: The browser will fetch from the URL with the literal + * text `{{hash}}` until Angular replaces the expression inside + * `{{hash}}`. The `ngSrc` directive solves this problem. + * + * The buggy way to write it: + *
    + * 
    + * 
    + * + * The correct way to write it: + *
    + * 
    + * 
    + * + * @element IMG + * @param {template} ngSrc any string which can contain `{{}}` markup. + */ + +/** + * @ngdoc directive + * @name ng.directive:ngSrcset + * @restrict A + * + * @description + * Using Angular markup like `{{hash}}` in a `srcset` attribute doesn't + * work right: The browser will fetch from the URL with the literal + * text `{{hash}}` until Angular replaces the expression inside + * `{{hash}}`. The `ngSrcset` directive solves this problem. + * + * The buggy way to write it: + *
    + * 
    + * 
    + * + * The correct way to write it: + *
    + * 
    + * 
    + * + * @element IMG + * @param {template} ngSrcset any string which can contain `{{}}` markup. + */ + +/** + * @ngdoc directive + * @name ng.directive:ngDisabled + * @restrict A + * + * @description + * + * The following markup will make the button enabled on Chrome/Firefox but not on IE8 and older IEs: + *
    + * 
    + * + *
    + *
    + * + * The HTML specs do not require browsers to preserve the special attributes such as disabled. + * (The presence of them means true and absence means false) + * This prevents the angular compiler from correctly retrieving the binding expression. + * To solve this problem, we introduce the `ngDisabled` directive. + * + * @example + + + Click me to toggle:
    + +
    + + it('should toggle button', function() { + expect(element('.doc-example-live :button').prop('disabled')).toBeFalsy(); + input('checked').check(); + expect(element('.doc-example-live :button').prop('disabled')).toBeTruthy(); + }); + +
    + * + * @element INPUT + * @param {expression} ngDisabled Angular expression that will be evaluated. + */ + + +/** + * @ngdoc directive + * @name ng.directive:ngChecked + * @restrict A + * + * @description + * The HTML specs do not require browsers to preserve the special attributes such as checked. + * (The presence of them means true and absence means false) + * This prevents the angular compiler from correctly retrieving the binding expression. + * To solve this problem, we introduce the `ngChecked` directive. + * @example + + + Check me to check both:
    + +
    + + it('should check both checkBoxes', function() { + expect(element('.doc-example-live #checkSlave').prop('checked')).toBeFalsy(); + input('master').check(); + expect(element('.doc-example-live #checkSlave').prop('checked')).toBeTruthy(); + }); + +
    + * + * @element INPUT + * @param {expression} ngChecked Angular expression that will be evaluated. + */ + + +/** + * @ngdoc directive + * @name ng.directive:ngMultiple + * @restrict A + * + * @description + * The HTML specs do not require browsers to preserve the special attributes such as multiple. + * (The presence of them means true and absence means false) + * This prevents the angular compiler from correctly retrieving the binding expression. + * To solve this problem, we introduce the `ngMultiple` directive. + * + * @example + + + Check me check multiple:
    + +
    + + it('should toggle multiple', function() { + expect(element('.doc-example-live #select').prop('multiple')).toBeFalsy(); + input('checked').check(); + expect(element('.doc-example-live #select').prop('multiple')).toBeTruthy(); + }); + +
    + * + * @element SELECT + * @param {expression} ngMultiple Angular expression that will be evaluated. + */ + + +/** + * @ngdoc directive + * @name ng.directive:ngReadonly + * @restrict A + * + * @description + * The HTML specs do not require browsers to preserve the special attributes such as readonly. + * (The presence of them means true and absence means false) + * This prevents the angular compiler from correctly retrieving the binding expression. + * To solve this problem, we introduce the `ngReadonly` directive. + * @example + + + Check me to make text readonly:
    + +
    + + it('should toggle readonly attr', function() { + expect(element('.doc-example-live :text').prop('readonly')).toBeFalsy(); + input('checked').check(); + expect(element('.doc-example-live :text').prop('readonly')).toBeTruthy(); + }); + +
    + * + * @element INPUT + * @param {string} expression Angular expression that will be evaluated. + */ + + +/** + * @ngdoc directive + * @name ng.directive:ngSelected + * @restrict A + * + * @description + * The HTML specs do not require browsers to preserve the special attributes such as selected. + * (The presence of them means true and absence means false) + * This prevents the angular compiler from correctly retrieving the binding expression. + * To solve this problem, we introduced the `ngSelected` directive. + * @example + + + Check me to select:
    + +
    + + it('should select Greetings!', function() { + expect(element('.doc-example-live #greet').prop('selected')).toBeFalsy(); + input('selected').check(); + expect(element('.doc-example-live #greet').prop('selected')).toBeTruthy(); + }); + +
    + * + * @element OPTION + * @param {string} expression Angular expression that will be evaluated. + */ + +/** + * @ngdoc directive + * @name ng.directive:ngOpen + * @restrict A + * + * @description + * The HTML specs do not require browsers to preserve the special attributes such as open. + * (The presence of them means true and absence means false) + * This prevents the angular compiler from correctly retrieving the binding expression. + * To solve this problem, we introduce the `ngOpen` directive. + * + * @example + + + Check me check multiple:
    +
    + Show/Hide me +
    +
    + + it('should toggle open', function() { + expect(element('#details').prop('open')).toBeFalsy(); + input('open').check(); + expect(element('#details').prop('open')).toBeTruthy(); + }); + +
    + * + * @element DETAILS + * @param {string} expression Angular expression that will be evaluated. + */ + +var ngAttributeAliasDirectives = {}; + + +// boolean attrs are evaluated +forEach(BOOLEAN_ATTR, function(propName, attrName) { + var normalized = directiveNormalize('ng-' + attrName); + ngAttributeAliasDirectives[normalized] = function() { + return { + priority: 100, + compile: function() { + return function(scope, element, attr) { + scope.$watch(attr[normalized], function ngBooleanAttrWatchAction(value) { + attr.$set(attrName, !!value); + }); + }; + } + }; + }; +}); + + +// ng-src, ng-srcset, ng-href are interpolated +forEach(['src', 'srcset', 'href'], function(attrName) { + var normalized = directiveNormalize('ng-' + attrName); + ngAttributeAliasDirectives[normalized] = function() { + return { + priority: 99, // it needs to run after the attributes are interpolated + link: function(scope, element, attr) { + attr.$observe(normalized, function(value) { + if (!value) + return; + + attr.$set(attrName, value); + + // on IE, if "ng:src" directive declaration is used and "src" attribute doesn't exist + // then calling element.setAttribute('src', 'foo') doesn't do anything, so we need + // to set the property as well to achieve the desired effect. + // we use attr[attrName] value since $set can sanitize the url. + if (msie) element.prop(attrName, attr[attrName]); + }); + } + }; + }; +}); + +var nullFormCtrl = { + $addControl: noop, + $removeControl: noop, + $setValidity: noop, + $setDirty: noop, + $setPristine: noop +}; + +/** + * @ngdoc object + * @name ng.directive:form.FormController + * + * @property {boolean} $pristine True if user has not interacted with the form yet. + * @property {boolean} $dirty True if user has already interacted with the form. + * @property {boolean} $valid True if all of the containing forms and controls are valid. + * @property {boolean} $invalid True if at least one containing control or form is invalid. + * + * @property {Object} $error Is an object hash, containing references to all invalid controls or + * forms, where: + * + * - keys are validation tokens (error names) — such as `required`, `url` or `email`), + * - values are arrays of controls or forms that are invalid with given error. + * + * @description + * `FormController` keeps track of all its controls and nested forms as well as state of them, + * such as being valid/invalid or dirty/pristine. + * + * Each {@link ng.directive:form form} directive creates an instance + * of `FormController`. + * + */ +//asks for $scope to fool the BC controller module +FormController.$inject = ['$element', '$attrs', '$scope']; +function FormController(element, attrs) { + var form = this, + parentForm = element.parent().controller('form') || nullFormCtrl, + invalidCount = 0, // used to easily determine if we are valid + errors = form.$error = {}, + controls = []; + + // init state + form.$name = attrs.name; + form.$dirty = false; + form.$pristine = true; + form.$valid = true; + form.$invalid = false; + + parentForm.$addControl(form); + + // Setup initial state of the control + element.addClass(PRISTINE_CLASS); + toggleValidCss(true); + + // convenience method for easy toggling of classes + function toggleValidCss(isValid, validationErrorKey) { + validationErrorKey = validationErrorKey ? '-' + snake_case(validationErrorKey, '-') : ''; + element. + removeClass((isValid ? INVALID_CLASS : VALID_CLASS) + validationErrorKey). + addClass((isValid ? VALID_CLASS : INVALID_CLASS) + validationErrorKey); + } + + form.$addControl = function(control) { + controls.push(control); + + if (control.$name && !form.hasOwnProperty(control.$name)) { + form[control.$name] = control; + } + }; + + form.$removeControl = function(control) { + if (control.$name && form[control.$name] === control) { + delete form[control.$name]; + } + forEach(errors, function(queue, validationToken) { + form.$setValidity(validationToken, true, control); + }); + + arrayRemove(controls, control); + }; + + form.$setValidity = function(validationToken, isValid, control) { + var queue = errors[validationToken]; + + if (isValid) { + if (queue) { + arrayRemove(queue, control); + if (!queue.length) { + invalidCount--; + if (!invalidCount) { + toggleValidCss(isValid); + form.$valid = true; + form.$invalid = false; + } + errors[validationToken] = false; + toggleValidCss(true, validationToken); + parentForm.$setValidity(validationToken, true, form); + } + } + + } else { + if (!invalidCount) { + toggleValidCss(isValid); + } + if (queue) { + if (includes(queue, control)) return; + } else { + errors[validationToken] = queue = []; + invalidCount++; + toggleValidCss(false, validationToken); + parentForm.$setValidity(validationToken, false, form); + } + queue.push(control); + + form.$valid = false; + form.$invalid = true; + } + }; + + form.$setDirty = function() { + element.removeClass(PRISTINE_CLASS).addClass(DIRTY_CLASS); + form.$dirty = true; + form.$pristine = false; + parentForm.$setDirty(); + }; + + /** + * @ngdoc function + * @name ng.directive:form.FormController#$setPristine + * @methodOf ng.directive:form.FormController + * + * @description + * Sets the form to its pristine state. + * + * This method can be called to remove the 'ng-dirty' class and set the form to its pristine + * state (ng-pristine class). This method will also propagate to all the controls contained + * in this form. + * + * Setting a form back to a pristine state is often useful when we want to 'reuse' a form after + * saving or resetting it. + */ + form.$setPristine = function () { + element.removeClass(DIRTY_CLASS).addClass(PRISTINE_CLASS); + form.$dirty = false; + form.$pristine = true; + forEach(controls, function(control) { + control.$setPristine(); + }); + }; +} + + +/** + * @ngdoc directive + * @name ng.directive:ngForm + * @restrict EAC + * + * @description + * Nestable alias of {@link ng.directive:form `form`} directive. HTML + * does not allow nesting of form elements. It is useful to nest forms, for example if the validity of a + * sub-group of controls needs to be determined. + * + * @param {string=} name|ngForm Name of the form. If specified, the form controller will be published into + * related scope, under this name. + * + */ + + /** + * @ngdoc directive + * @name ng.directive:form + * @restrict E + * + * @description + * Directive that instantiates + * {@link ng.directive:form.FormController FormController}. + * + * If `name` attribute is specified, the form controller is published onto the current scope under + * this name. + * + * # Alias: {@link ng.directive:ngForm `ngForm`} + * + * In angular forms can be nested. This means that the outer form is valid when all of the child + * forms are valid as well. However browsers do not allow nesting of `
    ` elements, for this + * reason angular provides {@link ng.directive:ngForm `ngForm`} alias + * which behaves identical to `` but allows form nesting. + * + * + * # CSS classes + * - `ng-valid` Is set if the form is valid. + * - `ng-invalid` Is set if the form is invalid. + * - `ng-pristine` Is set if the form is pristine. + * - `ng-dirty` Is set if the form is dirty. + * + * + * # Submitting a form and preventing default action + * + * Since the role of forms in client-side Angular applications is different than in classical + * roundtrip apps, it is desirable for the browser not to translate the form submission into a full + * page reload that sends the data to the server. Instead some javascript logic should be triggered + * to handle the form submission in application specific way. + * + * For this reason, Angular prevents the default action (form submission to the server) unless the + * `` element has an `action` attribute specified. + * + * You can use one of the following two ways to specify what javascript method should be called when + * a form is submitted: + * + * - {@link ng.directive:ngSubmit ngSubmit} directive on the form element + * - {@link ng.directive:ngClick ngClick} directive on the first + * button or input field of type submit (input[type=submit]) + * + * To prevent double execution of the handler, use only one of ngSubmit or ngClick directives. This + * is because of the following form submission rules coming from the html spec: + * + * - If a form has only one input field then hitting enter in this field triggers form submit + * (`ngSubmit`) + * - if a form has has 2+ input fields and no buttons or input[type=submit] then hitting enter + * doesn't trigger submit + * - if a form has one or more input fields and one or more buttons or input[type=submit] then + * hitting enter in any of the input fields will trigger the click handler on the *first* button or + * input[type=submit] (`ngClick`) *and* a submit handler on the enclosing form (`ngSubmit`) + * + * @param {string=} name Name of the form. If specified, the form controller will be published into + * related scope, under this name. + * + * @example + + + + + userType: + Required!
    + userType = {{userType}}
    + myForm.input.$valid = {{myForm.input.$valid}}
    + myForm.input.$error = {{myForm.input.$error}}
    + myForm.$valid = {{myForm.$valid}}
    + myForm.$error.required = {{!!myForm.$error.required}}
    + +
    + + it('should initialize to model', function() { + expect(binding('userType')).toEqual('guest'); + expect(binding('myForm.input.$valid')).toEqual('true'); + }); + + it('should be invalid if empty', function() { + input('userType').enter(''); + expect(binding('userType')).toEqual(''); + expect(binding('myForm.input.$valid')).toEqual('false'); + }); + +
    + */ +var formDirectiveFactory = function(isNgForm) { + return ['$timeout', function($timeout) { + var formDirective = { + name: 'form', + restrict: 'E', + controller: FormController, + compile: function() { + return { + pre: function(scope, formElement, attr, controller) { + if (!attr.action) { + // we can't use jq events because if a form is destroyed during submission the default + // action is not prevented. see #1238 + // + // IE 9 is not affected because it doesn't fire a submit event and try to do a full + // page reload if the form was destroyed by submission of the form via a click handler + // on a button in the form. Looks like an IE9 specific bug. + var preventDefaultListener = function(event) { + event.preventDefault + ? event.preventDefault() + : event.returnValue = false; // IE + }; + + addEventListenerFn(formElement[0], 'submit', preventDefaultListener); + + // unregister the preventDefault listener so that we don't not leak memory but in a + // way that will achieve the prevention of the default action. + formElement.bind('$destroy', function() { + $timeout(function() { + removeEventListenerFn(formElement[0], 'submit', preventDefaultListener); + }, 0, false); + }); + } + + var parentFormCtrl = formElement.parent().controller('form'), + alias = attr.name || attr.ngForm; + + if (alias) { + scope[alias] = controller; + } + if (parentFormCtrl) { + formElement.bind('$destroy', function() { + parentFormCtrl.$removeControl(controller); + if (alias) { + scope[alias] = undefined; + } + extend(controller, nullFormCtrl); //stop propagating child destruction handlers upwards + }); + } + } + }; + } + }; + + return isNgForm ? extend(copy(formDirective), {restrict: 'EAC'}) : formDirective; + }]; +}; + +var formDirective = formDirectiveFactory(); +var ngFormDirective = formDirectiveFactory(true); + +var URL_REGEXP = /^(ftp|http|https):\/\/(\w+:{0,1}\w*@)?(\S+)(:[0-9]+)?(\/|\/([\w#!:.?+=&%@!\-\/]))?$/; +var EMAIL_REGEXP = /^[A-Za-z0-9._%+-]+@[A-Za-z0-9.-]+\.[A-Za-z]{2,4}$/; +var NUMBER_REGEXP = /^\s*(\-|\+)?(\d+|(\d*(\.\d*)))\s*$/; + +var inputType = { + + /** + * @ngdoc inputType + * @name ng.directive:input.text + * + * @description + * Standard HTML text input with angular data binding. + * + * @param {string} ngModel Assignable angular expression to data-bind to. + * @param {string=} name Property name of the form under which the control is published. + * @param {string=} required Adds `required` validation error key if the value is not entered. + * @param {string=} ngRequired Adds `required` attribute and `required` validation constraint to + * the element when the ngRequired expression evaluates to true. Use `ngRequired` instead of + * `required` when you want to data-bind to the `required` attribute. + * @param {number=} ngMinlength Sets `minlength` validation error key if the value is shorter than + * minlength. + * @param {number=} ngMaxlength Sets `maxlength` validation error key if the value is longer than + * maxlength. + * @param {string=} ngPattern Sets `pattern` validation error key if the value does not match the + * RegExp pattern expression. Expected value is `/regexp/` for inline patterns or `regexp` for + * patterns defined as scope expressions. + * @param {string=} ngChange Angular expression to be executed when input changes due to user + * interaction with the input element. + * @param {boolean=} [ngTrim=true] If set to false Angular will not automatically trimming the + * input. + * + * @example + + + +
    + Single word: + + Required! + + Single word only! + + text = {{text}}
    + myForm.input.$valid = {{myForm.input.$valid}}
    + myForm.input.$error = {{myForm.input.$error}}
    + myForm.$valid = {{myForm.$valid}}
    + myForm.$error.required = {{!!myForm.$error.required}}
    +
    +
    + + it('should initialize to model', function() { + expect(binding('text')).toEqual('guest'); + expect(binding('myForm.input.$valid')).toEqual('true'); + }); + + it('should be invalid if empty', function() { + input('text').enter(''); + expect(binding('text')).toEqual(''); + expect(binding('myForm.input.$valid')).toEqual('false'); + }); + + it('should be invalid if multi word', function() { + input('text').enter('hello world'); + expect(binding('myForm.input.$valid')).toEqual('false'); + }); + + it('should not be trimmed', function() { + input('text').enter('untrimmed '); + expect(binding('text')).toEqual('untrimmed '); + expect(binding('myForm.input.$valid')).toEqual('true'); + }); + +
    + */ + 'text': textInputType, + + + /** + * @ngdoc inputType + * @name ng.directive:input.number + * + * @description + * Text input with number validation and transformation. Sets the `number` validation + * error if not a valid number. + * + * @param {string} ngModel Assignable angular expression to data-bind to. + * @param {string=} name Property name of the form under which the control is published. + * @param {string=} min Sets the `min` validation error key if the value entered is less than `min`. + * @param {string=} max Sets the `max` validation error key if the value entered is greater than `max`. + * @param {string=} required Sets `required` validation error key if the value is not entered. + * @param {string=} ngRequired Adds `required` attribute and `required` validation constraint to + * the element when the ngRequired expression evaluates to true. Use `ngRequired` instead of + * `required` when you want to data-bind to the `required` attribute. + * @param {number=} ngMinlength Sets `minlength` validation error key if the value is shorter than + * minlength. + * @param {number=} ngMaxlength Sets `maxlength` validation error key if the value is longer than + * maxlength. + * @param {string=} ngPattern Sets `pattern` validation error key if the value does not match the + * RegExp pattern expression. Expected value is `/regexp/` for inline patterns or `regexp` for + * patterns defined as scope expressions. + * @param {string=} ngChange Angular expression to be executed when input changes due to user + * interaction with the input element. + * + * @example + + + +
    + Number: + + Required! + + Not valid number! + value = {{value}}
    + myForm.input.$valid = {{myForm.input.$valid}}
    + myForm.input.$error = {{myForm.input.$error}}
    + myForm.$valid = {{myForm.$valid}}
    + myForm.$error.required = {{!!myForm.$error.required}}
    +
    +
    + + it('should initialize to model', function() { + expect(binding('value')).toEqual('12'); + expect(binding('myForm.input.$valid')).toEqual('true'); + }); + + it('should be invalid if empty', function() { + input('value').enter(''); + expect(binding('value')).toEqual(''); + expect(binding('myForm.input.$valid')).toEqual('false'); + }); + + it('should be invalid if over max', function() { + input('value').enter('123'); + expect(binding('value')).toEqual(''); + expect(binding('myForm.input.$valid')).toEqual('false'); + }); + +
    + */ + 'number': numberInputType, + + + /** + * @ngdoc inputType + * @name ng.directive:input.url + * + * @description + * Text input with URL validation. Sets the `url` validation error key if the content is not a + * valid URL. + * + * @param {string} ngModel Assignable angular expression to data-bind to. + * @param {string=} name Property name of the form under which the control is published. + * @param {string=} required Sets `required` validation error key if the value is not entered. + * @param {string=} ngRequired Adds `required` attribute and `required` validation constraint to + * the element when the ngRequired expression evaluates to true. Use `ngRequired` instead of + * `required` when you want to data-bind to the `required` attribute. + * @param {number=} ngMinlength Sets `minlength` validation error key if the value is shorter than + * minlength. + * @param {number=} ngMaxlength Sets `maxlength` validation error key if the value is longer than + * maxlength. + * @param {string=} ngPattern Sets `pattern` validation error key if the value does not match the + * RegExp pattern expression. Expected value is `/regexp/` for inline patterns or `regexp` for + * patterns defined as scope expressions. + * @param {string=} ngChange Angular expression to be executed when input changes due to user + * interaction with the input element. + * + * @example + + + +
    + URL: + + Required! + + Not valid url! + text = {{text}}
    + myForm.input.$valid = {{myForm.input.$valid}}
    + myForm.input.$error = {{myForm.input.$error}}
    + myForm.$valid = {{myForm.$valid}}
    + myForm.$error.required = {{!!myForm.$error.required}}
    + myForm.$error.url = {{!!myForm.$error.url}}
    +
    +
    + + it('should initialize to model', function() { + expect(binding('text')).toEqual('http://google.com'); + expect(binding('myForm.input.$valid')).toEqual('true'); + }); + + it('should be invalid if empty', function() { + input('text').enter(''); + expect(binding('text')).toEqual(''); + expect(binding('myForm.input.$valid')).toEqual('false'); + }); + + it('should be invalid if not url', function() { + input('text').enter('xxx'); + expect(binding('myForm.input.$valid')).toEqual('false'); + }); + +
    + */ + 'url': urlInputType, + + + /** + * @ngdoc inputType + * @name ng.directive:input.email + * + * @description + * Text input with email validation. Sets the `email` validation error key if not a valid email + * address. + * + * @param {string} ngModel Assignable angular expression to data-bind to. + * @param {string=} name Property name of the form under which the control is published. + * @param {string=} required Sets `required` validation error key if the value is not entered. + * @param {string=} ngRequired Adds `required` attribute and `required` validation constraint to + * the element when the ngRequired expression evaluates to true. Use `ngRequired` instead of + * `required` when you want to data-bind to the `required` attribute. + * @param {number=} ngMinlength Sets `minlength` validation error key if the value is shorter than + * minlength. + * @param {number=} ngMaxlength Sets `maxlength` validation error key if the value is longer than + * maxlength. + * @param {string=} ngPattern Sets `pattern` validation error key if the value does not match the + * RegExp pattern expression. Expected value is `/regexp/` for inline patterns or `regexp` for + * patterns defined as scope expressions. + * + * @example + + + +
    + Email: + + Required! + + Not valid email! + text = {{text}}
    + myForm.input.$valid = {{myForm.input.$valid}}
    + myForm.input.$error = {{myForm.input.$error}}
    + myForm.$valid = {{myForm.$valid}}
    + myForm.$error.required = {{!!myForm.$error.required}}
    + myForm.$error.email = {{!!myForm.$error.email}}
    +
    +
    + + it('should initialize to model', function() { + expect(binding('text')).toEqual('me@example.com'); + expect(binding('myForm.input.$valid')).toEqual('true'); + }); + + it('should be invalid if empty', function() { + input('text').enter(''); + expect(binding('text')).toEqual(''); + expect(binding('myForm.input.$valid')).toEqual('false'); + }); + + it('should be invalid if not email', function() { + input('text').enter('xxx'); + expect(binding('myForm.input.$valid')).toEqual('false'); + }); + +
    + */ + 'email': emailInputType, + + + /** + * @ngdoc inputType + * @name ng.directive:input.radio + * + * @description + * HTML radio button. + * + * @param {string} ngModel Assignable angular expression to data-bind to. + * @param {string} value The value to which the expression should be set when selected. + * @param {string=} name Property name of the form under which the control is published. + * @param {string=} ngChange Angular expression to be executed when input changes due to user + * interaction with the input element. + * + * @example + + + +
    + Red
    + Green
    + Blue
    + color = {{color}}
    +
    +
    + + it('should change state', function() { + expect(binding('color')).toEqual('blue'); + + input('color').select('red'); + expect(binding('color')).toEqual('red'); + }); + +
    + */ + 'radio': radioInputType, + + + /** + * @ngdoc inputType + * @name ng.directive:input.checkbox + * + * @description + * HTML checkbox. + * + * @param {string} ngModel Assignable angular expression to data-bind to. + * @param {string=} name Property name of the form under which the control is published. + * @param {string=} ngTrueValue The value to which the expression should be set when selected. + * @param {string=} ngFalseValue The value to which the expression should be set when not selected. + * @param {string=} ngChange Angular expression to be executed when input changes due to user + * interaction with the input element. + * + * @example + + + +
    + Value1:
    + Value2:
    + value1 = {{value1}}
    + value2 = {{value2}}
    +
    +
    + + it('should change state', function() { + expect(binding('value1')).toEqual('true'); + expect(binding('value2')).toEqual('YES'); + + input('value1').check(); + input('value2').check(); + expect(binding('value1')).toEqual('false'); + expect(binding('value2')).toEqual('NO'); + }); + +
    + */ + 'checkbox': checkboxInputType, + + 'hidden': noop, + 'button': noop, + 'submit': noop, + 'reset': noop +}; + + +function isEmpty(value) { + return isUndefined(value) || value === '' || value === null || value !== value; +} + + +function textInputType(scope, element, attr, ctrl, $sniffer, $browser) { + + var listener = function() { + var value = element.val(); + + // By default we will trim the value + // If the attribute ng-trim exists we will avoid trimming + // e.g. + if (toBoolean(attr.ngTrim || 'T')) { + value = trim(value); + } + + if (ctrl.$viewValue !== value) { + scope.$apply(function() { + ctrl.$setViewValue(value); + }); + } + }; + + // if the browser does support "input" event, we are fine - except on IE9 which doesn't fire the + // input event on backspace, delete or cut + if ($sniffer.hasEvent('input')) { + element.bind('input', listener); + } else { + var timeout; + + var deferListener = function() { + if (!timeout) { + timeout = $browser.defer(function() { + listener(); + timeout = null; + }); + } + }; + + element.bind('keydown', function(event) { + var key = event.keyCode; + + // ignore + // command modifiers arrows + if (key === 91 || (15 < key && key < 19) || (37 <= key && key <= 40)) return; + + deferListener(); + }); + + // if user paste into input using mouse, we need "change" event to catch it + element.bind('change', listener); + + // if user modifies input value using context menu in IE, we need "paste" and "cut" events to catch it + if ($sniffer.hasEvent('paste')) { + element.bind('paste cut', deferListener); + } + } + + + ctrl.$render = function() { + element.val(isEmpty(ctrl.$viewValue) ? '' : ctrl.$viewValue); + }; + + // pattern validator + var pattern = attr.ngPattern, + patternValidator, + match; + + var validate = function(regexp, value) { + if (isEmpty(value) || regexp.test(value)) { + ctrl.$setValidity('pattern', true); + return value; + } else { + ctrl.$setValidity('pattern', false); + return undefined; + } + }; + + if (pattern) { + match = pattern.match(/^\/(.*)\/([gim]*)$/); + if (match) { + pattern = new RegExp(match[1], match[2]); + patternValidator = function(value) { + return validate(pattern, value) + }; + } else { + patternValidator = function(value) { + var patternObj = scope.$eval(pattern); + + if (!patternObj || !patternObj.test) { + throw new Error('Expected ' + pattern + ' to be a RegExp but was ' + patternObj); + } + return validate(patternObj, value); + }; + } + + ctrl.$formatters.push(patternValidator); + ctrl.$parsers.push(patternValidator); + } + + // min length validator + if (attr.ngMinlength) { + var minlength = int(attr.ngMinlength); + var minLengthValidator = function(value) { + if (!isEmpty(value) && value.length < minlength) { + ctrl.$setValidity('minlength', false); + return undefined; + } else { + ctrl.$setValidity('minlength', true); + return value; + } + }; + + ctrl.$parsers.push(minLengthValidator); + ctrl.$formatters.push(minLengthValidator); + } + + // max length validator + if (attr.ngMaxlength) { + var maxlength = int(attr.ngMaxlength); + var maxLengthValidator = function(value) { + if (!isEmpty(value) && value.length > maxlength) { + ctrl.$setValidity('maxlength', false); + return undefined; + } else { + ctrl.$setValidity('maxlength', true); + return value; + } + }; + + ctrl.$parsers.push(maxLengthValidator); + ctrl.$formatters.push(maxLengthValidator); + } +} + +function numberInputType(scope, element, attr, ctrl, $sniffer, $browser) { + textInputType(scope, element, attr, ctrl, $sniffer, $browser); + + ctrl.$parsers.push(function(value) { + var empty = isEmpty(value); + if (empty || NUMBER_REGEXP.test(value)) { + ctrl.$setValidity('number', true); + return value === '' ? null : (empty ? value : parseFloat(value)); + } else { + ctrl.$setValidity('number', false); + return undefined; + } + }); + + ctrl.$formatters.push(function(value) { + return isEmpty(value) ? '' : '' + value; + }); + + if (attr.min) { + var min = parseFloat(attr.min); + var minValidator = function(value) { + if (!isEmpty(value) && value < min) { + ctrl.$setValidity('min', false); + return undefined; + } else { + ctrl.$setValidity('min', true); + return value; + } + }; + + ctrl.$parsers.push(minValidator); + ctrl.$formatters.push(minValidator); + } + + if (attr.max) { + var max = parseFloat(attr.max); + var maxValidator = function(value) { + if (!isEmpty(value) && value > max) { + ctrl.$setValidity('max', false); + return undefined; + } else { + ctrl.$setValidity('max', true); + return value; + } + }; + + ctrl.$parsers.push(maxValidator); + ctrl.$formatters.push(maxValidator); + } + + ctrl.$formatters.push(function(value) { + + if (isEmpty(value) || isNumber(value)) { + ctrl.$setValidity('number', true); + return value; + } else { + ctrl.$setValidity('number', false); + return undefined; + } + }); +} + +function urlInputType(scope, element, attr, ctrl, $sniffer, $browser) { + textInputType(scope, element, attr, ctrl, $sniffer, $browser); + + var urlValidator = function(value) { + if (isEmpty(value) || URL_REGEXP.test(value)) { + ctrl.$setValidity('url', true); + return value; + } else { + ctrl.$setValidity('url', false); + return undefined; + } + }; + + ctrl.$formatters.push(urlValidator); + ctrl.$parsers.push(urlValidator); +} + +function emailInputType(scope, element, attr, ctrl, $sniffer, $browser) { + textInputType(scope, element, attr, ctrl, $sniffer, $browser); + + var emailValidator = function(value) { + if (isEmpty(value) || EMAIL_REGEXP.test(value)) { + ctrl.$setValidity('email', true); + return value; + } else { + ctrl.$setValidity('email', false); + return undefined; + } + }; + + ctrl.$formatters.push(emailValidator); + ctrl.$parsers.push(emailValidator); +} + +function radioInputType(scope, element, attr, ctrl) { + // make the name unique, if not defined + if (isUndefined(attr.name)) { + element.attr('name', nextUid()); + } + + element.bind('click', function() { + if (element[0].checked) { + scope.$apply(function() { + ctrl.$setViewValue(attr.value); + }); + } + }); + + ctrl.$render = function() { + var value = attr.value; + element[0].checked = (value == ctrl.$viewValue); + }; + + attr.$observe('value', ctrl.$render); +} + +function checkboxInputType(scope, element, attr, ctrl) { + var trueValue = attr.ngTrueValue, + falseValue = attr.ngFalseValue; + + if (!isString(trueValue)) trueValue = true; + if (!isString(falseValue)) falseValue = false; + + element.bind('click', function() { + scope.$apply(function() { + ctrl.$setViewValue(element[0].checked); + }); + }); + + ctrl.$render = function() { + element[0].checked = ctrl.$viewValue; + }; + + ctrl.$formatters.push(function(value) { + return value === trueValue; + }); + + ctrl.$parsers.push(function(value) { + return value ? trueValue : falseValue; + }); +} + + +/** + * @ngdoc directive + * @name ng.directive:textarea + * @restrict E + * + * @description + * HTML textarea element control with angular data-binding. The data-binding and validation + * properties of this element are exactly the same as those of the + * {@link ng.directive:input input element}. + * + * @param {string} ngModel Assignable angular expression to data-bind to. + * @param {string=} name Property name of the form under which the control is published. + * @param {string=} required Sets `required` validation error key if the value is not entered. + * @param {string=} ngRequired Adds `required` attribute and `required` validation constraint to + * the element when the ngRequired expression evaluates to true. Use `ngRequired` instead of + * `required` when you want to data-bind to the `required` attribute. + * @param {number=} ngMinlength Sets `minlength` validation error key if the value is shorter than + * minlength. + * @param {number=} ngMaxlength Sets `maxlength` validation error key if the value is longer than + * maxlength. + * @param {string=} ngPattern Sets `pattern` validation error key if the value does not match the + * RegExp pattern expression. Expected value is `/regexp/` for inline patterns or `regexp` for + * patterns defined as scope expressions. + * @param {string=} ngChange Angular expression to be executed when input changes due to user + * interaction with the input element. + */ + + +/** + * @ngdoc directive + * @name ng.directive:input + * @restrict E + * + * @description + * HTML input element control with angular data-binding. Input control follows HTML5 input types + * and polyfills the HTML5 validation behavior for older browsers. + * + * @param {string} ngModel Assignable angular expression to data-bind to. + * @param {string=} name Property name of the form under which the control is published. + * @param {string=} required Sets `required` validation error key if the value is not entered. + * @param {boolean=} ngRequired Sets `required` attribute if set to true + * @param {number=} ngMinlength Sets `minlength` validation error key if the value is shorter than + * minlength. + * @param {number=} ngMaxlength Sets `maxlength` validation error key if the value is longer than + * maxlength. + * @param {string=} ngPattern Sets `pattern` validation error key if the value does not match the + * RegExp pattern expression. Expected value is `/regexp/` for inline patterns or `regexp` for + * patterns defined as scope expressions. + * @param {string=} ngChange Angular expression to be executed when input changes due to user + * interaction with the input element. + * + * @example + + + +
    +
    + User name: + + Required!
    + Last name: + + Too short! + + Too long!
    +
    +
    + user = {{user}}
    + myForm.userName.$valid = {{myForm.userName.$valid}}
    + myForm.userName.$error = {{myForm.userName.$error}}
    + myForm.lastName.$valid = {{myForm.lastName.$valid}}
    + myForm.lastName.$error = {{myForm.lastName.$error}}
    + myForm.$valid = {{myForm.$valid}}
    + myForm.$error.required = {{!!myForm.$error.required}}
    + myForm.$error.minlength = {{!!myForm.$error.minlength}}
    + myForm.$error.maxlength = {{!!myForm.$error.maxlength}}
    +
    +
    + + it('should initialize to model', function() { + expect(binding('user')).toEqual('{"name":"guest","last":"visitor"}'); + expect(binding('myForm.userName.$valid')).toEqual('true'); + expect(binding('myForm.$valid')).toEqual('true'); + }); + + it('should be invalid if empty when required', function() { + input('user.name').enter(''); + expect(binding('user')).toEqual('{"last":"visitor"}'); + expect(binding('myForm.userName.$valid')).toEqual('false'); + expect(binding('myForm.$valid')).toEqual('false'); + }); + + it('should be valid if empty when min length is set', function() { + input('user.last').enter(''); + expect(binding('user')).toEqual('{"name":"guest","last":""}'); + expect(binding('myForm.lastName.$valid')).toEqual('true'); + expect(binding('myForm.$valid')).toEqual('true'); + }); + + it('should be invalid if less than required min length', function() { + input('user.last').enter('xx'); + expect(binding('user')).toEqual('{"name":"guest"}'); + expect(binding('myForm.lastName.$valid')).toEqual('false'); + expect(binding('myForm.lastName.$error')).toMatch(/minlength/); + expect(binding('myForm.$valid')).toEqual('false'); + }); + + it('should be invalid if longer than max length', function() { + input('user.last').enter('some ridiculously long name'); + expect(binding('user')) + .toEqual('{"name":"guest"}'); + expect(binding('myForm.lastName.$valid')).toEqual('false'); + expect(binding('myForm.lastName.$error')).toMatch(/maxlength/); + expect(binding('myForm.$valid')).toEqual('false'); + }); + +
    + */ +var inputDirective = ['$browser', '$sniffer', function($browser, $sniffer) { + return { + restrict: 'E', + require: '?ngModel', + link: function(scope, element, attr, ctrl) { + if (ctrl) { + (inputType[lowercase(attr.type)] || inputType.text)(scope, element, attr, ctrl, $sniffer, + $browser); + } + } + }; +}]; + +var VALID_CLASS = 'ng-valid', + INVALID_CLASS = 'ng-invalid', + PRISTINE_CLASS = 'ng-pristine', + DIRTY_CLASS = 'ng-dirty'; + +/** + * @ngdoc object + * @name ng.directive:ngModel.NgModelController + * + * @property {string} $viewValue Actual string value in the view. + * @property {*} $modelValue The value in the model, that the control is bound to. + * @property {Array.} $parsers Whenever the control reads value from the DOM, it executes + * all of these functions to sanitize / convert the value as well as validate. + * + * @property {Array.} $formatters Whenever the model value changes, it executes all of + * these functions to convert the value as well as validate. + * + * @property {Object} $error An object hash with all errors as keys. + * + * @property {boolean} $pristine True if user has not interacted with the control yet. + * @property {boolean} $dirty True if user has already interacted with the control. + * @property {boolean} $valid True if there is no error. + * @property {boolean} $invalid True if at least one error on the control. + * + * @description + * + * `NgModelController` provides API for the `ng-model` directive. The controller contains + * services for data-binding, validation, CSS update, value formatting and parsing. It + * specifically does not contain any logic which deals with DOM rendering or listening to + * DOM events. The `NgModelController` is meant to be extended by other directives where, the + * directive provides DOM manipulation and the `NgModelController` provides the data-binding. + * + * This example shows how to use `NgModelController` with a custom control to achieve + * data-binding. Notice how different directives (`contenteditable`, `ng-model`, and `required`) + * collaborate together to achieve the desired result. + * + * + + [contenteditable] { + border: 1px solid black; + background-color: white; + min-height: 20px; + } + + .ng-invalid { + border: 1px solid red; + } + + + + angular.module('customControl', []). + directive('contenteditable', function() { + return { + restrict: 'A', // only activate on element attribute + require: '?ngModel', // get a hold of NgModelController + link: function(scope, element, attrs, ngModel) { + if(!ngModel) return; // do nothing if no ng-model + + // Specify how UI should be updated + ngModel.$render = function() { + element.html(ngModel.$viewValue || ''); + }; + + // Listen for change events to enable binding + element.bind('blur keyup change', function() { + scope.$apply(read); + }); + read(); // initialize + + // Write data to the model + function read() { + ngModel.$setViewValue(element.html()); + } + } + }; + }); + + +
    +
    Change me!
    + Required! +
    + +
    +
    + + it('should data-bind and become invalid', function() { + var contentEditable = element('[contenteditable]'); + + expect(contentEditable.text()).toEqual('Change me!'); + input('userContent').enter(''); + expect(contentEditable.text()).toEqual(''); + expect(contentEditable.prop('className')).toMatch(/ng-invalid-required/); + }); + + *
    + * + */ +var NgModelController = ['$scope', '$exceptionHandler', '$attrs', '$element', '$parse', + function($scope, $exceptionHandler, $attr, $element, $parse) { + this.$viewValue = Number.NaN; + this.$modelValue = Number.NaN; + this.$parsers = []; + this.$formatters = []; + this.$viewChangeListeners = []; + this.$pristine = true; + this.$dirty = false; + this.$valid = true; + this.$invalid = false; + this.$name = $attr.name; + + var ngModelGet = $parse($attr.ngModel), + ngModelSet = ngModelGet.assign; + + if (!ngModelSet) { + throw Error(NON_ASSIGNABLE_MODEL_EXPRESSION + $attr.ngModel + + ' (' + startingTag($element) + ')'); + } + + /** + * @ngdoc function + * @name ng.directive:ngModel.NgModelController#$render + * @methodOf ng.directive:ngModel.NgModelController + * + * @description + * Called when the view needs to be updated. It is expected that the user of the ng-model + * directive will implement this method. + */ + this.$render = noop; + + var parentForm = $element.inheritedData('$formController') || nullFormCtrl, + invalidCount = 0, // used to easily determine if we are valid + $error = this.$error = {}; // keep invalid keys here + + + // Setup initial state of the control + $element.addClass(PRISTINE_CLASS); + toggleValidCss(true); + + // convenience method for easy toggling of classes + function toggleValidCss(isValid, validationErrorKey) { + validationErrorKey = validationErrorKey ? '-' + snake_case(validationErrorKey, '-') : ''; + $element. + removeClass((isValid ? INVALID_CLASS : VALID_CLASS) + validationErrorKey). + addClass((isValid ? VALID_CLASS : INVALID_CLASS) + validationErrorKey); + } + + /** + * @ngdoc function + * @name ng.directive:ngModel.NgModelController#$setValidity + * @methodOf ng.directive:ngModel.NgModelController + * + * @description + * Change the validity state, and notifies the form when the control changes validity. (i.e. it + * does not notify form if given validator is already marked as invalid). + * + * This method should be called by validators - i.e. the parser or formatter functions. + * + * @param {string} validationErrorKey Name of the validator. the `validationErrorKey` will assign + * to `$error[validationErrorKey]=isValid` so that it is available for data-binding. + * The `validationErrorKey` should be in camelCase and will get converted into dash-case + * for class name. Example: `myError` will result in `ng-valid-my-error` and `ng-invalid-my-error` + * class and can be bound to as `{{someForm.someControl.$error.myError}}` . + * @param {boolean} isValid Whether the current state is valid (true) or invalid (false). + */ + this.$setValidity = function(validationErrorKey, isValid) { + if ($error[validationErrorKey] === !isValid) return; + + if (isValid) { + if ($error[validationErrorKey]) invalidCount--; + if (!invalidCount) { + toggleValidCss(true); + this.$valid = true; + this.$invalid = false; + } + } else { + toggleValidCss(false); + this.$invalid = true; + this.$valid = false; + invalidCount++; + } + + $error[validationErrorKey] = !isValid; + toggleValidCss(isValid, validationErrorKey); + + parentForm.$setValidity(validationErrorKey, isValid, this); + }; + + /** + * @ngdoc function + * @name ng.directive:ngModel.NgModelController#$setPristine + * @methodOf ng.directive:ngModel.NgModelController + * + * @description + * Sets the control to its pristine state. + * + * This method can be called to remove the 'ng-dirty' class and set the control to its pristine + * state (ng-pristine class). + */ + this.$setPristine = function () { + this.$dirty = false; + this.$pristine = true; + $element.removeClass(DIRTY_CLASS).addClass(PRISTINE_CLASS); + }; + + /** + * @ngdoc function + * @name ng.directive:ngModel.NgModelController#$setViewValue + * @methodOf ng.directive:ngModel.NgModelController + * + * @description + * Read a value from view. + * + * This method should be called from within a DOM event handler. + * For example {@link ng.directive:input input} or + * {@link ng.directive:select select} directives call it. + * + * It internally calls all `parsers` and if resulted value is valid, updates the model and + * calls all registered change listeners. + * + * @param {string} value Value from the view. + */ + this.$setViewValue = function(value) { + this.$viewValue = value; + + // change to dirty + if (this.$pristine) { + this.$dirty = true; + this.$pristine = false; + $element.removeClass(PRISTINE_CLASS).addClass(DIRTY_CLASS); + parentForm.$setDirty(); + } + + forEach(this.$parsers, function(fn) { + value = fn(value); + }); + + if (this.$modelValue !== value) { + this.$modelValue = value; + ngModelSet($scope, value); + forEach(this.$viewChangeListeners, function(listener) { + try { + listener(); + } catch(e) { + $exceptionHandler(e); + } + }) + } + }; + + // model -> value + var ctrl = this; + + $scope.$watch(function ngModelWatch() { + var value = ngModelGet($scope); + + // if scope model value and ngModel value are out of sync + if (ctrl.$modelValue !== value) { + + var formatters = ctrl.$formatters, + idx = formatters.length; + + ctrl.$modelValue = value; + while(idx--) { + value = formatters[idx](value); + } + + if (ctrl.$viewValue !== value) { + ctrl.$viewValue = value; + ctrl.$render(); + } + } + }); +}]; + + +/** + * @ngdoc directive + * @name ng.directive:ngModel + * + * @element input + * + * @description + * Is directive that tells Angular to do two-way data binding. It works together with `input`, + * `select`, `textarea`. You can easily write your own directives to use `ngModel` as well. + * + * `ngModel` is responsible for: + * + * - binding the view into the model, which other directives such as `input`, `textarea` or `select` + * require, + * - providing validation behavior (i.e. required, number, email, url), + * - keeping state of the control (valid/invalid, dirty/pristine, validation errors), + * - setting related css class onto the element (`ng-valid`, `ng-invalid`, `ng-dirty`, `ng-pristine`), + * - register the control with parent {@link ng.directive:form form}. + * + * For basic examples, how to use `ngModel`, see: + * + * - {@link ng.directive:input input} + * - {@link ng.directive:input.text text} + * - {@link ng.directive:input.checkbox checkbox} + * - {@link ng.directive:input.radio radio} + * - {@link ng.directive:input.number number} + * - {@link ng.directive:input.email email} + * - {@link ng.directive:input.url url} + * - {@link ng.directive:select select} + * - {@link ng.directive:textarea textarea} + * + */ +var ngModelDirective = function() { + return { + require: ['ngModel', '^?form'], + controller: NgModelController, + link: function(scope, element, attr, ctrls) { + // notify others, especially parent forms + + var modelCtrl = ctrls[0], + formCtrl = ctrls[1] || nullFormCtrl; + + formCtrl.$addControl(modelCtrl); + + element.bind('$destroy', function() { + formCtrl.$removeControl(modelCtrl); + }); + } + }; +}; + + +/** + * @ngdoc directive + * @name ng.directive:ngChange + * @restrict E + * + * @description + * Evaluate given expression when user changes the input. + * The expression is not evaluated when the value change is coming from the model. + * + * Note, this directive requires `ngModel` to be present. + * + * @element input + * + * @example + * + * + * + *
    + * + * + *
    + * debug = {{confirmed}}
    + * counter = {{counter}} + *
    + *
    + * + * it('should evaluate the expression if changing from view', function() { + * expect(binding('counter')).toEqual('0'); + * element('#ng-change-example1').click(); + * expect(binding('counter')).toEqual('1'); + * expect(binding('confirmed')).toEqual('true'); + * }); + * + * it('should not evaluate the expression if changing from model', function() { + * element('#ng-change-example2').click(); + * expect(binding('counter')).toEqual('0'); + * expect(binding('confirmed')).toEqual('true'); + * }); + * + *
    + */ +var ngChangeDirective = valueFn({ + require: 'ngModel', + link: function(scope, element, attr, ctrl) { + ctrl.$viewChangeListeners.push(function() { + scope.$eval(attr.ngChange); + }); + } +}); + + +var requiredDirective = function() { + return { + require: '?ngModel', + link: function(scope, elm, attr, ctrl) { + if (!ctrl) return; + attr.required = true; // force truthy in case we are on non input element + + var validator = function(value) { + if (attr.required && (isEmpty(value) || value === false)) { + ctrl.$setValidity('required', false); + return; + } else { + ctrl.$setValidity('required', true); + return value; + } + }; + + ctrl.$formatters.push(validator); + ctrl.$parsers.unshift(validator); + + attr.$observe('required', function() { + validator(ctrl.$viewValue); + }); + } + }; +}; + + +/** + * @ngdoc directive + * @name ng.directive:ngList + * + * @description + * Text input that converts between comma-separated string into an array of strings. + * + * @element input + * @param {string=} ngList optional delimiter that should be used to split the value. If + * specified in form `/something/` then the value will be converted into a regular expression. + * + * @example + + + +
    + List: + + Required! + names = {{names}}
    + myForm.namesInput.$valid = {{myForm.namesInput.$valid}}
    + myForm.namesInput.$error = {{myForm.namesInput.$error}}
    + myForm.$valid = {{myForm.$valid}}
    + myForm.$error.required = {{!!myForm.$error.required}}
    +
    +
    + + it('should initialize to model', function() { + expect(binding('names')).toEqual('["igor","misko","vojta"]'); + expect(binding('myForm.namesInput.$valid')).toEqual('true'); + }); + + it('should be invalid if empty', function() { + input('names').enter(''); + expect(binding('names')).toEqual('[]'); + expect(binding('myForm.namesInput.$valid')).toEqual('false'); + }); + +
    + */ +var ngListDirective = function() { + return { + require: 'ngModel', + link: function(scope, element, attr, ctrl) { + var match = /\/(.*)\//.exec(attr.ngList), + separator = match && new RegExp(match[1]) || attr.ngList || ','; + + var parse = function(viewValue) { + var list = []; + + if (viewValue) { + forEach(viewValue.split(separator), function(value) { + if (value) list.push(trim(value)); + }); + } + + return list; + }; + + ctrl.$parsers.push(parse); + ctrl.$formatters.push(function(value) { + if (isArray(value)) { + return value.join(', '); + } + + return undefined; + }); + } + }; +}; + + +var CONSTANT_VALUE_REGEXP = /^(true|false|\d+)$/; + +var ngValueDirective = function() { + return { + priority: 100, + compile: function(tpl, tplAttr) { + if (CONSTANT_VALUE_REGEXP.test(tplAttr.ngValue)) { + return function(scope, elm, attr) { + attr.$set('value', scope.$eval(attr.ngValue)); + }; + } else { + return function(scope, elm, attr) { + scope.$watch(attr.ngValue, function valueWatchAction(value) { + attr.$set('value', value, false); + }); + }; + } + } + }; +}; + +/** + * @ngdoc directive + * @name ng.directive:ngBind + * + * @description + * The `ngBind` attribute tells Angular to replace the text content of the specified HTML element + * with the value of a given expression, and to update the text content when the value of that + * expression changes. + * + * Typically, you don't use `ngBind` directly, but instead you use the double curly markup like + * `{{ expression }}` which is similar but less verbose. + * + * One scenario in which the use of `ngBind` is preferred over `{{ expression }}` binding is when + * it's desirable to put bindings into template that is momentarily displayed by the browser in its + * raw state before Angular compiles it. Since `ngBind` is an element attribute, it makes the + * bindings invisible to the user while the page is loading. + * + * An alternative solution to this problem would be using the + * {@link ng.directive:ngCloak ngCloak} directive. + * + * + * @element ANY + * @param {expression} ngBind {@link guide/expression Expression} to evaluate. + * + * @example + * Enter a name in the Live Preview text box; the greeting below the text box changes instantly. + + + +
    + Enter name:
    + Hello ! +
    +
    + + it('should check ng-bind', function() { + expect(using('.doc-example-live').binding('name')).toBe('Whirled'); + using('.doc-example-live').input('name').enter('world'); + expect(using('.doc-example-live').binding('name')).toBe('world'); + }); + +
    + */ +var ngBindDirective = ngDirective(function(scope, element, attr) { + element.addClass('ng-binding').data('$binding', attr.ngBind); + scope.$watch(attr.ngBind, function ngBindWatchAction(value) { + element.text(value == undefined ? '' : value); + }); +}); + + +/** + * @ngdoc directive + * @name ng.directive:ngBindTemplate + * + * @description + * The `ngBindTemplate` directive specifies that the element + * text should be replaced with the template in ngBindTemplate. + * Unlike ngBind the ngBindTemplate can contain multiple `{{` `}}` + * expressions. (This is required since some HTML elements + * can not have SPAN elements such as TITLE, or OPTION to name a few.) + * + * @element ANY + * @param {string} ngBindTemplate template of form + * {{ expression }} to eval. + * + * @example + * Try it here: enter text in text box and watch the greeting change. + + + +
    + Salutation:
    + Name:
    +
    
    +       
    +
    + + it('should check ng-bind', function() { + expect(using('.doc-example-live').binding('salutation')). + toBe('Hello'); + expect(using('.doc-example-live').binding('name')). + toBe('World'); + using('.doc-example-live').input('salutation').enter('Greetings'); + using('.doc-example-live').input('name').enter('user'); + expect(using('.doc-example-live').binding('salutation')). + toBe('Greetings'); + expect(using('.doc-example-live').binding('name')). + toBe('user'); + }); + +
    + */ +var ngBindTemplateDirective = ['$interpolate', function($interpolate) { + return function(scope, element, attr) { + // TODO: move this to scenario runner + var interpolateFn = $interpolate(element.attr(attr.$attr.ngBindTemplate)); + element.addClass('ng-binding').data('$binding', interpolateFn); + attr.$observe('ngBindTemplate', function(value) { + element.text(value); + }); + } +}]; + + +/** + * @ngdoc directive + * @name ng.directive:ngBindHtmlUnsafe + * + * @description + * Creates a binding that will innerHTML the result of evaluating the `expression` into the current + * element. *The innerHTML-ed content will not be sanitized!* You should use this directive only if + * {@link ngSanitize.directive:ngBindHtml ngBindHtml} directive is too + * restrictive and when you absolutely trust the source of the content you are binding to. + * + * See {@link ngSanitize.$sanitize $sanitize} docs for examples. + * + * @element ANY + * @param {expression} ngBindHtmlUnsafe {@link guide/expression Expression} to evaluate. + */ +var ngBindHtmlUnsafeDirective = [function() { + return function(scope, element, attr) { + element.addClass('ng-binding').data('$binding', attr.ngBindHtmlUnsafe); + scope.$watch(attr.ngBindHtmlUnsafe, function ngBindHtmlUnsafeWatchAction(value) { + element.html(value || ''); + }); + }; +}]; + +function classDirective(name, selector) { + name = 'ngClass' + name; + return ngDirective(function(scope, element, attr) { + var oldVal = undefined; + + scope.$watch(attr[name], ngClassWatchAction, true); + + attr.$observe('class', function(value) { + var ngClass = scope.$eval(attr[name]); + ngClassWatchAction(ngClass, ngClass); + }); + + + if (name !== 'ngClass') { + scope.$watch('$index', function($index, old$index) { + var mod = $index & 1; + if (mod !== old$index & 1) { + if (mod === selector) { + addClass(scope.$eval(attr[name])); + } else { + removeClass(scope.$eval(attr[name])); + } + } + }); + } + + + function ngClassWatchAction(newVal) { + if (selector === true || scope.$index % 2 === selector) { + if (oldVal && !equals(newVal,oldVal)) { + removeClass(oldVal); + } + addClass(newVal); + } + oldVal = copy(newVal); + } + + + function removeClass(classVal) { + if (isObject(classVal) && !isArray(classVal)) { + classVal = map(classVal, function(v, k) { if (v) return k }); + } + element.removeClass(isArray(classVal) ? classVal.join(' ') : classVal); + } + + + function addClass(classVal) { + if (isObject(classVal) && !isArray(classVal)) { + classVal = map(classVal, function(v, k) { if (v) return k }); + } + if (classVal) { + element.addClass(isArray(classVal) ? classVal.join(' ') : classVal); + } + } + }); +} + +/** + * @ngdoc directive + * @name ng.directive:ngClass + * + * @description + * The `ngClass` allows you to set CSS class on HTML element dynamically by databinding an + * expression that represents all classes to be added. + * + * The directive won't add duplicate classes if a particular class was already set. + * + * When the expression changes, the previously added classes are removed and only then the + * new classes are added. + * + * @element ANY + * @param {expression} ngClass {@link guide/expression Expression} to eval. The result + * of the evaluation can be a string representing space delimited class + * names, an array, or a map of class names to boolean values. + * + * @example + + + + +
    + Sample Text +
    + + .my-class { + color: red; + } + + + it('should check ng-class', function() { + expect(element('.doc-example-live span').prop('className')).not(). + toMatch(/my-class/); + + using('.doc-example-live').element(':button:first').click(); + + expect(element('.doc-example-live span').prop('className')). + toMatch(/my-class/); + + using('.doc-example-live').element(':button:last').click(); + + expect(element('.doc-example-live span').prop('className')).not(). + toMatch(/my-class/); + }); + +
    + */ +var ngClassDirective = classDirective('', true); + +/** + * @ngdoc directive + * @name ng.directive:ngClassOdd + * + * @description + * The `ngClassOdd` and `ngClassEven` directives work exactly as + * {@link ng.directive:ngClass ngClass}, except it works in + * conjunction with `ngRepeat` and takes affect only on odd (even) rows. + * + * This directive can be applied only within a scope of an + * {@link ng.directive:ngRepeat ngRepeat}. + * + * @element ANY + * @param {expression} ngClassOdd {@link guide/expression Expression} to eval. The result + * of the evaluation can be a string representing space delimited class names or an array. + * + * @example + + +
      +
    1. + + {{name}} + +
    2. +
    +
    + + .odd { + color: red; + } + .even { + color: blue; + } + + + it('should check ng-class-odd and ng-class-even', function() { + expect(element('.doc-example-live li:first span').prop('className')). + toMatch(/odd/); + expect(element('.doc-example-live li:last span').prop('className')). + toMatch(/even/); + }); + +
    + */ +var ngClassOddDirective = classDirective('Odd', 0); + +/** + * @ngdoc directive + * @name ng.directive:ngClassEven + * + * @description + * The `ngClassOdd` and `ngClassEven` directives work exactly as + * {@link ng.directive:ngClass ngClass}, except it works in + * conjunction with `ngRepeat` and takes affect only on odd (even) rows. + * + * This directive can be applied only within a scope of an + * {@link ng.directive:ngRepeat ngRepeat}. + * + * @element ANY + * @param {expression} ngClassEven {@link guide/expression Expression} to eval. The + * result of the evaluation can be a string representing space delimited class names or an array. + * + * @example + + +
      +
    1. + + {{name}}       + +
    2. +
    +
    + + .odd { + color: red; + } + .even { + color: blue; + } + + + it('should check ng-class-odd and ng-class-even', function() { + expect(element('.doc-example-live li:first span').prop('className')). + toMatch(/odd/); + expect(element('.doc-example-live li:last span').prop('className')). + toMatch(/even/); + }); + +
    + */ +var ngClassEvenDirective = classDirective('Even', 1); + +/** + * @ngdoc directive + * @name ng.directive:ngCloak + * + * @description + * The `ngCloak` directive is used to prevent the Angular html template from being briefly + * displayed by the browser in its raw (uncompiled) form while your application is loading. Use this + * directive to avoid the undesirable flicker effect caused by the html template display. + * + * The directive can be applied to the `` element, but typically a fine-grained application is + * preferred in order to benefit from progressive rendering of the browser view. + * + * `ngCloak` works in cooperation with a css rule that is embedded within `angular.js` and + * `angular.min.js` files. Following is the css rule: + * + *
    + * [ng\:cloak], [ng-cloak], [data-ng-cloak], [x-ng-cloak], .ng-cloak, .x-ng-cloak {
    + *   display: none;
    + * }
    + * 
    + * + * When this css rule is loaded by the browser, all html elements (including their children) that + * are tagged with the `ng-cloak` directive are hidden. When Angular comes across this directive + * during the compilation of the template it deletes the `ngCloak` element attribute, which + * makes the compiled element visible. + * + * For the best result, `angular.js` script must be loaded in the head section of the html file; + * alternatively, the css rule (above) must be included in the external stylesheet of the + * application. + * + * Legacy browsers, like IE7, do not provide attribute selector support (added in CSS 2.1) so they + * cannot match the `[ng\:cloak]` selector. To work around this limitation, you must add the css + * class `ngCloak` in addition to `ngCloak` directive as shown in the example below. + * + * @element ANY + * + * @example + + +
    {{ 'hello' }}
    +
    {{ 'hello IE7' }}
    +
    + + it('should remove the template directive and css class', function() { + expect(element('.doc-example-live #template1').attr('ng-cloak')). + not().toBeDefined(); + expect(element('.doc-example-live #template2').attr('ng-cloak')). + not().toBeDefined(); + }); + +
    + * + */ +var ngCloakDirective = ngDirective({ + compile: function(element, attr) { + attr.$set('ngCloak', undefined); + element.removeClass('ng-cloak'); + } +}); + +/** + * @ngdoc directive + * @name ng.directive:ngController + * + * @description + * The `ngController` directive assigns behavior to a scope. This is a key aspect of how angular + * supports the principles behind the Model-View-Controller design pattern. + * + * MVC components in angular: + * + * * Model — The Model is data in scope properties; scopes are attached to the DOM. + * * View — The template (HTML with data bindings) is rendered into the View. + * * Controller — The `ngController` directive specifies a Controller class; the class has + * methods that typically express the business logic behind the application. + * + * Note that an alternative way to define controllers is via the {@link ng.$route $route} service. + * + * @element ANY + * @scope + * @param {expression} ngController Name of a globally accessible constructor function or an + * {@link guide/expression expression} that on the current scope evaluates to a + * constructor function. The controller instance can further be published into the scope + * by adding `as localName` the controller name attribute. + * + * @example + * Here is a simple form for editing user contact information. Adding, removing, clearing, and + * greeting are methods declared on the controller (see source tab). These methods can + * easily be called from the angular markup. Notice that the scope becomes the `this` for the + * controller's instance. This allows for easy access to the view data from the controller. Also + * notice that any changes to the data are automatically reflected in the View without the need + * for a manual update. The example is included in two different declaration styles based on + * your style preferences. + + + +
    + Name: + [ greet ]
    + Contact: +
      +
    • + + + [ clear + | X ] +
    • +
    • [ add ]
    • +
    +
    +
    + + it('should check controller', function() { + expect(element('.doc-example-live div>:input').val()).toBe('John Smith'); + expect(element('.doc-example-live li:nth-child(1) input').val()) + .toBe('408 555 1212'); + expect(element('.doc-example-live li:nth-child(2) input').val()) + .toBe('john.smith@example.org'); + + element('.doc-example-live li:first a:contains("clear")').click(); + expect(element('.doc-example-live li:first input').val()).toBe(''); + + element('.doc-example-live li:last a:contains("add")').click(); + expect(element('.doc-example-live li:nth-child(3) input').val()) + .toBe('yourname@example.org'); + }); + +
    + + + + + + +
    + Name: + [ greet ]
    + Contact: +
      +
    • + + + [ clear + | X ] +
    • +
    • [ add ]
    • +
    +
    +
    + + it('should check controller', function() { + expect(element('.doc-example-live div>:input').val()).toBe('John Smith'); + expect(element('.doc-example-live li:nth-child(1) input').val()) + .toBe('408 555 1212'); + expect(element('.doc-example-live li:nth-child(2) input').val()) + .toBe('john.smith@example.org'); + + element('.doc-example-live li:first a:contains("clear")').click(); + expect(element('.doc-example-live li:first input').val()).toBe(''); + + element('.doc-example-live li:last a:contains("add")').click(); + expect(element('.doc-example-live li:nth-child(3) input').val()) + .toBe('yourname@example.org'); + }); + +
    + + */ +var ngControllerDirective = [function() { + return { + scope: true, + controller: '@' + }; +}]; + +/** + * @ngdoc directive + * @name ng.directive:ngCsp + * @priority 1000 + * + * @element html + * @description + * Enables [CSP (Content Security Policy)](https://developer.mozilla.org/en/Security/CSP) support. + * + * This is necessary when developing things like Google Chrome Extensions. + * + * CSP forbids apps to use `eval` or `Function(string)` generated functions (among other things). + * For us to be compatible, we just need to implement the "getterFn" in $parse without violating + * any of these restrictions. + * + * AngularJS uses `Function(string)` generated functions as a speed optimization. By applying `ngCsp` + * it is be possible to opt into the CSP compatible mode. When this mode is on AngularJS will + * evaluate all expressions up to 30% slower than in non-CSP mode, but no security violations will + * be raised. + * + * In order to use this feature put `ngCsp` directive on the root element of the application. + * + * @example + * This example shows how to apply the `ngCsp` directive to the `html` tag. +
    +     
    +     
    +     ...
    +     ...
    +     
    +   
    + */ + +var ngCspDirective = ['$sniffer', function($sniffer) { + return { + priority: 1000, + compile: function() { + $sniffer.csp = true; + } + }; +}]; + +/** + * @ngdoc directive + * @name ng.directive:ngClick + * + * @description + * The ngClick allows you to specify custom behavior when + * element is clicked. + * + * @element ANY + * @param {expression} ngClick {@link guide/expression Expression} to evaluate upon + * click. (Event object is available as `$event`) + * + * @example + + + + count: {{count}} + + + it('should check ng-click', function() { + expect(binding('count')).toBe('0'); + element('.doc-example-live :button').click(); + expect(binding('count')).toBe('1'); + }); + + + */ +/* + * A directive that allows creation of custom onclick handlers that are defined as angular + * expressions and are compiled and executed within the current scope. + * + * Events that are handled via these handler are always configured not to propagate further. + */ +var ngEventDirectives = {}; +forEach( + 'click dblclick mousedown mouseup mouseover mouseout mousemove mouseenter mouseleave keydown keyup keypress'.split(' '), + function(name) { + var directiveName = directiveNormalize('ng-' + name); + ngEventDirectives[directiveName] = ['$parse', function($parse) { + return function(scope, element, attr) { + var fn = $parse(attr[directiveName]); + element.bind(lowercase(name), function(event) { + scope.$apply(function() { + fn(scope, {$event:event}); + }); + }); + }; + }]; + } +); + +/** + * @ngdoc directive + * @name ng.directive:ngDblclick + * + * @description + * The `ngDblclick` directive allows you to specify custom behavior on dblclick event. + * + * @element ANY + * @param {expression} ngDblclick {@link guide/expression Expression} to evaluate upon + * dblclick. (Event object is available as `$event`) + * + * @example + * See {@link ng.directive:ngClick ngClick} + */ + + +/** + * @ngdoc directive + * @name ng.directive:ngMousedown + * + * @description + * The ngMousedown directive allows you to specify custom behavior on mousedown event. + * + * @element ANY + * @param {expression} ngMousedown {@link guide/expression Expression} to evaluate upon + * mousedown. (Event object is available as `$event`) + * + * @example + * See {@link ng.directive:ngClick ngClick} + */ + + +/** + * @ngdoc directive + * @name ng.directive:ngMouseup + * + * @description + * Specify custom behavior on mouseup event. + * + * @element ANY + * @param {expression} ngMouseup {@link guide/expression Expression} to evaluate upon + * mouseup. (Event object is available as `$event`) + * + * @example + * See {@link ng.directive:ngClick ngClick} + */ + +/** + * @ngdoc directive + * @name ng.directive:ngMouseover + * + * @description + * Specify custom behavior on mouseover event. + * + * @element ANY + * @param {expression} ngMouseover {@link guide/expression Expression} to evaluate upon + * mouseover. (Event object is available as `$event`) + * + * @example + * See {@link ng.directive:ngClick ngClick} + */ + + +/** + * @ngdoc directive + * @name ng.directive:ngMouseenter + * + * @description + * Specify custom behavior on mouseenter event. + * + * @element ANY + * @param {expression} ngMouseenter {@link guide/expression Expression} to evaluate upon + * mouseenter. (Event object is available as `$event`) + * + * @example + * See {@link ng.directive:ngClick ngClick} + */ + + +/** + * @ngdoc directive + * @name ng.directive:ngMouseleave + * + * @description + * Specify custom behavior on mouseleave event. + * + * @element ANY + * @param {expression} ngMouseleave {@link guide/expression Expression} to evaluate upon + * mouseleave. (Event object is available as `$event`) + * + * @example + * See {@link ng.directive:ngClick ngClick} + */ + + +/** + * @ngdoc directive + * @name ng.directive:ngMousemove + * + * @description + * Specify custom behavior on mousemove event. + * + * @element ANY + * @param {expression} ngMousemove {@link guide/expression Expression} to evaluate upon + * mousemove. (Event object is available as `$event`) + * + * @example + * See {@link ng.directive:ngClick ngClick} + */ + + +/** + * @ngdoc directive + * @name ng.directive:ngKeydown + * + * @description + * Specify custom behavior on keydown event. + * + * @element ANY + * @param {expression} ngKeydown {@link guide/expression Expression} to evaluate upon + * keydown. (Event object is available as `$event` and can be interrogated for keyCode, altKey, etc.) + * + * @example + * See {@link ng.directive:ngClick ngClick} + */ + + +/** + * @ngdoc directive + * @name ng.directive:ngKeyup + * + * @description + * Specify custom behavior on keyup event. + * + * @element ANY + * @param {expression} ngKeyup {@link guide/expression Expression} to evaluate upon + * keyup. (Event object is available as `$event` and can be interrogated for keyCode, altKey, etc.) + * + * @example + * See {@link ng.directive:ngClick ngClick} + */ + + +/** + * @ngdoc directive + * @name ng.directive:ngKeypress + * + * @description + * Specify custom behavior on keypress event. + * + * @element ANY + * @param {expression} ngKeypress {@link guide/expression Expression} to evaluate upon + * keypress. (Event object is available as `$event` and can be interrogated for keyCode, altKey, etc.) + * + * @example + * See {@link ng.directive:ngClick ngClick} + */ + + +/** + * @ngdoc directive + * @name ng.directive:ngSubmit + * + * @description + * Enables binding angular expressions to onsubmit events. + * + * Additionally it prevents the default action (which for form means sending the request to the + * server and reloading the current page). + * + * @element form + * @param {expression} ngSubmit {@link guide/expression Expression} to eval. + * + * @example + + + +
    + Enter text and hit enter: + + +
    list={{list}}
    +
    +
    + + it('should check ng-submit', function() { + expect(binding('list')).toBe('[]'); + element('.doc-example-live #submit').click(); + expect(binding('list')).toBe('["hello"]'); + expect(input('text').val()).toBe(''); + }); + it('should ignore empty strings', function() { + expect(binding('list')).toBe('[]'); + element('.doc-example-live #submit').click(); + element('.doc-example-live #submit').click(); + expect(binding('list')).toBe('["hello"]'); + }); + +
    + */ +var ngSubmitDirective = ngDirective(function(scope, element, attrs) { + element.bind('submit', function() { + scope.$apply(attrs.ngSubmit); + }); +}); + +/** + * @ngdoc directive + * @name ng.directive:ngIf + * @restrict A + * + * @description + * The `ngIf` directive removes and recreates a portion of the DOM tree (HTML) + * conditionally based on **"falsy"** and **"truthy"** values, respectively, evaluated within + * an {expression}. In other words, if the expression assigned to **ngIf evaluates to a false + * value** then **the element is removed from the DOM** and **if true** then **a clone of the + * element is reinserted into the DOM**. + * + * `ngIf` differs from `ngShow` and `ngHide` in that `ngIf` completely removes and recreates the + * element in the DOM rather than changing its visibility via the `display` css property. A common + * case when this difference is significant is when using css selectors that rely on an element's + * position within the DOM (HTML), such as the `:first-child` or `:last-child` pseudo-classes. + * + * Note that **when an element is removed using ngIf its scope is destroyed** and **a new scope + * is created when the element is restored**. The scope created within `ngIf` inherits from + * its parent scope using + * {@link https://github.com/angular/angular.js/wiki/The-Nuances-of-Scope-Prototypal-Inheritance prototypal inheritance}. + * An important implication of this is if `ngModel` is used within `ngIf` to bind to + * a javascript primitive defined in the parent scope. In this case any modifications made to the + * variable within the child scope will override (hide) the value in the parent scope. + * + * Also, `ngIf` recreates elements using their compiled state. An example scenario of this behavior + * is if an element's class attribute is directly modified after it's compiled, using something like + * jQuery's `.addClass()` method, and the element is later removed. When `ngIf` recreates the element + * the added class will be lost because the original compiled state is used to regenerate the element. + * + * Additionally, you can provide animations via the ngAnimate attribute to animate the **enter** + * and **leave** effects. + * + * @animations + * enter - happens just after the ngIf contents change and a new DOM element is created and injected into the ngIf container + * leave - happens just before the ngIf contents are removed from the DOM + * + * @element ANY + * @scope + * @param {expression} ngIf If the {@link guide/expression expression} is falsy then + * the element is removed from the DOM tree (HTML). + * + * @example + + + Click me:
    + Show when checked: + + I'm removed when the checkbox is unchecked. + +
    + + .example-leave, .example-enter { + -webkit-transition:all cubic-bezier(0.250, 0.460, 0.450, 0.940) 0.5s; + -moz-transition:all cubic-bezier(0.250, 0.460, 0.450, 0.940) 0.5s; + -ms-transition:all cubic-bezier(0.250, 0.460, 0.450, 0.940) 0.5s; + -o-transition:all cubic-bezier(0.250, 0.460, 0.450, 0.940) 0.5s; + transition:all cubic-bezier(0.250, 0.460, 0.450, 0.940) 0.5s; + } + + .example-enter { + opacity:0; + } + .example-enter.example-enter-active { + opacity:1; + } + + .example-leave { + opacity:1; + } + .example-leave.example-leave-active { + opacity:0; + } + +
    + */ +var ngIfDirective = ['$animator', function($animator) { + return { + transclude: 'element', + priority: 1000, + terminal: true, + restrict: 'A', + compile: function (element, attr, transclude) { + return function ($scope, $element, $attr) { + var animate = $animator($scope, $attr); + var childElement, childScope; + $scope.$watch($attr.ngIf, function ngIfWatchAction(value) { + if (childElement) { + animate.leave(childElement); + childElement = undefined; + } + if (childScope) { + childScope.$destroy(); + childScope = undefined; + } + if (toBoolean(value)) { + childScope = $scope.$new(); + transclude(childScope, function (clone) { + childElement = clone; + animate.enter(clone, $element.parent(), $element); + }); + } + }); + } + } + } +}]; + +/** + * @ngdoc directive + * @name ng.directive:ngInclude + * @restrict ECA + * + * @description + * Fetches, compiles and includes an external HTML fragment. + * + * Keep in mind that Same Origin Policy applies to included resources + * (e.g. ngInclude won't work for cross-domain requests on all browsers and for + * file:// access on some browsers). + * + * Additionally, you can also provide animations via the ngAnimate attribute to animate the **enter** + * and **leave** effects. + * + * @animations + * enter - happens just after the ngInclude contents change and a new DOM element is created and injected into the ngInclude container + * leave - happens just after the ngInclude contents change and just before the former contents are removed from the DOM + * + * @scope + * + * @param {string} ngInclude|src angular expression evaluating to URL. If the source is a string constant, + * make sure you wrap it in quotes, e.g. `src="'myPartialTemplate.html'"`. + * @param {string=} onload Expression to evaluate when a new partial is loaded. + * + * @param {string=} autoscroll Whether `ngInclude` should call {@link ng.$anchorScroll + * $anchorScroll} to scroll the viewport after the content is loaded. + * + * - If the attribute is not set, disable scrolling. + * - If the attribute is set without value, enable scrolling. + * - Otherwise enable scrolling only if the expression evaluates to truthy value. + * + * @example + + +
    + + url of the template: {{template.url}} +
    +
    +
    +
    + + function Ctrl($scope) { + $scope.templates = + [ { name: 'template1.html', url: 'template1.html'} + , { name: 'template2.html', url: 'template2.html'} ]; + $scope.template = $scope.templates[0]; + } + + +
    Content of template1.html
    +
    + +
    Content of template2.html
    +
    + + .example-leave, + .example-enter { + -webkit-transition:all cubic-bezier(0.250, 0.460, 0.450, 0.940) 0.5s; + -moz-transition:all cubic-bezier(0.250, 0.460, 0.450, 0.940) 0.5s; + -ms-transition:all cubic-bezier(0.250, 0.460, 0.450, 0.940) 0.5s; + -o-transition:all cubic-bezier(0.250, 0.460, 0.450, 0.940) 0.5s; + transition:all cubic-bezier(0.250, 0.460, 0.450, 0.940) 0.5s; + + position:absolute; + top:0; + left:0; + right:0; + bottom:0; + } + + .example-animate-container > * { + display:block; + padding:10px; + } + + .example-enter { + top:-50px; + } + .example-enter.example-enter-active { + top:0; + } + + .example-leave { + top:0; + } + .example-leave.example-leave-active { + top:50px; + } + + + it('should load template1.html', function() { + expect(element('.doc-example-live [ng-include]').text()). + toMatch(/Content of template1.html/); + }); + it('should load template2.html', function() { + select('template').option('1'); + expect(element('.doc-example-live [ng-include]').text()). + toMatch(/Content of template2.html/); + }); + it('should change to blank', function() { + select('template').option(''); + expect(element('.doc-example-live [ng-include]').text()).toEqual(''); + }); + +
    + */ + + +/** + * @ngdoc event + * @name ng.directive:ngInclude#$includeContentRequested + * @eventOf ng.directive:ngInclude + * @eventType emit on the scope ngInclude was declared in + * @description + * Emitted every time the ngInclude content is requested. + */ + + +/** + * @ngdoc event + * @name ng.directive:ngInclude#$includeContentLoaded + * @eventOf ng.directive:ngInclude + * @eventType emit on the current ngInclude scope + * @description + * Emitted every time the ngInclude content is reloaded. + */ +var ngIncludeDirective = ['$http', '$templateCache', '$anchorScroll', '$compile', '$animator', + function($http, $templateCache, $anchorScroll, $compile, $animator) { + return { + restrict: 'ECA', + terminal: true, + compile: function(element, attr) { + var srcExp = attr.ngInclude || attr.src, + onloadExp = attr.onload || '', + autoScrollExp = attr.autoscroll; + + return function(scope, element, attr) { + var animate = $animator(scope, attr); + var changeCounter = 0, + childScope; + + var clearContent = function() { + if (childScope) { + childScope.$destroy(); + childScope = null; + } + animate.leave(element.contents(), element); + }; + + scope.$watch(srcExp, function ngIncludeWatchAction(src) { + var thisChangeId = ++changeCounter; + + if (src) { + $http.get(src, {cache: $templateCache}).success(function(response) { + if (thisChangeId !== changeCounter) return; + + if (childScope) childScope.$destroy(); + childScope = scope.$new(); + animate.leave(element.contents(), element); + + var contents = jqLite('
    ').html(response).contents(); + + animate.enter(contents, element); + $compile(contents)(childScope); + + if (isDefined(autoScrollExp) && (!autoScrollExp || scope.$eval(autoScrollExp))) { + $anchorScroll(); + } + + childScope.$emit('$includeContentLoaded'); + scope.$eval(onloadExp); + }).error(function() { + if (thisChangeId === changeCounter) clearContent(); + }); + scope.$emit('$includeContentRequested'); + } else { + clearContent(); + } + }); + }; + } + }; +}]; + +/** + * @ngdoc directive + * @name ng.directive:ngInit + * + * @description + * The `ngInit` directive specifies initialization tasks to be executed + * before the template enters execution mode during bootstrap. + * + * @element ANY + * @param {expression} ngInit {@link guide/expression Expression} to eval. + * + * @example + + +
    + {{greeting}} {{person}}! +
    +
    + + it('should check greeting', function() { + expect(binding('greeting')).toBe('Hello'); + expect(binding('person')).toBe('World'); + }); + +
    + */ +var ngInitDirective = ngDirective({ + compile: function() { + return { + pre: function(scope, element, attrs) { + scope.$eval(attrs.ngInit); + } + } + } +}); + +/** + * @ngdoc directive + * @name ng.directive:ngNonBindable + * @priority 1000 + * + * @description + * Sometimes it is necessary to write code which looks like bindings but which should be left alone + * by angular. Use `ngNonBindable` to make angular ignore a chunk of HTML. + * + * @element ANY + * + * @example + * In this example there are two location where a simple binding (`{{}}`) is present, but the one + * wrapped in `ngNonBindable` is left alone. + * + * @example + + +
    Normal: {{1 + 2}}
    +
    Ignored: {{1 + 2}}
    +
    + + it('should check ng-non-bindable', function() { + expect(using('.doc-example-live').binding('1 + 2')).toBe('3'); + expect(using('.doc-example-live').element('div:last').text()). + toMatch(/1 \+ 2/); + }); + +
    + */ +var ngNonBindableDirective = ngDirective({ terminal: true, priority: 1000 }); + +/** + * @ngdoc directive + * @name ng.directive:ngPluralize + * @restrict EA + * + * @description + * # Overview + * `ngPluralize` is a directive that displays messages according to en-US localization rules. + * These rules are bundled with angular.js and the rules can be overridden + * (see {@link guide/i18n Angular i18n} dev guide). You configure ngPluralize directive + * by specifying the mappings between + * {@link http://unicode.org/repos/cldr-tmp/trunk/diff/supplemental/language_plural_rules.html + * plural categories} and the strings to be displayed. + * + * # Plural categories and explicit number rules + * There are two + * {@link http://unicode.org/repos/cldr-tmp/trunk/diff/supplemental/language_plural_rules.html + * plural categories} in Angular's default en-US locale: "one" and "other". + * + * While a plural category may match many numbers (for example, in en-US locale, "other" can match + * any number that is not 1), an explicit number rule can only match one number. For example, the + * explicit number rule for "3" matches the number 3. You will see the use of plural categories + * and explicit number rules throughout later parts of this documentation. + * + * # Configuring ngPluralize + * You configure ngPluralize by providing 2 attributes: `count` and `when`. + * You can also provide an optional attribute, `offset`. + * + * The value of the `count` attribute can be either a string or an {@link guide/expression + * Angular expression}; these are evaluated on the current scope for its bound value. + * + * The `when` attribute specifies the mappings between plural categories and the actual + * string to be displayed. The value of the attribute should be a JSON object so that Angular + * can interpret it correctly. + * + * The following example shows how to configure ngPluralize: + * + *
    + * 
    + * 
    + *
    + * + * In the example, `"0: Nobody is viewing."` is an explicit number rule. If you did not + * specify this rule, 0 would be matched to the "other" category and "0 people are viewing" + * would be shown instead of "Nobody is viewing". You can specify an explicit number rule for + * other numbers, for example 12, so that instead of showing "12 people are viewing", you can + * show "a dozen people are viewing". + * + * You can use a set of closed braces(`{}`) as a placeholder for the number that you want substituted + * into pluralized strings. In the previous example, Angular will replace `{}` with + * `{{personCount}}`. The closed braces `{}` is a placeholder + * for {{numberExpression}}. + * + * # Configuring ngPluralize with offset + * The `offset` attribute allows further customization of pluralized text, which can result in + * a better user experience. For example, instead of the message "4 people are viewing this document", + * you might display "John, Kate and 2 others are viewing this document". + * The offset attribute allows you to offset a number by any desired value. + * Let's take a look at an example: + * + *
    + * 
    + * 
    + * 
    + * + * Notice that we are still using two plural categories(one, other), but we added + * three explicit number rules 0, 1 and 2. + * When one person, perhaps John, views the document, "John is viewing" will be shown. + * When three people view the document, no explicit number rule is found, so + * an offset of 2 is taken off 3, and Angular uses 1 to decide the plural category. + * In this case, plural category 'one' is matched and "John, Marry and one other person are viewing" + * is shown. + * + * Note that when you specify offsets, you must provide explicit number rules for + * numbers from 0 up to and including the offset. If you use an offset of 3, for example, + * you must provide explicit number rules for 0, 1, 2 and 3. You must also provide plural strings for + * plural categories "one" and "other". + * + * @param {string|expression} count The variable to be bounded to. + * @param {string} when The mapping between plural category to its corresponding strings. + * @param {number=} offset Offset to deduct from the total number. + * + * @example + + + +
    + Person 1:
    + Person 2:
    + Number of People:
    + + + Without Offset: + +
    + + + With Offset(2): + + +
    +
    + + it('should show correct pluralized string', function() { + expect(element('.doc-example-live ng-pluralize:first').text()). + toBe('1 person is viewing.'); + expect(element('.doc-example-live ng-pluralize:last').text()). + toBe('Igor is viewing.'); + + using('.doc-example-live').input('personCount').enter('0'); + expect(element('.doc-example-live ng-pluralize:first').text()). + toBe('Nobody is viewing.'); + expect(element('.doc-example-live ng-pluralize:last').text()). + toBe('Nobody is viewing.'); + + using('.doc-example-live').input('personCount').enter('2'); + expect(element('.doc-example-live ng-pluralize:first').text()). + toBe('2 people are viewing.'); + expect(element('.doc-example-live ng-pluralize:last').text()). + toBe('Igor and Misko are viewing.'); + + using('.doc-example-live').input('personCount').enter('3'); + expect(element('.doc-example-live ng-pluralize:first').text()). + toBe('3 people are viewing.'); + expect(element('.doc-example-live ng-pluralize:last').text()). + toBe('Igor, Misko and one other person are viewing.'); + + using('.doc-example-live').input('personCount').enter('4'); + expect(element('.doc-example-live ng-pluralize:first').text()). + toBe('4 people are viewing.'); + expect(element('.doc-example-live ng-pluralize:last').text()). + toBe('Igor, Misko and 2 other people are viewing.'); + }); + + it('should show data-binded names', function() { + using('.doc-example-live').input('personCount').enter('4'); + expect(element('.doc-example-live ng-pluralize:last').text()). + toBe('Igor, Misko and 2 other people are viewing.'); + + using('.doc-example-live').input('person1').enter('Di'); + using('.doc-example-live').input('person2').enter('Vojta'); + expect(element('.doc-example-live ng-pluralize:last').text()). + toBe('Di, Vojta and 2 other people are viewing.'); + }); + +
    + */ +var ngPluralizeDirective = ['$locale', '$interpolate', function($locale, $interpolate) { + var BRACE = /{}/g; + return { + restrict: 'EA', + link: function(scope, element, attr) { + var numberExp = attr.count, + whenExp = element.attr(attr.$attr.when), // this is because we have {{}} in attrs + offset = attr.offset || 0, + whens = scope.$eval(whenExp), + whensExpFns = {}, + startSymbol = $interpolate.startSymbol(), + endSymbol = $interpolate.endSymbol(); + + forEach(whens, function(expression, key) { + whensExpFns[key] = + $interpolate(expression.replace(BRACE, startSymbol + numberExp + '-' + + offset + endSymbol)); + }); + + scope.$watch(function ngPluralizeWatch() { + var value = parseFloat(scope.$eval(numberExp)); + + if (!isNaN(value)) { + //if explicit number rule such as 1, 2, 3... is defined, just use it. Otherwise, + //check it against pluralization rules in $locale service + if (!(value in whens)) value = $locale.pluralCat(value - offset); + return whensExpFns[value](scope, element, true); + } else { + return ''; + } + }, function ngPluralizeWatchAction(newVal) { + element.text(newVal); + }); + } + }; +}]; + +/** + * @ngdoc directive + * @name ng.directive:ngRepeat + * + * @description + * The `ngRepeat` directive instantiates a template once per item from a collection. Each template + * instance gets its own scope, where the given loop variable is set to the current collection item, + * and `$index` is set to the item index or key. + * + * Special properties are exposed on the local scope of each template instance, including: + * + * * `$index` – `{number}` – iterator offset of the repeated element (0..length-1) + * * `$first` – `{boolean}` – true if the repeated element is first in the iterator. + * * `$middle` – `{boolean}` – true if the repeated element is between the first and last in the iterator. + * * `$last` – `{boolean}` – true if the repeated element is last in the iterator. + * + * Additionally, you can also provide animations via the ngAnimate attribute to animate the **enter**, + * **leave** and **move** effects. + * + * @animations + * enter - when a new item is added to the list or when an item is revealed after a filter + * leave - when an item is removed from the list or when an item is filtered out + * move - when an adjacent item is filtered out causing a reorder or when the item contents are reordered + * + * @element ANY + * @scope + * @priority 1000 + * @param {repeat_expression} ngRepeat The expression indicating how to enumerate a collection. These + * formats are currently supported: + * + * * `variable in expression` – where variable is the user defined loop variable and `expression` + * is a scope expression giving the collection to enumerate. + * + * For example: `track in cd.tracks`. + * + * * `(key, value) in expression` – where `key` and `value` can be any user defined identifiers, + * and `expression` is the scope expression giving the collection to enumerate. + * + * For example: `(name, age) in {'adam':10, 'amalie':12}`. + * + * * `variable in expression track by tracking_expression` – You can also provide an optional tracking function + * which can be used to associate the objects in the collection with the DOM elements. If no tractking function + * is specified the ng-repeat associates elements by identity in the collection. It is an error to have + * more then one tractking function to resolve to the same key. (This would mean that two distinct objects are + * mapped to the same DOM element, which is not possible.) + * + * For example: `item in items` is equivalent to `item in items track by $id(item)'. This implies that the DOM elements + * will be associated by item identity in the array. + * + * For example: `item in items track by $id(item)`. A built in `$id()` function can be used to assign a unique + * `$$hashKey` property to each item in the array. This property is then used as a key to associated DOM elements + * with the corresponding item in the array by identity. Moving the same object in array would move the DOM + * element in the same way ian the DOM. + * + * For example: `item in items track by item.id` Is a typical pattern when the items come from the database. In this + * case the object identity does not matter. Two objects are considered equivalent as long as their `id` + * property is same. + * + * @example + * This example initializes the scope to a list of names and + * then uses `ngRepeat` to display every person: + + +
    + I have {{friends.length}} friends. They are: + +
      +
    • + [{{$index + 1}}] {{friend.name}} who is {{friend.age}} years old. +
    • +
    +
    +
    + + .example-repeat-enter, + .example-repeat-leave, + .example-repeat-move { + -webkit-transition:all linear 0.5s; + -moz-transition:all linear 0.5s; + -ms-transition:all linear 0.5s; + -o-transition:all linear 0.5s; + transition:all linear 0.5s; + } + + .example-repeat-enter { + line-height:0; + opacity:0; + } + .example-repeat-enter.example-repeat-enter-active { + line-height:20px; + opacity:1; + } + + .example-repeat-leave { + opacity:1; + line-height:20px; + } + .example-repeat-leave.example-repeat-leave-active { + opacity:0; + line-height:0; + } + + .example-repeat-move { } + .example-repeat-move.example-repeat-move-active { } + + + it('should render initial data set', function() { + var r = using('.doc-example-live').repeater('ul li'); + expect(r.count()).toBe(10); + expect(r.row(0)).toEqual(["1","John","25"]); + expect(r.row(1)).toEqual(["2","Jessie","30"]); + expect(r.row(9)).toEqual(["10","Samantha","60"]); + expect(binding('friends.length')).toBe("10"); + }); + + it('should update repeater when filter predicate changes', function() { + var r = using('.doc-example-live').repeater('ul li'); + expect(r.count()).toBe(10); + + input('q').enter('ma'); + + expect(r.count()).toBe(2); + expect(r.row(0)).toEqual(["1","Mary","28"]); + expect(r.row(1)).toEqual(["2","Samantha","60"]); + }); + +
    + */ +var ngRepeatDirective = ['$parse', '$animator', function($parse, $animator) { + var NG_REMOVED = '$$NG_REMOVED'; + return { + transclude: 'element', + priority: 1000, + terminal: true, + compile: function(element, attr, linker) { + return function($scope, $element, $attr){ + var animate = $animator($scope, $attr); + var expression = $attr.ngRepeat; + var match = expression.match(/^\s*(.+)\s+in\s+(.*?)\s*(\s+track\s+by\s+(.+)\s*)?$/), + trackByExp, trackByExpGetter, trackByIdFn, lhs, rhs, valueIdentifier, keyIdentifier, + hashFnLocals = {$id: hashKey}; + + if (!match) { + throw Error("Expected ngRepeat in form of '_item_ in _collection_[ track by _id_]' but got '" + + expression + "'."); + } + + lhs = match[1]; + rhs = match[2]; + trackByExp = match[4]; + + if (trackByExp) { + trackByExpGetter = $parse(trackByExp); + trackByIdFn = function(key, value, index) { + // assign key, value, and $index to the locals so that they can be used in hash functions + if (keyIdentifier) hashFnLocals[keyIdentifier] = key; + hashFnLocals[valueIdentifier] = value; + hashFnLocals.$index = index; + return trackByExpGetter($scope, hashFnLocals); + }; + } else { + trackByIdFn = function(key, value) { + return hashKey(value); + } + } + + match = lhs.match(/^(?:([\$\w]+)|\(([\$\w]+)\s*,\s*([\$\w]+)\))$/); + if (!match) { + throw Error("'item' in 'item in collection' should be identifier or (key, value) but got '" + + lhs + "'."); + } + valueIdentifier = match[3] || match[1]; + keyIdentifier = match[2]; + + // Store a list of elements from previous run. This is a hash where key is the item from the + // iterator, and the value is objects with following properties. + // - scope: bound scope + // - element: previous element. + // - index: position + var lastBlockMap = {}; + + //watch props + $scope.$watchCollection(rhs, function ngRepeatAction(collection){ + var index, length, + cursor = $element, // current position of the node + nextCursor, + // Same as lastBlockMap but it has the current state. It will become the + // lastBlockMap on the next iteration. + nextBlockMap = {}, + arrayLength, + childScope, + key, value, // key/value of iteration + trackById, + collectionKeys, + block, // last object information {scope, element, id} + nextBlockOrder = []; + + + if (isArrayLike(collection)) { + collectionKeys = collection; + } else { + // if object, extract keys, sort them and use to determine order of iteration over obj props + collectionKeys = []; + for (key in collection) { + if (collection.hasOwnProperty(key) && key.charAt(0) != '$') { + collectionKeys.push(key); + } + } + collectionKeys.sort(); + } + + arrayLength = collectionKeys.length; + + // locate existing items + length = nextBlockOrder.length = collectionKeys.length; + for(index = 0; index < length; index++) { + key = (collection === collectionKeys) ? index : collectionKeys[index]; + value = collection[key]; + trackById = trackByIdFn(key, value, index); + if(lastBlockMap.hasOwnProperty(trackById)) { + block = lastBlockMap[trackById] + delete lastBlockMap[trackById]; + nextBlockMap[trackById] = block; + nextBlockOrder[index] = block; + } else if (nextBlockMap.hasOwnProperty(trackById)) { + // restore lastBlockMap + forEach(nextBlockOrder, function(block) { + if (block && block.element) lastBlockMap[block.id] = block; + }); + // This is a duplicate and we need to throw an error + throw new Error('Duplicates in a repeater are not allowed. Repeater: ' + expression + + ' key: ' + trackById); + } else { + // new never before seen block + nextBlockOrder[index] = { id: trackById }; + nextBlockMap[trackById] = false; + } + } + + // remove existing items + for (key in lastBlockMap) { + if (lastBlockMap.hasOwnProperty(key)) { + block = lastBlockMap[key]; + animate.leave(block.element); + block.element[0][NG_REMOVED] = true; + block.scope.$destroy(); + } + } + + // we are not using forEach for perf reasons (trying to avoid #call) + for (index = 0, length = collectionKeys.length; index < length; index++) { + key = (collection === collectionKeys) ? index : collectionKeys[index]; + value = collection[key]; + block = nextBlockOrder[index]; + + if (block.element) { + // if we have already seen this object, then we need to reuse the + // associated scope/element + childScope = block.scope; + + nextCursor = cursor[0]; + do { + nextCursor = nextCursor.nextSibling; + } while(nextCursor && nextCursor[NG_REMOVED]); + + if (block.element[0] == nextCursor) { + // do nothing + cursor = block.element; + } else { + // existing item which got moved + animate.move(block.element, null, cursor); + cursor = block.element; + } + } else { + // new item which we don't know about + childScope = $scope.$new(); + } + + childScope[valueIdentifier] = value; + if (keyIdentifier) childScope[keyIdentifier] = key; + childScope.$index = index; + childScope.$first = (index === 0); + childScope.$last = (index === (arrayLength - 1)); + childScope.$middle = !(childScope.$first || childScope.$last); + + if (!block.element) { + linker(childScope, function(clone) { + animate.enter(clone, null, cursor); + cursor = clone; + block.scope = childScope; + block.element = clone; + nextBlockMap[block.id] = block; + }); + } + } + lastBlockMap = nextBlockMap; + }); + }; + } + }; +}]; + +/** + * @ngdoc directive + * @name ng.directive:ngShow + * + * @description + * The `ngShow` and `ngHide` directives show or hide a portion of the DOM tree (HTML) + * conditionally based on **"truthy"** values evaluated within an {expression}. In other + * words, if the expression assigned to **ngShow evaluates to a true value** then **the element is set to visible** + * (via `display:block` in css) and **if false** then **the element is set to hidden** (so display:none). + * With ngHide this is the reverse whereas true values cause the element itself to become + * hidden. + * + * Additionally, you can also provide animations via the ngAnimate attribute to animate the **show** + * and **hide** effects. + * + * @animations + * show - happens after the ngShow expression evaluates to a truthy value and the contents are set to visible + * hide - happens before the ngShow expression evaluates to a non truthy value and just before the contents are set to hidden + * + * @element ANY + * @param {expression} ngShow If the {@link guide/expression expression} is truthy + * then the element is shown or hidden respectively. + * + * @example + + + Click me:
    +
    + Show: + + I show up when your checkbox is checked. + +
    +
    + Hide: + + I hide when your checkbox is checked. + +
    +
    + + .example-show, .example-hide { + -webkit-transition:all linear 0.5s; + -moz-transition:all linear 0.5s; + -ms-transition:all linear 0.5s; + -o-transition:all linear 0.5s; + transition:all linear 0.5s; + } + + .example-show { + line-height:0; + opacity:0; + padding:0 10px; + } + .example-show-active.example-show-active { + line-height:20px; + opacity:1; + padding:10px; + border:1px solid black; + background:white; + } + + .example-hide { + line-height:20px; + opacity:1; + padding:10px; + border:1px solid black; + background:white; + } + .example-hide-active.example-hide-active { + line-height:0; + opacity:0; + padding:0 10px; + } + + .check-element { + padding:10px; + border:1px solid black; + background:white; + } + + + it('should check ng-show / ng-hide', function() { + expect(element('.doc-example-live span:first:hidden').count()).toEqual(1); + expect(element('.doc-example-live span:last:visible').count()).toEqual(1); + + input('checked').check(); + + expect(element('.doc-example-live span:first:visible').count()).toEqual(1); + expect(element('.doc-example-live span:last:hidden').count()).toEqual(1); + }); + +
    + */ +//TODO(misko): refactor to remove element from the DOM +var ngShowDirective = ['$animator', function($animator) { + return function(scope, element, attr) { + var animate = $animator(scope, attr); + scope.$watch(attr.ngShow, function ngShowWatchAction(value){ + animate[toBoolean(value) ? 'show' : 'hide'](element); + }); + }; +}]; + + +/** + * @ngdoc directive + * @name ng.directive:ngHide + * + * @description + * The `ngShow` and `ngHide` directives show or hide a portion of the DOM tree (HTML) + * conditionally based on **"truthy"** values evaluated within an {expression}. In other + * words, if the expression assigned to **ngShow evaluates to a true value** then **the element is set to visible** + * (via `display:block` in css) and **if false** then **the element is set to hidden** (so display:none). + * With ngHide this is the reverse whereas true values cause the element itself to become + * hidden. + * + * Additionally, you can also provide animations via the ngAnimate attribute to animate the **show** + * and **hide** effects. + * + * @animations + * show - happens after the ngHide expression evaluates to a non truthy value and the contents are set to visible + * hide - happens after the ngHide expression evaluates to a truthy value and just before the contents are set to hidden + * + * @element ANY + * @param {expression} ngHide If the {@link guide/expression expression} is truthy then + * the element is shown or hidden respectively. + * + * @example + + + Click me:
    +
    + Show: + + I show up when your checkbox is checked. + +
    +
    + Hide: + + I hide when your checkbox is checked. + +
    +
    + + .example-show, .example-hide { + -webkit-transition:all linear 0.5s; + -moz-transition:all linear 0.5s; + -ms-transition:all linear 0.5s; + -o-transition:all linear 0.5s; + transition:all linear 0.5s; + } + + .example-show { + line-height:0; + opacity:0; + padding:0 10px; + } + .example-show.example-show-active { + line-height:20px; + opacity:1; + padding:10px; + border:1px solid black; + background:white; + } + + .example-hide { + line-height:20px; + opacity:1; + padding:10px; + border:1px solid black; + background:white; + } + .example-hide.example-hide-active { + line-height:0; + opacity:0; + padding:0 10px; + } + + .check-element { + padding:10px; + border:1px solid black; + background:white; + } + + + it('should check ng-show / ng-hide', function() { + expect(element('.doc-example-live .check-element:first:hidden').count()).toEqual(1); + expect(element('.doc-example-live .check-element:last:visible').count()).toEqual(1); + + input('checked').check(); + + expect(element('.doc-example-live .check-element:first:visible').count()).toEqual(1); + expect(element('.doc-example-live .check-element:last:hidden').count()).toEqual(1); + }); + +
    + */ +//TODO(misko): refactor to remove element from the DOM +var ngHideDirective = ['$animator', function($animator) { + return function(scope, element, attr) { + var animate = $animator(scope, attr); + scope.$watch(attr.ngHide, function ngHideWatchAction(value){ + animate[toBoolean(value) ? 'hide' : 'show'](element); + }); + }; +}]; + +/** + * @ngdoc directive + * @name ng.directive:ngStyle + * + * @description + * The `ngStyle` directive allows you to set CSS style on an HTML element conditionally. + * + * @element ANY + * @param {expression} ngStyle {@link guide/expression Expression} which evals to an + * object whose keys are CSS style names and values are corresponding values for those CSS + * keys. + * + * @example + + + + +
    + Sample Text +
    myStyle={{myStyle}}
    +
    + + span { + color: black; + } + + + it('should check ng-style', function() { + expect(element('.doc-example-live span').css('color')).toBe('rgb(0, 0, 0)'); + element('.doc-example-live :button[value=set]').click(); + expect(element('.doc-example-live span').css('color')).toBe('rgb(255, 0, 0)'); + element('.doc-example-live :button[value=clear]').click(); + expect(element('.doc-example-live span').css('color')).toBe('rgb(0, 0, 0)'); + }); + +
    + */ +var ngStyleDirective = ngDirective(function(scope, element, attr) { + scope.$watch(attr.ngStyle, function ngStyleWatchAction(newStyles, oldStyles) { + if (oldStyles && (newStyles !== oldStyles)) { + forEach(oldStyles, function(val, style) { element.css(style, '');}); + } + if (newStyles) element.css(newStyles); + }, true); +}); + +/** + * @ngdoc directive + * @name ng.directive:ngSwitch + * @restrict EA + * + * @description + * The ngSwitch directive is used to conditionally swap DOM structure on your template based on a scope expression. + * Elements within ngSwitch but without ngSwitchWhen or ngSwitchDefault directives will be preserved at the location + * as specified in the template. + * + * The directive itself works similar to ngInclude, however, instead of downloading template code (or loading it + * from the template cache), ngSwitch simply choses one of the nested elements and makes it visible based on which element + * matches the value obtained from the evaluated expression. In other words, you define a container element + * (where you place the directive), place an expression on the **on="..." attribute** + * (or the **ng-switch="..." attribute**), define any inner elements inside of the directive and place + * a when attribute per element. The when attribute is used to inform ngSwitch which element to display when the on + * expression is evaluated. If a matching expression is not found via a when attribute then an element with the default + * attribute is displayed. + * + * Additionally, you can also provide animations via the ngAnimate attribute to animate the **enter** + * and **leave** effects. + * + * @animations + * enter - happens after the ngSwtich contents change and the matched child element is placed inside the container + * leave - happens just after the ngSwitch contents change and just before the former contents are removed from the DOM + * + * @usage + * + * ... + * ... + * ... + * + * + * @scope + * @param {*} ngSwitch|on expression to match against ng-switch-when. + * @paramDescription + * On child elements add: + * + * * `ngSwitchWhen`: the case statement to match against. If match then this + * case will be displayed. If the same match appears multiple times, all the + * elements will be displayed. + * * `ngSwitchDefault`: the default case when no other case match. If there + * are multiple default cases, all of them will be displayed when no other + * case match. + * + * + * @example + + +
    + + selection={{selection}} +
    +
    +
    Settings Div
    +
    Home Span
    +
    default
    +
    +
    +
    + + function Ctrl($scope) { + $scope.items = ['settings', 'home', 'other']; + $scope.selection = $scope.items[0]; + } + + + .example-leave, .example-enter { + -webkit-transition:all cubic-bezier(0.250, 0.460, 0.450, 0.940) 0.5s; + -moz-transition:all cubic-bezier(0.250, 0.460, 0.450, 0.940) 0.5s; + -ms-transition:all cubic-bezier(0.250, 0.460, 0.450, 0.940) 0.5s; + -o-transition:all cubic-bezier(0.250, 0.460, 0.450, 0.940) 0.5s; + transition:all cubic-bezier(0.250, 0.460, 0.450, 0.940) 0.5s; + + position:absolute; + top:0; + left:0; + right:0; + bottom:0; + } + + .example-animate-container > * { + display:block; + padding:10px; + } + + .example-enter { + top:-50px; + } + .example-enter.example-enter-active { + top:0; + } + + .example-leave { + top:0; + } + .example-leave.example-leave-active { + top:50px; + } + + + it('should start in settings', function() { + expect(element('.doc-example-live [ng-switch]').text()).toMatch(/Settings Div/); + }); + it('should change to home', function() { + select('selection').option('home'); + expect(element('.doc-example-live [ng-switch]').text()).toMatch(/Home Span/); + }); + it('should select default', function() { + select('selection').option('other'); + expect(element('.doc-example-live [ng-switch]').text()).toMatch(/default/); + }); + +
    + */ +var ngSwitchDirective = ['$animator', function($animator) { + return { + restrict: 'EA', + require: 'ngSwitch', + + // asks for $scope to fool the BC controller module + controller: ['$scope', function ngSwitchController() { + this.cases = {}; + }], + link: function(scope, element, attr, ngSwitchController) { + var animate = $animator(scope, attr); + var watchExpr = attr.ngSwitch || attr.on, + selectedTranscludes, + selectedElements, + selectedScopes = []; + + scope.$watch(watchExpr, function ngSwitchWatchAction(value) { + for (var i= 0, ii=selectedScopes.length; i + + +
    +
    +
    + {{text}} +
    +
    + + it('should have transcluded', function() { + input('title').enter('TITLE'); + input('text').enter('TEXT'); + expect(binding('title')).toEqual('TITLE'); + expect(binding('text')).toEqual('TEXT'); + }); + + + * + */ +var ngTranscludeDirective = ngDirective({ + controller: ['$transclude', '$element', function($transclude, $element) { + $transclude(function(clone) { + $element.append(clone); + }); + }] +}); + +/** + * @ngdoc directive + * @name ng.directive:ngView + * @restrict ECA + * + * @description + * # Overview + * `ngView` is a directive that complements the {@link ng.$route $route} service by + * including the rendered template of the current route into the main layout (`index.html`) file. + * Every time the current route changes, the included view changes with it according to the + * configuration of the `$route` service. + * + * Additionally, you can also provide animations via the ngAnimate attribute to animate the **enter** + * and **leave** effects. + * + * @animations + * enter - happens just after the ngView contents are changed (when the new view DOM element is inserted into the DOM) + * leave - happens just after the current ngView contents change and just before the former contents are removed from the DOM + * + * @scope + * @example + + +
    + Choose: + Moby | + Moby: Ch1 | + Gatsby | + Gatsby: Ch4 | + Scarlet Letter
    + +
    +
    + +
    $location.path() = {{main.$location.path()}}
    +
    $route.current.templateUrl = {{main.$route.current.templateUrl}}
    +
    $route.current.params = {{main.$route.current.params}}
    +
    $route.current.scope.name = {{main.$route.current.scope.name}}
    +
    $routeParams = {{main.$routeParams}}
    +
    +
    + + +
    + controller: {{book.name}}
    + Book Id: {{book.params.bookId}}
    +
    +
    + + +
    + controller: {{chapter.name}}
    + Book Id: {{chapter.params.bookId}}
    + Chapter Id: {{chapter.params.chapterId}} +
    +
    + + + .example-leave, .example-enter { + -webkit-transition:all cubic-bezier(0.250, 0.460, 0.450, 0.940) 1.5s; + -moz-transition:all cubic-bezier(0.250, 0.460, 0.450, 0.940) 1.5s; + -ms-transition:all cubic-bezier(0.250, 0.460, 0.450, 0.940) 1.5s; + -o-transition:all cubic-bezier(0.250, 0.460, 0.450, 0.940) 1.5s; + transition:all cubic-bezier(0.250, 0.460, 0.450, 0.940) 1.5s; + } + + .example-animate-container { + position:relative; + height:100px; + } + + .example-animate-container > * { + display:block; + width:100%; + border-left:1px solid black; + + position:absolute; + top:0; + left:0; + right:0; + bottom:0; + padding:10px; + } + + .example-enter { + left:100%; + } + .example-enter.example-enter-active { + left:0; + } + + .example-leave { } + .example-leave.example-leave-active { + left:-100%; + } + + + + angular.module('ngView', [], function($routeProvider, $locationProvider) { + $routeProvider.when('/Book/:bookId', { + templateUrl: 'book.html', + controller: BookCntl, + controllerAs: 'book' + }); + $routeProvider.when('/Book/:bookId/ch/:chapterId', { + templateUrl: 'chapter.html', + controller: ChapterCntl, + controllerAs: 'chapter' + }); + + // configure html5 to get links working on jsfiddle + $locationProvider.html5Mode(true); + }); + + function MainCntl($route, $routeParams, $location) { + this.$route = $route; + this.$location = $location; + this.$routeParams = $routeParams; + } + + function BookCntl($routeParams) { + this.name = "BookCntl"; + this.params = $routeParams; + } + + function ChapterCntl($routeParams) { + this.name = "ChapterCntl"; + this.params = $routeParams; + } + + + + it('should load and compile correct template', function() { + element('a:contains("Moby: Ch1")').click(); + var content = element('.doc-example-live [ng-view]').text(); + expect(content).toMatch(/controller\: ChapterCntl/); + expect(content).toMatch(/Book Id\: Moby/); + expect(content).toMatch(/Chapter Id\: 1/); + + element('a:contains("Scarlet")').click(); + content = element('.doc-example-live [ng-view]').text(); + expect(content).toMatch(/controller\: BookCntl/); + expect(content).toMatch(/Book Id\: Scarlet/); + }); + +
    + */ + + +/** + * @ngdoc event + * @name ng.directive:ngView#$viewContentLoaded + * @eventOf ng.directive:ngView + * @eventType emit on the current ngView scope + * @description + * Emitted every time the ngView content is reloaded. + */ +var ngViewDirective = ['$http', '$templateCache', '$route', '$anchorScroll', '$compile', + '$controller', '$animator', + function($http, $templateCache, $route, $anchorScroll, $compile, + $controller, $animator) { + return { + restrict: 'ECA', + terminal: true, + link: function(scope, element, attr) { + var lastScope, + onloadExp = attr.onload || '', + animate = $animator(scope, attr); + + scope.$on('$routeChangeSuccess', update); + update(); + + + function destroyLastScope() { + if (lastScope) { + lastScope.$destroy(); + lastScope = null; + } + } + + function clearContent() { + animate.leave(element.contents(), element); + destroyLastScope(); + } + + function update() { + var locals = $route.current && $route.current.locals, + template = locals && locals.$template; + + if (template) { + clearContent(); + var enterElements = jqLite('
    ').html(template).contents(); + animate.enter(enterElements, element); + + var link = $compile(enterElements), + current = $route.current, + controller; + + lastScope = current.scope = scope.$new(); + if (current.controller) { + locals.$scope = lastScope; + controller = $controller(current.controller, locals); + if (current.controllerAs) { + lastScope[current.controllerAs] = controller; + } + element.children().data('$ngControllerController', controller); + } + + link(lastScope); + lastScope.$emit('$viewContentLoaded'); + lastScope.$eval(onloadExp); + + // $anchorScroll might listen on event... + $anchorScroll(); + } else { + clearContent(); + } + } + } + }; +}]; + +/** + * @ngdoc directive + * @name ng.directive:script + * + * @description + * Load content of a script tag, with type `text/ng-template`, into `$templateCache`, so that the + * template can be used by `ngInclude`, `ngView` or directive templates. + * + * @restrict E + * @param {'text/ng-template'} type must be set to `'text/ng-template'` + * + * @example + + + + + Load inlined template +
    +
    + + it('should load template defined inside script tag', function() { + element('#tpl-link').click(); + expect(element('#tpl-content').text()).toMatch(/Content of the template/); + }); + +
    + */ +var scriptDirective = ['$templateCache', function($templateCache) { + return { + restrict: 'E', + terminal: true, + compile: function(element, attr) { + if (attr.type == 'text/ng-template') { + var templateUrl = attr.id, + // IE is not consistent, in scripts we have to read .text but in other nodes we have to read .textContent + text = element[0].text; + + $templateCache.put(templateUrl, text); + } + } + }; +}]; + +/** + * @ngdoc directive + * @name ng.directive:select + * @restrict E + * + * @description + * HTML `SELECT` element with angular data-binding. + * + * # `ngOptions` + * + * Optionally `ngOptions` attribute can be used to dynamically generate a list of `
    + + + it('should check ng-options', function() { + expect(binding('{selected_color:color}')).toMatch('red'); + select('color').option('0'); + expect(binding('{selected_color:color}')).toMatch('black'); + using('.nullable').select('color').option(''); + expect(binding('{selected_color:color}')).toMatch('null'); + }); + + + */ + +var ngOptionsDirective = valueFn({ terminal: true }); +var selectDirective = ['$compile', '$parse', function($compile, $parse) { + //0000111110000000000022220000000000000000000000333300000000000000444444444444444440000000005555555555555555500000006666666666666666600000000000000007777000000000000000000088888 + var NG_OPTIONS_REGEXP = /^\s*(.*?)(?:\s+as\s+(.*?))?(?:\s+group\s+by\s+(.*))?\s+for\s+(?:([\$\w][\$\w\d]*)|(?:\(\s*([\$\w][\$\w\d]*)\s*,\s*([\$\w][\$\w\d]*)\s*\)))\s+in\s+(.*?)(?:\s+track\s+by\s+(.*?))?$/, + nullModelCtrl = {$setViewValue: noop}; + + return { + restrict: 'E', + require: ['select', '?ngModel'], + controller: ['$element', '$scope', '$attrs', function($element, $scope, $attrs) { + var self = this, + optionsMap = {}, + ngModelCtrl = nullModelCtrl, + nullOption, + unknownOption; + + + self.databound = $attrs.ngModel; + + + self.init = function(ngModelCtrl_, nullOption_, unknownOption_) { + ngModelCtrl = ngModelCtrl_; + nullOption = nullOption_; + unknownOption = unknownOption_; + } + + + self.addOption = function(value) { + optionsMap[value] = true; + + if (ngModelCtrl.$viewValue == value) { + $element.val(value); + if (unknownOption.parent()) unknownOption.remove(); + } + }; + + + self.removeOption = function(value) { + if (this.hasOption(value)) { + delete optionsMap[value]; + if (ngModelCtrl.$viewValue == value) { + this.renderUnknownOption(value); + } + } + }; + + + self.renderUnknownOption = function(val) { + var unknownVal = '? ' + hashKey(val) + ' ?'; + unknownOption.val(unknownVal); + $element.prepend(unknownOption); + $element.val(unknownVal); + unknownOption.prop('selected', true); // needed for IE + } + + + self.hasOption = function(value) { + return optionsMap.hasOwnProperty(value); + } + + $scope.$on('$destroy', function() { + // disable unknown option so that we don't do work when the whole select is being destroyed + self.renderUnknownOption = noop; + }); + }], + + link: function(scope, element, attr, ctrls) { + // if ngModel is not defined, we don't need to do anything + if (!ctrls[1]) return; + + var selectCtrl = ctrls[0], + ngModelCtrl = ctrls[1], + multiple = attr.multiple, + optionsExp = attr.ngOptions, + nullOption = false, // if false, user will not be able to select it (used by ngOptions) + emptyOption, + // we can't just jqLite('