From 2a96052002948e77d283287214f98e74634a8727 Mon Sep 17 00:00:00 2001
From: Peter Cottle
Date: Mon, 18 Feb 2013 09:10:08 -0800
Subject: [PATCH] Recursive tree comparison algorithm that is hash agnostic to
lay the groundwork for Issue #28
---
build/bundle.js | 244 ++++++++++++++++++++++++++++-------
build/bundle.min.04e3ef79.js | 1 -
build/bundle.min.7e188d82.js | 1 +
build/bundle.min.js | 2 +-
index.html | 2 +-
src/js/app/index.js | 8 +-
src/js/git/index.js | 3 +-
src/js/git/treeCompare.js | 111 +++++++++++++---
todo.txt | 11 +-
9 files changed, 313 insertions(+), 70 deletions(-)
delete mode 100644 build/bundle.min.04e3ef79.js
create mode 100644 build/bundle.min.7e188d82.js
diff --git a/build/bundle.js b/build/bundle.js
index 1508bd843..8369263d5 100644
--- a/build/bundle.js
+++ b/build/bundle.js
@@ -6501,16 +6501,17 @@ var init = function() {
events.trigger('resize', e);
});
+ /*
$(window).on('resize', _.throttle(function(e) {
var width = $(window).width();
var height = $(window).height();
eventBaton.trigger('windowSizeCheck', {w: width, h: height});
}, 500));
+ */
+
eventBaton.stealBaton('docKeydown', function() { });
eventBaton.stealBaton('docKeyup', function() { });
- //$('body').delegate('div.close', 'click', function() { alert('these dont actually work sorry lol.'); });
-
/**
* I am disabling this for now, it works on desktop but is
hacky on iOS mobile and god knows the behavior on android...
@@ -6528,7 +6529,7 @@ var init = function() {
});
*/
- /*
+ /* people were pissed about this apparently
eventBaton.stealBaton('windowSizeCheck', function(size) {
if (size.w < Constants.VIEWPORT.minWidth ||
size.h < Constants.VIEWPORT.minHeight) {
@@ -6591,6 +6592,7 @@ var init = function() {
eventBaton.trigger('commandSubmitted', command);
});
}
+
if (/(iPhone|iPod|iPad).*AppleWebKit/i.test(navigator.userAgent) || /android/i.test(navigator.userAgent)) {
sandbox.mainVis.customEvents.on('gitEngineReady', function() {
eventBaton.trigger('commandSubmitted', 'mobile alert');
@@ -7566,6 +7568,7 @@ GitEngine.prototype.initUniqueID = function() {
};
GitEngine.prototype.defaultInit = function() {
+ // lol 80 char limit
var defaultTree = JSON.parse(unescape("%7B%22branches%22%3A%7B%22master%22%3A%7B%22target%22%3A%22C1%22%2C%22id%22%3A%22master%22%2C%22type%22%3A%22branch%22%7D%7D%2C%22commits%22%3A%7B%22C0%22%3A%7B%22type%22%3A%22commit%22%2C%22parents%22%3A%5B%5D%2C%22author%22%3A%22Peter%20Cottle%22%2C%22createTime%22%3A%22Mon%20Nov%2005%202012%2000%3A56%3A47%20GMT-0800%20%28PST%29%22%2C%22commitMessage%22%3A%22Quick%20Commit.%20Go%20Bears%21%22%2C%22id%22%3A%22C0%22%2C%22rootCommit%22%3Atrue%7D%2C%22C1%22%3A%7B%22type%22%3A%22commit%22%2C%22parents%22%3A%5B%22C0%22%5D%2C%22author%22%3A%22Peter%20Cottle%22%2C%22createTime%22%3A%22Mon%20Nov%2005%202012%2000%3A56%3A47%20GMT-0800%20%28PST%29%22%2C%22commitMessage%22%3A%22Quick%20Commit.%20Go%20Bears%21%22%2C%22id%22%3A%22C1%22%7D%7D%2C%22HEAD%22%3A%7B%22id%22%3A%22HEAD%22%2C%22target%22%3A%22master%22%2C%22type%22%3A%22general%20ref%22%7D%7D"));
this.loadTree(defaultTree);
};
@@ -7769,7 +7772,7 @@ GitEngine.prototype.getOrMakeRecursive = function(tree, createdSoFar, objID) {
return commit;
}
- throw new Error('ruh rho!! unsupported tyep for ' + objID);
+ throw new Error('ruh rho!! unsupported type for ' + objID);
};
GitEngine.prototype.tearDown = function() {
@@ -9623,20 +9626,108 @@ TreeCompare.prototype.compareBranchesWithinTrees = function(treeA, treeB, branch
return result;
};
-TreeCompare.prototype.getRecurseCompare = function(treeA, treeB) {
- // we need a recursive comparison function to bubble up the branch
+TreeCompare.prototype.compareBranchWithinTrees = function(treeA, treeB, branchName) {
+ treeA = this.convertTreeSafe(treeA);
+ treeB = this.convertTreeSafe(treeB);
+ this.reduceTreeFields([treeA, treeB]);
+
+ var recurseCompare = this.getRecurseCompare(treeA, treeB);
+ var branchA = treeA.branches[branchName];
+ var branchB = treeB.branches[branchName];
+
+ return _.isEqual(branchA, branchB) &&
+ recurseCompare(treeA.commits[branchA.target], treeB.commits[branchB.target]);
+};
+
+TreeCompare.prototype.compareAllBranchesWithinTreesHashAgnostic = function(treeA, treeB) {
+ // we can't DRY unfortunately here because we need a special _.isEqual function
+ // for both the recursive compare and the branch compare
+ treeA = this.convertTreeSafe(treeA);
+ treeB = this.convertTreeSafe(treeB);
+ this.reduceTreeFields([treeA, treeB]);
+
+ // get a function to compare branch objects without hashes
+ var compareBranchObjs = _.bind(function(branchA, branchB) {
+ if (!branchA || !branchB) {
+ return false;
+ }
+ branchA.target = this.getBaseRef(branchA.target);
+ branchB.target = this.getBaseRef(branchB.target);
+
+ return _.isEqual(branchA, branchB);
+ }, this);
+ // and a function to compare recursively without worrying about hashes
+ var recurseCompare = this.getRecurseCompareHashAgnostic(treeA, treeB);
+
+ var allBranches = _.extend(
+ {},
+ treeA.branches,
+ treeB.branches
+ );
+
+ var result = true;
+ _.each(allBranches, function(branchObj, branchName) {
+ branchA = treeA.branches[branchName];
+ branchB = treeB.branches[branchName];
+
+ result = result && compareBranchObjs(branchA, branchB) &&
+ recurseCompare(treeA.commits[branchA.target], treeB.commits[branchB.target]);
+ }, this);
+ return result;
+};
+
+TreeCompare.prototype.getBaseRef = function(ref) {
+ var idRegex = /^C(\d+)/;
+ var bits = idRegex.exec(ref);
+ if (!bits) { throw new Error('no regex matchy for ' + ref); }
+ // no matter what hash this is (aka C1', C1'', C1'^3, etc) we
+ // return C1
+ return 'C' + bits[1];
+};
+
+TreeCompare.prototype.getRecurseCompareHashAgnostic = function(treeA, treeB) {
+ // here we pass in a special comparison function to pass into the base
+ // recursive compare.
+
+ // some buildup functions
+ var getStrippedCommitCopy = _.bind(function(commit) {
+ return _.extend(
+ {},
+ commit,
+ {id: this.getBaseRef(commit.id)
+ });
+ }, this);
+
+ var isEqual = function(commitA, commitB) {
+ return _.isEqual(
+ getStrippedCommitCopy(commitA),
+ getStrippedCommitCopy(commitB)
+ );
+ };
+ return this.getRecurseCompare(treeA, treeB, {isEqual: isEqual});
+};
+
+TreeCompare.prototype.getRecurseCompare = function(treeA, treeB, options) {
+ options = options || {};
+
+ // we need a recursive comparison function to bubble up the branch
var recurseCompare = function(commitA, commitB) {
// this is the short-circuit base case
- var result = _.isEqual(commitA, commitB);
+ var result = options.isEqual ?
+ options.isEqual(commitA, commitB) : _.isEqual(commitA, commitB);
if (!result) {
return false;
}
// we loop through each parent ID. we sort the parent ID's beforehand
- // so the index lookup is valid
- _.each(commitA.parents, function(pAid, index) {
+ // so the index lookup is valid. for merge commits this will duplicate some of the
+ // checking (because we aren't doing graph search) but it's not a huge deal
+ var allParents = _.unique(commitA.parents.concat(commitB.parents));
+ _.each(allParents, function(pAid, index) {
var pBid = commitB.parents[index];
+ // if treeA or treeB doesn't have this parent,
+ // then we get an undefined child which is fine when we pass into _.isEqual
var childA = treeA.commits[pAid];
var childB = treeB.commits[pBid];
@@ -9648,19 +9739,6 @@ TreeCompare.prototype.getRecurseCompare = function(treeA, treeB) {
return recurseCompare;
};
-TreeCompare.prototype.compareBranchWithinTrees = function(treeA, treeB, branchName) {
- treeA = this.convertTreeSafe(treeA);
- treeB = this.convertTreeSafe(treeB);
- this.reduceTreeFields([treeA, treeB]);
-
- var recurseCompare = this.getRecurseCompare(treeA, treeB);
- var branchA = treeA.branches[branchName];
- var branchB = treeB.branches[branchName];
-
- return _.isEqual(branchA, branchB) &&
- recurseCompare(treeA.commits[branchA.target], treeB.commits[branchB.target]);
-};
-
TreeCompare.prototype.convertTreeSafe = function(tree) {
if (typeof tree == 'string') {
return JSON.parse(unescape(tree));
@@ -18576,16 +18654,17 @@ var init = function() {
events.trigger('resize', e);
});
+ /*
$(window).on('resize', _.throttle(function(e) {
var width = $(window).width();
var height = $(window).height();
eventBaton.trigger('windowSizeCheck', {w: width, h: height});
}, 500));
+ */
+
eventBaton.stealBaton('docKeydown', function() { });
eventBaton.stealBaton('docKeyup', function() { });
- //$('body').delegate('div.close', 'click', function() { alert('these dont actually work sorry lol.'); });
-
/**
* I am disabling this for now, it works on desktop but is
hacky on iOS mobile and god knows the behavior on android...
@@ -18603,7 +18682,7 @@ var init = function() {
});
*/
- /*
+ /* people were pissed about this apparently
eventBaton.stealBaton('windowSizeCheck', function(size) {
if (size.w < Constants.VIEWPORT.minWidth ||
size.h < Constants.VIEWPORT.minHeight) {
@@ -18666,6 +18745,7 @@ var init = function() {
eventBaton.trigger('commandSubmitted', command);
});
}
+
if (/(iPhone|iPod|iPad).*AppleWebKit/i.test(navigator.userAgent) || /android/i.test(navigator.userAgent)) {
sandbox.mainVis.customEvents.on('gitEngineReady', function() {
eventBaton.trigger('commandSubmitted', 'mobile alert');
@@ -19195,6 +19275,7 @@ GitEngine.prototype.initUniqueID = function() {
};
GitEngine.prototype.defaultInit = function() {
+ // lol 80 char limit
var defaultTree = JSON.parse(unescape("%7B%22branches%22%3A%7B%22master%22%3A%7B%22target%22%3A%22C1%22%2C%22id%22%3A%22master%22%2C%22type%22%3A%22branch%22%7D%7D%2C%22commits%22%3A%7B%22C0%22%3A%7B%22type%22%3A%22commit%22%2C%22parents%22%3A%5B%5D%2C%22author%22%3A%22Peter%20Cottle%22%2C%22createTime%22%3A%22Mon%20Nov%2005%202012%2000%3A56%3A47%20GMT-0800%20%28PST%29%22%2C%22commitMessage%22%3A%22Quick%20Commit.%20Go%20Bears%21%22%2C%22id%22%3A%22C0%22%2C%22rootCommit%22%3Atrue%7D%2C%22C1%22%3A%7B%22type%22%3A%22commit%22%2C%22parents%22%3A%5B%22C0%22%5D%2C%22author%22%3A%22Peter%20Cottle%22%2C%22createTime%22%3A%22Mon%20Nov%2005%202012%2000%3A56%3A47%20GMT-0800%20%28PST%29%22%2C%22commitMessage%22%3A%22Quick%20Commit.%20Go%20Bears%21%22%2C%22id%22%3A%22C1%22%7D%7D%2C%22HEAD%22%3A%7B%22id%22%3A%22HEAD%22%2C%22target%22%3A%22master%22%2C%22type%22%3A%22general%20ref%22%7D%7D"));
this.loadTree(defaultTree);
};
@@ -19398,7 +19479,7 @@ GitEngine.prototype.getOrMakeRecursive = function(tree, createdSoFar, objID) {
return commit;
}
- throw new Error('ruh rho!! unsupported tyep for ' + objID);
+ throw new Error('ruh rho!! unsupported type for ' + objID);
};
GitEngine.prototype.tearDown = function() {
@@ -20899,20 +20980,108 @@ TreeCompare.prototype.compareBranchesWithinTrees = function(treeA, treeB, branch
return result;
};
-TreeCompare.prototype.getRecurseCompare = function(treeA, treeB) {
- // we need a recursive comparison function to bubble up the branch
+TreeCompare.prototype.compareBranchWithinTrees = function(treeA, treeB, branchName) {
+ treeA = this.convertTreeSafe(treeA);
+ treeB = this.convertTreeSafe(treeB);
+ this.reduceTreeFields([treeA, treeB]);
+
+ var recurseCompare = this.getRecurseCompare(treeA, treeB);
+ var branchA = treeA.branches[branchName];
+ var branchB = treeB.branches[branchName];
+
+ return _.isEqual(branchA, branchB) &&
+ recurseCompare(treeA.commits[branchA.target], treeB.commits[branchB.target]);
+};
+
+TreeCompare.prototype.compareAllBranchesWithinTreesHashAgnostic = function(treeA, treeB) {
+ // we can't DRY unfortunately here because we need a special _.isEqual function
+ // for both the recursive compare and the branch compare
+ treeA = this.convertTreeSafe(treeA);
+ treeB = this.convertTreeSafe(treeB);
+ this.reduceTreeFields([treeA, treeB]);
+
+ // get a function to compare branch objects without hashes
+ var compareBranchObjs = _.bind(function(branchA, branchB) {
+ if (!branchA || !branchB) {
+ return false;
+ }
+ branchA.target = this.getBaseRef(branchA.target);
+ branchB.target = this.getBaseRef(branchB.target);
+
+ return _.isEqual(branchA, branchB);
+ }, this);
+ // and a function to compare recursively without worrying about hashes
+ var recurseCompare = this.getRecurseCompareHashAgnostic(treeA, treeB);
+
+ var allBranches = _.extend(
+ {},
+ treeA.branches,
+ treeB.branches
+ );
+
+ var result = true;
+ _.each(allBranches, function(branchObj, branchName) {
+ branchA = treeA.branches[branchName];
+ branchB = treeB.branches[branchName];
+
+ result = result && compareBranchObjs(branchA, branchB) &&
+ recurseCompare(treeA.commits[branchA.target], treeB.commits[branchB.target]);
+ }, this);
+ return result;
+};
+
+TreeCompare.prototype.getBaseRef = function(ref) {
+ var idRegex = /^C(\d+)/;
+ var bits = idRegex.exec(ref);
+ if (!bits) { throw new Error('no regex matchy for ' + ref); }
+ // no matter what hash this is (aka C1', C1'', C1'^3, etc) we
+ // return C1
+ return 'C' + bits[1];
+};
+
+TreeCompare.prototype.getRecurseCompareHashAgnostic = function(treeA, treeB) {
+ // here we pass in a special comparison function to pass into the base
+ // recursive compare.
+
+ // some buildup functions
+ var getStrippedCommitCopy = _.bind(function(commit) {
+ return _.extend(
+ {},
+ commit,
+ {id: this.getBaseRef(commit.id)
+ });
+ }, this);
+
+ var isEqual = function(commitA, commitB) {
+ return _.isEqual(
+ getStrippedCommitCopy(commitA),
+ getStrippedCommitCopy(commitB)
+ );
+ };
+ return this.getRecurseCompare(treeA, treeB, {isEqual: isEqual});
+};
+
+TreeCompare.prototype.getRecurseCompare = function(treeA, treeB, options) {
+ options = options || {};
+
+ // we need a recursive comparison function to bubble up the branch
var recurseCompare = function(commitA, commitB) {
// this is the short-circuit base case
- var result = _.isEqual(commitA, commitB);
+ var result = options.isEqual ?
+ options.isEqual(commitA, commitB) : _.isEqual(commitA, commitB);
if (!result) {
return false;
}
// we loop through each parent ID. we sort the parent ID's beforehand
- // so the index lookup is valid
- _.each(commitA.parents, function(pAid, index) {
+ // so the index lookup is valid. for merge commits this will duplicate some of the
+ // checking (because we aren't doing graph search) but it's not a huge deal
+ var allParents = _.unique(commitA.parents.concat(commitB.parents));
+ _.each(allParents, function(pAid, index) {
var pBid = commitB.parents[index];
+ // if treeA or treeB doesn't have this parent,
+ // then we get an undefined child which is fine when we pass into _.isEqual
var childA = treeA.commits[pAid];
var childB = treeB.commits[pBid];
@@ -20924,19 +21093,6 @@ TreeCompare.prototype.getRecurseCompare = function(treeA, treeB) {
return recurseCompare;
};
-TreeCompare.prototype.compareBranchWithinTrees = function(treeA, treeB, branchName) {
- treeA = this.convertTreeSafe(treeA);
- treeB = this.convertTreeSafe(treeB);
- this.reduceTreeFields([treeA, treeB]);
-
- var recurseCompare = this.getRecurseCompare(treeA, treeB);
- var branchA = treeA.branches[branchName];
- var branchB = treeB.branches[branchName];
-
- return _.isEqual(branchA, branchB) &&
- recurseCompare(treeA.commits[branchA.target], treeB.commits[branchB.target]);
-};
-
TreeCompare.prototype.convertTreeSafe = function(tree) {
if (typeof tree == 'string') {
return JSON.parse(unescape(tree));
diff --git a/build/bundle.min.04e3ef79.js b/build/bundle.min.04e3ef79.js
deleted file mode 100644
index abb7e70bc..000000000
--- a/build/bundle.min.04e3ef79.js
+++ /dev/null
@@ -1 +0,0 @@
-(function(){var e=function(t,n){var r=e.resolve(t,n||"/"),i=e.modules[r];if(!i)throw new Error("Failed to resolve module "+t+", tried "+r);var s=e.cache[r],o=s?s.exports:i();return o};e.paths=[],e.modules={},e.cache={},e.extensions=[".js",".coffee",".json"],e._core={assert:!0,events:!0,fs:!0,path:!0,vm:!0},e.resolve=function(){return function(t,n){function u(t){t=r.normalize(t);if(e.modules[t])return t;for(var n=0;n=0;i--){if(t[i]==="node_modules")continue;var s=t.slice(0,i+1).join("/")+"/node_modules";n.push(s)}return n}n||(n="/");if(e._core[t])return t;var r=e.modules.path();n=r.resolve("/",n);var i=n||"/";if(t.match(/^(?:\.\.?\/|\/)/)){var s=u(r.resolve(i,t))||a(r.resolve(i,t));if(s)return s}var o=f(t,i);if(o)return o;throw new Error("Cannot find module '"+t+"'")}}(),e.alias=function(t,n){var r=e.modules.path(),i=null;try{i=e.resolve(t+"/package.json","/")}catch(s){i=e.resolve(t,"/")}var o=r.dirname(i),u=(Object.keys||function(e){var t=[];for(var n in e)t.push(n);return t})(e.modules);for(var a=0;a=0;r--){var i=e[r];i=="."?e.splice(r,1):i===".."?(e.splice(r,1),n++):n&&(e.splice(r,1),n--)}if(t)for(;n--;n)e.unshift("..");return e}var f=/^(.+\/(?!$)|\/)?((?:.+?)?(\.[^.]*)?)$/;n.resolve=function(){var e="",t=!1;for(var n=arguments.length;n>=-1&&!t;n--){var r=n>=0?arguments[n]:s.cwd();if(typeof r!="string"||!r)continue;e=r+"/"+e,t=r.charAt(0)==="/"}return e=a(u(e.split("/"),function(e){return!!e}),!t).join("/"),(t?"/":"")+e||"."},n.normalize=function(e){var t=e.charAt(0)==="/",n=e.slice(-1)==="/";return e=a(u(e.split("/"),function(e){return!!e}),!t).join("/"),!e&&!t&&(e="."),e&&n&&(e+="/"),(t?"/":"")+e},n.join=function(){var e=Array.prototype.slice.call(arguments,0);return n.normalize(u(e,function(e,t){return e&&typeof e=="string"}).join("/"))},n.dirname=function(e){var t=f.exec(e)[1]||"",n=!1;return t?t.length===1||n&&t.length<=3&&t.charAt(1)===":"?t:t.substring(0,t.length-1):"."},n.basename=function(e,t){var n=f.exec(e)[2]||"";return t&&n.substr(-1*t.length)===t&&(n=n.substr(0,n.length-t.length)),n},n.extname=function(e){return f.exec(e)[3]||""}}),e.define("__browserify_process",function(e,t,n,r,i,s,o){var s=t.exports={};s.nextTick=function(){var e=typeof window!="undefined"&&window.setImmediate,t=typeof window!="undefined"&&window.postMessage&&window.addEventListener;if(e)return function(e){return window.setImmediate(e)};if(t){var n=[];return window.addEventListener("message",function(e){if(e.source===window&&e.data==="browserify-tick"){e.stopPropagation();if(n.length>0){var t=n.shift();t()}}},!0),function(t){n.push(t),window.postMessage("browserify-tick","*")}}return function(t){setTimeout(t,0)}}(),s.title="browser",s.browser=!0,s.env={},s.argv=[],s.binding=function(t){if(t==="evals")return e("vm");throw new Error("No such module. (Possibly not yet loaded)")},function(){var t="/",n;s.cwd=function(){return t},s.chdir=function(r){n||(n=e("path")),t=n.resolve(r,t)}}()}),e.define("/node_modules/underscore/package.json",function(e,t,n,r,i,s,o){t.exports={main:"underscore.js"}}),e.define("/node_modules/underscore/underscore.js",function(e,t,n,r,i,s,o){(function(){var e=this,r=e._,i={},s=Array.prototype,o=Object.prototype,u=Function.prototype,a=s.push,f=s.slice,l=s.concat,c=o.toString,h=o.hasOwnProperty,p=s.forEach,d=s.map,v=s.reduce,m=s.reduceRight,g=s.filter,y=s.every,b=s.some,w=s.indexOf,E=s.lastIndexOf,S=Array.isArray,x=Object.keys,T=u.bind,N=function(e){if(e instanceof N)return e;if(!(this instanceof N))return new N(e);this._wrapped=e};typeof n!="undefined"?(typeof t!="undefined"&&t.exports&&(n=t.exports=N),n._=N):e._=N,N.VERSION="1.4.3";var C=N.each=N.forEach=function(e,t,n){if(e==null)return;if(p&&e.forEach===p)e.forEach(t,n);else if(e.length===+e.length){for(var r=0,s=e.length;r2;e==null&&(e=[]);if(v&&e.reduce===v)return r&&(t=N.bind(t,r)),i?e.reduce(t,n):e.reduce(t);C(e,function(e,s,o){i?n=t.call(r,n,e,s,o):(n=e,i=!0)});if(!i)throw new TypeError(k);return n},N.reduceRight=N.foldr=function(e,t,n,r){var i=arguments.length>2;e==null&&(e=[]);if(m&&e.reduceRight===m)return r&&(t=N.bind(t,r)),i?e.reduceRight(t,n):e.reduceRight(t);var s=e.length;if(s!==+s){var o=N.keys(e);s=o.length}C(e,function(u,a,f){a=o?o[--s]:--s,i?n=t.call(r,n,e[a],a,f):(n=e[a],i=!0)});if(!i)throw new TypeError(k);return n},N.find=N.detect=function(e,t,n){var r;return L(e,function(e,i,s){if(t.call(n,e,i,s))return r=e,!0}),r},N.filter=N.select=function(e,t,n){var r=[];return e==null?r:g&&e.filter===g?e.filter(t,n):(C(e,function(e,i,s){t.call(n,e,i,s)&&(r[r.length]=e)}),r)},N.reject=function(e,t,n){return N.filter(e,function(e,r,i){return!t.call(n,e,r,i)},n)},N.every=N.all=function(e,t,n){t||(t=N.identity);var r=!0;return e==null?r:y&&e.every===y?e.every(t,n):(C(e,function(e,s,o){if(!(r=r&&t.call(n,e,s,o)))return i}),!!r)};var L=N.some=N.any=function(e,t,n){t||(t=N.identity);var r=!1;return e==null?r:b&&e.some===b?e.some(t,n):(C(e,function(e,s,o){if(r||(r=t.call(n,e,s,o)))return i}),!!r)};N.contains=N.include=function(e,t){return e==null?!1:w&&e.indexOf===w?e.indexOf(t)!=-1:L(e,function(e){return e===t})},N.invoke=function(e,t){var n=f.call(arguments,2);return N.map(e,function(e){return(N.isFunction(t)?t:e[t]).apply(e,n)})},N.pluck=function(e,t){return N.map(e,function(e){return e[t]})},N.where=function(e,t){return N.isEmpty(t)?[]:N.filter(e,function(e){for(var n in t)if(t[n]!==e[n])return!1;return!0})},N.max=function(e,t,n){if(!t&&N.isArray(e)&&e[0]===+e[0]&&e.length<65535)return Math.max.apply(Math,e);if(!t&&N.isEmpty(e))return-Infinity;var r={computed:-Infinity,value:-Infinity};return C(e,function(e,i,s){var o=t?t.call(n,e,i,s):e;o>=r.computed&&(r={value:e,computed:o})}),r.value},N.min=function(e,t,n){if(!t&&N.isArray(e)&&e[0]===+e[0]&&e.length<65535)return Math.min.apply(Math,e);if(!t&&N.isEmpty(e))return Infinity;var r={computed:Infinity,value:Infinity};return C(e,function(e,i,s){var o=t?t.call(n,e,i,s):e;or||n===void 0)return 1;if(n>>1;n.call(r,e[u])=0})})},N.difference=function(e){var t=l.apply(s,f.call(arguments,1));return N.filter(e,function(e){return!N.contains(t,e)})},N.zip=function(){var e=f.call(arguments),t=N.max(N.pluck(e,"length")),n=new Array(t);for(var r=0;r=0;n--)t=[e[n].apply(this,t)];return t[0]}},N.after=function(e,t){return e<=0?t():function(){if(--e<1)return t.apply(this,arguments)}},N.keys=x||function(e){if(e!==Object(e))throw new TypeError("Invalid object");var t=[];for(var n in e)N.has(e,n)&&(t[t.length]=n);return t},N.values=function(e){var t=[];for(var n in e)N.has(e,n)&&t.push(e[n]);return t},N.pairs=function(e){var t=[];for(var n in e)N.has(e,n)&&t.push([n,e[n]]);return t},N.invert=function(e){var t={};for(var n in e)N.has(e,n)&&(t[e[n]]=n);return t},N.functions=N.methods=function(e){var t=[];for(var n in e)N.isFunction(e[n])&&t.push(n);return t.sort()},N.extend=function(e){return C(f.call(arguments,1),function(t){if(t)for(var n in t)e[n]=t[n]}),e},N.pick=function(e){var t={},n=l.apply(s,f.call(arguments,1));return C(n,function(n){n in e&&(t[n]=e[n])}),t},N.omit=function(e){var t={},n=l.apply(s,f.call(arguments,1));for(var r in e)N.contains(n,r)||(t[r]=e[r]);return t},N.defaults=function(e){return C(f.call(arguments,1),function(t){if(t)for(var n in t)e[n]==null&&(e[n]=t[n])}),e},N.clone=function(e){return N.isObject(e)?N.isArray(e)?e.slice():N.extend({},e):e},N.tap=function(e,t){return t(e),e};var D=function(e,t,n,r){if(e===t)return e!==0||1/e==1/t;if(e==null||t==null)return e===t;e instanceof N&&(e=e._wrapped),t instanceof N&&(t=t._wrapped);var i=c.call(e);if(i!=c.call(t))return!1;switch(i){case"[object String]":return e==String(t);case"[object Number]":return e!=+e?t!=+t:e==0?1/e==1/t:e==+t;case"[object Date]":case"[object Boolean]":return+e==+t;case"[object RegExp]":return e.source==t.source&&e.global==t.global&&e.multiline==t.multiline&&e.ignoreCase==t.ignoreCase}if(typeof e!="object"||typeof t!="object")return!1;var s=n.length;while(s--)if(n[s]==e)return r[s]==t;n.push(e),r.push(t);var o=0,u=!0;if(i=="[object Array]"){o=e.length,u=o==t.length;if(u)while(o--)if(!(u=D(e[o],t[o],n,r)))break}else{var a=e.constructor,f=t.constructor;if(a!==f&&!(N.isFunction(a)&&a instanceof a&&N.isFunction(f)&&f instanceof f))return!1;for(var l in e)if(N.has(e,l)){o++;if(!(u=N.has(t,l)&&D(e[l],t[l],n,r)))break}if(u){for(l in t)if(N.has(t,l)&&!(o--))break;u=!o}}return n.pop(),r.pop(),u};N.isEqual=function(e,t){return D(e,t,[],[])},N.isEmpty=function(e){if(e==null)return!0;if(N.isArray(e)||N.isString(e))return e.length===0;for(var t in e)if(N.has(e,t))return!1;return!0},N.isElement=function(e){return!!e&&e.nodeType===1},N.isArray=S||function(e){return c.call(e)=="[object Array]"},N.isObject=function(e){return e===Object(e)},C(["Arguments","Function","String","Number","Date","RegExp"],function(e){N["is"+e]=function(t){return c.call(t)=="[object "+e+"]"}}),N.isArguments(arguments)||(N.isArguments=function(e){return!!e&&!!N.has(e,"callee")}),typeof /./!="function"&&(N.isFunction=function(e){return typeof e=="function"}),N.isFinite=function(e){return isFinite(e)&&!isNaN(parseFloat(e))},N.isNaN=function(e){return N.isNumber(e)&&e!=+e},N.isBoolean=function(e){return e===!0||e===!1||c.call(e)=="[object Boolean]"},N.isNull=function(e){return e===null},N.isUndefined=function(e){return e===void 0},N.has=function(e,t){return h.call(e,t)},N.noConflict=function(){return e._=r,this},N.identity=function(e){return e},N.times=function(e,t,n){var r=Array(e);for(var i=0;i":">",'"':""","'":"'","/":"/"}};P.unescape=N.invert(P.escape);var H={escape:new RegExp("["+N.keys(P.escape).join("")+"]","g"),unescape:new RegExp("("+N.keys(P.unescape).join("|")+")","g")};N.each(["escape","unescape"],function(e){N[e]=function(t){return t==null?"":(""+t).replace(H[e],function(t){return P[e][t]})}}),N.result=function(e,t){if(e==null)return null;var n=e[t];return N.isFunction(n)?n.call(e):n},N.mixin=function(e){C(N.functions(e),function(t){var n=N[t]=e[t];N.prototype[t]=function(){var e=[this._wrapped];return a.apply(e,arguments),q.call(this,n.apply(N,e))}})};var B=0;N.uniqueId=function(e){var t=""+ ++B;return e?e+t:t},N.templateSettings={evaluate:/<%([\s\S]+?)%>/g,interpolate:/<%=([\s\S]+?)%>/g,escape:/<%-([\s\S]+?)%>/g};var j=/(.)^/,F={"'":"'","\\":"\\","\r":"r","\n":"n"," ":"t","\u2028":"u2028","\u2029":"u2029"},I=/\\|'|\r|\n|\t|\u2028|\u2029/g;N.template=function(e,t,n){n=N.defaults({},n,N.templateSettings);var r=new RegExp([(n.escape||j).source,(n.interpolate||j).source,(n.evaluate||j).source].join("|")+"|$","g"),i=0,s="__p+='";e.replace(r,function(t,n,r,o,u){return s+=e.slice(i,u).replace(I,function(e){return"\\"+F[e]}),n&&(s+="'+\n((__t=("+n+"))==null?'':_.escape(__t))+\n'"),r&&(s+="'+\n((__t=("+r+"))==null?'':__t)+\n'"),o&&(s+="';\n"+o+"\n__p+='"),i=u+t.length,t}),s+="';\n",n.variable||(s="with(obj||{}){\n"+s+"}\n"),s="var __t,__p='',__j=Array.prototype.join,print=function(){__p+=__j.call(arguments,'');};\n"+s+"return __p;\n";try{var o=new Function(n.variable||"obj","_",s)}catch(u){throw u.source=s,u}if(t)return o(t,N);var a=function(e){return o.call(this,e,N)};return a.source="function("+(n.variable||"obj")+"){\n"+s+"}",a},N.chain=function(e){return N(e).chain()};var q=function(e){return this._chain?N(e).chain():e};N.mixin(N),C(["pop","push","reverse","shift","sort","splice","unshift"],function(e){var t=s[e];N.prototype[e]=function(){var n=this._wrapped;return t.apply(n,arguments),(e=="shift"||e=="splice")&&n.length===0&&delete n[0],q.call(this,n)}}),C(["concat","join","slice"],function(e){var t=s[e];N.prototype[e]=function(){return q.call(this,t.apply(this._wrapped,arguments))}}),N.extend(N.prototype,{chain:function(){return this._chain=!0,this},value:function(){return this._wrapped}})}).call(this)}),e.define("/node_modules/backbone/package.json",function(e,t,n,r,i,s,o){t.exports={main:"backbone.js"}}),e.define("/node_modules/backbone/backbone.js",function(e,t,n,r,i,s,o){(function(){var t=this,r=t.Backbone,i=[],s=i.push,o=i.slice,u=i.splice,a;typeof n!="undefined"?a=n:a=t.Backbone={},a.VERSION="0.9.9";var f=t._;!f&&typeof e!="undefined"&&(f=e("underscore")),a.$=t.jQuery||t.Zepto||t.ender,a.noConflict=function(){return t.Backbone=r,this},a.emulateHTTP=!1,a.emulateJSON=!1;var l=/\s+/,c=function(e,t,n,r){if(!n)return!0;if(typeof n=="object")for(var i in n)e[t].apply(e,[i,n[i]].concat(r));else{if(!l.test(n))return!0;var s=n.split(l);for(var o=0,u=s.length;o=0;r-=2)this.trigger("change:"+n[r],this,n[r+1],e);if(t)return this;while(this._pending)this._pending=!1,this.trigger("change",this,e),this._previousAttributes=f.clone(this.attributes);return this._changing=!1,this},hasChanged:function(e){return this._hasComputed||this._computeChanges(),e==null?!f.isEmpty(this.changed):f.has(this.changed,e)},changedAttributes:function(e){if(!e)return this.hasChanged()?f.clone(this.changed):!1;var t,n=!1,r=this._previousAttributes;for(var i in e){if(f.isEqual(r[i],t=e[i]))continue;(n||(n={}))[i]=t}return n},_computeChanges:function(e){this.changed={};var t={},n=[],r=this._currentAttributes,i=this._changes;for(var s=i.length-2;s>=0;s-=2){var o=i[s],u=i[s+1];if(t[o])continue;t[o]=!0;if(r[o]!==u){this.changed[o]=u;if(!e)continue;n.push(o,u),r[o]=u}}return e&&(this._changes=[]),this._hasComputed=!0,n},previous:function(e){return e==null||!this._previousAttributes?null:this._previousAttributes[e]},previousAttributes:function(){return f.clone(this._previousAttributes)},_validate:function(e,t){if(!this.validate)return!0;e=f.extend({},this.attributes,e);var n=this.validate(e,t);return n?(t&&t.error&&t.error(this,n,t),this.trigger("error",this,n,t),!1):!0}});var v=a.Collection=function(e,t){t||(t={}),t.model&&(this.model=t.model),t.comparator!==void 0&&(this.comparator=t.comparator),this._reset(),this.initialize.apply(this,arguments),e&&this.reset(e,f.extend({silent:!0},t))};f.extend(v.prototype,p,{model:d,initialize:function(){},toJSON:function(e){return this.map(function(t){return t.toJSON(e)})},sync:function(){return a.sync.apply(this,arguments)},add:function(e,t){var n,r,i,o,a,l,c=t&&t.at,h=(t&&t.sort)==null?!0:t.sort;e=f.isArray(e)?e.slice():[e];for(n=e.length-1;n>=0;n--){if(!(o=this._prepareModel(e[n],t))){this.trigger("error",this,e[n],t),e.splice(n,1);continue}e[n]=o,a=o.id!=null&&this._byId[o.id];if(a||this._byCid[o.cid]){t&&t.merge&&a&&(a.set(o.attributes,t),l=h),e.splice(n,1);continue}o.on("all",this._onModelEvent,this),this._byCid[o.cid]=o,o.id!=null&&(this._byId[o.id]=o)}e.length&&(l=h),this.length+=e.length,r=[c!=null?c:this.models.length,0],s.apply(r,e),u.apply(this.models,r),l&&this.comparator&&c==null&&this.sort({silent:!0});if(t&&t.silent)return this;while(o=e.shift())o.trigger("add",o,this,t);return this},remove:function(e,t){var n,r,i,s;t||(t={}),e=f.isArray(e)?e.slice():[e];for(n=0,r=e.length;n').hide().appendTo("body")[0].contentWindow,this.navigate(t)),this._hasPushState?a.$(window).bind("popstate",this.checkUrl):this._wantsHashChange&&"onhashchange"in window&&!r?a.$(window).bind("hashchange",this.checkUrl):this._wantsHashChange&&(this._checkUrlInterval=setInterval(this.checkUrl,this.interval)),this.fragment=t;var i=this.location,s=i.pathname.replace(/[^\/]$/,"$&/")===this.root;if(this._wantsHashChange&&this._wantsPushState&&!this._hasPushState&&!s)return this.fragment=this.getFragment(null,!0),this.location.replace(this.root+this.location.search+"#"+this.fragment),!0;this._wantsPushState&&this._hasPushState&&s&&i.hash&&(this.fragment=this.getHash().replace(T,""),this.history.replaceState({},document.title,this.root+this.fragment+i.search));if(!this.options.silent)return this.loadUrl()},stop:function(){a.$(window).unbind("popstate",this.checkUrl).unbind("hashchange",this.checkUrl),clearInterval(this._checkUrlInterval),x.started=!1},route:function(e,t){this.handlers.unshift({route:e,callback:t})},checkUrl:function(e){var t=this.getFragment();t===this.fragment&&this.iframe&&(t=this.getFragment(this.getHash(this.iframe)));if(t===this.fragment)return!1;this.iframe&&this.navigate(t),this.loadUrl()||this.loadUrl(this.getHash())},loadUrl:function(e){var t=this.fragment=this.getFragment(e),n=f.any(this.handlers,function(e){if(e.route.test(t))return e.callback(t),!0});return n},navigate:function(e,t){if(!x.started)return!1;if(!t||t===!0)t={trigger:t};e=this.getFragment(e||"");if(this.fragment===e)return;this.fragment=e;var n=this.root+e;if(this._hasPushState)this.history[t.replace?"replaceState":"pushState"]({},document.title,n);else{if(!this._wantsHashChange)return this.location.assign(n);this._updateHash(this.location,e,t.replace),this.iframe&&e!==this.getFragment(this.getHash(this.iframe))&&(t.replace||this.iframe.document.open().close(),this._updateHash(this.iframe.location,e,t.replace))}t.trigger&&this.loadUrl(e)},_updateHash:function(e,t,n){if(n){var r=e.href.replace(/(javascript:|#).*$/,"");e.replace(r+"#"+t)}else e.hash="#"+t}}),a.history=new x;var L=a.View=function(e){this.cid=f.uniqueId("view"),this._configure(e||{}),this._ensureElement(),this.initialize.apply(this,arguments),this.delegateEvents()},A=/^(\S+)\s*(.*)$/,O=["model","collection","el","id","attributes","className","tagName","events"];f.extend(L.prototype,p,{tagName:"div",$:function(e){return this.$el.find(e)},initialize:function(){},render:function(){return this},remove:function(){return this.$el.remove(),this.stopListening(),this},make:function(e,t,n){var r=document.createElement(e);return t&&a.$(r).attr(t),n!=null&&a.$(r).html(n),r},setElement:function(e,t){return this.$el&&this.undelegateEvents(),this.$el=e instanceof a.$?e:a.$(e),this.el=this.$el[0],t!==!1&&this.delegateEvents(),this},delegateEvents:function(e){if(!e&&!(e=f.result(this,"events")))return;this.undelegateEvents();for(var t in e){var n=e[t];f.isFunction(n)||(n=this[e[t]]);if(!n)throw new Error('Method "'+e[t]+'" does not exist');var r=t.match(A),i=r[1],s=r[2];n=f.bind(n,this),i+=".delegateEvents"+this.cid,s===""?this.$el.bind(i,n):this.$el.delegate(s,i,n)}},undelegateEvents:function(){this.$el.unbind(".delegateEvents"+this.cid)},_configure:function(e){this.options&&(e=f.extend({},f.result(this,"options"),e)),f.extend(this,f.pick(e,O)),this.options=e},_ensureElement:function(){if(!this.el){var e=f.extend({},f.result(this,"attributes"));this.id&&(e.id=f.result(this,"id")),this.className&&(e["class"]=f.result(this,"className")),this.setElement(this.make(f.result(this,"tagName"),e),!1)}else this.setElement(f.result(this,"el"),!1)}});var M={create:"POST",update:"PUT",patch:"PATCH","delete":"DELETE",read:"GET"};a.sync=function(e,t,n){var r=M[e];f.defaults(n||(n={}),{emulateHTTP:a.emulateHTTP,emulateJSON:a.emulateJSON});var i={type:r,dataType:"json"};n.url||(i.url=f.result(t,"url")||D()),n.data==null&&t&&(e==="create"||e==="update"||e==="patch")&&(i.contentType="application/json",i.data=JSON.stringify(n.attrs||t.toJSON(n))),n.emulateJSON&&(i.contentType="application/x-www-form-urlencoded",i.data=i.data?{model:i.data}:{});if(n.emulateHTTP&&(r==="PUT"||r==="DELETE"||r==="PATCH")){i.type="POST",n.emulateJSON&&(i.data._method=r);var s=n.beforeSend;n.beforeSend=function(e){e.setRequestHeader("X-HTTP-Method-Override",r);if(s)return s.apply(this,arguments)}}i.type!=="GET"&&!n.emulateJSON&&(i.processData=!1);var o=n.success;n.success=function(e,r,i){o&&o(e,r,i),t.trigger("sync",t,e,n)};var u=n.error;n.error=function(e,r,i){u&&u(t,e,n),t.trigger("error",t,e,n)};var l=a.ajax(f.extend(i,n));return t.trigger("request",t,l,n),l},a.ajax=function(){return a.$.ajax.apply(a.$,arguments)};var _=function(e,t){var n=this,r;e&&f.has(e,"constructor")?r=e.constructor:r=function(){n.apply(this,arguments)},f.extend(r,n,t);var i=function(){this.constructor=r};return i.prototype=n.prototype,r.prototype=new i,e&&f.extend(r.prototype,e),r.__super__=n.prototype,r};d.extend=v.extend=y.extend=L.extend=x.extend=_;var D=function(){throw new Error('A "url" property or function must be specified')}}).call(this)}),e.define("/node_modules/backbone/node_modules/underscore/package.json",function(e,t,n,r,i,s,o){t.exports={main:"underscore.js"}}),e.define("/node_modules/backbone/node_modules/underscore/underscore.js",function(e,t,n,r,i,s,o){(function(){var e=this,r=e._,i={},s=Array.prototype,o=Object.prototype,u=Function.prototype,a=s.push,f=s.slice,l=s.concat,c=o.toString,h=o.hasOwnProperty,p=s.forEach,d=s.map,v=s.reduce,m=s.reduceRight,g=s.filter,y=s.every,b=s.some,w=s.indexOf,E=s.lastIndexOf,S=Array.isArray,x=Object.keys,T=u.bind,N=function(e){if(e instanceof N)return e;if(!(this instanceof N))return new N(e);this._wrapped=e};typeof n!="undefined"?(typeof t!="undefined"&&t.exports&&(n=t.exports=N),n._=N):e._=N,N.VERSION="1.4.3";var C=N.each=N.forEach=function(e,t,n){if(e==null)return;if(p&&e.forEach===p)e.forEach(t,n);else if(e.length===+e.length){for(var r=0,s=e.length;r2;e==null&&(e=[]);if(v&&e.reduce===v)return r&&(t=N.bind(t,r)),i?e.reduce(t,n):e.reduce(t);C(e,function(e,s,o){i?n=t.call(r,n,e,s,o):(n=e,i=!0)});if(!i)throw new TypeError(k);return n},N.reduceRight=N.foldr=function(e,t,n,r){var i=arguments.length>2;e==null&&(e=[]);if(m&&e.reduceRight===m)return r&&(t=N.bind(t,r)),i?e.reduceRight(t,n):e.reduceRight(t);var s=e.length;if(s!==+s){var o=N.keys(e);s=o.length}C(e,function(u,a,f){a=o?o[--s]:--s,i?n=t.call(r,n,e[a],a,f):(n=e[a],i=!0)});if(!i)throw new TypeError(k);return n},N.find=N.detect=function(e,t,n){var r;return L(e,function(e,i,s){if(t.call(n,e,i,s))return r=e,!0}),r},N.filter=N.select=function(e,t,n){var r=[];return e==null?r:g&&e.filter===g?e.filter(t,n):(C(e,function(e,i,s){t.call(n,e,i,s)&&(r[r.length]=e)}),r)},N.reject=function(e,t,n){return N.filter(e,function(e,r,i){return!t.call(n,e,r,i)},n)},N.every=N.all=function(e,t,n){t||(t=N.identity);var r=!0;return e==null?r:y&&e.every===y?e.every(t,n):(C(e,function(e,s,o){if(!(r=r&&t.call(n,e,s,o)))return i}),!!r)};var L=N.some=N.any=function(e,t,n){t||(t=N.identity);var r=!1;return e==null?r:b&&e.some===b?e.some(t,n):(C(e,function(e,s,o){if(r||(r=t.call(n,e,s,o)))return i}),!!r)};N.contains=N.include=function(e,t){return e==null?!1:w&&e.indexOf===w?e.indexOf(t)!=-1:L(e,function(e){return e===t})},N.invoke=function(e,t){var n=f.call(arguments,2);return N.map(e,function(e){return(N.isFunction(t)?t:e[t]).apply(e,n)})},N.pluck=function(e,t){return N.map(e,function(e){return e[t]})},N.where=function(e,t){return N.isEmpty(t)?[]:N.filter(e,function(e){for(var n in t)if(t[n]!==e[n])return!1;return!0})},N.max=function(e,t,n){if(!t&&N.isArray(e)&&e[0]===+e[0]&&e.length<65535)return Math.max.apply(Math,e);if(!t&&N.isEmpty(e))return-Infinity;var r={computed:-Infinity,value:-Infinity};return C(e,function(e,i,s){var o=t?t.call(n,e,i,s):e;o>=r.computed&&(r={value:e,computed:o})}),r.value},N.min=function(e,t,n){if(!t&&N.isArray(e)&&e[0]===+e[0]&&e.length<65535)return Math.min.apply(Math,e);if(!t&&N.isEmpty(e))return Infinity;var r={computed:Infinity,value:Infinity};return C(e,function(e,i,s){var o=t?t.call(n,e,i,s):e;or||n===void 0)return 1;if(n>>1;n.call(r,e[u])=0})})},N.difference=function(e){var t=l.apply(s,f.call(arguments,1));return N.filter(e,function(e){return!N.contains(t,e)})},N.zip=function(){var e=f.call(arguments),t=N.max(N.pluck(e,"length")),n=new Array(t);for(var r=0;r=0;n--)t=[e[n].apply(this,t)];return t[0]}},N.after=function(e,t){return e<=0?t():function(){if(--e<1)return t.apply(this,arguments)}},N.keys=x||function(e){if(e!==Object(e))throw new TypeError("Invalid object");var t=[];for(var n in e)N.has(e,n)&&(t[t.length]=n);return t},N.values=function(e){var t=[];for(var n in e)N.has(e,n)&&t.push(e[n]);return t},N.pairs=function(e){var t=[];for(var n in e)N.has(e,n)&&t.push([n,e[n]]);return t},N.invert=function(e){var t={};for(var n in e)N.has(e,n)&&(t[e[n]]=n);return t},N.functions=N.methods=function(e){var t=[];for(var n in e)N.isFunction(e[n])&&t.push(n);return t.sort()},N.extend=function(e){return C(f.call(arguments,1),function(t){if(t)for(var n in t)e[n]=t[n]}),e},N.pick=function(e){var t={},n=l.apply(s,f.call(arguments,1));return C(n,function(n){n in e&&(t[n]=e[n])}),t},N.omit=function(e){var t={},n=l.apply(s,f.call(arguments,1));for(var r in e)N.contains(n,r)||(t[r]=e[r]);return t},N.defaults=function(e){return C(f.call(arguments,1),function(t){if(t)for(var n in t)e[n]==null&&(e[n]=t[n])}),e},N.clone=function(e){return N.isObject(e)?N.isArray(e)?e.slice():N.extend({},e):e},N.tap=function(e,t){return t(e),e};var D=function(e,t,n,r){if(e===t)return e!==0||1/e==1/t;if(e==null||t==null)return e===t;e instanceof N&&(e=e._wrapped),t instanceof N&&(t=t._wrapped);var i=c.call(e);if(i!=c.call(t))return!1;switch(i){case"[object String]":return e==String(t);case"[object Number]":return e!=+e?t!=+t:e==0?1/e==1/t:e==+t;case"[object Date]":case"[object Boolean]":return+e==+t;case"[object RegExp]":return e.source==t.source&&e.global==t.global&&e.multiline==t.multiline&&e.ignoreCase==t.ignoreCase}if(typeof e!="object"||typeof t!="object")return!1;var s=n.length;while(s--)if(n[s]==e)return r[s]==t;n.push(e),r.push(t);var o=0,u=!0;if(i=="[object Array]"){o=e.length,u=o==t.length;if(u)while(o--)if(!(u=D(e[o],t[o],n,r)))break}else{var a=e.constructor,f=t.constructor;if(a!==f&&!(N.isFunction(a)&&a instanceof a&&N.isFunction(f)&&f instanceof f))return!1;for(var l in e)if(N.has(e,l)){o++;if(!(u=N.has(t,l)&&D(e[l],t[l],n,r)))break}if(u){for(l in t)if(N.has(t,l)&&!(o--))break;u=!o}}return n.pop(),r.pop(),u};N.isEqual=function(e,t){return D(e,t,[],[])},N.isEmpty=function(e){if(e==null)return!0;if(N.isArray(e)||N.isString(e))return e.length===0;for(var t in e)if(N.has(e,t))return!1;return!0},N.isElement=function(e){return!!e&&e.nodeType===1},N.isArray=S||function(e){return c.call(e)=="[object Array]"},N.isObject=function(e){return e===Object(e)},C(["Arguments","Function","String","Number","Date","RegExp"],function(e){N["is"+e]=function(t){return c.call(t)=="[object "+e+"]"}}),N.isArguments(arguments)||(N.isArguments=function(e){return!!e&&!!N.has(e,"callee")}),typeof /./!="function"&&(N.isFunction=function(e){return typeof e=="function"}),N.isFinite=function(e){return isFinite(e)&&!isNaN(parseFloat(e))},N.isNaN=function(e){return N.isNumber(e)&&e!=+e},N.isBoolean=function(e){return e===!0||e===!1||c.call(e)=="[object Boolean]"},N.isNull=function(e){return e===null},N.isUndefined=function(e){return e===void 0},N.has=function(e,t){return h.call(e,t)},N.noConflict=function(){return e._=r,this},N.identity=function(e){return e},N.times=function(e,t,n){var r=Array(e);for(var i=0;i":">",'"':""","'":"'","/":"/"}};P.unescape=N.invert(P.escape);var H={escape:new RegExp("["+N.keys(P.escape).join("")+"]","g"),unescape:new RegExp("("+N.keys(P.unescape).join("|")+")","g")};N.each(["escape","unescape"],function(e){N[e]=function(t){return t==null?"":(""+t).replace(H[e],function(t){return P[e][t]})}}),N.result=function(e,t){if(e==null)return null;var n=e[t];return N.isFunction(n)?n.call(e):n},N.mixin=function(e){C(N.functions(e),function(t){var n=N[t]=e[t];N.prototype[t]=function(){var e=[this._wrapped];return a.apply(e,arguments),q.call(this,n.apply(N,e))}})};var B=0;N.uniqueId=function(e){var t=""+ ++B;return e?e+t:t},N.templateSettings={evaluate:/<%([\s\S]+?)%>/g,interpolate:/<%=([\s\S]+?)%>/g,escape:/<%-([\s\S]+?)%>/g};var j=/(.)^/,F={"'":"'","\\":"\\","\r":"r","\n":"n"," ":"t","\u2028":"u2028","\u2029":"u2029"},I=/\\|'|\r|\n|\t|\u2028|\u2029/g;N.template=function(e,t,n){n=N.defaults({},n,N.templateSettings);var r=new RegExp([(n.escape||j).source,(n.interpolate||j).source,(n.evaluate||j).source].join("|")+"|$","g"),i=0,s="__p+='";e.replace(r,function(t,n,r,o,u){return s+=e.slice(i,u).replace(I,function(e){return"\\"+F[e]}),n&&(s+="'+\n((__t=("+n+"))==null?'':_.escape(__t))+\n'"),r&&(s+="'+\n((__t=("+r+"))==null?'':__t)+\n'"),o&&(s+="';\n"+o+"\n__p+='"),i=u+t.length,t}),s+="';\n",n.variable||(s="with(obj||{}){\n"+s+"}\n"),s="var __t,__p='',__j=Array.prototype.join,print=function(){__p+=__j.call(arguments,'');};\n"+s+"return __p;\n";try{var o=new Function(n.variable||"obj","_",s)}catch(u){throw u.source=s,u}if(t)return o(t,N);var a=function(e){return o.call(this,e,N)};return a.source="function("+(n.variable||"obj")+"){\n"+s+"}",a},N.chain=function(e){return N(e).chain()};var q=function(e){return this._chain?N(e).chain():e};N.mixin(N),C(["pop","push","reverse","shift","sort","splice","unshift"],function(e){var t=s[e];N.prototype[e]=function(){var n=this._wrapped;return t.apply(n,arguments),(e=="shift"||e=="splice")&&n.length===0&&delete n[0],q.call(this,n)}}),C(["concat","join","slice"],function(e){var t=s[e];N.prototype[e]=function(){return q.call(this,t.apply(this._wrapped,arguments))}}),N.extend(N.prototype,{chain:function(){return this._chain=!0,this},value:function(){return this._wrapped}})}).call(this)}),e.define("/src/js/util/constants.js",function(e,t,n,r,i,s,o){var u={betweenCommandsDelay:400},a={isAnimating:!1},f={minZoom:.55,maxZoom:1.25,minWidth:600,minHeight:600},l={arrowHeadSize:8,nodeRadius:17,curveControlPointOffset:50,defaultEasing:"easeInOut",defaultAnimationTime:400,rectFill:"hsb(0.8816909813322127,0.7,1)",headRectFill:"#2831FF",rectStroke:"#FFF",rectStrokeWidth:"3",multiBranchY:20,upstreamHeadOpacity:.5,upstreamNoneOpacity:.2,edgeUpstreamHeadOpacity:.4,edgeUpstreamNoneOpacity:.15,visBranchStrokeWidth:2,visBranchStrokeColorNone:"#333",defaultNodeFill:"hsba(0.5,0.8,0.7,1)",defaultNodeStrokeWidth:2,defaultNodeStroke:"#FFF",orphanNodeFill:"hsb(0.5,0.8,0.7)"};n.GLOBAL=a,n.TIME=u,n.GRAPHICS=l,n.VIEWPORT=f}),e.define("/src/js/util/index.js",function(e,t,n,r,i,s,o){var u=e("underscore");n.isBrowser=function(){var e=String(typeof window)!=="undefined";return e},n.splitTextCommand=function(e,t,n){t=u.bind(t,n),u.each(e.split(";"),function(e,n){e=u.escape(e),e=e.replace(/^(\s+)/,"").replace(/(\s+)$/,"").replace(/"/g,'"').replace(/'/g,"'");if(n>0&&!e.length)return;t(e)})},n.genParseCommand=function(e,t){return function(n){var r,i;return u.each(e,function(e,t){var s=e.exec(n);s&&(r=t,i=s)}),r?{toSet:{eventName:t,method:r,regexResults:i}}:!1}}}),e.define("/src/js/level/sandbox.js",function(e,t,n,r,i,s,o){var u=e("underscore"),a=e("q"),f=e("../util").isBrowser()?window.Backbone:e("backbone"),l=e("../util"),c=e("../app"),h=e("../visuals/visualization").Visualization,p=e("../level/parseWaterfall").ParseWaterfall,d=e("../level/disabledMap").DisabledMap,v=e("../models/commandModel").Command,m=e("../git/gitShim").GitShim,g=e("../views"),y=g.ModalTerminal,b=g.ModalAlert,w=e("../views/builderViews"),E=e("../views/multiView").MultiView,S=f.View.extend({tagName:"div",initialize:function(e){e=e||{},this.options=e,this.initVisualization(e),this.initCommandCollection(e),this.initParseWaterfall(e),this.initGitShim(e),e.wait||this.takeControl()},getDefaultVisEl:function(){return $("#mainVisSpace")[0]},getAnimationTime:function(){return 1050},initVisualization:function(e){this.mainVis=new h({el:e.el||this.getDefaultVisEl()})},initCommandCollection:function(e){this.commandCollection=c.getCommandUI().commandCollection},initParseWaterfall:function(e){this.parseWaterfall=new p},initGitShim:function(e){},takeControl:function(){c.getEventBaton().stealBaton("commandSubmitted",this.commandSubmitted,this),c.getEventBaton().stealBaton("processSandboxCommand",this.processSandboxCommand,this),c.getEventBaton().stealBaton("levelExited",this.levelExited,this),this.insertGitShim()},releaseControl:function(){c.getEventBaton().releaseBaton("commandSubmitted",this.commandSubmitted,this),c.getEventBaton().releaseBaton("processSandboxCommand",this.processSandboxCommand,this),c.getEventBaton().releaseBaton("levelExited",this.levelExited,this),this.releaseGitShim()},releaseGitShim:function(){this.gitShim&&this.gitShim.removeShim()},insertGitShim:function(){this.gitShim&&this.mainVis.customEvents.on("gitEngineReady",function(){this.gitShim.insertShim()},this)},commandSubmitted:function(e){c.getEvents().trigger("commandSubmittedPassive",e),l.splitTextCommand(e,function(e){this.commandCollection.add(new v({rawStr:e,parseWaterfall:this.parseWaterfall}))},this)},startLevel:function(t,n){var r=t.get("regexResults")||[],i=r[1]||"",s=c.getLevelArbiter().getLevel(i);if(!s){t.addWarning('A level for that id "'+i+'" was not found!! Opening up level selection view...'),c.getEventBaton().trigger("commandSubmitted","levels"),t.set("status","error"),n.resolve();return}this.hide(),this.clear();var o=a.defer(),u=e("../level").Level;this.currentLevel=new u({level:s,deferred:o,command:t}),o.promise.then(function(){t.finishWith(n)})},buildLevel:function(t,n){this.hide(),this.clear();var r=a.defer(),i=e("../level/builder").LevelBuilder;this.levelBuilder=new i({deferred:r}),r.promise.then(function(){t.finishWith(n)})},exitLevel:function(e,t){e.addWarning("You aren't in a level! You are in a sandbox, start a level with `level [id]`"),e.set("status","error"),t.resolve()},showLevels:function(e,t){var n=a.defer();c.getLevelDropdown().show(n,e),n.promise.done(function(){e.finishWith(t)})},resetSolved:function(e,t){c.getLevelArbiter().resetSolvedMap(),e.addWarning("Solved map was reset, you are starting from a clean slate!"),e.finishWith(t)},processSandboxCommand:function(e,t){var n={"reset solved":this.resetSolved,"help general":this.helpDialog,help:this.helpDialog,reset:this.reset,delay:this.delay,clear:this.clear,"exit level":this.exitLevel,level:this.startLevel,sandbox:this.exitLevel,levels:this.showLevels,mobileAlert:this.mobileAlert,"build level":this.buildLevel,"export tree":this.exportTree,"import tree":this.importTree,"import level":this.importLevel},r=n[e.get("method")];if(!r)throw new Error("no method for that wut");r.apply(this,[e,t])},hide:function(){this.mainVis.hide()},levelExited:function(){this.show()},show:function(){this.mainVis.show()},importTree:function(e,t){var n=new w.MarkdownPresenter({previewText:"Paste a tree JSON blob below!",fillerText:" "});n.deferred.promise.then(u.bind(function(e){try{this.mainVis.gitEngine.loadTree(JSON.parse(e))}catch(t){this.mainVis.reset(),new E({childViews:[{type:"ModalAlert",options:{markdowns:["## Error!","","Something is wrong with that JSON! Here is the error:","",String(t)]}}]})}},this)).fail(function(){}).done(function(){e.finishWith(t)})},importLevel:function(t,n){var r=new w.MarkdownPresenter({previewText:"Paste a level JSON blob in here!",fillerText:" "});r.deferred.promise.then(u.bind(function(r){var i=e("../level").Level;try{var s=JSON.parse(r),o=a.defer();this.currentLevel=new i({level:s,deferred:o,command:t}),o.promise.then(function(){t.finishWith(n)})}catch(u){new E({childViews:[{type:"ModalAlert",options:{markdowns:["## Error!","","Something is wrong with that level JSON, this happened:","",String(u)]}}]}),t.finishWith(n)}},this)).fail(function(){t.finishWith(n)}).done()},exportTree:function(e,t){var n=JSON.stringify(this.mainVis.gitEngine.exportTree(),null,2),r=new E({childViews:[{type:"MarkdownPresenter",options:{previewText:'Share this tree with friends! They can load it with "import tree"',fillerText:n,noConfirmCancel:!0}}]});r.getPromise().then(function(){e.finishWith(t)}).done()},clear:function(e,t){c.getEvents().trigger("clearOldCommands"),e&&t&&e.finishWith(t)},mobileAlert:function(e,t){alert("Can't bring up the keyboard on mobile / tablet :( try visiting on desktop! :D"),e.finishWith(t)},delay:function(e,t){var n=parseInt(e.get("regexResults")[1],10);setTimeout(function(){e.finishWith(t)},n)},reset:function(e,t){this.mainVis.reset(),setTimeout(function(){e.finishWith(t)},this.mainVis.getAnimationTime())},helpDialog:function(t,n){var r=new E({childViews:e("../dialogs/sandbox").dialog});r.getPromise().then(u.bind(function(){t.finishWith(n)},this)).done()}});n.Sandbox=S}),e.define("/node_modules/q/package.json",function(e,t,n,r,i,s,o){t.exports={main:"q.js"}}),e.define("/node_modules/q/q.js",function(e,t,n,r,i,s,o){(function(e){if(typeof bootstrap=="function")bootstrap("promise",e);else if(typeof n=="object")e(void 0,n);else if(typeof define=="function")define(e);else if(typeof ses!="undefined"){if(!ses.ok())return;ses.makeQ=function(){var t={};return e(void 0,t)}}else e(void 0,Q={})})(function(e,t){"use strict";function w(e){return b(e)==="[object StopIteration]"||e instanceof E}function x(e,t){t.stack&&typeof e=="object"&&e!==null&&e.stack&&e.stack.indexOf(S)===-1&&(e.stack=T(e.stack)+"\n"+S+"\n"+T(t.stack))}function T(e){var t=e.split("\n"),n=[];for(var r=0;r=n&&s<=Nt}function k(){if(Error.captureStackTrace){var e,t,n=Error.prepareStackTrace;return Error.prepareStackTrace=function(n,r){e=r[1].getFileName(),t=r[1].getLineNumber()},(new Error).stack,Error.prepareStackTrace=n,r=e,t}}function L(e,t,n){return function(){return typeof console!="undefined"&&typeof console.warn=="function"&&console.warn(t+" is deprecated, use "+n+" instead.",(new Error("")).stack),e.apply(e,arguments)}}function A(){function s(r){if(!e)return;n=U(r),d(e,function(e,t){u(function(){n.promiseSend.apply(n,t)})},void 0),e=void 0,t=void 0}var e=[],t=[],n,r=g(A.prototype),i=g(M.prototype);return i.promiseSend=function(r,i,s,o){var a=p(arguments);e?(e.push(a),r==="when"&&o&&t.push(o)):u(function(){n.promiseSend.apply(n,a)})},i.valueOf=function(){return e?i:n.valueOf()},Error.captureStackTrace&&(Error.captureStackTrace(i,A),i.stack=i.stack.substring(i.stack.indexOf("\n")+1)),o(i),r.promise=i,r.resolve=s,r.reject=function(e){s(R(e))},r.notify=function(n){e&&d(t,function(e,t){u(function(){t(n)})},void 0)},r}function O(e){var t=A();return st(e,t.resolve,t.reject,t.notify).fail(t.reject),t.promise}function M(e,t,n,r){t===void 0&&(t=function(e){return R(new Error("Promise does not support operation: "+e))});var i=g(M.prototype);return i.promiseSend=function(n,r){var s=p(arguments,2),o;try{e[n]?o=e[n].apply(i,s):o=t.apply(i,[n].concat(s))}catch(u){o=R(u)}r&&r(o)},n&&(i.valueOf=n),r&&(i.exception=r),o(i),i}function _(e){return D(e)?e.valueOf():e}function D(e){return e&&typeof e.promiseSend=="function"}function P(e){return H(e)||B(e)}function H(e){return!D(_(e))}function B(e){return e=_(e),D(e)&&"exception"in e}function q(){!I&&typeof window!="undefined"&&!window.Touch&&window.console&&console.log("Should be empty:",F),I=!0}function R(e){e=e||new Error;var t=M({when:function(t){if(t){var n=v(j,this);n!==-1&&(F.splice(n,1),j.splice(n,1))}return t?t(e):R(e)}},function(){return R(e)},function n(){return this},e);return q(),j.push(t),F.push(e),t}function U(e){if(D(e))return e;e=_(e);if(e&&typeof e.then=="function"){var t=A();return e.then(t.resolve,t.reject,t.notify),t.promise}return M({when:function(){return e},get:function(t){return e[t]},put:function(t,n){return e[t]=n,e},del:function(t){return delete e[t],e},post:function(t,n){return e[t].apply(e,n)},apply:function(t,n){return e.apply(t,n)},fapply:function(t){return e.apply(void 0,t)},viewInfo:function(){function r(e){n[e]||(n[e]=typeof t[e])}var t=e,n={};while(t)Object.getOwnPropertyNames(t).forEach(r),t=Object.getPrototypeOf(t);return{type:typeof e,properties:n}},keys:function(){return y(e)}},void 0,function n(){return e})}function z(e){return M({isDef:function(){}},function(){var n=p(arguments);return Y.apply(void 0,[e].concat(n))},function(){return _(e)})}function W(e,t){return e=U(e),t?M({viewInfo:function(){return t}},function(){var n=p(arguments);return Y.apply(void 0,[e].concat(n))},function(){return _(e)}):Y(e,"viewInfo")}function X(e){return W(e).when(function(t){var n;t.type==="function"?n=function(){return nt(e,void 0,arguments)}:n={};var r=t.properties||{};return y(r).forEach(function(t){r[t]==="function"&&(n[t]=function(){return tt(e,t,arguments)})}),U(n)})}function V(e,t,n,r){function o(e){try{return t?t(e):e}catch(n){return R(n)}}function a(e){if(n){x(e,l);try{return n(e)}catch(t){return R(t)}}return R(e)}function f(e){return r?r(e):e}var i=A(),s=!1,l=U(e);return u(function(){l.promiseSend("when",function(e){if(s)return;s=!0,i.resolve(o(e))},function(e){if(s)return;s=!0,i.resolve(a(e))})}),l.promiseSend("when",void 0,void 0,function(e){i.notify(f(e))}),i.promise}function $(e,t,n){return V(e,function(e){return at(e).then(function(e){return t.apply(void 0,e)},n)},n)}function J(e){return function(){function t(e,t){var s;try{s=n[e](t)}catch(o){return w(o)?o.value:R(o)}return V(s,r,i)}var n=e.apply(this,arguments),r=t.bind(t,"send"),i=t.bind(t,"throw");return r()}}function K(e){throw new E(e)}function Q(e){return function(){return at([this,at(arguments)]).spread(function(t,n){return e.apply(t,n)})}}function G(e){return function(t){var n=p(arguments,1);return Y.apply(void 0,[t,e].concat(n))}}function Y(e,t){var n=A(),r=p(arguments,2);return e=U(e),u(function(){e.promiseSend.apply(e,[t,n.resolve].concat(r))}),n.promise}function Z(e,t,n){var r=A();return e=U(e),u(function(){e.promiseSend.apply(e,[t,r.resolve].concat(n))}),r.promise}function et(e){return function(t){var n=p(arguments,1);return Z(t,e,n)}}function it(e,t){var n=p(arguments,2);return nt(e,t,n)}function st(e){var t=p(arguments,1);return rt(e,t)}function ot(e,t){var n=p(arguments,2);return function(){var i=n.concat(p(arguments));return nt(e,t,i)}}function ut(e){var t=p(arguments,1);return function(){var r=t.concat(p(arguments));return rt(e,r)}}function at(e){return V(e,function(e){var t=e.length;if(t===0)return U(e);var n=A();return d(e,function(r,i,s){H(i)?(e[s]=_(i),--t===0&&n.resolve(e)):V(i,function(r){e[s]=r,--t===0&&n.resolve(e)}).fail(n.reject)},void 0),n.promise})}function ft(e){return V(e,function(e){return V(at(m(e,function(e){return V(e,i,i)})),function(){return m(e,U)})})}function lt(e,t){return V(e,void 0,t)}function ct(e,t){return V(e,void 0,void 0,t)}function ht(e,t){return V(e,function(e){return V(t(),function(){return e})},function(e){return V(t(),function(){return R(e)})})}function pt(e,n,r,i){function s(n){u(function(){x(n,e);if(!t.onerror)throw n;t.onerror(n)})}var o=n||r||i?V(e,n,r,i):e;lt(o,s)}function dt(e,t){var n=A(),r=setTimeout(function(){n.reject(new Error("Timed out after "+t+" ms"))},t);return V(e,function(e){clearTimeout(r),n.resolve(e)},function(e){clearTimeout(r),n.reject(e)}),n.promise}function vt(e,t){t===void 0&&(t=e,e=void 0);var n=A();return setTimeout(function(){n.resolve(e)},t),n.promise}function mt(e,t){var n=p(t),r=A();return n.push(r.makeNodeResolver()),rt(e,n).fail(r.reject),r.promise}function gt(e){var t=p(arguments,1),n=A();return t.push(n.makeNodeResolver()),rt(e,t).fail(n.reject),n.promise}function yt(e){var t=p(arguments,1);return function(){var n=t.concat(p(arguments)),r=A();return n.push(r.makeNodeResolver()),rt(e,n).fail(r.reject),r.promise}}function bt(e,t,n){return Et(e,t).apply(void 0,n)}function wt(e,t){var n=p(arguments,2);return bt(e,t,n)}function Et(e){if(arguments.length>1){var t=arguments[1],n=p(arguments,2),r=e;e=function(){var e=n.concat(p(arguments));return r.apply(t,e)}}return function(){var t=A(),n=p(arguments);return n.push(t.makeNodeResolver()),rt(e,n).fail(t.reject),t.promise}}function St(e,t,n){var r=p(n),i=A();return r.push(i.makeNodeResolver()),tt(e,t,r).fail(i.reject),i.promise}function xt(e,t){var n=p(arguments,2),r=A();return n.push(r.makeNodeResolver()),tt(e,t,n).fail(r.reject),r.promise}function Tt(e,t){if(!t)return e;e.then(function(e){u(function(){t(null,e)})},function(e){u(function(){t(e)})})}var n=k(),r,i=function(){},o=Object.freeze||i;typeof cajaVM!="undefined"&&(o=cajaVM.def);var u;if(typeof s!="undefined")u=s.nextTick;else if(typeof setImmediate=="function")u=setImmediate;else if(typeof MessageChannel!="undefined"){var a=new MessageChannel,f={},l=f;a.port1.onmessage=function(){f=f.next;var e=f.task;delete f.task,e()},u=function(e){l=l.next={task:e},a.port2.postMessage(0)}}else u=function(e){setTimeout(e,0)};var c;if(Function.prototype.bind){var h=Function.prototype.bind;c=h.bind(h.call)}else c=function(e){return function(){return e.call.apply(e,arguments)}};var p=c(Array.prototype.slice),d=c(Array.prototype.reduce||function(e,t){var n=0,r=this.length;if(arguments.length===1)do{if(n in this){t=this[n++];break}if(++n>=r)throw new TypeError}while(1);for(;n2?e.resolve(p(arguments,1)):e.resolve(n)}},A.prototype.node=L(A.prototype.makeNodeResolver,"node","makeNodeResolver"),t.promise=O,t.makePromise=M,M.prototype.then=function(e,t,n){return V(this,e,t,n)},M.prototype.thenResolve=function(e){return V(this,function(){return e})},d(["isResolved","isFulfilled","isRejected","when","spread","send","get","put","del","post","invoke","keys","apply","call","bind","fapply","fcall","fbind","all","allResolved","view","viewInfo","timeout","delay","catch","finally","fail","fin","progress","end","done","nfcall","nfapply","nfbind","ncall","napply","nbind","npost","ninvoke","nend","nodeify"],function(e,n){M.prototype[n]=function(){return t[n].apply(t,[this].concat(p(arguments)))}},void 0),M.prototype.toSource=function(){return this.toString()},M.prototype.toString=function(){return"[object Promise]"},o(M.prototype),t.nearer=_,t.isPromise=D,t.isResolved=P,t.isFulfilled=H,t.isRejected=B;var j=[],F=[],I;t.reject=R,t.begin=U,t.resolve=U,t.ref=L(U,"ref","resolve"),t.master=z,t.viewInfo=W,t.view=X,t.when=V,t.spread=$,t.async=J,t["return"]=K,t.promised=Q,t.sender=L(G,"sender","dispatcher"),t.Method=L(G,"Method","dispatcher"),t.send=L(Y,"send","dispatch"),t.dispatch=Z,t.dispatcher=et,t.get=et("get"),t.put=et("put"),t["delete"]=t.del=et("del");var tt=t.post=et("post");t.invoke=function(e,t){var n=p(arguments,2);return tt(e,t,n)};var nt=t.apply=L(et("apply"),"apply","fapply"),rt=t.fapply=et("fapply");t.call=L(it,"call","fcall"),t["try"]=st,t.fcall=st,t.bind=L(ot,"bind","fbind"),t.fbind=ut,t.keys=et("keys"),t.all=at,t.allResolved=ft,t["catch"]=t.fail=lt,t.progress=ct,t["finally"]=t.fin=ht,t.end=L(pt,"end","done"),t.done=pt,t.timeout=dt,t.delay=vt,t.nfapply=mt,t.nfcall=gt,t.nfbind=yt,t.napply=L(bt,"napply","npost"),t.ncall=L(wt,"ncall","ninvoke"),t.nbind=L(Et,"nbind","nfbind"),t.npost=St,t.ninvoke=xt,t.nend=L(Tt,"nend","nodeify"),t.nodeify=Tt;var Nt=k()})}),e.define("/src/js/app/index.js",function(e,t,n,r,i,s,o){function y(){var t=e("../models/collections"),n=e("../views/commandViews");this.commandCollection=new t.CommandCollection,this.commandBuffer=new t.CommandBuffer({collection:this.commandCollection}),this.commandPromptView=new n.CommandPromptView({el:$("#commandLineBar")}),this.commandLineHistoryView=new n.CommandLineHistoryView({el:$("#commandLineHistory"),collection:this.commandCollection})}var u=e("underscore"),a=e("backbone"),f=e("../util/constants"),l=e("../util"),c=u.clone(a.Events),h,p,d,v,m,g=function(){var t=e("../level/sandbox").Sandbox,n=e("../level").Level,r=e("../util/eventBaton").EventBaton,i=e("../level/arbiter").LevelArbiter,s=e("../views/levelDropdownView").LevelDropdownView;d=new r,h=new y,p=new t,v=new i,m=new s({wait:!0});var o=function(){$("#commandTextField").focus()};o(),$(window).focus(function(e){d.trigger("windowFocus",e)}),$(document).click(function(e){d.trigger("documentClick",e)}),$(document).bind("keydown",function(e){d.trigger("docKeydown",e)}),$(document).bind("keyup",function(e){d.trigger("docKeyup",e)}),$(window).on("resize",function(e){c.trigger("resize",e)}),$(window).on("resize",u.throttle(function(e){var t=$(window).width(),n=$(window).height();d.trigger("windowSizeCheck",{w:t,h:n})},500)),d.stealBaton("docKeydown",function(){}),d.stealBaton("docKeyup",function(){}),d.stealBaton("windowFocus",o),d.stealBaton("documentClick",o);var a=function(e){return function(){var t=[e];u.each(arguments,function(e){t.push(e)}),d.trigger.apply(d,t)}};$("#commandTextField").on("keydown",a("keydown")),$("#commandTextField").on("keyup",a("keyup")),$(window).trigger("resize"),/\?demo/.test(window.location.href)?p.mainVis.customEvents.on("gitEngineReady",function(){d.trigger("commandSubmitted",["git commit; git checkout -b bugFix C1; git commit; git merge master; git checkout master; git commit; git rebase bugFix;","delay 1000; reset;","level rebase1 --noFinishDialog --noStartCommand --noIntroDialog;","delay 2000; show goal; delay 1000; hide goal;","git checkout bugFix; git rebase master; git checkout side; git rebase bugFix;","git checkout another; git rebase side; git rebase another master;","help; levels"].join(""))}):/\?NODEMO/.test(window.location.href)||p.mainVis.customEvents.on("gitEngineReady",function(){d.trigger("commandSubmitted",["git help;","delay 1000;","help;","levels"].join(""))});if(/command=/.test(window.location.href)){var f=window.location.href.split("command=")[1].split("&")[0],l=unescape(f);p.mainVis.customEvents.on("gitEngineReady",function(){d.trigger("commandSubmitted",l)})}(/(iPhone|iPod|iPad).*AppleWebKit/i.test(navigator.userAgent)||/android/i.test(navigator.userAgent))&&p.mainVis.customEvents.on("gitEngineReady",function(){d.trigger("commandSubmitted","mobile alert")})};e("../util").isBrowser()&&$(document).ready(g),n.getEvents=function(){return c},n.getSandbox=function(){return p},n.getEventBaton=function(){return d},n.getCommandUI=function(){return h},n.getLevelArbiter=function(){return v},n.getLevelDropdown=function(){return m},n.init=g}),e.define("/src/js/level/index.js",function(e,t,n,r,i,s,o){var u=e("underscore"),a=e("backbone"),f=e("q"),l=e("../util"),c=e("../app"),h=e("../util/errors"),p=e("../level/sandbox").Sandbox,d=e("../util/constants"),v=e("../visuals/visualization").Visualization,m=e("../level/parseWaterfall").ParseWaterfall,g=e("../level/disabledMap").DisabledMap,y=e("../models/commandModel").Command,b=e("../git/gitShim").GitShim,w=e("../views/multiView").MultiView,E=e("../views").CanvasTerminalHolder,S=e("../views").ConfirmCancelTerminal,x=e("../views").NextLevelConfirm,T=e("../views").LevelToolbar,N=e("../git/treeCompare").TreeCompare,C={"help level":/^help level$/,"start dialog":/^start dialog$/,"show goal":/^show goal$/,"hide goal":/^hide goal$/,"show solution":/^show solution($|\s)/},k=l.genParseCommand(C,"processLevelCommand"),L=p.extend({initialize:function(e){e=e||{},e.level=e.level||{},this.level=e.level,this.gitCommandsIssued=[],this.commandsThatCount=this.getCommandsThatCount(),this.solved=!1,this.treeCompare=new N,this.initGoalData(e),this.initName(e),L.__super__.initialize.apply(this,[e]),this.startOffCommand(),this.handleOpen(e.deferred)},handleOpen:function(e){e=e||f.defer();if(this.level.startDialog&&!this.testOption("noIntroDialog")){new w(u.extend({},this.level.startDialog,{deferred:e}));return}setTimeout(function(){e.resolve()},this.getAnimationTime()*1.2)},startDialog:function(e,t){if(!this.level.startDialog){e.set("error",new h.GitError({msg:"There is no start dialog to show for this level!"})),t.resolve();return}this.handleOpen(t),t.promise.then(function(){e.set("status","finished")})},initName:function(){this.level.name||(this.level.name="Rebase Classic",console.warn("REALLY BAD FORM need ids and names")),this.levelToolbar=new T({name:this.level.name})},initGoalData:function(e){if(!this.level.goalTreeString||!this.level.solutionCommand)throw new Error("need goal tree and solution")},takeControl:function(){c.getEventBaton().stealBaton("processLevelCommand",this.processLevelCommand,this),L.__super__.takeControl.apply(this)},releaseControl:function(){c.getEventBaton().releaseBaton("processLevelCommand",this.processLevelCommand,this),L.__super__.releaseControl.apply(this)},startOffCommand:function(){this.testOption("noStartCommand")||c.getEventBaton().trigger("commandSubmitted","hint; delay 2000; show goal")},initVisualization:function(e){this.mainVis=new v({el:e.el||this.getDefaultVisEl(),treeString:e.level.startTree}),this.initGoalVisualization()},initGoalVisualization:function(){this.goalCanvasHolder=new E,this.goalVis=new v({el:this.goalCanvasHolder.getCanvasLocation(),containerElement:this.goalCanvasHolder.getCanvasLocation(),treeString:this.level.goalTreeString,noKeyboardInput:!0,noClick:!0})},showSolution:function(e,t){var n=this.level.solutionCommand,r=function(){c.getEventBaton().trigger("commandSubmitted",n)},i=e.get("rawStr");this.testOptionOnString(i,"noReset")||(n="reset; "+n);if(this.testOptionOnString(i,"force")){r(),e.finishWith(t);return}var s=f.defer(),o=new S({markdowns:["## Are you sure you want to see the solution?","","I believe in you! You can do it"],deferred:s});s.promise.then(r).fail(function(){e.setResult("Great! I'll let you get back to it")}).done(function(){setTimeout(function(){e.finishWith(t)},o.getAnimationTime())})},showGoal:function(e,t){this.goalCanvasHolder.slideIn();if(!e||!t)return;setTimeout(function(){e.finishWith(t)},this.goalCanvasHolder.getAnimationTime())},hideGoal:function(e,t){this.goalCanvasHolder.slideOut();if(!e||!t)return;setTimeout(function(){e.finishWith(t)},this.goalCanvasHolder.getAnimationTime())},initParseWaterfall:function(e){L.__super__.initParseWaterfall.apply(this,[e]),this.parseWaterfall.addFirst("parseWaterfall",k),this.parseWaterfall.addFirst("instantWaterfall",this.getInstantCommands()),e.level.disabledMap&&this.parseWaterfall.addFirst("instantWaterfall",(new g({disabledMap:e.level.disabledMap})).getInstantCommands())},initGitShim:function(e){this.gitShim=new b({afterCB:u.bind(this.afterCommandCB,this),afterDeferHandler:u.bind(this.afterCommandDefer,this)})},getCommandsThatCount:function(){var t=e("../git/commands"),n=["git commit","git checkout","git rebase","git reset","git branch","git revert","git merge","git cherry-pick"],r={};return u.each(n,function(e){if(!t.regexMap[e])throw new Error("wut no regex");r[e]=t.regexMap[e]}),r},afterCommandCB:function(e){var t=!1;u.each(this.commandsThatCount,function(n){t=t||n.test(e.get("rawStr"))}),t&&this.gitCommandsIssued.push(e.get("rawStr"))},afterCommandDefer:function(e,t){if(this.solved){t.addWarning("You've already solved this level, try other levels with 'show levels'or go back to the sandbox with 'sandbox'"),e.resolve();return}var n=this.mainVis.gitEngine.exportTree(),r;this.level.compareOnlyMaster?r=this.treeCompare.compareBranchWithinTrees(n,this.level.goalTreeString,"master"):this.level.compareOnlyBranches?r=this.treeCompare.compareAllBranchesWithinTrees(n,this.level.goalTreeString):r=this.treeCompare.compareAllBranchesWithinTreesAndHEAD(n,this.level.goalTreeString);if(!r){e.resolve();return}this.levelSolved(e)},getNumSolutionCommands:function(){var e=this.level.solutionCommand.replace(/^;|;$/g,"");return e.split(";").length},testOption:function(e){return this.options.command&&(new RegExp("--"+e)).test(this.options.command.get("rawStr"))},testOptionOnString:function(e,t){return e&&(new RegExp("--"+t)).test(e)},levelSolved:function(e){this.solved=!0,c.getEvents().trigger("levelSolved",this.level.id),this.hideGoal();var t=c.getLevelArbiter().getNextLevel(this.level.id),n=this.gitCommandsIssued.length,r=this.getNumSolutionCommands();d.GLOBAL.isAnimating=!0;var i=this.testOption("noFinishDialog"),s=this.mainVis.gitVisuals.finishAnimation();i||(s=s.then(function(){var e=new x({nextLevel:t,numCommands:n,best:r});return e.getPromise()})),s.then(function(){!i&&t&&c.getEventBaton().trigger("commandSubmitted","level "+t.id)}).fail(function(){}).done(function(){d.GLOBAL.isAnimating=!1,e.resolve()})},die:function(){this.levelToolbar.die(),this.goalDie(),this.mainVis.die(),this.releaseControl(),this.clear(),delete this.commandCollection,delete this.mainVis,delete this.goalVis,delete this.goalCanvasHolder},goalDie:function(){this.goalCanvasHolder.die(),this.goalVis.die()},getInstantCommands:function(){var e=this.level.hint?this.level.hint:"Hmm, there doesn't seem to be a hint for this level :-/";return[[/^help$|^\?$/,function(){throw new h.CommandResult({msg:'You are in a level, so multiple forms of help are available. Please select either "help level" or "help general"'})}],[/^hint$/,function(){throw new h.CommandResult({msg:e})}]]},reset:function(){this.gitCommandsIssued=[],this.solved=!1,L.__super__.reset.apply(this,arguments)},buildLevel:function(e,t){this.exitLevel(),setTimeout(function(){c.getSandbox().buildLevel(e,t)},this.getAnimationTime()*1.5)},importLevel:function(e,t){this.exitLevel(),setTimeout(function(){c.getSandbox().importLevel(e,t)},this.getAnimationTime()*1.5)},startLevel:function(e,t){this.exitLevel(),setTimeout(function(){c.getSandbox().startLevel(e,t)},this.getAnimationTime()*1.5)},exitLevel:function(e,t){this.die();if(!e||!t)return;setTimeout(function(){e.finishWith(t)},this.getAnimationTime()),c.getEventBaton().trigger("levelExited")},processLevelCommand:function(e,t){var n={"show goal":this.showGoal,"hide goal":this.hideGoal,"show solution":this.showSolution,"start dialog":this.startDialog,"help level":this.startDialog},r=n[e.get("method")];if(!r)throw new Error("woah we dont support that method yet",r);r.apply(this,[e,t])}});n.Level=L,n.regexMap=C}),e.define("/src/js/util/errors.js",function(e,t,n,r,i,s,o){var u=e("underscore"),a=e("backbone"),f=a.Model.extend({defaults:{type:"MyError",msg:"Unknown Error"},toString:function(){return this.get("type")+": "+this.get("msg")},getMsg:function(){return this.get("msg")||"Unknown Error"},toResult:function(){return this.get("msg").length?""+this.get("msg").replace(/\n/g,"
")+"
":""}}),l=n.CommandProcessError=f.extend({defaults:{type:"Command Process Error"}}),c=n.CommandResult=f.extend({defaults:{type:"Command Result"}}),h=n.Warning=f.extend({defaults:{type:"Warning"}}),p=n.GitError=f.extend({defaults:{type:"Git Error"}}),d=function(e){if(e instanceof l||e instanceof p||e instanceof c||e instanceof h)return;throw e};n.filterError=d}),e.define("/src/js/visuals/visualization.js",function(e,t,n,r,i,s,o){var u=e("underscore"),a=e("../util").isBrowser()?a=window.Backbone:a=e("backbone"),f=e("../models/collections"),l=f.CommitCollection,c=f.BranchCollection,h=e("../util/eventBaton").EventBaton,p=e("../visuals").GitVisuals,d=a.View.extend({initialize:function(e){e=e||{},this.options=e,this.customEvents=u.clone(a.Events),this.containerElement=e.containerElement;var t=this,n=e.containerElement||$("#canvasHolder")[0];new Raphael(n,200,200,function(){var n=this;s.nextTick(function(){t.paperInitialize(n,e)})})},paperInitialize:function(t,n){this.treeString=n.treeString,this.paper=t;var r=e("../app");this.eventBaton=n.noKeyboardInput?new h:r.getEventBaton(),this.commitCollection=new l,this.branchCollection=new c,this.gitVisuals=new p({commitCollection:this.commitCollection,branchCollection:this.branchCollection,paper:this.paper,noClick:this.options.noClick,smallCanvas:this.options.smallCanvas});var i=e("../git").GitEngine;this.gitEngine=new i({collection:this.commitCollection,branches:this.branchCollection,gitVisuals:this.gitVisuals,eventBaton:this.eventBaton}),this.gitEngine.init(),this.gitVisuals.assignGitEngine(this.gitEngine),this.myResize(),$(window).on("resize",u.bind(function(){this.myResize()},this)),this.gitVisuals.drawTreeFirstTime(),this.treeString&&this.gitEngine.loadTreeFromString(this.treeString),this.options.zIndex&&this.setTreeIndex(this.options.zIndex),this.shown=!1,this.setTreeOpacity(0),s.nextTick(u.bind(this.fadeTreeIn,this)),this.customEvents.trigger("gitEngineReady"),this.customEvents.trigger("paperReady")},setTreeIndex:function(e){$(this.paper.canvas).css("z-index",e)},setTreeOpacity:function(e){e===0&&(this.shown=!1),$(this.paper.canvas).css("opacity",e)},getAnimationTime:function(){return 300},fadeTreeIn:function(){this.shown=!0,$(this.paper.canvas).animate({opacity:1},this.getAnimationTime())},fadeTreeOut:function(){this.shown=!1,$(this.paper.canvas).animate({opacity:0},this.getAnimationTime())},hide:function(){this.fadeTreeOut(),setTimeout(u.bind(function(){$(this.paper.canvas).css("visibility","hidden")},this),this.getAnimationTime())},show:function(){$(this.paper.canvas).css("visibility","visible"),setTimeout(u.bind(this.fadeTreeIn,this),10)},showHarsh:function(){$(this.paper.canvas).css("visibility","visible"),this.setTreeOpacity(1)},resetFromThisTreeNow:function(e){this.treeString=e},reset:function(){this.setTreeOpacity(0),this.treeString?this.gitEngine.loadTreeFromString(this.treeString):this.gitEngine.defaultInit(),this.fadeTreeIn()},tearDown:function(){this.gitEngine.tearDown(),this.gitVisuals.tearDown(),delete this.paper},die:function(){this.fadeTreeOut(),setTimeout(u.bind(function(){this.shown||this.tearDown()},this),this.getAnimationTime())},myResize:function(){if(!this.paper)return;var e=1,t=this.el,n=t.clientWidth-e,r=t.clientHeight-e;if(!this.containerElement){var i=t.offsetLeft,s=t.offsetTop;$(this.paper.canvas).css({position:"absolute",left:i+"px",top:s+"px"})}this.paper.setSize(n,r),this.gitVisuals.canvasResize(n,r)}});n.Visualization=d}),e.define("/src/js/models/collections.js",function(e,t,n,r,i,s,o){var u=e("underscore"),a=e("q"),f=e("../util").isBrowser()?f=window.Backbone:f=e("backbone"),l=e("../git").Commit,c=e("../git").Branch,h=e("../models/commandModel").Command,p=e("../models/commandModel").CommandEntry,d=e("../util/constants").TIME,v=f.Collection.extend({model:l}),m=f.Collection.extend({model:h}),g=f.Collection.extend({model:c}),y=f.Collection.extend({model:p,localStorage:f.LocalStorage?new f.LocalStorage("CommandEntries"):null}),b=f.Model.extend({defaults:{collection:null},initialize:function(e){e.collection.bind("add",this.addCommand,this),this.buffer=[],this.timeout=null},addCommand:function(e){this.buffer.push(e),this.touchBuffer()},touchBuffer:function(){if(this.timeout)return;this.setTimeout()},setTimeout:function(){this.timeout=setTimeout(u.bind(function(){this.sipFromBuffer()},this),d.betweenCommandsDelay)},popAndProcess:function(){var e=this.buffer.shift(0);while(e.get("error")&&this.buffer.length)e=this.buffer.shift(0);e.get("error")?this.clear():this.processCommand(e)},processCommand:function(t){t.set("status","processing");var n=a.defer();n.promise.then(u.bind(function(){this.setTimeout()},this));var r=t.get("eventName");if(!r)throw new Error("I need an event to trigger when this guy is parsed and ready");var i=e("../app"),s=i.getEventBaton(),o=s.getNumListeners(r);if(!o){var f=e("../util/errors");t.set("error",new f.GitError({msg:"That command is valid, but not supported in this current environment! Try entering a level or level builder to use that command"})),n.resolve();return}i.getEventBaton().trigger(r,t,n)},clear:function(){clearTimeout(this.timeout),this.timeout=null},sipFromBuffer:function(){if(!this.buffer.length){this.clear();return}this.popAndProcess()}});n.CommitCollection=v,n.CommandCollection=m,n.BranchCollection=g,n.CommandEntryCollection=y,n.CommandBuffer=b}),e.define("/src/js/git/index.js",function(e,t,n,r,i,s,o){function m(e){this.rootCommit=null,this.refs={},this.HEAD=null,this.branchCollection=e.branches,this.commitCollection=e.collection,this.gitVisuals=e.gitVisuals,this.eventBaton=e.eventBaton,this.eventBaton.stealBaton("processGitCommand",this.dispatch,this),this.animationFactory=e.animationFactory||new l.AnimationFactory,this.commandOptions={},this.generalArgs=[],this.initUniqueID()}var u=e("underscore"),a=e("../util").isBrowser()?a=window.Backbone:a=e("backbone"),f=e("q"),l=e("../visuals/animation/animationFactory"),c=e("../visuals/animation").AnimationQueue,h=e("./treeCompare").TreeCompare,p=e("../util/errors"),d=p.GitError,v=p.CommandResult;m.prototype.initUniqueID=function(){this.uniqueId=function(){var e=0;return function(t){return t?t+e++:e++}}()},m.prototype.defaultInit=function(){var e=JSON.parse(unescape("%7B%22branches%22%3A%7B%22master%22%3A%7B%22target%22%3A%22C1%22%2C%22id%22%3A%22master%22%2C%22type%22%3A%22branch%22%7D%7D%2C%22commits%22%3A%7B%22C0%22%3A%7B%22type%22%3A%22commit%22%2C%22parents%22%3A%5B%5D%2C%22author%22%3A%22Peter%20Cottle%22%2C%22createTime%22%3A%22Mon%20Nov%2005%202012%2000%3A56%3A47%20GMT-0800%20%28PST%29%22%2C%22commitMessage%22%3A%22Quick%20Commit.%20Go%20Bears%21%22%2C%22id%22%3A%22C0%22%2C%22rootCommit%22%3Atrue%7D%2C%22C1%22%3A%7B%22type%22%3A%22commit%22%2C%22parents%22%3A%5B%22C0%22%5D%2C%22author%22%3A%22Peter%20Cottle%22%2C%22createTime%22%3A%22Mon%20Nov%2005%202012%2000%3A56%3A47%20GMT-0800%20%28PST%29%22%2C%22commitMessage%22%3A%22Quick%20Commit.%20Go%20Bears%21%22%2C%22id%22%3A%22C1%22%7D%7D%2C%22HEAD%22%3A%7B%22id%22%3A%22HEAD%22%2C%22target%22%3A%22master%22%2C%22type%22%3A%22general%20ref%22%7D%7D"));this.loadTree(e)},m.prototype.init=function(){this.rootCommit=this.makeCommit(null,null,{rootCommit:!0}),this.commitCollection.add(this.rootCommit);var e=this.makeBranch("master",this.rootCommit);this.HEAD=new g({id:"HEAD",target:e}),this.refs[this.HEAD.get("id")]=this.HEAD,this.commit()},m.prototype.exportTree=function(){var e={branches:{},commits:{},HEAD:null};u.each(this.branchCollection.toJSON(),function(t){t.target=t.target.get("id"),t.visBranch=undefined,e.branches[t.id]=t}),u.each(this.commitCollection.toJSON(),function(t){u.each(b.prototype.constants.circularFields,function(e){t[e]=undefined},this);var n=[];u.each(t.parents,function(e){n.push(e.get("id"))}),t.parents=n,e.commits[t.id]=t},this);var t=this.HEAD.toJSON();return t.visBranch=undefined,t.lastTarget=t.lastLastTarget=t.visBranch=undefined,t.target=t.target.get("id"),e.HEAD=t,e},m.prototype.printTree=function(e){e=e||this.exportTree(),h.prototype.reduceTreeFields([e]);var t=JSON.stringify(e);return/'/.test(t)&&(t=escape(t)),t},m.prototype.printAndCopyTree=function(){window.prompt("Copy the tree string below",this.printTree())},m.prototype.loadTree=function(e){e=$.extend(!0,{},e),this.removeAll(),this.instantiateFromTree(e),this.reloadGraphics(),this.initUniqueID()},m.prototype.loadTreeFromString=function(e){this.loadTree(JSON.parse(unescape(e)))},m.prototype.instantiateFromTree=function(e){var t={};u.each(e.commits,function(n){var r=this.getOrMakeRecursive(e,t,n.id);this.commitCollection.add(r)},this),u.each(e.branches,function(n){var r=this.getOrMakeRecursive(e,t,n.id);this.branchCollection.add(r,{silent:!0})},this);var n=this.getOrMakeRecursive(e,t,e.HEAD.id);this.HEAD=n,this.rootCommit=t.C0;if(!this.rootCommit)throw new Error("Need root commit of C0 for calculations");this.refs=t,this.gitVisuals.gitReady=!1,this.branchCollection.each(function(e){this.gitVisuals.addBranch(e)},this)},m.prototype.reloadGraphics=function(){this.gitVisuals.rootCommit=this.refs.C0,this.gitVisuals.initHeadBranch(),this.gitVisuals.drawTreeFromReload(),this.gitVisuals.refreshTreeHarsh()},m.prototype.getOrMakeRecursive=function(e,t,n){if(t[n])return t[n];var r=function(e,t){if(e.commits[t])return"commit";if(e.branches[t])return"branch";if(t=="HEAD")return"HEAD";throw new Error("bad type for "+t)},i=r(e,n);if(i=="HEAD"){var s=e.HEAD,o=new g(u.extend(e.HEAD,{target:this.getOrMakeRecursive(e,t,s.target)}));return t[n]=o,o}if(i=="branch"){var a=e.branches[n],f=new y(u.extend(e.branches[n],{target:this.getOrMakeRecursive(e,t,a.target)}));return t[n]=f,f}if(i=="commit"){var l=e.commits[n],c=[];u.each(l.parents,function(n){c.push(this.getOrMakeRecursive(e,t,n))},this);var h=new b(u.extend(l,{parents:c,gitVisuals:this.gitVisuals}));return t[n]=h,h}throw new Error("ruh rho!! unsupported tyep for "+n)},m.prototype.tearDown=function(){this.eventBaton.releaseBaton("processGitCommand",this.dispatch,this),this.removeAll()},m.prototype.removeAll=function(){this.branchCollection.reset(),this.commitCollection.reset(),this.refs={},this.HEAD=null,this.rootCommit=null,this.gitVisuals.resetAll()},m.prototype.getDetachedHead=function(){var e=this.HEAD.get("target"),t=e.get("type");return t!=="branch"},m.prototype.validateBranchName=function(e){e=e.replace(/\s/g,"");if(!/^[a-zA-Z0-9]+$/.test(e))throw new d({msg:"woah bad branch name!! This is not ok: "+e});if(/[hH][eE][aA][dD]/.test(e))throw new d({msg:'branch name of "head" is ambiguous, dont name it that'});return e.length>9&&(e=e.slice(0,9),this.command.addWarning("Sorry, we need to keep branch names short for the visuals. Your branch name was truncated to 9 characters, resulting in "+e)),e},m.prototype.makeBranch=function(e,t){e=this.validateBranchName(e);if(this.refs[e])throw new d({msg:"that branch id either matches a commit hash or already exists!"});var n=new y({target:t,id:e});return this.branchCollection.add(n),this.refs[n.get("id")]=n,n},m.prototype.getHead=function(){return u.clone(this.HEAD)},m.prototype.getBranches=function(){var e=[];return this.branchCollection.each(function(t){e.push({id:t.get("id"),selected:this.HEAD.get("target")===t,target:t.get("target"),obj:t})},this),e},m.prototype.printBranchesWithout=function(e){var t=this.getUpstreamBranchSet(),n=this.getCommitFromRef(e).get("id"),r=[];u.each(t[n],function(e){e.selected=this.HEAD.get("target").get("id")==e.id,r.push(e)},this),this.printBranches(r)},m.prototype.printBranches=function(e){var t="";throw u.each(e,function(e){t+=(e.selected?"* ":"")+e.id+"\n"}),new v({msg:t})},m.prototype.makeCommit=function(e,t,n){if(!t){t=this.uniqueId("C");while(this.refs[t])t=this.uniqueId("C")}var r=new b(u.extend({parents:e,id:t,gitVisuals:this.gitVisuals},n||{}));return this.refs[r.get("id")]=r,this.commitCollection.add(r),r},m.prototype.acceptNoGeneralArgs=function(){if(this.generalArgs.length)throw new d({msg:"That command accepts no general arguments"})},m.prototype.validateArgBounds=function(e,t,n,r){var i=r===undefined?"git "+this.command.get("method"):this.command.get("method")+" "+r+" ";i="with "+i;if(e.lengthn)throw new d({msg:"I expect at most "+String(n)+" argument(s) "+i})},m.prototype.oneArgImpliedHead=function(e,t){this.validateArgBounds(e,0,1,t),e.length===0&&e.push("HEAD")},m.prototype.twoArgsImpliedHead=function(e,t){this.validateArgBounds(e,1,2,t),e.length==1&&e.push("HEAD")},m.prototype.revertStarter=function(){this.validateArgBounds(this.generalArgs,1,NaN);var e=this.revert(this.generalArgs);e&&this.animationFactory.rebaseAnimation(this.animationQueue,e,this,this.gitVisuals)},m.prototype.revert=function(e){var t=[];u.each(e,function(e){t.push(this.getCommitFromRef(e))},this);var n={};n.destinationBranch=this.resolveID(t[0]),n.toRebaseArray=t.slice(0),n.rebaseSteps=[];var r=this.gitVisuals.genSnapshot(),i,s=this.getCommitFromRef("HEAD");return u.each(t,function(e){var t=this.rebaseAltID(e.get("id")),o=this.makeCommit([s],t,{commitMessage:"Reverting "+this.resolveName(e)+': "'+e.get("commitMessage")+'"'});s=o,i=this.gitVisuals.genSnapshot(),n.rebaseSteps.push({oldCommit:e,newCommit:o,beforeSnapshot:r,afterSnapshot:i}),r=i},this),this.setTargetLocation("HEAD",s),n},m.prototype.resetStarter=function(){if(this.commandOptions["--soft"])throw new d({msg:"You can't use --soft because there is no concept of stashing changes or staging files, so you will lose your progress. Try using interactive rebasing (or just rebasing) to move commits."});this.commandOptions["--hard"]&&(this.command.addWarning("Nice! You are using --hard. The default behavior is a hard reset in this demo, so don't worry about specifying the option explicity"),this.generalArgs=this.generalArgs.concat(this.commandOptions["--hard"])),this.validateArgBounds(this.generalArgs,1,1);if(this.getDetachedHead())throw new d({msg:"Cant reset in detached head! Use checkout if you want to move"});this.reset(this.generalArgs[0])},m.prototype.reset=function(e){this.setTargetLocation("HEAD",this.getCommitFromRef(e))},m.prototype.cherrypickStarter=function(){this.validateArgBounds(this.generalArgs,1,1);var e=this.cherrypick(this.generalArgs[0]);this.animationFactory.genCommitBirthAnimation(this.animationQueue,e,this.gitVisuals)},m.prototype.cherrypick=function(e){var t=this.getCommitFromRef(e),n=this.getUpstreamSet("HEAD");if(n[t.get("id")])throw new d({msg:"We already have that commit in our changes history! You can't cherry-pick it if it shows up in git log."});var r=this.rebaseAltID(t.get("id")),i=this.makeCommit([this.getCommitFromRef("HEAD")],r);return this.setTargetLocation(this.HEAD,i),i},m.prototype.commitStarter=function(){this.acceptNoGeneralArgs();if(this.commandOptions["-am"]&&(this.commandOptions["-a"]||this.commandOptions["-m"]))throw new d({msg:"You can't have -am with another -m or -a!"});var e=null,t=null;this.commandOptions["-a"]&&this.command.addWarning("No need to add files in this demo"),this.commandOptions["-am"]&&(t=this.commandOptions["-am"],this.validateArgBounds(t,1,1,"-am"),this.command.addWarning("Don't worry about adding files in this demo. I'll take down your commit message anyways, but you can commit without a message in this demo as well"),e=t[0]),this.commandOptions["-m"]&&(t=this.commandOptions["-m"],this.validateArgBounds(t,1,1,"-m"),e=t[0]);var n=this.commit();e&&(e=e.replace(/"/g,'"').replace(/^"/g,"").replace(/"$/g,""),n.set("commitMessage",e)),this.animationFactory.genCommitBirthAnimation(this.animationQueue,n,this.gitVisuals)},m.prototype.commit=function(){var e=this.getCommitFromRef(this.HEAD),t=null;this.commandOptions["--amend"]&&(e=this.resolveID("HEAD~1"),t=this.rebaseAltID(this.getCommitFromRef("HEAD").get("id")));var n=this.makeCommit([e],t);return this.getDetachedHead()&&this.command.addWarning("Warning!! Detached HEAD state"),this.setTargetLocation(this.HEAD,n),n},m.prototype.resolveName=function(e){var t=this.resolveID(e);return t.get("type")=="commit"?"commit "+t.get("id"):t.get("type")=="branch"?'branch "'+t.get("id")+'"':this.resolveName(t.get("target"))},m.prototype.resolveID=function(e){if(e===null||e===undefined)throw new Error("Dont call this with null / undefined");return typeof e!="string"?e:this.resolveStringRef(e)},m.prototype.resolveStringRef=function(e){if(this.refs[e])return this.refs[e];if(this.refs[e.toUpperCase()])return this.refs[e.toUpperCase()];var t=[[/^([a-zA-Z0-9]+)~(\d+)\s*$/,function(e){return parseInt(e[2],10)}],[/^([a-zA-Z0-9]+)(\^+)\s*$/,function(e){return e[2].length}]],n=null,r=null;u.each(t,function(t){var i=t[0],s=t[1];if(i.test(e)){var o=i.exec(e);r=s(o),n=o[1]}},this);if(!n)throw new d({msg:"unknown ref "+e});if(!this.refs[n])throw new d({msg:"the ref "+n+" does not exist."});var i=this.getCommitFromRef(n);return this.numBackFrom(i,r)},m.prototype.getCommitFromRef=function(e){var t=this.resolveID(e);while(t.get("type")!=="commit")t=t.get("target");return t},m.prototype.getType=function(e){return this.resolveID(e).get("type")},m.prototype.setTargetLocation=function(e,t){if(this.getType(e)=="commit")return;e=this.getOneBeforeCommit(e),e.set("target",t)},m.prototype.getUpstreamBranchSet=function(){var e={},t=function(e,t){var n=!1;return u.each(e,function(e){e.id==t&&(n=!0)}),n},n=function(e){var t=[],n=[e];while(n.length){var r=n.pop();t.push(r.get("id")),r.get("parents")&&r.get("parents").length&&(n=n.concat(r.get("parents")))}return t};return this.branchCollection.each(function(r){var i=n(r.get("target"));u.each(i,function(n){e[n]=e[n]||[],t(e[n],r.get("id"))||e[n].push({obj:r,id:r.get("id")})})}),e},m.prototype.getUpstreamHeadSet=function(){var e=this.getUpstreamSet("HEAD"),t=this.getCommitFromRef("HEAD").get("id");return e[t]=!0,e},m.prototype.getOneBeforeCommit=function(e){var t=this.resolveID(e);return t===this.HEAD&&!this.getDetachedHead()&&(t=t.get("target")),t},m.prototype.numBackFrom=function(e,t){if(t===0)return e;var n=u.bind(function(e){e.sort(this.dateSortFunc)},this),r=[].concat(e.get("parents")||[]);n(r),t--;while(r.length&&t!==0){var i=r.shift(0),s=i.get("parents");s&&s.length&&(r=r.concat(s)),n(r),t--}if(t!==0||r.length===0)throw new d({msg:"Sorry, I can't go that many commits back"});return r.shift(0)},m.prototype.scrapeBaseID=function(e){var t=/^C(\d+)/.exec(e);if(!t)throw new Error("regex failed on "+e);return"C"+t[1]},m.prototype.rebaseAltID=function(e){var t=[[/^C(\d+)[']{0,2}$/,function(e){return e[0]+"'"}],[/^C(\d+)[']{3}$/,function(e){return e[0].slice(0,-3)+"'^4"}],[/^C(\d+)['][\^](\d+)$/,function(e){return"C"+String(e[1])+"'^"+String(Number(e[2])+1)}]];for(var n=0;n",this.get("commitMessage"),"
","Commit: "+this.get("id")].join("\n")+"\n"},getShowEntry:function(){return[this.getLogEntry(),"diff --git a/bigGameResults.html b/bigGameResults.html","--- bigGameResults.html","+++ bigGameResults.html","@@ 13,27 @@ Winner, Score","- Stanfurd, 14-7","+ Cal, 21-14"].join("\n")+"\n"},validateAtInit:function(){if(!this.get("id"))throw new Error("Need ID!!");this.get("createTime")||this.set("createTime",(new Date).toString()),this.get("commitMessage")||this.set("commitMessage","Quick Commit. Go Bears!"),this.set("children",[]);if(!this.get("rootCommit"))if(!this.get("parents")||!this.get("parents").length)throw new Error("needs parents")},addNodeToVisuals:function(){var e=this.get("gitVisuals").addNode(this.get("id"),this);this.set("visNode",e)},addEdgeToVisuals:function(e){this.get("gitVisuals").addEdge(this.get("id"),e.get("id"))},isMainParent:function(e){var t=this.get("parents").indexOf(e);return t===0},initialize:function(e){this.validateAtInit(),this.addNodeToVisuals(),u.each(this.get("parents"),function(e){e.get("children").push(this),this.addEdgeToVisuals(e)},this)}});n.GitEngine=m,n.Commit=b,n.Branch=y,n.Ref=g}),e.define("/src/js/visuals/animation/animationFactory.js",function(e,t,n,r,i,s,o){var u=e("underscore"),a=e("backbone"),f=e("./index").Animation,l=e("../../util/constants").GRAPHICS,c=function(){};c.prototype.genCommitBirthAnimation=function(e,t,n){if(!e)throw new Error("Need animation queue to add closure to!");var r=l.defaultAnimationTime*1,i=r*2,s=t.get("visNode"),o=function(){n.refreshTree(r),s.setBirth(),s.parentInFront(),n.visBranchesFront(),s.animateUpdatedPosition(i,"bounce"),s.animateOutgoingEdges(r)};e.add(new f({closure:o,duration:Math.max(r,i)}))},c.prototype.overrideOpacityDepth2=function(e,t){t=t===undefined?1:t;var n={};return u.each(e,function(e,r){n[r]={},u.each(e,function(e,i){i=="opacity"?n[r][i]=t:n[r][i]=e})}),n},c.prototype.overrideOpacityDepth3=function(e,t){var n={};return u.each(e,function(e,r){n[r]=this.overrideOpacityDepth2(e,t)},this),n},c.prototype.genCommitBirthClosureFromSnapshot=function(e,t){var n=l.defaultAnimationTime*1,r=n*1.5,i=e.newCommit.get("visNode"),s=this.overrideOpacityDepth2(e.afterSnapshot[i.getID()]),o=this.overrideOpacityDepth3(e.afterSnapshot),u=function(){i.setBirthFromSnapshot(e.beforeSnapshot),i.parentInFront(),t.visBranchesFront(),i.animateToAttr(s,r,"bounce"),i.animateOutgoingEdgesToAttr(o,r)};return u},c.prototype.refreshTree=function(e,t){e.add(new f({closure:function(){t.refreshTree()}}))},c.prototype.rebaseAnimation=function(e,t,n,r){this.rebaseHighlightPart(e,t,n),this.rebaseBirthPart(e,t,n,r)},c.prototype.rebaseHighlightPart=function(e,t,n){var r=l.defaultAnimationTime*.66,i=r*2,s=t.toRebaseArray,o=t.destinationBranch.get("visBranch");o||(o=t.destinationBranch.get("visNode")),u.each(s,function(t){var n=t.get("visNode");e.add(new f({closure:function(){n.highlightTo(o,i,"easeInOut")},duration:r*1.5}))},this),this.delay(e,r*2)},c.prototype.rebaseBirthPart=function(e,t,n,r){var i=t.rebaseSteps,s=[];u.each(i,function(e){var t=e.newCommit.get("visNode");s.push(t),t.setOpacity(0),t.setOutgoingEdgesOpacity(0)},this);var o=[];u.each(i,function(t,n){var i=s.slice(n+1),u=this.genFromToSnapshotAnimation(t.beforeSnapshot,t.afterSnapshot,i,o,r),a=this.genCommitBirthClosureFromSnapshot(t,r),c=function(){u(),a()};e.add(new f({closure:c,duration:l.defaultAnimationTime*1.5})),o.push(t.newCommit.get("visNode"))},this),this.delay(e),this.refreshTree(e,r)},c.prototype.delay=function(e,t){t=t||l.defaultAnimationTime,e.add(new f({closure:function(){},duration:t}))},c.prototype.genSetAllCommitOpacities=function(e,t){var n=e.slice(0);return function(){u.each(n,function(e){e.setOpacity(t),e.setOutgoingEdgesOpacity(t)})}},c.prototype.stripObjectsFromSnapshot=function(e,t){var n=[];u.each(t,function(e){n.push(e.getID())});var r={};return u.each(e,function(e,t){if(u.include(n,t))return;r[t]=e},this),r},c.prototype.genFromToSnapshotAnimation=function(e,t,n,r,i){var s=[];u.each(n,function(e){s.push(e),s=s.concat(e.get("outgoingEdges"))});var o=function(e){if(!e)return;u.each(e,function(t,n){e[n].opacity=1})};return u.each([e,t],function(e){u.each(r,function(t){o(e[t.getID()]),u.each(t.get("outgoingEdges"),function(t){o(e[t.getID()])})})}),function(){i.animateAllFromAttrToAttr(e,t,s)}},n.AnimationFactory=c}),e.define("/src/js/visuals/animation/index.js",function(e,t,n,r,i,s,o){var u=e("underscore"),a=e("backbone"),f=e("../../util/constants").GLOBAL,l=a.Model.extend({defaults:{duration:300,closure:null},validateAtInit:function(){if(!this.get("closure"))throw new Error("give me a closure!")},initialize:function(e){this.validateAtInit()},run:function(){this.get("closure")()}}),c=a.Model.extend({defaults:{animations:null,index:0,callback:null,defer:!1},initialize:function(e){this.set("animations",[]),e.callback||console.warn("no callback")},add:function(e){if(!e instanceof l)throw new Error("Need animation not something else");this.get("animations").push(e)},start:function(){this.set("index",0),f.isAnimating=!0,this.next()},finish:function(){f.isAnimating=!1,this.get("callback")()},next:function(){var e=this.get("animations"),t=this.get("index");if(t>=e.length){this.finish();return}var n=e[t],r=n.get("duration");n.run(),this.set("index",t+1),setTimeout(u.bind(function(){this.next()},this),r)}});n.Animation=l,n.AnimationQueue=c}),e.define("/src/js/git/treeCompare.js",function(e,t,n,r,i,s,o){function a(){}var u=e("underscore");a.prototype.compareAllBranchesWithinTreesAndHEAD=function(e,t){return e=this.convertTreeSafe(e),t=this.convertTreeSafe(t),e.HEAD.target==t.HEAD.target&&this.compareAllBranchesWithinTrees(e,t)},a.prototype.compareAllBranchesWithinTrees=function(e,t){e=this.convertTreeSafe(e),t=this.convertTreeSafe(t);var n=u.extend({},e.branches,t.branches),r=!0;return u.uniq(n,function(n,i){r=r&&this.compareBranchWithinTrees(e,t,i)},this),r},a.prototype.compareBranchesWithinTrees=function(e,t,n){var r=!0;return u.each(n,function(n){r=r&&this.compareBranchWithinTrees(e,t,n)},this),r},a.prototype.getRecurseCompare=function(e,t){var n=function(r,i){var s=u.isEqual(r,i);return s?(u.each(r.parents,function(r,o){var u=i.parents[o],a=e.commits[r],f=t.commits[u];s=s&&n(a,f)},this),s):!1};return n},a.prototype.compareBranchWithinTrees=function(e,t,n){e=this.convertTreeSafe(e),t=this.convertTreeSafe(t),this.reduceTreeFields([e,t]);var r=this.getRecurseCompare(e,t),i=e.branches[n],s=t.branches[n];return u.isEqual(i,s)&&r(e.commits[i.target],t.commits[s.target])},a.prototype.convertTreeSafe=function(e){return typeof e=="string"?JSON.parse(unescape(e)):e},a.prototype.reduceTreeFields=function(e){var t=["parents","id","rootCommit"],n=["children","parents"],r=["target","id"],i=function(e,t,n,r){var i=e[t];u.each(i,function(i,s){var o={};u.each(n,function(e){i[e]!==undefined&&(o[e]=i[e])}),u.each(r,function(e){i[e]&&(i[e].sort(),o[e]=i[e])}),e[t][s]=o})};u.each(e,function(e){i(e,"commits",t,n),i(e,"branches",r),e.HEAD={target:e.HEAD.target,id:e.HEAD.id}})},a.prototype.compareTrees=function(e,t){return e=this.convertTreeSafe(e),t=this.convertTreeSafe(t),this.reduceTreeFields([e,t]),u.isEqual(e,t)},n.TreeCompare=a}),e.define("/src/js/views/rebaseView.js",function(e,t,n,r,i,s,o){var u=e("../util/errors").GitError,a=e("underscore"),f=e("q"),l=e("../util").isBrowser()?window.Backbone:e("backbone"),c=e("../views").ModalTerminal,h=e("../views").ContainedBase,p=e("../views").ConfirmCancelView,d=e("../views").LeftRightView,v=h.extend({tagName:"div",template:a.template($("#interactive-rebase-template").html()),initialize:function(e){this.deferred=e.deferred,this.rebaseMap={},this.entryObjMap={},this.rebaseEntries=new g,e.toRebase.reverse(),a.each(e.toRebase,function(e){var t=e.get("id");this.rebaseMap[t]=e,this.entryObjMap[t]=new m({id:t}),this.rebaseEntries.add(this.entryObjMap[t])},this),this.container=new c({title:"Interactive Rebase"}),this.render(),this.show()},confirm:function(){this.die();var e=[];this.$("ul.rebaseEntries li").each(function(t,n){e.push(n.id)});var t=[];a.each(e,function(e){this.entryObjMap[e].get("pick")&&t.unshift(this.rebaseMap[e])},this),t.reverse(),this.deferred.resolve(t),this.$el.html("")},render:function(){var e={num:a.keys(this.rebaseMap).length},t=this.container.getInsideElement();this.$el.html(this.template(e)),$(t).append(this.el);var n=this.$("ul.rebaseEntries");this.rebaseEntries.each(function(e){new y({el:n,model:e})},this),n.sortable({axis:"y",placeholder:"rebaseEntry transitionOpacity ui-state-highlight",appendTo:"parent"}),this.makeButtons()},makeButtons:function(){var e=f.defer();e.promise.then(a.bind(function(){this.confirm()},this)).fail(a.bind(function(){this.hide(),this.deferred.resolve([])},this)).done(),new p({destination:this.$(".confirmCancel"),deferred:e})}}),m=l.Model.extend({defaults:{pick:!0},toggle:function(){this.set("pick",!this.get("pick"))}}),g=l.Collection.extend({model:m}),y=l.View.extend({tagName:"li",template:a.template($("#interactive-rebase-entry-template").html()),toggle:function(){this.model.toggle(),this.listEntry.toggleClass("notPicked",!this.model.get("pick"))},initialize:function(e){this.render()},render:function(){var e=this.model.toJSON();this.$el.append(this.template(this.model.toJSON())),this.listEntry=this.$el.children(":last"),this.listEntry.delegate("#toggleButton","click",a.bind(function(){this.toggle()},this))}});n.InteractiveRebaseView=v}),e.define("/src/js/views/index.js",function(e,t,n,r,i,s,o){var u=e("underscore"),a=e("q"),f=e("../util").isBrowser()?window.Backbone:e("backbone"),l=e("../app"),c=e("../util/constants"),h=e("../util/keyboard").KeyboardListener,p=e("../util/errors").GitError,d=f.View.extend({getDestination:function(){return this.destination||this.container.getInsideElement()},tearDown:function(){this.$el.remove(),this.container&&this.container.tearDown()},renderAgain:function(e){e=e||this.template(this.JSON),this.$el.html(e)},render:function(e){this.renderAgain(e);var t=this.getDestination();$(t).append(this.el)}}),v=d.extend({resolve:function(){this.deferred.resolve()},reject:function(){this.deferred.reject()}}),m=d.extend({positive:function(){this.navEvents.trigger("positive")},negative:function(){this.navEvents.trigger("negative")}}),g=d.extend({getAnimationTime:function(){return 700},show:function(){this.container.show()},hide:function(){this.container.hide()},die:function(){this.hide(),setTimeout(u.bind(function(){this.tearDown()},this),this.getAnimationTime()*1.1)}}),y=g.extend({tagName:"a",className:"generalButton uiButton",template:u.template($("#general-button").html()),events:{click:"click"},initialize:function(e){e=e||{},this.navEvents=e.navEvents||u.clone(f.Events),this.destination=e.destination,this.destination||(this.container=new S),this.JSON={buttonText:e.buttonText||"General Button",wantsWrapper:e.wantsWrapper!==undefined?e.wantsWrapper:!0},this.render(),this.container&&!e.wait&&this.show()},click:function(){this.clickFunc||(this.clickFunc=u.throttle(u.bind(this.sendClick,this),500)),this.clickFunc()},sendClick:function(){this.navEvents.trigger("click")}}),b=v.extend({tagName:"div",className:"confirmCancelView box horizontal justify",template:u.template($("#confirm-cancel-template").html()),events:{"click .confirmButton":"resolve","click .cancelButton":"reject"},initialize:function(e){if(!e.destination)throw new Error("needmore");this.destination=e.destination,this.deferred=e.deferred||a.defer(),this.JSON={confirm:e.confirm||"Confirm",cancel:e.cancel||"Cancel"},this.render()}}),w=m.extend({tagName:"div",className:"leftRightView box horizontal center",template:u.template($("#left-right-template").html()),events:{"click .left":"negative","click .right":"positive"},positive:function(){this.pipeEvents.trigger("positive"),w.__super__.positive.apply(this)},negative:function(){this.pipeEvents.trigger("negative"),w.__super__.negative.apply(this)},initialize:function(e){if(!e.destination||!e.events)throw new Error("needmore");this.destination=e.destination,this.pipeEvents=e.events,this.navEvents=u.clone(f.Events),this.JSON={showLeft:e.showLeft===undefined?!0:e.showLeft,lastNav:e.lastNav===undefined?!1:e.lastNav},this.render()}}),E=f.View.extend({tagName:"div",className:"modalView box horizontal center transitionOpacityLinear",template:u.template($("#modal-view-template").html()),getAnimationTime:function(){return 700},initialize:function(e){this.shown=!1,this.render()},render:function(){this.$el.html(this.template({})),$("body").append(this.el)},stealKeyboard:function(){l.getEventBaton().stealBaton("keydown",this.onKeyDown,this),l.getEventBaton().stealBaton("keyup",this.onKeyUp,this),l.getEventBaton().stealBaton("windowFocus",this.onWindowFocus,this),l.getEventBaton().stealBaton("documentClick",this.onDocumentClick,this),$("#commandTextField").blur()},releaseKeyboard:function(){l.getEventBaton().releaseBaton("keydown",this.onKeyDown,this),l.getEventBaton().releaseBaton("keyup",this.onKeyUp,this),l.getEventBaton().releaseBaton("windowFocus",this.onWindowFocus,this),l.getEventBaton().releaseBaton("documentClick",this.onDocumentClick,this),l.getEventBaton().trigger("windowFocus")},onWindowFocus:function(e){},onDocumentClick:function(e){},onKeyDown:function(e){e.preventDefault()},onKeyUp:function(e){e.preventDefault()},show:function(){this.toggleZ(!0),s.nextTick(u.bind(function(){this.toggleShow(!0)},this))},hide:function(){this.toggleShow(!1),setTimeout(u.bind(function(){this.shown||this.toggleZ(!1)},this),this.getAnimationTime())},getInsideElement:function(){return this.$(".contentHolder")},toggleShow:function(e){if(this.shown===e)return;e?this.stealKeyboard():this.releaseKeyboard(),this.shown=e,this.$el.toggleClass("show",e)},toggleZ:function(e){this.$el.toggleClass("inFront",e)},tearDown:function(){this.$el.html(""),$("body")[0].removeChild(this.el)}}),S=g.extend({tagName:"div",className:"modalTerminal box flex1",template:u.template($("#terminal-window-template").html()),events:{"click div.inside":"onClick"},initialize:function(e){e=e||{},this.navEvents=e.events||u.clone(f.Events),this.container=new E,this.JSON={title:e.title||"Heed This Warning!"},this.render()},onClick:function(){this.navEvents.trigger("click")},getInsideElement:function(){return this.$(".inside")}}),x=g.extend({tagName:"div",template:u.template($("#modal-alert-template").html()),initialize:function(e){e=e||{},this.JSON={title:e.title||"Something to say",text:e.text||"Here is a paragraph",markdown:e.markdown},e.markdowns&&(this.JSON.markdown=e.markdowns.join("\n")),this.container=new S({title:"Alert!"}),this.render(),e.wait||this.show()},render:function(){var t=this.JSON.markdown?e("markdown").markdown.toHTML(this.JSON.markdown):this.template(this.JSON);x.__super__.render.apply(this,[t])}}),T=f.View.extend({initialize:function(e){e=e||{},this.deferred=e.deferred||a.defer(),this.modalAlert=new x(u.extend({},{markdown:"#you sure?"},e));var t=a.defer();this.buttonDefer=t,this.confirmCancel=new b({deferred:t,destination:this.modalAlert.getDestination()}),t.promise.then(this.deferred.resolve).fail(this.deferred.reject).done(u.bind(function(){this.close()},this)),this.navEvents=u.clone(f.Events),this.navEvents.on("positive",this.positive,this),this.navEvents.on("negative",this.negative,this),this.keyboardListener=new h({events:this.navEvents,aliasMap:{enter:"positive",esc:"negative"}}),e.wait||this.modalAlert.show()},positive:function(){this.buttonDefer.resolve()},negative:function(){this.buttonDefer.reject()},getAnimationTime:function(){return 700},show:function(){this.modalAlert.show()},hide:function(){this.modalAlert.hide()},getPromise:function(){return this.deferred.promise},close:function(){this.keyboardListener.mute(),this.modalAlert.die()}}),N=T.extend({initialize:function(e){e=e||{};var t=e.nextLevel?e.nextLevel.name:"",n=["## Great Job!!","","You solved the level in **"+e.numCommands+"** command(s); ","our solution uses "+e.best+". "];e.numCommands<=e.best?n.push("Awesome! You matched or exceeded our solution. "):n.push("See if you can whittle it down to "+e.best+" command(s) :D "),e.nextLevel?n=n.concat(["",'Would you like to move onto "'+t+'", the next level?']):n=n.concat(["","Wow!!! You finished the last level, congratulations!"]),e=u.extend({},e,{markdowns:n}),N.__super__.initialize.apply(this,[e])}}),C=f.View.extend({initialize:function(e){this.grabBatons(),this.modalAlert=new x({markdowns:this.markdowns}),this.modalAlert.show()},grabBatons:function(){l.getEventBaton().stealBaton(this.eventBatonName,this.batonFired,this)},releaseBatons:function(){l.getEventBaton().releaseBaton(this.eventBatonName,this.batonFired,this)},finish:function(){this.releaseBatons(),this.modalAlert.die()}}),k=C.extend({initialize:function(e){this.eventBatonName="windowSizeCheck",this.markdowns=["## That window size is not supported :-/","Please resize your window back to a supported size","","(and of course, pull requests to fix this are appreciated :D)"],k.__super__.initialize.apply(this,[e])},batonFired:function(e){e.w>c.VIEWPORT.minWidth&&e.h>c.VIEWPORT.minHeight&&this.finish()}}),L=C.extend({initialize:function(e){if(!e||!e.level)throw new Error("need level");this.eventBatonName="zoomChange",this.markdowns=["## That zoom level of "+e.level+" is not supported :-/","Please zoom back to a supported zoom level with Ctrl + and Ctrl -","","(and of course, pull requests to fix this are appreciated :D)"],L.__super__.initialize.apply(this,[e])},batonFired:function(e){e<=c.VIEWPORT.maxZoom&&e>=c.VIEWPORT.minZoom&&this.finish()}}),A=d.extend({tagName:"div",className:"levelToolbarHolder",template:u.template($("#level-toolbar-template").html()),initialize:function(e){e=e||{},this.JSON={name:e.name||"Some level! (unknown name)"},this.beforeDestination=$($("#commandLineHistory div.toolbar")[0]),this.render(),e.wait||s.nextTick(u.bind(this.show,this))},getAnimationTime:function(){return 700},render:function(){var e=this.template(this.JSON);this.$el.html(e),this.beforeDestination.after(this.el)},die:function(){this.hide(),setTimeout(u.bind(function(){this.tearDown()},this),this.getAnimationTime())},hide:function(){this.$("div.toolbar").toggleClass("hidden",!0)},show:function(){this.$("div.toolbar").toggleClass("hidden",!1)}}),O=d.extend({tagName:"div",className:"canvasTerminalHolder box flex1",template:u.template($("#terminal-window-bare-template").html()),events:{"click div.wrapper":"onClick"},initialize:function(e){e=e||{},this.destination=$("body"),this.JSON={title:e.title||"Goal To Reach",text:e.text||'You can hide this window with "hide goal"'},this.render(),e.additionalClass&&this.$el.addClass(e.additionalClass)},getAnimationTime:function(){return 700},onClick:function(){this.slideOut()},die:function(){this.slideOut(),setTimeout(u.bind(function(){this.tearDown()},this))},slideOut:function(){this.slideToggle(!0)},slideIn:function(){this.slideToggle(!1)},slideToggle:function(e){this.$("div.terminal-window-holder").toggleClass("slideOut",e)},getCanvasLocation:function(){return this.$("div.inside")[0]}});n.BaseView=d,n.GeneralButton=y,n.ModalView=E,n.ModalTerminal=S,n.ModalAlert=x,n.ContainedBase=g,n.ConfirmCancelView=b,n.LeftRightView=w,n.ZoomAlertWindow=L,n.ConfirmCancelTerminal=T,n.WindowSizeAlertWindow=k,n.CanvasTerminalHolder=O,n.LevelToolbar=A,n.NextLevelConfirm=N}),e.define("/src/js/util/keyboard.js",function(e,t,n,r,i,s,o){function c(e){this.events=e.events||u.clone(a.Events),this.aliasMap=e.aliasMap||{},e.wait||this.listen()}var u=e("underscore"),a=e("backbone"),f=e("../app"),l=function(e){var t={37:"left",38:"up",39:"right",40:"down",27:"esc",13:"enter"};return t[e]};c.prototype.listen=function(){if(this.listening)return;this.listening=!0,f.getEventBaton().stealBaton("docKeydown",this.keydown,this)},c.prototype.mute=function(){this.listening=!1,f.getEventBaton().releaseBaton("docKeydown",this.keydown,this)},c.prototype.keydown=function(e){var t=e.which||e.keyCode,n=l(t);if(n===undefined)return;this.fireEvent(n,e)},c.prototype.fireEvent=function(e,t){e=this.aliasMap[e]||e,this.events.trigger(e,t)},c.prototype.passEventBack=function(e){f.getEventBaton().passBatonBackSoft("docKeydown",this.keydown,this,[e])},n.KeyboardListener=c,n.mapKeycodeToKey=l}),e.define("/node_modules/markdown/package.json",function(e,t,n,r,i,s,o){t.exports={main:"./lib/index.js"}}),e.define("/node_modules/markdown/lib/index.js",function(e,t,n,r,i,s,o){n.markdown=e("./markdown"),n.parse=n.markdown.toHTML}),e.define("/node_modules/markdown/lib/markdown.js",function(e,t,n,r,i,s,o){(function(t){function r(){return"Markdown.mk_block( "+uneval(this.toString())+", "+uneval(this.trailing)+", "+uneval(this.lineNumber)+" )"}function i(){var t=e("util");return"Markdown.mk_block( "+t.inspect(this.toString())+", "+t.inspect(this.trailing)+", "+t.inspect(this.lineNumber)+" )"}function o(e){var t=0,n=-1;while((n=e.indexOf("\n",n+1))!==-1)t++;return t}function u(e,t){function i(e){this.len_after=e,this.name="close_"+t}var n=e+"_state",r=e=="strong"?"em_state":"strong_state";return function(s,o){if(this[n][0]==t)return this[n].shift(),[s.length,new i(s.length-t.length)];var u=this[r].slice(),a=this[n].slice();this[n].unshift(t);var f=this.processInline(s.substr(t.length)),l=f[f.length-1],c=this[n].shift();if(l instanceof i){f.pop();var h=s.length-l.len_after;return[h,[e].concat(f)]}return this[r]=u,this[n]=a,[t.length,t]}}function f(e){var t=e.split(""),n=[""],r=!1;while(t.length){var i=t.shift();switch(i){case" ":r?n[n.length-1]+=i:n.push("");break;case"'":case'"':r=!r;break;case"\\":i=t.shift();default:n[n.length-1]+=i}}return n}function h(e){return l(e)&&e.length>1&&typeof e[1]=="object"&&!l(e[1])?e[1]:undefined}function d(e){return e.replace(/&/g,"&").replace(//g,">").replace(/"/g,""").replace(/'/g,"'")}function v(e){if(typeof e=="string")return d(e);var t=e.shift(),n={},r=[];e.length&&typeof e[0]=="object"&&!(e[0]instanceof Array)&&(n=e.shift());while(e.length)r.push(arguments.callee(e.shift()));var i="";for(var s in n)i+=" "+s+'="'+d(n[s])+'"';return t=="img"||t=="br"||t=="hr"?"<"+t+i+"/>":"<"+t+i+">"+r.join("")+""+t+">"}function m(e,t,n){var r;n=n||{};var i=e.slice(0);typeof n.preprocessTreeNode=="function"&&(i=n.preprocessTreeNode(i,t));var s=h(i);if(s){i[1]={};for(r in s)i[1][r]=s[r];s=i[1]}if(typeof i=="string")return i;switch(i[0]){case"header":i[0]="h"+i[1].level,delete i[1].level;break;case"bulletlist":i[0]="ul";break;case"numberlist":i[0]="ol";break;case"listitem":i[0]="li";break;case"para":i[0]="p";break;case"markdown":i[0]="html",s&&delete s.references;break;case"code_block":i[0]="pre",r=s?2:1;var o=["code"];o.push.apply(o,i.splice(r)),i[r]=o;break;case"inlinecode":i[0]="code";break;case"img":i[1].src=i[1].href,delete i[1].href;break;case"linebreak":i[0]="br";break;case"link":i[0]="a";break;case"link_ref":i[0]="a";var u=t[s.ref];if(!u)return s.original;delete s.ref,s.href=u.href,u.title&&(s.title=u.title),delete s.original;break;case"img_ref":i[0]="img";var u=t[s.ref];if(!u)return s.original;delete s.ref,s.src=u.href,u.title&&(s.title=u.title),delete s.original}r=1;if(s){for(var a in i[1])r=2;r===1&&i.splice(r,1)}for(;r0&&!l(o[0]))&&this.debug(i[s],"didn't return a proper array"),o}return[]},n.prototype.processInline=function(t){return this.dialect.inline.__call__.call(this,String(t))},n.prototype.toTree=function(t,n){var r=t instanceof Array?t:this.split_blocks(t),i=this.tree;try{this.tree=n||this.tree||["markdown"];e:while(r.length){var s=this.processBlock(r.shift(),r);if(!s.length)continue e;this.tree.push.apply(this.tree,s)}return this.tree}finally{n&&(this.tree=i)}},n.prototype.debug=function(){var e=Array.prototype.slice.call(arguments);e.unshift(this.debug_indent),typeof print!="undefined"&&print.apply(print,e),typeof console!="undefined"&&typeof console.log!="undefined"&&console.log.apply(null,e)},n.prototype.loop_re_over_block=function(e,t,n){var r,i=t.valueOf();while(i.length&&(r=e.exec(i))!=null)i=i.substr(r[0].length),n.call(this,r);return i},n.dialects={},n.dialects.Gruber={block:{atxHeader:function(t,n){var r=t.match(/^(#{1,6})\s*(.*?)\s*#*\s*(?:\n|$)/);if(!r)return undefined;var i=["header",{level:r[1].length}];return Array.prototype.push.apply(i,this.processInline(r[2])),r[0].length1&&n.unshift(r);for(var s=0;s1&&typeof i[i.length-1]=="string"?i[i.length-1]+=o:i.push(o)}}function f(e,t){var n=new RegExp("^("+i+"{"+e+"}.*?\\n?)*$"),r=new RegExp("^"+i+"{"+e+"}","gm"),o=[];while(t.length>0){if(n.exec(t[0])){var u=t.shift(),a=u.replace(r,"");o.push(s(a,u.trailing,u.lineNumber))}break}return o}function l(e,t,n){var r=e.list,i=r[r.length-1];if(i[1]instanceof Array&&i[1][0]=="para")return;if(t+1==n.length)i.push(["para"].concat(i.splice(1)));else{var s=i.pop();i.push(["para"].concat(i.splice(1)),s)}}var e="[*+-]|\\d+\\.",t=/[*+-]/,n=/\d+\./,r=new RegExp("^( {0,3})("+e+")[ ]+"),i="(?: {0,3}\\t| {4})";return function(e,n){function s(e){var n=t.exec(e[2])?["bulletlist"]:["numberlist"];return h.push({list:n,indent:e[1]}),n}var i=e.match(r);if(!i)return undefined;var h=[],p=s(i),d,v=!1,m=[h[0].list],g;e:for(;;){var y=e.split(/(?=\n)/),b="";for(var w=0;wh.length)p=s(i),d.push(p),d=p[1]=["listitem"];else{var N=!1;for(g=0;gi[0].length&&(b+=E+S.substr(i[0].length))}b.length&&(a(d,v,this.processInline(b),E),v=!1,b="");var C=f(h.length,n);C.length>0&&(c(h,l,this),d.push.apply(d,this.toTree(C,[])));var k=n[0]&&n[0].valueOf()||"";if(k.match(r)||k.match(/^ /)){e=n.shift();var L=this.dialect.block.horizRule(e,n);if(L){m.push.apply(m,L);break}c(h,l,this),v=!0;continue e}break}return m}}(),blockquote:function(t,n){if(!t.match(/^>/m))return undefined;var r=[];if(t[0]!=">"){var i=t.split(/\n/),s=[];while(i.length&&i[0][0]!=">")s.push(i.shift());t=i.join("\n"),r.push.apply(r,this.processBlock(s.join("\n"),[]))}while(n.length&&n[0][0]==">"){var o=n.shift();t=new String(t+t.trailing+o),t.trailing=o.trailing}var u=t.replace(/^> ?/gm,""),a=this.tree;return r.push(this.toTree(u,["blockquote"])),r},referenceDefn:function(t,n){var r=/^\s*\[(.*?)\]:\s*(\S+)(?:\s+(?:(['"])(.*?)\3|\((.*?)\)))?\n?/;if(!t.match(r))return undefined;h(this.tree)||this.tree.splice(1,0,{});var i=h(this.tree);i.references===undefined&&(i.references={});var o=this.loop_re_over_block(r,t,function(e){e[2]&&e[2][0]=="<"&&e[2][e[2].length-1]==">"&&(e[2]=e[2].substring(1,e[2].length-1));var t=i.references[e[1].toLowerCase()]={href:e[2]};e[4]!==undefined?t.title=e[4]:e[5]!==undefined&&(t.title=e[5])});return o.length&&n.unshift(s(o,t.trailing)),[]},para:function(t,n){return[["para"].concat(this.processInline(t))]}}},n.dialects.Gruber.inline={__oneElement__:function(t,n,r){var i,s,o=0;n=n||this.dialect.inline.__patterns__;var u=new RegExp("([\\s\\S]*?)("+(n.source||n)+")");i=u.exec(t);if(!i)return[t.length,t];if(i[1])return[i[1].length,i[1]];var s;return i[2]in this.dialect.inline&&(s=this.dialect.inline[i[2]].call(this,t.substr(i.index),i,r||[])),s=s||[i[2].length,i[2]],s},__call__:function(t,n){function s(e){typeof e=="string"&&typeof r[r.length-1]=="string"?r[r.length-1]+=e:r.push(e)}var r=[],i;while(t.length>0)i=this.dialect.inline.__oneElement__.call(this,t,n,r),t=t.substr(i.shift()),c(i,s);return r},"]":function(){},"}":function(){},"\\":function(t){return t.match(/^\\[\\`\*_{}\[\]()#\+.!\-]/)?[2,t[1]]:[1,"\\"]},"![":function(t){var n=t.match(/^!\[(.*?)\][ \t]*\([ \t]*(\S*)(?:[ \t]+(["'])(.*?)\3)?[ \t]*\)/);if(n){n[2]&&n[2][0]=="<"&&n[2][n[2].length-1]==">"&&(n[2]=n[2].substring(1,n[2].length-1)),n[2]=this.dialect.inline.__call__.call(this,n[2],/\\/)[0];var r={alt:n[1],href:n[2]||""};return n[4]!==undefined&&(r.title=n[4]),[n[0].length,["img",r]]}return n=t.match(/^!\[(.*?)\][ \t]*\[(.*?)\]/),n?[n[0].length,["img_ref",{alt:n[1],ref:n[2].toLowerCase(),original:n[0]}]]:[2,"!["]},"[":function b(e){var t=String(e),r=n.DialectHelpers.inline_until_char.call(this,e.substr(1),"]");if(!r)return[1,"["];var i=1+r[0],s=r[1],b,o;e=e.substr(i);var u=e.match(/^\s*\([ \t]*(\S+)(?:[ \t]+(["'])(.*?)\2)?[ \t]*\)/);if(u){var a=u[1];i+=u[0].length,a&&a[0]=="<"&&a[a.length-1]==">"&&(a=a.substring(1,a.length-1));if(!u[3]){var f=1;for(var l=0;l]+)|(.*?@.*?\.[a-zA-Z]+))>/))!=null?n[3]?[n[0].length,["link",{href:"mailto:"+n[3]},n[3]]]:n[2]=="mailto"?[n[0].length,["link",{href:n[1]},n[1].substr("mailto:".length)]]:[n[0].length,["link",{href:n[1]},n[1]]]:[1,"<"]},"`":function(t){var n=t.match(/(`+)(([\s\S]*?)\1)/);return n&&n[2]?[n[1].length+n[2].length,["inlinecode",n[3]]]:[1,"`"]}," \n":function(t){return[3,["linebreak"]]}},n.dialects.Gruber.inline["**"]=u("strong","**"),n.dialects.Gruber.inline.__=u("strong","__"),n.dialects.Gruber.inline["*"]=u("em","*"),n.dialects.Gruber.inline._=u("em","_"),n.buildBlockOrder=function(e){var t=[];for(var n in e){if(n=="__order__"||n=="__call__")continue;t.push(n)}e.__order__=t},n.buildInlinePatterns=function(e){var t=[];for(var n in e){if(n.match(/^__.*__$/))continue;var r=n.replace(/([\\.*+?|()\[\]{}])/g,"\\$1").replace(/\n/,"\\n");t.push(n.length==1?r:"(?:"+r+")")}t=t.join("|"),e.__patterns__=t;var i=e.__call__;e.__call__=function(e,n){return n!=undefined?i.call(this,e,n):i.call(this,e,t)}},n.DialectHelpers={},n.DialectHelpers.inline_until_char=function(e,t){var n=0,r=[];for(;;){if(e[n]==t)return n++,[n,r];if(n>=e.length)return null;res=this.dialect.inline.__oneElement__.call(this,e.substr(n)),n+=res[0],r.push.apply(r,res.slice(1))}},n.subclassDialect=function(e){function t(){}function n(){}return t.prototype=e.block,n.prototype=e.inline,{block:new t,inline:new n}},n.buildBlockOrder(n.dialects.Gruber.block),n.buildInlinePatterns(n.dialects.Gruber.inline),n.dialects.Maruku=n.subclassDialect(n.dialects.Gruber),n.dialects.Maruku.processMetaHash=function(t){var n=f(t),r={};for(var i=0;i1)return undefined;if(!t.match(/^(?:\w+:.*\n)*\w+:.*$/))return undefined;h(this.tree)||this.tree.splice(1,0,{});var r=t.split(/\n/);for(p in r){var i=r[p].match(/(\w+):\s*(.*)$/),s=i[1].toLowerCase(),o=i[2];this.tree[1][s]=o}return[]},n.dialects.Maruku.block.block_meta=function(t,n){var r=t.match(/(^|\n) {0,3}\{:\s*((?:\\\}|[^\}])*)\s*\}$/);if(!r)return undefined;var i=this.dialect.processMetaHash(r[2]),s;if(r[1]===""){var o=this.tree[this.tree.length-1];s=h(o);if(typeof o=="string")return undefined;s||(s={},o.splice(1,0,s));for(a in i)s[a]=i[a];return[]}var u=t.replace(/\n.*$/,""),f=this.processBlock(u,[]);s=h(f[0]),s||(s={},f[0].splice(1,0,s));for(a in i)s[a]=i[a];return f},n.dialects.Maruku.block.definition_list=function(t,n){var r=/^((?:[^\s:].*\n)+):\s+([\s\S]+)$/,i=["dl"],s;if(!(a=t.match(r)))return undefined;var o=[t];while(n.length&&r.exec(n[0]))o.push(n.shift());for(var u=0;u-1&&(a(e)?i=i.split("\n").map(function(e){return" "+e}).join("\n").substr(2):i="\n"+i.split("\n").map(function(e){return" "+e}).join("\n"))):i=o("[Circular]","special"));if(typeof n=="undefined"){if(g==="Array"&&t.match(/^\d+$/))return i;n=JSON.stringify(""+t),n.match(/^"([a-zA-Z_][a-zA-Z_0-9]*)"$/)?(n=n.substr(1,n.length-2),n=o(n,"name")):(n=n.replace(/'/g,"\\'").replace(/\\"/g,'"').replace(/(^"|"$)/g,"'"),n=o(n,"string"))}return n+": "+i});s.pop();var E=0,S=w.reduce(function(e,t){return E++,t.indexOf("\n")>=0&&E++,e+t.length+1},0);return S>50?w=y[0]+(m===""?"":m+"\n ")+" "+w.join(",\n ")+" "+y[1]:w=y[0]+m+" "+w.join(", ")+" "+y[1],w}var s=[],o=function(e,t){var n={bold:[1,22],italic:[3,23],underline:[4,24],inverse:[7,27],white:[37,39],grey:[90,39],black:[30,39],blue:[34,39],cyan:[36,39],green:[32,39],magenta:[35,39],red:[31,39],yellow:[33,39]},r={special:"cyan",number:"blue","boolean":"yellow","undefined":"grey","null":"bold",string:"green",date:"magenta",regexp:"red"}[t];return r?"["+n[r][0]+"m"+e+"["+n[r][1]+"m":e};return i||(o=function(e,t){return e}),u(e,typeof r=="undefined"?2:r)};var h=["Jan","Feb","Mar","Apr","May","Jun","Jul","Aug","Sep","Oct","Nov","Dec"];n.log=function(e){},n.pump=null;var d=Object.keys||function(e){var t=[];for(var n in e)t.push(n);return t},v=Object.getOwnPropertyNames||function(e){var t=[];for(var n in e)Object.hasOwnProperty.call(e,n)&&t.push(n);return t},m=Object.create||function(e,t){var n;if(e===null)n={__proto__:null};else{if(typeof e!="object")throw new TypeError("typeof prototype["+typeof e+"] != 'object'");var r=function(){};r.prototype=e,n=new r,n.__proto__=e}return typeof t!="undefined"&&Object.defineProperties&&Object.defineProperties(n,t),n};n.inherits=function(e,t){e.super_=t,e.prototype=m(t.prototype,{constructor:{value:e,enumerable:!1,writable:!0,configurable:!0}})};var g=/%[sdj%]/g;n.format=function(e){if(typeof e!="string"){var t=[];for(var r=0;r=s)return e;switch(e){case"%s":return String(i[r++]);case"%d":return Number(i[r++]);case"%j":return JSON.stringify(i[r++]);default:return e}});for(var u=i[r];r0&&this._events[e].length>n&&(this._events[e].warned=!0,console.error("(node) warning: possible EventEmitter memory leak detected. %d listeners added. Use emitter.setMaxListeners() to increase limit.",this._events[e].length),console.trace())}this._events[e].push(t)}else this._events[e]=[this._events[e],t];return this},u.prototype.on=u.prototype.addListener,u.prototype.once=function(e,t){var n=this;return n.on(e,function r(){n.removeListener(e,r),t.apply(this,arguments)}),this},u.prototype.removeListener=function(e,t){if("function"!=typeof t)throw new Error("removeListener only takes instances of Function");if(!this._events||!this._events[e])return this;var n=this._events[e];if(a(n)){var r=f(n,t);if(r<0)return this;n.splice(r,1),n.length==0&&delete this._events[e]}else this._events[e]===t&&delete this._events[e];return this},u.prototype.removeAllListeners=function(e){return e&&this._events&&this._events[e]&&(this._events[e]=null),this},u.prototype.listeners=function(e){return this._events||(this._events={}),this._events[e]||(this._events[e]=[]),a(this._events[e])||(this._events[e]=[this._events[e]]),this._events[e]}}),e.define("/src/js/models/commandModel.js",function(e,t,n,r,i,s,o){var u=e("underscore"),a=e("../util").isBrowser()?a=window.Backbone:a=e("backbone"),f=e("../util/errors"),l=e("../git/commands"),c=l.GitOptionParser,h=e("../level/parseWaterfall").ParseWaterfall,p=f.CommandProcessError,d=f.GitError,v=f.Warning,m=f.CommandResult,g=a.Model.extend({defaults:{status:"inqueue",rawStr:null,result:"",createTime:null,error:null,warnings:null,parseWaterfall:new h,generalArgs:null,supportedMap:null,options:null,method:null},initialize:function(e){this.initDefaults(),this.validateAtInit(),this.on("change:error",this.errorChanged,this),this.get("error")&&this.errorChanged(),this.parseOrCatch()},initDefaults:function(){this.set("generalArgs",[]),this.set("supportedMap",{}),this.set("warnings",[])},validateAtInit:function(){if(this.get("rawStr")===null)throw new Error("Give me a string!");this.get("createTime")||this.set("createTime",(new Date).toString())},setResult:function(e){this.set("result",e)},finishWith:function(e){this.set("status","finished"),e.resolve()},addWarning:function(e){this.get("warnings").push(e),this.set("numWarnings",this.get("numWarnings")?this.get("numWarnings")+1:1)},getFormattedWarnings:function(){if(!this.get("warnings").length)return"";var e='';return""+e+this.get("warnings").join("
"+e)+"
"},parseOrCatch:function(){this.expandShortcuts(this.get("rawStr"));try{this.processInstants()}catch(e){f.filterError(e),this.set("error",e);return}if(this.parseAll())return;this.set("error",new p({msg:'The command "'+this.get("rawStr")+"\" isn't supported, sorry!"}))},errorChanged:function(){var e=this.get("error");e instanceof p||e instanceof d?this.set("status","error"):e instanceof m?this.set("status","finished"):e instanceof v&&this.set("status","warning"),this.formatError()},formatError:function(){this.set("result",this.get("error").toResult())},expandShortcuts:function(e){e=this.get("parseWaterfall").expandAllShortcuts(e),this.set("rawStr",e)},processInstants:function(){var e=this.get("rawStr");if(!e.length)throw new m({msg:""});this.get("parseWaterfall").processAllInstants(e)},parseAll:function(){var e=this.get("rawStr"),t=this.get("parseWaterfall").parseAll(e);return t?(u.each(t.toSet,function(e,t){this.set(t,e)},this),!0):!1}}),y=a.Model.extend({defaults:{text:""}});n.CommandEntry=y,n.Command=g}),e.define("/src/js/git/commands.js",function(e,t,n,r,i,s,o){function g(e,t){this.method=e,this.rawOptions=t,this.supportedMap=this.getMasterOptionMap()[e];if(this.supportedMap===undefined)throw new Error("No option map for "+e);this.generalArgs=[],this.explodeAndSet()}var u=e("underscore"),a=e("../util/errors"),f=a.CommandProcessError,l=a.GitError,c=a.Warning,h=a.CommandResult,p={"git commit":/^(gc|git ci)($|\s)/,"git add":/^ga($|\s)/,"git checkout":/^(go|git co)($|\s)/,"git rebase":/^gr($|\s)/,"git branch":/^(gb|git br)($|\s)/,"git status":/^(gst|gs|git st)($|\s)/,"git help":/^git$/},d=[[/^git help($|\s)/,function(){var e=["Git Version PCOTTLE.1.0","
","Usage:",u.escape(" git []"),"
","Supported commands:","
"],t=g.prototype.getMasterOptionMap();u.each(t,function(t,n){e.push("git "+n),u.each(t,function(t,n){e.push(" "+n)},this)},this);var n=e.join("\n");throw n=n.replace(/\t/g," "),new h({msg:n})}]],v={"git commit":/^git commit($|\s)/,"git add":/^git add($|\s)/,"git checkout":/^git checkout($|\s)/,"git rebase":/^git rebase($|\s)/,"git reset":/^git reset($|\s)/,"git branch":/^git branch($|\s)/,"git revert":/^git revert($|\s)/,"git log":/^git log($|\s)/,"git merge":/^git merge($|\s)/,"git show":/^git show($|\s)/,"git status":/^git status($|\s)/,"git cherry-pick":/^git cherry-pick($|\s)/},m=function(e){var t,n;u.each(v,function(r,i){r.exec(e)&&(n=e.slice(i.length+1),t=i.slice("git ".length))});if(!t)return!1;var r=new g(t,n);return{toSet:{generalArgs:r.generalArgs,supportedMap:r.supportedMap,method:t,options:n,eventName:"processGitCommand"}}};g.prototype.getMasterOptionMap=function(){return{commit:{"--amend":!1,"-a":!1,"-am":!1,"-m":!1},status:{},log:{},add:{},"cherry-pick":{},branch:{"-d":!1,"-D":!1,"-f":!1,"--contains":!1},checkout:{"-b":!1,"-B":!1,"-":!1},reset:{"--hard":!1,"--soft":!1},merge:{},rebase:{"-i":!1},revert:{},show:{}}},g.prototype.explodeAndSet=function(){var e=this.rawOptions.match(/('.*?'|".*?"|\S+)/g)||[];for(var t=0;t p.uiButton":"positive"},initialize:function(t){t=t||{},this.options=t,this.JSON=u.extend({beforeMarkdowns:["## Git Commits","","Awesome!"],command:"git commit",afterMarkdowns:["Now you have seen it in action","","Go ahead and try the level!"]},t);var n=function(t){return e("markdown").markdown.toHTML(t.join("\n"))};this.JSON.beforeHTML=n(this.JSON.beforeMarkdowns),this.JSON.afterHTML=n(this.JSON.afterMarkdowns),this.container=new p({title:t.title||"Git Demonstration"}),this.render(),this.checkScroll(),this.navEvents=u.clone(f.Events),this.navEvents.on("positive",this.positive,this),this.navEvents.on("negative",this.negative,this),this.keyboardListener=new c({events:this.navEvents,aliasMap:{enter:"positive",right:"positive",left:"negative"},wait:!0}),this.visFinished=!1,this.initVis(),t.wait||this.show()},receiveMetaNav:function(e,t){var n=this;e.navEvents.on("positive",this.positive,this),this.metaContainerView=t},checkScroll:function(){var e=this.$("div.demonstrationText").children(),t=u.map(e,function(e){return e.clientHeight}),n=u.reduce(t,function(e,t){return e+t});n15&&console.warn("graphics are degrading from too many layers");var t=this.getDepthIncrement(e);u.each(this.visNodeMap,function(e){e.setDepthBasedOn(t)},this)},w.prototype.animateNodePositions=function(e){u.each(this.visNodeMap,function(t){t.animateUpdatedPosition(e)},this)},w.prototype.addBranchFromEvent=function(e,t,n){var r=u.bind(function(){this.addBranch(e)},this);!this.gitEngine||!this.gitReady?this.defer(r):r()},w.prototype.addBranch=function(e){var t=new m({branch:e,gitVisuals:this,gitEngine:this.gitEngine});this.visBranchCollection.add(t),this.gitReady?t.genGraphics(this.paper):this.defer(u.bind(function(){t.genGraphics(this.paper)},this))},w.prototype.removeVisBranch=function(e){this.visBranchCollection.remove(e)},w.prototype.removeVisNode=function(e){this.visNodeMap[e.getID()]=undefined},w.prototype.removeVisEdge=function(e){this.visEdgeCollection.remove(e)},w.prototype.animateRefs=function(e){this.visBranchCollection.each(function(t){t.animateUpdatedPos(e)},this)},w.prototype.animateEdges=function(e){this.visEdgeCollection.each(function(t){t.animateUpdatedPath(e)},this)},w.prototype.getMinLayers=function(){return this.options.smallCanvas?4:7},w.prototype.getDepthIncrement=function(e){e=Math.max(e,this.getMinLayers());var t=1/e;return t},w.prototype.calcDepthRecursive=function(e,t){e.get("visNode").setDepth(t);var n=e.get("children"),r=t;return u.each(n,function(e){var n=this.calcDepthRecursive(e,t+1);r=Math.max(n,r)},this),r},w.prototype.canvasResize=function(e,t){this.resizeFunc||this.genResizeFunc(),this.resizeFunc(e,t)},w.prototype.genResizeFunc=function(){this.resizeFunc=u.debounce(u.bind(function(t,n){if(c.isAnimating){var r=e("../app");r.getEventBaton().trigger("commandSubmitted","refresh")}else this.refreshTree()},this),200,!0)},w.prototype.addNode=function(e,t){this.commitMap[e]=t,t.get("rootCommit")&&(this.rootCommit=t);var n=new v({id:e,commit:t,gitVisuals:this,gitEngine:this.gitEngine});return this.visNodeMap[e]=n,this.gitReady&&n.genGraphics(this.paper),n},w.prototype.addEdge=function(e,t){var n=this.visNodeMap[e],r=this.visNodeMap[t];if(!n||!r)throw new Error("one of the ids in ("+e+", "+t+") does not exist");var i=new y({tail:n,head:r,gitVisuals:this,gitEngine:this.gitEngine});this.visEdgeCollection.add(i),this.gitReady&&i.genGraphics(this.paper)},w.prototype.zIndexReflow=function(){this.visNodesFront(),this.visBranchesFront()},w.prototype.visNodesFront=function(){u.each(this.visNodeMap,function(e){e.toFront()})},w.prototype.visBranchesFront=function(){this.visBranchCollection.each(function(e){e.nonTextToFront(),e.textToFront()}),this.visBranchCollection.each(function(e){e.textToFrontIfInStack()})},w.prototype.drawTreeFromReload=function(){this.gitReady=!0,this.deferFlush(),this.calcTreeCoords()},w.prototype.drawTreeFirstTime=function(){this.gitReady=!0,this.calcTreeCoords(),u.each(this.visNodeMap,function(e){e.genGraphics(this.paper)},this),this.visEdgeCollection.each(function(e){e.genGraphics(this.paper)},this),this.visBranchCollection.each(function(e){e.genGraphics(this.paper)},this),this.zIndexReflow()},n.GitVisuals=w}),e.define("/src/js/visuals/visNode.js",function(e,t,n,r,i,s,o){var u=e("underscore"),a=e("backbone"),f=e("../util/constants").GRAPHICS,l=e("../visuals/visBase").VisBase,c=l.extend({defaults:{depth:undefined,maxWidth:null,outgoingEdges:null,circle:null,text:null,id:null,pos:null,radius:null,commit:null,animationSpeed:f.defaultAnimationTime,animationEasing:f.defaultEasing,fill:f.defaultNodeFill,"stroke-width":f.defaultNodeStrokeWidth,stroke:f.defaultNodeStroke},getID:function(){return this.get("id")},validateAtInit:function(){if(!this.get("id"))throw new Error("need id for mapping");if(!this.get("commit"))throw new Error("need commit for linking");this.get("pos")||this.set("pos",{x:Math.random(),y:Math.random()})},initialize:function(){this.validateAtInit(),this.gitVisuals=this.get("gitVisuals"),this.gitEngine=this.get("gitEngine"),this.set("outgoingEdges",[])},setDepth:function(e){this.set("depth",Math.max(this.get("depth")||0,e))},setDepthBasedOn:function(e){if(this.get("depth")===undefined){debugger;throw new Error("no depth yet!")}var t=this.get("pos");t.y=this.get("depth")*e},getMaxWidthScaled:function(){var e=this.gitVisuals.getCommitUpstreamStatus(this.get("commit")),t={branch:1,head:.3,none:.1};if(t[e]===undefined)throw new Error("bad stat");return t[e]*this.get("maxWidth")},toFront:function(){this.get("circle").toFront(),this.get("text").toFront()},getOpacity:function(){var e={branch:1,head:f.upstreamHeadOpacity,none:f.upstreamNoneOpacity},t=this.gitVisuals.getCommitUpstreamStatus(this.get("commit"));if(e[t]===undefined)throw new Error("invalid status");return e[t]},getTextScreenCoords:function(){return this.getScreenCoords()},getAttributes:function(){var e=this.getScreenCoords(),t=this.getTextScreenCoords(),n=this.getOpacity();return{circle:{cx:e.x,cy:e.y,opacity:n,r:this.getRadius(),fill:this.getFill(),"stroke-width":this.get("stroke-width"),stroke:this.get("stroke")},text:{x:t.x,y:t.y,opacity:n}}},highlightTo:function(e,t,n){var r=e.get("fill"),i={circle:{fill:r,stroke:r,"stroke-width":this.get("stroke-width")*5},text:{}};this.animateToAttr(i,t,n)},animateUpdatedPosition:function(e,t){var n=this.getAttributes();this.animateToAttr(n,e,t)},animateFromAttrToAttr:function(e,t,n,r){this.animateToAttr(e,0),this.animateToAttr(t,n,r)},animateToSnapshot:function(e,t,n){if(!e[this.getID()])return;this.animateToAttr(e[this.getID()],t,n)},animateToAttr:function(e,t,n){if(t===0){this.get("circle").attr(e.circle),this.get("text").attr(e.text);return}var r=t!==undefined?t:this.get("animationSpeed"),i=n||this.get("animationEasing");this.get("circle").stop().animate(e.circle,r,i),this.get("text").stop().animate(e.text,r,i),n=="bounce"&&e.circle&&e.circle.cx!==undefined&&e.text&&e.text.x!==undefined&&(this.get("circle").animate(e.circle.cx,r,"easeInOut"),this.get("text").animate(e.text.x,r,"easeInOut"))},getScreenCoords:function(){var e=this.get("pos");return this.gitVisuals.toScreenCoords(e)},getRadius:function(){return this.get("radius")||f.nodeRadius},getParentScreenCoords:function(){return this.get("commit").get("parents")[0].get("visNode").getScreenCoords()},setBirthPosition:function(){var e=this.getParentScreenCoords();this.get("circle").attr({cx:e.x,cy:e.y,opacity:0,r:0}),this.get("text").attr({x:e.x,y:e.y,opacity:0})},setBirthFromSnapshot:function(e){var t=this.get("commit").get("parents")[0].get("visNode").getID(),n=e[t];this.get("circle").attr({opacity:0,r:0,cx:n.circle.cx,cy:n.circle.cy}),this.get("text").attr({opacity:0,x:n.text.x,y:n.text.y});var r={x:n.circle.cx,y:n.circle.cy};this.setOutgoingEdgesBirthPosition(r)},setBirth:function(){this.setBirthPosition(),this.setOutgoingEdgesBirthPosition(this.getParentScreenCoords())},setOutgoingEdgesOpacity:function(e){u.each(this.get("outgoingEdges"),function(t){t.setOpacity(e)})},animateOutgoingEdgesToAttr:function(e,t,n){u.each(this.get("outgoingEdges"),function(t){var n=e[t.getID()];t.animateToAttr(n)},this)},animateOutgoingEdges:function(e,t){u.each(this.get("outgoingEdges"),function(n){n.animateUpdatedPath(e,t)},this)},animateOutgoingEdgesFromSnapshot:function(e,t,n){u.each(this.get("outgoingEdges"),function(r){var i=e[r.getID()];r.animateToAttr(i,t,n)},this)},setOutgoingEdgesBirthPosition:function(e){u.each(this.get("outgoingEdges"),function(t){var n=t.get("head").getScreenCoords(),r=t.genSmoothBezierPathStringFromCoords(e,n);t.get("path").stop().attr({path:r,opacity:0})},this)},parentInFront:function(){this.get("commit").get("parents")[0].get("visNode").toFront()},getFontSize:function(e){return e.length<3?12:e.length<5?10:8},getFill:function(){var e=this.gitVisuals.getCommitUpstreamStatus(this.get("commit"));return e=="head"?f.headRectFill:e=="none"?f.orphanNodeFill:this.gitVisuals.getBlendedHuesForCommit(this.get("commit"))},attachClickHandlers:function(){if(this.get("gitVisuals").options.noClick)return;var t="git checkout "+this.get("commit").get("id"),n=e("../app");u.each([this.get("circle"),this.get("text")],function(e){e.click(function(){n.getEventBaton().trigger("commandSubmitted",t)}),$(e.node).css("cursor","pointer")})},setOpacity:function(e){e=e===undefined?1:e;var t=["circle","text"];u.each(t,function(t){this.get(t).attr({opacity:e})},this)},remove:function(){this.removeKeys(["circle"],["text"]);var e=this.get("text");e&&e.remove(),this.gitVisuals.removeVisNode(this)},removeAll:function(){this.remove(),u.each(this.get("outgoingEdges"),function(e){e.remove()},this)},getExplodeStepFunc:function(){var e=this.get("circle"),t=20,n=Math.PI+Math.random()*1*Math.PI,r=.2,i=.01,s=t*Math.cos(n),o=t*Math.sin(n),u=e.attr("cx"),a=e.attr("cy"),f=this.gitVisuals.paper.width,l=this.gitVisuals.paper.height,c=.8,h=1,p=function(){o+=r*h-i*o,s-=i*s,u+=s*h,a+=o*h;if(u<0||u>f)s=c*-s,u=u<0?0:f;if(a<0||a>l)o=c*-o,a=a<0?0:l;return e.attr({cx:u,cy:a}),s*s+o*o<.01&&Math.abs(a-l)===0?!1:!0};return p},genGraphics:function(){var e=this.gitVisuals.paper,t=this.getScreenCoords(),n=this.getTextScreenCoords(),r=e.circle(t.x,t.y,this.getRadius()).attr(this.getAttributes().circle),i=e.text(n.x,n.y,String(this.get("id")));i.attr({"font-size":this.getFontSize(this.get("id")),"font-weight":"bold","font-family":"Monaco, Courier, font-monospace",opacity:this.getOpacity()}),this.set("circle",r),this.set("text",i),this.attachClickHandlers()}});n.VisNode=c}),e.define("/src/js/visuals/visBase.js",function(e,t,n,r,i,s,o){var u=e("underscore"),a=e("backbone"),f=a.Model.extend({removeKeys:function(e){u.each(e,function(e){this.get(e)&&this.get(e).remove()},this)},animateAttrKeys:function(e,t,n,r){e=u.extend({},{include:["circle","arrow","rect","path","text"],exclude:[]},e||{});var i=this.getAttributes();u.each(e.include,function(e){i[e]=u.extend({},i[e],t)}),u.each(e.exclude,function(e){delete i[e]}),this.animateToAttr(i,n,r)}});n.VisBase=f}),e.define("/src/js/visuals/visBranch.js",function(e,t,n,r,i,s,o){var u=e("underscore"),a=e("backbone"),f=e("../util/constants").GRAPHICS,l=e("../visuals/visBase").VisBase,c=function(){var e=Math.random(),t="hsb("+String(e)+",0.7,1)";return t},h=l.extend({defaults:{pos:null,text:null,rect:null,arrow:null,isHead:!1,flip:1,fill:f.rectFill,stroke:f.rectStroke,"stroke-width":f.rectStrokeWidth,offsetX:f.nodeRadius*4.75,offsetY:0,arrowHeight:14,arrowInnerSkew:0,arrowEdgeHeight:6,arrowLength:14,arrowOffsetFromCircleX:10,vPad:5,hPad:5,animationSpeed:f.defaultAnimationTime,animationEasing:f.defaultEasing},validateAtInit:function(){if(!this.get("branch"))throw new Error("need a branch!")},getID:function(){return this.get("branch").get("id")},initialize:function(){this.validateAtInit(),this.gitVisuals=this.get("gitVisuals"),this.gitEngine=this.get("gitEngine");if(!this.gitEngine)throw new Error("asd wtf");this.get("branch").set("visBranch",this);var e=this.get("branch").get("id");e=="HEAD"?(this.set("isHead",!0),this.set("flip",-1),this.set("fill",f.headRectFill)):e!=="master"&&this.set("fill",c())},getCommitPosition:function(){var e=this.gitEngine.getCommitFromRef(this.get("branch")),t=e.get("visNode"),n=this.get("gitVisuals").posBoundaries.max;return t.get("pos").x>n?this.set("flip",-1):this.set("flip",1),t.getScreenCoords()},getBranchStackIndex:function(){if(this.get("isHead"))return 0;var e=this.getBranchStackArray(),t=-1;return u.each(e,function(e,n){e.obj==this.get("branch")&&(t=n)},this),t},getBranchStackLength:function(){return this.get("isHead")?1:this.getBranchStackArray().length},getBranchStackArray:function(){var e=this.gitVisuals.branchStackMap[this.get("branch").get("target").get("id")];return e===undefined?(this.gitVisuals.calcBranchStacks(),this.getBranchStackArray()):e},getTextPosition:function(){var e=this.getCommitPosition(),t=this.getBranchStackIndex();return{x:e.x+this.get("flip")*this.get("offsetX"),y:e.y+t*f.multiBranchY+this.get("offsetY")}},getRectPosition:function(){var e=this.getTextPosition(),t=this.get("flip"),n=this.getTextSize();return{x:e.x-.5*n.w-this.get("hPad"),y:e.y-.5*n.h-this.get("vPad")}},getArrowPath:function(){var e=function(e,t,n){return{x:e.x+t,y:e.y+n}},t=function(e){return String(Math.round(e.x))+","+String(Math.round(e.y))},n=this.get("flip"),r=e(this.getCommitPosition(),n*this.get("arrowOffsetFromCircleX"),0),i=e(r,n*this.get("arrowLength"),-this.get("arrowHeight")),s=e(r,n*this.get("arrowLength"),this.get("arrowHeight")),o=e(i,n*this.get("arrowInnerSkew"),this.get("arrowEdgeHeight")),a=e(s,n*this.get("arrowInnerSkew"),-this.get("arrowEdgeHeight")),f=49,l=e(o,n*f,0),c=e(a,n*f,0),h="";h+="M"+t(l)+" ";var p=[o,i,r,s,a,c];return u.each(p,function(e){h+="L"+t(e)+" "},this),h+="z",h},getTextSize:function(){var e=function(e){var t=e.get("text")?e.get("text").node:null;return t===null?0:t.clientWidth},t=function(e){return e.w||(e.w=75),e.h||(e.h=20),e},n=this.get("text").node;if(this.get("isHead"))return t({w:n.clientWidth,h:n.clientHeight});var r=0;return u.each(this.getBranchStackArray(),function(t){r=Math.max(r,e(t.obj.get("visBranch")))}),t({w:r,h:n.clientHeight})},getSingleRectSize:function(){var e=this.getTextSize(),t=this.get("vPad"),n=this.get("hPad");return{w:e.w+t*2,h:e.h+n*2}},getRectSize:function(){var e=this.getTextSize(),t=this.get("vPad"),n=this.get("hPad"),r=this.getBranchStackLength();return{w:e.w+t*2,h:e.h*r*1.1+n*2}},getName:function(){var e=this.get("branch").get("id"),t=this.gitEngine.HEAD.get("target").get("id"),n=t==e?"*":"";return e+n},nonTextToFront:function(){this.get("arrow").toFront(),this.get("rect").toFront()},textToFront:function(){this.get("text").toFront()},textToFrontIfInStack:function(){this.getBranchStackIndex()!==0&&this.get("text").toFront()},getFill:function(){return this.get("isHead")||this.getBranchStackLength()==1||this.getBranchStackIndex()!==0?this.get("fill"):this.gitVisuals.blendHuesFromBranchStack(this.getBranchStackArray())},remove:function(){this.removeKeys(["text","arrow","rect"]),this.gitVisuals.removeVisBranch(this)},genGraphics:function(e){var t=this.getTextPosition(),n=this.getName(),r;r=e.text(t.x,t.y,String(n)),r.attr({"font-size":14,"font-family":"Monaco, Courier, font-monospace",opacity:this.getTextOpacity()}),this.set("text",r);var i=this.getRectPosition(),s=this.getRectSize(),o=e.rect(i.x,i.y,s.w,s.h,8).attr(this.getAttributes().rect);this.set("rect",o);var u=this.getArrowPath(),a=e.path(u).attr(this.getAttributes().arrow);this.set("arrow",a),this.attachClickHandlers(),o.toFront(),r.toFront()},attachClickHandlers:function(){if(this.get("gitVisuals").options.noClick)return;var t="git checkout "+this.get("branch").get("id"),n=e("../app"),r=[this.get("rect"),this.get("text"),this.get("arrow")];u.each(r,function(e){e.click(function(){n.getEventBaton().trigger("commandSubmitted",t)}),$(e.node).css("cursor","pointer")})},updateName:function(){this.get("text").attr({text:this.getName()})},getNonTextOpacity:function(){return this.get("isHead")?this.gitEngine.getDetachedHead()?1:0:this.getBranchStackIndex()===0?1:0},getTextOpacity:function(){return this.get("isHead")?this.gitEngine.getDetachedHead()?1:0:1},getAttributes:function(){var e=this.getNonTextOpacity(),t=this.getTextOpacity();this.updateName();var n=this.getTextPosition(),r=this.getRectPosition(),i=this.getRectSize(),s=this.getArrowPath();return{text:{x:n.x,y:n.y,opacity:t},rect:{x:r.x,y:r.y,width:i.w,height:i.h,opacity:e,fill:this.getFill(),stroke:this.get("stroke"),"stroke-width":this.get("stroke-width")},arrow:{path:s,opacity:e,fill:this.getFill(),stroke:this.get("stroke"),"stroke-width":this.get("stroke-width")}}},animateUpdatedPos:function(e,t){var n=this.getAttributes();this.animateToAttr(n,e,t)},animateFromAttrToAttr:function(e,t,n,r){this.animateToAttr(e,0),this.animateToAttr(t,n,r)},animateToAttr:function(e,t,n){if(t===0){this.get("text").attr(e.text),this.get("rect").attr(e.rect),this.get("arrow").attr(e.arrow);return}var r=t!==undefined?t:this.get("animationSpeed"),i=n||this.get("animationEasing");this.get("text").stop().animate(e.text,r,i),this.get("rect").stop().animate(e.rect,r,i),this.get("arrow").stop().animate(e.arrow,r,i)}}),p=a.Collection.extend({model:h});n.VisBranchCollection=p,n.VisBranch=h,n.randomHueString=c}),e.define("/src/js/visuals/visEdge.js",function(e,t,n,r,i,s,o){var u=e("underscore"),a=e("backbone"),f=e("../util/constants").GRAPHICS,l=e("../visuals/visBase").VisBase,c=l.extend({defaults:{tail:null,head:null,animationSpeed:f.defaultAnimationTime,animationEasing:f.defaultEasing},validateAtInit:function(){var e=["tail","head"];u.each(e,function(e){if(!this.get(e))throw new Error(e+" is required!")},this)},getID:function(){return this.get("tail").get("id")+"."+this.get("head").get("id")},initialize:function(){this.validateAtInit(),this.gitVisuals=this.get("gitVisuals"),this.gitEngine=this.get("gitEngine"),this.get("tail").get("outgoingEdges").push(this)},remove:function(){this.removeKeys(["path"]),this.gitVisuals.removeVisEdge(this)},genSmoothBezierPathString:function(e,t){var n=e.getScreenCoords(),r=t.getScreenCoords();return this.genSmoothBezierPathStringFromCoords(n,r)},genSmoothBezierPathStringFromCoords:function(e,t){var n=function(e){return String(Math.round(e.x))+","+String(Math.round(e.y))},r=function(e,t,n){return n=n||f.curveControlPointOffset,{x:e.x,y:e.y+n*t}},i=function(e,t,n){return{x:e.x+t,y:e.y+n}};e=r(e,-1,this.get("tail").getRadius()),t=r(t,1,this.get("head").getRadius());var s="";s+="M"+n(e)+" ",s+="C",s+=n(r(e,-1))+" ",s+=n(r(t,1))+" ",s+=n(t);var o=f.arrowHeadSize||10;return s+=" L"+n(i(t,-o,o)),s+=" L"+n(i(t,o,o)),s+=" L"+n(t),s+="C",s+=n(r(t,1))+" ",s+=n(r(e,-1))+" ",s+=n(e),s},getBezierCurve:function(){return this.genSmoothBezierPathString(this.get("tail"),this.get("head"))},getStrokeColor:function(){return f.visBranchStrokeColorNone},setOpacity:function(e){e=e===undefined?1:e,this.get("path").attr({opacity:e})},genGraphics:function(e){var t=this.getBezierCurve(),n=e.path(t).attr({"stroke-width":f.visBranchStrokeWidth,stroke:this.getStrokeColor(),"stroke-linecap":"round","stroke-linejoin":"round",fill:this.getStrokeColor()});n.toBack(),this.set("path",n)},getOpacity:function(){var e=this.gitVisuals.getCommitUpstreamStatus(this.get("tail")),t={branch:1,head:f.edgeUpstreamHeadOpacity,none:f.edgeUpstreamNoneOpacity};if(t[e]===undefined)throw new Error("bad stat");return t[e]},getAttributes:function(){var e=this.getBezierCurve(),t=this.getOpacity();return{path:{path:e,opacity:t}}},animateUpdatedPath:function(e,t){var n=this.getAttributes();this.animateToAttr(n,e,t)},animateFromAttrToAttr:function(e,t,n,r){this.animateToAttr(e,0),this.animateToAttr(t,n,r)},animateToAttr:function(e,t,n){if(t===0){this.get("path").attr(e.path);return}this.get("path").toBack(),this.get("path").stop().animate(e.path,t!==undefined?t:this.get("animationSpeed"),n||this.get("animationEasing"))}}),h=a.Collection.extend({model:c});n.VisEdgeCollection=h,n.VisEdge=c}),e.define("/src/js/level/disabledMap.js",function(e,t,n,r,i,s,o){function c(e){e=e||{},this.disabledMap=e.disabledMap||{"git cherry-pick":!0,"git rebase":!0}}var u=e("underscore"),a=e("../git/commands"),f=e("../util/errors"),l=f.GitError;c.prototype.getInstantCommands=function(){var e=[],t=function(){throw new l({msg:"That git command is disabled for this level!"})};return u.each(this.disabledMap,function(n,r){var i=a.regexMap[r];if(!i)throw new Error("wuttttt this disbaled command"+r+" has no regex matching");e.push([i,t])}),e},n.DisabledMap=c}),e.define("/src/js/level/arbiter.js",function(e,t,n,r,i,s,o){function h(){this.levelMap={},this.levelSequences=f,this.sequences=[],this.init();var e;try{e=JSON.parse(localStorage.getItem("solvedMap")||"{}")}catch(t){console.warn("local storage failed",t)}this.solvedMap=e||{},c.getEvents().on("levelSolved",this.levelSolved,this)}var u=e("underscore"),a=e("backbone"),f=e("../levels").levelSequences,l=e("../levels").sequenceInfo,c=e("../app");h.prototype.init=function(){var e;u.each(this.levelSequences,function(e,t){this.sequences.push(t);if(!e||!e.length)throw new Error("no empty sequences allowed");u.each(e,function(e,n){this.validateLevel(e);var r=t+String(n+1),i=u.extend({},e,{index:n,id:r,sequenceName:t});this.levelMap[r]=i,this.levelSequences[t][n]=i},this)},this)},h.prototype.isLevelSolved=function(e){if(!this.levelMap[e])throw new Error("that level doesnt exist!");return Boolean(this.solvedMap[e])},h.prototype.levelSolved=function(e){if(!e)return;this.solvedMap[e]=!0,this.syncToStorage()},h.prototype.resetSolvedMap=function(){this.solvedMap={},this.syncToStorage(),c.getEvents().trigger("levelSolved")},h.prototype.syncToStorage=function(){try{localStorage.setItem("solvedMap",JSON.stringify(this.solvedMap))}catch(e){console.warn("local storage fialed on set",e)}},h.prototype.validateLevel=function(e){e=e||{};var t=["name","goalTreeString","solutionCommand"],n=["hint","disabledMap","startTree"];u.each(t,function(t){if(e[t]===undefined)throw console.log(e),new Error("I need this field for a level: "+t)})},h.prototype.getSequenceToLevels=function(){return this.levelSequences},h.prototype.getSequences=function(){return u.keys(this.levelSequences)},h.prototype.getLevelsInSequence=function(e){if(!this.levelSequences[e])throw new Error("that sequecne name "+e+"does not exist");return this.levelSequences[e]},h.prototype.getSequenceInfo=function(e){return l[e]},h.prototype.getLevel=function(e){return this.levelMap[e]},h.prototype.getNextLevel=function(e){if(!this.levelMap[e])return console.warn("that level doesnt exist!!!"),null;var t=this.levelMap[e],n=t.sequenceName,r=this.levelSequences[n],i=t.index+1;if(i=t.length?0:e,e=e<0?t.length-1:e,e},boundIndex:function(e,t){return e=e>=t.length?t.length-1:e,e=e<0?0:e,e},getNextSequence:function(){var e=this.getSequenceIndex(this.selectedSequence),t=this.wrapIndex(e+1,this.sequences);return this.sequences[t]},getPreviousSequence:function(){var e=this.getSequenceIndex(this.selectedSequence),t=this.wrapIndex(e-1,this.sequences);return this.sequences[t]},getSequenceIndex:function(e){var t=this.sequences.indexOf(e);if(t<0)throw new Error("didnt find");return t},getIndexForID:function(e){return h.getLevelArbiter().getLevel(e).index},selectFirst:function(){var e=this.sequenceToLevels[this.sequences[0]][0].id;this.selectIconByID(e),this.selectedIndex=0,this.selectedSequence=this.sequences[0]},getCurrentSequence:function(){return this.sequenceToLevels[this.selectedSequence]},getSelectedID:function(){return this.sequenceToLevels[this.selectedSequence][this.selectedIndex].id},selectIconByID:function(e){this.toggleIconSelect(e,!0)},deselectIconByID:function(e){this.toggleIconSelect(e,!1)},toggleIconSelect:function(e,t){this.selectedID=e;var n="#levelIcon-"+e;$(n).toggleClass("selected",t)},negative:function(){this.hide()},testOption:function(e){return this.currentCommand&&(new RegExp("--"+e)).test(this.currentCommand.get("rawStr"))},show:function(e,t){this.currentCommand=t,this.updateSolvedStatus(),this.showDeferred=e,this.keyboardListener.listen(),m.__super__.show.apply(this)},hide:function(){this.showDeferred&&this.showDeferred.resolve(),this.showDeferred=undefined,this.keyboardListener.mute(),this.turnOffKeyboardSelection(),m.__super__.hide.apply(this)},loadLevelID:function(e){this.testOption("noOutput")||h.getEventBaton().trigger("commandSubmitted","level "+e),this.hide()},updateSolvedStatus:function(){u.each(this.seriesViews,function(e){e.updateSolvedStatus()},this)},buildSequences:function(){this.seriesViews=[],u.each(this.sequences,function(e){this.seriesViews.push(new g({destination:this.$el,name:e,navEvents:this.navEvents}))},this)}}),g=v.extend({tagName:"div",className:"seriesView box flex1 vertical",template:u.template($("#series-view").html()),events:{"click div.levelIcon":"click"},initialize:function(e){this.name=e.name||"intro",this.navEvents=e.navEvents,this.info=h.getLevelArbiter().getSequenceInfo(this.name),this.levels=h.getLevelArbiter().getLevelsInSequence(this.name),this.levelIDs=[],u.each(this.levels,function(e){this.levelIDs.push(e.id)},this),this.destination=e.destination,this.JSON={displayName:this.info.displayName,about:this.info.about,ids:this.levelIDs},this.render(),this.updateSolvedStatus()},updateSolvedStatus:function(){var e=this.$("div.levelIcon").each(function(e,t){var n=$(t).attr("data-id");$(t).toggleClass("solved",h.getLevelArbiter().isLevelSolved(n))})},click:function(e){var t=e.srcElement||e.currentTarget;if(!t){console.warn("wut, no id");return}var n=$(t).attr("data-id");this.navEvents.trigger("clickedID",n)}});n.LevelDropdownView=m}),e.define("/src/js/views/commandViews.js",function(e,t,n,r,i,s,o){var u=e("underscore"),a=e("../util").isBrowser()?a=window.Backbone:a=e("backbone"),f=e("../models/collections").CommandEntryCollection,l=e("../app"),c=e("../models/commandModel").Command,h=e("../models/commandModel").CommandEntry,p=e("../util/errors"),d=p.Warning,v=e("../util"),m=e("../util/keyboard"),g=a.View.extend({initialize:function(e){l.getEvents().on("commandSubmittedPassive",this.addToCommandHistory,this),this.commands=new f,this.commands.fetch({success:u.bind(function(){var e=[];this.commands.each(function(t){e.push(t)}),e.reverse(),this.commands.reset(),u.each(e,function(e){this.commands.add(e)},this)},this)}),this.index=-1,this.commandParagraph=this.$("#prompt p.command")[0],this.commandCursor=this.$("#prompt span.cursor")[0],this.focus(),l.getEvents().on("rollupCommands",this.rollupCommands,this),l.getEventBaton().stealBaton("keydown",this.onKeyDown,this),l.getEventBaton().stealBaton("keyup",this.onKeyUp,this)},events:{"blur #commandTextField":"hideCursor","focus #commandTextField":"showCursor"},blur:function(){this.hideCursor()},focus:function(){this.$("#commandTextField").focus(),this.showCursor()},hideCursor:function(){this.toggleCursor(!1)},showCursor:function(){this.toggleCursor(!0)},toggleCursor:function(e){$(this.commandCursor).toggleClass("shown",e)},onKeyDown:function(e){var t=e.srcElement;this.updatePrompt(t)},onKeyUp:function(e){this.onKeyDown(e);var t={enter:u.bind(function(){this.submit()},this),up:u.bind(function(){this.commandSelectChange(1)},this),down:u.bind(function(){this.commandSelectChange(-1)},this)},n=m.mapKeycodeToKey(e.which||e.keyCode);t[n]!==undefined&&(e.preventDefault(),t[n](),this.onKeyDown(e))},badHtmlEncode:function(e){return e.replace(/&/g,"&").replace(/=this.commands.length||this.index<0){this.clear(),this.index=-1;return}var t=this.commands.toArray()[this.index].get("text");this.setTextField(t)},clearLocalStorage:function(){this.commands.each(function(e){a.sync("delete",e,function(){})},this)},setTextField:function(e){this.$("#commandTextField").val(e)},clear:function(){this.setTextField("")},submit:function(){var e=this.$("#commandTextField").val().replace("\n","");this.clear(),this.submitCommand(e),this.index=-1},rollupCommands:function(e){var t=this.commands.toArray().slice(1,Number(e)+1);t.reverse();var n="";u.each(t,function(e){n+=e.get("text")+";"},this);var r=new h({text:n});this.commands.unshift(r),a.sync("create",r,function(){})},addToCommandHistory:function(e){var t=e.length&&this.index===-1||e.length&&this.index!==-1&&this.commands.toArray()[this.index].get("text")!==e;if(!t)return;var n=new h({text:e});this.commands.unshift(n),a.sync("create",n,function(){}),this.commands.length>100&&this.clearLocalStorage()},submitCommand:function(e){l.getEventBaton().trigger("commandSubmitted",e)}}),y=a.View.extend({tagName:"div",model:c,template:u.template($("#command-template").html()),events:{click:"clicked"},clicked:function(e){},initialize:function(){this.model.bind("change",this.wasChanged,this),this.model.bind("destroy",this.remove,this)},wasChanged:function(e,t){var n=t.changes,r=u.keys(n);u.difference(r,["status"]).length===0?this.updateStatus():this.render()},updateStatus:function(){var e=["inqueue","processing","finished"],t={};u.each(e,function(e){t[e]=!1}),t[this.model.get("status")]=!0;var n=this.$("p.commandLine");u.each(t,function(e,t){n.toggleClass(t,e)})},render:function(){var e=u.extend({resultType:"",result:"",formattedWarnings:this.model.getFormattedWarnings()},this.model.toJSON());return this.$el.html(this.template(e)),this},remove:function(){$(this.el).hide()}}),b=a.View.extend({initialize:function(e){this.collection=e.collection,this.collection.on("add",this.addOne,this),this.collection.on("reset",this.addAll,this),this.collection.on("all",this.render,this),this.collection.on("change",this.scrollDown,this),l.getEvents().on("commandScrollDown",this.scrollDown,this),l.getEvents().on("clearOldCommands",this.clearOldCommands,this)},addWarning:function(e){var t=new d({msg:e}),n=new c({error:t,rawStr:"Warning:"});this.collection.add(n)},clearOldCommands:function(){var e=[];this.collection.each(function(t){t.get("status")!=="inqueue"&&t.get("status")!=="processing"&&e.push(t)},this),u.each(e,function(e){e.destroy()},this),this.scrollDown()},scrollDown:function(){var e=$("#commandDisplay")[0],t=$("#terminal")[0],n=e.clientHeight>t.clientHeight;$(t).toggleClass("scrolling",n),n&&(t.scrollTop=t.scrollHeight)},addOne:function(e){var t=new y({model:e});this.$("#commandDisplay").append(t.render().el),this.scrollDown()},addAll:function(){this.collection.each(this.addOne)}});n.CommandPromptView=g,n.CommandLineHistoryView=b}),e.define("/src/js/util/zoomLevel.js",function(e,t,n,r,i,s,o){function f(){return!window.outerWidth||!window.innerWidth?(a&&(console.warn("Can't detect zoom level correctly :-/"),a=!1),1):window.outerWidth/window.innerWidth}var u=e("underscore"),a=!0,l=!0,c=function(e,t){var n=0;setInterval(function(){var r=f();if(r!==n){if(l){l=!1;return}n=r,e.apply(t,[r])}else l=!0},500)};n.setupZoomPoll=c,n.detectZoom=f}),e.define("/src/js/dialogs/sandbox.js",function(e,t,n,r,i,s,o){n.dialog=[{type:"ModalAlert",options:{markdowns:["## Welcome to LearnGitBranching!","","This application is designed to help beginners grasp ","the powerful concepts behind branching when working ","with git. We hope you enjoy this application and maybe ","even learn something!","","# Attention HN!!","","Unfortunately this was submitted before I finished all the help ","and tutorial sections, so forgive the scarcity. See the demo here:","","[http://pcottle.github.com/learnGitBranching/?demo](http://pcottle.github.com/learnGitBranching/?demo)"]}},{type:"ModalAlert",options:{markdowns:["## Git commands","","You have a large variety of git commands available in sandbox mode. These include",""," * commit"," * branch"," * checkout"," * cherry-pick"," * reset"," * revert"," * rebase"," * merge"]}},{type:"ModalAlert",options:{markdowns:["## Sharing is caring!","","Share trees with your friends via `export tree` and `import tree`","","Have a great lesson to share? Try building a level with `build level` or try out a friend's level with `import level`","","For now let's get you started on the `levels`..."]}}]}),e.define("/src/js/util/mock.js",function(e,t,n,r,i,s,o){n.mock=function(e){var t={},n=function(){};for(var r in e.prototype)t[r]=n;return t}}),e.define("/src/js/visuals/tree.js",function(e,t,n,r,i,s,o){var u=e("underscore"),a=e("backbone"),f=a.Model.extend({removeKeys:function(e){u.each(e,function(e){this.get(e)&&this.get(e).remove()},this)},animateAttrKeys:function(e,t,n,r){e=u.extend({},{include:["circle","arrow","rect","path","text"],exclude:[]},e||{});var i=this.getAttributes();u.each(e.include,function(e){i[e]=u.extend({},i[e],t)}),u.each(e.exclude,function(e){delete i[e]}),this.animateToAttr(i,n,r)}});n.VisBase=f}),e.define("/src/js/git/headless.js",function(e,t,n,r,i,s,o){var u=e("underscore"),a=e("backbone"),f=e("q"),l=e("../git").GitEngine,c=e("../visuals/animation/animationFactory").AnimationFactory,h=e("../visuals").GitVisuals,p=e("../git/treeCompare").TreeCompare,d=e("../util/eventBaton").EventBaton,v=e("../models/collections"),m=v.CommitCollection,g=v.BranchCollection,y=e("../models/commandModel").Command,b=e("../util/mock").mock,w=e("../util"),E=function(){this.init()};E.prototype.init=function(){this.commitCollection=new m,this.branchCollection=new g,this.treeCompare=new p;var e=b(c),t=b(h);this.gitEngine=new l({collection:this.commitCollection,branches:this.branchCollection,gitVisuals:t,animationFactory:e,eventBaton:new d}),this.gitEngine.init()},E.prototype.sendCommand=function(e){w.splitTextCommand(e,function(e){var t=new y({rawStr:e});this.gitEngine.dispatch(t,f.defer())},this)},n.HeadlessGit=E}),e.define("/src/js/app/index.js",function(e,t,n,r,i,s,o){function y(){var t=e("../models/collections"),n=e("../views/commandViews");this.commandCollection=new t.CommandCollection,this.commandBuffer=new t.CommandBuffer({collection:this.commandCollection}),this.commandPromptView=new n.CommandPromptView({el:$("#commandLineBar")}),this.commandLineHistoryView=new n.CommandLineHistoryView({el:$("#commandLineHistory"),collection:this.commandCollection})}var u=e("underscore"),a=e("backbone"),f=e("../util/constants"),l=e("../util"),c=u.clone(a.Events),h,p,d,v,m,g=function(){var t=e("../level/sandbox").Sandbox,n=e("../level").Level,r=e("../util/eventBaton").EventBaton,i=e("../level/arbiter").LevelArbiter,s=e("../views/levelDropdownView").LevelDropdownView;d=new r,h=new y,p=new t,v=new i,m=new s({wait:!0});var o=function(){$("#commandTextField").focus()};o(),$(window).focus(function(e){d.trigger("windowFocus",e)}),$(document).click(function(e){d.trigger("documentClick",e)}),$(document).bind("keydown",function(e){d.trigger("docKeydown",e)}),$(document).bind("keyup",function(e){d.trigger("docKeyup",e)}),$(window).on("resize",function(e){c.trigger("resize",e)}),$(window).on("resize",u.throttle(function(e){var t=$(window).width(),n=$(window).height();d.trigger("windowSizeCheck",{w:t,h:n})},500)),d.stealBaton("docKeydown",function(){}),d.stealBaton("docKeyup",function(){}),d.stealBaton("windowFocus",o),d.stealBaton("documentClick",o);var a=function(e){return function(){var t=[e];u.each(arguments,function(e){t.push(e)}),d.trigger.apply(d,t)}};$("#commandTextField").on("keydown",a("keydown")),$("#commandTextField").on("keyup",a("keyup")),$(window).trigger("resize"),/\?demo/.test(window.location.href)?p.mainVis.customEvents.on("gitEngineReady",function(){d.trigger("commandSubmitted",["git commit; git checkout -b bugFix C1; git commit; git merge master; git checkout master; git commit; git rebase bugFix;","delay 1000; reset;","level rebase1 --noFinishDialog --noStartCommand --noIntroDialog;","delay 2000; show goal; delay 1000; hide goal;","git checkout bugFix; git rebase master; git checkout side; git rebase bugFix;","git checkout another; git rebase side; git rebase another master;","help; levels"].join(""))}):/\?NODEMO/.test(window.location.href)||p.mainVis.customEvents.on("gitEngineReady",function(){d.trigger("commandSubmitted",["git help;","delay 1000;","help;","levels"].join(""))});if(/command=/.test(window.location.href)){var f=window.location.href.split("command=")[1].split("&")[0],l=unescape(f);p.mainVis.customEvents.on("gitEngineReady",function(){d.trigger("commandSubmitted",l)})}(/(iPhone|iPod|iPad).*AppleWebKit/i.test(navigator.userAgent)||/android/i.test(navigator.userAgent))&&p.mainVis.customEvents.on("gitEngineReady",function(){d.trigger("commandSubmitted","mobile alert")})};e("../util").isBrowser()&&$(document).ready(g),n.getEvents=function(){return c},n.getSandbox=function(){return p},n.getEventBaton=function(){return d},n.getCommandUI=function(){return h},n.getLevelArbiter=function(){return v},n.getLevelDropdown=function(){return m},n.init=g}),e("/src/js/app/index.js"),e.define("/src/js/dialogs/levelBuilder.js",function(e,t,n,r,i,s,o){n.dialog=[{type:"ModalAlert",options:{markdowns:["## Welcome to the level builder!","","Here are the main steps:",""," * Set up the initial environment with git commands"," * Define the starting tree with ```define start```"," * Enter the series of git commands that compose the (optimal) solution"," * Define the goal tree with ```define goal```. Defining the goal also defines the solution"," * Optionally define a hint with ```define hint```"," * Edit the name with ```define name```"," * Optionally define a nice start dialog with ```edit dialog```"," * Enter the command ```finish``` to output your level JSON!"]}}]}),e("/src/js/dialogs/levelBuilder.js"),e.define("/src/js/dialogs/sandbox.js",function(e,t,n,r,i,s,o){n.dialog=[{type:"ModalAlert",options:{markdowns:["## Welcome to LearnGitBranching!","","This application is designed to help beginners grasp ","the powerful concepts behind branching when working ","with git. We hope you enjoy this application and maybe ","even learn something!","","# Attention HN!!","","Unfortunately this was submitted before I finished all the help ","and tutorial sections, so forgive the scarcity. See the demo here:","","[http://pcottle.github.com/learnGitBranching/?demo](http://pcottle.github.com/learnGitBranching/?demo)"]}},{type:"ModalAlert",options:{markdowns:["## Git commands","","You have a large variety of git commands available in sandbox mode. These include",""," * commit"," * branch"," * checkout"," * cherry-pick"," * reset"," * revert"," * rebase"," * merge"]}},{type:"ModalAlert",options:{markdowns:["## Sharing is caring!","","Share trees with your friends via `export tree` and `import tree`","","Have a great lesson to share? Try building a level with `build level` or try out a friend's level with `import level`","","For now let's get you started on the `levels`..."]}}]}),e("/src/js/dialogs/sandbox.js"),e.define("/src/js/git/commands.js",function(e,t,n,r,i,s,o){function g(e,t){this.method=e,this.rawOptions=t,this.supportedMap=this.getMasterOptionMap()[e];if(this.supportedMap===undefined)throw new Error("No option map for "+e);this.generalArgs=[],this.explodeAndSet()}var u=e("underscore"),a=e("../util/errors"),f=a.CommandProcessError,l=a.GitError,c=a.Warning,h=a.CommandResult,p={"git commit":/^(gc|git ci)($|\s)/,"git add":/^ga($|\s)/,"git checkout":/^(go|git co)($|\s)/,"git rebase":/^gr($|\s)/,"git branch":/^(gb|git br)($|\s)/,"git status":/^(gst|gs|git st)($|\s)/,"git help":/^git$/},d=[[/^git help($|\s)/,function(){var e=["Git Version PCOTTLE.1.0","
","Usage:",u.escape(" git []"),"
","Supported commands:","
"],t=g.prototype.getMasterOptionMap();u.each(t,function(t,n){e.push("git "+n),u.each(t,function(t,n){e.push(" "+n)},this)},this);var n=e.join("\n");throw n=n.replace(/\t/g," "),new h({msg:n})}]],v={"git commit":/^git commit($|\s)/,"git add":/^git add($|\s)/,"git checkout":/^git checkout($|\s)/,"git rebase":/^git rebase($|\s)/,"git reset":/^git reset($|\s)/,"git branch":/^git branch($|\s)/,"git revert":/^git revert($|\s)/,"git log":/^git log($|\s)/,"git merge":/^git merge($|\s)/,"git show":/^git show($|\s)/,"git status":/^git status($|\s)/,"git cherry-pick":/^git cherry-pick($|\s)/},m=function(e){var t,n;u.each(v,function(r,i){r.exec(e)&&(n=e.slice(i.length+1),t=i.slice("git ".length))});if(!t)return!1;var r=new g(t,n);return{toSet:{generalArgs:r.generalArgs,supportedMap:r.supportedMap,method:t,options:n,eventName:"processGitCommand"}}};g.prototype.getMasterOptionMap=function(){return{commit:{"--amend":!1,"-a":!1,"-am":!1,"-m":!1},status:{},log:{},add:{},"cherry-pick":{},branch:{"-d":!1,"-D":!1,"-f":!1,"--contains":!1},checkout:{"-b":!1,"-B":!1,"-":!1},reset:{"--hard":!1,"--soft":!1},merge:{},rebase:{"-i":!1},revert:{},show:{}}},g.prototype.explodeAndSet=function(){var e=this.rawOptions.match(/('.*?'|".*?"|\S+)/g)||[];for(var t=0;t9&&(e=e.slice(0,9),this.command.addWarning("Sorry, we need to keep branch names short for the visuals. Your branch name was truncated to 9 characters, resulting in "+e)),e},m.prototype.makeBranch=function(e,t){e=this.validateBranchName(e);if(this.refs[e])throw new d({msg:"that branch id either matches a commit hash or already exists!"});var n=new y({target:t,id:e});return this.branchCollection.add(n),this.refs[n.get("id")]=n,n},m.prototype.getHead=function(){return u.clone(this.HEAD)},m.prototype.getBranches=function(){var e=[];return this.branchCollection.each(function(t){e.push({id:t.get("id"),selected:this.HEAD.get("target")===t,target:t.get("target"),obj:t})},this),e},m.prototype.printBranchesWithout=function(e){var t=this.getUpstreamBranchSet(),n=this.getCommitFromRef(e).get("id"),r=[];u.each(t[n],function(e){e.selected=this.HEAD.get("target").get("id")==e.id,r.push(e)},this),this.printBranches(r)},m.prototype.printBranches=function(e){var t="";throw u.each(e,function(e){t+=(e.selected?"* ":"")+e.id+"\n"}),new v({msg:t})},m.prototype.makeCommit=function(e,t,n){if(!t){t=this.uniqueId("C");while(this.refs[t])t=this.uniqueId("C")}var r=new b(u.extend({parents:e,id:t,gitVisuals:this.gitVisuals},n||{}));return this.refs[r.get("id")]=r,this.commitCollection.add(r),r},m.prototype.acceptNoGeneralArgs=function(){if(this.generalArgs.length)throw new d({msg:"That command accepts no general arguments"})},m.prototype.validateArgBounds=function(e,t,n,r){var i=r===undefined?"git "+this.command.get("method"):this.command.get("method")+" "+r+" ";i="with "+i;if(e.lengthn)throw new d({msg:"I expect at most "+String(n)+" argument(s) "+i})},m.prototype.oneArgImpliedHead=function(e,t){this.validateArgBounds(e,0,1,t),e.length===0&&e.push("HEAD")},m.prototype.twoArgsImpliedHead=function(e,t){this.validateArgBounds(e,1,2,t),e.length==1&&e.push("HEAD")},m.prototype.revertStarter=function(){this.validateArgBounds(this.generalArgs,1,NaN);var e=this.revert(this.generalArgs);e&&this.animationFactory.rebaseAnimation(this.animationQueue,e,this,this.gitVisuals)},m.prototype.revert=function(e){var t=[];u.each(e,function(e){t.push(this.getCommitFromRef(e))},this);var n={};n.destinationBranch=this.resolveID(t[0]),n.toRebaseArray=t.slice(0),n.rebaseSteps=[];var r=this.gitVisuals.genSnapshot(),i,s=this.getCommitFromRef("HEAD");return u.each(t,function(e){var t=this.rebaseAltID(e.get("id")),o=this.makeCommit([s],t,{commitMessage:"Reverting "+this.resolveName(e)+': "'+e.get("commitMessage")+'"'});s=o,i=this.gitVisuals.genSnapshot(),n.rebaseSteps.push({oldCommit:e,newCommit:o,beforeSnapshot:r,afterSnapshot:i}),r=i},this),this.setTargetLocation("HEAD",s),n},m.prototype.resetStarter=function(){if(this.commandOptions["--soft"])throw new d({msg:"You can't use --soft because there is no concept of stashing changes or staging files, so you will lose your progress. Try using interactive rebasing (or just rebasing) to move commits."});this.commandOptions["--hard"]&&(this.command.addWarning("Nice! You are using --hard. The default behavior is a hard reset in this demo, so don't worry about specifying the option explicity"),this.generalArgs=this.generalArgs.concat(this.commandOptions["--hard"])),this.validateArgBounds(this.generalArgs,1,1);if(this.getDetachedHead())throw new d({msg:"Cant reset in detached head! Use checkout if you want to move"});this.reset(this.generalArgs[0])},m.prototype.reset=function(e){this.setTargetLocation("HEAD",this.getCommitFromRef(e))},m.prototype.cherrypickStarter=function(){this.validateArgBounds(this.generalArgs,1,1);var e=this.cherrypick(this.generalArgs[0]);this.animationFactory.genCommitBirthAnimation(this.animationQueue,e,this.gitVisuals)},m.prototype.cherrypick=function(e){var t=this.getCommitFromRef(e),n=this.getUpstreamSet("HEAD");if(n[t.get("id")])throw new d({msg:"We already have that commit in our changes history! You can't cherry-pick it if it shows up in git log."});var r=this.rebaseAltID(t.get("id")),i=this.makeCommit([this.getCommitFromRef("HEAD")],r);return this.setTargetLocation(this.HEAD,i),i},m.prototype.commitStarter=function(){this.acceptNoGeneralArgs();if(this.commandOptions["-am"]&&(this.commandOptions["-a"]||this.commandOptions["-m"]))throw new d({msg:"You can't have -am with another -m or -a!"});var e=null,t=null;this.commandOptions["-a"]&&this.command.addWarning("No need to add files in this demo"),this.commandOptions["-am"]&&(t=this.commandOptions["-am"],this.validateArgBounds(t,1,1,"-am"),this.command.addWarning("Don't worry about adding files in this demo. I'll take down your commit message anyways, but you can commit without a message in this demo as well"),e=t[0]),this.commandOptions["-m"]&&(t=this.commandOptions["-m"],this.validateArgBounds(t,1,1,"-m"),e=t[0]);var n=this.commit();e&&(e=e.replace(/"/g,'"').replace(/^"/g,"").replace(/"$/g,""),n.set("commitMessage",e)),this.animationFactory.genCommitBirthAnimation(this.animationQueue,n,this.gitVisuals)},m.prototype.commit=function(){var e=this.getCommitFromRef(this.HEAD),t=null;this.commandOptions["--amend"]&&(e=this.resolveID("HEAD~1"),t=this.rebaseAltID(this.getCommitFromRef("HEAD").get("id")));var n=this.makeCommit([e],t);return this.getDetachedHead()&&this.command.addWarning("Warning!! Detached HEAD state"),this.setTargetLocation(this.HEAD,n),n},m.prototype.resolveName=function(e){var t=this.resolveID(e);return t.get("type")=="commit"?"commit "+t.get("id"):t.get("type")=="branch"?'branch "'+t.get("id")+'"':this.resolveName(t.get("target"))},m.prototype.resolveID=function(e){if(e===null||e===undefined)throw new Error("Dont call this with null / undefined");return typeof e!="string"?e:this.resolveStringRef(e)},m.prototype.resolveStringRef=function(e){if(this.refs[e])return this.refs[e];if(this.refs[e.toUpperCase()])return this.refs[e.toUpperCase()];var t=[[/^([a-zA-Z0-9]+)~(\d+)\s*$/,function(e){return parseInt(e[2],10)}],[/^([a-zA-Z0-9]+)(\^+)\s*$/,function(e){return e[2].length}]],n=null,r=null;u.each(t,function(t){var i=t[0],s=t[1];if(i.test(e)){var o=i.exec(e);r=s(o),n=o[1]}},this);if(!n)throw new d({msg:"unknown ref "+e});if(!this.refs[n])throw new d({msg:"the ref "+n+" does not exist."});var i=this.getCommitFromRef(n);return this.numBackFrom(i,r)},m.prototype.getCommitFromRef=function(e){var t=this.resolveID(e);while(t.get("type")!=="commit")t=t.get("target");return t},m.prototype.getType=function(e){return this.resolveID(e).get("type")},m.prototype.setTargetLocation=function(e,t){if(this.getType(e)=="commit")return;e=this.getOneBeforeCommit(e),e.set("target",t)},m.prototype.getUpstreamBranchSet=function(){var e={},t=function(e,t){var n=!1;return u.each(e,function(e){e.id==t&&(n=!0)}),n},n=function(e){var t=[],n=[e];while(n.length){var r=n.pop();t.push(r.get("id")),r.get("parents")&&r.get("parents").length&&(n=n.concat(r.get("parents")))}return t};return this.branchCollection.each(function(r){var i=n(r.get("target"));u.each(i,function(n){e[n]=e[n]||[],t(e[n],r.get("id"))||e[n].push({obj:r,id:r.get("id")})})}),e},m.prototype.getUpstreamHeadSet=function(){var e=this.getUpstreamSet("HEAD"),t=this.getCommitFromRef("HEAD").get("id");return e[t]=!0,e},m.prototype.getOneBeforeCommit=function(e){var t=this.resolveID(e);return t===this.HEAD&&!this.getDetachedHead()&&(t=t.get("target")),t},m.prototype.numBackFrom=function(e,t){if(t===0)return e;var n=u.bind(function(e){e.sort(this.dateSortFunc)},this),r=[].concat(e.get("parents")||[]);n(r),t--;while(r.length&&t!==0){var i=r.shift(0),s=i.get("parents");s&&s.length&&(r=r.concat(s)),n(r),t--}if(t!==0||r.length===0)throw new d({msg:"Sorry, I can't go that many commits back"});return r.shift(0)},m.prototype.scrapeBaseID=function(e){var t=/^C(\d+)/.exec(e);if(!t)throw new Error("regex failed on "+e);return"C"+t[1]},m.prototype.rebaseAltID=function(e){var t=[[/^C(\d+)[']{0,2}$/,function(e){return e[0]+"'"}],[/^C(\d+)[']{3}$/,function(e){return e[0].slice(0,-3)+"'^4"}],[/^C(\d+)['][\^](\d+)$/,function(e){return"C"+String(e[1])+"'^"+String(Number(e[2])+1)}]];for(var n=0;n",this.get("commitMessage"),"
","Commit: "+this.get("id")].join("\n")+"\n"},getShowEntry:function(){return[this.getLogEntry(),"diff --git a/bigGameResults.html b/bigGameResults.html","--- bigGameResults.html","+++ bigGameResults.html","@@ 13,27 @@ Winner, Score","- Stanfurd, 14-7","+ Cal, 21-14"].join("\n")+"\n"},validateAtInit:function(){if(!this.get("id"))throw new Error("Need ID!!");this.get("createTime")||this.set("createTime",(new Date).toString()),this.get("commitMessage")||this.set("commitMessage","Quick Commit. Go Bears!"),this.set("children",[]);if(!this.get("rootCommit"))if(!this.get("parents")||!this.get("parents").length)throw new Error("needs parents")},addNodeToVisuals:function(){var e=this.get("gitVisuals").addNode(this.get("id"),this);this.set("visNode",e)},addEdgeToVisuals:function(e){this.get("gitVisuals").addEdge(this.get("id"),e.get("id"))},isMainParent:function(e){var t=this.get("parents").indexOf(e);return t===0},initialize:function(e){this.validateAtInit(),this.addNodeToVisuals(),u.each(this.get("parents"),function(e){e.get("children").push(this),this.addEdgeToVisuals(e)},this)}});n.GitEngine=m,n.Commit=b,n.Branch=y,n.Ref=g}),e("/src/js/git/index.js"),e.define("/src/js/git/treeCompare.js",function(e,t,n,r,i,s,o){function a(){}var u=e("underscore");a.prototype.compareAllBranchesWithinTreesAndHEAD=function(e,t){return e=this.convertTreeSafe(e),t=this.convertTreeSafe(t),e.HEAD.target==t.HEAD.target&&this.compareAllBranchesWithinTrees(e,t)},a.prototype.compareAllBranchesWithinTrees=function(e,t){e=this.convertTreeSafe(e),t=this.convertTreeSafe(t);var n=u.extend({},e.branches,t.branches),r=!0;return u.uniq(n,function(n,i){r=r&&this.compareBranchWithinTrees(e,t,i)},this),r},a.prototype.compareBranchesWithinTrees=function(e,t,n){var r=!0;return u.each(n,function(n){r=r&&this.compareBranchWithinTrees(e,t,n)},this),r},a.prototype.getRecurseCompare=function(e,t){var n=function(r,i){var s=u.isEqual(r,i);return s?(u.each(r.parents,function(r,o){var u=i.parents[o],a=e.commits[r],f=t.commits[u];s=s&&n(a,f)},this),s):!1};return n},a.prototype.compareBranchWithinTrees=function(e,t,n){e=this.convertTreeSafe(e),t=this.convertTreeSafe(t),this.reduceTreeFields([e,t]);var r=this.getRecurseCompare(e,t),i=e.branches[n],s=t.branches[n];return u.isEqual(i,s)&&r(e.commits[i.target],t.commits[s.target])},a.prototype.convertTreeSafe=function(e){return typeof e=="string"?JSON.parse(unescape(e)):e},a.prototype.reduceTreeFields=function(e){var t=["parents","id","rootCommit"],n=["children","parents"],r=["target","id"],i=function(e,t,n,r){var i=e[t];u.each(i,function(i,s){var o={};u.each(n,function(e){i[e]!==undefined&&(o[e]=i[e])}),u.each(r,function(e){i[e]&&(i[e].sort(),o[e]=i[e])}),e[t][s]=o})};u.each(e,function(e){i(e,"commits",t,n),i(e,"branches",r),e.HEAD={target:e.HEAD.target,id:e.HEAD.id}})},a.prototype.compareTrees=function(e,t){return e=this.convertTreeSafe(e),t=this.convertTreeSafe(t),this.reduceTreeFields([e,t]),u.isEqual(e,t)},n.TreeCompare=a}),e("/src/js/git/treeCompare.js"),e.define("/src/js/level/arbiter.js",function(e,t,n,r,i,s,o){function h(){this.levelMap={},this.levelSequences=f,this.sequences=[],this.init();var e;try{e=JSON.parse(localStorage.getItem("solvedMap")||"{}")}catch(t){console.warn("local storage failed",t)}this.solvedMap=e||{},c.getEvents().on("levelSolved",this.levelSolved,this)}var u=e("underscore"),a=e("backbone"),f=e("../levels").levelSequences,l=e("../levels").sequenceInfo,c=e("../app");h.prototype.init=function(){var e;u.each(this.levelSequences,function(e,t){this.sequences.push(t);if(!e||!e.length)throw new Error("no empty sequences allowed");u.each(e,function(e,n){this.validateLevel(e);var r=t+String(n+1),i=u.extend({},e,{index:n,id:r,sequenceName:t});this.levelMap[r]=i,this.levelSequences[t][n]=i},this)},this)},h.prototype.isLevelSolved=function(e){if(!this.levelMap[e])throw new Error("that level doesnt exist!");return Boolean(this.solvedMap[e])},h.prototype.levelSolved=function(e){if(!e)return;this.solvedMap[e]=!0,this.syncToStorage()},h.prototype.resetSolvedMap=function(){this.solvedMap={},this.syncToStorage(),c.getEvents().trigger("levelSolved")},h.prototype.syncToStorage=function(){try{localStorage.setItem("solvedMap",JSON.stringify(this.solvedMap))}catch(e){console.warn("local storage fialed on set",e)}},h.prototype.validateLevel=function(e){e=e||{};var t=["name","goalTreeString","solutionCommand"],n=["hint","disabledMap","startTree"];u.each(t,function(t){if(e[t]===undefined)throw console.log(e),new Error("I need this field for a level: "+t)})},h.prototype.getSequenceToLevels=function(){return this.levelSequences},h.prototype.getSequences=function(){return u.keys(this.levelSequences)},h.prototype.getLevelsInSequence=function(e){if(!this.levelSequences[e])throw new Error("that sequecne name "+e+"does not exist");return this.levelSequences[e]},h.prototype.getSequenceInfo=function(e){return l[e]},h.prototype.getLevel=function(e){return this.levelMap[e]},h.prototype.getNextLevel=function(e){if(!this.levelMap[e])return console.warn("that level doesnt exist!!!"),null;var t=this.levelMap[e],n=t.sequenceName,r=this.levelSequences[n],i=t.index+1;if(i"+e+this.get("warnings").join("
"+e)+"
"},parseOrCatch:function(){this.expandShortcuts(this.get("rawStr"));try{this.processInstants()}catch(e){f.filterError(e),this.set("error",e);return}if(this.parseAll())return;this.set("error",new p({msg:'The command "'+this.get("rawStr")+"\" isn't supported, sorry!"}))},errorChanged:function(){var e=this.get("error");e instanceof p||e instanceof d?this.set("status","error"):e instanceof m?this.set("status","finished"):e instanceof v&&this.set("status","warning"),this.formatError()},formatError:function(){this.set("result",this.get("error").toResult())},expandShortcuts:function(e){e=this.get("parseWaterfall").expandAllShortcuts(e),this.set("rawStr",e)},processInstants:function(){var e=this.get("rawStr");if(!e.length)throw new m({msg:""});this.get("parseWaterfall").processAllInstants(e)},parseAll:function(){var e=this.get("rawStr"),t=this.get("parseWaterfall").parseAll(e);return t?(u.each(t.toSet,function(e,t){this.set(t,e)},this),!0):!1}}),y=a.Model.extend({defaults:{text:""}});n.CommandEntry=y,n.Command=g}),e("/src/js/models/commandModel.js"),e.define("/src/js/util/constants.js",function(e,t,n,r,i,s,o){var u={betweenCommandsDelay:400},a={isAnimating:!1},f={minZoom:.55,maxZoom:1.25,minWidth:600,minHeight:600},l={arrowHeadSize:8,nodeRadius:17,curveControlPointOffset:50,defaultEasing:"easeInOut",defaultAnimationTime:400,rectFill:"hsb(0.8816909813322127,0.7,1)",headRectFill:"#2831FF",rectStroke:"#FFF",rectStrokeWidth:"3",multiBranchY:20,upstreamHeadOpacity:.5,upstreamNoneOpacity:.2,edgeUpstreamHeadOpacity:.4,edgeUpstreamNoneOpacity:.15,visBranchStrokeWidth:2,visBranchStrokeColorNone:"#333",defaultNodeFill:"hsba(0.5,0.8,0.7,1)",defaultNodeStrokeWidth:2,defaultNodeStroke:"#FFF",orphanNodeFill:"hsb(0.5,0.8,0.7)"};n.GLOBAL=a,n.TIME=u,n.GRAPHICS=l,n.VIEWPORT=f}),e("/src/js/util/constants.js"),e.define("/src/js/util/debug.js",function(e,t,n,r,i,s,o){var u=e("underscore"),a={Tree:e("../visuals/tree"),Visuals:e("../visuals"),Git:e("../git"),CommandModel:e("../models/commandModel"),Levels:e("../git/treeCompare"),Constants:e("../util/constants"),Collections:e("../models/collections"),Async:e("../visuals/animation"),AnimationFactory:e("../visuals/animation/animationFactory"),Main:e("../app"),HeadLess:e("../git/headless"),Q:{Q:e("q")},RebaseView:e("../views/rebaseView"),Views:e("../views"),MultiView:e("../views/multiView"),ZoomLevel:e("../util/zoomLevel"),VisBranch:e("../visuals/visBranch"),Level:e("../level"),Sandbox:e("../level/sandbox"),GitDemonstrationView:e("../views/gitDemonstrationView"),Markdown:e("markdown"),LevelDropdownView:e("../views/levelDropdownView"),BuilderViews:e("../views/builderViews")};u.each(a,function(e){u.extend(window,e)}),$(document).ready(function(){window.events=a.Main.getEvents(),window.eventBaton=a.Main.getEventBaton(),window.sandbox=a.Main.getSandbox(),window.modules=a,window.levelDropdown=a.Main.getLevelDropdown()})}),e("/src/js/util/debug.js"),e.define("/src/js/util/errors.js",function(e,t,n,r,i,s,o){var u=e("underscore"),a=e("backbone"),f=a.Model.extend({defaults:{type:"MyError",msg:"Unknown Error"},toString:function(){return this.get("type")+": "+this.get("msg")},getMsg:function(){return this.get("msg")||"Unknown Error"},toResult:function(){return this.get("msg").length?""+this.get("msg").replace(/\n/g,"
")+"
":""}}),l=n.CommandProcessError=f.extend({defaults:{type:"Command Process Error"}}),c=n.CommandResult=f.extend({defaults:{type:"Command Result"}}),h=n.Warning=f.extend({defaults:{type:"Warning"}}),p=n.GitError=f.extend({defaults:{type:"Git Error"}}),d=function(e){if(e instanceof l||e instanceof p||e instanceof c||e instanceof h)return;throw e};n.filterError=d}),e("/src/js/util/errors.js"),e.define("/src/js/util/eventBaton.js",function(e,t,n,r,i,s,o){function a(){this.eventMap={}}var u=e("underscore");a.prototype.stealBaton=function(e,t,n){if(!e)throw new Error("need name");if(!t)throw new Error("need func!");var r=this.eventMap[e]||[];r.push({func:t,context:n}),this.eventMap[e]=r},a.prototype.sliceOffArgs=function(e,t){var n=[];for(var r=e;r0&&!e.length)return;t(e)})},n.genParseCommand=function(e,t){return function(n){var r,i;return u.each(e,function(e,t){var s=e.exec(n);s&&(r=t,i=s)}),r?{toSet:{eventName:t,method:r,regexResults:i}}:!1}}}),e("/src/js/util/index.js"),e.define("/src/js/util/keyboard.js",function(e,t,n,r,i,s,o){function c(e){this.events=e.events||u.clone(a.Events),this.aliasMap=e.aliasMap||{},e.wait||this.listen()}var u=e("underscore"),a=e("backbone"),f=e("../app"),l=function(e){var t={37:"left",38:"up",39:"right",40:"down",27:"esc",13:"enter"};return t[e]};c.prototype.listen=function(){if(this.listening)return;this.listening=!0,f.getEventBaton().stealBaton("docKeydown",this.keydown,this)},c.prototype.mute=function(){this.listening=!1,f.getEventBaton().releaseBaton("docKeydown",this.keydown,this)},c.prototype.keydown=function(e){var t=e.which||e.keyCode,n=l(t);if(n===undefined)return;this.fireEvent(n,e)},c.prototype.fireEvent=function(e,t){e=this.aliasMap[e]||e,this.events.trigger(e,t)},c.prototype.passEventBack=function(e){f.getEventBaton().passBatonBackSoft("docKeydown",this.keydown,this,[e])},n.KeyboardListener=c,n.mapKeycodeToKey=l}),e("/src/js/util/keyboard.js"),e.define("/src/js/util/mock.js",function(e,t,n,r,i,s,o){n.mock=function(e){var t={},n=function(){};for(var r in e.prototype)t[r]=n;return t}}),e("/src/js/util/mock.js"),e.define("/src/js/util/zoomLevel.js",function(e,t,n,r,i,s,o){function f(){return!window.outerWidth||!window.innerWidth?(a&&(console.warn("Can't detect zoom level correctly :-/"),a=!1),1):window.outerWidth/window.innerWidth}var u=e("underscore"),a=!0,l=!0,c=function(e,t){var n=0;setInterval(function(){var r=f();if(r!==n){if(l){l=!1;return}n=r,e.apply(t,[r])}else l=!0},500)};n.setupZoomPoll=c,n.detectZoom=f}),e("/src/js/util/zoomLevel.js"),e.define("/src/js/views/builderViews.js",function(e,t,n,r,i,s,o){var u=e("underscore"),a=e("q"),f=e("../util").isBrowser()?window.Backbone:e("backbone"),l=e("../util"),c=e("../util/keyboard").KeyboardListener,h=e("../views"),p=h.ModalTerminal,d=h.ContainedBase,v=d.extend({tagName:"div",className:"textGrabber box vertical",template:u.template($("#text-grabber").html()),initialize:function(e){e=e||{},this.JSON={helperText:e.helperText||"Enter some text"},this.container=e.container||new p({title:"Enter some text"}),this.render(),e.initialText&&this.setText(e.initialText),e.wait||this.show()},getText:function(){return this.$("textarea").val()},setText:function(e){this.$("textarea").val(e)}}),m=d.extend({tagName:"div",className:"markdownGrabber box horizontal",template:u.template($("#markdown-grabber-view").html()),events:{"keyup textarea":"keyup"},initialize:function(e){e=e||{},this.deferred=e.deferred||a.defer(),e.fromObj&&(e.fillerText=e.fromObj.options.markdowns.join("\n")),this.JSON={previewText:e.previewText||"Preview",fillerText:e.fillerText||"## Enter some markdown!\n\n\n"},this.container=e.container||new p({title:e.title||"Enter some markdown"}),this.render();if(!e.withoutButton){var t=a.defer();t.promise.then(u.bind(this.confirmed,this)).fail(u.bind(this.cancelled,this)).done();var n=new h.ConfirmCancelView({deferred:t,destination:this.getDestination()})}this.updatePreview(),e.wait||this.show()},confirmed:function(){this.die(),this.deferred.resolve(this.getRawText())},cancelled:function(){this.die(),this.deferred.resolve()},keyup:function(){this.throttledPreview||(this.throttledPreview=u.throttle(u.bind(this.updatePreview,this),500)),this.throttledPreview()},getRawText:function(){return this.$("textarea").val()},exportToArray:function(){return this.getRawText().split("\n")},getExportObj:function(){return{markdowns:this.exportToArray()}},updatePreview:function(){var t=this.getRawText(),n=e("markdown").markdown.toHTML(t);this.$("div.insidePreview").html(n)}}),g=d.extend({tagName:"div",className:"markdownPresenter box vertical",template:u.template($("#markdown-presenter").html()),initialize:function(e){e=e||{},this.deferred=e.deferred||a.defer(),this.JSON={previewText:e.previewText||"Here is something for you",fillerText:e.fillerText||"# Yay"},this.container=new p({title:"Check this out..."}),this.render();if(!e.noConfirmCancel){var t=new h.ConfirmCancelView({destination:this.getDestination()});t.deferred.promise.then(u.bind(function(){this.deferred.resolve(this.grabText())},this)).fail(u.bind(function(){this.deferred.reject()},this)).done(u.bind(this.die,this))}this.show()},grabText:function(){return this.$("textarea").val()}}),y=d.extend({tagName:"div",className:"demonstrationBuilder box vertical",template:u.template($("#demonstration-builder").html()),events:{"click div.testButton":"testView"},initialize:function(e){e=e||{},this.deferred=e.deferred||a.defer();if(e.fromObj){var t=e.fromObj.options;e=u.extend({},e,t,{beforeMarkdown:t.beforeMarkdowns.join("\n"),afterMarkdown:t.afterMarkdowns.join("\n")})}this.JSON={},this.container=new p({title:"Demonstration Builder"}),this.render(),this.beforeMarkdownView=new m({container:this,withoutButton:!0,fillerText:e.beforeMarkdown,previewText:"Before demonstration Markdown"}),this.beforeCommandView=new v({container:this,helperText:"The git command(s) to set up the demonstration view (before it is displayed)",initialText:e.beforeCommand||"git checkout -b bugFix"}),this.commandView=new v({container:this,helperText:"The git command(s) to demonstrate to the reader",initialText:e.command||"git commit"}),this.afterMarkdownView=new m({container:this,withoutButton:!0,fillerText:e.afterMarkdown,previewText:"After demonstration Markdown"});var n=a.defer(),r=new h.ConfirmCancelView({deferred:n,destination:this.getDestination()});n.promise.then(u.bind(this.confirmed,this)).fail(u.bind(this.cancelled,this)).done()},testView:function(){var t=e("../views/multiView").MultiView;new t({childViews:[{type:"GitDemonstrationView",options:this.getExportObj()}]})},getExportObj:function(){return{beforeMarkdowns:this.beforeMarkdownView.exportToArray(),afterMarkdowns:this.afterMarkdownView.exportToArray(),command:this.commandView.getText(),beforeCommand:this.beforeCommandView.getText()}},confirmed:function(){this.die(),this.deferred.resolve(this.getExportObj())},cancelled:function(){this.die(),this.deferred.resolve()},getInsideElement:function(){return this.$(".insideBuilder")[0]}}),b=d.extend({tagName:"div",className:"multiViewBuilder box vertical",template:u.template($("#multi-view-builder").html()),typeToConstructor:{ModalAlert:m,GitDemonstrationView:y},events:{"click div.deleteButton":"deleteOneView","click div.testButton":"testOneView","click div.editButton":"editOneView","click div.testEntireView":"testEntireView","click div.addView":"addView","click div.saveView":"saveView","click div.cancelView":"cancel"},initialize:function(e){e=e||{},this.deferred=e.deferred||a.defer(),this.multiViewJSON=e.multiViewJSON||{},this.JSON={views:this.getChildViews(),supportedViews:u.keys(this.typeToConstructor)},this.container=new p({title:"Build a MultiView!"}),this.render(),this.show()},saveView:function(){this.hide(),this.deferred.resolve(this.multiViewJSON)},cancel:function(){this.hide(),this.deferred.resolve()},addView:function(e){var t=e.srcElement,n=$(t).attr("data-type"),r=a.defer(),i=this.typeToConstructor[n],s=new i({deferred:r});r.promise.then(u.bind(function(){var e={type:n,options:s.getExportObj()};this.addChildViewObj(e)},this)).fail(function(){}).done()},testOneView:function(t){var n=t.srcElement,r=$(n).attr("data-index"),i=this.getChildViews()[r],s=e("../views/multiView").MultiView;new s({childViews:[i]})},testEntireView:function(){var t=e("../views/multiView").MultiView;new t({childViews:this.getChildViews()})},editOneView:function(e){var t=e.srcElement,n=$(t).attr("data-index"),r=$(t).attr("data-type"),i=a.defer(),s=new this.typeToConstructor[r]({deferred:i,fromObj:this.getChildViews()[n]});i.promise.then(u.bind(function(){var e={type:r,options:s.getExportObj()},t=this.getChildViews();t[n]=e,this.setChildViews(t)},this)).fail(function(){}).done()},deleteOneView:function(e){var t=e.srcElement,n=$(t).attr("data-index"),r=this.getChildViews(),i=r.slice(0,n).concat(r.slice(n+1));this.setChildViews(i),this.update()},addChildViewObj:function(e,t){var n=this.getChildViews();n.push(e),this.setChildViews(n),this.update()},setChildViews:function(e){this.multiViewJSON.childViews=e},getChildViews:function(){return this.multiViewJSON.childViews||[]},update:function(){this.JSON.views=this.getChildViews(),this.renderAgain()}});n.MarkdownGrabber=m,n.DemonstrationBuilder=y,n.TextGrabber=v,n.MultiViewBuilder=b,n.MarkdownPresenter=g}),e("/src/js/views/builderViews.js"),e.define("/src/js/views/commandViews.js",function(e,t,n,r,i,s,o){var u=e("underscore"),a=e("../util").isBrowser()?a=window.Backbone:a=e("backbone"),f=e("../models/collections").CommandEntryCollection,l=e("../app"),c=e("../models/commandModel").Command,h=e("../models/commandModel").CommandEntry,p=e("../util/errors"),d=p.Warning,v=e("../util"),m=e("../util/keyboard"),g=a.View.extend({initialize:function(e){l.getEvents().on("commandSubmittedPassive",this.addToCommandHistory,this),this.commands=new f,this.commands.fetch({success:u.bind(function(){var e=[];this.commands.each(function(t){e.push(t)}),e.reverse(),this.commands.reset(),u.each(e,function(e){this.commands.add(e)},this)},this)}),this.index=-1,this.commandParagraph=this.$("#prompt p.command")[0],this.commandCursor=this.$("#prompt span.cursor")[0],this.focus(),l.getEvents().on("rollupCommands",this.rollupCommands,this),l.getEventBaton().stealBaton("keydown",this.onKeyDown,this),l.getEventBaton().stealBaton("keyup",this.onKeyUp,this)},events:{"blur #commandTextField":"hideCursor","focus #commandTextField":"showCursor"},blur:function(){this.hideCursor()},focus:function(){this.$("#commandTextField").focus(),this.showCursor()},hideCursor:function(){this.toggleCursor(!1)},showCursor:function(){this.toggleCursor(!0)},toggleCursor:function(e){$(this.commandCursor).toggleClass("shown",e)},onKeyDown:function(e){var t=e.srcElement;this.updatePrompt(t)},onKeyUp:function(e){this.onKeyDown(e);var t={enter:u.bind(function(){this.submit()},this),up:u.bind(function(){this.commandSelectChange(1)},this),down:u.bind(function(){this.commandSelectChange(-1)},this)},n=m.mapKeycodeToKey(e.which||e.keyCode);t[n]!==undefined&&(e.preventDefault(),t[n](),this.onKeyDown(e))},badHtmlEncode:function(e){return e.replace(/&/g,"&").replace(/=this.commands.length||this.index<0){this.clear(),this.index=-1;return}var t=this.commands.toArray()[this.index].get("text");this.setTextField(t)},clearLocalStorage:function(){this.commands.each(function(e){a.sync("delete",e,function(){})},this)},setTextField:function(e){this.$("#commandTextField").val(e)},clear:function(){this.setTextField("")},submit:function(){var e=this.$("#commandTextField").val().replace("\n","");this.clear(),this.submitCommand(e),this.index=-1},rollupCommands:function(e){var t=this.commands.toArray().slice(1,Number(e)+1);t.reverse();var n="";u.each(t,function(e){n+=e.get("text")+";"},this);var r=new h({text:n});this.commands.unshift(r),a.sync("create",r,function(){})},addToCommandHistory:function(e){var t=e.length&&this.index===-1||e.length&&this.index!==-1&&this.commands.toArray()[this.index].get("text")!==e;if(!t)return;var n=new h({text:e});this.commands.unshift(n),a.sync("create",n,function(){}),this.commands.length>100&&this.clearLocalStorage()},submitCommand:function(e){l.getEventBaton().trigger("commandSubmitted",e)}}),y=a.View.extend({tagName:"div",model:c,template:u.template($("#command-template").html()),events:{click:"clicked"},clicked:function(e){},initialize:function(){this.model.bind("change",this.wasChanged,this),this.model.bind("destroy",this.remove,this)},wasChanged:function(e,t){var n=t.changes,r=u.keys(n);u.difference(r,["status"]).length===0?this.updateStatus():this.render()},updateStatus:function(){var e=["inqueue","processing","finished"],t={};u.each(e,function(e){t[e]=!1}),t[this.model.get("status")]=!0;var n=this.$("p.commandLine");u.each(t,function(e,t){n.toggleClass(t,e)})},render:function(){var e=u.extend({resultType:"",result:"",formattedWarnings:this.model.getFormattedWarnings()},this.model.toJSON());return this.$el.html(this.template(e)),this},remove:function(){$(this.el).hide()}}),b=a.View.extend({initialize:function(e){this.collection=e.collection,this.collection.on("add",this.addOne,this),this.collection.on("reset",this.addAll,this),this.collection.on("all",this.render,this),this.collection.on("change",this.scrollDown,this),l.getEvents().on("commandScrollDown",this.scrollDown,this),l.getEvents().on("clearOldCommands",this.clearOldCommands,this)},addWarning:function(e){var t=new d({msg:e}),n=new c({error:t,rawStr:"Warning:"});this.collection.add(n)},clearOldCommands:function(){var e=[];this.collection.each(function(t){t.get("status")!=="inqueue"&&t.get("status")!=="processing"&&e.push(t)},this),u.each(e,function(e){e.destroy()},this),this.scrollDown()},scrollDown:function(){var e=$("#commandDisplay")[0],t=$("#terminal")[0],n=e.clientHeight>t.clientHeight;$(t).toggleClass("scrolling",n),n&&(t.scrollTop=t.scrollHeight)},addOne:function(e){var t=new y({model:e});this.$("#commandDisplay").append(t.render().el),this.scrollDown()},addAll:function(){this.collection.each(this.addOne)}});n.CommandPromptView=g,n.CommandLineHistoryView=b}),e("/src/js/views/commandViews.js"),e.define("/src/js/views/gitDemonstrationView.js",function(e,t,n,r,i,s,o){var u=e("underscore"),a=e("q"),f=e("../util").isBrowser()?window.Backbone:e("backbone"),l=e("../util"),c=e("../util/keyboard").KeyboardListener,h=e("../models/commandModel").Command,p=e("../views").ModalTerminal,d=e("../views").ContainedBase,v=e("../visuals/visualization").Visualization,m=d.extend({tagName:"div",className:"gitDemonstrationView box horizontal",template:u.template($("#git-demonstration-view").html()),events:{"click div.command > p.uiButton":"positive"},initialize:function(t){t=t||{},this.options=t,this.JSON=u.extend({beforeMarkdowns:["## Git Commits","","Awesome!"],command:"git commit",afterMarkdowns:["Now you have seen it in action","","Go ahead and try the level!"]},t);var n=function(t){return e("markdown").markdown.toHTML(t.join("\n"))};this.JSON.beforeHTML=n(this.JSON.beforeMarkdowns),this.JSON.afterHTML=n(this.JSON.afterMarkdowns),this.container=new p({title:t.title||"Git Demonstration"}),this.render(),this.checkScroll(),this.navEvents=u.clone(f.Events),this.navEvents.on("positive",this.positive,this),this.navEvents.on("negative",this.negative,this),this.keyboardListener=new c({events:this.navEvents,aliasMap:{enter:"positive",right:"positive",left:"negative"},wait:!0}),this.visFinished=!1,this.initVis(),t.wait||this.show()},receiveMetaNav:function(e,t){var n=this;e.navEvents.on("positive",this.positive,this),this.metaContainerView=t},checkScroll:function(){var e=this.$("div.demonstrationText").children(),t=u.map(e,function(e){return e.clientHeight}),n=u.reduce(t,function(e,t){return e+t});nc.VIEWPORT.minWidth&&e.h>c.VIEWPORT.minHeight&&this.finish()}}),L=C.extend({initialize:function(e){if(!e||!e.level)throw new Error("need level");this.eventBatonName="zoomChange",this.markdowns=["## That zoom level of "+e.level+" is not supported :-/","Please zoom back to a supported zoom level with Ctrl + and Ctrl -","","(and of course, pull requests to fix this are appreciated :D)"],L.__super__.initialize.apply(this,[e])},batonFired:function(e){e<=c.VIEWPORT.maxZoom&&e>=c.VIEWPORT.minZoom&&this.finish()}}),A=d.extend({tagName:"div",className:"levelToolbarHolder",template:u.template($("#level-toolbar-template").html()),initialize:function(e){e=e||{},this.JSON={name:e.name||"Some level! (unknown name)"},this.beforeDestination=$($("#commandLineHistory div.toolbar")[0]),this.render(),e.wait||s.nextTick(u.bind(this.show,this))},getAnimationTime:function(){return 700},render:function(){var e=this.template(this.JSON);this.$el.html(e),this.beforeDestination.after(this.el)},die:function(){this.hide(),setTimeout(u.bind(function(){this.tearDown()},this),this.getAnimationTime())},hide:function(){this.$("div.toolbar").toggleClass("hidden",!0)},show:function(){this.$("div.toolbar").toggleClass("hidden",!1)}}),O=d.extend({tagName:"div",className:"canvasTerminalHolder box flex1",template:u.template($("#terminal-window-bare-template").html()),events:{"click div.wrapper":"onClick"},initialize:function(e){e=e||{},this.destination=$("body"),this.JSON={title:e.title||"Goal To Reach",text:e.text||'You can hide this window with "hide goal"'},this.render(),e.additionalClass&&this.$el.addClass(e.additionalClass)},getAnimationTime:function(){return 700},onClick:function(){this.slideOut()},die:function(){this.slideOut(),setTimeout(u.bind(function(){this.tearDown()},this))},slideOut:function(){this.slideToggle(!0)},slideIn:function(){this.slideToggle(!1)},slideToggle:function(e){this.$("div.terminal-window-holder").toggleClass("slideOut",e)},getCanvasLocation:function(){return this.$("div.inside")[0]}});n.BaseView=d,n.GeneralButton=y,n.ModalView=E,n.ModalTerminal=S,n.ModalAlert=x,n.ContainedBase=g,n.ConfirmCancelView=b,n.LeftRightView=w,n.ZoomAlertWindow=L,n.ConfirmCancelTerminal=T,n.WindowSizeAlertWindow=k,n.CanvasTerminalHolder=O,n.LevelToolbar=A,n.NextLevelConfirm=N}),e("/src/js/views/index.js"),e.define("/src/js/views/levelDropdownView.js",function(e,t,n,r,i,s,o){var u=e("underscore"),a=e("q"),f=e("../util").isBrowser()?window.Backbone:e("backbone"),l=e("../util"),c=e("../util/keyboard").KeyboardListener,h=e("../app"),p=e("../views").ModalTerminal,d=e("../views").ContainedBase,v=e("../views").BaseView,m=d.extend({tagName:"div",className:"levelDropdownView box vertical",template:u.template($("#level-dropdown-view").html()),initialize:function(e){e=e||{},this.JSON={},this.navEvents=u.clone(f.Events),this.navEvents.on("clickedID",u.debounce(u.bind(this.loadLevelID,this),300,!0)),this.navEvents.on("negative",this.negative,this),this.navEvents.on("positive",this.positive,this),this.navEvents.on("left",this.left,this),this.navEvents.on("right",this.right,this),this.navEvents.on("up",this.up,this),this.navEvents.on("down",this.down,this),this.keyboardListener=new c({events:this.navEvents,aliasMap:{esc:"negative",enter:"positive"},wait:!0}),this.sequences=h.getLevelArbiter().getSequences(),this.sequenceToLevels=h.getLevelArbiter().getSequenceToLevels(),this.container=new p({title:"Select a Level"}),this.render(),this.buildSequences(),e.wait||this.show()},positive:function(){if(!this.selectedID)return;this.loadLevelID(this.selectedID)},left:function(){if(this.turnOnKeyboardSelection())return;this.leftOrRight(-1)},leftOrRight:function(e){this.deselectIconByID(this.selectedID),this.selectedIndex=this.wrapIndex(this.selectedIndex+e,this.getCurrentSequence()),this.selectedID=this.getSelectedID(),this.selectIconByID(this.selectedID)},right:function(){if(this.turnOnKeyboardSelection())return;this.leftOrRight(1)},up:function(){if(this.turnOnKeyboardSelection())return;this.selectedSequence=this.getPreviousSequence(),this.downOrUp()},down:function(){if(this.turnOnKeyboardSelection())return;this.selectedSequence=this.getNextSequence(),this.downOrUp()},downOrUp:function(){this.selectedIndex=this.boundIndex(this.selectedIndex,this.getCurrentSequence()),this.deselectIconByID(this.selectedID),this.selectedID=this.getSelectedID(),this.selectIconByID(this.selectedID)},turnOnKeyboardSelection:function(){return this.selectedID?!1:(this.selectFirst(),!0)},turnOffKeyboardSelection:function(){if(!this.selectedID)return;this.deselectIconByID(this.selectedID),this.selectedID=undefined,this.selectedIndex=undefined,this.selectedSequence=undefined},wrapIndex:function(e,t){return e=e>=t.length?0:e,e=e<0?t.length-1:e,e},boundIndex:function(e,t){return e=e>=t.length?t.length-1:e,e=e<0?0:e,e},getNextSequence:function(){var e=this.getSequenceIndex(this.selectedSequence),t=this.wrapIndex(e+1,this.sequences);return this.sequences[t]},getPreviousSequence:function(){var e=this.getSequenceIndex(this.selectedSequence),t=this.wrapIndex(e-1,this.sequences);return this.sequences[t]},getSequenceIndex:function(e){var t=this.sequences.indexOf(e);if(t<0)throw new Error("didnt find");return t},getIndexForID:function(e){return h.getLevelArbiter().getLevel(e).index},selectFirst:function(){var e=this.sequenceToLevels[this.sequences[0]][0].id;this.selectIconByID(e),this.selectedIndex=0,this.selectedSequence=this.sequences[0]},getCurrentSequence:function(){return this.sequenceToLevels[this.selectedSequence]},getSelectedID:function(){return this.sequenceToLevels[this.selectedSequence][this.selectedIndex].id},selectIconByID:function(e){this.toggleIconSelect(e,!0)},deselectIconByID:function(e){this.toggleIconSelect(e,!1)},toggleIconSelect:function(e,t){this.selectedID=e;var n="#levelIcon-"+e;$(n).toggleClass("selected",t)},negative:function(){this.hide()},testOption:function(e){return this.currentCommand&&(new RegExp("--"+e)).test(this.currentCommand.get("rawStr"))},show:function(e,t){this.currentCommand=t,this.updateSolvedStatus(),this.showDeferred=e,this.keyboardListener.listen(),m.__super__.show.apply(this)},hide:function(){this.showDeferred&&this.showDeferred.resolve(),this.showDeferred=undefined,this.keyboardListener.mute(),this.turnOffKeyboardSelection(),m.__super__.hide.apply(this)},loadLevelID:function(e){this.testOption("noOutput")||h.getEventBaton().trigger("commandSubmitted","level "+e),this.hide()},updateSolvedStatus:function(){u.each(this.seriesViews,function(e){e.updateSolvedStatus()},this)},buildSequences:function(){this.seriesViews=[],u.each(this.sequences,function(e){this.seriesViews.push(new g({destination:this.$el,name:e,navEvents:this.navEvents}))},this)}}),g=v.extend({tagName:"div",className:"seriesView box flex1 vertical",template:u.template($("#series-view").html()),events:{"click div.levelIcon":"click"},initialize:function(e){this.name=e.name||"intro",this.navEvents=e.navEvents,this.info=h.getLevelArbiter().getSequenceInfo(this.name),this.levels=h.getLevelArbiter().getLevelsInSequence(this.name),this.levelIDs=[],u.each(this.levels,function(e){this.levelIDs.push(e.id)},this),this.destination=e.destination,this.JSON={displayName:this.info.displayName,about:this.info.about,ids:this.levelIDs},this.render(),this.updateSolvedStatus()},updateSolvedStatus:function(){var e=this.$("div.levelIcon").each(function(e,t){var n=$(t).attr("data-id");$(t).toggleClass("solved",h.getLevelArbiter().isLevelSolved(n))})},click:function(e){var t=e.srcElement||e.currentTarget;if(!t){console.warn("wut, no id");return}var n=$(t).attr("data-id");this.navEvents.trigger("clickedID",n)}});n.LevelDropdownView=m}),e("/src/js/views/levelDropdownView.js"),e.define("/src/js/views/multiView.js",function(e,t,n,r,i,s,o){var u=e("underscore"),a=e("q"),f=e("../util").isBrowser()?window.Backbone:e("backbone"),l=e("../views").ModalTerminal,c=e("../views").ContainedBase,h=e("../views").ConfirmCancelView,p=e("../views").LeftRightView,d=e("../views").ModalAlert,v=e("../views/gitDemonstrationView").GitDemonstrationView,m=e("../views/builderViews"),g=m.MarkdownPresenter,y=e("../util/keyboard").KeyboardListener,b=e("../util/errors").GitError,w=f.View.extend({tagName:"div",className:"multiView",navEventDebounce:550,deathTime:700,typeToConstructor:{ModalAlert:d,GitDemonstrationView:v,MarkdownPresenter:g},initialize:function(e){e=e||{},this.childViewJSONs=e.childViews||[{type:"ModalAlert",options:{markdown:"Woah wtf!!"}},{type:"GitDemonstrationView",options:{command:"git checkout -b side; git commit; git commit"}},{type:"ModalAlert",options:{markdown:"Im second"}}],this.deferred=e.deferred||a.defer(),this.childViews=[],this.currentIndex=0,this.navEvents=u.clone(f.Events),this.navEvents.on("negative",this.getNegFunc(),this),this.navEvents.on("positive",this.getPosFunc(),this),this.navEvents.on("quit",this.finish,this),this.keyboardListener=new y({events:this.navEvents,aliasMap:{left:"negative",right:"positive",enter:"positive",esc:"quit"}}),this.render(),e.wait||this.start()},onWindowFocus:function(){},getAnimationTime:function(){return 700},getPromise:function(){return this.deferred.promise},getPosFunc:function(){return u.debounce(u.bind(function(){this.navForward()},this),this.navEventDebounce,!0)},getNegFunc:function(){return u.debounce(u.bind(function(){this.navBackward()},this),this.navEventDebounce,!0)},lock:function(){this.locked=!0},unlock:function(){this.locked=!1},navForward:function(){if(this.locked)return;if(this.currentIndex===this.childViews.length-1){this.hideViewIndex(this.currentIndex),this.finish();return}this.navIndexChange(1)},navBackward:function(){if(this.currentIndex===0)return;this.navIndexChange(-1)},navIndexChange:function(e){this.hideViewIndex(this.currentIndex),this.currentIndex+=e,this.showViewIndex(this.currentIndex)},hideViewIndex:function(e){this.childViews[e].hide()},showViewIndex:function(e){this.childViews[e].show()},finish:function(){this.keyboardListener.mute(),u.each(this.childViews,function(e){e.die()}),this.deferred.resolve()},start:function(){this.showViewIndex(this.currentIndex)},createChildView:function(e){var t=e.type;if(!this.typeToConstructor[t])throw new Error('no constructor for type "'+t+'"');var n=new this.typeToConstructor[t](u.extend({},e.options,{wait:!0}));return n},addNavToView:function(e,t){var n=new p({events:this.navEvents,destination:e.getDestination(),showLeft:t!==0,lastNav:t===this.childViewJSONs.length-1});e.receiveMetaNav&&e.receiveMetaNav(n,this)},render:function(){u.each(this.childViewJSONs,function(e,t){var n=this.createChildView(e);this.childViews.push(n),this.addNavToView(n,t)},this)}});n.MultiView=w}),e("/src/js/views/multiView.js"),e.define("/src/js/views/rebaseView.js",function(e,t,n,r,i,s,o){var u=e("../util/errors").GitError,a=e("underscore"),f=e("q"),l=e("../util").isBrowser()?window.Backbone:e("backbone"),c=e("../views").ModalTerminal,h=e("../views").ContainedBase,p=e("../views").ConfirmCancelView,d=e("../views").LeftRightView,v=h.extend({tagName:"div",template:a.template($("#interactive-rebase-template").html()),initialize:function(e){this.deferred=e.deferred,this.rebaseMap={},this.entryObjMap={},this.rebaseEntries=new g,e.toRebase.reverse(),a.each(e.toRebase,function(e){var t=e.get("id");this.rebaseMap[t]=e,this.entryObjMap[t]=new m({id:t}),this.rebaseEntries.add(this.entryObjMap[t])},this),this.container=new c({title:"Interactive Rebase"}),this.render(),this.show()},confirm:function(){this.die();var e=[];this.$("ul.rebaseEntries li").each(function(t,n){e.push(n.id)});var t=[];a.each(e,function(e){this.entryObjMap[e].get("pick")&&t.unshift(this.rebaseMap[e])},this),t.reverse(),this.deferred.resolve(t),this.$el.html("")},render:function(){var e={num:a.keys(this.rebaseMap).length},t=this.container.getInsideElement();this.$el.html(this.template(e)),$(t).append(this.el);var n=this.$("ul.rebaseEntries");this.rebaseEntries.each(function(e){new y({el:n,model:e})},this),n.sortable({axis:"y",placeholder:"rebaseEntry transitionOpacity ui-state-highlight",appendTo:"parent"}),this.makeButtons()},makeButtons:function(){var e=f.defer();e.promise.then(a.bind(function(){this.confirm()},this)).fail(a.bind(function(){this.hide(),this.deferred.resolve([])},this)).done(),new p({destination:this.$(".confirmCancel"),deferred:e})}}),m=l.Model.extend({defaults:{pick:!0},toggle:function(){this.set("pick",!this.get("pick"))}}),g=l.Collection.extend({model:m}),y=l.View.extend({tagName:"li",template:a.template($("#interactive-rebase-entry-template").html()),toggle:function(){this.model.toggle(),this.listEntry.toggleClass("notPicked",!this.model.get("pick"))},initialize:function(e){this.render()},render:function(){var e=this.model.toJSON();this.$el.append(this.template(this.model.toJSON())),this.listEntry=this.$el.children(":last"),this.listEntry.delegate("#toggleButton","click",a.bind(function(){this.toggle()},this))}});n.InteractiveRebaseView=v}),e("/src/js/views/rebaseView.js"),e.define("/src/js/visuals/animation/animationFactory.js",function(e,t,n,r,i,s,o){var u=e("underscore"),a=e("backbone"),f=e("./index").Animation,l=e("../../util/constants").GRAPHICS,c=function(){};c.prototype.genCommitBirthAnimation=function(e,t,n){if(!e)throw new Error("Need animation queue to add closure to!");var r=l.defaultAnimationTime*1,i=r*2,s=t.get("visNode"),o=function(){n.refreshTree(r),s.setBirth(),s.parentInFront(),n.visBranchesFront(),s.animateUpdatedPosition(i,"bounce"),s.animateOutgoingEdges(r)};e.add(new f({closure:o,duration:Math.max(r,i)}))},c.prototype.overrideOpacityDepth2=function(e,t){t=t===undefined?1:t;var n={};return u.each(e,function(e,r){n[r]={},u.each(e,function(e,i){i=="opacity"?n[r][i]=t:n[r][i]=e})}),n},c.prototype.overrideOpacityDepth3=function(e,t){var n={};return u.each(e,function(e,r){n[r]=this.overrideOpacityDepth2(e,t)},this),n},c.prototype.genCommitBirthClosureFromSnapshot=function(e,t){var n=l.defaultAnimationTime*1,r=n*1.5,i=e.newCommit.get("visNode"),s=this.overrideOpacityDepth2(e.afterSnapshot[i.getID()]),o=this.overrideOpacityDepth3(e.afterSnapshot),u=function(){i.setBirthFromSnapshot(e.beforeSnapshot),i.parentInFront(),t.visBranchesFront(),i.animateToAttr(s,r,"bounce"),i.animateOutgoingEdgesToAttr(o,r)};return u},c.prototype.refreshTree=function(e,t){e.add(new f({closure:function(){t.refreshTree()}}))},c.prototype.rebaseAnimation=function(e,t,n,r){this.rebaseHighlightPart(e,t,n),this.rebaseBirthPart(e,t,n,r)},c.prototype.rebaseHighlightPart=function(e,t,n){var r=l.defaultAnimationTime*.66,i=r*2,s=t.toRebaseArray,o=t.destinationBranch.get("visBranch");o||(o=t.destinationBranch.get("visNode")),u.each(s,function(t){var n=t.get("visNode");e.add(new f({closure:function(){n.highlightTo(o,i,"easeInOut")},duration:r*1.5}))},this),this.delay(e,r*2)},c.prototype.rebaseBirthPart=function(e,t,n,r){var i=t.rebaseSteps,s=[];u.each(i,function(e){var t=e.newCommit.get("visNode");s.push(t),t.setOpacity(0),t.setOutgoingEdgesOpacity(0)},this);var o=[];u.each(i,function(t,n){var i=s.slice(n+1),u=this.genFromToSnapshotAnimation(t.beforeSnapshot,t.afterSnapshot,i,o,r),a=this.genCommitBirthClosureFromSnapshot(t,r),c=function(){u(),a()};e.add(new f({closure:c,duration:l.defaultAnimationTime*1.5})),o.push(t.newCommit.get("visNode"))},this),this.delay(e),this.refreshTree(e,r)},c.prototype.delay=function(e,t){t=t||l.defaultAnimationTime,e.add(new f({closure:function(){},duration:t}))},c.prototype.genSetAllCommitOpacities=function(e,t){var n=e.slice(0);return function(){u.each(n,function(e){e.setOpacity(t),e.setOutgoingEdgesOpacity(t)})}},c.prototype.stripObjectsFromSnapshot=function(e,t){var n=[];u.each(t,function(e){n.push(e.getID())});var r={};return u.each(e,function(e,t){if(u.include(n,t))return;r[t]=e},this),r},c.prototype.genFromToSnapshotAnimation=function(e,t,n,r,i){var s=[];u.each(n,function(e){s.push(e),s=s.concat(e.get("outgoingEdges"))});var o=function(e){if(!e)return;u.each(e,function(t,n){e[n].opacity=1})};return u.each([e,t],function(e){u.each(r,function(t){o(e[t.getID()]),u.each(t.get("outgoingEdges"),function(t){o(e[t.getID()])})})}),function(){i.animateAllFromAttrToAttr(e,t,s)}},n.AnimationFactory=c}),e("/src/js/visuals/animation/animationFactory.js"),e.define("/src/js/visuals/animation/index.js",function(e,t,n,r,i,s,o){var u=e("underscore"),a=e("backbone"),f=e("../../util/constants").GLOBAL,l=a.Model.extend({defaults:{duration:300,closure:null},validateAtInit:function(){if(!this.get("closure"))throw new Error("give me a closure!")},initialize:function(e){this.validateAtInit()},run:function(){this.get("closure")()}}),c=a.Model.extend({defaults:{animations:null,index:0,callback:null,defer:!1},initialize:function(e){this.set("animations",[]),e.callback||console.warn("no callback")},add:function(e){if(!e instanceof l)throw new Error("Need animation not something else");this.get("animations").push(e)},start:function(){this.set("index",0),f.isAnimating=!0,this.next()},finish:function(){f.isAnimating=!1,this.get("callback")()},next:function(){var e=this.get("animations"),t=this.get("index");if(t>=e.length){this.finish();return}var n=e[t],r=n.get("duration");n.run(),this.set("index",t+1),setTimeout(u.bind(function(){this.next()},this),r)}});n.Animation=l,n.AnimationQueue=c}),e("/src/js/visuals/animation/index.js"),e.define("/src/js/visuals/index.js",function(e,t,n,r,i,s,o){function w(t){t=t||{},this.options=t,this.commitCollection=t.commitCollection,this.branchCollection=t.branchCollection,this.visNodeMap={},this.visEdgeCollection=new b,this.visBranchCollection=new g,this.commitMap={},this.rootCommit=null,this.branchStackMap=null,this.upstreamBranchSet=null,this.upstreamHeadSet=null,this.paper=t.paper,this.gitReady=!1,this.branchCollection.on("add",this.addBranchFromEvent,this),this.branchCollection.on("remove",this.removeBranch,this),this.deferred=[],this.posBoundaries={min:0,max:1};var n=e("../app");n.getEvents().on("refreshTree",this.refreshTree,this)}function E(e){var t=0,n=0,r=0,i=0,s=e.length;u.each(e,function(e){var s=e.split("(")[1];s=s.split(")")[0],s=s.split(","),r+=parseFloat(s[1]),i+=parseFloat(s[2]);var o=parseFloat(s[0]),u=o*Math.PI*2;t+=Math.cos(u),n+=Math.sin(u)}),t/=s,n/=s,r/=s,i/=s;var o=Math.atan2(n,t)/(Math.PI*2);return o<0&&(o+=1),"hsb("+String(o)+","+String(r)+","+String(i)+")"}var u=e("underscore"),a=e("q"),f=e("backbone"),l=e("../util/constants").GRAPHICS,c=e("../util/constants").GLOBAL,h=e("../models/collections"),p=h.CommitCollection,d=h.BranchCollection,v=e("../visuals/visNode").VisNode,m=e("../visuals/visBranch").VisBranch,g=e("../visuals/visBranch").VisBranchCollection,y=e("../visuals/visEdge").VisEdge,b=e("../visuals/visEdge").VisEdgeCollection;w.prototype.defer=function(e){this.deferred.push(e)},w.prototype.deferFlush=function(){u.each(this.deferred,function(e){e()},this),this.deferred=[]},w.prototype.resetAll=function(){var e=this.visEdgeCollection.toArray();u.each(e,function(e){e.remove()},this);var t=this.visBranchCollection.toArray();u.each(t,function(e){e.remove()},this),u.each(this.visNodeMap,function(e){e.remove()},this),this.visEdgeCollection.reset(),this.visBranchCollection.reset(),this.visNodeMap={},this.rootCommit=null,this.commitMap={}},w.prototype.tearDown=function(){this.resetAll(),this.paper.remove()},w.prototype.assignGitEngine=function(e){this.gitEngine=e,this.initHeadBranch(),this.deferFlush()},w.prototype.initHeadBranch=function(){this.addBranchFromEvent(this.gitEngine.HEAD)},w.prototype.getScreenPadding=function(){return{widthPadding:l.nodeRadius*1.5,heightPadding:l.nodeRadius*1.5}},w.prototype.toScreenCoords=function(e){if(!this.paper.width)throw new Error("being called too early for screen coords");var t=this.getScreenPadding(),n=function(e,t,n){return n+e*(t-n*2)};return{x:n(e.x,this.paper.width,t.widthPadding),y:n(e.y,this.paper.height,t.heightPadding)}},w.prototype.animateAllAttrKeys=function(e,t,n,r){var i=a.defer(),s=function(i){i.animateAttrKeys(e,t,n,r)};this.visBranchCollection.each(s),this.visEdgeCollection.each(s),u.each(this.visNodeMap,s);var o=n!==undefined?n:l.defaultAnimationTime;return setTimeout(function(){i.resolve()},o),i.promise},w.prototype.finishAnimation=function(){var e=this,t=a.defer(),n=a.defer(),r=l.defaultAnimationTime,i=l.nodeRadius,s="Solved!!\n:D",o=null,f=u.bind(function(){o=this.paper.text(this.paper.width/2,this.paper.height/2,s),o.attr({opacity:0,"font-weight":500,"font-size":"32pt","font-family":"Monaco, Courier, font-monospace",stroke:"#000","stroke-width":2,fill:"#000"}),o.animate({opacity:1},r)},this);return t.promise.then(u.bind(function(){return this.animateAllAttrKeys({exclude:["circle"]},{opacity:0},r*1.1)},this)).then(u.bind(function(){return this.animateAllAttrKeys({exclude:["arrow","rect","path","text"]},{r:i*2},r*1.5)},this)).then(u.bind(function(){return this.animateAllAttrKeys({exclude:["arrow","rect","path","text"]},{r:i*.75},r*.5)},this)).then(u.bind(function(){return f(),this.explodeNodes()},this)).then(u.bind(function(){return this.explodeNodes()},this)).then(u.bind(function(){return this.animateAllAttrKeys({exclude:["arrow","rect","path","text"]},{},r*1.25)},this)).then(u.bind(function(){return o.animate({opacity:0},r,undefined,undefined,function(){o.remove()}),this.animateAllAttrKeys({},{})},this)).then(function(){n.resolve()}).fail(function(e){console.warn("animation error"+e)}).done(),t.resolve(),n.promise},w.prototype.explodeNodes=function(){var e=a.defer(),t=[];u.each(this.visNodeMap,function(e){t.push(e.getExplodeStepFunc())});var n=setInterval(function(){var r=[];u.each(t,function(e){e()&&r.push(e)});if(!r.length){clearInterval(n),e.resolve();return}t=r},.025);return e.promise},w.prototype.animateAllFromAttrToAttr=function(e,t,n){var r=function(r){var i=r.getID();if(u.include(n,i))return;if(!e[i]||!t[i])return;r.animateFromAttrToAttr(e[i],t[i])};this.visBranchCollection.each(r),this.visEdgeCollection.each(r),u.each(this.visNodeMap,r)},w.prototype.genSnapshot=function(){this.fullCalc();var e={};return u.each(this.visNodeMap,function(t){e[t.get("id")]=t.getAttributes()},this),this.visBranchCollection.each(function(t){e[t.getID()]=t.getAttributes()},this),this.visEdgeCollection.each(function(t){e[t.getID()]=t.getAttributes()},this),e},w.prototype.refreshTree=function(e){if(!this.gitReady||!this.gitEngine.rootCommit)return;this.fullCalc(),this.animateAll(e)},w.prototype.refreshTreeHarsh=function(){this.fullCalc(),this.animateAll(0)},w.prototype.animateAll=function(e){this.zIndexReflow(),this.animateEdges(e),this.animateNodePositions(e),this.animateRefs(e)},w.prototype.fullCalc=function(){this.calcTreeCoords(),this.calcGraphicsCoords()},w.prototype.calcTreeCoords=function(){if(!this.rootCommit)throw new Error("grr, no root commit!");this.calcUpstreamSets(),this.calcBranchStacks(),this.calcDepth(),this.calcWidth()},w.prototype.calcGraphicsCoords=function(){this.visBranchCollection.each(function(e){e.updateName()})},w.prototype.calcUpstreamSets=function(){this.upstreamBranchSet=this.gitEngine.getUpstreamBranchSet(),this.upstreamHeadSet=this.gitEngine.getUpstreamHeadSet()},w.prototype.getCommitUpstreamBranches=function(e){return this.branchStackMap[e.get("id")]},w.prototype.getBlendedHuesForCommit=function(e){var t=this.upstreamBranchSet[e.get("id")];if(!t)throw new Error("that commit doesnt have upstream branches!");return this.blendHuesFromBranchStack(t)},w.prototype.blendHuesFromBranchStack=function(e){var t=[];return u.each(e,function(e){var n=e.obj.get("visBranch").get("fill");if(n.slice(0,3)!=="hsb"){var r=Raphael.color(n);n="hsb("+String(r.h)+","+String(r.l),n=n+","+String(r.s)+")"}t.push(n)}),E(t)},w.prototype.getCommitUpstreamStatus=function(e){if(!this.upstreamBranchSet)throw new Error("Can't calculate this yet!");var t=e.get("id"),n=this.upstreamBranchSet,r=this.upstreamHeadSet;return n[t]?"branch":r[t]?"head":"none"},w.prototype.calcBranchStacks=function(){var e=this.gitEngine.getBranches(),t={};u.each(e,function(e){var n=e.target.get("id");t[n]=t[n]||[],t[n].push(e),t[n].sort(function(e,t){var n=e.obj.get("id"),r=t.obj.get("id");return n=="master"||r=="master"?n=="master"?-1:1:n.localeCompare(r)})}),this.branchStackMap=t},w.prototype.calcWidth=function(){this.maxWidthRecursive(this.rootCommit),this.assignBoundsRecursive(this.rootCommit,this.posBoundaries.min,this.posBoundaries.max)},w.prototype.maxWidthRecursive=function(e){var t=0;u.each(e.get("children"),function(n){if(n.isMainParent(e)){var r=this.maxWidthRecursive(n);t+=r}},this);var n=Math.max(1,t);return e.get("visNode").set("maxWidth",n),n},w.prototype.assignBoundsRecursive=function(e,t,n){var r=(t+n)/2;e.get("visNode").get("pos").x=r;if(e.get("children").length===0)return;var i=n-t,s=0,o=e.get("children");u.each(o,function(t){t.isMainParent(e)&&(s+=t.get("visNode").getMaxWidthScaled())},this);var a=t;u.each(o,function(t){if(!t.isMainParent(e))return;var n=t.get("visNode").getMaxWidthScaled(),r=n/s*i,o=a,u=o+r;this.assignBoundsRecursive(t,o,u),a=u},this)},w.prototype.calcDepth=function(){var e=this.calcDepthRecursive(this.rootCommit,0);e>15&&console.warn("graphics are degrading from too many layers");var t=this.getDepthIncrement(e);u.each(this.visNodeMap,function(e){e.setDepthBasedOn(t)},this)},w.prototype.animateNodePositions=function(e){u.each(this.visNodeMap,function(t){t.animateUpdatedPosition(e)},this)},w.prototype.addBranchFromEvent=function(e,t,n){var r=u.bind(function(){this.addBranch(e)},this);!this.gitEngine||!this.gitReady?this.defer(r):r()},w.prototype.addBranch=function(e){var t=new m({branch:e,gitVisuals:this,gitEngine:this.gitEngine});this.visBranchCollection.add(t),this.gitReady?t.genGraphics(this.paper):this.defer(u.bind(function(){t.genGraphics(this.paper)},this))},w.prototype.removeVisBranch=function(e){this.visBranchCollection.remove(e)},w.prototype.removeVisNode=function(e){this.visNodeMap[e.getID()]=undefined},w.prototype.removeVisEdge=function(e){this.visEdgeCollection.remove(e)},w.prototype.animateRefs=function(e){this.visBranchCollection.each(function(t){t.animateUpdatedPos(e)},this)},w.prototype.animateEdges=function(e){this.visEdgeCollection.each(function(t){t.animateUpdatedPath(e)},this)},w.prototype.getMinLayers=function(){return this.options.smallCanvas?4:7},w.prototype.getDepthIncrement=function(e){e=Math.max(e,this.getMinLayers());var t=1/e;return t},w.prototype.calcDepthRecursive=function(e,t){e.get("visNode").setDepth(t);var n=e.get("children"),r=t;return u.each(n,function(e){var n=this.calcDepthRecursive(e,t+1);r=Math.max(n,r)},this),r},w.prototype.canvasResize=function(e,t){this.resizeFunc||this.genResizeFunc(),this.resizeFunc(e,t)},w.prototype.genResizeFunc=function(){this.resizeFunc=u.debounce(u.bind(function(t,n){if(c.isAnimating){var r=e("../app");r.getEventBaton().trigger("commandSubmitted","refresh")}else this.refreshTree()},this),200,!0)},w.prototype.addNode=function(e,t){this.commitMap[e]=t,t.get("rootCommit")&&(this.rootCommit=t);var n=new v({id:e,commit:t,gitVisuals:this,gitEngine:this.gitEngine});return this.visNodeMap[e]=n,this.gitReady&&n.genGraphics(this.paper),n},w.prototype.addEdge=function(e,t){var n=this.visNodeMap[e],r=this.visNodeMap[t];if(!n||!r)throw new Error("one of the ids in ("+e+", "+t+") does not exist");var i=new y({tail:n,head:r,gitVisuals:this,gitEngine:this.gitEngine});this.visEdgeCollection.add(i),this.gitReady&&i.genGraphics(this.paper)},w.prototype.zIndexReflow=function(){this.visNodesFront(),this.visBranchesFront()},w.prototype.visNodesFront=function(){u.each(this.visNodeMap,function(e){e.toFront()})},w.prototype.visBranchesFront=function(){this.visBranchCollection.each(function(e){e.nonTextToFront(),e.textToFront()}),this.visBranchCollection.each(function(e){e.textToFrontIfInStack()})},w.prototype.drawTreeFromReload=function(){this.gitReady=!0,this.deferFlush(),this.calcTreeCoords()},w.prototype.drawTreeFirstTime=function(){this.gitReady=!0,this.calcTreeCoords(),u.each(this.visNodeMap,function(e){e.genGraphics(this.paper)},this),this.visEdgeCollection.each(function(e){e.genGraphics(this.paper)},this),this.visBranchCollection.each(function(e){e.genGraphics(this.paper)},this),this.zIndexReflow()},n.GitVisuals=w}),e("/src/js/visuals/index.js"),e.define("/src/js/visuals/tree.js",function(e,t,n,r,i,s,o){var u=e("underscore"),a=e("backbone"),f=a.Model.extend({removeKeys:function(e){u.each(e,function(e){this.get(e)&&this.get(e).remove()},this)},animateAttrKeys:function(e,t,n,r){e=u.extend({},{include:["circle","arrow","rect","path","text"],exclude:[]},e||{});var i=this.getAttributes();u.each(e.include,function(e){i[e]=u.extend({},i[e],t)}),u.each(e.exclude,function(e){delete i[e]}),this.animateToAttr(i,n,r)}});n.VisBase=f}),e("/src/js/visuals/tree.js"),e.define("/src/js/visuals/visBase.js",function(e,t,n,r,i,s,o){var u=e("underscore"),a=e("backbone"),f=a.Model.extend({removeKeys:function(e){u.each(e,function(e){this.get(e)&&this.get(e).remove()},this)},animateAttrKeys:function(e,t,n,r){e=u.extend({},{include:["circle","arrow","rect","path","text"],exclude:[]},e||{});var i=this.getAttributes();u.each(e.include,function(e){i[e]=u.extend({},i[e],t)}),u.each(e.exclude,function(e){delete i[e]}),this.animateToAttr(i,n,r)}});n.VisBase=f}),e("/src/js/visuals/visBase.js"),e.define("/src/js/visuals/visBranch.js",function(e,t,n,r,i,s,o){var u=e("underscore"),a=e("backbone"),f=e("../util/constants").GRAPHICS,l=e("../visuals/visBase").VisBase,c=function(){var e=Math.random(),t="hsb("+String(e)+",0.7,1)";return t},h=l.extend({defaults:{pos:null,text:null,rect:null,arrow:null,isHead:!1,flip:1,fill:f.rectFill,stroke:f.rectStroke,"stroke-width":f.rectStrokeWidth,offsetX:f.nodeRadius*4.75,offsetY:0,arrowHeight:14,arrowInnerSkew:0,arrowEdgeHeight:6,arrowLength:14,arrowOffsetFromCircleX:10,vPad:5,hPad:5,animationSpeed:f.defaultAnimationTime,animationEasing:f.defaultEasing},validateAtInit:function(){if(!this.get("branch"))throw new Error("need a branch!")},getID:function(){return this.get("branch").get("id")},initialize:function(){this.validateAtInit(),this.gitVisuals=this.get("gitVisuals"),this.gitEngine=this.get("gitEngine");if(!this.gitEngine)throw new Error("asd wtf");this.get("branch").set("visBranch",this);var e=this.get("branch").get("id");e=="HEAD"?(this.set("isHead",!0),this.set("flip",-1),this.set("fill",f.headRectFill)):e!=="master"&&this.set("fill",c())},getCommitPosition:function(){var e=this.gitEngine.getCommitFromRef(this.get("branch")),t=e.get("visNode"),n=this.get("gitVisuals").posBoundaries.max;return t.get("pos").x>n?this.set("flip",-1):this.set("flip",1),t.getScreenCoords()},getBranchStackIndex:function(){if(this.get("isHead"))return 0;var e=this.getBranchStackArray(),t=-1;return u.each(e,function(e,n){e.obj==this.get("branch")&&(t=n)},this),t},getBranchStackLength:function(){return this.get("isHead")?1:this.getBranchStackArray().length},getBranchStackArray:function(){var e=this.gitVisuals.branchStackMap[this.get("branch").get("target").get("id")];return e===undefined?(this.gitVisuals.calcBranchStacks(),this.getBranchStackArray()):e},getTextPosition:function(){var e=this.getCommitPosition(),t=this.getBranchStackIndex();return{x:e.x+this.get("flip")*this.get("offsetX"),y:e.y+t*f.multiBranchY+this.get("offsetY")}},getRectPosition:function(){var e=this.getTextPosition(),t=this.get("flip"),n=this.getTextSize();return{x:e.x-.5*n.w-this.get("hPad"),y:e.y-.5*n.h-this.get("vPad")}},getArrowPath:function(){var e=function(e,t,n){return{x:e.x+t,y:e.y+n}},t=function(e){return String(Math.round(e.x))+","+String(Math.round(e.y))},n=this.get("flip"),r=e(this.getCommitPosition(),n*this.get("arrowOffsetFromCircleX"),0),i=e(r,n*this.get("arrowLength"),-this.get("arrowHeight")),s=e(r,n*this.get("arrowLength"),this.get("arrowHeight")),o=e(i,n*this.get("arrowInnerSkew"),this.get("arrowEdgeHeight")),a=e(s,n*this.get("arrowInnerSkew"),-this.get("arrowEdgeHeight")),f=49,l=e(o,n*f,0),c=e(a,n*f,0),h="";h+="M"+t(l)+" ";var p=[o,i,r,s,a,c];return u.each(p,function(e){h+="L"+t(e)+" "},this),h+="z",h},getTextSize:function(){var e=function(e){var t=e.get("text")?e.get("text").node:null;return t===null?0:t.clientWidth},t=function(e){return e.w||(e.w=75),e.h||(e.h=20),e},n=this.get("text").node;if(this.get("isHead"))return t({w:n.clientWidth,h:n.clientHeight});var r=0;return u.each(this.getBranchStackArray(),function(t){r=Math.max(r,e(t.obj.get("visBranch")))}),t({w:r,h:n.clientHeight})},getSingleRectSize:function(){var e=this.getTextSize(),t=this.get("vPad"),n=this.get("hPad");return{w:e.w+t*2,h:e.h+n*2}},getRectSize:function(){var e=this.getTextSize(),t=this.get("vPad"),n=this.get("hPad"),r=this.getBranchStackLength();return{w:e.w+t*2,h:e.h*r*1.1+n*2}},getName:function(){var e=this.get("branch").get("id"),t=this.gitEngine.HEAD.get("target").get("id"),n=t==e?"*":"";return e+n},nonTextToFront:function(){this.get("arrow").toFront(),this.get("rect").toFront()},textToFront:function(){this.get("text").toFront()},textToFrontIfInStack:function(){this.getBranchStackIndex()!==0&&this.get("text").toFront()},getFill:function(){return this.get("isHead")||this.getBranchStackLength()==1||this.getBranchStackIndex()!==0?this.get("fill"):this.gitVisuals.blendHuesFromBranchStack(this.getBranchStackArray())},remove:function(){this.removeKeys(["text","arrow","rect"]),this.gitVisuals.removeVisBranch(this)},genGraphics:function(e){var t=this.getTextPosition(),n=this.getName(),r;r=e.text(t.x,t.y,String(n)),r.attr({"font-size":14,"font-family":"Monaco, Courier, font-monospace",opacity:this.getTextOpacity()}),this.set("text",r);var i=this.getRectPosition(),s=this.getRectSize(),o=e.rect(i.x,i.y,s.w,s.h,8).attr(this.getAttributes().rect);this.set("rect",o);var u=this.getArrowPath(),a=e.path(u).attr(this.getAttributes().arrow);this.set("arrow",a),this.attachClickHandlers(),o.toFront(),r.toFront()},attachClickHandlers:function(){if(this.get("gitVisuals").options.noClick)return;var t="git checkout "+this.get("branch").get("id"),n=e("../app"),r=[this.get("rect"),this.get("text"),this.get("arrow")];u.each(r,function(e){e.click(function(){n.getEventBaton().trigger("commandSubmitted",t)}),$(e.node).css("cursor","pointer")})},updateName:function(){this.get("text").attr({text:this.getName()})},getNonTextOpacity:function(){return this.get("isHead")?this.gitEngine.getDetachedHead()?1:0:this.getBranchStackIndex()===0?1:0},getTextOpacity:function(){return this.get("isHead")?this.gitEngine.getDetachedHead()?1:0:1},getAttributes:function(){var e=this.getNonTextOpacity(),t=this.getTextOpacity();this.updateName();var n=this.getTextPosition(),r=this.getRectPosition(),i=this.getRectSize(),s=this.getArrowPath();return{text:{x:n.x,y:n.y,opacity:t},rect:{x:r.x,y:r.y,width:i.w,height:i.h,opacity:e,fill:this.getFill(),stroke:this.get("stroke"),"stroke-width":this.get("stroke-width")},arrow:{path:s,opacity:e,fill:this.getFill(),stroke:this.get("stroke"),"stroke-width":this.get("stroke-width")}}},animateUpdatedPos:function(e,t){var n=this.getAttributes();this.animateToAttr(n,e,t)},animateFromAttrToAttr:function(e,t,n,r){this.animateToAttr(e,0),this.animateToAttr(t,n,r)},animateToAttr:function(e,t,n){if(t===0){this.get("text").attr(e.text),this.get("rect").attr(e.rect),this.get("arrow").attr(e.arrow);return}var r=t!==undefined?t:this.get("animationSpeed"),i=n||this.get("animationEasing");this.get("text").stop().animate(e.text,r,i),this.get("rect").stop().animate(e.rect,r,i),this.get("arrow").stop().animate(e.arrow,r,i)}}),p=a.Collection.extend({model:h});n.VisBranchCollection=p,n.VisBranch=h,n.randomHueString=c}),e("/src/js/visuals/visBranch.js"),e.define("/src/js/visuals/visEdge.js",function(e,t,n,r,i,s,o){var u=e("underscore"),a=e("backbone"),f=e("../util/constants").GRAPHICS,l=e("../visuals/visBase").VisBase,c=l.extend({defaults:{tail:null,head:null,animationSpeed:f.defaultAnimationTime,animationEasing:f.defaultEasing},validateAtInit:function(){var e=["tail","head"];u.each(e,function(e){if(!this.get(e))throw new Error(e+" is required!")},this)},getID:function(){return this.get("tail").get("id")+"."+this.get("head").get("id")},initialize:function(){this.validateAtInit(),this.gitVisuals=this.get("gitVisuals"),this.gitEngine=this.get("gitEngine"),this.get("tail").get("outgoingEdges").push(this)},remove:function(){this.removeKeys(["path"]),this.gitVisuals.removeVisEdge(this)},genSmoothBezierPathString:function(e,t){var n=e.getScreenCoords(),r=t.getScreenCoords();return this.genSmoothBezierPathStringFromCoords(n,r)},genSmoothBezierPathStringFromCoords:function(e,t){var n=function(e){return String(Math.round(e.x))+","+String(Math.round(e.y))},r=function(e,t,n){return n=n||f.curveControlPointOffset,{x:e.x,y:e.y+n*t}},i=function(e,t,n){return{x:e.x+t,y:e.y+n}};e=r(e,-1,this.get("tail").getRadius()),t=r(t,1,this.get("head").getRadius());var s="";s+="M"+n(e)+" ",s+="C",s+=n(r(e,-1))+" ",s+=n(r(t,1))+" ",s+=n(t);var o=f.arrowHeadSize||10;return s+=" L"+n(i(t,-o,o)),s+=" L"+n(i(t,o,o)),s+=" L"+n(t),s+="C",s+=n(r(t,1))+" ",s+=n(r(e,-1))+" ",s+=n(e),s},getBezierCurve:function(){return this.genSmoothBezierPathString(this.get("tail"),this.get("head"))},getStrokeColor:function(){return f.visBranchStrokeColorNone},setOpacity:function(e){e=e===undefined?1:e,this.get("path").attr({opacity:e})},genGraphics:function(e){var t=this.getBezierCurve(),n=e.path(t).attr({"stroke-width":f.visBranchStrokeWidth,stroke:this.getStrokeColor(),"stroke-linecap":"round","stroke-linejoin":"round",fill:this.getStrokeColor()});n.toBack(),this.set("path",n)},getOpacity:function(){var e=this.gitVisuals.getCommitUpstreamStatus(this.get("tail")),t={branch:1,head:f.edgeUpstreamHeadOpacity,none:f.edgeUpstreamNoneOpacity};if(t[e]===undefined)throw new Error("bad stat");return t[e]},getAttributes:function(){var e=this.getBezierCurve(),t=this.getOpacity();return{path:{path:e,opacity:t}}},animateUpdatedPath:function(e,t){var n=this.getAttributes();this.animateToAttr(n,e,t)},animateFromAttrToAttr:function(e,t,n,r){this.animateToAttr(e,0),this.animateToAttr(t,n,r)},animateToAttr:function(e,t,n){if(t===0){this.get("path").attr(e.path);return}this.get("path").toBack(),this.get("path").stop().animate(e.path,t!==undefined?t:this.get("animationSpeed"),n||this.get("animationEasing"))}}),h=a.Collection.extend({model:c});n.VisEdgeCollection=h,n.VisEdge=c}),e("/src/js/visuals/visEdge.js"),e.define("/src/js/visuals/visNode.js",function(e,t,n,r,i,s,o){var u=e("underscore"),a=e("backbone"),f=e("../util/constants").GRAPHICS,l=e("../visuals/visBase").VisBase,c=l.extend({defaults:{depth:undefined,maxWidth:null,outgoingEdges:null,circle:null,text:null,id:null,pos:null,radius:null,commit:null,animationSpeed:f.defaultAnimationTime,animationEasing:f.defaultEasing,fill:f.defaultNodeFill,"stroke-width":f.defaultNodeStrokeWidth,stroke:f.defaultNodeStroke},getID:function(){return this.get("id")},validateAtInit:function(){if(!this.get("id"))throw new Error("need id for mapping");if(!this.get("commit"))throw new Error("need commit for linking");this.get("pos")||this.set("pos",{x:Math.random(),y:Math.random()})},initialize:function(){this.validateAtInit(),this.gitVisuals=this.get("gitVisuals"),this.gitEngine=this.get("gitEngine"),this.set("outgoingEdges",[])},setDepth:function(e){this.set("depth",Math.max(this.get("depth")||0,e))},setDepthBasedOn:function(e){if(this.get("depth")===undefined){debugger;throw new Error("no depth yet!")}var t=this.get("pos");t.y=this.get("depth")*e},getMaxWidthScaled:function(){var e=this.gitVisuals.getCommitUpstreamStatus(this.get("commit")),t={branch:1,head:.3,none:.1};if(t[e]===undefined)throw new Error("bad stat");return t[e]*this.get("maxWidth")},toFront:function(){this.get("circle").toFront(),this.get("text").toFront()},getOpacity:function(){var e={branch:1,head:f.upstreamHeadOpacity,none:f.upstreamNoneOpacity},t=this.gitVisuals.getCommitUpstreamStatus(this.get("commit"));if(e[t]===undefined)throw new Error("invalid status");return e[t]},getTextScreenCoords:function(){return this.getScreenCoords()},getAttributes:function(){var e=this.getScreenCoords(),t=this.getTextScreenCoords(),n=this.getOpacity();return{circle:{cx:e.x,cy:e.y,opacity:n,r:this.getRadius(),fill:this.getFill(),"stroke-width":this.get("stroke-width"),stroke:this.get("stroke")},text:{x:t.x,y:t.y,opacity:n}}},highlightTo:function(e,t,n){var r=e.get("fill"),i={circle:{fill:r,stroke:r,"stroke-width":this.get("stroke-width")*5},text:{}};this.animateToAttr(i,t,n)},animateUpdatedPosition:function(e,t){var n=this.getAttributes();this.animateToAttr(n,e,t)},animateFromAttrToAttr:function(e,t,n,r){this.animateToAttr(e,0),this.animateToAttr(t,n,r)},animateToSnapshot:function(e,t,n){if(!e[this.getID()])return;this.animateToAttr(e[this.getID()],t,n)},animateToAttr:function(e,t,n){if(t===0){this.get("circle").attr(e.circle),this.get("text").attr(e.text);return}var r=t!==undefined?t:this.get("animationSpeed"),i=n||this.get("animationEasing");this.get("circle").stop().animate(e.circle,r,i),this.get("text").stop().animate(e.text,r,i),n=="bounce"&&e.circle&&e.circle.cx!==undefined&&e.text&&e.text.x!==undefined&&(this.get("circle").animate(e.circle.cx,r,"easeInOut"),this.get("text").animate(e.text.x,r,"easeInOut"))},getScreenCoords:function(){var e=this.get("pos");return this.gitVisuals.toScreenCoords(e)},getRadius:function(){return this.get("radius")||f.nodeRadius},getParentScreenCoords:function(){return this.get("commit").get("parents")[0].get("visNode").getScreenCoords()},setBirthPosition:function(){var e=this.getParentScreenCoords();this.get("circle").attr({cx:e.x,cy:e.y,opacity:0,r:0}),this.get("text").attr({x:e.x,y:e.y,opacity:0})},setBirthFromSnapshot:function(e){var t=this.get("commit").get("parents")[0].get("visNode").getID(),n=e[t];this.get("circle").attr({opacity:0,r:0,cx:n.circle.cx,cy:n.circle.cy}),this.get("text").attr({opacity:0,x:n.text.x,y:n.text.y});var r={x:n.circle.cx,y:n.circle.cy};this.setOutgoingEdgesBirthPosition(r)},setBirth:function(){this.setBirthPosition(),this.setOutgoingEdgesBirthPosition(this.getParentScreenCoords())},setOutgoingEdgesOpacity:function(e){u.each(this.get("outgoingEdges"),function(t){t.setOpacity(e)})},animateOutgoingEdgesToAttr:function(e,t,n){u.each(this.get("outgoingEdges"),function(t){var n=e[t.getID()];t.animateToAttr(n)},this)},animateOutgoingEdges:function(e,t){u.each(this.get("outgoingEdges"),function(n){n.animateUpdatedPath(e,t)},this)},animateOutgoingEdgesFromSnapshot:function(e,t,n){u.each(this.get("outgoingEdges"),function(r){var i=e[r.getID()];r.animateToAttr(i,t,n)},this)},setOutgoingEdgesBirthPosition:function(e){u.each(this.get("outgoingEdges"),function(t){var n=t.get("head").getScreenCoords(),r=t.genSmoothBezierPathStringFromCoords(e,n);t.get("path").stop().attr({path:r,opacity:0})},this)},parentInFront:function(){this.get("commit").get("parents")[0].get("visNode").toFront()},getFontSize:function(e){return e.length<3?12:e.length<5?10:8},getFill:function(){var e=this.gitVisuals.getCommitUpstreamStatus(this.get("commit"));return e=="head"?f.headRectFill:e=="none"?f.orphanNodeFill:this.gitVisuals.getBlendedHuesForCommit(this.get("commit"))},attachClickHandlers:function(){if(this.get("gitVisuals").options.noClick)return;var t="git checkout "+this.get("commit").get("id"),n=e("../app");u.each([this.get("circle"),this.get("text")],function(e){e.click(function(){n.getEventBaton().trigger("commandSubmitted",t)}),$(e.node).css("cursor","pointer")})},setOpacity:function(e){e=e===undefined?1:e;var t=["circle","text"];u.each(t,function(t){this.get(t).attr({opacity:e})},this)},remove:function(){this.removeKeys(["circle"],["text"]);var e=this.get("text");e&&e.remove(),this.gitVisuals.removeVisNode(this)},removeAll:function(){this.remove(),u.each(this.get("outgoingEdges"),function(e){e.remove()},this)},getExplodeStepFunc:function(){var e=this.get("circle"),t=20,n=Math.PI+Math.random()*1*Math.PI,r=.2,i=.01,s=t*Math.cos(n),o=t*Math.sin(n),u=e.attr("cx"),a=e.attr("cy"),f=this.gitVisuals.paper.width,l=this.gitVisuals.paper.height,c=.8,h=1,p=function(){o+=r*h-i*o,s-=i*s,u+=s*h,a+=o*h;if(u<0||u>f)s=c*-s,u=u<0?0:f;if(a<0||a>l)o=c*-o,a=a<0?0:l;return e.attr({cx:u,cy:a}),s*s+o*o<.01&&Math.abs(a-l)===0?!1:!0};return p},genGraphics:function(){var e=this.gitVisuals.paper,t=this.getScreenCoords(),n=this.getTextScreenCoords(),r=e.circle(t.x,t.y,this.getRadius()).attr(this.getAttributes().circle),i=e.text(n.x,n.y,String(this.get("id")));i.attr({"font-size":this.getFontSize(this.get("id")),"font-weight":"bold","font-family":"Monaco, Courier, font-monospace",opacity:this.getOpacity()}),this.set("circle",r),this.set("text",i),this.attachClickHandlers()}});n.VisNode=c}),e("/src/js/visuals/visNode.js"),e.define("/src/js/visuals/visualization.js",function(e,t,n,r,i,s,o){var u=e("underscore"),a=e("../util").isBrowser()?a=window.Backbone:a=e("backbone"),f=e("../models/collections"),l=f.CommitCollection,c=f.BranchCollection,h=e("../util/eventBaton").EventBaton,p=e("../visuals").GitVisuals,d=a.View.extend({initialize:function(e){e=e||{},this.options=e,this.customEvents=u.clone(a.Events),this.containerElement=e.containerElement;var t=this,n=e.containerElement||$("#canvasHolder")[0];new Raphael(n,200,200,function(){var n=this;s.nextTick(function(){t.paperInitialize(n,e)})})},paperInitialize:function(t,n){this.treeString=n.treeString,this.paper=t;var r=e("../app");this.eventBaton=n.noKeyboardInput?new h:r.getEventBaton(),this.commitCollection=new l,this.branchCollection=new c,this.gitVisuals=new p({commitCollection:this.commitCollection,branchCollection:this.branchCollection,paper:this.paper,noClick:this.options.noClick,smallCanvas:this.options.smallCanvas});var i=e("../git").GitEngine;this.gitEngine=new i({collection:this.commitCollection,branches:this.branchCollection,gitVisuals:this.gitVisuals,eventBaton:this.eventBaton}),this.gitEngine.init(),this.gitVisuals.assignGitEngine(this.gitEngine),this.myResize(),$(window).on("resize",u.bind(function(){this.myResize()},this)),this.gitVisuals.drawTreeFirstTime(),this.treeString&&this.gitEngine.loadTreeFromString(this.treeString),this.options.zIndex&&this.setTreeIndex(this.options.zIndex),this.shown=!1,this.setTreeOpacity(0),s.nextTick(u.bind(this.fadeTreeIn,this)),this.customEvents.trigger("gitEngineReady"),this.customEvents.trigger("paperReady")},setTreeIndex:function(e){$(this.paper.canvas).css("z-index",e)},setTreeOpacity:function(e){e===0&&(this.shown=!1),$(this.paper.canvas).css("opacity",e)},getAnimationTime:function(){return 300},fadeTreeIn:function(){this.shown=!0,$(this.paper.canvas).animate({opacity:1},this.getAnimationTime())},fadeTreeOut:function(){this.shown=!1,$(this.paper.canvas).animate({opacity:0},this.getAnimationTime())},hide:function(){this.fadeTreeOut(),setTimeout(u.bind(function(){$(this.paper.canvas).css("visibility","hidden")},this),this.getAnimationTime())},show:function(){$(this.paper.canvas).css("visibility","visible"),setTimeout(u.bind(this.fadeTreeIn,this),10)},showHarsh:function(){$(this.paper.canvas).css("visibility","visible"),this.setTreeOpacity(1)},resetFromThisTreeNow:function(e){this.treeString=e},reset:function(){this.setTreeOpacity(0),this.treeString?this.gitEngine.loadTreeFromString(this.treeString):this.gitEngine.defaultInit(),this.fadeTreeIn()},tearDown:function(){this.gitEngine.tearDown(),this.gitVisuals.tearDown(),delete this.paper},die:function(){this.fadeTreeOut(),setTimeout(u.bind(function(){this.shown||this.tearDown()},this),this.getAnimationTime())},myResize:function(){if(!this.paper)return;var e=1,t=this.el,n=t.clientWidth-e,r=t.clientHeight-e;if(!this.containerElement){var i=t.offsetLeft,s=t.offsetTop;$(this.paper.canvas).css({position:"absolute",left:i+"px",top:s+"px"})}this.paper.setSize(n,r),this.gitVisuals.canvasResize(n,r)}});n.Visualization=d}),e("/src/js/visuals/visualization.js"),e.define("/src/levels/index.js",function(e,t,n,r,i,s,o){n.levelSequences={intro:[e("../../levels/intro/1").level,e("../../levels/intro/2").level,e("../../levels/intro/3").level,e("../../levels/intro/4").level,e("../../levels/intro/5").level],rebase:[e("../../levels/rebase/1").level,e("../../levels/rebase/2").level],mixed:[e("../../levels/mixed/1").level,e("../../levels/mixed/2").level,e("../../levels/mixed/3").level]},n.sequenceInfo={intro:{displayName:"Introduction Sequence",about:"A nicely paced introduction to the majority of git commands"},rebase:{displayName:"Master the Rebase Luke!",about:"What is this whole rebase hotness everyone is talking about? Find out!"},mixed:{displayName:"A Mixed Bag",about:"A mixed bag of Git techniques, tricks, and tips"}}}),e("/src/levels/index.js"),e.define("/src/levels/intro/1.js",function(e,t,n,r,i,s,o){n.level={name:"Introduction to Git Commits",goalTreeString:'{"branches":{"master":{"target":"C3","id":"master"}},"commits":{"C0":{"parents":[],"id":"C0","rootCommit":true},"C1":{"parents":["C0"],"id":"C1"},"C2":{"parents":["C1"],"id":"C2"},"C3":{"parents":["C2"],"id":"C3"}},"HEAD":{"target":"master","id":"HEAD"}}',solutionCommand:"git commit;git commit",startTree:'{"branches":{"master":{"target":"C1","id":"master"}},"commits":{"C0":{"parents":[],"id":"C0","rootCommit":true},"C1":{"parents":["C0"],"id":"C1"}},"HEAD":{"target":"master","id":"HEAD"}}',hint:"Just type in 'git commit' twice to finish!",disabledMap:{"git revert":!0},startDialog:{childViews:[{type:"ModalAlert",options:{markdowns:["## Git Commits","A commit in a git repository records a snapshot of all the files in your directory. It's like a giant copy and paste, but even better!","","Git wants to keep commits as lightweight as possible though, so it doesn't just copy the entire directory every time you commit. It actually stores each commit as a set of changes, or a \"delta\", from one version of the repository to the next. That's why most commits have a parent commit above them -- you'll see this later in our visualizations.","",'In order to clone a repository, you have to unpack or "resolve" all these deltas. That\'s why you might see the command line output:',"","`resolving deltas`","","when cloning a repo.","","It's a lot to take in, but for now you can think of commits as snapshots of the project. Commits are very light and switching between them is wicked fast!"]}},{type:"GitDemonstrationView",options:{beforeMarkdowns:["Let's see what this looks like in practice. On the right we have a visualization of a (small) git repository. There are two commits right now -- the first initial commit, `C0`, and one commit after that `C1` that might have some meaningful changes.","","Hit the button below to make a new commit"],afterMarkdowns:["There we go! Awesome. We just made changes to the repository and saved them as a commit. The commit we just made has a parent, `C1`, which references which commit it was based off of."],command:"git commit",beforeCommand:""}},{type:"ModalAlert",options:{markdowns:["Go ahead and try it out on your own! After this window closes, make two commits to complete the level"]}}]}}}),e("/src/levels/intro/1.js"),e.define("/src/levels/intro/2.js",function(e,t,n,r,i,s,o){n.level={goalTreeString:'{"branches":{"master":{"target":"C1","id":"master"},"bugFix":{"target":"C1","id":"bugFix"}},"commits":{"C0":{"parents":[],"id":"C0","rootCommit":true},"C1":{"parents":["C0"],"id":"C1"}},"HEAD":{"target":"bugFix","id":"HEAD"}}',solutionCommand:"git branch bugFix;git checkout bugFix",hint:'Make a new branch with "git branch [name]" and check it out with "git checkout [name]"',name:"Branching in Git",disabledMap:{"git revert":!0},startDialog:{childViews:[{type:"ModalAlert",options:{markdowns:["## Git Branches","","Branches in Git are incredibly lightweight as well. They are simply references to a specific commit -- nothing more. This is why many Git enthusiasts chant the mantra:","","```","branch early, and branch often","```","","Because there is no storage / memory overhead with making many branches, it's easier to logically divide up your work than have big beefy branches.","",'When we start mixing branches and commits, we will see how these two features combine. For now though, just remember that a branch essentially says "I want to include the work of this commit and all parent commits."']}},{type:"GitDemonstrationView",options:{beforeMarkdowns:["Let's see what branches look like in practice.","","Here we will check out a new branch named `newImage`"],afterMarkdowns:["There, that's all there is to branching! The branch `newImage` now refers to commit `C1`"],command:"git branch newImage",beforeCommand:""}},{type:"GitDemonstrationView",options:{beforeMarkdowns:["Let's try to put some work on this new branch. Hit the button below"],afterMarkdowns:["Oh no! The `master` branch moved but the `newImage` branch didn't! That's because we weren't \"on\" the new branch, which is why the asterisk (*) was on `master`"],command:"git commit",beforeCommand:"git branch newImage"}},{type:"GitDemonstrationView",options:{beforeMarkdowns:["Let's tell git we want to checkout the branch with","","```","git checkout [name]","```","","This will put us on the new branch before committing our changes"],afterMarkdowns:["There we go! Our changes were recorded on the new branch"],command:"git checkout newImage; git commit",beforeCommand:"git branch newImage"}},{type:"ModalAlert",options:{markdowns:["Ok! You are all ready to get branching. Once this window closes,","make a new branch named `bugFix` and switch to that branch"]}}]}}}),e("/src/levels/intro/2.js"),e.define("/src/levels/intro/3.js",function(e,t,n,r,i,s,o){n.level={goalTreeString:'{"branches":{"master":{"target":"C4","id":"master"},"bugFix":{"target":"C2","id":"bugFix"}},"commits":{"C0":{"parents":[],"id":"C0","rootCommit":true},"C1":{"parents":["C0"],"id":"C1"},"C2":{"parents":["C1"],"id":"C2"},"C3":{"parents":["C1"],"id":"C3"},"C4":{"parents":["C2","C3"],"id":"C4"}},"HEAD":{"target":"master","id":"HEAD"}}',solutionCommand:"git checkout -b bugFix;git commit;git checkout master;git commit;git merge bugFix",name:"Merging in Git",hint:"Remember to commit in the order specified (bugFix before master)",disabledMap:{"git revert":!0},startDialog:{childViews:[{type:"ModalAlert",options:{markdowns:["## Branches and Merging","","Great! We now know how to commit and branch. Now we need to learn some kind of way of combining the work from two different branches together. This will allow us to branch off, develop a new feature, and then combine it back in.","",'The first method to combine work that we will examine is `git merge`. Merging in Git creates a special commit that has two unique parents. A commit with two parents essentially means "I want to include all the work from this parent over here and this one over here, *and* the set of all their parents."',"","It's easier with visuals, let's check it out in the next view"]}},{type:"GitDemonstrationView",options:{beforeMarkdowns:["Here we have two branches; each has one commit that's unique. This means that neither branch includes the entire set of \"work\" in the repository that we have done. Let's fix that with merge.","","We will `merge` the branch `bugFix` into `master`"],afterMarkdowns:["Woah! See that? First of all, `master` now points to a commit that has two parents. If you follow the arrows upstream from `master`, you will hit every commit along the way to the root. This means that `master` contains all the work in the repository now.","","Also, see how the colors of the commits changed? To help with learning, I have included some color coordination. Each branch has a unique color. Each commit turns a color that is the blended combination of all the branches that contain that commit.","","So here we see that the `master` branch color is blended into all the commits, but the `bugFix` color is not. Let's fix that..."],command:"git merge bugFix master",beforeCommand:"git checkout -b bugFix; git commit; git checkout master; git commit"}},{type:"GitDemonstrationView",options:{beforeMarkdowns:["Let's merge `master` into `bugFix`:"],afterMarkdowns:["Since `bugFix` was downstream of `master`, git didn't have to do any work; it simply just moved `bugFix` to the same commit `master` was attached to.","","Now all the commits are the same color, which means each branch contains all the work in the repository! Woohoo"],command:"git merge master bugFix",beforeCommand:"git checkout -b bugFix; git commit; git checkout master; git commit; git merge bugFix master"}},{type:"ModalAlert",options:{markdowns:["To complete this level, do the following steps:","","* Make a new branch called `bugFix`","* Checkout the `bugFix` branch with `git checkout bugFix`","* Commit once","* Go back to `master` with `git checkout`","* Commit another time","* Merge the branch `bugFix` into `master` with `git merge`","",'*Remember, you can always re-display this dialog with "help level"!*']}}]}}}),e("/src/levels/intro/3.js"),e.define("/src/levels/intro/4.js",function(e,t,n,r,i,s,o){n.level={goalTreeString:"%7B%22branches%22%3A%7B%22master%22%3A%7B%22target%22%3A%22C3%22%2C%22id%22%3A%22master%22%7D%2C%22bugFix%22%3A%7B%22target%22%3A%22C2%27%22%2C%22id%22%3A%22bugFix%22%7D%7D%2C%22commits%22%3A%7B%22C0%22%3A%7B%22parents%22%3A%5B%5D%2C%22id%22%3A%22C0%22%2C%22rootCommit%22%3Atrue%7D%2C%22C1%22%3A%7B%22parents%22%3A%5B%22C0%22%5D%2C%22id%22%3A%22C1%22%7D%2C%22C2%22%3A%7B%22parents%22%3A%5B%22C1%22%5D%2C%22id%22%3A%22C2%22%7D%2C%22C3%22%3A%7B%22parents%22%3A%5B%22C1%22%5D%2C%22id%22%3A%22C3%22%7D%2C%22C2%27%22%3A%7B%22parents%22%3A%5B%22C3%22%5D%2C%22id%22%3A%22C2%27%22%7D%7D%2C%22HEAD%22%3A%7B%22target%22%3A%22bugFix%22%2C%22id%22%3A%22HEAD%22%7D%7D",solutionCommand:"git checkout -b bugFix;git commit;git checkout master;git commit;git checkout bugFix;git rebase master",name:"Rebase Introduction",hint:"Make sure you commit from bugFix first",disabledMap:{"git revert":!0},startDialog:{childViews:[{type:"ModalAlert",options:{markdowns:["## Git Rebase","",'The second way of combining work between branches is *rebasing.* Rebasing essentially takes a set of commits, "copies" them, and plops them down somewhere else.',"","While this sounds confusing, the advantage of rebasing is that it can be used to make a nice linear sequence of commits. The commit log / history of the repository will be a lot cleaner if only rebasing is allowed.","","Let's see it in action..."]}},{type:"GitDemonstrationView",options:{beforeMarkdowns:["Here we have two branches yet again; note that the bugFix branch is currently selected (note the asterisk)","","We would like to move our work from bugFix directly onto the work from master. That way it would look like these two features were developed sequentially, when in reality they were developed in parallel.","","Let's do that with the `git rebase` command"],afterMarkdowns:["Awesome! Now the work from our bugFix branch is right on top of master and we have a nice linear sequence of commits.","",'Note that the commit C3 still exists somewhere (it has a faded appearance in the tree), and C3\' is the "copy" that we rebased onto master.',"","The only problem is that master hasn't been updated either, let's do that now..."],command:"git rebase master",beforeCommand:"git commit; git checkout -b bugFix C1; git commit"}},{type:"GitDemonstrationView",options:{beforeMarkdowns:["Now we are checked out on the `master` branch. Let's do ahead and rebase onto `bugFix`..."],afterMarkdowns:["There! Since `master` was downstream of `bugFix`, git simply moved the `master` branch reference forward in history."],command:"git rebase bugFix",beforeCommand:"git commit; git checkout -b bugFix C1; git commit; git rebase master; git checkout master"}},{type:"ModalAlert",options:{markdowns:["To complete this level, do the following","","* Checkout a new branch named `bugFix`","* Commit once","* Go back to master and commit again","* Check out bugFix again and rebase onto master","","Good luck!"]}}]}}}),e("/src/levels/intro/4.js"),e.define("/src/levels/intro/5.js",function(e,t,n,r,i,s,o){n.level={goalTreeString:"%7B%22branches%22%3A%7B%22master%22%3A%7B%22target%22%3A%22C1%22%2C%22id%22%3A%22master%22%7D%2C%22pushed%22%3A%7B%22target%22%3A%22C2%27%22%2C%22id%22%3A%22pushed%22%7D%2C%22local%22%3A%7B%22target%22%3A%22C1%22%2C%22id%22%3A%22local%22%7D%7D%2C%22commits%22%3A%7B%22C0%22%3A%7B%22parents%22%3A%5B%5D%2C%22id%22%3A%22C0%22%2C%22rootCommit%22%3Atrue%7D%2C%22C1%22%3A%7B%22parents%22%3A%5B%22C0%22%5D%2C%22id%22%3A%22C1%22%7D%2C%22C2%22%3A%7B%22parents%22%3A%5B%22C1%22%5D%2C%22id%22%3A%22C2%22%7D%2C%22C3%22%3A%7B%22parents%22%3A%5B%22C1%22%5D%2C%22id%22%3A%22C3%22%7D%2C%22C2%27%22%3A%7B%22parents%22%3A%5B%22C2%22%5D%2C%22id%22%3A%22C2%27%22%7D%7D%2C%22HEAD%22%3A%7B%22target%22%3A%22pushed%22%2C%22id%22%3A%22HEAD%22%7D%7D",solutionCommand:"git reset HEAD~1;git checkout pushed;git revert HEAD",startTree:'{"branches":{"master":{"target":"C1","id":"master"},"pushed":{"target":"C2","id":"pushed"},"local":{"target":"C3","id":"local"}},"commits":{"C0":{"parents":[],"id":"C0","rootCommit":true},"C1":{"parents":["C0"],"id":"C1"},"C2":{"parents":["C1"],"id":"C2"},"C3":{"parents":["C1"],"id":"C3"}},"HEAD":{"target":"local","id":"HEAD"}}',name:"Reversing Changes in Git",hint:"",startDialog:{childViews:[{type:"ModalAlert",options:{markdowns:["## Reversing Changes in Git","","There are many ways to reverse changes in Git. And just like committing, reversing changes in Git has both a low-level component (staging individual files or chunks) and a high-level component (how the changes are actually reversed). Our application will focus on the latter.","","There are two primary ways to undo changes in Git -- one is using `git reset` and the other is using `git revert`. We will look at each of these in the next dialog",""]}},{type:"GitDemonstrationView",options:{beforeMarkdowns:["## Git Reset","",'`git reset` reverts changes by moving a branch reference backwards in time to an older commit. In this sense you can think of it as "rewriting history;" `git reset` will move a branch backwards as if the commit had never been made in the first place.',"","Let's see what that looks like:"],afterMarkdowns:["Nice! Git simply moved the master branch reference back to `C1`; now our local repository is in a state as if `C2` had never happened"],command:"git reset HEAD~1",beforeCommand:"git commit"}},{type:"GitDemonstrationView",options:{beforeMarkdowns:["## Git Revert","","While reseting works great for local branches on your own machine, it's method of \"rewriting history\" doesn't work for remote branches that others are using.","","In order to reverse changes and *share* those reversed changes with others, we need to use `git revert`. Let's see it in action"],afterMarkdowns:["Weird, a new commit plopped down below the commit we wanted to reverse. That's because this new commit `C2'` introduces *changes* -- it just happens to introduce changes that exactly reverses the commit of `C2`.","","With reverting, you can push out your changes to share with others."],command:"git revert HEAD",beforeCommand:"git commit"}},{type:"ModalAlert",options:{markdowns:["To complete this level, reverse the two most recent commits on both `local` and `pushed`.","","Keep in mind that `pushed` is a remote branch and `local` is a local branch -- that should help you chose your methods."]}}]}}}),e("/src/levels/intro/5.js"),e.define("/src/levels/mixed/1.js",function(e,t,n,r,i,s,o){n.level={compareOnlyMaster:!0,disabledMap:{"git revert":!0},goalTreeString:"%7B%22branches%22%3A%7B%22master%22%3A%7B%22target%22%3A%22C4%27%22%2C%22id%22%3A%22master%22%7D%2C%22debug%22%3A%7B%22target%22%3A%22C2%22%2C%22id%22%3A%22debug%22%7D%2C%22printf%22%3A%7B%22target%22%3A%22C3%22%2C%22id%22%3A%22printf%22%7D%2C%22bugFix%22%3A%7B%22target%22%3A%22C4%27%22%2C%22id%22%3A%22bugFix%22%7D%7D%2C%22commits%22%3A%7B%22C0%22%3A%7B%22parents%22%3A%5B%5D%2C%22id%22%3A%22C0%22%2C%22rootCommit%22%3Atrue%7D%2C%22C1%22%3A%7B%22parents%22%3A%5B%22C0%22%5D%2C%22id%22%3A%22C1%22%7D%2C%22C2%22%3A%7B%22parents%22%3A%5B%22C1%22%5D%2C%22id%22%3A%22C2%22%7D%2C%22C3%22%3A%7B%22parents%22%3A%5B%22C2%22%5D%2C%22id%22%3A%22C3%22%7D%2C%22C4%22%3A%7B%22parents%22%3A%5B%22C3%22%5D%2C%22id%22%3A%22C4%22%7D%2C%22C4%27%22%3A%7B%22parents%22%3A%5B%22C1%22%5D%2C%22id%22%3A%22C4%27%22%7D%7D%2C%22HEAD%22%3A%7B%22target%22%3A%22master%22%2C%22id%22%3A%22HEAD%22%7D%7D",solutionCommand:"git checkout master;git cherry-pick C4",startTree:'{"branches":{"master":{"target":"C1","id":"master"},"debug":{"target":"C2","id":"debug"},"printf":{"target":"C3","id":"printf"},"bugFix":{"target":"C4","id":"bugFix"}},"commits":{"C0":{"parents":[],"id":"C0","rootCommit":true},"C1":{"parents":["C0"],"id":"C1"},"C2":{"parents":["C1"],"id":"C2"},"C3":{"parents":["C2"],"id":"C3"},"C4":{"parents":["C3"],"id":"C4"}},"HEAD":{"target":"bugFix","id":"HEAD"}}',name:"Grabbing Just 1 Commit",hint:"Remember, interactive rebase or cherry-pick is your friend here",startDialog:{childViews:[{type:"ModalAlert",options:{markdowns:["## Locally stacked commits","","Here's a development situation that often happens: I'm trying to track down a bug but it is quite elusive. In order to aid in my detective work, I put in a few debug commands and a few print statements.","","All of these debugging / print statements are in their own branches. Finally I track down the bug, fix it, and rejoice!","","Only problem is that I now need to get my `bugFix` back into the `master` branch! I could simply fast-forward `master`, but then `master` would get all my debug statements."]}},{type:"ModalAlert",options:{markdowns:["This is where the magic of Git comes in. There are a few ways to do this, but the two most straightforward ways are:","","* `git rebase -i`","* `git cherry-pick`","","Interactive (the `-i`) rebasing allows you to chose which commits you want to keep or discard. It also allows you to reorder commits. This can be helpful if you want to toss out some work.","","Cherry-picking allows you to pick individual commits and plop them down on top of `HEAD`"]}},{type:"ModalAlert",options:{markdowns:["This is a later level so we will leave it up to you to decide, but in order to complete the level, make sure `master` receives the commit that `bugFix` references."]}}]}}}),e("/src/levels/mixed/1.js"),e.define("/src/levels/mixed/2.js",function(e,t,n,r,i,s,o){n.level={disabledMap:{"git cherry-pick":!0,"git revert":!0},compareOnlyMaster:!0,goalTreeString:"%7B%22branches%22%3A%7B%22master%22%3A%7B%22target%22%3A%22C3%27%27%22%2C%22id%22%3A%22master%22%7D%2C%22newImage%22%3A%7B%22target%22%3A%22C2%22%2C%22id%22%3A%22newImage%22%7D%2C%22caption%22%3A%7B%22target%22%3A%22C3%27%27%22%2C%22id%22%3A%22caption%22%7D%7D%2C%22commits%22%3A%7B%22C0%22%3A%7B%22parents%22%3A%5B%5D%2C%22id%22%3A%22C0%22%2C%22rootCommit%22%3Atrue%7D%2C%22C1%22%3A%7B%22parents%22%3A%5B%22C0%22%5D%2C%22id%22%3A%22C1%22%7D%2C%22C2%22%3A%7B%22parents%22%3A%5B%22C1%22%5D%2C%22id%22%3A%22C2%22%7D%2C%22C3%22%3A%7B%22parents%22%3A%5B%22C2%22%5D%2C%22id%22%3A%22C3%22%7D%2C%22C3%27%22%3A%7B%22parents%22%3A%5B%22C1%22%5D%2C%22id%22%3A%22C3%27%22%7D%2C%22C2%27%22%3A%7B%22parents%22%3A%5B%22C3%27%22%5D%2C%22id%22%3A%22C2%27%22%7D%2C%22C2%27%27%22%3A%7B%22parents%22%3A%5B%22C3%27%22%5D%2C%22id%22%3A%22C2%27%27%22%7D%2C%22C2%27%27%27%22%3A%7B%22parents%22%3A%5B%22C1%22%5D%2C%22id%22%3A%22C2%27%27%27%22%7D%2C%22C3%27%27%22%3A%7B%22parents%22%3A%5B%22C2%27%27%27%22%5D%2C%22id%22%3A%22C3%27%27%22%7D%7D%2C%22HEAD%22%3A%7B%22target%22%3A%22master%22%2C%22id%22%3A%22HEAD%22%7D%7D",solutionCommand:"git rebase -i HEAD~2;git commit --amend;git rebase -i HEAD~2;git rebase caption master",startTree:'{"branches":{"master":{"target":"C1","id":"master"},"newImage":{"target":"C2","id":"newImage"},"caption":{"target":"C3","id":"caption"}},"commits":{"C0":{"parents":[],"id":"C0","rootCommit":true},"C1":{"parents":["C0"],"id":"C1"},"C2":{"parents":["C1"],"id":"C2"},"C3":{"parents":["C2"],"id":"C3"}},"HEAD":{"target":"caption","id":"HEAD"}}',name:"Juggling Commits",hint:"The first command is git rebase -i HEAD~2",startDialog:{childViews:[{type:"ModalAlert",options:{markdowns:["## Juggling Commits","","Here's another situation that happens quite commonly. You have some changes (`newImage`) and another set of changes (`caption`) that are related, so they are stacked on top of each other in your repository (aka one after another).","","The tricky thing is that sometimes you need to make a small modification to an earlier commit. In this case, design wants us to change the dimensions of `newImage` slightly, even though that commit is way back in our history!!"]}},{type:"ModalAlert",options:{markdowns:["We will overcome this difficulty by doing the following:","","* We will re-order the commits so the one we want to change is on top with `git rebase -i`","* We will `commit --amend` to make the slight modification","* Then we will re-order the commits back to how they were previously with `git rebase -i`","* Finally, we will move master to this updated part of the tree to finish the level (via your method of choosing)","","There are many ways to accomplish this overall goal (I see you eye-ing cherry-pick), and we will see more of them later, but for now let's focus on this technique."]}},{type:"ModalAlert",options:{markdowns:["Lastly, pay attention to the goal state here -- since we move the commits twice, they both get an apostrophe appended. One more apostrophe is added for the commit we amend, which gives us the final form of the tree "]}}]}}}),e("/src/levels/mixed/2.js"),e.define("/src/levels/mixed/3.js",function(e,t,n,r,i,s,o){n.level={goalTreeString:"%7B%22branches%22%3A%7B%22master%22%3A%7B%22target%22%3A%22C3%27%22%2C%22id%22%3A%22master%22%7D%2C%22newImage%22%3A%7B%22target%22%3A%22C2%22%2C%22id%22%3A%22newImage%22%7D%2C%22caption%22%3A%7B%22target%22%3A%22C3%22%2C%22id%22%3A%22caption%22%7D%7D%2C%22commits%22%3A%7B%22C0%22%3A%7B%22parents%22%3A%5B%5D%2C%22id%22%3A%22C0%22%2C%22rootCommit%22%3Atrue%7D%2C%22C1%22%3A%7B%22parents%22%3A%5B%22C0%22%5D%2C%22id%22%3A%22C1%22%7D%2C%22C2%22%3A%7B%22parents%22%3A%5B%22C1%22%5D%2C%22id%22%3A%22C2%22%7D%2C%22C3%22%3A%7B%22parents%22%3A%5B%22C2%22%5D%2C%22id%22%3A%22C3%22%7D%2C%22C2%27%22%3A%7B%22parents%22%3A%5B%22C1%22%5D%2C%22id%22%3A%22C2%27%22%7D%2C%22C2%27%27%22%3A%7B%22parents%22%3A%5B%22C1%22%5D%2C%22id%22%3A%22C2%27%27%22%7D%2C%22C3%27%22%3A%7B%22parents%22%3A%5B%22C2%27%27%22%5D%2C%22id%22%3A%22C3%27%22%7D%7D%2C%22HEAD%22%3A%7B%22target%22%3A%22master%22%2C%22id%22%3A%22HEAD%22%7D%7D",solutionCommand:"git checkout master;git cherry-pick C2;git commit --amend;git cherry-pick C3",disabledMap:{"git revert":!0},startTree:'{"branches":{"master":{"target":"C1","id":"master"},"newImage":{"target":"C2","id":"newImage"},"caption":{"target":"C3","id":"caption"}},"commits":{"C0":{"parents":[],"id":"C0","rootCommit":true},"C1":{"parents":["C0"],"id":"C1"},"C2":{"parents":["C1"],"id":"C2"},"C3":{"parents":["C2"],"id":"C3"}},"HEAD":{"target":"caption","id":"HEAD"}}',compareOnlyMaster:!0,name:"Juggling Commits #2",hint:"Don't forget to forward master to the updated changes!",startDialog:{childViews:[{type:"ModalAlert",options:{markdowns:["## Juggling Commits #2","","*If you haven't completed Juggling Commits #1 (the previous level), please do so before continuing*","","As you saw in the last level, we used `rebase -i` to reorder the commits. Once the commit we wanted to change was on top, we could easily --amend it and re-order back to our preferred order.","","The only issue here is that there is a lot of reordering going on, which can introduce rebase conflicts. Let's look at another method with `git cherry-pick`"]}},{type:"GitDemonstrationView",options:{beforeMarkdowns:["Remember that git cherry-pick will plop down a commit from anywhere in the tree onto HEAD (as long as that commit isn't upstream).","","Here's a small refresher demo:"],afterMarkdowns:["Nice! Let's move on"],command:"git cherry-pick C2",beforeCommand:"git checkout -b bugFix; git commit; git checkout master; git commit"}},{type:"ModalAlert",options:{markdowns:["So in this level, let's accomplish the same objective of amending `C2` once but avoid using `rebase -i`. I'll leave it up to you to figure it out! :D"]}}]}}}),e("/src/levels/mixed/3.js"),e.define("/src/levels/rebase/1.js",function(e,t,n,r,i,s,o){n.level={compareOnlyMaster:!0,disabledMap:{"git revert":!0},goalTreeString:"%7B%22branches%22%3A%7B%22master%22%3A%7B%22target%22%3A%22C7%27%22%2C%22id%22%3A%22master%22%7D%2C%22bugFix%22%3A%7B%22target%22%3A%22C3%27%22%2C%22id%22%3A%22bugFix%22%7D%2C%22side%22%3A%7B%22target%22%3A%22C6%27%22%2C%22id%22%3A%22side%22%7D%2C%22another%22%3A%7B%22target%22%3A%22C7%27%22%2C%22id%22%3A%22another%22%7D%7D%2C%22commits%22%3A%7B%22C0%22%3A%7B%22parents%22%3A%5B%5D%2C%22id%22%3A%22C0%22%2C%22rootCommit%22%3Atrue%7D%2C%22C1%22%3A%7B%22parents%22%3A%5B%22C0%22%5D%2C%22id%22%3A%22C1%22%7D%2C%22C2%22%3A%7B%22parents%22%3A%5B%22C1%22%5D%2C%22id%22%3A%22C2%22%7D%2C%22C3%22%3A%7B%22parents%22%3A%5B%22C1%22%5D%2C%22id%22%3A%22C3%22%7D%2C%22C4%22%3A%7B%22parents%22%3A%5B%22C0%22%5D%2C%22id%22%3A%22C4%22%7D%2C%22C5%22%3A%7B%22parents%22%3A%5B%22C4%22%5D%2C%22id%22%3A%22C5%22%7D%2C%22C6%22%3A%7B%22parents%22%3A%5B%22C5%22%5D%2C%22id%22%3A%22C6%22%7D%2C%22C7%22%3A%7B%22parents%22%3A%5B%22C5%22%5D%2C%22id%22%3A%22C7%22%7D%2C%22C3%27%22%3A%7B%22parents%22%3A%5B%22C2%22%5D%2C%22id%22%3A%22C3%27%22%7D%2C%22C4%27%22%3A%7B%22parents%22%3A%5B%22C3%27%22%5D%2C%22id%22%3A%22C4%27%22%7D%2C%22C5%27%22%3A%7B%22parents%22%3A%5B%22C4%27%22%5D%2C%22id%22%3A%22C5%27%22%7D%2C%22C6%27%22%3A%7B%22parents%22%3A%5B%22C5%27%22%5D%2C%22id%22%3A%22C6%27%22%7D%2C%22C7%27%22%3A%7B%22parents%22%3A%5B%22C6%27%22%5D%2C%22id%22%3A%22C7%27%22%7D%7D%2C%22HEAD%22%3A%7B%22target%22%3A%22master%22%2C%22id%22%3A%22HEAD%22%7D%7D",solutionCommand:"git checkout bugFix;git rebase master;git checkout side;git rebase bugFix;git checkout another;git rebase side;git rebase another master",startTree:'{"branches":{"master":{"target":"C2","id":"master"},"bugFix":{"target":"C3","id":"bugFix"},"side":{"target":"C6","id":"side"},"another":{"target":"C7","id":"another"}},"commits":{"C0":{"parents":[],"id":"C0","rootCommit":true},"C1":{"parents":["C0"],"id":"C1"},"C2":{"parents":["C1"],"id":"C2"},"C3":{"parents":["C1"],"id":"C3"},"C4":{"parents":["C0"],"id":"C4"},"C5":{"parents":["C4"],"id":"C5"},"C6":{"parents":["C5"],"id":"C6"},"C7":{"parents":["C5"],"id":"C7"}},"HEAD":{"target":"master","id":"HEAD"}}',name:"Rebasing over 9000 times",hint:"Remember, the most efficient way might be to only update master at the end...",startDialog:{childViews:[{type:"ModalAlert",options:{markdowns:["### Rebasing Multiple Branches","","Man, we have a lot of branches going on here! Let's rebase all the work from these branches onto master.","","Upper management is making this a bit trickier though -- they want the commits to all be in sequential order. So this means that our final tree should have `C7'` at the bottom, `C6'` above that, etc etc, etc all in order.","","If you mess up along the way, feel free to use `reset` to start over again. Be sure to check out our solution and see if you can do it in fewer commands!"]}}]}}}),e("/src/levels/rebase/1.js"),e.define("/src/levels/rebase/2.js",function(e,t,n,r,i,s,o){n.level={compareOnlyBranches:!0,disabledMap:{"git revert":!0},goalTreeString:"%7B%22branches%22%3A%7B%22master%22%3A%7B%22target%22%3A%22C5%22%2C%22id%22%3A%22master%22%7D%2C%22one%22%3A%7B%22target%22%3A%22C2%27%22%2C%22id%22%3A%22one%22%7D%2C%22two%22%3A%7B%22target%22%3A%22C2%27%27%22%2C%22id%22%3A%22two%22%7D%2C%22three%22%3A%7B%22target%22%3A%22C2%27%27%27%22%2C%22id%22%3A%22three%22%7D%7D%2C%22commits%22%3A%7B%22C0%22%3A%7B%22parents%22%3A%5B%5D%2C%22id%22%3A%22C0%22%2C%22rootCommit%22%3Atrue%7D%2C%22C1%22%3A%7B%22parents%22%3A%5B%22C0%22%5D%2C%22id%22%3A%22C1%22%7D%2C%22C2%22%3A%7B%22parents%22%3A%5B%22C1%22%5D%2C%22id%22%3A%22C2%22%7D%2C%22C3%22%3A%7B%22parents%22%3A%5B%22C2%22%5D%2C%22id%22%3A%22C3%22%7D%2C%22C4%22%3A%7B%22parents%22%3A%5B%22C3%22%5D%2C%22id%22%3A%22C4%22%7D%2C%22C5%22%3A%7B%22parents%22%3A%5B%22C4%22%5D%2C%22id%22%3A%22C5%22%7D%2C%22C4%27%22%3A%7B%22parents%22%3A%5B%22C1%22%5D%2C%22id%22%3A%22C4%27%22%7D%2C%22C3%27%22%3A%7B%22parents%22%3A%5B%22C4%27%22%5D%2C%22id%22%3A%22C3%27%22%7D%2C%22C2%27%22%3A%7B%22parents%22%3A%5B%22C3%27%22%5D%2C%22id%22%3A%22C2%27%22%7D%2C%22C5%27%22%3A%7B%22parents%22%3A%5B%22C1%22%5D%2C%22id%22%3A%22C5%27%22%7D%2C%22C4%27%27%22%3A%7B%22parents%22%3A%5B%22C5%27%22%5D%2C%22id%22%3A%22C4%27%27%22%7D%2C%22C3%27%27%22%3A%7B%22parents%22%3A%5B%22C4%27%27%22%5D%2C%22id%22%3A%22C3%27%27%22%7D%2C%22C2%27%27%22%3A%7B%22parents%22%3A%5B%22C3%27%27%22%5D%2C%22id%22%3A%22C2%27%27%22%7D%2C%22C2%27%27%27%22%3A%7B%22parents%22%3A%5B%22C1%22%5D%2C%22id%22%3A%22C2%27%27%27%22%7D%7D%2C%22HEAD%22%3A%7B%22target%22%3A%22master%22%2C%22id%22%3A%22HEAD%22%7D%7D",solutionCommand:"git rebase -i HEAD~4;git branch -f master C5;git branch -f one C2';git rebase -i HEAD~4;git branch -f master C5;git branch -f two C2'';git rebase -i HEAD~4;git branch -f master C5;git branch -f three C2'''",startTree:'{"branches":{"master":{"target":"C5","id":"master"},"one":{"target":"C1","id":"one"},"two":{"target":"C1","id":"two"},"three":{"target":"C1","id":"three"}},"commits":{"C0":{"parents":[],"id":"C0","rootCommit":true},"C1":{"parents":["C0"],"id":"C1"},"C2":{"parents":["C1"],"id":"C2"},"C3":{"parents":["C2"],"id":"C3"},"C4":{"parents":["C3"],"id":"C4"},"C5":{"parents":["C4"],"id":"C5"}},"HEAD":{"target":"master","id":"HEAD"}}',name:"Branch Spaghetti",hint:"Make sure to do everything in the proper order! Branch one first, then two, then three",startDialog:{childViews:[{type:"ModalAlert",options:{markdowns:["## Branch Spaghetti","","WOAHHHhhh Nelly! We have quite the goal to reach in this level.","","Here we have `master` that is a few commits ahead of branches `one` `two` and `three`. For whatever reason, we need to update these three other branches with modified versions of the last few commits on master.","","Branch `one` needs a re-ordering and a deletion. `two` needs pure reordering, and `three` only needs one commit!","","We will let you figure out how to solve this one -- make sure to check out our solution afterwards with `show solution`. "]}}]}}}),e("/src/levels/rebase/2.js")})();
\ No newline at end of file
diff --git a/build/bundle.min.7e188d82.js b/build/bundle.min.7e188d82.js
new file mode 100644
index 000000000..60b303687
--- /dev/null
+++ b/build/bundle.min.7e188d82.js
@@ -0,0 +1 @@
+(function(){var e=function(t,n){var r=e.resolve(t,n||"/"),i=e.modules[r];if(!i)throw new Error("Failed to resolve module "+t+", tried "+r);var s=e.cache[r],o=s?s.exports:i();return o};e.paths=[],e.modules={},e.cache={},e.extensions=[".js",".coffee",".json"],e._core={assert:!0,events:!0,fs:!0,path:!0,vm:!0},e.resolve=function(){return function(t,n){function u(t){t=r.normalize(t);if(e.modules[t])return t;for(var n=0;n=0;i--){if(t[i]==="node_modules")continue;var s=t.slice(0,i+1).join("/")+"/node_modules";n.push(s)}return n}n||(n="/");if(e._core[t])return t;var r=e.modules.path();n=r.resolve("/",n);var i=n||"/";if(t.match(/^(?:\.\.?\/|\/)/)){var s=u(r.resolve(i,t))||a(r.resolve(i,t));if(s)return s}var o=f(t,i);if(o)return o;throw new Error("Cannot find module '"+t+"'")}}(),e.alias=function(t,n){var r=e.modules.path(),i=null;try{i=e.resolve(t+"/package.json","/")}catch(s){i=e.resolve(t,"/")}var o=r.dirname(i),u=(Object.keys||function(e){var t=[];for(var n in e)t.push(n);return t})(e.modules);for(var a=0;a=0;r--){var i=e[r];i=="."?e.splice(r,1):i===".."?(e.splice(r,1),n++):n&&(e.splice(r,1),n--)}if(t)for(;n--;n)e.unshift("..");return e}var f=/^(.+\/(?!$)|\/)?((?:.+?)?(\.[^.]*)?)$/;n.resolve=function(){var e="",t=!1;for(var n=arguments.length;n>=-1&&!t;n--){var r=n>=0?arguments[n]:s.cwd();if(typeof r!="string"||!r)continue;e=r+"/"+e,t=r.charAt(0)==="/"}return e=a(u(e.split("/"),function(e){return!!e}),!t).join("/"),(t?"/":"")+e||"."},n.normalize=function(e){var t=e.charAt(0)==="/",n=e.slice(-1)==="/";return e=a(u(e.split("/"),function(e){return!!e}),!t).join("/"),!e&&!t&&(e="."),e&&n&&(e+="/"),(t?"/":"")+e},n.join=function(){var e=Array.prototype.slice.call(arguments,0);return n.normalize(u(e,function(e,t){return e&&typeof e=="string"}).join("/"))},n.dirname=function(e){var t=f.exec(e)[1]||"",n=!1;return t?t.length===1||n&&t.length<=3&&t.charAt(1)===":"?t:t.substring(0,t.length-1):"."},n.basename=function(e,t){var n=f.exec(e)[2]||"";return t&&n.substr(-1*t.length)===t&&(n=n.substr(0,n.length-t.length)),n},n.extname=function(e){return f.exec(e)[3]||""}}),e.define("__browserify_process",function(e,t,n,r,i,s,o){var s=t.exports={};s.nextTick=function(){var e=typeof window!="undefined"&&window.setImmediate,t=typeof window!="undefined"&&window.postMessage&&window.addEventListener;if(e)return function(e){return window.setImmediate(e)};if(t){var n=[];return window.addEventListener("message",function(e){if(e.source===window&&e.data==="browserify-tick"){e.stopPropagation();if(n.length>0){var t=n.shift();t()}}},!0),function(t){n.push(t),window.postMessage("browserify-tick","*")}}return function(t){setTimeout(t,0)}}(),s.title="browser",s.browser=!0,s.env={},s.argv=[],s.binding=function(t){if(t==="evals")return e("vm");throw new Error("No such module. (Possibly not yet loaded)")},function(){var t="/",n;s.cwd=function(){return t},s.chdir=function(r){n||(n=e("path")),t=n.resolve(r,t)}}()}),e.define("/node_modules/underscore/package.json",function(e,t,n,r,i,s,o){t.exports={main:"underscore.js"}}),e.define("/node_modules/underscore/underscore.js",function(e,t,n,r,i,s,o){(function(){var e=this,r=e._,i={},s=Array.prototype,o=Object.prototype,u=Function.prototype,a=s.push,f=s.slice,l=s.concat,c=o.toString,h=o.hasOwnProperty,p=s.forEach,d=s.map,v=s.reduce,m=s.reduceRight,g=s.filter,y=s.every,b=s.some,w=s.indexOf,E=s.lastIndexOf,S=Array.isArray,x=Object.keys,T=u.bind,N=function(e){if(e instanceof N)return e;if(!(this instanceof N))return new N(e);this._wrapped=e};typeof n!="undefined"?(typeof t!="undefined"&&t.exports&&(n=t.exports=N),n._=N):e._=N,N.VERSION="1.4.3";var C=N.each=N.forEach=function(e,t,n){if(e==null)return;if(p&&e.forEach===p)e.forEach(t,n);else if(e.length===+e.length){for(var r=0,s=e.length;r2;e==null&&(e=[]);if(v&&e.reduce===v)return r&&(t=N.bind(t,r)),i?e.reduce(t,n):e.reduce(t);C(e,function(e,s,o){i?n=t.call(r,n,e,s,o):(n=e,i=!0)});if(!i)throw new TypeError(k);return n},N.reduceRight=N.foldr=function(e,t,n,r){var i=arguments.length>2;e==null&&(e=[]);if(m&&e.reduceRight===m)return r&&(t=N.bind(t,r)),i?e.reduceRight(t,n):e.reduceRight(t);var s=e.length;if(s!==+s){var o=N.keys(e);s=o.length}C(e,function(u,a,f){a=o?o[--s]:--s,i?n=t.call(r,n,e[a],a,f):(n=e[a],i=!0)});if(!i)throw new TypeError(k);return n},N.find=N.detect=function(e,t,n){var r;return L(e,function(e,i,s){if(t.call(n,e,i,s))return r=e,!0}),r},N.filter=N.select=function(e,t,n){var r=[];return e==null?r:g&&e.filter===g?e.filter(t,n):(C(e,function(e,i,s){t.call(n,e,i,s)&&(r[r.length]=e)}),r)},N.reject=function(e,t,n){return N.filter(e,function(e,r,i){return!t.call(n,e,r,i)},n)},N.every=N.all=function(e,t,n){t||(t=N.identity);var r=!0;return e==null?r:y&&e.every===y?e.every(t,n):(C(e,function(e,s,o){if(!(r=r&&t.call(n,e,s,o)))return i}),!!r)};var L=N.some=N.any=function(e,t,n){t||(t=N.identity);var r=!1;return e==null?r:b&&e.some===b?e.some(t,n):(C(e,function(e,s,o){if(r||(r=t.call(n,e,s,o)))return i}),!!r)};N.contains=N.include=function(e,t){return e==null?!1:w&&e.indexOf===w?e.indexOf(t)!=-1:L(e,function(e){return e===t})},N.invoke=function(e,t){var n=f.call(arguments,2);return N.map(e,function(e){return(N.isFunction(t)?t:e[t]).apply(e,n)})},N.pluck=function(e,t){return N.map(e,function(e){return e[t]})},N.where=function(e,t){return N.isEmpty(t)?[]:N.filter(e,function(e){for(var n in t)if(t[n]!==e[n])return!1;return!0})},N.max=function(e,t,n){if(!t&&N.isArray(e)&&e[0]===+e[0]&&e.length<65535)return Math.max.apply(Math,e);if(!t&&N.isEmpty(e))return-Infinity;var r={computed:-Infinity,value:-Infinity};return C(e,function(e,i,s){var o=t?t.call(n,e,i,s):e;o>=r.computed&&(r={value:e,computed:o})}),r.value},N.min=function(e,t,n){if(!t&&N.isArray(e)&&e[0]===+e[0]&&e.length<65535)return Math.min.apply(Math,e);if(!t&&N.isEmpty(e))return Infinity;var r={computed:Infinity,value:Infinity};return C(e,function(e,i,s){var o=t?t.call(n,e,i,s):e;or||n===void 0)return 1;if(n>>1;n.call(r,e[u])=0})})},N.difference=function(e){var t=l.apply(s,f.call(arguments,1));return N.filter(e,function(e){return!N.contains(t,e)})},N.zip=function(){var e=f.call(arguments),t=N.max(N.pluck(e,"length")),n=new Array(t);for(var r=0;r=0;n--)t=[e[n].apply(this,t)];return t[0]}},N.after=function(e,t){return e<=0?t():function(){if(--e<1)return t.apply(this,arguments)}},N.keys=x||function(e){if(e!==Object(e))throw new TypeError("Invalid object");var t=[];for(var n in e)N.has(e,n)&&(t[t.length]=n);return t},N.values=function(e){var t=[];for(var n in e)N.has(e,n)&&t.push(e[n]);return t},N.pairs=function(e){var t=[];for(var n in e)N.has(e,n)&&t.push([n,e[n]]);return t},N.invert=function(e){var t={};for(var n in e)N.has(e,n)&&(t[e[n]]=n);return t},N.functions=N.methods=function(e){var t=[];for(var n in e)N.isFunction(e[n])&&t.push(n);return t.sort()},N.extend=function(e){return C(f.call(arguments,1),function(t){if(t)for(var n in t)e[n]=t[n]}),e},N.pick=function(e){var t={},n=l.apply(s,f.call(arguments,1));return C(n,function(n){n in e&&(t[n]=e[n])}),t},N.omit=function(e){var t={},n=l.apply(s,f.call(arguments,1));for(var r in e)N.contains(n,r)||(t[r]=e[r]);return t},N.defaults=function(e){return C(f.call(arguments,1),function(t){if(t)for(var n in t)e[n]==null&&(e[n]=t[n])}),e},N.clone=function(e){return N.isObject(e)?N.isArray(e)?e.slice():N.extend({},e):e},N.tap=function(e,t){return t(e),e};var D=function(e,t,n,r){if(e===t)return e!==0||1/e==1/t;if(e==null||t==null)return e===t;e instanceof N&&(e=e._wrapped),t instanceof N&&(t=t._wrapped);var i=c.call(e);if(i!=c.call(t))return!1;switch(i){case"[object String]":return e==String(t);case"[object Number]":return e!=+e?t!=+t:e==0?1/e==1/t:e==+t;case"[object Date]":case"[object Boolean]":return+e==+t;case"[object RegExp]":return e.source==t.source&&e.global==t.global&&e.multiline==t.multiline&&e.ignoreCase==t.ignoreCase}if(typeof e!="object"||typeof t!="object")return!1;var s=n.length;while(s--)if(n[s]==e)return r[s]==t;n.push(e),r.push(t);var o=0,u=!0;if(i=="[object Array]"){o=e.length,u=o==t.length;if(u)while(o--)if(!(u=D(e[o],t[o],n,r)))break}else{var a=e.constructor,f=t.constructor;if(a!==f&&!(N.isFunction(a)&&a instanceof a&&N.isFunction(f)&&f instanceof f))return!1;for(var l in e)if(N.has(e,l)){o++;if(!(u=N.has(t,l)&&D(e[l],t[l],n,r)))break}if(u){for(l in t)if(N.has(t,l)&&!(o--))break;u=!o}}return n.pop(),r.pop(),u};N.isEqual=function(e,t){return D(e,t,[],[])},N.isEmpty=function(e){if(e==null)return!0;if(N.isArray(e)||N.isString(e))return e.length===0;for(var t in e)if(N.has(e,t))return!1;return!0},N.isElement=function(e){return!!e&&e.nodeType===1},N.isArray=S||function(e){return c.call(e)=="[object Array]"},N.isObject=function(e){return e===Object(e)},C(["Arguments","Function","String","Number","Date","RegExp"],function(e){N["is"+e]=function(t){return c.call(t)=="[object "+e+"]"}}),N.isArguments(arguments)||(N.isArguments=function(e){return!!e&&!!N.has(e,"callee")}),typeof /./!="function"&&(N.isFunction=function(e){return typeof e=="function"}),N.isFinite=function(e){return isFinite(e)&&!isNaN(parseFloat(e))},N.isNaN=function(e){return N.isNumber(e)&&e!=+e},N.isBoolean=function(e){return e===!0||e===!1||c.call(e)=="[object Boolean]"},N.isNull=function(e){return e===null},N.isUndefined=function(e){return e===void 0},N.has=function(e,t){return h.call(e,t)},N.noConflict=function(){return e._=r,this},N.identity=function(e){return e},N.times=function(e,t,n){var r=Array(e);for(var i=0;i":">",'"':""","'":"'","/":"/"}};P.unescape=N.invert(P.escape);var H={escape:new RegExp("["+N.keys(P.escape).join("")+"]","g"),unescape:new RegExp("("+N.keys(P.unescape).join("|")+")","g")};N.each(["escape","unescape"],function(e){N[e]=function(t){return t==null?"":(""+t).replace(H[e],function(t){return P[e][t]})}}),N.result=function(e,t){if(e==null)return null;var n=e[t];return N.isFunction(n)?n.call(e):n},N.mixin=function(e){C(N.functions(e),function(t){var n=N[t]=e[t];N.prototype[t]=function(){var e=[this._wrapped];return a.apply(e,arguments),q.call(this,n.apply(N,e))}})};var B=0;N.uniqueId=function(e){var t=""+ ++B;return e?e+t:t},N.templateSettings={evaluate:/<%([\s\S]+?)%>/g,interpolate:/<%=([\s\S]+?)%>/g,escape:/<%-([\s\S]+?)%>/g};var j=/(.)^/,F={"'":"'","\\":"\\","\r":"r","\n":"n"," ":"t","\u2028":"u2028","\u2029":"u2029"},I=/\\|'|\r|\n|\t|\u2028|\u2029/g;N.template=function(e,t,n){n=N.defaults({},n,N.templateSettings);var r=new RegExp([(n.escape||j).source,(n.interpolate||j).source,(n.evaluate||j).source].join("|")+"|$","g"),i=0,s="__p+='";e.replace(r,function(t,n,r,o,u){return s+=e.slice(i,u).replace(I,function(e){return"\\"+F[e]}),n&&(s+="'+\n((__t=("+n+"))==null?'':_.escape(__t))+\n'"),r&&(s+="'+\n((__t=("+r+"))==null?'':__t)+\n'"),o&&(s+="';\n"+o+"\n__p+='"),i=u+t.length,t}),s+="';\n",n.variable||(s="with(obj||{}){\n"+s+"}\n"),s="var __t,__p='',__j=Array.prototype.join,print=function(){__p+=__j.call(arguments,'');};\n"+s+"return __p;\n";try{var o=new Function(n.variable||"obj","_",s)}catch(u){throw u.source=s,u}if(t)return o(t,N);var a=function(e){return o.call(this,e,N)};return a.source="function("+(n.variable||"obj")+"){\n"+s+"}",a},N.chain=function(e){return N(e).chain()};var q=function(e){return this._chain?N(e).chain():e};N.mixin(N),C(["pop","push","reverse","shift","sort","splice","unshift"],function(e){var t=s[e];N.prototype[e]=function(){var n=this._wrapped;return t.apply(n,arguments),(e=="shift"||e=="splice")&&n.length===0&&delete n[0],q.call(this,n)}}),C(["concat","join","slice"],function(e){var t=s[e];N.prototype[e]=function(){return q.call(this,t.apply(this._wrapped,arguments))}}),N.extend(N.prototype,{chain:function(){return this._chain=!0,this},value:function(){return this._wrapped}})}).call(this)}),e.define("/node_modules/backbone/package.json",function(e,t,n,r,i,s,o){t.exports={main:"backbone.js"}}),e.define("/node_modules/backbone/backbone.js",function(e,t,n,r,i,s,o){(function(){var t=this,r=t.Backbone,i=[],s=i.push,o=i.slice,u=i.splice,a;typeof n!="undefined"?a=n:a=t.Backbone={},a.VERSION="0.9.9";var f=t._;!f&&typeof e!="undefined"&&(f=e("underscore")),a.$=t.jQuery||t.Zepto||t.ender,a.noConflict=function(){return t.Backbone=r,this},a.emulateHTTP=!1,a.emulateJSON=!1;var l=/\s+/,c=function(e,t,n,r){if(!n)return!0;if(typeof n=="object")for(var i in n)e[t].apply(e,[i,n[i]].concat(r));else{if(!l.test(n))return!0;var s=n.split(l);for(var o=0,u=s.length;o=0;r-=2)this.trigger("change:"+n[r],this,n[r+1],e);if(t)return this;while(this._pending)this._pending=!1,this.trigger("change",this,e),this._previousAttributes=f.clone(this.attributes);return this._changing=!1,this},hasChanged:function(e){return this._hasComputed||this._computeChanges(),e==null?!f.isEmpty(this.changed):f.has(this.changed,e)},changedAttributes:function(e){if(!e)return this.hasChanged()?f.clone(this.changed):!1;var t,n=!1,r=this._previousAttributes;for(var i in e){if(f.isEqual(r[i],t=e[i]))continue;(n||(n={}))[i]=t}return n},_computeChanges:function(e){this.changed={};var t={},n=[],r=this._currentAttributes,i=this._changes;for(var s=i.length-2;s>=0;s-=2){var o=i[s],u=i[s+1];if(t[o])continue;t[o]=!0;if(r[o]!==u){this.changed[o]=u;if(!e)continue;n.push(o,u),r[o]=u}}return e&&(this._changes=[]),this._hasComputed=!0,n},previous:function(e){return e==null||!this._previousAttributes?null:this._previousAttributes[e]},previousAttributes:function(){return f.clone(this._previousAttributes)},_validate:function(e,t){if(!this.validate)return!0;e=f.extend({},this.attributes,e);var n=this.validate(e,t);return n?(t&&t.error&&t.error(this,n,t),this.trigger("error",this,n,t),!1):!0}});var v=a.Collection=function(e,t){t||(t={}),t.model&&(this.model=t.model),t.comparator!==void 0&&(this.comparator=t.comparator),this._reset(),this.initialize.apply(this,arguments),e&&this.reset(e,f.extend({silent:!0},t))};f.extend(v.prototype,p,{model:d,initialize:function(){},toJSON:function(e){return this.map(function(t){return t.toJSON(e)})},sync:function(){return a.sync.apply(this,arguments)},add:function(e,t){var n,r,i,o,a,l,c=t&&t.at,h=(t&&t.sort)==null?!0:t.sort;e=f.isArray(e)?e.slice():[e];for(n=e.length-1;n>=0;n--){if(!(o=this._prepareModel(e[n],t))){this.trigger("error",this,e[n],t),e.splice(n,1);continue}e[n]=o,a=o.id!=null&&this._byId[o.id];if(a||this._byCid[o.cid]){t&&t.merge&&a&&(a.set(o.attributes,t),l=h),e.splice(n,1);continue}o.on("all",this._onModelEvent,this),this._byCid[o.cid]=o,o.id!=null&&(this._byId[o.id]=o)}e.length&&(l=h),this.length+=e.length,r=[c!=null?c:this.models.length,0],s.apply(r,e),u.apply(this.models,r),l&&this.comparator&&c==null&&this.sort({silent:!0});if(t&&t.silent)return this;while(o=e.shift())o.trigger("add",o,this,t);return this},remove:function(e,t){var n,r,i,s;t||(t={}),e=f.isArray(e)?e.slice():[e];for(n=0,r=e.length;n').hide().appendTo("body")[0].contentWindow,this.navigate(t)),this._hasPushState?a.$(window).bind("popstate",this.checkUrl):this._wantsHashChange&&"onhashchange"in window&&!r?a.$(window).bind("hashchange",this.checkUrl):this._wantsHashChange&&(this._checkUrlInterval=setInterval(this.checkUrl,this.interval)),this.fragment=t;var i=this.location,s=i.pathname.replace(/[^\/]$/,"$&/")===this.root;if(this._wantsHashChange&&this._wantsPushState&&!this._hasPushState&&!s)return this.fragment=this.getFragment(null,!0),this.location.replace(this.root+this.location.search+"#"+this.fragment),!0;this._wantsPushState&&this._hasPushState&&s&&i.hash&&(this.fragment=this.getHash().replace(T,""),this.history.replaceState({},document.title,this.root+this.fragment+i.search));if(!this.options.silent)return this.loadUrl()},stop:function(){a.$(window).unbind("popstate",this.checkUrl).unbind("hashchange",this.checkUrl),clearInterval(this._checkUrlInterval),x.started=!1},route:function(e,t){this.handlers.unshift({route:e,callback:t})},checkUrl:function(e){var t=this.getFragment();t===this.fragment&&this.iframe&&(t=this.getFragment(this.getHash(this.iframe)));if(t===this.fragment)return!1;this.iframe&&this.navigate(t),this.loadUrl()||this.loadUrl(this.getHash())},loadUrl:function(e){var t=this.fragment=this.getFragment(e),n=f.any(this.handlers,function(e){if(e.route.test(t))return e.callback(t),!0});return n},navigate:function(e,t){if(!x.started)return!1;if(!t||t===!0)t={trigger:t};e=this.getFragment(e||"");if(this.fragment===e)return;this.fragment=e;var n=this.root+e;if(this._hasPushState)this.history[t.replace?"replaceState":"pushState"]({},document.title,n);else{if(!this._wantsHashChange)return this.location.assign(n);this._updateHash(this.location,e,t.replace),this.iframe&&e!==this.getFragment(this.getHash(this.iframe))&&(t.replace||this.iframe.document.open().close(),this._updateHash(this.iframe.location,e,t.replace))}t.trigger&&this.loadUrl(e)},_updateHash:function(e,t,n){if(n){var r=e.href.replace(/(javascript:|#).*$/,"");e.replace(r+"#"+t)}else e.hash="#"+t}}),a.history=new x;var L=a.View=function(e){this.cid=f.uniqueId("view"),this._configure(e||{}),this._ensureElement(),this.initialize.apply(this,arguments),this.delegateEvents()},A=/^(\S+)\s*(.*)$/,O=["model","collection","el","id","attributes","className","tagName","events"];f.extend(L.prototype,p,{tagName:"div",$:function(e){return this.$el.find(e)},initialize:function(){},render:function(){return this},remove:function(){return this.$el.remove(),this.stopListening(),this},make:function(e,t,n){var r=document.createElement(e);return t&&a.$(r).attr(t),n!=null&&a.$(r).html(n),r},setElement:function(e,t){return this.$el&&this.undelegateEvents(),this.$el=e instanceof a.$?e:a.$(e),this.el=this.$el[0],t!==!1&&this.delegateEvents(),this},delegateEvents:function(e){if(!e&&!(e=f.result(this,"events")))return;this.undelegateEvents();for(var t in e){var n=e[t];f.isFunction(n)||(n=this[e[t]]);if(!n)throw new Error('Method "'+e[t]+'" does not exist');var r=t.match(A),i=r[1],s=r[2];n=f.bind(n,this),i+=".delegateEvents"+this.cid,s===""?this.$el.bind(i,n):this.$el.delegate(s,i,n)}},undelegateEvents:function(){this.$el.unbind(".delegateEvents"+this.cid)},_configure:function(e){this.options&&(e=f.extend({},f.result(this,"options"),e)),f.extend(this,f.pick(e,O)),this.options=e},_ensureElement:function(){if(!this.el){var e=f.extend({},f.result(this,"attributes"));this.id&&(e.id=f.result(this,"id")),this.className&&(e["class"]=f.result(this,"className")),this.setElement(this.make(f.result(this,"tagName"),e),!1)}else this.setElement(f.result(this,"el"),!1)}});var M={create:"POST",update:"PUT",patch:"PATCH","delete":"DELETE",read:"GET"};a.sync=function(e,t,n){var r=M[e];f.defaults(n||(n={}),{emulateHTTP:a.emulateHTTP,emulateJSON:a.emulateJSON});var i={type:r,dataType:"json"};n.url||(i.url=f.result(t,"url")||D()),n.data==null&&t&&(e==="create"||e==="update"||e==="patch")&&(i.contentType="application/json",i.data=JSON.stringify(n.attrs||t.toJSON(n))),n.emulateJSON&&(i.contentType="application/x-www-form-urlencoded",i.data=i.data?{model:i.data}:{});if(n.emulateHTTP&&(r==="PUT"||r==="DELETE"||r==="PATCH")){i.type="POST",n.emulateJSON&&(i.data._method=r);var s=n.beforeSend;n.beforeSend=function(e){e.setRequestHeader("X-HTTP-Method-Override",r);if(s)return s.apply(this,arguments)}}i.type!=="GET"&&!n.emulateJSON&&(i.processData=!1);var o=n.success;n.success=function(e,r,i){o&&o(e,r,i),t.trigger("sync",t,e,n)};var u=n.error;n.error=function(e,r,i){u&&u(t,e,n),t.trigger("error",t,e,n)};var l=a.ajax(f.extend(i,n));return t.trigger("request",t,l,n),l},a.ajax=function(){return a.$.ajax.apply(a.$,arguments)};var _=function(e,t){var n=this,r;e&&f.has(e,"constructor")?r=e.constructor:r=function(){n.apply(this,arguments)},f.extend(r,n,t);var i=function(){this.constructor=r};return i.prototype=n.prototype,r.prototype=new i,e&&f.extend(r.prototype,e),r.__super__=n.prototype,r};d.extend=v.extend=y.extend=L.extend=x.extend=_;var D=function(){throw new Error('A "url" property or function must be specified')}}).call(this)}),e.define("/node_modules/backbone/node_modules/underscore/package.json",function(e,t,n,r,i,s,o){t.exports={main:"underscore.js"}}),e.define("/node_modules/backbone/node_modules/underscore/underscore.js",function(e,t,n,r,i,s,o){(function(){var e=this,r=e._,i={},s=Array.prototype,o=Object.prototype,u=Function.prototype,a=s.push,f=s.slice,l=s.concat,c=o.toString,h=o.hasOwnProperty,p=s.forEach,d=s.map,v=s.reduce,m=s.reduceRight,g=s.filter,y=s.every,b=s.some,w=s.indexOf,E=s.lastIndexOf,S=Array.isArray,x=Object.keys,T=u.bind,N=function(e){if(e instanceof N)return e;if(!(this instanceof N))return new N(e);this._wrapped=e};typeof n!="undefined"?(typeof t!="undefined"&&t.exports&&(n=t.exports=N),n._=N):e._=N,N.VERSION="1.4.3";var C=N.each=N.forEach=function(e,t,n){if(e==null)return;if(p&&e.forEach===p)e.forEach(t,n);else if(e.length===+e.length){for(var r=0,s=e.length;r2;e==null&&(e=[]);if(v&&e.reduce===v)return r&&(t=N.bind(t,r)),i?e.reduce(t,n):e.reduce(t);C(e,function(e,s,o){i?n=t.call(r,n,e,s,o):(n=e,i=!0)});if(!i)throw new TypeError(k);return n},N.reduceRight=N.foldr=function(e,t,n,r){var i=arguments.length>2;e==null&&(e=[]);if(m&&e.reduceRight===m)return r&&(t=N.bind(t,r)),i?e.reduceRight(t,n):e.reduceRight(t);var s=e.length;if(s!==+s){var o=N.keys(e);s=o.length}C(e,function(u,a,f){a=o?o[--s]:--s,i?n=t.call(r,n,e[a],a,f):(n=e[a],i=!0)});if(!i)throw new TypeError(k);return n},N.find=N.detect=function(e,t,n){var r;return L(e,function(e,i,s){if(t.call(n,e,i,s))return r=e,!0}),r},N.filter=N.select=function(e,t,n){var r=[];return e==null?r:g&&e.filter===g?e.filter(t,n):(C(e,function(e,i,s){t.call(n,e,i,s)&&(r[r.length]=e)}),r)},N.reject=function(e,t,n){return N.filter(e,function(e,r,i){return!t.call(n,e,r,i)},n)},N.every=N.all=function(e,t,n){t||(t=N.identity);var r=!0;return e==null?r:y&&e.every===y?e.every(t,n):(C(e,function(e,s,o){if(!(r=r&&t.call(n,e,s,o)))return i}),!!r)};var L=N.some=N.any=function(e,t,n){t||(t=N.identity);var r=!1;return e==null?r:b&&e.some===b?e.some(t,n):(C(e,function(e,s,o){if(r||(r=t.call(n,e,s,o)))return i}),!!r)};N.contains=N.include=function(e,t){return e==null?!1:w&&e.indexOf===w?e.indexOf(t)!=-1:L(e,function(e){return e===t})},N.invoke=function(e,t){var n=f.call(arguments,2);return N.map(e,function(e){return(N.isFunction(t)?t:e[t]).apply(e,n)})},N.pluck=function(e,t){return N.map(e,function(e){return e[t]})},N.where=function(e,t){return N.isEmpty(t)?[]:N.filter(e,function(e){for(var n in t)if(t[n]!==e[n])return!1;return!0})},N.max=function(e,t,n){if(!t&&N.isArray(e)&&e[0]===+e[0]&&e.length<65535)return Math.max.apply(Math,e);if(!t&&N.isEmpty(e))return-Infinity;var r={computed:-Infinity,value:-Infinity};return C(e,function(e,i,s){var o=t?t.call(n,e,i,s):e;o>=r.computed&&(r={value:e,computed:o})}),r.value},N.min=function(e,t,n){if(!t&&N.isArray(e)&&e[0]===+e[0]&&e.length<65535)return Math.min.apply(Math,e);if(!t&&N.isEmpty(e))return Infinity;var r={computed:Infinity,value:Infinity};return C(e,function(e,i,s){var o=t?t.call(n,e,i,s):e;or||n===void 0)return 1;if(n>>1;n.call(r,e[u])=0})})},N.difference=function(e){var t=l.apply(s,f.call(arguments,1));return N.filter(e,function(e){return!N.contains(t,e)})},N.zip=function(){var e=f.call(arguments),t=N.max(N.pluck(e,"length")),n=new Array(t);for(var r=0;r=0;n--)t=[e[n].apply(this,t)];return t[0]}},N.after=function(e,t){return e<=0?t():function(){if(--e<1)return t.apply(this,arguments)}},N.keys=x||function(e){if(e!==Object(e))throw new TypeError("Invalid object");var t=[];for(var n in e)N.has(e,n)&&(t[t.length]=n);return t},N.values=function(e){var t=[];for(var n in e)N.has(e,n)&&t.push(e[n]);return t},N.pairs=function(e){var t=[];for(var n in e)N.has(e,n)&&t.push([n,e[n]]);return t},N.invert=function(e){var t={};for(var n in e)N.has(e,n)&&(t[e[n]]=n);return t},N.functions=N.methods=function(e){var t=[];for(var n in e)N.isFunction(e[n])&&t.push(n);return t.sort()},N.extend=function(e){return C(f.call(arguments,1),function(t){if(t)for(var n in t)e[n]=t[n]}),e},N.pick=function(e){var t={},n=l.apply(s,f.call(arguments,1));return C(n,function(n){n in e&&(t[n]=e[n])}),t},N.omit=function(e){var t={},n=l.apply(s,f.call(arguments,1));for(var r in e)N.contains(n,r)||(t[r]=e[r]);return t},N.defaults=function(e){return C(f.call(arguments,1),function(t){if(t)for(var n in t)e[n]==null&&(e[n]=t[n])}),e},N.clone=function(e){return N.isObject(e)?N.isArray(e)?e.slice():N.extend({},e):e},N.tap=function(e,t){return t(e),e};var D=function(e,t,n,r){if(e===t)return e!==0||1/e==1/t;if(e==null||t==null)return e===t;e instanceof N&&(e=e._wrapped),t instanceof N&&(t=t._wrapped);var i=c.call(e);if(i!=c.call(t))return!1;switch(i){case"[object String]":return e==String(t);case"[object Number]":return e!=+e?t!=+t:e==0?1/e==1/t:e==+t;case"[object Date]":case"[object Boolean]":return+e==+t;case"[object RegExp]":return e.source==t.source&&e.global==t.global&&e.multiline==t.multiline&&e.ignoreCase==t.ignoreCase}if(typeof e!="object"||typeof t!="object")return!1;var s=n.length;while(s--)if(n[s]==e)return r[s]==t;n.push(e),r.push(t);var o=0,u=!0;if(i=="[object Array]"){o=e.length,u=o==t.length;if(u)while(o--)if(!(u=D(e[o],t[o],n,r)))break}else{var a=e.constructor,f=t.constructor;if(a!==f&&!(N.isFunction(a)&&a instanceof a&&N.isFunction(f)&&f instanceof f))return!1;for(var l in e)if(N.has(e,l)){o++;if(!(u=N.has(t,l)&&D(e[l],t[l],n,r)))break}if(u){for(l in t)if(N.has(t,l)&&!(o--))break;u=!o}}return n.pop(),r.pop(),u};N.isEqual=function(e,t){return D(e,t,[],[])},N.isEmpty=function(e){if(e==null)return!0;if(N.isArray(e)||N.isString(e))return e.length===0;for(var t in e)if(N.has(e,t))return!1;return!0},N.isElement=function(e){return!!e&&e.nodeType===1},N.isArray=S||function(e){return c.call(e)=="[object Array]"},N.isObject=function(e){return e===Object(e)},C(["Arguments","Function","String","Number","Date","RegExp"],function(e){N["is"+e]=function(t){return c.call(t)=="[object "+e+"]"}}),N.isArguments(arguments)||(N.isArguments=function(e){return!!e&&!!N.has(e,"callee")}),typeof /./!="function"&&(N.isFunction=function(e){return typeof e=="function"}),N.isFinite=function(e){return isFinite(e)&&!isNaN(parseFloat(e))},N.isNaN=function(e){return N.isNumber(e)&&e!=+e},N.isBoolean=function(e){return e===!0||e===!1||c.call(e)=="[object Boolean]"},N.isNull=function(e){return e===null},N.isUndefined=function(e){return e===void 0},N.has=function(e,t){return h.call(e,t)},N.noConflict=function(){return e._=r,this},N.identity=function(e){return e},N.times=function(e,t,n){var r=Array(e);for(var i=0;i":">",'"':""","'":"'","/":"/"}};P.unescape=N.invert(P.escape);var H={escape:new RegExp("["+N.keys(P.escape).join("")+"]","g"),unescape:new RegExp("("+N.keys(P.unescape).join("|")+")","g")};N.each(["escape","unescape"],function(e){N[e]=function(t){return t==null?"":(""+t).replace(H[e],function(t){return P[e][t]})}}),N.result=function(e,t){if(e==null)return null;var n=e[t];return N.isFunction(n)?n.call(e):n},N.mixin=function(e){C(N.functions(e),function(t){var n=N[t]=e[t];N.prototype[t]=function(){var e=[this._wrapped];return a.apply(e,arguments),q.call(this,n.apply(N,e))}})};var B=0;N.uniqueId=function(e){var t=""+ ++B;return e?e+t:t},N.templateSettings={evaluate:/<%([\s\S]+?)%>/g,interpolate:/<%=([\s\S]+?)%>/g,escape:/<%-([\s\S]+?)%>/g};var j=/(.)^/,F={"'":"'","\\":"\\","\r":"r","\n":"n"," ":"t","\u2028":"u2028","\u2029":"u2029"},I=/\\|'|\r|\n|\t|\u2028|\u2029/g;N.template=function(e,t,n){n=N.defaults({},n,N.templateSettings);var r=new RegExp([(n.escape||j).source,(n.interpolate||j).source,(n.evaluate||j).source].join("|")+"|$","g"),i=0,s="__p+='";e.replace(r,function(t,n,r,o,u){return s+=e.slice(i,u).replace(I,function(e){return"\\"+F[e]}),n&&(s+="'+\n((__t=("+n+"))==null?'':_.escape(__t))+\n'"),r&&(s+="'+\n((__t=("+r+"))==null?'':__t)+\n'"),o&&(s+="';\n"+o+"\n__p+='"),i=u+t.length,t}),s+="';\n",n.variable||(s="with(obj||{}){\n"+s+"}\n"),s="var __t,__p='',__j=Array.prototype.join,print=function(){__p+=__j.call(arguments,'');};\n"+s+"return __p;\n";try{var o=new Function(n.variable||"obj","_",s)}catch(u){throw u.source=s,u}if(t)return o(t,N);var a=function(e){return o.call(this,e,N)};return a.source="function("+(n.variable||"obj")+"){\n"+s+"}",a},N.chain=function(e){return N(e).chain()};var q=function(e){return this._chain?N(e).chain():e};N.mixin(N),C(["pop","push","reverse","shift","sort","splice","unshift"],function(e){var t=s[e];N.prototype[e]=function(){var n=this._wrapped;return t.apply(n,arguments),(e=="shift"||e=="splice")&&n.length===0&&delete n[0],q.call(this,n)}}),C(["concat","join","slice"],function(e){var t=s[e];N.prototype[e]=function(){return q.call(this,t.apply(this._wrapped,arguments))}}),N.extend(N.prototype,{chain:function(){return this._chain=!0,this},value:function(){return this._wrapped}})}).call(this)}),e.define("/src/js/util/constants.js",function(e,t,n,r,i,s,o){var u={betweenCommandsDelay:400},a={isAnimating:!1},f={minZoom:.55,maxZoom:1.25,minWidth:600,minHeight:600},l={arrowHeadSize:8,nodeRadius:17,curveControlPointOffset:50,defaultEasing:"easeInOut",defaultAnimationTime:400,rectFill:"hsb(0.8816909813322127,0.7,1)",headRectFill:"#2831FF",rectStroke:"#FFF",rectStrokeWidth:"3",multiBranchY:20,upstreamHeadOpacity:.5,upstreamNoneOpacity:.2,edgeUpstreamHeadOpacity:.4,edgeUpstreamNoneOpacity:.15,visBranchStrokeWidth:2,visBranchStrokeColorNone:"#333",defaultNodeFill:"hsba(0.5,0.8,0.7,1)",defaultNodeStrokeWidth:2,defaultNodeStroke:"#FFF",orphanNodeFill:"hsb(0.5,0.8,0.7)"};n.GLOBAL=a,n.TIME=u,n.GRAPHICS=l,n.VIEWPORT=f}),e.define("/src/js/util/index.js",function(e,t,n,r,i,s,o){var u=e("underscore");n.isBrowser=function(){var e=String(typeof window)!=="undefined";return e},n.splitTextCommand=function(e,t,n){t=u.bind(t,n),u.each(e.split(";"),function(e,n){e=u.escape(e),e=e.replace(/^(\s+)/,"").replace(/(\s+)$/,"").replace(/"/g,'"').replace(/'/g,"'");if(n>0&&!e.length)return;t(e)})},n.genParseCommand=function(e,t){return function(n){var r,i;return u.each(e,function(e,t){var s=e.exec(n);s&&(r=t,i=s)}),r?{toSet:{eventName:t,method:r,regexResults:i}}:!1}}}),e.define("/src/js/level/sandbox.js",function(e,t,n,r,i,s,o){var u=e("underscore"),a=e("q"),f=e("../util").isBrowser()?window.Backbone:e("backbone"),l=e("../util"),c=e("../app"),h=e("../visuals/visualization").Visualization,p=e("../level/parseWaterfall").ParseWaterfall,d=e("../level/disabledMap").DisabledMap,v=e("../models/commandModel").Command,m=e("../git/gitShim").GitShim,g=e("../views"),y=g.ModalTerminal,b=g.ModalAlert,w=e("../views/builderViews"),E=e("../views/multiView").MultiView,S=f.View.extend({tagName:"div",initialize:function(e){e=e||{},this.options=e,this.initVisualization(e),this.initCommandCollection(e),this.initParseWaterfall(e),this.initGitShim(e),e.wait||this.takeControl()},getDefaultVisEl:function(){return $("#mainVisSpace")[0]},getAnimationTime:function(){return 1050},initVisualization:function(e){this.mainVis=new h({el:e.el||this.getDefaultVisEl()})},initCommandCollection:function(e){this.commandCollection=c.getCommandUI().commandCollection},initParseWaterfall:function(e){this.parseWaterfall=new p},initGitShim:function(e){},takeControl:function(){c.getEventBaton().stealBaton("commandSubmitted",this.commandSubmitted,this),c.getEventBaton().stealBaton("processSandboxCommand",this.processSandboxCommand,this),c.getEventBaton().stealBaton("levelExited",this.levelExited,this),this.insertGitShim()},releaseControl:function(){c.getEventBaton().releaseBaton("commandSubmitted",this.commandSubmitted,this),c.getEventBaton().releaseBaton("processSandboxCommand",this.processSandboxCommand,this),c.getEventBaton().releaseBaton("levelExited",this.levelExited,this),this.releaseGitShim()},releaseGitShim:function(){this.gitShim&&this.gitShim.removeShim()},insertGitShim:function(){this.gitShim&&this.mainVis.customEvents.on("gitEngineReady",function(){this.gitShim.insertShim()},this)},commandSubmitted:function(e){c.getEvents().trigger("commandSubmittedPassive",e),l.splitTextCommand(e,function(e){this.commandCollection.add(new v({rawStr:e,parseWaterfall:this.parseWaterfall}))},this)},startLevel:function(t,n){var r=t.get("regexResults")||[],i=r[1]||"",s=c.getLevelArbiter().getLevel(i);if(!s){t.addWarning('A level for that id "'+i+'" was not found!! Opening up level selection view...'),c.getEventBaton().trigger("commandSubmitted","levels"),t.set("status","error"),n.resolve();return}this.hide(),this.clear();var o=a.defer(),u=e("../level").Level;this.currentLevel=new u({level:s,deferred:o,command:t}),o.promise.then(function(){t.finishWith(n)})},buildLevel:function(t,n){this.hide(),this.clear();var r=a.defer(),i=e("../level/builder").LevelBuilder;this.levelBuilder=new i({deferred:r}),r.promise.then(function(){t.finishWith(n)})},exitLevel:function(e,t){e.addWarning("You aren't in a level! You are in a sandbox, start a level with `level [id]`"),e.set("status","error"),t.resolve()},showLevels:function(e,t){var n=a.defer();c.getLevelDropdown().show(n,e),n.promise.done(function(){e.finishWith(t)})},resetSolved:function(e,t){c.getLevelArbiter().resetSolvedMap(),e.addWarning("Solved map was reset, you are starting from a clean slate!"),e.finishWith(t)},processSandboxCommand:function(e,t){var n={"reset solved":this.resetSolved,"help general":this.helpDialog,help:this.helpDialog,reset:this.reset,delay:this.delay,clear:this.clear,"exit level":this.exitLevel,level:this.startLevel,sandbox:this.exitLevel,levels:this.showLevels,mobileAlert:this.mobileAlert,"build level":this.buildLevel,"export tree":this.exportTree,"import tree":this.importTree,"import level":this.importLevel},r=n[e.get("method")];if(!r)throw new Error("no method for that wut");r.apply(this,[e,t])},hide:function(){this.mainVis.hide()},levelExited:function(){this.show()},show:function(){this.mainVis.show()},importTree:function(e,t){var n=new w.MarkdownPresenter({previewText:"Paste a tree JSON blob below!",fillerText:" "});n.deferred.promise.then(u.bind(function(e){try{this.mainVis.gitEngine.loadTree(JSON.parse(e))}catch(t){this.mainVis.reset(),new E({childViews:[{type:"ModalAlert",options:{markdowns:["## Error!","","Something is wrong with that JSON! Here is the error:","",String(t)]}}]})}},this)).fail(function(){}).done(function(){e.finishWith(t)})},importLevel:function(t,n){var r=new w.MarkdownPresenter({previewText:"Paste a level JSON blob in here!",fillerText:" "});r.deferred.promise.then(u.bind(function(r){var i=e("../level").Level;try{var s=JSON.parse(r),o=a.defer();this.currentLevel=new i({level:s,deferred:o,command:t}),o.promise.then(function(){t.finishWith(n)})}catch(u){new E({childViews:[{type:"ModalAlert",options:{markdowns:["## Error!","","Something is wrong with that level JSON, this happened:","",String(u)]}}]}),t.finishWith(n)}},this)).fail(function(){t.finishWith(n)}).done()},exportTree:function(e,t){var n=JSON.stringify(this.mainVis.gitEngine.exportTree(),null,2),r=new E({childViews:[{type:"MarkdownPresenter",options:{previewText:'Share this tree with friends! They can load it with "import tree"',fillerText:n,noConfirmCancel:!0}}]});r.getPromise().then(function(){e.finishWith(t)}).done()},clear:function(e,t){c.getEvents().trigger("clearOldCommands"),e&&t&&e.finishWith(t)},mobileAlert:function(e,t){alert("Can't bring up the keyboard on mobile / tablet :( try visiting on desktop! :D"),e.finishWith(t)},delay:function(e,t){var n=parseInt(e.get("regexResults")[1],10);setTimeout(function(){e.finishWith(t)},n)},reset:function(e,t){this.mainVis.reset(),setTimeout(function(){e.finishWith(t)},this.mainVis.getAnimationTime())},helpDialog:function(t,n){var r=new E({childViews:e("../dialogs/sandbox").dialog});r.getPromise().then(u.bind(function(){t.finishWith(n)},this)).done()}});n.Sandbox=S}),e.define("/node_modules/q/package.json",function(e,t,n,r,i,s,o){t.exports={main:"q.js"}}),e.define("/node_modules/q/q.js",function(e,t,n,r,i,s,o){(function(e){if(typeof bootstrap=="function")bootstrap("promise",e);else if(typeof n=="object")e(void 0,n);else if(typeof define=="function")define(e);else if(typeof ses!="undefined"){if(!ses.ok())return;ses.makeQ=function(){var t={};return e(void 0,t)}}else e(void 0,Q={})})(function(e,t){"use strict";function w(e){return b(e)==="[object StopIteration]"||e instanceof E}function x(e,t){t.stack&&typeof e=="object"&&e!==null&&e.stack&&e.stack.indexOf(S)===-1&&(e.stack=T(e.stack)+"\n"+S+"\n"+T(t.stack))}function T(e){var t=e.split("\n"),n=[];for(var r=0;r=n&&s<=Nt}function k(){if(Error.captureStackTrace){var e,t,n=Error.prepareStackTrace;return Error.prepareStackTrace=function(n,r){e=r[1].getFileName(),t=r[1].getLineNumber()},(new Error).stack,Error.prepareStackTrace=n,r=e,t}}function L(e,t,n){return function(){return typeof console!="undefined"&&typeof console.warn=="function"&&console.warn(t+" is deprecated, use "+n+" instead.",(new Error("")).stack),e.apply(e,arguments)}}function A(){function s(r){if(!e)return;n=U(r),d(e,function(e,t){u(function(){n.promiseSend.apply(n,t)})},void 0),e=void 0,t=void 0}var e=[],t=[],n,r=g(A.prototype),i=g(M.prototype);return i.promiseSend=function(r,i,s,o){var a=p(arguments);e?(e.push(a),r==="when"&&o&&t.push(o)):u(function(){n.promiseSend.apply(n,a)})},i.valueOf=function(){return e?i:n.valueOf()},Error.captureStackTrace&&(Error.captureStackTrace(i,A),i.stack=i.stack.substring(i.stack.indexOf("\n")+1)),o(i),r.promise=i,r.resolve=s,r.reject=function(e){s(R(e))},r.notify=function(n){e&&d(t,function(e,t){u(function(){t(n)})},void 0)},r}function O(e){var t=A();return st(e,t.resolve,t.reject,t.notify).fail(t.reject),t.promise}function M(e,t,n,r){t===void 0&&(t=function(e){return R(new Error("Promise does not support operation: "+e))});var i=g(M.prototype);return i.promiseSend=function(n,r){var s=p(arguments,2),o;try{e[n]?o=e[n].apply(i,s):o=t.apply(i,[n].concat(s))}catch(u){o=R(u)}r&&r(o)},n&&(i.valueOf=n),r&&(i.exception=r),o(i),i}function _(e){return D(e)?e.valueOf():e}function D(e){return e&&typeof e.promiseSend=="function"}function P(e){return H(e)||B(e)}function H(e){return!D(_(e))}function B(e){return e=_(e),D(e)&&"exception"in e}function q(){!I&&typeof window!="undefined"&&!window.Touch&&window.console&&console.log("Should be empty:",F),I=!0}function R(e){e=e||new Error;var t=M({when:function(t){if(t){var n=v(j,this);n!==-1&&(F.splice(n,1),j.splice(n,1))}return t?t(e):R(e)}},function(){return R(e)},function n(){return this},e);return q(),j.push(t),F.push(e),t}function U(e){if(D(e))return e;e=_(e);if(e&&typeof e.then=="function"){var t=A();return e.then(t.resolve,t.reject,t.notify),t.promise}return M({when:function(){return e},get:function(t){return e[t]},put:function(t,n){return e[t]=n,e},del:function(t){return delete e[t],e},post:function(t,n){return e[t].apply(e,n)},apply:function(t,n){return e.apply(t,n)},fapply:function(t){return e.apply(void 0,t)},viewInfo:function(){function r(e){n[e]||(n[e]=typeof t[e])}var t=e,n={};while(t)Object.getOwnPropertyNames(t).forEach(r),t=Object.getPrototypeOf(t);return{type:typeof e,properties:n}},keys:function(){return y(e)}},void 0,function n(){return e})}function z(e){return M({isDef:function(){}},function(){var n=p(arguments);return Y.apply(void 0,[e].concat(n))},function(){return _(e)})}function W(e,t){return e=U(e),t?M({viewInfo:function(){return t}},function(){var n=p(arguments);return Y.apply(void 0,[e].concat(n))},function(){return _(e)}):Y(e,"viewInfo")}function X(e){return W(e).when(function(t){var n;t.type==="function"?n=function(){return nt(e,void 0,arguments)}:n={};var r=t.properties||{};return y(r).forEach(function(t){r[t]==="function"&&(n[t]=function(){return tt(e,t,arguments)})}),U(n)})}function V(e,t,n,r){function o(e){try{return t?t(e):e}catch(n){return R(n)}}function a(e){if(n){x(e,l);try{return n(e)}catch(t){return R(t)}}return R(e)}function f(e){return r?r(e):e}var i=A(),s=!1,l=U(e);return u(function(){l.promiseSend("when",function(e){if(s)return;s=!0,i.resolve(o(e))},function(e){if(s)return;s=!0,i.resolve(a(e))})}),l.promiseSend("when",void 0,void 0,function(e){i.notify(f(e))}),i.promise}function $(e,t,n){return V(e,function(e){return at(e).then(function(e){return t.apply(void 0,e)},n)},n)}function J(e){return function(){function t(e,t){var s;try{s=n[e](t)}catch(o){return w(o)?o.value:R(o)}return V(s,r,i)}var n=e.apply(this,arguments),r=t.bind(t,"send"),i=t.bind(t,"throw");return r()}}function K(e){throw new E(e)}function Q(e){return function(){return at([this,at(arguments)]).spread(function(t,n){return e.apply(t,n)})}}function G(e){return function(t){var n=p(arguments,1);return Y.apply(void 0,[t,e].concat(n))}}function Y(e,t){var n=A(),r=p(arguments,2);return e=U(e),u(function(){e.promiseSend.apply(e,[t,n.resolve].concat(r))}),n.promise}function Z(e,t,n){var r=A();return e=U(e),u(function(){e.promiseSend.apply(e,[t,r.resolve].concat(n))}),r.promise}function et(e){return function(t){var n=p(arguments,1);return Z(t,e,n)}}function it(e,t){var n=p(arguments,2);return nt(e,t,n)}function st(e){var t=p(arguments,1);return rt(e,t)}function ot(e,t){var n=p(arguments,2);return function(){var i=n.concat(p(arguments));return nt(e,t,i)}}function ut(e){var t=p(arguments,1);return function(){var r=t.concat(p(arguments));return rt(e,r)}}function at(e){return V(e,function(e){var t=e.length;if(t===0)return U(e);var n=A();return d(e,function(r,i,s){H(i)?(e[s]=_(i),--t===0&&n.resolve(e)):V(i,function(r){e[s]=r,--t===0&&n.resolve(e)}).fail(n.reject)},void 0),n.promise})}function ft(e){return V(e,function(e){return V(at(m(e,function(e){return V(e,i,i)})),function(){return m(e,U)})})}function lt(e,t){return V(e,void 0,t)}function ct(e,t){return V(e,void 0,void 0,t)}function ht(e,t){return V(e,function(e){return V(t(),function(){return e})},function(e){return V(t(),function(){return R(e)})})}function pt(e,n,r,i){function s(n){u(function(){x(n,e);if(!t.onerror)throw n;t.onerror(n)})}var o=n||r||i?V(e,n,r,i):e;lt(o,s)}function dt(e,t){var n=A(),r=setTimeout(function(){n.reject(new Error("Timed out after "+t+" ms"))},t);return V(e,function(e){clearTimeout(r),n.resolve(e)},function(e){clearTimeout(r),n.reject(e)}),n.promise}function vt(e,t){t===void 0&&(t=e,e=void 0);var n=A();return setTimeout(function(){n.resolve(e)},t),n.promise}function mt(e,t){var n=p(t),r=A();return n.push(r.makeNodeResolver()),rt(e,n).fail(r.reject),r.promise}function gt(e){var t=p(arguments,1),n=A();return t.push(n.makeNodeResolver()),rt(e,t).fail(n.reject),n.promise}function yt(e){var t=p(arguments,1);return function(){var n=t.concat(p(arguments)),r=A();return n.push(r.makeNodeResolver()),rt(e,n).fail(r.reject),r.promise}}function bt(e,t,n){return Et(e,t).apply(void 0,n)}function wt(e,t){var n=p(arguments,2);return bt(e,t,n)}function Et(e){if(arguments.length>1){var t=arguments[1],n=p(arguments,2),r=e;e=function(){var e=n.concat(p(arguments));return r.apply(t,e)}}return function(){var t=A(),n=p(arguments);return n.push(t.makeNodeResolver()),rt(e,n).fail(t.reject),t.promise}}function St(e,t,n){var r=p(n),i=A();return r.push(i.makeNodeResolver()),tt(e,t,r).fail(i.reject),i.promise}function xt(e,t){var n=p(arguments,2),r=A();return n.push(r.makeNodeResolver()),tt(e,t,n).fail(r.reject),r.promise}function Tt(e,t){if(!t)return e;e.then(function(e){u(function(){t(null,e)})},function(e){u(function(){t(e)})})}var n=k(),r,i=function(){},o=Object.freeze||i;typeof cajaVM!="undefined"&&(o=cajaVM.def);var u;if(typeof s!="undefined")u=s.nextTick;else if(typeof setImmediate=="function")u=setImmediate;else if(typeof MessageChannel!="undefined"){var a=new MessageChannel,f={},l=f;a.port1.onmessage=function(){f=f.next;var e=f.task;delete f.task,e()},u=function(e){l=l.next={task:e},a.port2.postMessage(0)}}else u=function(e){setTimeout(e,0)};var c;if(Function.prototype.bind){var h=Function.prototype.bind;c=h.bind(h.call)}else c=function(e){return function(){return e.call.apply(e,arguments)}};var p=c(Array.prototype.slice),d=c(Array.prototype.reduce||function(e,t){var n=0,r=this.length;if(arguments.length===1)do{if(n in this){t=this[n++];break}if(++n>=r)throw new TypeError}while(1);for(;n2?e.resolve(p(arguments,1)):e.resolve(n)}},A.prototype.node=L(A.prototype.makeNodeResolver,"node","makeNodeResolver"),t.promise=O,t.makePromise=M,M.prototype.then=function(e,t,n){return V(this,e,t,n)},M.prototype.thenResolve=function(e){return V(this,function(){return e})},d(["isResolved","isFulfilled","isRejected","when","spread","send","get","put","del","post","invoke","keys","apply","call","bind","fapply","fcall","fbind","all","allResolved","view","viewInfo","timeout","delay","catch","finally","fail","fin","progress","end","done","nfcall","nfapply","nfbind","ncall","napply","nbind","npost","ninvoke","nend","nodeify"],function(e,n){M.prototype[n]=function(){return t[n].apply(t,[this].concat(p(arguments)))}},void 0),M.prototype.toSource=function(){return this.toString()},M.prototype.toString=function(){return"[object Promise]"},o(M.prototype),t.nearer=_,t.isPromise=D,t.isResolved=P,t.isFulfilled=H,t.isRejected=B;var j=[],F=[],I;t.reject=R,t.begin=U,t.resolve=U,t.ref=L(U,"ref","resolve"),t.master=z,t.viewInfo=W,t.view=X,t.when=V,t.spread=$,t.async=J,t["return"]=K,t.promised=Q,t.sender=L(G,"sender","dispatcher"),t.Method=L(G,"Method","dispatcher"),t.send=L(Y,"send","dispatch"),t.dispatch=Z,t.dispatcher=et,t.get=et("get"),t.put=et("put"),t["delete"]=t.del=et("del");var tt=t.post=et("post");t.invoke=function(e,t){var n=p(arguments,2);return tt(e,t,n)};var nt=t.apply=L(et("apply"),"apply","fapply"),rt=t.fapply=et("fapply");t.call=L(it,"call","fcall"),t["try"]=st,t.fcall=st,t.bind=L(ot,"bind","fbind"),t.fbind=ut,t.keys=et("keys"),t.all=at,t.allResolved=ft,t["catch"]=t.fail=lt,t.progress=ct,t["finally"]=t.fin=ht,t.end=L(pt,"end","done"),t.done=pt,t.timeout=dt,t.delay=vt,t.nfapply=mt,t.nfcall=gt,t.nfbind=yt,t.napply=L(bt,"napply","npost"),t.ncall=L(wt,"ncall","ninvoke"),t.nbind=L(Et,"nbind","nfbind"),t.npost=St,t.ninvoke=xt,t.nend=L(Tt,"nend","nodeify"),t.nodeify=Tt;var Nt=k()})}),e.define("/src/js/app/index.js",function(e,t,n,r,i,s,o){function y(){var t=e("../models/collections"),n=e("../views/commandViews");this.commandCollection=new t.CommandCollection,this.commandBuffer=new t.CommandBuffer({collection:this.commandCollection}),this.commandPromptView=new n.CommandPromptView({el:$("#commandLineBar")}),this.commandLineHistoryView=new n.CommandLineHistoryView({el:$("#commandLineHistory"),collection:this.commandCollection})}var u=e("underscore"),a=e("backbone"),f=e("../util/constants"),l=e("../util"),c=u.clone(a.Events),h,p,d,v,m,g=function(){var t=e("../level/sandbox").Sandbox,n=e("../level").Level,r=e("../util/eventBaton").EventBaton,i=e("../level/arbiter").LevelArbiter,s=e("../views/levelDropdownView").LevelDropdownView;d=new r,h=new y,p=new t,v=new i,m=new s({wait:!0});var o=function(){$("#commandTextField").focus()};o(),$(window).focus(function(e){d.trigger("windowFocus",e)}),$(document).click(function(e){d.trigger("documentClick",e)}),$(document).bind("keydown",function(e){d.trigger("docKeydown",e)}),$(document).bind("keyup",function(e){d.trigger("docKeyup",e)}),$(window).on("resize",function(e){c.trigger("resize",e)}),d.stealBaton("docKeydown",function(){}),d.stealBaton("docKeyup",function(){}),d.stealBaton("windowFocus",o),d.stealBaton("documentClick",o);var a=function(e){return function(){var t=[e];u.each(arguments,function(e){t.push(e)}),d.trigger.apply(d,t)}};$("#commandTextField").on("keydown",a("keydown")),$("#commandTextField").on("keyup",a("keyup")),$(window).trigger("resize"),/\?demo/.test(window.location.href)?p.mainVis.customEvents.on("gitEngineReady",function(){d.trigger("commandSubmitted",["git commit; git checkout -b bugFix C1; git commit; git merge master; git checkout master; git commit; git rebase bugFix;","delay 1000; reset;","level rebase1 --noFinishDialog --noStartCommand --noIntroDialog;","delay 2000; show goal; delay 1000; hide goal;","git checkout bugFix; git rebase master; git checkout side; git rebase bugFix;","git checkout another; git rebase side; git rebase another master;","help; levels"].join(""))}):/\?NODEMO/.test(window.location.href)||p.mainVis.customEvents.on("gitEngineReady",function(){d.trigger("commandSubmitted",["git help;","delay 1000;","help;","levels"].join(""))});if(/command=/.test(window.location.href)){var f=window.location.href.split("command=")[1].split("&")[0],l=unescape(f);p.mainVis.customEvents.on("gitEngineReady",function(){d.trigger("commandSubmitted",l)})}(/(iPhone|iPod|iPad).*AppleWebKit/i.test(navigator.userAgent)||/android/i.test(navigator.userAgent))&&p.mainVis.customEvents.on("gitEngineReady",function(){d.trigger("commandSubmitted","mobile alert")})};e("../util").isBrowser()&&$(document).ready(g),n.getEvents=function(){return c},n.getSandbox=function(){return p},n.getEventBaton=function(){return d},n.getCommandUI=function(){return h},n.getLevelArbiter=function(){return v},n.getLevelDropdown=function(){return m},n.init=g}),e.define("/src/js/level/index.js",function(e,t,n,r,i,s,o){var u=e("underscore"),a=e("backbone"),f=e("q"),l=e("../util"),c=e("../app"),h=e("../util/errors"),p=e("../level/sandbox").Sandbox,d=e("../util/constants"),v=e("../visuals/visualization").Visualization,m=e("../level/parseWaterfall").ParseWaterfall,g=e("../level/disabledMap").DisabledMap,y=e("../models/commandModel").Command,b=e("../git/gitShim").GitShim,w=e("../views/multiView").MultiView,E=e("../views").CanvasTerminalHolder,S=e("../views").ConfirmCancelTerminal,x=e("../views").NextLevelConfirm,T=e("../views").LevelToolbar,N=e("../git/treeCompare").TreeCompare,C={"help level":/^help level$/,"start dialog":/^start dialog$/,"show goal":/^show goal$/,"hide goal":/^hide goal$/,"show solution":/^show solution($|\s)/},k=l.genParseCommand(C,"processLevelCommand"),L=p.extend({initialize:function(e){e=e||{},e.level=e.level||{},this.level=e.level,this.gitCommandsIssued=[],this.commandsThatCount=this.getCommandsThatCount(),this.solved=!1,this.treeCompare=new N,this.initGoalData(e),this.initName(e),L.__super__.initialize.apply(this,[e]),this.startOffCommand(),this.handleOpen(e.deferred)},handleOpen:function(e){e=e||f.defer();if(this.level.startDialog&&!this.testOption("noIntroDialog")){new w(u.extend({},this.level.startDialog,{deferred:e}));return}setTimeout(function(){e.resolve()},this.getAnimationTime()*1.2)},startDialog:function(e,t){if(!this.level.startDialog){e.set("error",new h.GitError({msg:"There is no start dialog to show for this level!"})),t.resolve();return}this.handleOpen(t),t.promise.then(function(){e.set("status","finished")})},initName:function(){this.level.name||(this.level.name="Rebase Classic",console.warn("REALLY BAD FORM need ids and names")),this.levelToolbar=new T({name:this.level.name})},initGoalData:function(e){if(!this.level.goalTreeString||!this.level.solutionCommand)throw new Error("need goal tree and solution")},takeControl:function(){c.getEventBaton().stealBaton("processLevelCommand",this.processLevelCommand,this),L.__super__.takeControl.apply(this)},releaseControl:function(){c.getEventBaton().releaseBaton("processLevelCommand",this.processLevelCommand,this),L.__super__.releaseControl.apply(this)},startOffCommand:function(){this.testOption("noStartCommand")||c.getEventBaton().trigger("commandSubmitted","hint; delay 2000; show goal")},initVisualization:function(e){this.mainVis=new v({el:e.el||this.getDefaultVisEl(),treeString:e.level.startTree}),this.initGoalVisualization()},initGoalVisualization:function(){this.goalCanvasHolder=new E,this.goalVis=new v({el:this.goalCanvasHolder.getCanvasLocation(),containerElement:this.goalCanvasHolder.getCanvasLocation(),treeString:this.level.goalTreeString,noKeyboardInput:!0,noClick:!0})},showSolution:function(e,t){var n=this.level.solutionCommand,r=function(){c.getEventBaton().trigger("commandSubmitted",n)},i=e.get("rawStr");this.testOptionOnString(i,"noReset")||(n="reset; "+n);if(this.testOptionOnString(i,"force")){r(),e.finishWith(t);return}var s=f.defer(),o=new S({markdowns:["## Are you sure you want to see the solution?","","I believe in you! You can do it"],deferred:s});s.promise.then(r).fail(function(){e.setResult("Great! I'll let you get back to it")}).done(function(){setTimeout(function(){e.finishWith(t)},o.getAnimationTime())})},showGoal:function(e,t){this.goalCanvasHolder.slideIn();if(!e||!t)return;setTimeout(function(){e.finishWith(t)},this.goalCanvasHolder.getAnimationTime())},hideGoal:function(e,t){this.goalCanvasHolder.slideOut();if(!e||!t)return;setTimeout(function(){e.finishWith(t)},this.goalCanvasHolder.getAnimationTime())},initParseWaterfall:function(e){L.__super__.initParseWaterfall.apply(this,[e]),this.parseWaterfall.addFirst("parseWaterfall",k),this.parseWaterfall.addFirst("instantWaterfall",this.getInstantCommands()),e.level.disabledMap&&this.parseWaterfall.addFirst("instantWaterfall",(new g({disabledMap:e.level.disabledMap})).getInstantCommands())},initGitShim:function(e){this.gitShim=new b({afterCB:u.bind(this.afterCommandCB,this),afterDeferHandler:u.bind(this.afterCommandDefer,this)})},getCommandsThatCount:function(){var t=e("../git/commands"),n=["git commit","git checkout","git rebase","git reset","git branch","git revert","git merge","git cherry-pick"],r={};return u.each(n,function(e){if(!t.regexMap[e])throw new Error("wut no regex");r[e]=t.regexMap[e]}),r},afterCommandCB:function(e){var t=!1;u.each(this.commandsThatCount,function(n){t=t||n.test(e.get("rawStr"))}),t&&this.gitCommandsIssued.push(e.get("rawStr"))},afterCommandDefer:function(e,t){if(this.solved){t.addWarning("You've already solved this level, try other levels with 'show levels'or go back to the sandbox with 'sandbox'"),e.resolve();return}var n=this.mainVis.gitEngine.exportTree(),r;this.level.compareOnlyMaster?r=this.treeCompare.compareBranchWithinTrees(n,this.level.goalTreeString,"master"):this.level.compareOnlyBranches?r=this.treeCompare.compareAllBranchesWithinTrees(n,this.level.goalTreeString):r=this.treeCompare.compareAllBranchesWithinTreesAndHEAD(n,this.level.goalTreeString);if(!r){e.resolve();return}this.levelSolved(e)},getNumSolutionCommands:function(){var e=this.level.solutionCommand.replace(/^;|;$/g,"");return e.split(";").length},testOption:function(e){return this.options.command&&(new RegExp("--"+e)).test(this.options.command.get("rawStr"))},testOptionOnString:function(e,t){return e&&(new RegExp("--"+t)).test(e)},levelSolved:function(e){this.solved=!0,c.getEvents().trigger("levelSolved",this.level.id),this.hideGoal();var t=c.getLevelArbiter().getNextLevel(this.level.id),n=this.gitCommandsIssued.length,r=this.getNumSolutionCommands();d.GLOBAL.isAnimating=!0;var i=this.testOption("noFinishDialog"),s=this.mainVis.gitVisuals.finishAnimation();i||(s=s.then(function(){var e=new x({nextLevel:t,numCommands:n,best:r});return e.getPromise()})),s.then(function(){!i&&t&&c.getEventBaton().trigger("commandSubmitted","level "+t.id)}).fail(function(){}).done(function(){d.GLOBAL.isAnimating=!1,e.resolve()})},die:function(){this.levelToolbar.die(),this.goalDie(),this.mainVis.die(),this.releaseControl(),this.clear(),delete this.commandCollection,delete this.mainVis,delete this.goalVis,delete this.goalCanvasHolder},goalDie:function(){this.goalCanvasHolder.die(),this.goalVis.die()},getInstantCommands:function(){var e=this.level.hint?this.level.hint:"Hmm, there doesn't seem to be a hint for this level :-/";return[[/^help$|^\?$/,function(){throw new h.CommandResult({msg:'You are in a level, so multiple forms of help are available. Please select either "help level" or "help general"'})}],[/^hint$/,function(){throw new h.CommandResult({msg:e})}]]},reset:function(){this.gitCommandsIssued=[],this.solved=!1,L.__super__.reset.apply(this,arguments)},buildLevel:function(e,t){this.exitLevel(),setTimeout(function(){c.getSandbox().buildLevel(e,t)},this.getAnimationTime()*1.5)},importLevel:function(e,t){this.exitLevel(),setTimeout(function(){c.getSandbox().importLevel(e,t)},this.getAnimationTime()*1.5)},startLevel:function(e,t){this.exitLevel(),setTimeout(function(){c.getSandbox().startLevel(e,t)},this.getAnimationTime()*1.5)},exitLevel:function(e,t){this.die();if(!e||!t)return;setTimeout(function(){e.finishWith(t)},this.getAnimationTime()),c.getEventBaton().trigger("levelExited")},processLevelCommand:function(e,t){var n={"show goal":this.showGoal,"hide goal":this.hideGoal,"show solution":this.showSolution,"start dialog":this.startDialog,"help level":this.startDialog},r=n[e.get("method")];if(!r)throw new Error("woah we dont support that method yet",r);r.apply(this,[e,t])}});n.Level=L,n.regexMap=C}),e.define("/src/js/util/errors.js",function(e,t,n,r,i,s,o){var u=e("underscore"),a=e("backbone"),f=a.Model.extend({defaults:{type:"MyError",msg:"Unknown Error"},toString:function(){return this.get("type")+": "+this.get("msg")},getMsg:function(){return this.get("msg")||"Unknown Error"},toResult:function(){return this.get("msg").length?""+this.get("msg").replace(/\n/g,"
")+"
":""}}),l=n.CommandProcessError=f.extend({defaults:{type:"Command Process Error"}}),c=n.CommandResult=f.extend({defaults:{type:"Command Result"}}),h=n.Warning=f.extend({defaults:{type:"Warning"}}),p=n.GitError=f.extend({defaults:{type:"Git Error"}}),d=function(e){if(e instanceof l||e instanceof p||e instanceof c||e instanceof h)return;throw e};n.filterError=d}),e.define("/src/js/visuals/visualization.js",function(e,t,n,r,i,s,o){var u=e("underscore"),a=e("../util").isBrowser()?a=window.Backbone:a=e("backbone"),f=e("../models/collections"),l=f.CommitCollection,c=f.BranchCollection,h=e("../util/eventBaton").EventBaton,p=e("../visuals").GitVisuals,d=a.View.extend({initialize:function(e){e=e||{},this.options=e,this.customEvents=u.clone(a.Events),this.containerElement=e.containerElement;var t=this,n=e.containerElement||$("#canvasHolder")[0];new Raphael(n,200,200,function(){var n=this;s.nextTick(function(){t.paperInitialize(n,e)})})},paperInitialize:function(t,n){this.treeString=n.treeString,this.paper=t;var r=e("../app");this.eventBaton=n.noKeyboardInput?new h:r.getEventBaton(),this.commitCollection=new l,this.branchCollection=new c,this.gitVisuals=new p({commitCollection:this.commitCollection,branchCollection:this.branchCollection,paper:this.paper,noClick:this.options.noClick,smallCanvas:this.options.smallCanvas});var i=e("../git").GitEngine;this.gitEngine=new i({collection:this.commitCollection,branches:this.branchCollection,gitVisuals:this.gitVisuals,eventBaton:this.eventBaton}),this.gitEngine.init(),this.gitVisuals.assignGitEngine(this.gitEngine),this.myResize(),$(window).on("resize",u.bind(function(){this.myResize()},this)),this.gitVisuals.drawTreeFirstTime(),this.treeString&&this.gitEngine.loadTreeFromString(this.treeString),this.options.zIndex&&this.setTreeIndex(this.options.zIndex),this.shown=!1,this.setTreeOpacity(0),s.nextTick(u.bind(this.fadeTreeIn,this)),this.customEvents.trigger("gitEngineReady"),this.customEvents.trigger("paperReady")},setTreeIndex:function(e){$(this.paper.canvas).css("z-index",e)},setTreeOpacity:function(e){e===0&&(this.shown=!1),$(this.paper.canvas).css("opacity",e)},getAnimationTime:function(){return 300},fadeTreeIn:function(){this.shown=!0,$(this.paper.canvas).animate({opacity:1},this.getAnimationTime())},fadeTreeOut:function(){this.shown=!1,$(this.paper.canvas).animate({opacity:0},this.getAnimationTime())},hide:function(){this.fadeTreeOut(),setTimeout(u.bind(function(){$(this.paper.canvas).css("visibility","hidden")},this),this.getAnimationTime())},show:function(){$(this.paper.canvas).css("visibility","visible"),setTimeout(u.bind(this.fadeTreeIn,this),10)},showHarsh:function(){$(this.paper.canvas).css("visibility","visible"),this.setTreeOpacity(1)},resetFromThisTreeNow:function(e){this.treeString=e},reset:function(){this.setTreeOpacity(0),this.treeString?this.gitEngine.loadTreeFromString(this.treeString):this.gitEngine.defaultInit(),this.fadeTreeIn()},tearDown:function(){this.gitEngine.tearDown(),this.gitVisuals.tearDown(),delete this.paper},die:function(){this.fadeTreeOut(),setTimeout(u.bind(function(){this.shown||this.tearDown()},this),this.getAnimationTime())},myResize:function(){if(!this.paper)return;var e=1,t=this.el,n=t.clientWidth-e,r=t.clientHeight-e;if(!this.containerElement){var i=t.offsetLeft,s=t.offsetTop;$(this.paper.canvas).css({position:"absolute",left:i+"px",top:s+"px"})}this.paper.setSize(n,r),this.gitVisuals.canvasResize(n,r)}});n.Visualization=d}),e.define("/src/js/models/collections.js",function(e,t,n,r,i,s,o){var u=e("underscore"),a=e("q"),f=e("../util").isBrowser()?f=window.Backbone:f=e("backbone"),l=e("../git").Commit,c=e("../git").Branch,h=e("../models/commandModel").Command,p=e("../models/commandModel").CommandEntry,d=e("../util/constants").TIME,v=f.Collection.extend({model:l}),m=f.Collection.extend({model:h}),g=f.Collection.extend({model:c}),y=f.Collection.extend({model:p,localStorage:f.LocalStorage?new f.LocalStorage("CommandEntries"):null}),b=f.Model.extend({defaults:{collection:null},initialize:function(e){e.collection.bind("add",this.addCommand,this),this.buffer=[],this.timeout=null},addCommand:function(e){this.buffer.push(e),this.touchBuffer()},touchBuffer:function(){if(this.timeout)return;this.setTimeout()},setTimeout:function(){this.timeout=setTimeout(u.bind(function(){this.sipFromBuffer()},this),d.betweenCommandsDelay)},popAndProcess:function(){var e=this.buffer.shift(0);while(e.get("error")&&this.buffer.length)e=this.buffer.shift(0);e.get("error")?this.clear():this.processCommand(e)},processCommand:function(t){t.set("status","processing");var n=a.defer();n.promise.then(u.bind(function(){this.setTimeout()},this));var r=t.get("eventName");if(!r)throw new Error("I need an event to trigger when this guy is parsed and ready");var i=e("../app"),s=i.getEventBaton(),o=s.getNumListeners(r);if(!o){var f=e("../util/errors");t.set("error",new f.GitError({msg:"That command is valid, but not supported in this current environment! Try entering a level or level builder to use that command"})),n.resolve();return}i.getEventBaton().trigger(r,t,n)},clear:function(){clearTimeout(this.timeout),this.timeout=null},sipFromBuffer:function(){if(!this.buffer.length){this.clear();return}this.popAndProcess()}});n.CommitCollection=v,n.CommandCollection=m,n.BranchCollection=g,n.CommandEntryCollection=y,n.CommandBuffer=b}),e.define("/src/js/git/index.js",function(e,t,n,r,i,s,o){function m(e){this.rootCommit=null,this.refs={},this.HEAD=null,this.branchCollection=e.branches,this.commitCollection=e.collection,this.gitVisuals=e.gitVisuals,this.eventBaton=e.eventBaton,this.eventBaton.stealBaton("processGitCommand",this.dispatch,this),this.animationFactory=e.animationFactory||new l.AnimationFactory,this.commandOptions={},this.generalArgs=[],this.initUniqueID()}var u=e("underscore"),a=e("../util").isBrowser()?a=window.Backbone:a=e("backbone"),f=e("q"),l=e("../visuals/animation/animationFactory"),c=e("../visuals/animation").AnimationQueue,h=e("./treeCompare").TreeCompare,p=e("../util/errors"),d=p.GitError,v=p.CommandResult;m.prototype.initUniqueID=function(){this.uniqueId=function(){var e=0;return function(t){return t?t+e++:e++}}()},m.prototype.defaultInit=function(){var e=JSON.parse(unescape("%7B%22branches%22%3A%7B%22master%22%3A%7B%22target%22%3A%22C1%22%2C%22id%22%3A%22master%22%2C%22type%22%3A%22branch%22%7D%7D%2C%22commits%22%3A%7B%22C0%22%3A%7B%22type%22%3A%22commit%22%2C%22parents%22%3A%5B%5D%2C%22author%22%3A%22Peter%20Cottle%22%2C%22createTime%22%3A%22Mon%20Nov%2005%202012%2000%3A56%3A47%20GMT-0800%20%28PST%29%22%2C%22commitMessage%22%3A%22Quick%20Commit.%20Go%20Bears%21%22%2C%22id%22%3A%22C0%22%2C%22rootCommit%22%3Atrue%7D%2C%22C1%22%3A%7B%22type%22%3A%22commit%22%2C%22parents%22%3A%5B%22C0%22%5D%2C%22author%22%3A%22Peter%20Cottle%22%2C%22createTime%22%3A%22Mon%20Nov%2005%202012%2000%3A56%3A47%20GMT-0800%20%28PST%29%22%2C%22commitMessage%22%3A%22Quick%20Commit.%20Go%20Bears%21%22%2C%22id%22%3A%22C1%22%7D%7D%2C%22HEAD%22%3A%7B%22id%22%3A%22HEAD%22%2C%22target%22%3A%22master%22%2C%22type%22%3A%22general%20ref%22%7D%7D"));this.loadTree(e)},m.prototype.init=function(){this.rootCommit=this.makeCommit(null,null,{rootCommit:!0}),this.commitCollection.add(this.rootCommit);var e=this.makeBranch("master",this.rootCommit);this.HEAD=new g({id:"HEAD",target:e}),this.refs[this.HEAD.get("id")]=this.HEAD,this.commit()},m.prototype.exportTree=function(){var e={branches:{},commits:{},HEAD:null};u.each(this.branchCollection.toJSON(),function(t){t.target=t.target.get("id"),t.visBranch=undefined,e.branches[t.id]=t}),u.each(this.commitCollection.toJSON(),function(t){u.each(b.prototype.constants.circularFields,function(e){t[e]=undefined},this);var n=[];u.each(t.parents,function(e){n.push(e.get("id"))}),t.parents=n,e.commits[t.id]=t},this);var t=this.HEAD.toJSON();return t.visBranch=undefined,t.lastTarget=t.lastLastTarget=t.visBranch=undefined,t.target=t.target.get("id"),e.HEAD=t,e},m.prototype.printTree=function(e){e=e||this.exportTree(),h.prototype.reduceTreeFields([e]);var t=JSON.stringify(e);return/'/.test(t)&&(t=escape(t)),t},m.prototype.printAndCopyTree=function(){window.prompt("Copy the tree string below",this.printTree())},m.prototype.loadTree=function(e){e=$.extend(!0,{},e),this.removeAll(),this.instantiateFromTree(e),this.reloadGraphics(),this.initUniqueID()},m.prototype.loadTreeFromString=function(e){this.loadTree(JSON.parse(unescape(e)))},m.prototype.instantiateFromTree=function(e){var t={};u.each(e.commits,function(n){var r=this.getOrMakeRecursive(e,t,n.id);this.commitCollection.add(r)},this),u.each(e.branches,function(n){var r=this.getOrMakeRecursive(e,t,n.id);this.branchCollection.add(r,{silent:!0})},this);var n=this.getOrMakeRecursive(e,t,e.HEAD.id);this.HEAD=n,this.rootCommit=t.C0;if(!this.rootCommit)throw new Error("Need root commit of C0 for calculations");this.refs=t,this.gitVisuals.gitReady=!1,this.branchCollection.each(function(e){this.gitVisuals.addBranch(e)},this)},m.prototype.reloadGraphics=function(){this.gitVisuals.rootCommit=this.refs.C0,this.gitVisuals.initHeadBranch(),this.gitVisuals.drawTreeFromReload(),this.gitVisuals.refreshTreeHarsh()},m.prototype.getOrMakeRecursive=function(e,t,n){if(t[n])return t[n];var r=function(e,t){if(e.commits[t])return"commit";if(e.branches[t])return"branch";if(t=="HEAD")return"HEAD";throw new Error("bad type for "+t)},i=r(e,n);if(i=="HEAD"){var s=e.HEAD,o=new g(u.extend(e.HEAD,{target:this.getOrMakeRecursive(e,t,s.target)}));return t[n]=o,o}if(i=="branch"){var a=e.branches[n],f=new y(u.extend(e.branches[n],{target:this.getOrMakeRecursive(e,t,a.target)}));return t[n]=f,f}if(i=="commit"){var l=e.commits[n],c=[];u.each(l.parents,function(n){c.push(this.getOrMakeRecursive(e,t,n))},this);var h=new b(u.extend(l,{parents:c,gitVisuals:this.gitVisuals}));return t[n]=h,h}throw new Error("ruh rho!! unsupported type for "+n)},m.prototype.tearDown=function(){this.eventBaton.releaseBaton("processGitCommand",this.dispatch,this),this.removeAll()},m.prototype.removeAll=function(){this.branchCollection.reset(),this.commitCollection.reset(),this.refs={},this.HEAD=null,this.rootCommit=null,this.gitVisuals.resetAll()},m.prototype.getDetachedHead=function(){var e=this.HEAD.get("target"),t=e.get("type");return t!=="branch"},m.prototype.validateBranchName=function(e){e=e.replace(/\s/g,"");if(!/^[a-zA-Z0-9]+$/.test(e))throw new d({msg:"woah bad branch name!! This is not ok: "+e});if(/[hH][eE][aA][dD]/.test(e))throw new d({msg:'branch name of "head" is ambiguous, dont name it that'});return e.length>9&&(e=e.slice(0,9),this.command.addWarning("Sorry, we need to keep branch names short for the visuals. Your branch name was truncated to 9 characters, resulting in "+e)),e},m.prototype.makeBranch=function(e,t){e=this.validateBranchName(e);if(this.refs[e])throw new d({msg:"that branch id either matches a commit hash or already exists!"});var n=new y({target:t,id:e});return this.branchCollection.add(n),this.refs[n.get("id")]=n,n},m.prototype.getHead=function(){return u.clone(this.HEAD)},m.prototype.getBranches=function(){var e=[];return this.branchCollection.each(function(t){e.push({id:t.get("id"),selected:this.HEAD.get("target")===t,target:t.get("target"),obj:t})},this),e},m.prototype.printBranchesWithout=function(e){var t=this.getUpstreamBranchSet(),n=this.getCommitFromRef(e).get("id"),r=[];u.each(t[n],function(e){e.selected=this.HEAD.get("target").get("id")==e.id,r.push(e)},this),this.printBranches(r)},m.prototype.printBranches=function(e){var t="";throw u.each(e,function(e){t+=(e.selected?"* ":"")+e.id+"\n"}),new v({msg:t})},m.prototype.makeCommit=function(e,t,n){if(!t){t=this.uniqueId("C");while(this.refs[t])t=this.uniqueId("C")}var r=new b(u.extend({parents:e,id:t,gitVisuals:this.gitVisuals},n||{}));return this.refs[r.get("id")]=r,this.commitCollection.add(r),r},m.prototype.acceptNoGeneralArgs=function(){if(this.generalArgs.length)throw new d({msg:"That command accepts no general arguments"})},m.prototype.validateArgBounds=function(e,t,n,r){var i=r===undefined?"git "+this.command.get("method"):this.command.get("method")+" "+r+" ";i="with "+i;if(e.lengthn)throw new d({msg:"I expect at most "+String(n)+" argument(s) "+i})},m.prototype.oneArgImpliedHead=function(e,t){this.validateArgBounds(e,0,1,t),e.length===0&&e.push("HEAD")},m.prototype.twoArgsImpliedHead=function(e,t){this.validateArgBounds(e,1,2,t),e.length==1&&e.push("HEAD")},m.prototype.revertStarter=function(){this.validateArgBounds(this.generalArgs,1,NaN);var e=this.revert(this.generalArgs);e&&this.animationFactory.rebaseAnimation(this.animationQueue,e,this,this.gitVisuals)},m.prototype.revert=function(e){var t=[];u.each(e,function(e){t.push(this.getCommitFromRef(e))},this);var n={};n.destinationBranch=this.resolveID(t[0]),n.toRebaseArray=t.slice(0),n.rebaseSteps=[];var r=this.gitVisuals.genSnapshot(),i,s=this.getCommitFromRef("HEAD");return u.each(t,function(e){var t=this.rebaseAltID(e.get("id")),o=this.makeCommit([s],t,{commitMessage:"Reverting "+this.resolveName(e)+': "'+e.get("commitMessage")+'"'});s=o,i=this.gitVisuals.genSnapshot(),n.rebaseSteps.push({oldCommit:e,newCommit:o,beforeSnapshot:r,afterSnapshot:i}),r=i},this),this.setTargetLocation("HEAD",s),n},m.prototype.resetStarter=function(){if(this.commandOptions["--soft"])throw new d({msg:"You can't use --soft because there is no concept of stashing changes or staging files, so you will lose your progress. Try using interactive rebasing (or just rebasing) to move commits."});this.commandOptions["--hard"]&&(this.command.addWarning("Nice! You are using --hard. The default behavior is a hard reset in this demo, so don't worry about specifying the option explicity"),this.generalArgs=this.generalArgs.concat(this.commandOptions["--hard"])),this.validateArgBounds(this.generalArgs,1,1);if(this.getDetachedHead())throw new d({msg:"Cant reset in detached head! Use checkout if you want to move"});this.reset(this.generalArgs[0])},m.prototype.reset=function(e){this.setTargetLocation("HEAD",this.getCommitFromRef(e))},m.prototype.cherrypickStarter=function(){this.validateArgBounds(this.generalArgs,1,1);var e=this.cherrypick(this.generalArgs[0]);this.animationFactory.genCommitBirthAnimation(this.animationQueue,e,this.gitVisuals)},m.prototype.cherrypick=function(e){var t=this.getCommitFromRef(e),n=this.getUpstreamSet("HEAD");if(n[t.get("id")])throw new d({msg:"We already have that commit in our changes history! You can't cherry-pick it if it shows up in git log."});var r=this.rebaseAltID(t.get("id")),i=this.makeCommit([this.getCommitFromRef("HEAD")],r);return this.setTargetLocation(this.HEAD,i),i},m.prototype.commitStarter=function(){this.acceptNoGeneralArgs();if(this.commandOptions["-am"]&&(this.commandOptions["-a"]||this.commandOptions["-m"]))throw new d({msg:"You can't have -am with another -m or -a!"});var e=null,t=null;this.commandOptions["-a"]&&this.command.addWarning("No need to add files in this demo"),this.commandOptions["-am"]&&(t=this.commandOptions["-am"],this.validateArgBounds(t,1,1,"-am"),this.command.addWarning("Don't worry about adding files in this demo. I'll take down your commit message anyways, but you can commit without a message in this demo as well"),e=t[0]),this.commandOptions["-m"]&&(t=this.commandOptions["-m"],this.validateArgBounds(t,1,1,"-m"),e=t[0]);var n=this.commit();e&&(e=e.replace(/"/g,'"').replace(/^"/g,"").replace(/"$/g,""),n.set("commitMessage",e)),this.animationFactory.genCommitBirthAnimation(this.animationQueue,n,this.gitVisuals)},m.prototype.commit=function(){var e=this.getCommitFromRef(this.HEAD),t=null;this.commandOptions["--amend"]&&(e=this.resolveID("HEAD~1"),t=this.rebaseAltID(this.getCommitFromRef("HEAD").get("id")));var n=this.makeCommit([e],t);return this.getDetachedHead()&&this.command.addWarning("Warning!! Detached HEAD state"),this.setTargetLocation(this.HEAD,n),n},m.prototype.resolveName=function(e){var t=this.resolveID(e);return t.get("type")=="commit"?"commit "+t.get("id"):t.get("type")=="branch"?'branch "'+t.get("id")+'"':this.resolveName(t.get("target"))},m.prototype.resolveID=function(e){if(e===null||e===undefined)throw new Error("Dont call this with null / undefined");return typeof e!="string"?e:this.resolveStringRef(e)},m.prototype.resolveStringRef=function(e){if(this.refs[e])return this.refs[e];if(this.refs[e.toUpperCase()])return this.refs[e.toUpperCase()];var t=[[/^([a-zA-Z0-9]+)~(\d+)\s*$/,function(e){return parseInt(e[2],10)}],[/^([a-zA-Z0-9]+)(\^+)\s*$/,function(e){return e[2].length}]],n=null,r=null;u.each(t,function(t){var i=t[0],s=t[1];if(i.test(e)){var o=i.exec(e);r=s(o),n=o[1]}},this);if(!n)throw new d({msg:"unknown ref "+e});if(!this.refs[n])throw new d({msg:"the ref "+n+" does not exist."});var i=this.getCommitFromRef(n);return this.numBackFrom(i,r)},m.prototype.getCommitFromRef=function(e){var t=this.resolveID(e);while(t.get("type")!=="commit")t=t.get("target");return t},m.prototype.getType=function(e){return this.resolveID(e).get("type")},m.prototype.setTargetLocation=function(e,t){if(this.getType(e)=="commit")return;e=this.getOneBeforeCommit(e),e.set("target",t)},m.prototype.getUpstreamBranchSet=function(){var e={},t=function(e,t){var n=!1;return u.each(e,function(e){e.id==t&&(n=!0)}),n},n=function(e){var t=[],n=[e];while(n.length){var r=n.pop();t.push(r.get("id")),r.get("parents")&&r.get("parents").length&&(n=n.concat(r.get("parents")))}return t};return this.branchCollection.each(function(r){var i=n(r.get("target"));u.each(i,function(n){e[n]=e[n]||[],t(e[n],r.get("id"))||e[n].push({obj:r,id:r.get("id")})})}),e},m.prototype.getUpstreamHeadSet=function(){var e=this.getUpstreamSet("HEAD"),t=this.getCommitFromRef("HEAD").get("id");return e[t]=!0,e},m.prototype.getOneBeforeCommit=function(e){var t=this.resolveID(e);return t===this.HEAD&&!this.getDetachedHead()&&(t=t.get("target")),t},m.prototype.numBackFrom=function(e,t){if(t===0)return e;var n=u.bind(function(e){e.sort(this.dateSortFunc)},this),r=[].concat(e.get("parents")||[]);n(r),t--;while(r.length&&t!==0){var i=r.shift(0),s=i.get("parents");s&&s.length&&(r=r.concat(s)),n(r),t--}if(t!==0||r.length===0)throw new d({msg:"Sorry, I can't go that many commits back"});return r.shift(0)},m.prototype.scrapeBaseID=function(e){var t=/^C(\d+)/.exec(e);if(!t)throw new Error("regex failed on "+e);return"C"+t[1]},m.prototype.rebaseAltID=function(e){var t=[[/^C(\d+)[']{0,2}$/,function(e){return e[0]+"'"}],[/^C(\d+)[']{3}$/,function(e){return e[0].slice(0,-3)+"'^4"}],[/^C(\d+)['][\^](\d+)$/,function(e){return"C"+String(e[1])+"'^"+String(Number(e[2])+1)}]];for(var n=0;n",this.get("commitMessage"),"
","Commit: "+this.get("id")].join("\n")+"\n"},getShowEntry:function(){return[this.getLogEntry(),"diff --git a/bigGameResults.html b/bigGameResults.html","--- bigGameResults.html","+++ bigGameResults.html","@@ 13,27 @@ Winner, Score","- Stanfurd, 14-7","+ Cal, 21-14"].join("\n")+"\n"},validateAtInit:function(){if(!this.get("id"))throw new Error("Need ID!!");this.get("createTime")||this.set("createTime",(new Date).toString()),this.get("commitMessage")||this.set("commitMessage","Quick Commit. Go Bears!"),this.set("children",[]);if(!this.get("rootCommit"))if(!this.get("parents")||!this.get("parents").length)throw new Error("needs parents")},addNodeToVisuals:function(){var e=this.get("gitVisuals").addNode(this.get("id"),this);this.set("visNode",e)},addEdgeToVisuals:function(e){this.get("gitVisuals").addEdge(this.get("id"),e.get("id"))},isMainParent:function(e){var t=this.get("parents").indexOf(e);return t===0},initialize:function(e){this.validateAtInit(),this.addNodeToVisuals(),u.each(this.get("parents"),function(e){e.get("children").push(this),this.addEdgeToVisuals(e)},this)}});n.GitEngine=m,n.Commit=b,n.Branch=y,n.Ref=g}),e.define("/src/js/visuals/animation/animationFactory.js",function(e,t,n,r,i,s,o){var u=e("underscore"),a=e("backbone"),f=e("./index").Animation,l=e("../../util/constants").GRAPHICS,c=function(){};c.prototype.genCommitBirthAnimation=function(e,t,n){if(!e)throw new Error("Need animation queue to add closure to!");var r=l.defaultAnimationTime*1,i=r*2,s=t.get("visNode"),o=function(){n.refreshTree(r),s.setBirth(),s.parentInFront(),n.visBranchesFront(),s.animateUpdatedPosition(i,"bounce"),s.animateOutgoingEdges(r)};e.add(new f({closure:o,duration:Math.max(r,i)}))},c.prototype.overrideOpacityDepth2=function(e,t){t=t===undefined?1:t;var n={};return u.each(e,function(e,r){n[r]={},u.each(e,function(e,i){i=="opacity"?n[r][i]=t:n[r][i]=e})}),n},c.prototype.overrideOpacityDepth3=function(e,t){var n={};return u.each(e,function(e,r){n[r]=this.overrideOpacityDepth2(e,t)},this),n},c.prototype.genCommitBirthClosureFromSnapshot=function(e,t){var n=l.defaultAnimationTime*1,r=n*1.5,i=e.newCommit.get("visNode"),s=this.overrideOpacityDepth2(e.afterSnapshot[i.getID()]),o=this.overrideOpacityDepth3(e.afterSnapshot),u=function(){i.setBirthFromSnapshot(e.beforeSnapshot),i.parentInFront(),t.visBranchesFront(),i.animateToAttr(s,r,"bounce"),i.animateOutgoingEdgesToAttr(o,r)};return u},c.prototype.refreshTree=function(e,t){e.add(new f({closure:function(){t.refreshTree()}}))},c.prototype.rebaseAnimation=function(e,t,n,r){this.rebaseHighlightPart(e,t,n),this.rebaseBirthPart(e,t,n,r)},c.prototype.rebaseHighlightPart=function(e,t,n){var r=l.defaultAnimationTime*.66,i=r*2,s=t.toRebaseArray,o=t.destinationBranch.get("visBranch");o||(o=t.destinationBranch.get("visNode")),u.each(s,function(t){var n=t.get("visNode");e.add(new f({closure:function(){n.highlightTo(o,i,"easeInOut")},duration:r*1.5}))},this),this.delay(e,r*2)},c.prototype.rebaseBirthPart=function(e,t,n,r){var i=t.rebaseSteps,s=[];u.each(i,function(e){var t=e.newCommit.get("visNode");s.push(t),t.setOpacity(0),t.setOutgoingEdgesOpacity(0)},this);var o=[];u.each(i,function(t,n){var i=s.slice(n+1),u=this.genFromToSnapshotAnimation(t.beforeSnapshot,t.afterSnapshot,i,o,r),a=this.genCommitBirthClosureFromSnapshot(t,r),c=function(){u(),a()};e.add(new f({closure:c,duration:l.defaultAnimationTime*1.5})),o.push(t.newCommit.get("visNode"))},this),this.delay(e),this.refreshTree(e,r)},c.prototype.delay=function(e,t){t=t||l.defaultAnimationTime,e.add(new f({closure:function(){},duration:t}))},c.prototype.genSetAllCommitOpacities=function(e,t){var n=e.slice(0);return function(){u.each(n,function(e){e.setOpacity(t),e.setOutgoingEdgesOpacity(t)})}},c.prototype.stripObjectsFromSnapshot=function(e,t){var n=[];u.each(t,function(e){n.push(e.getID())});var r={};return u.each(e,function(e,t){if(u.include(n,t))return;r[t]=e},this),r},c.prototype.genFromToSnapshotAnimation=function(e,t,n,r,i){var s=[];u.each(n,function(e){s.push(e),s=s.concat(e.get("outgoingEdges"))});var o=function(e){if(!e)return;u.each(e,function(t,n){e[n].opacity=1})};return u.each([e,t],function(e){u.each(r,function(t){o(e[t.getID()]),u.each(t.get("outgoingEdges"),function(t){o(e[t.getID()])})})}),function(){i.animateAllFromAttrToAttr(e,t,s)}},n.AnimationFactory=c}),e.define("/src/js/visuals/animation/index.js",function(e,t,n,r,i,s,o){var u=e("underscore"),a=e("backbone"),f=e("../../util/constants").GLOBAL,l=a.Model.extend({defaults:{duration:300,closure:null},validateAtInit:function(){if(!this.get("closure"))throw new Error("give me a closure!")},initialize:function(e){this.validateAtInit()},run:function(){this.get("closure")()}}),c=a.Model.extend({defaults:{animations:null,index:0,callback:null,defer:!1},initialize:function(e){this.set("animations",[]),e.callback||console.warn("no callback")},add:function(e){if(!e instanceof l)throw new Error("Need animation not something else");this.get("animations").push(e)},start:function(){this.set("index",0),f.isAnimating=!0,this.next()},finish:function(){f.isAnimating=!1,this.get("callback")()},next:function(){var e=this.get("animations"),t=this.get("index");if(t>=e.length){this.finish();return}var n=e[t],r=n.get("duration");n.run(),this.set("index",t+1),setTimeout(u.bind(function(){this.next()},this),r)}});n.Animation=l,n.AnimationQueue=c}),e.define("/src/js/git/treeCompare.js",function(e,t,n,r,i,s,o){function a(){}var u=e("underscore");a.prototype.compareAllBranchesWithinTreesAndHEAD=function(e,t){return e=this.convertTreeSafe(e),t=this.convertTreeSafe(t),e.HEAD.target==t.HEAD.target&&this.compareAllBranchesWithinTrees(e,t)},a.prototype.compareAllBranchesWithinTrees=function(e,t){e=this.convertTreeSafe(e),t=this.convertTreeSafe(t);var n=u.extend({},e.branches,t.branches),r=!0;return u.uniq(n,function(n,i){r=r&&this.compareBranchWithinTrees(e,t,i)},this),r},a.prototype.compareBranchesWithinTrees=function(e,t,n){var r=!0;return u.each(n,function(n){r=r&&this.compareBranchWithinTrees(e,t,n)},this),r},a.prototype.compareBranchWithinTrees=function(e,t,n){e=this.convertTreeSafe(e),t=this.convertTreeSafe(t),this.reduceTreeFields([e,t]);var r=this.getRecurseCompare(e,t),i=e.branches[n],s=t.branches[n];return u.isEqual(i,s)&&r(e.commits[i.target],t.commits[s.target])},a.prototype.compareAllBranchesWithinTreesHashAgnostic=function(e,t){e=this.convertTreeSafe(e),t=this.convertTreeSafe(t),this.reduceTreeFields([e,t]);var n=u.bind(function(e,t){return!e||!t?!1:(e.target=this.getBaseRef(e.target),t.target=this.getBaseRef(t.target),u.isEqual(e,t))},this),r=this.getRecurseCompareHashAgnostic(e,t),i=u.extend({},e.branches,t.branches),s=!0;return u.each(i,function(i,o){branchA=e.branches[o],branchB=t.branches[o],s=s&&n(branchA,branchB)&&r(e.commits[branchA.target],t.commits[branchB.target])},this),s},a.prototype.getBaseRef=function(e){var t=/^C(\d+)/,n=t.exec(e);if(!n)throw new Error("no regex matchy for "+e);return"C"+n[1]},a.prototype.getRecurseCompareHashAgnostic=function(e,t){var n=u.bind(function(e){return u.extend({},e,{id:this.getBaseRef(e.id)})},this),r=function(e,t){return u.isEqual(n(e),n(t))};return this.getRecurseCompare(e,t,{isEqual:r})},a.prototype.getRecurseCompare=function(e,t,n){n=n||{};var r=function(i,s){var o=n.isEqual?n.isEqual(i,s):u.isEqual(i,s);if(!o)return!1;var a=u.unique(i.parents.concat(s.parents));return u.each(a,function(n,i){var u=s.parents[i],a=e.commits[n],f=t.commits[u];o=o&&r(a,f)},this),o};return r},a.prototype.convertTreeSafe=function(e){return typeof e=="string"?JSON.parse(unescape(e)):e},a.prototype.reduceTreeFields=function(e){var t=["parents","id","rootCommit"],n=["children","parents"],r=["target","id"],i=function(e,t,n,r){var i=e[t];u.each(i,function(i,s){var o={};u.each(n,function(e){i[e]!==undefined&&(o[e]=i[e])}),u.each(r,function(e){i[e]&&(i[e].sort(),o[e]=i[e])}),e[t][s]=o})};u.each(e,function(e){i(e,"commits",t,n),i(e,"branches",r),e.HEAD={target:e.HEAD.target,id:e.HEAD.id}})},a.prototype.compareTrees=function(e,t){return e=this.convertTreeSafe(e),t=this.convertTreeSafe(t),this.reduceTreeFields([e,t]),u.isEqual(e,t)},n.TreeCompare=a}),e.define("/src/js/views/rebaseView.js",function(e,t,n,r,i,s,o){var u=e("../util/errors").GitError,a=e("underscore"),f=e("q"),l=e("../util").isBrowser()?window.Backbone:e("backbone"),c=e("../views").ModalTerminal,h=e("../views").ContainedBase,p=e("../views").ConfirmCancelView,d=e("../views").LeftRightView,v=h.extend({tagName:"div",template:a.template($("#interactive-rebase-template").html()),initialize:function(e){this.deferred=e.deferred,this.rebaseMap={},this.entryObjMap={},this.rebaseEntries=new g,e.toRebase.reverse(),a.each(e.toRebase,function(e){var t=e.get("id");this.rebaseMap[t]=e,this.entryObjMap[t]=new m({id:t}),this.rebaseEntries.add(this.entryObjMap[t])},this),this.container=new c({title:"Interactive Rebase"}),this.render(),this.show()},confirm:function(){this.die();var e=[];this.$("ul.rebaseEntries li").each(function(t,n){e.push(n.id)});var t=[];a.each(e,function(e){this.entryObjMap[e].get("pick")&&t.unshift(this.rebaseMap[e])},this),t.reverse(),this.deferred.resolve(t),this.$el.html("")},render:function(){var e={num:a.keys(this.rebaseMap).length},t=this.container.getInsideElement();this.$el.html(this.template(e)),$(t).append(this.el);var n=this.$("ul.rebaseEntries");this.rebaseEntries.each(function(e){new y({el:n,model:e})},this),n.sortable({axis:"y",placeholder:"rebaseEntry transitionOpacity ui-state-highlight",appendTo:"parent"}),this.makeButtons()},makeButtons:function(){var e=f.defer();e.promise.then(a.bind(function(){this.confirm()},this)).fail(a.bind(function(){this.hide(),this.deferred.resolve([])},this)).done(),new p({destination:this.$(".confirmCancel"),deferred:e})}}),m=l.Model.extend({defaults:{pick:!0},toggle:function(){this.set("pick",!this.get("pick"))}}),g=l.Collection.extend({model:m}),y=l.View.extend({tagName:"li",template:a.template($("#interactive-rebase-entry-template").html()),toggle:function(){this.model.toggle(),this.listEntry.toggleClass("notPicked",!this.model.get("pick"))},initialize:function(e){this.render()},render:function(){var e=this.model.toJSON();this.$el.append(this.template(this.model.toJSON())),this.listEntry=this.$el.children(":last"),this.listEntry.delegate("#toggleButton","click",a.bind(function(){this.toggle()},this))}});n.InteractiveRebaseView=v}),e.define("/src/js/views/index.js",function(e,t,n,r,i,s,o){var u=e("underscore"),a=e("q"),f=e("../util").isBrowser()?window.Backbone:e("backbone"),l=e("../app"),c=e("../util/constants"),h=e("../util/keyboard").KeyboardListener,p=e("../util/errors").GitError,d=f.View.extend({getDestination:function(){return this.destination||this.container.getInsideElement()},tearDown:function(){this.$el.remove(),this.container&&this.container.tearDown()},renderAgain:function(e){e=e||this.template(this.JSON),this.$el.html(e)},render:function(e){this.renderAgain(e);var t=this.getDestination();$(t).append(this.el)}}),v=d.extend({resolve:function(){this.deferred.resolve()},reject:function(){this.deferred.reject()}}),m=d.extend({positive:function(){this.navEvents.trigger("positive")},negative:function(){this.navEvents.trigger("negative")}}),g=d.extend({getAnimationTime:function(){return 700},show:function(){this.container.show()},hide:function(){this.container.hide()},die:function(){this.hide(),setTimeout(u.bind(function(){this.tearDown()},this),this.getAnimationTime()*1.1)}}),y=g.extend({tagName:"a",className:"generalButton uiButton",template:u.template($("#general-button").html()),events:{click:"click"},initialize:function(e){e=e||{},this.navEvents=e.navEvents||u.clone(f.Events),this.destination=e.destination,this.destination||(this.container=new S),this.JSON={buttonText:e.buttonText||"General Button",wantsWrapper:e.wantsWrapper!==undefined?e.wantsWrapper:!0},this.render(),this.container&&!e.wait&&this.show()},click:function(){this.clickFunc||(this.clickFunc=u.throttle(u.bind(this.sendClick,this),500)),this.clickFunc()},sendClick:function(){this.navEvents.trigger("click")}}),b=v.extend({tagName:"div",className:"confirmCancelView box horizontal justify",template:u.template($("#confirm-cancel-template").html()),events:{"click .confirmButton":"resolve","click .cancelButton":"reject"},initialize:function(e){if(!e.destination)throw new Error("needmore");this.destination=e.destination,this.deferred=e.deferred||a.defer(),this.JSON={confirm:e.confirm||"Confirm",cancel:e.cancel||"Cancel"},this.render()}}),w=m.extend({tagName:"div",className:"leftRightView box horizontal center",template:u.template($("#left-right-template").html()),events:{"click .left":"negative","click .right":"positive"},positive:function(){this.pipeEvents.trigger("positive"),w.__super__.positive.apply(this)},negative:function(){this.pipeEvents.trigger("negative"),w.__super__.negative.apply(this)},initialize:function(e){if(!e.destination||!e.events)throw new Error("needmore");this.destination=e.destination,this.pipeEvents=e.events,this.navEvents=u.clone(f.Events),this.JSON={showLeft:e.showLeft===undefined?!0:e.showLeft,lastNav:e.lastNav===undefined?!1:e.lastNav},this.render()}}),E=f.View.extend({tagName:"div",className:"modalView box horizontal center transitionOpacityLinear",template:u.template($("#modal-view-template").html()),getAnimationTime:function(){return 700},initialize:function(e){this.shown=!1,this.render()},render:function(){this.$el.html(this.template({})),$("body").append(this.el)},stealKeyboard:function(){l.getEventBaton().stealBaton("keydown",this.onKeyDown,this),l.getEventBaton().stealBaton("keyup",this.onKeyUp,this),l.getEventBaton().stealBaton("windowFocus",this.onWindowFocus,this),l.getEventBaton().stealBaton("documentClick",this.onDocumentClick,this),$("#commandTextField").blur()},releaseKeyboard:function(){l.getEventBaton().releaseBaton("keydown",this.onKeyDown,this),l.getEventBaton().releaseBaton("keyup",this.onKeyUp,this),l.getEventBaton().releaseBaton("windowFocus",this.onWindowFocus,this),l.getEventBaton().releaseBaton("documentClick",this.onDocumentClick,this),l.getEventBaton().trigger("windowFocus")},onWindowFocus:function(e){},onDocumentClick:function(e){},onKeyDown:function(e){e.preventDefault()},onKeyUp:function(e){e.preventDefault()},show:function(){this.toggleZ(!0),s.nextTick(u.bind(function(){this.toggleShow(!0)},this))},hide:function(){this.toggleShow(!1),setTimeout(u.bind(function(){this.shown||this.toggleZ(!1)},this),this.getAnimationTime())},getInsideElement:function(){return this.$(".contentHolder")},toggleShow:function(e){if(this.shown===e)return;e?this.stealKeyboard():this.releaseKeyboard(),this.shown=e,this.$el.toggleClass("show",e)},toggleZ:function(e){this.$el.toggleClass("inFront",e)},tearDown:function(){this.$el.html(""),$("body")[0].removeChild(this.el)}}),S=g.extend({tagName:"div",className:"modalTerminal box flex1",template:u.template($("#terminal-window-template").html()),events:{"click div.inside":"onClick"},initialize:function(e){e=e||{},this.navEvents=e.events||u.clone(f.Events),this.container=new E,this.JSON={title:e.title||"Heed This Warning!"},this.render()},onClick:function(){this.navEvents.trigger("click")},getInsideElement:function(){return this.$(".inside")}}),x=g.extend({tagName:"div",template:u.template($("#modal-alert-template").html()),initialize:function(e){e=e||{},this.JSON={title:e.title||"Something to say",text:e.text||"Here is a paragraph",markdown:e.markdown},e.markdowns&&(this.JSON.markdown=e.markdowns.join("\n")),this.container=new S({title:"Alert!"}),this.render(),e.wait||this.show()},render:function(){var t=this.JSON.markdown?e("markdown").markdown.toHTML(this.JSON.markdown):this.template(this.JSON);x.__super__.render.apply(this,[t])}}),T=f.View.extend({initialize:function(e){e=e||{},this.deferred=e.deferred||a.defer(),this.modalAlert=new x(u.extend({},{markdown:"#you sure?"},e));var t=a.defer();this.buttonDefer=t,this.confirmCancel=new b({deferred:t,destination:this.modalAlert.getDestination()}),t.promise.then(this.deferred.resolve).fail(this.deferred.reject).done(u.bind(function(){this.close()},this)),this.navEvents=u.clone(f.Events),this.navEvents.on("positive",this.positive,this),this.navEvents.on("negative",this.negative,this),this.keyboardListener=new h({events:this.navEvents,aliasMap:{enter:"positive",esc:"negative"}}),e.wait||this.modalAlert.show()},positive:function(){this.buttonDefer.resolve()},negative:function(){this.buttonDefer.reject()},getAnimationTime:function(){return 700},show:function(){this.modalAlert.show()},hide:function(){this.modalAlert.hide()},getPromise:function(){return this.deferred.promise},close:function(){this.keyboardListener.mute(),this.modalAlert.die()}}),N=T.extend({initialize:function(e){e=e||{};var t=e.nextLevel?e.nextLevel.name:"",n=["## Great Job!!","","You solved the level in **"+e.numCommands+"** command(s); ","our solution uses "+e.best+". "];e.numCommands<=e.best?n.push("Awesome! You matched or exceeded our solution. "):n.push("See if you can whittle it down to "+e.best+" command(s) :D "),e.nextLevel?n=n.concat(["",'Would you like to move onto "'+t+'", the next level?']):n=n.concat(["","Wow!!! You finished the last level, congratulations!"]),e=u.extend({},e,{markdowns:n}),N.__super__.initialize.apply(this,[e])}}),C=f.View.extend({initialize:function(e){this.grabBatons(),this.modalAlert=new x({markdowns:this.markdowns}),this.modalAlert.show()},grabBatons:function(){l.getEventBaton().stealBaton(this.eventBatonName,this.batonFired,this)},releaseBatons:function(){l.getEventBaton().releaseBaton(this.eventBatonName,this.batonFired,this)},finish:function(){this.releaseBatons(),this.modalAlert.die()}}),k=C.extend({initialize:function(e){this.eventBatonName="windowSizeCheck",this.markdowns=["## That window size is not supported :-/","Please resize your window back to a supported size","","(and of course, pull requests to fix this are appreciated :D)"],k.__super__.initialize.apply(this,[e])},batonFired:function(e){e.w>c.VIEWPORT.minWidth&&e.h>c.VIEWPORT.minHeight&&this.finish()}}),L=C.extend({initialize:function(e){if(!e||!e.level)throw new Error("need level");this.eventBatonName="zoomChange",this.markdowns=["## That zoom level of "+e.level+" is not supported :-/","Please zoom back to a supported zoom level with Ctrl + and Ctrl -","","(and of course, pull requests to fix this are appreciated :D)"],L.__super__.initialize.apply(this,[e])},batonFired:function(e){e<=c.VIEWPORT.maxZoom&&e>=c.VIEWPORT.minZoom&&this.finish()}}),A=d.extend({tagName:"div",className:"levelToolbarHolder",template:u.template($("#level-toolbar-template").html()),initialize:function(e){e=e||{},this.JSON={name:e.name||"Some level! (unknown name)"},this.beforeDestination=$($("#commandLineHistory div.toolbar")[0]),this.render(),e.wait||s.nextTick(u.bind(this.show,this))},getAnimationTime:function(){return 700},render:function(){var e=this.template(this.JSON);this.$el.html(e),this.beforeDestination.after(this.el)},die:function(){this.hide(),setTimeout(u.bind(function(){this.tearDown()},this),this.getAnimationTime())},hide:function(){this.$("div.toolbar").toggleClass("hidden",!0)},show:function(){this.$("div.toolbar").toggleClass("hidden",!1)}}),O=d.extend({tagName:"div",className:"canvasTerminalHolder box flex1",template:u.template($("#terminal-window-bare-template").html()),events:{"click div.wrapper":"onClick"},initialize:function(e){e=e||{},this.destination=$("body"),this.JSON={title:e.title||"Goal To Reach",text:e.text||'You can hide this window with "hide goal"'},this.render(),e.additionalClass&&this.$el.addClass(e.additionalClass)},getAnimationTime:function(){return 700},onClick:function(){this.slideOut()},die:function(){this.slideOut(),setTimeout(u.bind(function(){this.tearDown()},this))},slideOut:function(){this.slideToggle(!0)},slideIn:function(){this.slideToggle(!1)},slideToggle:function(e){this.$("div.terminal-window-holder").toggleClass("slideOut",e)},getCanvasLocation:function(){return this.$("div.inside")[0]}});n.BaseView=d,n.GeneralButton=y,n.ModalView=E,n.ModalTerminal=S,n.ModalAlert=x,n.ContainedBase=g,n.ConfirmCancelView=b,n.LeftRightView=w,n.ZoomAlertWindow=L,n.ConfirmCancelTerminal=T,n.WindowSizeAlertWindow=k,n.CanvasTerminalHolder=O,n.LevelToolbar=A,n.NextLevelConfirm=N}),e.define("/src/js/util/keyboard.js",function(e,t,n,r,i,s,o){function c(e){this.events=e.events||u.clone(a.Events),this.aliasMap=e.aliasMap||{},e.wait||this.listen()}var u=e("underscore"),a=e("backbone"),f=e("../app"),l=function(e){var t={37:"left",38:"up",39:"right",40:"down",27:"esc",13:"enter"};return t[e]};c.prototype.listen=function(){if(this.listening)return;this.listening=!0,f.getEventBaton().stealBaton("docKeydown",this.keydown,this)},c.prototype.mute=function(){this.listening=!1,f.getEventBaton().releaseBaton("docKeydown",this.keydown,this)},c.prototype.keydown=function(e){var t=e.which||e.keyCode,n=l(t);if(n===undefined)return;this.fireEvent(n,e)},c.prototype.fireEvent=function(e,t){e=this.aliasMap[e]||e,this.events.trigger(e,t)},c.prototype.passEventBack=function(e){f.getEventBaton().passBatonBackSoft("docKeydown",this.keydown,this,[e])},n.KeyboardListener=c,n.mapKeycodeToKey=l}),e.define("/node_modules/markdown/package.json",function(e,t,n,r,i,s,o){t.exports={main:"./lib/index.js"}}),e.define("/node_modules/markdown/lib/index.js",function(e,t,n,r,i,s,o){n.markdown=e("./markdown"),n.parse=n.markdown.toHTML}),e.define("/node_modules/markdown/lib/markdown.js",function(e,t,n,r,i,s,o){(function(t){function r(){return"Markdown.mk_block( "+uneval(this.toString())+", "+uneval(this.trailing)+", "+uneval(this.lineNumber)+" )"}function i(){var t=e("util");return"Markdown.mk_block( "+t.inspect(this.toString())+", "+t.inspect(this.trailing)+", "+t.inspect(this.lineNumber)+" )"}function o(e){var t=0,n=-1;while((n=e.indexOf("\n",n+1))!==-1)t++;return t}function u(e,t){function i(e){this.len_after=e,this.name="close_"+t}var n=e+"_state",r=e=="strong"?"em_state":"strong_state";return function(s,o){if(this[n][0]==t)return this[n].shift(),[s.length,new i(s.length-t.length)];var u=this[r].slice(),a=this[n].slice();this[n].unshift(t);var f=this.processInline(s.substr(t.length)),l=f[f.length-1],c=this[n].shift();if(l instanceof i){f.pop();var h=s.length-l.len_after;return[h,[e].concat(f)]}return this[r]=u,this[n]=a,[t.length,t]}}function f(e){var t=e.split(""),n=[""],r=!1;while(t.length){var i=t.shift();switch(i){case" ":r?n[n.length-1]+=i:n.push("");break;case"'":case'"':r=!r;break;case"\\":i=t.shift();default:n[n.length-1]+=i}}return n}function h(e){return l(e)&&e.length>1&&typeof e[1]=="object"&&!l(e[1])?e[1]:undefined}function d(e){return e.replace(/&/g,"&").replace(//g,">").replace(/"/g,""").replace(/'/g,"'")}function v(e){if(typeof e=="string")return d(e);var t=e.shift(),n={},r=[];e.length&&typeof e[0]=="object"&&!(e[0]instanceof Array)&&(n=e.shift());while(e.length)r.push(arguments.callee(e.shift()));var i="";for(var s in n)i+=" "+s+'="'+d(n[s])+'"';return t=="img"||t=="br"||t=="hr"?"<"+t+i+"/>":"<"+t+i+">"+r.join("")+""+t+">"}function m(e,t,n){var r;n=n||{};var i=e.slice(0);typeof n.preprocessTreeNode=="function"&&(i=n.preprocessTreeNode(i,t));var s=h(i);if(s){i[1]={};for(r in s)i[1][r]=s[r];s=i[1]}if(typeof i=="string")return i;switch(i[0]){case"header":i[0]="h"+i[1].level,delete i[1].level;break;case"bulletlist":i[0]="ul";break;case"numberlist":i[0]="ol";break;case"listitem":i[0]="li";break;case"para":i[0]="p";break;case"markdown":i[0]="html",s&&delete s.references;break;case"code_block":i[0]="pre",r=s?2:1;var o=["code"];o.push.apply(o,i.splice(r)),i[r]=o;break;case"inlinecode":i[0]="code";break;case"img":i[1].src=i[1].href,delete i[1].href;break;case"linebreak":i[0]="br";break;case"link":i[0]="a";break;case"link_ref":i[0]="a";var u=t[s.ref];if(!u)return s.original;delete s.ref,s.href=u.href,u.title&&(s.title=u.title),delete s.original;break;case"img_ref":i[0]="img";var u=t[s.ref];if(!u)return s.original;delete s.ref,s.src=u.href,u.title&&(s.title=u.title),delete s.original}r=1;if(s){for(var a in i[1])r=2;r===1&&i.splice(r,1)}for(;r0&&!l(o[0]))&&this.debug(i[s],"didn't return a proper array"),o}return[]},n.prototype.processInline=function(t){return this.dialect.inline.__call__.call(this,String(t))},n.prototype.toTree=function(t,n){var r=t instanceof Array?t:this.split_blocks(t),i=this.tree;try{this.tree=n||this.tree||["markdown"];e:while(r.length){var s=this.processBlock(r.shift(),r);if(!s.length)continue e;this.tree.push.apply(this.tree,s)}return this.tree}finally{n&&(this.tree=i)}},n.prototype.debug=function(){var e=Array.prototype.slice.call(arguments);e.unshift(this.debug_indent),typeof print!="undefined"&&print.apply(print,e),typeof console!="undefined"&&typeof console.log!="undefined"&&console.log.apply(null,e)},n.prototype.loop_re_over_block=function(e,t,n){var r,i=t.valueOf();while(i.length&&(r=e.exec(i))!=null)i=i.substr(r[0].length),n.call(this,r);return i},n.dialects={},n.dialects.Gruber={block:{atxHeader:function(t,n){var r=t.match(/^(#{1,6})\s*(.*?)\s*#*\s*(?:\n|$)/);if(!r)return undefined;var i=["header",{level:r[1].length}];return Array.prototype.push.apply(i,this.processInline(r[2])),r[0].length1&&n.unshift(r);for(var s=0;s1&&typeof i[i.length-1]=="string"?i[i.length-1]+=o:i.push(o)}}function f(e,t){var n=new RegExp("^("+i+"{"+e+"}.*?\\n?)*$"),r=new RegExp("^"+i+"{"+e+"}","gm"),o=[];while(t.length>0){if(n.exec(t[0])){var u=t.shift(),a=u.replace(r,"");o.push(s(a,u.trailing,u.lineNumber))}break}return o}function l(e,t,n){var r=e.list,i=r[r.length-1];if(i[1]instanceof Array&&i[1][0]=="para")return;if(t+1==n.length)i.push(["para"].concat(i.splice(1)));else{var s=i.pop();i.push(["para"].concat(i.splice(1)),s)}}var e="[*+-]|\\d+\\.",t=/[*+-]/,n=/\d+\./,r=new RegExp("^( {0,3})("+e+")[ ]+"),i="(?: {0,3}\\t| {4})";return function(e,n){function s(e){var n=t.exec(e[2])?["bulletlist"]:["numberlist"];return h.push({list:n,indent:e[1]}),n}var i=e.match(r);if(!i)return undefined;var h=[],p=s(i),d,v=!1,m=[h[0].list],g;e:for(;;){var y=e.split(/(?=\n)/),b="";for(var w=0;wh.length)p=s(i),d.push(p),d=p[1]=["listitem"];else{var N=!1;for(g=0;gi[0].length&&(b+=E+S.substr(i[0].length))}b.length&&(a(d,v,this.processInline(b),E),v=!1,b="");var C=f(h.length,n);C.length>0&&(c(h,l,this),d.push.apply(d,this.toTree(C,[])));var k=n[0]&&n[0].valueOf()||"";if(k.match(r)||k.match(/^ /)){e=n.shift();var L=this.dialect.block.horizRule(e,n);if(L){m.push.apply(m,L);break}c(h,l,this),v=!0;continue e}break}return m}}(),blockquote:function(t,n){if(!t.match(/^>/m))return undefined;var r=[];if(t[0]!=">"){var i=t.split(/\n/),s=[];while(i.length&&i[0][0]!=">")s.push(i.shift());t=i.join("\n"),r.push.apply(r,this.processBlock(s.join("\n"),[]))}while(n.length&&n[0][0]==">"){var o=n.shift();t=new String(t+t.trailing+o),t.trailing=o.trailing}var u=t.replace(/^> ?/gm,""),a=this.tree;return r.push(this.toTree(u,["blockquote"])),r},referenceDefn:function(t,n){var r=/^\s*\[(.*?)\]:\s*(\S+)(?:\s+(?:(['"])(.*?)\3|\((.*?)\)))?\n?/;if(!t.match(r))return undefined;h(this.tree)||this.tree.splice(1,0,{});var i=h(this.tree);i.references===undefined&&(i.references={});var o=this.loop_re_over_block(r,t,function(e){e[2]&&e[2][0]=="<"&&e[2][e[2].length-1]==">"&&(e[2]=e[2].substring(1,e[2].length-1));var t=i.references[e[1].toLowerCase()]={href:e[2]};e[4]!==undefined?t.title=e[4]:e[5]!==undefined&&(t.title=e[5])});return o.length&&n.unshift(s(o,t.trailing)),[]},para:function(t,n){return[["para"].concat(this.processInline(t))]}}},n.dialects.Gruber.inline={__oneElement__:function(t,n,r){var i,s,o=0;n=n||this.dialect.inline.__patterns__;var u=new RegExp("([\\s\\S]*?)("+(n.source||n)+")");i=u.exec(t);if(!i)return[t.length,t];if(i[1])return[i[1].length,i[1]];var s;return i[2]in this.dialect.inline&&(s=this.dialect.inline[i[2]].call(this,t.substr(i.index),i,r||[])),s=s||[i[2].length,i[2]],s},__call__:function(t,n){function s(e){typeof e=="string"&&typeof r[r.length-1]=="string"?r[r.length-1]+=e:r.push(e)}var r=[],i;while(t.length>0)i=this.dialect.inline.__oneElement__.call(this,t,n,r),t=t.substr(i.shift()),c(i,s);return r},"]":function(){},"}":function(){},"\\":function(t){return t.match(/^\\[\\`\*_{}\[\]()#\+.!\-]/)?[2,t[1]]:[1,"\\"]},"![":function(t){var n=t.match(/^!\[(.*?)\][ \t]*\([ \t]*(\S*)(?:[ \t]+(["'])(.*?)\3)?[ \t]*\)/);if(n){n[2]&&n[2][0]=="<"&&n[2][n[2].length-1]==">"&&(n[2]=n[2].substring(1,n[2].length-1)),n[2]=this.dialect.inline.__call__.call(this,n[2],/\\/)[0];var r={alt:n[1],href:n[2]||""};return n[4]!==undefined&&(r.title=n[4]),[n[0].length,["img",r]]}return n=t.match(/^!\[(.*?)\][ \t]*\[(.*?)\]/),n?[n[0].length,["img_ref",{alt:n[1],ref:n[2].toLowerCase(),original:n[0]}]]:[2,"!["]},"[":function b(e){var t=String(e),r=n.DialectHelpers.inline_until_char.call(this,e.substr(1),"]");if(!r)return[1,"["];var i=1+r[0],s=r[1],b,o;e=e.substr(i);var u=e.match(/^\s*\([ \t]*(\S+)(?:[ \t]+(["'])(.*?)\2)?[ \t]*\)/);if(u){var a=u[1];i+=u[0].length,a&&a[0]=="<"&&a[a.length-1]==">"&&(a=a.substring(1,a.length-1));if(!u[3]){var f=1;for(var l=0;l]+)|(.*?@.*?\.[a-zA-Z]+))>/))!=null?n[3]?[n[0].length,["link",{href:"mailto:"+n[3]},n[3]]]:n[2]=="mailto"?[n[0].length,["link",{href:n[1]},n[1].substr("mailto:".length)]]:[n[0].length,["link",{href:n[1]},n[1]]]:[1,"<"]},"`":function(t){var n=t.match(/(`+)(([\s\S]*?)\1)/);return n&&n[2]?[n[1].length+n[2].length,["inlinecode",n[3]]]:[1,"`"]}," \n":function(t){return[3,["linebreak"]]}},n.dialects.Gruber.inline["**"]=u("strong","**"),n.dialects.Gruber.inline.__=u("strong","__"),n.dialects.Gruber.inline["*"]=u("em","*"),n.dialects.Gruber.inline._=u("em","_"),n.buildBlockOrder=function(e){var t=[];for(var n in e){if(n=="__order__"||n=="__call__")continue;t.push(n)}e.__order__=t},n.buildInlinePatterns=function(e){var t=[];for(var n in e){if(n.match(/^__.*__$/))continue;var r=n.replace(/([\\.*+?|()\[\]{}])/g,"\\$1").replace(/\n/,"\\n");t.push(n.length==1?r:"(?:"+r+")")}t=t.join("|"),e.__patterns__=t;var i=e.__call__;e.__call__=function(e,n){return n!=undefined?i.call(this,e,n):i.call(this,e,t)}},n.DialectHelpers={},n.DialectHelpers.inline_until_char=function(e,t){var n=0,r=[];for(;;){if(e[n]==t)return n++,[n,r];if(n>=e.length)return null;res=this.dialect.inline.__oneElement__.call(this,e.substr(n)),n+=res[0],r.push.apply(r,res.slice(1))}},n.subclassDialect=function(e){function t(){}function n(){}return t.prototype=e.block,n.prototype=e.inline,{block:new t,inline:new n}},n.buildBlockOrder(n.dialects.Gruber.block),n.buildInlinePatterns(n.dialects.Gruber.inline),n.dialects.Maruku=n.subclassDialect(n.dialects.Gruber),n.dialects.Maruku.processMetaHash=function(t){var n=f(t),r={};for(var i=0;i1)return undefined;if(!t.match(/^(?:\w+:.*\n)*\w+:.*$/))return undefined;h(this.tree)||this.tree.splice(1,0,{});var r=t.split(/\n/);for(p in r){var i=r[p].match(/(\w+):\s*(.*)$/),s=i[1].toLowerCase(),o=i[2];this.tree[1][s]=o}return[]},n.dialects.Maruku.block.block_meta=function(t,n){var r=t.match(/(^|\n) {0,3}\{:\s*((?:\\\}|[^\}])*)\s*\}$/);if(!r)return undefined;var i=this.dialect.processMetaHash(r[2]),s;if(r[1]===""){var o=this.tree[this.tree.length-1];s=h(o);if(typeof o=="string")return undefined;s||(s={},o.splice(1,0,s));for(a in i)s[a]=i[a];return[]}var u=t.replace(/\n.*$/,""),f=this.processBlock(u,[]);s=h(f[0]),s||(s={},f[0].splice(1,0,s));for(a in i)s[a]=i[a];return f},n.dialects.Maruku.block.definition_list=function(t,n){var r=/^((?:[^\s:].*\n)+):\s+([\s\S]+)$/,i=["dl"],s;if(!(a=t.match(r)))return undefined;var o=[t];while(n.length&&r.exec(n[0]))o.push(n.shift());for(var u=0;u-1&&(a(e)?i=i.split("\n").map(function(e){return" "+e}).join("\n").substr(2):i="\n"+i.split("\n").map(function(e){return" "+e}).join("\n"))):i=o("[Circular]","special"));if(typeof n=="undefined"){if(g==="Array"&&t.match(/^\d+$/))return i;n=JSON.stringify(""+t),n.match(/^"([a-zA-Z_][a-zA-Z_0-9]*)"$/)?(n=n.substr(1,n.length-2),n=o(n,"name")):(n=n.replace(/'/g,"\\'").replace(/\\"/g,'"').replace(/(^"|"$)/g,"'"),n=o(n,"string"))}return n+": "+i});s.pop();var E=0,S=w.reduce(function(e,t){return E++,t.indexOf("\n")>=0&&E++,e+t.length+1},0);return S>50?w=y[0]+(m===""?"":m+"\n ")+" "+w.join(",\n ")+" "+y[1]:w=y[0]+m+" "+w.join(", ")+" "+y[1],w}var s=[],o=function(e,t){var n={bold:[1,22],italic:[3,23],underline:[4,24],inverse:[7,27],white:[37,39],grey:[90,39],black:[30,39],blue:[34,39],cyan:[36,39],green:[32,39],magenta:[35,39],red:[31,39],yellow:[33,39]},r={special:"cyan",number:"blue","boolean":"yellow","undefined":"grey","null":"bold",string:"green",date:"magenta",regexp:"red"}[t];return r?"["+n[r][0]+"m"+e+"["+n[r][1]+"m":e};return i||(o=function(e,t){return e}),u(e,typeof r=="undefined"?2:r)};var h=["Jan","Feb","Mar","Apr","May","Jun","Jul","Aug","Sep","Oct","Nov","Dec"];n.log=function(e){},n.pump=null;var d=Object.keys||function(e){var t=[];for(var n in e)t.push(n);return t},v=Object.getOwnPropertyNames||function(e){var t=[];for(var n in e)Object.hasOwnProperty.call(e,n)&&t.push(n);return t},m=Object.create||function(e,t){var n;if(e===null)n={__proto__:null};else{if(typeof e!="object")throw new TypeError("typeof prototype["+typeof e+"] != 'object'");var r=function(){};r.prototype=e,n=new r,n.__proto__=e}return typeof t!="undefined"&&Object.defineProperties&&Object.defineProperties(n,t),n};n.inherits=function(e,t){e.super_=t,e.prototype=m(t.prototype,{constructor:{value:e,enumerable:!1,writable:!0,configurable:!0}})};var g=/%[sdj%]/g;n.format=function(e){if(typeof e!="string"){var t=[];for(var r=0;r=s)return e;switch(e){case"%s":return String(i[r++]);case"%d":return Number(i[r++]);case"%j":return JSON.stringify(i[r++]);default:return e}});for(var u=i[r];r0&&this._events[e].length>n&&(this._events[e].warned=!0,console.error("(node) warning: possible EventEmitter memory leak detected. %d listeners added. Use emitter.setMaxListeners() to increase limit.",this._events[e].length),console.trace())}this._events[e].push(t)}else this._events[e]=[this._events[e],t];return this},u.prototype.on=u.prototype.addListener,u.prototype.once=function(e,t){var n=this;return n.on(e,function r(){n.removeListener(e,r),t.apply(this,arguments)}),this},u.prototype.removeListener=function(e,t){if("function"!=typeof t)throw new Error("removeListener only takes instances of Function");if(!this._events||!this._events[e])return this;var n=this._events[e];if(a(n)){var r=f(n,t);if(r<0)return this;n.splice(r,1),n.length==0&&delete this._events[e]}else this._events[e]===t&&delete this._events[e];return this},u.prototype.removeAllListeners=function(e){return e&&this._events&&this._events[e]&&(this._events[e]=null),this},u.prototype.listeners=function(e){return this._events||(this._events={}),this._events[e]||(this._events[e]=[]),a(this._events[e])||(this._events[e]=[this._events[e]]),this._events[e]}}),e.define("/src/js/models/commandModel.js",function(e,t,n,r,i,s,o){var u=e("underscore"),a=e("../util").isBrowser()?a=window.Backbone:a=e("backbone"),f=e("../util/errors"),l=e("../git/commands"),c=l.GitOptionParser,h=e("../level/parseWaterfall").ParseWaterfall,p=f.CommandProcessError,d=f.GitError,v=f.Warning,m=f.CommandResult,g=a.Model.extend({defaults:{status:"inqueue",rawStr:null,result:"",createTime:null,error:null,warnings:null,parseWaterfall:new h,generalArgs:null,supportedMap:null,options:null,method:null},initialize:function(e){this.initDefaults(),this.validateAtInit(),this.on("change:error",this.errorChanged,this),this.get("error")&&this.errorChanged(),this.parseOrCatch()},initDefaults:function(){this.set("generalArgs",[]),this.set("supportedMap",{}),this.set("warnings",[])},validateAtInit:function(){if(this.get("rawStr")===null)throw new Error("Give me a string!");this.get("createTime")||this.set("createTime",(new Date).toString())},setResult:function(e){this.set("result",e)},finishWith:function(e){this.set("status","finished"),e.resolve()},addWarning:function(e){this.get("warnings").push(e),this.set("numWarnings",this.get("numWarnings")?this.get("numWarnings")+1:1)},getFormattedWarnings:function(){if(!this.get("warnings").length)return"";var e='';return""+e+this.get("warnings").join("
"+e)+"
"},parseOrCatch:function(){this.expandShortcuts(this.get("rawStr"));try{this.processInstants()}catch(e){f.filterError(e),this.set("error",e);return}if(this.parseAll())return;this.set("error",new p({msg:'The command "'+this.get("rawStr")+"\" isn't supported, sorry!"}))},errorChanged:function(){var e=this.get("error");e instanceof p||e instanceof d?this.set("status","error"):e instanceof m?this.set("status","finished"):e instanceof v&&this.set("status","warning"),this.formatError()},formatError:function(){this.set("result",this.get("error").toResult())},expandShortcuts:function(e){e=this.get("parseWaterfall").expandAllShortcuts(e),this.set("rawStr",e)},processInstants:function(){var e=this.get("rawStr");if(!e.length)throw new m({msg:""});this.get("parseWaterfall").processAllInstants(e)},parseAll:function(){var e=this.get("rawStr"),t=this.get("parseWaterfall").parseAll(e);return t?(u.each(t.toSet,function(e,t){this.set(t,e)},this),!0):!1}}),y=a.Model.extend({defaults:{text:""}});n.CommandEntry=y,n.Command=g}),e.define("/src/js/git/commands.js",function(e,t,n,r,i,s,o){function g(e,t){this.method=e,this.rawOptions=t,this.supportedMap=this.getMasterOptionMap()[e];if(this.supportedMap===undefined)throw new Error("No option map for "+e);this.generalArgs=[],this.explodeAndSet()}var u=e("underscore"),a=e("../util/errors"),f=a.CommandProcessError,l=a.GitError,c=a.Warning,h=a.CommandResult,p={"git commit":/^(gc|git ci)($|\s)/,"git add":/^ga($|\s)/,"git checkout":/^(go|git co)($|\s)/,"git rebase":/^gr($|\s)/,"git branch":/^(gb|git br)($|\s)/,"git status":/^(gst|gs|git st)($|\s)/,"git help":/^git$/},d=[[/^git help($|\s)/,function(){var e=["Git Version PCOTTLE.1.0","
","Usage:",u.escape(" git []"),"
","Supported commands:","
"],t=g.prototype.getMasterOptionMap();u.each(t,function(t,n){e.push("git "+n),u.each(t,function(t,n){e.push(" "+n)},this)},this);var n=e.join("\n");throw n=n.replace(/\t/g," "),new h({msg:n})}]],v={"git commit":/^git commit($|\s)/,"git add":/^git add($|\s)/,"git checkout":/^git checkout($|\s)/,"git rebase":/^git rebase($|\s)/,"git reset":/^git reset($|\s)/,"git branch":/^git branch($|\s)/,"git revert":/^git revert($|\s)/,"git log":/^git log($|\s)/,"git merge":/^git merge($|\s)/,"git show":/^git show($|\s)/,"git status":/^git status($|\s)/,"git cherry-pick":/^git cherry-pick($|\s)/},m=function(e){var t,n;u.each(v,function(r,i){r.exec(e)&&(n=e.slice(i.length+1),t=i.slice("git ".length))});if(!t)return!1;var r=new g(t,n);return{toSet:{generalArgs:r.generalArgs,supportedMap:r.supportedMap,method:t,options:n,eventName:"processGitCommand"}}};g.prototype.getMasterOptionMap=function(){return{commit:{"--amend":!1,"-a":!1,"-am":!1,"-m":!1},status:{},log:{},add:{},"cherry-pick":{},branch:{"-d":!1,"-D":!1,"-f":!1,"--contains":!1},checkout:{"-b":!1,"-B":!1,"-":!1},reset:{"--hard":!1,"--soft":!1},merge:{},rebase:{"-i":!1},revert:{},show:{}}},g.prototype.explodeAndSet=function(){var e=this.rawOptions.match(/('.*?'|".*?"|\S+)/g)||[];for(var t=0;t p.uiButton":"positive"},initialize:function(t){t=t||{},this.options=t,this.JSON=u.extend({beforeMarkdowns:["## Git Commits","","Awesome!"],command:"git commit",afterMarkdowns:["Now you have seen it in action","","Go ahead and try the level!"]},t);var n=function(t){return e("markdown").markdown.toHTML(t.join("\n"))};this.JSON.beforeHTML=n(this.JSON.beforeMarkdowns),this.JSON.afterHTML=n(this.JSON.afterMarkdowns),this.container=new p({title:t.title||"Git Demonstration"}),this.render(),this.checkScroll(),this.navEvents=u.clone(f.Events),this.navEvents.on("positive",this.positive,this),this.navEvents.on("negative",this.negative,this),this.keyboardListener=new c({events:this.navEvents,aliasMap:{enter:"positive",right:"positive",left:"negative"},wait:!0}),this.visFinished=!1,this.initVis(),t.wait||this.show()},receiveMetaNav:function(e,t){var n=this;e.navEvents.on("positive",this.positive,this),this.metaContainerView=t},checkScroll:function(){var e=this.$("div.demonstrationText").children(),t=u.map(e,function(e){return e.clientHeight}),n=u.reduce(t,function(e,t){return e+t});n15&&console.warn("graphics are degrading from too many layers");var t=this.getDepthIncrement(e);u.each(this.visNodeMap,function(e){e.setDepthBasedOn(t)},this)},w.prototype.animateNodePositions=function(e){u.each(this.visNodeMap,function(t){t.animateUpdatedPosition(e)},this)},w.prototype.addBranchFromEvent=function(e,t,n){var r=u.bind(function(){this.addBranch(e)},this);!this.gitEngine||!this.gitReady?this.defer(r):r()},w.prototype.addBranch=function(e){var t=new m({branch:e,gitVisuals:this,gitEngine:this.gitEngine});this.visBranchCollection.add(t),this.gitReady?t.genGraphics(this.paper):this.defer(u.bind(function(){t.genGraphics(this.paper)},this))},w.prototype.removeVisBranch=function(e){this.visBranchCollection.remove(e)},w.prototype.removeVisNode=function(e){this.visNodeMap[e.getID()]=undefined},w.prototype.removeVisEdge=function(e){this.visEdgeCollection.remove(e)},w.prototype.animateRefs=function(e){this.visBranchCollection.each(function(t){t.animateUpdatedPos(e)},this)},w.prototype.animateEdges=function(e){this.visEdgeCollection.each(function(t){t.animateUpdatedPath(e)},this)},w.prototype.getMinLayers=function(){return this.options.smallCanvas?4:7},w.prototype.getDepthIncrement=function(e){e=Math.max(e,this.getMinLayers());var t=1/e;return t},w.prototype.calcDepthRecursive=function(e,t){e.get("visNode").setDepth(t);var n=e.get("children"),r=t;return u.each(n,function(e){var n=this.calcDepthRecursive(e,t+1);r=Math.max(n,r)},this),r},w.prototype.canvasResize=function(e,t){this.resizeFunc||this.genResizeFunc(),this.resizeFunc(e,t)},w.prototype.genResizeFunc=function(){this.resizeFunc=u.debounce(u.bind(function(t,n){if(c.isAnimating){var r=e("../app");r.getEventBaton().trigger("commandSubmitted","refresh")}else this.refreshTree()},this),200,!0)},w.prototype.addNode=function(e,t){this.commitMap[e]=t,t.get("rootCommit")&&(this.rootCommit=t);var n=new v({id:e,commit:t,gitVisuals:this,gitEngine:this.gitEngine});return this.visNodeMap[e]=n,this.gitReady&&n.genGraphics(this.paper),n},w.prototype.addEdge=function(e,t){var n=this.visNodeMap[e],r=this.visNodeMap[t];if(!n||!r)throw new Error("one of the ids in ("+e+", "+t+") does not exist");var i=new y({tail:n,head:r,gitVisuals:this,gitEngine:this.gitEngine});this.visEdgeCollection.add(i),this.gitReady&&i.genGraphics(this.paper)},w.prototype.zIndexReflow=function(){this.visNodesFront(),this.visBranchesFront()},w.prototype.visNodesFront=function(){u.each(this.visNodeMap,function(e){e.toFront()})},w.prototype.visBranchesFront=function(){this.visBranchCollection.each(function(e){e.nonTextToFront(),e.textToFront()}),this.visBranchCollection.each(function(e){e.textToFrontIfInStack()})},w.prototype.drawTreeFromReload=function(){this.gitReady=!0,this.deferFlush(),this.calcTreeCoords()},w.prototype.drawTreeFirstTime=function(){this.gitReady=!0,this.calcTreeCoords(),u.each(this.visNodeMap,function(e){e.genGraphics(this.paper)},this),this.visEdgeCollection.each(function(e){e.genGraphics(this.paper)},this),this.visBranchCollection.each(function(e){e.genGraphics(this.paper)},this),this.zIndexReflow()},n.GitVisuals=w}),e.define("/src/js/visuals/visNode.js",function(e,t,n,r,i,s,o){var u=e("underscore"),a=e("backbone"),f=e("../util/constants").GRAPHICS,l=e("../visuals/visBase").VisBase,c=l.extend({defaults:{depth:undefined,maxWidth:null,outgoingEdges:null,circle:null,text:null,id:null,pos:null,radius:null,commit:null,animationSpeed:f.defaultAnimationTime,animationEasing:f.defaultEasing,fill:f.defaultNodeFill,"stroke-width":f.defaultNodeStrokeWidth,stroke:f.defaultNodeStroke},getID:function(){return this.get("id")},validateAtInit:function(){if(!this.get("id"))throw new Error("need id for mapping");if(!this.get("commit"))throw new Error("need commit for linking");this.get("pos")||this.set("pos",{x:Math.random(),y:Math.random()})},initialize:function(){this.validateAtInit(),this.gitVisuals=this.get("gitVisuals"),this.gitEngine=this.get("gitEngine"),this.set("outgoingEdges",[])},setDepth:function(e){this.set("depth",Math.max(this.get("depth")||0,e))},setDepthBasedOn:function(e){if(this.get("depth")===undefined){debugger;throw new Error("no depth yet!")}var t=this.get("pos");t.y=this.get("depth")*e},getMaxWidthScaled:function(){var e=this.gitVisuals.getCommitUpstreamStatus(this.get("commit")),t={branch:1,head:.3,none:.1};if(t[e]===undefined)throw new Error("bad stat");return t[e]*this.get("maxWidth")},toFront:function(){this.get("circle").toFront(),this.get("text").toFront()},getOpacity:function(){var e={branch:1,head:f.upstreamHeadOpacity,none:f.upstreamNoneOpacity},t=this.gitVisuals.getCommitUpstreamStatus(this.get("commit"));if(e[t]===undefined)throw new Error("invalid status");return e[t]},getTextScreenCoords:function(){return this.getScreenCoords()},getAttributes:function(){var e=this.getScreenCoords(),t=this.getTextScreenCoords(),n=this.getOpacity();return{circle:{cx:e.x,cy:e.y,opacity:n,r:this.getRadius(),fill:this.getFill(),"stroke-width":this.get("stroke-width"),stroke:this.get("stroke")},text:{x:t.x,y:t.y,opacity:n}}},highlightTo:function(e,t,n){var r=e.get("fill"),i={circle:{fill:r,stroke:r,"stroke-width":this.get("stroke-width")*5},text:{}};this.animateToAttr(i,t,n)},animateUpdatedPosition:function(e,t){var n=this.getAttributes();this.animateToAttr(n,e,t)},animateFromAttrToAttr:function(e,t,n,r){this.animateToAttr(e,0),this.animateToAttr(t,n,r)},animateToSnapshot:function(e,t,n){if(!e[this.getID()])return;this.animateToAttr(e[this.getID()],t,n)},animateToAttr:function(e,t,n){if(t===0){this.get("circle").attr(e.circle),this.get("text").attr(e.text);return}var r=t!==undefined?t:this.get("animationSpeed"),i=n||this.get("animationEasing");this.get("circle").stop().animate(e.circle,r,i),this.get("text").stop().animate(e.text,r,i),n=="bounce"&&e.circle&&e.circle.cx!==undefined&&e.text&&e.text.x!==undefined&&(this.get("circle").animate(e.circle.cx,r,"easeInOut"),this.get("text").animate(e.text.x,r,"easeInOut"))},getScreenCoords:function(){var e=this.get("pos");return this.gitVisuals.toScreenCoords(e)},getRadius:function(){return this.get("radius")||f.nodeRadius},getParentScreenCoords:function(){return this.get("commit").get("parents")[0].get("visNode").getScreenCoords()},setBirthPosition:function(){var e=this.getParentScreenCoords();this.get("circle").attr({cx:e.x,cy:e.y,opacity:0,r:0}),this.get("text").attr({x:e.x,y:e.y,opacity:0})},setBirthFromSnapshot:function(e){var t=this.get("commit").get("parents")[0].get("visNode").getID(),n=e[t];this.get("circle").attr({opacity:0,r:0,cx:n.circle.cx,cy:n.circle.cy}),this.get("text").attr({opacity:0,x:n.text.x,y:n.text.y});var r={x:n.circle.cx,y:n.circle.cy};this.setOutgoingEdgesBirthPosition(r)},setBirth:function(){this.setBirthPosition(),this.setOutgoingEdgesBirthPosition(this.getParentScreenCoords())},setOutgoingEdgesOpacity:function(e){u.each(this.get("outgoingEdges"),function(t){t.setOpacity(e)})},animateOutgoingEdgesToAttr:function(e,t,n){u.each(this.get("outgoingEdges"),function(t){var n=e[t.getID()];t.animateToAttr(n)},this)},animateOutgoingEdges:function(e,t){u.each(this.get("outgoingEdges"),function(n){n.animateUpdatedPath(e,t)},this)},animateOutgoingEdgesFromSnapshot:function(e,t,n){u.each(this.get("outgoingEdges"),function(r){var i=e[r.getID()];r.animateToAttr(i,t,n)},this)},setOutgoingEdgesBirthPosition:function(e){u.each(this.get("outgoingEdges"),function(t){var n=t.get("head").getScreenCoords(),r=t.genSmoothBezierPathStringFromCoords(e,n);t.get("path").stop().attr({path:r,opacity:0})},this)},parentInFront:function(){this.get("commit").get("parents")[0].get("visNode").toFront()},getFontSize:function(e){return e.length<3?12:e.length<5?10:8},getFill:function(){var e=this.gitVisuals.getCommitUpstreamStatus(this.get("commit"));return e=="head"?f.headRectFill:e=="none"?f.orphanNodeFill:this.gitVisuals.getBlendedHuesForCommit(this.get("commit"))},attachClickHandlers:function(){if(this.get("gitVisuals").options.noClick)return;var t="git checkout "+this.get("commit").get("id"),n=e("../app");u.each([this.get("circle"),this.get("text")],function(e){e.click(function(){n.getEventBaton().trigger("commandSubmitted",t)}),$(e.node).css("cursor","pointer")})},setOpacity:function(e){e=e===undefined?1:e;var t=["circle","text"];u.each(t,function(t){this.get(t).attr({opacity:e})},this)},remove:function(){this.removeKeys(["circle"],["text"]);var e=this.get("text");e&&e.remove(),this.gitVisuals.removeVisNode(this)},removeAll:function(){this.remove(),u.each(this.get("outgoingEdges"),function(e){e.remove()},this)},getExplodeStepFunc:function(){var e=this.get("circle"),t=20,n=Math.PI+Math.random()*1*Math.PI,r=.2,i=.01,s=t*Math.cos(n),o=t*Math.sin(n),u=e.attr("cx"),a=e.attr("cy"),f=this.gitVisuals.paper.width,l=this.gitVisuals.paper.height,c=.8,h=1,p=function(){o+=r*h-i*o,s-=i*s,u+=s*h,a+=o*h;if(u<0||u>f)s=c*-s,u=u<0?0:f;if(a<0||a>l)o=c*-o,a=a<0?0:l;return e.attr({cx:u,cy:a}),s*s+o*o<.01&&Math.abs(a-l)===0?!1:!0};return p},genGraphics:function(){var e=this.gitVisuals.paper,t=this.getScreenCoords(),n=this.getTextScreenCoords(),r=e.circle(t.x,t.y,this.getRadius()).attr(this.getAttributes().circle),i=e.text(n.x,n.y,String(this.get("id")));i.attr({"font-size":this.getFontSize(this.get("id")),"font-weight":"bold","font-family":"Monaco, Courier, font-monospace",opacity:this.getOpacity()}),this.set("circle",r),this.set("text",i),this.attachClickHandlers()}});n.VisNode=c}),e.define("/src/js/visuals/visBase.js",function(e,t,n,r,i,s,o){var u=e("underscore"),a=e("backbone"),f=a.Model.extend({removeKeys:function(e){u.each(e,function(e){this.get(e)&&this.get(e).remove()},this)},animateAttrKeys:function(e,t,n,r){e=u.extend({},{include:["circle","arrow","rect","path","text"],exclude:[]},e||{});var i=this.getAttributes();u.each(e.include,function(e){i[e]=u.extend({},i[e],t)}),u.each(e.exclude,function(e){delete i[e]}),this.animateToAttr(i,n,r)}});n.VisBase=f}),e.define("/src/js/visuals/visBranch.js",function(e,t,n,r,i,s,o){var u=e("underscore"),a=e("backbone"),f=e("../util/constants").GRAPHICS,l=e("../visuals/visBase").VisBase,c=function(){var e=Math.random(),t="hsb("+String(e)+",0.7,1)";return t},h=l.extend({defaults:{pos:null,text:null,rect:null,arrow:null,isHead:!1,flip:1,fill:f.rectFill,stroke:f.rectStroke,"stroke-width":f.rectStrokeWidth,offsetX:f.nodeRadius*4.75,offsetY:0,arrowHeight:14,arrowInnerSkew:0,arrowEdgeHeight:6,arrowLength:14,arrowOffsetFromCircleX:10,vPad:5,hPad:5,animationSpeed:f.defaultAnimationTime,animationEasing:f.defaultEasing},validateAtInit:function(){if(!this.get("branch"))throw new Error("need a branch!")},getID:function(){return this.get("branch").get("id")},initialize:function(){this.validateAtInit(),this.gitVisuals=this.get("gitVisuals"),this.gitEngine=this.get("gitEngine");if(!this.gitEngine)throw new Error("asd wtf");this.get("branch").set("visBranch",this);var e=this.get("branch").get("id");e=="HEAD"?(this.set("isHead",!0),this.set("flip",-1),this.set("fill",f.headRectFill)):e!=="master"&&this.set("fill",c())},getCommitPosition:function(){var e=this.gitEngine.getCommitFromRef(this.get("branch")),t=e.get("visNode"),n=this.get("gitVisuals").posBoundaries.max;return t.get("pos").x>n?this.set("flip",-1):this.set("flip",1),t.getScreenCoords()},getBranchStackIndex:function(){if(this.get("isHead"))return 0;var e=this.getBranchStackArray(),t=-1;return u.each(e,function(e,n){e.obj==this.get("branch")&&(t=n)},this),t},getBranchStackLength:function(){return this.get("isHead")?1:this.getBranchStackArray().length},getBranchStackArray:function(){var e=this.gitVisuals.branchStackMap[this.get("branch").get("target").get("id")];return e===undefined?(this.gitVisuals.calcBranchStacks(),this.getBranchStackArray()):e},getTextPosition:function(){var e=this.getCommitPosition(),t=this.getBranchStackIndex();return{x:e.x+this.get("flip")*this.get("offsetX"),y:e.y+t*f.multiBranchY+this.get("offsetY")}},getRectPosition:function(){var e=this.getTextPosition(),t=this.get("flip"),n=this.getTextSize();return{x:e.x-.5*n.w-this.get("hPad"),y:e.y-.5*n.h-this.get("vPad")}},getArrowPath:function(){var e=function(e,t,n){return{x:e.x+t,y:e.y+n}},t=function(e){return String(Math.round(e.x))+","+String(Math.round(e.y))},n=this.get("flip"),r=e(this.getCommitPosition(),n*this.get("arrowOffsetFromCircleX"),0),i=e(r,n*this.get("arrowLength"),-this.get("arrowHeight")),s=e(r,n*this.get("arrowLength"),this.get("arrowHeight")),o=e(i,n*this.get("arrowInnerSkew"),this.get("arrowEdgeHeight")),a=e(s,n*this.get("arrowInnerSkew"),-this.get("arrowEdgeHeight")),f=49,l=e(o,n*f,0),c=e(a,n*f,0),h="";h+="M"+t(l)+" ";var p=[o,i,r,s,a,c];return u.each(p,function(e){h+="L"+t(e)+" "},this),h+="z",h},getTextSize:function(){var e=function(e){var t=e.get("text")?e.get("text").node:null;return t===null?0:t.clientWidth},t=function(e){return e.w||(e.w=75),e.h||(e.h=20),e},n=this.get("text").node;if(this.get("isHead"))return t({w:n.clientWidth,h:n.clientHeight});var r=0;return u.each(this.getBranchStackArray(),function(t){r=Math.max(r,e(t.obj.get("visBranch")))}),t({w:r,h:n.clientHeight})},getSingleRectSize:function(){var e=this.getTextSize(),t=this.get("vPad"),n=this.get("hPad");return{w:e.w+t*2,h:e.h+n*2}},getRectSize:function(){var e=this.getTextSize(),t=this.get("vPad"),n=this.get("hPad"),r=this.getBranchStackLength();return{w:e.w+t*2,h:e.h*r*1.1+n*2}},getName:function(){var e=this.get("branch").get("id"),t=this.gitEngine.HEAD.get("target").get("id"),n=t==e?"*":"";return e+n},nonTextToFront:function(){this.get("arrow").toFront(),this.get("rect").toFront()},textToFront:function(){this.get("text").toFront()},textToFrontIfInStack:function(){this.getBranchStackIndex()!==0&&this.get("text").toFront()},getFill:function(){return this.get("isHead")||this.getBranchStackLength()==1||this.getBranchStackIndex()!==0?this.get("fill"):this.gitVisuals.blendHuesFromBranchStack(this.getBranchStackArray())},remove:function(){this.removeKeys(["text","arrow","rect"]),this.gitVisuals.removeVisBranch(this)},genGraphics:function(e){var t=this.getTextPosition(),n=this.getName(),r;r=e.text(t.x,t.y,String(n)),r.attr({"font-size":14,"font-family":"Monaco, Courier, font-monospace",opacity:this.getTextOpacity()}),this.set("text",r);var i=this.getRectPosition(),s=this.getRectSize(),o=e.rect(i.x,i.y,s.w,s.h,8).attr(this.getAttributes().rect);this.set("rect",o);var u=this.getArrowPath(),a=e.path(u).attr(this.getAttributes().arrow);this.set("arrow",a),this.attachClickHandlers(),o.toFront(),r.toFront()},attachClickHandlers:function(){if(this.get("gitVisuals").options.noClick)return;var t="git checkout "+this.get("branch").get("id"),n=e("../app"),r=[this.get("rect"),this.get("text"),this.get("arrow")];u.each(r,function(e){e.click(function(){n.getEventBaton().trigger("commandSubmitted",t)}),$(e.node).css("cursor","pointer")})},updateName:function(){this.get("text").attr({text:this.getName()})},getNonTextOpacity:function(){return this.get("isHead")?this.gitEngine.getDetachedHead()?1:0:this.getBranchStackIndex()===0?1:0},getTextOpacity:function(){return this.get("isHead")?this.gitEngine.getDetachedHead()?1:0:1},getAttributes:function(){var e=this.getNonTextOpacity(),t=this.getTextOpacity();this.updateName();var n=this.getTextPosition(),r=this.getRectPosition(),i=this.getRectSize(),s=this.getArrowPath();return{text:{x:n.x,y:n.y,opacity:t},rect:{x:r.x,y:r.y,width:i.w,height:i.h,opacity:e,fill:this.getFill(),stroke:this.get("stroke"),"stroke-width":this.get("stroke-width")},arrow:{path:s,opacity:e,fill:this.getFill(),stroke:this.get("stroke"),"stroke-width":this.get("stroke-width")}}},animateUpdatedPos:function(e,t){var n=this.getAttributes();this.animateToAttr(n,e,t)},animateFromAttrToAttr:function(e,t,n,r){this.animateToAttr(e,0),this.animateToAttr(t,n,r)},animateToAttr:function(e,t,n){if(t===0){this.get("text").attr(e.text),this.get("rect").attr(e.rect),this.get("arrow").attr(e.arrow);return}var r=t!==undefined?t:this.get("animationSpeed"),i=n||this.get("animationEasing");this.get("text").stop().animate(e.text,r,i),this.get("rect").stop().animate(e.rect,r,i),this.get("arrow").stop().animate(e.arrow,r,i)}}),p=a.Collection.extend({model:h});n.VisBranchCollection=p,n.VisBranch=h,n.randomHueString=c}),e.define("/src/js/visuals/visEdge.js",function(e,t,n,r,i,s,o){var u=e("underscore"),a=e("backbone"),f=e("../util/constants").GRAPHICS,l=e("../visuals/visBase").VisBase,c=l.extend({defaults:{tail:null,head:null,animationSpeed:f.defaultAnimationTime,animationEasing:f.defaultEasing},validateAtInit:function(){var e=["tail","head"];u.each(e,function(e){if(!this.get(e))throw new Error(e+" is required!")},this)},getID:function(){return this.get("tail").get("id")+"."+this.get("head").get("id")},initialize:function(){this.validateAtInit(),this.gitVisuals=this.get("gitVisuals"),this.gitEngine=this.get("gitEngine"),this.get("tail").get("outgoingEdges").push(this)},remove:function(){this.removeKeys(["path"]),this.gitVisuals.removeVisEdge(this)},genSmoothBezierPathString:function(e,t){var n=e.getScreenCoords(),r=t.getScreenCoords();return this.genSmoothBezierPathStringFromCoords(n,r)},genSmoothBezierPathStringFromCoords:function(e,t){var n=function(e){return String(Math.round(e.x))+","+String(Math.round(e.y))},r=function(e,t,n){return n=n||f.curveControlPointOffset,{x:e.x,y:e.y+n*t}},i=function(e,t,n){return{x:e.x+t,y:e.y+n}};e=r(e,-1,this.get("tail").getRadius()),t=r(t,1,this.get("head").getRadius());var s="";s+="M"+n(e)+" ",s+="C",s+=n(r(e,-1))+" ",s+=n(r(t,1))+" ",s+=n(t);var o=f.arrowHeadSize||10;return s+=" L"+n(i(t,-o,o)),s+=" L"+n(i(t,o,o)),s+=" L"+n(t),s+="C",s+=n(r(t,1))+" ",s+=n(r(e,-1))+" ",s+=n(e),s},getBezierCurve:function(){return this.genSmoothBezierPathString(this.get("tail"),this.get("head"))},getStrokeColor:function(){return f.visBranchStrokeColorNone},setOpacity:function(e){e=e===undefined?1:e,this.get("path").attr({opacity:e})},genGraphics:function(e){var t=this.getBezierCurve(),n=e.path(t).attr({"stroke-width":f.visBranchStrokeWidth,stroke:this.getStrokeColor(),"stroke-linecap":"round","stroke-linejoin":"round",fill:this.getStrokeColor()});n.toBack(),this.set("path",n)},getOpacity:function(){var e=this.gitVisuals.getCommitUpstreamStatus(this.get("tail")),t={branch:1,head:f.edgeUpstreamHeadOpacity,none:f.edgeUpstreamNoneOpacity};if(t[e]===undefined)throw new Error("bad stat");return t[e]},getAttributes:function(){var e=this.getBezierCurve(),t=this.getOpacity();return{path:{path:e,opacity:t}}},animateUpdatedPath:function(e,t){var n=this.getAttributes();this.animateToAttr(n,e,t)},animateFromAttrToAttr:function(e,t,n,r){this.animateToAttr(e,0),this.animateToAttr(t,n,r)},animateToAttr:function(e,t,n){if(t===0){this.get("path").attr(e.path);return}this.get("path").toBack(),this.get("path").stop().animate(e.path,t!==undefined?t:this.get("animationSpeed"),n||this.get("animationEasing"))}}),h=a.Collection.extend({model:c});n.VisEdgeCollection=h,n.VisEdge=c}),e.define("/src/js/level/disabledMap.js",function(e,t,n,r,i,s,o){function c(e){e=e||{},this.disabledMap=e.disabledMap||{"git cherry-pick":!0,"git rebase":!0}}var u=e("underscore"),a=e("../git/commands"),f=e("../util/errors"),l=f.GitError;c.prototype.getInstantCommands=function(){var e=[],t=function(){throw new l({msg:"That git command is disabled for this level!"})};return u.each(this.disabledMap,function(n,r){var i=a.regexMap[r];if(!i)throw new Error("wuttttt this disbaled command"+r+" has no regex matching");e.push([i,t])}),e},n.DisabledMap=c}),e.define("/src/js/level/arbiter.js",function(e,t,n,r,i,s,o){function h(){this.levelMap={},this.levelSequences=f,this.sequences=[],this.init();var e;try{e=JSON.parse(localStorage.getItem("solvedMap")||"{}")}catch(t){console.warn("local storage failed",t)}this.solvedMap=e||{},c.getEvents().on("levelSolved",this.levelSolved,this)}var u=e("underscore"),a=e("backbone"),f=e("../levels").levelSequences,l=e("../levels").sequenceInfo,c=e("../app");h.prototype.init=function(){var e;u.each(this.levelSequences,function(e,t){this.sequences.push(t);if(!e||!e.length)throw new Error("no empty sequences allowed");u.each(e,function(e,n){this.validateLevel(e);var r=t+String(n+1),i=u.extend({},e,{index:n,id:r,sequenceName:t});this.levelMap[r]=i,this.levelSequences[t][n]=i},this)},this)},h.prototype.isLevelSolved=function(e){if(!this.levelMap[e])throw new Error("that level doesnt exist!");return Boolean(this.solvedMap[e])},h.prototype.levelSolved=function(e){if(!e)return;this.solvedMap[e]=!0,this.syncToStorage()},h.prototype.resetSolvedMap=function(){this.solvedMap={},this.syncToStorage(),c.getEvents().trigger("levelSolved")},h.prototype.syncToStorage=function(){try{localStorage.setItem("solvedMap",JSON.stringify(this.solvedMap))}catch(e){console.warn("local storage fialed on set",e)}},h.prototype.validateLevel=function(e){e=e||{};var t=["name","goalTreeString","solutionCommand"],n=["hint","disabledMap","startTree"];u.each(t,function(t){if(e[t]===undefined)throw console.log(e),new Error("I need this field for a level: "+t)})},h.prototype.getSequenceToLevels=function(){return this.levelSequences},h.prototype.getSequences=function(){return u.keys(this.levelSequences)},h.prototype.getLevelsInSequence=function(e){if(!this.levelSequences[e])throw new Error("that sequecne name "+e+"does not exist");return this.levelSequences[e]},h.prototype.getSequenceInfo=function(e){return l[e]},h.prototype.getLevel=function(e){return this.levelMap[e]},h.prototype.getNextLevel=function(e){if(!this.levelMap[e])return console.warn("that level doesnt exist!!!"),null;var t=this.levelMap[e],n=t.sequenceName,r=this.levelSequences[n],i=t.index+1;if(i=t.length?0:e,e=e<0?t.length-1:e,e},boundIndex:function(e,t){return e=e>=t.length?t.length-1:e,e=e<0?0:e,e},getNextSequence:function(){var e=this.getSequenceIndex(this.selectedSequence),t=this.wrapIndex(e+1,this.sequences);return this.sequences[t]},getPreviousSequence:function(){var e=this.getSequenceIndex(this.selectedSequence),t=this.wrapIndex(e-1,this.sequences);return this.sequences[t]},getSequenceIndex:function(e){var t=this.sequences.indexOf(e);if(t<0)throw new Error("didnt find");return t},getIndexForID:function(e){return h.getLevelArbiter().getLevel(e).index},selectFirst:function(){var e=this.sequenceToLevels[this.sequences[0]][0].id;this.selectIconByID(e),this.selectedIndex=0,this.selectedSequence=this.sequences[0]},getCurrentSequence:function(){return this.sequenceToLevels[this.selectedSequence]},getSelectedID:function(){return this.sequenceToLevels[this.selectedSequence][this.selectedIndex].id},selectIconByID:function(e){this.toggleIconSelect(e,!0)},deselectIconByID:function(e){this.toggleIconSelect(e,!1)},toggleIconSelect:function(e,t){this.selectedID=e;var n="#levelIcon-"+e;$(n).toggleClass("selected",t)},negative:function(){this.hide()},testOption:function(e){return this.currentCommand&&(new RegExp("--"+e)).test(this.currentCommand.get("rawStr"))},show:function(e,t){this.currentCommand=t,this.updateSolvedStatus(),this.showDeferred=e,this.keyboardListener.listen(),m.__super__.show.apply(this)},hide:function(){this.showDeferred&&this.showDeferred.resolve(),this.showDeferred=undefined,this.keyboardListener.mute(),this.turnOffKeyboardSelection(),m.__super__.hide.apply(this)},loadLevelID:function(e){this.testOption("noOutput")||h.getEventBaton().trigger("commandSubmitted","level "+e),this.hide()},updateSolvedStatus:function(){u.each(this.seriesViews,function(e){e.updateSolvedStatus()},this)},buildSequences:function(){this.seriesViews=[],u.each(this.sequences,function(e){this.seriesViews.push(new g({destination:this.$el,name:e,navEvents:this.navEvents}))},this)}}),g=v.extend({tagName:"div",className:"seriesView box flex1 vertical",template:u.template($("#series-view").html()),events:{"click div.levelIcon":"click"},initialize:function(e){this.name=e.name||"intro",this.navEvents=e.navEvents,this.info=h.getLevelArbiter().getSequenceInfo(this.name),this.levels=h.getLevelArbiter().getLevelsInSequence(this.name),this.levelIDs=[],u.each(this.levels,function(e){this.levelIDs.push(e.id)},this),this.destination=e.destination,this.JSON={displayName:this.info.displayName,about:this.info.about,ids:this.levelIDs},this.render(),this.updateSolvedStatus()},updateSolvedStatus:function(){var e=this.$("div.levelIcon").each(function(e,t){var n=$(t).attr("data-id");$(t).toggleClass("solved",h.getLevelArbiter().isLevelSolved(n))})},click:function(e){var t=e.srcElement||e.currentTarget;if(!t){console.warn("wut, no id");return}var n=$(t).attr("data-id");this.navEvents.trigger("clickedID",n)}});n.LevelDropdownView=m}),e.define("/src/js/views/commandViews.js",function(e,t,n,r,i,s,o){var u=e("underscore"),a=e("../util").isBrowser()?a=window.Backbone:a=e("backbone"),f=e("../models/collections").CommandEntryCollection,l=e("../app"),c=e("../models/commandModel").Command,h=e("../models/commandModel").CommandEntry,p=e("../util/errors"),d=p.Warning,v=e("../util"),m=e("../util/keyboard"),g=a.View.extend({initialize:function(e){l.getEvents().on("commandSubmittedPassive",this.addToCommandHistory,this),this.commands=new f,this.commands.fetch({success:u.bind(function(){var e=[];this.commands.each(function(t){e.push(t)}),e.reverse(),this.commands.reset(),u.each(e,function(e){this.commands.add(e)},this)},this)}),this.index=-1,this.commandParagraph=this.$("#prompt p.command")[0],this.commandCursor=this.$("#prompt span.cursor")[0],this.focus(),l.getEvents().on("rollupCommands",this.rollupCommands,this),l.getEventBaton().stealBaton("keydown",this.onKeyDown,this),l.getEventBaton().stealBaton("keyup",this.onKeyUp,this)},events:{"blur #commandTextField":"hideCursor","focus #commandTextField":"showCursor"},blur:function(){this.hideCursor()},focus:function(){this.$("#commandTextField").focus(),this.showCursor()},hideCursor:function(){this.toggleCursor(!1)},showCursor:function(){this.toggleCursor(!0)},toggleCursor:function(e){$(this.commandCursor).toggleClass("shown",e)},onKeyDown:function(e){var t=e.srcElement;this.updatePrompt(t)},onKeyUp:function(e){this.onKeyDown(e);var t={enter:u.bind(function(){this.submit()},this),up:u.bind(function(){this.commandSelectChange(1)},this),down:u.bind(function(){this.commandSelectChange(-1)},this)},n=m.mapKeycodeToKey(e.which||e.keyCode);t[n]!==undefined&&(e.preventDefault(),t[n](),this.onKeyDown(e))},badHtmlEncode:function(e){return e.replace(/&/g,"&").replace(/=this.commands.length||this.index<0){this.clear(),this.index=-1;return}var t=this.commands.toArray()[this.index].get("text");this.setTextField(t)},clearLocalStorage:function(){this.commands.each(function(e){a.sync("delete",e,function(){})},this)},setTextField:function(e){this.$("#commandTextField").val(e)},clear:function(){this.setTextField("")},submit:function(){var e=this.$("#commandTextField").val().replace("\n","");this.clear(),this.submitCommand(e),this.index=-1},rollupCommands:function(e){var t=this.commands.toArray().slice(1,Number(e)+1);t.reverse();var n="";u.each(t,function(e){n+=e.get("text")+";"},this);var r=new h({text:n});this.commands.unshift(r),a.sync("create",r,function(){})},addToCommandHistory:function(e){var t=e.length&&this.index===-1||e.length&&this.index!==-1&&this.commands.toArray()[this.index].get("text")!==e;if(!t)return;var n=new h({text:e});this.commands.unshift(n),a.sync("create",n,function(){}),this.commands.length>100&&this.clearLocalStorage()},submitCommand:function(e){l.getEventBaton().trigger("commandSubmitted",e)}}),y=a.View.extend({tagName:"div",model:c,template:u.template($("#command-template").html()),events:{click:"clicked"},clicked:function(e){},initialize:function(){this.model.bind("change",this.wasChanged,this),this.model.bind("destroy",this.remove,this)},wasChanged:function(e,t){var n=t.changes,r=u.keys(n);u.difference(r,["status"]).length===0?this.updateStatus():this.render()},updateStatus:function(){var e=["inqueue","processing","finished"],t={};u.each(e,function(e){t[e]=!1}),t[this.model.get("status")]=!0;var n=this.$("p.commandLine");u.each(t,function(e,t){n.toggleClass(t,e)})},render:function(){var e=u.extend({resultType:"",result:"",formattedWarnings:this.model.getFormattedWarnings()},this.model.toJSON());return this.$el.html(this.template(e)),this},remove:function(){$(this.el).hide()}}),b=a.View.extend({initialize:function(e){this.collection=e.collection,this.collection.on("add",this.addOne,this),this.collection.on("reset",this.addAll,this),this.collection.on("all",this.render,this),this.collection.on("change",this.scrollDown,this),l.getEvents().on("commandScrollDown",this.scrollDown,this),l.getEvents().on("clearOldCommands",this.clearOldCommands,this)},addWarning:function(e){var t=new d({msg:e}),n=new c({error:t,rawStr:"Warning:"});this.collection.add(n)},clearOldCommands:function(){var e=[];this.collection.each(function(t){t.get("status")!=="inqueue"&&t.get("status")!=="processing"&&e.push(t)},this),u.each(e,function(e){e.destroy()},this),this.scrollDown()},scrollDown:function(){var e=$("#commandDisplay")[0],t=$("#terminal")[0],n=e.clientHeight>t.clientHeight;$(t).toggleClass("scrolling",n),n&&(t.scrollTop=t.scrollHeight)},addOne:function(e){var t=new y({model:e});this.$("#commandDisplay").append(t.render().el),this.scrollDown()},addAll:function(){this.collection.each(this.addOne)}});n.CommandPromptView=g,n.CommandLineHistoryView=b}),e.define("/src/js/util/zoomLevel.js",function(e,t,n,r,i,s,o){function f(){return!window.outerWidth||!window.innerWidth?(a&&(console.warn("Can't detect zoom level correctly :-/"),a=!1),1):window.outerWidth/window.innerWidth}var u=e("underscore"),a=!0,l=!0,c=function(e,t){var n=0;setInterval(function(){var r=f();if(r!==n){if(l){l=!1;return}n=r,e.apply(t,[r])}else l=!0},500)};n.setupZoomPoll=c,n.detectZoom=f}),e.define("/src/js/dialogs/sandbox.js",function(e,t,n,r,i,s,o){n.dialog=[{type:"ModalAlert",options:{markdowns:["## Welcome to LearnGitBranching!","","This application is designed to help beginners grasp ","the powerful concepts behind branching when working ","with git. We hope you enjoy this application and maybe ","even learn something!","","# Attention HN!!","","Unfortunately this was submitted before I finished all the help ","and tutorial sections, so forgive the scarcity. See the demo here:","","[http://pcottle.github.com/learnGitBranching/?demo](http://pcottle.github.com/learnGitBranching/?demo)"]}},{type:"ModalAlert",options:{markdowns:["## Git commands","","You have a large variety of git commands available in sandbox mode. These include",""," * commit"," * branch"," * checkout"," * cherry-pick"," * reset"," * revert"," * rebase"," * merge"]}},{type:"ModalAlert",options:{markdowns:["## Sharing is caring!","","Share trees with your friends via `export tree` and `import tree`","","Have a great lesson to share? Try building a level with `build level` or try out a friend's level with `import level`","","For now let's get you started on the `levels`..."]}}]}),e.define("/src/js/util/mock.js",function(e,t,n,r,i,s,o){n.mock=function(e){var t={},n=function(){};for(var r in e.prototype)t[r]=n;return t}}),e.define("/src/js/visuals/tree.js",function(e,t,n,r,i,s,o){var u=e("underscore"),a=e("backbone"),f=a.Model.extend({removeKeys:function(e){u.each(e,function(e){this.get(e)&&this.get(e).remove()},this)},animateAttrKeys:function(e,t,n,r){e=u.extend({},{include:["circle","arrow","rect","path","text"],exclude:[]},e||{});var i=this.getAttributes();u.each(e.include,function(e){i[e]=u.extend({},i[e],t)}),u.each(e.exclude,function(e){delete i[e]}),this.animateToAttr(i,n,r)}});n.VisBase=f}),e.define("/src/js/git/headless.js",function(e,t,n,r,i,s,o){var u=e("underscore"),a=e("backbone"),f=e("q"),l=e("../git").GitEngine,c=e("../visuals/animation/animationFactory").AnimationFactory,h=e("../visuals").GitVisuals,p=e("../git/treeCompare").TreeCompare,d=e("../util/eventBaton").EventBaton,v=e("../models/collections"),m=v.CommitCollection,g=v.BranchCollection,y=e("../models/commandModel").Command,b=e("../util/mock").mock,w=e("../util"),E=function(){this.init()};E.prototype.init=function(){this.commitCollection=new m,this.branchCollection=new g,this.treeCompare=new p;var e=b(c),t=b(h);this.gitEngine=new l({collection:this.commitCollection,branches:this.branchCollection,gitVisuals:t,animationFactory:e,eventBaton:new d}),this.gitEngine.init()},E.prototype.sendCommand=function(e){w.splitTextCommand(e,function(e){var t=new y({rawStr:e});this.gitEngine.dispatch(t,f.defer())},this)},n.HeadlessGit=E}),e.define("/src/js/app/index.js",function(e,t,n,r,i,s,o){function y(){var t=e("../models/collections"),n=e("../views/commandViews");this.commandCollection=new t.CommandCollection,this.commandBuffer=new t.CommandBuffer({collection:this.commandCollection}),this.commandPromptView=new n.CommandPromptView({el:$("#commandLineBar")}),this.commandLineHistoryView=new n.CommandLineHistoryView({el:$("#commandLineHistory"),collection:this.commandCollection})}var u=e("underscore"),a=e("backbone"),f=e("../util/constants"),l=e("../util"),c=u.clone(a.Events),h,p,d,v,m,g=function(){var t=e("../level/sandbox").Sandbox,n=e("../level").Level,r=e("../util/eventBaton").EventBaton,i=e("../level/arbiter").LevelArbiter,s=e("../views/levelDropdownView").LevelDropdownView;d=new r,h=new y,p=new t,v=new i,m=new s({wait:!0});var o=function(){$("#commandTextField").focus()};o(),$(window).focus(function(e){d.trigger("windowFocus",e)}),$(document).click(function(e){d.trigger("documentClick",e)}),$(document).bind("keydown",function(e){d.trigger("docKeydown",e)}),$(document).bind("keyup",function(e){d.trigger("docKeyup",e)}),$(window).on("resize",function(e){c.trigger("resize",e)}),d.stealBaton("docKeydown",function(){}),d.stealBaton("docKeyup",function(){}),d.stealBaton("windowFocus",o),d.stealBaton("documentClick",o);var a=function(e){return function(){var t=[e];u.each(arguments,function(e){t.push(e)}),d.trigger.apply(d,t)}};$("#commandTextField").on("keydown",a("keydown")),$("#commandTextField").on("keyup",a("keyup")),$(window).trigger("resize"),/\?demo/.test(window.location.href)?p.mainVis.customEvents.on("gitEngineReady",function(){d.trigger("commandSubmitted",["git commit; git checkout -b bugFix C1; git commit; git merge master; git checkout master; git commit; git rebase bugFix;","delay 1000; reset;","level rebase1 --noFinishDialog --noStartCommand --noIntroDialog;","delay 2000; show goal; delay 1000; hide goal;","git checkout bugFix; git rebase master; git checkout side; git rebase bugFix;","git checkout another; git rebase side; git rebase another master;","help; levels"].join(""))}):/\?NODEMO/.test(window.location.href)||p.mainVis.customEvents.on("gitEngineReady",function(){d.trigger("commandSubmitted",["git help;","delay 1000;","help;","levels"].join(""))});if(/command=/.test(window.location.href)){var f=window.location.href.split("command=")[1].split("&")[0],l=unescape(f);p.mainVis.customEvents.on("gitEngineReady",function(){d.trigger("commandSubmitted",l)})}(/(iPhone|iPod|iPad).*AppleWebKit/i.test(navigator.userAgent)||/android/i.test(navigator.userAgent))&&p.mainVis.customEvents.on("gitEngineReady",function(){d.trigger("commandSubmitted","mobile alert")})};e("../util").isBrowser()&&$(document).ready(g),n.getEvents=function(){return c},n.getSandbox=function(){return p},n.getEventBaton=function(){return d},n.getCommandUI=function(){return h},n.getLevelArbiter=function(){return v},n.getLevelDropdown=function(){return m},n.init=g}),e("/src/js/app/index.js"),e.define("/src/js/dialogs/levelBuilder.js",function(e,t,n,r,i,s,o){n.dialog=[{type:"ModalAlert",options:{markdowns:["## Welcome to the level builder!","","Here are the main steps:",""," * Set up the initial environment with git commands"," * Define the starting tree with ```define start```"," * Enter the series of git commands that compose the (optimal) solution"," * Define the goal tree with ```define goal```. Defining the goal also defines the solution"," * Optionally define a hint with ```define hint```"," * Edit the name with ```define name```"," * Optionally define a nice start dialog with ```edit dialog```"," * Enter the command ```finish``` to output your level JSON!"]}}]}),e("/src/js/dialogs/levelBuilder.js"),e.define("/src/js/dialogs/sandbox.js",function(e,t,n,r,i,s,o){n.dialog=[{type:"ModalAlert",options:{markdowns:["## Welcome to LearnGitBranching!","","This application is designed to help beginners grasp ","the powerful concepts behind branching when working ","with git. We hope you enjoy this application and maybe ","even learn something!","","# Attention HN!!","","Unfortunately this was submitted before I finished all the help ","and tutorial sections, so forgive the scarcity. See the demo here:","","[http://pcottle.github.com/learnGitBranching/?demo](http://pcottle.github.com/learnGitBranching/?demo)"]}},{type:"ModalAlert",options:{markdowns:["## Git commands","","You have a large variety of git commands available in sandbox mode. These include",""," * commit"," * branch"," * checkout"," * cherry-pick"," * reset"," * revert"," * rebase"," * merge"]}},{type:"ModalAlert",options:{markdowns:["## Sharing is caring!","","Share trees with your friends via `export tree` and `import tree`","","Have a great lesson to share? Try building a level with `build level` or try out a friend's level with `import level`","","For now let's get you started on the `levels`..."]}}]}),e("/src/js/dialogs/sandbox.js"),e.define("/src/js/git/commands.js",function(e,t,n,r,i,s,o){function g(e,t){this.method=e,this.rawOptions=t,this.supportedMap=this.getMasterOptionMap()[e];if(this.supportedMap===undefined)throw new Error("No option map for "+e);this.generalArgs=[],this.explodeAndSet()}var u=e("underscore"),a=e("../util/errors"),f=a.CommandProcessError,l=a.GitError,c=a.Warning,h=a.CommandResult,p={"git commit":/^(gc|git ci)($|\s)/,"git add":/^ga($|\s)/,"git checkout":/^(go|git co)($|\s)/,"git rebase":/^gr($|\s)/,"git branch":/^(gb|git br)($|\s)/,"git status":/^(gst|gs|git st)($|\s)/,"git help":/^git$/},d=[[/^git help($|\s)/,function(){var e=["Git Version PCOTTLE.1.0","
","Usage:",u.escape(" git []"),"
","Supported commands:","
"],t=g.prototype.getMasterOptionMap();u.each(t,function(t,n){e.push("git "+n),u.each(t,function(t,n){e.push(" "+n)},this)},this);var n=e.join("\n");throw n=n.replace(/\t/g," "),new h({msg:n})}]],v={"git commit":/^git commit($|\s)/,"git add":/^git add($|\s)/,"git checkout":/^git checkout($|\s)/,"git rebase":/^git rebase($|\s)/,"git reset":/^git reset($|\s)/,"git branch":/^git branch($|\s)/,"git revert":/^git revert($|\s)/,"git log":/^git log($|\s)/,"git merge":/^git merge($|\s)/,"git show":/^git show($|\s)/,"git status":/^git status($|\s)/,"git cherry-pick":/^git cherry-pick($|\s)/},m=function(e){var t,n;u.each(v,function(r,i){r.exec(e)&&(n=e.slice(i.length+1),t=i.slice("git ".length))});if(!t)return!1;var r=new g(t,n);return{toSet:{generalArgs:r.generalArgs,supportedMap:r.supportedMap,method:t,options:n,eventName:"processGitCommand"}}};g.prototype.getMasterOptionMap=function(){return{commit:{"--amend":!1,"-a":!1,"-am":!1,"-m":!1},status:{},log:{},add:{},"cherry-pick":{},branch:{"-d":!1,"-D":!1,"-f":!1,"--contains":!1},checkout:{"-b":!1,"-B":!1,"-":!1},reset:{"--hard":!1,"--soft":!1},merge:{},rebase:{"-i":!1},revert:{},show:{}}},g.prototype.explodeAndSet=function(){var e=this.rawOptions.match(/('.*?'|".*?"|\S+)/g)||[];for(var t=0;t9&&(e=e.slice(0,9),this.command.addWarning("Sorry, we need to keep branch names short for the visuals. Your branch name was truncated to 9 characters, resulting in "+e)),e},m.prototype.makeBranch=function(e,t){e=this.validateBranchName(e);if(this.refs[e])throw new d({msg:"that branch id either matches a commit hash or already exists!"});var n=new y({target:t,id:e});return this.branchCollection.add(n),this.refs[n.get("id")]=n,n},m.prototype.getHead=function(){return u.clone(this.HEAD)},m.prototype.getBranches=function(){var e=[];return this.branchCollection.each(function(t){e.push({id:t.get("id"),selected:this.HEAD.get("target")===t,target:t.get("target"),obj:t})},this),e},m.prototype.printBranchesWithout=function(e){var t=this.getUpstreamBranchSet(),n=this.getCommitFromRef(e).get("id"),r=[];u.each(t[n],function(e){e.selected=this.HEAD.get("target").get("id")==e.id,r.push(e)},this),this.printBranches(r)},m.prototype.printBranches=function(e){var t="";throw u.each(e,function(e){t+=(e.selected?"* ":"")+e.id+"\n"}),new v({msg:t})},m.prototype.makeCommit=function(e,t,n){if(!t){t=this.uniqueId("C");while(this.refs[t])t=this.uniqueId("C")}var r=new b(u.extend({parents:e,id:t,gitVisuals:this.gitVisuals},n||{}));return this.refs[r.get("id")]=r,this.commitCollection.add(r),r},m.prototype.acceptNoGeneralArgs=function(){if(this.generalArgs.length)throw new d({msg:"That command accepts no general arguments"})},m.prototype.validateArgBounds=function(e,t,n,r){var i=r===undefined?"git "+this.command.get("method"):this.command.get("method")+" "+r+" ";i="with "+i;if(e.lengthn)throw new d({msg:"I expect at most "+String(n)+" argument(s) "+i})},m.prototype.oneArgImpliedHead=function(e,t){this.validateArgBounds(e,0,1,t),e.length===0&&e.push("HEAD")},m.prototype.twoArgsImpliedHead=function(e,t){this.validateArgBounds(e,1,2,t),e.length==1&&e.push("HEAD")},m.prototype.revertStarter=function(){this.validateArgBounds(this.generalArgs,1,NaN);var e=this.revert(this.generalArgs);e&&this.animationFactory.rebaseAnimation(this.animationQueue,e,this,this.gitVisuals)},m.prototype.revert=function(e){var t=[];u.each(e,function(e){t.push(this.getCommitFromRef(e))},this);var n={};n.destinationBranch=this.resolveID(t[0]),n.toRebaseArray=t.slice(0),n.rebaseSteps=[];var r=this.gitVisuals.genSnapshot(),i,s=this.getCommitFromRef("HEAD");return u.each(t,function(e){var t=this.rebaseAltID(e.get("id")),o=this.makeCommit([s],t,{commitMessage:"Reverting "+this.resolveName(e)+': "'+e.get("commitMessage")+'"'});s=o,i=this.gitVisuals.genSnapshot(),n.rebaseSteps.push({oldCommit:e,newCommit:o,beforeSnapshot:r,afterSnapshot:i}),r=i},this),this.setTargetLocation("HEAD",s),n},m.prototype.resetStarter=function(){if(this.commandOptions["--soft"])throw new d({msg:"You can't use --soft because there is no concept of stashing changes or staging files, so you will lose your progress. Try using interactive rebasing (or just rebasing) to move commits."});this.commandOptions["--hard"]&&(this.command.addWarning("Nice! You are using --hard. The default behavior is a hard reset in this demo, so don't worry about specifying the option explicity"),this.generalArgs=this.generalArgs.concat(this.commandOptions["--hard"])),this.validateArgBounds(this.generalArgs,1,1);if(this.getDetachedHead())throw new d({msg:"Cant reset in detached head! Use checkout if you want to move"});this.reset(this.generalArgs[0])},m.prototype.reset=function(e){this.setTargetLocation("HEAD",this.getCommitFromRef(e))},m.prototype.cherrypickStarter=function(){this.validateArgBounds(this.generalArgs,1,1);var e=this.cherrypick(this.generalArgs[0]);this.animationFactory.genCommitBirthAnimation(this.animationQueue,e,this.gitVisuals)},m.prototype.cherrypick=function(e){var t=this.getCommitFromRef(e),n=this.getUpstreamSet("HEAD");if(n[t.get("id")])throw new d({msg:"We already have that commit in our changes history! You can't cherry-pick it if it shows up in git log."});var r=this.rebaseAltID(t.get("id")),i=this.makeCommit([this.getCommitFromRef("HEAD")],r);return this.setTargetLocation(this.HEAD,i),i},m.prototype.commitStarter=function(){this.acceptNoGeneralArgs();if(this.commandOptions["-am"]&&(this.commandOptions["-a"]||this.commandOptions["-m"]))throw new d({msg:"You can't have -am with another -m or -a!"});var e=null,t=null;this.commandOptions["-a"]&&this.command.addWarning("No need to add files in this demo"),this.commandOptions["-am"]&&(t=this.commandOptions["-am"],this.validateArgBounds(t,1,1,"-am"),this.command.addWarning("Don't worry about adding files in this demo. I'll take down your commit message anyways, but you can commit without a message in this demo as well"),e=t[0]),this.commandOptions["-m"]&&(t=this.commandOptions["-m"],this.validateArgBounds(t,1,1,"-m"),e=t[0]);var n=this.commit();e&&(e=e.replace(/"/g,'"').replace(/^"/g,"").replace(/"$/g,""),n.set("commitMessage",e)),this.animationFactory.genCommitBirthAnimation(this.animationQueue,n,this.gitVisuals)},m.prototype.commit=function(){var e=this.getCommitFromRef(this.HEAD),t=null;this.commandOptions["--amend"]&&(e=this.resolveID("HEAD~1"),t=this.rebaseAltID(this.getCommitFromRef("HEAD").get("id")));var n=this.makeCommit([e],t);return this.getDetachedHead()&&this.command.addWarning("Warning!! Detached HEAD state"),this.setTargetLocation(this.HEAD,n),n},m.prototype.resolveName=function(e){var t=this.resolveID(e);return t.get("type")=="commit"?"commit "+t.get("id"):t.get("type")=="branch"?'branch "'+t.get("id")+'"':this.resolveName(t.get("target"))},m.prototype.resolveID=function(e){if(e===null||e===undefined)throw new Error("Dont call this with null / undefined");return typeof e!="string"?e:this.resolveStringRef(e)},m.prototype.resolveStringRef=function(e){if(this.refs[e])return this.refs[e];if(this.refs[e.toUpperCase()])return this.refs[e.toUpperCase()];var t=[[/^([a-zA-Z0-9]+)~(\d+)\s*$/,function(e){return parseInt(e[2],10)}],[/^([a-zA-Z0-9]+)(\^+)\s*$/,function(e){return e[2].length}]],n=null,r=null;u.each(t,function(t){var i=t[0],s=t[1];if(i.test(e)){var o=i.exec(e);r=s(o),n=o[1]}},this);if(!n)throw new d({msg:"unknown ref "+e});if(!this.refs[n])throw new d({msg:"the ref "+n+" does not exist."});var i=this.getCommitFromRef(n);return this.numBackFrom(i,r)},m.prototype.getCommitFromRef=function(e){var t=this.resolveID(e);while(t.get("type")!=="commit")t=t.get("target");return t},m.prototype.getType=function(e){return this.resolveID(e).get("type")},m.prototype.setTargetLocation=function(e,t){if(this.getType(e)=="commit")return;e=this.getOneBeforeCommit(e),e.set("target",t)},m.prototype.getUpstreamBranchSet=function(){var e={},t=function(e,t){var n=!1;return u.each(e,function(e){e.id==t&&(n=!0)}),n},n=function(e){var t=[],n=[e];while(n.length){var r=n.pop();t.push(r.get("id")),r.get("parents")&&r.get("parents").length&&(n=n.concat(r.get("parents")))}return t};return this.branchCollection.each(function(r){var i=n(r.get("target"));u.each(i,function(n){e[n]=e[n]||[],t(e[n],r.get("id"))||e[n].push({obj:r,id:r.get("id")})})}),e},m.prototype.getUpstreamHeadSet=function(){var e=this.getUpstreamSet("HEAD"),t=this.getCommitFromRef("HEAD").get("id");return e[t]=!0,e},m.prototype.getOneBeforeCommit=function(e){var t=this.resolveID(e);return t===this.HEAD&&!this.getDetachedHead()&&(t=t.get("target")),t},m.prototype.numBackFrom=function(e,t){if(t===0)return e;var n=u.bind(function(e){e.sort(this.dateSortFunc)},this),r=[].concat(e.get("parents")||[]);n(r),t--;while(r.length&&t!==0){var i=r.shift(0),s=i.get("parents");s&&s.length&&(r=r.concat(s)),n(r),t--}if(t!==0||r.length===0)throw new d({msg:"Sorry, I can't go that many commits back"});return r.shift(0)},m.prototype.scrapeBaseID=function(e){var t=/^C(\d+)/.exec(e);if(!t)throw new Error("regex failed on "+e);return"C"+t[1]},m.prototype.rebaseAltID=function(e){var t=[[/^C(\d+)[']{0,2}$/,function(e){return e[0]+"'"}],[/^C(\d+)[']{3}$/,function(e){return e[0].slice(0,-3)+"'^4"}],[/^C(\d+)['][\^](\d+)$/,function(e){return"C"+String(e[1])+"'^"+String(Number(e[2])+1)}]];for(var n=0;n",this.get("commitMessage"),"
","Commit: "+this.get("id")].join("\n")+"\n"},getShowEntry:function(){return[this.getLogEntry(),"diff --git a/bigGameResults.html b/bigGameResults.html","--- bigGameResults.html","+++ bigGameResults.html","@@ 13,27 @@ Winner, Score","- Stanfurd, 14-7","+ Cal, 21-14"].join("\n")+"\n"},validateAtInit:function(){if(!this.get("id"))throw new Error("Need ID!!");this.get("createTime")||this.set("createTime",(new Date).toString()),this.get("commitMessage")||this.set("commitMessage","Quick Commit. Go Bears!"),this.set("children",[]);if(!this.get("rootCommit"))if(!this.get("parents")||!this.get("parents").length)throw new Error("needs parents")},addNodeToVisuals:function(){var e=this.get("gitVisuals").addNode(this.get("id"),this);this.set("visNode",e)},addEdgeToVisuals:function(e){this.get("gitVisuals").addEdge(this.get("id"),e.get("id"))},isMainParent:function(e){var t=this.get("parents").indexOf(e);return t===0},initialize:function(e){this.validateAtInit(),this.addNodeToVisuals(),u.each(this.get("parents"),function(e){e.get("children").push(this),this.addEdgeToVisuals(e)},this)}});n.GitEngine=m,n.Commit=b,n.Branch=y,n.Ref=g}),e("/src/js/git/index.js"),e.define("/src/js/git/treeCompare.js",function(e,t,n,r,i,s,o){function a(){}var u=e("underscore");a.prototype.compareAllBranchesWithinTreesAndHEAD=function(e,t){return e=this.convertTreeSafe(e),t=this.convertTreeSafe(t),e.HEAD.target==t.HEAD.target&&this.compareAllBranchesWithinTrees(e,t)},a.prototype.compareAllBranchesWithinTrees=function(e,t){e=this.convertTreeSafe(e),t=this.convertTreeSafe(t);var n=u.extend({},e.branches,t.branches),r=!0;return u.uniq(n,function(n,i){r=r&&this.compareBranchWithinTrees(e,t,i)},this),r},a.prototype.compareBranchesWithinTrees=function(e,t,n){var r=!0;return u.each(n,function(n){r=r&&this.compareBranchWithinTrees(e,t,n)},this),r},a.prototype.compareBranchWithinTrees=function(e,t,n){e=this.convertTreeSafe(e),t=this.convertTreeSafe(t),this.reduceTreeFields([e,t]);var r=this.getRecurseCompare(e,t),i=e.branches[n],s=t.branches[n];return u.isEqual(i,s)&&r(e.commits[i.target],t.commits[s.target])},a.prototype.compareAllBranchesWithinTreesHashAgnostic=function(e,t){e=this.convertTreeSafe(e),t=this.convertTreeSafe(t),this.reduceTreeFields([e,t]);var n=u.bind(function(e,t){return!e||!t?!1:(e.target=this.getBaseRef(e.target),t.target=this.getBaseRef(t.target),u.isEqual(e,t))},this),r=this.getRecurseCompareHashAgnostic(e,t),i=u.extend({},e.branches,t.branches),s=!0;return u.each(i,function(i,o){branchA=e.branches[o],branchB=t.branches[o],s=s&&n(branchA,branchB)&&r(e.commits[branchA.target],t.commits[branchB.target])},this),s},a.prototype.getBaseRef=function(e){var t=/^C(\d+)/,n=t.exec(e);if(!n)throw new Error("no regex matchy for "+e);return"C"+n[1]},a.prototype.getRecurseCompareHashAgnostic=function(e,t){var n=u.bind(function(e){return u.extend({},e,{id:this.getBaseRef(e.id)})},this),r=function(e,t){return u.isEqual(n(e),n(t))};return this.getRecurseCompare(e,t,{isEqual:r})},a.prototype.getRecurseCompare=function(e,t,n){n=n||{};var r=function(i,s){var o=n.isEqual?n.isEqual(i,s):u.isEqual(i,s);if(!o)return!1;var a=u.unique(i.parents.concat(s.parents));return u.each(a,function(n,i){var u=s.parents[i],a=e.commits[n],f=t.commits[u];o=o&&r(a,f)},this),o};return r},a.prototype.convertTreeSafe=function(e){return typeof e=="string"?JSON.parse(unescape(e)):e},a.prototype.reduceTreeFields=function(e){var t=["parents","id","rootCommit"],n=["children","parents"],r=["target","id"],i=function(e,t,n,r){var i=e[t];u.each(i,function(i,s){var o={};u.each(n,function(e){i[e]!==undefined&&(o[e]=i[e])}),u.each(r,function(e){i[e]&&(i[e].sort(),o[e]=i[e])}),e[t][s]=o})};u.each(e,function(e){i(e,"commits",t,n),i(e,"branches",r),e.HEAD={target:e.HEAD.target,id:e.HEAD.id}})},a.prototype.compareTrees=function(e,t){return e=this.convertTreeSafe(e),t=this.convertTreeSafe(t),this.reduceTreeFields([e,t]),u.isEqual(e,t)},n.TreeCompare=a}),e("/src/js/git/treeCompare.js"),e.define("/src/js/level/arbiter.js",function(e,t,n,r,i,s,o){function h(){this.levelMap={},this.levelSequences=f,this.sequences=[],this.init();var e;try{e=JSON.parse(localStorage.getItem("solvedMap")||"{}")}catch(t){console.warn("local storage failed",t)}this.solvedMap=e||{},c.getEvents().on("levelSolved",this.levelSolved,this)}var u=e("underscore"),a=e("backbone"),f=e("../levels").levelSequences,l=e("../levels").sequenceInfo,c=e("../app");h.prototype.init=function(){var e;u.each(this.levelSequences,function(e,t){this.sequences.push(t);if(!e||!e.length)throw new Error("no empty sequences allowed");u.each(e,function(e,n){this.validateLevel(e);var r=t+String(n+1),i=u.extend({},e,{index:n,id:r,sequenceName:t});this.levelMap[r]=i,this.levelSequences[t][n]=i},this)},this)},h.prototype.isLevelSolved=function(e){if(!this.levelMap[e])throw new Error("that level doesnt exist!");return Boolean(this.solvedMap[e])},h.prototype.levelSolved=function(e){if(!e)return;this.solvedMap[e]=!0,this.syncToStorage()},h.prototype.resetSolvedMap=function(){this.solvedMap={},this.syncToStorage(),c.getEvents().trigger("levelSolved")},h.prototype.syncToStorage=function(){try{localStorage.setItem("solvedMap",JSON.stringify(this.solvedMap))}catch(e){console.warn("local storage fialed on set",e)}},h.prototype.validateLevel=function(e){e=e||{};var t=["name","goalTreeString","solutionCommand"],n=["hint","disabledMap","startTree"];u.each(t,function(t){if(e[t]===undefined)throw console.log(e),new Error("I need this field for a level: "+t)})},h.prototype.getSequenceToLevels=function(){return this.levelSequences},h.prototype.getSequences=function(){return u.keys(this.levelSequences)},h.prototype.getLevelsInSequence=function(e){if(!this.levelSequences[e])throw new Error("that sequecne name "+e+"does not exist");return this.levelSequences[e]},h.prototype.getSequenceInfo=function(e){return l[e]},h.prototype.getLevel=function(e){return this.levelMap[e]},h.prototype.getNextLevel=function(e){if(!this.levelMap[e])return console.warn("that level doesnt exist!!!"),null;var t=this.levelMap[e],n=t.sequenceName,r=this.levelSequences[n],i=t.index+1;if(i"+e+this.get("warnings").join(""+e)+"
"},parseOrCatch:function(){this.expandShortcuts(this.get("rawStr"));try{this.processInstants()}catch(e){f.filterError(e),this.set("error",e);return}if(this.parseAll())return;this.set("error",new p({msg:'The command "'+this.get("rawStr")+"\" isn't supported, sorry!"}))},errorChanged:function(){var e=this.get("error");e instanceof p||e instanceof d?this.set("status","error"):e instanceof m?this.set("status","finished"):e instanceof v&&this.set("status","warning"),this.formatError()},formatError:function(){this.set("result",this.get("error").toResult())},expandShortcuts:function(e){e=this.get("parseWaterfall").expandAllShortcuts(e),this.set("rawStr",e)},processInstants:function(){var e=this.get("rawStr");if(!e.length)throw new m({msg:""});this.get("parseWaterfall").processAllInstants(e)},parseAll:function(){var e=this.get("rawStr"),t=this.get("parseWaterfall").parseAll(e);return t?(u.each(t.toSet,function(e,t){this.set(t,e)},this),!0):!1}}),y=a.Model.extend({defaults:{text:""}});n.CommandEntry=y,n.Command=g}),e("/src/js/models/commandModel.js"),e.define("/src/js/util/constants.js",function(e,t,n,r,i,s,o){var u={betweenCommandsDelay:400},a={isAnimating:!1},f={minZoom:.55,maxZoom:1.25,minWidth:600,minHeight:600},l={arrowHeadSize:8,nodeRadius:17,curveControlPointOffset:50,defaultEasing:"easeInOut",defaultAnimationTime:400,rectFill:"hsb(0.8816909813322127,0.7,1)",headRectFill:"#2831FF",rectStroke:"#FFF",rectStrokeWidth:"3",multiBranchY:20,upstreamHeadOpacity:.5,upstreamNoneOpacity:.2,edgeUpstreamHeadOpacity:.4,edgeUpstreamNoneOpacity:.15,visBranchStrokeWidth:2,visBranchStrokeColorNone:"#333",defaultNodeFill:"hsba(0.5,0.8,0.7,1)",defaultNodeStrokeWidth:2,defaultNodeStroke:"#FFF",orphanNodeFill:"hsb(0.5,0.8,0.7)"};n.GLOBAL=a,n.TIME=u,n.GRAPHICS=l,n.VIEWPORT=f}),e("/src/js/util/constants.js"),e.define("/src/js/util/debug.js",function(e,t,n,r,i,s,o){var u=e("underscore"),a={Tree:e("../visuals/tree"),Visuals:e("../visuals"),Git:e("../git"),CommandModel:e("../models/commandModel"),Levels:e("../git/treeCompare"),Constants:e("../util/constants"),Collections:e("../models/collections"),Async:e("../visuals/animation"),AnimationFactory:e("../visuals/animation/animationFactory"),Main:e("../app"),HeadLess:e("../git/headless"),Q:{Q:e("q")},RebaseView:e("../views/rebaseView"),Views:e("../views"),MultiView:e("../views/multiView"),ZoomLevel:e("../util/zoomLevel"),VisBranch:e("../visuals/visBranch"),Level:e("../level"),Sandbox:e("../level/sandbox"),GitDemonstrationView:e("../views/gitDemonstrationView"),Markdown:e("markdown"),LevelDropdownView:e("../views/levelDropdownView"),BuilderViews:e("../views/builderViews")};u.each(a,function(e){u.extend(window,e)}),$(document).ready(function(){window.events=a.Main.getEvents(),window.eventBaton=a.Main.getEventBaton(),window.sandbox=a.Main.getSandbox(),window.modules=a,window.levelDropdown=a.Main.getLevelDropdown()})}),e("/src/js/util/debug.js"),e.define("/src/js/util/errors.js",function(e,t,n,r,i,s,o){var u=e("underscore"),a=e("backbone"),f=a.Model.extend({defaults:{type:"MyError",msg:"Unknown Error"},toString:function(){return this.get("type")+": "+this.get("msg")},getMsg:function(){return this.get("msg")||"Unknown Error"},toResult:function(){return this.get("msg").length?""+this.get("msg").replace(/\n/g,"
")+"
":""}}),l=n.CommandProcessError=f.extend({defaults:{type:"Command Process Error"}}),c=n.CommandResult=f.extend({defaults:{type:"Command Result"}}),h=n.Warning=f.extend({defaults:{type:"Warning"}}),p=n.GitError=f.extend({defaults:{type:"Git Error"}}),d=function(e){if(e instanceof l||e instanceof p||e instanceof c||e instanceof h)return;throw e};n.filterError=d}),e("/src/js/util/errors.js"),e.define("/src/js/util/eventBaton.js",function(e,t,n,r,i,s,o){function a(){this.eventMap={}}var u=e("underscore");a.prototype.stealBaton=function(e,t,n){if(!e)throw new Error("need name");if(!t)throw new Error("need func!");var r=this.eventMap[e]||[];r.push({func:t,context:n}),this.eventMap[e]=r},a.prototype.sliceOffArgs=function(e,t){var n=[];for(var r=e;r0&&!e.length)return;t(e)})},n.genParseCommand=function(e,t){return function(n){var r,i;return u.each(e,function(e,t){var s=e.exec(n);s&&(r=t,i=s)}),r?{toSet:{eventName:t,method:r,regexResults:i}}:!1}}}),e("/src/js/util/index.js"),e.define("/src/js/util/keyboard.js",function(e,t,n,r,i,s,o){function c(e){this.events=e.events||u.clone(a.Events),this.aliasMap=e.aliasMap||{},e.wait||this.listen()}var u=e("underscore"),a=e("backbone"),f=e("../app"),l=function(e){var t={37:"left",38:"up",39:"right",40:"down",27:"esc",13:"enter"};return t[e]};c.prototype.listen=function(){if(this.listening)return;this.listening=!0,f.getEventBaton().stealBaton("docKeydown",this.keydown,this)},c.prototype.mute=function(){this.listening=!1,f.getEventBaton().releaseBaton("docKeydown",this.keydown,this)},c.prototype.keydown=function(e){var t=e.which||e.keyCode,n=l(t);if(n===undefined)return;this.fireEvent(n,e)},c.prototype.fireEvent=function(e,t){e=this.aliasMap[e]||e,this.events.trigger(e,t)},c.prototype.passEventBack=function(e){f.getEventBaton().passBatonBackSoft("docKeydown",this.keydown,this,[e])},n.KeyboardListener=c,n.mapKeycodeToKey=l}),e("/src/js/util/keyboard.js"),e.define("/src/js/util/mock.js",function(e,t,n,r,i,s,o){n.mock=function(e){var t={},n=function(){};for(var r in e.prototype)t[r]=n;return t}}),e("/src/js/util/mock.js"),e.define("/src/js/util/zoomLevel.js",function(e,t,n,r,i,s,o){function f(){return!window.outerWidth||!window.innerWidth?(a&&(console.warn("Can't detect zoom level correctly :-/"),a=!1),1):window.outerWidth/window.innerWidth}var u=e("underscore"),a=!0,l=!0,c=function(e,t){var n=0;setInterval(function(){var r=f();if(r!==n){if(l){l=!1;return}n=r,e.apply(t,[r])}else l=!0},500)};n.setupZoomPoll=c,n.detectZoom=f}),e("/src/js/util/zoomLevel.js"),e.define("/src/js/views/builderViews.js",function(e,t,n,r,i,s,o){var u=e("underscore"),a=e("q"),f=e("../util").isBrowser()?window.Backbone:e("backbone"),l=e("../util"),c=e("../util/keyboard").KeyboardListener,h=e("../views"),p=h.ModalTerminal,d=h.ContainedBase,v=d.extend({tagName:"div",className:"textGrabber box vertical",template:u.template($("#text-grabber").html()),initialize:function(e){e=e||{},this.JSON={helperText:e.helperText||"Enter some text"},this.container=e.container||new p({title:"Enter some text"}),this.render(),e.initialText&&this.setText(e.initialText),e.wait||this.show()},getText:function(){return this.$("textarea").val()},setText:function(e){this.$("textarea").val(e)}}),m=d.extend({tagName:"div",className:"markdownGrabber box horizontal",template:u.template($("#markdown-grabber-view").html()),events:{"keyup textarea":"keyup"},initialize:function(e){e=e||{},this.deferred=e.deferred||a.defer(),e.fromObj&&(e.fillerText=e.fromObj.options.markdowns.join("\n")),this.JSON={previewText:e.previewText||"Preview",fillerText:e.fillerText||"## Enter some markdown!\n\n\n"},this.container=e.container||new p({title:e.title||"Enter some markdown"}),this.render();if(!e.withoutButton){var t=a.defer();t.promise.then(u.bind(this.confirmed,this)).fail(u.bind(this.cancelled,this)).done();var n=new h.ConfirmCancelView({deferred:t,destination:this.getDestination()})}this.updatePreview(),e.wait||this.show()},confirmed:function(){this.die(),this.deferred.resolve(this.getRawText())},cancelled:function(){this.die(),this.deferred.resolve()},keyup:function(){this.throttledPreview||(this.throttledPreview=u.throttle(u.bind(this.updatePreview,this),500)),this.throttledPreview()},getRawText:function(){return this.$("textarea").val()},exportToArray:function(){return this.getRawText().split("\n")},getExportObj:function(){return{markdowns:this.exportToArray()}},updatePreview:function(){var t=this.getRawText(),n=e("markdown").markdown.toHTML(t);this.$("div.insidePreview").html(n)}}),g=d.extend({tagName:"div",className:"markdownPresenter box vertical",template:u.template($("#markdown-presenter").html()),initialize:function(e){e=e||{},this.deferred=e.deferred||a.defer(),this.JSON={previewText:e.previewText||"Here is something for you",fillerText:e.fillerText||"# Yay"},this.container=new p({title:"Check this out..."}),this.render();if(!e.noConfirmCancel){var t=new h.ConfirmCancelView({destination:this.getDestination()});t.deferred.promise.then(u.bind(function(){this.deferred.resolve(this.grabText())},this)).fail(u.bind(function(){this.deferred.reject()},this)).done(u.bind(this.die,this))}this.show()},grabText:function(){return this.$("textarea").val()}}),y=d.extend({tagName:"div",className:"demonstrationBuilder box vertical",template:u.template($("#demonstration-builder").html()),events:{"click div.testButton":"testView"},initialize:function(e){e=e||{},this.deferred=e.deferred||a.defer();if(e.fromObj){var t=e.fromObj.options;e=u.extend({},e,t,{beforeMarkdown:t.beforeMarkdowns.join("\n"),afterMarkdown:t.afterMarkdowns.join("\n")})}this.JSON={},this.container=new p({title:"Demonstration Builder"}),this.render(),this.beforeMarkdownView=new m({container:this,withoutButton:!0,fillerText:e.beforeMarkdown,previewText:"Before demonstration Markdown"}),this.beforeCommandView=new v({container:this,helperText:"The git command(s) to set up the demonstration view (before it is displayed)",initialText:e.beforeCommand||"git checkout -b bugFix"}),this.commandView=new v({container:this,helperText:"The git command(s) to demonstrate to the reader",initialText:e.command||"git commit"}),this.afterMarkdownView=new m({container:this,withoutButton:!0,fillerText:e.afterMarkdown,previewText:"After demonstration Markdown"});var n=a.defer(),r=new h.ConfirmCancelView({deferred:n,destination:this.getDestination()});n.promise.then(u.bind(this.confirmed,this)).fail(u.bind(this.cancelled,this)).done()},testView:function(){var t=e("../views/multiView").MultiView;new t({childViews:[{type:"GitDemonstrationView",options:this.getExportObj()}]})},getExportObj:function(){return{beforeMarkdowns:this.beforeMarkdownView.exportToArray(),afterMarkdowns:this.afterMarkdownView.exportToArray(),command:this.commandView.getText(),beforeCommand:this.beforeCommandView.getText()}},confirmed:function(){this.die(),this.deferred.resolve(this.getExportObj())},cancelled:function(){this.die(),this.deferred.resolve()},getInsideElement:function(){return this.$(".insideBuilder")[0]}}),b=d.extend({tagName:"div",className:"multiViewBuilder box vertical",template:u.template($("#multi-view-builder").html()),typeToConstructor:{ModalAlert:m,GitDemonstrationView:y},events:{"click div.deleteButton":"deleteOneView","click div.testButton":"testOneView","click div.editButton":"editOneView","click div.testEntireView":"testEntireView","click div.addView":"addView","click div.saveView":"saveView","click div.cancelView":"cancel"},initialize:function(e){e=e||{},this.deferred=e.deferred||a.defer(),this.multiViewJSON=e.multiViewJSON||{},this.JSON={views:this.getChildViews(),supportedViews:u.keys(this.typeToConstructor)},this.container=new p({title:"Build a MultiView!"}),this.render(),this.show()},saveView:function(){this.hide(),this.deferred.resolve(this.multiViewJSON)},cancel:function(){this.hide(),this.deferred.resolve()},addView:function(e){var t=e.srcElement,n=$(t).attr("data-type"),r=a.defer(),i=this.typeToConstructor[n],s=new i({deferred:r});r.promise.then(u.bind(function(){var e={type:n,options:s.getExportObj()};this.addChildViewObj(e)},this)).fail(function(){}).done()},testOneView:function(t){var n=t.srcElement,r=$(n).attr("data-index"),i=this.getChildViews()[r],s=e("../views/multiView").MultiView;new s({childViews:[i]})},testEntireView:function(){var t=e("../views/multiView").MultiView;new t({childViews:this.getChildViews()})},editOneView:function(e){var t=e.srcElement,n=$(t).attr("data-index"),r=$(t).attr("data-type"),i=a.defer(),s=new this.typeToConstructor[r]({deferred:i,fromObj:this.getChildViews()[n]});i.promise.then(u.bind(function(){var e={type:r,options:s.getExportObj()},t=this.getChildViews();t[n]=e,this.setChildViews(t)},this)).fail(function(){}).done()},deleteOneView:function(e){var t=e.srcElement,n=$(t).attr("data-index"),r=this.getChildViews(),i=r.slice(0,n).concat(r.slice(n+1));this.setChildViews(i),this.update()},addChildViewObj:function(e,t){var n=this.getChildViews();n.push(e),this.setChildViews(n),this.update()},setChildViews:function(e){this.multiViewJSON.childViews=e},getChildViews:function(){return this.multiViewJSON.childViews||[]},update:function(){this.JSON.views=this.getChildViews(),this.renderAgain()}});n.MarkdownGrabber=m,n.DemonstrationBuilder=y,n.TextGrabber=v,n.MultiViewBuilder=b,n.MarkdownPresenter=g}),e("/src/js/views/builderViews.js"),e.define("/src/js/views/commandViews.js",function(e,t,n,r,i,s,o){var u=e("underscore"),a=e("../util").isBrowser()?a=window.Backbone:a=e("backbone"),f=e("../models/collections").CommandEntryCollection,l=e("../app"),c=e("../models/commandModel").Command,h=e("../models/commandModel").CommandEntry,p=e("../util/errors"),d=p.Warning,v=e("../util"),m=e("../util/keyboard"),g=a.View.extend({initialize:function(e){l.getEvents().on("commandSubmittedPassive",this.addToCommandHistory,this),this.commands=new f,this.commands.fetch({success:u.bind(function(){var e=[];this.commands.each(function(t){e.push(t)}),e.reverse(),this.commands.reset(),u.each(e,function(e){this.commands.add(e)},this)},this)}),this.index=-1,this.commandParagraph=this.$("#prompt p.command")[0],this.commandCursor=this.$("#prompt span.cursor")[0],this.focus(),l.getEvents().on("rollupCommands",this.rollupCommands,this),l.getEventBaton().stealBaton("keydown",this.onKeyDown,this),l.getEventBaton().stealBaton("keyup",this.onKeyUp,this)},events:{"blur #commandTextField":"hideCursor","focus #commandTextField":"showCursor"},blur:function(){this.hideCursor()},focus:function(){this.$("#commandTextField").focus(),this.showCursor()},hideCursor:function(){this.toggleCursor(!1)},showCursor:function(){this.toggleCursor(!0)},toggleCursor:function(e){$(this.commandCursor).toggleClass("shown",e)},onKeyDown:function(e){var t=e.srcElement;this.updatePrompt(t)},onKeyUp:function(e){this.onKeyDown(e);var t={enter:u.bind(function(){this.submit()},this),up:u.bind(function(){this.commandSelectChange(1)},this),down:u.bind(function(){this.commandSelectChange(-1)},this)},n=m.mapKeycodeToKey(e.which||e.keyCode);t[n]!==undefined&&(e.preventDefault(),t[n](),this.onKeyDown(e))},badHtmlEncode:function(e){return e.replace(/&/g,"&").replace(/=this.commands.length||this.index<0){this.clear(),this.index=-1;return}var t=this.commands.toArray()[this.index].get("text");this.setTextField(t)},clearLocalStorage:function(){this.commands.each(function(e){a.sync("delete",e,function(){})},this)},setTextField:function(e){this.$("#commandTextField").val(e)},clear:function(){this.setTextField("")},submit:function(){var e=this.$("#commandTextField").val().replace("\n","");this.clear(),this.submitCommand(e),this.index=-1},rollupCommands:function(e){var t=this.commands.toArray().slice(1,Number(e)+1);t.reverse();var n="";u.each(t,function(e){n+=e.get("text")+";"},this);var r=new h({text:n});this.commands.unshift(r),a.sync("create",r,function(){})},addToCommandHistory:function(e){var t=e.length&&this.index===-1||e.length&&this.index!==-1&&this.commands.toArray()[this.index].get("text")!==e;if(!t)return;var n=new h({text:e});this.commands.unshift(n),a.sync("create",n,function(){}),this.commands.length>100&&this.clearLocalStorage()},submitCommand:function(e){l.getEventBaton().trigger("commandSubmitted",e)}}),y=a.View.extend({tagName:"div",model:c,template:u.template($("#command-template").html()),events:{click:"clicked"},clicked:function(e){},initialize:function(){this.model.bind("change",this.wasChanged,this),this.model.bind("destroy",this.remove,this)},wasChanged:function(e,t){var n=t.changes,r=u.keys(n);u.difference(r,["status"]).length===0?this.updateStatus():this.render()},updateStatus:function(){var e=["inqueue","processing","finished"],t={};u.each(e,function(e){t[e]=!1}),t[this.model.get("status")]=!0;var n=this.$("p.commandLine");u.each(t,function(e,t){n.toggleClass(t,e)})},render:function(){var e=u.extend({resultType:"",result:"",formattedWarnings:this.model.getFormattedWarnings()},this.model.toJSON());return this.$el.html(this.template(e)),this},remove:function(){$(this.el).hide()}}),b=a.View.extend({initialize:function(e){this.collection=e.collection,this.collection.on("add",this.addOne,this),this.collection.on("reset",this.addAll,this),this.collection.on("all",this.render,this),this.collection.on("change",this.scrollDown,this),l.getEvents().on("commandScrollDown",this.scrollDown,this),l.getEvents().on("clearOldCommands",this.clearOldCommands,this)},addWarning:function(e){var t=new d({msg:e}),n=new c({error:t,rawStr:"Warning:"});this.collection.add(n)},clearOldCommands:function(){var e=[];this.collection.each(function(t){t.get("status")!=="inqueue"&&t.get("status")!=="processing"&&e.push(t)},this),u.each(e,function(e){e.destroy()},this),this.scrollDown()},scrollDown:function(){var e=$("#commandDisplay")[0],t=$("#terminal")[0],n=e.clientHeight>t.clientHeight;$(t).toggleClass("scrolling",n),n&&(t.scrollTop=t.scrollHeight)},addOne:function(e){var t=new y({model:e});this.$("#commandDisplay").append(t.render().el),this.scrollDown()},addAll:function(){this.collection.each(this.addOne)}});n.CommandPromptView=g,n.CommandLineHistoryView=b}),e("/src/js/views/commandViews.js"),e.define("/src/js/views/gitDemonstrationView.js",function(e,t,n,r,i,s,o){var u=e("underscore"),a=e("q"),f=e("../util").isBrowser()?window.Backbone:e("backbone"),l=e("../util"),c=e("../util/keyboard").KeyboardListener,h=e("../models/commandModel").Command,p=e("../views").ModalTerminal,d=e("../views").ContainedBase,v=e("../visuals/visualization").Visualization,m=d.extend({tagName:"div",className:"gitDemonstrationView box horizontal",template:u.template($("#git-demonstration-view").html()),events:{"click div.command > p.uiButton":"positive"},initialize:function(t){t=t||{},this.options=t,this.JSON=u.extend({beforeMarkdowns:["## Git Commits","","Awesome!"],command:"git commit",afterMarkdowns:["Now you have seen it in action","","Go ahead and try the level!"]},t);var n=function(t){return e("markdown").markdown.toHTML(t.join("\n"))};this.JSON.beforeHTML=n(this.JSON.beforeMarkdowns),this.JSON.afterHTML=n(this.JSON.afterMarkdowns),this.container=new p({title:t.title||"Git Demonstration"}),this.render(),this.checkScroll(),this.navEvents=u.clone(f.Events),this.navEvents.on("positive",this.positive,this),this.navEvents.on("negative",this.negative,this),this.keyboardListener=new c({events:this.navEvents,aliasMap:{enter:"positive",right:"positive",left:"negative"},wait:!0}),this.visFinished=!1,this.initVis(),t.wait||this.show()},receiveMetaNav:function(e,t){var n=this;e.navEvents.on("positive",this.positive,this),this.metaContainerView=t},checkScroll:function(){var e=this.$("div.demonstrationText").children(),t=u.map(e,function(e){return e.clientHeight}),n=u.reduce(t,function(e,t){return e+t});nc.VIEWPORT.minWidth&&e.h>c.VIEWPORT.minHeight&&this.finish()}}),L=C.extend({initialize:function(e){if(!e||!e.level)throw new Error("need level");this.eventBatonName="zoomChange",this.markdowns=["## That zoom level of "+e.level+" is not supported :-/","Please zoom back to a supported zoom level with Ctrl + and Ctrl -","","(and of course, pull requests to fix this are appreciated :D)"],L.__super__.initialize.apply(this,[e])},batonFired:function(e){e<=c.VIEWPORT.maxZoom&&e>=c.VIEWPORT.minZoom&&this.finish()}}),A=d.extend({tagName:"div",className:"levelToolbarHolder",template:u.template($("#level-toolbar-template").html()),initialize:function(e){e=e||{},this.JSON={name:e.name||"Some level! (unknown name)"},this.beforeDestination=$($("#commandLineHistory div.toolbar")[0]),this.render(),e.wait||s.nextTick(u.bind(this.show,this))},getAnimationTime:function(){return 700},render:function(){var e=this.template(this.JSON);this.$el.html(e),this.beforeDestination.after(this.el)},die:function(){this.hide(),setTimeout(u.bind(function(){this.tearDown()},this),this.getAnimationTime())},hide:function(){this.$("div.toolbar").toggleClass("hidden",!0)},show:function(){this.$("div.toolbar").toggleClass("hidden",!1)}}),O=d.extend({tagName:"div",className:"canvasTerminalHolder box flex1",template:u.template($("#terminal-window-bare-template").html()),events:{"click div.wrapper":"onClick"},initialize:function(e){e=e||{},this.destination=$("body"),this.JSON={title:e.title||"Goal To Reach",text:e.text||'You can hide this window with "hide goal"'},this.render(),e.additionalClass&&this.$el.addClass(e.additionalClass)},getAnimationTime:function(){return 700},onClick:function(){this.slideOut()},die:function(){this.slideOut(),setTimeout(u.bind(function(){this.tearDown()},this))},slideOut:function(){this.slideToggle(!0)},slideIn:function(){this.slideToggle(!1)},slideToggle:function(e){this.$("div.terminal-window-holder").toggleClass("slideOut",e)},getCanvasLocation:function(){return this.$("div.inside")[0]}});n.BaseView=d,n.GeneralButton=y,n.ModalView=E,n.ModalTerminal=S,n.ModalAlert=x,n.ContainedBase=g,n.ConfirmCancelView=b,n.LeftRightView=w,n.ZoomAlertWindow=L,n.ConfirmCancelTerminal=T,n.WindowSizeAlertWindow=k,n.CanvasTerminalHolder=O,n.LevelToolbar=A,n.NextLevelConfirm=N}),e("/src/js/views/index.js"),e.define("/src/js/views/levelDropdownView.js",function(e,t,n,r,i,s,o){var u=e("underscore"),a=e("q"),f=e("../util").isBrowser()?window.Backbone:e("backbone"),l=e("../util"),c=e("../util/keyboard").KeyboardListener,h=e("../app"),p=e("../views").ModalTerminal,d=e("../views").ContainedBase,v=e("../views").BaseView,m=d.extend({tagName:"div",className:"levelDropdownView box vertical",template:u.template($("#level-dropdown-view").html()),initialize:function(e){e=e||{},this.JSON={},this.navEvents=u.clone(f.Events),this.navEvents.on("clickedID",u.debounce(u.bind(this.loadLevelID,this),300,!0)),this.navEvents.on("negative",this.negative,this),this.navEvents.on("positive",this.positive,this),this.navEvents.on("left",this.left,this),this.navEvents.on("right",this.right,this),this.navEvents.on("up",this.up,this),this.navEvents.on("down",this.down,this),this.keyboardListener=new c({events:this.navEvents,aliasMap:{esc:"negative",enter:"positive"},wait:!0}),this.sequences=h.getLevelArbiter().getSequences(),this.sequenceToLevels=h.getLevelArbiter().getSequenceToLevels(),this.container=new p({title:"Select a Level"}),this.render(),this.buildSequences(),e.wait||this.show()},positive:function(){if(!this.selectedID)return;this.loadLevelID(this.selectedID)},left:function(){if(this.turnOnKeyboardSelection())return;this.leftOrRight(-1)},leftOrRight:function(e){this.deselectIconByID(this.selectedID),this.selectedIndex=this.wrapIndex(this.selectedIndex+e,this.getCurrentSequence()),this.selectedID=this.getSelectedID(),this.selectIconByID(this.selectedID)},right:function(){if(this.turnOnKeyboardSelection())return;this.leftOrRight(1)},up:function(){if(this.turnOnKeyboardSelection())return;this.selectedSequence=this.getPreviousSequence(),this.downOrUp()},down:function(){if(this.turnOnKeyboardSelection())return;this.selectedSequence=this.getNextSequence(),this.downOrUp()},downOrUp:function(){this.selectedIndex=this.boundIndex(this.selectedIndex,this.getCurrentSequence()),this.deselectIconByID(this.selectedID),this.selectedID=this.getSelectedID(),this.selectIconByID(this.selectedID)},turnOnKeyboardSelection:function(){return this.selectedID?!1:(this.selectFirst(),!0)},turnOffKeyboardSelection:function(){if(!this.selectedID)return;this.deselectIconByID(this.selectedID),this.selectedID=undefined,this.selectedIndex=undefined,this.selectedSequence=undefined},wrapIndex:function(e,t){return e=e>=t.length?0:e,e=e<0?t.length-1:e,e},boundIndex:function(e,t){return e=e>=t.length?t.length-1:e,e=e<0?0:e,e},getNextSequence:function(){var e=this.getSequenceIndex(this.selectedSequence),t=this.wrapIndex(e+1,this.sequences);return this.sequences[t]},getPreviousSequence:function(){var e=this.getSequenceIndex(this.selectedSequence),t=this.wrapIndex(e-1,this.sequences);return this.sequences[t]},getSequenceIndex:function(e){var t=this.sequences.indexOf(e);if(t<0)throw new Error("didnt find");return t},getIndexForID:function(e){return h.getLevelArbiter().getLevel(e).index},selectFirst:function(){var e=this.sequenceToLevels[this.sequences[0]][0].id;this.selectIconByID(e),this.selectedIndex=0,this.selectedSequence=this.sequences[0]},getCurrentSequence:function(){return this.sequenceToLevels[this.selectedSequence]},getSelectedID:function(){return this.sequenceToLevels[this.selectedSequence][this.selectedIndex].id},selectIconByID:function(e){this.toggleIconSelect(e,!0)},deselectIconByID:function(e){this.toggleIconSelect(e,!1)},toggleIconSelect:function(e,t){this.selectedID=e;var n="#levelIcon-"+e;$(n).toggleClass("selected",t)},negative:function(){this.hide()},testOption:function(e){return this.currentCommand&&(new RegExp("--"+e)).test(this.currentCommand.get("rawStr"))},show:function(e,t){this.currentCommand=t,this.updateSolvedStatus(),this.showDeferred=e,this.keyboardListener.listen(),m.__super__.show.apply(this)},hide:function(){this.showDeferred&&this.showDeferred.resolve(),this.showDeferred=undefined,this.keyboardListener.mute(),this.turnOffKeyboardSelection(),m.__super__.hide.apply(this)},loadLevelID:function(e){this.testOption("noOutput")||h.getEventBaton().trigger("commandSubmitted","level "+e),this.hide()},updateSolvedStatus:function(){u.each(this.seriesViews,function(e){e.updateSolvedStatus()},this)},buildSequences:function(){this.seriesViews=[],u.each(this.sequences,function(e){this.seriesViews.push(new g({destination:this.$el,name:e,navEvents:this.navEvents}))},this)}}),g=v.extend({tagName:"div",className:"seriesView box flex1 vertical",template:u.template($("#series-view").html()),events:{"click div.levelIcon":"click"},initialize:function(e){this.name=e.name||"intro",this.navEvents=e.navEvents,this.info=h.getLevelArbiter().getSequenceInfo(this.name),this.levels=h.getLevelArbiter().getLevelsInSequence(this.name),this.levelIDs=[],u.each(this.levels,function(e){this.levelIDs.push(e.id)},this),this.destination=e.destination,this.JSON={displayName:this.info.displayName,about:this.info.about,ids:this.levelIDs},this.render(),this.updateSolvedStatus()},updateSolvedStatus:function(){var e=this.$("div.levelIcon").each(function(e,t){var n=$(t).attr("data-id");$(t).toggleClass("solved",h.getLevelArbiter().isLevelSolved(n))})},click:function(e){var t=e.srcElement||e.currentTarget;if(!t){console.warn("wut, no id");return}var n=$(t).attr("data-id");this.navEvents.trigger("clickedID",n)}});n.LevelDropdownView=m}),e("/src/js/views/levelDropdownView.js"),e.define("/src/js/views/multiView.js",function(e,t,n,r,i,s,o){var u=e("underscore"),a=e("q"),f=e("../util").isBrowser()?window.Backbone:e("backbone"),l=e("../views").ModalTerminal,c=e("../views").ContainedBase,h=e("../views").ConfirmCancelView,p=e("../views").LeftRightView,d=e("../views").ModalAlert,v=e("../views/gitDemonstrationView").GitDemonstrationView,m=e("../views/builderViews"),g=m.MarkdownPresenter,y=e("../util/keyboard").KeyboardListener,b=e("../util/errors").GitError,w=f.View.extend({tagName:"div",className:"multiView",navEventDebounce:550,deathTime:700,typeToConstructor:{ModalAlert:d,GitDemonstrationView:v,MarkdownPresenter:g},initialize:function(e){e=e||{},this.childViewJSONs=e.childViews||[{type:"ModalAlert",options:{markdown:"Woah wtf!!"}},{type:"GitDemonstrationView",options:{command:"git checkout -b side; git commit; git commit"}},{type:"ModalAlert",options:{markdown:"Im second"}}],this.deferred=e.deferred||a.defer(),this.childViews=[],this.currentIndex=0,this.navEvents=u.clone(f.Events),this.navEvents.on("negative",this.getNegFunc(),this),this.navEvents.on("positive",this.getPosFunc(),this),this.navEvents.on("quit",this.finish,this),this.keyboardListener=new y({events:this.navEvents,aliasMap:{left:"negative",right:"positive",enter:"positive",esc:"quit"}}),this.render(),e.wait||this.start()},onWindowFocus:function(){},getAnimationTime:function(){return 700},getPromise:function(){return this.deferred.promise},getPosFunc:function(){return u.debounce(u.bind(function(){this.navForward()},this),this.navEventDebounce,!0)},getNegFunc:function(){return u.debounce(u.bind(function(){this.navBackward()},this),this.navEventDebounce,!0)},lock:function(){this.locked=!0},unlock:function(){this.locked=!1},navForward:function(){if(this.locked)return;if(this.currentIndex===this.childViews.length-1){this.hideViewIndex(this.currentIndex),this.finish();return}this.navIndexChange(1)},navBackward:function(){if(this.currentIndex===0)return;this.navIndexChange(-1)},navIndexChange:function(e){this.hideViewIndex(this.currentIndex),this.currentIndex+=e,this.showViewIndex(this.currentIndex)},hideViewIndex:function(e){this.childViews[e].hide()},showViewIndex:function(e){this.childViews[e].show()},finish:function(){this.keyboardListener.mute(),u.each(this.childViews,function(e){e.die()}),this.deferred.resolve()},start:function(){this.showViewIndex(this.currentIndex)},createChildView:function(e){var t=e.type;if(!this.typeToConstructor[t])throw new Error('no constructor for type "'+t+'"');var n=new this.typeToConstructor[t](u.extend({},e.options,{wait:!0}));return n},addNavToView:function(e,t){var n=new p({events:this.navEvents,destination:e.getDestination(),showLeft:t!==0,lastNav:t===this.childViewJSONs.length-1});e.receiveMetaNav&&e.receiveMetaNav(n,this)},render:function(){u.each(this.childViewJSONs,function(e,t){var n=this.createChildView(e);this.childViews.push(n),this.addNavToView(n,t)},this)}});n.MultiView=w}),e("/src/js/views/multiView.js"),e.define("/src/js/views/rebaseView.js",function(e,t,n,r,i,s,o){var u=e("../util/errors").GitError,a=e("underscore"),f=e("q"),l=e("../util").isBrowser()?window.Backbone:e("backbone"),c=e("../views").ModalTerminal,h=e("../views").ContainedBase,p=e("../views").ConfirmCancelView,d=e("../views").LeftRightView,v=h.extend({tagName:"div",template:a.template($("#interactive-rebase-template").html()),initialize:function(e){this.deferred=e.deferred,this.rebaseMap={},this.entryObjMap={},this.rebaseEntries=new g,e.toRebase.reverse(),a.each(e.toRebase,function(e){var t=e.get("id");this.rebaseMap[t]=e,this.entryObjMap[t]=new m({id:t}),this.rebaseEntries.add(this.entryObjMap[t])},this),this.container=new c({title:"Interactive Rebase"}),this.render(),this.show()},confirm:function(){this.die();var e=[];this.$("ul.rebaseEntries li").each(function(t,n){e.push(n.id)});var t=[];a.each(e,function(e){this.entryObjMap[e].get("pick")&&t.unshift(this.rebaseMap[e])},this),t.reverse(),this.deferred.resolve(t),this.$el.html("")},render:function(){var e={num:a.keys(this.rebaseMap).length},t=this.container.getInsideElement();this.$el.html(this.template(e)),$(t).append(this.el);var n=this.$("ul.rebaseEntries");this.rebaseEntries.each(function(e){new y({el:n,model:e})},this),n.sortable({axis:"y",placeholder:"rebaseEntry transitionOpacity ui-state-highlight",appendTo:"parent"}),this.makeButtons()},makeButtons:function(){var e=f.defer();e.promise.then(a.bind(function(){this.confirm()},this)).fail(a.bind(function(){this.hide(),this.deferred.resolve([])},this)).done(),new p({destination:this.$(".confirmCancel"),deferred:e})}}),m=l.Model.extend({defaults:{pick:!0},toggle:function(){this.set("pick",!this.get("pick"))}}),g=l.Collection.extend({model:m}),y=l.View.extend({tagName:"li",template:a.template($("#interactive-rebase-entry-template").html()),toggle:function(){this.model.toggle(),this.listEntry.toggleClass("notPicked",!this.model.get("pick"))},initialize:function(e){this.render()},render:function(){var e=this.model.toJSON();this.$el.append(this.template(this.model.toJSON())),this.listEntry=this.$el.children(":last"),this.listEntry.delegate("#toggleButton","click",a.bind(function(){this.toggle()},this))}});n.InteractiveRebaseView=v}),e("/src/js/views/rebaseView.js"),e.define("/src/js/visuals/animation/animationFactory.js",function(e,t,n,r,i,s,o){var u=e("underscore"),a=e("backbone"),f=e("./index").Animation,l=e("../../util/constants").GRAPHICS,c=function(){};c.prototype.genCommitBirthAnimation=function(e,t,n){if(!e)throw new Error("Need animation queue to add closure to!");var r=l.defaultAnimationTime*1,i=r*2,s=t.get("visNode"),o=function(){n.refreshTree(r),s.setBirth(),s.parentInFront(),n.visBranchesFront(),s.animateUpdatedPosition(i,"bounce"),s.animateOutgoingEdges(r)};e.add(new f({closure:o,duration:Math.max(r,i)}))},c.prototype.overrideOpacityDepth2=function(e,t){t=t===undefined?1:t;var n={};return u.each(e,function(e,r){n[r]={},u.each(e,function(e,i){i=="opacity"?n[r][i]=t:n[r][i]=e})}),n},c.prototype.overrideOpacityDepth3=function(e,t){var n={};return u.each(e,function(e,r){n[r]=this.overrideOpacityDepth2(e,t)},this),n},c.prototype.genCommitBirthClosureFromSnapshot=function(e,t){var n=l.defaultAnimationTime*1,r=n*1.5,i=e.newCommit.get("visNode"),s=this.overrideOpacityDepth2(e.afterSnapshot[i.getID()]),o=this.overrideOpacityDepth3(e.afterSnapshot),u=function(){i.setBirthFromSnapshot(e.beforeSnapshot),i.parentInFront(),t.visBranchesFront(),i.animateToAttr(s,r,"bounce"),i.animateOutgoingEdgesToAttr(o,r)};return u},c.prototype.refreshTree=function(e,t){e.add(new f({closure:function(){t.refreshTree()}}))},c.prototype.rebaseAnimation=function(e,t,n,r){this.rebaseHighlightPart(e,t,n),this.rebaseBirthPart(e,t,n,r)},c.prototype.rebaseHighlightPart=function(e,t,n){var r=l.defaultAnimationTime*.66,i=r*2,s=t.toRebaseArray,o=t.destinationBranch.get("visBranch");o||(o=t.destinationBranch.get("visNode")),u.each(s,function(t){var n=t.get("visNode");e.add(new f({closure:function(){n.highlightTo(o,i,"easeInOut")},duration:r*1.5}))},this),this.delay(e,r*2)},c.prototype.rebaseBirthPart=function(e,t,n,r){var i=t.rebaseSteps,s=[];u.each(i,function(e){var t=e.newCommit.get("visNode");s.push(t),t.setOpacity(0),t.setOutgoingEdgesOpacity(0)},this);var o=[];u.each(i,function(t,n){var i=s.slice(n+1),u=this.genFromToSnapshotAnimation(t.beforeSnapshot,t.afterSnapshot,i,o,r),a=this.genCommitBirthClosureFromSnapshot(t,r),c=function(){u(),a()};e.add(new f({closure:c,duration:l.defaultAnimationTime*1.5})),o.push(t.newCommit.get("visNode"))},this),this.delay(e),this.refreshTree(e,r)},c.prototype.delay=function(e,t){t=t||l.defaultAnimationTime,e.add(new f({closure:function(){},duration:t}))},c.prototype.genSetAllCommitOpacities=function(e,t){var n=e.slice(0);return function(){u.each(n,function(e){e.setOpacity(t),e.setOutgoingEdgesOpacity(t)})}},c.prototype.stripObjectsFromSnapshot=function(e,t){var n=[];u.each(t,function(e){n.push(e.getID())});var r={};return u.each(e,function(e,t){if(u.include(n,t))return;r[t]=e},this),r},c.prototype.genFromToSnapshotAnimation=function(e,t,n,r,i){var s=[];u.each(n,function(e){s.push(e),s=s.concat(e.get("outgoingEdges"))});var o=function(e){if(!e)return;u.each(e,function(t,n){e[n].opacity=1})};return u.each([e,t],function(e){u.each(r,function(t){o(e[t.getID()]),u.each(t.get("outgoingEdges"),function(t){o(e[t.getID()])})})}),function(){i.animateAllFromAttrToAttr(e,t,s)}},n.AnimationFactory=c}),e("/src/js/visuals/animation/animationFactory.js"),e.define("/src/js/visuals/animation/index.js",function(e,t,n,r,i,s,o){var u=e("underscore"),a=e("backbone"),f=e("../../util/constants").GLOBAL,l=a.Model.extend({defaults:{duration:300,closure:null},validateAtInit:function(){if(!this.get("closure"))throw new Error("give me a closure!")},initialize:function(e){this.validateAtInit()},run:function(){this.get("closure")()}}),c=a.Model.extend({defaults:{animations:null,index:0,callback:null,defer:!1},initialize:function(e){this.set("animations",[]),e.callback||console.warn("no callback")},add:function(e){if(!e instanceof l)throw new Error("Need animation not something else");this.get("animations").push(e)},start:function(){this.set("index",0),f.isAnimating=!0,this.next()},finish:function(){f.isAnimating=!1,this.get("callback")()},next:function(){var e=this.get("animations"),t=this.get("index");if(t>=e.length){this.finish();return}var n=e[t],r=n.get("duration");n.run(),this.set("index",t+1),setTimeout(u.bind(function(){this.next()},this),r)}});n.Animation=l,n.AnimationQueue=c}),e("/src/js/visuals/animation/index.js"),e.define("/src/js/visuals/index.js",function(e,t,n,r,i,s,o){function w(t){t=t||{},this.options=t,this.commitCollection=t.commitCollection,this.branchCollection=t.branchCollection,this.visNodeMap={},this.visEdgeCollection=new b,this.visBranchCollection=new g,this.commitMap={},this.rootCommit=null,this.branchStackMap=null,this.upstreamBranchSet=null,this.upstreamHeadSet=null,this.paper=t.paper,this.gitReady=!1,this.branchCollection.on("add",this.addBranchFromEvent,this),this.branchCollection.on("remove",this.removeBranch,this),this.deferred=[],this.posBoundaries={min:0,max:1};var n=e("../app");n.getEvents().on("refreshTree",this.refreshTree,this)}function E(e){var t=0,n=0,r=0,i=0,s=e.length;u.each(e,function(e){var s=e.split("(")[1];s=s.split(")")[0],s=s.split(","),r+=parseFloat(s[1]),i+=parseFloat(s[2]);var o=parseFloat(s[0]),u=o*Math.PI*2;t+=Math.cos(u),n+=Math.sin(u)}),t/=s,n/=s,r/=s,i/=s;var o=Math.atan2(n,t)/(Math.PI*2);return o<0&&(o+=1),"hsb("+String(o)+","+String(r)+","+String(i)+")"}var u=e("underscore"),a=e("q"),f=e("backbone"),l=e("../util/constants").GRAPHICS,c=e("../util/constants").GLOBAL,h=e("../models/collections"),p=h.CommitCollection,d=h.BranchCollection,v=e("../visuals/visNode").VisNode,m=e("../visuals/visBranch").VisBranch,g=e("../visuals/visBranch").VisBranchCollection,y=e("../visuals/visEdge").VisEdge,b=e("../visuals/visEdge").VisEdgeCollection;w.prototype.defer=function(e){this.deferred.push(e)},w.prototype.deferFlush=function(){u.each(this.deferred,function(e){e()},this),this.deferred=[]},w.prototype.resetAll=function(){var e=this.visEdgeCollection.toArray();u.each(e,function(e){e.remove()},this);var t=this.visBranchCollection.toArray();u.each(t,function(e){e.remove()},this),u.each(this.visNodeMap,function(e){e.remove()},this),this.visEdgeCollection.reset(),this.visBranchCollection.reset(),this.visNodeMap={},this.rootCommit=null,this.commitMap={}},w.prototype.tearDown=function(){this.resetAll(),this.paper.remove()},w.prototype.assignGitEngine=function(e){this.gitEngine=e,this.initHeadBranch(),this.deferFlush()},w.prototype.initHeadBranch=function(){this.addBranchFromEvent(this.gitEngine.HEAD)},w.prototype.getScreenPadding=function(){return{widthPadding:l.nodeRadius*1.5,heightPadding:l.nodeRadius*1.5}},w.prototype.toScreenCoords=function(e){if(!this.paper.width)throw new Error("being called too early for screen coords");var t=this.getScreenPadding(),n=function(e,t,n){return n+e*(t-n*2)};return{x:n(e.x,this.paper.width,t.widthPadding),y:n(e.y,this.paper.height,t.heightPadding)}},w.prototype.animateAllAttrKeys=function(e,t,n,r){var i=a.defer(),s=function(i){i.animateAttrKeys(e,t,n,r)};this.visBranchCollection.each(s),this.visEdgeCollection.each(s),u.each(this.visNodeMap,s);var o=n!==undefined?n:l.defaultAnimationTime;return setTimeout(function(){i.resolve()},o),i.promise},w.prototype.finishAnimation=function(){var e=this,t=a.defer(),n=a.defer(),r=l.defaultAnimationTime,i=l.nodeRadius,s="Solved!!\n:D",o=null,f=u.bind(function(){o=this.paper.text(this.paper.width/2,this.paper.height/2,s),o.attr({opacity:0,"font-weight":500,"font-size":"32pt","font-family":"Monaco, Courier, font-monospace",stroke:"#000","stroke-width":2,fill:"#000"}),o.animate({opacity:1},r)},this);return t.promise.then(u.bind(function(){return this.animateAllAttrKeys({exclude:["circle"]},{opacity:0},r*1.1)},this)).then(u.bind(function(){return this.animateAllAttrKeys({exclude:["arrow","rect","path","text"]},{r:i*2},r*1.5)},this)).then(u.bind(function(){return this.animateAllAttrKeys({exclude:["arrow","rect","path","text"]},{r:i*.75},r*.5)},this)).then(u.bind(function(){return f(),this.explodeNodes()},this)).then(u.bind(function(){return this.explodeNodes()},this)).then(u.bind(function(){return this.animateAllAttrKeys({exclude:["arrow","rect","path","text"]},{},r*1.25)},this)).then(u.bind(function(){return o.animate({opacity:0},r,undefined,undefined,function(){o.remove()}),this.animateAllAttrKeys({},{})},this)).then(function(){n.resolve()}).fail(function(e){console.warn("animation error"+e)}).done(),t.resolve(),n.promise},w.prototype.explodeNodes=function(){var e=a.defer(),t=[];u.each(this.visNodeMap,function(e){t.push(e.getExplodeStepFunc())});var n=setInterval(function(){var r=[];u.each(t,function(e){e()&&r.push(e)});if(!r.length){clearInterval(n),e.resolve();return}t=r},.025);return e.promise},w.prototype.animateAllFromAttrToAttr=function(e,t,n){var r=function(r){var i=r.getID();if(u.include(n,i))return;if(!e[i]||!t[i])return;r.animateFromAttrToAttr(e[i],t[i])};this.visBranchCollection.each(r),this.visEdgeCollection.each(r),u.each(this.visNodeMap,r)},w.prototype.genSnapshot=function(){this.fullCalc();var e={};return u.each(this.visNodeMap,function(t){e[t.get("id")]=t.getAttributes()},this),this.visBranchCollection.each(function(t){e[t.getID()]=t.getAttributes()},this),this.visEdgeCollection.each(function(t){e[t.getID()]=t.getAttributes()},this),e},w.prototype.refreshTree=function(e){if(!this.gitReady||!this.gitEngine.rootCommit)return;this.fullCalc(),this.animateAll(e)},w.prototype.refreshTreeHarsh=function(){this.fullCalc(),this.animateAll(0)},w.prototype.animateAll=function(e){this.zIndexReflow(),this.animateEdges(e),this.animateNodePositions(e),this.animateRefs(e)},w.prototype.fullCalc=function(){this.calcTreeCoords(),this.calcGraphicsCoords()},w.prototype.calcTreeCoords=function(){if(!this.rootCommit)throw new Error("grr, no root commit!");this.calcUpstreamSets(),this.calcBranchStacks(),this.calcDepth(),this.calcWidth()},w.prototype.calcGraphicsCoords=function(){this.visBranchCollection.each(function(e){e.updateName()})},w.prototype.calcUpstreamSets=function(){this.upstreamBranchSet=this.gitEngine.getUpstreamBranchSet(),this.upstreamHeadSet=this.gitEngine.getUpstreamHeadSet()},w.prototype.getCommitUpstreamBranches=function(e){return this.branchStackMap[e.get("id")]},w.prototype.getBlendedHuesForCommit=function(e){var t=this.upstreamBranchSet[e.get("id")];if(!t)throw new Error("that commit doesnt have upstream branches!");return this.blendHuesFromBranchStack(t)},w.prototype.blendHuesFromBranchStack=function(e){var t=[];return u.each(e,function(e){var n=e.obj.get("visBranch").get("fill");if(n.slice(0,3)!=="hsb"){var r=Raphael.color(n);n="hsb("+String(r.h)+","+String(r.l),n=n+","+String(r.s)+")"}t.push(n)}),E(t)},w.prototype.getCommitUpstreamStatus=function(e){if(!this.upstreamBranchSet)throw new Error("Can't calculate this yet!");var t=e.get("id"),n=this.upstreamBranchSet,r=this.upstreamHeadSet;return n[t]?"branch":r[t]?"head":"none"},w.prototype.calcBranchStacks=function(){var e=this.gitEngine.getBranches(),t={};u.each(e,function(e){var n=e.target.get("id");t[n]=t[n]||[],t[n].push(e),t[n].sort(function(e,t){var n=e.obj.get("id"),r=t.obj.get("id");return n=="master"||r=="master"?n=="master"?-1:1:n.localeCompare(r)})}),this.branchStackMap=t},w.prototype.calcWidth=function(){this.maxWidthRecursive(this.rootCommit),this.assignBoundsRecursive(this.rootCommit,this.posBoundaries.min,this.posBoundaries.max)},w.prototype.maxWidthRecursive=function(e){var t=0;u.each(e.get("children"),function(n){if(n.isMainParent(e)){var r=this.maxWidthRecursive(n);t+=r}},this);var n=Math.max(1,t);return e.get("visNode").set("maxWidth",n),n},w.prototype.assignBoundsRecursive=function(e,t,n){var r=(t+n)/2;e.get("visNode").get("pos").x=r;if(e.get("children").length===0)return;var i=n-t,s=0,o=e.get("children");u.each(o,function(t){t.isMainParent(e)&&(s+=t.get("visNode").getMaxWidthScaled())},this);var a=t;u.each(o,function(t){if(!t.isMainParent(e))return;var n=t.get("visNode").getMaxWidthScaled(),r=n/s*i,o=a,u=o+r;this.assignBoundsRecursive(t,o,u),a=u},this)},w.prototype.calcDepth=function(){var e=this.calcDepthRecursive(this.rootCommit,0);e>15&&console.warn("graphics are degrading from too many layers");var t=this.getDepthIncrement(e);u.each(this.visNodeMap,function(e){e.setDepthBasedOn(t)},this)},w.prototype.animateNodePositions=function(e){u.each(this.visNodeMap,function(t){t.animateUpdatedPosition(e)},this)},w.prototype.addBranchFromEvent=function(e,t,n){var r=u.bind(function(){this.addBranch(e)},this);!this.gitEngine||!this.gitReady?this.defer(r):r()},w.prototype.addBranch=function(e){var t=new m({branch:e,gitVisuals:this,gitEngine:this.gitEngine});this.visBranchCollection.add(t),this.gitReady?t.genGraphics(this.paper):this.defer(u.bind(function(){t.genGraphics(this.paper)},this))},w.prototype.removeVisBranch=function(e){this.visBranchCollection.remove(e)},w.prototype.removeVisNode=function(e){this.visNodeMap[e.getID()]=undefined},w.prototype.removeVisEdge=function(e){this.visEdgeCollection.remove(e)},w.prototype.animateRefs=function(e){this.visBranchCollection.each(function(t){t.animateUpdatedPos(e)},this)},w.prototype.animateEdges=function(e){this.visEdgeCollection.each(function(t){t.animateUpdatedPath(e)},this)},w.prototype.getMinLayers=function(){return this.options.smallCanvas?4:7},w.prototype.getDepthIncrement=function(e){e=Math.max(e,this.getMinLayers());var t=1/e;return t},w.prototype.calcDepthRecursive=function(e,t){e.get("visNode").setDepth(t);var n=e.get("children"),r=t;return u.each(n,function(e){var n=this.calcDepthRecursive(e,t+1);r=Math.max(n,r)},this),r},w.prototype.canvasResize=function(e,t){this.resizeFunc||this.genResizeFunc(),this.resizeFunc(e,t)},w.prototype.genResizeFunc=function(){this.resizeFunc=u.debounce(u.bind(function(t,n){if(c.isAnimating){var r=e("../app");r.getEventBaton().trigger("commandSubmitted","refresh")}else this.refreshTree()},this),200,!0)},w.prototype.addNode=function(e,t){this.commitMap[e]=t,t.get("rootCommit")&&(this.rootCommit=t);var n=new v({id:e,commit:t,gitVisuals:this,gitEngine:this.gitEngine});return this.visNodeMap[e]=n,this.gitReady&&n.genGraphics(this.paper),n},w.prototype.addEdge=function(e,t){var n=this.visNodeMap[e],r=this.visNodeMap[t];if(!n||!r)throw new Error("one of the ids in ("+e+", "+t+") does not exist");var i=new y({tail:n,head:r,gitVisuals:this,gitEngine:this.gitEngine});this.visEdgeCollection.add(i),this.gitReady&&i.genGraphics(this.paper)},w.prototype.zIndexReflow=function(){this.visNodesFront(),this.visBranchesFront()},w.prototype.visNodesFront=function(){u.each(this.visNodeMap,function(e){e.toFront()})},w.prototype.visBranchesFront=function(){this.visBranchCollection.each(function(e){e.nonTextToFront(),e.textToFront()}),this.visBranchCollection.each(function(e){e.textToFrontIfInStack()})},w.prototype.drawTreeFromReload=function(){this.gitReady=!0,this.deferFlush(),this.calcTreeCoords()},w.prototype.drawTreeFirstTime=function(){this.gitReady=!0,this.calcTreeCoords(),u.each(this.visNodeMap,function(e){e.genGraphics(this.paper)},this),this.visEdgeCollection.each(function(e){e.genGraphics(this.paper)},this),this.visBranchCollection.each(function(e){e.genGraphics(this.paper)},this),this.zIndexReflow()},n.GitVisuals=w}),e("/src/js/visuals/index.js"),e.define("/src/js/visuals/tree.js",function(e,t,n,r,i,s,o){var u=e("underscore"),a=e("backbone"),f=a.Model.extend({removeKeys:function(e){u.each(e,function(e){this.get(e)&&this.get(e).remove()},this)},animateAttrKeys:function(e,t,n,r){e=u.extend({},{include:["circle","arrow","rect","path","text"],exclude:[]},e||{});var i=this.getAttributes();u.each(e.include,function(e){i[e]=u.extend({},i[e],t)}),u.each(e.exclude,function(e){delete i[e]}),this.animateToAttr(i,n,r)}});n.VisBase=f}),e("/src/js/visuals/tree.js"),e.define("/src/js/visuals/visBase.js",function(e,t,n,r,i,s,o){var u=e("underscore"),a=e("backbone"),f=a.Model.extend({removeKeys:function(e){u.each(e,function(e){this.get(e)&&this.get(e).remove()},this)},animateAttrKeys:function(e,t,n,r){e=u.extend({},{include:["circle","arrow","rect","path","text"],exclude:[]},e||{});var i=this.getAttributes();u.each(e.include,function(e){i[e]=u.extend({},i[e],t)}),u.each(e.exclude,function(e){delete i[e]}),this.animateToAttr(i,n,r)}});n.VisBase=f}),e("/src/js/visuals/visBase.js"),e.define("/src/js/visuals/visBranch.js",function(e,t,n,r,i,s,o){var u=e("underscore"),a=e("backbone"),f=e("../util/constants").GRAPHICS,l=e("../visuals/visBase").VisBase,c=function(){var e=Math.random(),t="hsb("+String(e)+",0.7,1)";return t},h=l.extend({defaults:{pos:null,text:null,rect:null,arrow:null,isHead:!1,flip:1,fill:f.rectFill,stroke:f.rectStroke,"stroke-width":f.rectStrokeWidth,offsetX:f.nodeRadius*4.75,offsetY:0,arrowHeight:14,arrowInnerSkew:0,arrowEdgeHeight:6,arrowLength:14,arrowOffsetFromCircleX:10,vPad:5,hPad:5,animationSpeed:f.defaultAnimationTime,animationEasing:f.defaultEasing},validateAtInit:function(){if(!this.get("branch"))throw new Error("need a branch!")},getID:function(){return this.get("branch").get("id")},initialize:function(){this.validateAtInit(),this.gitVisuals=this.get("gitVisuals"),this.gitEngine=this.get("gitEngine");if(!this.gitEngine)throw new Error("asd wtf");this.get("branch").set("visBranch",this);var e=this.get("branch").get("id");e=="HEAD"?(this.set("isHead",!0),this.set("flip",-1),this.set("fill",f.headRectFill)):e!=="master"&&this.set("fill",c())},getCommitPosition:function(){var e=this.gitEngine.getCommitFromRef(this.get("branch")),t=e.get("visNode"),n=this.get("gitVisuals").posBoundaries.max;return t.get("pos").x>n?this.set("flip",-1):this.set("flip",1),t.getScreenCoords()},getBranchStackIndex:function(){if(this.get("isHead"))return 0;var e=this.getBranchStackArray(),t=-1;return u.each(e,function(e,n){e.obj==this.get("branch")&&(t=n)},this),t},getBranchStackLength:function(){return this.get("isHead")?1:this.getBranchStackArray().length},getBranchStackArray:function(){var e=this.gitVisuals.branchStackMap[this.get("branch").get("target").get("id")];return e===undefined?(this.gitVisuals.calcBranchStacks(),this.getBranchStackArray()):e},getTextPosition:function(){var e=this.getCommitPosition(),t=this.getBranchStackIndex();return{x:e.x+this.get("flip")*this.get("offsetX"),y:e.y+t*f.multiBranchY+this.get("offsetY")}},getRectPosition:function(){var e=this.getTextPosition(),t=this.get("flip"),n=this.getTextSize();return{x:e.x-.5*n.w-this.get("hPad"),y:e.y-.5*n.h-this.get("vPad")}},getArrowPath:function(){var e=function(e,t,n){return{x:e.x+t,y:e.y+n}},t=function(e){return String(Math.round(e.x))+","+String(Math.round(e.y))},n=this.get("flip"),r=e(this.getCommitPosition(),n*this.get("arrowOffsetFromCircleX"),0),i=e(r,n*this.get("arrowLength"),-this.get("arrowHeight")),s=e(r,n*this.get("arrowLength"),this.get("arrowHeight")),o=e(i,n*this.get("arrowInnerSkew"),this.get("arrowEdgeHeight")),a=e(s,n*this.get("arrowInnerSkew"),-this.get("arrowEdgeHeight")),f=49,l=e(o,n*f,0),c=e(a,n*f,0),h="";h+="M"+t(l)+" ";var p=[o,i,r,s,a,c];return u.each(p,function(e){h+="L"+t(e)+" "},this),h+="z",h},getTextSize:function(){var e=function(e){var t=e.get("text")?e.get("text").node:null;return t===null?0:t.clientWidth},t=function(e){return e.w||(e.w=75),e.h||(e.h=20),e},n=this.get("text").node;if(this.get("isHead"))return t({w:n.clientWidth,h:n.clientHeight});var r=0;return u.each(this.getBranchStackArray(),function(t){r=Math.max(r,e(t.obj.get("visBranch")))}),t({w:r,h:n.clientHeight})},getSingleRectSize:function(){var e=this.getTextSize(),t=this.get("vPad"),n=this.get("hPad");return{w:e.w+t*2,h:e.h+n*2}},getRectSize:function(){var e=this.getTextSize(),t=this.get("vPad"),n=this.get("hPad"),r=this.getBranchStackLength();return{w:e.w+t*2,h:e.h*r*1.1+n*2}},getName:function(){var e=this.get("branch").get("id"),t=this.gitEngine.HEAD.get("target").get("id"),n=t==e?"*":"";return e+n},nonTextToFront:function(){this.get("arrow").toFront(),this.get("rect").toFront()},textToFront:function(){this.get("text").toFront()},textToFrontIfInStack:function(){this.getBranchStackIndex()!==0&&this.get("text").toFront()},getFill:function(){return this.get("isHead")||this.getBranchStackLength()==1||this.getBranchStackIndex()!==0?this.get("fill"):this.gitVisuals.blendHuesFromBranchStack(this.getBranchStackArray())},remove:function(){this.removeKeys(["text","arrow","rect"]),this.gitVisuals.removeVisBranch(this)},genGraphics:function(e){var t=this.getTextPosition(),n=this.getName(),r;r=e.text(t.x,t.y,String(n)),r.attr({"font-size":14,"font-family":"Monaco, Courier, font-monospace",opacity:this.getTextOpacity()}),this.set("text",r);var i=this.getRectPosition(),s=this.getRectSize(),o=e.rect(i.x,i.y,s.w,s.h,8).attr(this.getAttributes().rect);this.set("rect",o);var u=this.getArrowPath(),a=e.path(u).attr(this.getAttributes().arrow);this.set("arrow",a),this.attachClickHandlers(),o.toFront(),r.toFront()},attachClickHandlers:function(){if(this.get("gitVisuals").options.noClick)return;var t="git checkout "+this.get("branch").get("id"),n=e("../app"),r=[this.get("rect"),this.get("text"),this.get("arrow")];u.each(r,function(e){e.click(function(){n.getEventBaton().trigger("commandSubmitted",t)}),$(e.node).css("cursor","pointer")})},updateName:function(){this.get("text").attr({text:this.getName()})},getNonTextOpacity:function(){return this.get("isHead")?this.gitEngine.getDetachedHead()?1:0:this.getBranchStackIndex()===0?1:0},getTextOpacity:function(){return this.get("isHead")?this.gitEngine.getDetachedHead()?1:0:1},getAttributes:function(){var e=this.getNonTextOpacity(),t=this.getTextOpacity();this.updateName();var n=this.getTextPosition(),r=this.getRectPosition(),i=this.getRectSize(),s=this.getArrowPath();return{text:{x:n.x,y:n.y,opacity:t},rect:{x:r.x,y:r.y,width:i.w,height:i.h,opacity:e,fill:this.getFill(),stroke:this.get("stroke"),"stroke-width":this.get("stroke-width")},arrow:{path:s,opacity:e,fill:this.getFill(),stroke:this.get("stroke"),"stroke-width":this.get("stroke-width")}}},animateUpdatedPos:function(e,t){var n=this.getAttributes();this.animateToAttr(n,e,t)},animateFromAttrToAttr:function(e,t,n,r){this.animateToAttr(e,0),this.animateToAttr(t,n,r)},animateToAttr:function(e,t,n){if(t===0){this.get("text").attr(e.text),this.get("rect").attr(e.rect),this.get("arrow").attr(e.arrow);return}var r=t!==undefined?t:this.get("animationSpeed"),i=n||this.get("animationEasing");this.get("text").stop().animate(e.text,r,i),this.get("rect").stop().animate(e.rect,r,i),this.get("arrow").stop().animate(e.arrow,r,i)}}),p=a.Collection.extend({model:h});n.VisBranchCollection=p,n.VisBranch=h,n.randomHueString=c}),e("/src/js/visuals/visBranch.js"),e.define("/src/js/visuals/visEdge.js",function(e,t,n,r,i,s,o){var u=e("underscore"),a=e("backbone"),f=e("../util/constants").GRAPHICS,l=e("../visuals/visBase").VisBase,c=l.extend({defaults:{tail:null,head:null,animationSpeed:f.defaultAnimationTime,animationEasing:f.defaultEasing},validateAtInit:function(){var e=["tail","head"];u.each(e,function(e){if(!this.get(e))throw new Error(e+" is required!")},this)},getID:function(){return this.get("tail").get("id")+"."+this.get("head").get("id")},initialize:function(){this.validateAtInit(),this.gitVisuals=this.get("gitVisuals"),this.gitEngine=this.get("gitEngine"),this.get("tail").get("outgoingEdges").push(this)},remove:function(){this.removeKeys(["path"]),this.gitVisuals.removeVisEdge(this)},genSmoothBezierPathString:function(e,t){var n=e.getScreenCoords(),r=t.getScreenCoords();return this.genSmoothBezierPathStringFromCoords(n,r)},genSmoothBezierPathStringFromCoords:function(e,t){var n=function(e){return String(Math.round(e.x))+","+String(Math.round(e.y))},r=function(e,t,n){return n=n||f.curveControlPointOffset,{x:e.x,y:e.y+n*t}},i=function(e,t,n){return{x:e.x+t,y:e.y+n}};e=r(e,-1,this.get("tail").getRadius()),t=r(t,1,this.get("head").getRadius());var s="";s+="M"+n(e)+" ",s+="C",s+=n(r(e,-1))+" ",s+=n(r(t,1))+" ",s+=n(t);var o=f.arrowHeadSize||10;return s+=" L"+n(i(t,-o,o)),s+=" L"+n(i(t,o,o)),s+=" L"+n(t),s+="C",s+=n(r(t,1))+" ",s+=n(r(e,-1))+" ",s+=n(e),s},getBezierCurve:function(){return this.genSmoothBezierPathString(this.get("tail"),this.get("head"))},getStrokeColor:function(){return f.visBranchStrokeColorNone},setOpacity:function(e){e=e===undefined?1:e,this.get("path").attr({opacity:e})},genGraphics:function(e){var t=this.getBezierCurve(),n=e.path(t).attr({"stroke-width":f.visBranchStrokeWidth,stroke:this.getStrokeColor(),"stroke-linecap":"round","stroke-linejoin":"round",fill:this.getStrokeColor()});n.toBack(),this.set("path",n)},getOpacity:function(){var e=this.gitVisuals.getCommitUpstreamStatus(this.get("tail")),t={branch:1,head:f.edgeUpstreamHeadOpacity,none:f.edgeUpstreamNoneOpacity};if(t[e]===undefined)throw new Error("bad stat");return t[e]},getAttributes:function(){var e=this.getBezierCurve(),t=this.getOpacity();return{path:{path:e,opacity:t}}},animateUpdatedPath:function(e,t){var n=this.getAttributes();this.animateToAttr(n,e,t)},animateFromAttrToAttr:function(e,t,n,r){this.animateToAttr(e,0),this.animateToAttr(t,n,r)},animateToAttr:function(e,t,n){if(t===0){this.get("path").attr(e.path);return}this.get("path").toBack(),this.get("path").stop().animate(e.path,t!==undefined?t:this.get("animationSpeed"),n||this.get("animationEasing"))}}),h=a.Collection.extend({model:c});n.VisEdgeCollection=h,n.VisEdge=c}),e("/src/js/visuals/visEdge.js"),e.define("/src/js/visuals/visNode.js",function(e,t,n,r,i,s,o){var u=e("underscore"),a=e("backbone"),f=e("../util/constants").GRAPHICS,l=e("../visuals/visBase").VisBase,c=l.extend({defaults:{depth:undefined,maxWidth:null,outgoingEdges:null,circle:null,text:null,id:null,pos:null,radius:null,commit:null,animationSpeed:f.defaultAnimationTime,animationEasing:f.defaultEasing,fill:f.defaultNodeFill,"stroke-width":f.defaultNodeStrokeWidth,stroke:f.defaultNodeStroke},getID:function(){return this.get("id")},validateAtInit:function(){if(!this.get("id"))throw new Error("need id for mapping");if(!this.get("commit"))throw new Error("need commit for linking");this.get("pos")||this.set("pos",{x:Math.random(),y:Math.random()})},initialize:function(){this.validateAtInit(),this.gitVisuals=this.get("gitVisuals"),this.gitEngine=this.get("gitEngine"),this.set("outgoingEdges",[])},setDepth:function(e){this.set("depth",Math.max(this.get("depth")||0,e))},setDepthBasedOn:function(e){if(this.get("depth")===undefined){debugger;throw new Error("no depth yet!")}var t=this.get("pos");t.y=this.get("depth")*e},getMaxWidthScaled:function(){var e=this.gitVisuals.getCommitUpstreamStatus(this.get("commit")),t={branch:1,head:.3,none:.1};if(t[e]===undefined)throw new Error("bad stat");return t[e]*this.get("maxWidth")},toFront:function(){this.get("circle").toFront(),this.get("text").toFront()},getOpacity:function(){var e={branch:1,head:f.upstreamHeadOpacity,none:f.upstreamNoneOpacity},t=this.gitVisuals.getCommitUpstreamStatus(this.get("commit"));if(e[t]===undefined)throw new Error("invalid status");return e[t]},getTextScreenCoords:function(){return this.getScreenCoords()},getAttributes:function(){var e=this.getScreenCoords(),t=this.getTextScreenCoords(),n=this.getOpacity();return{circle:{cx:e.x,cy:e.y,opacity:n,r:this.getRadius(),fill:this.getFill(),"stroke-width":this.get("stroke-width"),stroke:this.get("stroke")},text:{x:t.x,y:t.y,opacity:n}}},highlightTo:function(e,t,n){var r=e.get("fill"),i={circle:{fill:r,stroke:r,"stroke-width":this.get("stroke-width")*5},text:{}};this.animateToAttr(i,t,n)},animateUpdatedPosition:function(e,t){var n=this.getAttributes();this.animateToAttr(n,e,t)},animateFromAttrToAttr:function(e,t,n,r){this.animateToAttr(e,0),this.animateToAttr(t,n,r)},animateToSnapshot:function(e,t,n){if(!e[this.getID()])return;this.animateToAttr(e[this.getID()],t,n)},animateToAttr:function(e,t,n){if(t===0){this.get("circle").attr(e.circle),this.get("text").attr(e.text);return}var r=t!==undefined?t:this.get("animationSpeed"),i=n||this.get("animationEasing");this.get("circle").stop().animate(e.circle,r,i),this.get("text").stop().animate(e.text,r,i),n=="bounce"&&e.circle&&e.circle.cx!==undefined&&e.text&&e.text.x!==undefined&&(this.get("circle").animate(e.circle.cx,r,"easeInOut"),this.get("text").animate(e.text.x,r,"easeInOut"))},getScreenCoords:function(){var e=this.get("pos");return this.gitVisuals.toScreenCoords(e)},getRadius:function(){return this.get("radius")||f.nodeRadius},getParentScreenCoords:function(){return this.get("commit").get("parents")[0].get("visNode").getScreenCoords()},setBirthPosition:function(){var e=this.getParentScreenCoords();this.get("circle").attr({cx:e.x,cy:e.y,opacity:0,r:0}),this.get("text").attr({x:e.x,y:e.y,opacity:0})},setBirthFromSnapshot:function(e){var t=this.get("commit").get("parents")[0].get("visNode").getID(),n=e[t];this.get("circle").attr({opacity:0,r:0,cx:n.circle.cx,cy:n.circle.cy}),this.get("text").attr({opacity:0,x:n.text.x,y:n.text.y});var r={x:n.circle.cx,y:n.circle.cy};this.setOutgoingEdgesBirthPosition(r)},setBirth:function(){this.setBirthPosition(),this.setOutgoingEdgesBirthPosition(this.getParentScreenCoords())},setOutgoingEdgesOpacity:function(e){u.each(this.get("outgoingEdges"),function(t){t.setOpacity(e)})},animateOutgoingEdgesToAttr:function(e,t,n){u.each(this.get("outgoingEdges"),function(t){var n=e[t.getID()];t.animateToAttr(n)},this)},animateOutgoingEdges:function(e,t){u.each(this.get("outgoingEdges"),function(n){n.animateUpdatedPath(e,t)},this)},animateOutgoingEdgesFromSnapshot:function(e,t,n){u.each(this.get("outgoingEdges"),function(r){var i=e[r.getID()];r.animateToAttr(i,t,n)},this)},setOutgoingEdgesBirthPosition:function(e){u.each(this.get("outgoingEdges"),function(t){var n=t.get("head").getScreenCoords(),r=t.genSmoothBezierPathStringFromCoords(e,n);t.get("path").stop().attr({path:r,opacity:0})},this)},parentInFront:function(){this.get("commit").get("parents")[0].get("visNode").toFront()},getFontSize:function(e){return e.length<3?12:e.length<5?10:8},getFill:function(){var e=this.gitVisuals.getCommitUpstreamStatus(this.get("commit"));return e=="head"?f.headRectFill:e=="none"?f.orphanNodeFill:this.gitVisuals.getBlendedHuesForCommit(this.get("commit"))},attachClickHandlers:function(){if(this.get("gitVisuals").options.noClick)return;var t="git checkout "+this.get("commit").get("id"),n=e("../app");u.each([this.get("circle"),this.get("text")],function(e){e.click(function(){n.getEventBaton().trigger("commandSubmitted",t)}),$(e.node).css("cursor","pointer")})},setOpacity:function(e){e=e===undefined?1:e;var t=["circle","text"];u.each(t,function(t){this.get(t).attr({opacity:e})},this)},remove:function(){this.removeKeys(["circle"],["text"]);var e=this.get("text");e&&e.remove(),this.gitVisuals.removeVisNode(this)},removeAll:function(){this.remove(),u.each(this.get("outgoingEdges"),function(e){e.remove()},this)},getExplodeStepFunc:function(){var e=this.get("circle"),t=20,n=Math.PI+Math.random()*1*Math.PI,r=.2,i=.01,s=t*Math.cos(n),o=t*Math.sin(n),u=e.attr("cx"),a=e.attr("cy"),f=this.gitVisuals.paper.width,l=this.gitVisuals.paper.height,c=.8,h=1,p=function(){o+=r*h-i*o,s-=i*s,u+=s*h,a+=o*h;if(u<0||u>f)s=c*-s,u=u<0?0:f;if(a<0||a>l)o=c*-o,a=a<0?0:l;return e.attr({cx:u,cy:a}),s*s+o*o<.01&&Math.abs(a-l)===0?!1:!0};return p},genGraphics:function(){var e=this.gitVisuals.paper,t=this.getScreenCoords(),n=this.getTextScreenCoords(),r=e.circle(t.x,t.y,this.getRadius()).attr(this.getAttributes().circle),i=e.text(n.x,n.y,String(this.get("id")));i.attr({"font-size":this.getFontSize(this.get("id")),"font-weight":"bold","font-family":"Monaco, Courier, font-monospace",opacity:this.getOpacity()}),this.set("circle",r),this.set("text",i),this.attachClickHandlers()}});n.VisNode=c}),e("/src/js/visuals/visNode.js"),e.define("/src/js/visuals/visualization.js",function(e,t,n,r,i,s,o){var u=e("underscore"),a=e("../util").isBrowser()?a=window.Backbone:a=e("backbone"),f=e("../models/collections"),l=f.CommitCollection,c=f.BranchCollection,h=e("../util/eventBaton").EventBaton,p=e("../visuals").GitVisuals,d=a.View.extend({initialize:function(e){e=e||{},this.options=e,this.customEvents=u.clone(a.Events),this.containerElement=e.containerElement;var t=this,n=e.containerElement||$("#canvasHolder")[0];new Raphael(n,200,200,function(){var n=this;s.nextTick(function(){t.paperInitialize(n,e)})})},paperInitialize:function(t,n){this.treeString=n.treeString,this.paper=t;var r=e("../app");this.eventBaton=n.noKeyboardInput?new h:r.getEventBaton(),this.commitCollection=new l,this.branchCollection=new c,this.gitVisuals=new p({commitCollection:this.commitCollection,branchCollection:this.branchCollection,paper:this.paper,noClick:this.options.noClick,smallCanvas:this.options.smallCanvas});var i=e("../git").GitEngine;this.gitEngine=new i({collection:this.commitCollection,branches:this.branchCollection,gitVisuals:this.gitVisuals,eventBaton:this.eventBaton}),this.gitEngine.init(),this.gitVisuals.assignGitEngine(this.gitEngine),this.myResize(),$(window).on("resize",u.bind(function(){this.myResize()},this)),this.gitVisuals.drawTreeFirstTime(),this.treeString&&this.gitEngine.loadTreeFromString(this.treeString),this.options.zIndex&&this.setTreeIndex(this.options.zIndex),this.shown=!1,this.setTreeOpacity(0),s.nextTick(u.bind(this.fadeTreeIn,this)),this.customEvents.trigger("gitEngineReady"),this.customEvents.trigger("paperReady")},setTreeIndex:function(e){$(this.paper.canvas).css("z-index",e)},setTreeOpacity:function(e){e===0&&(this.shown=!1),$(this.paper.canvas).css("opacity",e)},getAnimationTime:function(){return 300},fadeTreeIn:function(){this.shown=!0,$(this.paper.canvas).animate({opacity:1},this.getAnimationTime())},fadeTreeOut:function(){this.shown=!1,$(this.paper.canvas).animate({opacity:0},this.getAnimationTime())},hide:function(){this.fadeTreeOut(),setTimeout(u.bind(function(){$(this.paper.canvas).css("visibility","hidden")},this),this.getAnimationTime())},show:function(){$(this.paper.canvas).css("visibility","visible"),setTimeout(u.bind(this.fadeTreeIn,this),10)},showHarsh:function(){$(this.paper.canvas).css("visibility","visible"),this.setTreeOpacity(1)},resetFromThisTreeNow:function(e){this.treeString=e},reset:function(){this.setTreeOpacity(0),this.treeString?this.gitEngine.loadTreeFromString(this.treeString):this.gitEngine.defaultInit(),this.fadeTreeIn()},tearDown:function(){this.gitEngine.tearDown(),this.gitVisuals.tearDown(),delete this.paper},die:function(){this.fadeTreeOut(),setTimeout(u.bind(function(){this.shown||this.tearDown()},this),this.getAnimationTime())},myResize:function(){if(!this.paper)return;var e=1,t=this.el,n=t.clientWidth-e,r=t.clientHeight-e;if(!this.containerElement){var i=t.offsetLeft,s=t.offsetTop;$(this.paper.canvas).css({position:"absolute",left:i+"px",top:s+"px"})}this.paper.setSize(n,r),this.gitVisuals.canvasResize(n,r)}});n.Visualization=d}),e("/src/js/visuals/visualization.js"),e.define("/src/levels/index.js",function(e,t,n,r,i,s,o){n.levelSequences={intro:[e("../../levels/intro/1").level,e("../../levels/intro/2").level,e("../../levels/intro/3").level,e("../../levels/intro/4").level,e("../../levels/intro/5").level],rebase:[e("../../levels/rebase/1").level,e("../../levels/rebase/2").level],mixed:[e("../../levels/mixed/1").level,e("../../levels/mixed/2").level,e("../../levels/mixed/3").level]},n.sequenceInfo={intro:{displayName:"Introduction Sequence",about:"A nicely paced introduction to the majority of git commands"},rebase:{displayName:"Master the Rebase Luke!",about:"What is this whole rebase hotness everyone is talking about? Find out!"},mixed:{displayName:"A Mixed Bag",about:"A mixed bag of Git techniques, tricks, and tips"}}}),e("/src/levels/index.js"),e.define("/src/levels/intro/1.js",function(e,t,n,r,i,s,o){n.level={name:"Introduction to Git Commits",goalTreeString:'{"branches":{"master":{"target":"C3","id":"master"}},"commits":{"C0":{"parents":[],"id":"C0","rootCommit":true},"C1":{"parents":["C0"],"id":"C1"},"C2":{"parents":["C1"],"id":"C2"},"C3":{"parents":["C2"],"id":"C3"}},"HEAD":{"target":"master","id":"HEAD"}}',solutionCommand:"git commit;git commit",startTree:'{"branches":{"master":{"target":"C1","id":"master"}},"commits":{"C0":{"parents":[],"id":"C0","rootCommit":true},"C1":{"parents":["C0"],"id":"C1"}},"HEAD":{"target":"master","id":"HEAD"}}',hint:"Just type in 'git commit' twice to finish!",disabledMap:{"git revert":!0},startDialog:{childViews:[{type:"ModalAlert",options:{markdowns:["## Git Commits","A commit in a git repository records a snapshot of all the files in your directory. It's like a giant copy and paste, but even better!","","Git wants to keep commits as lightweight as possible though, so it doesn't just copy the entire directory every time you commit. It actually stores each commit as a set of changes, or a \"delta\", from one version of the repository to the next. That's why most commits have a parent commit above them -- you'll see this later in our visualizations.","",'In order to clone a repository, you have to unpack or "resolve" all these deltas. That\'s why you might see the command line output:',"","`resolving deltas`","","when cloning a repo.","","It's a lot to take in, but for now you can think of commits as snapshots of the project. Commits are very light and switching between them is wicked fast!"]}},{type:"GitDemonstrationView",options:{beforeMarkdowns:["Let's see what this looks like in practice. On the right we have a visualization of a (small) git repository. There are two commits right now -- the first initial commit, `C0`, and one commit after that `C1` that might have some meaningful changes.","","Hit the button below to make a new commit"],afterMarkdowns:["There we go! Awesome. We just made changes to the repository and saved them as a commit. The commit we just made has a parent, `C1`, which references which commit it was based off of."],command:"git commit",beforeCommand:""}},{type:"ModalAlert",options:{markdowns:["Go ahead and try it out on your own! After this window closes, make two commits to complete the level"]}}]}}}),e("/src/levels/intro/1.js"),e.define("/src/levels/intro/2.js",function(e,t,n,r,i,s,o){n.level={goalTreeString:'{"branches":{"master":{"target":"C1","id":"master"},"bugFix":{"target":"C1","id":"bugFix"}},"commits":{"C0":{"parents":[],"id":"C0","rootCommit":true},"C1":{"parents":["C0"],"id":"C1"}},"HEAD":{"target":"bugFix","id":"HEAD"}}',solutionCommand:"git branch bugFix;git checkout bugFix",hint:'Make a new branch with "git branch [name]" and check it out with "git checkout [name]"',name:"Branching in Git",disabledMap:{"git revert":!0},startDialog:{childViews:[{type:"ModalAlert",options:{markdowns:["## Git Branches","","Branches in Git are incredibly lightweight as well. They are simply references to a specific commit -- nothing more. This is why many Git enthusiasts chant the mantra:","","```","branch early, and branch often","```","","Because there is no storage / memory overhead with making many branches, it's easier to logically divide up your work than have big beefy branches.","",'When we start mixing branches and commits, we will see how these two features combine. For now though, just remember that a branch essentially says "I want to include the work of this commit and all parent commits."']}},{type:"GitDemonstrationView",options:{beforeMarkdowns:["Let's see what branches look like in practice.","","Here we will check out a new branch named `newImage`"],afterMarkdowns:["There, that's all there is to branching! The branch `newImage` now refers to commit `C1`"],command:"git branch newImage",beforeCommand:""}},{type:"GitDemonstrationView",options:{beforeMarkdowns:["Let's try to put some work on this new branch. Hit the button below"],afterMarkdowns:["Oh no! The `master` branch moved but the `newImage` branch didn't! That's because we weren't \"on\" the new branch, which is why the asterisk (*) was on `master`"],command:"git commit",beforeCommand:"git branch newImage"}},{type:"GitDemonstrationView",options:{beforeMarkdowns:["Let's tell git we want to checkout the branch with","","```","git checkout [name]","```","","This will put us on the new branch before committing our changes"],afterMarkdowns:["There we go! Our changes were recorded on the new branch"],command:"git checkout newImage; git commit",beforeCommand:"git branch newImage"}},{type:"ModalAlert",options:{markdowns:["Ok! You are all ready to get branching. Once this window closes,","make a new branch named `bugFix` and switch to that branch"]}}]}}}),e("/src/levels/intro/2.js"),e.define("/src/levels/intro/3.js",function(e,t,n,r,i,s,o){n.level={goalTreeString:'{"branches":{"master":{"target":"C4","id":"master"},"bugFix":{"target":"C2","id":"bugFix"}},"commits":{"C0":{"parents":[],"id":"C0","rootCommit":true},"C1":{"parents":["C0"],"id":"C1"},"C2":{"parents":["C1"],"id":"C2"},"C3":{"parents":["C1"],"id":"C3"},"C4":{"parents":["C2","C3"],"id":"C4"}},"HEAD":{"target":"master","id":"HEAD"}}',solutionCommand:"git checkout -b bugFix;git commit;git checkout master;git commit;git merge bugFix",name:"Merging in Git",hint:"Remember to commit in the order specified (bugFix before master)",disabledMap:{"git revert":!0},startDialog:{childViews:[{type:"ModalAlert",options:{markdowns:["## Branches and Merging","","Great! We now know how to commit and branch. Now we need to learn some kind of way of combining the work from two different branches together. This will allow us to branch off, develop a new feature, and then combine it back in.","",'The first method to combine work that we will examine is `git merge`. Merging in Git creates a special commit that has two unique parents. A commit with two parents essentially means "I want to include all the work from this parent over here and this one over here, *and* the set of all their parents."',"","It's easier with visuals, let's check it out in the next view"]}},{type:"GitDemonstrationView",options:{beforeMarkdowns:["Here we have two branches; each has one commit that's unique. This means that neither branch includes the entire set of \"work\" in the repository that we have done. Let's fix that with merge.","","We will `merge` the branch `bugFix` into `master`"],afterMarkdowns:["Woah! See that? First of all, `master` now points to a commit that has two parents. If you follow the arrows upstream from `master`, you will hit every commit along the way to the root. This means that `master` contains all the work in the repository now.","","Also, see how the colors of the commits changed? To help with learning, I have included some color coordination. Each branch has a unique color. Each commit turns a color that is the blended combination of all the branches that contain that commit.","","So here we see that the `master` branch color is blended into all the commits, but the `bugFix` color is not. Let's fix that..."],command:"git merge bugFix master",beforeCommand:"git checkout -b bugFix; git commit; git checkout master; git commit"}},{type:"GitDemonstrationView",options:{beforeMarkdowns:["Let's merge `master` into `bugFix`:"],afterMarkdowns:["Since `bugFix` was downstream of `master`, git didn't have to do any work; it simply just moved `bugFix` to the same commit `master` was attached to.","","Now all the commits are the same color, which means each branch contains all the work in the repository! Woohoo"],command:"git merge master bugFix",beforeCommand:"git checkout -b bugFix; git commit; git checkout master; git commit; git merge bugFix master"}},{type:"ModalAlert",options:{markdowns:["To complete this level, do the following steps:","","* Make a new branch called `bugFix`","* Checkout the `bugFix` branch with `git checkout bugFix`","* Commit once","* Go back to `master` with `git checkout`","* Commit another time","* Merge the branch `bugFix` into `master` with `git merge`","",'*Remember, you can always re-display this dialog with "help level"!*']}}]}}}),e("/src/levels/intro/3.js"),e.define("/src/levels/intro/4.js",function(e,t,n,r,i,s,o){n.level={goalTreeString:"%7B%22branches%22%3A%7B%22master%22%3A%7B%22target%22%3A%22C3%22%2C%22id%22%3A%22master%22%7D%2C%22bugFix%22%3A%7B%22target%22%3A%22C2%27%22%2C%22id%22%3A%22bugFix%22%7D%7D%2C%22commits%22%3A%7B%22C0%22%3A%7B%22parents%22%3A%5B%5D%2C%22id%22%3A%22C0%22%2C%22rootCommit%22%3Atrue%7D%2C%22C1%22%3A%7B%22parents%22%3A%5B%22C0%22%5D%2C%22id%22%3A%22C1%22%7D%2C%22C2%22%3A%7B%22parents%22%3A%5B%22C1%22%5D%2C%22id%22%3A%22C2%22%7D%2C%22C3%22%3A%7B%22parents%22%3A%5B%22C1%22%5D%2C%22id%22%3A%22C3%22%7D%2C%22C2%27%22%3A%7B%22parents%22%3A%5B%22C3%22%5D%2C%22id%22%3A%22C2%27%22%7D%7D%2C%22HEAD%22%3A%7B%22target%22%3A%22bugFix%22%2C%22id%22%3A%22HEAD%22%7D%7D",solutionCommand:"git checkout -b bugFix;git commit;git checkout master;git commit;git checkout bugFix;git rebase master",name:"Rebase Introduction",hint:"Make sure you commit from bugFix first",disabledMap:{"git revert":!0},startDialog:{childViews:[{type:"ModalAlert",options:{markdowns:["## Git Rebase","",'The second way of combining work between branches is *rebasing.* Rebasing essentially takes a set of commits, "copies" them, and plops them down somewhere else.',"","While this sounds confusing, the advantage of rebasing is that it can be used to make a nice linear sequence of commits. The commit log / history of the repository will be a lot cleaner if only rebasing is allowed.","","Let's see it in action..."]}},{type:"GitDemonstrationView",options:{beforeMarkdowns:["Here we have two branches yet again; note that the bugFix branch is currently selected (note the asterisk)","","We would like to move our work from bugFix directly onto the work from master. That way it would look like these two features were developed sequentially, when in reality they were developed in parallel.","","Let's do that with the `git rebase` command"],afterMarkdowns:["Awesome! Now the work from our bugFix branch is right on top of master and we have a nice linear sequence of commits.","",'Note that the commit C3 still exists somewhere (it has a faded appearance in the tree), and C3\' is the "copy" that we rebased onto master.',"","The only problem is that master hasn't been updated either, let's do that now..."],command:"git rebase master",beforeCommand:"git commit; git checkout -b bugFix C1; git commit"}},{type:"GitDemonstrationView",options:{beforeMarkdowns:["Now we are checked out on the `master` branch. Let's do ahead and rebase onto `bugFix`..."],afterMarkdowns:["There! Since `master` was downstream of `bugFix`, git simply moved the `master` branch reference forward in history."],command:"git rebase bugFix",beforeCommand:"git commit; git checkout -b bugFix C1; git commit; git rebase master; git checkout master"}},{type:"ModalAlert",options:{markdowns:["To complete this level, do the following","","* Checkout a new branch named `bugFix`","* Commit once","* Go back to master and commit again","* Check out bugFix again and rebase onto master","","Good luck!"]}}]}}}),e("/src/levels/intro/4.js"),e.define("/src/levels/intro/5.js",function(e,t,n,r,i,s,o){n.level={goalTreeString:"%7B%22branches%22%3A%7B%22master%22%3A%7B%22target%22%3A%22C1%22%2C%22id%22%3A%22master%22%7D%2C%22pushed%22%3A%7B%22target%22%3A%22C2%27%22%2C%22id%22%3A%22pushed%22%7D%2C%22local%22%3A%7B%22target%22%3A%22C1%22%2C%22id%22%3A%22local%22%7D%7D%2C%22commits%22%3A%7B%22C0%22%3A%7B%22parents%22%3A%5B%5D%2C%22id%22%3A%22C0%22%2C%22rootCommit%22%3Atrue%7D%2C%22C1%22%3A%7B%22parents%22%3A%5B%22C0%22%5D%2C%22id%22%3A%22C1%22%7D%2C%22C2%22%3A%7B%22parents%22%3A%5B%22C1%22%5D%2C%22id%22%3A%22C2%22%7D%2C%22C3%22%3A%7B%22parents%22%3A%5B%22C1%22%5D%2C%22id%22%3A%22C3%22%7D%2C%22C2%27%22%3A%7B%22parents%22%3A%5B%22C2%22%5D%2C%22id%22%3A%22C2%27%22%7D%7D%2C%22HEAD%22%3A%7B%22target%22%3A%22pushed%22%2C%22id%22%3A%22HEAD%22%7D%7D",solutionCommand:"git reset HEAD~1;git checkout pushed;git revert HEAD",startTree:'{"branches":{"master":{"target":"C1","id":"master"},"pushed":{"target":"C2","id":"pushed"},"local":{"target":"C3","id":"local"}},"commits":{"C0":{"parents":[],"id":"C0","rootCommit":true},"C1":{"parents":["C0"],"id":"C1"},"C2":{"parents":["C1"],"id":"C2"},"C3":{"parents":["C1"],"id":"C3"}},"HEAD":{"target":"local","id":"HEAD"}}',name:"Reversing Changes in Git",hint:"",startDialog:{childViews:[{type:"ModalAlert",options:{markdowns:["## Reversing Changes in Git","","There are many ways to reverse changes in Git. And just like committing, reversing changes in Git has both a low-level component (staging individual files or chunks) and a high-level component (how the changes are actually reversed). Our application will focus on the latter.","","There are two primary ways to undo changes in Git -- one is using `git reset` and the other is using `git revert`. We will look at each of these in the next dialog",""]}},{type:"GitDemonstrationView",options:{beforeMarkdowns:["## Git Reset","",'`git reset` reverts changes by moving a branch reference backwards in time to an older commit. In this sense you can think of it as "rewriting history;" `git reset` will move a branch backwards as if the commit had never been made in the first place.',"","Let's see what that looks like:"],afterMarkdowns:["Nice! Git simply moved the master branch reference back to `C1`; now our local repository is in a state as if `C2` had never happened"],command:"git reset HEAD~1",beforeCommand:"git commit"}},{type:"GitDemonstrationView",options:{beforeMarkdowns:["## Git Revert","","While reseting works great for local branches on your own machine, it's method of \"rewriting history\" doesn't work for remote branches that others are using.","","In order to reverse changes and *share* those reversed changes with others, we need to use `git revert`. Let's see it in action"],afterMarkdowns:["Weird, a new commit plopped down below the commit we wanted to reverse. That's because this new commit `C2'` introduces *changes* -- it just happens to introduce changes that exactly reverses the commit of `C2`.","","With reverting, you can push out your changes to share with others."],command:"git revert HEAD",beforeCommand:"git commit"}},{type:"ModalAlert",options:{markdowns:["To complete this level, reverse the two most recent commits on both `local` and `pushed`.","","Keep in mind that `pushed` is a remote branch and `local` is a local branch -- that should help you chose your methods."]}}]}}}),e("/src/levels/intro/5.js"),e.define("/src/levels/mixed/1.js",function(e,t,n,r,i,s,o){n.level={compareOnlyMaster:!0,disabledMap:{"git revert":!0},goalTreeString:"%7B%22branches%22%3A%7B%22master%22%3A%7B%22target%22%3A%22C4%27%22%2C%22id%22%3A%22master%22%7D%2C%22debug%22%3A%7B%22target%22%3A%22C2%22%2C%22id%22%3A%22debug%22%7D%2C%22printf%22%3A%7B%22target%22%3A%22C3%22%2C%22id%22%3A%22printf%22%7D%2C%22bugFix%22%3A%7B%22target%22%3A%22C4%27%22%2C%22id%22%3A%22bugFix%22%7D%7D%2C%22commits%22%3A%7B%22C0%22%3A%7B%22parents%22%3A%5B%5D%2C%22id%22%3A%22C0%22%2C%22rootCommit%22%3Atrue%7D%2C%22C1%22%3A%7B%22parents%22%3A%5B%22C0%22%5D%2C%22id%22%3A%22C1%22%7D%2C%22C2%22%3A%7B%22parents%22%3A%5B%22C1%22%5D%2C%22id%22%3A%22C2%22%7D%2C%22C3%22%3A%7B%22parents%22%3A%5B%22C2%22%5D%2C%22id%22%3A%22C3%22%7D%2C%22C4%22%3A%7B%22parents%22%3A%5B%22C3%22%5D%2C%22id%22%3A%22C4%22%7D%2C%22C4%27%22%3A%7B%22parents%22%3A%5B%22C1%22%5D%2C%22id%22%3A%22C4%27%22%7D%7D%2C%22HEAD%22%3A%7B%22target%22%3A%22master%22%2C%22id%22%3A%22HEAD%22%7D%7D",solutionCommand:"git checkout master;git cherry-pick C4",startTree:'{"branches":{"master":{"target":"C1","id":"master"},"debug":{"target":"C2","id":"debug"},"printf":{"target":"C3","id":"printf"},"bugFix":{"target":"C4","id":"bugFix"}},"commits":{"C0":{"parents":[],"id":"C0","rootCommit":true},"C1":{"parents":["C0"],"id":"C1"},"C2":{"parents":["C1"],"id":"C2"},"C3":{"parents":["C2"],"id":"C3"},"C4":{"parents":["C3"],"id":"C4"}},"HEAD":{"target":"bugFix","id":"HEAD"}}',name:"Grabbing Just 1 Commit",hint:"Remember, interactive rebase or cherry-pick is your friend here",startDialog:{childViews:[{type:"ModalAlert",options:{markdowns:["## Locally stacked commits","","Here's a development situation that often happens: I'm trying to track down a bug but it is quite elusive. In order to aid in my detective work, I put in a few debug commands and a few print statements.","","All of these debugging / print statements are in their own branches. Finally I track down the bug, fix it, and rejoice!","","Only problem is that I now need to get my `bugFix` back into the `master` branch! I could simply fast-forward `master`, but then `master` would get all my debug statements."]}},{type:"ModalAlert",options:{markdowns:["This is where the magic of Git comes in. There are a few ways to do this, but the two most straightforward ways are:","","* `git rebase -i`","* `git cherry-pick`","","Interactive (the `-i`) rebasing allows you to chose which commits you want to keep or discard. It also allows you to reorder commits. This can be helpful if you want to toss out some work.","","Cherry-picking allows you to pick individual commits and plop them down on top of `HEAD`"]}},{type:"ModalAlert",options:{markdowns:["This is a later level so we will leave it up to you to decide, but in order to complete the level, make sure `master` receives the commit that `bugFix` references."]}}]}}}),e("/src/levels/mixed/1.js"),e.define("/src/levels/mixed/2.js",function(e,t,n,r,i,s,o){n.level={disabledMap:{"git cherry-pick":!0,"git revert":!0},compareOnlyMaster:!0,goalTreeString:"%7B%22branches%22%3A%7B%22master%22%3A%7B%22target%22%3A%22C3%27%27%22%2C%22id%22%3A%22master%22%7D%2C%22newImage%22%3A%7B%22target%22%3A%22C2%22%2C%22id%22%3A%22newImage%22%7D%2C%22caption%22%3A%7B%22target%22%3A%22C3%27%27%22%2C%22id%22%3A%22caption%22%7D%7D%2C%22commits%22%3A%7B%22C0%22%3A%7B%22parents%22%3A%5B%5D%2C%22id%22%3A%22C0%22%2C%22rootCommit%22%3Atrue%7D%2C%22C1%22%3A%7B%22parents%22%3A%5B%22C0%22%5D%2C%22id%22%3A%22C1%22%7D%2C%22C2%22%3A%7B%22parents%22%3A%5B%22C1%22%5D%2C%22id%22%3A%22C2%22%7D%2C%22C3%22%3A%7B%22parents%22%3A%5B%22C2%22%5D%2C%22id%22%3A%22C3%22%7D%2C%22C3%27%22%3A%7B%22parents%22%3A%5B%22C1%22%5D%2C%22id%22%3A%22C3%27%22%7D%2C%22C2%27%22%3A%7B%22parents%22%3A%5B%22C3%27%22%5D%2C%22id%22%3A%22C2%27%22%7D%2C%22C2%27%27%22%3A%7B%22parents%22%3A%5B%22C3%27%22%5D%2C%22id%22%3A%22C2%27%27%22%7D%2C%22C2%27%27%27%22%3A%7B%22parents%22%3A%5B%22C1%22%5D%2C%22id%22%3A%22C2%27%27%27%22%7D%2C%22C3%27%27%22%3A%7B%22parents%22%3A%5B%22C2%27%27%27%22%5D%2C%22id%22%3A%22C3%27%27%22%7D%7D%2C%22HEAD%22%3A%7B%22target%22%3A%22master%22%2C%22id%22%3A%22HEAD%22%7D%7D",solutionCommand:"git rebase -i HEAD~2;git commit --amend;git rebase -i HEAD~2;git rebase caption master",startTree:'{"branches":{"master":{"target":"C1","id":"master"},"newImage":{"target":"C2","id":"newImage"},"caption":{"target":"C3","id":"caption"}},"commits":{"C0":{"parents":[],"id":"C0","rootCommit":true},"C1":{"parents":["C0"],"id":"C1"},"C2":{"parents":["C1"],"id":"C2"},"C3":{"parents":["C2"],"id":"C3"}},"HEAD":{"target":"caption","id":"HEAD"}}',name:"Juggling Commits",hint:"The first command is git rebase -i HEAD~2",startDialog:{childViews:[{type:"ModalAlert",options:{markdowns:["## Juggling Commits","","Here's another situation that happens quite commonly. You have some changes (`newImage`) and another set of changes (`caption`) that are related, so they are stacked on top of each other in your repository (aka one after another).","","The tricky thing is that sometimes you need to make a small modification to an earlier commit. In this case, design wants us to change the dimensions of `newImage` slightly, even though that commit is way back in our history!!"]}},{type:"ModalAlert",options:{markdowns:["We will overcome this difficulty by doing the following:","","* We will re-order the commits so the one we want to change is on top with `git rebase -i`","* We will `commit --amend` to make the slight modification","* Then we will re-order the commits back to how they were previously with `git rebase -i`","* Finally, we will move master to this updated part of the tree to finish the level (via your method of choosing)","","There are many ways to accomplish this overall goal (I see you eye-ing cherry-pick), and we will see more of them later, but for now let's focus on this technique."]}},{type:"ModalAlert",options:{markdowns:["Lastly, pay attention to the goal state here -- since we move the commits twice, they both get an apostrophe appended. One more apostrophe is added for the commit we amend, which gives us the final form of the tree "]}}]}}}),e("/src/levels/mixed/2.js"),e.define("/src/levels/mixed/3.js",function(e,t,n,r,i,s,o){n.level={goalTreeString:"%7B%22branches%22%3A%7B%22master%22%3A%7B%22target%22%3A%22C3%27%22%2C%22id%22%3A%22master%22%7D%2C%22newImage%22%3A%7B%22target%22%3A%22C2%22%2C%22id%22%3A%22newImage%22%7D%2C%22caption%22%3A%7B%22target%22%3A%22C3%22%2C%22id%22%3A%22caption%22%7D%7D%2C%22commits%22%3A%7B%22C0%22%3A%7B%22parents%22%3A%5B%5D%2C%22id%22%3A%22C0%22%2C%22rootCommit%22%3Atrue%7D%2C%22C1%22%3A%7B%22parents%22%3A%5B%22C0%22%5D%2C%22id%22%3A%22C1%22%7D%2C%22C2%22%3A%7B%22parents%22%3A%5B%22C1%22%5D%2C%22id%22%3A%22C2%22%7D%2C%22C3%22%3A%7B%22parents%22%3A%5B%22C2%22%5D%2C%22id%22%3A%22C3%22%7D%2C%22C2%27%22%3A%7B%22parents%22%3A%5B%22C1%22%5D%2C%22id%22%3A%22C2%27%22%7D%2C%22C2%27%27%22%3A%7B%22parents%22%3A%5B%22C1%22%5D%2C%22id%22%3A%22C2%27%27%22%7D%2C%22C3%27%22%3A%7B%22parents%22%3A%5B%22C2%27%27%22%5D%2C%22id%22%3A%22C3%27%22%7D%7D%2C%22HEAD%22%3A%7B%22target%22%3A%22master%22%2C%22id%22%3A%22HEAD%22%7D%7D",solutionCommand:"git checkout master;git cherry-pick C2;git commit --amend;git cherry-pick C3",disabledMap:{"git revert":!0},startTree:'{"branches":{"master":{"target":"C1","id":"master"},"newImage":{"target":"C2","id":"newImage"},"caption":{"target":"C3","id":"caption"}},"commits":{"C0":{"parents":[],"id":"C0","rootCommit":true},"C1":{"parents":["C0"],"id":"C1"},"C2":{"parents":["C1"],"id":"C2"},"C3":{"parents":["C2"],"id":"C3"}},"HEAD":{"target":"caption","id":"HEAD"}}',compareOnlyMaster:!0,name:"Juggling Commits #2",hint:"Don't forget to forward master to the updated changes!",startDialog:{childViews:[{type:"ModalAlert",options:{markdowns:["## Juggling Commits #2","","*If you haven't completed Juggling Commits #1 (the previous level), please do so before continuing*","","As you saw in the last level, we used `rebase -i` to reorder the commits. Once the commit we wanted to change was on top, we could easily --amend it and re-order back to our preferred order.","","The only issue here is that there is a lot of reordering going on, which can introduce rebase conflicts. Let's look at another method with `git cherry-pick`"]}},{type:"GitDemonstrationView",options:{beforeMarkdowns:["Remember that git cherry-pick will plop down a commit from anywhere in the tree onto HEAD (as long as that commit isn't upstream).","","Here's a small refresher demo:"],afterMarkdowns:["Nice! Let's move on"],command:"git cherry-pick C2",beforeCommand:"git checkout -b bugFix; git commit; git checkout master; git commit"}},{type:"ModalAlert",options:{markdowns:["So in this level, let's accomplish the same objective of amending `C2` once but avoid using `rebase -i`. I'll leave it up to you to figure it out! :D"]}}]}}}),e("/src/levels/mixed/3.js"),e.define("/src/levels/rebase/1.js",function(e,t,n,r,i,s,o){n.level={compareOnlyMaster:!0,disabledMap:{"git revert":!0},goalTreeString:"%7B%22branches%22%3A%7B%22master%22%3A%7B%22target%22%3A%22C7%27%22%2C%22id%22%3A%22master%22%7D%2C%22bugFix%22%3A%7B%22target%22%3A%22C3%27%22%2C%22id%22%3A%22bugFix%22%7D%2C%22side%22%3A%7B%22target%22%3A%22C6%27%22%2C%22id%22%3A%22side%22%7D%2C%22another%22%3A%7B%22target%22%3A%22C7%27%22%2C%22id%22%3A%22another%22%7D%7D%2C%22commits%22%3A%7B%22C0%22%3A%7B%22parents%22%3A%5B%5D%2C%22id%22%3A%22C0%22%2C%22rootCommit%22%3Atrue%7D%2C%22C1%22%3A%7B%22parents%22%3A%5B%22C0%22%5D%2C%22id%22%3A%22C1%22%7D%2C%22C2%22%3A%7B%22parents%22%3A%5B%22C1%22%5D%2C%22id%22%3A%22C2%22%7D%2C%22C3%22%3A%7B%22parents%22%3A%5B%22C1%22%5D%2C%22id%22%3A%22C3%22%7D%2C%22C4%22%3A%7B%22parents%22%3A%5B%22C0%22%5D%2C%22id%22%3A%22C4%22%7D%2C%22C5%22%3A%7B%22parents%22%3A%5B%22C4%22%5D%2C%22id%22%3A%22C5%22%7D%2C%22C6%22%3A%7B%22parents%22%3A%5B%22C5%22%5D%2C%22id%22%3A%22C6%22%7D%2C%22C7%22%3A%7B%22parents%22%3A%5B%22C5%22%5D%2C%22id%22%3A%22C7%22%7D%2C%22C3%27%22%3A%7B%22parents%22%3A%5B%22C2%22%5D%2C%22id%22%3A%22C3%27%22%7D%2C%22C4%27%22%3A%7B%22parents%22%3A%5B%22C3%27%22%5D%2C%22id%22%3A%22C4%27%22%7D%2C%22C5%27%22%3A%7B%22parents%22%3A%5B%22C4%27%22%5D%2C%22id%22%3A%22C5%27%22%7D%2C%22C6%27%22%3A%7B%22parents%22%3A%5B%22C5%27%22%5D%2C%22id%22%3A%22C6%27%22%7D%2C%22C7%27%22%3A%7B%22parents%22%3A%5B%22C6%27%22%5D%2C%22id%22%3A%22C7%27%22%7D%7D%2C%22HEAD%22%3A%7B%22target%22%3A%22master%22%2C%22id%22%3A%22HEAD%22%7D%7D",solutionCommand:"git checkout bugFix;git rebase master;git checkout side;git rebase bugFix;git checkout another;git rebase side;git rebase another master",startTree:'{"branches":{"master":{"target":"C2","id":"master"},"bugFix":{"target":"C3","id":"bugFix"},"side":{"target":"C6","id":"side"},"another":{"target":"C7","id":"another"}},"commits":{"C0":{"parents":[],"id":"C0","rootCommit":true},"C1":{"parents":["C0"],"id":"C1"},"C2":{"parents":["C1"],"id":"C2"},"C3":{"parents":["C1"],"id":"C3"},"C4":{"parents":["C0"],"id":"C4"},"C5":{"parents":["C4"],"id":"C5"},"C6":{"parents":["C5"],"id":"C6"},"C7":{"parents":["C5"],"id":"C7"}},"HEAD":{"target":"master","id":"HEAD"}}',name:"Rebasing over 9000 times",hint:"Remember, the most efficient way might be to only update master at the end...",startDialog:{childViews:[{type:"ModalAlert",options:{markdowns:["### Rebasing Multiple Branches","","Man, we have a lot of branches going on here! Let's rebase all the work from these branches onto master.","","Upper management is making this a bit trickier though -- they want the commits to all be in sequential order. So this means that our final tree should have `C7'` at the bottom, `C6'` above that, etc etc, etc all in order.","","If you mess up along the way, feel free to use `reset` to start over again. Be sure to check out our solution and see if you can do it in fewer commands!"]}}]}}}),e("/src/levels/rebase/1.js"),e.define("/src/levels/rebase/2.js",function(e,t,n,r,i,s,o){n.level={compareOnlyBranches:!0,disabledMap:{"git revert":!0},goalTreeString:"%7B%22branches%22%3A%7B%22master%22%3A%7B%22target%22%3A%22C5%22%2C%22id%22%3A%22master%22%7D%2C%22one%22%3A%7B%22target%22%3A%22C2%27%22%2C%22id%22%3A%22one%22%7D%2C%22two%22%3A%7B%22target%22%3A%22C2%27%27%22%2C%22id%22%3A%22two%22%7D%2C%22three%22%3A%7B%22target%22%3A%22C2%27%27%27%22%2C%22id%22%3A%22three%22%7D%7D%2C%22commits%22%3A%7B%22C0%22%3A%7B%22parents%22%3A%5B%5D%2C%22id%22%3A%22C0%22%2C%22rootCommit%22%3Atrue%7D%2C%22C1%22%3A%7B%22parents%22%3A%5B%22C0%22%5D%2C%22id%22%3A%22C1%22%7D%2C%22C2%22%3A%7B%22parents%22%3A%5B%22C1%22%5D%2C%22id%22%3A%22C2%22%7D%2C%22C3%22%3A%7B%22parents%22%3A%5B%22C2%22%5D%2C%22id%22%3A%22C3%22%7D%2C%22C4%22%3A%7B%22parents%22%3A%5B%22C3%22%5D%2C%22id%22%3A%22C4%22%7D%2C%22C5%22%3A%7B%22parents%22%3A%5B%22C4%22%5D%2C%22id%22%3A%22C5%22%7D%2C%22C4%27%22%3A%7B%22parents%22%3A%5B%22C1%22%5D%2C%22id%22%3A%22C4%27%22%7D%2C%22C3%27%22%3A%7B%22parents%22%3A%5B%22C4%27%22%5D%2C%22id%22%3A%22C3%27%22%7D%2C%22C2%27%22%3A%7B%22parents%22%3A%5B%22C3%27%22%5D%2C%22id%22%3A%22C2%27%22%7D%2C%22C5%27%22%3A%7B%22parents%22%3A%5B%22C1%22%5D%2C%22id%22%3A%22C5%27%22%7D%2C%22C4%27%27%22%3A%7B%22parents%22%3A%5B%22C5%27%22%5D%2C%22id%22%3A%22C4%27%27%22%7D%2C%22C3%27%27%22%3A%7B%22parents%22%3A%5B%22C4%27%27%22%5D%2C%22id%22%3A%22C3%27%27%22%7D%2C%22C2%27%27%22%3A%7B%22parents%22%3A%5B%22C3%27%27%22%5D%2C%22id%22%3A%22C2%27%27%22%7D%2C%22C2%27%27%27%22%3A%7B%22parents%22%3A%5B%22C1%22%5D%2C%22id%22%3A%22C2%27%27%27%22%7D%7D%2C%22HEAD%22%3A%7B%22target%22%3A%22master%22%2C%22id%22%3A%22HEAD%22%7D%7D",solutionCommand:"git rebase -i HEAD~4;git branch -f master C5;git branch -f one C2';git rebase -i HEAD~4;git branch -f master C5;git branch -f two C2'';git rebase -i HEAD~4;git branch -f master C5;git branch -f three C2'''",startTree:'{"branches":{"master":{"target":"C5","id":"master"},"one":{"target":"C1","id":"one"},"two":{"target":"C1","id":"two"},"three":{"target":"C1","id":"three"}},"commits":{"C0":{"parents":[],"id":"C0","rootCommit":true},"C1":{"parents":["C0"],"id":"C1"},"C2":{"parents":["C1"],"id":"C2"},"C3":{"parents":["C2"],"id":"C3"},"C4":{"parents":["C3"],"id":"C4"},"C5":{"parents":["C4"],"id":"C5"}},"HEAD":{"target":"master","id":"HEAD"}}',name:"Branch Spaghetti",hint:"Make sure to do everything in the proper order! Branch one first, then two, then three",startDialog:{childViews:[{type:"ModalAlert",options:{markdowns:["## Branch Spaghetti","","WOAHHHhhh Nelly! We have quite the goal to reach in this level.","","Here we have `master` that is a few commits ahead of branches `one` `two` and `three`. For whatever reason, we need to update these three other branches with modified versions of the last few commits on master.","","Branch `one` needs a re-ordering and a deletion. `two` needs pure reordering, and `three` only needs one commit!","","We will let you figure out how to solve this one -- make sure to check out our solution afterwards with `show solution`. "]}}]}}}),e("/src/levels/rebase/2.js")})();
\ No newline at end of file
diff --git a/build/bundle.min.js b/build/bundle.min.js
index abb7e70bc..60b303687 100644
--- a/build/bundle.min.js
+++ b/build/bundle.min.js
@@ -1 +1 @@
-(function(){var e=function(t,n){var r=e.resolve(t,n||"/"),i=e.modules[r];if(!i)throw new Error("Failed to resolve module "+t+", tried "+r);var s=e.cache[r],o=s?s.exports:i();return o};e.paths=[],e.modules={},e.cache={},e.extensions=[".js",".coffee",".json"],e._core={assert:!0,events:!0,fs:!0,path:!0,vm:!0},e.resolve=function(){return function(t,n){function u(t){t=r.normalize(t);if(e.modules[t])return t;for(var n=0;n=0;i--){if(t[i]==="node_modules")continue;var s=t.slice(0,i+1).join("/")+"/node_modules";n.push(s)}return n}n||(n="/");if(e._core[t])return t;var r=e.modules.path();n=r.resolve("/",n);var i=n||"/";if(t.match(/^(?:\.\.?\/|\/)/)){var s=u(r.resolve(i,t))||a(r.resolve(i,t));if(s)return s}var o=f(t,i);if(o)return o;throw new Error("Cannot find module '"+t+"'")}}(),e.alias=function(t,n){var r=e.modules.path(),i=null;try{i=e.resolve(t+"/package.json","/")}catch(s){i=e.resolve(t,"/")}var o=r.dirname(i),u=(Object.keys||function(e){var t=[];for(var n in e)t.push(n);return t})(e.modules);for(var a=0;a=0;r--){var i=e[r];i=="."?e.splice(r,1):i===".."?(e.splice(r,1),n++):n&&(e.splice(r,1),n--)}if(t)for(;n--;n)e.unshift("..");return e}var f=/^(.+\/(?!$)|\/)?((?:.+?)?(\.[^.]*)?)$/;n.resolve=function(){var e="",t=!1;for(var n=arguments.length;n>=-1&&!t;n--){var r=n>=0?arguments[n]:s.cwd();if(typeof r!="string"||!r)continue;e=r+"/"+e,t=r.charAt(0)==="/"}return e=a(u(e.split("/"),function(e){return!!e}),!t).join("/"),(t?"/":"")+e||"."},n.normalize=function(e){var t=e.charAt(0)==="/",n=e.slice(-1)==="/";return e=a(u(e.split("/"),function(e){return!!e}),!t).join("/"),!e&&!t&&(e="."),e&&n&&(e+="/"),(t?"/":"")+e},n.join=function(){var e=Array.prototype.slice.call(arguments,0);return n.normalize(u(e,function(e,t){return e&&typeof e=="string"}).join("/"))},n.dirname=function(e){var t=f.exec(e)[1]||"",n=!1;return t?t.length===1||n&&t.length<=3&&t.charAt(1)===":"?t:t.substring(0,t.length-1):"."},n.basename=function(e,t){var n=f.exec(e)[2]||"";return t&&n.substr(-1*t.length)===t&&(n=n.substr(0,n.length-t.length)),n},n.extname=function(e){return f.exec(e)[3]||""}}),e.define("__browserify_process",function(e,t,n,r,i,s,o){var s=t.exports={};s.nextTick=function(){var e=typeof window!="undefined"&&window.setImmediate,t=typeof window!="undefined"&&window.postMessage&&window.addEventListener;if(e)return function(e){return window.setImmediate(e)};if(t){var n=[];return window.addEventListener("message",function(e){if(e.source===window&&e.data==="browserify-tick"){e.stopPropagation();if(n.length>0){var t=n.shift();t()}}},!0),function(t){n.push(t),window.postMessage("browserify-tick","*")}}return function(t){setTimeout(t,0)}}(),s.title="browser",s.browser=!0,s.env={},s.argv=[],s.binding=function(t){if(t==="evals")return e("vm");throw new Error("No such module. (Possibly not yet loaded)")},function(){var t="/",n;s.cwd=function(){return t},s.chdir=function(r){n||(n=e("path")),t=n.resolve(r,t)}}()}),e.define("/node_modules/underscore/package.json",function(e,t,n,r,i,s,o){t.exports={main:"underscore.js"}}),e.define("/node_modules/underscore/underscore.js",function(e,t,n,r,i,s,o){(function(){var e=this,r=e._,i={},s=Array.prototype,o=Object.prototype,u=Function.prototype,a=s.push,f=s.slice,l=s.concat,c=o.toString,h=o.hasOwnProperty,p=s.forEach,d=s.map,v=s.reduce,m=s.reduceRight,g=s.filter,y=s.every,b=s.some,w=s.indexOf,E=s.lastIndexOf,S=Array.isArray,x=Object.keys,T=u.bind,N=function(e){if(e instanceof N)return e;if(!(this instanceof N))return new N(e);this._wrapped=e};typeof n!="undefined"?(typeof t!="undefined"&&t.exports&&(n=t.exports=N),n._=N):e._=N,N.VERSION="1.4.3";var C=N.each=N.forEach=function(e,t,n){if(e==null)return;if(p&&e.forEach===p)e.forEach(t,n);else if(e.length===+e.length){for(var r=0,s=e.length;r2;e==null&&(e=[]);if(v&&e.reduce===v)return r&&(t=N.bind(t,r)),i?e.reduce(t,n):e.reduce(t);C(e,function(e,s,o){i?n=t.call(r,n,e,s,o):(n=e,i=!0)});if(!i)throw new TypeError(k);return n},N.reduceRight=N.foldr=function(e,t,n,r){var i=arguments.length>2;e==null&&(e=[]);if(m&&e.reduceRight===m)return r&&(t=N.bind(t,r)),i?e.reduceRight(t,n):e.reduceRight(t);var s=e.length;if(s!==+s){var o=N.keys(e);s=o.length}C(e,function(u,a,f){a=o?o[--s]:--s,i?n=t.call(r,n,e[a],a,f):(n=e[a],i=!0)});if(!i)throw new TypeError(k);return n},N.find=N.detect=function(e,t,n){var r;return L(e,function(e,i,s){if(t.call(n,e,i,s))return r=e,!0}),r},N.filter=N.select=function(e,t,n){var r=[];return e==null?r:g&&e.filter===g?e.filter(t,n):(C(e,function(e,i,s){t.call(n,e,i,s)&&(r[r.length]=e)}),r)},N.reject=function(e,t,n){return N.filter(e,function(e,r,i){return!t.call(n,e,r,i)},n)},N.every=N.all=function(e,t,n){t||(t=N.identity);var r=!0;return e==null?r:y&&e.every===y?e.every(t,n):(C(e,function(e,s,o){if(!(r=r&&t.call(n,e,s,o)))return i}),!!r)};var L=N.some=N.any=function(e,t,n){t||(t=N.identity);var r=!1;return e==null?r:b&&e.some===b?e.some(t,n):(C(e,function(e,s,o){if(r||(r=t.call(n,e,s,o)))return i}),!!r)};N.contains=N.include=function(e,t){return e==null?!1:w&&e.indexOf===w?e.indexOf(t)!=-1:L(e,function(e){return e===t})},N.invoke=function(e,t){var n=f.call(arguments,2);return N.map(e,function(e){return(N.isFunction(t)?t:e[t]).apply(e,n)})},N.pluck=function(e,t){return N.map(e,function(e){return e[t]})},N.where=function(e,t){return N.isEmpty(t)?[]:N.filter(e,function(e){for(var n in t)if(t[n]!==e[n])return!1;return!0})},N.max=function(e,t,n){if(!t&&N.isArray(e)&&e[0]===+e[0]&&e.length<65535)return Math.max.apply(Math,e);if(!t&&N.isEmpty(e))return-Infinity;var r={computed:-Infinity,value:-Infinity};return C(e,function(e,i,s){var o=t?t.call(n,e,i,s):e;o>=r.computed&&(r={value:e,computed:o})}),r.value},N.min=function(e,t,n){if(!t&&N.isArray(e)&&e[0]===+e[0]&&e.length<65535)return Math.min.apply(Math,e);if(!t&&N.isEmpty(e))return Infinity;var r={computed:Infinity,value:Infinity};return C(e,function(e,i,s){var o=t?t.call(n,e,i,s):e;or||n===void 0)return 1;if(n>>1;n.call(r,e[u])=0})})},N.difference=function(e){var t=l.apply(s,f.call(arguments,1));return N.filter(e,function(e){return!N.contains(t,e)})},N.zip=function(){var e=f.call(arguments),t=N.max(N.pluck(e,"length")),n=new Array(t);for(var r=0;r=0;n--)t=[e[n].apply(this,t)];return t[0]}},N.after=function(e,t){return e<=0?t():function(){if(--e<1)return t.apply(this,arguments)}},N.keys=x||function(e){if(e!==Object(e))throw new TypeError("Invalid object");var t=[];for(var n in e)N.has(e,n)&&(t[t.length]=n);return t},N.values=function(e){var t=[];for(var n in e)N.has(e,n)&&t.push(e[n]);return t},N.pairs=function(e){var t=[];for(var n in e)N.has(e,n)&&t.push([n,e[n]]);return t},N.invert=function(e){var t={};for(var n in e)N.has(e,n)&&(t[e[n]]=n);return t},N.functions=N.methods=function(e){var t=[];for(var n in e)N.isFunction(e[n])&&t.push(n);return t.sort()},N.extend=function(e){return C(f.call(arguments,1),function(t){if(t)for(var n in t)e[n]=t[n]}),e},N.pick=function(e){var t={},n=l.apply(s,f.call(arguments,1));return C(n,function(n){n in e&&(t[n]=e[n])}),t},N.omit=function(e){var t={},n=l.apply(s,f.call(arguments,1));for(var r in e)N.contains(n,r)||(t[r]=e[r]);return t},N.defaults=function(e){return C(f.call(arguments,1),function(t){if(t)for(var n in t)e[n]==null&&(e[n]=t[n])}),e},N.clone=function(e){return N.isObject(e)?N.isArray(e)?e.slice():N.extend({},e):e},N.tap=function(e,t){return t(e),e};var D=function(e,t,n,r){if(e===t)return e!==0||1/e==1/t;if(e==null||t==null)return e===t;e instanceof N&&(e=e._wrapped),t instanceof N&&(t=t._wrapped);var i=c.call(e);if(i!=c.call(t))return!1;switch(i){case"[object String]":return e==String(t);case"[object Number]":return e!=+e?t!=+t:e==0?1/e==1/t:e==+t;case"[object Date]":case"[object Boolean]":return+e==+t;case"[object RegExp]":return e.source==t.source&&e.global==t.global&&e.multiline==t.multiline&&e.ignoreCase==t.ignoreCase}if(typeof e!="object"||typeof t!="object")return!1;var s=n.length;while(s--)if(n[s]==e)return r[s]==t;n.push(e),r.push(t);var o=0,u=!0;if(i=="[object Array]"){o=e.length,u=o==t.length;if(u)while(o--)if(!(u=D(e[o],t[o],n,r)))break}else{var a=e.constructor,f=t.constructor;if(a!==f&&!(N.isFunction(a)&&a instanceof a&&N.isFunction(f)&&f instanceof f))return!1;for(var l in e)if(N.has(e,l)){o++;if(!(u=N.has(t,l)&&D(e[l],t[l],n,r)))break}if(u){for(l in t)if(N.has(t,l)&&!(o--))break;u=!o}}return n.pop(),r.pop(),u};N.isEqual=function(e,t){return D(e,t,[],[])},N.isEmpty=function(e){if(e==null)return!0;if(N.isArray(e)||N.isString(e))return e.length===0;for(var t in e)if(N.has(e,t))return!1;return!0},N.isElement=function(e){return!!e&&e.nodeType===1},N.isArray=S||function(e){return c.call(e)=="[object Array]"},N.isObject=function(e){return e===Object(e)},C(["Arguments","Function","String","Number","Date","RegExp"],function(e){N["is"+e]=function(t){return c.call(t)=="[object "+e+"]"}}),N.isArguments(arguments)||(N.isArguments=function(e){return!!e&&!!N.has(e,"callee")}),typeof /./!="function"&&(N.isFunction=function(e){return typeof e=="function"}),N.isFinite=function(e){return isFinite(e)&&!isNaN(parseFloat(e))},N.isNaN=function(e){return N.isNumber(e)&&e!=+e},N.isBoolean=function(e){return e===!0||e===!1||c.call(e)=="[object Boolean]"},N.isNull=function(e){return e===null},N.isUndefined=function(e){return e===void 0},N.has=function(e,t){return h.call(e,t)},N.noConflict=function(){return e._=r,this},N.identity=function(e){return e},N.times=function(e,t,n){var r=Array(e);for(var i=0;i":">",'"':""","'":"'","/":"/"}};P.unescape=N.invert(P.escape);var H={escape:new RegExp("["+N.keys(P.escape).join("")+"]","g"),unescape:new RegExp("("+N.keys(P.unescape).join("|")+")","g")};N.each(["escape","unescape"],function(e){N[e]=function(t){return t==null?"":(""+t).replace(H[e],function(t){return P[e][t]})}}),N.result=function(e,t){if(e==null)return null;var n=e[t];return N.isFunction(n)?n.call(e):n},N.mixin=function(e){C(N.functions(e),function(t){var n=N[t]=e[t];N.prototype[t]=function(){var e=[this._wrapped];return a.apply(e,arguments),q.call(this,n.apply(N,e))}})};var B=0;N.uniqueId=function(e){var t=""+ ++B;return e?e+t:t},N.templateSettings={evaluate:/<%([\s\S]+?)%>/g,interpolate:/<%=([\s\S]+?)%>/g,escape:/<%-([\s\S]+?)%>/g};var j=/(.)^/,F={"'":"'","\\":"\\","\r":"r","\n":"n"," ":"t","\u2028":"u2028","\u2029":"u2029"},I=/\\|'|\r|\n|\t|\u2028|\u2029/g;N.template=function(e,t,n){n=N.defaults({},n,N.templateSettings);var r=new RegExp([(n.escape||j).source,(n.interpolate||j).source,(n.evaluate||j).source].join("|")+"|$","g"),i=0,s="__p+='";e.replace(r,function(t,n,r,o,u){return s+=e.slice(i,u).replace(I,function(e){return"\\"+F[e]}),n&&(s+="'+\n((__t=("+n+"))==null?'':_.escape(__t))+\n'"),r&&(s+="'+\n((__t=("+r+"))==null?'':__t)+\n'"),o&&(s+="';\n"+o+"\n__p+='"),i=u+t.length,t}),s+="';\n",n.variable||(s="with(obj||{}){\n"+s+"}\n"),s="var __t,__p='',__j=Array.prototype.join,print=function(){__p+=__j.call(arguments,'');};\n"+s+"return __p;\n";try{var o=new Function(n.variable||"obj","_",s)}catch(u){throw u.source=s,u}if(t)return o(t,N);var a=function(e){return o.call(this,e,N)};return a.source="function("+(n.variable||"obj")+"){\n"+s+"}",a},N.chain=function(e){return N(e).chain()};var q=function(e){return this._chain?N(e).chain():e};N.mixin(N),C(["pop","push","reverse","shift","sort","splice","unshift"],function(e){var t=s[e];N.prototype[e]=function(){var n=this._wrapped;return t.apply(n,arguments),(e=="shift"||e=="splice")&&n.length===0&&delete n[0],q.call(this,n)}}),C(["concat","join","slice"],function(e){var t=s[e];N.prototype[e]=function(){return q.call(this,t.apply(this._wrapped,arguments))}}),N.extend(N.prototype,{chain:function(){return this._chain=!0,this},value:function(){return this._wrapped}})}).call(this)}),e.define("/node_modules/backbone/package.json",function(e,t,n,r,i,s,o){t.exports={main:"backbone.js"}}),e.define("/node_modules/backbone/backbone.js",function(e,t,n,r,i,s,o){(function(){var t=this,r=t.Backbone,i=[],s=i.push,o=i.slice,u=i.splice,a;typeof n!="undefined"?a=n:a=t.Backbone={},a.VERSION="0.9.9";var f=t._;!f&&typeof e!="undefined"&&(f=e("underscore")),a.$=t.jQuery||t.Zepto||t.ender,a.noConflict=function(){return t.Backbone=r,this},a.emulateHTTP=!1,a.emulateJSON=!1;var l=/\s+/,c=function(e,t,n,r){if(!n)return!0;if(typeof n=="object")for(var i in n)e[t].apply(e,[i,n[i]].concat(r));else{if(!l.test(n))return!0;var s=n.split(l);for(var o=0,u=s.length;o=0;r-=2)this.trigger("change:"+n[r],this,n[r+1],e);if(t)return this;while(this._pending)this._pending=!1,this.trigger("change",this,e),this._previousAttributes=f.clone(this.attributes);return this._changing=!1,this},hasChanged:function(e){return this._hasComputed||this._computeChanges(),e==null?!f.isEmpty(this.changed):f.has(this.changed,e)},changedAttributes:function(e){if(!e)return this.hasChanged()?f.clone(this.changed):!1;var t,n=!1,r=this._previousAttributes;for(var i in e){if(f.isEqual(r[i],t=e[i]))continue;(n||(n={}))[i]=t}return n},_computeChanges:function(e){this.changed={};var t={},n=[],r=this._currentAttributes,i=this._changes;for(var s=i.length-2;s>=0;s-=2){var o=i[s],u=i[s+1];if(t[o])continue;t[o]=!0;if(r[o]!==u){this.changed[o]=u;if(!e)continue;n.push(o,u),r[o]=u}}return e&&(this._changes=[]),this._hasComputed=!0,n},previous:function(e){return e==null||!this._previousAttributes?null:this._previousAttributes[e]},previousAttributes:function(){return f.clone(this._previousAttributes)},_validate:function(e,t){if(!this.validate)return!0;e=f.extend({},this.attributes,e);var n=this.validate(e,t);return n?(t&&t.error&&t.error(this,n,t),this.trigger("error",this,n,t),!1):!0}});var v=a.Collection=function(e,t){t||(t={}),t.model&&(this.model=t.model),t.comparator!==void 0&&(this.comparator=t.comparator),this._reset(),this.initialize.apply(this,arguments),e&&this.reset(e,f.extend({silent:!0},t))};f.extend(v.prototype,p,{model:d,initialize:function(){},toJSON:function(e){return this.map(function(t){return t.toJSON(e)})},sync:function(){return a.sync.apply(this,arguments)},add:function(e,t){var n,r,i,o,a,l,c=t&&t.at,h=(t&&t.sort)==null?!0:t.sort;e=f.isArray(e)?e.slice():[e];for(n=e.length-1;n>=0;n--){if(!(o=this._prepareModel(e[n],t))){this.trigger("error",this,e[n],t),e.splice(n,1);continue}e[n]=o,a=o.id!=null&&this._byId[o.id];if(a||this._byCid[o.cid]){t&&t.merge&&a&&(a.set(o.attributes,t),l=h),e.splice(n,1);continue}o.on("all",this._onModelEvent,this),this._byCid[o.cid]=o,o.id!=null&&(this._byId[o.id]=o)}e.length&&(l=h),this.length+=e.length,r=[c!=null?c:this.models.length,0],s.apply(r,e),u.apply(this.models,r),l&&this.comparator&&c==null&&this.sort({silent:!0});if(t&&t.silent)return this;while(o=e.shift())o.trigger("add",o,this,t);return this},remove:function(e,t){var n,r,i,s;t||(t={}),e=f.isArray(e)?e.slice():[e];for(n=0,r=e.length;n').hide().appendTo("body")[0].contentWindow,this.navigate(t)),this._hasPushState?a.$(window).bind("popstate",this.checkUrl):this._wantsHashChange&&"onhashchange"in window&&!r?a.$(window).bind("hashchange",this.checkUrl):this._wantsHashChange&&(this._checkUrlInterval=setInterval(this.checkUrl,this.interval)),this.fragment=t;var i=this.location,s=i.pathname.replace(/[^\/]$/,"$&/")===this.root;if(this._wantsHashChange&&this._wantsPushState&&!this._hasPushState&&!s)return this.fragment=this.getFragment(null,!0),this.location.replace(this.root+this.location.search+"#"+this.fragment),!0;this._wantsPushState&&this._hasPushState&&s&&i.hash&&(this.fragment=this.getHash().replace(T,""),this.history.replaceState({},document.title,this.root+this.fragment+i.search));if(!this.options.silent)return this.loadUrl()},stop:function(){a.$(window).unbind("popstate",this.checkUrl).unbind("hashchange",this.checkUrl),clearInterval(this._checkUrlInterval),x.started=!1},route:function(e,t){this.handlers.unshift({route:e,callback:t})},checkUrl:function(e){var t=this.getFragment();t===this.fragment&&this.iframe&&(t=this.getFragment(this.getHash(this.iframe)));if(t===this.fragment)return!1;this.iframe&&this.navigate(t),this.loadUrl()||this.loadUrl(this.getHash())},loadUrl:function(e){var t=this.fragment=this.getFragment(e),n=f.any(this.handlers,function(e){if(e.route.test(t))return e.callback(t),!0});return n},navigate:function(e,t){if(!x.started)return!1;if(!t||t===!0)t={trigger:t};e=this.getFragment(e||"");if(this.fragment===e)return;this.fragment=e;var n=this.root+e;if(this._hasPushState)this.history[t.replace?"replaceState":"pushState"]({},document.title,n);else{if(!this._wantsHashChange)return this.location.assign(n);this._updateHash(this.location,e,t.replace),this.iframe&&e!==this.getFragment(this.getHash(this.iframe))&&(t.replace||this.iframe.document.open().close(),this._updateHash(this.iframe.location,e,t.replace))}t.trigger&&this.loadUrl(e)},_updateHash:function(e,t,n){if(n){var r=e.href.replace(/(javascript:|#).*$/,"");e.replace(r+"#"+t)}else e.hash="#"+t}}),a.history=new x;var L=a.View=function(e){this.cid=f.uniqueId("view"),this._configure(e||{}),this._ensureElement(),this.initialize.apply(this,arguments),this.delegateEvents()},A=/^(\S+)\s*(.*)$/,O=["model","collection","el","id","attributes","className","tagName","events"];f.extend(L.prototype,p,{tagName:"div",$:function(e){return this.$el.find(e)},initialize:function(){},render:function(){return this},remove:function(){return this.$el.remove(),this.stopListening(),this},make:function(e,t,n){var r=document.createElement(e);return t&&a.$(r).attr(t),n!=null&&a.$(r).html(n),r},setElement:function(e,t){return this.$el&&this.undelegateEvents(),this.$el=e instanceof a.$?e:a.$(e),this.el=this.$el[0],t!==!1&&this.delegateEvents(),this},delegateEvents:function(e){if(!e&&!(e=f.result(this,"events")))return;this.undelegateEvents();for(var t in e){var n=e[t];f.isFunction(n)||(n=this[e[t]]);if(!n)throw new Error('Method "'+e[t]+'" does not exist');var r=t.match(A),i=r[1],s=r[2];n=f.bind(n,this),i+=".delegateEvents"+this.cid,s===""?this.$el.bind(i,n):this.$el.delegate(s,i,n)}},undelegateEvents:function(){this.$el.unbind(".delegateEvents"+this.cid)},_configure:function(e){this.options&&(e=f.extend({},f.result(this,"options"),e)),f.extend(this,f.pick(e,O)),this.options=e},_ensureElement:function(){if(!this.el){var e=f.extend({},f.result(this,"attributes"));this.id&&(e.id=f.result(this,"id")),this.className&&(e["class"]=f.result(this,"className")),this.setElement(this.make(f.result(this,"tagName"),e),!1)}else this.setElement(f.result(this,"el"),!1)}});var M={create:"POST",update:"PUT",patch:"PATCH","delete":"DELETE",read:"GET"};a.sync=function(e,t,n){var r=M[e];f.defaults(n||(n={}),{emulateHTTP:a.emulateHTTP,emulateJSON:a.emulateJSON});var i={type:r,dataType:"json"};n.url||(i.url=f.result(t,"url")||D()),n.data==null&&t&&(e==="create"||e==="update"||e==="patch")&&(i.contentType="application/json",i.data=JSON.stringify(n.attrs||t.toJSON(n))),n.emulateJSON&&(i.contentType="application/x-www-form-urlencoded",i.data=i.data?{model:i.data}:{});if(n.emulateHTTP&&(r==="PUT"||r==="DELETE"||r==="PATCH")){i.type="POST",n.emulateJSON&&(i.data._method=r);var s=n.beforeSend;n.beforeSend=function(e){e.setRequestHeader("X-HTTP-Method-Override",r);if(s)return s.apply(this,arguments)}}i.type!=="GET"&&!n.emulateJSON&&(i.processData=!1);var o=n.success;n.success=function(e,r,i){o&&o(e,r,i),t.trigger("sync",t,e,n)};var u=n.error;n.error=function(e,r,i){u&&u(t,e,n),t.trigger("error",t,e,n)};var l=a.ajax(f.extend(i,n));return t.trigger("request",t,l,n),l},a.ajax=function(){return a.$.ajax.apply(a.$,arguments)};var _=function(e,t){var n=this,r;e&&f.has(e,"constructor")?r=e.constructor:r=function(){n.apply(this,arguments)},f.extend(r,n,t);var i=function(){this.constructor=r};return i.prototype=n.prototype,r.prototype=new i,e&&f.extend(r.prototype,e),r.__super__=n.prototype,r};d.extend=v.extend=y.extend=L.extend=x.extend=_;var D=function(){throw new Error('A "url" property or function must be specified')}}).call(this)}),e.define("/node_modules/backbone/node_modules/underscore/package.json",function(e,t,n,r,i,s,o){t.exports={main:"underscore.js"}}),e.define("/node_modules/backbone/node_modules/underscore/underscore.js",function(e,t,n,r,i,s,o){(function(){var e=this,r=e._,i={},s=Array.prototype,o=Object.prototype,u=Function.prototype,a=s.push,f=s.slice,l=s.concat,c=o.toString,h=o.hasOwnProperty,p=s.forEach,d=s.map,v=s.reduce,m=s.reduceRight,g=s.filter,y=s.every,b=s.some,w=s.indexOf,E=s.lastIndexOf,S=Array.isArray,x=Object.keys,T=u.bind,N=function(e){if(e instanceof N)return e;if(!(this instanceof N))return new N(e);this._wrapped=e};typeof n!="undefined"?(typeof t!="undefined"&&t.exports&&(n=t.exports=N),n._=N):e._=N,N.VERSION="1.4.3";var C=N.each=N.forEach=function(e,t,n){if(e==null)return;if(p&&e.forEach===p)e.forEach(t,n);else if(e.length===+e.length){for(var r=0,s=e.length;r2;e==null&&(e=[]);if(v&&e.reduce===v)return r&&(t=N.bind(t,r)),i?e.reduce(t,n):e.reduce(t);C(e,function(e,s,o){i?n=t.call(r,n,e,s,o):(n=e,i=!0)});if(!i)throw new TypeError(k);return n},N.reduceRight=N.foldr=function(e,t,n,r){var i=arguments.length>2;e==null&&(e=[]);if(m&&e.reduceRight===m)return r&&(t=N.bind(t,r)),i?e.reduceRight(t,n):e.reduceRight(t);var s=e.length;if(s!==+s){var o=N.keys(e);s=o.length}C(e,function(u,a,f){a=o?o[--s]:--s,i?n=t.call(r,n,e[a],a,f):(n=e[a],i=!0)});if(!i)throw new TypeError(k);return n},N.find=N.detect=function(e,t,n){var r;return L(e,function(e,i,s){if(t.call(n,e,i,s))return r=e,!0}),r},N.filter=N.select=function(e,t,n){var r=[];return e==null?r:g&&e.filter===g?e.filter(t,n):(C(e,function(e,i,s){t.call(n,e,i,s)&&(r[r.length]=e)}),r)},N.reject=function(e,t,n){return N.filter(e,function(e,r,i){return!t.call(n,e,r,i)},n)},N.every=N.all=function(e,t,n){t||(t=N.identity);var r=!0;return e==null?r:y&&e.every===y?e.every(t,n):(C(e,function(e,s,o){if(!(r=r&&t.call(n,e,s,o)))return i}),!!r)};var L=N.some=N.any=function(e,t,n){t||(t=N.identity);var r=!1;return e==null?r:b&&e.some===b?e.some(t,n):(C(e,function(e,s,o){if(r||(r=t.call(n,e,s,o)))return i}),!!r)};N.contains=N.include=function(e,t){return e==null?!1:w&&e.indexOf===w?e.indexOf(t)!=-1:L(e,function(e){return e===t})},N.invoke=function(e,t){var n=f.call(arguments,2);return N.map(e,function(e){return(N.isFunction(t)?t:e[t]).apply(e,n)})},N.pluck=function(e,t){return N.map(e,function(e){return e[t]})},N.where=function(e,t){return N.isEmpty(t)?[]:N.filter(e,function(e){for(var n in t)if(t[n]!==e[n])return!1;return!0})},N.max=function(e,t,n){if(!t&&N.isArray(e)&&e[0]===+e[0]&&e.length<65535)return Math.max.apply(Math,e);if(!t&&N.isEmpty(e))return-Infinity;var r={computed:-Infinity,value:-Infinity};return C(e,function(e,i,s){var o=t?t.call(n,e,i,s):e;o>=r.computed&&(r={value:e,computed:o})}),r.value},N.min=function(e,t,n){if(!t&&N.isArray(e)&&e[0]===+e[0]&&e.length<65535)return Math.min.apply(Math,e);if(!t&&N.isEmpty(e))return Infinity;var r={computed:Infinity,value:Infinity};return C(e,function(e,i,s){var o=t?t.call(n,e,i,s):e;or||n===void 0)return 1;if(n>>1;n.call(r,e[u])=0})})},N.difference=function(e){var t=l.apply(s,f.call(arguments,1));return N.filter(e,function(e){return!N.contains(t,e)})},N.zip=function(){var e=f.call(arguments),t=N.max(N.pluck(e,"length")),n=new Array(t);for(var r=0;r=0;n--)t=[e[n].apply(this,t)];return t[0]}},N.after=function(e,t){return e<=0?t():function(){if(--e<1)return t.apply(this,arguments)}},N.keys=x||function(e){if(e!==Object(e))throw new TypeError("Invalid object");var t=[];for(var n in e)N.has(e,n)&&(t[t.length]=n);return t},N.values=function(e){var t=[];for(var n in e)N.has(e,n)&&t.push(e[n]);return t},N.pairs=function(e){var t=[];for(var n in e)N.has(e,n)&&t.push([n,e[n]]);return t},N.invert=function(e){var t={};for(var n in e)N.has(e,n)&&(t[e[n]]=n);return t},N.functions=N.methods=function(e){var t=[];for(var n in e)N.isFunction(e[n])&&t.push(n);return t.sort()},N.extend=function(e){return C(f.call(arguments,1),function(t){if(t)for(var n in t)e[n]=t[n]}),e},N.pick=function(e){var t={},n=l.apply(s,f.call(arguments,1));return C(n,function(n){n in e&&(t[n]=e[n])}),t},N.omit=function(e){var t={},n=l.apply(s,f.call(arguments,1));for(var r in e)N.contains(n,r)||(t[r]=e[r]);return t},N.defaults=function(e){return C(f.call(arguments,1),function(t){if(t)for(var n in t)e[n]==null&&(e[n]=t[n])}),e},N.clone=function(e){return N.isObject(e)?N.isArray(e)?e.slice():N.extend({},e):e},N.tap=function(e,t){return t(e),e};var D=function(e,t,n,r){if(e===t)return e!==0||1/e==1/t;if(e==null||t==null)return e===t;e instanceof N&&(e=e._wrapped),t instanceof N&&(t=t._wrapped);var i=c.call(e);if(i!=c.call(t))return!1;switch(i){case"[object String]":return e==String(t);case"[object Number]":return e!=+e?t!=+t:e==0?1/e==1/t:e==+t;case"[object Date]":case"[object Boolean]":return+e==+t;case"[object RegExp]":return e.source==t.source&&e.global==t.global&&e.multiline==t.multiline&&e.ignoreCase==t.ignoreCase}if(typeof e!="object"||typeof t!="object")return!1;var s=n.length;while(s--)if(n[s]==e)return r[s]==t;n.push(e),r.push(t);var o=0,u=!0;if(i=="[object Array]"){o=e.length,u=o==t.length;if(u)while(o--)if(!(u=D(e[o],t[o],n,r)))break}else{var a=e.constructor,f=t.constructor;if(a!==f&&!(N.isFunction(a)&&a instanceof a&&N.isFunction(f)&&f instanceof f))return!1;for(var l in e)if(N.has(e,l)){o++;if(!(u=N.has(t,l)&&D(e[l],t[l],n,r)))break}if(u){for(l in t)if(N.has(t,l)&&!(o--))break;u=!o}}return n.pop(),r.pop(),u};N.isEqual=function(e,t){return D(e,t,[],[])},N.isEmpty=function(e){if(e==null)return!0;if(N.isArray(e)||N.isString(e))return e.length===0;for(var t in e)if(N.has(e,t))return!1;return!0},N.isElement=function(e){return!!e&&e.nodeType===1},N.isArray=S||function(e){return c.call(e)=="[object Array]"},N.isObject=function(e){return e===Object(e)},C(["Arguments","Function","String","Number","Date","RegExp"],function(e){N["is"+e]=function(t){return c.call(t)=="[object "+e+"]"}}),N.isArguments(arguments)||(N.isArguments=function(e){return!!e&&!!N.has(e,"callee")}),typeof /./!="function"&&(N.isFunction=function(e){return typeof e=="function"}),N.isFinite=function(e){return isFinite(e)&&!isNaN(parseFloat(e))},N.isNaN=function(e){return N.isNumber(e)&&e!=+e},N.isBoolean=function(e){return e===!0||e===!1||c.call(e)=="[object Boolean]"},N.isNull=function(e){return e===null},N.isUndefined=function(e){return e===void 0},N.has=function(e,t){return h.call(e,t)},N.noConflict=function(){return e._=r,this},N.identity=function(e){return e},N.times=function(e,t,n){var r=Array(e);for(var i=0;i":">",'"':""","'":"'","/":"/"}};P.unescape=N.invert(P.escape);var H={escape:new RegExp("["+N.keys(P.escape).join("")+"]","g"),unescape:new RegExp("("+N.keys(P.unescape).join("|")+")","g")};N.each(["escape","unescape"],function(e){N[e]=function(t){return t==null?"":(""+t).replace(H[e],function(t){return P[e][t]})}}),N.result=function(e,t){if(e==null)return null;var n=e[t];return N.isFunction(n)?n.call(e):n},N.mixin=function(e){C(N.functions(e),function(t){var n=N[t]=e[t];N.prototype[t]=function(){var e=[this._wrapped];return a.apply(e,arguments),q.call(this,n.apply(N,e))}})};var B=0;N.uniqueId=function(e){var t=""+ ++B;return e?e+t:t},N.templateSettings={evaluate:/<%([\s\S]+?)%>/g,interpolate:/<%=([\s\S]+?)%>/g,escape:/<%-([\s\S]+?)%>/g};var j=/(.)^/,F={"'":"'","\\":"\\","\r":"r","\n":"n"," ":"t","\u2028":"u2028","\u2029":"u2029"},I=/\\|'|\r|\n|\t|\u2028|\u2029/g;N.template=function(e,t,n){n=N.defaults({},n,N.templateSettings);var r=new RegExp([(n.escape||j).source,(n.interpolate||j).source,(n.evaluate||j).source].join("|")+"|$","g"),i=0,s="__p+='";e.replace(r,function(t,n,r,o,u){return s+=e.slice(i,u).replace(I,function(e){return"\\"+F[e]}),n&&(s+="'+\n((__t=("+n+"))==null?'':_.escape(__t))+\n'"),r&&(s+="'+\n((__t=("+r+"))==null?'':__t)+\n'"),o&&(s+="';\n"+o+"\n__p+='"),i=u+t.length,t}),s+="';\n",n.variable||(s="with(obj||{}){\n"+s+"}\n"),s="var __t,__p='',__j=Array.prototype.join,print=function(){__p+=__j.call(arguments,'');};\n"+s+"return __p;\n";try{var o=new Function(n.variable||"obj","_",s)}catch(u){throw u.source=s,u}if(t)return o(t,N);var a=function(e){return o.call(this,e,N)};return a.source="function("+(n.variable||"obj")+"){\n"+s+"}",a},N.chain=function(e){return N(e).chain()};var q=function(e){return this._chain?N(e).chain():e};N.mixin(N),C(["pop","push","reverse","shift","sort","splice","unshift"],function(e){var t=s[e];N.prototype[e]=function(){var n=this._wrapped;return t.apply(n,arguments),(e=="shift"||e=="splice")&&n.length===0&&delete n[0],q.call(this,n)}}),C(["concat","join","slice"],function(e){var t=s[e];N.prototype[e]=function(){return q.call(this,t.apply(this._wrapped,arguments))}}),N.extend(N.prototype,{chain:function(){return this._chain=!0,this},value:function(){return this._wrapped}})}).call(this)}),e.define("/src/js/util/constants.js",function(e,t,n,r,i,s,o){var u={betweenCommandsDelay:400},a={isAnimating:!1},f={minZoom:.55,maxZoom:1.25,minWidth:600,minHeight:600},l={arrowHeadSize:8,nodeRadius:17,curveControlPointOffset:50,defaultEasing:"easeInOut",defaultAnimationTime:400,rectFill:"hsb(0.8816909813322127,0.7,1)",headRectFill:"#2831FF",rectStroke:"#FFF",rectStrokeWidth:"3",multiBranchY:20,upstreamHeadOpacity:.5,upstreamNoneOpacity:.2,edgeUpstreamHeadOpacity:.4,edgeUpstreamNoneOpacity:.15,visBranchStrokeWidth:2,visBranchStrokeColorNone:"#333",defaultNodeFill:"hsba(0.5,0.8,0.7,1)",defaultNodeStrokeWidth:2,defaultNodeStroke:"#FFF",orphanNodeFill:"hsb(0.5,0.8,0.7)"};n.GLOBAL=a,n.TIME=u,n.GRAPHICS=l,n.VIEWPORT=f}),e.define("/src/js/util/index.js",function(e,t,n,r,i,s,o){var u=e("underscore");n.isBrowser=function(){var e=String(typeof window)!=="undefined";return e},n.splitTextCommand=function(e,t,n){t=u.bind(t,n),u.each(e.split(";"),function(e,n){e=u.escape(e),e=e.replace(/^(\s+)/,"").replace(/(\s+)$/,"").replace(/"/g,'"').replace(/'/g,"'");if(n>0&&!e.length)return;t(e)})},n.genParseCommand=function(e,t){return function(n){var r,i;return u.each(e,function(e,t){var s=e.exec(n);s&&(r=t,i=s)}),r?{toSet:{eventName:t,method:r,regexResults:i}}:!1}}}),e.define("/src/js/level/sandbox.js",function(e,t,n,r,i,s,o){var u=e("underscore"),a=e("q"),f=e("../util").isBrowser()?window.Backbone:e("backbone"),l=e("../util"),c=e("../app"),h=e("../visuals/visualization").Visualization,p=e("../level/parseWaterfall").ParseWaterfall,d=e("../level/disabledMap").DisabledMap,v=e("../models/commandModel").Command,m=e("../git/gitShim").GitShim,g=e("../views"),y=g.ModalTerminal,b=g.ModalAlert,w=e("../views/builderViews"),E=e("../views/multiView").MultiView,S=f.View.extend({tagName:"div",initialize:function(e){e=e||{},this.options=e,this.initVisualization(e),this.initCommandCollection(e),this.initParseWaterfall(e),this.initGitShim(e),e.wait||this.takeControl()},getDefaultVisEl:function(){return $("#mainVisSpace")[0]},getAnimationTime:function(){return 1050},initVisualization:function(e){this.mainVis=new h({el:e.el||this.getDefaultVisEl()})},initCommandCollection:function(e){this.commandCollection=c.getCommandUI().commandCollection},initParseWaterfall:function(e){this.parseWaterfall=new p},initGitShim:function(e){},takeControl:function(){c.getEventBaton().stealBaton("commandSubmitted",this.commandSubmitted,this),c.getEventBaton().stealBaton("processSandboxCommand",this.processSandboxCommand,this),c.getEventBaton().stealBaton("levelExited",this.levelExited,this),this.insertGitShim()},releaseControl:function(){c.getEventBaton().releaseBaton("commandSubmitted",this.commandSubmitted,this),c.getEventBaton().releaseBaton("processSandboxCommand",this.processSandboxCommand,this),c.getEventBaton().releaseBaton("levelExited",this.levelExited,this),this.releaseGitShim()},releaseGitShim:function(){this.gitShim&&this.gitShim.removeShim()},insertGitShim:function(){this.gitShim&&this.mainVis.customEvents.on("gitEngineReady",function(){this.gitShim.insertShim()},this)},commandSubmitted:function(e){c.getEvents().trigger("commandSubmittedPassive",e),l.splitTextCommand(e,function(e){this.commandCollection.add(new v({rawStr:e,parseWaterfall:this.parseWaterfall}))},this)},startLevel:function(t,n){var r=t.get("regexResults")||[],i=r[1]||"",s=c.getLevelArbiter().getLevel(i);if(!s){t.addWarning('A level for that id "'+i+'" was not found!! Opening up level selection view...'),c.getEventBaton().trigger("commandSubmitted","levels"),t.set("status","error"),n.resolve();return}this.hide(),this.clear();var o=a.defer(),u=e("../level").Level;this.currentLevel=new u({level:s,deferred:o,command:t}),o.promise.then(function(){t.finishWith(n)})},buildLevel:function(t,n){this.hide(),this.clear();var r=a.defer(),i=e("../level/builder").LevelBuilder;this.levelBuilder=new i({deferred:r}),r.promise.then(function(){t.finishWith(n)})},exitLevel:function(e,t){e.addWarning("You aren't in a level! You are in a sandbox, start a level with `level [id]`"),e.set("status","error"),t.resolve()},showLevels:function(e,t){var n=a.defer();c.getLevelDropdown().show(n,e),n.promise.done(function(){e.finishWith(t)})},resetSolved:function(e,t){c.getLevelArbiter().resetSolvedMap(),e.addWarning("Solved map was reset, you are starting from a clean slate!"),e.finishWith(t)},processSandboxCommand:function(e,t){var n={"reset solved":this.resetSolved,"help general":this.helpDialog,help:this.helpDialog,reset:this.reset,delay:this.delay,clear:this.clear,"exit level":this.exitLevel,level:this.startLevel,sandbox:this.exitLevel,levels:this.showLevels,mobileAlert:this.mobileAlert,"build level":this.buildLevel,"export tree":this.exportTree,"import tree":this.importTree,"import level":this.importLevel},r=n[e.get("method")];if(!r)throw new Error("no method for that wut");r.apply(this,[e,t])},hide:function(){this.mainVis.hide()},levelExited:function(){this.show()},show:function(){this.mainVis.show()},importTree:function(e,t){var n=new w.MarkdownPresenter({previewText:"Paste a tree JSON blob below!",fillerText:" "});n.deferred.promise.then(u.bind(function(e){try{this.mainVis.gitEngine.loadTree(JSON.parse(e))}catch(t){this.mainVis.reset(),new E({childViews:[{type:"ModalAlert",options:{markdowns:["## Error!","","Something is wrong with that JSON! Here is the error:","",String(t)]}}]})}},this)).fail(function(){}).done(function(){e.finishWith(t)})},importLevel:function(t,n){var r=new w.MarkdownPresenter({previewText:"Paste a level JSON blob in here!",fillerText:" "});r.deferred.promise.then(u.bind(function(r){var i=e("../level").Level;try{var s=JSON.parse(r),o=a.defer();this.currentLevel=new i({level:s,deferred:o,command:t}),o.promise.then(function(){t.finishWith(n)})}catch(u){new E({childViews:[{type:"ModalAlert",options:{markdowns:["## Error!","","Something is wrong with that level JSON, this happened:","",String(u)]}}]}),t.finishWith(n)}},this)).fail(function(){t.finishWith(n)}).done()},exportTree:function(e,t){var n=JSON.stringify(this.mainVis.gitEngine.exportTree(),null,2),r=new E({childViews:[{type:"MarkdownPresenter",options:{previewText:'Share this tree with friends! They can load it with "import tree"',fillerText:n,noConfirmCancel:!0}}]});r.getPromise().then(function(){e.finishWith(t)}).done()},clear:function(e,t){c.getEvents().trigger("clearOldCommands"),e&&t&&e.finishWith(t)},mobileAlert:function(e,t){alert("Can't bring up the keyboard on mobile / tablet :( try visiting on desktop! :D"),e.finishWith(t)},delay:function(e,t){var n=parseInt(e.get("regexResults")[1],10);setTimeout(function(){e.finishWith(t)},n)},reset:function(e,t){this.mainVis.reset(),setTimeout(function(){e.finishWith(t)},this.mainVis.getAnimationTime())},helpDialog:function(t,n){var r=new E({childViews:e("../dialogs/sandbox").dialog});r.getPromise().then(u.bind(function(){t.finishWith(n)},this)).done()}});n.Sandbox=S}),e.define("/node_modules/q/package.json",function(e,t,n,r,i,s,o){t.exports={main:"q.js"}}),e.define("/node_modules/q/q.js",function(e,t,n,r,i,s,o){(function(e){if(typeof bootstrap=="function")bootstrap("promise",e);else if(typeof n=="object")e(void 0,n);else if(typeof define=="function")define(e);else if(typeof ses!="undefined"){if(!ses.ok())return;ses.makeQ=function(){var t={};return e(void 0,t)}}else e(void 0,Q={})})(function(e,t){"use strict";function w(e){return b(e)==="[object StopIteration]"||e instanceof E}function x(e,t){t.stack&&typeof e=="object"&&e!==null&&e.stack&&e.stack.indexOf(S)===-1&&(e.stack=T(e.stack)+"\n"+S+"\n"+T(t.stack))}function T(e){var t=e.split("\n"),n=[];for(var r=0;r=n&&s<=Nt}function k(){if(Error.captureStackTrace){var e,t,n=Error.prepareStackTrace;return Error.prepareStackTrace=function(n,r){e=r[1].getFileName(),t=r[1].getLineNumber()},(new Error).stack,Error.prepareStackTrace=n,r=e,t}}function L(e,t,n){return function(){return typeof console!="undefined"&&typeof console.warn=="function"&&console.warn(t+" is deprecated, use "+n+" instead.",(new Error("")).stack),e.apply(e,arguments)}}function A(){function s(r){if(!e)return;n=U(r),d(e,function(e,t){u(function(){n.promiseSend.apply(n,t)})},void 0),e=void 0,t=void 0}var e=[],t=[],n,r=g(A.prototype),i=g(M.prototype);return i.promiseSend=function(r,i,s,o){var a=p(arguments);e?(e.push(a),r==="when"&&o&&t.push(o)):u(function(){n.promiseSend.apply(n,a)})},i.valueOf=function(){return e?i:n.valueOf()},Error.captureStackTrace&&(Error.captureStackTrace(i,A),i.stack=i.stack.substring(i.stack.indexOf("\n")+1)),o(i),r.promise=i,r.resolve=s,r.reject=function(e){s(R(e))},r.notify=function(n){e&&d(t,function(e,t){u(function(){t(n)})},void 0)},r}function O(e){var t=A();return st(e,t.resolve,t.reject,t.notify).fail(t.reject),t.promise}function M(e,t,n,r){t===void 0&&(t=function(e){return R(new Error("Promise does not support operation: "+e))});var i=g(M.prototype);return i.promiseSend=function(n,r){var s=p(arguments,2),o;try{e[n]?o=e[n].apply(i,s):o=t.apply(i,[n].concat(s))}catch(u){o=R(u)}r&&r(o)},n&&(i.valueOf=n),r&&(i.exception=r),o(i),i}function _(e){return D(e)?e.valueOf():e}function D(e){return e&&typeof e.promiseSend=="function"}function P(e){return H(e)||B(e)}function H(e){return!D(_(e))}function B(e){return e=_(e),D(e)&&"exception"in e}function q(){!I&&typeof window!="undefined"&&!window.Touch&&window.console&&console.log("Should be empty:",F),I=!0}function R(e){e=e||new Error;var t=M({when:function(t){if(t){var n=v(j,this);n!==-1&&(F.splice(n,1),j.splice(n,1))}return t?t(e):R(e)}},function(){return R(e)},function n(){return this},e);return q(),j.push(t),F.push(e),t}function U(e){if(D(e))return e;e=_(e);if(e&&typeof e.then=="function"){var t=A();return e.then(t.resolve,t.reject,t.notify),t.promise}return M({when:function(){return e},get:function(t){return e[t]},put:function(t,n){return e[t]=n,e},del:function(t){return delete e[t],e},post:function(t,n){return e[t].apply(e,n)},apply:function(t,n){return e.apply(t,n)},fapply:function(t){return e.apply(void 0,t)},viewInfo:function(){function r(e){n[e]||(n[e]=typeof t[e])}var t=e,n={};while(t)Object.getOwnPropertyNames(t).forEach(r),t=Object.getPrototypeOf(t);return{type:typeof e,properties:n}},keys:function(){return y(e)}},void 0,function n(){return e})}function z(e){return M({isDef:function(){}},function(){var n=p(arguments);return Y.apply(void 0,[e].concat(n))},function(){return _(e)})}function W(e,t){return e=U(e),t?M({viewInfo:function(){return t}},function(){var n=p(arguments);return Y.apply(void 0,[e].concat(n))},function(){return _(e)}):Y(e,"viewInfo")}function X(e){return W(e).when(function(t){var n;t.type==="function"?n=function(){return nt(e,void 0,arguments)}:n={};var r=t.properties||{};return y(r).forEach(function(t){r[t]==="function"&&(n[t]=function(){return tt(e,t,arguments)})}),U(n)})}function V(e,t,n,r){function o(e){try{return t?t(e):e}catch(n){return R(n)}}function a(e){if(n){x(e,l);try{return n(e)}catch(t){return R(t)}}return R(e)}function f(e){return r?r(e):e}var i=A(),s=!1,l=U(e);return u(function(){l.promiseSend("when",function(e){if(s)return;s=!0,i.resolve(o(e))},function(e){if(s)return;s=!0,i.resolve(a(e))})}),l.promiseSend("when",void 0,void 0,function(e){i.notify(f(e))}),i.promise}function $(e,t,n){return V(e,function(e){return at(e).then(function(e){return t.apply(void 0,e)},n)},n)}function J(e){return function(){function t(e,t){var s;try{s=n[e](t)}catch(o){return w(o)?o.value:R(o)}return V(s,r,i)}var n=e.apply(this,arguments),r=t.bind(t,"send"),i=t.bind(t,"throw");return r()}}function K(e){throw new E(e)}function Q(e){return function(){return at([this,at(arguments)]).spread(function(t,n){return e.apply(t,n)})}}function G(e){return function(t){var n=p(arguments,1);return Y.apply(void 0,[t,e].concat(n))}}function Y(e,t){var n=A(),r=p(arguments,2);return e=U(e),u(function(){e.promiseSend.apply(e,[t,n.resolve].concat(r))}),n.promise}function Z(e,t,n){var r=A();return e=U(e),u(function(){e.promiseSend.apply(e,[t,r.resolve].concat(n))}),r.promise}function et(e){return function(t){var n=p(arguments,1);return Z(t,e,n)}}function it(e,t){var n=p(arguments,2);return nt(e,t,n)}function st(e){var t=p(arguments,1);return rt(e,t)}function ot(e,t){var n=p(arguments,2);return function(){var i=n.concat(p(arguments));return nt(e,t,i)}}function ut(e){var t=p(arguments,1);return function(){var r=t.concat(p(arguments));return rt(e,r)}}function at(e){return V(e,function(e){var t=e.length;if(t===0)return U(e);var n=A();return d(e,function(r,i,s){H(i)?(e[s]=_(i),--t===0&&n.resolve(e)):V(i,function(r){e[s]=r,--t===0&&n.resolve(e)}).fail(n.reject)},void 0),n.promise})}function ft(e){return V(e,function(e){return V(at(m(e,function(e){return V(e,i,i)})),function(){return m(e,U)})})}function lt(e,t){return V(e,void 0,t)}function ct(e,t){return V(e,void 0,void 0,t)}function ht(e,t){return V(e,function(e){return V(t(),function(){return e})},function(e){return V(t(),function(){return R(e)})})}function pt(e,n,r,i){function s(n){u(function(){x(n,e);if(!t.onerror)throw n;t.onerror(n)})}var o=n||r||i?V(e,n,r,i):e;lt(o,s)}function dt(e,t){var n=A(),r=setTimeout(function(){n.reject(new Error("Timed out after "+t+" ms"))},t);return V(e,function(e){clearTimeout(r),n.resolve(e)},function(e){clearTimeout(r),n.reject(e)}),n.promise}function vt(e,t){t===void 0&&(t=e,e=void 0);var n=A();return setTimeout(function(){n.resolve(e)},t),n.promise}function mt(e,t){var n=p(t),r=A();return n.push(r.makeNodeResolver()),rt(e,n).fail(r.reject),r.promise}function gt(e){var t=p(arguments,1),n=A();return t.push(n.makeNodeResolver()),rt(e,t).fail(n.reject),n.promise}function yt(e){var t=p(arguments,1);return function(){var n=t.concat(p(arguments)),r=A();return n.push(r.makeNodeResolver()),rt(e,n).fail(r.reject),r.promise}}function bt(e,t,n){return Et(e,t).apply(void 0,n)}function wt(e,t){var n=p(arguments,2);return bt(e,t,n)}function Et(e){if(arguments.length>1){var t=arguments[1],n=p(arguments,2),r=e;e=function(){var e=n.concat(p(arguments));return r.apply(t,e)}}return function(){var t=A(),n=p(arguments);return n.push(t.makeNodeResolver()),rt(e,n).fail(t.reject),t.promise}}function St(e,t,n){var r=p(n),i=A();return r.push(i.makeNodeResolver()),tt(e,t,r).fail(i.reject),i.promise}function xt(e,t){var n=p(arguments,2),r=A();return n.push(r.makeNodeResolver()),tt(e,t,n).fail(r.reject),r.promise}function Tt(e,t){if(!t)return e;e.then(function(e){u(function(){t(null,e)})},function(e){u(function(){t(e)})})}var n=k(),r,i=function(){},o=Object.freeze||i;typeof cajaVM!="undefined"&&(o=cajaVM.def);var u;if(typeof s!="undefined")u=s.nextTick;else if(typeof setImmediate=="function")u=setImmediate;else if(typeof MessageChannel!="undefined"){var a=new MessageChannel,f={},l=f;a.port1.onmessage=function(){f=f.next;var e=f.task;delete f.task,e()},u=function(e){l=l.next={task:e},a.port2.postMessage(0)}}else u=function(e){setTimeout(e,0)};var c;if(Function.prototype.bind){var h=Function.prototype.bind;c=h.bind(h.call)}else c=function(e){return function(){return e.call.apply(e,arguments)}};var p=c(Array.prototype.slice),d=c(Array.prototype.reduce||function(e,t){var n=0,r=this.length;if(arguments.length===1)do{if(n in this){t=this[n++];break}if(++n>=r)throw new TypeError}while(1);for(;n2?e.resolve(p(arguments,1)):e.resolve(n)}},A.prototype.node=L(A.prototype.makeNodeResolver,"node","makeNodeResolver"),t.promise=O,t.makePromise=M,M.prototype.then=function(e,t,n){return V(this,e,t,n)},M.prototype.thenResolve=function(e){return V(this,function(){return e})},d(["isResolved","isFulfilled","isRejected","when","spread","send","get","put","del","post","invoke","keys","apply","call","bind","fapply","fcall","fbind","all","allResolved","view","viewInfo","timeout","delay","catch","finally","fail","fin","progress","end","done","nfcall","nfapply","nfbind","ncall","napply","nbind","npost","ninvoke","nend","nodeify"],function(e,n){M.prototype[n]=function(){return t[n].apply(t,[this].concat(p(arguments)))}},void 0),M.prototype.toSource=function(){return this.toString()},M.prototype.toString=function(){return"[object Promise]"},o(M.prototype),t.nearer=_,t.isPromise=D,t.isResolved=P,t.isFulfilled=H,t.isRejected=B;var j=[],F=[],I;t.reject=R,t.begin=U,t.resolve=U,t.ref=L(U,"ref","resolve"),t.master=z,t.viewInfo=W,t.view=X,t.when=V,t.spread=$,t.async=J,t["return"]=K,t.promised=Q,t.sender=L(G,"sender","dispatcher"),t.Method=L(G,"Method","dispatcher"),t.send=L(Y,"send","dispatch"),t.dispatch=Z,t.dispatcher=et,t.get=et("get"),t.put=et("put"),t["delete"]=t.del=et("del");var tt=t.post=et("post");t.invoke=function(e,t){var n=p(arguments,2);return tt(e,t,n)};var nt=t.apply=L(et("apply"),"apply","fapply"),rt=t.fapply=et("fapply");t.call=L(it,"call","fcall"),t["try"]=st,t.fcall=st,t.bind=L(ot,"bind","fbind"),t.fbind=ut,t.keys=et("keys"),t.all=at,t.allResolved=ft,t["catch"]=t.fail=lt,t.progress=ct,t["finally"]=t.fin=ht,t.end=L(pt,"end","done"),t.done=pt,t.timeout=dt,t.delay=vt,t.nfapply=mt,t.nfcall=gt,t.nfbind=yt,t.napply=L(bt,"napply","npost"),t.ncall=L(wt,"ncall","ninvoke"),t.nbind=L(Et,"nbind","nfbind"),t.npost=St,t.ninvoke=xt,t.nend=L(Tt,"nend","nodeify"),t.nodeify=Tt;var Nt=k()})}),e.define("/src/js/app/index.js",function(e,t,n,r,i,s,o){function y(){var t=e("../models/collections"),n=e("../views/commandViews");this.commandCollection=new t.CommandCollection,this.commandBuffer=new t.CommandBuffer({collection:this.commandCollection}),this.commandPromptView=new n.CommandPromptView({el:$("#commandLineBar")}),this.commandLineHistoryView=new n.CommandLineHistoryView({el:$("#commandLineHistory"),collection:this.commandCollection})}var u=e("underscore"),a=e("backbone"),f=e("../util/constants"),l=e("../util"),c=u.clone(a.Events),h,p,d,v,m,g=function(){var t=e("../level/sandbox").Sandbox,n=e("../level").Level,r=e("../util/eventBaton").EventBaton,i=e("../level/arbiter").LevelArbiter,s=e("../views/levelDropdownView").LevelDropdownView;d=new r,h=new y,p=new t,v=new i,m=new s({wait:!0});var o=function(){$("#commandTextField").focus()};o(),$(window).focus(function(e){d.trigger("windowFocus",e)}),$(document).click(function(e){d.trigger("documentClick",e)}),$(document).bind("keydown",function(e){d.trigger("docKeydown",e)}),$(document).bind("keyup",function(e){d.trigger("docKeyup",e)}),$(window).on("resize",function(e){c.trigger("resize",e)}),$(window).on("resize",u.throttle(function(e){var t=$(window).width(),n=$(window).height();d.trigger("windowSizeCheck",{w:t,h:n})},500)),d.stealBaton("docKeydown",function(){}),d.stealBaton("docKeyup",function(){}),d.stealBaton("windowFocus",o),d.stealBaton("documentClick",o);var a=function(e){return function(){var t=[e];u.each(arguments,function(e){t.push(e)}),d.trigger.apply(d,t)}};$("#commandTextField").on("keydown",a("keydown")),$("#commandTextField").on("keyup",a("keyup")),$(window).trigger("resize"),/\?demo/.test(window.location.href)?p.mainVis.customEvents.on("gitEngineReady",function(){d.trigger("commandSubmitted",["git commit; git checkout -b bugFix C1; git commit; git merge master; git checkout master; git commit; git rebase bugFix;","delay 1000; reset;","level rebase1 --noFinishDialog --noStartCommand --noIntroDialog;","delay 2000; show goal; delay 1000; hide goal;","git checkout bugFix; git rebase master; git checkout side; git rebase bugFix;","git checkout another; git rebase side; git rebase another master;","help; levels"].join(""))}):/\?NODEMO/.test(window.location.href)||p.mainVis.customEvents.on("gitEngineReady",function(){d.trigger("commandSubmitted",["git help;","delay 1000;","help;","levels"].join(""))});if(/command=/.test(window.location.href)){var f=window.location.href.split("command=")[1].split("&")[0],l=unescape(f);p.mainVis.customEvents.on("gitEngineReady",function(){d.trigger("commandSubmitted",l)})}(/(iPhone|iPod|iPad).*AppleWebKit/i.test(navigator.userAgent)||/android/i.test(navigator.userAgent))&&p.mainVis.customEvents.on("gitEngineReady",function(){d.trigger("commandSubmitted","mobile alert")})};e("../util").isBrowser()&&$(document).ready(g),n.getEvents=function(){return c},n.getSandbox=function(){return p},n.getEventBaton=function(){return d},n.getCommandUI=function(){return h},n.getLevelArbiter=function(){return v},n.getLevelDropdown=function(){return m},n.init=g}),e.define("/src/js/level/index.js",function(e,t,n,r,i,s,o){var u=e("underscore"),a=e("backbone"),f=e("q"),l=e("../util"),c=e("../app"),h=e("../util/errors"),p=e("../level/sandbox").Sandbox,d=e("../util/constants"),v=e("../visuals/visualization").Visualization,m=e("../level/parseWaterfall").ParseWaterfall,g=e("../level/disabledMap").DisabledMap,y=e("../models/commandModel").Command,b=e("../git/gitShim").GitShim,w=e("../views/multiView").MultiView,E=e("../views").CanvasTerminalHolder,S=e("../views").ConfirmCancelTerminal,x=e("../views").NextLevelConfirm,T=e("../views").LevelToolbar,N=e("../git/treeCompare").TreeCompare,C={"help level":/^help level$/,"start dialog":/^start dialog$/,"show goal":/^show goal$/,"hide goal":/^hide goal$/,"show solution":/^show solution($|\s)/},k=l.genParseCommand(C,"processLevelCommand"),L=p.extend({initialize:function(e){e=e||{},e.level=e.level||{},this.level=e.level,this.gitCommandsIssued=[],this.commandsThatCount=this.getCommandsThatCount(),this.solved=!1,this.treeCompare=new N,this.initGoalData(e),this.initName(e),L.__super__.initialize.apply(this,[e]),this.startOffCommand(),this.handleOpen(e.deferred)},handleOpen:function(e){e=e||f.defer();if(this.level.startDialog&&!this.testOption("noIntroDialog")){new w(u.extend({},this.level.startDialog,{deferred:e}));return}setTimeout(function(){e.resolve()},this.getAnimationTime()*1.2)},startDialog:function(e,t){if(!this.level.startDialog){e.set("error",new h.GitError({msg:"There is no start dialog to show for this level!"})),t.resolve();return}this.handleOpen(t),t.promise.then(function(){e.set("status","finished")})},initName:function(){this.level.name||(this.level.name="Rebase Classic",console.warn("REALLY BAD FORM need ids and names")),this.levelToolbar=new T({name:this.level.name})},initGoalData:function(e){if(!this.level.goalTreeString||!this.level.solutionCommand)throw new Error("need goal tree and solution")},takeControl:function(){c.getEventBaton().stealBaton("processLevelCommand",this.processLevelCommand,this),L.__super__.takeControl.apply(this)},releaseControl:function(){c.getEventBaton().releaseBaton("processLevelCommand",this.processLevelCommand,this),L.__super__.releaseControl.apply(this)},startOffCommand:function(){this.testOption("noStartCommand")||c.getEventBaton().trigger("commandSubmitted","hint; delay 2000; show goal")},initVisualization:function(e){this.mainVis=new v({el:e.el||this.getDefaultVisEl(),treeString:e.level.startTree}),this.initGoalVisualization()},initGoalVisualization:function(){this.goalCanvasHolder=new E,this.goalVis=new v({el:this.goalCanvasHolder.getCanvasLocation(),containerElement:this.goalCanvasHolder.getCanvasLocation(),treeString:this.level.goalTreeString,noKeyboardInput:!0,noClick:!0})},showSolution:function(e,t){var n=this.level.solutionCommand,r=function(){c.getEventBaton().trigger("commandSubmitted",n)},i=e.get("rawStr");this.testOptionOnString(i,"noReset")||(n="reset; "+n);if(this.testOptionOnString(i,"force")){r(),e.finishWith(t);return}var s=f.defer(),o=new S({markdowns:["## Are you sure you want to see the solution?","","I believe in you! You can do it"],deferred:s});s.promise.then(r).fail(function(){e.setResult("Great! I'll let you get back to it")}).done(function(){setTimeout(function(){e.finishWith(t)},o.getAnimationTime())})},showGoal:function(e,t){this.goalCanvasHolder.slideIn();if(!e||!t)return;setTimeout(function(){e.finishWith(t)},this.goalCanvasHolder.getAnimationTime())},hideGoal:function(e,t){this.goalCanvasHolder.slideOut();if(!e||!t)return;setTimeout(function(){e.finishWith(t)},this.goalCanvasHolder.getAnimationTime())},initParseWaterfall:function(e){L.__super__.initParseWaterfall.apply(this,[e]),this.parseWaterfall.addFirst("parseWaterfall",k),this.parseWaterfall.addFirst("instantWaterfall",this.getInstantCommands()),e.level.disabledMap&&this.parseWaterfall.addFirst("instantWaterfall",(new g({disabledMap:e.level.disabledMap})).getInstantCommands())},initGitShim:function(e){this.gitShim=new b({afterCB:u.bind(this.afterCommandCB,this),afterDeferHandler:u.bind(this.afterCommandDefer,this)})},getCommandsThatCount:function(){var t=e("../git/commands"),n=["git commit","git checkout","git rebase","git reset","git branch","git revert","git merge","git cherry-pick"],r={};return u.each(n,function(e){if(!t.regexMap[e])throw new Error("wut no regex");r[e]=t.regexMap[e]}),r},afterCommandCB:function(e){var t=!1;u.each(this.commandsThatCount,function(n){t=t||n.test(e.get("rawStr"))}),t&&this.gitCommandsIssued.push(e.get("rawStr"))},afterCommandDefer:function(e,t){if(this.solved){t.addWarning("You've already solved this level, try other levels with 'show levels'or go back to the sandbox with 'sandbox'"),e.resolve();return}var n=this.mainVis.gitEngine.exportTree(),r;this.level.compareOnlyMaster?r=this.treeCompare.compareBranchWithinTrees(n,this.level.goalTreeString,"master"):this.level.compareOnlyBranches?r=this.treeCompare.compareAllBranchesWithinTrees(n,this.level.goalTreeString):r=this.treeCompare.compareAllBranchesWithinTreesAndHEAD(n,this.level.goalTreeString);if(!r){e.resolve();return}this.levelSolved(e)},getNumSolutionCommands:function(){var e=this.level.solutionCommand.replace(/^;|;$/g,"");return e.split(";").length},testOption:function(e){return this.options.command&&(new RegExp("--"+e)).test(this.options.command.get("rawStr"))},testOptionOnString:function(e,t){return e&&(new RegExp("--"+t)).test(e)},levelSolved:function(e){this.solved=!0,c.getEvents().trigger("levelSolved",this.level.id),this.hideGoal();var t=c.getLevelArbiter().getNextLevel(this.level.id),n=this.gitCommandsIssued.length,r=this.getNumSolutionCommands();d.GLOBAL.isAnimating=!0;var i=this.testOption("noFinishDialog"),s=this.mainVis.gitVisuals.finishAnimation();i||(s=s.then(function(){var e=new x({nextLevel:t,numCommands:n,best:r});return e.getPromise()})),s.then(function(){!i&&t&&c.getEventBaton().trigger("commandSubmitted","level "+t.id)}).fail(function(){}).done(function(){d.GLOBAL.isAnimating=!1,e.resolve()})},die:function(){this.levelToolbar.die(),this.goalDie(),this.mainVis.die(),this.releaseControl(),this.clear(),delete this.commandCollection,delete this.mainVis,delete this.goalVis,delete this.goalCanvasHolder},goalDie:function(){this.goalCanvasHolder.die(),this.goalVis.die()},getInstantCommands:function(){var e=this.level.hint?this.level.hint:"Hmm, there doesn't seem to be a hint for this level :-/";return[[/^help$|^\?$/,function(){throw new h.CommandResult({msg:'You are in a level, so multiple forms of help are available. Please select either "help level" or "help general"'})}],[/^hint$/,function(){throw new h.CommandResult({msg:e})}]]},reset:function(){this.gitCommandsIssued=[],this.solved=!1,L.__super__.reset.apply(this,arguments)},buildLevel:function(e,t){this.exitLevel(),setTimeout(function(){c.getSandbox().buildLevel(e,t)},this.getAnimationTime()*1.5)},importLevel:function(e,t){this.exitLevel(),setTimeout(function(){c.getSandbox().importLevel(e,t)},this.getAnimationTime()*1.5)},startLevel:function(e,t){this.exitLevel(),setTimeout(function(){c.getSandbox().startLevel(e,t)},this.getAnimationTime()*1.5)},exitLevel:function(e,t){this.die();if(!e||!t)return;setTimeout(function(){e.finishWith(t)},this.getAnimationTime()),c.getEventBaton().trigger("levelExited")},processLevelCommand:function(e,t){var n={"show goal":this.showGoal,"hide goal":this.hideGoal,"show solution":this.showSolution,"start dialog":this.startDialog,"help level":this.startDialog},r=n[e.get("method")];if(!r)throw new Error("woah we dont support that method yet",r);r.apply(this,[e,t])}});n.Level=L,n.regexMap=C}),e.define("/src/js/util/errors.js",function(e,t,n,r,i,s,o){var u=e("underscore"),a=e("backbone"),f=a.Model.extend({defaults:{type:"MyError",msg:"Unknown Error"},toString:function(){return this.get("type")+": "+this.get("msg")},getMsg:function(){return this.get("msg")||"Unknown Error"},toResult:function(){return this.get("msg").length?""+this.get("msg").replace(/\n/g,"
")+"
":""}}),l=n.CommandProcessError=f.extend({defaults:{type:"Command Process Error"}}),c=n.CommandResult=f.extend({defaults:{type:"Command Result"}}),h=n.Warning=f.extend({defaults:{type:"Warning"}}),p=n.GitError=f.extend({defaults:{type:"Git Error"}}),d=function(e){if(e instanceof l||e instanceof p||e instanceof c||e instanceof h)return;throw e};n.filterError=d}),e.define("/src/js/visuals/visualization.js",function(e,t,n,r,i,s,o){var u=e("underscore"),a=e("../util").isBrowser()?a=window.Backbone:a=e("backbone"),f=e("../models/collections"),l=f.CommitCollection,c=f.BranchCollection,h=e("../util/eventBaton").EventBaton,p=e("../visuals").GitVisuals,d=a.View.extend({initialize:function(e){e=e||{},this.options=e,this.customEvents=u.clone(a.Events),this.containerElement=e.containerElement;var t=this,n=e.containerElement||$("#canvasHolder")[0];new Raphael(n,200,200,function(){var n=this;s.nextTick(function(){t.paperInitialize(n,e)})})},paperInitialize:function(t,n){this.treeString=n.treeString,this.paper=t;var r=e("../app");this.eventBaton=n.noKeyboardInput?new h:r.getEventBaton(),this.commitCollection=new l,this.branchCollection=new c,this.gitVisuals=new p({commitCollection:this.commitCollection,branchCollection:this.branchCollection,paper:this.paper,noClick:this.options.noClick,smallCanvas:this.options.smallCanvas});var i=e("../git").GitEngine;this.gitEngine=new i({collection:this.commitCollection,branches:this.branchCollection,gitVisuals:this.gitVisuals,eventBaton:this.eventBaton}),this.gitEngine.init(),this.gitVisuals.assignGitEngine(this.gitEngine),this.myResize(),$(window).on("resize",u.bind(function(){this.myResize()},this)),this.gitVisuals.drawTreeFirstTime(),this.treeString&&this.gitEngine.loadTreeFromString(this.treeString),this.options.zIndex&&this.setTreeIndex(this.options.zIndex),this.shown=!1,this.setTreeOpacity(0),s.nextTick(u.bind(this.fadeTreeIn,this)),this.customEvents.trigger("gitEngineReady"),this.customEvents.trigger("paperReady")},setTreeIndex:function(e){$(this.paper.canvas).css("z-index",e)},setTreeOpacity:function(e){e===0&&(this.shown=!1),$(this.paper.canvas).css("opacity",e)},getAnimationTime:function(){return 300},fadeTreeIn:function(){this.shown=!0,$(this.paper.canvas).animate({opacity:1},this.getAnimationTime())},fadeTreeOut:function(){this.shown=!1,$(this.paper.canvas).animate({opacity:0},this.getAnimationTime())},hide:function(){this.fadeTreeOut(),setTimeout(u.bind(function(){$(this.paper.canvas).css("visibility","hidden")},this),this.getAnimationTime())},show:function(){$(this.paper.canvas).css("visibility","visible"),setTimeout(u.bind(this.fadeTreeIn,this),10)},showHarsh:function(){$(this.paper.canvas).css("visibility","visible"),this.setTreeOpacity(1)},resetFromThisTreeNow:function(e){this.treeString=e},reset:function(){this.setTreeOpacity(0),this.treeString?this.gitEngine.loadTreeFromString(this.treeString):this.gitEngine.defaultInit(),this.fadeTreeIn()},tearDown:function(){this.gitEngine.tearDown(),this.gitVisuals.tearDown(),delete this.paper},die:function(){this.fadeTreeOut(),setTimeout(u.bind(function(){this.shown||this.tearDown()},this),this.getAnimationTime())},myResize:function(){if(!this.paper)return;var e=1,t=this.el,n=t.clientWidth-e,r=t.clientHeight-e;if(!this.containerElement){var i=t.offsetLeft,s=t.offsetTop;$(this.paper.canvas).css({position:"absolute",left:i+"px",top:s+"px"})}this.paper.setSize(n,r),this.gitVisuals.canvasResize(n,r)}});n.Visualization=d}),e.define("/src/js/models/collections.js",function(e,t,n,r,i,s,o){var u=e("underscore"),a=e("q"),f=e("../util").isBrowser()?f=window.Backbone:f=e("backbone"),l=e("../git").Commit,c=e("../git").Branch,h=e("../models/commandModel").Command,p=e("../models/commandModel").CommandEntry,d=e("../util/constants").TIME,v=f.Collection.extend({model:l}),m=f.Collection.extend({model:h}),g=f.Collection.extend({model:c}),y=f.Collection.extend({model:p,localStorage:f.LocalStorage?new f.LocalStorage("CommandEntries"):null}),b=f.Model.extend({defaults:{collection:null},initialize:function(e){e.collection.bind("add",this.addCommand,this),this.buffer=[],this.timeout=null},addCommand:function(e){this.buffer.push(e),this.touchBuffer()},touchBuffer:function(){if(this.timeout)return;this.setTimeout()},setTimeout:function(){this.timeout=setTimeout(u.bind(function(){this.sipFromBuffer()},this),d.betweenCommandsDelay)},popAndProcess:function(){var e=this.buffer.shift(0);while(e.get("error")&&this.buffer.length)e=this.buffer.shift(0);e.get("error")?this.clear():this.processCommand(e)},processCommand:function(t){t.set("status","processing");var n=a.defer();n.promise.then(u.bind(function(){this.setTimeout()},this));var r=t.get("eventName");if(!r)throw new Error("I need an event to trigger when this guy is parsed and ready");var i=e("../app"),s=i.getEventBaton(),o=s.getNumListeners(r);if(!o){var f=e("../util/errors");t.set("error",new f.GitError({msg:"That command is valid, but not supported in this current environment! Try entering a level or level builder to use that command"})),n.resolve();return}i.getEventBaton().trigger(r,t,n)},clear:function(){clearTimeout(this.timeout),this.timeout=null},sipFromBuffer:function(){if(!this.buffer.length){this.clear();return}this.popAndProcess()}});n.CommitCollection=v,n.CommandCollection=m,n.BranchCollection=g,n.CommandEntryCollection=y,n.CommandBuffer=b}),e.define("/src/js/git/index.js",function(e,t,n,r,i,s,o){function m(e){this.rootCommit=null,this.refs={},this.HEAD=null,this.branchCollection=e.branches,this.commitCollection=e.collection,this.gitVisuals=e.gitVisuals,this.eventBaton=e.eventBaton,this.eventBaton.stealBaton("processGitCommand",this.dispatch,this),this.animationFactory=e.animationFactory||new l.AnimationFactory,this.commandOptions={},this.generalArgs=[],this.initUniqueID()}var u=e("underscore"),a=e("../util").isBrowser()?a=window.Backbone:a=e("backbone"),f=e("q"),l=e("../visuals/animation/animationFactory"),c=e("../visuals/animation").AnimationQueue,h=e("./treeCompare").TreeCompare,p=e("../util/errors"),d=p.GitError,v=p.CommandResult;m.prototype.initUniqueID=function(){this.uniqueId=function(){var e=0;return function(t){return t?t+e++:e++}}()},m.prototype.defaultInit=function(){var e=JSON.parse(unescape("%7B%22branches%22%3A%7B%22master%22%3A%7B%22target%22%3A%22C1%22%2C%22id%22%3A%22master%22%2C%22type%22%3A%22branch%22%7D%7D%2C%22commits%22%3A%7B%22C0%22%3A%7B%22type%22%3A%22commit%22%2C%22parents%22%3A%5B%5D%2C%22author%22%3A%22Peter%20Cottle%22%2C%22createTime%22%3A%22Mon%20Nov%2005%202012%2000%3A56%3A47%20GMT-0800%20%28PST%29%22%2C%22commitMessage%22%3A%22Quick%20Commit.%20Go%20Bears%21%22%2C%22id%22%3A%22C0%22%2C%22rootCommit%22%3Atrue%7D%2C%22C1%22%3A%7B%22type%22%3A%22commit%22%2C%22parents%22%3A%5B%22C0%22%5D%2C%22author%22%3A%22Peter%20Cottle%22%2C%22createTime%22%3A%22Mon%20Nov%2005%202012%2000%3A56%3A47%20GMT-0800%20%28PST%29%22%2C%22commitMessage%22%3A%22Quick%20Commit.%20Go%20Bears%21%22%2C%22id%22%3A%22C1%22%7D%7D%2C%22HEAD%22%3A%7B%22id%22%3A%22HEAD%22%2C%22target%22%3A%22master%22%2C%22type%22%3A%22general%20ref%22%7D%7D"));this.loadTree(e)},m.prototype.init=function(){this.rootCommit=this.makeCommit(null,null,{rootCommit:!0}),this.commitCollection.add(this.rootCommit);var e=this.makeBranch("master",this.rootCommit);this.HEAD=new g({id:"HEAD",target:e}),this.refs[this.HEAD.get("id")]=this.HEAD,this.commit()},m.prototype.exportTree=function(){var e={branches:{},commits:{},HEAD:null};u.each(this.branchCollection.toJSON(),function(t){t.target=t.target.get("id"),t.visBranch=undefined,e.branches[t.id]=t}),u.each(this.commitCollection.toJSON(),function(t){u.each(b.prototype.constants.circularFields,function(e){t[e]=undefined},this);var n=[];u.each(t.parents,function(e){n.push(e.get("id"))}),t.parents=n,e.commits[t.id]=t},this);var t=this.HEAD.toJSON();return t.visBranch=undefined,t.lastTarget=t.lastLastTarget=t.visBranch=undefined,t.target=t.target.get("id"),e.HEAD=t,e},m.prototype.printTree=function(e){e=e||this.exportTree(),h.prototype.reduceTreeFields([e]);var t=JSON.stringify(e);return/'/.test(t)&&(t=escape(t)),t},m.prototype.printAndCopyTree=function(){window.prompt("Copy the tree string below",this.printTree())},m.prototype.loadTree=function(e){e=$.extend(!0,{},e),this.removeAll(),this.instantiateFromTree(e),this.reloadGraphics(),this.initUniqueID()},m.prototype.loadTreeFromString=function(e){this.loadTree(JSON.parse(unescape(e)))},m.prototype.instantiateFromTree=function(e){var t={};u.each(e.commits,function(n){var r=this.getOrMakeRecursive(e,t,n.id);this.commitCollection.add(r)},this),u.each(e.branches,function(n){var r=this.getOrMakeRecursive(e,t,n.id);this.branchCollection.add(r,{silent:!0})},this);var n=this.getOrMakeRecursive(e,t,e.HEAD.id);this.HEAD=n,this.rootCommit=t.C0;if(!this.rootCommit)throw new Error("Need root commit of C0 for calculations");this.refs=t,this.gitVisuals.gitReady=!1,this.branchCollection.each(function(e){this.gitVisuals.addBranch(e)},this)},m.prototype.reloadGraphics=function(){this.gitVisuals.rootCommit=this.refs.C0,this.gitVisuals.initHeadBranch(),this.gitVisuals.drawTreeFromReload(),this.gitVisuals.refreshTreeHarsh()},m.prototype.getOrMakeRecursive=function(e,t,n){if(t[n])return t[n];var r=function(e,t){if(e.commits[t])return"commit";if(e.branches[t])return"branch";if(t=="HEAD")return"HEAD";throw new Error("bad type for "+t)},i=r(e,n);if(i=="HEAD"){var s=e.HEAD,o=new g(u.extend(e.HEAD,{target:this.getOrMakeRecursive(e,t,s.target)}));return t[n]=o,o}if(i=="branch"){var a=e.branches[n],f=new y(u.extend(e.branches[n],{target:this.getOrMakeRecursive(e,t,a.target)}));return t[n]=f,f}if(i=="commit"){var l=e.commits[n],c=[];u.each(l.parents,function(n){c.push(this.getOrMakeRecursive(e,t,n))},this);var h=new b(u.extend(l,{parents:c,gitVisuals:this.gitVisuals}));return t[n]=h,h}throw new Error("ruh rho!! unsupported tyep for "+n)},m.prototype.tearDown=function(){this.eventBaton.releaseBaton("processGitCommand",this.dispatch,this),this.removeAll()},m.prototype.removeAll=function(){this.branchCollection.reset(),this.commitCollection.reset(),this.refs={},this.HEAD=null,this.rootCommit=null,this.gitVisuals.resetAll()},m.prototype.getDetachedHead=function(){var e=this.HEAD.get("target"),t=e.get("type");return t!=="branch"},m.prototype.validateBranchName=function(e){e=e.replace(/\s/g,"");if(!/^[a-zA-Z0-9]+$/.test(e))throw new d({msg:"woah bad branch name!! This is not ok: "+e});if(/[hH][eE][aA][dD]/.test(e))throw new d({msg:'branch name of "head" is ambiguous, dont name it that'});return e.length>9&&(e=e.slice(0,9),this.command.addWarning("Sorry, we need to keep branch names short for the visuals. Your branch name was truncated to 9 characters, resulting in "+e)),e},m.prototype.makeBranch=function(e,t){e=this.validateBranchName(e);if(this.refs[e])throw new d({msg:"that branch id either matches a commit hash or already exists!"});var n=new y({target:t,id:e});return this.branchCollection.add(n),this.refs[n.get("id")]=n,n},m.prototype.getHead=function(){return u.clone(this.HEAD)},m.prototype.getBranches=function(){var e=[];return this.branchCollection.each(function(t){e.push({id:t.get("id"),selected:this.HEAD.get("target")===t,target:t.get("target"),obj:t})},this),e},m.prototype.printBranchesWithout=function(e){var t=this.getUpstreamBranchSet(),n=this.getCommitFromRef(e).get("id"),r=[];u.each(t[n],function(e){e.selected=this.HEAD.get("target").get("id")==e.id,r.push(e)},this),this.printBranches(r)},m.prototype.printBranches=function(e){var t="";throw u.each(e,function(e){t+=(e.selected?"* ":"")+e.id+"\n"}),new v({msg:t})},m.prototype.makeCommit=function(e,t,n){if(!t){t=this.uniqueId("C");while(this.refs[t])t=this.uniqueId("C")}var r=new b(u.extend({parents:e,id:t,gitVisuals:this.gitVisuals},n||{}));return this.refs[r.get("id")]=r,this.commitCollection.add(r),r},m.prototype.acceptNoGeneralArgs=function(){if(this.generalArgs.length)throw new d({msg:"That command accepts no general arguments"})},m.prototype.validateArgBounds=function(e,t,n,r){var i=r===undefined?"git "+this.command.get("method"):this.command.get("method")+" "+r+" ";i="with "+i;if(e.lengthn)throw new d({msg:"I expect at most "+String(n)+" argument(s) "+i})},m.prototype.oneArgImpliedHead=function(e,t){this.validateArgBounds(e,0,1,t),e.length===0&&e.push("HEAD")},m.prototype.twoArgsImpliedHead=function(e,t){this.validateArgBounds(e,1,2,t),e.length==1&&e.push("HEAD")},m.prototype.revertStarter=function(){this.validateArgBounds(this.generalArgs,1,NaN);var e=this.revert(this.generalArgs);e&&this.animationFactory.rebaseAnimation(this.animationQueue,e,this,this.gitVisuals)},m.prototype.revert=function(e){var t=[];u.each(e,function(e){t.push(this.getCommitFromRef(e))},this);var n={};n.destinationBranch=this.resolveID(t[0]),n.toRebaseArray=t.slice(0),n.rebaseSteps=[];var r=this.gitVisuals.genSnapshot(),i,s=this.getCommitFromRef("HEAD");return u.each(t,function(e){var t=this.rebaseAltID(e.get("id")),o=this.makeCommit([s],t,{commitMessage:"Reverting "+this.resolveName(e)+': "'+e.get("commitMessage")+'"'});s=o,i=this.gitVisuals.genSnapshot(),n.rebaseSteps.push({oldCommit:e,newCommit:o,beforeSnapshot:r,afterSnapshot:i}),r=i},this),this.setTargetLocation("HEAD",s),n},m.prototype.resetStarter=function(){if(this.commandOptions["--soft"])throw new d({msg:"You can't use --soft because there is no concept of stashing changes or staging files, so you will lose your progress. Try using interactive rebasing (or just rebasing) to move commits."});this.commandOptions["--hard"]&&(this.command.addWarning("Nice! You are using --hard. The default behavior is a hard reset in this demo, so don't worry about specifying the option explicity"),this.generalArgs=this.generalArgs.concat(this.commandOptions["--hard"])),this.validateArgBounds(this.generalArgs,1,1);if(this.getDetachedHead())throw new d({msg:"Cant reset in detached head! Use checkout if you want to move"});this.reset(this.generalArgs[0])},m.prototype.reset=function(e){this.setTargetLocation("HEAD",this.getCommitFromRef(e))},m.prototype.cherrypickStarter=function(){this.validateArgBounds(this.generalArgs,1,1);var e=this.cherrypick(this.generalArgs[0]);this.animationFactory.genCommitBirthAnimation(this.animationQueue,e,this.gitVisuals)},m.prototype.cherrypick=function(e){var t=this.getCommitFromRef(e),n=this.getUpstreamSet("HEAD");if(n[t.get("id")])throw new d({msg:"We already have that commit in our changes history! You can't cherry-pick it if it shows up in git log."});var r=this.rebaseAltID(t.get("id")),i=this.makeCommit([this.getCommitFromRef("HEAD")],r);return this.setTargetLocation(this.HEAD,i),i},m.prototype.commitStarter=function(){this.acceptNoGeneralArgs();if(this.commandOptions["-am"]&&(this.commandOptions["-a"]||this.commandOptions["-m"]))throw new d({msg:"You can't have -am with another -m or -a!"});var e=null,t=null;this.commandOptions["-a"]&&this.command.addWarning("No need to add files in this demo"),this.commandOptions["-am"]&&(t=this.commandOptions["-am"],this.validateArgBounds(t,1,1,"-am"),this.command.addWarning("Don't worry about adding files in this demo. I'll take down your commit message anyways, but you can commit without a message in this demo as well"),e=t[0]),this.commandOptions["-m"]&&(t=this.commandOptions["-m"],this.validateArgBounds(t,1,1,"-m"),e=t[0]);var n=this.commit();e&&(e=e.replace(/"/g,'"').replace(/^"/g,"").replace(/"$/g,""),n.set("commitMessage",e)),this.animationFactory.genCommitBirthAnimation(this.animationQueue,n,this.gitVisuals)},m.prototype.commit=function(){var e=this.getCommitFromRef(this.HEAD),t=null;this.commandOptions["--amend"]&&(e=this.resolveID("HEAD~1"),t=this.rebaseAltID(this.getCommitFromRef("HEAD").get("id")));var n=this.makeCommit([e],t);return this.getDetachedHead()&&this.command.addWarning("Warning!! Detached HEAD state"),this.setTargetLocation(this.HEAD,n),n},m.prototype.resolveName=function(e){var t=this.resolveID(e);return t.get("type")=="commit"?"commit "+t.get("id"):t.get("type")=="branch"?'branch "'+t.get("id")+'"':this.resolveName(t.get("target"))},m.prototype.resolveID=function(e){if(e===null||e===undefined)throw new Error("Dont call this with null / undefined");return typeof e!="string"?e:this.resolveStringRef(e)},m.prototype.resolveStringRef=function(e){if(this.refs[e])return this.refs[e];if(this.refs[e.toUpperCase()])return this.refs[e.toUpperCase()];var t=[[/^([a-zA-Z0-9]+)~(\d+)\s*$/,function(e){return parseInt(e[2],10)}],[/^([a-zA-Z0-9]+)(\^+)\s*$/,function(e){return e[2].length}]],n=null,r=null;u.each(t,function(t){var i=t[0],s=t[1];if(i.test(e)){var o=i.exec(e);r=s(o),n=o[1]}},this);if(!n)throw new d({msg:"unknown ref "+e});if(!this.refs[n])throw new d({msg:"the ref "+n+" does not exist."});var i=this.getCommitFromRef(n);return this.numBackFrom(i,r)},m.prototype.getCommitFromRef=function(e){var t=this.resolveID(e);while(t.get("type")!=="commit")t=t.get("target");return t},m.prototype.getType=function(e){return this.resolveID(e).get("type")},m.prototype.setTargetLocation=function(e,t){if(this.getType(e)=="commit")return;e=this.getOneBeforeCommit(e),e.set("target",t)},m.prototype.getUpstreamBranchSet=function(){var e={},t=function(e,t){var n=!1;return u.each(e,function(e){e.id==t&&(n=!0)}),n},n=function(e){var t=[],n=[e];while(n.length){var r=n.pop();t.push(r.get("id")),r.get("parents")&&r.get("parents").length&&(n=n.concat(r.get("parents")))}return t};return this.branchCollection.each(function(r){var i=n(r.get("target"));u.each(i,function(n){e[n]=e[n]||[],t(e[n],r.get("id"))||e[n].push({obj:r,id:r.get("id")})})}),e},m.prototype.getUpstreamHeadSet=function(){var e=this.getUpstreamSet("HEAD"),t=this.getCommitFromRef("HEAD").get("id");return e[t]=!0,e},m.prototype.getOneBeforeCommit=function(e){var t=this.resolveID(e);return t===this.HEAD&&!this.getDetachedHead()&&(t=t.get("target")),t},m.prototype.numBackFrom=function(e,t){if(t===0)return e;var n=u.bind(function(e){e.sort(this.dateSortFunc)},this),r=[].concat(e.get("parents")||[]);n(r),t--;while(r.length&&t!==0){var i=r.shift(0),s=i.get("parents");s&&s.length&&(r=r.concat(s)),n(r),t--}if(t!==0||r.length===0)throw new d({msg:"Sorry, I can't go that many commits back"});return r.shift(0)},m.prototype.scrapeBaseID=function(e){var t=/^C(\d+)/.exec(e);if(!t)throw new Error("regex failed on "+e);return"C"+t[1]},m.prototype.rebaseAltID=function(e){var t=[[/^C(\d+)[']{0,2}$/,function(e){return e[0]+"'"}],[/^C(\d+)[']{3}$/,function(e){return e[0].slice(0,-3)+"'^4"}],[/^C(\d+)['][\^](\d+)$/,function(e){return"C"+String(e[1])+"'^"+String(Number(e[2])+1)}]];for(var n=0;n",this.get("commitMessage"),"
","Commit: "+this.get("id")].join("\n")+"\n"},getShowEntry:function(){return[this.getLogEntry(),"diff --git a/bigGameResults.html b/bigGameResults.html","--- bigGameResults.html","+++ bigGameResults.html","@@ 13,27 @@ Winner, Score","- Stanfurd, 14-7","+ Cal, 21-14"].join("\n")+"\n"},validateAtInit:function(){if(!this.get("id"))throw new Error("Need ID!!");this.get("createTime")||this.set("createTime",(new Date).toString()),this.get("commitMessage")||this.set("commitMessage","Quick Commit. Go Bears!"),this.set("children",[]);if(!this.get("rootCommit"))if(!this.get("parents")||!this.get("parents").length)throw new Error("needs parents")},addNodeToVisuals:function(){var e=this.get("gitVisuals").addNode(this.get("id"),this);this.set("visNode",e)},addEdgeToVisuals:function(e){this.get("gitVisuals").addEdge(this.get("id"),e.get("id"))},isMainParent:function(e){var t=this.get("parents").indexOf(e);return t===0},initialize:function(e){this.validateAtInit(),this.addNodeToVisuals(),u.each(this.get("parents"),function(e){e.get("children").push(this),this.addEdgeToVisuals(e)},this)}});n.GitEngine=m,n.Commit=b,n.Branch=y,n.Ref=g}),e.define("/src/js/visuals/animation/animationFactory.js",function(e,t,n,r,i,s,o){var u=e("underscore"),a=e("backbone"),f=e("./index").Animation,l=e("../../util/constants").GRAPHICS,c=function(){};c.prototype.genCommitBirthAnimation=function(e,t,n){if(!e)throw new Error("Need animation queue to add closure to!");var r=l.defaultAnimationTime*1,i=r*2,s=t.get("visNode"),o=function(){n.refreshTree(r),s.setBirth(),s.parentInFront(),n.visBranchesFront(),s.animateUpdatedPosition(i,"bounce"),s.animateOutgoingEdges(r)};e.add(new f({closure:o,duration:Math.max(r,i)}))},c.prototype.overrideOpacityDepth2=function(e,t){t=t===undefined?1:t;var n={};return u.each(e,function(e,r){n[r]={},u.each(e,function(e,i){i=="opacity"?n[r][i]=t:n[r][i]=e})}),n},c.prototype.overrideOpacityDepth3=function(e,t){var n={};return u.each(e,function(e,r){n[r]=this.overrideOpacityDepth2(e,t)},this),n},c.prototype.genCommitBirthClosureFromSnapshot=function(e,t){var n=l.defaultAnimationTime*1,r=n*1.5,i=e.newCommit.get("visNode"),s=this.overrideOpacityDepth2(e.afterSnapshot[i.getID()]),o=this.overrideOpacityDepth3(e.afterSnapshot),u=function(){i.setBirthFromSnapshot(e.beforeSnapshot),i.parentInFront(),t.visBranchesFront(),i.animateToAttr(s,r,"bounce"),i.animateOutgoingEdgesToAttr(o,r)};return u},c.prototype.refreshTree=function(e,t){e.add(new f({closure:function(){t.refreshTree()}}))},c.prototype.rebaseAnimation=function(e,t,n,r){this.rebaseHighlightPart(e,t,n),this.rebaseBirthPart(e,t,n,r)},c.prototype.rebaseHighlightPart=function(e,t,n){var r=l.defaultAnimationTime*.66,i=r*2,s=t.toRebaseArray,o=t.destinationBranch.get("visBranch");o||(o=t.destinationBranch.get("visNode")),u.each(s,function(t){var n=t.get("visNode");e.add(new f({closure:function(){n.highlightTo(o,i,"easeInOut")},duration:r*1.5}))},this),this.delay(e,r*2)},c.prototype.rebaseBirthPart=function(e,t,n,r){var i=t.rebaseSteps,s=[];u.each(i,function(e){var t=e.newCommit.get("visNode");s.push(t),t.setOpacity(0),t.setOutgoingEdgesOpacity(0)},this);var o=[];u.each(i,function(t,n){var i=s.slice(n+1),u=this.genFromToSnapshotAnimation(t.beforeSnapshot,t.afterSnapshot,i,o,r),a=this.genCommitBirthClosureFromSnapshot(t,r),c=function(){u(),a()};e.add(new f({closure:c,duration:l.defaultAnimationTime*1.5})),o.push(t.newCommit.get("visNode"))},this),this.delay(e),this.refreshTree(e,r)},c.prototype.delay=function(e,t){t=t||l.defaultAnimationTime,e.add(new f({closure:function(){},duration:t}))},c.prototype.genSetAllCommitOpacities=function(e,t){var n=e.slice(0);return function(){u.each(n,function(e){e.setOpacity(t),e.setOutgoingEdgesOpacity(t)})}},c.prototype.stripObjectsFromSnapshot=function(e,t){var n=[];u.each(t,function(e){n.push(e.getID())});var r={};return u.each(e,function(e,t){if(u.include(n,t))return;r[t]=e},this),r},c.prototype.genFromToSnapshotAnimation=function(e,t,n,r,i){var s=[];u.each(n,function(e){s.push(e),s=s.concat(e.get("outgoingEdges"))});var o=function(e){if(!e)return;u.each(e,function(t,n){e[n].opacity=1})};return u.each([e,t],function(e){u.each(r,function(t){o(e[t.getID()]),u.each(t.get("outgoingEdges"),function(t){o(e[t.getID()])})})}),function(){i.animateAllFromAttrToAttr(e,t,s)}},n.AnimationFactory=c}),e.define("/src/js/visuals/animation/index.js",function(e,t,n,r,i,s,o){var u=e("underscore"),a=e("backbone"),f=e("../../util/constants").GLOBAL,l=a.Model.extend({defaults:{duration:300,closure:null},validateAtInit:function(){if(!this.get("closure"))throw new Error("give me a closure!")},initialize:function(e){this.validateAtInit()},run:function(){this.get("closure")()}}),c=a.Model.extend({defaults:{animations:null,index:0,callback:null,defer:!1},initialize:function(e){this.set("animations",[]),e.callback||console.warn("no callback")},add:function(e){if(!e instanceof l)throw new Error("Need animation not something else");this.get("animations").push(e)},start:function(){this.set("index",0),f.isAnimating=!0,this.next()},finish:function(){f.isAnimating=!1,this.get("callback")()},next:function(){var e=this.get("animations"),t=this.get("index");if(t>=e.length){this.finish();return}var n=e[t],r=n.get("duration");n.run(),this.set("index",t+1),setTimeout(u.bind(function(){this.next()},this),r)}});n.Animation=l,n.AnimationQueue=c}),e.define("/src/js/git/treeCompare.js",function(e,t,n,r,i,s,o){function a(){}var u=e("underscore");a.prototype.compareAllBranchesWithinTreesAndHEAD=function(e,t){return e=this.convertTreeSafe(e),t=this.convertTreeSafe(t),e.HEAD.target==t.HEAD.target&&this.compareAllBranchesWithinTrees(e,t)},a.prototype.compareAllBranchesWithinTrees=function(e,t){e=this.convertTreeSafe(e),t=this.convertTreeSafe(t);var n=u.extend({},e.branches,t.branches),r=!0;return u.uniq(n,function(n,i){r=r&&this.compareBranchWithinTrees(e,t,i)},this),r},a.prototype.compareBranchesWithinTrees=function(e,t,n){var r=!0;return u.each(n,function(n){r=r&&this.compareBranchWithinTrees(e,t,n)},this),r},a.prototype.getRecurseCompare=function(e,t){var n=function(r,i){var s=u.isEqual(r,i);return s?(u.each(r.parents,function(r,o){var u=i.parents[o],a=e.commits[r],f=t.commits[u];s=s&&n(a,f)},this),s):!1};return n},a.prototype.compareBranchWithinTrees=function(e,t,n){e=this.convertTreeSafe(e),t=this.convertTreeSafe(t),this.reduceTreeFields([e,t]);var r=this.getRecurseCompare(e,t),i=e.branches[n],s=t.branches[n];return u.isEqual(i,s)&&r(e.commits[i.target],t.commits[s.target])},a.prototype.convertTreeSafe=function(e){return typeof e=="string"?JSON.parse(unescape(e)):e},a.prototype.reduceTreeFields=function(e){var t=["parents","id","rootCommit"],n=["children","parents"],r=["target","id"],i=function(e,t,n,r){var i=e[t];u.each(i,function(i,s){var o={};u.each(n,function(e){i[e]!==undefined&&(o[e]=i[e])}),u.each(r,function(e){i[e]&&(i[e].sort(),o[e]=i[e])}),e[t][s]=o})};u.each(e,function(e){i(e,"commits",t,n),i(e,"branches",r),e.HEAD={target:e.HEAD.target,id:e.HEAD.id}})},a.prototype.compareTrees=function(e,t){return e=this.convertTreeSafe(e),t=this.convertTreeSafe(t),this.reduceTreeFields([e,t]),u.isEqual(e,t)},n.TreeCompare=a}),e.define("/src/js/views/rebaseView.js",function(e,t,n,r,i,s,o){var u=e("../util/errors").GitError,a=e("underscore"),f=e("q"),l=e("../util").isBrowser()?window.Backbone:e("backbone"),c=e("../views").ModalTerminal,h=e("../views").ContainedBase,p=e("../views").ConfirmCancelView,d=e("../views").LeftRightView,v=h.extend({tagName:"div",template:a.template($("#interactive-rebase-template").html()),initialize:function(e){this.deferred=e.deferred,this.rebaseMap={},this.entryObjMap={},this.rebaseEntries=new g,e.toRebase.reverse(),a.each(e.toRebase,function(e){var t=e.get("id");this.rebaseMap[t]=e,this.entryObjMap[t]=new m({id:t}),this.rebaseEntries.add(this.entryObjMap[t])},this),this.container=new c({title:"Interactive Rebase"}),this.render(),this.show()},confirm:function(){this.die();var e=[];this.$("ul.rebaseEntries li").each(function(t,n){e.push(n.id)});var t=[];a.each(e,function(e){this.entryObjMap[e].get("pick")&&t.unshift(this.rebaseMap[e])},this),t.reverse(),this.deferred.resolve(t),this.$el.html("")},render:function(){var e={num:a.keys(this.rebaseMap).length},t=this.container.getInsideElement();this.$el.html(this.template(e)),$(t).append(this.el);var n=this.$("ul.rebaseEntries");this.rebaseEntries.each(function(e){new y({el:n,model:e})},this),n.sortable({axis:"y",placeholder:"rebaseEntry transitionOpacity ui-state-highlight",appendTo:"parent"}),this.makeButtons()},makeButtons:function(){var e=f.defer();e.promise.then(a.bind(function(){this.confirm()},this)).fail(a.bind(function(){this.hide(),this.deferred.resolve([])},this)).done(),new p({destination:this.$(".confirmCancel"),deferred:e})}}),m=l.Model.extend({defaults:{pick:!0},toggle:function(){this.set("pick",!this.get("pick"))}}),g=l.Collection.extend({model:m}),y=l.View.extend({tagName:"li",template:a.template($("#interactive-rebase-entry-template").html()),toggle:function(){this.model.toggle(),this.listEntry.toggleClass("notPicked",!this.model.get("pick"))},initialize:function(e){this.render()},render:function(){var e=this.model.toJSON();this.$el.append(this.template(this.model.toJSON())),this.listEntry=this.$el.children(":last"),this.listEntry.delegate("#toggleButton","click",a.bind(function(){this.toggle()},this))}});n.InteractiveRebaseView=v}),e.define("/src/js/views/index.js",function(e,t,n,r,i,s,o){var u=e("underscore"),a=e("q"),f=e("../util").isBrowser()?window.Backbone:e("backbone"),l=e("../app"),c=e("../util/constants"),h=e("../util/keyboard").KeyboardListener,p=e("../util/errors").GitError,d=f.View.extend({getDestination:function(){return this.destination||this.container.getInsideElement()},tearDown:function(){this.$el.remove(),this.container&&this.container.tearDown()},renderAgain:function(e){e=e||this.template(this.JSON),this.$el.html(e)},render:function(e){this.renderAgain(e);var t=this.getDestination();$(t).append(this.el)}}),v=d.extend({resolve:function(){this.deferred.resolve()},reject:function(){this.deferred.reject()}}),m=d.extend({positive:function(){this.navEvents.trigger("positive")},negative:function(){this.navEvents.trigger("negative")}}),g=d.extend({getAnimationTime:function(){return 700},show:function(){this.container.show()},hide:function(){this.container.hide()},die:function(){this.hide(),setTimeout(u.bind(function(){this.tearDown()},this),this.getAnimationTime()*1.1)}}),y=g.extend({tagName:"a",className:"generalButton uiButton",template:u.template($("#general-button").html()),events:{click:"click"},initialize:function(e){e=e||{},this.navEvents=e.navEvents||u.clone(f.Events),this.destination=e.destination,this.destination||(this.container=new S),this.JSON={buttonText:e.buttonText||"General Button",wantsWrapper:e.wantsWrapper!==undefined?e.wantsWrapper:!0},this.render(),this.container&&!e.wait&&this.show()},click:function(){this.clickFunc||(this.clickFunc=u.throttle(u.bind(this.sendClick,this),500)),this.clickFunc()},sendClick:function(){this.navEvents.trigger("click")}}),b=v.extend({tagName:"div",className:"confirmCancelView box horizontal justify",template:u.template($("#confirm-cancel-template").html()),events:{"click .confirmButton":"resolve","click .cancelButton":"reject"},initialize:function(e){if(!e.destination)throw new Error("needmore");this.destination=e.destination,this.deferred=e.deferred||a.defer(),this.JSON={confirm:e.confirm||"Confirm",cancel:e.cancel||"Cancel"},this.render()}}),w=m.extend({tagName:"div",className:"leftRightView box horizontal center",template:u.template($("#left-right-template").html()),events:{"click .left":"negative","click .right":"positive"},positive:function(){this.pipeEvents.trigger("positive"),w.__super__.positive.apply(this)},negative:function(){this.pipeEvents.trigger("negative"),w.__super__.negative.apply(this)},initialize:function(e){if(!e.destination||!e.events)throw new Error("needmore");this.destination=e.destination,this.pipeEvents=e.events,this.navEvents=u.clone(f.Events),this.JSON={showLeft:e.showLeft===undefined?!0:e.showLeft,lastNav:e.lastNav===undefined?!1:e.lastNav},this.render()}}),E=f.View.extend({tagName:"div",className:"modalView box horizontal center transitionOpacityLinear",template:u.template($("#modal-view-template").html()),getAnimationTime:function(){return 700},initialize:function(e){this.shown=!1,this.render()},render:function(){this.$el.html(this.template({})),$("body").append(this.el)},stealKeyboard:function(){l.getEventBaton().stealBaton("keydown",this.onKeyDown,this),l.getEventBaton().stealBaton("keyup",this.onKeyUp,this),l.getEventBaton().stealBaton("windowFocus",this.onWindowFocus,this),l.getEventBaton().stealBaton("documentClick",this.onDocumentClick,this),$("#commandTextField").blur()},releaseKeyboard:function(){l.getEventBaton().releaseBaton("keydown",this.onKeyDown,this),l.getEventBaton().releaseBaton("keyup",this.onKeyUp,this),l.getEventBaton().releaseBaton("windowFocus",this.onWindowFocus,this),l.getEventBaton().releaseBaton("documentClick",this.onDocumentClick,this),l.getEventBaton().trigger("windowFocus")},onWindowFocus:function(e){},onDocumentClick:function(e){},onKeyDown:function(e){e.preventDefault()},onKeyUp:function(e){e.preventDefault()},show:function(){this.toggleZ(!0),s.nextTick(u.bind(function(){this.toggleShow(!0)},this))},hide:function(){this.toggleShow(!1),setTimeout(u.bind(function(){this.shown||this.toggleZ(!1)},this),this.getAnimationTime())},getInsideElement:function(){return this.$(".contentHolder")},toggleShow:function(e){if(this.shown===e)return;e?this.stealKeyboard():this.releaseKeyboard(),this.shown=e,this.$el.toggleClass("show",e)},toggleZ:function(e){this.$el.toggleClass("inFront",e)},tearDown:function(){this.$el.html(""),$("body")[0].removeChild(this.el)}}),S=g.extend({tagName:"div",className:"modalTerminal box flex1",template:u.template($("#terminal-window-template").html()),events:{"click div.inside":"onClick"},initialize:function(e){e=e||{},this.navEvents=e.events||u.clone(f.Events),this.container=new E,this.JSON={title:e.title||"Heed This Warning!"},this.render()},onClick:function(){this.navEvents.trigger("click")},getInsideElement:function(){return this.$(".inside")}}),x=g.extend({tagName:"div",template:u.template($("#modal-alert-template").html()),initialize:function(e){e=e||{},this.JSON={title:e.title||"Something to say",text:e.text||"Here is a paragraph",markdown:e.markdown},e.markdowns&&(this.JSON.markdown=e.markdowns.join("\n")),this.container=new S({title:"Alert!"}),this.render(),e.wait||this.show()},render:function(){var t=this.JSON.markdown?e("markdown").markdown.toHTML(this.JSON.markdown):this.template(this.JSON);x.__super__.render.apply(this,[t])}}),T=f.View.extend({initialize:function(e){e=e||{},this.deferred=e.deferred||a.defer(),this.modalAlert=new x(u.extend({},{markdown:"#you sure?"},e));var t=a.defer();this.buttonDefer=t,this.confirmCancel=new b({deferred:t,destination:this.modalAlert.getDestination()}),t.promise.then(this.deferred.resolve).fail(this.deferred.reject).done(u.bind(function(){this.close()},this)),this.navEvents=u.clone(f.Events),this.navEvents.on("positive",this.positive,this),this.navEvents.on("negative",this.negative,this),this.keyboardListener=new h({events:this.navEvents,aliasMap:{enter:"positive",esc:"negative"}}),e.wait||this.modalAlert.show()},positive:function(){this.buttonDefer.resolve()},negative:function(){this.buttonDefer.reject()},getAnimationTime:function(){return 700},show:function(){this.modalAlert.show()},hide:function(){this.modalAlert.hide()},getPromise:function(){return this.deferred.promise},close:function(){this.keyboardListener.mute(),this.modalAlert.die()}}),N=T.extend({initialize:function(e){e=e||{};var t=e.nextLevel?e.nextLevel.name:"",n=["## Great Job!!","","You solved the level in **"+e.numCommands+"** command(s); ","our solution uses "+e.best+". "];e.numCommands<=e.best?n.push("Awesome! You matched or exceeded our solution. "):n.push("See if you can whittle it down to "+e.best+" command(s) :D "),e.nextLevel?n=n.concat(["",'Would you like to move onto "'+t+'", the next level?']):n=n.concat(["","Wow!!! You finished the last level, congratulations!"]),e=u.extend({},e,{markdowns:n}),N.__super__.initialize.apply(this,[e])}}),C=f.View.extend({initialize:function(e){this.grabBatons(),this.modalAlert=new x({markdowns:this.markdowns}),this.modalAlert.show()},grabBatons:function(){l.getEventBaton().stealBaton(this.eventBatonName,this.batonFired,this)},releaseBatons:function(){l.getEventBaton().releaseBaton(this.eventBatonName,this.batonFired,this)},finish:function(){this.releaseBatons(),this.modalAlert.die()}}),k=C.extend({initialize:function(e){this.eventBatonName="windowSizeCheck",this.markdowns=["## That window size is not supported :-/","Please resize your window back to a supported size","","(and of course, pull requests to fix this are appreciated :D)"],k.__super__.initialize.apply(this,[e])},batonFired:function(e){e.w>c.VIEWPORT.minWidth&&e.h>c.VIEWPORT.minHeight&&this.finish()}}),L=C.extend({initialize:function(e){if(!e||!e.level)throw new Error("need level");this.eventBatonName="zoomChange",this.markdowns=["## That zoom level of "+e.level+" is not supported :-/","Please zoom back to a supported zoom level with Ctrl + and Ctrl -","","(and of course, pull requests to fix this are appreciated :D)"],L.__super__.initialize.apply(this,[e])},batonFired:function(e){e<=c.VIEWPORT.maxZoom&&e>=c.VIEWPORT.minZoom&&this.finish()}}),A=d.extend({tagName:"div",className:"levelToolbarHolder",template:u.template($("#level-toolbar-template").html()),initialize:function(e){e=e||{},this.JSON={name:e.name||"Some level! (unknown name)"},this.beforeDestination=$($("#commandLineHistory div.toolbar")[0]),this.render(),e.wait||s.nextTick(u.bind(this.show,this))},getAnimationTime:function(){return 700},render:function(){var e=this.template(this.JSON);this.$el.html(e),this.beforeDestination.after(this.el)},die:function(){this.hide(),setTimeout(u.bind(function(){this.tearDown()},this),this.getAnimationTime())},hide:function(){this.$("div.toolbar").toggleClass("hidden",!0)},show:function(){this.$("div.toolbar").toggleClass("hidden",!1)}}),O=d.extend({tagName:"div",className:"canvasTerminalHolder box flex1",template:u.template($("#terminal-window-bare-template").html()),events:{"click div.wrapper":"onClick"},initialize:function(e){e=e||{},this.destination=$("body"),this.JSON={title:e.title||"Goal To Reach",text:e.text||'You can hide this window with "hide goal"'},this.render(),e.additionalClass&&this.$el.addClass(e.additionalClass)},getAnimationTime:function(){return 700},onClick:function(){this.slideOut()},die:function(){this.slideOut(),setTimeout(u.bind(function(){this.tearDown()},this))},slideOut:function(){this.slideToggle(!0)},slideIn:function(){this.slideToggle(!1)},slideToggle:function(e){this.$("div.terminal-window-holder").toggleClass("slideOut",e)},getCanvasLocation:function(){return this.$("div.inside")[0]}});n.BaseView=d,n.GeneralButton=y,n.ModalView=E,n.ModalTerminal=S,n.ModalAlert=x,n.ContainedBase=g,n.ConfirmCancelView=b,n.LeftRightView=w,n.ZoomAlertWindow=L,n.ConfirmCancelTerminal=T,n.WindowSizeAlertWindow=k,n.CanvasTerminalHolder=O,n.LevelToolbar=A,n.NextLevelConfirm=N}),e.define("/src/js/util/keyboard.js",function(e,t,n,r,i,s,o){function c(e){this.events=e.events||u.clone(a.Events),this.aliasMap=e.aliasMap||{},e.wait||this.listen()}var u=e("underscore"),a=e("backbone"),f=e("../app"),l=function(e){var t={37:"left",38:"up",39:"right",40:"down",27:"esc",13:"enter"};return t[e]};c.prototype.listen=function(){if(this.listening)return;this.listening=!0,f.getEventBaton().stealBaton("docKeydown",this.keydown,this)},c.prototype.mute=function(){this.listening=!1,f.getEventBaton().releaseBaton("docKeydown",this.keydown,this)},c.prototype.keydown=function(e){var t=e.which||e.keyCode,n=l(t);if(n===undefined)return;this.fireEvent(n,e)},c.prototype.fireEvent=function(e,t){e=this.aliasMap[e]||e,this.events.trigger(e,t)},c.prototype.passEventBack=function(e){f.getEventBaton().passBatonBackSoft("docKeydown",this.keydown,this,[e])},n.KeyboardListener=c,n.mapKeycodeToKey=l}),e.define("/node_modules/markdown/package.json",function(e,t,n,r,i,s,o){t.exports={main:"./lib/index.js"}}),e.define("/node_modules/markdown/lib/index.js",function(e,t,n,r,i,s,o){n.markdown=e("./markdown"),n.parse=n.markdown.toHTML}),e.define("/node_modules/markdown/lib/markdown.js",function(e,t,n,r,i,s,o){(function(t){function r(){return"Markdown.mk_block( "+uneval(this.toString())+", "+uneval(this.trailing)+", "+uneval(this.lineNumber)+" )"}function i(){var t=e("util");return"Markdown.mk_block( "+t.inspect(this.toString())+", "+t.inspect(this.trailing)+", "+t.inspect(this.lineNumber)+" )"}function o(e){var t=0,n=-1;while((n=e.indexOf("\n",n+1))!==-1)t++;return t}function u(e,t){function i(e){this.len_after=e,this.name="close_"+t}var n=e+"_state",r=e=="strong"?"em_state":"strong_state";return function(s,o){if(this[n][0]==t)return this[n].shift(),[s.length,new i(s.length-t.length)];var u=this[r].slice(),a=this[n].slice();this[n].unshift(t);var f=this.processInline(s.substr(t.length)),l=f[f.length-1],c=this[n].shift();if(l instanceof i){f.pop();var h=s.length-l.len_after;return[h,[e].concat(f)]}return this[r]=u,this[n]=a,[t.length,t]}}function f(e){var t=e.split(""),n=[""],r=!1;while(t.length){var i=t.shift();switch(i){case" ":r?n[n.length-1]+=i:n.push("");break;case"'":case'"':r=!r;break;case"\\":i=t.shift();default:n[n.length-1]+=i}}return n}function h(e){return l(e)&&e.length>1&&typeof e[1]=="object"&&!l(e[1])?e[1]:undefined}function d(e){return e.replace(/&/g,"&").replace(//g,">").replace(/"/g,""").replace(/'/g,"'")}function v(e){if(typeof e=="string")return d(e);var t=e.shift(),n={},r=[];e.length&&typeof e[0]=="object"&&!(e[0]instanceof Array)&&(n=e.shift());while(e.length)r.push(arguments.callee(e.shift()));var i="";for(var s in n)i+=" "+s+'="'+d(n[s])+'"';return t=="img"||t=="br"||t=="hr"?"<"+t+i+"/>":"<"+t+i+">"+r.join("")+""+t+">"}function m(e,t,n){var r;n=n||{};var i=e.slice(0);typeof n.preprocessTreeNode=="function"&&(i=n.preprocessTreeNode(i,t));var s=h(i);if(s){i[1]={};for(r in s)i[1][r]=s[r];s=i[1]}if(typeof i=="string")return i;switch(i[0]){case"header":i[0]="h"+i[1].level,delete i[1].level;break;case"bulletlist":i[0]="ul";break;case"numberlist":i[0]="ol";break;case"listitem":i[0]="li";break;case"para":i[0]="p";break;case"markdown":i[0]="html",s&&delete s.references;break;case"code_block":i[0]="pre",r=s?2:1;var o=["code"];o.push.apply(o,i.splice(r)),i[r]=o;break;case"inlinecode":i[0]="code";break;case"img":i[1].src=i[1].href,delete i[1].href;break;case"linebreak":i[0]="br";break;case"link":i[0]="a";break;case"link_ref":i[0]="a";var u=t[s.ref];if(!u)return s.original;delete s.ref,s.href=u.href,u.title&&(s.title=u.title),delete s.original;break;case"img_ref":i[0]="img";var u=t[s.ref];if(!u)return s.original;delete s.ref,s.src=u.href,u.title&&(s.title=u.title),delete s.original}r=1;if(s){for(var a in i[1])r=2;r===1&&i.splice(r,1)}for(;r0&&!l(o[0]))&&this.debug(i[s],"didn't return a proper array"),o}return[]},n.prototype.processInline=function(t){return this.dialect.inline.__call__.call(this,String(t))},n.prototype.toTree=function(t,n){var r=t instanceof Array?t:this.split_blocks(t),i=this.tree;try{this.tree=n||this.tree||["markdown"];e:while(r.length){var s=this.processBlock(r.shift(),r);if(!s.length)continue e;this.tree.push.apply(this.tree,s)}return this.tree}finally{n&&(this.tree=i)}},n.prototype.debug=function(){var e=Array.prototype.slice.call(arguments);e.unshift(this.debug_indent),typeof print!="undefined"&&print.apply(print,e),typeof console!="undefined"&&typeof console.log!="undefined"&&console.log.apply(null,e)},n.prototype.loop_re_over_block=function(e,t,n){var r,i=t.valueOf();while(i.length&&(r=e.exec(i))!=null)i=i.substr(r[0].length),n.call(this,r);return i},n.dialects={},n.dialects.Gruber={block:{atxHeader:function(t,n){var r=t.match(/^(#{1,6})\s*(.*?)\s*#*\s*(?:\n|$)/);if(!r)return undefined;var i=["header",{level:r[1].length}];return Array.prototype.push.apply(i,this.processInline(r[2])),r[0].length1&&n.unshift(r);for(var s=0;s1&&typeof i[i.length-1]=="string"?i[i.length-1]+=o:i.push(o)}}function f(e,t){var n=new RegExp("^("+i+"{"+e+"}.*?\\n?)*$"),r=new RegExp("^"+i+"{"+e+"}","gm"),o=[];while(t.length>0){if(n.exec(t[0])){var u=t.shift(),a=u.replace(r,"");o.push(s(a,u.trailing,u.lineNumber))}break}return o}function l(e,t,n){var r=e.list,i=r[r.length-1];if(i[1]instanceof Array&&i[1][0]=="para")return;if(t+1==n.length)i.push(["para"].concat(i.splice(1)));else{var s=i.pop();i.push(["para"].concat(i.splice(1)),s)}}var e="[*+-]|\\d+\\.",t=/[*+-]/,n=/\d+\./,r=new RegExp("^( {0,3})("+e+")[ ]+"),i="(?: {0,3}\\t| {4})";return function(e,n){function s(e){var n=t.exec(e[2])?["bulletlist"]:["numberlist"];return h.push({list:n,indent:e[1]}),n}var i=e.match(r);if(!i)return undefined;var h=[],p=s(i),d,v=!1,m=[h[0].list],g;e:for(;;){var y=e.split(/(?=\n)/),b="";for(var w=0;wh.length)p=s(i),d.push(p),d=p[1]=["listitem"];else{var N=!1;for(g=0;gi[0].length&&(b+=E+S.substr(i[0].length))}b.length&&(a(d,v,this.processInline(b),E),v=!1,b="");var C=f(h.length,n);C.length>0&&(c(h,l,this),d.push.apply(d,this.toTree(C,[])));var k=n[0]&&n[0].valueOf()||"";if(k.match(r)||k.match(/^ /)){e=n.shift();var L=this.dialect.block.horizRule(e,n);if(L){m.push.apply(m,L);break}c(h,l,this),v=!0;continue e}break}return m}}(),blockquote:function(t,n){if(!t.match(/^>/m))return undefined;var r=[];if(t[0]!=">"){var i=t.split(/\n/),s=[];while(i.length&&i[0][0]!=">")s.push(i.shift());t=i.join("\n"),r.push.apply(r,this.processBlock(s.join("\n"),[]))}while(n.length&&n[0][0]==">"){var o=n.shift();t=new String(t+t.trailing+o),t.trailing=o.trailing}var u=t.replace(/^> ?/gm,""),a=this.tree;return r.push(this.toTree(u,["blockquote"])),r},referenceDefn:function(t,n){var r=/^\s*\[(.*?)\]:\s*(\S+)(?:\s+(?:(['"])(.*?)\3|\((.*?)\)))?\n?/;if(!t.match(r))return undefined;h(this.tree)||this.tree.splice(1,0,{});var i=h(this.tree);i.references===undefined&&(i.references={});var o=this.loop_re_over_block(r,t,function(e){e[2]&&e[2][0]=="<"&&e[2][e[2].length-1]==">"&&(e[2]=e[2].substring(1,e[2].length-1));var t=i.references[e[1].toLowerCase()]={href:e[2]};e[4]!==undefined?t.title=e[4]:e[5]!==undefined&&(t.title=e[5])});return o.length&&n.unshift(s(o,t.trailing)),[]},para:function(t,n){return[["para"].concat(this.processInline(t))]}}},n.dialects.Gruber.inline={__oneElement__:function(t,n,r){var i,s,o=0;n=n||this.dialect.inline.__patterns__;var u=new RegExp("([\\s\\S]*?)("+(n.source||n)+")");i=u.exec(t);if(!i)return[t.length,t];if(i[1])return[i[1].length,i[1]];var s;return i[2]in this.dialect.inline&&(s=this.dialect.inline[i[2]].call(this,t.substr(i.index),i,r||[])),s=s||[i[2].length,i[2]],s},__call__:function(t,n){function s(e){typeof e=="string"&&typeof r[r.length-1]=="string"?r[r.length-1]+=e:r.push(e)}var r=[],i;while(t.length>0)i=this.dialect.inline.__oneElement__.call(this,t,n,r),t=t.substr(i.shift()),c(i,s);return r},"]":function(){},"}":function(){},"\\":function(t){return t.match(/^\\[\\`\*_{}\[\]()#\+.!\-]/)?[2,t[1]]:[1,"\\"]},"![":function(t){var n=t.match(/^!\[(.*?)\][ \t]*\([ \t]*(\S*)(?:[ \t]+(["'])(.*?)\3)?[ \t]*\)/);if(n){n[2]&&n[2][0]=="<"&&n[2][n[2].length-1]==">"&&(n[2]=n[2].substring(1,n[2].length-1)),n[2]=this.dialect.inline.__call__.call(this,n[2],/\\/)[0];var r={alt:n[1],href:n[2]||""};return n[4]!==undefined&&(r.title=n[4]),[n[0].length,["img",r]]}return n=t.match(/^!\[(.*?)\][ \t]*\[(.*?)\]/),n?[n[0].length,["img_ref",{alt:n[1],ref:n[2].toLowerCase(),original:n[0]}]]:[2,"!["]},"[":function b(e){var t=String(e),r=n.DialectHelpers.inline_until_char.call(this,e.substr(1),"]");if(!r)return[1,"["];var i=1+r[0],s=r[1],b,o;e=e.substr(i);var u=e.match(/^\s*\([ \t]*(\S+)(?:[ \t]+(["'])(.*?)\2)?[ \t]*\)/);if(u){var a=u[1];i+=u[0].length,a&&a[0]=="<"&&a[a.length-1]==">"&&(a=a.substring(1,a.length-1));if(!u[3]){var f=1;for(var l=0;l]+)|(.*?@.*?\.[a-zA-Z]+))>/))!=null?n[3]?[n[0].length,["link",{href:"mailto:"+n[3]},n[3]]]:n[2]=="mailto"?[n[0].length,["link",{href:n[1]},n[1].substr("mailto:".length)]]:[n[0].length,["link",{href:n[1]},n[1]]]:[1,"<"]},"`":function(t){var n=t.match(/(`+)(([\s\S]*?)\1)/);return n&&n[2]?[n[1].length+n[2].length,["inlinecode",n[3]]]:[1,"`"]}," \n":function(t){return[3,["linebreak"]]}},n.dialects.Gruber.inline["**"]=u("strong","**"),n.dialects.Gruber.inline.__=u("strong","__"),n.dialects.Gruber.inline["*"]=u("em","*"),n.dialects.Gruber.inline._=u("em","_"),n.buildBlockOrder=function(e){var t=[];for(var n in e){if(n=="__order__"||n=="__call__")continue;t.push(n)}e.__order__=t},n.buildInlinePatterns=function(e){var t=[];for(var n in e){if(n.match(/^__.*__$/))continue;var r=n.replace(/([\\.*+?|()\[\]{}])/g,"\\$1").replace(/\n/,"\\n");t.push(n.length==1?r:"(?:"+r+")")}t=t.join("|"),e.__patterns__=t;var i=e.__call__;e.__call__=function(e,n){return n!=undefined?i.call(this,e,n):i.call(this,e,t)}},n.DialectHelpers={},n.DialectHelpers.inline_until_char=function(e,t){var n=0,r=[];for(;;){if(e[n]==t)return n++,[n,r];if(n>=e.length)return null;res=this.dialect.inline.__oneElement__.call(this,e.substr(n)),n+=res[0],r.push.apply(r,res.slice(1))}},n.subclassDialect=function(e){function t(){}function n(){}return t.prototype=e.block,n.prototype=e.inline,{block:new t,inline:new n}},n.buildBlockOrder(n.dialects.Gruber.block),n.buildInlinePatterns(n.dialects.Gruber.inline),n.dialects.Maruku=n.subclassDialect(n.dialects.Gruber),n.dialects.Maruku.processMetaHash=function(t){var n=f(t),r={};for(var i=0;i1)return undefined;if(!t.match(/^(?:\w+:.*\n)*\w+:.*$/))return undefined;h(this.tree)||this.tree.splice(1,0,{});var r=t.split(/\n/);for(p in r){var i=r[p].match(/(\w+):\s*(.*)$/),s=i[1].toLowerCase(),o=i[2];this.tree[1][s]=o}return[]},n.dialects.Maruku.block.block_meta=function(t,n){var r=t.match(/(^|\n) {0,3}\{:\s*((?:\\\}|[^\}])*)\s*\}$/);if(!r)return undefined;var i=this.dialect.processMetaHash(r[2]),s;if(r[1]===""){var o=this.tree[this.tree.length-1];s=h(o);if(typeof o=="string")return undefined;s||(s={},o.splice(1,0,s));for(a in i)s[a]=i[a];return[]}var u=t.replace(/\n.*$/,""),f=this.processBlock(u,[]);s=h(f[0]),s||(s={},f[0].splice(1,0,s));for(a in i)s[a]=i[a];return f},n.dialects.Maruku.block.definition_list=function(t,n){var r=/^((?:[^\s:].*\n)+):\s+([\s\S]+)$/,i=["dl"],s;if(!(a=t.match(r)))return undefined;var o=[t];while(n.length&&r.exec(n[0]))o.push(n.shift());for(var u=0;u-1&&(a(e)?i=i.split("\n").map(function(e){return" "+e}).join("\n").substr(2):i="\n"+i.split("\n").map(function(e){return" "+e}).join("\n"))):i=o("[Circular]","special"));if(typeof n=="undefined"){if(g==="Array"&&t.match(/^\d+$/))return i;n=JSON.stringify(""+t),n.match(/^"([a-zA-Z_][a-zA-Z_0-9]*)"$/)?(n=n.substr(1,n.length-2),n=o(n,"name")):(n=n.replace(/'/g,"\\'").replace(/\\"/g,'"').replace(/(^"|"$)/g,"'"),n=o(n,"string"))}return n+": "+i});s.pop();var E=0,S=w.reduce(function(e,t){return E++,t.indexOf("\n")>=0&&E++,e+t.length+1},0);return S>50?w=y[0]+(m===""?"":m+"\n ")+" "+w.join(",\n ")+" "+y[1]:w=y[0]+m+" "+w.join(", ")+" "+y[1],w}var s=[],o=function(e,t){var n={bold:[1,22],italic:[3,23],underline:[4,24],inverse:[7,27],white:[37,39],grey:[90,39],black:[30,39],blue:[34,39],cyan:[36,39],green:[32,39],magenta:[35,39],red:[31,39],yellow:[33,39]},r={special:"cyan",number:"blue","boolean":"yellow","undefined":"grey","null":"bold",string:"green",date:"magenta",regexp:"red"}[t];return r?"["+n[r][0]+"m"+e+"["+n[r][1]+"m":e};return i||(o=function(e,t){return e}),u(e,typeof r=="undefined"?2:r)};var h=["Jan","Feb","Mar","Apr","May","Jun","Jul","Aug","Sep","Oct","Nov","Dec"];n.log=function(e){},n.pump=null;var d=Object.keys||function(e){var t=[];for(var n in e)t.push(n);return t},v=Object.getOwnPropertyNames||function(e){var t=[];for(var n in e)Object.hasOwnProperty.call(e,n)&&t.push(n);return t},m=Object.create||function(e,t){var n;if(e===null)n={__proto__:null};else{if(typeof e!="object")throw new TypeError("typeof prototype["+typeof e+"] != 'object'");var r=function(){};r.prototype=e,n=new r,n.__proto__=e}return typeof t!="undefined"&&Object.defineProperties&&Object.defineProperties(n,t),n};n.inherits=function(e,t){e.super_=t,e.prototype=m(t.prototype,{constructor:{value:e,enumerable:!1,writable:!0,configurable:!0}})};var g=/%[sdj%]/g;n.format=function(e){if(typeof e!="string"){var t=[];for(var r=0;r=s)return e;switch(e){case"%s":return String(i[r++]);case"%d":return Number(i[r++]);case"%j":return JSON.stringify(i[r++]);default:return e}});for(var u=i[r];r0&&this._events[e].length>n&&(this._events[e].warned=!0,console.error("(node) warning: possible EventEmitter memory leak detected. %d listeners added. Use emitter.setMaxListeners() to increase limit.",this._events[e].length),console.trace())}this._events[e].push(t)}else this._events[e]=[this._events[e],t];return this},u.prototype.on=u.prototype.addListener,u.prototype.once=function(e,t){var n=this;return n.on(e,function r(){n.removeListener(e,r),t.apply(this,arguments)}),this},u.prototype.removeListener=function(e,t){if("function"!=typeof t)throw new Error("removeListener only takes instances of Function");if(!this._events||!this._events[e])return this;var n=this._events[e];if(a(n)){var r=f(n,t);if(r<0)return this;n.splice(r,1),n.length==0&&delete this._events[e]}else this._events[e]===t&&delete this._events[e];return this},u.prototype.removeAllListeners=function(e){return e&&this._events&&this._events[e]&&(this._events[e]=null),this},u.prototype.listeners=function(e){return this._events||(this._events={}),this._events[e]||(this._events[e]=[]),a(this._events[e])||(this._events[e]=[this._events[e]]),this._events[e]}}),e.define("/src/js/models/commandModel.js",function(e,t,n,r,i,s,o){var u=e("underscore"),a=e("../util").isBrowser()?a=window.Backbone:a=e("backbone"),f=e("../util/errors"),l=e("../git/commands"),c=l.GitOptionParser,h=e("../level/parseWaterfall").ParseWaterfall,p=f.CommandProcessError,d=f.GitError,v=f.Warning,m=f.CommandResult,g=a.Model.extend({defaults:{status:"inqueue",rawStr:null,result:"",createTime:null,error:null,warnings:null,parseWaterfall:new h,generalArgs:null,supportedMap:null,options:null,method:null},initialize:function(e){this.initDefaults(),this.validateAtInit(),this.on("change:error",this.errorChanged,this),this.get("error")&&this.errorChanged(),this.parseOrCatch()},initDefaults:function(){this.set("generalArgs",[]),this.set("supportedMap",{}),this.set("warnings",[])},validateAtInit:function(){if(this.get("rawStr")===null)throw new Error("Give me a string!");this.get("createTime")||this.set("createTime",(new Date).toString())},setResult:function(e){this.set("result",e)},finishWith:function(e){this.set("status","finished"),e.resolve()},addWarning:function(e){this.get("warnings").push(e),this.set("numWarnings",this.get("numWarnings")?this.get("numWarnings")+1:1)},getFormattedWarnings:function(){if(!this.get("warnings").length)return"";var e='';return""+e+this.get("warnings").join("
"+e)+"
"},parseOrCatch:function(){this.expandShortcuts(this.get("rawStr"));try{this.processInstants()}catch(e){f.filterError(e),this.set("error",e);return}if(this.parseAll())return;this.set("error",new p({msg:'The command "'+this.get("rawStr")+"\" isn't supported, sorry!"}))},errorChanged:function(){var e=this.get("error");e instanceof p||e instanceof d?this.set("status","error"):e instanceof m?this.set("status","finished"):e instanceof v&&this.set("status","warning"),this.formatError()},formatError:function(){this.set("result",this.get("error").toResult())},expandShortcuts:function(e){e=this.get("parseWaterfall").expandAllShortcuts(e),this.set("rawStr",e)},processInstants:function(){var e=this.get("rawStr");if(!e.length)throw new m({msg:""});this.get("parseWaterfall").processAllInstants(e)},parseAll:function(){var e=this.get("rawStr"),t=this.get("parseWaterfall").parseAll(e);return t?(u.each(t.toSet,function(e,t){this.set(t,e)},this),!0):!1}}),y=a.Model.extend({defaults:{text:""}});n.CommandEntry=y,n.Command=g}),e.define("/src/js/git/commands.js",function(e,t,n,r,i,s,o){function g(e,t){this.method=e,this.rawOptions=t,this.supportedMap=this.getMasterOptionMap()[e];if(this.supportedMap===undefined)throw new Error("No option map for "+e);this.generalArgs=[],this.explodeAndSet()}var u=e("underscore"),a=e("../util/errors"),f=a.CommandProcessError,l=a.GitError,c=a.Warning,h=a.CommandResult,p={"git commit":/^(gc|git ci)($|\s)/,"git add":/^ga($|\s)/,"git checkout":/^(go|git co)($|\s)/,"git rebase":/^gr($|\s)/,"git branch":/^(gb|git br)($|\s)/,"git status":/^(gst|gs|git st)($|\s)/,"git help":/^git$/},d=[[/^git help($|\s)/,function(){var e=["Git Version PCOTTLE.1.0","
","Usage:",u.escape(" git []"),"
","Supported commands:","
"],t=g.prototype.getMasterOptionMap();u.each(t,function(t,n){e.push("git "+n),u.each(t,function(t,n){e.push(" "+n)},this)},this);var n=e.join("\n");throw n=n.replace(/\t/g," "),new h({msg:n})}]],v={"git commit":/^git commit($|\s)/,"git add":/^git add($|\s)/,"git checkout":/^git checkout($|\s)/,"git rebase":/^git rebase($|\s)/,"git reset":/^git reset($|\s)/,"git branch":/^git branch($|\s)/,"git revert":/^git revert($|\s)/,"git log":/^git log($|\s)/,"git merge":/^git merge($|\s)/,"git show":/^git show($|\s)/,"git status":/^git status($|\s)/,"git cherry-pick":/^git cherry-pick($|\s)/},m=function(e){var t,n;u.each(v,function(r,i){r.exec(e)&&(n=e.slice(i.length+1),t=i.slice("git ".length))});if(!t)return!1;var r=new g(t,n);return{toSet:{generalArgs:r.generalArgs,supportedMap:r.supportedMap,method:t,options:n,eventName:"processGitCommand"}}};g.prototype.getMasterOptionMap=function(){return{commit:{"--amend":!1,"-a":!1,"-am":!1,"-m":!1},status:{},log:{},add:{},"cherry-pick":{},branch:{"-d":!1,"-D":!1,"-f":!1,"--contains":!1},checkout:{"-b":!1,"-B":!1,"-":!1},reset:{"--hard":!1,"--soft":!1},merge:{},rebase:{"-i":!1},revert:{},show:{}}},g.prototype.explodeAndSet=function(){var e=this.rawOptions.match(/('.*?'|".*?"|\S+)/g)||[];for(var t=0;t p.uiButton":"positive"},initialize:function(t){t=t||{},this.options=t,this.JSON=u.extend({beforeMarkdowns:["## Git Commits","","Awesome!"],command:"git commit",afterMarkdowns:["Now you have seen it in action","","Go ahead and try the level!"]},t);var n=function(t){return e("markdown").markdown.toHTML(t.join("\n"))};this.JSON.beforeHTML=n(this.JSON.beforeMarkdowns),this.JSON.afterHTML=n(this.JSON.afterMarkdowns),this.container=new p({title:t.title||"Git Demonstration"}),this.render(),this.checkScroll(),this.navEvents=u.clone(f.Events),this.navEvents.on("positive",this.positive,this),this.navEvents.on("negative",this.negative,this),this.keyboardListener=new c({events:this.navEvents,aliasMap:{enter:"positive",right:"positive",left:"negative"},wait:!0}),this.visFinished=!1,this.initVis(),t.wait||this.show()},receiveMetaNav:function(e,t){var n=this;e.navEvents.on("positive",this.positive,this),this.metaContainerView=t},checkScroll:function(){var e=this.$("div.demonstrationText").children(),t=u.map(e,function(e){return e.clientHeight}),n=u.reduce(t,function(e,t){return e+t});n15&&console.warn("graphics are degrading from too many layers");var t=this.getDepthIncrement(e);u.each(this.visNodeMap,function(e){e.setDepthBasedOn(t)},this)},w.prototype.animateNodePositions=function(e){u.each(this.visNodeMap,function(t){t.animateUpdatedPosition(e)},this)},w.prototype.addBranchFromEvent=function(e,t,n){var r=u.bind(function(){this.addBranch(e)},this);!this.gitEngine||!this.gitReady?this.defer(r):r()},w.prototype.addBranch=function(e){var t=new m({branch:e,gitVisuals:this,gitEngine:this.gitEngine});this.visBranchCollection.add(t),this.gitReady?t.genGraphics(this.paper):this.defer(u.bind(function(){t.genGraphics(this.paper)},this))},w.prototype.removeVisBranch=function(e){this.visBranchCollection.remove(e)},w.prototype.removeVisNode=function(e){this.visNodeMap[e.getID()]=undefined},w.prototype.removeVisEdge=function(e){this.visEdgeCollection.remove(e)},w.prototype.animateRefs=function(e){this.visBranchCollection.each(function(t){t.animateUpdatedPos(e)},this)},w.prototype.animateEdges=function(e){this.visEdgeCollection.each(function(t){t.animateUpdatedPath(e)},this)},w.prototype.getMinLayers=function(){return this.options.smallCanvas?4:7},w.prototype.getDepthIncrement=function(e){e=Math.max(e,this.getMinLayers());var t=1/e;return t},w.prototype.calcDepthRecursive=function(e,t){e.get("visNode").setDepth(t);var n=e.get("children"),r=t;return u.each(n,function(e){var n=this.calcDepthRecursive(e,t+1);r=Math.max(n,r)},this),r},w.prototype.canvasResize=function(e,t){this.resizeFunc||this.genResizeFunc(),this.resizeFunc(e,t)},w.prototype.genResizeFunc=function(){this.resizeFunc=u.debounce(u.bind(function(t,n){if(c.isAnimating){var r=e("../app");r.getEventBaton().trigger("commandSubmitted","refresh")}else this.refreshTree()},this),200,!0)},w.prototype.addNode=function(e,t){this.commitMap[e]=t,t.get("rootCommit")&&(this.rootCommit=t);var n=new v({id:e,commit:t,gitVisuals:this,gitEngine:this.gitEngine});return this.visNodeMap[e]=n,this.gitReady&&n.genGraphics(this.paper),n},w.prototype.addEdge=function(e,t){var n=this.visNodeMap[e],r=this.visNodeMap[t];if(!n||!r)throw new Error("one of the ids in ("+e+", "+t+") does not exist");var i=new y({tail:n,head:r,gitVisuals:this,gitEngine:this.gitEngine});this.visEdgeCollection.add(i),this.gitReady&&i.genGraphics(this.paper)},w.prototype.zIndexReflow=function(){this.visNodesFront(),this.visBranchesFront()},w.prototype.visNodesFront=function(){u.each(this.visNodeMap,function(e){e.toFront()})},w.prototype.visBranchesFront=function(){this.visBranchCollection.each(function(e){e.nonTextToFront(),e.textToFront()}),this.visBranchCollection.each(function(e){e.textToFrontIfInStack()})},w.prototype.drawTreeFromReload=function(){this.gitReady=!0,this.deferFlush(),this.calcTreeCoords()},w.prototype.drawTreeFirstTime=function(){this.gitReady=!0,this.calcTreeCoords(),u.each(this.visNodeMap,function(e){e.genGraphics(this.paper)},this),this.visEdgeCollection.each(function(e){e.genGraphics(this.paper)},this),this.visBranchCollection.each(function(e){e.genGraphics(this.paper)},this),this.zIndexReflow()},n.GitVisuals=w}),e.define("/src/js/visuals/visNode.js",function(e,t,n,r,i,s,o){var u=e("underscore"),a=e("backbone"),f=e("../util/constants").GRAPHICS,l=e("../visuals/visBase").VisBase,c=l.extend({defaults:{depth:undefined,maxWidth:null,outgoingEdges:null,circle:null,text:null,id:null,pos:null,radius:null,commit:null,animationSpeed:f.defaultAnimationTime,animationEasing:f.defaultEasing,fill:f.defaultNodeFill,"stroke-width":f.defaultNodeStrokeWidth,stroke:f.defaultNodeStroke},getID:function(){return this.get("id")},validateAtInit:function(){if(!this.get("id"))throw new Error("need id for mapping");if(!this.get("commit"))throw new Error("need commit for linking");this.get("pos")||this.set("pos",{x:Math.random(),y:Math.random()})},initialize:function(){this.validateAtInit(),this.gitVisuals=this.get("gitVisuals"),this.gitEngine=this.get("gitEngine"),this.set("outgoingEdges",[])},setDepth:function(e){this.set("depth",Math.max(this.get("depth")||0,e))},setDepthBasedOn:function(e){if(this.get("depth")===undefined){debugger;throw new Error("no depth yet!")}var t=this.get("pos");t.y=this.get("depth")*e},getMaxWidthScaled:function(){var e=this.gitVisuals.getCommitUpstreamStatus(this.get("commit")),t={branch:1,head:.3,none:.1};if(t[e]===undefined)throw new Error("bad stat");return t[e]*this.get("maxWidth")},toFront:function(){this.get("circle").toFront(),this.get("text").toFront()},getOpacity:function(){var e={branch:1,head:f.upstreamHeadOpacity,none:f.upstreamNoneOpacity},t=this.gitVisuals.getCommitUpstreamStatus(this.get("commit"));if(e[t]===undefined)throw new Error("invalid status");return e[t]},getTextScreenCoords:function(){return this.getScreenCoords()},getAttributes:function(){var e=this.getScreenCoords(),t=this.getTextScreenCoords(),n=this.getOpacity();return{circle:{cx:e.x,cy:e.y,opacity:n,r:this.getRadius(),fill:this.getFill(),"stroke-width":this.get("stroke-width"),stroke:this.get("stroke")},text:{x:t.x,y:t.y,opacity:n}}},highlightTo:function(e,t,n){var r=e.get("fill"),i={circle:{fill:r,stroke:r,"stroke-width":this.get("stroke-width")*5},text:{}};this.animateToAttr(i,t,n)},animateUpdatedPosition:function(e,t){var n=this.getAttributes();this.animateToAttr(n,e,t)},animateFromAttrToAttr:function(e,t,n,r){this.animateToAttr(e,0),this.animateToAttr(t,n,r)},animateToSnapshot:function(e,t,n){if(!e[this.getID()])return;this.animateToAttr(e[this.getID()],t,n)},animateToAttr:function(e,t,n){if(t===0){this.get("circle").attr(e.circle),this.get("text").attr(e.text);return}var r=t!==undefined?t:this.get("animationSpeed"),i=n||this.get("animationEasing");this.get("circle").stop().animate(e.circle,r,i),this.get("text").stop().animate(e.text,r,i),n=="bounce"&&e.circle&&e.circle.cx!==undefined&&e.text&&e.text.x!==undefined&&(this.get("circle").animate(e.circle.cx,r,"easeInOut"),this.get("text").animate(e.text.x,r,"easeInOut"))},getScreenCoords:function(){var e=this.get("pos");return this.gitVisuals.toScreenCoords(e)},getRadius:function(){return this.get("radius")||f.nodeRadius},getParentScreenCoords:function(){return this.get("commit").get("parents")[0].get("visNode").getScreenCoords()},setBirthPosition:function(){var e=this.getParentScreenCoords();this.get("circle").attr({cx:e.x,cy:e.y,opacity:0,r:0}),this.get("text").attr({x:e.x,y:e.y,opacity:0})},setBirthFromSnapshot:function(e){var t=this.get("commit").get("parents")[0].get("visNode").getID(),n=e[t];this.get("circle").attr({opacity:0,r:0,cx:n.circle.cx,cy:n.circle.cy}),this.get("text").attr({opacity:0,x:n.text.x,y:n.text.y});var r={x:n.circle.cx,y:n.circle.cy};this.setOutgoingEdgesBirthPosition(r)},setBirth:function(){this.setBirthPosition(),this.setOutgoingEdgesBirthPosition(this.getParentScreenCoords())},setOutgoingEdgesOpacity:function(e){u.each(this.get("outgoingEdges"),function(t){t.setOpacity(e)})},animateOutgoingEdgesToAttr:function(e,t,n){u.each(this.get("outgoingEdges"),function(t){var n=e[t.getID()];t.animateToAttr(n)},this)},animateOutgoingEdges:function(e,t){u.each(this.get("outgoingEdges"),function(n){n.animateUpdatedPath(e,t)},this)},animateOutgoingEdgesFromSnapshot:function(e,t,n){u.each(this.get("outgoingEdges"),function(r){var i=e[r.getID()];r.animateToAttr(i,t,n)},this)},setOutgoingEdgesBirthPosition:function(e){u.each(this.get("outgoingEdges"),function(t){var n=t.get("head").getScreenCoords(),r=t.genSmoothBezierPathStringFromCoords(e,n);t.get("path").stop().attr({path:r,opacity:0})},this)},parentInFront:function(){this.get("commit").get("parents")[0].get("visNode").toFront()},getFontSize:function(e){return e.length<3?12:e.length<5?10:8},getFill:function(){var e=this.gitVisuals.getCommitUpstreamStatus(this.get("commit"));return e=="head"?f.headRectFill:e=="none"?f.orphanNodeFill:this.gitVisuals.getBlendedHuesForCommit(this.get("commit"))},attachClickHandlers:function(){if(this.get("gitVisuals").options.noClick)return;var t="git checkout "+this.get("commit").get("id"),n=e("../app");u.each([this.get("circle"),this.get("text")],function(e){e.click(function(){n.getEventBaton().trigger("commandSubmitted",t)}),$(e.node).css("cursor","pointer")})},setOpacity:function(e){e=e===undefined?1:e;var t=["circle","text"];u.each(t,function(t){this.get(t).attr({opacity:e})},this)},remove:function(){this.removeKeys(["circle"],["text"]);var e=this.get("text");e&&e.remove(),this.gitVisuals.removeVisNode(this)},removeAll:function(){this.remove(),u.each(this.get("outgoingEdges"),function(e){e.remove()},this)},getExplodeStepFunc:function(){var e=this.get("circle"),t=20,n=Math.PI+Math.random()*1*Math.PI,r=.2,i=.01,s=t*Math.cos(n),o=t*Math.sin(n),u=e.attr("cx"),a=e.attr("cy"),f=this.gitVisuals.paper.width,l=this.gitVisuals.paper.height,c=.8,h=1,p=function(){o+=r*h-i*o,s-=i*s,u+=s*h,a+=o*h;if(u<0||u>f)s=c*-s,u=u<0?0:f;if(a<0||a>l)o=c*-o,a=a<0?0:l;return e.attr({cx:u,cy:a}),s*s+o*o<.01&&Math.abs(a-l)===0?!1:!0};return p},genGraphics:function(){var e=this.gitVisuals.paper,t=this.getScreenCoords(),n=this.getTextScreenCoords(),r=e.circle(t.x,t.y,this.getRadius()).attr(this.getAttributes().circle),i=e.text(n.x,n.y,String(this.get("id")));i.attr({"font-size":this.getFontSize(this.get("id")),"font-weight":"bold","font-family":"Monaco, Courier, font-monospace",opacity:this.getOpacity()}),this.set("circle",r),this.set("text",i),this.attachClickHandlers()}});n.VisNode=c}),e.define("/src/js/visuals/visBase.js",function(e,t,n,r,i,s,o){var u=e("underscore"),a=e("backbone"),f=a.Model.extend({removeKeys:function(e){u.each(e,function(e){this.get(e)&&this.get(e).remove()},this)},animateAttrKeys:function(e,t,n,r){e=u.extend({},{include:["circle","arrow","rect","path","text"],exclude:[]},e||{});var i=this.getAttributes();u.each(e.include,function(e){i[e]=u.extend({},i[e],t)}),u.each(e.exclude,function(e){delete i[e]}),this.animateToAttr(i,n,r)}});n.VisBase=f}),e.define("/src/js/visuals/visBranch.js",function(e,t,n,r,i,s,o){var u=e("underscore"),a=e("backbone"),f=e("../util/constants").GRAPHICS,l=e("../visuals/visBase").VisBase,c=function(){var e=Math.random(),t="hsb("+String(e)+",0.7,1)";return t},h=l.extend({defaults:{pos:null,text:null,rect:null,arrow:null,isHead:!1,flip:1,fill:f.rectFill,stroke:f.rectStroke,"stroke-width":f.rectStrokeWidth,offsetX:f.nodeRadius*4.75,offsetY:0,arrowHeight:14,arrowInnerSkew:0,arrowEdgeHeight:6,arrowLength:14,arrowOffsetFromCircleX:10,vPad:5,hPad:5,animationSpeed:f.defaultAnimationTime,animationEasing:f.defaultEasing},validateAtInit:function(){if(!this.get("branch"))throw new Error("need a branch!")},getID:function(){return this.get("branch").get("id")},initialize:function(){this.validateAtInit(),this.gitVisuals=this.get("gitVisuals"),this.gitEngine=this.get("gitEngine");if(!this.gitEngine)throw new Error("asd wtf");this.get("branch").set("visBranch",this);var e=this.get("branch").get("id");e=="HEAD"?(this.set("isHead",!0),this.set("flip",-1),this.set("fill",f.headRectFill)):e!=="master"&&this.set("fill",c())},getCommitPosition:function(){var e=this.gitEngine.getCommitFromRef(this.get("branch")),t=e.get("visNode"),n=this.get("gitVisuals").posBoundaries.max;return t.get("pos").x>n?this.set("flip",-1):this.set("flip",1),t.getScreenCoords()},getBranchStackIndex:function(){if(this.get("isHead"))return 0;var e=this.getBranchStackArray(),t=-1;return u.each(e,function(e,n){e.obj==this.get("branch")&&(t=n)},this),t},getBranchStackLength:function(){return this.get("isHead")?1:this.getBranchStackArray().length},getBranchStackArray:function(){var e=this.gitVisuals.branchStackMap[this.get("branch").get("target").get("id")];return e===undefined?(this.gitVisuals.calcBranchStacks(),this.getBranchStackArray()):e},getTextPosition:function(){var e=this.getCommitPosition(),t=this.getBranchStackIndex();return{x:e.x+this.get("flip")*this.get("offsetX"),y:e.y+t*f.multiBranchY+this.get("offsetY")}},getRectPosition:function(){var e=this.getTextPosition(),t=this.get("flip"),n=this.getTextSize();return{x:e.x-.5*n.w-this.get("hPad"),y:e.y-.5*n.h-this.get("vPad")}},getArrowPath:function(){var e=function(e,t,n){return{x:e.x+t,y:e.y+n}},t=function(e){return String(Math.round(e.x))+","+String(Math.round(e.y))},n=this.get("flip"),r=e(this.getCommitPosition(),n*this.get("arrowOffsetFromCircleX"),0),i=e(r,n*this.get("arrowLength"),-this.get("arrowHeight")),s=e(r,n*this.get("arrowLength"),this.get("arrowHeight")),o=e(i,n*this.get("arrowInnerSkew"),this.get("arrowEdgeHeight")),a=e(s,n*this.get("arrowInnerSkew"),-this.get("arrowEdgeHeight")),f=49,l=e(o,n*f,0),c=e(a,n*f,0),h="";h+="M"+t(l)+" ";var p=[o,i,r,s,a,c];return u.each(p,function(e){h+="L"+t(e)+" "},this),h+="z",h},getTextSize:function(){var e=function(e){var t=e.get("text")?e.get("text").node:null;return t===null?0:t.clientWidth},t=function(e){return e.w||(e.w=75),e.h||(e.h=20),e},n=this.get("text").node;if(this.get("isHead"))return t({w:n.clientWidth,h:n.clientHeight});var r=0;return u.each(this.getBranchStackArray(),function(t){r=Math.max(r,e(t.obj.get("visBranch")))}),t({w:r,h:n.clientHeight})},getSingleRectSize:function(){var e=this.getTextSize(),t=this.get("vPad"),n=this.get("hPad");return{w:e.w+t*2,h:e.h+n*2}},getRectSize:function(){var e=this.getTextSize(),t=this.get("vPad"),n=this.get("hPad"),r=this.getBranchStackLength();return{w:e.w+t*2,h:e.h*r*1.1+n*2}},getName:function(){var e=this.get("branch").get("id"),t=this.gitEngine.HEAD.get("target").get("id"),n=t==e?"*":"";return e+n},nonTextToFront:function(){this.get("arrow").toFront(),this.get("rect").toFront()},textToFront:function(){this.get("text").toFront()},textToFrontIfInStack:function(){this.getBranchStackIndex()!==0&&this.get("text").toFront()},getFill:function(){return this.get("isHead")||this.getBranchStackLength()==1||this.getBranchStackIndex()!==0?this.get("fill"):this.gitVisuals.blendHuesFromBranchStack(this.getBranchStackArray())},remove:function(){this.removeKeys(["text","arrow","rect"]),this.gitVisuals.removeVisBranch(this)},genGraphics:function(e){var t=this.getTextPosition(),n=this.getName(),r;r=e.text(t.x,t.y,String(n)),r.attr({"font-size":14,"font-family":"Monaco, Courier, font-monospace",opacity:this.getTextOpacity()}),this.set("text",r);var i=this.getRectPosition(),s=this.getRectSize(),o=e.rect(i.x,i.y,s.w,s.h,8).attr(this.getAttributes().rect);this.set("rect",o);var u=this.getArrowPath(),a=e.path(u).attr(this.getAttributes().arrow);this.set("arrow",a),this.attachClickHandlers(),o.toFront(),r.toFront()},attachClickHandlers:function(){if(this.get("gitVisuals").options.noClick)return;var t="git checkout "+this.get("branch").get("id"),n=e("../app"),r=[this.get("rect"),this.get("text"),this.get("arrow")];u.each(r,function(e){e.click(function(){n.getEventBaton().trigger("commandSubmitted",t)}),$(e.node).css("cursor","pointer")})},updateName:function(){this.get("text").attr({text:this.getName()})},getNonTextOpacity:function(){return this.get("isHead")?this.gitEngine.getDetachedHead()?1:0:this.getBranchStackIndex()===0?1:0},getTextOpacity:function(){return this.get("isHead")?this.gitEngine.getDetachedHead()?1:0:1},getAttributes:function(){var e=this.getNonTextOpacity(),t=this.getTextOpacity();this.updateName();var n=this.getTextPosition(),r=this.getRectPosition(),i=this.getRectSize(),s=this.getArrowPath();return{text:{x:n.x,y:n.y,opacity:t},rect:{x:r.x,y:r.y,width:i.w,height:i.h,opacity:e,fill:this.getFill(),stroke:this.get("stroke"),"stroke-width":this.get("stroke-width")},arrow:{path:s,opacity:e,fill:this.getFill(),stroke:this.get("stroke"),"stroke-width":this.get("stroke-width")}}},animateUpdatedPos:function(e,t){var n=this.getAttributes();this.animateToAttr(n,e,t)},animateFromAttrToAttr:function(e,t,n,r){this.animateToAttr(e,0),this.animateToAttr(t,n,r)},animateToAttr:function(e,t,n){if(t===0){this.get("text").attr(e.text),this.get("rect").attr(e.rect),this.get("arrow").attr(e.arrow);return}var r=t!==undefined?t:this.get("animationSpeed"),i=n||this.get("animationEasing");this.get("text").stop().animate(e.text,r,i),this.get("rect").stop().animate(e.rect,r,i),this.get("arrow").stop().animate(e.arrow,r,i)}}),p=a.Collection.extend({model:h});n.VisBranchCollection=p,n.VisBranch=h,n.randomHueString=c}),e.define("/src/js/visuals/visEdge.js",function(e,t,n,r,i,s,o){var u=e("underscore"),a=e("backbone"),f=e("../util/constants").GRAPHICS,l=e("../visuals/visBase").VisBase,c=l.extend({defaults:{tail:null,head:null,animationSpeed:f.defaultAnimationTime,animationEasing:f.defaultEasing},validateAtInit:function(){var e=["tail","head"];u.each(e,function(e){if(!this.get(e))throw new Error(e+" is required!")},this)},getID:function(){return this.get("tail").get("id")+"."+this.get("head").get("id")},initialize:function(){this.validateAtInit(),this.gitVisuals=this.get("gitVisuals"),this.gitEngine=this.get("gitEngine"),this.get("tail").get("outgoingEdges").push(this)},remove:function(){this.removeKeys(["path"]),this.gitVisuals.removeVisEdge(this)},genSmoothBezierPathString:function(e,t){var n=e.getScreenCoords(),r=t.getScreenCoords();return this.genSmoothBezierPathStringFromCoords(n,r)},genSmoothBezierPathStringFromCoords:function(e,t){var n=function(e){return String(Math.round(e.x))+","+String(Math.round(e.y))},r=function(e,t,n){return n=n||f.curveControlPointOffset,{x:e.x,y:e.y+n*t}},i=function(e,t,n){return{x:e.x+t,y:e.y+n}};e=r(e,-1,this.get("tail").getRadius()),t=r(t,1,this.get("head").getRadius());var s="";s+="M"+n(e)+" ",s+="C",s+=n(r(e,-1))+" ",s+=n(r(t,1))+" ",s+=n(t);var o=f.arrowHeadSize||10;return s+=" L"+n(i(t,-o,o)),s+=" L"+n(i(t,o,o)),s+=" L"+n(t),s+="C",s+=n(r(t,1))+" ",s+=n(r(e,-1))+" ",s+=n(e),s},getBezierCurve:function(){return this.genSmoothBezierPathString(this.get("tail"),this.get("head"))},getStrokeColor:function(){return f.visBranchStrokeColorNone},setOpacity:function(e){e=e===undefined?1:e,this.get("path").attr({opacity:e})},genGraphics:function(e){var t=this.getBezierCurve(),n=e.path(t).attr({"stroke-width":f.visBranchStrokeWidth,stroke:this.getStrokeColor(),"stroke-linecap":"round","stroke-linejoin":"round",fill:this.getStrokeColor()});n.toBack(),this.set("path",n)},getOpacity:function(){var e=this.gitVisuals.getCommitUpstreamStatus(this.get("tail")),t={branch:1,head:f.edgeUpstreamHeadOpacity,none:f.edgeUpstreamNoneOpacity};if(t[e]===undefined)throw new Error("bad stat");return t[e]},getAttributes:function(){var e=this.getBezierCurve(),t=this.getOpacity();return{path:{path:e,opacity:t}}},animateUpdatedPath:function(e,t){var n=this.getAttributes();this.animateToAttr(n,e,t)},animateFromAttrToAttr:function(e,t,n,r){this.animateToAttr(e,0),this.animateToAttr(t,n,r)},animateToAttr:function(e,t,n){if(t===0){this.get("path").attr(e.path);return}this.get("path").toBack(),this.get("path").stop().animate(e.path,t!==undefined?t:this.get("animationSpeed"),n||this.get("animationEasing"))}}),h=a.Collection.extend({model:c});n.VisEdgeCollection=h,n.VisEdge=c}),e.define("/src/js/level/disabledMap.js",function(e,t,n,r,i,s,o){function c(e){e=e||{},this.disabledMap=e.disabledMap||{"git cherry-pick":!0,"git rebase":!0}}var u=e("underscore"),a=e("../git/commands"),f=e("../util/errors"),l=f.GitError;c.prototype.getInstantCommands=function(){var e=[],t=function(){throw new l({msg:"That git command is disabled for this level!"})};return u.each(this.disabledMap,function(n,r){var i=a.regexMap[r];if(!i)throw new Error("wuttttt this disbaled command"+r+" has no regex matching");e.push([i,t])}),e},n.DisabledMap=c}),e.define("/src/js/level/arbiter.js",function(e,t,n,r,i,s,o){function h(){this.levelMap={},this.levelSequences=f,this.sequences=[],this.init();var e;try{e=JSON.parse(localStorage.getItem("solvedMap")||"{}")}catch(t){console.warn("local storage failed",t)}this.solvedMap=e||{},c.getEvents().on("levelSolved",this.levelSolved,this)}var u=e("underscore"),a=e("backbone"),f=e("../levels").levelSequences,l=e("../levels").sequenceInfo,c=e("../app");h.prototype.init=function(){var e;u.each(this.levelSequences,function(e,t){this.sequences.push(t);if(!e||!e.length)throw new Error("no empty sequences allowed");u.each(e,function(e,n){this.validateLevel(e);var r=t+String(n+1),i=u.extend({},e,{index:n,id:r,sequenceName:t});this.levelMap[r]=i,this.levelSequences[t][n]=i},this)},this)},h.prototype.isLevelSolved=function(e){if(!this.levelMap[e])throw new Error("that level doesnt exist!");return Boolean(this.solvedMap[e])},h.prototype.levelSolved=function(e){if(!e)return;this.solvedMap[e]=!0,this.syncToStorage()},h.prototype.resetSolvedMap=function(){this.solvedMap={},this.syncToStorage(),c.getEvents().trigger("levelSolved")},h.prototype.syncToStorage=function(){try{localStorage.setItem("solvedMap",JSON.stringify(this.solvedMap))}catch(e){console.warn("local storage fialed on set",e)}},h.prototype.validateLevel=function(e){e=e||{};var t=["name","goalTreeString","solutionCommand"],n=["hint","disabledMap","startTree"];u.each(t,function(t){if(e[t]===undefined)throw console.log(e),new Error("I need this field for a level: "+t)})},h.prototype.getSequenceToLevels=function(){return this.levelSequences},h.prototype.getSequences=function(){return u.keys(this.levelSequences)},h.prototype.getLevelsInSequence=function(e){if(!this.levelSequences[e])throw new Error("that sequecne name "+e+"does not exist");return this.levelSequences[e]},h.prototype.getSequenceInfo=function(e){return l[e]},h.prototype.getLevel=function(e){return this.levelMap[e]},h.prototype.getNextLevel=function(e){if(!this.levelMap[e])return console.warn("that level doesnt exist!!!"),null;var t=this.levelMap[e],n=t.sequenceName,r=this.levelSequences[n],i=t.index+1;if(i=t.length?0:e,e=e<0?t.length-1:e,e},boundIndex:function(e,t){return e=e>=t.length?t.length-1:e,e=e<0?0:e,e},getNextSequence:function(){var e=this.getSequenceIndex(this.selectedSequence),t=this.wrapIndex(e+1,this.sequences);return this.sequences[t]},getPreviousSequence:function(){var e=this.getSequenceIndex(this.selectedSequence),t=this.wrapIndex(e-1,this.sequences);return this.sequences[t]},getSequenceIndex:function(e){var t=this.sequences.indexOf(e);if(t<0)throw new Error("didnt find");return t},getIndexForID:function(e){return h.getLevelArbiter().getLevel(e).index},selectFirst:function(){var e=this.sequenceToLevels[this.sequences[0]][0].id;this.selectIconByID(e),this.selectedIndex=0,this.selectedSequence=this.sequences[0]},getCurrentSequence:function(){return this.sequenceToLevels[this.selectedSequence]},getSelectedID:function(){return this.sequenceToLevels[this.selectedSequence][this.selectedIndex].id},selectIconByID:function(e){this.toggleIconSelect(e,!0)},deselectIconByID:function(e){this.toggleIconSelect(e,!1)},toggleIconSelect:function(e,t){this.selectedID=e;var n="#levelIcon-"+e;$(n).toggleClass("selected",t)},negative:function(){this.hide()},testOption:function(e){return this.currentCommand&&(new RegExp("--"+e)).test(this.currentCommand.get("rawStr"))},show:function(e,t){this.currentCommand=t,this.updateSolvedStatus(),this.showDeferred=e,this.keyboardListener.listen(),m.__super__.show.apply(this)},hide:function(){this.showDeferred&&this.showDeferred.resolve(),this.showDeferred=undefined,this.keyboardListener.mute(),this.turnOffKeyboardSelection(),m.__super__.hide.apply(this)},loadLevelID:function(e){this.testOption("noOutput")||h.getEventBaton().trigger("commandSubmitted","level "+e),this.hide()},updateSolvedStatus:function(){u.each(this.seriesViews,function(e){e.updateSolvedStatus()},this)},buildSequences:function(){this.seriesViews=[],u.each(this.sequences,function(e){this.seriesViews.push(new g({destination:this.$el,name:e,navEvents:this.navEvents}))},this)}}),g=v.extend({tagName:"div",className:"seriesView box flex1 vertical",template:u.template($("#series-view").html()),events:{"click div.levelIcon":"click"},initialize:function(e){this.name=e.name||"intro",this.navEvents=e.navEvents,this.info=h.getLevelArbiter().getSequenceInfo(this.name),this.levels=h.getLevelArbiter().getLevelsInSequence(this.name),this.levelIDs=[],u.each(this.levels,function(e){this.levelIDs.push(e.id)},this),this.destination=e.destination,this.JSON={displayName:this.info.displayName,about:this.info.about,ids:this.levelIDs},this.render(),this.updateSolvedStatus()},updateSolvedStatus:function(){var e=this.$("div.levelIcon").each(function(e,t){var n=$(t).attr("data-id");$(t).toggleClass("solved",h.getLevelArbiter().isLevelSolved(n))})},click:function(e){var t=e.srcElement||e.currentTarget;if(!t){console.warn("wut, no id");return}var n=$(t).attr("data-id");this.navEvents.trigger("clickedID",n)}});n.LevelDropdownView=m}),e.define("/src/js/views/commandViews.js",function(e,t,n,r,i,s,o){var u=e("underscore"),a=e("../util").isBrowser()?a=window.Backbone:a=e("backbone"),f=e("../models/collections").CommandEntryCollection,l=e("../app"),c=e("../models/commandModel").Command,h=e("../models/commandModel").CommandEntry,p=e("../util/errors"),d=p.Warning,v=e("../util"),m=e("../util/keyboard"),g=a.View.extend({initialize:function(e){l.getEvents().on("commandSubmittedPassive",this.addToCommandHistory,this),this.commands=new f,this.commands.fetch({success:u.bind(function(){var e=[];this.commands.each(function(t){e.push(t)}),e.reverse(),this.commands.reset(),u.each(e,function(e){this.commands.add(e)},this)},this)}),this.index=-1,this.commandParagraph=this.$("#prompt p.command")[0],this.commandCursor=this.$("#prompt span.cursor")[0],this.focus(),l.getEvents().on("rollupCommands",this.rollupCommands,this),l.getEventBaton().stealBaton("keydown",this.onKeyDown,this),l.getEventBaton().stealBaton("keyup",this.onKeyUp,this)},events:{"blur #commandTextField":"hideCursor","focus #commandTextField":"showCursor"},blur:function(){this.hideCursor()},focus:function(){this.$("#commandTextField").focus(),this.showCursor()},hideCursor:function(){this.toggleCursor(!1)},showCursor:function(){this.toggleCursor(!0)},toggleCursor:function(e){$(this.commandCursor).toggleClass("shown",e)},onKeyDown:function(e){var t=e.srcElement;this.updatePrompt(t)},onKeyUp:function(e){this.onKeyDown(e);var t={enter:u.bind(function(){this.submit()},this),up:u.bind(function(){this.commandSelectChange(1)},this),down:u.bind(function(){this.commandSelectChange(-1)},this)},n=m.mapKeycodeToKey(e.which||e.keyCode);t[n]!==undefined&&(e.preventDefault(),t[n](),this.onKeyDown(e))},badHtmlEncode:function(e){return e.replace(/&/g,"&").replace(/=this.commands.length||this.index<0){this.clear(),this.index=-1;return}var t=this.commands.toArray()[this.index].get("text");this.setTextField(t)},clearLocalStorage:function(){this.commands.each(function(e){a.sync("delete",e,function(){})},this)},setTextField:function(e){this.$("#commandTextField").val(e)},clear:function(){this.setTextField("")},submit:function(){var e=this.$("#commandTextField").val().replace("\n","");this.clear(),this.submitCommand(e),this.index=-1},rollupCommands:function(e){var t=this.commands.toArray().slice(1,Number(e)+1);t.reverse();var n="";u.each(t,function(e){n+=e.get("text")+";"},this);var r=new h({text:n});this.commands.unshift(r),a.sync("create",r,function(){})},addToCommandHistory:function(e){var t=e.length&&this.index===-1||e.length&&this.index!==-1&&this.commands.toArray()[this.index].get("text")!==e;if(!t)return;var n=new h({text:e});this.commands.unshift(n),a.sync("create",n,function(){}),this.commands.length>100&&this.clearLocalStorage()},submitCommand:function(e){l.getEventBaton().trigger("commandSubmitted",e)}}),y=a.View.extend({tagName:"div",model:c,template:u.template($("#command-template").html()),events:{click:"clicked"},clicked:function(e){},initialize:function(){this.model.bind("change",this.wasChanged,this),this.model.bind("destroy",this.remove,this)},wasChanged:function(e,t){var n=t.changes,r=u.keys(n);u.difference(r,["status"]).length===0?this.updateStatus():this.render()},updateStatus:function(){var e=["inqueue","processing","finished"],t={};u.each(e,function(e){t[e]=!1}),t[this.model.get("status")]=!0;var n=this.$("p.commandLine");u.each(t,function(e,t){n.toggleClass(t,e)})},render:function(){var e=u.extend({resultType:"",result:"",formattedWarnings:this.model.getFormattedWarnings()},this.model.toJSON());return this.$el.html(this.template(e)),this},remove:function(){$(this.el).hide()}}),b=a.View.extend({initialize:function(e){this.collection=e.collection,this.collection.on("add",this.addOne,this),this.collection.on("reset",this.addAll,this),this.collection.on("all",this.render,this),this.collection.on("change",this.scrollDown,this),l.getEvents().on("commandScrollDown",this.scrollDown,this),l.getEvents().on("clearOldCommands",this.clearOldCommands,this)},addWarning:function(e){var t=new d({msg:e}),n=new c({error:t,rawStr:"Warning:"});this.collection.add(n)},clearOldCommands:function(){var e=[];this.collection.each(function(t){t.get("status")!=="inqueue"&&t.get("status")!=="processing"&&e.push(t)},this),u.each(e,function(e){e.destroy()},this),this.scrollDown()},scrollDown:function(){var e=$("#commandDisplay")[0],t=$("#terminal")[0],n=e.clientHeight>t.clientHeight;$(t).toggleClass("scrolling",n),n&&(t.scrollTop=t.scrollHeight)},addOne:function(e){var t=new y({model:e});this.$("#commandDisplay").append(t.render().el),this.scrollDown()},addAll:function(){this.collection.each(this.addOne)}});n.CommandPromptView=g,n.CommandLineHistoryView=b}),e.define("/src/js/util/zoomLevel.js",function(e,t,n,r,i,s,o){function f(){return!window.outerWidth||!window.innerWidth?(a&&(console.warn("Can't detect zoom level correctly :-/"),a=!1),1):window.outerWidth/window.innerWidth}var u=e("underscore"),a=!0,l=!0,c=function(e,t){var n=0;setInterval(function(){var r=f();if(r!==n){if(l){l=!1;return}n=r,e.apply(t,[r])}else l=!0},500)};n.setupZoomPoll=c,n.detectZoom=f}),e.define("/src/js/dialogs/sandbox.js",function(e,t,n,r,i,s,o){n.dialog=[{type:"ModalAlert",options:{markdowns:["## Welcome to LearnGitBranching!","","This application is designed to help beginners grasp ","the powerful concepts behind branching when working ","with git. We hope you enjoy this application and maybe ","even learn something!","","# Attention HN!!","","Unfortunately this was submitted before I finished all the help ","and tutorial sections, so forgive the scarcity. See the demo here:","","[http://pcottle.github.com/learnGitBranching/?demo](http://pcottle.github.com/learnGitBranching/?demo)"]}},{type:"ModalAlert",options:{markdowns:["## Git commands","","You have a large variety of git commands available in sandbox mode. These include",""," * commit"," * branch"," * checkout"," * cherry-pick"," * reset"," * revert"," * rebase"," * merge"]}},{type:"ModalAlert",options:{markdowns:["## Sharing is caring!","","Share trees with your friends via `export tree` and `import tree`","","Have a great lesson to share? Try building a level with `build level` or try out a friend's level with `import level`","","For now let's get you started on the `levels`..."]}}]}),e.define("/src/js/util/mock.js",function(e,t,n,r,i,s,o){n.mock=function(e){var t={},n=function(){};for(var r in e.prototype)t[r]=n;return t}}),e.define("/src/js/visuals/tree.js",function(e,t,n,r,i,s,o){var u=e("underscore"),a=e("backbone"),f=a.Model.extend({removeKeys:function(e){u.each(e,function(e){this.get(e)&&this.get(e).remove()},this)},animateAttrKeys:function(e,t,n,r){e=u.extend({},{include:["circle","arrow","rect","path","text"],exclude:[]},e||{});var i=this.getAttributes();u.each(e.include,function(e){i[e]=u.extend({},i[e],t)}),u.each(e.exclude,function(e){delete i[e]}),this.animateToAttr(i,n,r)}});n.VisBase=f}),e.define("/src/js/git/headless.js",function(e,t,n,r,i,s,o){var u=e("underscore"),a=e("backbone"),f=e("q"),l=e("../git").GitEngine,c=e("../visuals/animation/animationFactory").AnimationFactory,h=e("../visuals").GitVisuals,p=e("../git/treeCompare").TreeCompare,d=e("../util/eventBaton").EventBaton,v=e("../models/collections"),m=v.CommitCollection,g=v.BranchCollection,y=e("../models/commandModel").Command,b=e("../util/mock").mock,w=e("../util"),E=function(){this.init()};E.prototype.init=function(){this.commitCollection=new m,this.branchCollection=new g,this.treeCompare=new p;var e=b(c),t=b(h);this.gitEngine=new l({collection:this.commitCollection,branches:this.branchCollection,gitVisuals:t,animationFactory:e,eventBaton:new d}),this.gitEngine.init()},E.prototype.sendCommand=function(e){w.splitTextCommand(e,function(e){var t=new y({rawStr:e});this.gitEngine.dispatch(t,f.defer())},this)},n.HeadlessGit=E}),e.define("/src/js/app/index.js",function(e,t,n,r,i,s,o){function y(){var t=e("../models/collections"),n=e("../views/commandViews");this.commandCollection=new t.CommandCollection,this.commandBuffer=new t.CommandBuffer({collection:this.commandCollection}),this.commandPromptView=new n.CommandPromptView({el:$("#commandLineBar")}),this.commandLineHistoryView=new n.CommandLineHistoryView({el:$("#commandLineHistory"),collection:this.commandCollection})}var u=e("underscore"),a=e("backbone"),f=e("../util/constants"),l=e("../util"),c=u.clone(a.Events),h,p,d,v,m,g=function(){var t=e("../level/sandbox").Sandbox,n=e("../level").Level,r=e("../util/eventBaton").EventBaton,i=e("../level/arbiter").LevelArbiter,s=e("../views/levelDropdownView").LevelDropdownView;d=new r,h=new y,p=new t,v=new i,m=new s({wait:!0});var o=function(){$("#commandTextField").focus()};o(),$(window).focus(function(e){d.trigger("windowFocus",e)}),$(document).click(function(e){d.trigger("documentClick",e)}),$(document).bind("keydown",function(e){d.trigger("docKeydown",e)}),$(document).bind("keyup",function(e){d.trigger("docKeyup",e)}),$(window).on("resize",function(e){c.trigger("resize",e)}),$(window).on("resize",u.throttle(function(e){var t=$(window).width(),n=$(window).height();d.trigger("windowSizeCheck",{w:t,h:n})},500)),d.stealBaton("docKeydown",function(){}),d.stealBaton("docKeyup",function(){}),d.stealBaton("windowFocus",o),d.stealBaton("documentClick",o);var a=function(e){return function(){var t=[e];u.each(arguments,function(e){t.push(e)}),d.trigger.apply(d,t)}};$("#commandTextField").on("keydown",a("keydown")),$("#commandTextField").on("keyup",a("keyup")),$(window).trigger("resize"),/\?demo/.test(window.location.href)?p.mainVis.customEvents.on("gitEngineReady",function(){d.trigger("commandSubmitted",["git commit; git checkout -b bugFix C1; git commit; git merge master; git checkout master; git commit; git rebase bugFix;","delay 1000; reset;","level rebase1 --noFinishDialog --noStartCommand --noIntroDialog;","delay 2000; show goal; delay 1000; hide goal;","git checkout bugFix; git rebase master; git checkout side; git rebase bugFix;","git checkout another; git rebase side; git rebase another master;","help; levels"].join(""))}):/\?NODEMO/.test(window.location.href)||p.mainVis.customEvents.on("gitEngineReady",function(){d.trigger("commandSubmitted",["git help;","delay 1000;","help;","levels"].join(""))});if(/command=/.test(window.location.href)){var f=window.location.href.split("command=")[1].split("&")[0],l=unescape(f);p.mainVis.customEvents.on("gitEngineReady",function(){d.trigger("commandSubmitted",l)})}(/(iPhone|iPod|iPad).*AppleWebKit/i.test(navigator.userAgent)||/android/i.test(navigator.userAgent))&&p.mainVis.customEvents.on("gitEngineReady",function(){d.trigger("commandSubmitted","mobile alert")})};e("../util").isBrowser()&&$(document).ready(g),n.getEvents=function(){return c},n.getSandbox=function(){return p},n.getEventBaton=function(){return d},n.getCommandUI=function(){return h},n.getLevelArbiter=function(){return v},n.getLevelDropdown=function(){return m},n.init=g}),e("/src/js/app/index.js"),e.define("/src/js/dialogs/levelBuilder.js",function(e,t,n,r,i,s,o){n.dialog=[{type:"ModalAlert",options:{markdowns:["## Welcome to the level builder!","","Here are the main steps:",""," * Set up the initial environment with git commands"," * Define the starting tree with ```define start```"," * Enter the series of git commands that compose the (optimal) solution"," * Define the goal tree with ```define goal```. Defining the goal also defines the solution"," * Optionally define a hint with ```define hint```"," * Edit the name with ```define name```"," * Optionally define a nice start dialog with ```edit dialog```"," * Enter the command ```finish``` to output your level JSON!"]}}]}),e("/src/js/dialogs/levelBuilder.js"),e.define("/src/js/dialogs/sandbox.js",function(e,t,n,r,i,s,o){n.dialog=[{type:"ModalAlert",options:{markdowns:["## Welcome to LearnGitBranching!","","This application is designed to help beginners grasp ","the powerful concepts behind branching when working ","with git. We hope you enjoy this application and maybe ","even learn something!","","# Attention HN!!","","Unfortunately this was submitted before I finished all the help ","and tutorial sections, so forgive the scarcity. See the demo here:","","[http://pcottle.github.com/learnGitBranching/?demo](http://pcottle.github.com/learnGitBranching/?demo)"]}},{type:"ModalAlert",options:{markdowns:["## Git commands","","You have a large variety of git commands available in sandbox mode. These include",""," * commit"," * branch"," * checkout"," * cherry-pick"," * reset"," * revert"," * rebase"," * merge"]}},{type:"ModalAlert",options:{markdowns:["## Sharing is caring!","","Share trees with your friends via `export tree` and `import tree`","","Have a great lesson to share? Try building a level with `build level` or try out a friend's level with `import level`","","For now let's get you started on the `levels`..."]}}]}),e("/src/js/dialogs/sandbox.js"),e.define("/src/js/git/commands.js",function(e,t,n,r,i,s,o){function g(e,t){this.method=e,this.rawOptions=t,this.supportedMap=this.getMasterOptionMap()[e];if(this.supportedMap===undefined)throw new Error("No option map for "+e);this.generalArgs=[],this.explodeAndSet()}var u=e("underscore"),a=e("../util/errors"),f=a.CommandProcessError,l=a.GitError,c=a.Warning,h=a.CommandResult,p={"git commit":/^(gc|git ci)($|\s)/,"git add":/^ga($|\s)/,"git checkout":/^(go|git co)($|\s)/,"git rebase":/^gr($|\s)/,"git branch":/^(gb|git br)($|\s)/,"git status":/^(gst|gs|git st)($|\s)/,"git help":/^git$/},d=[[/^git help($|\s)/,function(){var e=["Git Version PCOTTLE.1.0","
","Usage:",u.escape(" git []"),"
","Supported commands:","
"],t=g.prototype.getMasterOptionMap();u.each(t,function(t,n){e.push("git "+n),u.each(t,function(t,n){e.push(" "+n)},this)},this);var n=e.join("\n");throw n=n.replace(/\t/g," "),new h({msg:n})}]],v={"git commit":/^git commit($|\s)/,"git add":/^git add($|\s)/,"git checkout":/^git checkout($|\s)/,"git rebase":/^git rebase($|\s)/,"git reset":/^git reset($|\s)/,"git branch":/^git branch($|\s)/,"git revert":/^git revert($|\s)/,"git log":/^git log($|\s)/,"git merge":/^git merge($|\s)/,"git show":/^git show($|\s)/,"git status":/^git status($|\s)/,"git cherry-pick":/^git cherry-pick($|\s)/},m=function(e){var t,n;u.each(v,function(r,i){r.exec(e)&&(n=e.slice(i.length+1),t=i.slice("git ".length))});if(!t)return!1;var r=new g(t,n);return{toSet:{generalArgs:r.generalArgs,supportedMap:r.supportedMap,method:t,options:n,eventName:"processGitCommand"}}};g.prototype.getMasterOptionMap=function(){return{commit:{"--amend":!1,"-a":!1,"-am":!1,"-m":!1},status:{},log:{},add:{},"cherry-pick":{},branch:{"-d":!1,"-D":!1,"-f":!1,"--contains":!1},checkout:{"-b":!1,"-B":!1,"-":!1},reset:{"--hard":!1,"--soft":!1},merge:{},rebase:{"-i":!1},revert:{},show:{}}},g.prototype.explodeAndSet=function(){var e=this.rawOptions.match(/('.*?'|".*?"|\S+)/g)||[];for(var t=0;t9&&(e=e.slice(0,9),this.command.addWarning("Sorry, we need to keep branch names short for the visuals. Your branch name was truncated to 9 characters, resulting in "+e)),e},m.prototype.makeBranch=function(e,t){e=this.validateBranchName(e);if(this.refs[e])throw new d({msg:"that branch id either matches a commit hash or already exists!"});var n=new y({target:t,id:e});return this.branchCollection.add(n),this.refs[n.get("id")]=n,n},m.prototype.getHead=function(){return u.clone(this.HEAD)},m.prototype.getBranches=function(){var e=[];return this.branchCollection.each(function(t){e.push({id:t.get("id"),selected:this.HEAD.get("target")===t,target:t.get("target"),obj:t})},this),e},m.prototype.printBranchesWithout=function(e){var t=this.getUpstreamBranchSet(),n=this.getCommitFromRef(e).get("id"),r=[];u.each(t[n],function(e){e.selected=this.HEAD.get("target").get("id")==e.id,r.push(e)},this),this.printBranches(r)},m.prototype.printBranches=function(e){var t="";throw u.each(e,function(e){t+=(e.selected?"* ":"")+e.id+"\n"}),new v({msg:t})},m.prototype.makeCommit=function(e,t,n){if(!t){t=this.uniqueId("C");while(this.refs[t])t=this.uniqueId("C")}var r=new b(u.extend({parents:e,id:t,gitVisuals:this.gitVisuals},n||{}));return this.refs[r.get("id")]=r,this.commitCollection.add(r),r},m.prototype.acceptNoGeneralArgs=function(){if(this.generalArgs.length)throw new d({msg:"That command accepts no general arguments"})},m.prototype.validateArgBounds=function(e,t,n,r){var i=r===undefined?"git "+this.command.get("method"):this.command.get("method")+" "+r+" ";i="with "+i;if(e.lengthn)throw new d({msg:"I expect at most "+String(n)+" argument(s) "+i})},m.prototype.oneArgImpliedHead=function(e,t){this.validateArgBounds(e,0,1,t),e.length===0&&e.push("HEAD")},m.prototype.twoArgsImpliedHead=function(e,t){this.validateArgBounds(e,1,2,t),e.length==1&&e.push("HEAD")},m.prototype.revertStarter=function(){this.validateArgBounds(this.generalArgs,1,NaN);var e=this.revert(this.generalArgs);e&&this.animationFactory.rebaseAnimation(this.animationQueue,e,this,this.gitVisuals)},m.prototype.revert=function(e){var t=[];u.each(e,function(e){t.push(this.getCommitFromRef(e))},this);var n={};n.destinationBranch=this.resolveID(t[0]),n.toRebaseArray=t.slice(0),n.rebaseSteps=[];var r=this.gitVisuals.genSnapshot(),i,s=this.getCommitFromRef("HEAD");return u.each(t,function(e){var t=this.rebaseAltID(e.get("id")),o=this.makeCommit([s],t,{commitMessage:"Reverting "+this.resolveName(e)+': "'+e.get("commitMessage")+'"'});s=o,i=this.gitVisuals.genSnapshot(),n.rebaseSteps.push({oldCommit:e,newCommit:o,beforeSnapshot:r,afterSnapshot:i}),r=i},this),this.setTargetLocation("HEAD",s),n},m.prototype.resetStarter=function(){if(this.commandOptions["--soft"])throw new d({msg:"You can't use --soft because there is no concept of stashing changes or staging files, so you will lose your progress. Try using interactive rebasing (or just rebasing) to move commits."});this.commandOptions["--hard"]&&(this.command.addWarning("Nice! You are using --hard. The default behavior is a hard reset in this demo, so don't worry about specifying the option explicity"),this.generalArgs=this.generalArgs.concat(this.commandOptions["--hard"])),this.validateArgBounds(this.generalArgs,1,1);if(this.getDetachedHead())throw new d({msg:"Cant reset in detached head! Use checkout if you want to move"});this.reset(this.generalArgs[0])},m.prototype.reset=function(e){this.setTargetLocation("HEAD",this.getCommitFromRef(e))},m.prototype.cherrypickStarter=function(){this.validateArgBounds(this.generalArgs,1,1);var e=this.cherrypick(this.generalArgs[0]);this.animationFactory.genCommitBirthAnimation(this.animationQueue,e,this.gitVisuals)},m.prototype.cherrypick=function(e){var t=this.getCommitFromRef(e),n=this.getUpstreamSet("HEAD");if(n[t.get("id")])throw new d({msg:"We already have that commit in our changes history! You can't cherry-pick it if it shows up in git log."});var r=this.rebaseAltID(t.get("id")),i=this.makeCommit([this.getCommitFromRef("HEAD")],r);return this.setTargetLocation(this.HEAD,i),i},m.prototype.commitStarter=function(){this.acceptNoGeneralArgs();if(this.commandOptions["-am"]&&(this.commandOptions["-a"]||this.commandOptions["-m"]))throw new d({msg:"You can't have -am with another -m or -a!"});var e=null,t=null;this.commandOptions["-a"]&&this.command.addWarning("No need to add files in this demo"),this.commandOptions["-am"]&&(t=this.commandOptions["-am"],this.validateArgBounds(t,1,1,"-am"),this.command.addWarning("Don't worry about adding files in this demo. I'll take down your commit message anyways, but you can commit without a message in this demo as well"),e=t[0]),this.commandOptions["-m"]&&(t=this.commandOptions["-m"],this.validateArgBounds(t,1,1,"-m"),e=t[0]);var n=this.commit();e&&(e=e.replace(/"/g,'"').replace(/^"/g,"").replace(/"$/g,""),n.set("commitMessage",e)),this.animationFactory.genCommitBirthAnimation(this.animationQueue,n,this.gitVisuals)},m.prototype.commit=function(){var e=this.getCommitFromRef(this.HEAD),t=null;this.commandOptions["--amend"]&&(e=this.resolveID("HEAD~1"),t=this.rebaseAltID(this.getCommitFromRef("HEAD").get("id")));var n=this.makeCommit([e],t);return this.getDetachedHead()&&this.command.addWarning("Warning!! Detached HEAD state"),this.setTargetLocation(this.HEAD,n),n},m.prototype.resolveName=function(e){var t=this.resolveID(e);return t.get("type")=="commit"?"commit "+t.get("id"):t.get("type")=="branch"?'branch "'+t.get("id")+'"':this.resolveName(t.get("target"))},m.prototype.resolveID=function(e){if(e===null||e===undefined)throw new Error("Dont call this with null / undefined");return typeof e!="string"?e:this.resolveStringRef(e)},m.prototype.resolveStringRef=function(e){if(this.refs[e])return this.refs[e];if(this.refs[e.toUpperCase()])return this.refs[e.toUpperCase()];var t=[[/^([a-zA-Z0-9]+)~(\d+)\s*$/,function(e){return parseInt(e[2],10)}],[/^([a-zA-Z0-9]+)(\^+)\s*$/,function(e){return e[2].length}]],n=null,r=null;u.each(t,function(t){var i=t[0],s=t[1];if(i.test(e)){var o=i.exec(e);r=s(o),n=o[1]}},this);if(!n)throw new d({msg:"unknown ref "+e});if(!this.refs[n])throw new d({msg:"the ref "+n+" does not exist."});var i=this.getCommitFromRef(n);return this.numBackFrom(i,r)},m.prototype.getCommitFromRef=function(e){var t=this.resolveID(e);while(t.get("type")!=="commit")t=t.get("target");return t},m.prototype.getType=function(e){return this.resolveID(e).get("type")},m.prototype.setTargetLocation=function(e,t){if(this.getType(e)=="commit")return;e=this.getOneBeforeCommit(e),e.set("target",t)},m.prototype.getUpstreamBranchSet=function(){var e={},t=function(e,t){var n=!1;return u.each(e,function(e){e.id==t&&(n=!0)}),n},n=function(e){var t=[],n=[e];while(n.length){var r=n.pop();t.push(r.get("id")),r.get("parents")&&r.get("parents").length&&(n=n.concat(r.get("parents")))}return t};return this.branchCollection.each(function(r){var i=n(r.get("target"));u.each(i,function(n){e[n]=e[n]||[],t(e[n],r.get("id"))||e[n].push({obj:r,id:r.get("id")})})}),e},m.prototype.getUpstreamHeadSet=function(){var e=this.getUpstreamSet("HEAD"),t=this.getCommitFromRef("HEAD").get("id");return e[t]=!0,e},m.prototype.getOneBeforeCommit=function(e){var t=this.resolveID(e);return t===this.HEAD&&!this.getDetachedHead()&&(t=t.get("target")),t},m.prototype.numBackFrom=function(e,t){if(t===0)return e;var n=u.bind(function(e){e.sort(this.dateSortFunc)},this),r=[].concat(e.get("parents")||[]);n(r),t--;while(r.length&&t!==0){var i=r.shift(0),s=i.get("parents");s&&s.length&&(r=r.concat(s)),n(r),t--}if(t!==0||r.length===0)throw new d({msg:"Sorry, I can't go that many commits back"});return r.shift(0)},m.prototype.scrapeBaseID=function(e){var t=/^C(\d+)/.exec(e);if(!t)throw new Error("regex failed on "+e);return"C"+t[1]},m.prototype.rebaseAltID=function(e){var t=[[/^C(\d+)[']{0,2}$/,function(e){return e[0]+"'"}],[/^C(\d+)[']{3}$/,function(e){return e[0].slice(0,-3)+"'^4"}],[/^C(\d+)['][\^](\d+)$/,function(e){return"C"+String(e[1])+"'^"+String(Number(e[2])+1)}]];for(var n=0;n",this.get("commitMessage"),"
","Commit: "+this.get("id")].join("\n")+"\n"},getShowEntry:function(){return[this.getLogEntry(),"diff --git a/bigGameResults.html b/bigGameResults.html","--- bigGameResults.html","+++ bigGameResults.html","@@ 13,27 @@ Winner, Score","- Stanfurd, 14-7","+ Cal, 21-14"].join("\n")+"\n"},validateAtInit:function(){if(!this.get("id"))throw new Error("Need ID!!");this.get("createTime")||this.set("createTime",(new Date).toString()),this.get("commitMessage")||this.set("commitMessage","Quick Commit. Go Bears!"),this.set("children",[]);if(!this.get("rootCommit"))if(!this.get("parents")||!this.get("parents").length)throw new Error("needs parents")},addNodeToVisuals:function(){var e=this.get("gitVisuals").addNode(this.get("id"),this);this.set("visNode",e)},addEdgeToVisuals:function(e){this.get("gitVisuals").addEdge(this.get("id"),e.get("id"))},isMainParent:function(e){var t=this.get("parents").indexOf(e);return t===0},initialize:function(e){this.validateAtInit(),this.addNodeToVisuals(),u.each(this.get("parents"),function(e){e.get("children").push(this),this.addEdgeToVisuals(e)},this)}});n.GitEngine=m,n.Commit=b,n.Branch=y,n.Ref=g}),e("/src/js/git/index.js"),e.define("/src/js/git/treeCompare.js",function(e,t,n,r,i,s,o){function a(){}var u=e("underscore");a.prototype.compareAllBranchesWithinTreesAndHEAD=function(e,t){return e=this.convertTreeSafe(e),t=this.convertTreeSafe(t),e.HEAD.target==t.HEAD.target&&this.compareAllBranchesWithinTrees(e,t)},a.prototype.compareAllBranchesWithinTrees=function(e,t){e=this.convertTreeSafe(e),t=this.convertTreeSafe(t);var n=u.extend({},e.branches,t.branches),r=!0;return u.uniq(n,function(n,i){r=r&&this.compareBranchWithinTrees(e,t,i)},this),r},a.prototype.compareBranchesWithinTrees=function(e,t,n){var r=!0;return u.each(n,function(n){r=r&&this.compareBranchWithinTrees(e,t,n)},this),r},a.prototype.getRecurseCompare=function(e,t){var n=function(r,i){var s=u.isEqual(r,i);return s?(u.each(r.parents,function(r,o){var u=i.parents[o],a=e.commits[r],f=t.commits[u];s=s&&n(a,f)},this),s):!1};return n},a.prototype.compareBranchWithinTrees=function(e,t,n){e=this.convertTreeSafe(e),t=this.convertTreeSafe(t),this.reduceTreeFields([e,t]);var r=this.getRecurseCompare(e,t),i=e.branches[n],s=t.branches[n];return u.isEqual(i,s)&&r(e.commits[i.target],t.commits[s.target])},a.prototype.convertTreeSafe=function(e){return typeof e=="string"?JSON.parse(unescape(e)):e},a.prototype.reduceTreeFields=function(e){var t=["parents","id","rootCommit"],n=["children","parents"],r=["target","id"],i=function(e,t,n,r){var i=e[t];u.each(i,function(i,s){var o={};u.each(n,function(e){i[e]!==undefined&&(o[e]=i[e])}),u.each(r,function(e){i[e]&&(i[e].sort(),o[e]=i[e])}),e[t][s]=o})};u.each(e,function(e){i(e,"commits",t,n),i(e,"branches",r),e.HEAD={target:e.HEAD.target,id:e.HEAD.id}})},a.prototype.compareTrees=function(e,t){return e=this.convertTreeSafe(e),t=this.convertTreeSafe(t),this.reduceTreeFields([e,t]),u.isEqual(e,t)},n.TreeCompare=a}),e("/src/js/git/treeCompare.js"),e.define("/src/js/level/arbiter.js",function(e,t,n,r,i,s,o){function h(){this.levelMap={},this.levelSequences=f,this.sequences=[],this.init();var e;try{e=JSON.parse(localStorage.getItem("solvedMap")||"{}")}catch(t){console.warn("local storage failed",t)}this.solvedMap=e||{},c.getEvents().on("levelSolved",this.levelSolved,this)}var u=e("underscore"),a=e("backbone"),f=e("../levels").levelSequences,l=e("../levels").sequenceInfo,c=e("../app");h.prototype.init=function(){var e;u.each(this.levelSequences,function(e,t){this.sequences.push(t);if(!e||!e.length)throw new Error("no empty sequences allowed");u.each(e,function(e,n){this.validateLevel(e);var r=t+String(n+1),i=u.extend({},e,{index:n,id:r,sequenceName:t});this.levelMap[r]=i,this.levelSequences[t][n]=i},this)},this)},h.prototype.isLevelSolved=function(e){if(!this.levelMap[e])throw new Error("that level doesnt exist!");return Boolean(this.solvedMap[e])},h.prototype.levelSolved=function(e){if(!e)return;this.solvedMap[e]=!0,this.syncToStorage()},h.prototype.resetSolvedMap=function(){this.solvedMap={},this.syncToStorage(),c.getEvents().trigger("levelSolved")},h.prototype.syncToStorage=function(){try{localStorage.setItem("solvedMap",JSON.stringify(this.solvedMap))}catch(e){console.warn("local storage fialed on set",e)}},h.prototype.validateLevel=function(e){e=e||{};var t=["name","goalTreeString","solutionCommand"],n=["hint","disabledMap","startTree"];u.each(t,function(t){if(e[t]===undefined)throw console.log(e),new Error("I need this field for a level: "+t)})},h.prototype.getSequenceToLevels=function(){return this.levelSequences},h.prototype.getSequences=function(){return u.keys(this.levelSequences)},h.prototype.getLevelsInSequence=function(e){if(!this.levelSequences[e])throw new Error("that sequecne name "+e+"does not exist");return this.levelSequences[e]},h.prototype.getSequenceInfo=function(e){return l[e]},h.prototype.getLevel=function(e){return this.levelMap[e]},h.prototype.getNextLevel=function(e){if(!this.levelMap[e])return console.warn("that level doesnt exist!!!"),null;var t=this.levelMap[e],n=t.sequenceName,r=this.levelSequences[n],i=t.index+1;if(i"+e+this.get("warnings").join(""+e)+"
"},parseOrCatch:function(){this.expandShortcuts(this.get("rawStr"));try{this.processInstants()}catch(e){f.filterError(e),this.set("error",e);return}if(this.parseAll())return;this.set("error",new p({msg:'The command "'+this.get("rawStr")+"\" isn't supported, sorry!"}))},errorChanged:function(){var e=this.get("error");e instanceof p||e instanceof d?this.set("status","error"):e instanceof m?this.set("status","finished"):e instanceof v&&this.set("status","warning"),this.formatError()},formatError:function(){this.set("result",this.get("error").toResult())},expandShortcuts:function(e){e=this.get("parseWaterfall").expandAllShortcuts(e),this.set("rawStr",e)},processInstants:function(){var e=this.get("rawStr");if(!e.length)throw new m({msg:""});this.get("parseWaterfall").processAllInstants(e)},parseAll:function(){var e=this.get("rawStr"),t=this.get("parseWaterfall").parseAll(e);return t?(u.each(t.toSet,function(e,t){this.set(t,e)},this),!0):!1}}),y=a.Model.extend({defaults:{text:""}});n.CommandEntry=y,n.Command=g}),e("/src/js/models/commandModel.js"),e.define("/src/js/util/constants.js",function(e,t,n,r,i,s,o){var u={betweenCommandsDelay:400},a={isAnimating:!1},f={minZoom:.55,maxZoom:1.25,minWidth:600,minHeight:600},l={arrowHeadSize:8,nodeRadius:17,curveControlPointOffset:50,defaultEasing:"easeInOut",defaultAnimationTime:400,rectFill:"hsb(0.8816909813322127,0.7,1)",headRectFill:"#2831FF",rectStroke:"#FFF",rectStrokeWidth:"3",multiBranchY:20,upstreamHeadOpacity:.5,upstreamNoneOpacity:.2,edgeUpstreamHeadOpacity:.4,edgeUpstreamNoneOpacity:.15,visBranchStrokeWidth:2,visBranchStrokeColorNone:"#333",defaultNodeFill:"hsba(0.5,0.8,0.7,1)",defaultNodeStrokeWidth:2,defaultNodeStroke:"#FFF",orphanNodeFill:"hsb(0.5,0.8,0.7)"};n.GLOBAL=a,n.TIME=u,n.GRAPHICS=l,n.VIEWPORT=f}),e("/src/js/util/constants.js"),e.define("/src/js/util/debug.js",function(e,t,n,r,i,s,o){var u=e("underscore"),a={Tree:e("../visuals/tree"),Visuals:e("../visuals"),Git:e("../git"),CommandModel:e("../models/commandModel"),Levels:e("../git/treeCompare"),Constants:e("../util/constants"),Collections:e("../models/collections"),Async:e("../visuals/animation"),AnimationFactory:e("../visuals/animation/animationFactory"),Main:e("../app"),HeadLess:e("../git/headless"),Q:{Q:e("q")},RebaseView:e("../views/rebaseView"),Views:e("../views"),MultiView:e("../views/multiView"),ZoomLevel:e("../util/zoomLevel"),VisBranch:e("../visuals/visBranch"),Level:e("../level"),Sandbox:e("../level/sandbox"),GitDemonstrationView:e("../views/gitDemonstrationView"),Markdown:e("markdown"),LevelDropdownView:e("../views/levelDropdownView"),BuilderViews:e("../views/builderViews")};u.each(a,function(e){u.extend(window,e)}),$(document).ready(function(){window.events=a.Main.getEvents(),window.eventBaton=a.Main.getEventBaton(),window.sandbox=a.Main.getSandbox(),window.modules=a,window.levelDropdown=a.Main.getLevelDropdown()})}),e("/src/js/util/debug.js"),e.define("/src/js/util/errors.js",function(e,t,n,r,i,s,o){var u=e("underscore"),a=e("backbone"),f=a.Model.extend({defaults:{type:"MyError",msg:"Unknown Error"},toString:function(){return this.get("type")+": "+this.get("msg")},getMsg:function(){return this.get("msg")||"Unknown Error"},toResult:function(){return this.get("msg").length?""+this.get("msg").replace(/\n/g,"
")+"
":""}}),l=n.CommandProcessError=f.extend({defaults:{type:"Command Process Error"}}),c=n.CommandResult=f.extend({defaults:{type:"Command Result"}}),h=n.Warning=f.extend({defaults:{type:"Warning"}}),p=n.GitError=f.extend({defaults:{type:"Git Error"}}),d=function(e){if(e instanceof l||e instanceof p||e instanceof c||e instanceof h)return;throw e};n.filterError=d}),e("/src/js/util/errors.js"),e.define("/src/js/util/eventBaton.js",function(e,t,n,r,i,s,o){function a(){this.eventMap={}}var u=e("underscore");a.prototype.stealBaton=function(e,t,n){if(!e)throw new Error("need name");if(!t)throw new Error("need func!");var r=this.eventMap[e]||[];r.push({func:t,context:n}),this.eventMap[e]=r},a.prototype.sliceOffArgs=function(e,t){var n=[];for(var r=e;r0&&!e.length)return;t(e)})},n.genParseCommand=function(e,t){return function(n){var r,i;return u.each(e,function(e,t){var s=e.exec(n);s&&(r=t,i=s)}),r?{toSet:{eventName:t,method:r,regexResults:i}}:!1}}}),e("/src/js/util/index.js"),e.define("/src/js/util/keyboard.js",function(e,t,n,r,i,s,o){function c(e){this.events=e.events||u.clone(a.Events),this.aliasMap=e.aliasMap||{},e.wait||this.listen()}var u=e("underscore"),a=e("backbone"),f=e("../app"),l=function(e){var t={37:"left",38:"up",39:"right",40:"down",27:"esc",13:"enter"};return t[e]};c.prototype.listen=function(){if(this.listening)return;this.listening=!0,f.getEventBaton().stealBaton("docKeydown",this.keydown,this)},c.prototype.mute=function(){this.listening=!1,f.getEventBaton().releaseBaton("docKeydown",this.keydown,this)},c.prototype.keydown=function(e){var t=e.which||e.keyCode,n=l(t);if(n===undefined)return;this.fireEvent(n,e)},c.prototype.fireEvent=function(e,t){e=this.aliasMap[e]||e,this.events.trigger(e,t)},c.prototype.passEventBack=function(e){f.getEventBaton().passBatonBackSoft("docKeydown",this.keydown,this,[e])},n.KeyboardListener=c,n.mapKeycodeToKey=l}),e("/src/js/util/keyboard.js"),e.define("/src/js/util/mock.js",function(e,t,n,r,i,s,o){n.mock=function(e){var t={},n=function(){};for(var r in e.prototype)t[r]=n;return t}}),e("/src/js/util/mock.js"),e.define("/src/js/util/zoomLevel.js",function(e,t,n,r,i,s,o){function f(){return!window.outerWidth||!window.innerWidth?(a&&(console.warn("Can't detect zoom level correctly :-/"),a=!1),1):window.outerWidth/window.innerWidth}var u=e("underscore"),a=!0,l=!0,c=function(e,t){var n=0;setInterval(function(){var r=f();if(r!==n){if(l){l=!1;return}n=r,e.apply(t,[r])}else l=!0},500)};n.setupZoomPoll=c,n.detectZoom=f}),e("/src/js/util/zoomLevel.js"),e.define("/src/js/views/builderViews.js",function(e,t,n,r,i,s,o){var u=e("underscore"),a=e("q"),f=e("../util").isBrowser()?window.Backbone:e("backbone"),l=e("../util"),c=e("../util/keyboard").KeyboardListener,h=e("../views"),p=h.ModalTerminal,d=h.ContainedBase,v=d.extend({tagName:"div",className:"textGrabber box vertical",template:u.template($("#text-grabber").html()),initialize:function(e){e=e||{},this.JSON={helperText:e.helperText||"Enter some text"},this.container=e.container||new p({title:"Enter some text"}),this.render(),e.initialText&&this.setText(e.initialText),e.wait||this.show()},getText:function(){return this.$("textarea").val()},setText:function(e){this.$("textarea").val(e)}}),m=d.extend({tagName:"div",className:"markdownGrabber box horizontal",template:u.template($("#markdown-grabber-view").html()),events:{"keyup textarea":"keyup"},initialize:function(e){e=e||{},this.deferred=e.deferred||a.defer(),e.fromObj&&(e.fillerText=e.fromObj.options.markdowns.join("\n")),this.JSON={previewText:e.previewText||"Preview",fillerText:e.fillerText||"## Enter some markdown!\n\n\n"},this.container=e.container||new p({title:e.title||"Enter some markdown"}),this.render();if(!e.withoutButton){var t=a.defer();t.promise.then(u.bind(this.confirmed,this)).fail(u.bind(this.cancelled,this)).done();var n=new h.ConfirmCancelView({deferred:t,destination:this.getDestination()})}this.updatePreview(),e.wait||this.show()},confirmed:function(){this.die(),this.deferred.resolve(this.getRawText())},cancelled:function(){this.die(),this.deferred.resolve()},keyup:function(){this.throttledPreview||(this.throttledPreview=u.throttle(u.bind(this.updatePreview,this),500)),this.throttledPreview()},getRawText:function(){return this.$("textarea").val()},exportToArray:function(){return this.getRawText().split("\n")},getExportObj:function(){return{markdowns:this.exportToArray()}},updatePreview:function(){var t=this.getRawText(),n=e("markdown").markdown.toHTML(t);this.$("div.insidePreview").html(n)}}),g=d.extend({tagName:"div",className:"markdownPresenter box vertical",template:u.template($("#markdown-presenter").html()),initialize:function(e){e=e||{},this.deferred=e.deferred||a.defer(),this.JSON={previewText:e.previewText||"Here is something for you",fillerText:e.fillerText||"# Yay"},this.container=new p({title:"Check this out..."}),this.render();if(!e.noConfirmCancel){var t=new h.ConfirmCancelView({destination:this.getDestination()});t.deferred.promise.then(u.bind(function(){this.deferred.resolve(this.grabText())},this)).fail(u.bind(function(){this.deferred.reject()},this)).done(u.bind(this.die,this))}this.show()},grabText:function(){return this.$("textarea").val()}}),y=d.extend({tagName:"div",className:"demonstrationBuilder box vertical",template:u.template($("#demonstration-builder").html()),events:{"click div.testButton":"testView"},initialize:function(e){e=e||{},this.deferred=e.deferred||a.defer();if(e.fromObj){var t=e.fromObj.options;e=u.extend({},e,t,{beforeMarkdown:t.beforeMarkdowns.join("\n"),afterMarkdown:t.afterMarkdowns.join("\n")})}this.JSON={},this.container=new p({title:"Demonstration Builder"}),this.render(),this.beforeMarkdownView=new m({container:this,withoutButton:!0,fillerText:e.beforeMarkdown,previewText:"Before demonstration Markdown"}),this.beforeCommandView=new v({container:this,helperText:"The git command(s) to set up the demonstration view (before it is displayed)",initialText:e.beforeCommand||"git checkout -b bugFix"}),this.commandView=new v({container:this,helperText:"The git command(s) to demonstrate to the reader",initialText:e.command||"git commit"}),this.afterMarkdownView=new m({container:this,withoutButton:!0,fillerText:e.afterMarkdown,previewText:"After demonstration Markdown"});var n=a.defer(),r=new h.ConfirmCancelView({deferred:n,destination:this.getDestination()});n.promise.then(u.bind(this.confirmed,this)).fail(u.bind(this.cancelled,this)).done()},testView:function(){var t=e("../views/multiView").MultiView;new t({childViews:[{type:"GitDemonstrationView",options:this.getExportObj()}]})},getExportObj:function(){return{beforeMarkdowns:this.beforeMarkdownView.exportToArray(),afterMarkdowns:this.afterMarkdownView.exportToArray(),command:this.commandView.getText(),beforeCommand:this.beforeCommandView.getText()}},confirmed:function(){this.die(),this.deferred.resolve(this.getExportObj())},cancelled:function(){this.die(),this.deferred.resolve()},getInsideElement:function(){return this.$(".insideBuilder")[0]}}),b=d.extend({tagName:"div",className:"multiViewBuilder box vertical",template:u.template($("#multi-view-builder").html()),typeToConstructor:{ModalAlert:m,GitDemonstrationView:y},events:{"click div.deleteButton":"deleteOneView","click div.testButton":"testOneView","click div.editButton":"editOneView","click div.testEntireView":"testEntireView","click div.addView":"addView","click div.saveView":"saveView","click div.cancelView":"cancel"},initialize:function(e){e=e||{},this.deferred=e.deferred||a.defer(),this.multiViewJSON=e.multiViewJSON||{},this.JSON={views:this.getChildViews(),supportedViews:u.keys(this.typeToConstructor)},this.container=new p({title:"Build a MultiView!"}),this.render(),this.show()},saveView:function(){this.hide(),this.deferred.resolve(this.multiViewJSON)},cancel:function(){this.hide(),this.deferred.resolve()},addView:function(e){var t=e.srcElement,n=$(t).attr("data-type"),r=a.defer(),i=this.typeToConstructor[n],s=new i({deferred:r});r.promise.then(u.bind(function(){var e={type:n,options:s.getExportObj()};this.addChildViewObj(e)},this)).fail(function(){}).done()},testOneView:function(t){var n=t.srcElement,r=$(n).attr("data-index"),i=this.getChildViews()[r],s=e("../views/multiView").MultiView;new s({childViews:[i]})},testEntireView:function(){var t=e("../views/multiView").MultiView;new t({childViews:this.getChildViews()})},editOneView:function(e){var t=e.srcElement,n=$(t).attr("data-index"),r=$(t).attr("data-type"),i=a.defer(),s=new this.typeToConstructor[r]({deferred:i,fromObj:this.getChildViews()[n]});i.promise.then(u.bind(function(){var e={type:r,options:s.getExportObj()},t=this.getChildViews();t[n]=e,this.setChildViews(t)},this)).fail(function(){}).done()},deleteOneView:function(e){var t=e.srcElement,n=$(t).attr("data-index"),r=this.getChildViews(),i=r.slice(0,n).concat(r.slice(n+1));this.setChildViews(i),this.update()},addChildViewObj:function(e,t){var n=this.getChildViews();n.push(e),this.setChildViews(n),this.update()},setChildViews:function(e){this.multiViewJSON.childViews=e},getChildViews:function(){return this.multiViewJSON.childViews||[]},update:function(){this.JSON.views=this.getChildViews(),this.renderAgain()}});n.MarkdownGrabber=m,n.DemonstrationBuilder=y,n.TextGrabber=v,n.MultiViewBuilder=b,n.MarkdownPresenter=g}),e("/src/js/views/builderViews.js"),e.define("/src/js/views/commandViews.js",function(e,t,n,r,i,s,o){var u=e("underscore"),a=e("../util").isBrowser()?a=window.Backbone:a=e("backbone"),f=e("../models/collections").CommandEntryCollection,l=e("../app"),c=e("../models/commandModel").Command,h=e("../models/commandModel").CommandEntry,p=e("../util/errors"),d=p.Warning,v=e("../util"),m=e("../util/keyboard"),g=a.View.extend({initialize:function(e){l.getEvents().on("commandSubmittedPassive",this.addToCommandHistory,this),this.commands=new f,this.commands.fetch({success:u.bind(function(){var e=[];this.commands.each(function(t){e.push(t)}),e.reverse(),this.commands.reset(),u.each(e,function(e){this.commands.add(e)},this)},this)}),this.index=-1,this.commandParagraph=this.$("#prompt p.command")[0],this.commandCursor=this.$("#prompt span.cursor")[0],this.focus(),l.getEvents().on("rollupCommands",this.rollupCommands,this),l.getEventBaton().stealBaton("keydown",this.onKeyDown,this),l.getEventBaton().stealBaton("keyup",this.onKeyUp,this)},events:{"blur #commandTextField":"hideCursor","focus #commandTextField":"showCursor"},blur:function(){this.hideCursor()},focus:function(){this.$("#commandTextField").focus(),this.showCursor()},hideCursor:function(){this.toggleCursor(!1)},showCursor:function(){this.toggleCursor(!0)},toggleCursor:function(e){$(this.commandCursor).toggleClass("shown",e)},onKeyDown:function(e){var t=e.srcElement;this.updatePrompt(t)},onKeyUp:function(e){this.onKeyDown(e);var t={enter:u.bind(function(){this.submit()},this),up:u.bind(function(){this.commandSelectChange(1)},this),down:u.bind(function(){this.commandSelectChange(-1)},this)},n=m.mapKeycodeToKey(e.which||e.keyCode);t[n]!==undefined&&(e.preventDefault(),t[n](),this.onKeyDown(e))},badHtmlEncode:function(e){return e.replace(/&/g,"&").replace(/=this.commands.length||this.index<0){this.clear(),this.index=-1;return}var t=this.commands.toArray()[this.index].get("text");this.setTextField(t)},clearLocalStorage:function(){this.commands.each(function(e){a.sync("delete",e,function(){})},this)},setTextField:function(e){this.$("#commandTextField").val(e)},clear:function(){this.setTextField("")},submit:function(){var e=this.$("#commandTextField").val().replace("\n","");this.clear(),this.submitCommand(e),this.index=-1},rollupCommands:function(e){var t=this.commands.toArray().slice(1,Number(e)+1);t.reverse();var n="";u.each(t,function(e){n+=e.get("text")+";"},this);var r=new h({text:n});this.commands.unshift(r),a.sync("create",r,function(){})},addToCommandHistory:function(e){var t=e.length&&this.index===-1||e.length&&this.index!==-1&&this.commands.toArray()[this.index].get("text")!==e;if(!t)return;var n=new h({text:e});this.commands.unshift(n),a.sync("create",n,function(){}),this.commands.length>100&&this.clearLocalStorage()},submitCommand:function(e){l.getEventBaton().trigger("commandSubmitted",e)}}),y=a.View.extend({tagName:"div",model:c,template:u.template($("#command-template").html()),events:{click:"clicked"},clicked:function(e){},initialize:function(){this.model.bind("change",this.wasChanged,this),this.model.bind("destroy",this.remove,this)},wasChanged:function(e,t){var n=t.changes,r=u.keys(n);u.difference(r,["status"]).length===0?this.updateStatus():this.render()},updateStatus:function(){var e=["inqueue","processing","finished"],t={};u.each(e,function(e){t[e]=!1}),t[this.model.get("status")]=!0;var n=this.$("p.commandLine");u.each(t,function(e,t){n.toggleClass(t,e)})},render:function(){var e=u.extend({resultType:"",result:"",formattedWarnings:this.model.getFormattedWarnings()},this.model.toJSON());return this.$el.html(this.template(e)),this},remove:function(){$(this.el).hide()}}),b=a.View.extend({initialize:function(e){this.collection=e.collection,this.collection.on("add",this.addOne,this),this.collection.on("reset",this.addAll,this),this.collection.on("all",this.render,this),this.collection.on("change",this.scrollDown,this),l.getEvents().on("commandScrollDown",this.scrollDown,this),l.getEvents().on("clearOldCommands",this.clearOldCommands,this)},addWarning:function(e){var t=new d({msg:e}),n=new c({error:t,rawStr:"Warning:"});this.collection.add(n)},clearOldCommands:function(){var e=[];this.collection.each(function(t){t.get("status")!=="inqueue"&&t.get("status")!=="processing"&&e.push(t)},this),u.each(e,function(e){e.destroy()},this),this.scrollDown()},scrollDown:function(){var e=$("#commandDisplay")[0],t=$("#terminal")[0],n=e.clientHeight>t.clientHeight;$(t).toggleClass("scrolling",n),n&&(t.scrollTop=t.scrollHeight)},addOne:function(e){var t=new y({model:e});this.$("#commandDisplay").append(t.render().el),this.scrollDown()},addAll:function(){this.collection.each(this.addOne)}});n.CommandPromptView=g,n.CommandLineHistoryView=b}),e("/src/js/views/commandViews.js"),e.define("/src/js/views/gitDemonstrationView.js",function(e,t,n,r,i,s,o){var u=e("underscore"),a=e("q"),f=e("../util").isBrowser()?window.Backbone:e("backbone"),l=e("../util"),c=e("../util/keyboard").KeyboardListener,h=e("../models/commandModel").Command,p=e("../views").ModalTerminal,d=e("../views").ContainedBase,v=e("../visuals/visualization").Visualization,m=d.extend({tagName:"div",className:"gitDemonstrationView box horizontal",template:u.template($("#git-demonstration-view").html()),events:{"click div.command > p.uiButton":"positive"},initialize:function(t){t=t||{},this.options=t,this.JSON=u.extend({beforeMarkdowns:["## Git Commits","","Awesome!"],command:"git commit",afterMarkdowns:["Now you have seen it in action","","Go ahead and try the level!"]},t);var n=function(t){return e("markdown").markdown.toHTML(t.join("\n"))};this.JSON.beforeHTML=n(this.JSON.beforeMarkdowns),this.JSON.afterHTML=n(this.JSON.afterMarkdowns),this.container=new p({title:t.title||"Git Demonstration"}),this.render(),this.checkScroll(),this.navEvents=u.clone(f.Events),this.navEvents.on("positive",this.positive,this),this.navEvents.on("negative",this.negative,this),this.keyboardListener=new c({events:this.navEvents,aliasMap:{enter:"positive",right:"positive",left:"negative"},wait:!0}),this.visFinished=!1,this.initVis(),t.wait||this.show()},receiveMetaNav:function(e,t){var n=this;e.navEvents.on("positive",this.positive,this),this.metaContainerView=t},checkScroll:function(){var e=this.$("div.demonstrationText").children(),t=u.map(e,function(e){return e.clientHeight}),n=u.reduce(t,function(e,t){return e+t});nc.VIEWPORT.minWidth&&e.h>c.VIEWPORT.minHeight&&this.finish()}}),L=C.extend({initialize:function(e){if(!e||!e.level)throw new Error("need level");this.eventBatonName="zoomChange",this.markdowns=["## That zoom level of "+e.level+" is not supported :-/","Please zoom back to a supported zoom level with Ctrl + and Ctrl -","","(and of course, pull requests to fix this are appreciated :D)"],L.__super__.initialize.apply(this,[e])},batonFired:function(e){e<=c.VIEWPORT.maxZoom&&e>=c.VIEWPORT.minZoom&&this.finish()}}),A=d.extend({tagName:"div",className:"levelToolbarHolder",template:u.template($("#level-toolbar-template").html()),initialize:function(e){e=e||{},this.JSON={name:e.name||"Some level! (unknown name)"},this.beforeDestination=$($("#commandLineHistory div.toolbar")[0]),this.render(),e.wait||s.nextTick(u.bind(this.show,this))},getAnimationTime:function(){return 700},render:function(){var e=this.template(this.JSON);this.$el.html(e),this.beforeDestination.after(this.el)},die:function(){this.hide(),setTimeout(u.bind(function(){this.tearDown()},this),this.getAnimationTime())},hide:function(){this.$("div.toolbar").toggleClass("hidden",!0)},show:function(){this.$("div.toolbar").toggleClass("hidden",!1)}}),O=d.extend({tagName:"div",className:"canvasTerminalHolder box flex1",template:u.template($("#terminal-window-bare-template").html()),events:{"click div.wrapper":"onClick"},initialize:function(e){e=e||{},this.destination=$("body"),this.JSON={title:e.title||"Goal To Reach",text:e.text||'You can hide this window with "hide goal"'},this.render(),e.additionalClass&&this.$el.addClass(e.additionalClass)},getAnimationTime:function(){return 700},onClick:function(){this.slideOut()},die:function(){this.slideOut(),setTimeout(u.bind(function(){this.tearDown()},this))},slideOut:function(){this.slideToggle(!0)},slideIn:function(){this.slideToggle(!1)},slideToggle:function(e){this.$("div.terminal-window-holder").toggleClass("slideOut",e)},getCanvasLocation:function(){return this.$("div.inside")[0]}});n.BaseView=d,n.GeneralButton=y,n.ModalView=E,n.ModalTerminal=S,n.ModalAlert=x,n.ContainedBase=g,n.ConfirmCancelView=b,n.LeftRightView=w,n.ZoomAlertWindow=L,n.ConfirmCancelTerminal=T,n.WindowSizeAlertWindow=k,n.CanvasTerminalHolder=O,n.LevelToolbar=A,n.NextLevelConfirm=N}),e("/src/js/views/index.js"),e.define("/src/js/views/levelDropdownView.js",function(e,t,n,r,i,s,o){var u=e("underscore"),a=e("q"),f=e("../util").isBrowser()?window.Backbone:e("backbone"),l=e("../util"),c=e("../util/keyboard").KeyboardListener,h=e("../app"),p=e("../views").ModalTerminal,d=e("../views").ContainedBase,v=e("../views").BaseView,m=d.extend({tagName:"div",className:"levelDropdownView box vertical",template:u.template($("#level-dropdown-view").html()),initialize:function(e){e=e||{},this.JSON={},this.navEvents=u.clone(f.Events),this.navEvents.on("clickedID",u.debounce(u.bind(this.loadLevelID,this),300,!0)),this.navEvents.on("negative",this.negative,this),this.navEvents.on("positive",this.positive,this),this.navEvents.on("left",this.left,this),this.navEvents.on("right",this.right,this),this.navEvents.on("up",this.up,this),this.navEvents.on("down",this.down,this),this.keyboardListener=new c({events:this.navEvents,aliasMap:{esc:"negative",enter:"positive"},wait:!0}),this.sequences=h.getLevelArbiter().getSequences(),this.sequenceToLevels=h.getLevelArbiter().getSequenceToLevels(),this.container=new p({title:"Select a Level"}),this.render(),this.buildSequences(),e.wait||this.show()},positive:function(){if(!this.selectedID)return;this.loadLevelID(this.selectedID)},left:function(){if(this.turnOnKeyboardSelection())return;this.leftOrRight(-1)},leftOrRight:function(e){this.deselectIconByID(this.selectedID),this.selectedIndex=this.wrapIndex(this.selectedIndex+e,this.getCurrentSequence()),this.selectedID=this.getSelectedID(),this.selectIconByID(this.selectedID)},right:function(){if(this.turnOnKeyboardSelection())return;this.leftOrRight(1)},up:function(){if(this.turnOnKeyboardSelection())return;this.selectedSequence=this.getPreviousSequence(),this.downOrUp()},down:function(){if(this.turnOnKeyboardSelection())return;this.selectedSequence=this.getNextSequence(),this.downOrUp()},downOrUp:function(){this.selectedIndex=this.boundIndex(this.selectedIndex,this.getCurrentSequence()),this.deselectIconByID(this.selectedID),this.selectedID=this.getSelectedID(),this.selectIconByID(this.selectedID)},turnOnKeyboardSelection:function(){return this.selectedID?!1:(this.selectFirst(),!0)},turnOffKeyboardSelection:function(){if(!this.selectedID)return;this.deselectIconByID(this.selectedID),this.selectedID=undefined,this.selectedIndex=undefined,this.selectedSequence=undefined},wrapIndex:function(e,t){return e=e>=t.length?0:e,e=e<0?t.length-1:e,e},boundIndex:function(e,t){return e=e>=t.length?t.length-1:e,e=e<0?0:e,e},getNextSequence:function(){var e=this.getSequenceIndex(this.selectedSequence),t=this.wrapIndex(e+1,this.sequences);return this.sequences[t]},getPreviousSequence:function(){var e=this.getSequenceIndex(this.selectedSequence),t=this.wrapIndex(e-1,this.sequences);return this.sequences[t]},getSequenceIndex:function(e){var t=this.sequences.indexOf(e);if(t<0)throw new Error("didnt find");return t},getIndexForID:function(e){return h.getLevelArbiter().getLevel(e).index},selectFirst:function(){var e=this.sequenceToLevels[this.sequences[0]][0].id;this.selectIconByID(e),this.selectedIndex=0,this.selectedSequence=this.sequences[0]},getCurrentSequence:function(){return this.sequenceToLevels[this.selectedSequence]},getSelectedID:function(){return this.sequenceToLevels[this.selectedSequence][this.selectedIndex].id},selectIconByID:function(e){this.toggleIconSelect(e,!0)},deselectIconByID:function(e){this.toggleIconSelect(e,!1)},toggleIconSelect:function(e,t){this.selectedID=e;var n="#levelIcon-"+e;$(n).toggleClass("selected",t)},negative:function(){this.hide()},testOption:function(e){return this.currentCommand&&(new RegExp("--"+e)).test(this.currentCommand.get("rawStr"))},show:function(e,t){this.currentCommand=t,this.updateSolvedStatus(),this.showDeferred=e,this.keyboardListener.listen(),m.__super__.show.apply(this)},hide:function(){this.showDeferred&&this.showDeferred.resolve(),this.showDeferred=undefined,this.keyboardListener.mute(),this.turnOffKeyboardSelection(),m.__super__.hide.apply(this)},loadLevelID:function(e){this.testOption("noOutput")||h.getEventBaton().trigger("commandSubmitted","level "+e),this.hide()},updateSolvedStatus:function(){u.each(this.seriesViews,function(e){e.updateSolvedStatus()},this)},buildSequences:function(){this.seriesViews=[],u.each(this.sequences,function(e){this.seriesViews.push(new g({destination:this.$el,name:e,navEvents:this.navEvents}))},this)}}),g=v.extend({tagName:"div",className:"seriesView box flex1 vertical",template:u.template($("#series-view").html()),events:{"click div.levelIcon":"click"},initialize:function(e){this.name=e.name||"intro",this.navEvents=e.navEvents,this.info=h.getLevelArbiter().getSequenceInfo(this.name),this.levels=h.getLevelArbiter().getLevelsInSequence(this.name),this.levelIDs=[],u.each(this.levels,function(e){this.levelIDs.push(e.id)},this),this.destination=e.destination,this.JSON={displayName:this.info.displayName,about:this.info.about,ids:this.levelIDs},this.render(),this.updateSolvedStatus()},updateSolvedStatus:function(){var e=this.$("div.levelIcon").each(function(e,t){var n=$(t).attr("data-id");$(t).toggleClass("solved",h.getLevelArbiter().isLevelSolved(n))})},click:function(e){var t=e.srcElement||e.currentTarget;if(!t){console.warn("wut, no id");return}var n=$(t).attr("data-id");this.navEvents.trigger("clickedID",n)}});n.LevelDropdownView=m}),e("/src/js/views/levelDropdownView.js"),e.define("/src/js/views/multiView.js",function(e,t,n,r,i,s,o){var u=e("underscore"),a=e("q"),f=e("../util").isBrowser()?window.Backbone:e("backbone"),l=e("../views").ModalTerminal,c=e("../views").ContainedBase,h=e("../views").ConfirmCancelView,p=e("../views").LeftRightView,d=e("../views").ModalAlert,v=e("../views/gitDemonstrationView").GitDemonstrationView,m=e("../views/builderViews"),g=m.MarkdownPresenter,y=e("../util/keyboard").KeyboardListener,b=e("../util/errors").GitError,w=f.View.extend({tagName:"div",className:"multiView",navEventDebounce:550,deathTime:700,typeToConstructor:{ModalAlert:d,GitDemonstrationView:v,MarkdownPresenter:g},initialize:function(e){e=e||{},this.childViewJSONs=e.childViews||[{type:"ModalAlert",options:{markdown:"Woah wtf!!"}},{type:"GitDemonstrationView",options:{command:"git checkout -b side; git commit; git commit"}},{type:"ModalAlert",options:{markdown:"Im second"}}],this.deferred=e.deferred||a.defer(),this.childViews=[],this.currentIndex=0,this.navEvents=u.clone(f.Events),this.navEvents.on("negative",this.getNegFunc(),this),this.navEvents.on("positive",this.getPosFunc(),this),this.navEvents.on("quit",this.finish,this),this.keyboardListener=new y({events:this.navEvents,aliasMap:{left:"negative",right:"positive",enter:"positive",esc:"quit"}}),this.render(),e.wait||this.start()},onWindowFocus:function(){},getAnimationTime:function(){return 700},getPromise:function(){return this.deferred.promise},getPosFunc:function(){return u.debounce(u.bind(function(){this.navForward()},this),this.navEventDebounce,!0)},getNegFunc:function(){return u.debounce(u.bind(function(){this.navBackward()},this),this.navEventDebounce,!0)},lock:function(){this.locked=!0},unlock:function(){this.locked=!1},navForward:function(){if(this.locked)return;if(this.currentIndex===this.childViews.length-1){this.hideViewIndex(this.currentIndex),this.finish();return}this.navIndexChange(1)},navBackward:function(){if(this.currentIndex===0)return;this.navIndexChange(-1)},navIndexChange:function(e){this.hideViewIndex(this.currentIndex),this.currentIndex+=e,this.showViewIndex(this.currentIndex)},hideViewIndex:function(e){this.childViews[e].hide()},showViewIndex:function(e){this.childViews[e].show()},finish:function(){this.keyboardListener.mute(),u.each(this.childViews,function(e){e.die()}),this.deferred.resolve()},start:function(){this.showViewIndex(this.currentIndex)},createChildView:function(e){var t=e.type;if(!this.typeToConstructor[t])throw new Error('no constructor for type "'+t+'"');var n=new this.typeToConstructor[t](u.extend({},e.options,{wait:!0}));return n},addNavToView:function(e,t){var n=new p({events:this.navEvents,destination:e.getDestination(),showLeft:t!==0,lastNav:t===this.childViewJSONs.length-1});e.receiveMetaNav&&e.receiveMetaNav(n,this)},render:function(){u.each(this.childViewJSONs,function(e,t){var n=this.createChildView(e);this.childViews.push(n),this.addNavToView(n,t)},this)}});n.MultiView=w}),e("/src/js/views/multiView.js"),e.define("/src/js/views/rebaseView.js",function(e,t,n,r,i,s,o){var u=e("../util/errors").GitError,a=e("underscore"),f=e("q"),l=e("../util").isBrowser()?window.Backbone:e("backbone"),c=e("../views").ModalTerminal,h=e("../views").ContainedBase,p=e("../views").ConfirmCancelView,d=e("../views").LeftRightView,v=h.extend({tagName:"div",template:a.template($("#interactive-rebase-template").html()),initialize:function(e){this.deferred=e.deferred,this.rebaseMap={},this.entryObjMap={},this.rebaseEntries=new g,e.toRebase.reverse(),a.each(e.toRebase,function(e){var t=e.get("id");this.rebaseMap[t]=e,this.entryObjMap[t]=new m({id:t}),this.rebaseEntries.add(this.entryObjMap[t])},this),this.container=new c({title:"Interactive Rebase"}),this.render(),this.show()},confirm:function(){this.die();var e=[];this.$("ul.rebaseEntries li").each(function(t,n){e.push(n.id)});var t=[];a.each(e,function(e){this.entryObjMap[e].get("pick")&&t.unshift(this.rebaseMap[e])},this),t.reverse(),this.deferred.resolve(t),this.$el.html("")},render:function(){var e={num:a.keys(this.rebaseMap).length},t=this.container.getInsideElement();this.$el.html(this.template(e)),$(t).append(this.el);var n=this.$("ul.rebaseEntries");this.rebaseEntries.each(function(e){new y({el:n,model:e})},this),n.sortable({axis:"y",placeholder:"rebaseEntry transitionOpacity ui-state-highlight",appendTo:"parent"}),this.makeButtons()},makeButtons:function(){var e=f.defer();e.promise.then(a.bind(function(){this.confirm()},this)).fail(a.bind(function(){this.hide(),this.deferred.resolve([])},this)).done(),new p({destination:this.$(".confirmCancel"),deferred:e})}}),m=l.Model.extend({defaults:{pick:!0},toggle:function(){this.set("pick",!this.get("pick"))}}),g=l.Collection.extend({model:m}),y=l.View.extend({tagName:"li",template:a.template($("#interactive-rebase-entry-template").html()),toggle:function(){this.model.toggle(),this.listEntry.toggleClass("notPicked",!this.model.get("pick"))},initialize:function(e){this.render()},render:function(){var e=this.model.toJSON();this.$el.append(this.template(this.model.toJSON())),this.listEntry=this.$el.children(":last"),this.listEntry.delegate("#toggleButton","click",a.bind(function(){this.toggle()},this))}});n.InteractiveRebaseView=v}),e("/src/js/views/rebaseView.js"),e.define("/src/js/visuals/animation/animationFactory.js",function(e,t,n,r,i,s,o){var u=e("underscore"),a=e("backbone"),f=e("./index").Animation,l=e("../../util/constants").GRAPHICS,c=function(){};c.prototype.genCommitBirthAnimation=function(e,t,n){if(!e)throw new Error("Need animation queue to add closure to!");var r=l.defaultAnimationTime*1,i=r*2,s=t.get("visNode"),o=function(){n.refreshTree(r),s.setBirth(),s.parentInFront(),n.visBranchesFront(),s.animateUpdatedPosition(i,"bounce"),s.animateOutgoingEdges(r)};e.add(new f({closure:o,duration:Math.max(r,i)}))},c.prototype.overrideOpacityDepth2=function(e,t){t=t===undefined?1:t;var n={};return u.each(e,function(e,r){n[r]={},u.each(e,function(e,i){i=="opacity"?n[r][i]=t:n[r][i]=e})}),n},c.prototype.overrideOpacityDepth3=function(e,t){var n={};return u.each(e,function(e,r){n[r]=this.overrideOpacityDepth2(e,t)},this),n},c.prototype.genCommitBirthClosureFromSnapshot=function(e,t){var n=l.defaultAnimationTime*1,r=n*1.5,i=e.newCommit.get("visNode"),s=this.overrideOpacityDepth2(e.afterSnapshot[i.getID()]),o=this.overrideOpacityDepth3(e.afterSnapshot),u=function(){i.setBirthFromSnapshot(e.beforeSnapshot),i.parentInFront(),t.visBranchesFront(),i.animateToAttr(s,r,"bounce"),i.animateOutgoingEdgesToAttr(o,r)};return u},c.prototype.refreshTree=function(e,t){e.add(new f({closure:function(){t.refreshTree()}}))},c.prototype.rebaseAnimation=function(e,t,n,r){this.rebaseHighlightPart(e,t,n),this.rebaseBirthPart(e,t,n,r)},c.prototype.rebaseHighlightPart=function(e,t,n){var r=l.defaultAnimationTime*.66,i=r*2,s=t.toRebaseArray,o=t.destinationBranch.get("visBranch");o||(o=t.destinationBranch.get("visNode")),u.each(s,function(t){var n=t.get("visNode");e.add(new f({closure:function(){n.highlightTo(o,i,"easeInOut")},duration:r*1.5}))},this),this.delay(e,r*2)},c.prototype.rebaseBirthPart=function(e,t,n,r){var i=t.rebaseSteps,s=[];u.each(i,function(e){var t=e.newCommit.get("visNode");s.push(t),t.setOpacity(0),t.setOutgoingEdgesOpacity(0)},this);var o=[];u.each(i,function(t,n){var i=s.slice(n+1),u=this.genFromToSnapshotAnimation(t.beforeSnapshot,t.afterSnapshot,i,o,r),a=this.genCommitBirthClosureFromSnapshot(t,r),c=function(){u(),a()};e.add(new f({closure:c,duration:l.defaultAnimationTime*1.5})),o.push(t.newCommit.get("visNode"))},this),this.delay(e),this.refreshTree(e,r)},c.prototype.delay=function(e,t){t=t||l.defaultAnimationTime,e.add(new f({closure:function(){},duration:t}))},c.prototype.genSetAllCommitOpacities=function(e,t){var n=e.slice(0);return function(){u.each(n,function(e){e.setOpacity(t),e.setOutgoingEdgesOpacity(t)})}},c.prototype.stripObjectsFromSnapshot=function(e,t){var n=[];u.each(t,function(e){n.push(e.getID())});var r={};return u.each(e,function(e,t){if(u.include(n,t))return;r[t]=e},this),r},c.prototype.genFromToSnapshotAnimation=function(e,t,n,r,i){var s=[];u.each(n,function(e){s.push(e),s=s.concat(e.get("outgoingEdges"))});var o=function(e){if(!e)return;u.each(e,function(t,n){e[n].opacity=1})};return u.each([e,t],function(e){u.each(r,function(t){o(e[t.getID()]),u.each(t.get("outgoingEdges"),function(t){o(e[t.getID()])})})}),function(){i.animateAllFromAttrToAttr(e,t,s)}},n.AnimationFactory=c}),e("/src/js/visuals/animation/animationFactory.js"),e.define("/src/js/visuals/animation/index.js",function(e,t,n,r,i,s,o){var u=e("underscore"),a=e("backbone"),f=e("../../util/constants").GLOBAL,l=a.Model.extend({defaults:{duration:300,closure:null},validateAtInit:function(){if(!this.get("closure"))throw new Error("give me a closure!")},initialize:function(e){this.validateAtInit()},run:function(){this.get("closure")()}}),c=a.Model.extend({defaults:{animations:null,index:0,callback:null,defer:!1},initialize:function(e){this.set("animations",[]),e.callback||console.warn("no callback")},add:function(e){if(!e instanceof l)throw new Error("Need animation not something else");this.get("animations").push(e)},start:function(){this.set("index",0),f.isAnimating=!0,this.next()},finish:function(){f.isAnimating=!1,this.get("callback")()},next:function(){var e=this.get("animations"),t=this.get("index");if(t>=e.length){this.finish();return}var n=e[t],r=n.get("duration");n.run(),this.set("index",t+1),setTimeout(u.bind(function(){this.next()},this),r)}});n.Animation=l,n.AnimationQueue=c}),e("/src/js/visuals/animation/index.js"),e.define("/src/js/visuals/index.js",function(e,t,n,r,i,s,o){function w(t){t=t||{},this.options=t,this.commitCollection=t.commitCollection,this.branchCollection=t.branchCollection,this.visNodeMap={},this.visEdgeCollection=new b,this.visBranchCollection=new g,this.commitMap={},this.rootCommit=null,this.branchStackMap=null,this.upstreamBranchSet=null,this.upstreamHeadSet=null,this.paper=t.paper,this.gitReady=!1,this.branchCollection.on("add",this.addBranchFromEvent,this),this.branchCollection.on("remove",this.removeBranch,this),this.deferred=[],this.posBoundaries={min:0,max:1};var n=e("../app");n.getEvents().on("refreshTree",this.refreshTree,this)}function E(e){var t=0,n=0,r=0,i=0,s=e.length;u.each(e,function(e){var s=e.split("(")[1];s=s.split(")")[0],s=s.split(","),r+=parseFloat(s[1]),i+=parseFloat(s[2]);var o=parseFloat(s[0]),u=o*Math.PI*2;t+=Math.cos(u),n+=Math.sin(u)}),t/=s,n/=s,r/=s,i/=s;var o=Math.atan2(n,t)/(Math.PI*2);return o<0&&(o+=1),"hsb("+String(o)+","+String(r)+","+String(i)+")"}var u=e("underscore"),a=e("q"),f=e("backbone"),l=e("../util/constants").GRAPHICS,c=e("../util/constants").GLOBAL,h=e("../models/collections"),p=h.CommitCollection,d=h.BranchCollection,v=e("../visuals/visNode").VisNode,m=e("../visuals/visBranch").VisBranch,g=e("../visuals/visBranch").VisBranchCollection,y=e("../visuals/visEdge").VisEdge,b=e("../visuals/visEdge").VisEdgeCollection;w.prototype.defer=function(e){this.deferred.push(e)},w.prototype.deferFlush=function(){u.each(this.deferred,function(e){e()},this),this.deferred=[]},w.prototype.resetAll=function(){var e=this.visEdgeCollection.toArray();u.each(e,function(e){e.remove()},this);var t=this.visBranchCollection.toArray();u.each(t,function(e){e.remove()},this),u.each(this.visNodeMap,function(e){e.remove()},this),this.visEdgeCollection.reset(),this.visBranchCollection.reset(),this.visNodeMap={},this.rootCommit=null,this.commitMap={}},w.prototype.tearDown=function(){this.resetAll(),this.paper.remove()},w.prototype.assignGitEngine=function(e){this.gitEngine=e,this.initHeadBranch(),this.deferFlush()},w.prototype.initHeadBranch=function(){this.addBranchFromEvent(this.gitEngine.HEAD)},w.prototype.getScreenPadding=function(){return{widthPadding:l.nodeRadius*1.5,heightPadding:l.nodeRadius*1.5}},w.prototype.toScreenCoords=function(e){if(!this.paper.width)throw new Error("being called too early for screen coords");var t=this.getScreenPadding(),n=function(e,t,n){return n+e*(t-n*2)};return{x:n(e.x,this.paper.width,t.widthPadding),y:n(e.y,this.paper.height,t.heightPadding)}},w.prototype.animateAllAttrKeys=function(e,t,n,r){var i=a.defer(),s=function(i){i.animateAttrKeys(e,t,n,r)};this.visBranchCollection.each(s),this.visEdgeCollection.each(s),u.each(this.visNodeMap,s);var o=n!==undefined?n:l.defaultAnimationTime;return setTimeout(function(){i.resolve()},o),i.promise},w.prototype.finishAnimation=function(){var e=this,t=a.defer(),n=a.defer(),r=l.defaultAnimationTime,i=l.nodeRadius,s="Solved!!\n:D",o=null,f=u.bind(function(){o=this.paper.text(this.paper.width/2,this.paper.height/2,s),o.attr({opacity:0,"font-weight":500,"font-size":"32pt","font-family":"Monaco, Courier, font-monospace",stroke:"#000","stroke-width":2,fill:"#000"}),o.animate({opacity:1},r)},this);return t.promise.then(u.bind(function(){return this.animateAllAttrKeys({exclude:["circle"]},{opacity:0},r*1.1)},this)).then(u.bind(function(){return this.animateAllAttrKeys({exclude:["arrow","rect","path","text"]},{r:i*2},r*1.5)},this)).then(u.bind(function(){return this.animateAllAttrKeys({exclude:["arrow","rect","path","text"]},{r:i*.75},r*.5)},this)).then(u.bind(function(){return f(),this.explodeNodes()},this)).then(u.bind(function(){return this.explodeNodes()},this)).then(u.bind(function(){return this.animateAllAttrKeys({exclude:["arrow","rect","path","text"]},{},r*1.25)},this)).then(u.bind(function(){return o.animate({opacity:0},r,undefined,undefined,function(){o.remove()}),this.animateAllAttrKeys({},{})},this)).then(function(){n.resolve()}).fail(function(e){console.warn("animation error"+e)}).done(),t.resolve(),n.promise},w.prototype.explodeNodes=function(){var e=a.defer(),t=[];u.each(this.visNodeMap,function(e){t.push(e.getExplodeStepFunc())});var n=setInterval(function(){var r=[];u.each(t,function(e){e()&&r.push(e)});if(!r.length){clearInterval(n),e.resolve();return}t=r},.025);return e.promise},w.prototype.animateAllFromAttrToAttr=function(e,t,n){var r=function(r){var i=r.getID();if(u.include(n,i))return;if(!e[i]||!t[i])return;r.animateFromAttrToAttr(e[i],t[i])};this.visBranchCollection.each(r),this.visEdgeCollection.each(r),u.each(this.visNodeMap,r)},w.prototype.genSnapshot=function(){this.fullCalc();var e={};return u.each(this.visNodeMap,function(t){e[t.get("id")]=t.getAttributes()},this),this.visBranchCollection.each(function(t){e[t.getID()]=t.getAttributes()},this),this.visEdgeCollection.each(function(t){e[t.getID()]=t.getAttributes()},this),e},w.prototype.refreshTree=function(e){if(!this.gitReady||!this.gitEngine.rootCommit)return;this.fullCalc(),this.animateAll(e)},w.prototype.refreshTreeHarsh=function(){this.fullCalc(),this.animateAll(0)},w.prototype.animateAll=function(e){this.zIndexReflow(),this.animateEdges(e),this.animateNodePositions(e),this.animateRefs(e)},w.prototype.fullCalc=function(){this.calcTreeCoords(),this.calcGraphicsCoords()},w.prototype.calcTreeCoords=function(){if(!this.rootCommit)throw new Error("grr, no root commit!");this.calcUpstreamSets(),this.calcBranchStacks(),this.calcDepth(),this.calcWidth()},w.prototype.calcGraphicsCoords=function(){this.visBranchCollection.each(function(e){e.updateName()})},w.prototype.calcUpstreamSets=function(){this.upstreamBranchSet=this.gitEngine.getUpstreamBranchSet(),this.upstreamHeadSet=this.gitEngine.getUpstreamHeadSet()},w.prototype.getCommitUpstreamBranches=function(e){return this.branchStackMap[e.get("id")]},w.prototype.getBlendedHuesForCommit=function(e){var t=this.upstreamBranchSet[e.get("id")];if(!t)throw new Error("that commit doesnt have upstream branches!");return this.blendHuesFromBranchStack(t)},w.prototype.blendHuesFromBranchStack=function(e){var t=[];return u.each(e,function(e){var n=e.obj.get("visBranch").get("fill");if(n.slice(0,3)!=="hsb"){var r=Raphael.color(n);n="hsb("+String(r.h)+","+String(r.l),n=n+","+String(r.s)+")"}t.push(n)}),E(t)},w.prototype.getCommitUpstreamStatus=function(e){if(!this.upstreamBranchSet)throw new Error("Can't calculate this yet!");var t=e.get("id"),n=this.upstreamBranchSet,r=this.upstreamHeadSet;return n[t]?"branch":r[t]?"head":"none"},w.prototype.calcBranchStacks=function(){var e=this.gitEngine.getBranches(),t={};u.each(e,function(e){var n=e.target.get("id");t[n]=t[n]||[],t[n].push(e),t[n].sort(function(e,t){var n=e.obj.get("id"),r=t.obj.get("id");return n=="master"||r=="master"?n=="master"?-1:1:n.localeCompare(r)})}),this.branchStackMap=t},w.prototype.calcWidth=function(){this.maxWidthRecursive(this.rootCommit),this.assignBoundsRecursive(this.rootCommit,this.posBoundaries.min,this.posBoundaries.max)},w.prototype.maxWidthRecursive=function(e){var t=0;u.each(e.get("children"),function(n){if(n.isMainParent(e)){var r=this.maxWidthRecursive(n);t+=r}},this);var n=Math.max(1,t);return e.get("visNode").set("maxWidth",n),n},w.prototype.assignBoundsRecursive=function(e,t,n){var r=(t+n)/2;e.get("visNode").get("pos").x=r;if(e.get("children").length===0)return;var i=n-t,s=0,o=e.get("children");u.each(o,function(t){t.isMainParent(e)&&(s+=t.get("visNode").getMaxWidthScaled())},this);var a=t;u.each(o,function(t){if(!t.isMainParent(e))return;var n=t.get("visNode").getMaxWidthScaled(),r=n/s*i,o=a,u=o+r;this.assignBoundsRecursive(t,o,u),a=u},this)},w.prototype.calcDepth=function(){var e=this.calcDepthRecursive(this.rootCommit,0);e>15&&console.warn("graphics are degrading from too many layers");var t=this.getDepthIncrement(e);u.each(this.visNodeMap,function(e){e.setDepthBasedOn(t)},this)},w.prototype.animateNodePositions=function(e){u.each(this.visNodeMap,function(t){t.animateUpdatedPosition(e)},this)},w.prototype.addBranchFromEvent=function(e,t,n){var r=u.bind(function(){this.addBranch(e)},this);!this.gitEngine||!this.gitReady?this.defer(r):r()},w.prototype.addBranch=function(e){var t=new m({branch:e,gitVisuals:this,gitEngine:this.gitEngine});this.visBranchCollection.add(t),this.gitReady?t.genGraphics(this.paper):this.defer(u.bind(function(){t.genGraphics(this.paper)},this))},w.prototype.removeVisBranch=function(e){this.visBranchCollection.remove(e)},w.prototype.removeVisNode=function(e){this.visNodeMap[e.getID()]=undefined},w.prototype.removeVisEdge=function(e){this.visEdgeCollection.remove(e)},w.prototype.animateRefs=function(e){this.visBranchCollection.each(function(t){t.animateUpdatedPos(e)},this)},w.prototype.animateEdges=function(e){this.visEdgeCollection.each(function(t){t.animateUpdatedPath(e)},this)},w.prototype.getMinLayers=function(){return this.options.smallCanvas?4:7},w.prototype.getDepthIncrement=function(e){e=Math.max(e,this.getMinLayers());var t=1/e;return t},w.prototype.calcDepthRecursive=function(e,t){e.get("visNode").setDepth(t);var n=e.get("children"),r=t;return u.each(n,function(e){var n=this.calcDepthRecursive(e,t+1);r=Math.max(n,r)},this),r},w.prototype.canvasResize=function(e,t){this.resizeFunc||this.genResizeFunc(),this.resizeFunc(e,t)},w.prototype.genResizeFunc=function(){this.resizeFunc=u.debounce(u.bind(function(t,n){if(c.isAnimating){var r=e("../app");r.getEventBaton().trigger("commandSubmitted","refresh")}else this.refreshTree()},this),200,!0)},w.prototype.addNode=function(e,t){this.commitMap[e]=t,t.get("rootCommit")&&(this.rootCommit=t);var n=new v({id:e,commit:t,gitVisuals:this,gitEngine:this.gitEngine});return this.visNodeMap[e]=n,this.gitReady&&n.genGraphics(this.paper),n},w.prototype.addEdge=function(e,t){var n=this.visNodeMap[e],r=this.visNodeMap[t];if(!n||!r)throw new Error("one of the ids in ("+e+", "+t+") does not exist");var i=new y({tail:n,head:r,gitVisuals:this,gitEngine:this.gitEngine});this.visEdgeCollection.add(i),this.gitReady&&i.genGraphics(this.paper)},w.prototype.zIndexReflow=function(){this.visNodesFront(),this.visBranchesFront()},w.prototype.visNodesFront=function(){u.each(this.visNodeMap,function(e){e.toFront()})},w.prototype.visBranchesFront=function(){this.visBranchCollection.each(function(e){e.nonTextToFront(),e.textToFront()}),this.visBranchCollection.each(function(e){e.textToFrontIfInStack()})},w.prototype.drawTreeFromReload=function(){this.gitReady=!0,this.deferFlush(),this.calcTreeCoords()},w.prototype.drawTreeFirstTime=function(){this.gitReady=!0,this.calcTreeCoords(),u.each(this.visNodeMap,function(e){e.genGraphics(this.paper)},this),this.visEdgeCollection.each(function(e){e.genGraphics(this.paper)},this),this.visBranchCollection.each(function(e){e.genGraphics(this.paper)},this),this.zIndexReflow()},n.GitVisuals=w}),e("/src/js/visuals/index.js"),e.define("/src/js/visuals/tree.js",function(e,t,n,r,i,s,o){var u=e("underscore"),a=e("backbone"),f=a.Model.extend({removeKeys:function(e){u.each(e,function(e){this.get(e)&&this.get(e).remove()},this)},animateAttrKeys:function(e,t,n,r){e=u.extend({},{include:["circle","arrow","rect","path","text"],exclude:[]},e||{});var i=this.getAttributes();u.each(e.include,function(e){i[e]=u.extend({},i[e],t)}),u.each(e.exclude,function(e){delete i[e]}),this.animateToAttr(i,n,r)}});n.VisBase=f}),e("/src/js/visuals/tree.js"),e.define("/src/js/visuals/visBase.js",function(e,t,n,r,i,s,o){var u=e("underscore"),a=e("backbone"),f=a.Model.extend({removeKeys:function(e){u.each(e,function(e){this.get(e)&&this.get(e).remove()},this)},animateAttrKeys:function(e,t,n,r){e=u.extend({},{include:["circle","arrow","rect","path","text"],exclude:[]},e||{});var i=this.getAttributes();u.each(e.include,function(e){i[e]=u.extend({},i[e],t)}),u.each(e.exclude,function(e){delete i[e]}),this.animateToAttr(i,n,r)}});n.VisBase=f}),e("/src/js/visuals/visBase.js"),e.define("/src/js/visuals/visBranch.js",function(e,t,n,r,i,s,o){var u=e("underscore"),a=e("backbone"),f=e("../util/constants").GRAPHICS,l=e("../visuals/visBase").VisBase,c=function(){var e=Math.random(),t="hsb("+String(e)+",0.7,1)";return t},h=l.extend({defaults:{pos:null,text:null,rect:null,arrow:null,isHead:!1,flip:1,fill:f.rectFill,stroke:f.rectStroke,"stroke-width":f.rectStrokeWidth,offsetX:f.nodeRadius*4.75,offsetY:0,arrowHeight:14,arrowInnerSkew:0,arrowEdgeHeight:6,arrowLength:14,arrowOffsetFromCircleX:10,vPad:5,hPad:5,animationSpeed:f.defaultAnimationTime,animationEasing:f.defaultEasing},validateAtInit:function(){if(!this.get("branch"))throw new Error("need a branch!")},getID:function(){return this.get("branch").get("id")},initialize:function(){this.validateAtInit(),this.gitVisuals=this.get("gitVisuals"),this.gitEngine=this.get("gitEngine");if(!this.gitEngine)throw new Error("asd wtf");this.get("branch").set("visBranch",this);var e=this.get("branch").get("id");e=="HEAD"?(this.set("isHead",!0),this.set("flip",-1),this.set("fill",f.headRectFill)):e!=="master"&&this.set("fill",c())},getCommitPosition:function(){var e=this.gitEngine.getCommitFromRef(this.get("branch")),t=e.get("visNode"),n=this.get("gitVisuals").posBoundaries.max;return t.get("pos").x>n?this.set("flip",-1):this.set("flip",1),t.getScreenCoords()},getBranchStackIndex:function(){if(this.get("isHead"))return 0;var e=this.getBranchStackArray(),t=-1;return u.each(e,function(e,n){e.obj==this.get("branch")&&(t=n)},this),t},getBranchStackLength:function(){return this.get("isHead")?1:this.getBranchStackArray().length},getBranchStackArray:function(){var e=this.gitVisuals.branchStackMap[this.get("branch").get("target").get("id")];return e===undefined?(this.gitVisuals.calcBranchStacks(),this.getBranchStackArray()):e},getTextPosition:function(){var e=this.getCommitPosition(),t=this.getBranchStackIndex();return{x:e.x+this.get("flip")*this.get("offsetX"),y:e.y+t*f.multiBranchY+this.get("offsetY")}},getRectPosition:function(){var e=this.getTextPosition(),t=this.get("flip"),n=this.getTextSize();return{x:e.x-.5*n.w-this.get("hPad"),y:e.y-.5*n.h-this.get("vPad")}},getArrowPath:function(){var e=function(e,t,n){return{x:e.x+t,y:e.y+n}},t=function(e){return String(Math.round(e.x))+","+String(Math.round(e.y))},n=this.get("flip"),r=e(this.getCommitPosition(),n*this.get("arrowOffsetFromCircleX"),0),i=e(r,n*this.get("arrowLength"),-this.get("arrowHeight")),s=e(r,n*this.get("arrowLength"),this.get("arrowHeight")),o=e(i,n*this.get("arrowInnerSkew"),this.get("arrowEdgeHeight")),a=e(s,n*this.get("arrowInnerSkew"),-this.get("arrowEdgeHeight")),f=49,l=e(o,n*f,0),c=e(a,n*f,0),h="";h+="M"+t(l)+" ";var p=[o,i,r,s,a,c];return u.each(p,function(e){h+="L"+t(e)+" "},this),h+="z",h},getTextSize:function(){var e=function(e){var t=e.get("text")?e.get("text").node:null;return t===null?0:t.clientWidth},t=function(e){return e.w||(e.w=75),e.h||(e.h=20),e},n=this.get("text").node;if(this.get("isHead"))return t({w:n.clientWidth,h:n.clientHeight});var r=0;return u.each(this.getBranchStackArray(),function(t){r=Math.max(r,e(t.obj.get("visBranch")))}),t({w:r,h:n.clientHeight})},getSingleRectSize:function(){var e=this.getTextSize(),t=this.get("vPad"),n=this.get("hPad");return{w:e.w+t*2,h:e.h+n*2}},getRectSize:function(){var e=this.getTextSize(),t=this.get("vPad"),n=this.get("hPad"),r=this.getBranchStackLength();return{w:e.w+t*2,h:e.h*r*1.1+n*2}},getName:function(){var e=this.get("branch").get("id"),t=this.gitEngine.HEAD.get("target").get("id"),n=t==e?"*":"";return e+n},nonTextToFront:function(){this.get("arrow").toFront(),this.get("rect").toFront()},textToFront:function(){this.get("text").toFront()},textToFrontIfInStack:function(){this.getBranchStackIndex()!==0&&this.get("text").toFront()},getFill:function(){return this.get("isHead")||this.getBranchStackLength()==1||this.getBranchStackIndex()!==0?this.get("fill"):this.gitVisuals.blendHuesFromBranchStack(this.getBranchStackArray())},remove:function(){this.removeKeys(["text","arrow","rect"]),this.gitVisuals.removeVisBranch(this)},genGraphics:function(e){var t=this.getTextPosition(),n=this.getName(),r;r=e.text(t.x,t.y,String(n)),r.attr({"font-size":14,"font-family":"Monaco, Courier, font-monospace",opacity:this.getTextOpacity()}),this.set("text",r);var i=this.getRectPosition(),s=this.getRectSize(),o=e.rect(i.x,i.y,s.w,s.h,8).attr(this.getAttributes().rect);this.set("rect",o);var u=this.getArrowPath(),a=e.path(u).attr(this.getAttributes().arrow);this.set("arrow",a),this.attachClickHandlers(),o.toFront(),r.toFront()},attachClickHandlers:function(){if(this.get("gitVisuals").options.noClick)return;var t="git checkout "+this.get("branch").get("id"),n=e("../app"),r=[this.get("rect"),this.get("text"),this.get("arrow")];u.each(r,function(e){e.click(function(){n.getEventBaton().trigger("commandSubmitted",t)}),$(e.node).css("cursor","pointer")})},updateName:function(){this.get("text").attr({text:this.getName()})},getNonTextOpacity:function(){return this.get("isHead")?this.gitEngine.getDetachedHead()?1:0:this.getBranchStackIndex()===0?1:0},getTextOpacity:function(){return this.get("isHead")?this.gitEngine.getDetachedHead()?1:0:1},getAttributes:function(){var e=this.getNonTextOpacity(),t=this.getTextOpacity();this.updateName();var n=this.getTextPosition(),r=this.getRectPosition(),i=this.getRectSize(),s=this.getArrowPath();return{text:{x:n.x,y:n.y,opacity:t},rect:{x:r.x,y:r.y,width:i.w,height:i.h,opacity:e,fill:this.getFill(),stroke:this.get("stroke"),"stroke-width":this.get("stroke-width")},arrow:{path:s,opacity:e,fill:this.getFill(),stroke:this.get("stroke"),"stroke-width":this.get("stroke-width")}}},animateUpdatedPos:function(e,t){var n=this.getAttributes();this.animateToAttr(n,e,t)},animateFromAttrToAttr:function(e,t,n,r){this.animateToAttr(e,0),this.animateToAttr(t,n,r)},animateToAttr:function(e,t,n){if(t===0){this.get("text").attr(e.text),this.get("rect").attr(e.rect),this.get("arrow").attr(e.arrow);return}var r=t!==undefined?t:this.get("animationSpeed"),i=n||this.get("animationEasing");this.get("text").stop().animate(e.text,r,i),this.get("rect").stop().animate(e.rect,r,i),this.get("arrow").stop().animate(e.arrow,r,i)}}),p=a.Collection.extend({model:h});n.VisBranchCollection=p,n.VisBranch=h,n.randomHueString=c}),e("/src/js/visuals/visBranch.js"),e.define("/src/js/visuals/visEdge.js",function(e,t,n,r,i,s,o){var u=e("underscore"),a=e("backbone"),f=e("../util/constants").GRAPHICS,l=e("../visuals/visBase").VisBase,c=l.extend({defaults:{tail:null,head:null,animationSpeed:f.defaultAnimationTime,animationEasing:f.defaultEasing},validateAtInit:function(){var e=["tail","head"];u.each(e,function(e){if(!this.get(e))throw new Error(e+" is required!")},this)},getID:function(){return this.get("tail").get("id")+"."+this.get("head").get("id")},initialize:function(){this.validateAtInit(),this.gitVisuals=this.get("gitVisuals"),this.gitEngine=this.get("gitEngine"),this.get("tail").get("outgoingEdges").push(this)},remove:function(){this.removeKeys(["path"]),this.gitVisuals.removeVisEdge(this)},genSmoothBezierPathString:function(e,t){var n=e.getScreenCoords(),r=t.getScreenCoords();return this.genSmoothBezierPathStringFromCoords(n,r)},genSmoothBezierPathStringFromCoords:function(e,t){var n=function(e){return String(Math.round(e.x))+","+String(Math.round(e.y))},r=function(e,t,n){return n=n||f.curveControlPointOffset,{x:e.x,y:e.y+n*t}},i=function(e,t,n){return{x:e.x+t,y:e.y+n}};e=r(e,-1,this.get("tail").getRadius()),t=r(t,1,this.get("head").getRadius());var s="";s+="M"+n(e)+" ",s+="C",s+=n(r(e,-1))+" ",s+=n(r(t,1))+" ",s+=n(t);var o=f.arrowHeadSize||10;return s+=" L"+n(i(t,-o,o)),s+=" L"+n(i(t,o,o)),s+=" L"+n(t),s+="C",s+=n(r(t,1))+" ",s+=n(r(e,-1))+" ",s+=n(e),s},getBezierCurve:function(){return this.genSmoothBezierPathString(this.get("tail"),this.get("head"))},getStrokeColor:function(){return f.visBranchStrokeColorNone},setOpacity:function(e){e=e===undefined?1:e,this.get("path").attr({opacity:e})},genGraphics:function(e){var t=this.getBezierCurve(),n=e.path(t).attr({"stroke-width":f.visBranchStrokeWidth,stroke:this.getStrokeColor(),"stroke-linecap":"round","stroke-linejoin":"round",fill:this.getStrokeColor()});n.toBack(),this.set("path",n)},getOpacity:function(){var e=this.gitVisuals.getCommitUpstreamStatus(this.get("tail")),t={branch:1,head:f.edgeUpstreamHeadOpacity,none:f.edgeUpstreamNoneOpacity};if(t[e]===undefined)throw new Error("bad stat");return t[e]},getAttributes:function(){var e=this.getBezierCurve(),t=this.getOpacity();return{path:{path:e,opacity:t}}},animateUpdatedPath:function(e,t){var n=this.getAttributes();this.animateToAttr(n,e,t)},animateFromAttrToAttr:function(e,t,n,r){this.animateToAttr(e,0),this.animateToAttr(t,n,r)},animateToAttr:function(e,t,n){if(t===0){this.get("path").attr(e.path);return}this.get("path").toBack(),this.get("path").stop().animate(e.path,t!==undefined?t:this.get("animationSpeed"),n||this.get("animationEasing"))}}),h=a.Collection.extend({model:c});n.VisEdgeCollection=h,n.VisEdge=c}),e("/src/js/visuals/visEdge.js"),e.define("/src/js/visuals/visNode.js",function(e,t,n,r,i,s,o){var u=e("underscore"),a=e("backbone"),f=e("../util/constants").GRAPHICS,l=e("../visuals/visBase").VisBase,c=l.extend({defaults:{depth:undefined,maxWidth:null,outgoingEdges:null,circle:null,text:null,id:null,pos:null,radius:null,commit:null,animationSpeed:f.defaultAnimationTime,animationEasing:f.defaultEasing,fill:f.defaultNodeFill,"stroke-width":f.defaultNodeStrokeWidth,stroke:f.defaultNodeStroke},getID:function(){return this.get("id")},validateAtInit:function(){if(!this.get("id"))throw new Error("need id for mapping");if(!this.get("commit"))throw new Error("need commit for linking");this.get("pos")||this.set("pos",{x:Math.random(),y:Math.random()})},initialize:function(){this.validateAtInit(),this.gitVisuals=this.get("gitVisuals"),this.gitEngine=this.get("gitEngine"),this.set("outgoingEdges",[])},setDepth:function(e){this.set("depth",Math.max(this.get("depth")||0,e))},setDepthBasedOn:function(e){if(this.get("depth")===undefined){debugger;throw new Error("no depth yet!")}var t=this.get("pos");t.y=this.get("depth")*e},getMaxWidthScaled:function(){var e=this.gitVisuals.getCommitUpstreamStatus(this.get("commit")),t={branch:1,head:.3,none:.1};if(t[e]===undefined)throw new Error("bad stat");return t[e]*this.get("maxWidth")},toFront:function(){this.get("circle").toFront(),this.get("text").toFront()},getOpacity:function(){var e={branch:1,head:f.upstreamHeadOpacity,none:f.upstreamNoneOpacity},t=this.gitVisuals.getCommitUpstreamStatus(this.get("commit"));if(e[t]===undefined)throw new Error("invalid status");return e[t]},getTextScreenCoords:function(){return this.getScreenCoords()},getAttributes:function(){var e=this.getScreenCoords(),t=this.getTextScreenCoords(),n=this.getOpacity();return{circle:{cx:e.x,cy:e.y,opacity:n,r:this.getRadius(),fill:this.getFill(),"stroke-width":this.get("stroke-width"),stroke:this.get("stroke")},text:{x:t.x,y:t.y,opacity:n}}},highlightTo:function(e,t,n){var r=e.get("fill"),i={circle:{fill:r,stroke:r,"stroke-width":this.get("stroke-width")*5},text:{}};this.animateToAttr(i,t,n)},animateUpdatedPosition:function(e,t){var n=this.getAttributes();this.animateToAttr(n,e,t)},animateFromAttrToAttr:function(e,t,n,r){this.animateToAttr(e,0),this.animateToAttr(t,n,r)},animateToSnapshot:function(e,t,n){if(!e[this.getID()])return;this.animateToAttr(e[this.getID()],t,n)},animateToAttr:function(e,t,n){if(t===0){this.get("circle").attr(e.circle),this.get("text").attr(e.text);return}var r=t!==undefined?t:this.get("animationSpeed"),i=n||this.get("animationEasing");this.get("circle").stop().animate(e.circle,r,i),this.get("text").stop().animate(e.text,r,i),n=="bounce"&&e.circle&&e.circle.cx!==undefined&&e.text&&e.text.x!==undefined&&(this.get("circle").animate(e.circle.cx,r,"easeInOut"),this.get("text").animate(e.text.x,r,"easeInOut"))},getScreenCoords:function(){var e=this.get("pos");return this.gitVisuals.toScreenCoords(e)},getRadius:function(){return this.get("radius")||f.nodeRadius},getParentScreenCoords:function(){return this.get("commit").get("parents")[0].get("visNode").getScreenCoords()},setBirthPosition:function(){var e=this.getParentScreenCoords();this.get("circle").attr({cx:e.x,cy:e.y,opacity:0,r:0}),this.get("text").attr({x:e.x,y:e.y,opacity:0})},setBirthFromSnapshot:function(e){var t=this.get("commit").get("parents")[0].get("visNode").getID(),n=e[t];this.get("circle").attr({opacity:0,r:0,cx:n.circle.cx,cy:n.circle.cy}),this.get("text").attr({opacity:0,x:n.text.x,y:n.text.y});var r={x:n.circle.cx,y:n.circle.cy};this.setOutgoingEdgesBirthPosition(r)},setBirth:function(){this.setBirthPosition(),this.setOutgoingEdgesBirthPosition(this.getParentScreenCoords())},setOutgoingEdgesOpacity:function(e){u.each(this.get("outgoingEdges"),function(t){t.setOpacity(e)})},animateOutgoingEdgesToAttr:function(e,t,n){u.each(this.get("outgoingEdges"),function(t){var n=e[t.getID()];t.animateToAttr(n)},this)},animateOutgoingEdges:function(e,t){u.each(this.get("outgoingEdges"),function(n){n.animateUpdatedPath(e,t)},this)},animateOutgoingEdgesFromSnapshot:function(e,t,n){u.each(this.get("outgoingEdges"),function(r){var i=e[r.getID()];r.animateToAttr(i,t,n)},this)},setOutgoingEdgesBirthPosition:function(e){u.each(this.get("outgoingEdges"),function(t){var n=t.get("head").getScreenCoords(),r=t.genSmoothBezierPathStringFromCoords(e,n);t.get("path").stop().attr({path:r,opacity:0})},this)},parentInFront:function(){this.get("commit").get("parents")[0].get("visNode").toFront()},getFontSize:function(e){return e.length<3?12:e.length<5?10:8},getFill:function(){var e=this.gitVisuals.getCommitUpstreamStatus(this.get("commit"));return e=="head"?f.headRectFill:e=="none"?f.orphanNodeFill:this.gitVisuals.getBlendedHuesForCommit(this.get("commit"))},attachClickHandlers:function(){if(this.get("gitVisuals").options.noClick)return;var t="git checkout "+this.get("commit").get("id"),n=e("../app");u.each([this.get("circle"),this.get("text")],function(e){e.click(function(){n.getEventBaton().trigger("commandSubmitted",t)}),$(e.node).css("cursor","pointer")})},setOpacity:function(e){e=e===undefined?1:e;var t=["circle","text"];u.each(t,function(t){this.get(t).attr({opacity:e})},this)},remove:function(){this.removeKeys(["circle"],["text"]);var e=this.get("text");e&&e.remove(),this.gitVisuals.removeVisNode(this)},removeAll:function(){this.remove(),u.each(this.get("outgoingEdges"),function(e){e.remove()},this)},getExplodeStepFunc:function(){var e=this.get("circle"),t=20,n=Math.PI+Math.random()*1*Math.PI,r=.2,i=.01,s=t*Math.cos(n),o=t*Math.sin(n),u=e.attr("cx"),a=e.attr("cy"),f=this.gitVisuals.paper.width,l=this.gitVisuals.paper.height,c=.8,h=1,p=function(){o+=r*h-i*o,s-=i*s,u+=s*h,a+=o*h;if(u<0||u>f)s=c*-s,u=u<0?0:f;if(a<0||a>l)o=c*-o,a=a<0?0:l;return e.attr({cx:u,cy:a}),s*s+o*o<.01&&Math.abs(a-l)===0?!1:!0};return p},genGraphics:function(){var e=this.gitVisuals.paper,t=this.getScreenCoords(),n=this.getTextScreenCoords(),r=e.circle(t.x,t.y,this.getRadius()).attr(this.getAttributes().circle),i=e.text(n.x,n.y,String(this.get("id")));i.attr({"font-size":this.getFontSize(this.get("id")),"font-weight":"bold","font-family":"Monaco, Courier, font-monospace",opacity:this.getOpacity()}),this.set("circle",r),this.set("text",i),this.attachClickHandlers()}});n.VisNode=c}),e("/src/js/visuals/visNode.js"),e.define("/src/js/visuals/visualization.js",function(e,t,n,r,i,s,o){var u=e("underscore"),a=e("../util").isBrowser()?a=window.Backbone:a=e("backbone"),f=e("../models/collections"),l=f.CommitCollection,c=f.BranchCollection,h=e("../util/eventBaton").EventBaton,p=e("../visuals").GitVisuals,d=a.View.extend({initialize:function(e){e=e||{},this.options=e,this.customEvents=u.clone(a.Events),this.containerElement=e.containerElement;var t=this,n=e.containerElement||$("#canvasHolder")[0];new Raphael(n,200,200,function(){var n=this;s.nextTick(function(){t.paperInitialize(n,e)})})},paperInitialize:function(t,n){this.treeString=n.treeString,this.paper=t;var r=e("../app");this.eventBaton=n.noKeyboardInput?new h:r.getEventBaton(),this.commitCollection=new l,this.branchCollection=new c,this.gitVisuals=new p({commitCollection:this.commitCollection,branchCollection:this.branchCollection,paper:this.paper,noClick:this.options.noClick,smallCanvas:this.options.smallCanvas});var i=e("../git").GitEngine;this.gitEngine=new i({collection:this.commitCollection,branches:this.branchCollection,gitVisuals:this.gitVisuals,eventBaton:this.eventBaton}),this.gitEngine.init(),this.gitVisuals.assignGitEngine(this.gitEngine),this.myResize(),$(window).on("resize",u.bind(function(){this.myResize()},this)),this.gitVisuals.drawTreeFirstTime(),this.treeString&&this.gitEngine.loadTreeFromString(this.treeString),this.options.zIndex&&this.setTreeIndex(this.options.zIndex),this.shown=!1,this.setTreeOpacity(0),s.nextTick(u.bind(this.fadeTreeIn,this)),this.customEvents.trigger("gitEngineReady"),this.customEvents.trigger("paperReady")},setTreeIndex:function(e){$(this.paper.canvas).css("z-index",e)},setTreeOpacity:function(e){e===0&&(this.shown=!1),$(this.paper.canvas).css("opacity",e)},getAnimationTime:function(){return 300},fadeTreeIn:function(){this.shown=!0,$(this.paper.canvas).animate({opacity:1},this.getAnimationTime())},fadeTreeOut:function(){this.shown=!1,$(this.paper.canvas).animate({opacity:0},this.getAnimationTime())},hide:function(){this.fadeTreeOut(),setTimeout(u.bind(function(){$(this.paper.canvas).css("visibility","hidden")},this),this.getAnimationTime())},show:function(){$(this.paper.canvas).css("visibility","visible"),setTimeout(u.bind(this.fadeTreeIn,this),10)},showHarsh:function(){$(this.paper.canvas).css("visibility","visible"),this.setTreeOpacity(1)},resetFromThisTreeNow:function(e){this.treeString=e},reset:function(){this.setTreeOpacity(0),this.treeString?this.gitEngine.loadTreeFromString(this.treeString):this.gitEngine.defaultInit(),this.fadeTreeIn()},tearDown:function(){this.gitEngine.tearDown(),this.gitVisuals.tearDown(),delete this.paper},die:function(){this.fadeTreeOut(),setTimeout(u.bind(function(){this.shown||this.tearDown()},this),this.getAnimationTime())},myResize:function(){if(!this.paper)return;var e=1,t=this.el,n=t.clientWidth-e,r=t.clientHeight-e;if(!this.containerElement){var i=t.offsetLeft,s=t.offsetTop;$(this.paper.canvas).css({position:"absolute",left:i+"px",top:s+"px"})}this.paper.setSize(n,r),this.gitVisuals.canvasResize(n,r)}});n.Visualization=d}),e("/src/js/visuals/visualization.js"),e.define("/src/levels/index.js",function(e,t,n,r,i,s,o){n.levelSequences={intro:[e("../../levels/intro/1").level,e("../../levels/intro/2").level,e("../../levels/intro/3").level,e("../../levels/intro/4").level,e("../../levels/intro/5").level],rebase:[e("../../levels/rebase/1").level,e("../../levels/rebase/2").level],mixed:[e("../../levels/mixed/1").level,e("../../levels/mixed/2").level,e("../../levels/mixed/3").level]},n.sequenceInfo={intro:{displayName:"Introduction Sequence",about:"A nicely paced introduction to the majority of git commands"},rebase:{displayName:"Master the Rebase Luke!",about:"What is this whole rebase hotness everyone is talking about? Find out!"},mixed:{displayName:"A Mixed Bag",about:"A mixed bag of Git techniques, tricks, and tips"}}}),e("/src/levels/index.js"),e.define("/src/levels/intro/1.js",function(e,t,n,r,i,s,o){n.level={name:"Introduction to Git Commits",goalTreeString:'{"branches":{"master":{"target":"C3","id":"master"}},"commits":{"C0":{"parents":[],"id":"C0","rootCommit":true},"C1":{"parents":["C0"],"id":"C1"},"C2":{"parents":["C1"],"id":"C2"},"C3":{"parents":["C2"],"id":"C3"}},"HEAD":{"target":"master","id":"HEAD"}}',solutionCommand:"git commit;git commit",startTree:'{"branches":{"master":{"target":"C1","id":"master"}},"commits":{"C0":{"parents":[],"id":"C0","rootCommit":true},"C1":{"parents":["C0"],"id":"C1"}},"HEAD":{"target":"master","id":"HEAD"}}',hint:"Just type in 'git commit' twice to finish!",disabledMap:{"git revert":!0},startDialog:{childViews:[{type:"ModalAlert",options:{markdowns:["## Git Commits","A commit in a git repository records a snapshot of all the files in your directory. It's like a giant copy and paste, but even better!","","Git wants to keep commits as lightweight as possible though, so it doesn't just copy the entire directory every time you commit. It actually stores each commit as a set of changes, or a \"delta\", from one version of the repository to the next. That's why most commits have a parent commit above them -- you'll see this later in our visualizations.","",'In order to clone a repository, you have to unpack or "resolve" all these deltas. That\'s why you might see the command line output:',"","`resolving deltas`","","when cloning a repo.","","It's a lot to take in, but for now you can think of commits as snapshots of the project. Commits are very light and switching between them is wicked fast!"]}},{type:"GitDemonstrationView",options:{beforeMarkdowns:["Let's see what this looks like in practice. On the right we have a visualization of a (small) git repository. There are two commits right now -- the first initial commit, `C0`, and one commit after that `C1` that might have some meaningful changes.","","Hit the button below to make a new commit"],afterMarkdowns:["There we go! Awesome. We just made changes to the repository and saved them as a commit. The commit we just made has a parent, `C1`, which references which commit it was based off of."],command:"git commit",beforeCommand:""}},{type:"ModalAlert",options:{markdowns:["Go ahead and try it out on your own! After this window closes, make two commits to complete the level"]}}]}}}),e("/src/levels/intro/1.js"),e.define("/src/levels/intro/2.js",function(e,t,n,r,i,s,o){n.level={goalTreeString:'{"branches":{"master":{"target":"C1","id":"master"},"bugFix":{"target":"C1","id":"bugFix"}},"commits":{"C0":{"parents":[],"id":"C0","rootCommit":true},"C1":{"parents":["C0"],"id":"C1"}},"HEAD":{"target":"bugFix","id":"HEAD"}}',solutionCommand:"git branch bugFix;git checkout bugFix",hint:'Make a new branch with "git branch [name]" and check it out with "git checkout [name]"',name:"Branching in Git",disabledMap:{"git revert":!0},startDialog:{childViews:[{type:"ModalAlert",options:{markdowns:["## Git Branches","","Branches in Git are incredibly lightweight as well. They are simply references to a specific commit -- nothing more. This is why many Git enthusiasts chant the mantra:","","```","branch early, and branch often","```","","Because there is no storage / memory overhead with making many branches, it's easier to logically divide up your work than have big beefy branches.","",'When we start mixing branches and commits, we will see how these two features combine. For now though, just remember that a branch essentially says "I want to include the work of this commit and all parent commits."']}},{type:"GitDemonstrationView",options:{beforeMarkdowns:["Let's see what branches look like in practice.","","Here we will check out a new branch named `newImage`"],afterMarkdowns:["There, that's all there is to branching! The branch `newImage` now refers to commit `C1`"],command:"git branch newImage",beforeCommand:""}},{type:"GitDemonstrationView",options:{beforeMarkdowns:["Let's try to put some work on this new branch. Hit the button below"],afterMarkdowns:["Oh no! The `master` branch moved but the `newImage` branch didn't! That's because we weren't \"on\" the new branch, which is why the asterisk (*) was on `master`"],command:"git commit",beforeCommand:"git branch newImage"}},{type:"GitDemonstrationView",options:{beforeMarkdowns:["Let's tell git we want to checkout the branch with","","```","git checkout [name]","```","","This will put us on the new branch before committing our changes"],afterMarkdowns:["There we go! Our changes were recorded on the new branch"],command:"git checkout newImage; git commit",beforeCommand:"git branch newImage"}},{type:"ModalAlert",options:{markdowns:["Ok! You are all ready to get branching. Once this window closes,","make a new branch named `bugFix` and switch to that branch"]}}]}}}),e("/src/levels/intro/2.js"),e.define("/src/levels/intro/3.js",function(e,t,n,r,i,s,o){n.level={goalTreeString:'{"branches":{"master":{"target":"C4","id":"master"},"bugFix":{"target":"C2","id":"bugFix"}},"commits":{"C0":{"parents":[],"id":"C0","rootCommit":true},"C1":{"parents":["C0"],"id":"C1"},"C2":{"parents":["C1"],"id":"C2"},"C3":{"parents":["C1"],"id":"C3"},"C4":{"parents":["C2","C3"],"id":"C4"}},"HEAD":{"target":"master","id":"HEAD"}}',solutionCommand:"git checkout -b bugFix;git commit;git checkout master;git commit;git merge bugFix",name:"Merging in Git",hint:"Remember to commit in the order specified (bugFix before master)",disabledMap:{"git revert":!0},startDialog:{childViews:[{type:"ModalAlert",options:{markdowns:["## Branches and Merging","","Great! We now know how to commit and branch. Now we need to learn some kind of way of combining the work from two different branches together. This will allow us to branch off, develop a new feature, and then combine it back in.","",'The first method to combine work that we will examine is `git merge`. Merging in Git creates a special commit that has two unique parents. A commit with two parents essentially means "I want to include all the work from this parent over here and this one over here, *and* the set of all their parents."',"","It's easier with visuals, let's check it out in the next view"]}},{type:"GitDemonstrationView",options:{beforeMarkdowns:["Here we have two branches; each has one commit that's unique. This means that neither branch includes the entire set of \"work\" in the repository that we have done. Let's fix that with merge.","","We will `merge` the branch `bugFix` into `master`"],afterMarkdowns:["Woah! See that? First of all, `master` now points to a commit that has two parents. If you follow the arrows upstream from `master`, you will hit every commit along the way to the root. This means that `master` contains all the work in the repository now.","","Also, see how the colors of the commits changed? To help with learning, I have included some color coordination. Each branch has a unique color. Each commit turns a color that is the blended combination of all the branches that contain that commit.","","So here we see that the `master` branch color is blended into all the commits, but the `bugFix` color is not. Let's fix that..."],command:"git merge bugFix master",beforeCommand:"git checkout -b bugFix; git commit; git checkout master; git commit"}},{type:"GitDemonstrationView",options:{beforeMarkdowns:["Let's merge `master` into `bugFix`:"],afterMarkdowns:["Since `bugFix` was downstream of `master`, git didn't have to do any work; it simply just moved `bugFix` to the same commit `master` was attached to.","","Now all the commits are the same color, which means each branch contains all the work in the repository! Woohoo"],command:"git merge master bugFix",beforeCommand:"git checkout -b bugFix; git commit; git checkout master; git commit; git merge bugFix master"}},{type:"ModalAlert",options:{markdowns:["To complete this level, do the following steps:","","* Make a new branch called `bugFix`","* Checkout the `bugFix` branch with `git checkout bugFix`","* Commit once","* Go back to `master` with `git checkout`","* Commit another time","* Merge the branch `bugFix` into `master` with `git merge`","",'*Remember, you can always re-display this dialog with "help level"!*']}}]}}}),e("/src/levels/intro/3.js"),e.define("/src/levels/intro/4.js",function(e,t,n,r,i,s,o){n.level={goalTreeString:"%7B%22branches%22%3A%7B%22master%22%3A%7B%22target%22%3A%22C3%22%2C%22id%22%3A%22master%22%7D%2C%22bugFix%22%3A%7B%22target%22%3A%22C2%27%22%2C%22id%22%3A%22bugFix%22%7D%7D%2C%22commits%22%3A%7B%22C0%22%3A%7B%22parents%22%3A%5B%5D%2C%22id%22%3A%22C0%22%2C%22rootCommit%22%3Atrue%7D%2C%22C1%22%3A%7B%22parents%22%3A%5B%22C0%22%5D%2C%22id%22%3A%22C1%22%7D%2C%22C2%22%3A%7B%22parents%22%3A%5B%22C1%22%5D%2C%22id%22%3A%22C2%22%7D%2C%22C3%22%3A%7B%22parents%22%3A%5B%22C1%22%5D%2C%22id%22%3A%22C3%22%7D%2C%22C2%27%22%3A%7B%22parents%22%3A%5B%22C3%22%5D%2C%22id%22%3A%22C2%27%22%7D%7D%2C%22HEAD%22%3A%7B%22target%22%3A%22bugFix%22%2C%22id%22%3A%22HEAD%22%7D%7D",solutionCommand:"git checkout -b bugFix;git commit;git checkout master;git commit;git checkout bugFix;git rebase master",name:"Rebase Introduction",hint:"Make sure you commit from bugFix first",disabledMap:{"git revert":!0},startDialog:{childViews:[{type:"ModalAlert",options:{markdowns:["## Git Rebase","",'The second way of combining work between branches is *rebasing.* Rebasing essentially takes a set of commits, "copies" them, and plops them down somewhere else.',"","While this sounds confusing, the advantage of rebasing is that it can be used to make a nice linear sequence of commits. The commit log / history of the repository will be a lot cleaner if only rebasing is allowed.","","Let's see it in action..."]}},{type:"GitDemonstrationView",options:{beforeMarkdowns:["Here we have two branches yet again; note that the bugFix branch is currently selected (note the asterisk)","","We would like to move our work from bugFix directly onto the work from master. That way it would look like these two features were developed sequentially, when in reality they were developed in parallel.","","Let's do that with the `git rebase` command"],afterMarkdowns:["Awesome! Now the work from our bugFix branch is right on top of master and we have a nice linear sequence of commits.","",'Note that the commit C3 still exists somewhere (it has a faded appearance in the tree), and C3\' is the "copy" that we rebased onto master.',"","The only problem is that master hasn't been updated either, let's do that now..."],command:"git rebase master",beforeCommand:"git commit; git checkout -b bugFix C1; git commit"}},{type:"GitDemonstrationView",options:{beforeMarkdowns:["Now we are checked out on the `master` branch. Let's do ahead and rebase onto `bugFix`..."],afterMarkdowns:["There! Since `master` was downstream of `bugFix`, git simply moved the `master` branch reference forward in history."],command:"git rebase bugFix",beforeCommand:"git commit; git checkout -b bugFix C1; git commit; git rebase master; git checkout master"}},{type:"ModalAlert",options:{markdowns:["To complete this level, do the following","","* Checkout a new branch named `bugFix`","* Commit once","* Go back to master and commit again","* Check out bugFix again and rebase onto master","","Good luck!"]}}]}}}),e("/src/levels/intro/4.js"),e.define("/src/levels/intro/5.js",function(e,t,n,r,i,s,o){n.level={goalTreeString:"%7B%22branches%22%3A%7B%22master%22%3A%7B%22target%22%3A%22C1%22%2C%22id%22%3A%22master%22%7D%2C%22pushed%22%3A%7B%22target%22%3A%22C2%27%22%2C%22id%22%3A%22pushed%22%7D%2C%22local%22%3A%7B%22target%22%3A%22C1%22%2C%22id%22%3A%22local%22%7D%7D%2C%22commits%22%3A%7B%22C0%22%3A%7B%22parents%22%3A%5B%5D%2C%22id%22%3A%22C0%22%2C%22rootCommit%22%3Atrue%7D%2C%22C1%22%3A%7B%22parents%22%3A%5B%22C0%22%5D%2C%22id%22%3A%22C1%22%7D%2C%22C2%22%3A%7B%22parents%22%3A%5B%22C1%22%5D%2C%22id%22%3A%22C2%22%7D%2C%22C3%22%3A%7B%22parents%22%3A%5B%22C1%22%5D%2C%22id%22%3A%22C3%22%7D%2C%22C2%27%22%3A%7B%22parents%22%3A%5B%22C2%22%5D%2C%22id%22%3A%22C2%27%22%7D%7D%2C%22HEAD%22%3A%7B%22target%22%3A%22pushed%22%2C%22id%22%3A%22HEAD%22%7D%7D",solutionCommand:"git reset HEAD~1;git checkout pushed;git revert HEAD",startTree:'{"branches":{"master":{"target":"C1","id":"master"},"pushed":{"target":"C2","id":"pushed"},"local":{"target":"C3","id":"local"}},"commits":{"C0":{"parents":[],"id":"C0","rootCommit":true},"C1":{"parents":["C0"],"id":"C1"},"C2":{"parents":["C1"],"id":"C2"},"C3":{"parents":["C1"],"id":"C3"}},"HEAD":{"target":"local","id":"HEAD"}}',name:"Reversing Changes in Git",hint:"",startDialog:{childViews:[{type:"ModalAlert",options:{markdowns:["## Reversing Changes in Git","","There are many ways to reverse changes in Git. And just like committing, reversing changes in Git has both a low-level component (staging individual files or chunks) and a high-level component (how the changes are actually reversed). Our application will focus on the latter.","","There are two primary ways to undo changes in Git -- one is using `git reset` and the other is using `git revert`. We will look at each of these in the next dialog",""]}},{type:"GitDemonstrationView",options:{beforeMarkdowns:["## Git Reset","",'`git reset` reverts changes by moving a branch reference backwards in time to an older commit. In this sense you can think of it as "rewriting history;" `git reset` will move a branch backwards as if the commit had never been made in the first place.',"","Let's see what that looks like:"],afterMarkdowns:["Nice! Git simply moved the master branch reference back to `C1`; now our local repository is in a state as if `C2` had never happened"],command:"git reset HEAD~1",beforeCommand:"git commit"}},{type:"GitDemonstrationView",options:{beforeMarkdowns:["## Git Revert","","While reseting works great for local branches on your own machine, it's method of \"rewriting history\" doesn't work for remote branches that others are using.","","In order to reverse changes and *share* those reversed changes with others, we need to use `git revert`. Let's see it in action"],afterMarkdowns:["Weird, a new commit plopped down below the commit we wanted to reverse. That's because this new commit `C2'` introduces *changes* -- it just happens to introduce changes that exactly reverses the commit of `C2`.","","With reverting, you can push out your changes to share with others."],command:"git revert HEAD",beforeCommand:"git commit"}},{type:"ModalAlert",options:{markdowns:["To complete this level, reverse the two most recent commits on both `local` and `pushed`.","","Keep in mind that `pushed` is a remote branch and `local` is a local branch -- that should help you chose your methods."]}}]}}}),e("/src/levels/intro/5.js"),e.define("/src/levels/mixed/1.js",function(e,t,n,r,i,s,o){n.level={compareOnlyMaster:!0,disabledMap:{"git revert":!0},goalTreeString:"%7B%22branches%22%3A%7B%22master%22%3A%7B%22target%22%3A%22C4%27%22%2C%22id%22%3A%22master%22%7D%2C%22debug%22%3A%7B%22target%22%3A%22C2%22%2C%22id%22%3A%22debug%22%7D%2C%22printf%22%3A%7B%22target%22%3A%22C3%22%2C%22id%22%3A%22printf%22%7D%2C%22bugFix%22%3A%7B%22target%22%3A%22C4%27%22%2C%22id%22%3A%22bugFix%22%7D%7D%2C%22commits%22%3A%7B%22C0%22%3A%7B%22parents%22%3A%5B%5D%2C%22id%22%3A%22C0%22%2C%22rootCommit%22%3Atrue%7D%2C%22C1%22%3A%7B%22parents%22%3A%5B%22C0%22%5D%2C%22id%22%3A%22C1%22%7D%2C%22C2%22%3A%7B%22parents%22%3A%5B%22C1%22%5D%2C%22id%22%3A%22C2%22%7D%2C%22C3%22%3A%7B%22parents%22%3A%5B%22C2%22%5D%2C%22id%22%3A%22C3%22%7D%2C%22C4%22%3A%7B%22parents%22%3A%5B%22C3%22%5D%2C%22id%22%3A%22C4%22%7D%2C%22C4%27%22%3A%7B%22parents%22%3A%5B%22C1%22%5D%2C%22id%22%3A%22C4%27%22%7D%7D%2C%22HEAD%22%3A%7B%22target%22%3A%22master%22%2C%22id%22%3A%22HEAD%22%7D%7D",solutionCommand:"git checkout master;git cherry-pick C4",startTree:'{"branches":{"master":{"target":"C1","id":"master"},"debug":{"target":"C2","id":"debug"},"printf":{"target":"C3","id":"printf"},"bugFix":{"target":"C4","id":"bugFix"}},"commits":{"C0":{"parents":[],"id":"C0","rootCommit":true},"C1":{"parents":["C0"],"id":"C1"},"C2":{"parents":["C1"],"id":"C2"},"C3":{"parents":["C2"],"id":"C3"},"C4":{"parents":["C3"],"id":"C4"}},"HEAD":{"target":"bugFix","id":"HEAD"}}',name:"Grabbing Just 1 Commit",hint:"Remember, interactive rebase or cherry-pick is your friend here",startDialog:{childViews:[{type:"ModalAlert",options:{markdowns:["## Locally stacked commits","","Here's a development situation that often happens: I'm trying to track down a bug but it is quite elusive. In order to aid in my detective work, I put in a few debug commands and a few print statements.","","All of these debugging / print statements are in their own branches. Finally I track down the bug, fix it, and rejoice!","","Only problem is that I now need to get my `bugFix` back into the `master` branch! I could simply fast-forward `master`, but then `master` would get all my debug statements."]}},{type:"ModalAlert",options:{markdowns:["This is where the magic of Git comes in. There are a few ways to do this, but the two most straightforward ways are:","","* `git rebase -i`","* `git cherry-pick`","","Interactive (the `-i`) rebasing allows you to chose which commits you want to keep or discard. It also allows you to reorder commits. This can be helpful if you want to toss out some work.","","Cherry-picking allows you to pick individual commits and plop them down on top of `HEAD`"]}},{type:"ModalAlert",options:{markdowns:["This is a later level so we will leave it up to you to decide, but in order to complete the level, make sure `master` receives the commit that `bugFix` references."]}}]}}}),e("/src/levels/mixed/1.js"),e.define("/src/levels/mixed/2.js",function(e,t,n,r,i,s,o){n.level={disabledMap:{"git cherry-pick":!0,"git revert":!0},compareOnlyMaster:!0,goalTreeString:"%7B%22branches%22%3A%7B%22master%22%3A%7B%22target%22%3A%22C3%27%27%22%2C%22id%22%3A%22master%22%7D%2C%22newImage%22%3A%7B%22target%22%3A%22C2%22%2C%22id%22%3A%22newImage%22%7D%2C%22caption%22%3A%7B%22target%22%3A%22C3%27%27%22%2C%22id%22%3A%22caption%22%7D%7D%2C%22commits%22%3A%7B%22C0%22%3A%7B%22parents%22%3A%5B%5D%2C%22id%22%3A%22C0%22%2C%22rootCommit%22%3Atrue%7D%2C%22C1%22%3A%7B%22parents%22%3A%5B%22C0%22%5D%2C%22id%22%3A%22C1%22%7D%2C%22C2%22%3A%7B%22parents%22%3A%5B%22C1%22%5D%2C%22id%22%3A%22C2%22%7D%2C%22C3%22%3A%7B%22parents%22%3A%5B%22C2%22%5D%2C%22id%22%3A%22C3%22%7D%2C%22C3%27%22%3A%7B%22parents%22%3A%5B%22C1%22%5D%2C%22id%22%3A%22C3%27%22%7D%2C%22C2%27%22%3A%7B%22parents%22%3A%5B%22C3%27%22%5D%2C%22id%22%3A%22C2%27%22%7D%2C%22C2%27%27%22%3A%7B%22parents%22%3A%5B%22C3%27%22%5D%2C%22id%22%3A%22C2%27%27%22%7D%2C%22C2%27%27%27%22%3A%7B%22parents%22%3A%5B%22C1%22%5D%2C%22id%22%3A%22C2%27%27%27%22%7D%2C%22C3%27%27%22%3A%7B%22parents%22%3A%5B%22C2%27%27%27%22%5D%2C%22id%22%3A%22C3%27%27%22%7D%7D%2C%22HEAD%22%3A%7B%22target%22%3A%22master%22%2C%22id%22%3A%22HEAD%22%7D%7D",solutionCommand:"git rebase -i HEAD~2;git commit --amend;git rebase -i HEAD~2;git rebase caption master",startTree:'{"branches":{"master":{"target":"C1","id":"master"},"newImage":{"target":"C2","id":"newImage"},"caption":{"target":"C3","id":"caption"}},"commits":{"C0":{"parents":[],"id":"C0","rootCommit":true},"C1":{"parents":["C0"],"id":"C1"},"C2":{"parents":["C1"],"id":"C2"},"C3":{"parents":["C2"],"id":"C3"}},"HEAD":{"target":"caption","id":"HEAD"}}',name:"Juggling Commits",hint:"The first command is git rebase -i HEAD~2",startDialog:{childViews:[{type:"ModalAlert",options:{markdowns:["## Juggling Commits","","Here's another situation that happens quite commonly. You have some changes (`newImage`) and another set of changes (`caption`) that are related, so they are stacked on top of each other in your repository (aka one after another).","","The tricky thing is that sometimes you need to make a small modification to an earlier commit. In this case, design wants us to change the dimensions of `newImage` slightly, even though that commit is way back in our history!!"]}},{type:"ModalAlert",options:{markdowns:["We will overcome this difficulty by doing the following:","","* We will re-order the commits so the one we want to change is on top with `git rebase -i`","* We will `commit --amend` to make the slight modification","* Then we will re-order the commits back to how they were previously with `git rebase -i`","* Finally, we will move master to this updated part of the tree to finish the level (via your method of choosing)","","There are many ways to accomplish this overall goal (I see you eye-ing cherry-pick), and we will see more of them later, but for now let's focus on this technique."]}},{type:"ModalAlert",options:{markdowns:["Lastly, pay attention to the goal state here -- since we move the commits twice, they both get an apostrophe appended. One more apostrophe is added for the commit we amend, which gives us the final form of the tree "]}}]}}}),e("/src/levels/mixed/2.js"),e.define("/src/levels/mixed/3.js",function(e,t,n,r,i,s,o){n.level={goalTreeString:"%7B%22branches%22%3A%7B%22master%22%3A%7B%22target%22%3A%22C3%27%22%2C%22id%22%3A%22master%22%7D%2C%22newImage%22%3A%7B%22target%22%3A%22C2%22%2C%22id%22%3A%22newImage%22%7D%2C%22caption%22%3A%7B%22target%22%3A%22C3%22%2C%22id%22%3A%22caption%22%7D%7D%2C%22commits%22%3A%7B%22C0%22%3A%7B%22parents%22%3A%5B%5D%2C%22id%22%3A%22C0%22%2C%22rootCommit%22%3Atrue%7D%2C%22C1%22%3A%7B%22parents%22%3A%5B%22C0%22%5D%2C%22id%22%3A%22C1%22%7D%2C%22C2%22%3A%7B%22parents%22%3A%5B%22C1%22%5D%2C%22id%22%3A%22C2%22%7D%2C%22C3%22%3A%7B%22parents%22%3A%5B%22C2%22%5D%2C%22id%22%3A%22C3%22%7D%2C%22C2%27%22%3A%7B%22parents%22%3A%5B%22C1%22%5D%2C%22id%22%3A%22C2%27%22%7D%2C%22C2%27%27%22%3A%7B%22parents%22%3A%5B%22C1%22%5D%2C%22id%22%3A%22C2%27%27%22%7D%2C%22C3%27%22%3A%7B%22parents%22%3A%5B%22C2%27%27%22%5D%2C%22id%22%3A%22C3%27%22%7D%7D%2C%22HEAD%22%3A%7B%22target%22%3A%22master%22%2C%22id%22%3A%22HEAD%22%7D%7D",solutionCommand:"git checkout master;git cherry-pick C2;git commit --amend;git cherry-pick C3",disabledMap:{"git revert":!0},startTree:'{"branches":{"master":{"target":"C1","id":"master"},"newImage":{"target":"C2","id":"newImage"},"caption":{"target":"C3","id":"caption"}},"commits":{"C0":{"parents":[],"id":"C0","rootCommit":true},"C1":{"parents":["C0"],"id":"C1"},"C2":{"parents":["C1"],"id":"C2"},"C3":{"parents":["C2"],"id":"C3"}},"HEAD":{"target":"caption","id":"HEAD"}}',compareOnlyMaster:!0,name:"Juggling Commits #2",hint:"Don't forget to forward master to the updated changes!",startDialog:{childViews:[{type:"ModalAlert",options:{markdowns:["## Juggling Commits #2","","*If you haven't completed Juggling Commits #1 (the previous level), please do so before continuing*","","As you saw in the last level, we used `rebase -i` to reorder the commits. Once the commit we wanted to change was on top, we could easily --amend it and re-order back to our preferred order.","","The only issue here is that there is a lot of reordering going on, which can introduce rebase conflicts. Let's look at another method with `git cherry-pick`"]}},{type:"GitDemonstrationView",options:{beforeMarkdowns:["Remember that git cherry-pick will plop down a commit from anywhere in the tree onto HEAD (as long as that commit isn't upstream).","","Here's a small refresher demo:"],afterMarkdowns:["Nice! Let's move on"],command:"git cherry-pick C2",beforeCommand:"git checkout -b bugFix; git commit; git checkout master; git commit"}},{type:"ModalAlert",options:{markdowns:["So in this level, let's accomplish the same objective of amending `C2` once but avoid using `rebase -i`. I'll leave it up to you to figure it out! :D"]}}]}}}),e("/src/levels/mixed/3.js"),e.define("/src/levels/rebase/1.js",function(e,t,n,r,i,s,o){n.level={compareOnlyMaster:!0,disabledMap:{"git revert":!0},goalTreeString:"%7B%22branches%22%3A%7B%22master%22%3A%7B%22target%22%3A%22C7%27%22%2C%22id%22%3A%22master%22%7D%2C%22bugFix%22%3A%7B%22target%22%3A%22C3%27%22%2C%22id%22%3A%22bugFix%22%7D%2C%22side%22%3A%7B%22target%22%3A%22C6%27%22%2C%22id%22%3A%22side%22%7D%2C%22another%22%3A%7B%22target%22%3A%22C7%27%22%2C%22id%22%3A%22another%22%7D%7D%2C%22commits%22%3A%7B%22C0%22%3A%7B%22parents%22%3A%5B%5D%2C%22id%22%3A%22C0%22%2C%22rootCommit%22%3Atrue%7D%2C%22C1%22%3A%7B%22parents%22%3A%5B%22C0%22%5D%2C%22id%22%3A%22C1%22%7D%2C%22C2%22%3A%7B%22parents%22%3A%5B%22C1%22%5D%2C%22id%22%3A%22C2%22%7D%2C%22C3%22%3A%7B%22parents%22%3A%5B%22C1%22%5D%2C%22id%22%3A%22C3%22%7D%2C%22C4%22%3A%7B%22parents%22%3A%5B%22C0%22%5D%2C%22id%22%3A%22C4%22%7D%2C%22C5%22%3A%7B%22parents%22%3A%5B%22C4%22%5D%2C%22id%22%3A%22C5%22%7D%2C%22C6%22%3A%7B%22parents%22%3A%5B%22C5%22%5D%2C%22id%22%3A%22C6%22%7D%2C%22C7%22%3A%7B%22parents%22%3A%5B%22C5%22%5D%2C%22id%22%3A%22C7%22%7D%2C%22C3%27%22%3A%7B%22parents%22%3A%5B%22C2%22%5D%2C%22id%22%3A%22C3%27%22%7D%2C%22C4%27%22%3A%7B%22parents%22%3A%5B%22C3%27%22%5D%2C%22id%22%3A%22C4%27%22%7D%2C%22C5%27%22%3A%7B%22parents%22%3A%5B%22C4%27%22%5D%2C%22id%22%3A%22C5%27%22%7D%2C%22C6%27%22%3A%7B%22parents%22%3A%5B%22C5%27%22%5D%2C%22id%22%3A%22C6%27%22%7D%2C%22C7%27%22%3A%7B%22parents%22%3A%5B%22C6%27%22%5D%2C%22id%22%3A%22C7%27%22%7D%7D%2C%22HEAD%22%3A%7B%22target%22%3A%22master%22%2C%22id%22%3A%22HEAD%22%7D%7D",solutionCommand:"git checkout bugFix;git rebase master;git checkout side;git rebase bugFix;git checkout another;git rebase side;git rebase another master",startTree:'{"branches":{"master":{"target":"C2","id":"master"},"bugFix":{"target":"C3","id":"bugFix"},"side":{"target":"C6","id":"side"},"another":{"target":"C7","id":"another"}},"commits":{"C0":{"parents":[],"id":"C0","rootCommit":true},"C1":{"parents":["C0"],"id":"C1"},"C2":{"parents":["C1"],"id":"C2"},"C3":{"parents":["C1"],"id":"C3"},"C4":{"parents":["C0"],"id":"C4"},"C5":{"parents":["C4"],"id":"C5"},"C6":{"parents":["C5"],"id":"C6"},"C7":{"parents":["C5"],"id":"C7"}},"HEAD":{"target":"master","id":"HEAD"}}',name:"Rebasing over 9000 times",hint:"Remember, the most efficient way might be to only update master at the end...",startDialog:{childViews:[{type:"ModalAlert",options:{markdowns:["### Rebasing Multiple Branches","","Man, we have a lot of branches going on here! Let's rebase all the work from these branches onto master.","","Upper management is making this a bit trickier though -- they want the commits to all be in sequential order. So this means that our final tree should have `C7'` at the bottom, `C6'` above that, etc etc, etc all in order.","","If you mess up along the way, feel free to use `reset` to start over again. Be sure to check out our solution and see if you can do it in fewer commands!"]}}]}}}),e("/src/levels/rebase/1.js"),e.define("/src/levels/rebase/2.js",function(e,t,n,r,i,s,o){n.level={compareOnlyBranches:!0,disabledMap:{"git revert":!0},goalTreeString:"%7B%22branches%22%3A%7B%22master%22%3A%7B%22target%22%3A%22C5%22%2C%22id%22%3A%22master%22%7D%2C%22one%22%3A%7B%22target%22%3A%22C2%27%22%2C%22id%22%3A%22one%22%7D%2C%22two%22%3A%7B%22target%22%3A%22C2%27%27%22%2C%22id%22%3A%22two%22%7D%2C%22three%22%3A%7B%22target%22%3A%22C2%27%27%27%22%2C%22id%22%3A%22three%22%7D%7D%2C%22commits%22%3A%7B%22C0%22%3A%7B%22parents%22%3A%5B%5D%2C%22id%22%3A%22C0%22%2C%22rootCommit%22%3Atrue%7D%2C%22C1%22%3A%7B%22parents%22%3A%5B%22C0%22%5D%2C%22id%22%3A%22C1%22%7D%2C%22C2%22%3A%7B%22parents%22%3A%5B%22C1%22%5D%2C%22id%22%3A%22C2%22%7D%2C%22C3%22%3A%7B%22parents%22%3A%5B%22C2%22%5D%2C%22id%22%3A%22C3%22%7D%2C%22C4%22%3A%7B%22parents%22%3A%5B%22C3%22%5D%2C%22id%22%3A%22C4%22%7D%2C%22C5%22%3A%7B%22parents%22%3A%5B%22C4%22%5D%2C%22id%22%3A%22C5%22%7D%2C%22C4%27%22%3A%7B%22parents%22%3A%5B%22C1%22%5D%2C%22id%22%3A%22C4%27%22%7D%2C%22C3%27%22%3A%7B%22parents%22%3A%5B%22C4%27%22%5D%2C%22id%22%3A%22C3%27%22%7D%2C%22C2%27%22%3A%7B%22parents%22%3A%5B%22C3%27%22%5D%2C%22id%22%3A%22C2%27%22%7D%2C%22C5%27%22%3A%7B%22parents%22%3A%5B%22C1%22%5D%2C%22id%22%3A%22C5%27%22%7D%2C%22C4%27%27%22%3A%7B%22parents%22%3A%5B%22C5%27%22%5D%2C%22id%22%3A%22C4%27%27%22%7D%2C%22C3%27%27%22%3A%7B%22parents%22%3A%5B%22C4%27%27%22%5D%2C%22id%22%3A%22C3%27%27%22%7D%2C%22C2%27%27%22%3A%7B%22parents%22%3A%5B%22C3%27%27%22%5D%2C%22id%22%3A%22C2%27%27%22%7D%2C%22C2%27%27%27%22%3A%7B%22parents%22%3A%5B%22C1%22%5D%2C%22id%22%3A%22C2%27%27%27%22%7D%7D%2C%22HEAD%22%3A%7B%22target%22%3A%22master%22%2C%22id%22%3A%22HEAD%22%7D%7D",solutionCommand:"git rebase -i HEAD~4;git branch -f master C5;git branch -f one C2';git rebase -i HEAD~4;git branch -f master C5;git branch -f two C2'';git rebase -i HEAD~4;git branch -f master C5;git branch -f three C2'''",startTree:'{"branches":{"master":{"target":"C5","id":"master"},"one":{"target":"C1","id":"one"},"two":{"target":"C1","id":"two"},"three":{"target":"C1","id":"three"}},"commits":{"C0":{"parents":[],"id":"C0","rootCommit":true},"C1":{"parents":["C0"],"id":"C1"},"C2":{"parents":["C1"],"id":"C2"},"C3":{"parents":["C2"],"id":"C3"},"C4":{"parents":["C3"],"id":"C4"},"C5":{"parents":["C4"],"id":"C5"}},"HEAD":{"target":"master","id":"HEAD"}}',name:"Branch Spaghetti",hint:"Make sure to do everything in the proper order! Branch one first, then two, then three",startDialog:{childViews:[{type:"ModalAlert",options:{markdowns:["## Branch Spaghetti","","WOAHHHhhh Nelly! We have quite the goal to reach in this level.","","Here we have `master` that is a few commits ahead of branches `one` `two` and `three`. For whatever reason, we need to update these three other branches with modified versions of the last few commits on master.","","Branch `one` needs a re-ordering and a deletion. `two` needs pure reordering, and `three` only needs one commit!","","We will let you figure out how to solve this one -- make sure to check out our solution afterwards with `show solution`. "]}}]}}}),e("/src/levels/rebase/2.js")})();
\ No newline at end of file
+(function(){var e=function(t,n){var r=e.resolve(t,n||"/"),i=e.modules[r];if(!i)throw new Error("Failed to resolve module "+t+", tried "+r);var s=e.cache[r],o=s?s.exports:i();return o};e.paths=[],e.modules={},e.cache={},e.extensions=[".js",".coffee",".json"],e._core={assert:!0,events:!0,fs:!0,path:!0,vm:!0},e.resolve=function(){return function(t,n){function u(t){t=r.normalize(t);if(e.modules[t])return t;for(var n=0;n=0;i--){if(t[i]==="node_modules")continue;var s=t.slice(0,i+1).join("/")+"/node_modules";n.push(s)}return n}n||(n="/");if(e._core[t])return t;var r=e.modules.path();n=r.resolve("/",n);var i=n||"/";if(t.match(/^(?:\.\.?\/|\/)/)){var s=u(r.resolve(i,t))||a(r.resolve(i,t));if(s)return s}var o=f(t,i);if(o)return o;throw new Error("Cannot find module '"+t+"'")}}(),e.alias=function(t,n){var r=e.modules.path(),i=null;try{i=e.resolve(t+"/package.json","/")}catch(s){i=e.resolve(t,"/")}var o=r.dirname(i),u=(Object.keys||function(e){var t=[];for(var n in e)t.push(n);return t})(e.modules);for(var a=0;a=0;r--){var i=e[r];i=="."?e.splice(r,1):i===".."?(e.splice(r,1),n++):n&&(e.splice(r,1),n--)}if(t)for(;n--;n)e.unshift("..");return e}var f=/^(.+\/(?!$)|\/)?((?:.+?)?(\.[^.]*)?)$/;n.resolve=function(){var e="",t=!1;for(var n=arguments.length;n>=-1&&!t;n--){var r=n>=0?arguments[n]:s.cwd();if(typeof r!="string"||!r)continue;e=r+"/"+e,t=r.charAt(0)==="/"}return e=a(u(e.split("/"),function(e){return!!e}),!t).join("/"),(t?"/":"")+e||"."},n.normalize=function(e){var t=e.charAt(0)==="/",n=e.slice(-1)==="/";return e=a(u(e.split("/"),function(e){return!!e}),!t).join("/"),!e&&!t&&(e="."),e&&n&&(e+="/"),(t?"/":"")+e},n.join=function(){var e=Array.prototype.slice.call(arguments,0);return n.normalize(u(e,function(e,t){return e&&typeof e=="string"}).join("/"))},n.dirname=function(e){var t=f.exec(e)[1]||"",n=!1;return t?t.length===1||n&&t.length<=3&&t.charAt(1)===":"?t:t.substring(0,t.length-1):"."},n.basename=function(e,t){var n=f.exec(e)[2]||"";return t&&n.substr(-1*t.length)===t&&(n=n.substr(0,n.length-t.length)),n},n.extname=function(e){return f.exec(e)[3]||""}}),e.define("__browserify_process",function(e,t,n,r,i,s,o){var s=t.exports={};s.nextTick=function(){var e=typeof window!="undefined"&&window.setImmediate,t=typeof window!="undefined"&&window.postMessage&&window.addEventListener;if(e)return function(e){return window.setImmediate(e)};if(t){var n=[];return window.addEventListener("message",function(e){if(e.source===window&&e.data==="browserify-tick"){e.stopPropagation();if(n.length>0){var t=n.shift();t()}}},!0),function(t){n.push(t),window.postMessage("browserify-tick","*")}}return function(t){setTimeout(t,0)}}(),s.title="browser",s.browser=!0,s.env={},s.argv=[],s.binding=function(t){if(t==="evals")return e("vm");throw new Error("No such module. (Possibly not yet loaded)")},function(){var t="/",n;s.cwd=function(){return t},s.chdir=function(r){n||(n=e("path")),t=n.resolve(r,t)}}()}),e.define("/node_modules/underscore/package.json",function(e,t,n,r,i,s,o){t.exports={main:"underscore.js"}}),e.define("/node_modules/underscore/underscore.js",function(e,t,n,r,i,s,o){(function(){var e=this,r=e._,i={},s=Array.prototype,o=Object.prototype,u=Function.prototype,a=s.push,f=s.slice,l=s.concat,c=o.toString,h=o.hasOwnProperty,p=s.forEach,d=s.map,v=s.reduce,m=s.reduceRight,g=s.filter,y=s.every,b=s.some,w=s.indexOf,E=s.lastIndexOf,S=Array.isArray,x=Object.keys,T=u.bind,N=function(e){if(e instanceof N)return e;if(!(this instanceof N))return new N(e);this._wrapped=e};typeof n!="undefined"?(typeof t!="undefined"&&t.exports&&(n=t.exports=N),n._=N):e._=N,N.VERSION="1.4.3";var C=N.each=N.forEach=function(e,t,n){if(e==null)return;if(p&&e.forEach===p)e.forEach(t,n);else if(e.length===+e.length){for(var r=0,s=e.length;r2;e==null&&(e=[]);if(v&&e.reduce===v)return r&&(t=N.bind(t,r)),i?e.reduce(t,n):e.reduce(t);C(e,function(e,s,o){i?n=t.call(r,n,e,s,o):(n=e,i=!0)});if(!i)throw new TypeError(k);return n},N.reduceRight=N.foldr=function(e,t,n,r){var i=arguments.length>2;e==null&&(e=[]);if(m&&e.reduceRight===m)return r&&(t=N.bind(t,r)),i?e.reduceRight(t,n):e.reduceRight(t);var s=e.length;if(s!==+s){var o=N.keys(e);s=o.length}C(e,function(u,a,f){a=o?o[--s]:--s,i?n=t.call(r,n,e[a],a,f):(n=e[a],i=!0)});if(!i)throw new TypeError(k);return n},N.find=N.detect=function(e,t,n){var r;return L(e,function(e,i,s){if(t.call(n,e,i,s))return r=e,!0}),r},N.filter=N.select=function(e,t,n){var r=[];return e==null?r:g&&e.filter===g?e.filter(t,n):(C(e,function(e,i,s){t.call(n,e,i,s)&&(r[r.length]=e)}),r)},N.reject=function(e,t,n){return N.filter(e,function(e,r,i){return!t.call(n,e,r,i)},n)},N.every=N.all=function(e,t,n){t||(t=N.identity);var r=!0;return e==null?r:y&&e.every===y?e.every(t,n):(C(e,function(e,s,o){if(!(r=r&&t.call(n,e,s,o)))return i}),!!r)};var L=N.some=N.any=function(e,t,n){t||(t=N.identity);var r=!1;return e==null?r:b&&e.some===b?e.some(t,n):(C(e,function(e,s,o){if(r||(r=t.call(n,e,s,o)))return i}),!!r)};N.contains=N.include=function(e,t){return e==null?!1:w&&e.indexOf===w?e.indexOf(t)!=-1:L(e,function(e){return e===t})},N.invoke=function(e,t){var n=f.call(arguments,2);return N.map(e,function(e){return(N.isFunction(t)?t:e[t]).apply(e,n)})},N.pluck=function(e,t){return N.map(e,function(e){return e[t]})},N.where=function(e,t){return N.isEmpty(t)?[]:N.filter(e,function(e){for(var n in t)if(t[n]!==e[n])return!1;return!0})},N.max=function(e,t,n){if(!t&&N.isArray(e)&&e[0]===+e[0]&&e.length<65535)return Math.max.apply(Math,e);if(!t&&N.isEmpty(e))return-Infinity;var r={computed:-Infinity,value:-Infinity};return C(e,function(e,i,s){var o=t?t.call(n,e,i,s):e;o>=r.computed&&(r={value:e,computed:o})}),r.value},N.min=function(e,t,n){if(!t&&N.isArray(e)&&e[0]===+e[0]&&e.length<65535)return Math.min.apply(Math,e);if(!t&&N.isEmpty(e))return Infinity;var r={computed:Infinity,value:Infinity};return C(e,function(e,i,s){var o=t?t.call(n,e,i,s):e;or||n===void 0)return 1;if(n>>1;n.call(r,e[u])=0})})},N.difference=function(e){var t=l.apply(s,f.call(arguments,1));return N.filter(e,function(e){return!N.contains(t,e)})},N.zip=function(){var e=f.call(arguments),t=N.max(N.pluck(e,"length")),n=new Array(t);for(var r=0;r=0;n--)t=[e[n].apply(this,t)];return t[0]}},N.after=function(e,t){return e<=0?t():function(){if(--e<1)return t.apply(this,arguments)}},N.keys=x||function(e){if(e!==Object(e))throw new TypeError("Invalid object");var t=[];for(var n in e)N.has(e,n)&&(t[t.length]=n);return t},N.values=function(e){var t=[];for(var n in e)N.has(e,n)&&t.push(e[n]);return t},N.pairs=function(e){var t=[];for(var n in e)N.has(e,n)&&t.push([n,e[n]]);return t},N.invert=function(e){var t={};for(var n in e)N.has(e,n)&&(t[e[n]]=n);return t},N.functions=N.methods=function(e){var t=[];for(var n in e)N.isFunction(e[n])&&t.push(n);return t.sort()},N.extend=function(e){return C(f.call(arguments,1),function(t){if(t)for(var n in t)e[n]=t[n]}),e},N.pick=function(e){var t={},n=l.apply(s,f.call(arguments,1));return C(n,function(n){n in e&&(t[n]=e[n])}),t},N.omit=function(e){var t={},n=l.apply(s,f.call(arguments,1));for(var r in e)N.contains(n,r)||(t[r]=e[r]);return t},N.defaults=function(e){return C(f.call(arguments,1),function(t){if(t)for(var n in t)e[n]==null&&(e[n]=t[n])}),e},N.clone=function(e){return N.isObject(e)?N.isArray(e)?e.slice():N.extend({},e):e},N.tap=function(e,t){return t(e),e};var D=function(e,t,n,r){if(e===t)return e!==0||1/e==1/t;if(e==null||t==null)return e===t;e instanceof N&&(e=e._wrapped),t instanceof N&&(t=t._wrapped);var i=c.call(e);if(i!=c.call(t))return!1;switch(i){case"[object String]":return e==String(t);case"[object Number]":return e!=+e?t!=+t:e==0?1/e==1/t:e==+t;case"[object Date]":case"[object Boolean]":return+e==+t;case"[object RegExp]":return e.source==t.source&&e.global==t.global&&e.multiline==t.multiline&&e.ignoreCase==t.ignoreCase}if(typeof e!="object"||typeof t!="object")return!1;var s=n.length;while(s--)if(n[s]==e)return r[s]==t;n.push(e),r.push(t);var o=0,u=!0;if(i=="[object Array]"){o=e.length,u=o==t.length;if(u)while(o--)if(!(u=D(e[o],t[o],n,r)))break}else{var a=e.constructor,f=t.constructor;if(a!==f&&!(N.isFunction(a)&&a instanceof a&&N.isFunction(f)&&f instanceof f))return!1;for(var l in e)if(N.has(e,l)){o++;if(!(u=N.has(t,l)&&D(e[l],t[l],n,r)))break}if(u){for(l in t)if(N.has(t,l)&&!(o--))break;u=!o}}return n.pop(),r.pop(),u};N.isEqual=function(e,t){return D(e,t,[],[])},N.isEmpty=function(e){if(e==null)return!0;if(N.isArray(e)||N.isString(e))return e.length===0;for(var t in e)if(N.has(e,t))return!1;return!0},N.isElement=function(e){return!!e&&e.nodeType===1},N.isArray=S||function(e){return c.call(e)=="[object Array]"},N.isObject=function(e){return e===Object(e)},C(["Arguments","Function","String","Number","Date","RegExp"],function(e){N["is"+e]=function(t){return c.call(t)=="[object "+e+"]"}}),N.isArguments(arguments)||(N.isArguments=function(e){return!!e&&!!N.has(e,"callee")}),typeof /./!="function"&&(N.isFunction=function(e){return typeof e=="function"}),N.isFinite=function(e){return isFinite(e)&&!isNaN(parseFloat(e))},N.isNaN=function(e){return N.isNumber(e)&&e!=+e},N.isBoolean=function(e){return e===!0||e===!1||c.call(e)=="[object Boolean]"},N.isNull=function(e){return e===null},N.isUndefined=function(e){return e===void 0},N.has=function(e,t){return h.call(e,t)},N.noConflict=function(){return e._=r,this},N.identity=function(e){return e},N.times=function(e,t,n){var r=Array(e);for(var i=0;i":">",'"':""","'":"'","/":"/"}};P.unescape=N.invert(P.escape);var H={escape:new RegExp("["+N.keys(P.escape).join("")+"]","g"),unescape:new RegExp("("+N.keys(P.unescape).join("|")+")","g")};N.each(["escape","unescape"],function(e){N[e]=function(t){return t==null?"":(""+t).replace(H[e],function(t){return P[e][t]})}}),N.result=function(e,t){if(e==null)return null;var n=e[t];return N.isFunction(n)?n.call(e):n},N.mixin=function(e){C(N.functions(e),function(t){var n=N[t]=e[t];N.prototype[t]=function(){var e=[this._wrapped];return a.apply(e,arguments),q.call(this,n.apply(N,e))}})};var B=0;N.uniqueId=function(e){var t=""+ ++B;return e?e+t:t},N.templateSettings={evaluate:/<%([\s\S]+?)%>/g,interpolate:/<%=([\s\S]+?)%>/g,escape:/<%-([\s\S]+?)%>/g};var j=/(.)^/,F={"'":"'","\\":"\\","\r":"r","\n":"n"," ":"t","\u2028":"u2028","\u2029":"u2029"},I=/\\|'|\r|\n|\t|\u2028|\u2029/g;N.template=function(e,t,n){n=N.defaults({},n,N.templateSettings);var r=new RegExp([(n.escape||j).source,(n.interpolate||j).source,(n.evaluate||j).source].join("|")+"|$","g"),i=0,s="__p+='";e.replace(r,function(t,n,r,o,u){return s+=e.slice(i,u).replace(I,function(e){return"\\"+F[e]}),n&&(s+="'+\n((__t=("+n+"))==null?'':_.escape(__t))+\n'"),r&&(s+="'+\n((__t=("+r+"))==null?'':__t)+\n'"),o&&(s+="';\n"+o+"\n__p+='"),i=u+t.length,t}),s+="';\n",n.variable||(s="with(obj||{}){\n"+s+"}\n"),s="var __t,__p='',__j=Array.prototype.join,print=function(){__p+=__j.call(arguments,'');};\n"+s+"return __p;\n";try{var o=new Function(n.variable||"obj","_",s)}catch(u){throw u.source=s,u}if(t)return o(t,N);var a=function(e){return o.call(this,e,N)};return a.source="function("+(n.variable||"obj")+"){\n"+s+"}",a},N.chain=function(e){return N(e).chain()};var q=function(e){return this._chain?N(e).chain():e};N.mixin(N),C(["pop","push","reverse","shift","sort","splice","unshift"],function(e){var t=s[e];N.prototype[e]=function(){var n=this._wrapped;return t.apply(n,arguments),(e=="shift"||e=="splice")&&n.length===0&&delete n[0],q.call(this,n)}}),C(["concat","join","slice"],function(e){var t=s[e];N.prototype[e]=function(){return q.call(this,t.apply(this._wrapped,arguments))}}),N.extend(N.prototype,{chain:function(){return this._chain=!0,this},value:function(){return this._wrapped}})}).call(this)}),e.define("/node_modules/backbone/package.json",function(e,t,n,r,i,s,o){t.exports={main:"backbone.js"}}),e.define("/node_modules/backbone/backbone.js",function(e,t,n,r,i,s,o){(function(){var t=this,r=t.Backbone,i=[],s=i.push,o=i.slice,u=i.splice,a;typeof n!="undefined"?a=n:a=t.Backbone={},a.VERSION="0.9.9";var f=t._;!f&&typeof e!="undefined"&&(f=e("underscore")),a.$=t.jQuery||t.Zepto||t.ender,a.noConflict=function(){return t.Backbone=r,this},a.emulateHTTP=!1,a.emulateJSON=!1;var l=/\s+/,c=function(e,t,n,r){if(!n)return!0;if(typeof n=="object")for(var i in n)e[t].apply(e,[i,n[i]].concat(r));else{if(!l.test(n))return!0;var s=n.split(l);for(var o=0,u=s.length;o=0;r-=2)this.trigger("change:"+n[r],this,n[r+1],e);if(t)return this;while(this._pending)this._pending=!1,this.trigger("change",this,e),this._previousAttributes=f.clone(this.attributes);return this._changing=!1,this},hasChanged:function(e){return this._hasComputed||this._computeChanges(),e==null?!f.isEmpty(this.changed):f.has(this.changed,e)},changedAttributes:function(e){if(!e)return this.hasChanged()?f.clone(this.changed):!1;var t,n=!1,r=this._previousAttributes;for(var i in e){if(f.isEqual(r[i],t=e[i]))continue;(n||(n={}))[i]=t}return n},_computeChanges:function(e){this.changed={};var t={},n=[],r=this._currentAttributes,i=this._changes;for(var s=i.length-2;s>=0;s-=2){var o=i[s],u=i[s+1];if(t[o])continue;t[o]=!0;if(r[o]!==u){this.changed[o]=u;if(!e)continue;n.push(o,u),r[o]=u}}return e&&(this._changes=[]),this._hasComputed=!0,n},previous:function(e){return e==null||!this._previousAttributes?null:this._previousAttributes[e]},previousAttributes:function(){return f.clone(this._previousAttributes)},_validate:function(e,t){if(!this.validate)return!0;e=f.extend({},this.attributes,e);var n=this.validate(e,t);return n?(t&&t.error&&t.error(this,n,t),this.trigger("error",this,n,t),!1):!0}});var v=a.Collection=function(e,t){t||(t={}),t.model&&(this.model=t.model),t.comparator!==void 0&&(this.comparator=t.comparator),this._reset(),this.initialize.apply(this,arguments),e&&this.reset(e,f.extend({silent:!0},t))};f.extend(v.prototype,p,{model:d,initialize:function(){},toJSON:function(e){return this.map(function(t){return t.toJSON(e)})},sync:function(){return a.sync.apply(this,arguments)},add:function(e,t){var n,r,i,o,a,l,c=t&&t.at,h=(t&&t.sort)==null?!0:t.sort;e=f.isArray(e)?e.slice():[e];for(n=e.length-1;n>=0;n--){if(!(o=this._prepareModel(e[n],t))){this.trigger("error",this,e[n],t),e.splice(n,1);continue}e[n]=o,a=o.id!=null&&this._byId[o.id];if(a||this._byCid[o.cid]){t&&t.merge&&a&&(a.set(o.attributes,t),l=h),e.splice(n,1);continue}o.on("all",this._onModelEvent,this),this._byCid[o.cid]=o,o.id!=null&&(this._byId[o.id]=o)}e.length&&(l=h),this.length+=e.length,r=[c!=null?c:this.models.length,0],s.apply(r,e),u.apply(this.models,r),l&&this.comparator&&c==null&&this.sort({silent:!0});if(t&&t.silent)return this;while(o=e.shift())o.trigger("add",o,this,t);return this},remove:function(e,t){var n,r,i,s;t||(t={}),e=f.isArray(e)?e.slice():[e];for(n=0,r=e.length;n').hide().appendTo("body")[0].contentWindow,this.navigate(t)),this._hasPushState?a.$(window).bind("popstate",this.checkUrl):this._wantsHashChange&&"onhashchange"in window&&!r?a.$(window).bind("hashchange",this.checkUrl):this._wantsHashChange&&(this._checkUrlInterval=setInterval(this.checkUrl,this.interval)),this.fragment=t;var i=this.location,s=i.pathname.replace(/[^\/]$/,"$&/")===this.root;if(this._wantsHashChange&&this._wantsPushState&&!this._hasPushState&&!s)return this.fragment=this.getFragment(null,!0),this.location.replace(this.root+this.location.search+"#"+this.fragment),!0;this._wantsPushState&&this._hasPushState&&s&&i.hash&&(this.fragment=this.getHash().replace(T,""),this.history.replaceState({},document.title,this.root+this.fragment+i.search));if(!this.options.silent)return this.loadUrl()},stop:function(){a.$(window).unbind("popstate",this.checkUrl).unbind("hashchange",this.checkUrl),clearInterval(this._checkUrlInterval),x.started=!1},route:function(e,t){this.handlers.unshift({route:e,callback:t})},checkUrl:function(e){var t=this.getFragment();t===this.fragment&&this.iframe&&(t=this.getFragment(this.getHash(this.iframe)));if(t===this.fragment)return!1;this.iframe&&this.navigate(t),this.loadUrl()||this.loadUrl(this.getHash())},loadUrl:function(e){var t=this.fragment=this.getFragment(e),n=f.any(this.handlers,function(e){if(e.route.test(t))return e.callback(t),!0});return n},navigate:function(e,t){if(!x.started)return!1;if(!t||t===!0)t={trigger:t};e=this.getFragment(e||"");if(this.fragment===e)return;this.fragment=e;var n=this.root+e;if(this._hasPushState)this.history[t.replace?"replaceState":"pushState"]({},document.title,n);else{if(!this._wantsHashChange)return this.location.assign(n);this._updateHash(this.location,e,t.replace),this.iframe&&e!==this.getFragment(this.getHash(this.iframe))&&(t.replace||this.iframe.document.open().close(),this._updateHash(this.iframe.location,e,t.replace))}t.trigger&&this.loadUrl(e)},_updateHash:function(e,t,n){if(n){var r=e.href.replace(/(javascript:|#).*$/,"");e.replace(r+"#"+t)}else e.hash="#"+t}}),a.history=new x;var L=a.View=function(e){this.cid=f.uniqueId("view"),this._configure(e||{}),this._ensureElement(),this.initialize.apply(this,arguments),this.delegateEvents()},A=/^(\S+)\s*(.*)$/,O=["model","collection","el","id","attributes","className","tagName","events"];f.extend(L.prototype,p,{tagName:"div",$:function(e){return this.$el.find(e)},initialize:function(){},render:function(){return this},remove:function(){return this.$el.remove(),this.stopListening(),this},make:function(e,t,n){var r=document.createElement(e);return t&&a.$(r).attr(t),n!=null&&a.$(r).html(n),r},setElement:function(e,t){return this.$el&&this.undelegateEvents(),this.$el=e instanceof a.$?e:a.$(e),this.el=this.$el[0],t!==!1&&this.delegateEvents(),this},delegateEvents:function(e){if(!e&&!(e=f.result(this,"events")))return;this.undelegateEvents();for(var t in e){var n=e[t];f.isFunction(n)||(n=this[e[t]]);if(!n)throw new Error('Method "'+e[t]+'" does not exist');var r=t.match(A),i=r[1],s=r[2];n=f.bind(n,this),i+=".delegateEvents"+this.cid,s===""?this.$el.bind(i,n):this.$el.delegate(s,i,n)}},undelegateEvents:function(){this.$el.unbind(".delegateEvents"+this.cid)},_configure:function(e){this.options&&(e=f.extend({},f.result(this,"options"),e)),f.extend(this,f.pick(e,O)),this.options=e},_ensureElement:function(){if(!this.el){var e=f.extend({},f.result(this,"attributes"));this.id&&(e.id=f.result(this,"id")),this.className&&(e["class"]=f.result(this,"className")),this.setElement(this.make(f.result(this,"tagName"),e),!1)}else this.setElement(f.result(this,"el"),!1)}});var M={create:"POST",update:"PUT",patch:"PATCH","delete":"DELETE",read:"GET"};a.sync=function(e,t,n){var r=M[e];f.defaults(n||(n={}),{emulateHTTP:a.emulateHTTP,emulateJSON:a.emulateJSON});var i={type:r,dataType:"json"};n.url||(i.url=f.result(t,"url")||D()),n.data==null&&t&&(e==="create"||e==="update"||e==="patch")&&(i.contentType="application/json",i.data=JSON.stringify(n.attrs||t.toJSON(n))),n.emulateJSON&&(i.contentType="application/x-www-form-urlencoded",i.data=i.data?{model:i.data}:{});if(n.emulateHTTP&&(r==="PUT"||r==="DELETE"||r==="PATCH")){i.type="POST",n.emulateJSON&&(i.data._method=r);var s=n.beforeSend;n.beforeSend=function(e){e.setRequestHeader("X-HTTP-Method-Override",r);if(s)return s.apply(this,arguments)}}i.type!=="GET"&&!n.emulateJSON&&(i.processData=!1);var o=n.success;n.success=function(e,r,i){o&&o(e,r,i),t.trigger("sync",t,e,n)};var u=n.error;n.error=function(e,r,i){u&&u(t,e,n),t.trigger("error",t,e,n)};var l=a.ajax(f.extend(i,n));return t.trigger("request",t,l,n),l},a.ajax=function(){return a.$.ajax.apply(a.$,arguments)};var _=function(e,t){var n=this,r;e&&f.has(e,"constructor")?r=e.constructor:r=function(){n.apply(this,arguments)},f.extend(r,n,t);var i=function(){this.constructor=r};return i.prototype=n.prototype,r.prototype=new i,e&&f.extend(r.prototype,e),r.__super__=n.prototype,r};d.extend=v.extend=y.extend=L.extend=x.extend=_;var D=function(){throw new Error('A "url" property or function must be specified')}}).call(this)}),e.define("/node_modules/backbone/node_modules/underscore/package.json",function(e,t,n,r,i,s,o){t.exports={main:"underscore.js"}}),e.define("/node_modules/backbone/node_modules/underscore/underscore.js",function(e,t,n,r,i,s,o){(function(){var e=this,r=e._,i={},s=Array.prototype,o=Object.prototype,u=Function.prototype,a=s.push,f=s.slice,l=s.concat,c=o.toString,h=o.hasOwnProperty,p=s.forEach,d=s.map,v=s.reduce,m=s.reduceRight,g=s.filter,y=s.every,b=s.some,w=s.indexOf,E=s.lastIndexOf,S=Array.isArray,x=Object.keys,T=u.bind,N=function(e){if(e instanceof N)return e;if(!(this instanceof N))return new N(e);this._wrapped=e};typeof n!="undefined"?(typeof t!="undefined"&&t.exports&&(n=t.exports=N),n._=N):e._=N,N.VERSION="1.4.3";var C=N.each=N.forEach=function(e,t,n){if(e==null)return;if(p&&e.forEach===p)e.forEach(t,n);else if(e.length===+e.length){for(var r=0,s=e.length;r2;e==null&&(e=[]);if(v&&e.reduce===v)return r&&(t=N.bind(t,r)),i?e.reduce(t,n):e.reduce(t);C(e,function(e,s,o){i?n=t.call(r,n,e,s,o):(n=e,i=!0)});if(!i)throw new TypeError(k);return n},N.reduceRight=N.foldr=function(e,t,n,r){var i=arguments.length>2;e==null&&(e=[]);if(m&&e.reduceRight===m)return r&&(t=N.bind(t,r)),i?e.reduceRight(t,n):e.reduceRight(t);var s=e.length;if(s!==+s){var o=N.keys(e);s=o.length}C(e,function(u,a,f){a=o?o[--s]:--s,i?n=t.call(r,n,e[a],a,f):(n=e[a],i=!0)});if(!i)throw new TypeError(k);return n},N.find=N.detect=function(e,t,n){var r;return L(e,function(e,i,s){if(t.call(n,e,i,s))return r=e,!0}),r},N.filter=N.select=function(e,t,n){var r=[];return e==null?r:g&&e.filter===g?e.filter(t,n):(C(e,function(e,i,s){t.call(n,e,i,s)&&(r[r.length]=e)}),r)},N.reject=function(e,t,n){return N.filter(e,function(e,r,i){return!t.call(n,e,r,i)},n)},N.every=N.all=function(e,t,n){t||(t=N.identity);var r=!0;return e==null?r:y&&e.every===y?e.every(t,n):(C(e,function(e,s,o){if(!(r=r&&t.call(n,e,s,o)))return i}),!!r)};var L=N.some=N.any=function(e,t,n){t||(t=N.identity);var r=!1;return e==null?r:b&&e.some===b?e.some(t,n):(C(e,function(e,s,o){if(r||(r=t.call(n,e,s,o)))return i}),!!r)};N.contains=N.include=function(e,t){return e==null?!1:w&&e.indexOf===w?e.indexOf(t)!=-1:L(e,function(e){return e===t})},N.invoke=function(e,t){var n=f.call(arguments,2);return N.map(e,function(e){return(N.isFunction(t)?t:e[t]).apply(e,n)})},N.pluck=function(e,t){return N.map(e,function(e){return e[t]})},N.where=function(e,t){return N.isEmpty(t)?[]:N.filter(e,function(e){for(var n in t)if(t[n]!==e[n])return!1;return!0})},N.max=function(e,t,n){if(!t&&N.isArray(e)&&e[0]===+e[0]&&e.length<65535)return Math.max.apply(Math,e);if(!t&&N.isEmpty(e))return-Infinity;var r={computed:-Infinity,value:-Infinity};return C(e,function(e,i,s){var o=t?t.call(n,e,i,s):e;o>=r.computed&&(r={value:e,computed:o})}),r.value},N.min=function(e,t,n){if(!t&&N.isArray(e)&&e[0]===+e[0]&&e.length<65535)return Math.min.apply(Math,e);if(!t&&N.isEmpty(e))return Infinity;var r={computed:Infinity,value:Infinity};return C(e,function(e,i,s){var o=t?t.call(n,e,i,s):e;or||n===void 0)return 1;if(n>>1;n.call(r,e[u])=0})})},N.difference=function(e){var t=l.apply(s,f.call(arguments,1));return N.filter(e,function(e){return!N.contains(t,e)})},N.zip=function(){var e=f.call(arguments),t=N.max(N.pluck(e,"length")),n=new Array(t);for(var r=0;r=0;n--)t=[e[n].apply(this,t)];return t[0]}},N.after=function(e,t){return e<=0?t():function(){if(--e<1)return t.apply(this,arguments)}},N.keys=x||function(e){if(e!==Object(e))throw new TypeError("Invalid object");var t=[];for(var n in e)N.has(e,n)&&(t[t.length]=n);return t},N.values=function(e){var t=[];for(var n in e)N.has(e,n)&&t.push(e[n]);return t},N.pairs=function(e){var t=[];for(var n in e)N.has(e,n)&&t.push([n,e[n]]);return t},N.invert=function(e){var t={};for(var n in e)N.has(e,n)&&(t[e[n]]=n);return t},N.functions=N.methods=function(e){var t=[];for(var n in e)N.isFunction(e[n])&&t.push(n);return t.sort()},N.extend=function(e){return C(f.call(arguments,1),function(t){if(t)for(var n in t)e[n]=t[n]}),e},N.pick=function(e){var t={},n=l.apply(s,f.call(arguments,1));return C(n,function(n){n in e&&(t[n]=e[n])}),t},N.omit=function(e){var t={},n=l.apply(s,f.call(arguments,1));for(var r in e)N.contains(n,r)||(t[r]=e[r]);return t},N.defaults=function(e){return C(f.call(arguments,1),function(t){if(t)for(var n in t)e[n]==null&&(e[n]=t[n])}),e},N.clone=function(e){return N.isObject(e)?N.isArray(e)?e.slice():N.extend({},e):e},N.tap=function(e,t){return t(e),e};var D=function(e,t,n,r){if(e===t)return e!==0||1/e==1/t;if(e==null||t==null)return e===t;e instanceof N&&(e=e._wrapped),t instanceof N&&(t=t._wrapped);var i=c.call(e);if(i!=c.call(t))return!1;switch(i){case"[object String]":return e==String(t);case"[object Number]":return e!=+e?t!=+t:e==0?1/e==1/t:e==+t;case"[object Date]":case"[object Boolean]":return+e==+t;case"[object RegExp]":return e.source==t.source&&e.global==t.global&&e.multiline==t.multiline&&e.ignoreCase==t.ignoreCase}if(typeof e!="object"||typeof t!="object")return!1;var s=n.length;while(s--)if(n[s]==e)return r[s]==t;n.push(e),r.push(t);var o=0,u=!0;if(i=="[object Array]"){o=e.length,u=o==t.length;if(u)while(o--)if(!(u=D(e[o],t[o],n,r)))break}else{var a=e.constructor,f=t.constructor;if(a!==f&&!(N.isFunction(a)&&a instanceof a&&N.isFunction(f)&&f instanceof f))return!1;for(var l in e)if(N.has(e,l)){o++;if(!(u=N.has(t,l)&&D(e[l],t[l],n,r)))break}if(u){for(l in t)if(N.has(t,l)&&!(o--))break;u=!o}}return n.pop(),r.pop(),u};N.isEqual=function(e,t){return D(e,t,[],[])},N.isEmpty=function(e){if(e==null)return!0;if(N.isArray(e)||N.isString(e))return e.length===0;for(var t in e)if(N.has(e,t))return!1;return!0},N.isElement=function(e){return!!e&&e.nodeType===1},N.isArray=S||function(e){return c.call(e)=="[object Array]"},N.isObject=function(e){return e===Object(e)},C(["Arguments","Function","String","Number","Date","RegExp"],function(e){N["is"+e]=function(t){return c.call(t)=="[object "+e+"]"}}),N.isArguments(arguments)||(N.isArguments=function(e){return!!e&&!!N.has(e,"callee")}),typeof /./!="function"&&(N.isFunction=function(e){return typeof e=="function"}),N.isFinite=function(e){return isFinite(e)&&!isNaN(parseFloat(e))},N.isNaN=function(e){return N.isNumber(e)&&e!=+e},N.isBoolean=function(e){return e===!0||e===!1||c.call(e)=="[object Boolean]"},N.isNull=function(e){return e===null},N.isUndefined=function(e){return e===void 0},N.has=function(e,t){return h.call(e,t)},N.noConflict=function(){return e._=r,this},N.identity=function(e){return e},N.times=function(e,t,n){var r=Array(e);for(var i=0;i":">",'"':""","'":"'","/":"/"}};P.unescape=N.invert(P.escape);var H={escape:new RegExp("["+N.keys(P.escape).join("")+"]","g"),unescape:new RegExp("("+N.keys(P.unescape).join("|")+")","g")};N.each(["escape","unescape"],function(e){N[e]=function(t){return t==null?"":(""+t).replace(H[e],function(t){return P[e][t]})}}),N.result=function(e,t){if(e==null)return null;var n=e[t];return N.isFunction(n)?n.call(e):n},N.mixin=function(e){C(N.functions(e),function(t){var n=N[t]=e[t];N.prototype[t]=function(){var e=[this._wrapped];return a.apply(e,arguments),q.call(this,n.apply(N,e))}})};var B=0;N.uniqueId=function(e){var t=""+ ++B;return e?e+t:t},N.templateSettings={evaluate:/<%([\s\S]+?)%>/g,interpolate:/<%=([\s\S]+?)%>/g,escape:/<%-([\s\S]+?)%>/g};var j=/(.)^/,F={"'":"'","\\":"\\","\r":"r","\n":"n"," ":"t","\u2028":"u2028","\u2029":"u2029"},I=/\\|'|\r|\n|\t|\u2028|\u2029/g;N.template=function(e,t,n){n=N.defaults({},n,N.templateSettings);var r=new RegExp([(n.escape||j).source,(n.interpolate||j).source,(n.evaluate||j).source].join("|")+"|$","g"),i=0,s="__p+='";e.replace(r,function(t,n,r,o,u){return s+=e.slice(i,u).replace(I,function(e){return"\\"+F[e]}),n&&(s+="'+\n((__t=("+n+"))==null?'':_.escape(__t))+\n'"),r&&(s+="'+\n((__t=("+r+"))==null?'':__t)+\n'"),o&&(s+="';\n"+o+"\n__p+='"),i=u+t.length,t}),s+="';\n",n.variable||(s="with(obj||{}){\n"+s+"}\n"),s="var __t,__p='',__j=Array.prototype.join,print=function(){__p+=__j.call(arguments,'');};\n"+s+"return __p;\n";try{var o=new Function(n.variable||"obj","_",s)}catch(u){throw u.source=s,u}if(t)return o(t,N);var a=function(e){return o.call(this,e,N)};return a.source="function("+(n.variable||"obj")+"){\n"+s+"}",a},N.chain=function(e){return N(e).chain()};var q=function(e){return this._chain?N(e).chain():e};N.mixin(N),C(["pop","push","reverse","shift","sort","splice","unshift"],function(e){var t=s[e];N.prototype[e]=function(){var n=this._wrapped;return t.apply(n,arguments),(e=="shift"||e=="splice")&&n.length===0&&delete n[0],q.call(this,n)}}),C(["concat","join","slice"],function(e){var t=s[e];N.prototype[e]=function(){return q.call(this,t.apply(this._wrapped,arguments))}}),N.extend(N.prototype,{chain:function(){return this._chain=!0,this},value:function(){return this._wrapped}})}).call(this)}),e.define("/src/js/util/constants.js",function(e,t,n,r,i,s,o){var u={betweenCommandsDelay:400},a={isAnimating:!1},f={minZoom:.55,maxZoom:1.25,minWidth:600,minHeight:600},l={arrowHeadSize:8,nodeRadius:17,curveControlPointOffset:50,defaultEasing:"easeInOut",defaultAnimationTime:400,rectFill:"hsb(0.8816909813322127,0.7,1)",headRectFill:"#2831FF",rectStroke:"#FFF",rectStrokeWidth:"3",multiBranchY:20,upstreamHeadOpacity:.5,upstreamNoneOpacity:.2,edgeUpstreamHeadOpacity:.4,edgeUpstreamNoneOpacity:.15,visBranchStrokeWidth:2,visBranchStrokeColorNone:"#333",defaultNodeFill:"hsba(0.5,0.8,0.7,1)",defaultNodeStrokeWidth:2,defaultNodeStroke:"#FFF",orphanNodeFill:"hsb(0.5,0.8,0.7)"};n.GLOBAL=a,n.TIME=u,n.GRAPHICS=l,n.VIEWPORT=f}),e.define("/src/js/util/index.js",function(e,t,n,r,i,s,o){var u=e("underscore");n.isBrowser=function(){var e=String(typeof window)!=="undefined";return e},n.splitTextCommand=function(e,t,n){t=u.bind(t,n),u.each(e.split(";"),function(e,n){e=u.escape(e),e=e.replace(/^(\s+)/,"").replace(/(\s+)$/,"").replace(/"/g,'"').replace(/'/g,"'");if(n>0&&!e.length)return;t(e)})},n.genParseCommand=function(e,t){return function(n){var r,i;return u.each(e,function(e,t){var s=e.exec(n);s&&(r=t,i=s)}),r?{toSet:{eventName:t,method:r,regexResults:i}}:!1}}}),e.define("/src/js/level/sandbox.js",function(e,t,n,r,i,s,o){var u=e("underscore"),a=e("q"),f=e("../util").isBrowser()?window.Backbone:e("backbone"),l=e("../util"),c=e("../app"),h=e("../visuals/visualization").Visualization,p=e("../level/parseWaterfall").ParseWaterfall,d=e("../level/disabledMap").DisabledMap,v=e("../models/commandModel").Command,m=e("../git/gitShim").GitShim,g=e("../views"),y=g.ModalTerminal,b=g.ModalAlert,w=e("../views/builderViews"),E=e("../views/multiView").MultiView,S=f.View.extend({tagName:"div",initialize:function(e){e=e||{},this.options=e,this.initVisualization(e),this.initCommandCollection(e),this.initParseWaterfall(e),this.initGitShim(e),e.wait||this.takeControl()},getDefaultVisEl:function(){return $("#mainVisSpace")[0]},getAnimationTime:function(){return 1050},initVisualization:function(e){this.mainVis=new h({el:e.el||this.getDefaultVisEl()})},initCommandCollection:function(e){this.commandCollection=c.getCommandUI().commandCollection},initParseWaterfall:function(e){this.parseWaterfall=new p},initGitShim:function(e){},takeControl:function(){c.getEventBaton().stealBaton("commandSubmitted",this.commandSubmitted,this),c.getEventBaton().stealBaton("processSandboxCommand",this.processSandboxCommand,this),c.getEventBaton().stealBaton("levelExited",this.levelExited,this),this.insertGitShim()},releaseControl:function(){c.getEventBaton().releaseBaton("commandSubmitted",this.commandSubmitted,this),c.getEventBaton().releaseBaton("processSandboxCommand",this.processSandboxCommand,this),c.getEventBaton().releaseBaton("levelExited",this.levelExited,this),this.releaseGitShim()},releaseGitShim:function(){this.gitShim&&this.gitShim.removeShim()},insertGitShim:function(){this.gitShim&&this.mainVis.customEvents.on("gitEngineReady",function(){this.gitShim.insertShim()},this)},commandSubmitted:function(e){c.getEvents().trigger("commandSubmittedPassive",e),l.splitTextCommand(e,function(e){this.commandCollection.add(new v({rawStr:e,parseWaterfall:this.parseWaterfall}))},this)},startLevel:function(t,n){var r=t.get("regexResults")||[],i=r[1]||"",s=c.getLevelArbiter().getLevel(i);if(!s){t.addWarning('A level for that id "'+i+'" was not found!! Opening up level selection view...'),c.getEventBaton().trigger("commandSubmitted","levels"),t.set("status","error"),n.resolve();return}this.hide(),this.clear();var o=a.defer(),u=e("../level").Level;this.currentLevel=new u({level:s,deferred:o,command:t}),o.promise.then(function(){t.finishWith(n)})},buildLevel:function(t,n){this.hide(),this.clear();var r=a.defer(),i=e("../level/builder").LevelBuilder;this.levelBuilder=new i({deferred:r}),r.promise.then(function(){t.finishWith(n)})},exitLevel:function(e,t){e.addWarning("You aren't in a level! You are in a sandbox, start a level with `level [id]`"),e.set("status","error"),t.resolve()},showLevels:function(e,t){var n=a.defer();c.getLevelDropdown().show(n,e),n.promise.done(function(){e.finishWith(t)})},resetSolved:function(e,t){c.getLevelArbiter().resetSolvedMap(),e.addWarning("Solved map was reset, you are starting from a clean slate!"),e.finishWith(t)},processSandboxCommand:function(e,t){var n={"reset solved":this.resetSolved,"help general":this.helpDialog,help:this.helpDialog,reset:this.reset,delay:this.delay,clear:this.clear,"exit level":this.exitLevel,level:this.startLevel,sandbox:this.exitLevel,levels:this.showLevels,mobileAlert:this.mobileAlert,"build level":this.buildLevel,"export tree":this.exportTree,"import tree":this.importTree,"import level":this.importLevel},r=n[e.get("method")];if(!r)throw new Error("no method for that wut");r.apply(this,[e,t])},hide:function(){this.mainVis.hide()},levelExited:function(){this.show()},show:function(){this.mainVis.show()},importTree:function(e,t){var n=new w.MarkdownPresenter({previewText:"Paste a tree JSON blob below!",fillerText:" "});n.deferred.promise.then(u.bind(function(e){try{this.mainVis.gitEngine.loadTree(JSON.parse(e))}catch(t){this.mainVis.reset(),new E({childViews:[{type:"ModalAlert",options:{markdowns:["## Error!","","Something is wrong with that JSON! Here is the error:","",String(t)]}}]})}},this)).fail(function(){}).done(function(){e.finishWith(t)})},importLevel:function(t,n){var r=new w.MarkdownPresenter({previewText:"Paste a level JSON blob in here!",fillerText:" "});r.deferred.promise.then(u.bind(function(r){var i=e("../level").Level;try{var s=JSON.parse(r),o=a.defer();this.currentLevel=new i({level:s,deferred:o,command:t}),o.promise.then(function(){t.finishWith(n)})}catch(u){new E({childViews:[{type:"ModalAlert",options:{markdowns:["## Error!","","Something is wrong with that level JSON, this happened:","",String(u)]}}]}),t.finishWith(n)}},this)).fail(function(){t.finishWith(n)}).done()},exportTree:function(e,t){var n=JSON.stringify(this.mainVis.gitEngine.exportTree(),null,2),r=new E({childViews:[{type:"MarkdownPresenter",options:{previewText:'Share this tree with friends! They can load it with "import tree"',fillerText:n,noConfirmCancel:!0}}]});r.getPromise().then(function(){e.finishWith(t)}).done()},clear:function(e,t){c.getEvents().trigger("clearOldCommands"),e&&t&&e.finishWith(t)},mobileAlert:function(e,t){alert("Can't bring up the keyboard on mobile / tablet :( try visiting on desktop! :D"),e.finishWith(t)},delay:function(e,t){var n=parseInt(e.get("regexResults")[1],10);setTimeout(function(){e.finishWith(t)},n)},reset:function(e,t){this.mainVis.reset(),setTimeout(function(){e.finishWith(t)},this.mainVis.getAnimationTime())},helpDialog:function(t,n){var r=new E({childViews:e("../dialogs/sandbox").dialog});r.getPromise().then(u.bind(function(){t.finishWith(n)},this)).done()}});n.Sandbox=S}),e.define("/node_modules/q/package.json",function(e,t,n,r,i,s,o){t.exports={main:"q.js"}}),e.define("/node_modules/q/q.js",function(e,t,n,r,i,s,o){(function(e){if(typeof bootstrap=="function")bootstrap("promise",e);else if(typeof n=="object")e(void 0,n);else if(typeof define=="function")define(e);else if(typeof ses!="undefined"){if(!ses.ok())return;ses.makeQ=function(){var t={};return e(void 0,t)}}else e(void 0,Q={})})(function(e,t){"use strict";function w(e){return b(e)==="[object StopIteration]"||e instanceof E}function x(e,t){t.stack&&typeof e=="object"&&e!==null&&e.stack&&e.stack.indexOf(S)===-1&&(e.stack=T(e.stack)+"\n"+S+"\n"+T(t.stack))}function T(e){var t=e.split("\n"),n=[];for(var r=0;r=n&&s<=Nt}function k(){if(Error.captureStackTrace){var e,t,n=Error.prepareStackTrace;return Error.prepareStackTrace=function(n,r){e=r[1].getFileName(),t=r[1].getLineNumber()},(new Error).stack,Error.prepareStackTrace=n,r=e,t}}function L(e,t,n){return function(){return typeof console!="undefined"&&typeof console.warn=="function"&&console.warn(t+" is deprecated, use "+n+" instead.",(new Error("")).stack),e.apply(e,arguments)}}function A(){function s(r){if(!e)return;n=U(r),d(e,function(e,t){u(function(){n.promiseSend.apply(n,t)})},void 0),e=void 0,t=void 0}var e=[],t=[],n,r=g(A.prototype),i=g(M.prototype);return i.promiseSend=function(r,i,s,o){var a=p(arguments);e?(e.push(a),r==="when"&&o&&t.push(o)):u(function(){n.promiseSend.apply(n,a)})},i.valueOf=function(){return e?i:n.valueOf()},Error.captureStackTrace&&(Error.captureStackTrace(i,A),i.stack=i.stack.substring(i.stack.indexOf("\n")+1)),o(i),r.promise=i,r.resolve=s,r.reject=function(e){s(R(e))},r.notify=function(n){e&&d(t,function(e,t){u(function(){t(n)})},void 0)},r}function O(e){var t=A();return st(e,t.resolve,t.reject,t.notify).fail(t.reject),t.promise}function M(e,t,n,r){t===void 0&&(t=function(e){return R(new Error("Promise does not support operation: "+e))});var i=g(M.prototype);return i.promiseSend=function(n,r){var s=p(arguments,2),o;try{e[n]?o=e[n].apply(i,s):o=t.apply(i,[n].concat(s))}catch(u){o=R(u)}r&&r(o)},n&&(i.valueOf=n),r&&(i.exception=r),o(i),i}function _(e){return D(e)?e.valueOf():e}function D(e){return e&&typeof e.promiseSend=="function"}function P(e){return H(e)||B(e)}function H(e){return!D(_(e))}function B(e){return e=_(e),D(e)&&"exception"in e}function q(){!I&&typeof window!="undefined"&&!window.Touch&&window.console&&console.log("Should be empty:",F),I=!0}function R(e){e=e||new Error;var t=M({when:function(t){if(t){var n=v(j,this);n!==-1&&(F.splice(n,1),j.splice(n,1))}return t?t(e):R(e)}},function(){return R(e)},function n(){return this},e);return q(),j.push(t),F.push(e),t}function U(e){if(D(e))return e;e=_(e);if(e&&typeof e.then=="function"){var t=A();return e.then(t.resolve,t.reject,t.notify),t.promise}return M({when:function(){return e},get:function(t){return e[t]},put:function(t,n){return e[t]=n,e},del:function(t){return delete e[t],e},post:function(t,n){return e[t].apply(e,n)},apply:function(t,n){return e.apply(t,n)},fapply:function(t){return e.apply(void 0,t)},viewInfo:function(){function r(e){n[e]||(n[e]=typeof t[e])}var t=e,n={};while(t)Object.getOwnPropertyNames(t).forEach(r),t=Object.getPrototypeOf(t);return{type:typeof e,properties:n}},keys:function(){return y(e)}},void 0,function n(){return e})}function z(e){return M({isDef:function(){}},function(){var n=p(arguments);return Y.apply(void 0,[e].concat(n))},function(){return _(e)})}function W(e,t){return e=U(e),t?M({viewInfo:function(){return t}},function(){var n=p(arguments);return Y.apply(void 0,[e].concat(n))},function(){return _(e)}):Y(e,"viewInfo")}function X(e){return W(e).when(function(t){var n;t.type==="function"?n=function(){return nt(e,void 0,arguments)}:n={};var r=t.properties||{};return y(r).forEach(function(t){r[t]==="function"&&(n[t]=function(){return tt(e,t,arguments)})}),U(n)})}function V(e,t,n,r){function o(e){try{return t?t(e):e}catch(n){return R(n)}}function a(e){if(n){x(e,l);try{return n(e)}catch(t){return R(t)}}return R(e)}function f(e){return r?r(e):e}var i=A(),s=!1,l=U(e);return u(function(){l.promiseSend("when",function(e){if(s)return;s=!0,i.resolve(o(e))},function(e){if(s)return;s=!0,i.resolve(a(e))})}),l.promiseSend("when",void 0,void 0,function(e){i.notify(f(e))}),i.promise}function $(e,t,n){return V(e,function(e){return at(e).then(function(e){return t.apply(void 0,e)},n)},n)}function J(e){return function(){function t(e,t){var s;try{s=n[e](t)}catch(o){return w(o)?o.value:R(o)}return V(s,r,i)}var n=e.apply(this,arguments),r=t.bind(t,"send"),i=t.bind(t,"throw");return r()}}function K(e){throw new E(e)}function Q(e){return function(){return at([this,at(arguments)]).spread(function(t,n){return e.apply(t,n)})}}function G(e){return function(t){var n=p(arguments,1);return Y.apply(void 0,[t,e].concat(n))}}function Y(e,t){var n=A(),r=p(arguments,2);return e=U(e),u(function(){e.promiseSend.apply(e,[t,n.resolve].concat(r))}),n.promise}function Z(e,t,n){var r=A();return e=U(e),u(function(){e.promiseSend.apply(e,[t,r.resolve].concat(n))}),r.promise}function et(e){return function(t){var n=p(arguments,1);return Z(t,e,n)}}function it(e,t){var n=p(arguments,2);return nt(e,t,n)}function st(e){var t=p(arguments,1);return rt(e,t)}function ot(e,t){var n=p(arguments,2);return function(){var i=n.concat(p(arguments));return nt(e,t,i)}}function ut(e){var t=p(arguments,1);return function(){var r=t.concat(p(arguments));return rt(e,r)}}function at(e){return V(e,function(e){var t=e.length;if(t===0)return U(e);var n=A();return d(e,function(r,i,s){H(i)?(e[s]=_(i),--t===0&&n.resolve(e)):V(i,function(r){e[s]=r,--t===0&&n.resolve(e)}).fail(n.reject)},void 0),n.promise})}function ft(e){return V(e,function(e){return V(at(m(e,function(e){return V(e,i,i)})),function(){return m(e,U)})})}function lt(e,t){return V(e,void 0,t)}function ct(e,t){return V(e,void 0,void 0,t)}function ht(e,t){return V(e,function(e){return V(t(),function(){return e})},function(e){return V(t(),function(){return R(e)})})}function pt(e,n,r,i){function s(n){u(function(){x(n,e);if(!t.onerror)throw n;t.onerror(n)})}var o=n||r||i?V(e,n,r,i):e;lt(o,s)}function dt(e,t){var n=A(),r=setTimeout(function(){n.reject(new Error("Timed out after "+t+" ms"))},t);return V(e,function(e){clearTimeout(r),n.resolve(e)},function(e){clearTimeout(r),n.reject(e)}),n.promise}function vt(e,t){t===void 0&&(t=e,e=void 0);var n=A();return setTimeout(function(){n.resolve(e)},t),n.promise}function mt(e,t){var n=p(t),r=A();return n.push(r.makeNodeResolver()),rt(e,n).fail(r.reject),r.promise}function gt(e){var t=p(arguments,1),n=A();return t.push(n.makeNodeResolver()),rt(e,t).fail(n.reject),n.promise}function yt(e){var t=p(arguments,1);return function(){var n=t.concat(p(arguments)),r=A();return n.push(r.makeNodeResolver()),rt(e,n).fail(r.reject),r.promise}}function bt(e,t,n){return Et(e,t).apply(void 0,n)}function wt(e,t){var n=p(arguments,2);return bt(e,t,n)}function Et(e){if(arguments.length>1){var t=arguments[1],n=p(arguments,2),r=e;e=function(){var e=n.concat(p(arguments));return r.apply(t,e)}}return function(){var t=A(),n=p(arguments);return n.push(t.makeNodeResolver()),rt(e,n).fail(t.reject),t.promise}}function St(e,t,n){var r=p(n),i=A();return r.push(i.makeNodeResolver()),tt(e,t,r).fail(i.reject),i.promise}function xt(e,t){var n=p(arguments,2),r=A();return n.push(r.makeNodeResolver()),tt(e,t,n).fail(r.reject),r.promise}function Tt(e,t){if(!t)return e;e.then(function(e){u(function(){t(null,e)})},function(e){u(function(){t(e)})})}var n=k(),r,i=function(){},o=Object.freeze||i;typeof cajaVM!="undefined"&&(o=cajaVM.def);var u;if(typeof s!="undefined")u=s.nextTick;else if(typeof setImmediate=="function")u=setImmediate;else if(typeof MessageChannel!="undefined"){var a=new MessageChannel,f={},l=f;a.port1.onmessage=function(){f=f.next;var e=f.task;delete f.task,e()},u=function(e){l=l.next={task:e},a.port2.postMessage(0)}}else u=function(e){setTimeout(e,0)};var c;if(Function.prototype.bind){var h=Function.prototype.bind;c=h.bind(h.call)}else c=function(e){return function(){return e.call.apply(e,arguments)}};var p=c(Array.prototype.slice),d=c(Array.prototype.reduce||function(e,t){var n=0,r=this.length;if(arguments.length===1)do{if(n in this){t=this[n++];break}if(++n>=r)throw new TypeError}while(1);for(;n2?e.resolve(p(arguments,1)):e.resolve(n)}},A.prototype.node=L(A.prototype.makeNodeResolver,"node","makeNodeResolver"),t.promise=O,t.makePromise=M,M.prototype.then=function(e,t,n){return V(this,e,t,n)},M.prototype.thenResolve=function(e){return V(this,function(){return e})},d(["isResolved","isFulfilled","isRejected","when","spread","send","get","put","del","post","invoke","keys","apply","call","bind","fapply","fcall","fbind","all","allResolved","view","viewInfo","timeout","delay","catch","finally","fail","fin","progress","end","done","nfcall","nfapply","nfbind","ncall","napply","nbind","npost","ninvoke","nend","nodeify"],function(e,n){M.prototype[n]=function(){return t[n].apply(t,[this].concat(p(arguments)))}},void 0),M.prototype.toSource=function(){return this.toString()},M.prototype.toString=function(){return"[object Promise]"},o(M.prototype),t.nearer=_,t.isPromise=D,t.isResolved=P,t.isFulfilled=H,t.isRejected=B;var j=[],F=[],I;t.reject=R,t.begin=U,t.resolve=U,t.ref=L(U,"ref","resolve"),t.master=z,t.viewInfo=W,t.view=X,t.when=V,t.spread=$,t.async=J,t["return"]=K,t.promised=Q,t.sender=L(G,"sender","dispatcher"),t.Method=L(G,"Method","dispatcher"),t.send=L(Y,"send","dispatch"),t.dispatch=Z,t.dispatcher=et,t.get=et("get"),t.put=et("put"),t["delete"]=t.del=et("del");var tt=t.post=et("post");t.invoke=function(e,t){var n=p(arguments,2);return tt(e,t,n)};var nt=t.apply=L(et("apply"),"apply","fapply"),rt=t.fapply=et("fapply");t.call=L(it,"call","fcall"),t["try"]=st,t.fcall=st,t.bind=L(ot,"bind","fbind"),t.fbind=ut,t.keys=et("keys"),t.all=at,t.allResolved=ft,t["catch"]=t.fail=lt,t.progress=ct,t["finally"]=t.fin=ht,t.end=L(pt,"end","done"),t.done=pt,t.timeout=dt,t.delay=vt,t.nfapply=mt,t.nfcall=gt,t.nfbind=yt,t.napply=L(bt,"napply","npost"),t.ncall=L(wt,"ncall","ninvoke"),t.nbind=L(Et,"nbind","nfbind"),t.npost=St,t.ninvoke=xt,t.nend=L(Tt,"nend","nodeify"),t.nodeify=Tt;var Nt=k()})}),e.define("/src/js/app/index.js",function(e,t,n,r,i,s,o){function y(){var t=e("../models/collections"),n=e("../views/commandViews");this.commandCollection=new t.CommandCollection,this.commandBuffer=new t.CommandBuffer({collection:this.commandCollection}),this.commandPromptView=new n.CommandPromptView({el:$("#commandLineBar")}),this.commandLineHistoryView=new n.CommandLineHistoryView({el:$("#commandLineHistory"),collection:this.commandCollection})}var u=e("underscore"),a=e("backbone"),f=e("../util/constants"),l=e("../util"),c=u.clone(a.Events),h,p,d,v,m,g=function(){var t=e("../level/sandbox").Sandbox,n=e("../level").Level,r=e("../util/eventBaton").EventBaton,i=e("../level/arbiter").LevelArbiter,s=e("../views/levelDropdownView").LevelDropdownView;d=new r,h=new y,p=new t,v=new i,m=new s({wait:!0});var o=function(){$("#commandTextField").focus()};o(),$(window).focus(function(e){d.trigger("windowFocus",e)}),$(document).click(function(e){d.trigger("documentClick",e)}),$(document).bind("keydown",function(e){d.trigger("docKeydown",e)}),$(document).bind("keyup",function(e){d.trigger("docKeyup",e)}),$(window).on("resize",function(e){c.trigger("resize",e)}),d.stealBaton("docKeydown",function(){}),d.stealBaton("docKeyup",function(){}),d.stealBaton("windowFocus",o),d.stealBaton("documentClick",o);var a=function(e){return function(){var t=[e];u.each(arguments,function(e){t.push(e)}),d.trigger.apply(d,t)}};$("#commandTextField").on("keydown",a("keydown")),$("#commandTextField").on("keyup",a("keyup")),$(window).trigger("resize"),/\?demo/.test(window.location.href)?p.mainVis.customEvents.on("gitEngineReady",function(){d.trigger("commandSubmitted",["git commit; git checkout -b bugFix C1; git commit; git merge master; git checkout master; git commit; git rebase bugFix;","delay 1000; reset;","level rebase1 --noFinishDialog --noStartCommand --noIntroDialog;","delay 2000; show goal; delay 1000; hide goal;","git checkout bugFix; git rebase master; git checkout side; git rebase bugFix;","git checkout another; git rebase side; git rebase another master;","help; levels"].join(""))}):/\?NODEMO/.test(window.location.href)||p.mainVis.customEvents.on("gitEngineReady",function(){d.trigger("commandSubmitted",["git help;","delay 1000;","help;","levels"].join(""))});if(/command=/.test(window.location.href)){var f=window.location.href.split("command=")[1].split("&")[0],l=unescape(f);p.mainVis.customEvents.on("gitEngineReady",function(){d.trigger("commandSubmitted",l)})}(/(iPhone|iPod|iPad).*AppleWebKit/i.test(navigator.userAgent)||/android/i.test(navigator.userAgent))&&p.mainVis.customEvents.on("gitEngineReady",function(){d.trigger("commandSubmitted","mobile alert")})};e("../util").isBrowser()&&$(document).ready(g),n.getEvents=function(){return c},n.getSandbox=function(){return p},n.getEventBaton=function(){return d},n.getCommandUI=function(){return h},n.getLevelArbiter=function(){return v},n.getLevelDropdown=function(){return m},n.init=g}),e.define("/src/js/level/index.js",function(e,t,n,r,i,s,o){var u=e("underscore"),a=e("backbone"),f=e("q"),l=e("../util"),c=e("../app"),h=e("../util/errors"),p=e("../level/sandbox").Sandbox,d=e("../util/constants"),v=e("../visuals/visualization").Visualization,m=e("../level/parseWaterfall").ParseWaterfall,g=e("../level/disabledMap").DisabledMap,y=e("../models/commandModel").Command,b=e("../git/gitShim").GitShim,w=e("../views/multiView").MultiView,E=e("../views").CanvasTerminalHolder,S=e("../views").ConfirmCancelTerminal,x=e("../views").NextLevelConfirm,T=e("../views").LevelToolbar,N=e("../git/treeCompare").TreeCompare,C={"help level":/^help level$/,"start dialog":/^start dialog$/,"show goal":/^show goal$/,"hide goal":/^hide goal$/,"show solution":/^show solution($|\s)/},k=l.genParseCommand(C,"processLevelCommand"),L=p.extend({initialize:function(e){e=e||{},e.level=e.level||{},this.level=e.level,this.gitCommandsIssued=[],this.commandsThatCount=this.getCommandsThatCount(),this.solved=!1,this.treeCompare=new N,this.initGoalData(e),this.initName(e),L.__super__.initialize.apply(this,[e]),this.startOffCommand(),this.handleOpen(e.deferred)},handleOpen:function(e){e=e||f.defer();if(this.level.startDialog&&!this.testOption("noIntroDialog")){new w(u.extend({},this.level.startDialog,{deferred:e}));return}setTimeout(function(){e.resolve()},this.getAnimationTime()*1.2)},startDialog:function(e,t){if(!this.level.startDialog){e.set("error",new h.GitError({msg:"There is no start dialog to show for this level!"})),t.resolve();return}this.handleOpen(t),t.promise.then(function(){e.set("status","finished")})},initName:function(){this.level.name||(this.level.name="Rebase Classic",console.warn("REALLY BAD FORM need ids and names")),this.levelToolbar=new T({name:this.level.name})},initGoalData:function(e){if(!this.level.goalTreeString||!this.level.solutionCommand)throw new Error("need goal tree and solution")},takeControl:function(){c.getEventBaton().stealBaton("processLevelCommand",this.processLevelCommand,this),L.__super__.takeControl.apply(this)},releaseControl:function(){c.getEventBaton().releaseBaton("processLevelCommand",this.processLevelCommand,this),L.__super__.releaseControl.apply(this)},startOffCommand:function(){this.testOption("noStartCommand")||c.getEventBaton().trigger("commandSubmitted","hint; delay 2000; show goal")},initVisualization:function(e){this.mainVis=new v({el:e.el||this.getDefaultVisEl(),treeString:e.level.startTree}),this.initGoalVisualization()},initGoalVisualization:function(){this.goalCanvasHolder=new E,this.goalVis=new v({el:this.goalCanvasHolder.getCanvasLocation(),containerElement:this.goalCanvasHolder.getCanvasLocation(),treeString:this.level.goalTreeString,noKeyboardInput:!0,noClick:!0})},showSolution:function(e,t){var n=this.level.solutionCommand,r=function(){c.getEventBaton().trigger("commandSubmitted",n)},i=e.get("rawStr");this.testOptionOnString(i,"noReset")||(n="reset; "+n);if(this.testOptionOnString(i,"force")){r(),e.finishWith(t);return}var s=f.defer(),o=new S({markdowns:["## Are you sure you want to see the solution?","","I believe in you! You can do it"],deferred:s});s.promise.then(r).fail(function(){e.setResult("Great! I'll let you get back to it")}).done(function(){setTimeout(function(){e.finishWith(t)},o.getAnimationTime())})},showGoal:function(e,t){this.goalCanvasHolder.slideIn();if(!e||!t)return;setTimeout(function(){e.finishWith(t)},this.goalCanvasHolder.getAnimationTime())},hideGoal:function(e,t){this.goalCanvasHolder.slideOut();if(!e||!t)return;setTimeout(function(){e.finishWith(t)},this.goalCanvasHolder.getAnimationTime())},initParseWaterfall:function(e){L.__super__.initParseWaterfall.apply(this,[e]),this.parseWaterfall.addFirst("parseWaterfall",k),this.parseWaterfall.addFirst("instantWaterfall",this.getInstantCommands()),e.level.disabledMap&&this.parseWaterfall.addFirst("instantWaterfall",(new g({disabledMap:e.level.disabledMap})).getInstantCommands())},initGitShim:function(e){this.gitShim=new b({afterCB:u.bind(this.afterCommandCB,this),afterDeferHandler:u.bind(this.afterCommandDefer,this)})},getCommandsThatCount:function(){var t=e("../git/commands"),n=["git commit","git checkout","git rebase","git reset","git branch","git revert","git merge","git cherry-pick"],r={};return u.each(n,function(e){if(!t.regexMap[e])throw new Error("wut no regex");r[e]=t.regexMap[e]}),r},afterCommandCB:function(e){var t=!1;u.each(this.commandsThatCount,function(n){t=t||n.test(e.get("rawStr"))}),t&&this.gitCommandsIssued.push(e.get("rawStr"))},afterCommandDefer:function(e,t){if(this.solved){t.addWarning("You've already solved this level, try other levels with 'show levels'or go back to the sandbox with 'sandbox'"),e.resolve();return}var n=this.mainVis.gitEngine.exportTree(),r;this.level.compareOnlyMaster?r=this.treeCompare.compareBranchWithinTrees(n,this.level.goalTreeString,"master"):this.level.compareOnlyBranches?r=this.treeCompare.compareAllBranchesWithinTrees(n,this.level.goalTreeString):r=this.treeCompare.compareAllBranchesWithinTreesAndHEAD(n,this.level.goalTreeString);if(!r){e.resolve();return}this.levelSolved(e)},getNumSolutionCommands:function(){var e=this.level.solutionCommand.replace(/^;|;$/g,"");return e.split(";").length},testOption:function(e){return this.options.command&&(new RegExp("--"+e)).test(this.options.command.get("rawStr"))},testOptionOnString:function(e,t){return e&&(new RegExp("--"+t)).test(e)},levelSolved:function(e){this.solved=!0,c.getEvents().trigger("levelSolved",this.level.id),this.hideGoal();var t=c.getLevelArbiter().getNextLevel(this.level.id),n=this.gitCommandsIssued.length,r=this.getNumSolutionCommands();d.GLOBAL.isAnimating=!0;var i=this.testOption("noFinishDialog"),s=this.mainVis.gitVisuals.finishAnimation();i||(s=s.then(function(){var e=new x({nextLevel:t,numCommands:n,best:r});return e.getPromise()})),s.then(function(){!i&&t&&c.getEventBaton().trigger("commandSubmitted","level "+t.id)}).fail(function(){}).done(function(){d.GLOBAL.isAnimating=!1,e.resolve()})},die:function(){this.levelToolbar.die(),this.goalDie(),this.mainVis.die(),this.releaseControl(),this.clear(),delete this.commandCollection,delete this.mainVis,delete this.goalVis,delete this.goalCanvasHolder},goalDie:function(){this.goalCanvasHolder.die(),this.goalVis.die()},getInstantCommands:function(){var e=this.level.hint?this.level.hint:"Hmm, there doesn't seem to be a hint for this level :-/";return[[/^help$|^\?$/,function(){throw new h.CommandResult({msg:'You are in a level, so multiple forms of help are available. Please select either "help level" or "help general"'})}],[/^hint$/,function(){throw new h.CommandResult({msg:e})}]]},reset:function(){this.gitCommandsIssued=[],this.solved=!1,L.__super__.reset.apply(this,arguments)},buildLevel:function(e,t){this.exitLevel(),setTimeout(function(){c.getSandbox().buildLevel(e,t)},this.getAnimationTime()*1.5)},importLevel:function(e,t){this.exitLevel(),setTimeout(function(){c.getSandbox().importLevel(e,t)},this.getAnimationTime()*1.5)},startLevel:function(e,t){this.exitLevel(),setTimeout(function(){c.getSandbox().startLevel(e,t)},this.getAnimationTime()*1.5)},exitLevel:function(e,t){this.die();if(!e||!t)return;setTimeout(function(){e.finishWith(t)},this.getAnimationTime()),c.getEventBaton().trigger("levelExited")},processLevelCommand:function(e,t){var n={"show goal":this.showGoal,"hide goal":this.hideGoal,"show solution":this.showSolution,"start dialog":this.startDialog,"help level":this.startDialog},r=n[e.get("method")];if(!r)throw new Error("woah we dont support that method yet",r);r.apply(this,[e,t])}});n.Level=L,n.regexMap=C}),e.define("/src/js/util/errors.js",function(e,t,n,r,i,s,o){var u=e("underscore"),a=e("backbone"),f=a.Model.extend({defaults:{type:"MyError",msg:"Unknown Error"},toString:function(){return this.get("type")+": "+this.get("msg")},getMsg:function(){return this.get("msg")||"Unknown Error"},toResult:function(){return this.get("msg").length?""+this.get("msg").replace(/\n/g,"
")+"
":""}}),l=n.CommandProcessError=f.extend({defaults:{type:"Command Process Error"}}),c=n.CommandResult=f.extend({defaults:{type:"Command Result"}}),h=n.Warning=f.extend({defaults:{type:"Warning"}}),p=n.GitError=f.extend({defaults:{type:"Git Error"}}),d=function(e){if(e instanceof l||e instanceof p||e instanceof c||e instanceof h)return;throw e};n.filterError=d}),e.define("/src/js/visuals/visualization.js",function(e,t,n,r,i,s,o){var u=e("underscore"),a=e("../util").isBrowser()?a=window.Backbone:a=e("backbone"),f=e("../models/collections"),l=f.CommitCollection,c=f.BranchCollection,h=e("../util/eventBaton").EventBaton,p=e("../visuals").GitVisuals,d=a.View.extend({initialize:function(e){e=e||{},this.options=e,this.customEvents=u.clone(a.Events),this.containerElement=e.containerElement;var t=this,n=e.containerElement||$("#canvasHolder")[0];new Raphael(n,200,200,function(){var n=this;s.nextTick(function(){t.paperInitialize(n,e)})})},paperInitialize:function(t,n){this.treeString=n.treeString,this.paper=t;var r=e("../app");this.eventBaton=n.noKeyboardInput?new h:r.getEventBaton(),this.commitCollection=new l,this.branchCollection=new c,this.gitVisuals=new p({commitCollection:this.commitCollection,branchCollection:this.branchCollection,paper:this.paper,noClick:this.options.noClick,smallCanvas:this.options.smallCanvas});var i=e("../git").GitEngine;this.gitEngine=new i({collection:this.commitCollection,branches:this.branchCollection,gitVisuals:this.gitVisuals,eventBaton:this.eventBaton}),this.gitEngine.init(),this.gitVisuals.assignGitEngine(this.gitEngine),this.myResize(),$(window).on("resize",u.bind(function(){this.myResize()},this)),this.gitVisuals.drawTreeFirstTime(),this.treeString&&this.gitEngine.loadTreeFromString(this.treeString),this.options.zIndex&&this.setTreeIndex(this.options.zIndex),this.shown=!1,this.setTreeOpacity(0),s.nextTick(u.bind(this.fadeTreeIn,this)),this.customEvents.trigger("gitEngineReady"),this.customEvents.trigger("paperReady")},setTreeIndex:function(e){$(this.paper.canvas).css("z-index",e)},setTreeOpacity:function(e){e===0&&(this.shown=!1),$(this.paper.canvas).css("opacity",e)},getAnimationTime:function(){return 300},fadeTreeIn:function(){this.shown=!0,$(this.paper.canvas).animate({opacity:1},this.getAnimationTime())},fadeTreeOut:function(){this.shown=!1,$(this.paper.canvas).animate({opacity:0},this.getAnimationTime())},hide:function(){this.fadeTreeOut(),setTimeout(u.bind(function(){$(this.paper.canvas).css("visibility","hidden")},this),this.getAnimationTime())},show:function(){$(this.paper.canvas).css("visibility","visible"),setTimeout(u.bind(this.fadeTreeIn,this),10)},showHarsh:function(){$(this.paper.canvas).css("visibility","visible"),this.setTreeOpacity(1)},resetFromThisTreeNow:function(e){this.treeString=e},reset:function(){this.setTreeOpacity(0),this.treeString?this.gitEngine.loadTreeFromString(this.treeString):this.gitEngine.defaultInit(),this.fadeTreeIn()},tearDown:function(){this.gitEngine.tearDown(),this.gitVisuals.tearDown(),delete this.paper},die:function(){this.fadeTreeOut(),setTimeout(u.bind(function(){this.shown||this.tearDown()},this),this.getAnimationTime())},myResize:function(){if(!this.paper)return;var e=1,t=this.el,n=t.clientWidth-e,r=t.clientHeight-e;if(!this.containerElement){var i=t.offsetLeft,s=t.offsetTop;$(this.paper.canvas).css({position:"absolute",left:i+"px",top:s+"px"})}this.paper.setSize(n,r),this.gitVisuals.canvasResize(n,r)}});n.Visualization=d}),e.define("/src/js/models/collections.js",function(e,t,n,r,i,s,o){var u=e("underscore"),a=e("q"),f=e("../util").isBrowser()?f=window.Backbone:f=e("backbone"),l=e("../git").Commit,c=e("../git").Branch,h=e("../models/commandModel").Command,p=e("../models/commandModel").CommandEntry,d=e("../util/constants").TIME,v=f.Collection.extend({model:l}),m=f.Collection.extend({model:h}),g=f.Collection.extend({model:c}),y=f.Collection.extend({model:p,localStorage:f.LocalStorage?new f.LocalStorage("CommandEntries"):null}),b=f.Model.extend({defaults:{collection:null},initialize:function(e){e.collection.bind("add",this.addCommand,this),this.buffer=[],this.timeout=null},addCommand:function(e){this.buffer.push(e),this.touchBuffer()},touchBuffer:function(){if(this.timeout)return;this.setTimeout()},setTimeout:function(){this.timeout=setTimeout(u.bind(function(){this.sipFromBuffer()},this),d.betweenCommandsDelay)},popAndProcess:function(){var e=this.buffer.shift(0);while(e.get("error")&&this.buffer.length)e=this.buffer.shift(0);e.get("error")?this.clear():this.processCommand(e)},processCommand:function(t){t.set("status","processing");var n=a.defer();n.promise.then(u.bind(function(){this.setTimeout()},this));var r=t.get("eventName");if(!r)throw new Error("I need an event to trigger when this guy is parsed and ready");var i=e("../app"),s=i.getEventBaton(),o=s.getNumListeners(r);if(!o){var f=e("../util/errors");t.set("error",new f.GitError({msg:"That command is valid, but not supported in this current environment! Try entering a level or level builder to use that command"})),n.resolve();return}i.getEventBaton().trigger(r,t,n)},clear:function(){clearTimeout(this.timeout),this.timeout=null},sipFromBuffer:function(){if(!this.buffer.length){this.clear();return}this.popAndProcess()}});n.CommitCollection=v,n.CommandCollection=m,n.BranchCollection=g,n.CommandEntryCollection=y,n.CommandBuffer=b}),e.define("/src/js/git/index.js",function(e,t,n,r,i,s,o){function m(e){this.rootCommit=null,this.refs={},this.HEAD=null,this.branchCollection=e.branches,this.commitCollection=e.collection,this.gitVisuals=e.gitVisuals,this.eventBaton=e.eventBaton,this.eventBaton.stealBaton("processGitCommand",this.dispatch,this),this.animationFactory=e.animationFactory||new l.AnimationFactory,this.commandOptions={},this.generalArgs=[],this.initUniqueID()}var u=e("underscore"),a=e("../util").isBrowser()?a=window.Backbone:a=e("backbone"),f=e("q"),l=e("../visuals/animation/animationFactory"),c=e("../visuals/animation").AnimationQueue,h=e("./treeCompare").TreeCompare,p=e("../util/errors"),d=p.GitError,v=p.CommandResult;m.prototype.initUniqueID=function(){this.uniqueId=function(){var e=0;return function(t){return t?t+e++:e++}}()},m.prototype.defaultInit=function(){var e=JSON.parse(unescape("%7B%22branches%22%3A%7B%22master%22%3A%7B%22target%22%3A%22C1%22%2C%22id%22%3A%22master%22%2C%22type%22%3A%22branch%22%7D%7D%2C%22commits%22%3A%7B%22C0%22%3A%7B%22type%22%3A%22commit%22%2C%22parents%22%3A%5B%5D%2C%22author%22%3A%22Peter%20Cottle%22%2C%22createTime%22%3A%22Mon%20Nov%2005%202012%2000%3A56%3A47%20GMT-0800%20%28PST%29%22%2C%22commitMessage%22%3A%22Quick%20Commit.%20Go%20Bears%21%22%2C%22id%22%3A%22C0%22%2C%22rootCommit%22%3Atrue%7D%2C%22C1%22%3A%7B%22type%22%3A%22commit%22%2C%22parents%22%3A%5B%22C0%22%5D%2C%22author%22%3A%22Peter%20Cottle%22%2C%22createTime%22%3A%22Mon%20Nov%2005%202012%2000%3A56%3A47%20GMT-0800%20%28PST%29%22%2C%22commitMessage%22%3A%22Quick%20Commit.%20Go%20Bears%21%22%2C%22id%22%3A%22C1%22%7D%7D%2C%22HEAD%22%3A%7B%22id%22%3A%22HEAD%22%2C%22target%22%3A%22master%22%2C%22type%22%3A%22general%20ref%22%7D%7D"));this.loadTree(e)},m.prototype.init=function(){this.rootCommit=this.makeCommit(null,null,{rootCommit:!0}),this.commitCollection.add(this.rootCommit);var e=this.makeBranch("master",this.rootCommit);this.HEAD=new g({id:"HEAD",target:e}),this.refs[this.HEAD.get("id")]=this.HEAD,this.commit()},m.prototype.exportTree=function(){var e={branches:{},commits:{},HEAD:null};u.each(this.branchCollection.toJSON(),function(t){t.target=t.target.get("id"),t.visBranch=undefined,e.branches[t.id]=t}),u.each(this.commitCollection.toJSON(),function(t){u.each(b.prototype.constants.circularFields,function(e){t[e]=undefined},this);var n=[];u.each(t.parents,function(e){n.push(e.get("id"))}),t.parents=n,e.commits[t.id]=t},this);var t=this.HEAD.toJSON();return t.visBranch=undefined,t.lastTarget=t.lastLastTarget=t.visBranch=undefined,t.target=t.target.get("id"),e.HEAD=t,e},m.prototype.printTree=function(e){e=e||this.exportTree(),h.prototype.reduceTreeFields([e]);var t=JSON.stringify(e);return/'/.test(t)&&(t=escape(t)),t},m.prototype.printAndCopyTree=function(){window.prompt("Copy the tree string below",this.printTree())},m.prototype.loadTree=function(e){e=$.extend(!0,{},e),this.removeAll(),this.instantiateFromTree(e),this.reloadGraphics(),this.initUniqueID()},m.prototype.loadTreeFromString=function(e){this.loadTree(JSON.parse(unescape(e)))},m.prototype.instantiateFromTree=function(e){var t={};u.each(e.commits,function(n){var r=this.getOrMakeRecursive(e,t,n.id);this.commitCollection.add(r)},this),u.each(e.branches,function(n){var r=this.getOrMakeRecursive(e,t,n.id);this.branchCollection.add(r,{silent:!0})},this);var n=this.getOrMakeRecursive(e,t,e.HEAD.id);this.HEAD=n,this.rootCommit=t.C0;if(!this.rootCommit)throw new Error("Need root commit of C0 for calculations");this.refs=t,this.gitVisuals.gitReady=!1,this.branchCollection.each(function(e){this.gitVisuals.addBranch(e)},this)},m.prototype.reloadGraphics=function(){this.gitVisuals.rootCommit=this.refs.C0,this.gitVisuals.initHeadBranch(),this.gitVisuals.drawTreeFromReload(),this.gitVisuals.refreshTreeHarsh()},m.prototype.getOrMakeRecursive=function(e,t,n){if(t[n])return t[n];var r=function(e,t){if(e.commits[t])return"commit";if(e.branches[t])return"branch";if(t=="HEAD")return"HEAD";throw new Error("bad type for "+t)},i=r(e,n);if(i=="HEAD"){var s=e.HEAD,o=new g(u.extend(e.HEAD,{target:this.getOrMakeRecursive(e,t,s.target)}));return t[n]=o,o}if(i=="branch"){var a=e.branches[n],f=new y(u.extend(e.branches[n],{target:this.getOrMakeRecursive(e,t,a.target)}));return t[n]=f,f}if(i=="commit"){var l=e.commits[n],c=[];u.each(l.parents,function(n){c.push(this.getOrMakeRecursive(e,t,n))},this);var h=new b(u.extend(l,{parents:c,gitVisuals:this.gitVisuals}));return t[n]=h,h}throw new Error("ruh rho!! unsupported type for "+n)},m.prototype.tearDown=function(){this.eventBaton.releaseBaton("processGitCommand",this.dispatch,this),this.removeAll()},m.prototype.removeAll=function(){this.branchCollection.reset(),this.commitCollection.reset(),this.refs={},this.HEAD=null,this.rootCommit=null,this.gitVisuals.resetAll()},m.prototype.getDetachedHead=function(){var e=this.HEAD.get("target"),t=e.get("type");return t!=="branch"},m.prototype.validateBranchName=function(e){e=e.replace(/\s/g,"");if(!/^[a-zA-Z0-9]+$/.test(e))throw new d({msg:"woah bad branch name!! This is not ok: "+e});if(/[hH][eE][aA][dD]/.test(e))throw new d({msg:'branch name of "head" is ambiguous, dont name it that'});return e.length>9&&(e=e.slice(0,9),this.command.addWarning("Sorry, we need to keep branch names short for the visuals. Your branch name was truncated to 9 characters, resulting in "+e)),e},m.prototype.makeBranch=function(e,t){e=this.validateBranchName(e);if(this.refs[e])throw new d({msg:"that branch id either matches a commit hash or already exists!"});var n=new y({target:t,id:e});return this.branchCollection.add(n),this.refs[n.get("id")]=n,n},m.prototype.getHead=function(){return u.clone(this.HEAD)},m.prototype.getBranches=function(){var e=[];return this.branchCollection.each(function(t){e.push({id:t.get("id"),selected:this.HEAD.get("target")===t,target:t.get("target"),obj:t})},this),e},m.prototype.printBranchesWithout=function(e){var t=this.getUpstreamBranchSet(),n=this.getCommitFromRef(e).get("id"),r=[];u.each(t[n],function(e){e.selected=this.HEAD.get("target").get("id")==e.id,r.push(e)},this),this.printBranches(r)},m.prototype.printBranches=function(e){var t="";throw u.each(e,function(e){t+=(e.selected?"* ":"")+e.id+"\n"}),new v({msg:t})},m.prototype.makeCommit=function(e,t,n){if(!t){t=this.uniqueId("C");while(this.refs[t])t=this.uniqueId("C")}var r=new b(u.extend({parents:e,id:t,gitVisuals:this.gitVisuals},n||{}));return this.refs[r.get("id")]=r,this.commitCollection.add(r),r},m.prototype.acceptNoGeneralArgs=function(){if(this.generalArgs.length)throw new d({msg:"That command accepts no general arguments"})},m.prototype.validateArgBounds=function(e,t,n,r){var i=r===undefined?"git "+this.command.get("method"):this.command.get("method")+" "+r+" ";i="with "+i;if(e.lengthn)throw new d({msg:"I expect at most "+String(n)+" argument(s) "+i})},m.prototype.oneArgImpliedHead=function(e,t){this.validateArgBounds(e,0,1,t),e.length===0&&e.push("HEAD")},m.prototype.twoArgsImpliedHead=function(e,t){this.validateArgBounds(e,1,2,t),e.length==1&&e.push("HEAD")},m.prototype.revertStarter=function(){this.validateArgBounds(this.generalArgs,1,NaN);var e=this.revert(this.generalArgs);e&&this.animationFactory.rebaseAnimation(this.animationQueue,e,this,this.gitVisuals)},m.prototype.revert=function(e){var t=[];u.each(e,function(e){t.push(this.getCommitFromRef(e))},this);var n={};n.destinationBranch=this.resolveID(t[0]),n.toRebaseArray=t.slice(0),n.rebaseSteps=[];var r=this.gitVisuals.genSnapshot(),i,s=this.getCommitFromRef("HEAD");return u.each(t,function(e){var t=this.rebaseAltID(e.get("id")),o=this.makeCommit([s],t,{commitMessage:"Reverting "+this.resolveName(e)+': "'+e.get("commitMessage")+'"'});s=o,i=this.gitVisuals.genSnapshot(),n.rebaseSteps.push({oldCommit:e,newCommit:o,beforeSnapshot:r,afterSnapshot:i}),r=i},this),this.setTargetLocation("HEAD",s),n},m.prototype.resetStarter=function(){if(this.commandOptions["--soft"])throw new d({msg:"You can't use --soft because there is no concept of stashing changes or staging files, so you will lose your progress. Try using interactive rebasing (or just rebasing) to move commits."});this.commandOptions["--hard"]&&(this.command.addWarning("Nice! You are using --hard. The default behavior is a hard reset in this demo, so don't worry about specifying the option explicity"),this.generalArgs=this.generalArgs.concat(this.commandOptions["--hard"])),this.validateArgBounds(this.generalArgs,1,1);if(this.getDetachedHead())throw new d({msg:"Cant reset in detached head! Use checkout if you want to move"});this.reset(this.generalArgs[0])},m.prototype.reset=function(e){this.setTargetLocation("HEAD",this.getCommitFromRef(e))},m.prototype.cherrypickStarter=function(){this.validateArgBounds(this.generalArgs,1,1);var e=this.cherrypick(this.generalArgs[0]);this.animationFactory.genCommitBirthAnimation(this.animationQueue,e,this.gitVisuals)},m.prototype.cherrypick=function(e){var t=this.getCommitFromRef(e),n=this.getUpstreamSet("HEAD");if(n[t.get("id")])throw new d({msg:"We already have that commit in our changes history! You can't cherry-pick it if it shows up in git log."});var r=this.rebaseAltID(t.get("id")),i=this.makeCommit([this.getCommitFromRef("HEAD")],r);return this.setTargetLocation(this.HEAD,i),i},m.prototype.commitStarter=function(){this.acceptNoGeneralArgs();if(this.commandOptions["-am"]&&(this.commandOptions["-a"]||this.commandOptions["-m"]))throw new d({msg:"You can't have -am with another -m or -a!"});var e=null,t=null;this.commandOptions["-a"]&&this.command.addWarning("No need to add files in this demo"),this.commandOptions["-am"]&&(t=this.commandOptions["-am"],this.validateArgBounds(t,1,1,"-am"),this.command.addWarning("Don't worry about adding files in this demo. I'll take down your commit message anyways, but you can commit without a message in this demo as well"),e=t[0]),this.commandOptions["-m"]&&(t=this.commandOptions["-m"],this.validateArgBounds(t,1,1,"-m"),e=t[0]);var n=this.commit();e&&(e=e.replace(/"/g,'"').replace(/^"/g,"").replace(/"$/g,""),n.set("commitMessage",e)),this.animationFactory.genCommitBirthAnimation(this.animationQueue,n,this.gitVisuals)},m.prototype.commit=function(){var e=this.getCommitFromRef(this.HEAD),t=null;this.commandOptions["--amend"]&&(e=this.resolveID("HEAD~1"),t=this.rebaseAltID(this.getCommitFromRef("HEAD").get("id")));var n=this.makeCommit([e],t);return this.getDetachedHead()&&this.command.addWarning("Warning!! Detached HEAD state"),this.setTargetLocation(this.HEAD,n),n},m.prototype.resolveName=function(e){var t=this.resolveID(e);return t.get("type")=="commit"?"commit "+t.get("id"):t.get("type")=="branch"?'branch "'+t.get("id")+'"':this.resolveName(t.get("target"))},m.prototype.resolveID=function(e){if(e===null||e===undefined)throw new Error("Dont call this with null / undefined");return typeof e!="string"?e:this.resolveStringRef(e)},m.prototype.resolveStringRef=function(e){if(this.refs[e])return this.refs[e];if(this.refs[e.toUpperCase()])return this.refs[e.toUpperCase()];var t=[[/^([a-zA-Z0-9]+)~(\d+)\s*$/,function(e){return parseInt(e[2],10)}],[/^([a-zA-Z0-9]+)(\^+)\s*$/,function(e){return e[2].length}]],n=null,r=null;u.each(t,function(t){var i=t[0],s=t[1];if(i.test(e)){var o=i.exec(e);r=s(o),n=o[1]}},this);if(!n)throw new d({msg:"unknown ref "+e});if(!this.refs[n])throw new d({msg:"the ref "+n+" does not exist."});var i=this.getCommitFromRef(n);return this.numBackFrom(i,r)},m.prototype.getCommitFromRef=function(e){var t=this.resolveID(e);while(t.get("type")!=="commit")t=t.get("target");return t},m.prototype.getType=function(e){return this.resolveID(e).get("type")},m.prototype.setTargetLocation=function(e,t){if(this.getType(e)=="commit")return;e=this.getOneBeforeCommit(e),e.set("target",t)},m.prototype.getUpstreamBranchSet=function(){var e={},t=function(e,t){var n=!1;return u.each(e,function(e){e.id==t&&(n=!0)}),n},n=function(e){var t=[],n=[e];while(n.length){var r=n.pop();t.push(r.get("id")),r.get("parents")&&r.get("parents").length&&(n=n.concat(r.get("parents")))}return t};return this.branchCollection.each(function(r){var i=n(r.get("target"));u.each(i,function(n){e[n]=e[n]||[],t(e[n],r.get("id"))||e[n].push({obj:r,id:r.get("id")})})}),e},m.prototype.getUpstreamHeadSet=function(){var e=this.getUpstreamSet("HEAD"),t=this.getCommitFromRef("HEAD").get("id");return e[t]=!0,e},m.prototype.getOneBeforeCommit=function(e){var t=this.resolveID(e);return t===this.HEAD&&!this.getDetachedHead()&&(t=t.get("target")),t},m.prototype.numBackFrom=function(e,t){if(t===0)return e;var n=u.bind(function(e){e.sort(this.dateSortFunc)},this),r=[].concat(e.get("parents")||[]);n(r),t--;while(r.length&&t!==0){var i=r.shift(0),s=i.get("parents");s&&s.length&&(r=r.concat(s)),n(r),t--}if(t!==0||r.length===0)throw new d({msg:"Sorry, I can't go that many commits back"});return r.shift(0)},m.prototype.scrapeBaseID=function(e){var t=/^C(\d+)/.exec(e);if(!t)throw new Error("regex failed on "+e);return"C"+t[1]},m.prototype.rebaseAltID=function(e){var t=[[/^C(\d+)[']{0,2}$/,function(e){return e[0]+"'"}],[/^C(\d+)[']{3}$/,function(e){return e[0].slice(0,-3)+"'^4"}],[/^C(\d+)['][\^](\d+)$/,function(e){return"C"+String(e[1])+"'^"+String(Number(e[2])+1)}]];for(var n=0;n",this.get("commitMessage"),"
","Commit: "+this.get("id")].join("\n")+"\n"},getShowEntry:function(){return[this.getLogEntry(),"diff --git a/bigGameResults.html b/bigGameResults.html","--- bigGameResults.html","+++ bigGameResults.html","@@ 13,27 @@ Winner, Score","- Stanfurd, 14-7","+ Cal, 21-14"].join("\n")+"\n"},validateAtInit:function(){if(!this.get("id"))throw new Error("Need ID!!");this.get("createTime")||this.set("createTime",(new Date).toString()),this.get("commitMessage")||this.set("commitMessage","Quick Commit. Go Bears!"),this.set("children",[]);if(!this.get("rootCommit"))if(!this.get("parents")||!this.get("parents").length)throw new Error("needs parents")},addNodeToVisuals:function(){var e=this.get("gitVisuals").addNode(this.get("id"),this);this.set("visNode",e)},addEdgeToVisuals:function(e){this.get("gitVisuals").addEdge(this.get("id"),e.get("id"))},isMainParent:function(e){var t=this.get("parents").indexOf(e);return t===0},initialize:function(e){this.validateAtInit(),this.addNodeToVisuals(),u.each(this.get("parents"),function(e){e.get("children").push(this),this.addEdgeToVisuals(e)},this)}});n.GitEngine=m,n.Commit=b,n.Branch=y,n.Ref=g}),e.define("/src/js/visuals/animation/animationFactory.js",function(e,t,n,r,i,s,o){var u=e("underscore"),a=e("backbone"),f=e("./index").Animation,l=e("../../util/constants").GRAPHICS,c=function(){};c.prototype.genCommitBirthAnimation=function(e,t,n){if(!e)throw new Error("Need animation queue to add closure to!");var r=l.defaultAnimationTime*1,i=r*2,s=t.get("visNode"),o=function(){n.refreshTree(r),s.setBirth(),s.parentInFront(),n.visBranchesFront(),s.animateUpdatedPosition(i,"bounce"),s.animateOutgoingEdges(r)};e.add(new f({closure:o,duration:Math.max(r,i)}))},c.prototype.overrideOpacityDepth2=function(e,t){t=t===undefined?1:t;var n={};return u.each(e,function(e,r){n[r]={},u.each(e,function(e,i){i=="opacity"?n[r][i]=t:n[r][i]=e})}),n},c.prototype.overrideOpacityDepth3=function(e,t){var n={};return u.each(e,function(e,r){n[r]=this.overrideOpacityDepth2(e,t)},this),n},c.prototype.genCommitBirthClosureFromSnapshot=function(e,t){var n=l.defaultAnimationTime*1,r=n*1.5,i=e.newCommit.get("visNode"),s=this.overrideOpacityDepth2(e.afterSnapshot[i.getID()]),o=this.overrideOpacityDepth3(e.afterSnapshot),u=function(){i.setBirthFromSnapshot(e.beforeSnapshot),i.parentInFront(),t.visBranchesFront(),i.animateToAttr(s,r,"bounce"),i.animateOutgoingEdgesToAttr(o,r)};return u},c.prototype.refreshTree=function(e,t){e.add(new f({closure:function(){t.refreshTree()}}))},c.prototype.rebaseAnimation=function(e,t,n,r){this.rebaseHighlightPart(e,t,n),this.rebaseBirthPart(e,t,n,r)},c.prototype.rebaseHighlightPart=function(e,t,n){var r=l.defaultAnimationTime*.66,i=r*2,s=t.toRebaseArray,o=t.destinationBranch.get("visBranch");o||(o=t.destinationBranch.get("visNode")),u.each(s,function(t){var n=t.get("visNode");e.add(new f({closure:function(){n.highlightTo(o,i,"easeInOut")},duration:r*1.5}))},this),this.delay(e,r*2)},c.prototype.rebaseBirthPart=function(e,t,n,r){var i=t.rebaseSteps,s=[];u.each(i,function(e){var t=e.newCommit.get("visNode");s.push(t),t.setOpacity(0),t.setOutgoingEdgesOpacity(0)},this);var o=[];u.each(i,function(t,n){var i=s.slice(n+1),u=this.genFromToSnapshotAnimation(t.beforeSnapshot,t.afterSnapshot,i,o,r),a=this.genCommitBirthClosureFromSnapshot(t,r),c=function(){u(),a()};e.add(new f({closure:c,duration:l.defaultAnimationTime*1.5})),o.push(t.newCommit.get("visNode"))},this),this.delay(e),this.refreshTree(e,r)},c.prototype.delay=function(e,t){t=t||l.defaultAnimationTime,e.add(new f({closure:function(){},duration:t}))},c.prototype.genSetAllCommitOpacities=function(e,t){var n=e.slice(0);return function(){u.each(n,function(e){e.setOpacity(t),e.setOutgoingEdgesOpacity(t)})}},c.prototype.stripObjectsFromSnapshot=function(e,t){var n=[];u.each(t,function(e){n.push(e.getID())});var r={};return u.each(e,function(e,t){if(u.include(n,t))return;r[t]=e},this),r},c.prototype.genFromToSnapshotAnimation=function(e,t,n,r,i){var s=[];u.each(n,function(e){s.push(e),s=s.concat(e.get("outgoingEdges"))});var o=function(e){if(!e)return;u.each(e,function(t,n){e[n].opacity=1})};return u.each([e,t],function(e){u.each(r,function(t){o(e[t.getID()]),u.each(t.get("outgoingEdges"),function(t){o(e[t.getID()])})})}),function(){i.animateAllFromAttrToAttr(e,t,s)}},n.AnimationFactory=c}),e.define("/src/js/visuals/animation/index.js",function(e,t,n,r,i,s,o){var u=e("underscore"),a=e("backbone"),f=e("../../util/constants").GLOBAL,l=a.Model.extend({defaults:{duration:300,closure:null},validateAtInit:function(){if(!this.get("closure"))throw new Error("give me a closure!")},initialize:function(e){this.validateAtInit()},run:function(){this.get("closure")()}}),c=a.Model.extend({defaults:{animations:null,index:0,callback:null,defer:!1},initialize:function(e){this.set("animations",[]),e.callback||console.warn("no callback")},add:function(e){if(!e instanceof l)throw new Error("Need animation not something else");this.get("animations").push(e)},start:function(){this.set("index",0),f.isAnimating=!0,this.next()},finish:function(){f.isAnimating=!1,this.get("callback")()},next:function(){var e=this.get("animations"),t=this.get("index");if(t>=e.length){this.finish();return}var n=e[t],r=n.get("duration");n.run(),this.set("index",t+1),setTimeout(u.bind(function(){this.next()},this),r)}});n.Animation=l,n.AnimationQueue=c}),e.define("/src/js/git/treeCompare.js",function(e,t,n,r,i,s,o){function a(){}var u=e("underscore");a.prototype.compareAllBranchesWithinTreesAndHEAD=function(e,t){return e=this.convertTreeSafe(e),t=this.convertTreeSafe(t),e.HEAD.target==t.HEAD.target&&this.compareAllBranchesWithinTrees(e,t)},a.prototype.compareAllBranchesWithinTrees=function(e,t){e=this.convertTreeSafe(e),t=this.convertTreeSafe(t);var n=u.extend({},e.branches,t.branches),r=!0;return u.uniq(n,function(n,i){r=r&&this.compareBranchWithinTrees(e,t,i)},this),r},a.prototype.compareBranchesWithinTrees=function(e,t,n){var r=!0;return u.each(n,function(n){r=r&&this.compareBranchWithinTrees(e,t,n)},this),r},a.prototype.compareBranchWithinTrees=function(e,t,n){e=this.convertTreeSafe(e),t=this.convertTreeSafe(t),this.reduceTreeFields([e,t]);var r=this.getRecurseCompare(e,t),i=e.branches[n],s=t.branches[n];return u.isEqual(i,s)&&r(e.commits[i.target],t.commits[s.target])},a.prototype.compareAllBranchesWithinTreesHashAgnostic=function(e,t){e=this.convertTreeSafe(e),t=this.convertTreeSafe(t),this.reduceTreeFields([e,t]);var n=u.bind(function(e,t){return!e||!t?!1:(e.target=this.getBaseRef(e.target),t.target=this.getBaseRef(t.target),u.isEqual(e,t))},this),r=this.getRecurseCompareHashAgnostic(e,t),i=u.extend({},e.branches,t.branches),s=!0;return u.each(i,function(i,o){branchA=e.branches[o],branchB=t.branches[o],s=s&&n(branchA,branchB)&&r(e.commits[branchA.target],t.commits[branchB.target])},this),s},a.prototype.getBaseRef=function(e){var t=/^C(\d+)/,n=t.exec(e);if(!n)throw new Error("no regex matchy for "+e);return"C"+n[1]},a.prototype.getRecurseCompareHashAgnostic=function(e,t){var n=u.bind(function(e){return u.extend({},e,{id:this.getBaseRef(e.id)})},this),r=function(e,t){return u.isEqual(n(e),n(t))};return this.getRecurseCompare(e,t,{isEqual:r})},a.prototype.getRecurseCompare=function(e,t,n){n=n||{};var r=function(i,s){var o=n.isEqual?n.isEqual(i,s):u.isEqual(i,s);if(!o)return!1;var a=u.unique(i.parents.concat(s.parents));return u.each(a,function(n,i){var u=s.parents[i],a=e.commits[n],f=t.commits[u];o=o&&r(a,f)},this),o};return r},a.prototype.convertTreeSafe=function(e){return typeof e=="string"?JSON.parse(unescape(e)):e},a.prototype.reduceTreeFields=function(e){var t=["parents","id","rootCommit"],n=["children","parents"],r=["target","id"],i=function(e,t,n,r){var i=e[t];u.each(i,function(i,s){var o={};u.each(n,function(e){i[e]!==undefined&&(o[e]=i[e])}),u.each(r,function(e){i[e]&&(i[e].sort(),o[e]=i[e])}),e[t][s]=o})};u.each(e,function(e){i(e,"commits",t,n),i(e,"branches",r),e.HEAD={target:e.HEAD.target,id:e.HEAD.id}})},a.prototype.compareTrees=function(e,t){return e=this.convertTreeSafe(e),t=this.convertTreeSafe(t),this.reduceTreeFields([e,t]),u.isEqual(e,t)},n.TreeCompare=a}),e.define("/src/js/views/rebaseView.js",function(e,t,n,r,i,s,o){var u=e("../util/errors").GitError,a=e("underscore"),f=e("q"),l=e("../util").isBrowser()?window.Backbone:e("backbone"),c=e("../views").ModalTerminal,h=e("../views").ContainedBase,p=e("../views").ConfirmCancelView,d=e("../views").LeftRightView,v=h.extend({tagName:"div",template:a.template($("#interactive-rebase-template").html()),initialize:function(e){this.deferred=e.deferred,this.rebaseMap={},this.entryObjMap={},this.rebaseEntries=new g,e.toRebase.reverse(),a.each(e.toRebase,function(e){var t=e.get("id");this.rebaseMap[t]=e,this.entryObjMap[t]=new m({id:t}),this.rebaseEntries.add(this.entryObjMap[t])},this),this.container=new c({title:"Interactive Rebase"}),this.render(),this.show()},confirm:function(){this.die();var e=[];this.$("ul.rebaseEntries li").each(function(t,n){e.push(n.id)});var t=[];a.each(e,function(e){this.entryObjMap[e].get("pick")&&t.unshift(this.rebaseMap[e])},this),t.reverse(),this.deferred.resolve(t),this.$el.html("")},render:function(){var e={num:a.keys(this.rebaseMap).length},t=this.container.getInsideElement();this.$el.html(this.template(e)),$(t).append(this.el);var n=this.$("ul.rebaseEntries");this.rebaseEntries.each(function(e){new y({el:n,model:e})},this),n.sortable({axis:"y",placeholder:"rebaseEntry transitionOpacity ui-state-highlight",appendTo:"parent"}),this.makeButtons()},makeButtons:function(){var e=f.defer();e.promise.then(a.bind(function(){this.confirm()},this)).fail(a.bind(function(){this.hide(),this.deferred.resolve([])},this)).done(),new p({destination:this.$(".confirmCancel"),deferred:e})}}),m=l.Model.extend({defaults:{pick:!0},toggle:function(){this.set("pick",!this.get("pick"))}}),g=l.Collection.extend({model:m}),y=l.View.extend({tagName:"li",template:a.template($("#interactive-rebase-entry-template").html()),toggle:function(){this.model.toggle(),this.listEntry.toggleClass("notPicked",!this.model.get("pick"))},initialize:function(e){this.render()},render:function(){var e=this.model.toJSON();this.$el.append(this.template(this.model.toJSON())),this.listEntry=this.$el.children(":last"),this.listEntry.delegate("#toggleButton","click",a.bind(function(){this.toggle()},this))}});n.InteractiveRebaseView=v}),e.define("/src/js/views/index.js",function(e,t,n,r,i,s,o){var u=e("underscore"),a=e("q"),f=e("../util").isBrowser()?window.Backbone:e("backbone"),l=e("../app"),c=e("../util/constants"),h=e("../util/keyboard").KeyboardListener,p=e("../util/errors").GitError,d=f.View.extend({getDestination:function(){return this.destination||this.container.getInsideElement()},tearDown:function(){this.$el.remove(),this.container&&this.container.tearDown()},renderAgain:function(e){e=e||this.template(this.JSON),this.$el.html(e)},render:function(e){this.renderAgain(e);var t=this.getDestination();$(t).append(this.el)}}),v=d.extend({resolve:function(){this.deferred.resolve()},reject:function(){this.deferred.reject()}}),m=d.extend({positive:function(){this.navEvents.trigger("positive")},negative:function(){this.navEvents.trigger("negative")}}),g=d.extend({getAnimationTime:function(){return 700},show:function(){this.container.show()},hide:function(){this.container.hide()},die:function(){this.hide(),setTimeout(u.bind(function(){this.tearDown()},this),this.getAnimationTime()*1.1)}}),y=g.extend({tagName:"a",className:"generalButton uiButton",template:u.template($("#general-button").html()),events:{click:"click"},initialize:function(e){e=e||{},this.navEvents=e.navEvents||u.clone(f.Events),this.destination=e.destination,this.destination||(this.container=new S),this.JSON={buttonText:e.buttonText||"General Button",wantsWrapper:e.wantsWrapper!==undefined?e.wantsWrapper:!0},this.render(),this.container&&!e.wait&&this.show()},click:function(){this.clickFunc||(this.clickFunc=u.throttle(u.bind(this.sendClick,this),500)),this.clickFunc()},sendClick:function(){this.navEvents.trigger("click")}}),b=v.extend({tagName:"div",className:"confirmCancelView box horizontal justify",template:u.template($("#confirm-cancel-template").html()),events:{"click .confirmButton":"resolve","click .cancelButton":"reject"},initialize:function(e){if(!e.destination)throw new Error("needmore");this.destination=e.destination,this.deferred=e.deferred||a.defer(),this.JSON={confirm:e.confirm||"Confirm",cancel:e.cancel||"Cancel"},this.render()}}),w=m.extend({tagName:"div",className:"leftRightView box horizontal center",template:u.template($("#left-right-template").html()),events:{"click .left":"negative","click .right":"positive"},positive:function(){this.pipeEvents.trigger("positive"),w.__super__.positive.apply(this)},negative:function(){this.pipeEvents.trigger("negative"),w.__super__.negative.apply(this)},initialize:function(e){if(!e.destination||!e.events)throw new Error("needmore");this.destination=e.destination,this.pipeEvents=e.events,this.navEvents=u.clone(f.Events),this.JSON={showLeft:e.showLeft===undefined?!0:e.showLeft,lastNav:e.lastNav===undefined?!1:e.lastNav},this.render()}}),E=f.View.extend({tagName:"div",className:"modalView box horizontal center transitionOpacityLinear",template:u.template($("#modal-view-template").html()),getAnimationTime:function(){return 700},initialize:function(e){this.shown=!1,this.render()},render:function(){this.$el.html(this.template({})),$("body").append(this.el)},stealKeyboard:function(){l.getEventBaton().stealBaton("keydown",this.onKeyDown,this),l.getEventBaton().stealBaton("keyup",this.onKeyUp,this),l.getEventBaton().stealBaton("windowFocus",this.onWindowFocus,this),l.getEventBaton().stealBaton("documentClick",this.onDocumentClick,this),$("#commandTextField").blur()},releaseKeyboard:function(){l.getEventBaton().releaseBaton("keydown",this.onKeyDown,this),l.getEventBaton().releaseBaton("keyup",this.onKeyUp,this),l.getEventBaton().releaseBaton("windowFocus",this.onWindowFocus,this),l.getEventBaton().releaseBaton("documentClick",this.onDocumentClick,this),l.getEventBaton().trigger("windowFocus")},onWindowFocus:function(e){},onDocumentClick:function(e){},onKeyDown:function(e){e.preventDefault()},onKeyUp:function(e){e.preventDefault()},show:function(){this.toggleZ(!0),s.nextTick(u.bind(function(){this.toggleShow(!0)},this))},hide:function(){this.toggleShow(!1),setTimeout(u.bind(function(){this.shown||this.toggleZ(!1)},this),this.getAnimationTime())},getInsideElement:function(){return this.$(".contentHolder")},toggleShow:function(e){if(this.shown===e)return;e?this.stealKeyboard():this.releaseKeyboard(),this.shown=e,this.$el.toggleClass("show",e)},toggleZ:function(e){this.$el.toggleClass("inFront",e)},tearDown:function(){this.$el.html(""),$("body")[0].removeChild(this.el)}}),S=g.extend({tagName:"div",className:"modalTerminal box flex1",template:u.template($("#terminal-window-template").html()),events:{"click div.inside":"onClick"},initialize:function(e){e=e||{},this.navEvents=e.events||u.clone(f.Events),this.container=new E,this.JSON={title:e.title||"Heed This Warning!"},this.render()},onClick:function(){this.navEvents.trigger("click")},getInsideElement:function(){return this.$(".inside")}}),x=g.extend({tagName:"div",template:u.template($("#modal-alert-template").html()),initialize:function(e){e=e||{},this.JSON={title:e.title||"Something to say",text:e.text||"Here is a paragraph",markdown:e.markdown},e.markdowns&&(this.JSON.markdown=e.markdowns.join("\n")),this.container=new S({title:"Alert!"}),this.render(),e.wait||this.show()},render:function(){var t=this.JSON.markdown?e("markdown").markdown.toHTML(this.JSON.markdown):this.template(this.JSON);x.__super__.render.apply(this,[t])}}),T=f.View.extend({initialize:function(e){e=e||{},this.deferred=e.deferred||a.defer(),this.modalAlert=new x(u.extend({},{markdown:"#you sure?"},e));var t=a.defer();this.buttonDefer=t,this.confirmCancel=new b({deferred:t,destination:this.modalAlert.getDestination()}),t.promise.then(this.deferred.resolve).fail(this.deferred.reject).done(u.bind(function(){this.close()},this)),this.navEvents=u.clone(f.Events),this.navEvents.on("positive",this.positive,this),this.navEvents.on("negative",this.negative,this),this.keyboardListener=new h({events:this.navEvents,aliasMap:{enter:"positive",esc:"negative"}}),e.wait||this.modalAlert.show()},positive:function(){this.buttonDefer.resolve()},negative:function(){this.buttonDefer.reject()},getAnimationTime:function(){return 700},show:function(){this.modalAlert.show()},hide:function(){this.modalAlert.hide()},getPromise:function(){return this.deferred.promise},close:function(){this.keyboardListener.mute(),this.modalAlert.die()}}),N=T.extend({initialize:function(e){e=e||{};var t=e.nextLevel?e.nextLevel.name:"",n=["## Great Job!!","","You solved the level in **"+e.numCommands+"** command(s); ","our solution uses "+e.best+". "];e.numCommands<=e.best?n.push("Awesome! You matched or exceeded our solution. "):n.push("See if you can whittle it down to "+e.best+" command(s) :D "),e.nextLevel?n=n.concat(["",'Would you like to move onto "'+t+'", the next level?']):n=n.concat(["","Wow!!! You finished the last level, congratulations!"]),e=u.extend({},e,{markdowns:n}),N.__super__.initialize.apply(this,[e])}}),C=f.View.extend({initialize:function(e){this.grabBatons(),this.modalAlert=new x({markdowns:this.markdowns}),this.modalAlert.show()},grabBatons:function(){l.getEventBaton().stealBaton(this.eventBatonName,this.batonFired,this)},releaseBatons:function(){l.getEventBaton().releaseBaton(this.eventBatonName,this.batonFired,this)},finish:function(){this.releaseBatons(),this.modalAlert.die()}}),k=C.extend({initialize:function(e){this.eventBatonName="windowSizeCheck",this.markdowns=["## That window size is not supported :-/","Please resize your window back to a supported size","","(and of course, pull requests to fix this are appreciated :D)"],k.__super__.initialize.apply(this,[e])},batonFired:function(e){e.w>c.VIEWPORT.minWidth&&e.h>c.VIEWPORT.minHeight&&this.finish()}}),L=C.extend({initialize:function(e){if(!e||!e.level)throw new Error("need level");this.eventBatonName="zoomChange",this.markdowns=["## That zoom level of "+e.level+" is not supported :-/","Please zoom back to a supported zoom level with Ctrl + and Ctrl -","","(and of course, pull requests to fix this are appreciated :D)"],L.__super__.initialize.apply(this,[e])},batonFired:function(e){e<=c.VIEWPORT.maxZoom&&e>=c.VIEWPORT.minZoom&&this.finish()}}),A=d.extend({tagName:"div",className:"levelToolbarHolder",template:u.template($("#level-toolbar-template").html()),initialize:function(e){e=e||{},this.JSON={name:e.name||"Some level! (unknown name)"},this.beforeDestination=$($("#commandLineHistory div.toolbar")[0]),this.render(),e.wait||s.nextTick(u.bind(this.show,this))},getAnimationTime:function(){return 700},render:function(){var e=this.template(this.JSON);this.$el.html(e),this.beforeDestination.after(this.el)},die:function(){this.hide(),setTimeout(u.bind(function(){this.tearDown()},this),this.getAnimationTime())},hide:function(){this.$("div.toolbar").toggleClass("hidden",!0)},show:function(){this.$("div.toolbar").toggleClass("hidden",!1)}}),O=d.extend({tagName:"div",className:"canvasTerminalHolder box flex1",template:u.template($("#terminal-window-bare-template").html()),events:{"click div.wrapper":"onClick"},initialize:function(e){e=e||{},this.destination=$("body"),this.JSON={title:e.title||"Goal To Reach",text:e.text||'You can hide this window with "hide goal"'},this.render(),e.additionalClass&&this.$el.addClass(e.additionalClass)},getAnimationTime:function(){return 700},onClick:function(){this.slideOut()},die:function(){this.slideOut(),setTimeout(u.bind(function(){this.tearDown()},this))},slideOut:function(){this.slideToggle(!0)},slideIn:function(){this.slideToggle(!1)},slideToggle:function(e){this.$("div.terminal-window-holder").toggleClass("slideOut",e)},getCanvasLocation:function(){return this.$("div.inside")[0]}});n.BaseView=d,n.GeneralButton=y,n.ModalView=E,n.ModalTerminal=S,n.ModalAlert=x,n.ContainedBase=g,n.ConfirmCancelView=b,n.LeftRightView=w,n.ZoomAlertWindow=L,n.ConfirmCancelTerminal=T,n.WindowSizeAlertWindow=k,n.CanvasTerminalHolder=O,n.LevelToolbar=A,n.NextLevelConfirm=N}),e.define("/src/js/util/keyboard.js",function(e,t,n,r,i,s,o){function c(e){this.events=e.events||u.clone(a.Events),this.aliasMap=e.aliasMap||{},e.wait||this.listen()}var u=e("underscore"),a=e("backbone"),f=e("../app"),l=function(e){var t={37:"left",38:"up",39:"right",40:"down",27:"esc",13:"enter"};return t[e]};c.prototype.listen=function(){if(this.listening)return;this.listening=!0,f.getEventBaton().stealBaton("docKeydown",this.keydown,this)},c.prototype.mute=function(){this.listening=!1,f.getEventBaton().releaseBaton("docKeydown",this.keydown,this)},c.prototype.keydown=function(e){var t=e.which||e.keyCode,n=l(t);if(n===undefined)return;this.fireEvent(n,e)},c.prototype.fireEvent=function(e,t){e=this.aliasMap[e]||e,this.events.trigger(e,t)},c.prototype.passEventBack=function(e){f.getEventBaton().passBatonBackSoft("docKeydown",this.keydown,this,[e])},n.KeyboardListener=c,n.mapKeycodeToKey=l}),e.define("/node_modules/markdown/package.json",function(e,t,n,r,i,s,o){t.exports={main:"./lib/index.js"}}),e.define("/node_modules/markdown/lib/index.js",function(e,t,n,r,i,s,o){n.markdown=e("./markdown"),n.parse=n.markdown.toHTML}),e.define("/node_modules/markdown/lib/markdown.js",function(e,t,n,r,i,s,o){(function(t){function r(){return"Markdown.mk_block( "+uneval(this.toString())+", "+uneval(this.trailing)+", "+uneval(this.lineNumber)+" )"}function i(){var t=e("util");return"Markdown.mk_block( "+t.inspect(this.toString())+", "+t.inspect(this.trailing)+", "+t.inspect(this.lineNumber)+" )"}function o(e){var t=0,n=-1;while((n=e.indexOf("\n",n+1))!==-1)t++;return t}function u(e,t){function i(e){this.len_after=e,this.name="close_"+t}var n=e+"_state",r=e=="strong"?"em_state":"strong_state";return function(s,o){if(this[n][0]==t)return this[n].shift(),[s.length,new i(s.length-t.length)];var u=this[r].slice(),a=this[n].slice();this[n].unshift(t);var f=this.processInline(s.substr(t.length)),l=f[f.length-1],c=this[n].shift();if(l instanceof i){f.pop();var h=s.length-l.len_after;return[h,[e].concat(f)]}return this[r]=u,this[n]=a,[t.length,t]}}function f(e){var t=e.split(""),n=[""],r=!1;while(t.length){var i=t.shift();switch(i){case" ":r?n[n.length-1]+=i:n.push("");break;case"'":case'"':r=!r;break;case"\\":i=t.shift();default:n[n.length-1]+=i}}return n}function h(e){return l(e)&&e.length>1&&typeof e[1]=="object"&&!l(e[1])?e[1]:undefined}function d(e){return e.replace(/&/g,"&").replace(//g,">").replace(/"/g,""").replace(/'/g,"'")}function v(e){if(typeof e=="string")return d(e);var t=e.shift(),n={},r=[];e.length&&typeof e[0]=="object"&&!(e[0]instanceof Array)&&(n=e.shift());while(e.length)r.push(arguments.callee(e.shift()));var i="";for(var s in n)i+=" "+s+'="'+d(n[s])+'"';return t=="img"||t=="br"||t=="hr"?"<"+t+i+"/>":"<"+t+i+">"+r.join("")+""+t+">"}function m(e,t,n){var r;n=n||{};var i=e.slice(0);typeof n.preprocessTreeNode=="function"&&(i=n.preprocessTreeNode(i,t));var s=h(i);if(s){i[1]={};for(r in s)i[1][r]=s[r];s=i[1]}if(typeof i=="string")return i;switch(i[0]){case"header":i[0]="h"+i[1].level,delete i[1].level;break;case"bulletlist":i[0]="ul";break;case"numberlist":i[0]="ol";break;case"listitem":i[0]="li";break;case"para":i[0]="p";break;case"markdown":i[0]="html",s&&delete s.references;break;case"code_block":i[0]="pre",r=s?2:1;var o=["code"];o.push.apply(o,i.splice(r)),i[r]=o;break;case"inlinecode":i[0]="code";break;case"img":i[1].src=i[1].href,delete i[1].href;break;case"linebreak":i[0]="br";break;case"link":i[0]="a";break;case"link_ref":i[0]="a";var u=t[s.ref];if(!u)return s.original;delete s.ref,s.href=u.href,u.title&&(s.title=u.title),delete s.original;break;case"img_ref":i[0]="img";var u=t[s.ref];if(!u)return s.original;delete s.ref,s.src=u.href,u.title&&(s.title=u.title),delete s.original}r=1;if(s){for(var a in i[1])r=2;r===1&&i.splice(r,1)}for(;r0&&!l(o[0]))&&this.debug(i[s],"didn't return a proper array"),o}return[]},n.prototype.processInline=function(t){return this.dialect.inline.__call__.call(this,String(t))},n.prototype.toTree=function(t,n){var r=t instanceof Array?t:this.split_blocks(t),i=this.tree;try{this.tree=n||this.tree||["markdown"];e:while(r.length){var s=this.processBlock(r.shift(),r);if(!s.length)continue e;this.tree.push.apply(this.tree,s)}return this.tree}finally{n&&(this.tree=i)}},n.prototype.debug=function(){var e=Array.prototype.slice.call(arguments);e.unshift(this.debug_indent),typeof print!="undefined"&&print.apply(print,e),typeof console!="undefined"&&typeof console.log!="undefined"&&console.log.apply(null,e)},n.prototype.loop_re_over_block=function(e,t,n){var r,i=t.valueOf();while(i.length&&(r=e.exec(i))!=null)i=i.substr(r[0].length),n.call(this,r);return i},n.dialects={},n.dialects.Gruber={block:{atxHeader:function(t,n){var r=t.match(/^(#{1,6})\s*(.*?)\s*#*\s*(?:\n|$)/);if(!r)return undefined;var i=["header",{level:r[1].length}];return Array.prototype.push.apply(i,this.processInline(r[2])),r[0].length1&&n.unshift(r);for(var s=0;s1&&typeof i[i.length-1]=="string"?i[i.length-1]+=o:i.push(o)}}function f(e,t){var n=new RegExp("^("+i+"{"+e+"}.*?\\n?)*$"),r=new RegExp("^"+i+"{"+e+"}","gm"),o=[];while(t.length>0){if(n.exec(t[0])){var u=t.shift(),a=u.replace(r,"");o.push(s(a,u.trailing,u.lineNumber))}break}return o}function l(e,t,n){var r=e.list,i=r[r.length-1];if(i[1]instanceof Array&&i[1][0]=="para")return;if(t+1==n.length)i.push(["para"].concat(i.splice(1)));else{var s=i.pop();i.push(["para"].concat(i.splice(1)),s)}}var e="[*+-]|\\d+\\.",t=/[*+-]/,n=/\d+\./,r=new RegExp("^( {0,3})("+e+")[ ]+"),i="(?: {0,3}\\t| {4})";return function(e,n){function s(e){var n=t.exec(e[2])?["bulletlist"]:["numberlist"];return h.push({list:n,indent:e[1]}),n}var i=e.match(r);if(!i)return undefined;var h=[],p=s(i),d,v=!1,m=[h[0].list],g;e:for(;;){var y=e.split(/(?=\n)/),b="";for(var w=0;wh.length)p=s(i),d.push(p),d=p[1]=["listitem"];else{var N=!1;for(g=0;gi[0].length&&(b+=E+S.substr(i[0].length))}b.length&&(a(d,v,this.processInline(b),E),v=!1,b="");var C=f(h.length,n);C.length>0&&(c(h,l,this),d.push.apply(d,this.toTree(C,[])));var k=n[0]&&n[0].valueOf()||"";if(k.match(r)||k.match(/^ /)){e=n.shift();var L=this.dialect.block.horizRule(e,n);if(L){m.push.apply(m,L);break}c(h,l,this),v=!0;continue e}break}return m}}(),blockquote:function(t,n){if(!t.match(/^>/m))return undefined;var r=[];if(t[0]!=">"){var i=t.split(/\n/),s=[];while(i.length&&i[0][0]!=">")s.push(i.shift());t=i.join("\n"),r.push.apply(r,this.processBlock(s.join("\n"),[]))}while(n.length&&n[0][0]==">"){var o=n.shift();t=new String(t+t.trailing+o),t.trailing=o.trailing}var u=t.replace(/^> ?/gm,""),a=this.tree;return r.push(this.toTree(u,["blockquote"])),r},referenceDefn:function(t,n){var r=/^\s*\[(.*?)\]:\s*(\S+)(?:\s+(?:(['"])(.*?)\3|\((.*?)\)))?\n?/;if(!t.match(r))return undefined;h(this.tree)||this.tree.splice(1,0,{});var i=h(this.tree);i.references===undefined&&(i.references={});var o=this.loop_re_over_block(r,t,function(e){e[2]&&e[2][0]=="<"&&e[2][e[2].length-1]==">"&&(e[2]=e[2].substring(1,e[2].length-1));var t=i.references[e[1].toLowerCase()]={href:e[2]};e[4]!==undefined?t.title=e[4]:e[5]!==undefined&&(t.title=e[5])});return o.length&&n.unshift(s(o,t.trailing)),[]},para:function(t,n){return[["para"].concat(this.processInline(t))]}}},n.dialects.Gruber.inline={__oneElement__:function(t,n,r){var i,s,o=0;n=n||this.dialect.inline.__patterns__;var u=new RegExp("([\\s\\S]*?)("+(n.source||n)+")");i=u.exec(t);if(!i)return[t.length,t];if(i[1])return[i[1].length,i[1]];var s;return i[2]in this.dialect.inline&&(s=this.dialect.inline[i[2]].call(this,t.substr(i.index),i,r||[])),s=s||[i[2].length,i[2]],s},__call__:function(t,n){function s(e){typeof e=="string"&&typeof r[r.length-1]=="string"?r[r.length-1]+=e:r.push(e)}var r=[],i;while(t.length>0)i=this.dialect.inline.__oneElement__.call(this,t,n,r),t=t.substr(i.shift()),c(i,s);return r},"]":function(){},"}":function(){},"\\":function(t){return t.match(/^\\[\\`\*_{}\[\]()#\+.!\-]/)?[2,t[1]]:[1,"\\"]},"![":function(t){var n=t.match(/^!\[(.*?)\][ \t]*\([ \t]*(\S*)(?:[ \t]+(["'])(.*?)\3)?[ \t]*\)/);if(n){n[2]&&n[2][0]=="<"&&n[2][n[2].length-1]==">"&&(n[2]=n[2].substring(1,n[2].length-1)),n[2]=this.dialect.inline.__call__.call(this,n[2],/\\/)[0];var r={alt:n[1],href:n[2]||""};return n[4]!==undefined&&(r.title=n[4]),[n[0].length,["img",r]]}return n=t.match(/^!\[(.*?)\][ \t]*\[(.*?)\]/),n?[n[0].length,["img_ref",{alt:n[1],ref:n[2].toLowerCase(),original:n[0]}]]:[2,"!["]},"[":function b(e){var t=String(e),r=n.DialectHelpers.inline_until_char.call(this,e.substr(1),"]");if(!r)return[1,"["];var i=1+r[0],s=r[1],b,o;e=e.substr(i);var u=e.match(/^\s*\([ \t]*(\S+)(?:[ \t]+(["'])(.*?)\2)?[ \t]*\)/);if(u){var a=u[1];i+=u[0].length,a&&a[0]=="<"&&a[a.length-1]==">"&&(a=a.substring(1,a.length-1));if(!u[3]){var f=1;for(var l=0;l]+)|(.*?@.*?\.[a-zA-Z]+))>/))!=null?n[3]?[n[0].length,["link",{href:"mailto:"+n[3]},n[3]]]:n[2]=="mailto"?[n[0].length,["link",{href:n[1]},n[1].substr("mailto:".length)]]:[n[0].length,["link",{href:n[1]},n[1]]]:[1,"<"]},"`":function(t){var n=t.match(/(`+)(([\s\S]*?)\1)/);return n&&n[2]?[n[1].length+n[2].length,["inlinecode",n[3]]]:[1,"`"]}," \n":function(t){return[3,["linebreak"]]}},n.dialects.Gruber.inline["**"]=u("strong","**"),n.dialects.Gruber.inline.__=u("strong","__"),n.dialects.Gruber.inline["*"]=u("em","*"),n.dialects.Gruber.inline._=u("em","_"),n.buildBlockOrder=function(e){var t=[];for(var n in e){if(n=="__order__"||n=="__call__")continue;t.push(n)}e.__order__=t},n.buildInlinePatterns=function(e){var t=[];for(var n in e){if(n.match(/^__.*__$/))continue;var r=n.replace(/([\\.*+?|()\[\]{}])/g,"\\$1").replace(/\n/,"\\n");t.push(n.length==1?r:"(?:"+r+")")}t=t.join("|"),e.__patterns__=t;var i=e.__call__;e.__call__=function(e,n){return n!=undefined?i.call(this,e,n):i.call(this,e,t)}},n.DialectHelpers={},n.DialectHelpers.inline_until_char=function(e,t){var n=0,r=[];for(;;){if(e[n]==t)return n++,[n,r];if(n>=e.length)return null;res=this.dialect.inline.__oneElement__.call(this,e.substr(n)),n+=res[0],r.push.apply(r,res.slice(1))}},n.subclassDialect=function(e){function t(){}function n(){}return t.prototype=e.block,n.prototype=e.inline,{block:new t,inline:new n}},n.buildBlockOrder(n.dialects.Gruber.block),n.buildInlinePatterns(n.dialects.Gruber.inline),n.dialects.Maruku=n.subclassDialect(n.dialects.Gruber),n.dialects.Maruku.processMetaHash=function(t){var n=f(t),r={};for(var i=0;i1)return undefined;if(!t.match(/^(?:\w+:.*\n)*\w+:.*$/))return undefined;h(this.tree)||this.tree.splice(1,0,{});var r=t.split(/\n/);for(p in r){var i=r[p].match(/(\w+):\s*(.*)$/),s=i[1].toLowerCase(),o=i[2];this.tree[1][s]=o}return[]},n.dialects.Maruku.block.block_meta=function(t,n){var r=t.match(/(^|\n) {0,3}\{:\s*((?:\\\}|[^\}])*)\s*\}$/);if(!r)return undefined;var i=this.dialect.processMetaHash(r[2]),s;if(r[1]===""){var o=this.tree[this.tree.length-1];s=h(o);if(typeof o=="string")return undefined;s||(s={},o.splice(1,0,s));for(a in i)s[a]=i[a];return[]}var u=t.replace(/\n.*$/,""),f=this.processBlock(u,[]);s=h(f[0]),s||(s={},f[0].splice(1,0,s));for(a in i)s[a]=i[a];return f},n.dialects.Maruku.block.definition_list=function(t,n){var r=/^((?:[^\s:].*\n)+):\s+([\s\S]+)$/,i=["dl"],s;if(!(a=t.match(r)))return undefined;var o=[t];while(n.length&&r.exec(n[0]))o.push(n.shift());for(var u=0;u-1&&(a(e)?i=i.split("\n").map(function(e){return" "+e}).join("\n").substr(2):i="\n"+i.split("\n").map(function(e){return" "+e}).join("\n"))):i=o("[Circular]","special"));if(typeof n=="undefined"){if(g==="Array"&&t.match(/^\d+$/))return i;n=JSON.stringify(""+t),n.match(/^"([a-zA-Z_][a-zA-Z_0-9]*)"$/)?(n=n.substr(1,n.length-2),n=o(n,"name")):(n=n.replace(/'/g,"\\'").replace(/\\"/g,'"').replace(/(^"|"$)/g,"'"),n=o(n,"string"))}return n+": "+i});s.pop();var E=0,S=w.reduce(function(e,t){return E++,t.indexOf("\n")>=0&&E++,e+t.length+1},0);return S>50?w=y[0]+(m===""?"":m+"\n ")+" "+w.join(",\n ")+" "+y[1]:w=y[0]+m+" "+w.join(", ")+" "+y[1],w}var s=[],o=function(e,t){var n={bold:[1,22],italic:[3,23],underline:[4,24],inverse:[7,27],white:[37,39],grey:[90,39],black:[30,39],blue:[34,39],cyan:[36,39],green:[32,39],magenta:[35,39],red:[31,39],yellow:[33,39]},r={special:"cyan",number:"blue","boolean":"yellow","undefined":"grey","null":"bold",string:"green",date:"magenta",regexp:"red"}[t];return r?"["+n[r][0]+"m"+e+"["+n[r][1]+"m":e};return i||(o=function(e,t){return e}),u(e,typeof r=="undefined"?2:r)};var h=["Jan","Feb","Mar","Apr","May","Jun","Jul","Aug","Sep","Oct","Nov","Dec"];n.log=function(e){},n.pump=null;var d=Object.keys||function(e){var t=[];for(var n in e)t.push(n);return t},v=Object.getOwnPropertyNames||function(e){var t=[];for(var n in e)Object.hasOwnProperty.call(e,n)&&t.push(n);return t},m=Object.create||function(e,t){var n;if(e===null)n={__proto__:null};else{if(typeof e!="object")throw new TypeError("typeof prototype["+typeof e+"] != 'object'");var r=function(){};r.prototype=e,n=new r,n.__proto__=e}return typeof t!="undefined"&&Object.defineProperties&&Object.defineProperties(n,t),n};n.inherits=function(e,t){e.super_=t,e.prototype=m(t.prototype,{constructor:{value:e,enumerable:!1,writable:!0,configurable:!0}})};var g=/%[sdj%]/g;n.format=function(e){if(typeof e!="string"){var t=[];for(var r=0;r=s)return e;switch(e){case"%s":return String(i[r++]);case"%d":return Number(i[r++]);case"%j":return JSON.stringify(i[r++]);default:return e}});for(var u=i[r];r0&&this._events[e].length>n&&(this._events[e].warned=!0,console.error("(node) warning: possible EventEmitter memory leak detected. %d listeners added. Use emitter.setMaxListeners() to increase limit.",this._events[e].length),console.trace())}this._events[e].push(t)}else this._events[e]=[this._events[e],t];return this},u.prototype.on=u.prototype.addListener,u.prototype.once=function(e,t){var n=this;return n.on(e,function r(){n.removeListener(e,r),t.apply(this,arguments)}),this},u.prototype.removeListener=function(e,t){if("function"!=typeof t)throw new Error("removeListener only takes instances of Function");if(!this._events||!this._events[e])return this;var n=this._events[e];if(a(n)){var r=f(n,t);if(r<0)return this;n.splice(r,1),n.length==0&&delete this._events[e]}else this._events[e]===t&&delete this._events[e];return this},u.prototype.removeAllListeners=function(e){return e&&this._events&&this._events[e]&&(this._events[e]=null),this},u.prototype.listeners=function(e){return this._events||(this._events={}),this._events[e]||(this._events[e]=[]),a(this._events[e])||(this._events[e]=[this._events[e]]),this._events[e]}}),e.define("/src/js/models/commandModel.js",function(e,t,n,r,i,s,o){var u=e("underscore"),a=e("../util").isBrowser()?a=window.Backbone:a=e("backbone"),f=e("../util/errors"),l=e("../git/commands"),c=l.GitOptionParser,h=e("../level/parseWaterfall").ParseWaterfall,p=f.CommandProcessError,d=f.GitError,v=f.Warning,m=f.CommandResult,g=a.Model.extend({defaults:{status:"inqueue",rawStr:null,result:"",createTime:null,error:null,warnings:null,parseWaterfall:new h,generalArgs:null,supportedMap:null,options:null,method:null},initialize:function(e){this.initDefaults(),this.validateAtInit(),this.on("change:error",this.errorChanged,this),this.get("error")&&this.errorChanged(),this.parseOrCatch()},initDefaults:function(){this.set("generalArgs",[]),this.set("supportedMap",{}),this.set("warnings",[])},validateAtInit:function(){if(this.get("rawStr")===null)throw new Error("Give me a string!");this.get("createTime")||this.set("createTime",(new Date).toString())},setResult:function(e){this.set("result",e)},finishWith:function(e){this.set("status","finished"),e.resolve()},addWarning:function(e){this.get("warnings").push(e),this.set("numWarnings",this.get("numWarnings")?this.get("numWarnings")+1:1)},getFormattedWarnings:function(){if(!this.get("warnings").length)return"";var e='';return""+e+this.get("warnings").join("
"+e)+"
"},parseOrCatch:function(){this.expandShortcuts(this.get("rawStr"));try{this.processInstants()}catch(e){f.filterError(e),this.set("error",e);return}if(this.parseAll())return;this.set("error",new p({msg:'The command "'+this.get("rawStr")+"\" isn't supported, sorry!"}))},errorChanged:function(){var e=this.get("error");e instanceof p||e instanceof d?this.set("status","error"):e instanceof m?this.set("status","finished"):e instanceof v&&this.set("status","warning"),this.formatError()},formatError:function(){this.set("result",this.get("error").toResult())},expandShortcuts:function(e){e=this.get("parseWaterfall").expandAllShortcuts(e),this.set("rawStr",e)},processInstants:function(){var e=this.get("rawStr");if(!e.length)throw new m({msg:""});this.get("parseWaterfall").processAllInstants(e)},parseAll:function(){var e=this.get("rawStr"),t=this.get("parseWaterfall").parseAll(e);return t?(u.each(t.toSet,function(e,t){this.set(t,e)},this),!0):!1}}),y=a.Model.extend({defaults:{text:""}});n.CommandEntry=y,n.Command=g}),e.define("/src/js/git/commands.js",function(e,t,n,r,i,s,o){function g(e,t){this.method=e,this.rawOptions=t,this.supportedMap=this.getMasterOptionMap()[e];if(this.supportedMap===undefined)throw new Error("No option map for "+e);this.generalArgs=[],this.explodeAndSet()}var u=e("underscore"),a=e("../util/errors"),f=a.CommandProcessError,l=a.GitError,c=a.Warning,h=a.CommandResult,p={"git commit":/^(gc|git ci)($|\s)/,"git add":/^ga($|\s)/,"git checkout":/^(go|git co)($|\s)/,"git rebase":/^gr($|\s)/,"git branch":/^(gb|git br)($|\s)/,"git status":/^(gst|gs|git st)($|\s)/,"git help":/^git$/},d=[[/^git help($|\s)/,function(){var e=["Git Version PCOTTLE.1.0","
","Usage:",u.escape(" git []"),"
","Supported commands:","
"],t=g.prototype.getMasterOptionMap();u.each(t,function(t,n){e.push("git "+n),u.each(t,function(t,n){e.push(" "+n)},this)},this);var n=e.join("\n");throw n=n.replace(/\t/g," "),new h({msg:n})}]],v={"git commit":/^git commit($|\s)/,"git add":/^git add($|\s)/,"git checkout":/^git checkout($|\s)/,"git rebase":/^git rebase($|\s)/,"git reset":/^git reset($|\s)/,"git branch":/^git branch($|\s)/,"git revert":/^git revert($|\s)/,"git log":/^git log($|\s)/,"git merge":/^git merge($|\s)/,"git show":/^git show($|\s)/,"git status":/^git status($|\s)/,"git cherry-pick":/^git cherry-pick($|\s)/},m=function(e){var t,n;u.each(v,function(r,i){r.exec(e)&&(n=e.slice(i.length+1),t=i.slice("git ".length))});if(!t)return!1;var r=new g(t,n);return{toSet:{generalArgs:r.generalArgs,supportedMap:r.supportedMap,method:t,options:n,eventName:"processGitCommand"}}};g.prototype.getMasterOptionMap=function(){return{commit:{"--amend":!1,"-a":!1,"-am":!1,"-m":!1},status:{},log:{},add:{},"cherry-pick":{},branch:{"-d":!1,"-D":!1,"-f":!1,"--contains":!1},checkout:{"-b":!1,"-B":!1,"-":!1},reset:{"--hard":!1,"--soft":!1},merge:{},rebase:{"-i":!1},revert:{},show:{}}},g.prototype.explodeAndSet=function(){var e=this.rawOptions.match(/('.*?'|".*?"|\S+)/g)||[];for(var t=0;t p.uiButton":"positive"},initialize:function(t){t=t||{},this.options=t,this.JSON=u.extend({beforeMarkdowns:["## Git Commits","","Awesome!"],command:"git commit",afterMarkdowns:["Now you have seen it in action","","Go ahead and try the level!"]},t);var n=function(t){return e("markdown").markdown.toHTML(t.join("\n"))};this.JSON.beforeHTML=n(this.JSON.beforeMarkdowns),this.JSON.afterHTML=n(this.JSON.afterMarkdowns),this.container=new p({title:t.title||"Git Demonstration"}),this.render(),this.checkScroll(),this.navEvents=u.clone(f.Events),this.navEvents.on("positive",this.positive,this),this.navEvents.on("negative",this.negative,this),this.keyboardListener=new c({events:this.navEvents,aliasMap:{enter:"positive",right:"positive",left:"negative"},wait:!0}),this.visFinished=!1,this.initVis(),t.wait||this.show()},receiveMetaNav:function(e,t){var n=this;e.navEvents.on("positive",this.positive,this),this.metaContainerView=t},checkScroll:function(){var e=this.$("div.demonstrationText").children(),t=u.map(e,function(e){return e.clientHeight}),n=u.reduce(t,function(e,t){return e+t});n15&&console.warn("graphics are degrading from too many layers");var t=this.getDepthIncrement(e);u.each(this.visNodeMap,function(e){e.setDepthBasedOn(t)},this)},w.prototype.animateNodePositions=function(e){u.each(this.visNodeMap,function(t){t.animateUpdatedPosition(e)},this)},w.prototype.addBranchFromEvent=function(e,t,n){var r=u.bind(function(){this.addBranch(e)},this);!this.gitEngine||!this.gitReady?this.defer(r):r()},w.prototype.addBranch=function(e){var t=new m({branch:e,gitVisuals:this,gitEngine:this.gitEngine});this.visBranchCollection.add(t),this.gitReady?t.genGraphics(this.paper):this.defer(u.bind(function(){t.genGraphics(this.paper)},this))},w.prototype.removeVisBranch=function(e){this.visBranchCollection.remove(e)},w.prototype.removeVisNode=function(e){this.visNodeMap[e.getID()]=undefined},w.prototype.removeVisEdge=function(e){this.visEdgeCollection.remove(e)},w.prototype.animateRefs=function(e){this.visBranchCollection.each(function(t){t.animateUpdatedPos(e)},this)},w.prototype.animateEdges=function(e){this.visEdgeCollection.each(function(t){t.animateUpdatedPath(e)},this)},w.prototype.getMinLayers=function(){return this.options.smallCanvas?4:7},w.prototype.getDepthIncrement=function(e){e=Math.max(e,this.getMinLayers());var t=1/e;return t},w.prototype.calcDepthRecursive=function(e,t){e.get("visNode").setDepth(t);var n=e.get("children"),r=t;return u.each(n,function(e){var n=this.calcDepthRecursive(e,t+1);r=Math.max(n,r)},this),r},w.prototype.canvasResize=function(e,t){this.resizeFunc||this.genResizeFunc(),this.resizeFunc(e,t)},w.prototype.genResizeFunc=function(){this.resizeFunc=u.debounce(u.bind(function(t,n){if(c.isAnimating){var r=e("../app");r.getEventBaton().trigger("commandSubmitted","refresh")}else this.refreshTree()},this),200,!0)},w.prototype.addNode=function(e,t){this.commitMap[e]=t,t.get("rootCommit")&&(this.rootCommit=t);var n=new v({id:e,commit:t,gitVisuals:this,gitEngine:this.gitEngine});return this.visNodeMap[e]=n,this.gitReady&&n.genGraphics(this.paper),n},w.prototype.addEdge=function(e,t){var n=this.visNodeMap[e],r=this.visNodeMap[t];if(!n||!r)throw new Error("one of the ids in ("+e+", "+t+") does not exist");var i=new y({tail:n,head:r,gitVisuals:this,gitEngine:this.gitEngine});this.visEdgeCollection.add(i),this.gitReady&&i.genGraphics(this.paper)},w.prototype.zIndexReflow=function(){this.visNodesFront(),this.visBranchesFront()},w.prototype.visNodesFront=function(){u.each(this.visNodeMap,function(e){e.toFront()})},w.prototype.visBranchesFront=function(){this.visBranchCollection.each(function(e){e.nonTextToFront(),e.textToFront()}),this.visBranchCollection.each(function(e){e.textToFrontIfInStack()})},w.prototype.drawTreeFromReload=function(){this.gitReady=!0,this.deferFlush(),this.calcTreeCoords()},w.prototype.drawTreeFirstTime=function(){this.gitReady=!0,this.calcTreeCoords(),u.each(this.visNodeMap,function(e){e.genGraphics(this.paper)},this),this.visEdgeCollection.each(function(e){e.genGraphics(this.paper)},this),this.visBranchCollection.each(function(e){e.genGraphics(this.paper)},this),this.zIndexReflow()},n.GitVisuals=w}),e.define("/src/js/visuals/visNode.js",function(e,t,n,r,i,s,o){var u=e("underscore"),a=e("backbone"),f=e("../util/constants").GRAPHICS,l=e("../visuals/visBase").VisBase,c=l.extend({defaults:{depth:undefined,maxWidth:null,outgoingEdges:null,circle:null,text:null,id:null,pos:null,radius:null,commit:null,animationSpeed:f.defaultAnimationTime,animationEasing:f.defaultEasing,fill:f.defaultNodeFill,"stroke-width":f.defaultNodeStrokeWidth,stroke:f.defaultNodeStroke},getID:function(){return this.get("id")},validateAtInit:function(){if(!this.get("id"))throw new Error("need id for mapping");if(!this.get("commit"))throw new Error("need commit for linking");this.get("pos")||this.set("pos",{x:Math.random(),y:Math.random()})},initialize:function(){this.validateAtInit(),this.gitVisuals=this.get("gitVisuals"),this.gitEngine=this.get("gitEngine"),this.set("outgoingEdges",[])},setDepth:function(e){this.set("depth",Math.max(this.get("depth")||0,e))},setDepthBasedOn:function(e){if(this.get("depth")===undefined){debugger;throw new Error("no depth yet!")}var t=this.get("pos");t.y=this.get("depth")*e},getMaxWidthScaled:function(){var e=this.gitVisuals.getCommitUpstreamStatus(this.get("commit")),t={branch:1,head:.3,none:.1};if(t[e]===undefined)throw new Error("bad stat");return t[e]*this.get("maxWidth")},toFront:function(){this.get("circle").toFront(),this.get("text").toFront()},getOpacity:function(){var e={branch:1,head:f.upstreamHeadOpacity,none:f.upstreamNoneOpacity},t=this.gitVisuals.getCommitUpstreamStatus(this.get("commit"));if(e[t]===undefined)throw new Error("invalid status");return e[t]},getTextScreenCoords:function(){return this.getScreenCoords()},getAttributes:function(){var e=this.getScreenCoords(),t=this.getTextScreenCoords(),n=this.getOpacity();return{circle:{cx:e.x,cy:e.y,opacity:n,r:this.getRadius(),fill:this.getFill(),"stroke-width":this.get("stroke-width"),stroke:this.get("stroke")},text:{x:t.x,y:t.y,opacity:n}}},highlightTo:function(e,t,n){var r=e.get("fill"),i={circle:{fill:r,stroke:r,"stroke-width":this.get("stroke-width")*5},text:{}};this.animateToAttr(i,t,n)},animateUpdatedPosition:function(e,t){var n=this.getAttributes();this.animateToAttr(n,e,t)},animateFromAttrToAttr:function(e,t,n,r){this.animateToAttr(e,0),this.animateToAttr(t,n,r)},animateToSnapshot:function(e,t,n){if(!e[this.getID()])return;this.animateToAttr(e[this.getID()],t,n)},animateToAttr:function(e,t,n){if(t===0){this.get("circle").attr(e.circle),this.get("text").attr(e.text);return}var r=t!==undefined?t:this.get("animationSpeed"),i=n||this.get("animationEasing");this.get("circle").stop().animate(e.circle,r,i),this.get("text").stop().animate(e.text,r,i),n=="bounce"&&e.circle&&e.circle.cx!==undefined&&e.text&&e.text.x!==undefined&&(this.get("circle").animate(e.circle.cx,r,"easeInOut"),this.get("text").animate(e.text.x,r,"easeInOut"))},getScreenCoords:function(){var e=this.get("pos");return this.gitVisuals.toScreenCoords(e)},getRadius:function(){return this.get("radius")||f.nodeRadius},getParentScreenCoords:function(){return this.get("commit").get("parents")[0].get("visNode").getScreenCoords()},setBirthPosition:function(){var e=this.getParentScreenCoords();this.get("circle").attr({cx:e.x,cy:e.y,opacity:0,r:0}),this.get("text").attr({x:e.x,y:e.y,opacity:0})},setBirthFromSnapshot:function(e){var t=this.get("commit").get("parents")[0].get("visNode").getID(),n=e[t];this.get("circle").attr({opacity:0,r:0,cx:n.circle.cx,cy:n.circle.cy}),this.get("text").attr({opacity:0,x:n.text.x,y:n.text.y});var r={x:n.circle.cx,y:n.circle.cy};this.setOutgoingEdgesBirthPosition(r)},setBirth:function(){this.setBirthPosition(),this.setOutgoingEdgesBirthPosition(this.getParentScreenCoords())},setOutgoingEdgesOpacity:function(e){u.each(this.get("outgoingEdges"),function(t){t.setOpacity(e)})},animateOutgoingEdgesToAttr:function(e,t,n){u.each(this.get("outgoingEdges"),function(t){var n=e[t.getID()];t.animateToAttr(n)},this)},animateOutgoingEdges:function(e,t){u.each(this.get("outgoingEdges"),function(n){n.animateUpdatedPath(e,t)},this)},animateOutgoingEdgesFromSnapshot:function(e,t,n){u.each(this.get("outgoingEdges"),function(r){var i=e[r.getID()];r.animateToAttr(i,t,n)},this)},setOutgoingEdgesBirthPosition:function(e){u.each(this.get("outgoingEdges"),function(t){var n=t.get("head").getScreenCoords(),r=t.genSmoothBezierPathStringFromCoords(e,n);t.get("path").stop().attr({path:r,opacity:0})},this)},parentInFront:function(){this.get("commit").get("parents")[0].get("visNode").toFront()},getFontSize:function(e){return e.length<3?12:e.length<5?10:8},getFill:function(){var e=this.gitVisuals.getCommitUpstreamStatus(this.get("commit"));return e=="head"?f.headRectFill:e=="none"?f.orphanNodeFill:this.gitVisuals.getBlendedHuesForCommit(this.get("commit"))},attachClickHandlers:function(){if(this.get("gitVisuals").options.noClick)return;var t="git checkout "+this.get("commit").get("id"),n=e("../app");u.each([this.get("circle"),this.get("text")],function(e){e.click(function(){n.getEventBaton().trigger("commandSubmitted",t)}),$(e.node).css("cursor","pointer")})},setOpacity:function(e){e=e===undefined?1:e;var t=["circle","text"];u.each(t,function(t){this.get(t).attr({opacity:e})},this)},remove:function(){this.removeKeys(["circle"],["text"]);var e=this.get("text");e&&e.remove(),this.gitVisuals.removeVisNode(this)},removeAll:function(){this.remove(),u.each(this.get("outgoingEdges"),function(e){e.remove()},this)},getExplodeStepFunc:function(){var e=this.get("circle"),t=20,n=Math.PI+Math.random()*1*Math.PI,r=.2,i=.01,s=t*Math.cos(n),o=t*Math.sin(n),u=e.attr("cx"),a=e.attr("cy"),f=this.gitVisuals.paper.width,l=this.gitVisuals.paper.height,c=.8,h=1,p=function(){o+=r*h-i*o,s-=i*s,u+=s*h,a+=o*h;if(u<0||u>f)s=c*-s,u=u<0?0:f;if(a<0||a>l)o=c*-o,a=a<0?0:l;return e.attr({cx:u,cy:a}),s*s+o*o<.01&&Math.abs(a-l)===0?!1:!0};return p},genGraphics:function(){var e=this.gitVisuals.paper,t=this.getScreenCoords(),n=this.getTextScreenCoords(),r=e.circle(t.x,t.y,this.getRadius()).attr(this.getAttributes().circle),i=e.text(n.x,n.y,String(this.get("id")));i.attr({"font-size":this.getFontSize(this.get("id")),"font-weight":"bold","font-family":"Monaco, Courier, font-monospace",opacity:this.getOpacity()}),this.set("circle",r),this.set("text",i),this.attachClickHandlers()}});n.VisNode=c}),e.define("/src/js/visuals/visBase.js",function(e,t,n,r,i,s,o){var u=e("underscore"),a=e("backbone"),f=a.Model.extend({removeKeys:function(e){u.each(e,function(e){this.get(e)&&this.get(e).remove()},this)},animateAttrKeys:function(e,t,n,r){e=u.extend({},{include:["circle","arrow","rect","path","text"],exclude:[]},e||{});var i=this.getAttributes();u.each(e.include,function(e){i[e]=u.extend({},i[e],t)}),u.each(e.exclude,function(e){delete i[e]}),this.animateToAttr(i,n,r)}});n.VisBase=f}),e.define("/src/js/visuals/visBranch.js",function(e,t,n,r,i,s,o){var u=e("underscore"),a=e("backbone"),f=e("../util/constants").GRAPHICS,l=e("../visuals/visBase").VisBase,c=function(){var e=Math.random(),t="hsb("+String(e)+",0.7,1)";return t},h=l.extend({defaults:{pos:null,text:null,rect:null,arrow:null,isHead:!1,flip:1,fill:f.rectFill,stroke:f.rectStroke,"stroke-width":f.rectStrokeWidth,offsetX:f.nodeRadius*4.75,offsetY:0,arrowHeight:14,arrowInnerSkew:0,arrowEdgeHeight:6,arrowLength:14,arrowOffsetFromCircleX:10,vPad:5,hPad:5,animationSpeed:f.defaultAnimationTime,animationEasing:f.defaultEasing},validateAtInit:function(){if(!this.get("branch"))throw new Error("need a branch!")},getID:function(){return this.get("branch").get("id")},initialize:function(){this.validateAtInit(),this.gitVisuals=this.get("gitVisuals"),this.gitEngine=this.get("gitEngine");if(!this.gitEngine)throw new Error("asd wtf");this.get("branch").set("visBranch",this);var e=this.get("branch").get("id");e=="HEAD"?(this.set("isHead",!0),this.set("flip",-1),this.set("fill",f.headRectFill)):e!=="master"&&this.set("fill",c())},getCommitPosition:function(){var e=this.gitEngine.getCommitFromRef(this.get("branch")),t=e.get("visNode"),n=this.get("gitVisuals").posBoundaries.max;return t.get("pos").x>n?this.set("flip",-1):this.set("flip",1),t.getScreenCoords()},getBranchStackIndex:function(){if(this.get("isHead"))return 0;var e=this.getBranchStackArray(),t=-1;return u.each(e,function(e,n){e.obj==this.get("branch")&&(t=n)},this),t},getBranchStackLength:function(){return this.get("isHead")?1:this.getBranchStackArray().length},getBranchStackArray:function(){var e=this.gitVisuals.branchStackMap[this.get("branch").get("target").get("id")];return e===undefined?(this.gitVisuals.calcBranchStacks(),this.getBranchStackArray()):e},getTextPosition:function(){var e=this.getCommitPosition(),t=this.getBranchStackIndex();return{x:e.x+this.get("flip")*this.get("offsetX"),y:e.y+t*f.multiBranchY+this.get("offsetY")}},getRectPosition:function(){var e=this.getTextPosition(),t=this.get("flip"),n=this.getTextSize();return{x:e.x-.5*n.w-this.get("hPad"),y:e.y-.5*n.h-this.get("vPad")}},getArrowPath:function(){var e=function(e,t,n){return{x:e.x+t,y:e.y+n}},t=function(e){return String(Math.round(e.x))+","+String(Math.round(e.y))},n=this.get("flip"),r=e(this.getCommitPosition(),n*this.get("arrowOffsetFromCircleX"),0),i=e(r,n*this.get("arrowLength"),-this.get("arrowHeight")),s=e(r,n*this.get("arrowLength"),this.get("arrowHeight")),o=e(i,n*this.get("arrowInnerSkew"),this.get("arrowEdgeHeight")),a=e(s,n*this.get("arrowInnerSkew"),-this.get("arrowEdgeHeight")),f=49,l=e(o,n*f,0),c=e(a,n*f,0),h="";h+="M"+t(l)+" ";var p=[o,i,r,s,a,c];return u.each(p,function(e){h+="L"+t(e)+" "},this),h+="z",h},getTextSize:function(){var e=function(e){var t=e.get("text")?e.get("text").node:null;return t===null?0:t.clientWidth},t=function(e){return e.w||(e.w=75),e.h||(e.h=20),e},n=this.get("text").node;if(this.get("isHead"))return t({w:n.clientWidth,h:n.clientHeight});var r=0;return u.each(this.getBranchStackArray(),function(t){r=Math.max(r,e(t.obj.get("visBranch")))}),t({w:r,h:n.clientHeight})},getSingleRectSize:function(){var e=this.getTextSize(),t=this.get("vPad"),n=this.get("hPad");return{w:e.w+t*2,h:e.h+n*2}},getRectSize:function(){var e=this.getTextSize(),t=this.get("vPad"),n=this.get("hPad"),r=this.getBranchStackLength();return{w:e.w+t*2,h:e.h*r*1.1+n*2}},getName:function(){var e=this.get("branch").get("id"),t=this.gitEngine.HEAD.get("target").get("id"),n=t==e?"*":"";return e+n},nonTextToFront:function(){this.get("arrow").toFront(),this.get("rect").toFront()},textToFront:function(){this.get("text").toFront()},textToFrontIfInStack:function(){this.getBranchStackIndex()!==0&&this.get("text").toFront()},getFill:function(){return this.get("isHead")||this.getBranchStackLength()==1||this.getBranchStackIndex()!==0?this.get("fill"):this.gitVisuals.blendHuesFromBranchStack(this.getBranchStackArray())},remove:function(){this.removeKeys(["text","arrow","rect"]),this.gitVisuals.removeVisBranch(this)},genGraphics:function(e){var t=this.getTextPosition(),n=this.getName(),r;r=e.text(t.x,t.y,String(n)),r.attr({"font-size":14,"font-family":"Monaco, Courier, font-monospace",opacity:this.getTextOpacity()}),this.set("text",r);var i=this.getRectPosition(),s=this.getRectSize(),o=e.rect(i.x,i.y,s.w,s.h,8).attr(this.getAttributes().rect);this.set("rect",o);var u=this.getArrowPath(),a=e.path(u).attr(this.getAttributes().arrow);this.set("arrow",a),this.attachClickHandlers(),o.toFront(),r.toFront()},attachClickHandlers:function(){if(this.get("gitVisuals").options.noClick)return;var t="git checkout "+this.get("branch").get("id"),n=e("../app"),r=[this.get("rect"),this.get("text"),this.get("arrow")];u.each(r,function(e){e.click(function(){n.getEventBaton().trigger("commandSubmitted",t)}),$(e.node).css("cursor","pointer")})},updateName:function(){this.get("text").attr({text:this.getName()})},getNonTextOpacity:function(){return this.get("isHead")?this.gitEngine.getDetachedHead()?1:0:this.getBranchStackIndex()===0?1:0},getTextOpacity:function(){return this.get("isHead")?this.gitEngine.getDetachedHead()?1:0:1},getAttributes:function(){var e=this.getNonTextOpacity(),t=this.getTextOpacity();this.updateName();var n=this.getTextPosition(),r=this.getRectPosition(),i=this.getRectSize(),s=this.getArrowPath();return{text:{x:n.x,y:n.y,opacity:t},rect:{x:r.x,y:r.y,width:i.w,height:i.h,opacity:e,fill:this.getFill(),stroke:this.get("stroke"),"stroke-width":this.get("stroke-width")},arrow:{path:s,opacity:e,fill:this.getFill(),stroke:this.get("stroke"),"stroke-width":this.get("stroke-width")}}},animateUpdatedPos:function(e,t){var n=this.getAttributes();this.animateToAttr(n,e,t)},animateFromAttrToAttr:function(e,t,n,r){this.animateToAttr(e,0),this.animateToAttr(t,n,r)},animateToAttr:function(e,t,n){if(t===0){this.get("text").attr(e.text),this.get("rect").attr(e.rect),this.get("arrow").attr(e.arrow);return}var r=t!==undefined?t:this.get("animationSpeed"),i=n||this.get("animationEasing");this.get("text").stop().animate(e.text,r,i),this.get("rect").stop().animate(e.rect,r,i),this.get("arrow").stop().animate(e.arrow,r,i)}}),p=a.Collection.extend({model:h});n.VisBranchCollection=p,n.VisBranch=h,n.randomHueString=c}),e.define("/src/js/visuals/visEdge.js",function(e,t,n,r,i,s,o){var u=e("underscore"),a=e("backbone"),f=e("../util/constants").GRAPHICS,l=e("../visuals/visBase").VisBase,c=l.extend({defaults:{tail:null,head:null,animationSpeed:f.defaultAnimationTime,animationEasing:f.defaultEasing},validateAtInit:function(){var e=["tail","head"];u.each(e,function(e){if(!this.get(e))throw new Error(e+" is required!")},this)},getID:function(){return this.get("tail").get("id")+"."+this.get("head").get("id")},initialize:function(){this.validateAtInit(),this.gitVisuals=this.get("gitVisuals"),this.gitEngine=this.get("gitEngine"),this.get("tail").get("outgoingEdges").push(this)},remove:function(){this.removeKeys(["path"]),this.gitVisuals.removeVisEdge(this)},genSmoothBezierPathString:function(e,t){var n=e.getScreenCoords(),r=t.getScreenCoords();return this.genSmoothBezierPathStringFromCoords(n,r)},genSmoothBezierPathStringFromCoords:function(e,t){var n=function(e){return String(Math.round(e.x))+","+String(Math.round(e.y))},r=function(e,t,n){return n=n||f.curveControlPointOffset,{x:e.x,y:e.y+n*t}},i=function(e,t,n){return{x:e.x+t,y:e.y+n}};e=r(e,-1,this.get("tail").getRadius()),t=r(t,1,this.get("head").getRadius());var s="";s+="M"+n(e)+" ",s+="C",s+=n(r(e,-1))+" ",s+=n(r(t,1))+" ",s+=n(t);var o=f.arrowHeadSize||10;return s+=" L"+n(i(t,-o,o)),s+=" L"+n(i(t,o,o)),s+=" L"+n(t),s+="C",s+=n(r(t,1))+" ",s+=n(r(e,-1))+" ",s+=n(e),s},getBezierCurve:function(){return this.genSmoothBezierPathString(this.get("tail"),this.get("head"))},getStrokeColor:function(){return f.visBranchStrokeColorNone},setOpacity:function(e){e=e===undefined?1:e,this.get("path").attr({opacity:e})},genGraphics:function(e){var t=this.getBezierCurve(),n=e.path(t).attr({"stroke-width":f.visBranchStrokeWidth,stroke:this.getStrokeColor(),"stroke-linecap":"round","stroke-linejoin":"round",fill:this.getStrokeColor()});n.toBack(),this.set("path",n)},getOpacity:function(){var e=this.gitVisuals.getCommitUpstreamStatus(this.get("tail")),t={branch:1,head:f.edgeUpstreamHeadOpacity,none:f.edgeUpstreamNoneOpacity};if(t[e]===undefined)throw new Error("bad stat");return t[e]},getAttributes:function(){var e=this.getBezierCurve(),t=this.getOpacity();return{path:{path:e,opacity:t}}},animateUpdatedPath:function(e,t){var n=this.getAttributes();this.animateToAttr(n,e,t)},animateFromAttrToAttr:function(e,t,n,r){this.animateToAttr(e,0),this.animateToAttr(t,n,r)},animateToAttr:function(e,t,n){if(t===0){this.get("path").attr(e.path);return}this.get("path").toBack(),this.get("path").stop().animate(e.path,t!==undefined?t:this.get("animationSpeed"),n||this.get("animationEasing"))}}),h=a.Collection.extend({model:c});n.VisEdgeCollection=h,n.VisEdge=c}),e.define("/src/js/level/disabledMap.js",function(e,t,n,r,i,s,o){function c(e){e=e||{},this.disabledMap=e.disabledMap||{"git cherry-pick":!0,"git rebase":!0}}var u=e("underscore"),a=e("../git/commands"),f=e("../util/errors"),l=f.GitError;c.prototype.getInstantCommands=function(){var e=[],t=function(){throw new l({msg:"That git command is disabled for this level!"})};return u.each(this.disabledMap,function(n,r){var i=a.regexMap[r];if(!i)throw new Error("wuttttt this disbaled command"+r+" has no regex matching");e.push([i,t])}),e},n.DisabledMap=c}),e.define("/src/js/level/arbiter.js",function(e,t,n,r,i,s,o){function h(){this.levelMap={},this.levelSequences=f,this.sequences=[],this.init();var e;try{e=JSON.parse(localStorage.getItem("solvedMap")||"{}")}catch(t){console.warn("local storage failed",t)}this.solvedMap=e||{},c.getEvents().on("levelSolved",this.levelSolved,this)}var u=e("underscore"),a=e("backbone"),f=e("../levels").levelSequences,l=e("../levels").sequenceInfo,c=e("../app");h.prototype.init=function(){var e;u.each(this.levelSequences,function(e,t){this.sequences.push(t);if(!e||!e.length)throw new Error("no empty sequences allowed");u.each(e,function(e,n){this.validateLevel(e);var r=t+String(n+1),i=u.extend({},e,{index:n,id:r,sequenceName:t});this.levelMap[r]=i,this.levelSequences[t][n]=i},this)},this)},h.prototype.isLevelSolved=function(e){if(!this.levelMap[e])throw new Error("that level doesnt exist!");return Boolean(this.solvedMap[e])},h.prototype.levelSolved=function(e){if(!e)return;this.solvedMap[e]=!0,this.syncToStorage()},h.prototype.resetSolvedMap=function(){this.solvedMap={},this.syncToStorage(),c.getEvents().trigger("levelSolved")},h.prototype.syncToStorage=function(){try{localStorage.setItem("solvedMap",JSON.stringify(this.solvedMap))}catch(e){console.warn("local storage fialed on set",e)}},h.prototype.validateLevel=function(e){e=e||{};var t=["name","goalTreeString","solutionCommand"],n=["hint","disabledMap","startTree"];u.each(t,function(t){if(e[t]===undefined)throw console.log(e),new Error("I need this field for a level: "+t)})},h.prototype.getSequenceToLevels=function(){return this.levelSequences},h.prototype.getSequences=function(){return u.keys(this.levelSequences)},h.prototype.getLevelsInSequence=function(e){if(!this.levelSequences[e])throw new Error("that sequecne name "+e+"does not exist");return this.levelSequences[e]},h.prototype.getSequenceInfo=function(e){return l[e]},h.prototype.getLevel=function(e){return this.levelMap[e]},h.prototype.getNextLevel=function(e){if(!this.levelMap[e])return console.warn("that level doesnt exist!!!"),null;var t=this.levelMap[e],n=t.sequenceName,r=this.levelSequences[n],i=t.index+1;if(i=t.length?0:e,e=e<0?t.length-1:e,e},boundIndex:function(e,t){return e=e>=t.length?t.length-1:e,e=e<0?0:e,e},getNextSequence:function(){var e=this.getSequenceIndex(this.selectedSequence),t=this.wrapIndex(e+1,this.sequences);return this.sequences[t]},getPreviousSequence:function(){var e=this.getSequenceIndex(this.selectedSequence),t=this.wrapIndex(e-1,this.sequences);return this.sequences[t]},getSequenceIndex:function(e){var t=this.sequences.indexOf(e);if(t<0)throw new Error("didnt find");return t},getIndexForID:function(e){return h.getLevelArbiter().getLevel(e).index},selectFirst:function(){var e=this.sequenceToLevels[this.sequences[0]][0].id;this.selectIconByID(e),this.selectedIndex=0,this.selectedSequence=this.sequences[0]},getCurrentSequence:function(){return this.sequenceToLevels[this.selectedSequence]},getSelectedID:function(){return this.sequenceToLevels[this.selectedSequence][this.selectedIndex].id},selectIconByID:function(e){this.toggleIconSelect(e,!0)},deselectIconByID:function(e){this.toggleIconSelect(e,!1)},toggleIconSelect:function(e,t){this.selectedID=e;var n="#levelIcon-"+e;$(n).toggleClass("selected",t)},negative:function(){this.hide()},testOption:function(e){return this.currentCommand&&(new RegExp("--"+e)).test(this.currentCommand.get("rawStr"))},show:function(e,t){this.currentCommand=t,this.updateSolvedStatus(),this.showDeferred=e,this.keyboardListener.listen(),m.__super__.show.apply(this)},hide:function(){this.showDeferred&&this.showDeferred.resolve(),this.showDeferred=undefined,this.keyboardListener.mute(),this.turnOffKeyboardSelection(),m.__super__.hide.apply(this)},loadLevelID:function(e){this.testOption("noOutput")||h.getEventBaton().trigger("commandSubmitted","level "+e),this.hide()},updateSolvedStatus:function(){u.each(this.seriesViews,function(e){e.updateSolvedStatus()},this)},buildSequences:function(){this.seriesViews=[],u.each(this.sequences,function(e){this.seriesViews.push(new g({destination:this.$el,name:e,navEvents:this.navEvents}))},this)}}),g=v.extend({tagName:"div",className:"seriesView box flex1 vertical",template:u.template($("#series-view").html()),events:{"click div.levelIcon":"click"},initialize:function(e){this.name=e.name||"intro",this.navEvents=e.navEvents,this.info=h.getLevelArbiter().getSequenceInfo(this.name),this.levels=h.getLevelArbiter().getLevelsInSequence(this.name),this.levelIDs=[],u.each(this.levels,function(e){this.levelIDs.push(e.id)},this),this.destination=e.destination,this.JSON={displayName:this.info.displayName,about:this.info.about,ids:this.levelIDs},this.render(),this.updateSolvedStatus()},updateSolvedStatus:function(){var e=this.$("div.levelIcon").each(function(e,t){var n=$(t).attr("data-id");$(t).toggleClass("solved",h.getLevelArbiter().isLevelSolved(n))})},click:function(e){var t=e.srcElement||e.currentTarget;if(!t){console.warn("wut, no id");return}var n=$(t).attr("data-id");this.navEvents.trigger("clickedID",n)}});n.LevelDropdownView=m}),e.define("/src/js/views/commandViews.js",function(e,t,n,r,i,s,o){var u=e("underscore"),a=e("../util").isBrowser()?a=window.Backbone:a=e("backbone"),f=e("../models/collections").CommandEntryCollection,l=e("../app"),c=e("../models/commandModel").Command,h=e("../models/commandModel").CommandEntry,p=e("../util/errors"),d=p.Warning,v=e("../util"),m=e("../util/keyboard"),g=a.View.extend({initialize:function(e){l.getEvents().on("commandSubmittedPassive",this.addToCommandHistory,this),this.commands=new f,this.commands.fetch({success:u.bind(function(){var e=[];this.commands.each(function(t){e.push(t)}),e.reverse(),this.commands.reset(),u.each(e,function(e){this.commands.add(e)},this)},this)}),this.index=-1,this.commandParagraph=this.$("#prompt p.command")[0],this.commandCursor=this.$("#prompt span.cursor")[0],this.focus(),l.getEvents().on("rollupCommands",this.rollupCommands,this),l.getEventBaton().stealBaton("keydown",this.onKeyDown,this),l.getEventBaton().stealBaton("keyup",this.onKeyUp,this)},events:{"blur #commandTextField":"hideCursor","focus #commandTextField":"showCursor"},blur:function(){this.hideCursor()},focus:function(){this.$("#commandTextField").focus(),this.showCursor()},hideCursor:function(){this.toggleCursor(!1)},showCursor:function(){this.toggleCursor(!0)},toggleCursor:function(e){$(this.commandCursor).toggleClass("shown",e)},onKeyDown:function(e){var t=e.srcElement;this.updatePrompt(t)},onKeyUp:function(e){this.onKeyDown(e);var t={enter:u.bind(function(){this.submit()},this),up:u.bind(function(){this.commandSelectChange(1)},this),down:u.bind(function(){this.commandSelectChange(-1)},this)},n=m.mapKeycodeToKey(e.which||e.keyCode);t[n]!==undefined&&(e.preventDefault(),t[n](),this.onKeyDown(e))},badHtmlEncode:function(e){return e.replace(/&/g,"&").replace(/=this.commands.length||this.index<0){this.clear(),this.index=-1;return}var t=this.commands.toArray()[this.index].get("text");this.setTextField(t)},clearLocalStorage:function(){this.commands.each(function(e){a.sync("delete",e,function(){})},this)},setTextField:function(e){this.$("#commandTextField").val(e)},clear:function(){this.setTextField("")},submit:function(){var e=this.$("#commandTextField").val().replace("\n","");this.clear(),this.submitCommand(e),this.index=-1},rollupCommands:function(e){var t=this.commands.toArray().slice(1,Number(e)+1);t.reverse();var n="";u.each(t,function(e){n+=e.get("text")+";"},this);var r=new h({text:n});this.commands.unshift(r),a.sync("create",r,function(){})},addToCommandHistory:function(e){var t=e.length&&this.index===-1||e.length&&this.index!==-1&&this.commands.toArray()[this.index].get("text")!==e;if(!t)return;var n=new h({text:e});this.commands.unshift(n),a.sync("create",n,function(){}),this.commands.length>100&&this.clearLocalStorage()},submitCommand:function(e){l.getEventBaton().trigger("commandSubmitted",e)}}),y=a.View.extend({tagName:"div",model:c,template:u.template($("#command-template").html()),events:{click:"clicked"},clicked:function(e){},initialize:function(){this.model.bind("change",this.wasChanged,this),this.model.bind("destroy",this.remove,this)},wasChanged:function(e,t){var n=t.changes,r=u.keys(n);u.difference(r,["status"]).length===0?this.updateStatus():this.render()},updateStatus:function(){var e=["inqueue","processing","finished"],t={};u.each(e,function(e){t[e]=!1}),t[this.model.get("status")]=!0;var n=this.$("p.commandLine");u.each(t,function(e,t){n.toggleClass(t,e)})},render:function(){var e=u.extend({resultType:"",result:"",formattedWarnings:this.model.getFormattedWarnings()},this.model.toJSON());return this.$el.html(this.template(e)),this},remove:function(){$(this.el).hide()}}),b=a.View.extend({initialize:function(e){this.collection=e.collection,this.collection.on("add",this.addOne,this),this.collection.on("reset",this.addAll,this),this.collection.on("all",this.render,this),this.collection.on("change",this.scrollDown,this),l.getEvents().on("commandScrollDown",this.scrollDown,this),l.getEvents().on("clearOldCommands",this.clearOldCommands,this)},addWarning:function(e){var t=new d({msg:e}),n=new c({error:t,rawStr:"Warning:"});this.collection.add(n)},clearOldCommands:function(){var e=[];this.collection.each(function(t){t.get("status")!=="inqueue"&&t.get("status")!=="processing"&&e.push(t)},this),u.each(e,function(e){e.destroy()},this),this.scrollDown()},scrollDown:function(){var e=$("#commandDisplay")[0],t=$("#terminal")[0],n=e.clientHeight>t.clientHeight;$(t).toggleClass("scrolling",n),n&&(t.scrollTop=t.scrollHeight)},addOne:function(e){var t=new y({model:e});this.$("#commandDisplay").append(t.render().el),this.scrollDown()},addAll:function(){this.collection.each(this.addOne)}});n.CommandPromptView=g,n.CommandLineHistoryView=b}),e.define("/src/js/util/zoomLevel.js",function(e,t,n,r,i,s,o){function f(){return!window.outerWidth||!window.innerWidth?(a&&(console.warn("Can't detect zoom level correctly :-/"),a=!1),1):window.outerWidth/window.innerWidth}var u=e("underscore"),a=!0,l=!0,c=function(e,t){var n=0;setInterval(function(){var r=f();if(r!==n){if(l){l=!1;return}n=r,e.apply(t,[r])}else l=!0},500)};n.setupZoomPoll=c,n.detectZoom=f}),e.define("/src/js/dialogs/sandbox.js",function(e,t,n,r,i,s,o){n.dialog=[{type:"ModalAlert",options:{markdowns:["## Welcome to LearnGitBranching!","","This application is designed to help beginners grasp ","the powerful concepts behind branching when working ","with git. We hope you enjoy this application and maybe ","even learn something!","","# Attention HN!!","","Unfortunately this was submitted before I finished all the help ","and tutorial sections, so forgive the scarcity. See the demo here:","","[http://pcottle.github.com/learnGitBranching/?demo](http://pcottle.github.com/learnGitBranching/?demo)"]}},{type:"ModalAlert",options:{markdowns:["## Git commands","","You have a large variety of git commands available in sandbox mode. These include",""," * commit"," * branch"," * checkout"," * cherry-pick"," * reset"," * revert"," * rebase"," * merge"]}},{type:"ModalAlert",options:{markdowns:["## Sharing is caring!","","Share trees with your friends via `export tree` and `import tree`","","Have a great lesson to share? Try building a level with `build level` or try out a friend's level with `import level`","","For now let's get you started on the `levels`..."]}}]}),e.define("/src/js/util/mock.js",function(e,t,n,r,i,s,o){n.mock=function(e){var t={},n=function(){};for(var r in e.prototype)t[r]=n;return t}}),e.define("/src/js/visuals/tree.js",function(e,t,n,r,i,s,o){var u=e("underscore"),a=e("backbone"),f=a.Model.extend({removeKeys:function(e){u.each(e,function(e){this.get(e)&&this.get(e).remove()},this)},animateAttrKeys:function(e,t,n,r){e=u.extend({},{include:["circle","arrow","rect","path","text"],exclude:[]},e||{});var i=this.getAttributes();u.each(e.include,function(e){i[e]=u.extend({},i[e],t)}),u.each(e.exclude,function(e){delete i[e]}),this.animateToAttr(i,n,r)}});n.VisBase=f}),e.define("/src/js/git/headless.js",function(e,t,n,r,i,s,o){var u=e("underscore"),a=e("backbone"),f=e("q"),l=e("../git").GitEngine,c=e("../visuals/animation/animationFactory").AnimationFactory,h=e("../visuals").GitVisuals,p=e("../git/treeCompare").TreeCompare,d=e("../util/eventBaton").EventBaton,v=e("../models/collections"),m=v.CommitCollection,g=v.BranchCollection,y=e("../models/commandModel").Command,b=e("../util/mock").mock,w=e("../util"),E=function(){this.init()};E.prototype.init=function(){this.commitCollection=new m,this.branchCollection=new g,this.treeCompare=new p;var e=b(c),t=b(h);this.gitEngine=new l({collection:this.commitCollection,branches:this.branchCollection,gitVisuals:t,animationFactory:e,eventBaton:new d}),this.gitEngine.init()},E.prototype.sendCommand=function(e){w.splitTextCommand(e,function(e){var t=new y({rawStr:e});this.gitEngine.dispatch(t,f.defer())},this)},n.HeadlessGit=E}),e.define("/src/js/app/index.js",function(e,t,n,r,i,s,o){function y(){var t=e("../models/collections"),n=e("../views/commandViews");this.commandCollection=new t.CommandCollection,this.commandBuffer=new t.CommandBuffer({collection:this.commandCollection}),this.commandPromptView=new n.CommandPromptView({el:$("#commandLineBar")}),this.commandLineHistoryView=new n.CommandLineHistoryView({el:$("#commandLineHistory"),collection:this.commandCollection})}var u=e("underscore"),a=e("backbone"),f=e("../util/constants"),l=e("../util"),c=u.clone(a.Events),h,p,d,v,m,g=function(){var t=e("../level/sandbox").Sandbox,n=e("../level").Level,r=e("../util/eventBaton").EventBaton,i=e("../level/arbiter").LevelArbiter,s=e("../views/levelDropdownView").LevelDropdownView;d=new r,h=new y,p=new t,v=new i,m=new s({wait:!0});var o=function(){$("#commandTextField").focus()};o(),$(window).focus(function(e){d.trigger("windowFocus",e)}),$(document).click(function(e){d.trigger("documentClick",e)}),$(document).bind("keydown",function(e){d.trigger("docKeydown",e)}),$(document).bind("keyup",function(e){d.trigger("docKeyup",e)}),$(window).on("resize",function(e){c.trigger("resize",e)}),d.stealBaton("docKeydown",function(){}),d.stealBaton("docKeyup",function(){}),d.stealBaton("windowFocus",o),d.stealBaton("documentClick",o);var a=function(e){return function(){var t=[e];u.each(arguments,function(e){t.push(e)}),d.trigger.apply(d,t)}};$("#commandTextField").on("keydown",a("keydown")),$("#commandTextField").on("keyup",a("keyup")),$(window).trigger("resize"),/\?demo/.test(window.location.href)?p.mainVis.customEvents.on("gitEngineReady",function(){d.trigger("commandSubmitted",["git commit; git checkout -b bugFix C1; git commit; git merge master; git checkout master; git commit; git rebase bugFix;","delay 1000; reset;","level rebase1 --noFinishDialog --noStartCommand --noIntroDialog;","delay 2000; show goal; delay 1000; hide goal;","git checkout bugFix; git rebase master; git checkout side; git rebase bugFix;","git checkout another; git rebase side; git rebase another master;","help; levels"].join(""))}):/\?NODEMO/.test(window.location.href)||p.mainVis.customEvents.on("gitEngineReady",function(){d.trigger("commandSubmitted",["git help;","delay 1000;","help;","levels"].join(""))});if(/command=/.test(window.location.href)){var f=window.location.href.split("command=")[1].split("&")[0],l=unescape(f);p.mainVis.customEvents.on("gitEngineReady",function(){d.trigger("commandSubmitted",l)})}(/(iPhone|iPod|iPad).*AppleWebKit/i.test(navigator.userAgent)||/android/i.test(navigator.userAgent))&&p.mainVis.customEvents.on("gitEngineReady",function(){d.trigger("commandSubmitted","mobile alert")})};e("../util").isBrowser()&&$(document).ready(g),n.getEvents=function(){return c},n.getSandbox=function(){return p},n.getEventBaton=function(){return d},n.getCommandUI=function(){return h},n.getLevelArbiter=function(){return v},n.getLevelDropdown=function(){return m},n.init=g}),e("/src/js/app/index.js"),e.define("/src/js/dialogs/levelBuilder.js",function(e,t,n,r,i,s,o){n.dialog=[{type:"ModalAlert",options:{markdowns:["## Welcome to the level builder!","","Here are the main steps:",""," * Set up the initial environment with git commands"," * Define the starting tree with ```define start```"," * Enter the series of git commands that compose the (optimal) solution"," * Define the goal tree with ```define goal```. Defining the goal also defines the solution"," * Optionally define a hint with ```define hint```"," * Edit the name with ```define name```"," * Optionally define a nice start dialog with ```edit dialog```"," * Enter the command ```finish``` to output your level JSON!"]}}]}),e("/src/js/dialogs/levelBuilder.js"),e.define("/src/js/dialogs/sandbox.js",function(e,t,n,r,i,s,o){n.dialog=[{type:"ModalAlert",options:{markdowns:["## Welcome to LearnGitBranching!","","This application is designed to help beginners grasp ","the powerful concepts behind branching when working ","with git. We hope you enjoy this application and maybe ","even learn something!","","# Attention HN!!","","Unfortunately this was submitted before I finished all the help ","and tutorial sections, so forgive the scarcity. See the demo here:","","[http://pcottle.github.com/learnGitBranching/?demo](http://pcottle.github.com/learnGitBranching/?demo)"]}},{type:"ModalAlert",options:{markdowns:["## Git commands","","You have a large variety of git commands available in sandbox mode. These include",""," * commit"," * branch"," * checkout"," * cherry-pick"," * reset"," * revert"," * rebase"," * merge"]}},{type:"ModalAlert",options:{markdowns:["## Sharing is caring!","","Share trees with your friends via `export tree` and `import tree`","","Have a great lesson to share? Try building a level with `build level` or try out a friend's level with `import level`","","For now let's get you started on the `levels`..."]}}]}),e("/src/js/dialogs/sandbox.js"),e.define("/src/js/git/commands.js",function(e,t,n,r,i,s,o){function g(e,t){this.method=e,this.rawOptions=t,this.supportedMap=this.getMasterOptionMap()[e];if(this.supportedMap===undefined)throw new Error("No option map for "+e);this.generalArgs=[],this.explodeAndSet()}var u=e("underscore"),a=e("../util/errors"),f=a.CommandProcessError,l=a.GitError,c=a.Warning,h=a.CommandResult,p={"git commit":/^(gc|git ci)($|\s)/,"git add":/^ga($|\s)/,"git checkout":/^(go|git co)($|\s)/,"git rebase":/^gr($|\s)/,"git branch":/^(gb|git br)($|\s)/,"git status":/^(gst|gs|git st)($|\s)/,"git help":/^git$/},d=[[/^git help($|\s)/,function(){var e=["Git Version PCOTTLE.1.0","
","Usage:",u.escape(" git []"),"
","Supported commands:","
"],t=g.prototype.getMasterOptionMap();u.each(t,function(t,n){e.push("git "+n),u.each(t,function(t,n){e.push(" "+n)},this)},this);var n=e.join("\n");throw n=n.replace(/\t/g," "),new h({msg:n})}]],v={"git commit":/^git commit($|\s)/,"git add":/^git add($|\s)/,"git checkout":/^git checkout($|\s)/,"git rebase":/^git rebase($|\s)/,"git reset":/^git reset($|\s)/,"git branch":/^git branch($|\s)/,"git revert":/^git revert($|\s)/,"git log":/^git log($|\s)/,"git merge":/^git merge($|\s)/,"git show":/^git show($|\s)/,"git status":/^git status($|\s)/,"git cherry-pick":/^git cherry-pick($|\s)/},m=function(e){var t,n;u.each(v,function(r,i){r.exec(e)&&(n=e.slice(i.length+1),t=i.slice("git ".length))});if(!t)return!1;var r=new g(t,n);return{toSet:{generalArgs:r.generalArgs,supportedMap:r.supportedMap,method:t,options:n,eventName:"processGitCommand"}}};g.prototype.getMasterOptionMap=function(){return{commit:{"--amend":!1,"-a":!1,"-am":!1,"-m":!1},status:{},log:{},add:{},"cherry-pick":{},branch:{"-d":!1,"-D":!1,"-f":!1,"--contains":!1},checkout:{"-b":!1,"-B":!1,"-":!1},reset:{"--hard":!1,"--soft":!1},merge:{},rebase:{"-i":!1},revert:{},show:{}}},g.prototype.explodeAndSet=function(){var e=this.rawOptions.match(/('.*?'|".*?"|\S+)/g)||[];for(var t=0;t9&&(e=e.slice(0,9),this.command.addWarning("Sorry, we need to keep branch names short for the visuals. Your branch name was truncated to 9 characters, resulting in "+e)),e},m.prototype.makeBranch=function(e,t){e=this.validateBranchName(e);if(this.refs[e])throw new d({msg:"that branch id either matches a commit hash or already exists!"});var n=new y({target:t,id:e});return this.branchCollection.add(n),this.refs[n.get("id")]=n,n},m.prototype.getHead=function(){return u.clone(this.HEAD)},m.prototype.getBranches=function(){var e=[];return this.branchCollection.each(function(t){e.push({id:t.get("id"),selected:this.HEAD.get("target")===t,target:t.get("target"),obj:t})},this),e},m.prototype.printBranchesWithout=function(e){var t=this.getUpstreamBranchSet(),n=this.getCommitFromRef(e).get("id"),r=[];u.each(t[n],function(e){e.selected=this.HEAD.get("target").get("id")==e.id,r.push(e)},this),this.printBranches(r)},m.prototype.printBranches=function(e){var t="";throw u.each(e,function(e){t+=(e.selected?"* ":"")+e.id+"\n"}),new v({msg:t})},m.prototype.makeCommit=function(e,t,n){if(!t){t=this.uniqueId("C");while(this.refs[t])t=this.uniqueId("C")}var r=new b(u.extend({parents:e,id:t,gitVisuals:this.gitVisuals},n||{}));return this.refs[r.get("id")]=r,this.commitCollection.add(r),r},m.prototype.acceptNoGeneralArgs=function(){if(this.generalArgs.length)throw new d({msg:"That command accepts no general arguments"})},m.prototype.validateArgBounds=function(e,t,n,r){var i=r===undefined?"git "+this.command.get("method"):this.command.get("method")+" "+r+" ";i="with "+i;if(e.lengthn)throw new d({msg:"I expect at most "+String(n)+" argument(s) "+i})},m.prototype.oneArgImpliedHead=function(e,t){this.validateArgBounds(e,0,1,t),e.length===0&&e.push("HEAD")},m.prototype.twoArgsImpliedHead=function(e,t){this.validateArgBounds(e,1,2,t),e.length==1&&e.push("HEAD")},m.prototype.revertStarter=function(){this.validateArgBounds(this.generalArgs,1,NaN);var e=this.revert(this.generalArgs);e&&this.animationFactory.rebaseAnimation(this.animationQueue,e,this,this.gitVisuals)},m.prototype.revert=function(e){var t=[];u.each(e,function(e){t.push(this.getCommitFromRef(e))},this);var n={};n.destinationBranch=this.resolveID(t[0]),n.toRebaseArray=t.slice(0),n.rebaseSteps=[];var r=this.gitVisuals.genSnapshot(),i,s=this.getCommitFromRef("HEAD");return u.each(t,function(e){var t=this.rebaseAltID(e.get("id")),o=this.makeCommit([s],t,{commitMessage:"Reverting "+this.resolveName(e)+': "'+e.get("commitMessage")+'"'});s=o,i=this.gitVisuals.genSnapshot(),n.rebaseSteps.push({oldCommit:e,newCommit:o,beforeSnapshot:r,afterSnapshot:i}),r=i},this),this.setTargetLocation("HEAD",s),n},m.prototype.resetStarter=function(){if(this.commandOptions["--soft"])throw new d({msg:"You can't use --soft because there is no concept of stashing changes or staging files, so you will lose your progress. Try using interactive rebasing (or just rebasing) to move commits."});this.commandOptions["--hard"]&&(this.command.addWarning("Nice! You are using --hard. The default behavior is a hard reset in this demo, so don't worry about specifying the option explicity"),this.generalArgs=this.generalArgs.concat(this.commandOptions["--hard"])),this.validateArgBounds(this.generalArgs,1,1);if(this.getDetachedHead())throw new d({msg:"Cant reset in detached head! Use checkout if you want to move"});this.reset(this.generalArgs[0])},m.prototype.reset=function(e){this.setTargetLocation("HEAD",this.getCommitFromRef(e))},m.prototype.cherrypickStarter=function(){this.validateArgBounds(this.generalArgs,1,1);var e=this.cherrypick(this.generalArgs[0]);this.animationFactory.genCommitBirthAnimation(this.animationQueue,e,this.gitVisuals)},m.prototype.cherrypick=function(e){var t=this.getCommitFromRef(e),n=this.getUpstreamSet("HEAD");if(n[t.get("id")])throw new d({msg:"We already have that commit in our changes history! You can't cherry-pick it if it shows up in git log."});var r=this.rebaseAltID(t.get("id")),i=this.makeCommit([this.getCommitFromRef("HEAD")],r);return this.setTargetLocation(this.HEAD,i),i},m.prototype.commitStarter=function(){this.acceptNoGeneralArgs();if(this.commandOptions["-am"]&&(this.commandOptions["-a"]||this.commandOptions["-m"]))throw new d({msg:"You can't have -am with another -m or -a!"});var e=null,t=null;this.commandOptions["-a"]&&this.command.addWarning("No need to add files in this demo"),this.commandOptions["-am"]&&(t=this.commandOptions["-am"],this.validateArgBounds(t,1,1,"-am"),this.command.addWarning("Don't worry about adding files in this demo. I'll take down your commit message anyways, but you can commit without a message in this demo as well"),e=t[0]),this.commandOptions["-m"]&&(t=this.commandOptions["-m"],this.validateArgBounds(t,1,1,"-m"),e=t[0]);var n=this.commit();e&&(e=e.replace(/"/g,'"').replace(/^"/g,"").replace(/"$/g,""),n.set("commitMessage",e)),this.animationFactory.genCommitBirthAnimation(this.animationQueue,n,this.gitVisuals)},m.prototype.commit=function(){var e=this.getCommitFromRef(this.HEAD),t=null;this.commandOptions["--amend"]&&(e=this.resolveID("HEAD~1"),t=this.rebaseAltID(this.getCommitFromRef("HEAD").get("id")));var n=this.makeCommit([e],t);return this.getDetachedHead()&&this.command.addWarning("Warning!! Detached HEAD state"),this.setTargetLocation(this.HEAD,n),n},m.prototype.resolveName=function(e){var t=this.resolveID(e);return t.get("type")=="commit"?"commit "+t.get("id"):t.get("type")=="branch"?'branch "'+t.get("id")+'"':this.resolveName(t.get("target"))},m.prototype.resolveID=function(e){if(e===null||e===undefined)throw new Error("Dont call this with null / undefined");return typeof e!="string"?e:this.resolveStringRef(e)},m.prototype.resolveStringRef=function(e){if(this.refs[e])return this.refs[e];if(this.refs[e.toUpperCase()])return this.refs[e.toUpperCase()];var t=[[/^([a-zA-Z0-9]+)~(\d+)\s*$/,function(e){return parseInt(e[2],10)}],[/^([a-zA-Z0-9]+)(\^+)\s*$/,function(e){return e[2].length}]],n=null,r=null;u.each(t,function(t){var i=t[0],s=t[1];if(i.test(e)){var o=i.exec(e);r=s(o),n=o[1]}},this);if(!n)throw new d({msg:"unknown ref "+e});if(!this.refs[n])throw new d({msg:"the ref "+n+" does not exist."});var i=this.getCommitFromRef(n);return this.numBackFrom(i,r)},m.prototype.getCommitFromRef=function(e){var t=this.resolveID(e);while(t.get("type")!=="commit")t=t.get("target");return t},m.prototype.getType=function(e){return this.resolveID(e).get("type")},m.prototype.setTargetLocation=function(e,t){if(this.getType(e)=="commit")return;e=this.getOneBeforeCommit(e),e.set("target",t)},m.prototype.getUpstreamBranchSet=function(){var e={},t=function(e,t){var n=!1;return u.each(e,function(e){e.id==t&&(n=!0)}),n},n=function(e){var t=[],n=[e];while(n.length){var r=n.pop();t.push(r.get("id")),r.get("parents")&&r.get("parents").length&&(n=n.concat(r.get("parents")))}return t};return this.branchCollection.each(function(r){var i=n(r.get("target"));u.each(i,function(n){e[n]=e[n]||[],t(e[n],r.get("id"))||e[n].push({obj:r,id:r.get("id")})})}),e},m.prototype.getUpstreamHeadSet=function(){var e=this.getUpstreamSet("HEAD"),t=this.getCommitFromRef("HEAD").get("id");return e[t]=!0,e},m.prototype.getOneBeforeCommit=function(e){var t=this.resolveID(e);return t===this.HEAD&&!this.getDetachedHead()&&(t=t.get("target")),t},m.prototype.numBackFrom=function(e,t){if(t===0)return e;var n=u.bind(function(e){e.sort(this.dateSortFunc)},this),r=[].concat(e.get("parents")||[]);n(r),t--;while(r.length&&t!==0){var i=r.shift(0),s=i.get("parents");s&&s.length&&(r=r.concat(s)),n(r),t--}if(t!==0||r.length===0)throw new d({msg:"Sorry, I can't go that many commits back"});return r.shift(0)},m.prototype.scrapeBaseID=function(e){var t=/^C(\d+)/.exec(e);if(!t)throw new Error("regex failed on "+e);return"C"+t[1]},m.prototype.rebaseAltID=function(e){var t=[[/^C(\d+)[']{0,2}$/,function(e){return e[0]+"'"}],[/^C(\d+)[']{3}$/,function(e){return e[0].slice(0,-3)+"'^4"}],[/^C(\d+)['][\^](\d+)$/,function(e){return"C"+String(e[1])+"'^"+String(Number(e[2])+1)}]];for(var n=0;n",this.get("commitMessage"),"
","Commit: "+this.get("id")].join("\n")+"\n"},getShowEntry:function(){return[this.getLogEntry(),"diff --git a/bigGameResults.html b/bigGameResults.html","--- bigGameResults.html","+++ bigGameResults.html","@@ 13,27 @@ Winner, Score","- Stanfurd, 14-7","+ Cal, 21-14"].join("\n")+"\n"},validateAtInit:function(){if(!this.get("id"))throw new Error("Need ID!!");this.get("createTime")||this.set("createTime",(new Date).toString()),this.get("commitMessage")||this.set("commitMessage","Quick Commit. Go Bears!"),this.set("children",[]);if(!this.get("rootCommit"))if(!this.get("parents")||!this.get("parents").length)throw new Error("needs parents")},addNodeToVisuals:function(){var e=this.get("gitVisuals").addNode(this.get("id"),this);this.set("visNode",e)},addEdgeToVisuals:function(e){this.get("gitVisuals").addEdge(this.get("id"),e.get("id"))},isMainParent:function(e){var t=this.get("parents").indexOf(e);return t===0},initialize:function(e){this.validateAtInit(),this.addNodeToVisuals(),u.each(this.get("parents"),function(e){e.get("children").push(this),this.addEdgeToVisuals(e)},this)}});n.GitEngine=m,n.Commit=b,n.Branch=y,n.Ref=g}),e("/src/js/git/index.js"),e.define("/src/js/git/treeCompare.js",function(e,t,n,r,i,s,o){function a(){}var u=e("underscore");a.prototype.compareAllBranchesWithinTreesAndHEAD=function(e,t){return e=this.convertTreeSafe(e),t=this.convertTreeSafe(t),e.HEAD.target==t.HEAD.target&&this.compareAllBranchesWithinTrees(e,t)},a.prototype.compareAllBranchesWithinTrees=function(e,t){e=this.convertTreeSafe(e),t=this.convertTreeSafe(t);var n=u.extend({},e.branches,t.branches),r=!0;return u.uniq(n,function(n,i){r=r&&this.compareBranchWithinTrees(e,t,i)},this),r},a.prototype.compareBranchesWithinTrees=function(e,t,n){var r=!0;return u.each(n,function(n){r=r&&this.compareBranchWithinTrees(e,t,n)},this),r},a.prototype.compareBranchWithinTrees=function(e,t,n){e=this.convertTreeSafe(e),t=this.convertTreeSafe(t),this.reduceTreeFields([e,t]);var r=this.getRecurseCompare(e,t),i=e.branches[n],s=t.branches[n];return u.isEqual(i,s)&&r(e.commits[i.target],t.commits[s.target])},a.prototype.compareAllBranchesWithinTreesHashAgnostic=function(e,t){e=this.convertTreeSafe(e),t=this.convertTreeSafe(t),this.reduceTreeFields([e,t]);var n=u.bind(function(e,t){return!e||!t?!1:(e.target=this.getBaseRef(e.target),t.target=this.getBaseRef(t.target),u.isEqual(e,t))},this),r=this.getRecurseCompareHashAgnostic(e,t),i=u.extend({},e.branches,t.branches),s=!0;return u.each(i,function(i,o){branchA=e.branches[o],branchB=t.branches[o],s=s&&n(branchA,branchB)&&r(e.commits[branchA.target],t.commits[branchB.target])},this),s},a.prototype.getBaseRef=function(e){var t=/^C(\d+)/,n=t.exec(e);if(!n)throw new Error("no regex matchy for "+e);return"C"+n[1]},a.prototype.getRecurseCompareHashAgnostic=function(e,t){var n=u.bind(function(e){return u.extend({},e,{id:this.getBaseRef(e.id)})},this),r=function(e,t){return u.isEqual(n(e),n(t))};return this.getRecurseCompare(e,t,{isEqual:r})},a.prototype.getRecurseCompare=function(e,t,n){n=n||{};var r=function(i,s){var o=n.isEqual?n.isEqual(i,s):u.isEqual(i,s);if(!o)return!1;var a=u.unique(i.parents.concat(s.parents));return u.each(a,function(n,i){var u=s.parents[i],a=e.commits[n],f=t.commits[u];o=o&&r(a,f)},this),o};return r},a.prototype.convertTreeSafe=function(e){return typeof e=="string"?JSON.parse(unescape(e)):e},a.prototype.reduceTreeFields=function(e){var t=["parents","id","rootCommit"],n=["children","parents"],r=["target","id"],i=function(e,t,n,r){var i=e[t];u.each(i,function(i,s){var o={};u.each(n,function(e){i[e]!==undefined&&(o[e]=i[e])}),u.each(r,function(e){i[e]&&(i[e].sort(),o[e]=i[e])}),e[t][s]=o})};u.each(e,function(e){i(e,"commits",t,n),i(e,"branches",r),e.HEAD={target:e.HEAD.target,id:e.HEAD.id}})},a.prototype.compareTrees=function(e,t){return e=this.convertTreeSafe(e),t=this.convertTreeSafe(t),this.reduceTreeFields([e,t]),u.isEqual(e,t)},n.TreeCompare=a}),e("/src/js/git/treeCompare.js"),e.define("/src/js/level/arbiter.js",function(e,t,n,r,i,s,o){function h(){this.levelMap={},this.levelSequences=f,this.sequences=[],this.init();var e;try{e=JSON.parse(localStorage.getItem("solvedMap")||"{}")}catch(t){console.warn("local storage failed",t)}this.solvedMap=e||{},c.getEvents().on("levelSolved",this.levelSolved,this)}var u=e("underscore"),a=e("backbone"),f=e("../levels").levelSequences,l=e("../levels").sequenceInfo,c=e("../app");h.prototype.init=function(){var e;u.each(this.levelSequences,function(e,t){this.sequences.push(t);if(!e||!e.length)throw new Error("no empty sequences allowed");u.each(e,function(e,n){this.validateLevel(e);var r=t+String(n+1),i=u.extend({},e,{index:n,id:r,sequenceName:t});this.levelMap[r]=i,this.levelSequences[t][n]=i},this)},this)},h.prototype.isLevelSolved=function(e){if(!this.levelMap[e])throw new Error("that level doesnt exist!");return Boolean(this.solvedMap[e])},h.prototype.levelSolved=function(e){if(!e)return;this.solvedMap[e]=!0,this.syncToStorage()},h.prototype.resetSolvedMap=function(){this.solvedMap={},this.syncToStorage(),c.getEvents().trigger("levelSolved")},h.prototype.syncToStorage=function(){try{localStorage.setItem("solvedMap",JSON.stringify(this.solvedMap))}catch(e){console.warn("local storage fialed on set",e)}},h.prototype.validateLevel=function(e){e=e||{};var t=["name","goalTreeString","solutionCommand"],n=["hint","disabledMap","startTree"];u.each(t,function(t){if(e[t]===undefined)throw console.log(e),new Error("I need this field for a level: "+t)})},h.prototype.getSequenceToLevels=function(){return this.levelSequences},h.prototype.getSequences=function(){return u.keys(this.levelSequences)},h.prototype.getLevelsInSequence=function(e){if(!this.levelSequences[e])throw new Error("that sequecne name "+e+"does not exist");return this.levelSequences[e]},h.prototype.getSequenceInfo=function(e){return l[e]},h.prototype.getLevel=function(e){return this.levelMap[e]},h.prototype.getNextLevel=function(e){if(!this.levelMap[e])return console.warn("that level doesnt exist!!!"),null;var t=this.levelMap[e],n=t.sequenceName,r=this.levelSequences[n],i=t.index+1;if(i"+e+this.get("warnings").join(""+e)+"
"},parseOrCatch:function(){this.expandShortcuts(this.get("rawStr"));try{this.processInstants()}catch(e){f.filterError(e),this.set("error",e);return}if(this.parseAll())return;this.set("error",new p({msg:'The command "'+this.get("rawStr")+"\" isn't supported, sorry!"}))},errorChanged:function(){var e=this.get("error");e instanceof p||e instanceof d?this.set("status","error"):e instanceof m?this.set("status","finished"):e instanceof v&&this.set("status","warning"),this.formatError()},formatError:function(){this.set("result",this.get("error").toResult())},expandShortcuts:function(e){e=this.get("parseWaterfall").expandAllShortcuts(e),this.set("rawStr",e)},processInstants:function(){var e=this.get("rawStr");if(!e.length)throw new m({msg:""});this.get("parseWaterfall").processAllInstants(e)},parseAll:function(){var e=this.get("rawStr"),t=this.get("parseWaterfall").parseAll(e);return t?(u.each(t.toSet,function(e,t){this.set(t,e)},this),!0):!1}}),y=a.Model.extend({defaults:{text:""}});n.CommandEntry=y,n.Command=g}),e("/src/js/models/commandModel.js"),e.define("/src/js/util/constants.js",function(e,t,n,r,i,s,o){var u={betweenCommandsDelay:400},a={isAnimating:!1},f={minZoom:.55,maxZoom:1.25,minWidth:600,minHeight:600},l={arrowHeadSize:8,nodeRadius:17,curveControlPointOffset:50,defaultEasing:"easeInOut",defaultAnimationTime:400,rectFill:"hsb(0.8816909813322127,0.7,1)",headRectFill:"#2831FF",rectStroke:"#FFF",rectStrokeWidth:"3",multiBranchY:20,upstreamHeadOpacity:.5,upstreamNoneOpacity:.2,edgeUpstreamHeadOpacity:.4,edgeUpstreamNoneOpacity:.15,visBranchStrokeWidth:2,visBranchStrokeColorNone:"#333",defaultNodeFill:"hsba(0.5,0.8,0.7,1)",defaultNodeStrokeWidth:2,defaultNodeStroke:"#FFF",orphanNodeFill:"hsb(0.5,0.8,0.7)"};n.GLOBAL=a,n.TIME=u,n.GRAPHICS=l,n.VIEWPORT=f}),e("/src/js/util/constants.js"),e.define("/src/js/util/debug.js",function(e,t,n,r,i,s,o){var u=e("underscore"),a={Tree:e("../visuals/tree"),Visuals:e("../visuals"),Git:e("../git"),CommandModel:e("../models/commandModel"),Levels:e("../git/treeCompare"),Constants:e("../util/constants"),Collections:e("../models/collections"),Async:e("../visuals/animation"),AnimationFactory:e("../visuals/animation/animationFactory"),Main:e("../app"),HeadLess:e("../git/headless"),Q:{Q:e("q")},RebaseView:e("../views/rebaseView"),Views:e("../views"),MultiView:e("../views/multiView"),ZoomLevel:e("../util/zoomLevel"),VisBranch:e("../visuals/visBranch"),Level:e("../level"),Sandbox:e("../level/sandbox"),GitDemonstrationView:e("../views/gitDemonstrationView"),Markdown:e("markdown"),LevelDropdownView:e("../views/levelDropdownView"),BuilderViews:e("../views/builderViews")};u.each(a,function(e){u.extend(window,e)}),$(document).ready(function(){window.events=a.Main.getEvents(),window.eventBaton=a.Main.getEventBaton(),window.sandbox=a.Main.getSandbox(),window.modules=a,window.levelDropdown=a.Main.getLevelDropdown()})}),e("/src/js/util/debug.js"),e.define("/src/js/util/errors.js",function(e,t,n,r,i,s,o){var u=e("underscore"),a=e("backbone"),f=a.Model.extend({defaults:{type:"MyError",msg:"Unknown Error"},toString:function(){return this.get("type")+": "+this.get("msg")},getMsg:function(){return this.get("msg")||"Unknown Error"},toResult:function(){return this.get("msg").length?""+this.get("msg").replace(/\n/g,"
")+"
":""}}),l=n.CommandProcessError=f.extend({defaults:{type:"Command Process Error"}}),c=n.CommandResult=f.extend({defaults:{type:"Command Result"}}),h=n.Warning=f.extend({defaults:{type:"Warning"}}),p=n.GitError=f.extend({defaults:{type:"Git Error"}}),d=function(e){if(e instanceof l||e instanceof p||e instanceof c||e instanceof h)return;throw e};n.filterError=d}),e("/src/js/util/errors.js"),e.define("/src/js/util/eventBaton.js",function(e,t,n,r,i,s,o){function a(){this.eventMap={}}var u=e("underscore");a.prototype.stealBaton=function(e,t,n){if(!e)throw new Error("need name");if(!t)throw new Error("need func!");var r=this.eventMap[e]||[];r.push({func:t,context:n}),this.eventMap[e]=r},a.prototype.sliceOffArgs=function(e,t){var n=[];for(var r=e;r0&&!e.length)return;t(e)})},n.genParseCommand=function(e,t){return function(n){var r,i;return u.each(e,function(e,t){var s=e.exec(n);s&&(r=t,i=s)}),r?{toSet:{eventName:t,method:r,regexResults:i}}:!1}}}),e("/src/js/util/index.js"),e.define("/src/js/util/keyboard.js",function(e,t,n,r,i,s,o){function c(e){this.events=e.events||u.clone(a.Events),this.aliasMap=e.aliasMap||{},e.wait||this.listen()}var u=e("underscore"),a=e("backbone"),f=e("../app"),l=function(e){var t={37:"left",38:"up",39:"right",40:"down",27:"esc",13:"enter"};return t[e]};c.prototype.listen=function(){if(this.listening)return;this.listening=!0,f.getEventBaton().stealBaton("docKeydown",this.keydown,this)},c.prototype.mute=function(){this.listening=!1,f.getEventBaton().releaseBaton("docKeydown",this.keydown,this)},c.prototype.keydown=function(e){var t=e.which||e.keyCode,n=l(t);if(n===undefined)return;this.fireEvent(n,e)},c.prototype.fireEvent=function(e,t){e=this.aliasMap[e]||e,this.events.trigger(e,t)},c.prototype.passEventBack=function(e){f.getEventBaton().passBatonBackSoft("docKeydown",this.keydown,this,[e])},n.KeyboardListener=c,n.mapKeycodeToKey=l}),e("/src/js/util/keyboard.js"),e.define("/src/js/util/mock.js",function(e,t,n,r,i,s,o){n.mock=function(e){var t={},n=function(){};for(var r in e.prototype)t[r]=n;return t}}),e("/src/js/util/mock.js"),e.define("/src/js/util/zoomLevel.js",function(e,t,n,r,i,s,o){function f(){return!window.outerWidth||!window.innerWidth?(a&&(console.warn("Can't detect zoom level correctly :-/"),a=!1),1):window.outerWidth/window.innerWidth}var u=e("underscore"),a=!0,l=!0,c=function(e,t){var n=0;setInterval(function(){var r=f();if(r!==n){if(l){l=!1;return}n=r,e.apply(t,[r])}else l=!0},500)};n.setupZoomPoll=c,n.detectZoom=f}),e("/src/js/util/zoomLevel.js"),e.define("/src/js/views/builderViews.js",function(e,t,n,r,i,s,o){var u=e("underscore"),a=e("q"),f=e("../util").isBrowser()?window.Backbone:e("backbone"),l=e("../util"),c=e("../util/keyboard").KeyboardListener,h=e("../views"),p=h.ModalTerminal,d=h.ContainedBase,v=d.extend({tagName:"div",className:"textGrabber box vertical",template:u.template($("#text-grabber").html()),initialize:function(e){e=e||{},this.JSON={helperText:e.helperText||"Enter some text"},this.container=e.container||new p({title:"Enter some text"}),this.render(),e.initialText&&this.setText(e.initialText),e.wait||this.show()},getText:function(){return this.$("textarea").val()},setText:function(e){this.$("textarea").val(e)}}),m=d.extend({tagName:"div",className:"markdownGrabber box horizontal",template:u.template($("#markdown-grabber-view").html()),events:{"keyup textarea":"keyup"},initialize:function(e){e=e||{},this.deferred=e.deferred||a.defer(),e.fromObj&&(e.fillerText=e.fromObj.options.markdowns.join("\n")),this.JSON={previewText:e.previewText||"Preview",fillerText:e.fillerText||"## Enter some markdown!\n\n\n"},this.container=e.container||new p({title:e.title||"Enter some markdown"}),this.render();if(!e.withoutButton){var t=a.defer();t.promise.then(u.bind(this.confirmed,this)).fail(u.bind(this.cancelled,this)).done();var n=new h.ConfirmCancelView({deferred:t,destination:this.getDestination()})}this.updatePreview(),e.wait||this.show()},confirmed:function(){this.die(),this.deferred.resolve(this.getRawText())},cancelled:function(){this.die(),this.deferred.resolve()},keyup:function(){this.throttledPreview||(this.throttledPreview=u.throttle(u.bind(this.updatePreview,this),500)),this.throttledPreview()},getRawText:function(){return this.$("textarea").val()},exportToArray:function(){return this.getRawText().split("\n")},getExportObj:function(){return{markdowns:this.exportToArray()}},updatePreview:function(){var t=this.getRawText(),n=e("markdown").markdown.toHTML(t);this.$("div.insidePreview").html(n)}}),g=d.extend({tagName:"div",className:"markdownPresenter box vertical",template:u.template($("#markdown-presenter").html()),initialize:function(e){e=e||{},this.deferred=e.deferred||a.defer(),this.JSON={previewText:e.previewText||"Here is something for you",fillerText:e.fillerText||"# Yay"},this.container=new p({title:"Check this out..."}),this.render();if(!e.noConfirmCancel){var t=new h.ConfirmCancelView({destination:this.getDestination()});t.deferred.promise.then(u.bind(function(){this.deferred.resolve(this.grabText())},this)).fail(u.bind(function(){this.deferred.reject()},this)).done(u.bind(this.die,this))}this.show()},grabText:function(){return this.$("textarea").val()}}),y=d.extend({tagName:"div",className:"demonstrationBuilder box vertical",template:u.template($("#demonstration-builder").html()),events:{"click div.testButton":"testView"},initialize:function(e){e=e||{},this.deferred=e.deferred||a.defer();if(e.fromObj){var t=e.fromObj.options;e=u.extend({},e,t,{beforeMarkdown:t.beforeMarkdowns.join("\n"),afterMarkdown:t.afterMarkdowns.join("\n")})}this.JSON={},this.container=new p({title:"Demonstration Builder"}),this.render(),this.beforeMarkdownView=new m({container:this,withoutButton:!0,fillerText:e.beforeMarkdown,previewText:"Before demonstration Markdown"}),this.beforeCommandView=new v({container:this,helperText:"The git command(s) to set up the demonstration view (before it is displayed)",initialText:e.beforeCommand||"git checkout -b bugFix"}),this.commandView=new v({container:this,helperText:"The git command(s) to demonstrate to the reader",initialText:e.command||"git commit"}),this.afterMarkdownView=new m({container:this,withoutButton:!0,fillerText:e.afterMarkdown,previewText:"After demonstration Markdown"});var n=a.defer(),r=new h.ConfirmCancelView({deferred:n,destination:this.getDestination()});n.promise.then(u.bind(this.confirmed,this)).fail(u.bind(this.cancelled,this)).done()},testView:function(){var t=e("../views/multiView").MultiView;new t({childViews:[{type:"GitDemonstrationView",options:this.getExportObj()}]})},getExportObj:function(){return{beforeMarkdowns:this.beforeMarkdownView.exportToArray(),afterMarkdowns:this.afterMarkdownView.exportToArray(),command:this.commandView.getText(),beforeCommand:this.beforeCommandView.getText()}},confirmed:function(){this.die(),this.deferred.resolve(this.getExportObj())},cancelled:function(){this.die(),this.deferred.resolve()},getInsideElement:function(){return this.$(".insideBuilder")[0]}}),b=d.extend({tagName:"div",className:"multiViewBuilder box vertical",template:u.template($("#multi-view-builder").html()),typeToConstructor:{ModalAlert:m,GitDemonstrationView:y},events:{"click div.deleteButton":"deleteOneView","click div.testButton":"testOneView","click div.editButton":"editOneView","click div.testEntireView":"testEntireView","click div.addView":"addView","click div.saveView":"saveView","click div.cancelView":"cancel"},initialize:function(e){e=e||{},this.deferred=e.deferred||a.defer(),this.multiViewJSON=e.multiViewJSON||{},this.JSON={views:this.getChildViews(),supportedViews:u.keys(this.typeToConstructor)},this.container=new p({title:"Build a MultiView!"}),this.render(),this.show()},saveView:function(){this.hide(),this.deferred.resolve(this.multiViewJSON)},cancel:function(){this.hide(),this.deferred.resolve()},addView:function(e){var t=e.srcElement,n=$(t).attr("data-type"),r=a.defer(),i=this.typeToConstructor[n],s=new i({deferred:r});r.promise.then(u.bind(function(){var e={type:n,options:s.getExportObj()};this.addChildViewObj(e)},this)).fail(function(){}).done()},testOneView:function(t){var n=t.srcElement,r=$(n).attr("data-index"),i=this.getChildViews()[r],s=e("../views/multiView").MultiView;new s({childViews:[i]})},testEntireView:function(){var t=e("../views/multiView").MultiView;new t({childViews:this.getChildViews()})},editOneView:function(e){var t=e.srcElement,n=$(t).attr("data-index"),r=$(t).attr("data-type"),i=a.defer(),s=new this.typeToConstructor[r]({deferred:i,fromObj:this.getChildViews()[n]});i.promise.then(u.bind(function(){var e={type:r,options:s.getExportObj()},t=this.getChildViews();t[n]=e,this.setChildViews(t)},this)).fail(function(){}).done()},deleteOneView:function(e){var t=e.srcElement,n=$(t).attr("data-index"),r=this.getChildViews(),i=r.slice(0,n).concat(r.slice(n+1));this.setChildViews(i),this.update()},addChildViewObj:function(e,t){var n=this.getChildViews();n.push(e),this.setChildViews(n),this.update()},setChildViews:function(e){this.multiViewJSON.childViews=e},getChildViews:function(){return this.multiViewJSON.childViews||[]},update:function(){this.JSON.views=this.getChildViews(),this.renderAgain()}});n.MarkdownGrabber=m,n.DemonstrationBuilder=y,n.TextGrabber=v,n.MultiViewBuilder=b,n.MarkdownPresenter=g}),e("/src/js/views/builderViews.js"),e.define("/src/js/views/commandViews.js",function(e,t,n,r,i,s,o){var u=e("underscore"),a=e("../util").isBrowser()?a=window.Backbone:a=e("backbone"),f=e("../models/collections").CommandEntryCollection,l=e("../app"),c=e("../models/commandModel").Command,h=e("../models/commandModel").CommandEntry,p=e("../util/errors"),d=p.Warning,v=e("../util"),m=e("../util/keyboard"),g=a.View.extend({initialize:function(e){l.getEvents().on("commandSubmittedPassive",this.addToCommandHistory,this),this.commands=new f,this.commands.fetch({success:u.bind(function(){var e=[];this.commands.each(function(t){e.push(t)}),e.reverse(),this.commands.reset(),u.each(e,function(e){this.commands.add(e)},this)},this)}),this.index=-1,this.commandParagraph=this.$("#prompt p.command")[0],this.commandCursor=this.$("#prompt span.cursor")[0],this.focus(),l.getEvents().on("rollupCommands",this.rollupCommands,this),l.getEventBaton().stealBaton("keydown",this.onKeyDown,this),l.getEventBaton().stealBaton("keyup",this.onKeyUp,this)},events:{"blur #commandTextField":"hideCursor","focus #commandTextField":"showCursor"},blur:function(){this.hideCursor()},focus:function(){this.$("#commandTextField").focus(),this.showCursor()},hideCursor:function(){this.toggleCursor(!1)},showCursor:function(){this.toggleCursor(!0)},toggleCursor:function(e){$(this.commandCursor).toggleClass("shown",e)},onKeyDown:function(e){var t=e.srcElement;this.updatePrompt(t)},onKeyUp:function(e){this.onKeyDown(e);var t={enter:u.bind(function(){this.submit()},this),up:u.bind(function(){this.commandSelectChange(1)},this),down:u.bind(function(){this.commandSelectChange(-1)},this)},n=m.mapKeycodeToKey(e.which||e.keyCode);t[n]!==undefined&&(e.preventDefault(),t[n](),this.onKeyDown(e))},badHtmlEncode:function(e){return e.replace(/&/g,"&").replace(/=this.commands.length||this.index<0){this.clear(),this.index=-1;return}var t=this.commands.toArray()[this.index].get("text");this.setTextField(t)},clearLocalStorage:function(){this.commands.each(function(e){a.sync("delete",e,function(){})},this)},setTextField:function(e){this.$("#commandTextField").val(e)},clear:function(){this.setTextField("")},submit:function(){var e=this.$("#commandTextField").val().replace("\n","");this.clear(),this.submitCommand(e),this.index=-1},rollupCommands:function(e){var t=this.commands.toArray().slice(1,Number(e)+1);t.reverse();var n="";u.each(t,function(e){n+=e.get("text")+";"},this);var r=new h({text:n});this.commands.unshift(r),a.sync("create",r,function(){})},addToCommandHistory:function(e){var t=e.length&&this.index===-1||e.length&&this.index!==-1&&this.commands.toArray()[this.index].get("text")!==e;if(!t)return;var n=new h({text:e});this.commands.unshift(n),a.sync("create",n,function(){}),this.commands.length>100&&this.clearLocalStorage()},submitCommand:function(e){l.getEventBaton().trigger("commandSubmitted",e)}}),y=a.View.extend({tagName:"div",model:c,template:u.template($("#command-template").html()),events:{click:"clicked"},clicked:function(e){},initialize:function(){this.model.bind("change",this.wasChanged,this),this.model.bind("destroy",this.remove,this)},wasChanged:function(e,t){var n=t.changes,r=u.keys(n);u.difference(r,["status"]).length===0?this.updateStatus():this.render()},updateStatus:function(){var e=["inqueue","processing","finished"],t={};u.each(e,function(e){t[e]=!1}),t[this.model.get("status")]=!0;var n=this.$("p.commandLine");u.each(t,function(e,t){n.toggleClass(t,e)})},render:function(){var e=u.extend({resultType:"",result:"",formattedWarnings:this.model.getFormattedWarnings()},this.model.toJSON());return this.$el.html(this.template(e)),this},remove:function(){$(this.el).hide()}}),b=a.View.extend({initialize:function(e){this.collection=e.collection,this.collection.on("add",this.addOne,this),this.collection.on("reset",this.addAll,this),this.collection.on("all",this.render,this),this.collection.on("change",this.scrollDown,this),l.getEvents().on("commandScrollDown",this.scrollDown,this),l.getEvents().on("clearOldCommands",this.clearOldCommands,this)},addWarning:function(e){var t=new d({msg:e}),n=new c({error:t,rawStr:"Warning:"});this.collection.add(n)},clearOldCommands:function(){var e=[];this.collection.each(function(t){t.get("status")!=="inqueue"&&t.get("status")!=="processing"&&e.push(t)},this),u.each(e,function(e){e.destroy()},this),this.scrollDown()},scrollDown:function(){var e=$("#commandDisplay")[0],t=$("#terminal")[0],n=e.clientHeight>t.clientHeight;$(t).toggleClass("scrolling",n),n&&(t.scrollTop=t.scrollHeight)},addOne:function(e){var t=new y({model:e});this.$("#commandDisplay").append(t.render().el),this.scrollDown()},addAll:function(){this.collection.each(this.addOne)}});n.CommandPromptView=g,n.CommandLineHistoryView=b}),e("/src/js/views/commandViews.js"),e.define("/src/js/views/gitDemonstrationView.js",function(e,t,n,r,i,s,o){var u=e("underscore"),a=e("q"),f=e("../util").isBrowser()?window.Backbone:e("backbone"),l=e("../util"),c=e("../util/keyboard").KeyboardListener,h=e("../models/commandModel").Command,p=e("../views").ModalTerminal,d=e("../views").ContainedBase,v=e("../visuals/visualization").Visualization,m=d.extend({tagName:"div",className:"gitDemonstrationView box horizontal",template:u.template($("#git-demonstration-view").html()),events:{"click div.command > p.uiButton":"positive"},initialize:function(t){t=t||{},this.options=t,this.JSON=u.extend({beforeMarkdowns:["## Git Commits","","Awesome!"],command:"git commit",afterMarkdowns:["Now you have seen it in action","","Go ahead and try the level!"]},t);var n=function(t){return e("markdown").markdown.toHTML(t.join("\n"))};this.JSON.beforeHTML=n(this.JSON.beforeMarkdowns),this.JSON.afterHTML=n(this.JSON.afterMarkdowns),this.container=new p({title:t.title||"Git Demonstration"}),this.render(),this.checkScroll(),this.navEvents=u.clone(f.Events),this.navEvents.on("positive",this.positive,this),this.navEvents.on("negative",this.negative,this),this.keyboardListener=new c({events:this.navEvents,aliasMap:{enter:"positive",right:"positive",left:"negative"},wait:!0}),this.visFinished=!1,this.initVis(),t.wait||this.show()},receiveMetaNav:function(e,t){var n=this;e.navEvents.on("positive",this.positive,this),this.metaContainerView=t},checkScroll:function(){var e=this.$("div.demonstrationText").children(),t=u.map(e,function(e){return e.clientHeight}),n=u.reduce(t,function(e,t){return e+t});nc.VIEWPORT.minWidth&&e.h>c.VIEWPORT.minHeight&&this.finish()}}),L=C.extend({initialize:function(e){if(!e||!e.level)throw new Error("need level");this.eventBatonName="zoomChange",this.markdowns=["## That zoom level of "+e.level+" is not supported :-/","Please zoom back to a supported zoom level with Ctrl + and Ctrl -","","(and of course, pull requests to fix this are appreciated :D)"],L.__super__.initialize.apply(this,[e])},batonFired:function(e){e<=c.VIEWPORT.maxZoom&&e>=c.VIEWPORT.minZoom&&this.finish()}}),A=d.extend({tagName:"div",className:"levelToolbarHolder",template:u.template($("#level-toolbar-template").html()),initialize:function(e){e=e||{},this.JSON={name:e.name||"Some level! (unknown name)"},this.beforeDestination=$($("#commandLineHistory div.toolbar")[0]),this.render(),e.wait||s.nextTick(u.bind(this.show,this))},getAnimationTime:function(){return 700},render:function(){var e=this.template(this.JSON);this.$el.html(e),this.beforeDestination.after(this.el)},die:function(){this.hide(),setTimeout(u.bind(function(){this.tearDown()},this),this.getAnimationTime())},hide:function(){this.$("div.toolbar").toggleClass("hidden",!0)},show:function(){this.$("div.toolbar").toggleClass("hidden",!1)}}),O=d.extend({tagName:"div",className:"canvasTerminalHolder box flex1",template:u.template($("#terminal-window-bare-template").html()),events:{"click div.wrapper":"onClick"},initialize:function(e){e=e||{},this.destination=$("body"),this.JSON={title:e.title||"Goal To Reach",text:e.text||'You can hide this window with "hide goal"'},this.render(),e.additionalClass&&this.$el.addClass(e.additionalClass)},getAnimationTime:function(){return 700},onClick:function(){this.slideOut()},die:function(){this.slideOut(),setTimeout(u.bind(function(){this.tearDown()},this))},slideOut:function(){this.slideToggle(!0)},slideIn:function(){this.slideToggle(!1)},slideToggle:function(e){this.$("div.terminal-window-holder").toggleClass("slideOut",e)},getCanvasLocation:function(){return this.$("div.inside")[0]}});n.BaseView=d,n.GeneralButton=y,n.ModalView=E,n.ModalTerminal=S,n.ModalAlert=x,n.ContainedBase=g,n.ConfirmCancelView=b,n.LeftRightView=w,n.ZoomAlertWindow=L,n.ConfirmCancelTerminal=T,n.WindowSizeAlertWindow=k,n.CanvasTerminalHolder=O,n.LevelToolbar=A,n.NextLevelConfirm=N}),e("/src/js/views/index.js"),e.define("/src/js/views/levelDropdownView.js",function(e,t,n,r,i,s,o){var u=e("underscore"),a=e("q"),f=e("../util").isBrowser()?window.Backbone:e("backbone"),l=e("../util"),c=e("../util/keyboard").KeyboardListener,h=e("../app"),p=e("../views").ModalTerminal,d=e("../views").ContainedBase,v=e("../views").BaseView,m=d.extend({tagName:"div",className:"levelDropdownView box vertical",template:u.template($("#level-dropdown-view").html()),initialize:function(e){e=e||{},this.JSON={},this.navEvents=u.clone(f.Events),this.navEvents.on("clickedID",u.debounce(u.bind(this.loadLevelID,this),300,!0)),this.navEvents.on("negative",this.negative,this),this.navEvents.on("positive",this.positive,this),this.navEvents.on("left",this.left,this),this.navEvents.on("right",this.right,this),this.navEvents.on("up",this.up,this),this.navEvents.on("down",this.down,this),this.keyboardListener=new c({events:this.navEvents,aliasMap:{esc:"negative",enter:"positive"},wait:!0}),this.sequences=h.getLevelArbiter().getSequences(),this.sequenceToLevels=h.getLevelArbiter().getSequenceToLevels(),this.container=new p({title:"Select a Level"}),this.render(),this.buildSequences(),e.wait||this.show()},positive:function(){if(!this.selectedID)return;this.loadLevelID(this.selectedID)},left:function(){if(this.turnOnKeyboardSelection())return;this.leftOrRight(-1)},leftOrRight:function(e){this.deselectIconByID(this.selectedID),this.selectedIndex=this.wrapIndex(this.selectedIndex+e,this.getCurrentSequence()),this.selectedID=this.getSelectedID(),this.selectIconByID(this.selectedID)},right:function(){if(this.turnOnKeyboardSelection())return;this.leftOrRight(1)},up:function(){if(this.turnOnKeyboardSelection())return;this.selectedSequence=this.getPreviousSequence(),this.downOrUp()},down:function(){if(this.turnOnKeyboardSelection())return;this.selectedSequence=this.getNextSequence(),this.downOrUp()},downOrUp:function(){this.selectedIndex=this.boundIndex(this.selectedIndex,this.getCurrentSequence()),this.deselectIconByID(this.selectedID),this.selectedID=this.getSelectedID(),this.selectIconByID(this.selectedID)},turnOnKeyboardSelection:function(){return this.selectedID?!1:(this.selectFirst(),!0)},turnOffKeyboardSelection:function(){if(!this.selectedID)return;this.deselectIconByID(this.selectedID),this.selectedID=undefined,this.selectedIndex=undefined,this.selectedSequence=undefined},wrapIndex:function(e,t){return e=e>=t.length?0:e,e=e<0?t.length-1:e,e},boundIndex:function(e,t){return e=e>=t.length?t.length-1:e,e=e<0?0:e,e},getNextSequence:function(){var e=this.getSequenceIndex(this.selectedSequence),t=this.wrapIndex(e+1,this.sequences);return this.sequences[t]},getPreviousSequence:function(){var e=this.getSequenceIndex(this.selectedSequence),t=this.wrapIndex(e-1,this.sequences);return this.sequences[t]},getSequenceIndex:function(e){var t=this.sequences.indexOf(e);if(t<0)throw new Error("didnt find");return t},getIndexForID:function(e){return h.getLevelArbiter().getLevel(e).index},selectFirst:function(){var e=this.sequenceToLevels[this.sequences[0]][0].id;this.selectIconByID(e),this.selectedIndex=0,this.selectedSequence=this.sequences[0]},getCurrentSequence:function(){return this.sequenceToLevels[this.selectedSequence]},getSelectedID:function(){return this.sequenceToLevels[this.selectedSequence][this.selectedIndex].id},selectIconByID:function(e){this.toggleIconSelect(e,!0)},deselectIconByID:function(e){this.toggleIconSelect(e,!1)},toggleIconSelect:function(e,t){this.selectedID=e;var n="#levelIcon-"+e;$(n).toggleClass("selected",t)},negative:function(){this.hide()},testOption:function(e){return this.currentCommand&&(new RegExp("--"+e)).test(this.currentCommand.get("rawStr"))},show:function(e,t){this.currentCommand=t,this.updateSolvedStatus(),this.showDeferred=e,this.keyboardListener.listen(),m.__super__.show.apply(this)},hide:function(){this.showDeferred&&this.showDeferred.resolve(),this.showDeferred=undefined,this.keyboardListener.mute(),this.turnOffKeyboardSelection(),m.__super__.hide.apply(this)},loadLevelID:function(e){this.testOption("noOutput")||h.getEventBaton().trigger("commandSubmitted","level "+e),this.hide()},updateSolvedStatus:function(){u.each(this.seriesViews,function(e){e.updateSolvedStatus()},this)},buildSequences:function(){this.seriesViews=[],u.each(this.sequences,function(e){this.seriesViews.push(new g({destination:this.$el,name:e,navEvents:this.navEvents}))},this)}}),g=v.extend({tagName:"div",className:"seriesView box flex1 vertical",template:u.template($("#series-view").html()),events:{"click div.levelIcon":"click"},initialize:function(e){this.name=e.name||"intro",this.navEvents=e.navEvents,this.info=h.getLevelArbiter().getSequenceInfo(this.name),this.levels=h.getLevelArbiter().getLevelsInSequence(this.name),this.levelIDs=[],u.each(this.levels,function(e){this.levelIDs.push(e.id)},this),this.destination=e.destination,this.JSON={displayName:this.info.displayName,about:this.info.about,ids:this.levelIDs},this.render(),this.updateSolvedStatus()},updateSolvedStatus:function(){var e=this.$("div.levelIcon").each(function(e,t){var n=$(t).attr("data-id");$(t).toggleClass("solved",h.getLevelArbiter().isLevelSolved(n))})},click:function(e){var t=e.srcElement||e.currentTarget;if(!t){console.warn("wut, no id");return}var n=$(t).attr("data-id");this.navEvents.trigger("clickedID",n)}});n.LevelDropdownView=m}),e("/src/js/views/levelDropdownView.js"),e.define("/src/js/views/multiView.js",function(e,t,n,r,i,s,o){var u=e("underscore"),a=e("q"),f=e("../util").isBrowser()?window.Backbone:e("backbone"),l=e("../views").ModalTerminal,c=e("../views").ContainedBase,h=e("../views").ConfirmCancelView,p=e("../views").LeftRightView,d=e("../views").ModalAlert,v=e("../views/gitDemonstrationView").GitDemonstrationView,m=e("../views/builderViews"),g=m.MarkdownPresenter,y=e("../util/keyboard").KeyboardListener,b=e("../util/errors").GitError,w=f.View.extend({tagName:"div",className:"multiView",navEventDebounce:550,deathTime:700,typeToConstructor:{ModalAlert:d,GitDemonstrationView:v,MarkdownPresenter:g},initialize:function(e){e=e||{},this.childViewJSONs=e.childViews||[{type:"ModalAlert",options:{markdown:"Woah wtf!!"}},{type:"GitDemonstrationView",options:{command:"git checkout -b side; git commit; git commit"}},{type:"ModalAlert",options:{markdown:"Im second"}}],this.deferred=e.deferred||a.defer(),this.childViews=[],this.currentIndex=0,this.navEvents=u.clone(f.Events),this.navEvents.on("negative",this.getNegFunc(),this),this.navEvents.on("positive",this.getPosFunc(),this),this.navEvents.on("quit",this.finish,this),this.keyboardListener=new y({events:this.navEvents,aliasMap:{left:"negative",right:"positive",enter:"positive",esc:"quit"}}),this.render(),e.wait||this.start()},onWindowFocus:function(){},getAnimationTime:function(){return 700},getPromise:function(){return this.deferred.promise},getPosFunc:function(){return u.debounce(u.bind(function(){this.navForward()},this),this.navEventDebounce,!0)},getNegFunc:function(){return u.debounce(u.bind(function(){this.navBackward()},this),this.navEventDebounce,!0)},lock:function(){this.locked=!0},unlock:function(){this.locked=!1},navForward:function(){if(this.locked)return;if(this.currentIndex===this.childViews.length-1){this.hideViewIndex(this.currentIndex),this.finish();return}this.navIndexChange(1)},navBackward:function(){if(this.currentIndex===0)return;this.navIndexChange(-1)},navIndexChange:function(e){this.hideViewIndex(this.currentIndex),this.currentIndex+=e,this.showViewIndex(this.currentIndex)},hideViewIndex:function(e){this.childViews[e].hide()},showViewIndex:function(e){this.childViews[e].show()},finish:function(){this.keyboardListener.mute(),u.each(this.childViews,function(e){e.die()}),this.deferred.resolve()},start:function(){this.showViewIndex(this.currentIndex)},createChildView:function(e){var t=e.type;if(!this.typeToConstructor[t])throw new Error('no constructor for type "'+t+'"');var n=new this.typeToConstructor[t](u.extend({},e.options,{wait:!0}));return n},addNavToView:function(e,t){var n=new p({events:this.navEvents,destination:e.getDestination(),showLeft:t!==0,lastNav:t===this.childViewJSONs.length-1});e.receiveMetaNav&&e.receiveMetaNav(n,this)},render:function(){u.each(this.childViewJSONs,function(e,t){var n=this.createChildView(e);this.childViews.push(n),this.addNavToView(n,t)},this)}});n.MultiView=w}),e("/src/js/views/multiView.js"),e.define("/src/js/views/rebaseView.js",function(e,t,n,r,i,s,o){var u=e("../util/errors").GitError,a=e("underscore"),f=e("q"),l=e("../util").isBrowser()?window.Backbone:e("backbone"),c=e("../views").ModalTerminal,h=e("../views").ContainedBase,p=e("../views").ConfirmCancelView,d=e("../views").LeftRightView,v=h.extend({tagName:"div",template:a.template($("#interactive-rebase-template").html()),initialize:function(e){this.deferred=e.deferred,this.rebaseMap={},this.entryObjMap={},this.rebaseEntries=new g,e.toRebase.reverse(),a.each(e.toRebase,function(e){var t=e.get("id");this.rebaseMap[t]=e,this.entryObjMap[t]=new m({id:t}),this.rebaseEntries.add(this.entryObjMap[t])},this),this.container=new c({title:"Interactive Rebase"}),this.render(),this.show()},confirm:function(){this.die();var e=[];this.$("ul.rebaseEntries li").each(function(t,n){e.push(n.id)});var t=[];a.each(e,function(e){this.entryObjMap[e].get("pick")&&t.unshift(this.rebaseMap[e])},this),t.reverse(),this.deferred.resolve(t),this.$el.html("")},render:function(){var e={num:a.keys(this.rebaseMap).length},t=this.container.getInsideElement();this.$el.html(this.template(e)),$(t).append(this.el);var n=this.$("ul.rebaseEntries");this.rebaseEntries.each(function(e){new y({el:n,model:e})},this),n.sortable({axis:"y",placeholder:"rebaseEntry transitionOpacity ui-state-highlight",appendTo:"parent"}),this.makeButtons()},makeButtons:function(){var e=f.defer();e.promise.then(a.bind(function(){this.confirm()},this)).fail(a.bind(function(){this.hide(),this.deferred.resolve([])},this)).done(),new p({destination:this.$(".confirmCancel"),deferred:e})}}),m=l.Model.extend({defaults:{pick:!0},toggle:function(){this.set("pick",!this.get("pick"))}}),g=l.Collection.extend({model:m}),y=l.View.extend({tagName:"li",template:a.template($("#interactive-rebase-entry-template").html()),toggle:function(){this.model.toggle(),this.listEntry.toggleClass("notPicked",!this.model.get("pick"))},initialize:function(e){this.render()},render:function(){var e=this.model.toJSON();this.$el.append(this.template(this.model.toJSON())),this.listEntry=this.$el.children(":last"),this.listEntry.delegate("#toggleButton","click",a.bind(function(){this.toggle()},this))}});n.InteractiveRebaseView=v}),e("/src/js/views/rebaseView.js"),e.define("/src/js/visuals/animation/animationFactory.js",function(e,t,n,r,i,s,o){var u=e("underscore"),a=e("backbone"),f=e("./index").Animation,l=e("../../util/constants").GRAPHICS,c=function(){};c.prototype.genCommitBirthAnimation=function(e,t,n){if(!e)throw new Error("Need animation queue to add closure to!");var r=l.defaultAnimationTime*1,i=r*2,s=t.get("visNode"),o=function(){n.refreshTree(r),s.setBirth(),s.parentInFront(),n.visBranchesFront(),s.animateUpdatedPosition(i,"bounce"),s.animateOutgoingEdges(r)};e.add(new f({closure:o,duration:Math.max(r,i)}))},c.prototype.overrideOpacityDepth2=function(e,t){t=t===undefined?1:t;var n={};return u.each(e,function(e,r){n[r]={},u.each(e,function(e,i){i=="opacity"?n[r][i]=t:n[r][i]=e})}),n},c.prototype.overrideOpacityDepth3=function(e,t){var n={};return u.each(e,function(e,r){n[r]=this.overrideOpacityDepth2(e,t)},this),n},c.prototype.genCommitBirthClosureFromSnapshot=function(e,t){var n=l.defaultAnimationTime*1,r=n*1.5,i=e.newCommit.get("visNode"),s=this.overrideOpacityDepth2(e.afterSnapshot[i.getID()]),o=this.overrideOpacityDepth3(e.afterSnapshot),u=function(){i.setBirthFromSnapshot(e.beforeSnapshot),i.parentInFront(),t.visBranchesFront(),i.animateToAttr(s,r,"bounce"),i.animateOutgoingEdgesToAttr(o,r)};return u},c.prototype.refreshTree=function(e,t){e.add(new f({closure:function(){t.refreshTree()}}))},c.prototype.rebaseAnimation=function(e,t,n,r){this.rebaseHighlightPart(e,t,n),this.rebaseBirthPart(e,t,n,r)},c.prototype.rebaseHighlightPart=function(e,t,n){var r=l.defaultAnimationTime*.66,i=r*2,s=t.toRebaseArray,o=t.destinationBranch.get("visBranch");o||(o=t.destinationBranch.get("visNode")),u.each(s,function(t){var n=t.get("visNode");e.add(new f({closure:function(){n.highlightTo(o,i,"easeInOut")},duration:r*1.5}))},this),this.delay(e,r*2)},c.prototype.rebaseBirthPart=function(e,t,n,r){var i=t.rebaseSteps,s=[];u.each(i,function(e){var t=e.newCommit.get("visNode");s.push(t),t.setOpacity(0),t.setOutgoingEdgesOpacity(0)},this);var o=[];u.each(i,function(t,n){var i=s.slice(n+1),u=this.genFromToSnapshotAnimation(t.beforeSnapshot,t.afterSnapshot,i,o,r),a=this.genCommitBirthClosureFromSnapshot(t,r),c=function(){u(),a()};e.add(new f({closure:c,duration:l.defaultAnimationTime*1.5})),o.push(t.newCommit.get("visNode"))},this),this.delay(e),this.refreshTree(e,r)},c.prototype.delay=function(e,t){t=t||l.defaultAnimationTime,e.add(new f({closure:function(){},duration:t}))},c.prototype.genSetAllCommitOpacities=function(e,t){var n=e.slice(0);return function(){u.each(n,function(e){e.setOpacity(t),e.setOutgoingEdgesOpacity(t)})}},c.prototype.stripObjectsFromSnapshot=function(e,t){var n=[];u.each(t,function(e){n.push(e.getID())});var r={};return u.each(e,function(e,t){if(u.include(n,t))return;r[t]=e},this),r},c.prototype.genFromToSnapshotAnimation=function(e,t,n,r,i){var s=[];u.each(n,function(e){s.push(e),s=s.concat(e.get("outgoingEdges"))});var o=function(e){if(!e)return;u.each(e,function(t,n){e[n].opacity=1})};return u.each([e,t],function(e){u.each(r,function(t){o(e[t.getID()]),u.each(t.get("outgoingEdges"),function(t){o(e[t.getID()])})})}),function(){i.animateAllFromAttrToAttr(e,t,s)}},n.AnimationFactory=c}),e("/src/js/visuals/animation/animationFactory.js"),e.define("/src/js/visuals/animation/index.js",function(e,t,n,r,i,s,o){var u=e("underscore"),a=e("backbone"),f=e("../../util/constants").GLOBAL,l=a.Model.extend({defaults:{duration:300,closure:null},validateAtInit:function(){if(!this.get("closure"))throw new Error("give me a closure!")},initialize:function(e){this.validateAtInit()},run:function(){this.get("closure")()}}),c=a.Model.extend({defaults:{animations:null,index:0,callback:null,defer:!1},initialize:function(e){this.set("animations",[]),e.callback||console.warn("no callback")},add:function(e){if(!e instanceof l)throw new Error("Need animation not something else");this.get("animations").push(e)},start:function(){this.set("index",0),f.isAnimating=!0,this.next()},finish:function(){f.isAnimating=!1,this.get("callback")()},next:function(){var e=this.get("animations"),t=this.get("index");if(t>=e.length){this.finish();return}var n=e[t],r=n.get("duration");n.run(),this.set("index",t+1),setTimeout(u.bind(function(){this.next()},this),r)}});n.Animation=l,n.AnimationQueue=c}),e("/src/js/visuals/animation/index.js"),e.define("/src/js/visuals/index.js",function(e,t,n,r,i,s,o){function w(t){t=t||{},this.options=t,this.commitCollection=t.commitCollection,this.branchCollection=t.branchCollection,this.visNodeMap={},this.visEdgeCollection=new b,this.visBranchCollection=new g,this.commitMap={},this.rootCommit=null,this.branchStackMap=null,this.upstreamBranchSet=null,this.upstreamHeadSet=null,this.paper=t.paper,this.gitReady=!1,this.branchCollection.on("add",this.addBranchFromEvent,this),this.branchCollection.on("remove",this.removeBranch,this),this.deferred=[],this.posBoundaries={min:0,max:1};var n=e("../app");n.getEvents().on("refreshTree",this.refreshTree,this)}function E(e){var t=0,n=0,r=0,i=0,s=e.length;u.each(e,function(e){var s=e.split("(")[1];s=s.split(")")[0],s=s.split(","),r+=parseFloat(s[1]),i+=parseFloat(s[2]);var o=parseFloat(s[0]),u=o*Math.PI*2;t+=Math.cos(u),n+=Math.sin(u)}),t/=s,n/=s,r/=s,i/=s;var o=Math.atan2(n,t)/(Math.PI*2);return o<0&&(o+=1),"hsb("+String(o)+","+String(r)+","+String(i)+")"}var u=e("underscore"),a=e("q"),f=e("backbone"),l=e("../util/constants").GRAPHICS,c=e("../util/constants").GLOBAL,h=e("../models/collections"),p=h.CommitCollection,d=h.BranchCollection,v=e("../visuals/visNode").VisNode,m=e("../visuals/visBranch").VisBranch,g=e("../visuals/visBranch").VisBranchCollection,y=e("../visuals/visEdge").VisEdge,b=e("../visuals/visEdge").VisEdgeCollection;w.prototype.defer=function(e){this.deferred.push(e)},w.prototype.deferFlush=function(){u.each(this.deferred,function(e){e()},this),this.deferred=[]},w.prototype.resetAll=function(){var e=this.visEdgeCollection.toArray();u.each(e,function(e){e.remove()},this);var t=this.visBranchCollection.toArray();u.each(t,function(e){e.remove()},this),u.each(this.visNodeMap,function(e){e.remove()},this),this.visEdgeCollection.reset(),this.visBranchCollection.reset(),this.visNodeMap={},this.rootCommit=null,this.commitMap={}},w.prototype.tearDown=function(){this.resetAll(),this.paper.remove()},w.prototype.assignGitEngine=function(e){this.gitEngine=e,this.initHeadBranch(),this.deferFlush()},w.prototype.initHeadBranch=function(){this.addBranchFromEvent(this.gitEngine.HEAD)},w.prototype.getScreenPadding=function(){return{widthPadding:l.nodeRadius*1.5,heightPadding:l.nodeRadius*1.5}},w.prototype.toScreenCoords=function(e){if(!this.paper.width)throw new Error("being called too early for screen coords");var t=this.getScreenPadding(),n=function(e,t,n){return n+e*(t-n*2)};return{x:n(e.x,this.paper.width,t.widthPadding),y:n(e.y,this.paper.height,t.heightPadding)}},w.prototype.animateAllAttrKeys=function(e,t,n,r){var i=a.defer(),s=function(i){i.animateAttrKeys(e,t,n,r)};this.visBranchCollection.each(s),this.visEdgeCollection.each(s),u.each(this.visNodeMap,s);var o=n!==undefined?n:l.defaultAnimationTime;return setTimeout(function(){i.resolve()},o),i.promise},w.prototype.finishAnimation=function(){var e=this,t=a.defer(),n=a.defer(),r=l.defaultAnimationTime,i=l.nodeRadius,s="Solved!!\n:D",o=null,f=u.bind(function(){o=this.paper.text(this.paper.width/2,this.paper.height/2,s),o.attr({opacity:0,"font-weight":500,"font-size":"32pt","font-family":"Monaco, Courier, font-monospace",stroke:"#000","stroke-width":2,fill:"#000"}),o.animate({opacity:1},r)},this);return t.promise.then(u.bind(function(){return this.animateAllAttrKeys({exclude:["circle"]},{opacity:0},r*1.1)},this)).then(u.bind(function(){return this.animateAllAttrKeys({exclude:["arrow","rect","path","text"]},{r:i*2},r*1.5)},this)).then(u.bind(function(){return this.animateAllAttrKeys({exclude:["arrow","rect","path","text"]},{r:i*.75},r*.5)},this)).then(u.bind(function(){return f(),this.explodeNodes()},this)).then(u.bind(function(){return this.explodeNodes()},this)).then(u.bind(function(){return this.animateAllAttrKeys({exclude:["arrow","rect","path","text"]},{},r*1.25)},this)).then(u.bind(function(){return o.animate({opacity:0},r,undefined,undefined,function(){o.remove()}),this.animateAllAttrKeys({},{})},this)).then(function(){n.resolve()}).fail(function(e){console.warn("animation error"+e)}).done(),t.resolve(),n.promise},w.prototype.explodeNodes=function(){var e=a.defer(),t=[];u.each(this.visNodeMap,function(e){t.push(e.getExplodeStepFunc())});var n=setInterval(function(){var r=[];u.each(t,function(e){e()&&r.push(e)});if(!r.length){clearInterval(n),e.resolve();return}t=r},.025);return e.promise},w.prototype.animateAllFromAttrToAttr=function(e,t,n){var r=function(r){var i=r.getID();if(u.include(n,i))return;if(!e[i]||!t[i])return;r.animateFromAttrToAttr(e[i],t[i])};this.visBranchCollection.each(r),this.visEdgeCollection.each(r),u.each(this.visNodeMap,r)},w.prototype.genSnapshot=function(){this.fullCalc();var e={};return u.each(this.visNodeMap,function(t){e[t.get("id")]=t.getAttributes()},this),this.visBranchCollection.each(function(t){e[t.getID()]=t.getAttributes()},this),this.visEdgeCollection.each(function(t){e[t.getID()]=t.getAttributes()},this),e},w.prototype.refreshTree=function(e){if(!this.gitReady||!this.gitEngine.rootCommit)return;this.fullCalc(),this.animateAll(e)},w.prototype.refreshTreeHarsh=function(){this.fullCalc(),this.animateAll(0)},w.prototype.animateAll=function(e){this.zIndexReflow(),this.animateEdges(e),this.animateNodePositions(e),this.animateRefs(e)},w.prototype.fullCalc=function(){this.calcTreeCoords(),this.calcGraphicsCoords()},w.prototype.calcTreeCoords=function(){if(!this.rootCommit)throw new Error("grr, no root commit!");this.calcUpstreamSets(),this.calcBranchStacks(),this.calcDepth(),this.calcWidth()},w.prototype.calcGraphicsCoords=function(){this.visBranchCollection.each(function(e){e.updateName()})},w.prototype.calcUpstreamSets=function(){this.upstreamBranchSet=this.gitEngine.getUpstreamBranchSet(),this.upstreamHeadSet=this.gitEngine.getUpstreamHeadSet()},w.prototype.getCommitUpstreamBranches=function(e){return this.branchStackMap[e.get("id")]},w.prototype.getBlendedHuesForCommit=function(e){var t=this.upstreamBranchSet[e.get("id")];if(!t)throw new Error("that commit doesnt have upstream branches!");return this.blendHuesFromBranchStack(t)},w.prototype.blendHuesFromBranchStack=function(e){var t=[];return u.each(e,function(e){var n=e.obj.get("visBranch").get("fill");if(n.slice(0,3)!=="hsb"){var r=Raphael.color(n);n="hsb("+String(r.h)+","+String(r.l),n=n+","+String(r.s)+")"}t.push(n)}),E(t)},w.prototype.getCommitUpstreamStatus=function(e){if(!this.upstreamBranchSet)throw new Error("Can't calculate this yet!");var t=e.get("id"),n=this.upstreamBranchSet,r=this.upstreamHeadSet;return n[t]?"branch":r[t]?"head":"none"},w.prototype.calcBranchStacks=function(){var e=this.gitEngine.getBranches(),t={};u.each(e,function(e){var n=e.target.get("id");t[n]=t[n]||[],t[n].push(e),t[n].sort(function(e,t){var n=e.obj.get("id"),r=t.obj.get("id");return n=="master"||r=="master"?n=="master"?-1:1:n.localeCompare(r)})}),this.branchStackMap=t},w.prototype.calcWidth=function(){this.maxWidthRecursive(this.rootCommit),this.assignBoundsRecursive(this.rootCommit,this.posBoundaries.min,this.posBoundaries.max)},w.prototype.maxWidthRecursive=function(e){var t=0;u.each(e.get("children"),function(n){if(n.isMainParent(e)){var r=this.maxWidthRecursive(n);t+=r}},this);var n=Math.max(1,t);return e.get("visNode").set("maxWidth",n),n},w.prototype.assignBoundsRecursive=function(e,t,n){var r=(t+n)/2;e.get("visNode").get("pos").x=r;if(e.get("children").length===0)return;var i=n-t,s=0,o=e.get("children");u.each(o,function(t){t.isMainParent(e)&&(s+=t.get("visNode").getMaxWidthScaled())},this);var a=t;u.each(o,function(t){if(!t.isMainParent(e))return;var n=t.get("visNode").getMaxWidthScaled(),r=n/s*i,o=a,u=o+r;this.assignBoundsRecursive(t,o,u),a=u},this)},w.prototype.calcDepth=function(){var e=this.calcDepthRecursive(this.rootCommit,0);e>15&&console.warn("graphics are degrading from too many layers");var t=this.getDepthIncrement(e);u.each(this.visNodeMap,function(e){e.setDepthBasedOn(t)},this)},w.prototype.animateNodePositions=function(e){u.each(this.visNodeMap,function(t){t.animateUpdatedPosition(e)},this)},w.prototype.addBranchFromEvent=function(e,t,n){var r=u.bind(function(){this.addBranch(e)},this);!this.gitEngine||!this.gitReady?this.defer(r):r()},w.prototype.addBranch=function(e){var t=new m({branch:e,gitVisuals:this,gitEngine:this.gitEngine});this.visBranchCollection.add(t),this.gitReady?t.genGraphics(this.paper):this.defer(u.bind(function(){t.genGraphics(this.paper)},this))},w.prototype.removeVisBranch=function(e){this.visBranchCollection.remove(e)},w.prototype.removeVisNode=function(e){this.visNodeMap[e.getID()]=undefined},w.prototype.removeVisEdge=function(e){this.visEdgeCollection.remove(e)},w.prototype.animateRefs=function(e){this.visBranchCollection.each(function(t){t.animateUpdatedPos(e)},this)},w.prototype.animateEdges=function(e){this.visEdgeCollection.each(function(t){t.animateUpdatedPath(e)},this)},w.prototype.getMinLayers=function(){return this.options.smallCanvas?4:7},w.prototype.getDepthIncrement=function(e){e=Math.max(e,this.getMinLayers());var t=1/e;return t},w.prototype.calcDepthRecursive=function(e,t){e.get("visNode").setDepth(t);var n=e.get("children"),r=t;return u.each(n,function(e){var n=this.calcDepthRecursive(e,t+1);r=Math.max(n,r)},this),r},w.prototype.canvasResize=function(e,t){this.resizeFunc||this.genResizeFunc(),this.resizeFunc(e,t)},w.prototype.genResizeFunc=function(){this.resizeFunc=u.debounce(u.bind(function(t,n){if(c.isAnimating){var r=e("../app");r.getEventBaton().trigger("commandSubmitted","refresh")}else this.refreshTree()},this),200,!0)},w.prototype.addNode=function(e,t){this.commitMap[e]=t,t.get("rootCommit")&&(this.rootCommit=t);var n=new v({id:e,commit:t,gitVisuals:this,gitEngine:this.gitEngine});return this.visNodeMap[e]=n,this.gitReady&&n.genGraphics(this.paper),n},w.prototype.addEdge=function(e,t){var n=this.visNodeMap[e],r=this.visNodeMap[t];if(!n||!r)throw new Error("one of the ids in ("+e+", "+t+") does not exist");var i=new y({tail:n,head:r,gitVisuals:this,gitEngine:this.gitEngine});this.visEdgeCollection.add(i),this.gitReady&&i.genGraphics(this.paper)},w.prototype.zIndexReflow=function(){this.visNodesFront(),this.visBranchesFront()},w.prototype.visNodesFront=function(){u.each(this.visNodeMap,function(e){e.toFront()})},w.prototype.visBranchesFront=function(){this.visBranchCollection.each(function(e){e.nonTextToFront(),e.textToFront()}),this.visBranchCollection.each(function(e){e.textToFrontIfInStack()})},w.prototype.drawTreeFromReload=function(){this.gitReady=!0,this.deferFlush(),this.calcTreeCoords()},w.prototype.drawTreeFirstTime=function(){this.gitReady=!0,this.calcTreeCoords(),u.each(this.visNodeMap,function(e){e.genGraphics(this.paper)},this),this.visEdgeCollection.each(function(e){e.genGraphics(this.paper)},this),this.visBranchCollection.each(function(e){e.genGraphics(this.paper)},this),this.zIndexReflow()},n.GitVisuals=w}),e("/src/js/visuals/index.js"),e.define("/src/js/visuals/tree.js",function(e,t,n,r,i,s,o){var u=e("underscore"),a=e("backbone"),f=a.Model.extend({removeKeys:function(e){u.each(e,function(e){this.get(e)&&this.get(e).remove()},this)},animateAttrKeys:function(e,t,n,r){e=u.extend({},{include:["circle","arrow","rect","path","text"],exclude:[]},e||{});var i=this.getAttributes();u.each(e.include,function(e){i[e]=u.extend({},i[e],t)}),u.each(e.exclude,function(e){delete i[e]}),this.animateToAttr(i,n,r)}});n.VisBase=f}),e("/src/js/visuals/tree.js"),e.define("/src/js/visuals/visBase.js",function(e,t,n,r,i,s,o){var u=e("underscore"),a=e("backbone"),f=a.Model.extend({removeKeys:function(e){u.each(e,function(e){this.get(e)&&this.get(e).remove()},this)},animateAttrKeys:function(e,t,n,r){e=u.extend({},{include:["circle","arrow","rect","path","text"],exclude:[]},e||{});var i=this.getAttributes();u.each(e.include,function(e){i[e]=u.extend({},i[e],t)}),u.each(e.exclude,function(e){delete i[e]}),this.animateToAttr(i,n,r)}});n.VisBase=f}),e("/src/js/visuals/visBase.js"),e.define("/src/js/visuals/visBranch.js",function(e,t,n,r,i,s,o){var u=e("underscore"),a=e("backbone"),f=e("../util/constants").GRAPHICS,l=e("../visuals/visBase").VisBase,c=function(){var e=Math.random(),t="hsb("+String(e)+",0.7,1)";return t},h=l.extend({defaults:{pos:null,text:null,rect:null,arrow:null,isHead:!1,flip:1,fill:f.rectFill,stroke:f.rectStroke,"stroke-width":f.rectStrokeWidth,offsetX:f.nodeRadius*4.75,offsetY:0,arrowHeight:14,arrowInnerSkew:0,arrowEdgeHeight:6,arrowLength:14,arrowOffsetFromCircleX:10,vPad:5,hPad:5,animationSpeed:f.defaultAnimationTime,animationEasing:f.defaultEasing},validateAtInit:function(){if(!this.get("branch"))throw new Error("need a branch!")},getID:function(){return this.get("branch").get("id")},initialize:function(){this.validateAtInit(),this.gitVisuals=this.get("gitVisuals"),this.gitEngine=this.get("gitEngine");if(!this.gitEngine)throw new Error("asd wtf");this.get("branch").set("visBranch",this);var e=this.get("branch").get("id");e=="HEAD"?(this.set("isHead",!0),this.set("flip",-1),this.set("fill",f.headRectFill)):e!=="master"&&this.set("fill",c())},getCommitPosition:function(){var e=this.gitEngine.getCommitFromRef(this.get("branch")),t=e.get("visNode"),n=this.get("gitVisuals").posBoundaries.max;return t.get("pos").x>n?this.set("flip",-1):this.set("flip",1),t.getScreenCoords()},getBranchStackIndex:function(){if(this.get("isHead"))return 0;var e=this.getBranchStackArray(),t=-1;return u.each(e,function(e,n){e.obj==this.get("branch")&&(t=n)},this),t},getBranchStackLength:function(){return this.get("isHead")?1:this.getBranchStackArray().length},getBranchStackArray:function(){var e=this.gitVisuals.branchStackMap[this.get("branch").get("target").get("id")];return e===undefined?(this.gitVisuals.calcBranchStacks(),this.getBranchStackArray()):e},getTextPosition:function(){var e=this.getCommitPosition(),t=this.getBranchStackIndex();return{x:e.x+this.get("flip")*this.get("offsetX"),y:e.y+t*f.multiBranchY+this.get("offsetY")}},getRectPosition:function(){var e=this.getTextPosition(),t=this.get("flip"),n=this.getTextSize();return{x:e.x-.5*n.w-this.get("hPad"),y:e.y-.5*n.h-this.get("vPad")}},getArrowPath:function(){var e=function(e,t,n){return{x:e.x+t,y:e.y+n}},t=function(e){return String(Math.round(e.x))+","+String(Math.round(e.y))},n=this.get("flip"),r=e(this.getCommitPosition(),n*this.get("arrowOffsetFromCircleX"),0),i=e(r,n*this.get("arrowLength"),-this.get("arrowHeight")),s=e(r,n*this.get("arrowLength"),this.get("arrowHeight")),o=e(i,n*this.get("arrowInnerSkew"),this.get("arrowEdgeHeight")),a=e(s,n*this.get("arrowInnerSkew"),-this.get("arrowEdgeHeight")),f=49,l=e(o,n*f,0),c=e(a,n*f,0),h="";h+="M"+t(l)+" ";var p=[o,i,r,s,a,c];return u.each(p,function(e){h+="L"+t(e)+" "},this),h+="z",h},getTextSize:function(){var e=function(e){var t=e.get("text")?e.get("text").node:null;return t===null?0:t.clientWidth},t=function(e){return e.w||(e.w=75),e.h||(e.h=20),e},n=this.get("text").node;if(this.get("isHead"))return t({w:n.clientWidth,h:n.clientHeight});var r=0;return u.each(this.getBranchStackArray(),function(t){r=Math.max(r,e(t.obj.get("visBranch")))}),t({w:r,h:n.clientHeight})},getSingleRectSize:function(){var e=this.getTextSize(),t=this.get("vPad"),n=this.get("hPad");return{w:e.w+t*2,h:e.h+n*2}},getRectSize:function(){var e=this.getTextSize(),t=this.get("vPad"),n=this.get("hPad"),r=this.getBranchStackLength();return{w:e.w+t*2,h:e.h*r*1.1+n*2}},getName:function(){var e=this.get("branch").get("id"),t=this.gitEngine.HEAD.get("target").get("id"),n=t==e?"*":"";return e+n},nonTextToFront:function(){this.get("arrow").toFront(),this.get("rect").toFront()},textToFront:function(){this.get("text").toFront()},textToFrontIfInStack:function(){this.getBranchStackIndex()!==0&&this.get("text").toFront()},getFill:function(){return this.get("isHead")||this.getBranchStackLength()==1||this.getBranchStackIndex()!==0?this.get("fill"):this.gitVisuals.blendHuesFromBranchStack(this.getBranchStackArray())},remove:function(){this.removeKeys(["text","arrow","rect"]),this.gitVisuals.removeVisBranch(this)},genGraphics:function(e){var t=this.getTextPosition(),n=this.getName(),r;r=e.text(t.x,t.y,String(n)),r.attr({"font-size":14,"font-family":"Monaco, Courier, font-monospace",opacity:this.getTextOpacity()}),this.set("text",r);var i=this.getRectPosition(),s=this.getRectSize(),o=e.rect(i.x,i.y,s.w,s.h,8).attr(this.getAttributes().rect);this.set("rect",o);var u=this.getArrowPath(),a=e.path(u).attr(this.getAttributes().arrow);this.set("arrow",a),this.attachClickHandlers(),o.toFront(),r.toFront()},attachClickHandlers:function(){if(this.get("gitVisuals").options.noClick)return;var t="git checkout "+this.get("branch").get("id"),n=e("../app"),r=[this.get("rect"),this.get("text"),this.get("arrow")];u.each(r,function(e){e.click(function(){n.getEventBaton().trigger("commandSubmitted",t)}),$(e.node).css("cursor","pointer")})},updateName:function(){this.get("text").attr({text:this.getName()})},getNonTextOpacity:function(){return this.get("isHead")?this.gitEngine.getDetachedHead()?1:0:this.getBranchStackIndex()===0?1:0},getTextOpacity:function(){return this.get("isHead")?this.gitEngine.getDetachedHead()?1:0:1},getAttributes:function(){var e=this.getNonTextOpacity(),t=this.getTextOpacity();this.updateName();var n=this.getTextPosition(),r=this.getRectPosition(),i=this.getRectSize(),s=this.getArrowPath();return{text:{x:n.x,y:n.y,opacity:t},rect:{x:r.x,y:r.y,width:i.w,height:i.h,opacity:e,fill:this.getFill(),stroke:this.get("stroke"),"stroke-width":this.get("stroke-width")},arrow:{path:s,opacity:e,fill:this.getFill(),stroke:this.get("stroke"),"stroke-width":this.get("stroke-width")}}},animateUpdatedPos:function(e,t){var n=this.getAttributes();this.animateToAttr(n,e,t)},animateFromAttrToAttr:function(e,t,n,r){this.animateToAttr(e,0),this.animateToAttr(t,n,r)},animateToAttr:function(e,t,n){if(t===0){this.get("text").attr(e.text),this.get("rect").attr(e.rect),this.get("arrow").attr(e.arrow);return}var r=t!==undefined?t:this.get("animationSpeed"),i=n||this.get("animationEasing");this.get("text").stop().animate(e.text,r,i),this.get("rect").stop().animate(e.rect,r,i),this.get("arrow").stop().animate(e.arrow,r,i)}}),p=a.Collection.extend({model:h});n.VisBranchCollection=p,n.VisBranch=h,n.randomHueString=c}),e("/src/js/visuals/visBranch.js"),e.define("/src/js/visuals/visEdge.js",function(e,t,n,r,i,s,o){var u=e("underscore"),a=e("backbone"),f=e("../util/constants").GRAPHICS,l=e("../visuals/visBase").VisBase,c=l.extend({defaults:{tail:null,head:null,animationSpeed:f.defaultAnimationTime,animationEasing:f.defaultEasing},validateAtInit:function(){var e=["tail","head"];u.each(e,function(e){if(!this.get(e))throw new Error(e+" is required!")},this)},getID:function(){return this.get("tail").get("id")+"."+this.get("head").get("id")},initialize:function(){this.validateAtInit(),this.gitVisuals=this.get("gitVisuals"),this.gitEngine=this.get("gitEngine"),this.get("tail").get("outgoingEdges").push(this)},remove:function(){this.removeKeys(["path"]),this.gitVisuals.removeVisEdge(this)},genSmoothBezierPathString:function(e,t){var n=e.getScreenCoords(),r=t.getScreenCoords();return this.genSmoothBezierPathStringFromCoords(n,r)},genSmoothBezierPathStringFromCoords:function(e,t){var n=function(e){return String(Math.round(e.x))+","+String(Math.round(e.y))},r=function(e,t,n){return n=n||f.curveControlPointOffset,{x:e.x,y:e.y+n*t}},i=function(e,t,n){return{x:e.x+t,y:e.y+n}};e=r(e,-1,this.get("tail").getRadius()),t=r(t,1,this.get("head").getRadius());var s="";s+="M"+n(e)+" ",s+="C",s+=n(r(e,-1))+" ",s+=n(r(t,1))+" ",s+=n(t);var o=f.arrowHeadSize||10;return s+=" L"+n(i(t,-o,o)),s+=" L"+n(i(t,o,o)),s+=" L"+n(t),s+="C",s+=n(r(t,1))+" ",s+=n(r(e,-1))+" ",s+=n(e),s},getBezierCurve:function(){return this.genSmoothBezierPathString(this.get("tail"),this.get("head"))},getStrokeColor:function(){return f.visBranchStrokeColorNone},setOpacity:function(e){e=e===undefined?1:e,this.get("path").attr({opacity:e})},genGraphics:function(e){var t=this.getBezierCurve(),n=e.path(t).attr({"stroke-width":f.visBranchStrokeWidth,stroke:this.getStrokeColor(),"stroke-linecap":"round","stroke-linejoin":"round",fill:this.getStrokeColor()});n.toBack(),this.set("path",n)},getOpacity:function(){var e=this.gitVisuals.getCommitUpstreamStatus(this.get("tail")),t={branch:1,head:f.edgeUpstreamHeadOpacity,none:f.edgeUpstreamNoneOpacity};if(t[e]===undefined)throw new Error("bad stat");return t[e]},getAttributes:function(){var e=this.getBezierCurve(),t=this.getOpacity();return{path:{path:e,opacity:t}}},animateUpdatedPath:function(e,t){var n=this.getAttributes();this.animateToAttr(n,e,t)},animateFromAttrToAttr:function(e,t,n,r){this.animateToAttr(e,0),this.animateToAttr(t,n,r)},animateToAttr:function(e,t,n){if(t===0){this.get("path").attr(e.path);return}this.get("path").toBack(),this.get("path").stop().animate(e.path,t!==undefined?t:this.get("animationSpeed"),n||this.get("animationEasing"))}}),h=a.Collection.extend({model:c});n.VisEdgeCollection=h,n.VisEdge=c}),e("/src/js/visuals/visEdge.js"),e.define("/src/js/visuals/visNode.js",function(e,t,n,r,i,s,o){var u=e("underscore"),a=e("backbone"),f=e("../util/constants").GRAPHICS,l=e("../visuals/visBase").VisBase,c=l.extend({defaults:{depth:undefined,maxWidth:null,outgoingEdges:null,circle:null,text:null,id:null,pos:null,radius:null,commit:null,animationSpeed:f.defaultAnimationTime,animationEasing:f.defaultEasing,fill:f.defaultNodeFill,"stroke-width":f.defaultNodeStrokeWidth,stroke:f.defaultNodeStroke},getID:function(){return this.get("id")},validateAtInit:function(){if(!this.get("id"))throw new Error("need id for mapping");if(!this.get("commit"))throw new Error("need commit for linking");this.get("pos")||this.set("pos",{x:Math.random(),y:Math.random()})},initialize:function(){this.validateAtInit(),this.gitVisuals=this.get("gitVisuals"),this.gitEngine=this.get("gitEngine"),this.set("outgoingEdges",[])},setDepth:function(e){this.set("depth",Math.max(this.get("depth")||0,e))},setDepthBasedOn:function(e){if(this.get("depth")===undefined){debugger;throw new Error("no depth yet!")}var t=this.get("pos");t.y=this.get("depth")*e},getMaxWidthScaled:function(){var e=this.gitVisuals.getCommitUpstreamStatus(this.get("commit")),t={branch:1,head:.3,none:.1};if(t[e]===undefined)throw new Error("bad stat");return t[e]*this.get("maxWidth")},toFront:function(){this.get("circle").toFront(),this.get("text").toFront()},getOpacity:function(){var e={branch:1,head:f.upstreamHeadOpacity,none:f.upstreamNoneOpacity},t=this.gitVisuals.getCommitUpstreamStatus(this.get("commit"));if(e[t]===undefined)throw new Error("invalid status");return e[t]},getTextScreenCoords:function(){return this.getScreenCoords()},getAttributes:function(){var e=this.getScreenCoords(),t=this.getTextScreenCoords(),n=this.getOpacity();return{circle:{cx:e.x,cy:e.y,opacity:n,r:this.getRadius(),fill:this.getFill(),"stroke-width":this.get("stroke-width"),stroke:this.get("stroke")},text:{x:t.x,y:t.y,opacity:n}}},highlightTo:function(e,t,n){var r=e.get("fill"),i={circle:{fill:r,stroke:r,"stroke-width":this.get("stroke-width")*5},text:{}};this.animateToAttr(i,t,n)},animateUpdatedPosition:function(e,t){var n=this.getAttributes();this.animateToAttr(n,e,t)},animateFromAttrToAttr:function(e,t,n,r){this.animateToAttr(e,0),this.animateToAttr(t,n,r)},animateToSnapshot:function(e,t,n){if(!e[this.getID()])return;this.animateToAttr(e[this.getID()],t,n)},animateToAttr:function(e,t,n){if(t===0){this.get("circle").attr(e.circle),this.get("text").attr(e.text);return}var r=t!==undefined?t:this.get("animationSpeed"),i=n||this.get("animationEasing");this.get("circle").stop().animate(e.circle,r,i),this.get("text").stop().animate(e.text,r,i),n=="bounce"&&e.circle&&e.circle.cx!==undefined&&e.text&&e.text.x!==undefined&&(this.get("circle").animate(e.circle.cx,r,"easeInOut"),this.get("text").animate(e.text.x,r,"easeInOut"))},getScreenCoords:function(){var e=this.get("pos");return this.gitVisuals.toScreenCoords(e)},getRadius:function(){return this.get("radius")||f.nodeRadius},getParentScreenCoords:function(){return this.get("commit").get("parents")[0].get("visNode").getScreenCoords()},setBirthPosition:function(){var e=this.getParentScreenCoords();this.get("circle").attr({cx:e.x,cy:e.y,opacity:0,r:0}),this.get("text").attr({x:e.x,y:e.y,opacity:0})},setBirthFromSnapshot:function(e){var t=this.get("commit").get("parents")[0].get("visNode").getID(),n=e[t];this.get("circle").attr({opacity:0,r:0,cx:n.circle.cx,cy:n.circle.cy}),this.get("text").attr({opacity:0,x:n.text.x,y:n.text.y});var r={x:n.circle.cx,y:n.circle.cy};this.setOutgoingEdgesBirthPosition(r)},setBirth:function(){this.setBirthPosition(),this.setOutgoingEdgesBirthPosition(this.getParentScreenCoords())},setOutgoingEdgesOpacity:function(e){u.each(this.get("outgoingEdges"),function(t){t.setOpacity(e)})},animateOutgoingEdgesToAttr:function(e,t,n){u.each(this.get("outgoingEdges"),function(t){var n=e[t.getID()];t.animateToAttr(n)},this)},animateOutgoingEdges:function(e,t){u.each(this.get("outgoingEdges"),function(n){n.animateUpdatedPath(e,t)},this)},animateOutgoingEdgesFromSnapshot:function(e,t,n){u.each(this.get("outgoingEdges"),function(r){var i=e[r.getID()];r.animateToAttr(i,t,n)},this)},setOutgoingEdgesBirthPosition:function(e){u.each(this.get("outgoingEdges"),function(t){var n=t.get("head").getScreenCoords(),r=t.genSmoothBezierPathStringFromCoords(e,n);t.get("path").stop().attr({path:r,opacity:0})},this)},parentInFront:function(){this.get("commit").get("parents")[0].get("visNode").toFront()},getFontSize:function(e){return e.length<3?12:e.length<5?10:8},getFill:function(){var e=this.gitVisuals.getCommitUpstreamStatus(this.get("commit"));return e=="head"?f.headRectFill:e=="none"?f.orphanNodeFill:this.gitVisuals.getBlendedHuesForCommit(this.get("commit"))},attachClickHandlers:function(){if(this.get("gitVisuals").options.noClick)return;var t="git checkout "+this.get("commit").get("id"),n=e("../app");u.each([this.get("circle"),this.get("text")],function(e){e.click(function(){n.getEventBaton().trigger("commandSubmitted",t)}),$(e.node).css("cursor","pointer")})},setOpacity:function(e){e=e===undefined?1:e;var t=["circle","text"];u.each(t,function(t){this.get(t).attr({opacity:e})},this)},remove:function(){this.removeKeys(["circle"],["text"]);var e=this.get("text");e&&e.remove(),this.gitVisuals.removeVisNode(this)},removeAll:function(){this.remove(),u.each(this.get("outgoingEdges"),function(e){e.remove()},this)},getExplodeStepFunc:function(){var e=this.get("circle"),t=20,n=Math.PI+Math.random()*1*Math.PI,r=.2,i=.01,s=t*Math.cos(n),o=t*Math.sin(n),u=e.attr("cx"),a=e.attr("cy"),f=this.gitVisuals.paper.width,l=this.gitVisuals.paper.height,c=.8,h=1,p=function(){o+=r*h-i*o,s-=i*s,u+=s*h,a+=o*h;if(u<0||u>f)s=c*-s,u=u<0?0:f;if(a<0||a>l)o=c*-o,a=a<0?0:l;return e.attr({cx:u,cy:a}),s*s+o*o<.01&&Math.abs(a-l)===0?!1:!0};return p},genGraphics:function(){var e=this.gitVisuals.paper,t=this.getScreenCoords(),n=this.getTextScreenCoords(),r=e.circle(t.x,t.y,this.getRadius()).attr(this.getAttributes().circle),i=e.text(n.x,n.y,String(this.get("id")));i.attr({"font-size":this.getFontSize(this.get("id")),"font-weight":"bold","font-family":"Monaco, Courier, font-monospace",opacity:this.getOpacity()}),this.set("circle",r),this.set("text",i),this.attachClickHandlers()}});n.VisNode=c}),e("/src/js/visuals/visNode.js"),e.define("/src/js/visuals/visualization.js",function(e,t,n,r,i,s,o){var u=e("underscore"),a=e("../util").isBrowser()?a=window.Backbone:a=e("backbone"),f=e("../models/collections"),l=f.CommitCollection,c=f.BranchCollection,h=e("../util/eventBaton").EventBaton,p=e("../visuals").GitVisuals,d=a.View.extend({initialize:function(e){e=e||{},this.options=e,this.customEvents=u.clone(a.Events),this.containerElement=e.containerElement;var t=this,n=e.containerElement||$("#canvasHolder")[0];new Raphael(n,200,200,function(){var n=this;s.nextTick(function(){t.paperInitialize(n,e)})})},paperInitialize:function(t,n){this.treeString=n.treeString,this.paper=t;var r=e("../app");this.eventBaton=n.noKeyboardInput?new h:r.getEventBaton(),this.commitCollection=new l,this.branchCollection=new c,this.gitVisuals=new p({commitCollection:this.commitCollection,branchCollection:this.branchCollection,paper:this.paper,noClick:this.options.noClick,smallCanvas:this.options.smallCanvas});var i=e("../git").GitEngine;this.gitEngine=new i({collection:this.commitCollection,branches:this.branchCollection,gitVisuals:this.gitVisuals,eventBaton:this.eventBaton}),this.gitEngine.init(),this.gitVisuals.assignGitEngine(this.gitEngine),this.myResize(),$(window).on("resize",u.bind(function(){this.myResize()},this)),this.gitVisuals.drawTreeFirstTime(),this.treeString&&this.gitEngine.loadTreeFromString(this.treeString),this.options.zIndex&&this.setTreeIndex(this.options.zIndex),this.shown=!1,this.setTreeOpacity(0),s.nextTick(u.bind(this.fadeTreeIn,this)),this.customEvents.trigger("gitEngineReady"),this.customEvents.trigger("paperReady")},setTreeIndex:function(e){$(this.paper.canvas).css("z-index",e)},setTreeOpacity:function(e){e===0&&(this.shown=!1),$(this.paper.canvas).css("opacity",e)},getAnimationTime:function(){return 300},fadeTreeIn:function(){this.shown=!0,$(this.paper.canvas).animate({opacity:1},this.getAnimationTime())},fadeTreeOut:function(){this.shown=!1,$(this.paper.canvas).animate({opacity:0},this.getAnimationTime())},hide:function(){this.fadeTreeOut(),setTimeout(u.bind(function(){$(this.paper.canvas).css("visibility","hidden")},this),this.getAnimationTime())},show:function(){$(this.paper.canvas).css("visibility","visible"),setTimeout(u.bind(this.fadeTreeIn,this),10)},showHarsh:function(){$(this.paper.canvas).css("visibility","visible"),this.setTreeOpacity(1)},resetFromThisTreeNow:function(e){this.treeString=e},reset:function(){this.setTreeOpacity(0),this.treeString?this.gitEngine.loadTreeFromString(this.treeString):this.gitEngine.defaultInit(),this.fadeTreeIn()},tearDown:function(){this.gitEngine.tearDown(),this.gitVisuals.tearDown(),delete this.paper},die:function(){this.fadeTreeOut(),setTimeout(u.bind(function(){this.shown||this.tearDown()},this),this.getAnimationTime())},myResize:function(){if(!this.paper)return;var e=1,t=this.el,n=t.clientWidth-e,r=t.clientHeight-e;if(!this.containerElement){var i=t.offsetLeft,s=t.offsetTop;$(this.paper.canvas).css({position:"absolute",left:i+"px",top:s+"px"})}this.paper.setSize(n,r),this.gitVisuals.canvasResize(n,r)}});n.Visualization=d}),e("/src/js/visuals/visualization.js"),e.define("/src/levels/index.js",function(e,t,n,r,i,s,o){n.levelSequences={intro:[e("../../levels/intro/1").level,e("../../levels/intro/2").level,e("../../levels/intro/3").level,e("../../levels/intro/4").level,e("../../levels/intro/5").level],rebase:[e("../../levels/rebase/1").level,e("../../levels/rebase/2").level],mixed:[e("../../levels/mixed/1").level,e("../../levels/mixed/2").level,e("../../levels/mixed/3").level]},n.sequenceInfo={intro:{displayName:"Introduction Sequence",about:"A nicely paced introduction to the majority of git commands"},rebase:{displayName:"Master the Rebase Luke!",about:"What is this whole rebase hotness everyone is talking about? Find out!"},mixed:{displayName:"A Mixed Bag",about:"A mixed bag of Git techniques, tricks, and tips"}}}),e("/src/levels/index.js"),e.define("/src/levels/intro/1.js",function(e,t,n,r,i,s,o){n.level={name:"Introduction to Git Commits",goalTreeString:'{"branches":{"master":{"target":"C3","id":"master"}},"commits":{"C0":{"parents":[],"id":"C0","rootCommit":true},"C1":{"parents":["C0"],"id":"C1"},"C2":{"parents":["C1"],"id":"C2"},"C3":{"parents":["C2"],"id":"C3"}},"HEAD":{"target":"master","id":"HEAD"}}',solutionCommand:"git commit;git commit",startTree:'{"branches":{"master":{"target":"C1","id":"master"}},"commits":{"C0":{"parents":[],"id":"C0","rootCommit":true},"C1":{"parents":["C0"],"id":"C1"}},"HEAD":{"target":"master","id":"HEAD"}}',hint:"Just type in 'git commit' twice to finish!",disabledMap:{"git revert":!0},startDialog:{childViews:[{type:"ModalAlert",options:{markdowns:["## Git Commits","A commit in a git repository records a snapshot of all the files in your directory. It's like a giant copy and paste, but even better!","","Git wants to keep commits as lightweight as possible though, so it doesn't just copy the entire directory every time you commit. It actually stores each commit as a set of changes, or a \"delta\", from one version of the repository to the next. That's why most commits have a parent commit above them -- you'll see this later in our visualizations.","",'In order to clone a repository, you have to unpack or "resolve" all these deltas. That\'s why you might see the command line output:',"","`resolving deltas`","","when cloning a repo.","","It's a lot to take in, but for now you can think of commits as snapshots of the project. Commits are very light and switching between them is wicked fast!"]}},{type:"GitDemonstrationView",options:{beforeMarkdowns:["Let's see what this looks like in practice. On the right we have a visualization of a (small) git repository. There are two commits right now -- the first initial commit, `C0`, and one commit after that `C1` that might have some meaningful changes.","","Hit the button below to make a new commit"],afterMarkdowns:["There we go! Awesome. We just made changes to the repository and saved them as a commit. The commit we just made has a parent, `C1`, which references which commit it was based off of."],command:"git commit",beforeCommand:""}},{type:"ModalAlert",options:{markdowns:["Go ahead and try it out on your own! After this window closes, make two commits to complete the level"]}}]}}}),e("/src/levels/intro/1.js"),e.define("/src/levels/intro/2.js",function(e,t,n,r,i,s,o){n.level={goalTreeString:'{"branches":{"master":{"target":"C1","id":"master"},"bugFix":{"target":"C1","id":"bugFix"}},"commits":{"C0":{"parents":[],"id":"C0","rootCommit":true},"C1":{"parents":["C0"],"id":"C1"}},"HEAD":{"target":"bugFix","id":"HEAD"}}',solutionCommand:"git branch bugFix;git checkout bugFix",hint:'Make a new branch with "git branch [name]" and check it out with "git checkout [name]"',name:"Branching in Git",disabledMap:{"git revert":!0},startDialog:{childViews:[{type:"ModalAlert",options:{markdowns:["## Git Branches","","Branches in Git are incredibly lightweight as well. They are simply references to a specific commit -- nothing more. This is why many Git enthusiasts chant the mantra:","","```","branch early, and branch often","```","","Because there is no storage / memory overhead with making many branches, it's easier to logically divide up your work than have big beefy branches.","",'When we start mixing branches and commits, we will see how these two features combine. For now though, just remember that a branch essentially says "I want to include the work of this commit and all parent commits."']}},{type:"GitDemonstrationView",options:{beforeMarkdowns:["Let's see what branches look like in practice.","","Here we will check out a new branch named `newImage`"],afterMarkdowns:["There, that's all there is to branching! The branch `newImage` now refers to commit `C1`"],command:"git branch newImage",beforeCommand:""}},{type:"GitDemonstrationView",options:{beforeMarkdowns:["Let's try to put some work on this new branch. Hit the button below"],afterMarkdowns:["Oh no! The `master` branch moved but the `newImage` branch didn't! That's because we weren't \"on\" the new branch, which is why the asterisk (*) was on `master`"],command:"git commit",beforeCommand:"git branch newImage"}},{type:"GitDemonstrationView",options:{beforeMarkdowns:["Let's tell git we want to checkout the branch with","","```","git checkout [name]","```","","This will put us on the new branch before committing our changes"],afterMarkdowns:["There we go! Our changes were recorded on the new branch"],command:"git checkout newImage; git commit",beforeCommand:"git branch newImage"}},{type:"ModalAlert",options:{markdowns:["Ok! You are all ready to get branching. Once this window closes,","make a new branch named `bugFix` and switch to that branch"]}}]}}}),e("/src/levels/intro/2.js"),e.define("/src/levels/intro/3.js",function(e,t,n,r,i,s,o){n.level={goalTreeString:'{"branches":{"master":{"target":"C4","id":"master"},"bugFix":{"target":"C2","id":"bugFix"}},"commits":{"C0":{"parents":[],"id":"C0","rootCommit":true},"C1":{"parents":["C0"],"id":"C1"},"C2":{"parents":["C1"],"id":"C2"},"C3":{"parents":["C1"],"id":"C3"},"C4":{"parents":["C2","C3"],"id":"C4"}},"HEAD":{"target":"master","id":"HEAD"}}',solutionCommand:"git checkout -b bugFix;git commit;git checkout master;git commit;git merge bugFix",name:"Merging in Git",hint:"Remember to commit in the order specified (bugFix before master)",disabledMap:{"git revert":!0},startDialog:{childViews:[{type:"ModalAlert",options:{markdowns:["## Branches and Merging","","Great! We now know how to commit and branch. Now we need to learn some kind of way of combining the work from two different branches together. This will allow us to branch off, develop a new feature, and then combine it back in.","",'The first method to combine work that we will examine is `git merge`. Merging in Git creates a special commit that has two unique parents. A commit with two parents essentially means "I want to include all the work from this parent over here and this one over here, *and* the set of all their parents."',"","It's easier with visuals, let's check it out in the next view"]}},{type:"GitDemonstrationView",options:{beforeMarkdowns:["Here we have two branches; each has one commit that's unique. This means that neither branch includes the entire set of \"work\" in the repository that we have done. Let's fix that with merge.","","We will `merge` the branch `bugFix` into `master`"],afterMarkdowns:["Woah! See that? First of all, `master` now points to a commit that has two parents. If you follow the arrows upstream from `master`, you will hit every commit along the way to the root. This means that `master` contains all the work in the repository now.","","Also, see how the colors of the commits changed? To help with learning, I have included some color coordination. Each branch has a unique color. Each commit turns a color that is the blended combination of all the branches that contain that commit.","","So here we see that the `master` branch color is blended into all the commits, but the `bugFix` color is not. Let's fix that..."],command:"git merge bugFix master",beforeCommand:"git checkout -b bugFix; git commit; git checkout master; git commit"}},{type:"GitDemonstrationView",options:{beforeMarkdowns:["Let's merge `master` into `bugFix`:"],afterMarkdowns:["Since `bugFix` was downstream of `master`, git didn't have to do any work; it simply just moved `bugFix` to the same commit `master` was attached to.","","Now all the commits are the same color, which means each branch contains all the work in the repository! Woohoo"],command:"git merge master bugFix",beforeCommand:"git checkout -b bugFix; git commit; git checkout master; git commit; git merge bugFix master"}},{type:"ModalAlert",options:{markdowns:["To complete this level, do the following steps:","","* Make a new branch called `bugFix`","* Checkout the `bugFix` branch with `git checkout bugFix`","* Commit once","* Go back to `master` with `git checkout`","* Commit another time","* Merge the branch `bugFix` into `master` with `git merge`","",'*Remember, you can always re-display this dialog with "help level"!*']}}]}}}),e("/src/levels/intro/3.js"),e.define("/src/levels/intro/4.js",function(e,t,n,r,i,s,o){n.level={goalTreeString:"%7B%22branches%22%3A%7B%22master%22%3A%7B%22target%22%3A%22C3%22%2C%22id%22%3A%22master%22%7D%2C%22bugFix%22%3A%7B%22target%22%3A%22C2%27%22%2C%22id%22%3A%22bugFix%22%7D%7D%2C%22commits%22%3A%7B%22C0%22%3A%7B%22parents%22%3A%5B%5D%2C%22id%22%3A%22C0%22%2C%22rootCommit%22%3Atrue%7D%2C%22C1%22%3A%7B%22parents%22%3A%5B%22C0%22%5D%2C%22id%22%3A%22C1%22%7D%2C%22C2%22%3A%7B%22parents%22%3A%5B%22C1%22%5D%2C%22id%22%3A%22C2%22%7D%2C%22C3%22%3A%7B%22parents%22%3A%5B%22C1%22%5D%2C%22id%22%3A%22C3%22%7D%2C%22C2%27%22%3A%7B%22parents%22%3A%5B%22C3%22%5D%2C%22id%22%3A%22C2%27%22%7D%7D%2C%22HEAD%22%3A%7B%22target%22%3A%22bugFix%22%2C%22id%22%3A%22HEAD%22%7D%7D",solutionCommand:"git checkout -b bugFix;git commit;git checkout master;git commit;git checkout bugFix;git rebase master",name:"Rebase Introduction",hint:"Make sure you commit from bugFix first",disabledMap:{"git revert":!0},startDialog:{childViews:[{type:"ModalAlert",options:{markdowns:["## Git Rebase","",'The second way of combining work between branches is *rebasing.* Rebasing essentially takes a set of commits, "copies" them, and plops them down somewhere else.',"","While this sounds confusing, the advantage of rebasing is that it can be used to make a nice linear sequence of commits. The commit log / history of the repository will be a lot cleaner if only rebasing is allowed.","","Let's see it in action..."]}},{type:"GitDemonstrationView",options:{beforeMarkdowns:["Here we have two branches yet again; note that the bugFix branch is currently selected (note the asterisk)","","We would like to move our work from bugFix directly onto the work from master. That way it would look like these two features were developed sequentially, when in reality they were developed in parallel.","","Let's do that with the `git rebase` command"],afterMarkdowns:["Awesome! Now the work from our bugFix branch is right on top of master and we have a nice linear sequence of commits.","",'Note that the commit C3 still exists somewhere (it has a faded appearance in the tree), and C3\' is the "copy" that we rebased onto master.',"","The only problem is that master hasn't been updated either, let's do that now..."],command:"git rebase master",beforeCommand:"git commit; git checkout -b bugFix C1; git commit"}},{type:"GitDemonstrationView",options:{beforeMarkdowns:["Now we are checked out on the `master` branch. Let's do ahead and rebase onto `bugFix`..."],afterMarkdowns:["There! Since `master` was downstream of `bugFix`, git simply moved the `master` branch reference forward in history."],command:"git rebase bugFix",beforeCommand:"git commit; git checkout -b bugFix C1; git commit; git rebase master; git checkout master"}},{type:"ModalAlert",options:{markdowns:["To complete this level, do the following","","* Checkout a new branch named `bugFix`","* Commit once","* Go back to master and commit again","* Check out bugFix again and rebase onto master","","Good luck!"]}}]}}}),e("/src/levels/intro/4.js"),e.define("/src/levels/intro/5.js",function(e,t,n,r,i,s,o){n.level={goalTreeString:"%7B%22branches%22%3A%7B%22master%22%3A%7B%22target%22%3A%22C1%22%2C%22id%22%3A%22master%22%7D%2C%22pushed%22%3A%7B%22target%22%3A%22C2%27%22%2C%22id%22%3A%22pushed%22%7D%2C%22local%22%3A%7B%22target%22%3A%22C1%22%2C%22id%22%3A%22local%22%7D%7D%2C%22commits%22%3A%7B%22C0%22%3A%7B%22parents%22%3A%5B%5D%2C%22id%22%3A%22C0%22%2C%22rootCommit%22%3Atrue%7D%2C%22C1%22%3A%7B%22parents%22%3A%5B%22C0%22%5D%2C%22id%22%3A%22C1%22%7D%2C%22C2%22%3A%7B%22parents%22%3A%5B%22C1%22%5D%2C%22id%22%3A%22C2%22%7D%2C%22C3%22%3A%7B%22parents%22%3A%5B%22C1%22%5D%2C%22id%22%3A%22C3%22%7D%2C%22C2%27%22%3A%7B%22parents%22%3A%5B%22C2%22%5D%2C%22id%22%3A%22C2%27%22%7D%7D%2C%22HEAD%22%3A%7B%22target%22%3A%22pushed%22%2C%22id%22%3A%22HEAD%22%7D%7D",solutionCommand:"git reset HEAD~1;git checkout pushed;git revert HEAD",startTree:'{"branches":{"master":{"target":"C1","id":"master"},"pushed":{"target":"C2","id":"pushed"},"local":{"target":"C3","id":"local"}},"commits":{"C0":{"parents":[],"id":"C0","rootCommit":true},"C1":{"parents":["C0"],"id":"C1"},"C2":{"parents":["C1"],"id":"C2"},"C3":{"parents":["C1"],"id":"C3"}},"HEAD":{"target":"local","id":"HEAD"}}',name:"Reversing Changes in Git",hint:"",startDialog:{childViews:[{type:"ModalAlert",options:{markdowns:["## Reversing Changes in Git","","There are many ways to reverse changes in Git. And just like committing, reversing changes in Git has both a low-level component (staging individual files or chunks) and a high-level component (how the changes are actually reversed). Our application will focus on the latter.","","There are two primary ways to undo changes in Git -- one is using `git reset` and the other is using `git revert`. We will look at each of these in the next dialog",""]}},{type:"GitDemonstrationView",options:{beforeMarkdowns:["## Git Reset","",'`git reset` reverts changes by moving a branch reference backwards in time to an older commit. In this sense you can think of it as "rewriting history;" `git reset` will move a branch backwards as if the commit had never been made in the first place.',"","Let's see what that looks like:"],afterMarkdowns:["Nice! Git simply moved the master branch reference back to `C1`; now our local repository is in a state as if `C2` had never happened"],command:"git reset HEAD~1",beforeCommand:"git commit"}},{type:"GitDemonstrationView",options:{beforeMarkdowns:["## Git Revert","","While reseting works great for local branches on your own machine, it's method of \"rewriting history\" doesn't work for remote branches that others are using.","","In order to reverse changes and *share* those reversed changes with others, we need to use `git revert`. Let's see it in action"],afterMarkdowns:["Weird, a new commit plopped down below the commit we wanted to reverse. That's because this new commit `C2'` introduces *changes* -- it just happens to introduce changes that exactly reverses the commit of `C2`.","","With reverting, you can push out your changes to share with others."],command:"git revert HEAD",beforeCommand:"git commit"}},{type:"ModalAlert",options:{markdowns:["To complete this level, reverse the two most recent commits on both `local` and `pushed`.","","Keep in mind that `pushed` is a remote branch and `local` is a local branch -- that should help you chose your methods."]}}]}}}),e("/src/levels/intro/5.js"),e.define("/src/levels/mixed/1.js",function(e,t,n,r,i,s,o){n.level={compareOnlyMaster:!0,disabledMap:{"git revert":!0},goalTreeString:"%7B%22branches%22%3A%7B%22master%22%3A%7B%22target%22%3A%22C4%27%22%2C%22id%22%3A%22master%22%7D%2C%22debug%22%3A%7B%22target%22%3A%22C2%22%2C%22id%22%3A%22debug%22%7D%2C%22printf%22%3A%7B%22target%22%3A%22C3%22%2C%22id%22%3A%22printf%22%7D%2C%22bugFix%22%3A%7B%22target%22%3A%22C4%27%22%2C%22id%22%3A%22bugFix%22%7D%7D%2C%22commits%22%3A%7B%22C0%22%3A%7B%22parents%22%3A%5B%5D%2C%22id%22%3A%22C0%22%2C%22rootCommit%22%3Atrue%7D%2C%22C1%22%3A%7B%22parents%22%3A%5B%22C0%22%5D%2C%22id%22%3A%22C1%22%7D%2C%22C2%22%3A%7B%22parents%22%3A%5B%22C1%22%5D%2C%22id%22%3A%22C2%22%7D%2C%22C3%22%3A%7B%22parents%22%3A%5B%22C2%22%5D%2C%22id%22%3A%22C3%22%7D%2C%22C4%22%3A%7B%22parents%22%3A%5B%22C3%22%5D%2C%22id%22%3A%22C4%22%7D%2C%22C4%27%22%3A%7B%22parents%22%3A%5B%22C1%22%5D%2C%22id%22%3A%22C4%27%22%7D%7D%2C%22HEAD%22%3A%7B%22target%22%3A%22master%22%2C%22id%22%3A%22HEAD%22%7D%7D",solutionCommand:"git checkout master;git cherry-pick C4",startTree:'{"branches":{"master":{"target":"C1","id":"master"},"debug":{"target":"C2","id":"debug"},"printf":{"target":"C3","id":"printf"},"bugFix":{"target":"C4","id":"bugFix"}},"commits":{"C0":{"parents":[],"id":"C0","rootCommit":true},"C1":{"parents":["C0"],"id":"C1"},"C2":{"parents":["C1"],"id":"C2"},"C3":{"parents":["C2"],"id":"C3"},"C4":{"parents":["C3"],"id":"C4"}},"HEAD":{"target":"bugFix","id":"HEAD"}}',name:"Grabbing Just 1 Commit",hint:"Remember, interactive rebase or cherry-pick is your friend here",startDialog:{childViews:[{type:"ModalAlert",options:{markdowns:["## Locally stacked commits","","Here's a development situation that often happens: I'm trying to track down a bug but it is quite elusive. In order to aid in my detective work, I put in a few debug commands and a few print statements.","","All of these debugging / print statements are in their own branches. Finally I track down the bug, fix it, and rejoice!","","Only problem is that I now need to get my `bugFix` back into the `master` branch! I could simply fast-forward `master`, but then `master` would get all my debug statements."]}},{type:"ModalAlert",options:{markdowns:["This is where the magic of Git comes in. There are a few ways to do this, but the two most straightforward ways are:","","* `git rebase -i`","* `git cherry-pick`","","Interactive (the `-i`) rebasing allows you to chose which commits you want to keep or discard. It also allows you to reorder commits. This can be helpful if you want to toss out some work.","","Cherry-picking allows you to pick individual commits and plop them down on top of `HEAD`"]}},{type:"ModalAlert",options:{markdowns:["This is a later level so we will leave it up to you to decide, but in order to complete the level, make sure `master` receives the commit that `bugFix` references."]}}]}}}),e("/src/levels/mixed/1.js"),e.define("/src/levels/mixed/2.js",function(e,t,n,r,i,s,o){n.level={disabledMap:{"git cherry-pick":!0,"git revert":!0},compareOnlyMaster:!0,goalTreeString:"%7B%22branches%22%3A%7B%22master%22%3A%7B%22target%22%3A%22C3%27%27%22%2C%22id%22%3A%22master%22%7D%2C%22newImage%22%3A%7B%22target%22%3A%22C2%22%2C%22id%22%3A%22newImage%22%7D%2C%22caption%22%3A%7B%22target%22%3A%22C3%27%27%22%2C%22id%22%3A%22caption%22%7D%7D%2C%22commits%22%3A%7B%22C0%22%3A%7B%22parents%22%3A%5B%5D%2C%22id%22%3A%22C0%22%2C%22rootCommit%22%3Atrue%7D%2C%22C1%22%3A%7B%22parents%22%3A%5B%22C0%22%5D%2C%22id%22%3A%22C1%22%7D%2C%22C2%22%3A%7B%22parents%22%3A%5B%22C1%22%5D%2C%22id%22%3A%22C2%22%7D%2C%22C3%22%3A%7B%22parents%22%3A%5B%22C2%22%5D%2C%22id%22%3A%22C3%22%7D%2C%22C3%27%22%3A%7B%22parents%22%3A%5B%22C1%22%5D%2C%22id%22%3A%22C3%27%22%7D%2C%22C2%27%22%3A%7B%22parents%22%3A%5B%22C3%27%22%5D%2C%22id%22%3A%22C2%27%22%7D%2C%22C2%27%27%22%3A%7B%22parents%22%3A%5B%22C3%27%22%5D%2C%22id%22%3A%22C2%27%27%22%7D%2C%22C2%27%27%27%22%3A%7B%22parents%22%3A%5B%22C1%22%5D%2C%22id%22%3A%22C2%27%27%27%22%7D%2C%22C3%27%27%22%3A%7B%22parents%22%3A%5B%22C2%27%27%27%22%5D%2C%22id%22%3A%22C3%27%27%22%7D%7D%2C%22HEAD%22%3A%7B%22target%22%3A%22master%22%2C%22id%22%3A%22HEAD%22%7D%7D",solutionCommand:"git rebase -i HEAD~2;git commit --amend;git rebase -i HEAD~2;git rebase caption master",startTree:'{"branches":{"master":{"target":"C1","id":"master"},"newImage":{"target":"C2","id":"newImage"},"caption":{"target":"C3","id":"caption"}},"commits":{"C0":{"parents":[],"id":"C0","rootCommit":true},"C1":{"parents":["C0"],"id":"C1"},"C2":{"parents":["C1"],"id":"C2"},"C3":{"parents":["C2"],"id":"C3"}},"HEAD":{"target":"caption","id":"HEAD"}}',name:"Juggling Commits",hint:"The first command is git rebase -i HEAD~2",startDialog:{childViews:[{type:"ModalAlert",options:{markdowns:["## Juggling Commits","","Here's another situation that happens quite commonly. You have some changes (`newImage`) and another set of changes (`caption`) that are related, so they are stacked on top of each other in your repository (aka one after another).","","The tricky thing is that sometimes you need to make a small modification to an earlier commit. In this case, design wants us to change the dimensions of `newImage` slightly, even though that commit is way back in our history!!"]}},{type:"ModalAlert",options:{markdowns:["We will overcome this difficulty by doing the following:","","* We will re-order the commits so the one we want to change is on top with `git rebase -i`","* We will `commit --amend` to make the slight modification","* Then we will re-order the commits back to how they were previously with `git rebase -i`","* Finally, we will move master to this updated part of the tree to finish the level (via your method of choosing)","","There are many ways to accomplish this overall goal (I see you eye-ing cherry-pick), and we will see more of them later, but for now let's focus on this technique."]}},{type:"ModalAlert",options:{markdowns:["Lastly, pay attention to the goal state here -- since we move the commits twice, they both get an apostrophe appended. One more apostrophe is added for the commit we amend, which gives us the final form of the tree "]}}]}}}),e("/src/levels/mixed/2.js"),e.define("/src/levels/mixed/3.js",function(e,t,n,r,i,s,o){n.level={goalTreeString:"%7B%22branches%22%3A%7B%22master%22%3A%7B%22target%22%3A%22C3%27%22%2C%22id%22%3A%22master%22%7D%2C%22newImage%22%3A%7B%22target%22%3A%22C2%22%2C%22id%22%3A%22newImage%22%7D%2C%22caption%22%3A%7B%22target%22%3A%22C3%22%2C%22id%22%3A%22caption%22%7D%7D%2C%22commits%22%3A%7B%22C0%22%3A%7B%22parents%22%3A%5B%5D%2C%22id%22%3A%22C0%22%2C%22rootCommit%22%3Atrue%7D%2C%22C1%22%3A%7B%22parents%22%3A%5B%22C0%22%5D%2C%22id%22%3A%22C1%22%7D%2C%22C2%22%3A%7B%22parents%22%3A%5B%22C1%22%5D%2C%22id%22%3A%22C2%22%7D%2C%22C3%22%3A%7B%22parents%22%3A%5B%22C2%22%5D%2C%22id%22%3A%22C3%22%7D%2C%22C2%27%22%3A%7B%22parents%22%3A%5B%22C1%22%5D%2C%22id%22%3A%22C2%27%22%7D%2C%22C2%27%27%22%3A%7B%22parents%22%3A%5B%22C1%22%5D%2C%22id%22%3A%22C2%27%27%22%7D%2C%22C3%27%22%3A%7B%22parents%22%3A%5B%22C2%27%27%22%5D%2C%22id%22%3A%22C3%27%22%7D%7D%2C%22HEAD%22%3A%7B%22target%22%3A%22master%22%2C%22id%22%3A%22HEAD%22%7D%7D",solutionCommand:"git checkout master;git cherry-pick C2;git commit --amend;git cherry-pick C3",disabledMap:{"git revert":!0},startTree:'{"branches":{"master":{"target":"C1","id":"master"},"newImage":{"target":"C2","id":"newImage"},"caption":{"target":"C3","id":"caption"}},"commits":{"C0":{"parents":[],"id":"C0","rootCommit":true},"C1":{"parents":["C0"],"id":"C1"},"C2":{"parents":["C1"],"id":"C2"},"C3":{"parents":["C2"],"id":"C3"}},"HEAD":{"target":"caption","id":"HEAD"}}',compareOnlyMaster:!0,name:"Juggling Commits #2",hint:"Don't forget to forward master to the updated changes!",startDialog:{childViews:[{type:"ModalAlert",options:{markdowns:["## Juggling Commits #2","","*If you haven't completed Juggling Commits #1 (the previous level), please do so before continuing*","","As you saw in the last level, we used `rebase -i` to reorder the commits. Once the commit we wanted to change was on top, we could easily --amend it and re-order back to our preferred order.","","The only issue here is that there is a lot of reordering going on, which can introduce rebase conflicts. Let's look at another method with `git cherry-pick`"]}},{type:"GitDemonstrationView",options:{beforeMarkdowns:["Remember that git cherry-pick will plop down a commit from anywhere in the tree onto HEAD (as long as that commit isn't upstream).","","Here's a small refresher demo:"],afterMarkdowns:["Nice! Let's move on"],command:"git cherry-pick C2",beforeCommand:"git checkout -b bugFix; git commit; git checkout master; git commit"}},{type:"ModalAlert",options:{markdowns:["So in this level, let's accomplish the same objective of amending `C2` once but avoid using `rebase -i`. I'll leave it up to you to figure it out! :D"]}}]}}}),e("/src/levels/mixed/3.js"),e.define("/src/levels/rebase/1.js",function(e,t,n,r,i,s,o){n.level={compareOnlyMaster:!0,disabledMap:{"git revert":!0},goalTreeString:"%7B%22branches%22%3A%7B%22master%22%3A%7B%22target%22%3A%22C7%27%22%2C%22id%22%3A%22master%22%7D%2C%22bugFix%22%3A%7B%22target%22%3A%22C3%27%22%2C%22id%22%3A%22bugFix%22%7D%2C%22side%22%3A%7B%22target%22%3A%22C6%27%22%2C%22id%22%3A%22side%22%7D%2C%22another%22%3A%7B%22target%22%3A%22C7%27%22%2C%22id%22%3A%22another%22%7D%7D%2C%22commits%22%3A%7B%22C0%22%3A%7B%22parents%22%3A%5B%5D%2C%22id%22%3A%22C0%22%2C%22rootCommit%22%3Atrue%7D%2C%22C1%22%3A%7B%22parents%22%3A%5B%22C0%22%5D%2C%22id%22%3A%22C1%22%7D%2C%22C2%22%3A%7B%22parents%22%3A%5B%22C1%22%5D%2C%22id%22%3A%22C2%22%7D%2C%22C3%22%3A%7B%22parents%22%3A%5B%22C1%22%5D%2C%22id%22%3A%22C3%22%7D%2C%22C4%22%3A%7B%22parents%22%3A%5B%22C0%22%5D%2C%22id%22%3A%22C4%22%7D%2C%22C5%22%3A%7B%22parents%22%3A%5B%22C4%22%5D%2C%22id%22%3A%22C5%22%7D%2C%22C6%22%3A%7B%22parents%22%3A%5B%22C5%22%5D%2C%22id%22%3A%22C6%22%7D%2C%22C7%22%3A%7B%22parents%22%3A%5B%22C5%22%5D%2C%22id%22%3A%22C7%22%7D%2C%22C3%27%22%3A%7B%22parents%22%3A%5B%22C2%22%5D%2C%22id%22%3A%22C3%27%22%7D%2C%22C4%27%22%3A%7B%22parents%22%3A%5B%22C3%27%22%5D%2C%22id%22%3A%22C4%27%22%7D%2C%22C5%27%22%3A%7B%22parents%22%3A%5B%22C4%27%22%5D%2C%22id%22%3A%22C5%27%22%7D%2C%22C6%27%22%3A%7B%22parents%22%3A%5B%22C5%27%22%5D%2C%22id%22%3A%22C6%27%22%7D%2C%22C7%27%22%3A%7B%22parents%22%3A%5B%22C6%27%22%5D%2C%22id%22%3A%22C7%27%22%7D%7D%2C%22HEAD%22%3A%7B%22target%22%3A%22master%22%2C%22id%22%3A%22HEAD%22%7D%7D",solutionCommand:"git checkout bugFix;git rebase master;git checkout side;git rebase bugFix;git checkout another;git rebase side;git rebase another master",startTree:'{"branches":{"master":{"target":"C2","id":"master"},"bugFix":{"target":"C3","id":"bugFix"},"side":{"target":"C6","id":"side"},"another":{"target":"C7","id":"another"}},"commits":{"C0":{"parents":[],"id":"C0","rootCommit":true},"C1":{"parents":["C0"],"id":"C1"},"C2":{"parents":["C1"],"id":"C2"},"C3":{"parents":["C1"],"id":"C3"},"C4":{"parents":["C0"],"id":"C4"},"C5":{"parents":["C4"],"id":"C5"},"C6":{"parents":["C5"],"id":"C6"},"C7":{"parents":["C5"],"id":"C7"}},"HEAD":{"target":"master","id":"HEAD"}}',name:"Rebasing over 9000 times",hint:"Remember, the most efficient way might be to only update master at the end...",startDialog:{childViews:[{type:"ModalAlert",options:{markdowns:["### Rebasing Multiple Branches","","Man, we have a lot of branches going on here! Let's rebase all the work from these branches onto master.","","Upper management is making this a bit trickier though -- they want the commits to all be in sequential order. So this means that our final tree should have `C7'` at the bottom, `C6'` above that, etc etc, etc all in order.","","If you mess up along the way, feel free to use `reset` to start over again. Be sure to check out our solution and see if you can do it in fewer commands!"]}}]}}}),e("/src/levels/rebase/1.js"),e.define("/src/levels/rebase/2.js",function(e,t,n,r,i,s,o){n.level={compareOnlyBranches:!0,disabledMap:{"git revert":!0},goalTreeString:"%7B%22branches%22%3A%7B%22master%22%3A%7B%22target%22%3A%22C5%22%2C%22id%22%3A%22master%22%7D%2C%22one%22%3A%7B%22target%22%3A%22C2%27%22%2C%22id%22%3A%22one%22%7D%2C%22two%22%3A%7B%22target%22%3A%22C2%27%27%22%2C%22id%22%3A%22two%22%7D%2C%22three%22%3A%7B%22target%22%3A%22C2%27%27%27%22%2C%22id%22%3A%22three%22%7D%7D%2C%22commits%22%3A%7B%22C0%22%3A%7B%22parents%22%3A%5B%5D%2C%22id%22%3A%22C0%22%2C%22rootCommit%22%3Atrue%7D%2C%22C1%22%3A%7B%22parents%22%3A%5B%22C0%22%5D%2C%22id%22%3A%22C1%22%7D%2C%22C2%22%3A%7B%22parents%22%3A%5B%22C1%22%5D%2C%22id%22%3A%22C2%22%7D%2C%22C3%22%3A%7B%22parents%22%3A%5B%22C2%22%5D%2C%22id%22%3A%22C3%22%7D%2C%22C4%22%3A%7B%22parents%22%3A%5B%22C3%22%5D%2C%22id%22%3A%22C4%22%7D%2C%22C5%22%3A%7B%22parents%22%3A%5B%22C4%22%5D%2C%22id%22%3A%22C5%22%7D%2C%22C4%27%22%3A%7B%22parents%22%3A%5B%22C1%22%5D%2C%22id%22%3A%22C4%27%22%7D%2C%22C3%27%22%3A%7B%22parents%22%3A%5B%22C4%27%22%5D%2C%22id%22%3A%22C3%27%22%7D%2C%22C2%27%22%3A%7B%22parents%22%3A%5B%22C3%27%22%5D%2C%22id%22%3A%22C2%27%22%7D%2C%22C5%27%22%3A%7B%22parents%22%3A%5B%22C1%22%5D%2C%22id%22%3A%22C5%27%22%7D%2C%22C4%27%27%22%3A%7B%22parents%22%3A%5B%22C5%27%22%5D%2C%22id%22%3A%22C4%27%27%22%7D%2C%22C3%27%27%22%3A%7B%22parents%22%3A%5B%22C4%27%27%22%5D%2C%22id%22%3A%22C3%27%27%22%7D%2C%22C2%27%27%22%3A%7B%22parents%22%3A%5B%22C3%27%27%22%5D%2C%22id%22%3A%22C2%27%27%22%7D%2C%22C2%27%27%27%22%3A%7B%22parents%22%3A%5B%22C1%22%5D%2C%22id%22%3A%22C2%27%27%27%22%7D%7D%2C%22HEAD%22%3A%7B%22target%22%3A%22master%22%2C%22id%22%3A%22HEAD%22%7D%7D",solutionCommand:"git rebase -i HEAD~4;git branch -f master C5;git branch -f one C2';git rebase -i HEAD~4;git branch -f master C5;git branch -f two C2'';git rebase -i HEAD~4;git branch -f master C5;git branch -f three C2'''",startTree:'{"branches":{"master":{"target":"C5","id":"master"},"one":{"target":"C1","id":"one"},"two":{"target":"C1","id":"two"},"three":{"target":"C1","id":"three"}},"commits":{"C0":{"parents":[],"id":"C0","rootCommit":true},"C1":{"parents":["C0"],"id":"C1"},"C2":{"parents":["C1"],"id":"C2"},"C3":{"parents":["C2"],"id":"C3"},"C4":{"parents":["C3"],"id":"C4"},"C5":{"parents":["C4"],"id":"C5"}},"HEAD":{"target":"master","id":"HEAD"}}',name:"Branch Spaghetti",hint:"Make sure to do everything in the proper order! Branch one first, then two, then three",startDialog:{childViews:[{type:"ModalAlert",options:{markdowns:["## Branch Spaghetti","","WOAHHHhhh Nelly! We have quite the goal to reach in this level.","","Here we have `master` that is a few commits ahead of branches `one` `two` and `three`. For whatever reason, we need to update these three other branches with modified versions of the last few commits on master.","","Branch `one` needs a re-ordering and a deletion. `two` needs pure reordering, and `three` only needs one commit!","","We will let you figure out how to solve this one -- make sure to check out our solution afterwards with `show solution`. "]}}]}}}),e("/src/levels/rebase/2.js")})();
\ No newline at end of file
diff --git a/index.html b/index.html
index e3657e893..5738a1158 100644
--- a/index.html
+++ b/index.html
@@ -409,7 +409,7 @@
For a much easier time perusing the source, see the individual files at:
https://github.com/pcottle/learnGitBranching
-->
-
+