+ Use this area to provide additional information.
+
+
+
+ Use this area to provide additional information.
+
+
+
+ Use this area to provide additional information.
+
+
+
+
\ No newline at end of file
diff --git a/Account/AccountLockedOut.cshtml b/Account/AccountLockedOut.cshtml
new file mode 100644
index 0000000..34d1656
--- /dev/null
+++ b/Account/AccountLockedOut.cshtml
@@ -0,0 +1,14 @@
+@{
+ Layout = "~/_SiteLayout.cshtml";
+ Page.Title = "Account Locked";
+}
+
+
+
@Page.Title.
+
Your account was locked out due to too many invalid log in attempts.
+
+
+
+ Don't worry, the account will automatically be unlocked in 60 seconds.
+ Please try again after that time has passed.
+
\ No newline at end of file
diff --git a/Account/Confirm.cshtml b/Account/Confirm.cshtml
new file mode 100644
index 0000000..8149ffc
--- /dev/null
+++ b/Account/Confirm.cshtml
@@ -0,0 +1,38 @@
+@{
+ Layout = "~/_SiteLayout.cshtml";
+ Page.Title = "Registration Confirmation Page";
+
+ string message = "";
+ var confirmationToken = Request["confirmationCode"];
+
+ WebSecurity.Logout();
+ if (!confirmationToken.IsEmpty()) {
+ if (WebSecurity.ConfirmAccount(confirmationToken)) {
+ message = "Registration Confirmed! Click on the log in tab to log in to the site.";
+ } else {
+ message = "Could not confirm your registration info.";
+ }
+ }
+}
+
+
+
@Page.Title.
+
Use the form below to confirm your account.
+
+
+@if (!message.IsEmpty()) {
+
@message
+} else {
+
+}
\ No newline at end of file
diff --git a/Account/ExternalLoginFailure.cshtml b/Account/ExternalLoginFailure.cshtml
new file mode 100644
index 0000000..c0f637c
--- /dev/null
+++ b/Account/ExternalLoginFailure.cshtml
@@ -0,0 +1,10 @@
+@{
+ // Set the layout page and page title
+ Layout = "~/_SiteLayout.cshtml";
+ Page.Title = "Login Failure";
+}
+
+
+
@Page.Title.
+
Unsuccessful login with service.
+
diff --git a/Account/ForgotPassword.cshtml b/Account/ForgotPassword.cshtml
new file mode 100644
index 0000000..f8c1369
--- /dev/null
+++ b/Account/ForgotPassword.cshtml
@@ -0,0 +1,83 @@
+@* Remove this section if you are using bundling *@
+@section Scripts {
+
+
+}
+
+@{
+ Layout = "~/_SiteLayout.cshtml";
+ Page.Title = "Forget Your Password";
+
+ bool passwordSent = false;
+ var resetToken = "";
+ var email = Request.Form["email"] ?? Request.QueryString["email"];
+
+ // Setup validation
+ Validation.RequireField("email", "The email address field is required.");
+
+ if (IsPost) {
+ AntiForgery.Validate();
+ // validate email
+ bool isValid = true;
+ if (Validation.IsValid()) {
+ if (WebSecurity.GetUserId(email) > -1 && WebSecurity.IsConfirmed(email)) {
+ resetToken = WebSecurity.GeneratePasswordResetToken(email); // Optionally specify an expiration date for the token
+ } else {
+ passwordSent = true; // We don't want to disclose that the user does not exist.
+ isValid = false;
+ }
+ }
+ if (isValid) {
+ var hostUrl = Request.Url.GetComponents(UriComponents.SchemeAndServer, UriFormat.Unescaped);
+ var resetUrl = hostUrl + VirtualPathUtility.ToAbsolute("~/Account/PasswordReset?resetToken=" + HttpUtility.UrlEncode(resetToken));
+ WebMail.Send(
+ to: email,
+ subject: "Please reset your password",
+ body: "Use this password reset token to reset your password. The token is: " + resetToken + @". Visit " + resetUrl + " to reset your password."
+ );
+ passwordSent = true;
+ }
+ }
+}
+
+
+
@Page.Title.
+
Use the form below to reset your password.
+
+
+@if (!WebMail.SmtpServer.IsEmpty()) {
+
+ We will send password reset instructions to the email address associated with your account.
+
+
+ if (passwordSent) {
+
+ Instructions to reset your password have been sent to the specified email address.
+
+ }
+
+
+} else {
+
+ Password recovery is disabled for this website because the SMTP server is
+ not configured correctly. Please contact the owner of this site to reset
+ your password.
+
+}
\ No newline at end of file
diff --git a/Account/Login.cshtml b/Account/Login.cshtml
new file mode 100644
index 0000000..c64f912
--- /dev/null
+++ b/Account/Login.cshtml
@@ -0,0 +1,104 @@
+@* Remove this section if you are using bundling *@
+@section Scripts {
+
+
+}
+
+@{
+ Layout = "~/_SiteLayout.cshtml";
+ Page.Title = "Log in";
+
+ // Initialize general page variables
+ var email = "";
+ var password = "";
+ var rememberMe = false;
+
+ var returnUrl = Request.QueryString["ReturnUrl"];
+ if (returnUrl.IsEmpty()) {
+ // Some external login providers always require a return URL value
+ returnUrl = Href("~/");
+ }
+
+ // Setup validation
+ Validation.RequireField("email", "You must specify an email address.");
+ Validation.RequireField("password", "You must specify a password.");
+ Validation.Add("password",
+ Validator.StringLength(
+ maxLength: Int32.MaxValue,
+ minLength: 6,
+ errorMessage: "Password must be at least 6 characters"));
+
+ // If this is a POST request, validate and process data
+ if (IsPost) {
+ AntiForgery.Validate();
+ // is this an external login request?
+ string provider = Request.Form["provider"];
+ if (!provider.IsEmpty()) {
+ OAuthWebSecurity.RequestAuthentication(provider, Href("~/Account/RegisterService", new { returnUrl }));
+ return;
+ } else if (Validation.IsValid()) {
+ email = Request.Form["email"];
+ password = Request.Form["password"];
+ rememberMe = Request.Form["rememberMe"].AsBool();
+
+ if (WebSecurity.UserExists(email) && WebSecurity.GetPasswordFailuresSinceLastSuccess(email) > 4 && WebSecurity.GetLastPasswordFailureDate(email).AddSeconds(60) > DateTime.UtcNow) {
+ Response.Redirect("~/Account/AccountLockedOut");
+ return;
+ }
+
+ // Attempt to log in using provided credentials
+ if (WebSecurity.Login(email, password, rememberMe)) {
+ Context.RedirectLocal(returnUrl);
+ return;
+ } else {
+ ModelState.AddFormError("The user name or password provided is incorrect.");
+ }
+ }
+ }
+}
+
+
+
+ @RenderPage("~/Account/_ExternalLoginsList.cshtml")
+
diff --git a/Account/Logout.cshtml b/Account/Logout.cshtml
new file mode 100644
index 0000000..ac86567
--- /dev/null
+++ b/Account/Logout.cshtml
@@ -0,0 +1,17 @@
+@{
+ WebSecurity.RequireAuthenticatedUser();
+
+ if (IsPost) {
+ // Verify the request was submitted by the user
+ AntiForgery.Validate();
+
+ // Log out of the current user context
+ WebSecurity.Logout();
+
+ // Redirect back to the return URL or homepage
+ var returnUrl = Request.QueryString["ReturnUrl"];
+ Context.RedirectLocal(returnUrl);
+ } else {
+ Response.Redirect("~/");
+ }
+}
diff --git a/Account/Manage.cshtml b/Account/Manage.cshtml
new file mode 100644
index 0000000..0c8d532
--- /dev/null
+++ b/Account/Manage.cshtml
@@ -0,0 +1,198 @@
+@using WebMatrix.WebData
+
+@* Remove this section if you are using bundling *@
+@section Scripts {
+
+
+}
+
+@{
+ WebSecurity.RequireAuthenticatedUser();
+
+ Layout = "~/_SiteLayout.cshtml";
+ Page.Title = "Manage Account";
+
+ var action = Request.Form["action"];
+
+ bool hasLocalAccount = OAuthWebSecurity.HasLocalAccount(WebSecurity.CurrentUserId);
+
+ string successMessage = "";
+ var message = Request.QueryString["message"];
+ if (message == "ChangedPassword") {
+ successMessage = "Your password has been changed.";
+ } else if (message == "SetPassword") {
+ successMessage = "Your password has been set.";
+ } else if (message == "RemovedLogin") {
+ successMessage = "The external login was removed.";
+ }
+
+ var externalLogins =
+ (from account in OAuthWebSecurity.GetAccountsFromUserName(WebSecurity.CurrentUserName)
+ let clientData = OAuthWebSecurity.GetOAuthClientData(account.Provider)
+ select new { Provider = account.Provider, ProviderDisplayName = clientData.DisplayName, UserId = account.ProviderUserId })
+ .ToList();
+ bool canRemoveLogin = externalLogins.Count > 1 || hasLocalAccount;
+
+ // Setup validation
+ if (hasLocalAccount) {
+ Validation.RequireField("currentPassword", "The current password field is required.");
+ Validation.Add("currentPassword",
+ Validator.StringLength(
+ maxLength: Int32.MaxValue,
+ minLength: 6,
+ errorMessage: "Current password must be at least 6 characters"));
+ }
+ Validation.RequireField("newPassword", "The new password field is required.");
+ Validation.Add("confirmPassword",
+ Validator.Required("The confirm new password field is required."),
+ Validator.EqualsTo("newPassword", "The new password and confirmation password do not match."));
+ Validation.Add("newPassword",
+ Validator.StringLength(
+ maxLength: Int32.MaxValue,
+ minLength: 6,
+ errorMessage: "New password must be at least 6 characters"));
+
+ if (IsPost) {
+ AntiForgery.Validate();
+ if (action == "password") {
+ // Handle local account password operations
+ var currentPassword = Request.Form["currentPassword"];
+ var newPassword = Request.Form["newPassword"];
+ var confirmPassword = Request.Form["confirmPassword"];
+
+ if (Validation.IsValid()) {
+ if (hasLocalAccount) {
+ if (WebSecurity.ChangePassword(WebSecurity.CurrentUserName, currentPassword, newPassword)) {
+ Response.Redirect("~/Account/Manage?message=ChangedPassword");
+ return;
+ } else {
+ ModelState.AddFormError("An error occurred when attempting to change the password. Please contact the site owner.");
+ }
+ } else {
+ bool requireEmailConfirmation = !WebMail.SmtpServer.IsEmpty();
+ try {
+ WebSecurity.CreateAccount(WebSecurity.CurrentUserName, newPassword, requireEmailConfirmation);
+ Response.Redirect("~/Account/Manage?message=SetPassword");
+ return;
+ } catch (System.Web.Security.MembershipCreateUserException e) {
+ ModelState.AddFormError(e.Message);
+ }
+ }
+ } else {
+ ModelState.AddFormError("Password change was unsuccessful. Please correct the errors and try again.");
+ }
+ } else if (action == "removeLogin") {
+ // Remove external login
+ var provider = Request.Form["provider"];
+ var userId = Request.Form["userId"];
+
+ message = null;
+ var ownerAccount = OAuthWebSecurity.GetUserName(provider, userId);
+ // Only remove the external login if it is owned by the currently logged in user and it is not the users last login credential
+ if (ownerAccount == WebSecurity.CurrentUserName && canRemoveLogin) {
+ OAuthWebSecurity.DeleteAccount(provider, userId);
+ message = "RemovedLogin";
+ }
+ Response.Redirect(Href("~/Account/Manage", new { message }));
+ return;
+ } else {
+ // Assume this an external login request
+ string provider = Request.Form["provider"];
+ if (!provider.IsEmpty()) {
+ OAuthWebSecurity.RequestAuthentication(provider, Href("~/Account/RegisterService", new { returnUrl = Href("~/Account/Manage") }));
+ return;
+ }
+ }
+ }
+}
+
+
@Page.Title.
+
+
+@if (!successMessage.IsEmpty()) {
+
+ @successMessage
+
+}
+
+
You're logged in as @WebSecurity.CurrentUserName.
+
+@if (hasLocalAccount) {
+
Change password
+} else {
+
+ You do not have a local password for this site. Add a local password so you can log in without an external login.
+
+}
+
+
+
+
+ @if (externalLogins.Count > 0) {
+
Registered external logins
+
+
+ @foreach (var externalLogin in externalLogins) {
+
+
@externalLogin.ProviderDisplayName
+
+ @if (canRemoveLogin) {
+
+ } else {
+ @:
+ }
+
+
+ }
+
+
+ }
+
+
Add an external login
+ @RenderPage("~/Account/_ExternalLoginsList.cshtml")
+
diff --git a/Account/PasswordReset.cshtml b/Account/PasswordReset.cshtml
new file mode 100644
index 0000000..ad7d558
--- /dev/null
+++ b/Account/PasswordReset.cshtml
@@ -0,0 +1,94 @@
+@* Remove this section if you are using bundling *@
+@section Scripts {
+
+
+}
+
+@{
+ Layout = "~/_SiteLayout.cshtml";
+ Page.Title = "Password Reset";
+
+ var passwordResetToken = Request.Form["resetToken"] ?? Request.QueryString["resetToken"];
+
+ bool tokenExpired = false;
+ bool isSuccess = false;
+
+ // Setup validation
+ Validation.RequireField("newPassword", "The new password field is required.");
+ Validation.Add("confirmPassword",
+ Validator.EqualsTo("newPassword", "The new password and confirmation password do not match."));
+ Validation.RequireField("passwordResetToken", "The password reset token field is required.");
+ Validation.Add("newPassword",
+ Validator.StringLength(
+ maxLength: Int32.MaxValue,
+ minLength: 6,
+ errorMessage: "New password must be at least 6 characters"));
+
+ if (IsPost && Validation.IsValid()) {
+ AntiForgery.Validate();
+ var newPassword = Request["newPassword"];
+ var confirmPassword = Request["confirmPassword"];
+
+ if (WebSecurity.ResetPassword(passwordResetToken, newPassword)) {
+ isSuccess = true;
+ } else {
+ ModelState.AddError("passwordResetToken", "The password reset token is invalid.");
+ tokenExpired = true;
+ }
+ }
+}
+
+
+
@Page.Title.
+
Use the form below to reset your password.
+
+
+@if (!WebMail.SmtpServer.IsEmpty()) {
+ if (!Validation.IsValid()) {
+
+ @if (tokenExpired) {
+ The password reset token is incorrect or may be expired. Visit the forgot password page
+ to generate a new one.
+ } else {
+ Could not reset password. Please correct the errors and try again.
+ }
+
+ Password recovery is disabled for this website because the SMTP server is
+ not configured correctly. Please contact the owner of this site to reset
+ your password.
+
+}
diff --git a/Account/Register.cshtml b/Account/Register.cshtml
new file mode 100644
index 0000000..3abd451
--- /dev/null
+++ b/Account/Register.cshtml
@@ -0,0 +1,135 @@
+@* Remove this section if you are using bundling *@
+@section Scripts {
+
+
+}
+
+@{
+ Layout = "~/_SiteLayout.cshtml";
+ Page.Title = "Register";
+
+ // Initialize general page variables
+ var email = "";
+ var password = "";
+ var confirmPassword = "";
+
+ // Setup validation
+ Validation.RequireField("email", "You must specify an email address.");
+ Validation.RequireField("password", "Password cannot be blank.");
+ Validation.Add("confirmPassword",
+ Validator.EqualsTo("password", "Password and confirmation password do not match."));
+ Validation.Add("password",
+ Validator.StringLength(
+ maxLength: Int32.MaxValue,
+ minLength: 6,
+ errorMessage: "Password must be at least 6 characters"));
+
+ // If this is a POST request, validate and process data
+ if (IsPost) {
+ AntiForgery.Validate();
+ email = Request.Form["email"];
+ password = Request.Form["password"];
+ confirmPassword = Request.Form["confirmPassword"];
+
+ // Validate the user's captcha answer
+ // if (!ReCaptcha.Validate("PRIVATE_KEY")) {
+ // ModelState.AddError("recaptcha", "Captcha response was not correct");
+ // }
+
+ // If all information is valid, create a new account
+ if (Validation.IsValid()) {
+ // Insert a new user into the database
+ var db = Database.Open("StarterSite");
+
+ // Check if user already exists
+ var user = db.QuerySingle("SELECT Email FROM UserProfile WHERE LOWER(Email) = LOWER(@0)", email);
+ if (user == null) {
+ // Insert email into the profile table
+ db.Execute("INSERT INTO UserProfile (Email) VALUES (@0)", email);
+
+ // Create and associate a new entry in the membership database.
+ // If successful, continue processing the request
+ try {
+ bool requireEmailConfirmation = !WebMail.SmtpServer.IsEmpty();
+ var token = WebSecurity.CreateAccount(email, password, requireEmailConfirmation);
+ if (requireEmailConfirmation) {
+ var hostUrl = Request.Url.GetComponents(UriComponents.SchemeAndServer, UriFormat.Unescaped);
+ var confirmationUrl = hostUrl + VirtualPathUtility.ToAbsolute("~/Account/Confirm?confirmationCode=" + HttpUtility.UrlEncode(token));
+
+ WebMail.Send(
+ to: email,
+ subject: "Please confirm your account",
+ body: "Your confirmation code is: " + token + ". Visit " + confirmationUrl + " to activate your account."
+ );
+ }
+
+ if (requireEmailConfirmation) {
+ // Thank the user for registering and let them know an email is on its way
+ Response.Redirect("~/Account/Thanks");
+ } else {
+ // Navigate back to the homepage and exit
+ WebSecurity.Login(email, password);
+
+ Response.Redirect("~/");
+ }
+ } catch (System.Web.Security.MembershipCreateUserException e) {
+ ModelState.AddFormError(e.Message);
+ }
+ } else {
+ // User already exists
+ ModelState.AddFormError("Email address is already in use.");
+ }
+ }
+ }
+}
+
+
+
@Page.Title.
+
Create a new account.
+
+
+
\ No newline at end of file
diff --git a/Account/RegisterService.cshtml b/Account/RegisterService.cshtml
new file mode 100644
index 0000000..0ad6c1c
--- /dev/null
+++ b/Account/RegisterService.cshtml
@@ -0,0 +1,113 @@
+@* Remove this section if you are using bundling *@
+@section Scripts {
+
+
+}
+
+@{
+ Layout = "~/_SiteLayout.cshtml";
+ Page.Title = "Register";
+
+ string email = "";
+ string loginData = "";
+ string providerDisplayName = "";
+
+ var returnUrl = Request.QueryString["ReturnUrl"];
+ if (returnUrl.IsEmpty()) {
+ // Some external login providers always require a return URL value
+ returnUrl = Href("~/");
+ }
+
+ // Setup validation
+ Validation.RequireField("email", "The user name field is required.");
+
+ if (IsPost && Request.Form["newAccount"].AsBool()) {
+ // Handle new account registration form
+ AntiForgery.Validate();
+ email = Request.Form["email"];
+ loginData = Request.Form["loginData"];
+
+ string provider = "";
+ string providerUserId = "";
+ if (WebSecurity.IsAuthenticated || !OAuthWebSecurity.TryDeserializeProviderUserId(loginData, out provider, out providerUserId)) {
+ Response.Redirect("~/Account/Manage");
+ return;
+ }
+
+ providerDisplayName = OAuthWebSecurity.GetOAuthClientData(provider).DisplayName;
+ if (Validation.IsValid()) {
+ // Insert a new user into the database
+ var db = Database.Open("StarterSite");
+
+ // Check if user already exists
+ var user = db.QuerySingle("SELECT Email FROM UserProfile WHERE LOWER(Email) = LOWER(@0)", email);
+ if (user == null) {
+ // Insert email into the profile table
+ db.Execute("INSERT INTO UserProfile (Email) VALUES (@0)", email);
+ OAuthWebSecurity.CreateOrUpdateAccount(provider, providerUserId, email);
+
+ OAuthWebSecurity.Login(provider, providerUserId, createPersistentCookie: false);
+
+ Context.RedirectLocal(returnUrl);
+ return;
+ } else {
+ ModelState.AddError("email", "User name already exists. Please enter a different user name.");
+ }
+ }
+ } else {
+ // Handle callbacks from the external login provider
+
+ var result = OAuthWebSecurity.VerifyAuthentication(Href("~/Account/RegisterService", new { returnUrl }));
+ if (result.IsSuccessful) {
+ bool registered = OAuthWebSecurity.Login(result.Provider, result.ProviderUserId, createPersistentCookie: false);
+ if (registered) {
+ Context.RedirectLocal(returnUrl);
+ return;
+ }
+
+ if (WebSecurity.IsAuthenticated) {
+ // If the current user is logged in add the new account
+ OAuthWebSecurity.CreateOrUpdateAccount(result.Provider, result.ProviderUserId, WebSecurity.CurrentUserName);
+ Context.RedirectLocal(returnUrl);
+ return;
+ } else {
+ // User is new, set default user name to the value obtained from external login provider
+ email = result.UserName;
+ loginData = OAuthWebSecurity.SerializeProviderUserId(result.Provider, result.ProviderUserId);
+ providerDisplayName = OAuthWebSecurity.GetOAuthClientData(result.Provider).DisplayName;
+ }
+ } else {
+ Response.Redirect("~/Account/ExternalLoginFailure");
+ return;
+ }
+ }
+}
+
+
@Page.Title.
+
Associate your @providerDisplayName account.
+
+
+
diff --git a/Account/Thanks.cshtml b/Account/Thanks.cshtml
new file mode 100644
index 0000000..3c5fee0
--- /dev/null
+++ b/Account/Thanks.cshtml
@@ -0,0 +1,25 @@
+@{
+ // Set the layout page and page title
+ Layout = "~/_SiteLayout.cshtml";
+ Page.Title = "Thanks for registering";
+}
+
+@if (!WebSecurity.IsAuthenticated) {
+
+
@Page.Title.
+
But you're not done yet!
+
+
+
+ An email with instructions on how to activate your account is on its way to you.
+
+} else {
+
+
@Page.Title.
+
You are all set.
+
+
+
+ It looks like you've already confirmed your account and are good to go.
+
+}
\ No newline at end of file
diff --git a/Account/_ExternalLoginsList.cshtml b/Account/_ExternalLoginsList.cshtml
new file mode 100644
index 0000000..d40bbd2
--- /dev/null
+++ b/Account/_ExternalLoginsList.cshtml
@@ -0,0 +1,21 @@
+@if (OAuthWebSecurity.RegisteredClientData.Count == 0) {
+
+
+ There are no external authentication services configured. See this article
+ for details on setting up this ASP.NET application to support logging in via external services.
+
+
+} else {
+
+}
diff --git a/App_Data/StarterSite.sdf b/App_Data/StarterSite.sdf
new file mode 100644
index 0000000..0a1b53c
Binary files /dev/null and b/App_Data/StarterSite.sdf differ
diff --git a/App_Data/packages/DotNetOpenAuth.AspNet.4.0.3.12153/DotNetOpenAuth.AspNet.4.0.3.12153.nupkg b/App_Data/packages/DotNetOpenAuth.AspNet.4.0.3.12153/DotNetOpenAuth.AspNet.4.0.3.12153.nupkg
new file mode 100644
index 0000000..c49300c
Binary files /dev/null and b/App_Data/packages/DotNetOpenAuth.AspNet.4.0.3.12153/DotNetOpenAuth.AspNet.4.0.3.12153.nupkg differ
diff --git a/App_Data/packages/DotNetOpenAuth.Core.4.0.3.12153/DotNetOpenAuth.Core.4.0.3.12153.nupkg b/App_Data/packages/DotNetOpenAuth.Core.4.0.3.12153/DotNetOpenAuth.Core.4.0.3.12153.nupkg
new file mode 100644
index 0000000..b32b003
Binary files /dev/null and b/App_Data/packages/DotNetOpenAuth.Core.4.0.3.12153/DotNetOpenAuth.Core.4.0.3.12153.nupkg differ
diff --git a/App_Data/packages/DotNetOpenAuth.OAuth.Consumer.4.0.3.12153/DotNetOpenAuth.OAuth.Consumer.4.0.3.12153.nupkg b/App_Data/packages/DotNetOpenAuth.OAuth.Consumer.4.0.3.12153/DotNetOpenAuth.OAuth.Consumer.4.0.3.12153.nupkg
new file mode 100644
index 0000000..f2e0e1b
Binary files /dev/null and b/App_Data/packages/DotNetOpenAuth.OAuth.Consumer.4.0.3.12153/DotNetOpenAuth.OAuth.Consumer.4.0.3.12153.nupkg differ
diff --git a/App_Data/packages/DotNetOpenAuth.OAuth.Core.4.0.3.12153/DotNetOpenAuth.OAuth.Core.4.0.3.12153.nupkg b/App_Data/packages/DotNetOpenAuth.OAuth.Core.4.0.3.12153/DotNetOpenAuth.OAuth.Core.4.0.3.12153.nupkg
new file mode 100644
index 0000000..03a82ef
Binary files /dev/null and b/App_Data/packages/DotNetOpenAuth.OAuth.Core.4.0.3.12153/DotNetOpenAuth.OAuth.Core.4.0.3.12153.nupkg differ
diff --git a/App_Data/packages/DotNetOpenAuth.OpenId.Core.4.0.3.12153/DotNetOpenAuth.OpenId.Core.4.0.3.12153.nupkg b/App_Data/packages/DotNetOpenAuth.OpenId.Core.4.0.3.12153/DotNetOpenAuth.OpenId.Core.4.0.3.12153.nupkg
new file mode 100644
index 0000000..88790c7
Binary files /dev/null and b/App_Data/packages/DotNetOpenAuth.OpenId.Core.4.0.3.12153/DotNetOpenAuth.OpenId.Core.4.0.3.12153.nupkg differ
diff --git a/App_Data/packages/DotNetOpenAuth.OpenId.RelyingParty.4.0.3.12153/DotNetOpenAuth.OpenId.RelyingParty.4.0.3.12153.nupkg b/App_Data/packages/DotNetOpenAuth.OpenId.RelyingParty.4.0.3.12153/DotNetOpenAuth.OpenId.RelyingParty.4.0.3.12153.nupkg
new file mode 100644
index 0000000..c656873
Binary files /dev/null and b/App_Data/packages/DotNetOpenAuth.OpenId.RelyingParty.4.0.3.12153/DotNetOpenAuth.OpenId.RelyingParty.4.0.3.12153.nupkg differ
diff --git a/App_Data/packages/Microsoft.AspNet.Razor.2.0.20710.0/Microsoft.AspNet.Razor.2.0.20710.0.nupkg b/App_Data/packages/Microsoft.AspNet.Razor.2.0.20710.0/Microsoft.AspNet.Razor.2.0.20710.0.nupkg
new file mode 100644
index 0000000..796598a
Binary files /dev/null and b/App_Data/packages/Microsoft.AspNet.Razor.2.0.20710.0/Microsoft.AspNet.Razor.2.0.20710.0.nupkg differ
diff --git a/App_Data/packages/Microsoft.AspNet.WebPages.2.0.20710.0/Microsoft.AspNet.WebPages.2.0.20710.0.nupkg b/App_Data/packages/Microsoft.AspNet.WebPages.2.0.20710.0/Microsoft.AspNet.WebPages.2.0.20710.0.nupkg
new file mode 100644
index 0000000..ec77268
Binary files /dev/null and b/App_Data/packages/Microsoft.AspNet.WebPages.2.0.20710.0/Microsoft.AspNet.WebPages.2.0.20710.0.nupkg differ
diff --git a/App_Data/packages/Microsoft.AspNet.WebPages.Administration.2.0.20710.0/Microsoft.AspNet.WebPages.Administration.2.0.20710.0.nupkg b/App_Data/packages/Microsoft.AspNet.WebPages.Administration.2.0.20710.0/Microsoft.AspNet.WebPages.Administration.2.0.20710.0.nupkg
new file mode 100644
index 0000000..a37d4b2
Binary files /dev/null and b/App_Data/packages/Microsoft.AspNet.WebPages.Administration.2.0.20710.0/Microsoft.AspNet.WebPages.Administration.2.0.20710.0.nupkg differ
diff --git a/App_Data/packages/Microsoft.AspNet.WebPages.Data.2.0.20710.0/Microsoft.AspNet.WebPages.Data.2.0.20710.0.nupkg b/App_Data/packages/Microsoft.AspNet.WebPages.Data.2.0.20710.0/Microsoft.AspNet.WebPages.Data.2.0.20710.0.nupkg
new file mode 100644
index 0000000..ccef68f
Binary files /dev/null and b/App_Data/packages/Microsoft.AspNet.WebPages.Data.2.0.20710.0/Microsoft.AspNet.WebPages.Data.2.0.20710.0.nupkg differ
diff --git a/App_Data/packages/Microsoft.AspNet.WebPages.OAuth.2.0.20710.0/Microsoft.AspNet.WebPages.OAuth.2.0.20710.0.nupkg b/App_Data/packages/Microsoft.AspNet.WebPages.OAuth.2.0.20710.0/Microsoft.AspNet.WebPages.OAuth.2.0.20710.0.nupkg
new file mode 100644
index 0000000..5b84615
Binary files /dev/null and b/App_Data/packages/Microsoft.AspNet.WebPages.OAuth.2.0.20710.0/Microsoft.AspNet.WebPages.OAuth.2.0.20710.0.nupkg differ
diff --git a/App_Data/packages/Microsoft.AspNet.WebPages.WebData.2.0.20710.0/Microsoft.AspNet.WebPages.WebData.2.0.20710.0.nupkg b/App_Data/packages/Microsoft.AspNet.WebPages.WebData.2.0.20710.0/Microsoft.AspNet.WebPages.WebData.2.0.20710.0.nupkg
new file mode 100644
index 0000000..65ef2b0
Binary files /dev/null and b/App_Data/packages/Microsoft.AspNet.WebPages.WebData.2.0.20710.0/Microsoft.AspNet.WebPages.WebData.2.0.20710.0.nupkg differ
diff --git a/App_Data/packages/Microsoft.Web.Infrastructure.1.0.0.0/Microsoft.Web.Infrastructure.1.0.0.0.nupkg b/App_Data/packages/Microsoft.Web.Infrastructure.1.0.0.0/Microsoft.Web.Infrastructure.1.0.0.0.nupkg
new file mode 100644
index 0000000..eb60cce
Binary files /dev/null and b/App_Data/packages/Microsoft.Web.Infrastructure.1.0.0.0/Microsoft.Web.Infrastructure.1.0.0.0.nupkg differ
diff --git a/App_Data/packages/Microsoft.jQuery.Unobtrusive.Validation.2.0.20710.0/Microsoft.jQuery.Unobtrusive.Validation.2.0.20710.0.nupkg b/App_Data/packages/Microsoft.jQuery.Unobtrusive.Validation.2.0.20710.0/Microsoft.jQuery.Unobtrusive.Validation.2.0.20710.0.nupkg
new file mode 100644
index 0000000..99a088c
Binary files /dev/null and b/App_Data/packages/Microsoft.jQuery.Unobtrusive.Validation.2.0.20710.0/Microsoft.jQuery.Unobtrusive.Validation.2.0.20710.0.nupkg differ
diff --git a/App_Data/packages/Modernizr.2.5.3/Modernizr.2.5.3.nupkg b/App_Data/packages/Modernizr.2.5.3/Modernizr.2.5.3.nupkg
new file mode 100644
index 0000000..7f4033b
Binary files /dev/null and b/App_Data/packages/Modernizr.2.5.3/Modernizr.2.5.3.nupkg differ
diff --git a/App_Data/packages/NuGet.Core.1.6.2/NuGet.Core.1.6.2.nupkg b/App_Data/packages/NuGet.Core.1.6.2/NuGet.Core.1.6.2.nupkg
new file mode 100644
index 0000000..1406120
Binary files /dev/null and b/App_Data/packages/NuGet.Core.1.6.2/NuGet.Core.1.6.2.nupkg differ
diff --git a/App_Data/packages/jQuery.1.7.1.1/jQuery.1.7.1.1.nupkg b/App_Data/packages/jQuery.1.7.1.1/jQuery.1.7.1.1.nupkg
new file mode 100644
index 0000000..2a93388
Binary files /dev/null and b/App_Data/packages/jQuery.1.7.1.1/jQuery.1.7.1.1.nupkg differ
diff --git a/App_Data/packages/jQuery.UI.Combined.1.8.20.1/jQuery.UI.Combined.1.8.20.1.nupkg b/App_Data/packages/jQuery.UI.Combined.1.8.20.1/jQuery.UI.Combined.1.8.20.1.nupkg
new file mode 100644
index 0000000..780e470
Binary files /dev/null and b/App_Data/packages/jQuery.UI.Combined.1.8.20.1/jQuery.UI.Combined.1.8.20.1.nupkg differ
diff --git a/App_Data/packages/jQuery.Validation.1.9.0.1/jQuery.Validation.1.9.0.1.nupkg b/App_Data/packages/jQuery.Validation.1.9.0.1/jQuery.Validation.1.9.0.1.nupkg
new file mode 100644
index 0000000..c43329f
Binary files /dev/null and b/App_Data/packages/jQuery.Validation.1.9.0.1/jQuery.Validation.1.9.0.1.nupkg differ
diff --git a/App_Data/packages/knockoutjs.2.1.0/knockoutjs.2.1.0.nupkg b/App_Data/packages/knockoutjs.2.1.0/knockoutjs.2.1.0.nupkg
new file mode 100644
index 0000000..b61ffd0
Binary files /dev/null and b/App_Data/packages/knockoutjs.2.1.0/knockoutjs.2.1.0.nupkg differ
diff --git a/Contact.cshtml b/Contact.cshtml
new file mode 100644
index 0000000..9e88d43
--- /dev/null
+++ b/Contact.cshtml
@@ -0,0 +1,51 @@
+@{
+ Layout = "~/_SiteLayout.cshtml";
+ Page.Title = "Contact";
+}
+
+
+
Modify this template to jump-start your ASP.NET Web Pages application.
+
+
+ To learn more about ASP.NET Web Pages, visit
+ http://asp.net/webpages.
+ The page features videos, tutorials, and samples to help you get the most from ASP.NET Web Pages.
+ If you have any questions about ASP.NET Web Pages, visit
+ our forums.
+
+
+
+}
+
+
We suggest the following:
+
+
+
+
Getting Started
+ ASP.NET Web Pages and the new Razor syntax provide a fast, approachable, and lightweight way to combine server code with HTML
+ to create dynamic web content. Connect to databases, add video, link to social networking sites, and include many more features
+ that let you create beautiful sites using the latest web standards.
+ Learn more…
+
+
+
+
Add NuGet packages and jump start your coding
+ NuGet makes it easy to install and update free libraries and tools.
+ Learn more…
+
+
+
+
\ No newline at end of file
diff --git a/EULA_ENU.docx b/EULA_ENU.docx
new file mode 100644
index 0000000..a72fb48
Binary files /dev/null and b/EULA_ENU.docx differ
diff --git a/Images/accent.png b/Images/accent.png
new file mode 100644
index 0000000..edce692
Binary files /dev/null and b/Images/accent.png differ
diff --git a/Images/bullet.png b/Images/bullet.png
new file mode 100644
index 0000000..fcf7bd1
Binary files /dev/null and b/Images/bullet.png differ
diff --git a/Images/heroAccent.png b/Images/heroAccent.png
new file mode 100644
index 0000000..08b85d6
Binary files /dev/null and b/Images/heroAccent.png differ
diff --git a/Images/orderedList0.png b/Images/orderedList0.png
new file mode 100644
index 0000000..79e0db4
Binary files /dev/null and b/Images/orderedList0.png differ
diff --git a/Images/orderedList1.png b/Images/orderedList1.png
new file mode 100644
index 0000000..e1acac8
Binary files /dev/null and b/Images/orderedList1.png differ
diff --git a/Images/orderedList2.png b/Images/orderedList2.png
new file mode 100644
index 0000000..f845525
Binary files /dev/null and b/Images/orderedList2.png differ
diff --git a/Images/orderedList3.png b/Images/orderedList3.png
new file mode 100644
index 0000000..adc6249
Binary files /dev/null and b/Images/orderedList3.png differ
diff --git a/Images/orderedList4.png b/Images/orderedList4.png
new file mode 100644
index 0000000..b67c506
Binary files /dev/null and b/Images/orderedList4.png differ
diff --git a/Images/orderedList5.png b/Images/orderedList5.png
new file mode 100644
index 0000000..40544f7
Binary files /dev/null and b/Images/orderedList5.png differ
diff --git a/Images/orderedList6.png b/Images/orderedList6.png
new file mode 100644
index 0000000..0ed3a86
Binary files /dev/null and b/Images/orderedList6.png differ
diff --git a/Images/orderedList7.png b/Images/orderedList7.png
new file mode 100644
index 0000000..660cd91
Binary files /dev/null and b/Images/orderedList7.png differ
diff --git a/Images/orderedList8.png b/Images/orderedList8.png
new file mode 100644
index 0000000..70c294f
Binary files /dev/null and b/Images/orderedList8.png differ
diff --git a/Images/orderedList9.png b/Images/orderedList9.png
new file mode 100644
index 0000000..0180ed2
Binary files /dev/null and b/Images/orderedList9.png differ
diff --git a/Readme.md b/Readme.md
new file mode 100644
index 0000000..8f3dedf
--- /dev/null
+++ b/Readme.md
@@ -0,0 +1 @@
+#ASPNET Starte site template [](https://azuredeploy.net/)
\ No newline at end of file
diff --git a/Scripts/jquery-1.7.1-vsdoc.js b/Scripts/jquery-1.7.1-vsdoc.js
new file mode 100644
index 0000000..3620070
--- /dev/null
+++ b/Scripts/jquery-1.7.1-vsdoc.js
@@ -0,0 +1,7178 @@
+/*
+* This file has been generated to support Visual Studio IntelliSense.
+* You should not use this file at runtime inside the browser--it is only
+* intended to be used only for design-time IntelliSense. Please use the
+* standard jQuery library for all production use.
+*
+* Comment version: 1.7.1
+*/
+/*!
+* jQuery JavaScript Library v1.7.1
+* http://jquery.com/
+*
+* Distributed in whole under the terms of the MIT
+*
+* Copyright 2010, John Resig
+*
+* Permission is hereby granted, free of charge, to any person obtaining
+* a copy of this software and associated documentation files (the
+* "Software"), to deal in the Software without restriction, including
+* without limitation the rights to use, copy, modify, merge, publish,
+* distribute, sublicense, and/or sell copies of the Software, and to
+* permit persons to whom the Software is furnished to do so, subject to
+* the following conditions:
+*
+* The above copyright notice and this permission notice shall be
+* included in all copies or substantial portions of the Software.
+*
+* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
+* EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
+* MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
+* NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
+* LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
+* OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
+* WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
+*
+* Includes Sizzle.js
+* http://sizzlejs.com/
+* Copyright 2010, The Dojo Foundation
+* Released under the MIT and BSD Licenses.
+*
+ * Documentation Content
+ * Copyright (c) 2009 Packt Publishing, http://packtpub.com/
+ * Copyright (c) 2012 jQuery Foundation, http://jquery.org/
+ *
+ * This software consists of voluntary contributions made by many
+ * individuals. For exact contribution history, see the revision history
+ * and logs, available at http://github.com/jquery/api.jquery.com
+ *
+ * Permission is hereby granted, free of charge, to any person obtaining
+ * a copy of this software and associated documentation files (the
+ * "Software"), to deal in the Software without restriction, including
+ * without limitation the rights to use, copy, modify, merge, publish,
+ * distribute, sublicense, and/or sell copies of the Software, and to
+ * permit persons to whom the Software is furnished to do so, subject to
+ * the following conditions:
+ *
+ * The above copyright notice and this permission notice shall be
+ * included in all copies or substantial portions of the Software.
+ *
+ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
+ * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
+ * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
+ * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
+ * LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
+ * OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
+ * WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
+*/
+(function ( window, undefined ) {
+var jQuery = function( selector, context ) {
+///
+/// 1: Accepts a string containing a CSS selector which is then used to match a set of elements.
+///
1.1 - $(selector, context)
+///
1.2 - $(element)
+///
1.3 - $(object)
+///
1.4 - $(elementArray)
+///
1.5 - $(jQuery object)
+///
1.6 - $()
+///
2: Creates DOM elements on the fly from the provided string of raw HTML.
+///
2.1 - $(html, ownerDocument)
+///
2.2 - $(html, props)
+///
3: Binds a function to be executed when the DOM has finished loading.
+///
3.1 - $(callback)
+///
+///
+/// A string containing a selector expression
+///
+///
+/// A DOM Element, Document, or jQuery to use as context
+///
+///
+
+ // The jQuery object is actually just the init constructor 'enhanced'
+ return new jQuery.fn.init( selector, context, rootjQuery );
+ };
+jQuery.Callbacks = function( flags ) {
+///
+/// A multi-purpose callbacks list object that provides a powerful way to manage callback lists.
+///
+///
+/// An optional list of space-separated flags that change how the callback list behaves.
+///
+
+
+ // Convert flags from String-formatted to Object-formatted
+ // (we check in cache first)
+ flags = flags ? ( flagsCache[ flags ] || createFlags( flags ) ) : {};
+
+ var // Actual callback list
+ list = [],
+ // Stack of fire calls for repeatable lists
+ stack = [],
+ // Last fire value (for non-forgettable lists)
+ memory,
+ // 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,
+ // Add one or several callbacks to the list
+ add = function( args ) {
+ var i,
+ length,
+ elem,
+ type,
+ actual;
+ for ( i = 0, length = args.length; i < length; i++ ) {
+ elem = args[ i ];
+ type = jQuery.type( elem );
+ if ( type === "array" ) {
+ // Inspect recursively
+ add( elem );
+ } else if ( type === "function" ) {
+ // Add if not in unique mode and callback is not in
+ if ( !flags.unique || !self.has( elem ) ) {
+ list.push( elem );
+ }
+ }
+ }
+ },
+ // Fire callbacks
+ fire = function( context, args ) {
+ args = args || [];
+ memory = !flags.memory || [ context, args ];
+ firing = true;
+ firingIndex = firingStart || 0;
+ firingStart = 0;
+ firingLength = list.length;
+ for ( ; list && firingIndex < firingLength; firingIndex++ ) {
+ if ( list[ firingIndex ].apply( context, args ) === false && flags.stopOnFalse ) {
+ memory = true; // Mark as halted
+ break;
+ }
+ }
+ firing = false;
+ if ( list ) {
+ if ( !flags.once ) {
+ if ( stack && stack.length ) {
+ memory = stack.shift();
+ self.fireWith( memory[ 0 ], memory[ 1 ] );
+ }
+ } else if ( memory === true ) {
+ self.disable();
+ } else {
+ list = [];
+ }
+ }
+ },
+ // Actual Callbacks object
+ self = {
+ // Add a callback or a collection of callbacks to the list
+ add: function() {
+ if ( list ) {
+ var length = list.length;
+ add( 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, unless previous
+ // firing was halted (stopOnFalse)
+ } else if ( memory && memory !== true ) {
+ firingStart = length;
+ fire( memory[ 0 ], memory[ 1 ] );
+ }
+ }
+ return this;
+ },
+ // Remove a callback from the list
+ remove: function() {
+ if ( list ) {
+ var args = arguments,
+ argIndex = 0,
+ argLength = args.length;
+ for ( ; argIndex < argLength ; argIndex++ ) {
+ for ( var i = 0; i < list.length; i++ ) {
+ if ( args[ argIndex ] === list[ i ] ) {
+ // Handle firingIndex and firingLength
+ if ( firing ) {
+ if ( i <= firingLength ) {
+ firingLength--;
+ if ( i <= firingIndex ) {
+ firingIndex--;
+ }
+ }
+ }
+ // Remove the element
+ list.splice( i--, 1 );
+ // If we have some unicity property then
+ // we only need to do this once
+ if ( flags.unique ) {
+ break;
+ }
+ }
+ }
+ }
+ }
+ return this;
+ },
+ // Control if a given callback is in the list
+ has: function( fn ) {
+ if ( list ) {
+ var i = 0,
+ length = list.length;
+ for ( ; i < length; i++ ) {
+ if ( fn === list[ i ] ) {
+ return true;
+ }
+ }
+ }
+ return false;
+ },
+ // 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 || memory === true ) {
+ self.disable();
+ }
+ return this;
+ },
+ // Is it locked?
+ locked: function() {
+ return !stack;
+ },
+ // Call all callbacks with the given context and arguments
+ fireWith: function( context, args ) {
+ if ( stack ) {
+ if ( firing ) {
+ if ( !flags.once ) {
+ stack.push( [ context, args ] );
+ }
+ } else if ( !( flags.once && memory ) ) {
+ fire( context, 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 !!memory;
+ }
+ };
+
+ return self;
+};
+jQuery.Deferred = function( func ) {
+
+ var doneList = jQuery.Callbacks( "once memory" ),
+ failList = jQuery.Callbacks( "once memory" ),
+ progressList = jQuery.Callbacks( "memory" ),
+ state = "pending",
+ lists = {
+ resolve: doneList,
+ reject: failList,
+ notify: progressList
+ },
+ promise = {
+ done: doneList.add,
+ fail: failList.add,
+ progress: progressList.add,
+
+ state: function() {
+ return state;
+ },
+
+ // Deprecated
+ isResolved: doneList.fired,
+ isRejected: failList.fired,
+
+ then: function( doneCallbacks, failCallbacks, progressCallbacks ) {
+ deferred.done( doneCallbacks ).fail( failCallbacks ).progress( progressCallbacks );
+ return this;
+ },
+ always: function() {
+ deferred.done.apply( deferred, arguments ).fail.apply( deferred, arguments );
+ return this;
+ },
+ pipe: function( fnDone, fnFail, fnProgress ) {
+ return jQuery.Deferred(function( newDefer ) {
+ jQuery.each( {
+ done: [ fnDone, "resolve" ],
+ fail: [ fnFail, "reject" ],
+ progress: [ fnProgress, "notify" ]
+ }, function( handler, data ) {
+ var fn = data[ 0 ],
+ action = data[ 1 ],
+ returned;
+ if ( jQuery.isFunction( fn ) ) {
+ deferred[ handler ](function() {
+ returned = fn.apply( this, arguments );
+ if ( returned && jQuery.isFunction( returned.promise ) ) {
+ returned.promise().then( newDefer.resolve, newDefer.reject, newDefer.notify );
+ } else {
+ newDefer[ action + "With" ]( this === deferred ? newDefer : this, [ returned ] );
+ }
+ });
+ } else {
+ deferred[ handler ]( newDefer[ action ] );
+ }
+ });
+ }).promise();
+ },
+ // Get a promise for this deferred
+ // If obj is provided, the promise aspect is added to the object
+ promise: function( obj ) {
+ if ( obj == null ) {
+ obj = promise;
+ } else {
+ for ( var key in promise ) {
+ obj[ key ] = promise[ key ];
+ }
+ }
+ return obj;
+ }
+ },
+ deferred = promise.promise({}),
+ key;
+
+ for ( key in lists ) {
+ deferred[ key ] = lists[ key ].fire;
+ deferred[ key + "With" ] = lists[ key ].fireWith;
+ }
+
+ // Handle state
+ deferred.done( function() {
+ state = "resolved";
+ }, failList.disable, progressList.lock ).fail( function() {
+ state = "rejected";
+ }, doneList.disable, progressList.lock );
+
+ // Call given func if any
+ if ( func ) {
+ func.call( deferred, deferred );
+ }
+
+ // All done!
+ return deferred;
+ };
+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;
+};
+jQuery._data = function( elem, name, data ) {
+
+ return jQuery.data( elem, name, data, true );
+ };
+jQuery._mark = function( elem, type ) {
+
+ if ( elem ) {
+ type = ( type || "fx" ) + "mark";
+ jQuery._data( elem, type, (jQuery._data( elem, type ) || 0) + 1 );
+ }
+ };
+jQuery._unmark = function( force, elem, type ) {
+
+ if ( force !== true ) {
+ type = elem;
+ elem = force;
+ force = false;
+ }
+ if ( elem ) {
+ type = type || "fx";
+ var key = type + "mark",
+ count = force ? 0 : ( (jQuery._data( elem, key ) || 1) - 1 );
+ if ( count ) {
+ jQuery._data( elem, key, count );
+ } else {
+ jQuery.removeData( elem, key, true );
+ handleQueueMarkDefer( elem, type, "mark" );
+ }
+ }
+ };
+jQuery.acceptData = function( elem ) {
+
+ if ( elem.nodeName ) {
+ var match = jQuery.noData[ elem.nodeName.toLowerCase() ];
+
+ if ( match ) {
+ return !(match === true || elem.getAttribute("classid") !== match);
+ }
+ }
+
+ return true;
+ };
+jQuery.access = function( elems, key, value, exec, fn, pass ) {
+
+ var length = elems.length;
+
+ // Setting many attributes
+ if ( typeof key === "object" ) {
+ for ( var k in key ) {
+ jQuery.access( elems, k, key[k], exec, fn, value );
+ }
+ return elems;
+ }
+
+ // Setting one attribute
+ if ( value !== undefined ) {
+ // Optionally, function values get executed if exec is true
+ exec = !pass && exec && jQuery.isFunction(value);
+
+ for ( var i = 0; i < length; i++ ) {
+ fn( elems[i], key, exec ? value.call( elems[i], i, fn( elems[i], key ) ) : value, pass );
+ }
+
+ return elems;
+ }
+
+ // Getting an attribute
+ return length ? fn( elems[0], key ) : undefined;
+ };
+jQuery.active = 0;
+jQuery.ajax = function( url, options ) {
+///
+/// Perform an asynchronous HTTP (Ajax) request.
+///
1 - jQuery.ajax(url, settings)
+///
2 - jQuery.ajax(settings)
+///
+///
+/// A string containing the URL to which the request is sent.
+///
+///
+/// A set of key/value pairs that configure the Ajax request. All settings are optional. A default can be set for any option with $.ajaxSetup(). See jQuery.ajax( settings ) below for a complete list of all settings.
+///
+
+
+ // 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 // 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 || {},
+ // ifModified key
+ ifModifiedKey,
+ // Headers (they are sent all at once)
+ requestHeaders = {},
+ requestHeadersNames = {},
+ // Response headers
+ responseHeadersString,
+ responseHeaders,
+ // transport
+ transport,
+ // timeout handle
+ timeoutTimer,
+ // Cross-domain detection vars
+ parts,
+ // The jqXHR state
+ state = 0,
+ // To know if global events are to be dispatched
+ fireGlobals,
+ // Loop variable
+ i,
+ // 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 || "abort";
+ 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 ) {
+
+ // 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;
+
+ var isSuccess,
+ success,
+ error,
+ statusText = nativeStatusText,
+ response = responses ? ajaxHandleResponses( s, jqXHR, responses ) : undefined,
+ lastModified,
+ etag;
+
+ // 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 ) {
+
+ if ( ( lastModified = jqXHR.getResponseHeader( "Last-Modified" ) ) ) {
+ jQuery.lastModified[ ifModifiedKey ] = lastModified;
+ }
+ if ( ( etag = jqXHR.getResponseHeader( "Etag" ) ) ) {
+ jQuery.etag[ ifModifiedKey ] = etag;
+ }
+ }
+
+ // If not modified
+ if ( status === 304 ) {
+
+ statusText = "notmodified";
+ isSuccess = true;
+
+ // If we have data
+ } else {
+
+ try {
+ success = ajaxConvert( s, response );
+ statusText = "success";
+ isSuccess = true;
+ } catch(e) {
+ // We have a parsererror
+ statusText = "parsererror";
+ error = e;
+ }
+ }
+ } 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.then( tmp, 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( rspacesAjax );
+
+ // Determine if a cross-domain request is in order
+ if ( s.crossDomain == null ) {
+ parts = rurl.exec( s.url.toLowerCase() );
+ s.crossDomain = !!( parts &&
+ ( parts[ 1 ] != ajaxLocParts[ 1 ] || parts[ 2 ] != ajaxLocParts[ 2 ] ||
+ ( parts[ 3 ] || ( parts[ 1 ] === "http:" ? 80 : 443 ) ) !=
+ ( 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 prefiler, stop there
+ if ( state === 2 ) {
+ return false;
+ }
+
+ // 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
+ jqXHR.abort();
+ return false;
+
+ }
+
+ // 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;
+ };
+jQuery.ajaxPrefilter = function( dataTypeExpression, func ) {
+///
+/// Handle custom Ajax options or modify existing options before each request is sent and before they are processed by $.ajax().
+///
+///
+/// An optional string containing one or more space-separated dataTypes
+///
+///
+/// A handler to set default values for future Ajax requests.
+///
+///
+
+
+ if ( typeof dataTypeExpression !== "string" ) {
+ func = dataTypeExpression;
+ dataTypeExpression = "*";
+ }
+
+ if ( jQuery.isFunction( func ) ) {
+ var dataTypes = dataTypeExpression.toLowerCase().split( rspacesAjax ),
+ i = 0,
+ length = dataTypes.length,
+ dataType,
+ list,
+ placeBefore;
+
+ // 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 );
+ }
+ }
+ };
+jQuery.ajaxSettings = { "url": 'http://localhost:25813/',
+"isLocal": false,
+"global": true,
+"type": 'GET',
+"contentType": 'application/x-www-form-urlencoded',
+"processData": true,
+"async": true,
+"accepts": {},
+"contents": {},
+"responseFields": {},
+"converters": {},
+"flatOptions": {},
+"jsonp": 'callback' };
+jQuery.ajaxSetup = function( target, settings ) {
+///
+/// Set default values for future Ajax requests.
+///
+///
+/// A set of key/value pairs that configure the default Ajax request. All options are optional.
+///
+
+ if ( settings ) {
+ // Building a settings object
+ ajaxExtend( target, jQuery.ajaxSettings );
+ } else {
+ // Extending ajaxSettings
+ settings = target;
+ target = jQuery.ajaxSettings;
+ }
+ ajaxExtend( target, settings );
+ return target;
+ };
+jQuery.ajaxTransport = function( dataTypeExpression, func ) {
+
+
+ if ( typeof dataTypeExpression !== "string" ) {
+ func = dataTypeExpression;
+ dataTypeExpression = "*";
+ }
+
+ if ( jQuery.isFunction( func ) ) {
+ var dataTypes = dataTypeExpression.toLowerCase().split( rspacesAjax ),
+ i = 0,
+ length = dataTypes.length,
+ dataType,
+ list,
+ placeBefore;
+
+ // 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 );
+ }
+ }
+ };
+jQuery.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 && name in jQuery.attrFn ) {
+ 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;
+ }
+ };
+jQuery.attrFn = { "val": true,
+"css": true,
+"html": true,
+"text": true,
+"data": true,
+"width": true,
+"height": true,
+"offset": true,
+"blur": true,
+"focus": true,
+"focusin": true,
+"focusout": true,
+"load": true,
+"resize": true,
+"scroll": true,
+"unload": true,
+"click": true,
+"dblclick": true,
+"mousedown": true,
+"mouseup": true,
+"mousemove": true,
+"mouseover": true,
+"mouseout": true,
+"mouseenter": true,
+"mouseleave": true,
+"change": true,
+"select": true,
+"submit": true,
+"keydown": true,
+"keypress": true,
+"keyup": true,
+"error": true,
+"contextmenu": true };
+jQuery.attrHooks = { "type": {},
+"value": {},
+"tabindex": {} };
+jQuery.bindReady = function() {
+
+ if ( readyList ) {
+ return;
+ }
+
+ readyList = jQuery.Callbacks( "once memory" );
+
+ // Catch cases where $(document).ready() is called after the
+ // browser event has already occurred.
+ if ( document.readyState === "complete" ) {
+ // Handle it asynchronously to allow scripts the opportunity to delay ready
+ return setTimeout( jQuery.ready, 1 );
+ }
+
+ // Mozilla, Opera and webkit nightlies currently support this event
+ 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 if ( document.attachEvent ) {
+ // 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 toplevel = false;
+
+ try {
+ toplevel = window.frameElement == null;
+ } catch(e) {}
+
+ if ( document.documentElement.doScroll && toplevel ) {
+ doScrollCheck();
+ }
+ }
+ };
+jQuery.boxModel = true;
+jQuery.browser = { "msie": true,
+"version": '9.0' };
+jQuery.buildFragment = function( args, nodes, scripts ) {
+
+ var fragment, cacheable, cacheresults, doc,
+ first = args[ 0 ];
+
+ // nodes may contain either an explicit document object,
+ // a jQuery collection or context object.
+ // If nodes[0] contains a valid object to assign to doc
+ if ( nodes && nodes[0] ) {
+ doc = nodes[0].ownerDocument || nodes[0];
+ }
+
+ // Ensure that an attr object doesn't incorrectly stand in as a document object
+ // Chrome and Firefox seem to allow this to occur and will throw exception
+ // Fixes #8950
+ if ( !doc.createDocumentFragment ) {
+ doc = document;
+ }
+
+ // 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
Use another service to log in.
+ @RenderPage("~/Account/_ExternalLoginsList.cshtml") +