8e7ca3f67f3a — Rune Skovbo Johansen 10 years ago
Initial commit of Random Numbers Testing.
A => .hgignore +10 -0
@@ 0,0 1,10 @@ 
+syntax: glob
+Library/
+Build/
+Temp/
+obj
+**.csproj
+*.orig
+*.orig.meta
+*.userprefs
+*.sln

          
A => Assets/Ent.meta +5 -0
@@ 0,0 1,5 @@ 
+fileFormatVersion: 2
+guid: 25238f7a2b9484af2bdd71f7023c7930
+folderAsset: yes
+DefaultImporter:
+  userData: 

          
A => Assets/Ent/Ent.cs +295 -0
@@ 0,0 1,295 @@ 
+using System;
+using System.IO;
+using Ent;
+
+namespace Ent
+{
+	/// <summary>
+	///	Apply various randomness tests to a stream of bytes
+	///	Original code by John Walker  --  September 1996
+	///	http://www.fourmilab.ch/
+	///	
+	/// C# port of ENT (ent - pseudorandom number sequence test)
+	/// by Brett Trotter
+	/// blt@iastate.edu
+	/// </summary>
+
+	public class EntCalc
+	{
+		static double[,] chsqt = new double[2, 10] 
+			{
+				{0.5, 0.25, 0.1, 0.05, 0.025, 0.01, 0.005, 0.001, 0.0005, 0.0001}, 
+				{0.0, 0.6745, 1.2816, 1.6449, 1.9600, 2.3263, 2.5758, 3.0902, 3.2905, 3.7190}
+			};
+
+		private static int MONTEN = 6;				/* Bytes used as Monte Carlo co-ordinates
+													 * This should be no more bits than the mantissa 
+													 * of your "double" floating point type. */
+
+		private uint[] monte = new uint[MONTEN];
+		private double[] prob = new double[256];	/* Probabilities per bin for entropy */
+		private long[] ccount = new long[256];		/* Bins to count occurrences of values */
+		private long totalc = 0; 					/* Total bytes counted */
+
+		private int mp;
+		private bool sccfirst;
+		private long inmont, mcount;
+		private double a;
+		private double cexp;
+		private double incirc;
+		private double montex, montey, montepi;
+		private double scc, sccun, sccu0, scclast, scct1, scct2, scct3;
+		private double ent, chisq, datasum;
+
+		private bool binary = false;				/* Treat input as a bitstream */
+
+		public struct EntCalcResult 
+		{
+			public double Entropy;
+			public double ChiSquare;
+			public double Mean;
+			public double MonteCarloPiCalc;
+			public double SerialCorrelation;
+			public long[] OccuranceCount;
+
+			public double ChiProbability;
+			public double MonteCarloErrorPct;
+			public double OptimumCompressionReductionPct;
+			public double ExpectedMeanForRandom;
+
+			public long NumberOfSamples;
+		}
+
+
+		/*  Initialise random test counters.  */
+		public EntCalc(bool binmode) 
+		{
+			int i;
+
+			binary = binmode;				/* Set binary / byte mode */
+
+			/* Initialise for calculations */
+
+			ent = 0.0;						/* Clear entropy accumulator */
+			chisq = 0.0;					/* Clear Chi-Square */
+			datasum = 0.0;					/* Clear sum of bytes for arithmetic mean */
+
+			mp = 0;							/* Reset Monte Carlo accumulator pointer */
+			mcount = 0;						/* Clear Monte Carlo tries */
+			inmont = 0;						/* Clear Monte Carlo inside count */
+			incirc = 65535.0 * 65535.0;		/* In-circle distance for Monte Carlo */
+
+			sccfirst = true;				/* Mark first time for serial correlation */
+			scct1 = scct2 = scct3 = 0.0;	/* Clear serial correlation terms */
+
+			incirc = Math.Pow(Math.Pow(256.0, (double) (MONTEN / 2)) - 1, 2.0);
+
+			for (i = 0; i < 256; i++) 
+			{
+				ccount[i] = 0;
+			}
+			totalc = 0;
+		}
+
+
+		/*  AddSample  --	Add one or more bytes to accumulation.	*/
+		public void AddSample(int buf, bool Fold)
+		{
+			AddSample((byte) buf, Fold);
+		}
+		public void AddSample(byte buf, bool Fold)
+		{
+			byte[] tmpByte = new byte[1];
+			tmpByte[0] = buf;
+			AddSample(tmpByte, Fold);
+		}
+		public void AddSample(byte[] buf, bool Fold)
+		{
+			int c, bean;
+
+			foreach(byte bufByte in buf) 
+			{
+				bean = 0;		// reset bean
+
+				byte oc = bufByte;
+
+/*	Have not implemented folding yet. Plan to use System.Text.Encoding to do so.
+ * 
+ *				if (fold && isISOalpha(oc) && isISOupper(oc)) 
+ *				{
+ *					oc = toISOlower(oc);
+ *				}
+ */
+
+				do 
+				{
+					if (binary) 
+					{
+						c = ((oc & 0x80));		// Get the MSB of the byte being read in
+					} 
+					else 
+					{
+						c = oc;
+					}
+					ccount[c]++;		  /* Update counter for this bin */
+					totalc++;
+
+					/* Update inside / outside circle counts for Monte Carlo computation of PI */
+
+					if (bean == 0) 
+					{
+						monte[mp++] = oc;       /* Save character for Monte Carlo */
+						if (mp >= MONTEN) 
+						{     /* Calculate every MONTEN character */
+							int mj;
+
+							mp = 0;
+							mcount++;
+							montex = montey = 0;
+							for (mj = 0; mj < MONTEN / 2; mj++) 
+							{
+								montex = (montex * 256.0) + monte[mj];
+								montey = (montey * 256.0) + monte[(MONTEN / 2) + mj];
+							}
+							if ((montex * montex + montey *  montey) <= incirc) 
+							{
+								inmont++;
+							}
+						}
+					}
+
+					/* Update calculation of serial correlation coefficient */
+
+					sccun = c;
+					if (sccfirst) 
+					{
+						sccfirst = false;
+						scclast = 0;
+						sccu0 = sccun;
+					} 
+					else 
+					{
+						scct1 = scct1 + scclast * sccun;
+					}
+					scct2 = scct2 + sccun;
+					scct3 = scct3 + (sccun * sccun);
+					scclast = sccun;
+					oc <<= 1;						// left shift by one
+				} while (binary && (++bean < 8));		// keep looping if we're in binary mode and while the bean counter is less than 8 (bits)
+			}
+		}	// end foreach
+
+
+		/*  EndCalculation  --	Complete calculation and return results.  */
+		public EntCalcResult EndCalculation()
+		{
+			int i;
+
+			/* Complete calculation of serial correlation coefficient */
+
+			scct1 = scct1 + scclast * sccu0;
+			scct2 = scct2 * scct2;
+			scc = totalc * scct3 - scct2;
+			if (scc == 0.0) 
+			{
+				scc = -100000;
+			} 
+			else 
+			{
+				scc = (totalc * scct1 - scct2) / scc;
+			}
+
+			/* Scan bins and calculate probability for each bin and
+			   Chi-Square distribution */
+
+			cexp = totalc / (binary ? 2.0 : 256.0);  /* Expected count per bin */
+			for (i = 0; i < (binary ? 2 : 256); i++) 
+			{
+				prob[i] = (double) ccount[i] / totalc;
+				a = ccount[i] - cexp;
+				chisq = chisq + (a * a) / cexp;
+				datasum += ((double) i) * ccount[i];
+			}
+
+			/* Calculate entropy */
+
+			for (i = 0; i < (binary ? 2 : 256); i++) 
+			{
+				if (prob[i] > 0.0) 
+				{
+					ent += prob[i] * log2(1 / prob[i]);
+				}
+			}
+
+			/* Calculate Monte Carlo value for PI from percentage of hits
+			   within the circle */
+
+			montepi = 4.0 * (((double) inmont) / mcount);
+
+
+			/* Calculate probability of observed distribution occurring from
+			   the results of the Chi-Square test */
+
+			double chip = Math.Sqrt(2.0 * chisq) - Math.Sqrt(2.0 * (binary ? 1 : 255.0) - 1.0);
+			a = Math.Abs(chip);
+			for (i = 9; i >= 0; i--) 
+			{
+				if (chsqt[1,i] < a) 
+				{
+					break;
+				}
+			}
+			chip = (chip >= 0.0) ? chsqt[0,i] : 1.0 - chsqt[0,i];
+
+			double compReductionPct = ((binary ? 1 : 8) - ent) / (binary ? 1.0 : 8.0);
+
+			/* Return results */
+			EntCalcResult result = new EntCalcResult();
+			result.Entropy = ent;
+			result.ChiSquare = chisq;
+			result.ChiProbability = chip;
+			result.Mean = datasum / totalc;
+			result.ExpectedMeanForRandom = binary ? 0.5 : 127.5;
+			result.MonteCarloPiCalc = montepi;
+			result.MonteCarloErrorPct = (Math.Abs(Math.PI - montepi) / Math.PI);
+			result.SerialCorrelation = scc;
+			result.OptimumCompressionReductionPct = compReductionPct;
+			result.OccuranceCount = this.ccount;
+			result.NumberOfSamples = this.totalc;
+			return result;
+		}
+
+
+		/*  LOG2  --  Calculate log to the base 2  */
+		static double log2(double x)
+		{
+			return Math.Log(x, 2);		//can use this in C#
+		}
+	}
+	public class EntFileCalc
+	{
+		public static Ent.EntCalc.EntCalcResult CalculateFile(ref System.IO.FileStream inStream)
+		{
+
+			Ent.EntCalc entCalc = new EntCalc(false);
+			while (inStream.Position < inStream.Length)
+			{
+				entCalc.AddSample((byte) inStream.ReadByte(), false);
+			}
+			
+			return entCalc.EndCalculation();
+		}
+		public static Ent.EntCalc.EntCalcResult CalculateFile(string inFileName) 
+		{
+			System.IO.FileStream instream = new System.IO.FileStream(inFileName,System.IO.FileMode.Open, System.IO.FileAccess.Read, System.IO.FileShare.None);
+
+			instream.Position = 0;
+
+			Ent.EntCalc.EntCalcResult tmpRes = CalculateFile(ref instream);
+			
+			instream.Close();
+
+			return tmpRes;
+		}
+	}
+}
  No newline at end of file

          
A => Assets/Ent/Ent.cs.meta +8 -0
@@ 0,0 1,8 @@ 
+fileFormatVersion: 2
+guid: 00adecf0323434370bae2e5f80e25e16
+MonoImporter:
+  serializedVersion: 2
+  defaultReferences: []
+  executionOrder: 0
+  icon: {instanceID: 0}
+  userData: 

          
A => Assets/Implementations.meta +5 -0
@@ 0,0 1,5 @@ 
+fileFormatVersion: 2
+guid: fafe29739c7dc42c3819f62c26ce816e
+folderAsset: yes
+DefaultImporter:
+  userData: 

          
A => Assets/Implementations/MurmurHash.cs +173 -0
@@ 0,0 1,173 @@ 
+/***** BEGIN LICENSE BLOCK *****
+ * Version: MPL 1.1/GPL 2.0/LGPL 2.1
+ *
+ * The contents of this file are subject to the Mozilla Public License Version
+ * 1.1 (the "License"); you may not use this file except in compliance with
+ * the License. You may obtain a copy of the License at
+ * http://www.mozilla.org/MPL/
+ *
+ * Software distributed under the License is distributed on an "AS IS" basis,
+ * WITHOUT WARRANTY OF ANY KIND, either express or implied. See the License
+ * for the specific language governing rights and limitations under the
+ * License.
+ *
+ * The Original Code is HashTableHashing.SuperFastHash.
+ *
+ * The Initial Developer of the Original MurmurHash2 Code is
+ * Davy Landman.
+ * Portions created by the Initial Developer are Copyright (C) 2009
+ * the Initial Developer. All Rights Reserved.
+ *
+ * Contributor(s):
+ * Thomas Kejser
+ *    Turning this code into SQL Server CLR version 
+ *    and adding MurmurHash3 implementation based on C++ source.
+ * Rune Skovbo Johansen
+ *    Removing all SQL dependencies (take byte array instead of SqlBinary).
+ *    Adding overload that takes an int array (less code and executes faster).
+ *
+ * Alternatively, the contents of this file may be used under the terms of
+ * either the GNU General Public License Version 2 or later (the "GPL"), or
+ * the GNU Lesser General Public License Version 2.1 or later (the "LGPL"),
+ * in which case the provisions of the GPL or the LGPL are applicable instead
+ * of those above. If you wish to allow use of your version of this file only
+ * under the terms of either the GPL or the LGPL, and not to allow others to
+ * use your version of this file under the terms of the MPL, indicate your
+ * decision by deleting the provisions above and replace them with the notice
+ * and other provisions required by the GPL or the LGPL. If you do not delete
+ * the provisions above, a recipient may use your version of this file under
+ * the terms of any one of the MPL, the GPL or the LGPL.
+ *
+ * ***** END LICENSE BLOCK ***** */
+
+using System;
+
+public struct MurmurHash {
+	private UInt32 seed; /* Define your own seed here */
+	
+	public MurmurHash (int seedValue) {
+		seed = (UInt32)seedValue;
+	}
+	
+	public Int32 GetHash (byte[] data) {
+		const UInt32 c1 = 0xcc9e2d51;
+		const UInt32 c2 = 0x1b873593;
+		
+		int curLength = data.Length; // Current position in byte array
+		int length = curLength; // The const length we need to fix tail
+		UInt32 h1 = seed;
+		UInt32 k1 = 0;
+		
+		// Body, eat stream a 32-bit int at a time
+		Int32 currentIndex = 0;
+		while (curLength >= 4) {
+			// Get four bytes from the input into an UInt32
+			k1 = (UInt32)(data[currentIndex++] 
+				| data[currentIndex++] << 8 
+				| data[currentIndex++] << 16 
+				| data[currentIndex++] << 24);
+			
+			// Bitmagic hash
+			k1 *= c1;
+			k1 = rotl32 (k1, 15);
+			k1 *= c2;
+			
+			h1 ^= k1;
+			h1 = rotl32 (h1, 13);
+			h1 = h1 * 5 + 0xe6546b64;
+			curLength -= 4;
+		}
+		
+		// Tail, the reminder bytes that did not make it to a full int.
+		// (This switch is slightly more ugly than the C++ implementation 
+		// because we can't fall through.)
+		switch (curLength) {
+			case 3:
+				k1 = (UInt32)(data[currentIndex++] 
+					| data[currentIndex++] << 8 
+					| data[currentIndex++] << 16);
+				k1 *= c1;
+				k1 = rotl32 (k1, 15);
+				k1 *= c2;
+				h1 ^= k1;
+				break;
+			case 2:
+				k1 = (UInt32)(data[currentIndex++] 
+					| data[currentIndex++] << 8);
+				k1 *= c1;
+				k1 = rotl32 (k1, 15);
+				k1 *= c2;
+				h1 ^= k1;
+				break;
+			case 1:
+				k1 = (UInt32)(data[currentIndex++]);
+				k1 *= c1;
+				k1 = rotl32 (k1, 15);
+				k1 *= c2;
+				h1 ^= k1;
+				break;
+		};
+		
+		// Finalization, magic chants to wrap it all up
+		h1 ^= (UInt32)length;
+		h1 = fmix (h1);
+		
+		return (Int32)h1;
+	}
+	
+	public Int32 GetHash (params int[] data) {
+		const UInt32 c1 = 0xcc9e2d51;
+		const UInt32 c2 = 0x1b873593;
+		
+		UInt32 h1 = seed;
+		UInt32 k1 = 0;
+		
+		// Body, eat stream a 32-bit int at a time
+		int length = data.Length;
+		for (int i=0; i<length; i++) {
+			unchecked {
+				k1 = (UInt32)data[i];
+			}
+			
+			// Bitmagic hash
+			k1 *= c1;
+			k1 = rotl32 (k1, 15);
+			k1 *= c2;
+			
+			h1 ^= k1;
+			h1 = rotl32 (h1, 13);
+			h1 = h1 * 5 + 0xe6546b64;
+		}
+		
+		// Finalization, magic chants to wrap it all up
+		h1 ^= (UInt32)(length*4);
+		h1 = fmix (h1);
+		
+		return (Int32)h1;
+	}
+	
+	public float Value (params int[] data) {
+		return Math.Abs (GetHash (data)) / (float)int.MaxValue;
+	}
+	
+	public int Range (int min, int max, params int[] data) {
+		return min + (int)(((UInt32)GetHash (data)) % (max - min));
+	}
+	
+	public float Range (float min, float max, params int[] data) {
+		return min + ((UInt32)GetHash (data) * (float)(max - min)) / UInt32.MaxValue;
+	}
+	
+	private static UInt32 rotl32 (UInt32 x, byte r) {
+		return (x << r) | (x >> (32 - r));
+	}
+	
+	private static UInt32 fmix (UInt32 h) {
+		h ^= h >> 16;
+		h *= 0x85ebca6b;
+		h ^= h >> 13;
+		h *= 0xc2b2ae35;
+		h ^= h >> 16;
+		return h;
+	}
+};

          
A => Assets/Implementations/MurmurHash.cs.meta +8 -0
@@ 0,0 1,8 @@ 
+fileFormatVersion: 2
+guid: 2591f89c8b47743ba9b3a109cd76263d
+MonoImporter:
+  serializedVersion: 2
+  defaultReferences: []
+  executionOrder: 0
+  icon: {instanceID: 0}
+  userData: 

          
A => Assets/Implementations/PcgHash.cs +29 -0
@@ 0,0 1,29 @@ 
+using System;
+
+public static class PcgHash {
+	public static int Hash (int i, int j) {
+		int a = i;
+		int b = j;
+		for (int r = 0; r < 3; r++) {
+			a = rot ((int) ((a^0xcafebabe) + (b^0xfaceb00c)), 23);
+			b = rot ((int) ((a^0xdeadbeef) + (b^0x8badf00d)), 5);
+		}
+		return a^b;
+	}
+	
+	public static int Hash (int i) {
+		int a = i;
+		int b = 0;
+		for (int r = 0; r < 3; r++) {
+			a = rot ((int) ((a^0xcafebabe) + (b^0xfaceb00c)), 23);
+			b = rot ((int) ((a^0xdeadbeef) + (b^0x8badf00d)), 5);
+		}
+		return a^b;
+	}
+	
+	private static int rot (int x, int b) {
+		return (x << b) ^ (x >> (32-b)); // broken rotate because I'm in java and lazy
+	}
+}
+
+

          
A => Assets/Implementations/PcgHash.cs.meta +8 -0
@@ 0,0 1,8 @@ 
+fileFormatVersion: 2
+guid: d6eebd4bc9fa046e6923180ea0ce1a13
+MonoImporter:
+  serializedVersion: 2
+  defaultReferences: []
+  executionOrder: 0
+  icon: {instanceID: 0}
+  userData: 

          
A => Assets/Testing.meta +5 -0
@@ 0,0 1,5 @@ 
+fileFormatVersion: 2
+guid: f9b4baa6180fe438784eb0d5760042dc
+folderAsset: yes
+DefaultImporter:
+  userData: 

          
A => Assets/Testing/Extensions.cs +26 -0
@@ 0,0 1,26 @@ 
+using System;
+
+public static class Extensions {
+	public static string Ordinal (this int num) {
+		if (num < 0)
+			return num.ToString();
+
+		switch (num % 100) {
+		case 11:
+		case 12:
+		case 13:
+			return num + "th";
+		}
+
+		switch (num % 10) {
+		case 1:
+			return num + "st";
+		case 2:
+			return num + "nd";
+		case 3:
+			return num + "rd";
+		default:
+			return num + "th";
+		}
+	}
+}

          
A => Assets/Testing/Extensions.cs.meta +8 -0
@@ 0,0 1,8 @@ 
+fileFormatVersion: 2
+guid: 21212a04d36bd457aad738911b7eab83
+MonoImporter:
+  serializedVersion: 2
+  defaultReferences: []
+  executionOrder: 0
+  icon: {instanceID: 0}
+  userData: 

          
A => Assets/Testing/RandomHashTest.cs +129 -0
@@ 0,0 1,129 @@ 
+using System;
+using System.Diagnostics;
+using System.Collections.Generic;
+
+public interface RandomSequence {
+	int Next ();
+	void Reset ();
+	string GetName ();
+}
+
+public class RandomHashTest {
+	public RandomSequence sequence;
+	public string name;
+	public string result;
+	public float[,] coordsArray = new float[256,256];
+	public float[] diagonalSums = new float[256];
+	public float diagonalsDeviation = 0;
+	
+	public RandomHashTest (RandomSequence randomSequence) {
+		sequence = randomSequence;
+		name = sequence.GetName ().Replace ("#", "0\u2026n");
+		Test ();
+		Console.WriteLine (result);
+	}
+	
+	public int Function256 () {
+		return GetInRange (sequence.Next (), 256);
+	}
+	
+	public int GetInRange (int i, int range) {
+		return ((i % range) + range) % range;
+	}
+
+	public void Reset () {
+		sequence.Reset ();
+	}
+
+	private void Test () {
+		int[] ints = new int[500000];
+		
+		// Call random function
+		sequence.Reset ();
+		Stopwatch stopWatch = new Stopwatch ();
+		stopWatch.Start ();
+		for (int i=0; i<ints.Length; i++)
+			ints[i] = sequence.Next ();
+		stopWatch.Stop ();
+		
+		// Convert to bytes
+		byte[] bytes = new byte[ints.Length];
+		for (int i = 0; i < bytes.Length; i++)
+			bytes[i] = (byte)GetInRange (ints[i], 256);
+		
+		// Test randomness data
+		Ent.EntCalc ent = new Ent.EntCalc (false);
+		ent.AddSample (bytes, false);
+		Ent.EntCalc.EntCalcResult calcResult = ent.EndCalculation ();
+
+		// Create coords data
+		Reset ();
+		float samplesPerPixelInverse = (256f * 256f) / ints.Length;
+		for (int i=0; i<ints.Length; i+=6) {
+			int x = Function256 ();
+			int y = Function256 ();
+			coordsArray[x,y] += samplesPerPixelInverse;
+		}
+
+		// Calculate coords results
+		for (int j=0; j<256; j++) {
+			for (int i=0; i<256; i++) {
+				float value = coordsArray[i,j];
+				diagonalSums[(i + j) % 256] += value * 0.5f;
+				diagonalSums[((i - j) + 256) % 256] += value * 0.5f;
+			}
+		}
+		diagonalsDeviation = StandardDeviation (new List<float> (diagonalSums));
+
+		// Get string with result
+		result = GetResult (name, calcResult, stopWatch.ElapsedMilliseconds);
+	}
+
+	public static float StandardDeviation (List<float> valueList) {
+		float m = 0.0f;
+		float s = 0.0f;
+		int k = 1;
+		foreach (float value in valueList) 
+		{
+			float tmpM = m;
+			m += (value - tmpM) / k;
+			s += (value - tmpM) * (value - m);
+			k++;
+		}
+		return (float)System.Math.Sqrt (s / (k-1));
+	}
+	
+	string GetResult (string name, Ent.EntCalc.EntCalcResult result, float duration) {
+		double meanValueQuality = Clamp01 (1 - Math.Abs (127.5 - result.Mean) / 128);
+		double serialCorrelationQuality = Clamp01 (1 - 2 * Math.Abs (result.SerialCorrelation));
+		double piQuality = Clamp01 (1 - 10 * result.MonteCarloErrorPct);
+		double diagonalsDeviationQuality = Clamp01 (1 - diagonalsDeviation / 256);
+		double combined = Math.Min (Math.Min (Math.Min (meanValueQuality, serialCorrelationQuality), piQuality), diagonalsDeviationQuality);
+
+		return string.Format (
+			  "                             value quality\n"
+			+ "Mean Value:               {0,8:F4} {1,7:P0}\n"
+			+ "Serial Correlation:       {2,8:F4} {3,7:P0}\n"
+			+ "Monte Carlo Pi Value:     {4,8:F4} {5,7:P0}\n"
+			+ "Diagonals Deviation:      {6,8:F4} {7,7:P0}\n"
+			+ "<b>Overall Quality:                   {8,7:P0}</b>\n"
+			+ "\n"
+			+ "Execution Time:                  {9,6} ms",
+
+			result.Mean, meanValueQuality,
+			result.SerialCorrelation, serialCorrelationQuality,
+			result.MonteCarloPiCalc, piQuality,
+			diagonalsDeviation, diagonalsDeviationQuality,
+			combined,
+			duration
+		);
+	}
+	
+	private static double Clamp01 (double val) {
+		return Clamp (val, 0, 1);
+	}
+	
+	private static double Clamp (double val, double min, double max) {
+		return Math.Min (max, Math.Max (val, min));
+	}
+}

          
A => Assets/Testing/RandomHashTest.cs.meta +8 -0
@@ 0,0 1,8 @@ 
+fileFormatVersion: 2
+guid: 9455ad132e8024ca6a484e83bbb73ecf
+MonoImporter:
+  serializedVersion: 2
+  defaultReferences: []
+  executionOrder: 0
+  icon: {instanceID: 0}
+  userData: 

          
A => Assets/Testing/RandomHashTester.cs +210 -0
@@ 0,0 1,210 @@ 
+using System;
+using System.Collections.Generic;
+using System.Security.Cryptography;
+
+public class RandomHashTester {
+	public List<RandomHashTest> tests = new List<RandomHashTest> ();
+
+	public RandomHashTester () {
+		AddTest (new SystemRandomWrapper (0));
+		AddTest (new SystemRandomSeedVarianceWrapper (0));
+		AddTest (new SystemRandomSeedVarianceWrapper (100));
+		AddTest (new SystemRandomScrambledSeedVarianceWrapper (0));
+		AddTest (new LinearFunction (19969, 207));
+		AddTest (new PcgHashWrapper ());
+		AddTest (new MD5HashWrapper ());
+		AddTest (new MurmurHashWrapper (0));
+		AddTest (new MurmurHashSeedVarianceWrapper (0));
+	}
+
+	private void AddTest (RandomSequence sequence) {
+		tests.Add (new RandomHashTest (sequence));
+	}
+}
+
+public class SystemRandomWrapper : RandomSequence {
+	private int seed;
+	private Random rand;
+	public SystemRandomWrapper (int seed) {
+		this.seed = seed;
+		Reset ();
+	}
+	public void Reset () {
+		rand = new Random (seed);
+	}
+	public int Next () {
+		return rand.Next ();
+	}
+	public string GetName () {
+		return string.Format ("System.Random\nnumbers # of seed {0}", seed);
+	}
+}
+
+public class SystemRandomSeedVarianceWrapper : RandomSequence {
+	private int index;
+	private int seed;
+	public SystemRandomSeedVarianceWrapper (int index) {
+		this.index = index;
+		Reset ();
+	}
+	public void Reset () {
+		seed = 0;
+	}
+	public int Next () {
+		Random rand = new Random (seed);
+		seed++;
+		// Get the number in the sequence corresponding to index.
+		// This is super slow for large index values!
+		for (int i=0; i<index; i++)
+			rand.Next ();
+		return rand.Next ();
+	}
+	public string GetName () {
+		return string.Format ("System.Random\n{0} number of seed #", index.Ordinal ());
+	}
+}
+
+public class SystemRandomScrambledWrapper : RandomSequence {
+	private int seed;
+	private Random rand;
+	public SystemRandomScrambledWrapper (int seed) {
+		this.seed = (int)((seed ^ 0x5DEECE66DL) & ((1L << 48) - 1));
+		Reset ();
+	}
+	public void Reset () {
+		rand = new Random (seed);
+	}
+	public int Next () {
+		return rand.Next ();
+	}
+	public string GetName () {
+		return string.Format ("System.Random (Scrambled)\nnumbers # of seed {0}", seed);
+	}
+}
+
+public class SystemRandomScrambledSeedVarianceWrapper : RandomSequence {
+	private int index;
+	private int seed;
+	public SystemRandomScrambledSeedVarianceWrapper (int index) {
+		this.index = index;
+		Reset ();
+	}
+	public void Reset () {
+		seed = 0;
+	}
+	public int Next () {
+		int seedModified = (int)((seed ^ 0x5DEECE66DL) & ((1L << 48) - 1));
+		Random rand = new Random (seedModified);
+		seed++;
+		// Get the number in the sequence corresponding to index.
+		// This is super slow for large index values!
+		for (int i=0; i<index; i++)
+			rand.Next ();
+		return rand.Next ();
+	}
+	public string GetName () {
+		return string.Format ("System.Random (Scrambled)\n{0} number of seed #", index.Ordinal ());
+	}
+}
+
+public class MurmurHashWrapper : RandomSequence {
+	private int seed;
+	private MurmurHash hash;
+	private int index;
+	public MurmurHashWrapper (int seed) {
+		this.seed = seed;
+		hash = new MurmurHash (seed);
+		Reset ();
+	}
+	public void Reset () {
+		index = 0;
+	}
+	public int Next () {
+		int value = hash.GetHash (index);
+		index++;
+		return value;
+	}
+	public string GetName () {
+		return string.Format ("MurmurHash3\nnumbers # of seed {0}", seed);
+	}
+}
+
+public class MurmurHashSeedVarianceWrapper : RandomSequence {
+	private int index;
+	private int seed;
+	public MurmurHashSeedVarianceWrapper (int index) {
+		this.index = index;
+		Reset ();
+	}
+	public void Reset () {
+		seed = 0;
+	}
+	public int Next () {
+		int value = new MurmurHash (seed).GetHash (index);
+		seed++;
+		return value;
+	}
+	public string GetName () {
+		return string.Format ("MurmurHash3\n{0} number of seed #", index.Ordinal ());
+	}
+}
+
+public class PcgHashWrapper : RandomSequence {
+	private int index;
+	public PcgHashWrapper () {
+		Reset ();
+	}
+	public void Reset () {
+		index = 0;
+	}
+	public int Next () {
+		int value = PcgHash.Hash (index);
+		index++;
+		return value;
+	}
+	public string GetName () {
+		return "PcgHash\nnumbers #";
+	}
+}
+
+public class MD5HashWrapper : RandomSequence {
+	private MD5 hash;
+	private int index;
+	public MD5HashWrapper () {
+		hash = MD5.Create ();
+		Reset ();
+	}
+	public void Reset () {
+		index = 0;
+	}
+	public int Next () {
+		int value = BitConverter.ToInt32 (hash.ComputeHash (BitConverter.GetBytes (index)), 0);
+		index++;
+		return value;
+	}
+	public string GetName () {
+		return "MD5\nnumbers #";
+	}
+}
+
+public class LinearFunction : RandomSequence {
+	private int multiplier;
+	private int divisor;
+	private int index;
+	public LinearFunction (int multiplier, int divisor) {
+		this.multiplier = multiplier;
+		this.divisor = divisor;
+		Reset ();
+	}
+	public void Reset () {
+		index = 0;
+	}
+	public int Next () {
+		int value = index * multiplier / divisor;
+		index++;
+		return value;
+	}
+	public string GetName () {
+		return string.Format ("Linear function i * {0} / {1}\nnumbers #", multiplier, divisor);
+	}
+}

          
A => Assets/Testing/RandomHashTester.cs.meta +8 -0
@@ 0,0 1,8 @@ 
+fileFormatVersion: 2
+guid: f23d8f70c7d2e4d758e364eab0aaa675
+MonoImporter:
+  serializedVersion: 2
+  defaultReferences: []
+  executionOrder: 0
+  icon: {instanceID: 0}
+  userData: 

          
A => Assets/UnityFrontend.meta +5 -0
@@ 0,0 1,5 @@ 
+fileFormatVersion: 2
+guid: e791f0ce197034e51a1b53b75db07d6d
+folderAsset: yes
+DefaultImporter:
+  userData: 

          
A => Assets/UnityFrontend/Courier New.ttf +0 -0

        
A => Assets/UnityFrontend/Courier New.ttf.meta +14 -0
@@ 0,0 1,14 @@ 
+fileFormatVersion: 2
+guid: c62870e0e417e455fbf0dab83663a9fb
+TrueTypeFontImporter:
+  serializedVersion: 2
+  fontSize: 12
+  forceTextureCase: -2
+  characterSpacing: 1
+  characterPadding: 0
+  includeFontData: 1
+  use2xBehaviour: 0
+  fontNames: []
+  customCharacters: 
+  fontRenderingMode: 0
+  userData: 

          
A => Assets/UnityFrontend/NoiseTestMB.cs +165 -0
@@ 0,0 1,165 @@ 
+using UnityEngine;
+using System.Collections;
+using System.Collections.Generic;
+using System.Linq;
+
+public class TestFront {
+	public bool enabled = true;
+	public Texture2D noiseTexture;
+	public Texture2D coordTexture;
+}
+
+public class NoiseTestMB : MonoBehaviour {
+	RandomHashTester tester;
+	TestFront[] fronts;
+	Vector2 scroll;
+	bool showOptions = false;
+	
+	const int width = 256;
+	const int hSpacing = 20;
+	const int vSpacing = 10;
+	public Font font;
+	GUIStyle header;
+	GUIStyle style;
+	bool showNoise = true;
+	bool showCoords = true;
+	bool showStats = true;
+	
+	void Start () {
+		tester = new RandomHashTester ();
+		fronts = new TestFront[tester.tests.Count];
+
+		for (int i=0; i<fronts.Length; i++) {
+			Initialize (i);
+		}
+	}
+
+	void Initialize (int testNr) {
+		RandomHashTest test = tester.tests[testNr];
+		TestFront front = new TestFront ();
+		fronts[testNr] = front;
+
+		// Create noise texture.
+		front.noiseTexture = new Texture2D (256, 256);
+		front.noiseTexture.filterMode = FilterMode.Point;
+		test.Reset ();
+		for (int j=front.noiseTexture.height-1; j>=0; j--) {
+			for (int i=0; i<front.noiseTexture.width; i++) {
+				float f = test.Function256 () / 255f;
+				front.noiseTexture.SetPixel (i, j, new Color (f,f,f,1));
+			}
+		}
+		front.noiseTexture.Apply ();
+
+		// Create coords texture.
+		front.coordTexture = new Texture2D (256, 256);
+		front.coordTexture.filterMode = FilterMode.Point;
+		for (int j=front.coordTexture.height-1; j>=0; j--) {
+			for (int i=0; i<front.coordTexture.width; i++) {
+				float f = Mathf.Min (1, test.coordsArray[i,j]);
+				front.coordTexture.SetPixel (i, j, new Color (f,f,f,1));
+			}
+		}
+		front.coordTexture.Apply ();
+	}
+	
+	void OnGUI () {
+		if (style == null) {
+			style = new GUIStyle ("label");
+			style.font = font;
+			style.normal.textColor = Color.black;
+			style.fontSize = 10;
+			header = new GUIStyle ("label");
+			header.normal.textColor = Color.black;
+			header.fontSize = 12;
+			header.fontStyle = FontStyle.Bold;
+		}
+		
+		scroll = GUI.BeginScrollView (
+			new Rect (0, 0, Screen.width, Screen.height-20),
+			scroll,
+			new Rect (0, 0, hSpacing + (width + hSpacing) * fronts.Count (e => e.enabled), 720));
+			
+		float left = hSpacing;
+		float top = 10;
+		for (int i=0; i<fronts.Length; i++) {
+			TestFront front = fronts[i];
+			if (!front.enabled)
+				continue;
+
+			RandomHashTest test = tester.tests[i];
+			top = vSpacing;
+			float height;
+
+			height = 34;
+			GUI.Label (new Rect (left, top, width, height), test.name, header);
+			top += height + vSpacing;
+
+			if (showNoise) {
+				height = 256;
+				GUI.DrawTexture (new Rect (left, top, 256, height), front.noiseTexture);
+				top += height;
+
+				height = 20;
+				GUI.Label (new Rect (left, top, width, height), "Sequence of 65536 random values.", style);
+				top += height + vSpacing;
+			}
+
+			if (showCoords) {
+				height = 256;
+				GUI.DrawTexture (new Rect (left, top, 256, height), front.coordTexture);
+				top += height;
+
+				height = 20;
+				GUI.Label (new Rect (left, top, width, height), "Plot of 500000 random coordinates.", style);
+				top += height + vSpacing;
+			}
+
+			if (showStats) {
+				height = 96;
+				GUI.Label (new Rect (left, top, width, height), test.result, style);
+				top += height + vSpacing;
+			}
+
+			left += width + hSpacing;
+		}
+		
+		GUI.EndScrollView ();
+
+		if (GUI.Button (new Rect (0, Screen.height - 20, 80, 20), "Options"))
+			showOptions = !showOptions;
+
+		if (GUI.Button (new Rect (90, Screen.height - 20, 80, 20), "Screenshot"))
+			StartCoroutine (CaptureScreenshot ((int)left, (int)top));
+
+		if (showOptions)
+			GUILayout.Window (0, new Rect (0, 0, Screen.width, Screen.height-20), OptionsWindow, "Options");
+	}
+
+	void OptionsWindow (int id) {
+		for (int i = 0; i < fronts.Length; i++) {
+			fronts[i].enabled = GUILayout.Toggle (fronts[i].enabled, tester.tests[i].name);
+		}
+		GUILayout.Space (10);
+		showNoise = GUILayout.Toggle (showNoise, "Show Noise Image");
+		showCoords = GUILayout.Toggle (showCoords, "Show Coordinates Plot");
+		showStats = GUILayout.Toggle (showStats, "Show Statistics");
+	}
+
+	IEnumerator CaptureScreenshot (int width, int height) {
+		yield return new WaitForEndOfFrame ();
+
+		// Create a texture, RGB24 format
+		var tex = new Texture2D (width, height, TextureFormat.RGB24, false);
+		// Read screen contents into the texture
+		tex.ReadPixels (new Rect (0, Screen.height - height, width, height), 0, 0);
+		tex.Apply ();
+
+		// Encode texture into PNG
+		var bytes = tex.EncodeToPNG ();
+		Destroy (tex);
+
+		// Save PNG
+		System.IO.File.WriteAllBytes (Application.dataPath + "/../Random.png", bytes);
+	}
+}

          
A => Assets/UnityFrontend/NoiseTestMB.cs.meta +8 -0
@@ 0,0 1,8 @@ 
+fileFormatVersion: 2
+guid: f196a99beabb9428c922e6f623041baf
+MonoImporter:
+  serializedVersion: 2
+  defaultReferences: []
+  executionOrder: 0
+  icon: {instanceID: 0}
+  userData: 

          
A => Assets/UnityFrontend/Test.unity +200 -0
@@ 0,0 1,200 @@ 
+%YAML 1.1
+%TAG !u! tag:unity3d.com,2011:
+--- !u!29 &1
+SceneSettings:
+  m_ObjectHideFlags: 0
+  m_PVSData: 
+  m_PVSObjectsArray: []
+  m_PVSPortalsArray: []
+  m_OcclusionBakeSettings:
+    smallestOccluder: 5
+    smallestHole: .25
+    backfaceThreshold: 100
+--- !u!104 &2
+RenderSettings:
+  m_Fog: 0
+  m_FogColor: {r: .5, g: .5, b: .5, a: 1}
+  m_FogMode: 3
+  m_FogDensity: .00999999978
+  m_LinearFogStart: 0
+  m_LinearFogEnd: 300
+  m_AmbientLight: {r: .200000003, g: .200000003, b: .200000003, a: 1}
+  m_SkyboxMaterial: {fileID: 0}
+  m_HaloStrength: .5
+  m_FlareStrength: 1
+  m_FlareFadeSpeed: 3
+  m_HaloTexture: {fileID: 0}
+  m_SpotCookie: {fileID: 0}
+  m_ObjectHideFlags: 0
+--- !u!127 &3
+LevelGameManager:
+  m_ObjectHideFlags: 0
+--- !u!157 &4
+LightmapSettings:
+  m_ObjectHideFlags: 0
+  m_LightProbes: {fileID: 0}
+  m_Lightmaps: []
+  m_LightmapsMode: 1
+  m_BakedColorSpace: 0
+  m_UseDualLightmapsInForward: 0
+  m_LightmapEditorSettings:
+    m_Resolution: 50
+    m_LastUsedResolution: 0
+    m_TextureWidth: 1024
+    m_TextureHeight: 1024
+    m_BounceBoost: 1
+    m_BounceIntensity: 1
+    m_SkyLightColor: {r: .860000014, g: .930000007, b: 1, a: 1}
+    m_SkyLightIntensity: 0
+    m_Quality: 0
+    m_Bounces: 1
+    m_FinalGatherRays: 1000
+    m_FinalGatherContrastThreshold: .0500000007
+    m_FinalGatherGradientThreshold: 0
+    m_FinalGatherInterpolationPoints: 15
+    m_AOAmount: 0
+    m_AOMaxDistance: .100000001
+    m_AOContrast: 1
+    m_LODSurfaceMappingDistance: 1
+    m_Padding: 0
+    m_TextureCompression: 0
+    m_LockAtlas: 0
+--- !u!196 &5
+NavMeshSettings:
+  m_ObjectHideFlags: 0
+  m_BuildSettings:
+    agentRadius: .5
+    agentHeight: 2
+    agentSlope: 45
+    agentClimb: .400000006
+    ledgeDropHeight: 0
+    maxJumpAcrossDistance: 0
+    accuratePlacement: 0
+    minRegionArea: 2
+    widthInaccuracy: 16.666666
+    heightInaccuracy: 10
+  m_NavMesh: {fileID: 0}
+--- !u!1 &535878205
+GameObject:
+  m_ObjectHideFlags: 0
+  m_PrefabParentObject: {fileID: 0}
+  m_PrefabInternal: {fileID: 0}
+  serializedVersion: 4
+  m_Component:
+  - 4: {fileID: 535878206}
+  - 20: {fileID: 535878207}
+  - 92: {fileID: 535878209}
+  - 124: {fileID: 535878210}
+  - 81: {fileID: 535878208}
+  m_Layer: 0
+  m_Name: Main Camera
+  m_TagString: MainCamera
+  m_Icon: {fileID: 0}
+  m_NavMeshLayer: 0
+  m_StaticEditorFlags: 0
+  m_IsActive: 1
+--- !u!4 &535878206
+Transform:
+  m_ObjectHideFlags: 0
+  m_PrefabParentObject: {fileID: 0}
+  m_PrefabInternal: {fileID: 0}
+  m_GameObject: {fileID: 535878205}
+  m_LocalRotation: {x: 0, y: 0, z: 0, w: 1}
+  m_LocalPosition: {x: 0, y: 0, z: -10}
+  m_LocalScale: {x: 1, y: 1, z: 1}
+  m_Children: []
+  m_Father: {fileID: 0}
+  m_RootOrder: 1
+--- !u!20 &535878207
+Camera:
+  m_ObjectHideFlags: 0
+  m_PrefabParentObject: {fileID: 0}
+  m_PrefabInternal: {fileID: 0}
+  m_GameObject: {fileID: 535878205}
+  m_Enabled: 1
+  serializedVersion: 2
+  m_ClearFlags: 1
+  m_BackGroundColor: {r: 1, g: 1, b: 1, a: .0196078438}
+  m_NormalizedViewPortRect:
+    serializedVersion: 2
+    x: 0
+    y: 0
+    width: 1
+    height: 1
+  near clip plane: .300000012
+  far clip plane: 1000
+  field of view: 60
+  orthographic: 0
+  orthographic size: 100
+  m_Depth: -1
+  m_CullingMask:
+    serializedVersion: 2
+    m_Bits: 4294967295
+  m_RenderingPath: -1
+  m_TargetTexture: {fileID: 0}
+  m_TargetDisplay: 0
+  m_HDR: 0
+  m_OcclusionCulling: 1
+  m_StereoConvergence: 10
+  m_StereoSeparation: .0219999999
+--- !u!81 &535878208
+AudioListener:
+  m_ObjectHideFlags: 0
+  m_PrefabParentObject: {fileID: 0}
+  m_PrefabInternal: {fileID: 0}
+  m_GameObject: {fileID: 535878205}
+  m_Enabled: 1
+--- !u!92 &535878209
+Behaviour:
+  m_ObjectHideFlags: 0
+  m_PrefabParentObject: {fileID: 0}
+  m_PrefabInternal: {fileID: 0}
+  m_GameObject: {fileID: 535878205}
+  m_Enabled: 1
+--- !u!124 &535878210
+Behaviour:
+  m_ObjectHideFlags: 0
+  m_PrefabParentObject: {fileID: 0}
+  m_PrefabInternal: {fileID: 0}
+  m_GameObject: {fileID: 535878205}
+  m_Enabled: 1
+--- !u!1 &1232387675
+GameObject:
+  m_ObjectHideFlags: 0
+  m_PrefabParentObject: {fileID: 0}
+  m_PrefabInternal: {fileID: 0}
+  serializedVersion: 4
+  m_Component:
+  - 4: {fileID: 1232387676}
+  - 114: {fileID: 1232387677}
+  m_Layer: 0
+  m_Name: GameObject
+  m_TagString: Untagged
+  m_Icon: {fileID: 0}
+  m_NavMeshLayer: 0
+  m_StaticEditorFlags: 0
+  m_IsActive: 1
+--- !u!4 &1232387676
+Transform:
+  m_ObjectHideFlags: 0
+  m_PrefabParentObject: {fileID: 0}
+  m_PrefabInternal: {fileID: 0}
+  m_GameObject: {fileID: 1232387675}
+  m_LocalRotation: {x: 0, y: 0, z: 0, w: 1}
+  m_LocalPosition: {x: 0, y: 0, z: 0}
+  m_LocalScale: {x: 1, y: 1, z: 1}
+  m_Children: []
+  m_Father: {fileID: 0}
+  m_RootOrder: 0
+--- !u!114 &1232387677
+MonoBehaviour:
+  m_ObjectHideFlags: 0
+  m_PrefabParentObject: {fileID: 0}
+  m_PrefabInternal: {fileID: 0}
+  m_GameObject: {fileID: 1232387675}
+  m_Enabled: 1
+  m_EditorHideFlags: 0
+  m_Script: {fileID: 11500000, guid: f196a99beabb9428c922e6f623041baf, type: 3}
+  m_Name: 
+  m_EditorClassIdentifier: 
+  font: {fileID: 12800000, guid: c62870e0e417e455fbf0dab83663a9fb, type: 3}

          
A => Assets/UnityFrontend/Test.unity.meta +4 -0
@@ 0,0 1,4 @@ 
+fileFormatVersion: 2
+guid: af86cb29a19cd4fd0a758477522d87ea
+DefaultImporter:
+  userData: 

          
A => ProjectSettings/AudioManager.asset +12 -0
@@ 0,0 1,12 @@ 
+%YAML 1.1
+%TAG !u! tag:unity3d.com,2011:
+--- !u!11 &1
+AudioManager:
+  m_ObjectHideFlags: 0
+  m_Volume: 1
+  Rolloff Scale: 1
+  m_SpeedOfSound: 347
+  Doppler Factor: 1
+  Default Speaker Mode: 2
+  m_DSPBufferSize: 0
+  m_DisableAudio: 0

          
A => ProjectSettings/DynamicsManager.asset +15 -0
@@ 0,0 1,15 @@ 
+%YAML 1.1
+%TAG !u! tag:unity3d.com,2011:
+--- !u!55 &1
+PhysicsManager:
+  m_ObjectHideFlags: 0
+  m_Gravity: {x: 0, y: -9.81000042, z: 0}
+  m_DefaultMaterial: {fileID: 0}
+  m_BounceThreshold: 2
+  m_SleepVelocity: .150000006
+  m_SleepAngularVelocity: .140000001
+  m_MaxAngularVelocity: 7
+  m_MinPenetrationForPenalty: .00999999978
+  m_SolverIterationCount: 6
+  m_RaycastsHitTriggers: 1
+  m_LayerCollisionMatrix: ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff

          
A => ProjectSettings/EditorBuildSettings.asset +7 -0
@@ 0,0 1,7 @@ 
+%YAML 1.1
+%TAG !u! tag:unity3d.com,2011:
+--- !u!1045 &1
+EditorBuildSettings:
+  m_ObjectHideFlags: 0
+  serializedVersion: 2
+  m_Scenes: []

          
A => ProjectSettings/EditorSettings.asset +12 -0
@@ 0,0 1,12 @@ 
+%YAML 1.1
+%TAG !u! tag:unity3d.com,2011:
+--- !u!159 &1
+EditorSettings:
+  m_ObjectHideFlags: 0
+  serializedVersion: 3
+  m_ExternalVersionControlSupport: Hidden Meta Files
+  m_SerializationMode: 2
+  m_WebSecurityEmulationEnabled: 0
+  m_WebSecurityEmulationHostUrl: http://www.mydomain.com/mygame.unity3d
+  m_DefaultBehaviorMode: 0
+  m_SpritePackerMode: 2

          
A => ProjectSettings/GraphicsSettings.asset +10 -0
@@ 0,0 1,10 @@ 
+%YAML 1.1
+%TAG !u! tag:unity3d.com,2011:
+--- !u!30 &1
+GraphicsSettings:
+  m_ObjectHideFlags: 0
+  serializedVersion: 2
+  m_AlwaysIncludedShaders:
+  - {fileID: 7, guid: 0000000000000000f000000000000000, type: 0}
+  - {fileID: 10770, guid: 0000000000000000f000000000000000, type: 0}
+  - {fileID: 10782, guid: 0000000000000000f000000000000000, type: 0}

          
A => ProjectSettings/InputManager.asset +327 -0
@@ 0,0 1,327 @@ 
+%YAML 1.1
+%TAG !u! tag:unity3d.com,2011:
+--- !u!13 &1
+InputManager:
+  m_ObjectHideFlags: 0
+  serializedVersion: 2
+  m_Axes:
+  - serializedVersion: 3
+    m_Name: Horizontal
+    descriptiveName: 
+    descriptiveNegativeName: 
+    negativeButton: left
+    positiveButton: right
+    altNegativeButton: a
+    altPositiveButton: d
+    gravity: 3
+    dead: .00100000005
+    sensitivity: 3
+    snap: 1
+    invert: 0
+    type: 0
+    axis: 0
+    joyNum: 0
+  - serializedVersion: 3
+    m_Name: Vertical
+    descriptiveName: 
+    descriptiveNegativeName: 
+    negativeButton: down
+    positiveButton: up
+    altNegativeButton: s
+    altPositiveButton: w
+    gravity: 3
+    dead: .00100000005
+    sensitivity: 3
+    snap: 1
+    invert: 0
+    type: 0
+    axis: 0
+    joyNum: 0
+  - serializedVersion: 3
+    m_Name: Fire1
+    descriptiveName: 
+    descriptiveNegativeName: 
+    negativeButton: 
+    positiveButton: left ctrl
+    altNegativeButton: 
+    altPositiveButton: mouse 0
+    gravity: 1000
+    dead: .00100000005
+    sensitivity: 1000
+    snap: 0
+    invert: 0
+    type: 0
+    axis: 0
+    joyNum: 0
+  - serializedVersion: 3
+    m_Name: Fire2
+    descriptiveName: 
+    descriptiveNegativeName: 
+    negativeButton: 
+    positiveButton: left alt
+    altNegativeButton: 
+    altPositiveButton: mouse 1
+    gravity: 1000
+    dead: .00100000005
+    sensitivity: 1000
+    snap: 0
+    invert: 0
+    type: 0
+    axis: 0
+    joyNum: 0
+  - serializedVersion: 3
+    m_Name: Fire3
+    descriptiveName: 
+    descriptiveNegativeName: 
+    negativeButton: 
+    positiveButton: left cmd
+    altNegativeButton: 
+    altPositiveButton: mouse 2
+    gravity: 1000
+    dead: .00100000005
+    sensitivity: 1000
+    snap: 0
+    invert: 0
+    type: 0
+    axis: 0
+    joyNum: 0
+  - serializedVersion: 3
+    m_Name: Jump
+    descriptiveName: 
+    descriptiveNegativeName: 
+    negativeButton: 
+    positiveButton: space
+    altNegativeButton: 
+    altPositiveButton: 
+    gravity: 1000
+    dead: .00100000005
+    sensitivity: 1000
+    snap: 0
+    invert: 0
+    type: 0
+    axis: 0
+    joyNum: 0
+  - serializedVersion: 3
+    m_Name: Mouse X
+    descriptiveName: 
+    descriptiveNegativeName: 
+    negativeButton: 
+    positiveButton: 
+    altNegativeButton: 
+    altPositiveButton: 
+    gravity: 0
+    dead: 0
+    sensitivity: .100000001
+    snap: 0
+    invert: 0
+    type: 1
+    axis: 0
+    joyNum: 0
+  - serializedVersion: 3
+    m_Name: Mouse Y
+    descriptiveName: 
+    descriptiveNegativeName: 
+    negativeButton: 
+    positiveButton: 
+    altNegativeButton: 
+    altPositiveButton: 
+    gravity: 0
+    dead: 0
+    sensitivity: .100000001
+    snap: 0
+    invert: 0
+    type: 1
+    axis: 1
+    joyNum: 0
+  - serializedVersion: 3
+    m_Name: Mouse ScrollWheel
+    descriptiveName: 
+    descriptiveNegativeName: 
+    negativeButton: 
+    positiveButton: 
+    altNegativeButton: 
+    altPositiveButton: 
+    gravity: 0
+    dead: 0
+    sensitivity: .100000001
+    snap: 0
+    invert: 0
+    type: 1
+    axis: 2
+    joyNum: 0
+  - serializedVersion: 3
+    m_Name: Window Shake X
+    descriptiveName: 
+    descriptiveNegativeName: 
+    negativeButton: 
+    positiveButton: 
+    altNegativeButton: 
+    altPositiveButton: 
+    gravity: 0
+    dead: 0
+    sensitivity: .100000001
+    snap: 0
+    invert: 0
+    type: 3
+    axis: 0
+    joyNum: 0
+  - serializedVersion: 3
+    m_Name: Window Shake Y
+    descriptiveName: 
+    descriptiveNegativeName: 
+    negativeButton: 
+    positiveButton: 
+    altNegativeButton: 
+    altPositiveButton: 
+    gravity: 0
+    dead: 0
+    sensitivity: .100000001
+    snap: 0
+    invert: 0
+    type: 3
+    axis: 1
+    joyNum: 0
+  - serializedVersion: 3
+    m_Name: Horizontal
+    descriptiveName: 
+    descriptiveNegativeName: 
+    negativeButton: 
+    positiveButton: 
+    altNegativeButton: 
+    altPositiveButton: 
+    gravity: 0
+    dead: .189999998
+    sensitivity: 1
+    snap: 0
+    invert: 0
+    type: 2
+    axis: 0
+    joyNum: 0
+  - serializedVersion: 3
+    m_Name: Vertical
+    descriptiveName: 
+    descriptiveNegativeName: 
+    negativeButton: 
+    positiveButton: 
+    altNegativeButton: 
+    altPositiveButton: 
+    gravity: 0
+    dead: .189999998
+    sensitivity: 1
+    snap: 0
+    invert: 1
+    type: 2
+    axis: 1
+    joyNum: 0
+  - serializedVersion: 3
+    m_Name: Fire1
+    descriptiveName: 
+    descriptiveNegativeName: 
+    negativeButton: 
+    positiveButton: joystick button 0
+    altNegativeButton: 
+    altPositiveButton: 
+    gravity: 1000
+    dead: .00100000005
+    sensitivity: 1000
+    snap: 0
+    invert: 0
+    type: 0
+    axis: 0
+    joyNum: 0
+  - serializedVersion: 3
+    m_Name: Fire2
+    descriptiveName: 
+    descriptiveNegativeName: 
+    negativeButton: 
+    positiveButton: joystick button 1
+    altNegativeButton: 
+    altPositiveButton: 
+    gravity: 1000
+    dead: .00100000005
+    sensitivity: 1000
+    snap: 0
+    invert: 0
+    type: 0
+    axis: 0
+    joyNum: 0
+  - serializedVersion: 3
+    m_Name: Fire3
+    descriptiveName: 
+    descriptiveNegativeName: 
+    negativeButton: 
+    positiveButton: joystick button 2
+    altNegativeButton: 
+    altPositiveButton: 
+    gravity: 1000
+    dead: .00100000005
+    sensitivity: 1000
+    snap: 0
+    invert: 0
+    type: 0
+    axis: 0
+    joyNum: 0
+  - serializedVersion: 3
+    m_Name: Jump
+    descriptiveName: 
+    descriptiveNegativeName: 
+    negativeButton: 
+    positiveButton: joystick button 3
+    altNegativeButton: 
+    altPositiveButton: 
+    gravity: 1000
+    dead: .00100000005
+    sensitivity: 1000
+    snap: 0
+    invert: 0
+    type: 0
+    axis: 0
+    joyNum: 0
+  - serializedVersion: 3
+    m_Name: Submit
+    descriptiveName: 
+    descriptiveNegativeName: 
+    negativeButton: 
+    positiveButton: return
+    altNegativeButton: 
+    altPositiveButton: joystick button 0
+    gravity: 1000
+    dead: .00100000005
+    sensitivity: 1000
+    snap: 0
+    invert: 0
+    type: 0
+    axis: 0
+    joyNum: 0
+  - serializedVersion: 3
+    m_Name: Submit
+    descriptiveName: 
+    descriptiveNegativeName: 
+    negativeButton: 
+    positiveButton: enter
+    altNegativeButton: 
+    altPositiveButton: space
+    gravity: 1000
+    dead: .00100000005
+    sensitivity: 1000
+    snap: 0
+    invert: 0
+    type: 0
+    axis: 0
+    joyNum: 0
+  - serializedVersion: 3
+    m_Name: Cancel
+    descriptiveName: 
+    descriptiveNegativeName: 
+    negativeButton: 
+    positiveButton: escape
+    altNegativeButton: 
+    altPositiveButton: joystick button 1
+    gravity: 1000
+    dead: .00100000005
+    sensitivity: 1000
+    snap: 0
+    invert: 0
+    type: 0
+    axis: 0
+    joyNum: 0

          
A => ProjectSettings/NavMeshLayers.asset +133 -0
@@ 0,0 1,133 @@ 
+%YAML 1.1
+%TAG !u! tag:unity3d.com,2011:
+--- !u!126 &1
+NavMeshLayers:
+  m_ObjectHideFlags: 0
+  Built-in Layer 0:
+    name: Default
+    cost: 1
+    editType: 2
+  Built-in Layer 1:
+    name: Not Walkable
+    cost: 1
+    editType: 0
+  Built-in Layer 2:
+    name: Jump
+    cost: 2
+    editType: 2
+  User Layer 0:
+    name: 
+    cost: 1
+    editType: 3
+  User Layer 1:
+    name: 
+    cost: 1
+    editType: 3
+  User Layer 2:
+    name: 
+    cost: 1
+    editType: 3
+  User Layer 3:
+    name: 
+    cost: 1
+    editType: 3
+  User Layer 4:
+    name: 
+    cost: 1
+    editType: 3
+  User Layer 5:
+    name: 
+    cost: 1
+    editType: 3
+  User Layer 6:
+    name: 
+    cost: 1
+    editType: 3
+  User Layer 7:
+    name: 
+    cost: 1
+    editType: 3
+  User Layer 8:
+    name: 
+    cost: 1
+    editType: 3
+  User Layer 9:
+    name: 
+    cost: 1
+    editType: 3
+  User Layer 10:
+    name: 
+    cost: 1
+    editType: 3
+  User Layer 11:
+    name: 
+    cost: 1
+    editType: 3
+  User Layer 12:
+    name: 
+    cost: 1
+    editType: 3
+  User Layer 13:
+    name: 
+    cost: 1
+    editType: 3
+  User Layer 14:
+    name: 
+    cost: 1
+    editType: 3
+  User Layer 15:
+    name: 
+    cost: 1
+    editType: 3
+  User Layer 16:
+    name: 
+    cost: 1
+    editType: 3
+  User Layer 17:
+    name: 
+    cost: 1
+    editType: 3
+  User Layer 18:
+    name: 
+    cost: 1
+    editType: 3
+  User Layer 19:
+    name: 
+    cost: 1
+    editType: 3
+  User Layer 20:
+    name: 
+    cost: 1
+    editType: 3
+  User Layer 21:
+    name: 
+    cost: 1
+    editType: 3
+  User Layer 22:
+    name: 
+    cost: 1
+    editType: 3
+  User Layer 23:
+    name: 
+    cost: 1
+    editType: 3
+  User Layer 24:
+    name: 
+    cost: 1
+    editType: 3
+  User Layer 25:
+    name: 
+    cost: 1
+    editType: 3
+  User Layer 26:
+    name: 
+    cost: 1
+    editType: 3
+  User Layer 27:
+    name: 
+    cost: 1
+    editType: 3
+  User Layer 28:
+    name: 
+    cost: 1
+    editType: 3

          
A => ProjectSettings/NetworkManager.asset +8 -0
@@ 0,0 1,8 @@ 
+%YAML 1.1
+%TAG !u! tag:unity3d.com,2011:
+--- !u!149 &1
+NetworkManager:
+  m_ObjectHideFlags: 0
+  m_DebugLevel: 0
+  m_Sendrate: 15
+  m_AssetToPrefab: {}

          
A => ProjectSettings/Physics2DSettings.asset +22 -0
@@ 0,0 1,22 @@ 
+%YAML 1.1
+%TAG !u! tag:unity3d.com,2011:
+--- !u!19 &1
+Physics2DSettings:
+  m_ObjectHideFlags: 0
+  m_Gravity: {x: 0, y: -9.81000042}
+  m_DefaultMaterial: {fileID: 0}
+  m_VelocityIterations: 8
+  m_PositionIterations: 3
+  m_VelocityThreshold: 1
+  m_MaxLinearCorrection: .200000003
+  m_MaxAngularCorrection: 8
+  m_MaxTranslationSpeed: 100
+  m_MaxRotationSpeed: 360
+  m_BaumgarteScale: .200000003
+  m_BaumgarteTimeOfImpactScale: .75
+  m_TimeToSleep: .5
+  m_LinearSleepTolerance: .00999999978
+  m_AngularSleepTolerance: 2
+  m_RaycastsHitTriggers: 1
+  m_DeleteStopsCallbacks: 1
+  m_LayerCollisionMatrix: ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff

          
A => ProjectSettings/ProjectSettings.asset +248 -0
@@ 0,0 1,248 @@ 
+%YAML 1.1
+%TAG !u! tag:unity3d.com,2011:
+--- !u!129 &1
+PlayerSettings:
+  m_ObjectHideFlags: 0
+  serializedVersion: 3
+  AndroidProfiler: 0
+  defaultScreenOrientation: 0
+  targetDevice: 2
+  targetGlesGraphics: 1
+  targetResolution: 0
+  accelerometerFrequency: 60
+  companyName: DefaultCompany
+  productName: NoiseProject
+  defaultCursor: {fileID: 0}
+  cursorHotspot: {x: 0, y: 0}
+  defaultScreenWidth: 1024
+  defaultScreenHeight: 768
+  defaultScreenWidthWeb: 960
+  defaultScreenHeightWeb: 600
+  m_RenderingPath: 1
+  m_MobileRenderingPath: 1
+  m_ActiveColorSpace: 0
+  m_MTRendering: 1
+  m_MobileMTRendering: 0
+  m_UseDX11: 1
+  m_Stereoscopic3D: 0
+  iosShowActivityIndicatorOnLoading: -1
+  androidShowActivityIndicatorOnLoading: -1
+  displayResolutionDialog: 1
+  allowedAutorotateToPortrait: 1
+  allowedAutorotateToPortraitUpsideDown: 1
+  allowedAutorotateToLandscapeRight: 1
+  allowedAutorotateToLandscapeLeft: 1
+  useOSAutorotation: 1
+  use32BitDisplayBuffer: 0
+  use24BitDepthBuffer: 0
+  defaultIsFullScreen: 0
+  defaultIsNativeResolution: 1
+  runInBackground: 0
+  captureSingleScreen: 0
+  Override IPod Music: 0
+  Prepare IOS For Recording: 0
+  enableHWStatistics: 1
+  usePlayerLog: 1
+  stripPhysics: 0
+  forceSingleInstance: 0
+  resizableWindow: 0
+  useMacAppStoreValidation: 0
+  gpuSkinning: 0
+  xboxPIXTextureCapture: 0
+  xboxEnableAvatar: 0
+  xboxEnableKinect: 0
+  xboxEnableKinectAutoTracking: 0
+  xboxEnableFitness: 0
+  visibleInBackground: 0
+  macFullscreenMode: 2
+  d3d9FullscreenMode: 1
+  d3d11ForceExclusiveMode: 0
+  xboxSpeechDB: 0
+  xboxEnableHeadOrientation: 0
+  xboxEnableGuest: 0
+  videoMemoryForVertexBuffers: 0
+  m_SupportedAspectRatios:
+    4:3: 1
+    5:4: 1
+    16:10: 1
+    16:9: 1
+    Others: 1
+  iPhoneBundleIdentifier: com.Company.ProductName
+  metroEnableIndependentInputSource: 0
+  metroEnableLowLatencyPresentationAPI: 0
+  productGUID: 6df95189062f9420cbb882f30a3abe0f
+  iPhoneBundleVersion: 1.0
+  AndroidBundleVersionCode: 1
+  AndroidMinSdkVersion: 9
+  AndroidPreferredInstallLocation: 1
+  aotOptions: 
+  apiCompatibilityLevel: 2
+  iPhoneStrippingLevel: 0
+  iPhoneScriptCallOptimization: 0
+  ForceInternetPermission: 0
+  ForceSDCardPermission: 0
+  CreateWallpaper: 0
+  APKExpansionFiles: 0
+  StripUnusedMeshComponents: 0
+  iPhoneSdkVersion: 988
+  iPhoneTargetOSVersion: 10
+  uIPrerenderedIcon: 0
+  uIRequiresPersistentWiFi: 0
+  uIStatusBarHidden: 1
+  uIExitOnSuspend: 0
+  uIStatusBarStyle: 0
+  iPhoneSplashScreen: {fileID: 0}
+  iPhoneHighResSplashScreen: {fileID: 0}
+  iPhoneTallHighResSplashScreen: {fileID: 0}
+  iPhone47inSplashScreen: {fileID: 0}
+  iPhone55inPortraitSplashScreen: {fileID: 0}
+  iPhone55inLandscapeSplashScreen: {fileID: 0}
+  iPadPortraitSplashScreen: {fileID: 0}
+  iPadHighResPortraitSplashScreen: {fileID: 0}
+  iPadLandscapeSplashScreen: {fileID: 0}
+  iPadHighResLandscapeSplashScreen: {fileID: 0}
+  AndroidTargetDevice: 0
+  AndroidSplashScreenScale: 0
+  AndroidKeystoreName: 
+  AndroidKeyaliasName: 
+  resolutionDialogBanner: {fileID: 0}
+  m_BuildTargetIcons: []
+  m_BuildTargetBatching: []
+  webPlayerTemplate: APPLICATION:Default
+  m_TemplateCustomTags: {}
+  XboxTitleId: 
+  XboxImageXexPath: 
+  XboxSpaPath: 
+  XboxGenerateSpa: 0
+  XboxDeployKinectResources: 0
+  XboxSplashScreen: {fileID: 0}
+  xboxEnableSpeech: 0
+  xboxAdditionalTitleMemorySize: 0
+  xboxDeployKinectHeadOrientation: 0
+  xboxDeployKinectHeadPosition: 0
+  ps3TitleConfigPath: 
+  ps3DLCConfigPath: 
+  ps3ThumbnailPath: 
+  ps3BackgroundPath: 
+  ps3SoundPath: 
+  ps3TrophyCommId: 
+  ps3NpCommunicationPassphrase: 
+  ps3TrophyPackagePath: 
+  ps3BootCheckMaxSaveGameSizeKB: 128
+  ps3TrophyCommSig: 
+  ps3SaveGameSlots: 1
+  ps3TrialMode: 0
+  psp2Splashimage: {fileID: 0}
+  psp2LiveAreaGate: {fileID: 0}
+  psp2LiveAreaBackround: {fileID: 0}
+  psp2NPTrophyPackPath: 
+  psp2NPCommsID: 
+  psp2NPCommsPassphrase: 
+  psp2NPCommsSig: 
+  psp2ParamSfxPath: 
+  psp2PackagePassword: 
+  psp2DLCConfigPath: 
+  psp2ThumbnailPath: 
+  psp2BackgroundPath: 
+  psp2SoundPath: 
+  psp2TrophyCommId: 
+  psp2TrophyPackagePath: 
+  psp2PackagedResourcesPath: 
+  flashStrippingLevel: 2
+  spritePackerPolicy: 
+  scriptingDefineSymbols: {}
+  metroPackageName: NoiseProject
+  metroPackageLogo: 
+  metroPackageLogo140: 
+  metroPackageLogo180: 
+  metroPackageLogo240: 
+  metroPackageVersion: 
+  metroCertificatePath: 
+  metroCertificatePassword: 
+  metroCertificateSubject: 
+  metroCertificateIssuer: 
+  metroCertificateNotAfter: 0000000000000000
+  metroApplicationDescription: NoiseProject
+  metroStoreTileLogo80: 
+  metroStoreTileLogo: 
+  metroStoreTileLogo140: 
+  metroStoreTileLogo180: 
+  metroStoreTileWideLogo80: 
+  metroStoreTileWideLogo: 
+  metroStoreTileWideLogo140: 
+  metroStoreTileWideLogo180: 
+  metroStoreTileSmallLogo80: 
+  metroStoreTileSmallLogo: 
+  metroStoreTileSmallLogo140: 
+  metroStoreTileSmallLogo180: 
+  metroStoreSmallTile80: 
+  metroStoreSmallTile: 
+  metroStoreSmallTile140: 
+  metroStoreSmallTile180: 
+  metroStoreLargeTile80: 
+  metroStoreLargeTile: 
+  metroStoreLargeTile140: 
+  metroStoreLargeTile180: 
+  metroStoreSplashScreenImage: 
+  metroStoreSplashScreenImage140: 
+  metroStoreSplashScreenImage180: 
+  metroPhoneAppIcon: 
+  metroPhoneAppIcon140: 
+  metroPhoneAppIcon240: 
+  metroPhoneSmallTile: 
+  metroPhoneSmallTile140: 
+  metroPhoneSmallTile240: 
+  metroPhoneMediumTile: 
+  metroPhoneMediumTile140: 
+  metroPhoneMediumTile240: 
+  metroPhoneWideTile: 
+  metroPhoneWideTile140: 
+  metroPhoneWideTile240: 
+  metroPhoneSplashScreenImage: 
+  metroPhoneSplashScreenImage140: 
+  metroPhoneSplashScreenImage240: 
+  metroTileShortName: 
+  metroCommandLineArgsFile: 
+  metroTileShowName: 0
+  metroMediumTileShowName: 0
+  metroLargeTileShowName: 0
+  metroWideTileShowName: 0
+  metroDefaultTileSize: 1
+  metroTileForegroundText: 1
+  metroTileBackgroundColor: {r: 0, g: 0, b: 0, a: 1}
+  metroSplashScreenBackgroundColor: {r: 0, g: 0, b: 0, a: 1}
+  metroSplashScreenUseBackgroundColor: 0
+  metroCapabilities: {}
+  metroUnprocessedPlugins: []
+  metroCompilationOverrides: 1
+  blackberryDeviceAddress: 
+  blackberryDevicePassword: 
+  blackberryTokenPath: 
+  blackberryTokenExires: 
+  blackberryTokenAuthor: 
+  blackberryTokenAuthorId: 
+  blackberryAuthorId: 
+  blackberryCskPassword: 
+  blackberrySaveLogPath: 
+  blackberryAuthorIdOveride: 0
+  blackberrySharedPermissions: 0
+  blackberryCameraPermissions: 0
+  blackberryGPSPermissions: 0
+  blackberryDeviceIDPermissions: 0
+  blackberryMicrophonePermissions: 0
+  blackberryGamepadSupport: 0
+  blackberryBuildId: 0
+  blackberryLandscapeSplashScreen: {fileID: 0}
+  blackberryPortraitSplashScreen: {fileID: 0}
+  blackberrySquareSplashScreen: {fileID: 0}
+  tizenProductDescription: 
+  tizenProductURL: 
+  tizenCertificatePath: 
+  tizenCertificatePassword: 
+  tizenGPSPermissions: 0
+  tizenMicrophonePermissions: 0
+  stvDeviceAddress: 
+  firstStreamedLevelWithResources: 0
+  unityRebuildLibraryVersion: 9
+  unityForwardCompatibleVersion: 39
+  unityStandardAssetsVersion: 0

          
A => ProjectSettings/QualitySettings.asset +132 -0
@@ 0,0 1,132 @@ 
+%YAML 1.1
+%TAG !u! tag:unity3d.com,2011:
+--- !u!47 &1
+QualitySettings:
+  m_ObjectHideFlags: 0
+  serializedVersion: 5
+  m_CurrentQuality: 3
+  m_QualitySettings:
+  - serializedVersion: 2
+    name: Fastest
+    pixelLightCount: 0
+    shadows: 0
+    shadowResolution: 0
+    shadowProjection: 1
+    shadowCascades: 1
+    shadowDistance: 15
+    blendWeights: 1
+    textureQuality: 1
+    anisotropicTextures: 0
+    antiAliasing: 0
+    softParticles: 0
+    softVegetation: 0
+    vSyncCount: 0
+    lodBias: .300000012
+    maximumLODLevel: 0
+    particleRaycastBudget: 4
+    excludedTargetPlatforms: []
+  - serializedVersion: 2
+    name: Fast
+    pixelLightCount: 0
+    shadows: 0
+    shadowResolution: 0
+    shadowProjection: 1
+    shadowCascades: 1
+    shadowDistance: 20
+    blendWeights: 2
+    textureQuality: 0
+    anisotropicTextures: 0
+    antiAliasing: 0
+    softParticles: 0
+    softVegetation: 0
+    vSyncCount: 0
+    lodBias: .400000006
+    maximumLODLevel: 0
+    particleRaycastBudget: 16
+    excludedTargetPlatforms: []
+  - serializedVersion: 2
+    name: Simple
+    pixelLightCount: 1
+    shadows: 1
+    shadowResolution: 0
+    shadowProjection: 1
+    shadowCascades: 1
+    shadowDistance: 20
+    blendWeights: 2
+    textureQuality: 0
+    anisotropicTextures: 1
+    antiAliasing: 0
+    softParticles: 0
+    softVegetation: 0
+    vSyncCount: 0
+    lodBias: .699999988
+    maximumLODLevel: 0
+    particleRaycastBudget: 64
+    excludedTargetPlatforms: []
+  - serializedVersion: 2
+    name: Good
+    pixelLightCount: 2
+    shadows: 2
+    shadowResolution: 1
+    shadowProjection: 1
+    shadowCascades: 2
+    shadowDistance: 40
+    blendWeights: 2
+    textureQuality: 0
+    anisotropicTextures: 1
+    antiAliasing: 0
+    softParticles: 0
+    softVegetation: 1
+    vSyncCount: 1
+    lodBias: 1
+    maximumLODLevel: 0
+    particleRaycastBudget: 256
+    excludedTargetPlatforms: []
+  - serializedVersion: 2
+    name: Beautiful
+    pixelLightCount: 3
+    shadows: 2
+    shadowResolution: 2
+    shadowProjection: 1
+    shadowCascades: 2
+    shadowDistance: 70
+    blendWeights: 4
+    textureQuality: 0
+    anisotropicTextures: 2
+    antiAliasing: 2
+    softParticles: 1
+    softVegetation: 1
+    vSyncCount: 1
+    lodBias: 1.5
+    maximumLODLevel: 0
+    particleRaycastBudget: 1024
+    excludedTargetPlatforms: []
+  - serializedVersion: 2
+    name: Fantastic
+    pixelLightCount: 4
+    shadows: 2
+    shadowResolution: 2
+    shadowProjection: 1
+    shadowCascades: 4
+    shadowDistance: 150
+    blendWeights: 4
+    textureQuality: 0
+    anisotropicTextures: 2
+    antiAliasing: 2
+    softParticles: 1
+    softVegetation: 1
+    vSyncCount: 1
+    lodBias: 2
+    maximumLODLevel: 0
+    particleRaycastBudget: 4096
+    excludedTargetPlatforms: []
+  m_PerPlatformDefaultQuality:
+    Android: 2
+    FlashPlayer: 3
+    GLES Emulation: 3
+    PS3: 3
+    Standalone: 3
+    Web: 3
+    Wii: 3
+    XBOX360: 3
+    iPhone: 2

          
A => ProjectSettings/TagManager.asset +43 -0
@@ 0,0 1,43 @@ 
+%YAML 1.1
+%TAG !u! tag:unity3d.com,2011:
+--- !u!78 &1
+TagManager:
+  tags:
+  - 
+  Builtin Layer 0: Default
+  Builtin Layer 1: TransparentFX
+  Builtin Layer 2: Ignore Raycast
+  Builtin Layer 3: 
+  Builtin Layer 4: Water
+  Builtin Layer 5: UI
+  Builtin Layer 6: 
+  Builtin Layer 7: 
+  User Layer 8: 
+  User Layer 9: 
+  User Layer 10: 
+  User Layer 11: 
+  User Layer 12: 
+  User Layer 13: 
+  User Layer 14: 
+  User Layer 15: 
+  User Layer 16: 
+  User Layer 17: 
+  User Layer 18: 
+  User Layer 19: 
+  User Layer 20: 
+  User Layer 21: 
+  User Layer 22: 
+  User Layer 23: 
+  User Layer 24: 
+  User Layer 25: 
+  User Layer 26: 
+  User Layer 27: 
+  User Layer 28: 
+  User Layer 29: 
+  User Layer 30: 
+  User Layer 31: 
+  m_SortingLayers:
+  - name: Default
+    userID: 0
+    uniqueID: 0
+    locked: 0

          
A => ProjectSettings/TimeManager.asset +8 -0
@@ 0,0 1,8 @@ 
+%YAML 1.1
+%TAG !u! tag:unity3d.com,2011:
+--- !u!5 &1
+TimeManager:
+  m_ObjectHideFlags: 0
+  Fixed Timestep: .0199999996
+  Maximum Allowed Timestep: .333333343
+  m_TimeScale: 1