Refactor and add utilities to CapyKit, HappyCapy.Localization
Replaced `Color` class with `EnumerationHelper` and `PropertyHelper` utilities for enhanced enum/property management. Extended `EncryptedValue` and updated constants in `LocalizationHelper` for better maintainability. Added project references, Git mappings, and new SVG assets for documentation.
This commit is contained in:
parent
8405d09992
commit
29fbae37ba
10 changed files with 591 additions and 37 deletions
108
CapyKit/Attributes/ParameterAttribute.cs
Normal file
108
CapyKit/Attributes/ParameterAttribute.cs
Normal file
|
|
@ -0,0 +1,108 @@
|
|||
namespace CapyKit.Attributes;
|
||||
|
||||
/// <summary> Attribute describing parameters used in automatically generating search forms for paged models. </summary>
|
||||
[AttributeUsage(AttributeTargets.Property | AttributeTargets.Field)]
|
||||
public class ParameterAttribute : Attribute
|
||||
{
|
||||
#region Members
|
||||
|
||||
//
|
||||
|
||||
#endregion Members
|
||||
|
||||
#region Properties
|
||||
|
||||
/// <summary>
|
||||
/// Gets or sets the name parameter as passed in a POST method from the Browser. This can be hardcoded at the class level.
|
||||
/// </summary>
|
||||
/// <value> The name of the parameter. </value>
|
||||
public string ParameterName { get; private set; }
|
||||
|
||||
/// <summary>
|
||||
/// Gets the description of the parameter. This serves as a human-readable explanation or label for the parameter's purpose or usage.
|
||||
/// </summary>
|
||||
/// <value>The description text of the parameter.</value>
|
||||
public string Description { get; private set; }
|
||||
|
||||
/// <summary> Gets or sets the FontAwesome icon name. </summary>
|
||||
/// <value> The FontAwesome icon name. </value>
|
||||
public string IconName { get; private set; }
|
||||
|
||||
/// <summary> Gets or sets the ordinal position used when displaying the parameter. </summary>
|
||||
/// <value> The ordinal position. </value>
|
||||
public int Ordinal { get; private set; }
|
||||
|
||||
#endregion Properties
|
||||
|
||||
#region Constructors
|
||||
|
||||
/// <summary> Constructor. </summary>
|
||||
/// <param name="parameterName"> The name of the parameter. </param>
|
||||
public ParameterAttribute(string parameterName)
|
||||
{
|
||||
this.ParameterName = parameterName;
|
||||
this.Description = string.Empty;
|
||||
this.IconName = string.Empty;
|
||||
this.Ordinal = 0;
|
||||
}
|
||||
|
||||
/// <summary> Constructor. </summary>
|
||||
/// <param name="systemName"> The name of the system. </param>
|
||||
/// <param name="description"> Name of the resource that contains the description of
|
||||
/// the parameter. </param>
|
||||
public ParameterAttribute(string systemName, string description)
|
||||
{
|
||||
this.ParameterName = systemName;
|
||||
this.IconName = string.Empty;
|
||||
this.Description = description;
|
||||
this.Ordinal = 0;
|
||||
}
|
||||
|
||||
/// <summary> Constructor. </summary>
|
||||
/// <param name="systemName"> The name of the system. </param>
|
||||
/// <param name="description"> Name of the resource that contains the description of
|
||||
/// the parameter. </param>
|
||||
/// <param name="iconName"> The FontAwesome icon name. </param>
|
||||
public ParameterAttribute(string systemName, string description, string iconName)
|
||||
{
|
||||
this.ParameterName = systemName;
|
||||
this.Description = description;
|
||||
this.IconName = iconName;
|
||||
this.Ordinal = 0;
|
||||
}
|
||||
|
||||
/// <summary> Constructor. </summary>
|
||||
/// <param name="systemName"> The name of the system. </param>
|
||||
/// <param name="description"> Name of the resource that contains the description of
|
||||
/// the parameter. </param>
|
||||
/// <param name="iconName"> The FontAwesome icon name. </param>
|
||||
/// <param name="ordinal"> The ordinal position. </param>
|
||||
public ParameterAttribute(string systemName, string description, string iconName, int ordinal)
|
||||
{
|
||||
this.ParameterName = systemName;
|
||||
this.Description = description;
|
||||
this.IconName = iconName;
|
||||
this.Ordinal = ordinal;
|
||||
}
|
||||
|
||||
/// <summary> Constructor. </summary>
|
||||
/// <param name="systemName"> The name of the system. </param>
|
||||
/// <param name="description"> Name of the resource that contains the description of
|
||||
/// the parameter. </param>
|
||||
/// <param name="ordinal"> The ordinal position. </param>
|
||||
public ParameterAttribute(string systemName, string description, int ordinal)
|
||||
{
|
||||
this.ParameterName = systemName;
|
||||
this.Description = description;
|
||||
this.IconName = string.Empty;
|
||||
this.Ordinal = ordinal;
|
||||
}
|
||||
|
||||
#endregion Constructors
|
||||
|
||||
#region Methods
|
||||
|
||||
//
|
||||
|
||||
#endregion Methods
|
||||
}
|
||||
|
|
@ -1,13 +0,0 @@
|
|||
using System;
|
||||
using System.Collections.Generic;
|
||||
using System.Linq;
|
||||
using System.Text;
|
||||
using System.Threading.Tasks;
|
||||
|
||||
namespace CapyKit
|
||||
{
|
||||
/// <summary> An object representing a color. </summary>
|
||||
public class Color
|
||||
{
|
||||
}
|
||||
}
|
||||
|
|
@ -6,6 +6,10 @@ using System.Threading.Tasks;
|
|||
|
||||
namespace CapyKit
|
||||
{
|
||||
/// <summary>
|
||||
/// Holds a value that has been encrypted.
|
||||
/// </summary>
|
||||
/// <typeparam name="T"></typeparam>
|
||||
public class EncryptedValue<T>
|
||||
{
|
||||
#region Members
|
||||
|
|
@ -16,6 +20,9 @@ namespace CapyKit
|
|||
|
||||
#region Properties
|
||||
|
||||
/// <summary>
|
||||
/// The encrypted value.
|
||||
/// </summary>
|
||||
public T Value { get; set; }
|
||||
|
||||
#endregion
|
||||
|
|
|
|||
102
CapyKit/Helpers/EnumerationHelper.cs
Normal file
102
CapyKit/Helpers/EnumerationHelper.cs
Normal file
|
|
@ -0,0 +1,102 @@
|
|||
using CapyKit.Extensions;
|
||||
|
||||
namespace CapyKit.Helpers;
|
||||
|
||||
/// <summary> A class that contains methods for managing <see cref="Enum"/> objects. </summary>
|
||||
public static class EnumerationHelper
|
||||
{
|
||||
#region Methods
|
||||
|
||||
/// <summary> Gets enumeration value from its integer value. </summary>
|
||||
/// <typeparam name="T"> Generic type parameter representing an enumeration. </typeparam>
|
||||
/// <param name="value"> The integer value. </param>
|
||||
/// <returns> The enumeration value. </returns>
|
||||
public static T GetEnumerationValue<T>(int value) where T : struct, Enum
|
||||
{
|
||||
if (value >= 0)
|
||||
{
|
||||
return (T)(object)value;
|
||||
}
|
||||
|
||||
return default(T);
|
||||
}
|
||||
|
||||
/// <summary> Gets enumeration value from a string value. </summary>
|
||||
/// <typeparam name="T"> Generic type parameter represending an enumeration. </typeparam>
|
||||
/// <param name="value"> The string value. </param>
|
||||
/// <returns> The enumeration value. </returns>
|
||||
public static T GetEnumerationValue<T>(string value) where T : struct, Enum
|
||||
{
|
||||
foreach (var t in DeconstructNonDefault<T>())
|
||||
{
|
||||
var match = string.Equals(t.GetName(), value, StringComparison.OrdinalIgnoreCase)
|
||||
|| string.Equals(t.GetPrettyName(), value, StringComparison.OrdinalIgnoreCase)
|
||||
|| string.Equals(t.GetName(), value.Replace(" ", ""));
|
||||
|
||||
if (match)
|
||||
{
|
||||
return t;
|
||||
}
|
||||
}
|
||||
|
||||
return default(T);
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// An Enum extension method that deconstructs the given enumeration into a dictionary of its
|
||||
/// integer value and its name.
|
||||
/// </summary>
|
||||
/// <typeparam name="T"> Generic type parameter. </typeparam>
|
||||
/// <returns>
|
||||
/// An enumerator that allows foreach to be used to process deconstruct in this collection.
|
||||
/// </returns>
|
||||
public static IEnumerable<T> Deconstruct<T>() where T : struct, Enum
|
||||
{
|
||||
var dictionary = new Dictionary<int, string>();
|
||||
var enumerationType = typeof(T);
|
||||
|
||||
foreach (var e in Enum.GetValues(enumerationType))
|
||||
{
|
||||
yield return (T)e;
|
||||
}
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// An Enum extension method that deconstructs the given enumeration into a dictionary of its
|
||||
/// integer value and its name.
|
||||
/// </summary>
|
||||
/// <typeparam name="T"> Generic type parameter. </typeparam>
|
||||
/// <param name="enumeration"> The enumeration to act on. </param>
|
||||
/// <returns>
|
||||
/// An enumerator that allows foreach to be used to process deconstruct in this collection.
|
||||
/// </returns>
|
||||
public static IEnumerable<T> Deconstruct<T>(this T enumeration) where T : struct, Enum
|
||||
{
|
||||
return Deconstruct<T>();
|
||||
}
|
||||
|
||||
/// <summary> An Enum extension method that deconstruct non default. </summary>
|
||||
/// <typeparam name="T"> Generic type parameter. </typeparam>
|
||||
/// <returns>
|
||||
/// An enumerator that allows foreach to be used to process deconstruct non default in this
|
||||
/// collection.
|
||||
/// </returns>
|
||||
public static IEnumerable<T> DeconstructNonDefault<T>() where T : struct, Enum
|
||||
{
|
||||
return Deconstruct<T>().Filter(item => item.GetValue() == 0);
|
||||
}
|
||||
|
||||
/// <summary> An Enum extension method that deconstruct non default. </summary>
|
||||
/// <typeparam name="T"> Generic type parameter. </typeparam>
|
||||
/// <param name="enumeration"> The enumeration to act on. </param>
|
||||
/// <returns>
|
||||
/// An enumerator that allows foreach to be used to process deconstruct non default in this
|
||||
/// collection.
|
||||
/// </returns>
|
||||
public static IEnumerable<T> DeconstructNonDefault<T>(this T enumeration) where T : struct, Enum
|
||||
{
|
||||
return DeconstructNonDefault<T>();
|
||||
}
|
||||
|
||||
#endregion Methods
|
||||
}
|
||||
128
CapyKit/Helpers/PropertyHelper.cs
Normal file
128
CapyKit/Helpers/PropertyHelper.cs
Normal file
|
|
@ -0,0 +1,128 @@
|
|||
using System.Linq.Expressions;
|
||||
using System.Reflection;
|
||||
using CapyKit.Attributes;
|
||||
|
||||
namespace CapyKit.Helpers;
|
||||
|
||||
/// <summary> A class that contains methods for managing programatic access to C# proerties through reflection. </summary>
|
||||
/// <typeparam name="T"> Generic type parameter. </typeparam>
|
||||
public static class PropertyHelper<T>
|
||||
{
|
||||
/// <summary>
|
||||
/// Gets the reflected <typeparamref name="TProperty"/> value of an instanced
|
||||
/// <typeparamref name="T"/> object.
|
||||
/// </summary>
|
||||
/// <typeparam name="TProperty"> Type of the property. </typeparam>
|
||||
/// <param name="obj"> The instanced object. </param>
|
||||
/// <param name="propertyName"> Name of the property. </param>
|
||||
/// <returns> The reflected property value. </returns>
|
||||
public static TProperty GetPropertyValue<TProperty>(T obj, string propertyName)
|
||||
{
|
||||
return (TProperty)GetProperty(obj, propertyName).GetValue(obj);
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Gets the reflected <see cref="PropertyInfo"/> of an instanced <typeparamref name="T"/>
|
||||
/// object.
|
||||
/// </summary>
|
||||
/// <param name="obj"> The instanced object. </param>
|
||||
/// <param name="propertyName"> Name of the property. </param>
|
||||
/// <returns> The reflected <see cref="PropertyInfo"/>. </returns>
|
||||
public static PropertyInfo GetProperty(T obj, string propertyName)
|
||||
{
|
||||
if (obj == null)
|
||||
{
|
||||
throw new ArgumentNullException("obj",
|
||||
string.Format("The value provided for the property {0} was null.", propertyName));
|
||||
}
|
||||
|
||||
return obj.GetType().GetProperties().Where(p => p.Name.Equals(propertyName, StringComparison.OrdinalIgnoreCase))
|
||||
.FirstOrDefault();
|
||||
}
|
||||
|
||||
/// <summary> Gets the reflected <typeparamref name="TProperty"/> value of an instanced <typeparamref name="T"/> object property value as described by a <paramref name="selector"/>. </summary>
|
||||
/// <typeparam name="TProperty"> Type of the property. </typeparam>
|
||||
/// <param name="obj"> The instanced object. </param>
|
||||
/// <param name="selector"> The property selector function that identifies the property. </param>
|
||||
/// <returns> The reflected property value. </returns>
|
||||
public static TProperty GetPropertyValue<TProperty>(T obj, Expression<Func<T, TProperty>> selector)
|
||||
{
|
||||
return (TProperty)GetProperty(selector).GetValue(obj);
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Gets the reflected <see cref="PropertyInfo"/> of an <typeparamref name="T"/> object as
|
||||
/// described by a <paramref name="selector"/>.
|
||||
/// </summary>
|
||||
/// <exception cref="InvalidOperationException"> Thrown when the <paramref name="selector"/> does
|
||||
/// not return a <see cref="LambdaExpression.Body"/>
|
||||
/// of type
|
||||
/// <see cref="ExpressionType.MemberAccess"/>. </exception>
|
||||
/// <typeparam name="TProperty"> Type of the property. </typeparam>
|
||||
/// <param name="selector"> The property selector function that identifies the property. </param>
|
||||
/// <returns> The reflected <see cref="PropertyInfo"/>. </returns>
|
||||
public static PropertyInfo GetProperty<TProperty>(Expression<Func<T, TProperty>> selector)
|
||||
{
|
||||
Expression body = selector;
|
||||
|
||||
if (body is LambdaExpression)
|
||||
{
|
||||
body = ((LambdaExpression)body).Body;
|
||||
}
|
||||
|
||||
switch (body.NodeType)
|
||||
{
|
||||
case ExpressionType.MemberAccess:
|
||||
return (PropertyInfo)((MemberExpression)body).Member;
|
||||
|
||||
default:
|
||||
throw new InvalidOperationException(
|
||||
"The selector provided did not return a member or property accessor.");
|
||||
}
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Gets an <see cref="EnumerationDescriptionAttribute"/> attribute from a given property.
|
||||
/// </summary>
|
||||
/// <typeparam name="TProperty"> Type of the property. </typeparam>
|
||||
/// <param name="selector"> The property selector function that identifies the property. </param>
|
||||
/// <returns> The enumeration description of the property. </returns>
|
||||
public static EnumerationDescriptionAttribute GetEnumerationDescription<TProperty>(
|
||||
Expression<Func<T, TProperty>> selector)
|
||||
{
|
||||
return GetPropertyCustomAttribute<EnumerationDescriptionAttribute, TProperty>(selector);
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Gets a <see cref="ValueFormatAttribute"/> attribute from the given property.
|
||||
/// </summary>
|
||||
/// <typeparam name="TProperty"> Type of the property. </typeparam>
|
||||
/// <param name="selector"> The property selector function that identifies the property. </param>
|
||||
/// <returns> The value format of the property. </returns>
|
||||
public static ValueFormatAttribute GetValueFormat<TProperty>(Expression<Func<T, TProperty>> selector)
|
||||
{
|
||||
return GetPropertyCustomAttribute<ValueFormatAttribute, TProperty>(selector);
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Gets a <see cref="ParameterAttribute"/> attribute from the given property.
|
||||
/// </summary>
|
||||
/// <typeparam name="TProperty"> Type of the property. </typeparam>
|
||||
/// <param name="selector"> The property selector function that identifies the property. </param>
|
||||
/// <returns> The paged link parameter of the property. </returns>
|
||||
public static ParameterAttribute GetPagedLinkParameter<TProperty>(Expression<Func<T, TProperty>> selector)
|
||||
{
|
||||
return GetPropertyCustomAttribute<ParameterAttribute, TProperty>(selector);
|
||||
}
|
||||
|
||||
/// <summary> Gets custom <typeparamref name="TAttribute"/> <see cref="Attribute"/> from a given property. </summary>
|
||||
/// <typeparam name="TAttribute"> Type of the attribute. </typeparam>
|
||||
/// <typeparam name="TProperty"> Type of the property. </typeparam>
|
||||
/// <param name="selector"> The property selector function that identifies the property. </param>
|
||||
/// <returns> The custom <see cref="Attribute"/> of the property. </returns>
|
||||
public static TAttribute GetPropertyCustomAttribute<TAttribute, TProperty>(Expression<Func<T, TProperty>> selector)
|
||||
where TAttribute : Attribute
|
||||
{
|
||||
return GetProperty(selector).GetCustomAttribute(typeof(TAttribute)) as TAttribute;
|
||||
}
|
||||
}
|
||||
|
|
@ -30,7 +30,7 @@ namespace CapyKit.Helpers
|
|||
#endregion Members
|
||||
|
||||
#region Methods
|
||||
|
||||
|
||||
public static bool CompareHashedPassword<T>(Password existingPassword, string password, string salt,
|
||||
params object[] args)
|
||||
where T : IPasswordAlgorithm
|
||||
|
|
@ -71,7 +71,8 @@ namespace CapyKit.Helpers
|
|||
params object[] args)
|
||||
where T : IPasswordAlgorithm
|
||||
{
|
||||
if (string.IsNullOrWhiteSpace(storedHash) || string.IsNullOrEmpty(password) || string.IsNullOrWhiteSpace(salt))
|
||||
if (string.IsNullOrWhiteSpace(storedHash) || string.IsNullOrEmpty(password) ||
|
||||
string.IsNullOrWhiteSpace(salt))
|
||||
{
|
||||
return false;
|
||||
}
|
||||
|
|
@ -88,48 +89,52 @@ namespace CapyKit.Helpers
|
|||
}
|
||||
|
||||
/// <summary>
|
||||
/// Compares a plaintext password with a persisted hash and salt.
|
||||
/// Compares a hashed password with a plaintext password by using a specified hashing algorithm <typeparamref name="T"/>.
|
||||
/// This method requires the existing hash, the plaintext password to compare, and the associated salt value.
|
||||
/// </summary>
|
||||
/// <typeparam name="T">The password hashing algorithm.</typeparam>
|
||||
/// <param name="storedHash">The persisted hash.</param>
|
||||
/// <typeparam name="T">The type of the password hashing algorithm implementing <see cref="IPasswordAlgorithm"/>.</typeparam>
|
||||
/// <param name="storedHash">The stored hash of the password as a byte array.</param>
|
||||
/// <param name="password">The plaintext password to verify.</param>
|
||||
/// <param name="salt">The persisted salt.</param>
|
||||
/// <param name="args">Arguments used to construct the password algorithm.</param>
|
||||
/// <returns><see langword="true"/> when the password matches the persisted hash.</returns>
|
||||
/// <param name="salt">The salt used during the password hashing process as a byte array.</param>
|
||||
/// <param name="args">Optional arguments required for constructing the password hashing algorithm instance.</param>
|
||||
/// <returns>
|
||||
/// <see langword="true"/> if the hashed password matches the stored hash, <see langword="false"/> otherwise.
|
||||
/// </returns>
|
||||
public static bool CompareHashedPassword<T>(byte[] storedHash, string password, byte[] salt,
|
||||
params object[] args)
|
||||
where T : IPasswordAlgorithm
|
||||
{
|
||||
if (storedHash == null || storedHash.Length == 0 || string.IsNullOrEmpty(password) || salt == null || salt.Length == 0)
|
||||
if (storedHash == null || storedHash.Length == 0 || string.IsNullOrEmpty(password) || salt == null ||
|
||||
salt.Length == 0)
|
||||
{
|
||||
return false;
|
||||
}
|
||||
|
||||
var candidatePassword = GetPassword<T>(password, salt, args);
|
||||
return candidatePassword is not null && candidatePassword.Hash.Length == storedHash.Length &&
|
||||
CryptographicOperations.FixedTimeEquals(storedHash, candidatePassword.Hash);
|
||||
CryptographicOperations.FixedTimeEquals(storedHash, candidatePassword.Hash);
|
||||
}
|
||||
|
||||
|
||||
public static bool CompareHashedPassword(Password existingPassword, string password, string salt,
|
||||
IPasswordAlgorithm algorithm, params object[] args)
|
||||
{
|
||||
var saltBytes = Convert.FromBase64String(salt);
|
||||
|
||||
|
||||
return CompareHashedPassword(existingPassword, password, saltBytes, algorithm, args);
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Compares an unencrypted <paramref name="password"/> with a stored, encrypted <paramref name="existingPassword"/>.
|
||||
/// This method uses the specified <paramref name="algorithm"/> to retrieve the hashed version
|
||||
/// of the <paramref name="password"/> and then compares it with the <paramref name="existingPassword"/>.
|
||||
/// This method uses the specified password hashing algorithm of type <typeparamref name="T"/> to hash the <paramref name="password"/>
|
||||
/// and then compares it with the <paramref name="existingPassword"/>.
|
||||
/// </summary>
|
||||
/// <param name="existingPassword">The existing, encrypted password.</param>
|
||||
/// <param name="password">The unencrypted password to be compared.</param>
|
||||
/// <param name="salt">The salt value used in password hashing.</param>
|
||||
/// <param name="algorithm">The password hashing algorithm.</param>
|
||||
/// <param name="args">Additional arguments required for constructing the password algorithm instance.</param>
|
||||
/// <typeparam name="T">The type of the password hashing algorithm, implementing <see cref="IPasswordAlgorithm"/>.</typeparam>
|
||||
/// <param name="existingPassword">The stored, encrypted password to compare against.</param>
|
||||
/// <param name="password">The plain text password to be compared.</param>
|
||||
/// <param name="salt">The salt value used for hashing the plain text password.</param>
|
||||
/// <param name="args">Optional additional arguments required for initializing the password hashing algorithm.</param>
|
||||
/// <returns>
|
||||
/// <see langword="true"/> if hash comparison succeeds, <see langword="false"/> if it fails.
|
||||
/// <see langword="true"/> if the password hashes match, otherwise <see langword="false"/>.
|
||||
/// </returns>
|
||||
public static bool CompareHashedPassword(Password existingPassword, string password, byte[] salt,
|
||||
IPasswordAlgorithm algorithm, params object[] args)
|
||||
|
|
@ -172,7 +177,8 @@ namespace CapyKit.Helpers
|
|||
/// instance of <typeparamref name="T"/> created using any optional constructor arguments provided.
|
||||
/// </returns>
|
||||
/// <seealso cref="SecurityHelper.SALT_SIZE"/>
|
||||
public static Password GetPassword<T>(string password, int saltSize, params object[] args) where T : IPasswordAlgorithm
|
||||
public static Password GetPassword<T>(string password, int saltSize, params object[] args)
|
||||
where T : IPasswordAlgorithm
|
||||
{
|
||||
var salt = GetRandomBytes(saltSize);
|
||||
return GetPassword<T>(password, salt, args);
|
||||
|
|
@ -298,8 +304,10 @@ namespace CapyKit.Helpers
|
|||
"No valid characters were provided, so all valid caharacters will be assumed.");
|
||||
validCharacters = new[]
|
||||
{
|
||||
ValidCharacterCollection.Lowercase, ValidCharacterCollection.Uppercase,
|
||||
ValidCharacterCollection.Numbers, ValidCharacterCollection.Special
|
||||
ValidCharacterCollection.Lowercase,
|
||||
ValidCharacterCollection.Uppercase,
|
||||
ValidCharacterCollection.Numbers,
|
||||
ValidCharacterCollection.Special
|
||||
};
|
||||
}
|
||||
|
||||
|
|
@ -474,4 +482,4 @@ namespace CapyKit.Helpers
|
|||
[EnumerationDescriptionAttribute(SecurityHelper.SPECIAL_CHARACTERS)]
|
||||
Special,
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
@ -67,6 +67,17 @@ namespace CapyKit
|
|||
this.Salt = salt;
|
||||
this.Algorithm = algorithm;
|
||||
}
|
||||
|
||||
public Password(string password, string salt, IPasswordAlgorithm algorithm, params object[] args)
|
||||
{
|
||||
// We know there will always be a salt, so we can prepend it to h
|
||||
var saltBytes = Convert.FromBase64String(salt);
|
||||
var augmented = args.Prepend(saltBytes).ToArray();
|
||||
|
||||
this.Hash = algorithm.Encrypt(password, augmented);
|
||||
this.Salt = saltBytes;
|
||||
this.Algorithm = algorithm;
|
||||
}
|
||||
|
||||
#region Methods
|
||||
|
||||
|
|
|
|||
96
Docs/assets/favicon.svg
Normal file
96
Docs/assets/favicon.svg
Normal file
|
|
@ -0,0 +1,96 @@
|
|||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<!-- Generator: Adobe Illustrator 15.0.0, SVG Export Plug-In . SVG Version: 6.00 Build 0) -->
|
||||
<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
|
||||
<svg version="1.1" id="Layer_1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink"
|
||||
width="38pt" height="38pt" viewBox="0 0 792 612" preserveAspectRatio="xMidYMid meet" xml:space="preserve">
|
||||
<path fill="#603913" d="M364.207,272.576c-0.146-0.149-0.239-0.236-0.239-0.236c0.763-0.229,2.034,0.312,2.034,0.312
|
||||
c-0.739-1.533-4.054-1.182-4.054-1.182c0.881-0.451,2.203-0.664,2.203-0.664c-0.874-0.754-3.123-0.244-3.123-0.244
|
||||
c0.488-0.221,1.355-0.408,1.355-0.408c-1.61-0.562-3.957,0.554-4.748,0.973C359.798,271.407,361.976,271.882,364.207,272.576z"/>
|
||||
<path fill="#603913" d="M327.992,279.541c-0.245,0.009-0.724,0.167-0.724,0.167c0.359-0.623,2.056-0.815,2.056-0.815
|
||||
s-0.323-0.13-1.127-0.22c-0.803-0.09-1.518,0.298-1.518,0.298s0.396-0.6,1.414-0.975c1.018-0.374,1.551,0.106,1.551,0.106
|
||||
s0.5-0.839,0.723-1.018c0.223-0.178,0.481-0.896,0.481-0.896c-0.288-0.209-1.124,0.093-1.124,0.093
|
||||
c0.698-0.618,1.293-0.768,1.493-0.804c0.008-0.019,0.016-0.037,0.024-0.056c-0.642-0.528-1.394-0.484-1.394-0.484
|
||||
c0.432-0.163,1.21-0.271,1.737-0.33c0.451-1.085,0.729-1.84,0.729-1.84s-2.645,0.244-5.598,0.74
|
||||
c-3.555,0.597-4.408,1.638-5.107,2.972s-2.481,7.189-1.947,8.083c0.569,0.951,1.509,0.312,2.548-0.159
|
||||
c1.253-0.568,2.476-0.747,4.768-2.07c0.716-0.413,1.505-1.5,2.251-2.8C328.828,279.531,328.297,279.53,327.992,279.541z"/>
|
||||
<g>
|
||||
<path fill="#C49A6C" d="M320.013,281.31c0.201-0.811,0.447-1.665,0.694-2.439C320.405,279.67,320.177,280.494,320.013,281.31z"/>
|
||||
<path fill="#C49A6C" d="M324.131,274.18c0.387-0.156,0.836-0.298,1.366-0.426C324.861,273.895,324.391,274.037,324.131,274.18z"/>
|
||||
<path fill="#C49A6C" d="M420.943,286.857c-0.859-4.271-3.583-8.341-5.427-9.186c-4.589-2.101-7.93-1.373-7.93-1.373
|
||||
c0.376-0.939,4.514-1.79,4.514-1.79c-1.817-1.913-6.275-0.594-6.275-0.594c0.628-1.004,3.389-1.53,3.389-1.53
|
||||
c-2.511-0.777-5.773,0.771-5.773,0.771c0.879-3.018,4.143-2.761,4.143-2.761c-3.515-0.758-6.241,1.92-6.241,1.92
|
||||
c-5.426-0.845-14.975,1.699-14.975,1.699l-3.922,0.979c-2.304,0.636-3.228,1.13-6.42,1.227c-5.368,0.163-5.368-1.594-11.549-3.562
|
||||
c-6.183-1.969-11.934-2.229-18.1-1.398c-3.251,0.439-9.13,0.951-14.061,1.509c0,0.001-0.279,0.754-0.729,1.839
|
||||
c-0.527,0.059-1.305,0.167-1.737,0.33c0,0,0.751-0.044,1.394,0.484c-0.008,0.019-0.016,0.037-0.024,0.056
|
||||
c-0.2,0.036-0.795,0.186-1.493,0.804c0,0,0.836-0.302,1.124-0.093c0,0-0.258,0.718-0.481,0.896
|
||||
c-0.224,0.179-0.723,1.018-0.723,1.018s-0.533-0.48-1.551-0.106c-1.018,0.375-1.414,0.975-1.414,0.975s0.714-0.388,1.518-0.298
|
||||
c0.804,0.09,1.127,0.22,1.127,0.22s-1.697,0.192-2.056,0.815c0,0,0.479-0.158,0.724-0.167c0.305-0.01,0.836-0.009,1.238-0.007
|
||||
c-0.747,1.3-1.536,2.388-2.251,2.8c-2.292,1.323-3.515,1.502-4.768,2.07c-1.037,0.469-1.976,1.106-2.545,0.163
|
||||
c-0.018,1.237,0.099,2.312,0.292,3.053c0.303,1.166,0.432,2.056,1.534,3.808c0.072,0.115,0.452,1.012,0.452,1.012
|
||||
c-1.986-1.726-3.784,1.428,1.127,3.462c0.696,0.288,7.858,2.964,12.122,2.605c0,0,3.769-0.183,6.182,0.801
|
||||
c0.135,0.055,0.266,0.184,0.425,0.311l-0.001,0.001c0,0,0.501,3.652,2.642,5.408c0,0-1.108-2.202-0.454-3.28
|
||||
c0,0,0.513,1.601,1.466,2.684c0,0-0.508-0.769-0.279-1.673c0.026,0.025,0.053,0.051,0.079,0.076
|
||||
c0.16,0.605,0.734,2.495,1.788,3.048c0,0-0.679-1.069-1.032-2.322c0.27,0.259,0.547,0.524,0.834,0.797
|
||||
c2.323,2.203,5.193,4.811,8.389,7.22l-0.007-0.003c0,0,0.187,4.688,3.27,6.824c0,0-1.708-3.143-0.607-4.486
|
||||
c0,0,0.738,3.401,2.086,3.993c0,0-0.603-0.889-0.378-2.41c0,0,1.071,2.903,2.425,2.903c0,0-0.498-0.725-0.808-1.489
|
||||
c-0.156-0.382-0.1-0.917,0.005-1.382c3.979,2.225,8.208,3.733,12.368,3.639c0,0,1.302,0.162,2.278,1.788
|
||||
c0.085,0.144,0.204,0.347,0.345,0.597c-0.375,0.753-1.372,3.195,0.001,5.704c0,0-0.108-2.851,1.349-3.04
|
||||
c0,0-0.795,2.46,0.068,3.574c0,0-0.128-0.873,0.682-1.663c0,0-0.315,2.349,0.795,3.11c0,0-0.11-0.717-0.051-1.352
|
||||
c0.015-0.152,0.085-0.297,0.184-0.434c1.266,2.73,2.313,5.482,1.995,6.518c-0.65,2.115-2.44,3.742-3.579,4.556
|
||||
c-1.138,0.813-1.302,1.79-0.325,1.79c0.556,0,1.058-0.264,1.388-0.49c-0.56,0.491-1.371,1.396-0.087,1.629
|
||||
c1.791,0.325,3.742-1.789,3.742-1.789s0.222,2.954,1.814,2.215c0.994-0.461,2.536-3.633,2.741-4.33
|
||||
c0.063-0.213,0.347,2.023,1.27,2.521c0.676,0.364,1.496-0.244,1.333-1.708c-0.056-0.499-0.622-2.303-1.26-4.639
|
||||
c-1.234-4.515-2.737-11.012-1.343-13.906c0,0,0.33,0.184,0.858,0.449c0.132,0.631,0.753,2.867,3.061,3.812
|
||||
c0,0-1.595-1.819-0.735-2.724c0,0,0.791,2.046,1.955,2.319c0,0-0.551-0.508-0.439-1.46c0,0,1.046,1.716,2.186,1.623
|
||||
c0,0-0.456-0.413-0.755-0.862c-0.141-0.213-0.131-0.521-0.075-0.802c0.62,0.092,1.174,0.085,1.591-0.079
|
||||
c0.732-0.287,1.226-0.492,1.555-0.64c-0.623,0.579-1.655,1.798-0.58,2.755c1.465,1.301,0.652,0.976,0,1.789
|
||||
c-0.65,0.812-3.253,1.79-4.066,2.604c-0.813,0.812-2.277,2.439-2.44,3.253s0.517,1.403,1.627-0.162
|
||||
c0.158-0.223-0.401,0.638-0.804,1.491c-0.604,1.277,0.266,2.204,0.857,2.153c1.652-0.141,3.363-1.855,4.503-2.994
|
||||
c1.138-1.139-0.489,1.301-0.326,2.276c0.163,0.978,0.73,0.978,1.667,0c0.937-0.976,1.424-2.113,3.864-4.473
|
||||
c2.44-2.358,3.092-3.498,3.905-6.264c0.35-1.19,1.093-3.559,2.071-6.193c0.898-2.358,6.056-6.037,6.09-6.112
|
||||
c0.001-0.002,0.001-0.003,0.002-0.004c1.524,0.008,3.12-2.416,3.12-2.416c-0.973,0.273-1.835,0.001-1.836,0
|
||||
c2.809-0.272,4.346-4.439,4.346-4.439c-0.987,1.267-2.517,1.82-2.517,1.82c2.79-4.381,3.897-9.178,3.897-9.178
|
||||
c1.004,0.982,1.255,3.159,1.255,3.159c0.878-2.761-0.628-4.895-0.628-4.895c1.507,0.879,1.692,2.173,1.692,2.173
|
||||
c0.438-2.847-0.563-4.432-0.563-4.432c1.507,1.38,1.256,2.886,1.256,2.886C423.02,294.121,421.804,291.128,420.943,286.857z"/>
|
||||
</g>
|
||||
<path fill="#383637" d="M353.194,276.485c-0.338-0.031-0.628-0.192-0.942-0.434c-0.134-0.103-0.078-0.076-0.078-0.076
|
||||
c0.319,0.083,1.262-0.208,1.81-0.563c0.623-0.404,0.907-0.954,0.907-0.954s-0.476,0.396-1.451,0.856
|
||||
c-0.976,0.461-1.839,0.098-1.706,0.046c0.253-0.101,1.07-0.284,1.594-0.59c0.525-0.306,0.773-1.203,0.773-1.203
|
||||
c-0.074,0.151-0.544,0.623-1.329,1.04c-1.104,0.588-1.506,0.246-1.506,0.246s0.24-0.078,0.74-0.334
|
||||
c0.505-0.259,0.851-0.768,0.851-0.768c-0.212,0.286-1.339,0.673-1.812,0.788c-0.474,0.114-0.86-0.363-2.058-0.747
|
||||
c-0.664-0.212-1.084-0.373-1.473-0.284c-0.562,0.049-1.065,0.428-1.244,1c-0.235,0.755,0.186,1.558,0.94,1.793
|
||||
c0.756,0.236,1.559-0.186,1.794-0.941c0.078-0.251,0.078-0.507,0.023-0.746c0.558,0.312,1.376,1.018,1.819,1.393
|
||||
c0.879,0.744,1.256,0.785,1.972,0.887c0.948,0.136,1.784-0.428,1.784-0.428C354.292,276.515,353.396,276.504,353.194,276.485z"/>
|
||||
<path fill="#603913" d="M358.125,272.968c0,0,3.494-0.654,5.104,0.661c0,0-0.88-0.122-1.414-0.08c0,0,2.289,0.289,2.852,1.296
|
||||
c0,0-1.315-0.252-2.297-0.13c0,0,3.235,0.804,3.404,2.497c0,0-1.009-0.943-1.805-0.988c0,0,1.039,2.009,0.943,3.687
|
||||
c-0.095,1.68-2.645,2.866-3.852,2.265c-1.207-0.6-2.649-1.746-2.776-2.64c0,0,1.116-0.911,1.674,0.185
|
||||
c0.559,1.094-0.788-1.73-1.501-1.681c0,0,1.28-0.684,1.524-0.293c0,0-0.996-1.185-1.444-1.121
|
||||
C358.539,276.626,361.046,274.641,358.125,272.968z"/>
|
||||
<path fill="#383637" d="M326.146,276.278c-0.002-0.001-0.004-0.001-0.006-0.002c-0.3-0.309-0.851-0.672-1.869-0.944
|
||||
c-0.824-0.22-1.683-0.223-2.27,0.429c-0.883,0.979-2.031,4.331-1.93,6.201c0,0,0.078,1.035,0.434,1.488c0,0,0.367-2.701,0.979-4.316
|
||||
c0.61-1.615,0.969-2.982,1.452-2.973c0.336,0.006,1.24,0.187,1.979,0.495c-0.012,0.021-0.026,0.038-0.037,0.06
|
||||
c-0.23,0.471-0.035,1.039,0.436,1.269c0.47,0.23,1.039,0.035,1.269-0.436C326.812,277.077,326.618,276.508,326.146,276.278z"/>
|
||||
<path fill="#A97C50" d="M361.217,315.529c-0.105,0.465-0.161,1-0.005,1.382c0.311,0.765,0.808,1.489,0.808,1.489
|
||||
c-1.354,0-2.425-2.903-2.425-2.903c-0.025,0.173-0.039,0.337-0.046,0.492c0.619,1.479,1.45,3.511,2.19,5.467
|
||||
c-0.328,0.837-0.913,2.68-0.441,4.232c0,0,0.238-1.92,1.134-2.34c0,0,0,0.001,0,0.001c-0.008,0.028-0.36,1.28-0.213,2.392
|
||||
c0,0,0.004-0.767,0.599-1.258c0.002,0.007,0.004,0.014,0.007,0.021c-0.098,0.267-0.694,1.976-0.202,2.879
|
||||
c0,0,0.029-1.152,0.419-2.188c0.281,0.93,0.456,1.679,0.456,2.107c0,2.277,0.326,4.555-1.463,5.774
|
||||
c-0.221,0.15-0.464,0.308-0.715,0.466c-0.345-0.022-1.122-0.063-1.852-0.029c-0.977,0.045-2.014,0.349-1.421,0.577
|
||||
c0.591,0.23,1.629,0.252,1.629,0.252s-1.797,0.017-2.511,0.436c-0.714,0.418-1.249,0.719-0.562,0.909
|
||||
c0.235,0.065,0.53,0.09,0.818,0.096c-0.164,0.087-0.266,0.142-0.266,0.142s-2.081,1.369-0.779,2.02
|
||||
c1.301,0.65,4.358-1.369,4.358-1.369s-1.627,1.673-0.651,2.057c0.977,0.385,1.999-0.43,3.44-1.243s2.579-1.22,3.23-2.767
|
||||
c0.65-1.545,1.302-5.166,1.627-8.357c0.172-1.688,0.754-4.852,1.264-7.456C366.785,318.241,363.942,317.054,361.217,315.529z"/>
|
||||
<path fill="#A97C50" d="M395.546,324.211c-1.075-0.957-0.043-2.176,0.58-2.755c-0.329,0.147-0.823,0.353-1.555,0.64
|
||||
c-0.417,0.164-0.972,0.171-1.591,0.079c-0.056,0.28-0.066,0.589,0.075,0.802c0.299,0.449,0.755,0.862,0.755,0.862
|
||||
c-1.14,0.093-2.186-1.623-2.186-1.623c-0.112,0.952,0.439,1.46,0.439,1.46c-1.165-0.273-1.955-2.319-1.955-2.319
|
||||
c-0.859,0.904,0.735,2.724,0.735,2.724c-1.158-0.474-1.891-1.273-2.351-2.032c-0.146,0.083-0.292,0.165-0.429,0.242
|
||||
c-0.381,0.212-0.997,0.505-1.696,0.836c0.003,0.59,0.04,1.214,0.104,1.858c0.933-0.404,1.755-0.742,1.755-0.742
|
||||
s-0.873,0.535-1.718,1.101c0.061,0.535,0.137,1.083,0.228,1.638c0.795-0.505,1.491-1.011,1.491-1.011s-0.981,1.097-1.025,1.75
|
||||
c-0.032,0.46,0.319,0.816,1.676,0.263c1.215-0.495,3.417-1.424,5.044-2.013c0.792-0.287,1.682-0.59,2.391-0.956
|
||||
C396.216,324.842,395.984,324.6,395.546,324.211z"/>
|
||||
<path fill="#383637" d="M333.477,291.064c-0.047-0.039-0.091-0.085-0.133-0.136c0.004-0.005,0.007-0.009,0.007-0.009
|
||||
s-0.005,0.002-0.011,0.004c-0.708-0.874-0.579-3.316-1.104-2.323c-0.46,0.868-0.16,2.041,0.243,2.621
|
||||
c-1.622,0.542-5.123,1.611-7.155,1.503c-2.017-0.107-3.63-0.865-3.63-0.865c-0.457,0.182,0.304,0.645,0.304,0.645
|
||||
s2.6,1.303,4.324,1.15c3.61-0.319,5.543-1.447,6.423-2.151c0.607,0.415,2.562,0.883,3.145,0.431
|
||||
C336.471,291.482,334.255,291.7,333.477,291.064z"/>
|
||||
</svg>
|
||||
|
After Width: | Height: | Size: 9.7 KiB |
98
Docs/assets/logo.svg
Normal file
98
Docs/assets/logo.svg
Normal file
|
|
@ -0,0 +1,98 @@
|
|||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<!-- Generator: Adobe Illustrator 15.0.0, SVG Export Plug-In . SVG Version: 6.00 Build 0) -->
|
||||
<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
|
||||
<svg version="1.1" id="Layer_1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink"
|
||||
width="38pt" height="38pt" viewBox="0 0 792 612" preserveAspectRatio="xMidYMid meet" xml:space="preserve">
|
||||
<path fill="#603913" d="M348.318,195.53c-0.482-0.494-0.791-0.78-0.791-0.78c2.522-0.759,6.724,1.03,6.724,1.03
|
||||
c-2.443-5.067-13.397-3.907-13.397-3.907c2.912-1.49,7.281-2.192,7.281-2.192c-2.888-2.494-10.322-0.805-10.322-0.805
|
||||
c1.612-0.732,4.48-1.348,4.48-1.348c-5.321-1.859-13.079,1.831-15.694,3.217C333.745,191.666,340.942,193.236,348.318,195.53z"/>
|
||||
<path fill="#603913" d="M228.622,218.549c-0.809,0.028-2.395,0.55-2.395,0.55c1.188-2.059,6.797-2.694,6.797-2.694
|
||||
s-1.069-0.431-3.725-0.728s-5.016,0.987-5.016,0.987s1.308-1.984,4.671-3.222c3.365-1.237,5.127,0.351,5.127,0.351
|
||||
s1.652-2.774,2.391-3.364c0.737-0.589,1.59-2.963,1.59-2.963c-0.951-0.693-3.713,0.306-3.713,0.306
|
||||
c2.308-2.041,4.274-2.539,4.935-2.656c0.027-0.061,0.054-0.123,0.08-0.184c-2.122-1.747-4.604-1.6-4.604-1.6
|
||||
c1.427-0.54,3.998-0.896,5.741-1.089c1.489-3.589,2.41-6.081,2.41-6.081s-8.741,0.805-18.504,2.444
|
||||
c-11.75,1.973-14.567,5.414-16.878,9.824c-2.312,4.411-8.202,23.762-6.437,26.715c1.88,3.142,4.988,1.03,8.421-0.524
|
||||
c4.144-1.876,8.183-2.468,15.76-6.841c2.365-1.365,4.973-4.958,7.44-9.256C231.385,218.517,229.63,218.514,228.622,218.549z"/>
|
||||
<g>
|
||||
<path fill="#C49A6C" d="M202.252,224.395c0.662-2.68,1.477-5.504,2.294-8.061C203.545,218.978,202.793,221.7,202.252,224.395z"/>
|
||||
<path fill="#C49A6C" d="M215.86,200.831c1.28-0.514,2.766-0.985,4.515-1.409C218.275,199.887,216.72,200.357,215.86,200.831z"/>
|
||||
<path fill="#C49A6C" d="M535.84,242.73c-2.841-14.116-11.842-27.569-17.935-30.361c-15.167-6.945-26.211-4.538-26.211-4.538
|
||||
c1.244-3.104,14.919-5.915,14.919-5.915c-6.006-6.323-20.74-1.965-20.74-1.965c2.075-3.318,11.199-5.057,11.199-5.057
|
||||
c-8.297-2.569-19.081,2.549-19.081,2.549c2.904-9.974,13.689-9.125,13.689-9.125c-11.615-2.508-20.628,6.345-20.628,6.345
|
||||
c-17.933-2.792-49.492,5.616-49.492,5.616l-12.964,3.238c-7.615,2.101-10.669,3.735-21.22,4.056
|
||||
c-17.741,0.536-17.741-5.268-38.173-11.775c-20.434-6.507-39.443-7.369-59.821-4.621c-10.745,1.45-30.177,3.144-46.472,4.986
|
||||
c-0.002,0.003-0.922,2.494-2.41,6.081c-1.743,0.193-4.314,0.549-5.741,1.089c0,0,2.482-0.147,4.604,1.6
|
||||
c-0.026,0.061-0.053,0.123-0.08,0.184c-0.66,0.117-2.627,0.615-4.935,2.656c0,0,2.762-0.999,3.713-0.306
|
||||
c0,0-0.853,2.374-1.59,2.963c-0.738,0.59-2.391,3.364-2.391,3.364s-1.762-1.588-5.127-0.351c-3.363,1.237-4.671,3.222-4.671,3.222
|
||||
s2.36-1.284,5.016-0.987s3.725,0.728,3.725,0.728s-5.608,0.635-6.797,2.694c0,0,1.586-0.521,2.395-0.55
|
||||
c1.008-0.035,2.763-0.032,4.092-0.023c-2.468,4.298-5.075,7.891-7.44,9.256c-7.577,4.373-11.616,4.964-15.76,6.841
|
||||
c-3.427,1.551-6.53,3.657-8.411,0.539c-0.06,4.088,0.325,7.642,0.962,10.091c1.003,3.853,1.428,6.794,5.07,12.587
|
||||
c0.238,0.378,1.493,3.343,1.493,3.343c-6.563-5.703-12.506,4.72,3.725,11.444c2.3,0.952,25.972,9.796,40.065,8.609
|
||||
c0,0,12.457-0.603,20.433,2.65c0.445,0.181,0.878,0.607,1.405,1.027l-0.005,0.005c0,0,1.657,12.071,8.733,17.873
|
||||
c0,0-3.661-7.277-1.5-10.84c0,0,1.697,5.29,4.847,8.871c0,0-1.678-2.541-0.921-5.531c0.087,0.083,0.174,0.168,0.262,0.252
|
||||
c0.528,1.999,2.425,8.247,5.908,10.075c0,0-2.244-3.535-3.411-7.673c0.893,0.855,1.81,1.731,2.758,2.632
|
||||
c7.678,7.281,17.164,15.899,27.725,23.862l-0.021-0.01c0,0,0.617,15.496,10.806,22.557c0,0-5.646-10.389-2.008-14.83
|
||||
c0,0,2.438,11.242,6.896,13.2c0,0-1.99-2.939-1.251-7.968c0,0,3.54,9.598,8.015,9.598c0,0-1.645-2.396-2.671-4.922
|
||||
c-0.514-1.264-0.328-3.031,0.019-4.569c13.149,7.354,27.128,12.341,40.877,12.026c0,0,4.302,0.537,7.527,5.912
|
||||
c0.282,0.472,0.674,1.146,1.142,1.972c-1.24,2.487-4.533,10.562,0.004,18.852c0,0-0.358-9.42,4.459-10.047
|
||||
c0,0-2.627,8.131,0.226,11.814c0,0-0.423-2.887,2.253-5.497c0,0-1.043,7.763,2.629,10.277c0,0-0.363-2.366-0.168-4.464
|
||||
c0.048-0.504,0.282-0.984,0.608-1.434c4.185,9.023,7.646,18.12,6.593,21.541c-2.15,6.991-8.065,12.369-11.829,15.057
|
||||
c-3.763,2.688-4.304,5.916-1.075,5.916c1.836,0,3.495-0.87,4.588-1.62c-1.852,1.624-4.531,4.612-0.288,5.383
|
||||
c5.917,1.075,12.368-5.913,12.368-5.913s0.732,9.765,5.996,7.322c3.285-1.525,8.381-12.007,9.06-14.313
|
||||
c0.207-0.704,1.146,6.688,4.196,8.331c2.232,1.203,4.944-0.806,4.407-5.644c-0.185-1.65-2.057-7.612-4.165-15.334
|
||||
c-4.079-14.919-9.046-36.395-4.438-45.961c0,0,1.091,0.607,2.835,1.486c0.437,2.085,2.489,9.477,10.115,12.601
|
||||
c0,0-5.271-6.015-2.431-9.003c0,0,2.614,6.761,6.462,7.664c0,0-1.82-1.676-1.451-4.824c0,0,3.458,5.67,7.224,5.364
|
||||
c0,0-1.506-1.364-2.496-2.851c-0.467-0.701-0.434-1.722-0.249-2.65c2.049,0.304,3.883,0.281,5.261-0.26
|
||||
c2.42-0.949,4.052-1.627,5.14-2.114c-2.059,1.915-5.47,5.942-1.915,9.104c4.841,4.301,2.155,3.227,0,5.914
|
||||
c-2.148,2.687-10.753,5.916-13.44,8.604s-7.525,8.065-8.064,10.754c-0.539,2.688,1.708,4.636,5.377-0.538
|
||||
c0.521-0.736-1.326,2.109-2.658,4.931c-1.994,4.222,0.88,7.284,2.832,7.117c5.461-0.465,11.117-6.135,14.883-9.897
|
||||
c3.761-3.762-1.615,4.3-1.077,7.525c0.537,3.229,2.412,3.229,5.508,0c3.095-3.226,4.706-6.987,12.772-14.785
|
||||
c8.064-7.794,10.217-11.561,12.905-20.7c1.156-3.936,3.613-11.764,6.848-20.471c2.971-7.794,20.016-19.953,20.129-20.203
|
||||
c0.002-0.005,0.003-0.01,0.005-0.014c5.038,0.027,10.312-7.982,10.312-7.982c-3.212,0.901-6.064,0.002-6.066,0
|
||||
c9.281-0.901,14.364-14.673,14.364-14.673c-3.265,4.188-8.32,6.017-8.32,6.017c9.224-14.481,12.882-30.336,12.882-30.336
|
||||
c3.318,3.246,4.147,10.442,4.147,10.442c2.903-9.126-2.074-16.179-2.074-16.179c4.979,2.904,5.594,7.182,5.594,7.182
|
||||
c1.445-9.41-1.861-14.648-1.861-14.648c4.978,4.563,4.15,9.54,4.15,9.54C542.702,266.737,538.683,256.846,535.84,242.73z"/>
|
||||
</g>
|
||||
<path fill="#383637" d="M311.92,208.45c-1.118-0.103-2.075-0.636-3.113-1.432c-0.442-0.339-0.259-0.253-0.259-0.253
|
||||
c1.054,0.277,4.171-0.687,5.982-1.862c2.061-1.335,3-3.153,3-3.153s-1.573,1.307-4.796,2.83c-3.224,1.523-6.079,0.324-5.638,0.151
|
||||
c0.836-0.333,3.536-0.938,5.268-1.949c1.734-1.012,2.554-3.976,2.554-3.976c-0.245,0.501-1.799,2.059-4.392,3.438
|
||||
c-3.646,1.942-4.978,0.812-4.978,0.812s0.792-0.258,2.445-1.104c1.67-0.856,2.812-2.536,2.812-2.536
|
||||
c-0.701,0.944-4.425,2.225-5.99,2.602c-1.567,0.377-2.845-1.2-6.801-2.469c-2.195-0.702-3.585-1.231-4.869-0.938
|
||||
c-1.858,0.162-3.522,1.414-4.111,3.304c-0.778,2.496,0.613,5.15,3.109,5.928c2.497,0.778,5.15-0.616,5.928-3.112
|
||||
c0.26-0.832,0.259-1.674,0.076-2.466c1.844,1.03,4.55,3.364,6.013,4.603c2.905,2.459,4.152,2.593,6.518,2.932
|
||||
c3.135,0.449,5.896-1.417,5.896-1.417C315.548,208.547,312.585,208.512,311.92,208.45z"/>
|
||||
<path fill="#603913" d="M328.218,196.826c0,0,11.548-2.163,16.869,2.183c0,0-2.907-0.401-4.672-0.265c0,0,7.564,0.955,9.426,4.285
|
||||
c0,0-4.347-0.833-7.593-0.429c0,0,10.692,2.656,11.253,8.253c0,0-3.337-3.117-5.967-3.266c0,0,3.434,6.639,3.118,12.186
|
||||
c-0.313,5.553-8.74,9.472-12.732,7.486c-3.987-1.982-8.755-5.771-9.174-8.725c0,0,3.688-3.01,5.533,0.61
|
||||
c1.848,3.618-2.604-5.717-4.96-5.555c0,0,4.229-2.259,5.036-0.967c0,0-3.293-3.918-4.771-3.706
|
||||
C329.584,208.917,337.87,202.354,328.218,196.826z"/>
|
||||
<path fill="#383637" d="M222.523,207.767c-0.007-0.003-0.015-0.004-0.021-0.008c-0.993-1.02-2.812-2.22-6.177-3.121
|
||||
c-2.722-0.727-5.561-0.736-7.502,1.417c-2.918,3.235-6.714,14.313-6.38,20.495c0,0,0.257,3.42,1.434,4.918
|
||||
c0,0,1.213-8.927,3.233-14.265c2.018-5.338,3.202-9.855,4.8-9.827c1.11,0.02,4.099,0.617,6.542,1.635
|
||||
c-0.04,0.067-0.087,0.126-0.122,0.196c-0.761,1.556-0.115,3.433,1.441,4.193c1.554,0.76,3.433,0.116,4.193-1.44
|
||||
C224.724,210.405,224.08,208.527,222.523,207.767z"/>
|
||||
<path fill="#A97C50" d="M338.436,337.495c-0.347,1.538-0.532,3.306-0.019,4.569c1.026,2.525,2.671,4.922,2.671,4.922
|
||||
c-4.475,0-8.015-9.598-8.015-9.598c-0.084,0.572-0.129,1.113-0.15,1.629c2.045,4.888,4.793,11.603,7.239,18.068
|
||||
c-1.084,2.767-3.017,8.856-1.459,13.988c0,0,0.785-6.346,3.749-7.735c0.001,0.002,0.002,0.004,0.002,0.006
|
||||
c-0.026,0.094-1.191,4.231-0.705,7.904c0,0,0.014-2.536,1.979-4.159c0.007,0.022,0.015,0.046,0.022,0.068
|
||||
c-0.324,0.882-2.293,6.529-0.668,9.517c0,0,0.098-3.809,1.387-7.234c0.929,3.072,1.505,5.547,1.505,6.966
|
||||
c0,7.525,1.079,15.055-4.837,19.086c-0.729,0.496-1.534,1.016-2.364,1.539c-1.14-0.074-3.706-0.21-6.121-0.098
|
||||
c-3.229,0.149-6.655,1.151-4.698,1.909c1.954,0.759,5.385,0.832,5.385,0.832s-5.941,0.053-8.301,1.438
|
||||
c-2.36,1.381-4.128,2.376-1.855,3.006c0.776,0.217,1.753,0.298,2.705,0.314c-0.542,0.29-0.88,0.469-0.88,0.469
|
||||
s-6.876,4.524-2.573,6.675c4.301,2.15,14.402-4.524,14.402-4.524s-5.379,5.528-2.152,6.797c3.229,1.271,6.606-1.42,11.369-4.107
|
||||
c4.763-2.689,8.525-4.031,10.678-9.144c2.148-5.106,4.302-17.074,5.377-27.623c0.568-5.582,2.492-16.036,4.178-24.645
|
||||
C356.84,346.459,347.442,342.533,338.436,337.495z"/>
|
||||
<path fill="#A97C50" d="M451.898,366.189c-3.555-3.162-0.144-7.189,1.915-9.104c-1.088,0.487-2.72,1.165-5.14,2.114
|
||||
c-1.378,0.541-3.212,0.563-5.261,0.26c-0.185,0.929-0.218,1.949,0.249,2.65c0.99,1.486,2.496,2.851,2.496,2.851
|
||||
c-3.766,0.306-7.224-5.364-7.224-5.364c-0.369,3.148,1.451,4.824,1.451,4.824c-3.848-0.903-6.462-7.664-6.462-7.664
|
||||
c-2.84,2.988,2.431,9.003,2.431,9.003c-3.826-1.567-6.249-4.21-7.77-6.718c-0.485,0.275-0.964,0.546-1.419,0.799
|
||||
c-1.261,0.701-3.294,1.669-5.605,2.766c0.011,1.949,0.132,4.01,0.342,6.14c3.083-1.334,5.802-2.453,5.802-2.453
|
||||
s-2.884,1.771-5.679,3.64c0.2,1.77,0.454,3.579,0.752,5.411c2.63-1.667,4.927-3.339,4.927-3.339s-3.241,3.625-3.389,5.784
|
||||
c-0.105,1.52,1.055,2.698,5.539,0.868c4.015-1.639,11.291-4.708,16.671-6.652c2.618-0.949,5.559-1.95,7.902-3.159
|
||||
C454.112,368.276,453.347,367.476,451.898,366.189z"/>
|
||||
<path fill="#383637" d="M246.75,256.634c-0.157-0.129-0.303-0.282-0.44-0.45c0.014-0.018,0.022-0.029,0.022-0.029
|
||||
s-0.019,0.007-0.036,0.013c-2.339-2.888-1.912-10.96-3.649-7.677c-1.521,2.869-0.529,6.747,0.802,8.662
|
||||
c-5.362,1.789-16.933,5.324-23.647,4.968c-6.665-0.353-12-2.859-12-2.859c-1.508,0.601,1.004,2.131,1.004,2.131
|
||||
s8.595,4.307,14.291,3.803c11.932-1.056,18.322-4.784,21.229-7.11c2.008,1.37,8.471,2.917,10.396,1.423
|
||||
C256.647,258.016,249.323,258.737,246.75,256.634z"/>
|
||||
</svg>
|
||||
|
After Width: | Height: | Size: 9.9 KiB |
|
|
@ -27,6 +27,13 @@
|
|||
]
|
||||
}
|
||||
],
|
||||
"resource": [
|
||||
{
|
||||
"files": [
|
||||
"assets/**"
|
||||
]
|
||||
}
|
||||
],
|
||||
"output": "_site",
|
||||
"template": [
|
||||
"default",
|
||||
|
|
@ -36,6 +43,8 @@
|
|||
"globalMetadata": {
|
||||
"_appName": "CapyKit",
|
||||
"_appTitle": "CapyKit Documentation",
|
||||
"_appLogoPath": "assets/logo.svg",
|
||||
"_appFaviconPath": "assets/favicon.svg",
|
||||
"_enableSearch": true,
|
||||
"pdf": false
|
||||
}
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue