From 316b23324c185308ce0ae3b432408cbfaffb033f Mon Sep 17 00:00:00 2001
From: Thomas
Date: Thu, 21 Jun 2018 21:23:48 +0200
Subject: [PATCH 001/359] Fix typos
---
src/levels/rampup/reversingChanges.js | 2 +-
src/levels/remote/pushArgs.js | 2 +-
src/levels/remote/pushArgs2.js | 2 +-
3 files changed, 3 insertions(+), 3 deletions(-)
diff --git a/src/levels/rampup/reversingChanges.js b/src/levels/rampup/reversingChanges.js
index f64c1ae0..5619adb5 100644
--- a/src/levels/rampup/reversingChanges.js
+++ b/src/levels/rampup/reversingChanges.js
@@ -68,7 +68,7 @@ exports.level = {
"beforeMarkdowns": [
"## Git Revert",
"",
- "While reseting works great for local branches on your own machine, its method of \"rewriting history\" doesn't work for remote branches that others are using.",
+ "While resetting works great for local branches on your own machine, its 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"
],
diff --git a/src/levels/remote/pushArgs.js b/src/levels/remote/pushArgs.js
index 3b7f236c..7da6ee93 100644
--- a/src/levels/remote/pushArgs.js
+++ b/src/levels/remote/pushArgs.js
@@ -60,7 +60,7 @@ exports.level = {
"",
"translates to this in English:",
"",
- "*Go to the branch named \"master\" in my repository, grab all the commits, and then go to the branch \"master\" on the remote named \"origin.\" Place whatever commits are missing on that branch and then tell me when you're done.*",
+ "*Go to the branch named \"master\" in my repository, grab all the commits, and then go to the branch \"master\" on the remote named \"origin\". Place whatever commits are missing on that branch and then tell me when you're done.*",
"",
"By specifying `master` as the \"place\" argument, we told git where the commits will *come from* and where the commits *will go*. It's essentially the \"place\" or \"location\" to synchronize between the two repositories.",
"",
diff --git a/src/levels/remote/pushArgs2.js b/src/levels/remote/pushArgs2.js
index d9804f94..f333e40e 100644
--- a/src/levels/remote/pushArgs2.js
+++ b/src/levels/remote/pushArgs2.js
@@ -55,7 +55,7 @@ exports.level = {
"",
"`git push origin :`",
"",
- "This is commonly referred to as a colon refspec. Refspec is just a fancy name for a location that git can figure out (like the branch `foo` or even just `HEAD~1`)",
+ "This is commonly referred to as a colon refspec. Refspec is just a fancy name for a location that git can figure out (like the branch `foo` or even just `HEAD~1`)".,
"",
"Once you are specifying both the source and destination independently, you can get quite fancy and precise with remote commands. Let's see a demo!"
]
From 0021fae10e48f8a35b6fc95bc74df8999cb00b99 Mon Sep 17 00:00:00 2001
From: Daniel Le Berre
Date: Sat, 29 Sep 2018 09:34:50 +0200
Subject: [PATCH 002/359] Fix typo in french
---
src/levels/mixed/describe.js | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/src/levels/mixed/describe.js b/src/levels/mixed/describe.js
index 155c0c0a..0424c54c 100644
--- a/src/levels/mixed/describe.js
+++ b/src/levels/mixed/describe.js
@@ -128,7 +128,7 @@
"type": "GitDemonstrationView",
"options": {
"beforeMarkdowns": [
- "Regardons un petit exemple. Prennons cet arbre :"
+ "Regardons un petit exemple. Prenons cet arbre :"
],
"afterMarkdowns": [
"La commande`git describe master` donne le résultat :",
From f77066482ca77f9b1909bf541c5f254e5fb34536 Mon Sep 17 00:00:00 2001
From: Peter Cottle
Date: Sun, 30 Sep 2018 21:23:05 -0700
Subject: [PATCH 003/359] Resolves #484 change solution command
---
src/levels/mixed/grabbingOneCommit.js | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/src/levels/mixed/grabbingOneCommit.js b/src/levels/mixed/grabbingOneCommit.js
index b1096188..6a3482a0 100644
--- a/src/levels/mixed/grabbingOneCommit.js
+++ b/src/levels/mixed/grabbingOneCommit.js
@@ -11,7 +11,7 @@ exports.level = {
"git revert": true
},
"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",
+ "solutionCommand": "git rebase -i master --solution-ordering 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": {
"ko": "딱 한개의 커밋만 가져오기",
From 8d9ae4301d1697ce6ce7b7e380a78135fc2f1ae8 Mon Sep 17 00:00:00 2001
From: Peter Cottle
Date: Sun, 30 Sep 2018 21:25:19 -0700
Subject: [PATCH 004/359] Resolves #484 change solution command
---
src/levels/mixed/grabbingOneCommit.js | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/src/levels/mixed/grabbingOneCommit.js b/src/levels/mixed/grabbingOneCommit.js
index 6a3482a0..3b71c4c6 100644
--- a/src/levels/mixed/grabbingOneCommit.js
+++ b/src/levels/mixed/grabbingOneCommit.js
@@ -11,7 +11,7 @@ exports.level = {
"git revert": true
},
"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 rebase -i master --solution-ordering C4",
+ "solutionCommand": "git checkout master; git rebase -i master --solution-ordering 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": {
"ko": "딱 한개의 커밋만 가져오기",
From cf6fec06e7b8f06013df86a5377da602d20d2908 Mon Sep 17 00:00:00 2001
From: Peter Cottle
Date: Sun, 30 Sep 2018 21:28:01 -0700
Subject: [PATCH 005/359] Resolves #484 change solution command
---
src/levels/mixed/grabbingOneCommit.js | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/src/levels/mixed/grabbingOneCommit.js b/src/levels/mixed/grabbingOneCommit.js
index 3b71c4c6..898cf581 100644
--- a/src/levels/mixed/grabbingOneCommit.js
+++ b/src/levels/mixed/grabbingOneCommit.js
@@ -11,7 +11,7 @@ exports.level = {
"git revert": true
},
"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 rebase -i master --solution-ordering C4",
+ "solutionCommand": "git rebase -i master --solution-ordering C4; git rebase bugFix master",
"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": {
"ko": "딱 한개의 커밋만 가져오기",
From 780f53e226e36bd7062de04d78b6fff6769b55a9 Mon Sep 17 00:00:00 2001
From: Peter Cottle
Date: Sun, 30 Sep 2018 21:47:09 -0700
Subject: [PATCH 006/359] Resolves #486 -- easier to understand button labels
when interactive rebasing
---
src/js/views/rebaseView.js | 1 -
src/style/main.css | 13 +++++++++++++
src/template.index.html | 11 ++++++++---
3 files changed, 21 insertions(+), 4 deletions(-)
diff --git a/src/js/views/rebaseView.js b/src/js/views/rebaseView.js
index ed19ca8f..49403561 100644
--- a/src/js/views/rebaseView.js
+++ b/src/js/views/rebaseView.js
@@ -164,7 +164,6 @@ var RebaseEntryView = Backbone.View.extend({
},
render: function() {
- var json = this.model.toJSON();
this.$el.append(this.template(this.model.toJSON()));
// hacky :( who would have known jquery barfs on ids with %'s and quotes
diff --git a/src/style/main.css b/src/style/main.css
index a5ee34cf..15a23383 100644
--- a/src/style/main.css
+++ b/src/style/main.css
@@ -770,6 +770,19 @@ li.rebaseEntry a#toggleButton {
li.rebaseEntry.notPicked {
opacity: 0.2;
}
+
+li.rebaseEntry.notPicked span.showWhenPicked {
+ display: none;
+}
+
+li.rebaseEntry span.showWhenNotPicked {
+ display: none;
+}
+
+li.rebaseEntry.notPicked span.showWhenNotPicked {
+ display: inline;
+}
+
/* Modal Views */
div.modalView.box.inFront.show {
diff --git a/src/template.index.html b/src/template.index.html
index c5312f4f..e788eb41 100644
--- a/src/template.index.html
+++ b/src/template.index.html
@@ -394,7 +394,7 @@
<% if (solutionOrder && solutionOrder.length) { %>
For the solution, order the commits as
- <%= solutionOrder.join(', ') %>
+ <%= solutionOrder.join(', ') %>. You may need to omit or pick commits.
<% } %>
@@ -452,8 +452,13 @@
<%= id %>
- Pick
-
+
+ Omit
+
+
+ Pick
+
+
From 5e3012cca512e9c5a8bfa21bce5adba2fab88735 Mon Sep 17 00:00:00 2001
From: moskdev
Date: Wed, 17 Oct 2018 22:10:02 +0300
Subject: [PATCH 007/359] Typo fix
---
src/js/dialogs/confirmShowSolution.js | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/src/js/dialogs/confirmShowSolution.js b/src/js/dialogs/confirmShowSolution.js
index 07815bcf..edd92462 100644
--- a/src/js/dialogs/confirmShowSolution.js
+++ b/src/js/dialogs/confirmShowSolution.js
@@ -99,7 +99,7 @@ exports.dialog = {
type: 'ModalAlert',
options: {
markdowns: [
- '## Впевнений, що хошеш побачити розв’язок?',
+ '## Впевнений, що хочеш побачити розв’язок?',
'',
'Я вірю в тебе! Ти впораєшся!'
]
From 85ae115fc20da020bde4976b783d1b324b12f60f Mon Sep 17 00:00:00 2001
From: Peter Cottle
Date: Fri, 19 Oct 2018 11:34:04 +0900
Subject: [PATCH 008/359] Resolves #487
---
src/levels/mixed/jugglingCommits2.js | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/src/levels/mixed/jugglingCommits2.js b/src/levels/mixed/jugglingCommits2.js
index 26fb0a0c..0c2b3615 100644
--- a/src/levels/mixed/jugglingCommits2.js
+++ b/src/levels/mixed/jugglingCommits2.js
@@ -9,7 +9,7 @@ exports.level = {
"goalAsserts": {
"master": [
function(data) {
- return data.C2 > data.C3;
+ return data.C2 >= data.C3;
},
function(data) {
return data.C2 > data.C1;
From c801f9ed46d83686a30c724b0a822b165aaef471 Mon Sep 17 00:00:00 2001
From: Peter Cottle
Date: Fri, 19 Oct 2018 15:08:14 +0900
Subject: [PATCH 009/359] Resolves #488 -- make https-y things links in the
console
---
src/js/react_views/CommandView.jsx | 28 ++++++++++++++++++++--------
src/js/sandbox/index.js | 2 +-
2 files changed, 21 insertions(+), 9 deletions(-)
diff --git a/src/js/react_views/CommandView.jsx b/src/js/react_views/CommandView.jsx
index 362c4a6e..4eb55ebf 100644
--- a/src/js/react_views/CommandView.jsx
+++ b/src/js/react_views/CommandView.jsx
@@ -100,14 +100,26 @@ var CommandView = React.createClass({
var paragraphs = this.state.result.split("\n");
var result = [];
for (var i = 0; i < paragraphs.length; i++) {
- result.push(
-
- );
+ if (paragraphs[i].startsWith('https://')) {
+ result.push(
+
+ );
+ } else {
+ result.push(
+
+ );
+ }
}
return (
diff --git a/src/js/sandbox/index.js b/src/js/sandbox/index.js
index c9131e23..1227cfdb 100644
--- a/src/js/sandbox/index.js
+++ b/src/js/sandbox/index.js
@@ -228,7 +228,7 @@ var Sandbox = Backbone.View.extend({
var url =
'https://learngitbranching.js.org/?NODEMO&command=importTreeNow%20' + escape(treeJSON);
command.setResult(
- intl.todo('Here is a link to the current state of the tree: ') + url
+ intl.todo('Here is a link to the current state of the tree: ') + '\n' + url
);
command.finishWith(deferred);
},
From d828f0e0a0280ba049a438d92b4a8d21c71812b2 Mon Sep 17 00:00:00 2001
From: PanAeon
Date: Mon, 22 Oct 2018 14:21:02 +0100
Subject: [PATCH 010/359] Set html lang and meta http-equiv="content-language"
attr on language change.
---
src/js/app/index.js | 5 ++++-
src/template.index.html | 3 ++-
2 files changed, 6 insertions(+), 2 deletions(-)
diff --git a/src/js/app/index.js b/src/js/app/index.js
index 69e1fdce..21617d54 100644
--- a/src/js/app/index.js
+++ b/src/js/app/index.js
@@ -5,6 +5,7 @@ var React = require('react');
var assign = require('object-assign');
var util = require('../util');
var intl = require('../intl');
+var _ = require('underscore');
var LocaleStore = require('../stores/LocaleStore');
var LocaleActions = require('../actions/LocaleActions');
@@ -88,6 +89,9 @@ var vcsModeRefresh = function(eventData) {
var intlRefresh = function() {
if (!window.$) { return; }
+ var countryCode = LocaleStore.getLocale().replace(/_(.*)$/i, "");
+ $("html").attr('lang', countryCode);
+ $("meta[http-equiv='content-language']").attr("content", countryCode);
$('span.intl-aware').each(function(i, el) {
var intl = require('../intl');
var key = $(el).attr('data-intl');
@@ -328,4 +332,3 @@ exports.getLevelDropdown = function() {
};
exports.init = init;
-
diff --git a/src/template.index.html b/src/template.index.html
index e788eb41..5fbc5fd6 100644
--- a/src/template.index.html
+++ b/src/template.index.html
@@ -12,6 +12,7 @@
+
@@ -458,7 +459,7 @@
Pick
-
+
From 89f3a5177b830d03e1d7777174ae264c8e9944ac Mon Sep 17 00:00:00 2001
From: PanAeon
Date: Mon, 22 Oct 2018 16:47:20 +0100
Subject: [PATCH 011/359] Generate alternate url for different locales so
search engine could find them all.
---
src/js/app/index.js | 20 +++++++++++++++++++-
src/js/stores/LocaleStore.js | 7 +++++++
2 files changed, 26 insertions(+), 1 deletion(-)
diff --git a/src/js/app/index.js b/src/js/app/index.js
index 69e1fdce..072b7945 100644
--- a/src/js/app/index.js
+++ b/src/js/app/index.js
@@ -1,6 +1,7 @@
var Backbone = require('backbone');
var EventEmitter = require('events').EventEmitter;
var React = require('react');
+var _ = require('underscore');
var assign = require('object-assign');
var util = require('../util');
@@ -86,6 +87,22 @@ var vcsModeRefresh = function(eventData) {
$('body').toggleClass('hgMode', !isGit);
};
+var insertAlternateLinks = function(pageId) {
+ // For now pageId is null, which would link to the main page.
+ // In future if pageId is provided this method should link to a specific page
+
+ // The value of the hreflang attribute identifies the language (in ISO 639-1 format)
+ // and optionally a region (in ISO 3166-1 Alpha 2 format) of an alternate URL
+ var altLinks = _.map(LocaleStore.getSupportedLocales(), function(langCode) {
+ var url = "https://learngitbranching.js.org/?locale=" + langCode;
+ return '';
+ });
+ var defaultUrl = "https://learngitbranching.js.org/?locale=" + LocaleStore.getDefaultLocale();
+ altLinks.push('');
+ $('head').prepend(altLinks);
+
+};
+
var intlRefresh = function() {
if (!window.$) { return; }
$('span.intl-aware').each(function(i, el) {
@@ -249,6 +266,8 @@ var initDemo = function(sandbox) {
tryLocaleDetect();
}
+ insertAlternateLinks();
+
if (params.command) {
var command = unescape(params.command);
sandbox.mainVis.customEvents.on('gitEngineReady', function() {
@@ -328,4 +347,3 @@ exports.getLevelDropdown = function() {
};
exports.init = init;
-
diff --git a/src/js/stores/LocaleStore.js b/src/js/stores/LocaleStore.js
index 3b1a27b4..227bdd67 100644
--- a/src/js/stores/LocaleStore.js
+++ b/src/js/stores/LocaleStore.js
@@ -3,6 +3,7 @@
var AppConstants = require('../constants/AppConstants');
var AppDispatcher = require('../dispatcher/AppDispatcher');
var EventEmitter = require('events').EventEmitter;
+var _ = require('underscore');
var assign = require('object-assign');
@@ -30,6 +31,8 @@ var headerLocaleMap = {
'pt-BR': 'pt_BR'
};
+var supportedLocalesList = _.values(langLocaleMap).concat(_.values(headerLocaleMap));
+
function _getLocaleFromHeader(langString) {
var languages = langString.split(',');
var desiredLocale;
@@ -73,6 +76,10 @@ AppConstants.StoreSubscribePrototype,
return _locale;
},
+ getSupportedLocales: function() {
+ return assign({}, supportedLocalesList);
+ },
+
dispatchToken: AppDispatcher.register(function(payload) {
var action = payload.action;
var shouldInform = false;
From d26d9c467410edd2e4a18af7aa87b4dd578c9e85 Mon Sep 17 00:00:00 2001
From: PanAeon
Date: Mon, 22 Oct 2018 17:41:48 +0100
Subject: [PATCH 012/359] Set html lang, remove unused import
---
src/js/app/index.js | 1 -
1 file changed, 1 deletion(-)
diff --git a/src/js/app/index.js b/src/js/app/index.js
index 21617d54..7dccef74 100644
--- a/src/js/app/index.js
+++ b/src/js/app/index.js
@@ -5,7 +5,6 @@ var React = require('react');
var assign = require('object-assign');
var util = require('../util');
var intl = require('../intl');
-var _ = require('underscore');
var LocaleStore = require('../stores/LocaleStore');
var LocaleActions = require('../actions/LocaleActions');
From ff37a369daf71f223dc3dbf187ef6f335905537d Mon Sep 17 00:00:00 2001
From: PanAeon
Date: Mon, 22 Oct 2018 17:55:54 +0100
Subject: [PATCH 013/359] Small fix - replace regex with string split
---
src/js/app/index.js | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/src/js/app/index.js b/src/js/app/index.js
index 7dccef74..8bcb0acc 100644
--- a/src/js/app/index.js
+++ b/src/js/app/index.js
@@ -88,7 +88,7 @@ var vcsModeRefresh = function(eventData) {
var intlRefresh = function() {
if (!window.$) { return; }
- var countryCode = LocaleStore.getLocale().replace(/_(.*)$/i, "");
+ var countryCode = LocaleStore.getLocale().split("_")[0];
$("html").attr('lang', countryCode);
$("meta[http-equiv='content-language']").attr("content", countryCode);
$('span.intl-aware').each(function(i, el) {
From 9d14feb1b39751ebddcd39efed3444bc25413381 Mon Sep 17 00:00:00 2001
From: PanAeon
Date: Wed, 24 Oct 2018 11:12:48 +0100
Subject: [PATCH 014/359] Requested changes - removed underscore and sorted out
duplicates in locales
---
src/js/app/index.js | 4 ++--
src/js/stores/LocaleStore.js | 7 ++++---
2 files changed, 6 insertions(+), 5 deletions(-)
diff --git a/src/js/app/index.js b/src/js/app/index.js
index 072b7945..82e66870 100644
--- a/src/js/app/index.js
+++ b/src/js/app/index.js
@@ -1,7 +1,6 @@
var Backbone = require('backbone');
var EventEmitter = require('events').EventEmitter;
var React = require('react');
-var _ = require('underscore');
var assign = require('object-assign');
var util = require('../util');
@@ -93,7 +92,8 @@ var insertAlternateLinks = function(pageId) {
// The value of the hreflang attribute identifies the language (in ISO 639-1 format)
// and optionally a region (in ISO 3166-1 Alpha 2 format) of an alternate URL
- var altLinks = _.map(LocaleStore.getSupportedLocales(), function(langCode) {
+
+ var altLinks = LocaleStore.getSupportedLocales().map(function(langCode) {
var url = "https://learngitbranching.js.org/?locale=" + langCode;
return '';
});
diff --git a/src/js/stores/LocaleStore.js b/src/js/stores/LocaleStore.js
index 227bdd67..544a5af7 100644
--- a/src/js/stores/LocaleStore.js
+++ b/src/js/stores/LocaleStore.js
@@ -3,7 +3,6 @@
var AppConstants = require('../constants/AppConstants');
var AppDispatcher = require('../dispatcher/AppDispatcher');
var EventEmitter = require('events').EventEmitter;
-var _ = require('underscore');
var assign = require('object-assign');
@@ -31,7 +30,9 @@ var headerLocaleMap = {
'pt-BR': 'pt_BR'
};
-var supportedLocalesList = _.values(langLocaleMap).concat(_.values(headerLocaleMap));
+var supportedLocalesList = Object.values(langLocaleMap)
+ .concat(Object.values(headerLocaleMap))
+ .filter(function (value, index, self) { return self.indexOf(value) === index;});
function _getLocaleFromHeader(langString) {
var languages = langString.split(',');
@@ -77,7 +78,7 @@ AppConstants.StoreSubscribePrototype,
},
getSupportedLocales: function() {
- return assign({}, supportedLocalesList);
+ return supportedLocalesList.slice();
},
dispatchToken: AppDispatcher.register(function(payload) {
From 7c8c3f4892ba1a5d7b4f7174d66e2b5d973a21df Mon Sep 17 00:00:00 2001
From: Peter Cottle
Date: Wed, 24 Oct 2018 12:36:12 -0700
Subject: [PATCH 015/359] Followup to PR #471 -- json issue
---
src/levels/remote/pushArgs2.js | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/src/levels/remote/pushArgs2.js b/src/levels/remote/pushArgs2.js
index f333e40e..8e15cf6f 100644
--- a/src/levels/remote/pushArgs2.js
+++ b/src/levels/remote/pushArgs2.js
@@ -55,7 +55,7 @@ exports.level = {
"",
"`git push origin :`",
"",
- "This is commonly referred to as a colon refspec. Refspec is just a fancy name for a location that git can figure out (like the branch `foo` or even just `HEAD~1`)".,
+ "This is commonly referred to as a colon refspec. Refspec is just a fancy name for a location that git can figure out (like the branch `foo` or even just `HEAD~1`).",
"",
"Once you are specifying both the source and destination independently, you can get quite fancy and precise with remote commands. Let's see a demo!"
]
From 27eac27653b28f6a9b625d8b80553c3137887677 Mon Sep 17 00:00:00 2001
From: paikwiki
Date: Thu, 1 Nov 2018 17:01:48 +0900
Subject: [PATCH 016/359] Fix typo
---
src/levels/intro/rebasing.js | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/src/levels/intro/rebasing.js b/src/levels/intro/rebasing.js
index d3358634..6d7c2f47 100644
--- a/src/levels/intro/rebasing.js
+++ b/src/levels/intro/rebasing.js
@@ -575,7 +575,7 @@ exports.level = {
"",
"브랜치끼리의 작업을 접목하는 두번째 방법은 *리베이스(rebase)*입니다. 리베이스는 기본적으로 커밋들을 모아서 복사한 뒤, 다른 곳에 떨궈 놓는 것입니다.",
"",
- "조금 어려게 느껴질 수 있지만, 리베이스를 하면 커밋들의 흐름을 보기 좋게 한 줄로 만들 수 있다는 장점이 있습니다. 리베이스를 쓰면 저장소의 커밋 로그와 이력이 한결 깨끗해집니다.",
+ "조금 어렵게 느껴질 수 있지만, 리베이스를 하면 커밋들의 흐름을 보기 좋게 한 줄로 만들 수 있다는 장점이 있습니다. 리베이스를 쓰면 저장소의 커밋 로그와 이력이 한결 깨끗해집니다.",
"",
"어떻게 동작하는지 살펴볼까요..."
]
From 1ed0d3158696823092e8db876f4bd5a92d2e0594 Mon Sep 17 00:00:00 2001
From: Peter Cottle
Date: Wed, 14 Nov 2018 19:22:19 -0800
Subject: [PATCH 017/359] Resolves #497 -- fix unescaping random content from
terminal (more)
---
src/js/util/index.js | 3 ++-
1 file changed, 2 insertions(+), 1 deletion(-)
diff --git a/src/js/util/index.js b/src/js/util/index.js
index ceab3013..51944aed 100644
--- a/src/js/util/index.js
+++ b/src/js/util/index.js
@@ -24,7 +24,8 @@ exports.splitTextCommand = function(value, func, context) {
.replace(/^(\s+)/, '')
.replace(/(\s+)$/, '')
.replace(/"/g, '"')
- .replace(/'/g, "'");
+ .replace(/'/g, "'")
+ .replace(///g, "/");
if (index > 0 && !command.length) {
return;
From bf32cf6cd2865b4e93ad89ebb1c5a5810abbe416 Mon Sep 17 00:00:00 2001
From: CookieCompiler
Date: Mon, 26 Nov 2018 21:15:13 +0100
Subject: [PATCH 018/359] fixed typo in german translation
---
src/levels/mixed/tags.js | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/src/levels/mixed/tags.js b/src/levels/mixed/tags.js
index 69285b00..1e00da6a 100644
--- a/src/levels/mixed/tags.js
+++ b/src/levels/mixed/tags.js
@@ -375,7 +375,7 @@
"Lass uns ein Tag bei `C1` anlegen und damit die Version 1 unseres Prototyps markieren."
],
"afterMarkdowns": [
- "Peng! Ziemlich einfach. Wir haben das Tag `v1` genannt und lassen es auf `C1` zeigen. Wenn du den Commit weglässt wir das Tag für den Commit erzeugt, auf den `HEAD` zeigt."
+ "Peng! Ziemlich einfach. Wir haben das Tag `v1` genannt und lassen es auf `C1` zeigen. Wenn du den Commit weglässt wird das Tag für den Commit erzeugt, auf den `HEAD` zeigt."
],
"command": "git tag v1 C1",
"beforeCommand": "git commit"
From c339e4b0ca61bdd7ee0d036c0534ab9b0600c235 Mon Sep 17 00:00:00 2001
From: Roger Lee
Date: Wed, 28 Nov 2018 10:57:14 +0800
Subject: [PATCH 019/359] update zh_cn translation in describe.js
---
src/levels/mixed/describe.js | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/src/levels/mixed/describe.js b/src/levels/mixed/describe.js
index 0424c54c..167cf55c 100644
--- a/src/levels/mixed/describe.js
+++ b/src/levels/mixed/describe.js
@@ -23,7 +23,7 @@
"es_AR": "Simplemente commiteá una vez en bugFix cuando estés listo para seguir",
"pt_BR": "Simplesmente commite uma vez em bugFix quando quiser parar de experimentar",
"zh_TW": "當你要移動的時候,只要在 bugFix 上面 commit 就好了",
- "zh_CN": "在 bugFix 上面提交一次就可以了",
+ "zh_CN": "当你准备好时,在 bugFix 分支上面提交一次就可以了",
"ru_RU": "Когда закончишь, просто сделай commit",
"ko" : "다음으로 넘어가고 싶으면 bugFix를 한번 커밋하면 됩니다.",
"uk" : "Просто зроби один коміт в bugFix коли ти будеш готовий іти далі"
From c8344966dadb88fb2c3a99d06c3ecc7e0a220afe Mon Sep 17 00:00:00 2001
From: Sreeram Venkitesh <40194401+fillerInk@users.noreply.github.com>
Date: Wed, 28 Nov 2018 21:06:32 +0530
Subject: [PATCH 020/359] corrected grammatical error in readme.md
updated the readme.md file and corrected some grammatical mistakes. Added more lines to increase clarity.
---
README.md | 4 ++--
1 file changed, 2 insertions(+), 2 deletions(-)
diff --git a/README.md b/README.md
index b19d022b..371266bc 100644
--- a/README.md
+++ b/README.md
@@ -2,7 +2,7 @@
[](https://travis-ci.org/pcottle/learnGitBranching)
-LearnGitBranching is a git repository visualizer, sandbox, and series of educational tutorials and challenges. Its primary purpose is to help developers understand git through the power of visualization (something that's absent when working on the command line).
+LearnGitBranching is a git repository visualizer, sandbox, and a series of educational tutorials and challenges. Its primary purpose is to help developers understand git through the power of visualization (something that's absent when working on the command line). This is achieved through a game with different levels to get acquainted with the different git commands.
You can input a variety of commands into LearnGitBranching (LGB) -- as commands are processed, the nearby commit tree will dynamically update to reflect the effects of each command:
@@ -11,7 +11,7 @@ You can input a variety of commands into LearnGitBranching (LGB) -- as commands
This visualization combined with tutorials and "levels" can help both beginners and intermediate developers polish their version control skills. A quick demo is available here:
https://pcottle.github.com/learnGitBranching/?demo
-Or you can launch the application normally here:
+Or, you can launch the application normally here:
https://pcottle.github.com/learnGitBranching/
### Sandbox Mode
From 5e8d83536e7257add533fedcf5b7f9e43ed8c89f Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?=EF=BC=A8=EF=BD=8F=EF=BD=8E=EF=BD=87=EF=BD=81=EF=BD=92?=
=?UTF-8?q?=EF=BD=83?=
Date: Wed, 28 Nov 2018 23:25:18 +0700
Subject: [PATCH 021/359] Fixed typos in comments and strings
---
src/js/graph/treeCompare.js | 4 ++--
1 file changed, 2 insertions(+), 2 deletions(-)
diff --git a/src/js/graph/treeCompare.js b/src/js/graph/treeCompare.js
index 0cf71286..132782bd 100644
--- a/src/js/graph/treeCompare.js
+++ b/src/js/graph/treeCompare.js
@@ -164,7 +164,7 @@ TreeCompare.compareBranchesWithinTreesHashAgnostic = function(treeA, treeB, bran
return false;
}
- // dont mess up the rest of comparison
+ // don't mess up the rest of comparison
branchA = _.clone(branchA);
branchB = _.clone(branchB);
branchA.target = this.getBaseRef(branchA.target);
@@ -251,7 +251,7 @@ TreeCompare.getNumHashes = function(ref) {
return func(results);
}
}
- throw new Error('couldnt parse ref ' + ref);
+ throw new Error('couldn\'t parse ref ' + ref);
};
TreeCompare.getBaseRef = function(ref) {
From 694f414e224fde50b650194abca6c60160789e3e Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?=EF=BC=A8=EF=BD=8F=EF=BD=8E=EF=BD=87=EF=BD=81=EF=BD=92?=
=?UTF-8?q?=EF=BD=83?=
Date: Thu, 29 Nov 2018 01:34:58 +0700
Subject: [PATCH 022/359] Fixed typos in comments and strings
---
__tests__/base.js | 2 +-
__tests__/remote.spec.js | 8 ++++----
src/js/app/index.js | 2 +-
src/js/commands/index.js | 2 +-
src/js/git/commands.js | 4 ++--
src/js/git/headless.js | 2 +-
src/js/git/index.js | 30 ++++++++++++++--------------
src/js/level/builder.js | 8 ++++----
src/js/level/index.js | 4 ++--
src/js/level/parseWaterfall.js | 2 +-
src/js/models/commandModel.js | 2 +-
src/js/util/eventBaton.js | 4 ++--
src/js/views/builderViews.js | 2 +-
src/js/views/gitDemonstrationView.js | 4 ++--
src/js/visuals/index.js | 4 ++--
src/js/visuals/visBase.js | 2 +-
src/js/visuals/visBranch.js | 2 +-
src/js/visuals/visNode.js | 2 +-
src/js/visuals/visTag.js | 2 +-
src/js/visuals/visualization.js | 2 +-
todo.txt | 2 +-
21 files changed, 46 insertions(+), 46 deletions(-)
diff --git a/__tests__/base.js b/__tests__/base.js
index a8d5ab32..76a6ec7f 100644
--- a/__tests__/base.js
+++ b/__tests__/base.js
@@ -26,7 +26,7 @@ var getHeadlessSummary = function(headless) {
var expectLevelAsync = function(headless, levelBlob) {
var command = levelBlob.solutionCommand;
if (command.indexOf('git rebase -i') !== -1) {
- // dont do interactive rebase levels
+ // don't do interactive rebase levels
return;
}
diff --git a/__tests__/remote.spec.js b/__tests__/remote.spec.js
index 9f5f51e6..deff3562 100644
--- a/__tests__/remote.spec.js
+++ b/__tests__/remote.spec.js
@@ -261,7 +261,7 @@ describe('Git Remotes', function() {
);
});
- it('doesnt fetch if out of sync, but will update explicit dest if specified', function() {
+ it('doesn\'t fetch if out of sync, but will update explicit dest if specified', function() {
expectTreeAsync(
'git clone; git fakeTeamwork; go HEAD~1; git fetch origin master:master;go master; gc; go HEAD~1; git fakeTeamwork;git fetch origin master:master',
'{"branches":{"master":{"target":"C3","id":"master","remoteTrackingBranchID":"o/master"},"o/master":{"target":"C1","id":"o/master","remoteTrackingBranchID":null}},"commits":{"C0":{"parents":[],"id":"C0","rootCommit":true},"C1":{"parents":["C0"],"id":"C1"},"C2":{"parents":["C1"],"id":"C2"},"C3":{"parents":["C2"],"id":"C3"}},"HEAD":{"target":"C2","id":"HEAD"},"originTree":{"branches":{"master":{"target":"C4","id":"master","remoteTrackingBranchID":null}},"commits":{"C0":{"parents":[],"id":"C0","rootCommit":true},"C1":{"parents":["C0"],"id":"C1"},"C2":{"parents":["C1"],"id":"C2"},"C4":{"parents":["C2"],"id":"C4"}},"HEAD":{"target":"master","id":"HEAD"}}}'
@@ -304,14 +304,14 @@ describe('Git Remotes', function() {
);
});
- it('doesnt let you fetch to master if you are checked out there', function() {
+ it('doesn\'t let you fetch to master if you are checked out there', function() {
expectTreeAsync(
'git clone; git push origin master:foo; git fakeTeamwork foo 2; git fetch origin foo^:blah; git fetch foo:master',
'{"branches":{"master":{"target":"C1","id":"master","remoteTrackingBranchID":"o/master"},"o/master":{"target":"C1","id":"o/master","remoteTrackingBranchID":null},"o/foo":{"target":"C1","id":"o/foo","remoteTrackingBranchID":null},"blah":{"target":"C2","id":"blah","remoteTrackingBranchID":null}},"commits":{"C0":{"parents":[],"id":"C0","rootCommit":true},"C1":{"parents":["C0"],"id":"C1"},"C2":{"parents":["C1"],"id":"C2"}},"HEAD":{"target":"master","id":"HEAD"},"originTree":{"branches":{"master":{"target":"C1","id":"master","remoteTrackingBranchID":null},"foo":{"target":"C3","id":"foo","remoteTrackingBranchID":null}},"commits":{"C0":{"parents":[],"id":"C0","rootCommit":true},"C1":{"parents":["C0"],"id":"C1"},"C2":{"parents":["C1"],"id":"C2"},"C3":{"parents":["C2"],"id":"C3"}},"HEAD":{"target":"foo","id":"HEAD"}}}'
);
});
- it('doesnt let you delete branches that dont exist', function() {
+ it('doesn\'t let you delete branches that don\'t exist', function() {
expectTreeAsync(
'git clone; git push origin :foo',
'{"branches":{"master":{"target":"C1","id":"master","remoteTrackingBranchID":"o/master"},"o/master":{"target":"C1","id":"o/master","remoteTrackingBranchID":null}},"commits":{"C0":{"parents":[],"id":"C0","rootCommit":true},"C1":{"parents":["C0"],"id":"C1"}},"HEAD":{"target":"master","id":"HEAD"},"originTree":{"branches":{"master":{"target":"C1","id":"master","remoteTrackingBranchID":null}},"commits":{"C0":{"parents":[],"id":"C0","rootCommit":true},"C1":{"parents":["C0"],"id":"C1"}},"HEAD":{"target":"master","id":"HEAD"}}}'
@@ -325,7 +325,7 @@ describe('Git Remotes', function() {
);
});
- it('makes a new branch from pull and doesnt bork', function() {
+ it('makes a new branch from pull and doesn\'t bork', function() {
expectTreeAsync(
'git clone; git pull origin :bar',
'{"branches":{"master":{"target":"C1","id":"master","remoteTrackingBranchID":"o/master"},"o/master":{"target":"C1","id":"o/master","remoteTrackingBranchID":null},"bar":{"target":"C1","id":"bar","remoteTrackingBranchID":null}},"commits":{"C0":{"parents":[],"id":"C0","rootCommit":true},"C1":{"parents":["C0"],"id":"C1"}},"HEAD":{"target":"master","id":"HEAD"},"originTree":{"branches":{"master":{"target":"C1","id":"master","remoteTrackingBranchID":null}},"commits":{"C0":{"parents":[],"id":"C0","rootCommit":true},"C1":{"parents":["C0"],"id":"C1"}},"HEAD":{"target":"master","id":"HEAD"}}}'
diff --git a/src/js/app/index.js b/src/js/app/index.js
index cf5f5cde..6c34800d 100644
--- a/src/js/app/index.js
+++ b/src/js/app/index.js
@@ -165,7 +165,7 @@ var initRootEvents = function(eventBaton) {
var initDemo = function(sandbox) {
var params = util.parseQueryString(window.location.href);
- // being the smart programmer I am (not), I dont include a true value on demo, so
+ // being the smart programmer I am (not), I don't include a true value on demo, so
// I have to check if the key exists here
var commands;
if (/(iPhone|iPod|iPad).*AppleWebKit/i.test(navigator.userAgent) || /android/i.test(navigator.userAgent)) {
diff --git a/src/js/commands/index.js b/src/js/commands/index.js
index a6045417..2f896e1c 100644
--- a/src/js/commands/index.js
+++ b/src/js/commands/index.js
@@ -16,7 +16,7 @@ var commandConfigs = {
var commands = {
execute: function(vcs, name, engine, commandObj) {
if (!commandConfigs[vcs][name]) {
- throw new Error('i dont have a command for ' + name);
+ throw new Error('i don\'t have a command for ' + name);
}
var config = commandConfigs[vcs][name];
if (config.delegate) {
diff --git a/src/js/git/commands.js b/src/js/git/commands.js
index 76a9165e..fb90d208 100644
--- a/src/js/git/commands.js
+++ b/src/js/git/commands.js
@@ -107,7 +107,7 @@ var assertBranchIsRemoteTracking = function(engine, branchName) {
if (!tracking) {
throw new GitError({
msg: intl.todo(
- branchName + ' is not a remote tracking branch! I dont know where to push'
+ branchName + ' is not a remote tracking branch! I don\'t know where to push'
)
});
}
@@ -519,7 +519,7 @@ var commandConfig = {
command.addWarning(
intl.str('git-warning-hard')
);
- // dont absorb the arg off of --hard
+ // don't absorb the arg off of --hard
generalArgs = generalArgs.concat(commandOptions['--hard']);
}
diff --git a/src/js/git/headless.js b/src/js/git/headless.js
index ffc7187a..a82081b9 100644
--- a/src/js/git/headless.js
+++ b/src/js/git/headless.js
@@ -36,7 +36,7 @@ function getMockFactory() {
};
mockFactory.highlightEachWithPromise = function(chain, toRebase, destBranch) {
- // dont add any steps
+ // don't add any steps
return chain;
};
diff --git a/src/js/git/index.js b/src/js/git/index.js
index f0188246..e38b9934 100644
--- a/src/js/git/index.js
+++ b/src/js/git/index.js
@@ -61,7 +61,7 @@ GitEngine.prototype.initUniqueID = function() {
GitEngine.prototype.handleModeChange = function(vcs, callback) {
if (this.mode === vcs) {
- // dont fire event aggressively
+ // don't fire event aggressively
callback();
return;
}
@@ -96,8 +96,8 @@ GitEngine.prototype.setMode = function(vcs) {
deferred.resolve();
var chain = deferred.promise;
- // this stuff is tricky because we dont animate when
- // we didnt do anything, but we DO animate when
+ // this stuff is tricky because we don't animate when
+ // we didn't do anything, but we DO animate when
// either of the operations happen. so a lot of
// branching ahead...
var neededUpdate = this.updateAllBranchesForHg();
@@ -318,7 +318,7 @@ GitEngine.prototype.instantiateFromTree = function(tree) {
if (tree.originTree) {
var treeString = JSON.stringify(tree.originTree);
- // if we dont have an animation queue (like when loading
+ // if we don't have an animation queue (like when loading
// right away), just go ahead and make an empty one
this.animationQueue = this.animationQueue || new AnimationQueue({
callback: function() {}
@@ -434,7 +434,7 @@ GitEngine.prototype.findCommonAncestorForRemote = function(myTarget) {
return this.getCommonAncestor(
leftTarget,
rightTarget,
- true // dont throw since we dont know the order here.
+ true // don't throw since we don't know the order here.
).get('id');
};
@@ -451,7 +451,7 @@ GitEngine.prototype.findCommonAncestorWithRemote = function(originTarget) {
// Like above, could have two parents
var leftTarget = this.findCommonAncestorWithRemote(parents[0].get('id'));
var rightTarget = this.findCommonAncestorWithRemote(parents[1].get('id'));
- return this.getCommonAncestor(leftTarget, rightTarget, true /* dont throw */).get('id');
+ return this.getCommonAncestor(leftTarget, rightTarget, true /* don't throw */).get('id');
};
GitEngine.prototype.makeBranchOnOriginAndTrack = function(branchName, target) {
@@ -1113,7 +1113,7 @@ GitEngine.prototype.push = function(options) {
if (!commitsToMake.length) {
if (!options.force) {
// We are already up to date, and we cant be deleting
- // either since we dont have --force
+ // either since we don't have --force
throw new GitError({
msg: intl.str('git-error-origin-fetch-uptodate')
});
@@ -1133,7 +1133,7 @@ GitEngine.prototype.push = function(options) {
// now here is the tricky part -- the difference between local master
// and remote master might be commits C2, C3, and C4, but the remote
- // might already have those commits. In this case, we dont need to
+ // might already have those commits. In this case, we don't need to
// make them, so filter these out
commitsToMake = _.filter(commitsToMake, function(commitJSON) {
return !this.origin.refs[commitJSON.id];
@@ -1307,7 +1307,7 @@ GitEngine.prototype.fetchCore = function(sourceDestPairs, options) {
// now here is the tricky part -- the difference between local master
// and remote master might be commits C2, C3, and C4, but we
- // might already have those commits. In this case, we dont need to
+ // might already have those commits. In this case, we don't need to
// make them, so filter these out
commitsToMake = _.filter(commitsToMake, function(commitJSON) {
return !this.refs[commitJSON.id];
@@ -1617,7 +1617,7 @@ GitEngine.prototype.resolveName = function(someRef) {
GitEngine.prototype.resolveID = function(idOrTarget) {
if (idOrTarget === null || idOrTarget === undefined) {
- throw new Error('Dont call this with null / undefined');
+ throw new Error('Don\'t call this with null / undefined');
}
if (typeof idOrTarget !== 'string') {
@@ -1823,7 +1823,7 @@ GitEngine.prototype.pruneTreeAndPlay = function() {
GitEngine.prototype.pruneTree = function() {
var set = this.getUpstreamBranchSet();
- // dont prune commits that HEAD depends on
+ // don't prune commits that HEAD depends on
var headSet = Graph.getUpstreamSet(this, 'HEAD');
_.each(headSet, function(val, commitID) {
set[commitID] = true;
@@ -2238,7 +2238,7 @@ GitEngine.prototype.rebaseInteractiveTest = function(targetSource, currentLocati
if (extraCommits.length > 0) {
throw new GitError({
- msg: intl.todo('Hey those commits dont exist in the set!')
+ msg: intl.todo('Hey those commits don\'t exist in the set!')
});
}
}
@@ -2290,7 +2290,7 @@ GitEngine.prototype.rebaseInteractive = function(targetSource, currentLocation,
_.each(options.initialCommitOrdering[0].split(','), function(id) {
if (!rebaseMap[id]) {
throw new GitError({
- msg: intl.todo('Hey those commits dont exist in the set!')
+ msg: intl.todo('Hey those commits don\'t exist in the set!')
});
}
initialCommitOrdering.push(id);
@@ -2326,7 +2326,7 @@ GitEngine.prototype.filterRebaseCommits = function(
}
// we ALSO need to throw out commits that will do the same changes. like
- // if the upstream set has a commit C4 and we have C4', we dont rebase the C4' again.
+ // if the upstream set has a commit C4 and we have C4', we don't rebase the C4' again.
var baseID = this.scrapeBaseID(commit.get('id'));
if (changesAlreadyMade[baseID]) {
return false;
@@ -2787,7 +2787,7 @@ GitEngine.prototype.log = function(ref, omitSet) {
GitEngine.prototype.getCommonAncestor = function(ancestor, cousin, dontThrow) {
if (this.isUpstreamOf(cousin, ancestor) && !dontThrow) {
- throw new Error('Dont use common ancestor if we are upstream!');
+ throw new Error('Don\'t use common ancestor if we are upstream!');
}
var upstreamSet = Graph.getUpstreamSet(this, ancestor);
diff --git a/src/js/level/builder.js b/src/js/level/builder.js
index d3e7b1a2..bcb3d552 100644
--- a/src/js/level/builder.js
+++ b/src/js/level/builder.js
@@ -271,7 +271,7 @@ var LevelBuilder = Level.extend({
this.startDialogObj = levelObj;
}.bind(this))
.fail(function() {
- // nothing to do, they dont want to edit it apparently
+ // nothing to do, they don't want to edit it apparently
})
.done(function() {
if (command) {
@@ -340,7 +340,7 @@ var LevelBuilder = Level.extend({
return whenEditedDialog.promise;
}.bind(this))
.fail(function() {
- // if they dont want to edit the start dialog, do nothing
+ // if they don't want to edit the start dialog, do nothing
})
.done(function() {
askForStartDeferred.resolve();
@@ -385,14 +385,14 @@ var LevelBuilder = Level.extend({
'help builder': LevelBuilder.__super__.startDialog
};
if (!methodMap[command.get('method')]) {
- throw new Error('woah we dont support that method yet');
+ throw new Error('woah we don\'t support that method yet');
}
methodMap[command.get('method')].apply(this, arguments);
},
afterCommandDefer: function(defer, command) {
- // we dont need to compare against the goal anymore
+ // we don't need to compare against the goal anymore
defer.resolve();
},
diff --git a/src/js/level/index.js b/src/js/level/index.js
index 3466ce66..62b6a364 100644
--- a/src/js/level/index.js
+++ b/src/js/level/index.js
@@ -401,7 +401,7 @@ var Level = Sandbox.extend({
doesCommandCountTowardsTotal: function(command) {
if (command.get('error')) {
- // dont count errors towards our count
+ // don't count errors towards our count
return false;
}
@@ -645,7 +645,7 @@ var Level = Sandbox.extend({
};
var method = methodMap[command.get('method')];
if (!method) {
- throw new Error('woah we dont support that method yet', method);
+ throw new Error('woah we don\'t support that method yet', method);
}
method.apply(this, [command, defer]);
diff --git a/src/js/level/parseWaterfall.js b/src/js/level/parseWaterfall.js
index da48b6f9..4a711f4f 100644
--- a/src/js/level/parseWaterfall.js
+++ b/src/js/level/parseWaterfall.js
@@ -27,7 +27,7 @@ ParseWaterfall.prototype.initParseWaterfall = function() {
return;
}
- // by deferring the initialization here, we dont require()
+ // by deferring the initialization here, we don't require()
// level too early (which barfs our init)
this.parseWaterfall = this.options.parseWaterfall || [
Commands.parse,
diff --git a/src/js/models/commandModel.js b/src/js/models/commandModel.js
index 9fd1a104..a8264ba6 100644
--- a/src/js/models/commandModel.js
+++ b/src/js/models/commandModel.js
@@ -43,7 +43,7 @@ var Command = Backbone.Model.extend({
},
initDefaults: function() {
- // weird things happen with defaults if you dont
+ // weird things happen with defaults if you don't
// make new objects
this.set('generalArgs', []);
this.set('supportedMap', {});
diff --git a/src/js/util/eventBaton.js b/src/js/util/eventBaton.js
index e6059d43..fcfe4479 100644
--- a/src/js/util/eventBaton.js
+++ b/src/js/util/eventBaton.js
@@ -76,7 +76,7 @@ EventBaton.prototype.passBatonBack = function(name, func, context, args) {
}
});
if (indexBefore === undefined) {
- throw new Error('you are the last baton holder! or i didnt find you');
+ throw new Error('you are the last baton holder! or i didn\'t find you');
}
var toCallObj = listeners[indexBefore];
@@ -105,7 +105,7 @@ EventBaton.prototype.releaseBaton = function(name, func, context) {
if (!found) {
console.log('did not find that function', func, context, name, arguments);
console.log(this.eventMap);
- throw new Error('cant releasebaton if yu dont have it');
+ throw new Error('cant releasebaton if yu don\'t have it');
}
this.eventMap[name] = newListeners;
};
diff --git a/src/js/views/builderViews.js b/src/js/views/builderViews.js
index bdf41b0e..bc8cc01d 100644
--- a/src/js/views/builderViews.js
+++ b/src/js/views/builderViews.js
@@ -334,7 +334,7 @@ var MultiViewBuilder = ContainedBase.extend({
this.addChildViewObj(newView);
}.bind(this))
.fail(function() {
- // they dont want to add the view apparently, so just return
+ // they don't want to add the view apparently, so just return
})
.done();
},
diff --git a/src/js/views/gitDemonstrationView.js b/src/js/views/gitDemonstrationView.js
index 498d1901..0c088c26 100644
--- a/src/js/views/gitDemonstrationView.js
+++ b/src/js/views/gitDemonstrationView.js
@@ -129,9 +129,9 @@ var GitDemonstrationView = ContainedBase.extend({
positive: function() {
if (this.demonstrated || !this.hasControl) {
- // dont do anything if we are demonstrating, and if
+ // don't do anything if we are demonstrating, and if
// we receive a meta nav event and we aren't listening,
- // then dont do anything either
+ // then don't do anything either
return;
}
this.demonstrated = true;
diff --git a/src/js/visuals/index.js b/src/js/visuals/index.js
index 70678ff3..804669b5 100644
--- a/src/js/visuals/index.js
+++ b/src/js/visuals/index.js
@@ -98,7 +98,7 @@ GitVisuals.prototype.resetAll = function() {
GitVisuals.prototype.tearDown = function() {
this.resetAll();
this.paper.remove();
- // Unregister the refresh tree listener so we dont accumulate
+ // Unregister the refresh tree listener so we don't accumulate
// these over time. However we aren't calling tearDown in
// some places... but this is an improvement
var Main = require('../app');
@@ -442,7 +442,7 @@ GitVisuals.prototype.fullCalc = function() {
};
GitVisuals.prototype.calcTreeCoords = function() {
- // this method can only contain things that dont rely on graphics
+ // this method can only contain things that don't rely on graphics
if (!this.rootCommit) {
throw new Error('grr, no root commit!');
}
diff --git a/src/js/visuals/visBase.js b/src/js/visuals/visBase.js
index 7f06e6aa..92eff1b2 100644
--- a/src/js/visuals/visBase.js
+++ b/src/js/visuals/visBase.js
@@ -41,7 +41,7 @@ var VisBase = Backbone.Model.extend({
} else {
this.get(key).stop();
this.get(key).animate(attr[key], speed, easing);
- // some keys dont support animating too, so set those instantly here
+ // some keys don't support animating too, so set those instantly here
_.forEach(this.getNonAnimateKeys(), function(nonAnimateKey) {
if (attr[key] && attr[key][nonAnimateKey] !== undefined) {
this.get(key).attr(nonAnimateKey, attr[key][nonAnimateKey]);
diff --git a/src/js/visuals/visBranch.js b/src/js/visuals/visBranch.js
index a492edc8..27fadfc4 100644
--- a/src/js/visuals/visBranch.js
+++ b/src/js/visuals/visBranch.js
@@ -407,7 +407,7 @@ var VisBranch = VisBase.extend({
var textPos = this.getTextPosition();
var name = this.getName();
- // when from a reload, we dont need to generate the text
+ // when from a reload, we don't need to generate the text
var text = paper.text(textPos.x, textPos.y, String(name));
text.attr({
'font-size': 14,
diff --git a/src/js/visuals/visNode.js b/src/js/visuals/visNode.js
index 1cb08d86..6d3e5cb9 100644
--- a/src/js/visuals/visNode.js
+++ b/src/js/visuals/visNode.js
@@ -421,7 +421,7 @@ var VisNode = VisBase.extend({
});
// continuation calculation
if ((vx * vx + vy * vy) < 0.1 && Math.abs(y - maxHeight) <= 0.1) {
- // dont need to animate anymore, we are on ground
+ // don't need to animate anymore, we are on ground
return false;
}
// keep animating!
diff --git a/src/js/visuals/visTag.js b/src/js/visuals/visTag.js
index f7ce663c..f11afe3a 100644
--- a/src/js/visuals/visTag.js
+++ b/src/js/visuals/visTag.js
@@ -251,7 +251,7 @@ var VisTag = VisBase.extend({
var textPos = this.getTextPosition();
var name = this.getName();
- // when from a reload, we dont need to generate the text
+ // when from a reload, we don't need to generate the text
var text = paper.text(textPos.x, textPos.y, String(name));
text.attr({
'font-size': 14,
diff --git a/src/js/visuals/visualization.js b/src/js/visuals/visualization.js
index 7c9ebb97..3ac6b0f4 100644
--- a/src/js/visuals/visualization.js
+++ b/src/js/visuals/visualization.js
@@ -34,7 +34,7 @@ var Visualization = Backbone.View.extend({
this.paper = paper;
var Main = require('../app');
- // if we dont want to receive keyboard input (directly),
+ // if we don't want to receive keyboard input (directly),
// make a new event baton so git engine steals something that no one
// is broadcasting to
this.eventBaton = (options.noKeyboardInput) ?
diff --git a/todo.txt b/todo.txt
index 342eebfb..d86f2344 100644
--- a/todo.txt
+++ b/todo.txt
@@ -77,7 +77,7 @@ Done things:
[x] git pull animation
[x] use the graph difference algorithm to then implement git push
[x] work on git pull --rebase animation, send down the deferred and it should work?
-[x] why is rebase -i broken? dont emulate touch events
+[x] why is rebase -i broken? don't emulate touch events
[x] tree compare test coverage
[x] remote branch it is tracking (points to a remote branch model)
[x] fix branch -a and branch -r to: show remote branches or all branches
From 4c92196559077c8722a4e91cd8066648ec97e6e9 Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?=EF=BC=A8=EF=BD=8F=EF=BD=8E=EF=BD=87=EF=BD=81=EF=BD=92?=
=?UTF-8?q?=EF=BD=83?=
Date: Fri, 30 Nov 2018 20:21:13 +0700
Subject: [PATCH 023/359] Remove module object-assign
---
package.json | 1 -
src/js/app/index.js | 3 +--
2 files changed, 1 insertion(+), 3 deletions(-)
diff --git a/package.json b/package.json
index 85e723ef..aa736793 100644
--- a/package.json
+++ b/package.json
@@ -33,7 +33,6 @@
"flux": "^2.0.1",
"jquery": "~1.7.3",
"markdown": "~0.4.0",
- "object-assign": "^2.0.0",
"q": "~0.8.11",
"react": "^0.13.1",
"underscore": "~1.4.3"
diff --git a/src/js/app/index.js b/src/js/app/index.js
index 6c34800d..6544627f 100644
--- a/src/js/app/index.js
+++ b/src/js/app/index.js
@@ -2,7 +2,6 @@ var Backbone = require('backbone');
var EventEmitter = require('events').EventEmitter;
var React = require('react');
-var assign = require('object-assign');
var util = require('../util');
var intl = require('../intl');
var LocaleStore = require('../stores/LocaleStore');
@@ -11,7 +10,7 @@ var LocaleActions = require('../actions/LocaleActions');
/**
* Globals
*/
-var events = assign(
+var events = Object.assign(
{},
EventEmitter.prototype,
{
From 41bb6d1bd77cda08a15fb72f347e4b26b92e2b2f Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?=EF=BC=A8=EF=BD=8F=EF=BD=8E=EF=BD=87=EF=BD=81=EF=BD=92?=
=?UTF-8?q?=EF=BD=83?=
Date: Fri, 30 Nov 2018 22:06:42 +0700
Subject: [PATCH 024/359] Fix more typo, `'` and some word
---
Gruntfile.js | 4 ++--
__tests__/git.spec.js | 7 +++----
__tests__/treeCompare.spec.js | 4 +---
src/js/app/index.js | 2 +-
src/js/git/commands.js | 4 ++--
src/js/git/index.js | 16 ++++++++--------
src/js/intl/index.js | 4 ++--
src/js/intl/strings.js | 2 +-
src/js/level/builder.js | 4 ++--
src/js/stores/LevelStore.js | 6 +++---
src/js/util/eventBaton.js | 4 ++--
src/js/views/index.js | 4 ++--
src/js/visuals/index.js | 4 ++--
todo.txt | 8 ++++----
14 files changed, 35 insertions(+), 38 deletions(-)
diff --git a/Gruntfile.js b/Gruntfile.js
index 13e7f6b8..4d007c18 100644
--- a/Gruntfile.js
+++ b/Gruntfile.js
@@ -14,7 +14,7 @@ var indexFile = fs.readFileSync('src/template.index.html').toString();
var indexTemplate = _.template(indexFile);
/**
- * This is SUPER jank but I cant get the underscore templating to evaluate
+ * This is SUPER jank but I can't get the underscore templating to evaluate
* correctly with custom regexes, so I'm just going to use interpolate
* and define the strings here.
*/
@@ -43,7 +43,7 @@ module.exports = function(grunt) {
grunt.log.writeln(compliments[index]);
});
- grunt.registerTask('lintStrings', 'Find if an INTL string doesnt exist', function() {
+ grunt.registerTask('lintStrings', 'Find if an INTL string doesn\'t exist', function() {
var child_process = require('child_process');
child_process.exec('node src/js/intl/checkStrings', function(err, output) {
grunt.log.writeln(output);
diff --git a/__tests__/git.spec.js b/__tests__/git.spec.js
index 25f55f96..656d197e 100644
--- a/__tests__/git.spec.js
+++ b/__tests__/git.spec.js
@@ -128,7 +128,7 @@ describe('Git', function() {
);
});
- it('Ammends commits', function() {
+ it('Amends commits', function() {
expectTreeAsync(
'git commit --amend',
'%7B%22branches%22%3A%7B%22master%22%3A%7B%22target%22%3A%22C1%27%22%2C%22id%22%3A%22master%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%22C1%27%22%3A%7B%22parents%22%3A%5B%22C0%22%5D%2C%22id%22%3A%22C1%27%22%7D%7D%2C%22HEAD%22%3A%7B%22target%22%3A%22master%22%2C%22id%22%3A%22HEAD%22%7D%7D'
@@ -219,7 +219,7 @@ describe('Git', function() {
);
});
- it('doesnt make a tag if ref doesnt resolve', function() {
+ it('doesn\'t make a tag if ref doesn\'t resolve', function() {
expectTreeAsync(
'git tag v1 foo',
'{"branches":{"master":{"target":"C1","id":"master","remoteTrackingBranchID":null}},"commits":{"C0":{"parents":[],"id":"C0","rootCommit":true},"C1":{"parents":["C0"],"id":"C1"}},"tags":{},"HEAD":{"target":"master","id":"HEAD"}}'
@@ -261,7 +261,7 @@ describe('Git', function() {
);
});
- it('can handle slashes and dashes in branch names but doesnt allow o/', function() {
+ it('can handle slashes and dashes in branch names but doesn\'t allow o/', function() {
expectTreeAsync(
'git branch foo/bar; git commit; git checkout foo/bar; gc; go master; git merge foo/bar; go foo/bar; git checkout -b bar-baz; git commit; git branch o/foo',
'{"branches":{"master":{"target":"C4","id":"master","remoteTrackingBranchID":null},"foo/bar":{"target":"C3","id":"foo/bar","remoteTrackingBranchID":null},"bar-baz":{"target":"C5","id":"bar-baz","remoteTrackingBranchID":null}},"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"},"C5":{"parents":["C3"],"id":"C5"}},"tags":{},"HEAD":{"target":"bar-baz","id":"HEAD"}}'
@@ -276,4 +276,3 @@ describe('Git', function() {
});
});
-
diff --git a/__tests__/treeCompare.spec.js b/__tests__/treeCompare.spec.js
index 83efa368..052d8df2 100644
--- a/__tests__/treeCompare.spec.js
+++ b/__tests__/treeCompare.spec.js
@@ -51,7 +51,7 @@ describe('Tree Compare', function() {
it('deep compares on origin tree', function() {
testMethod(
- {}, // checked for all methods so this doesnt matter
+ {}, // checked for all methods so this doesn't matter
// state with originTree
'{"branches":{"master":{"target":"C1","id":"master"},"o/master":{"target":"C1","id":"o/master"}},"commits":{"C0":{"parents":[],"id":"C0","rootCommit":true},"C1":{"parents":["C0"],"id":"C1"}},"HEAD":{"target":"master","id":"HEAD"},"originTree":{"branches":{"master":{"remoteTrackingBranch":null,"remote":false,"target":"C1","id":"master","type":"branch"}},"commits":{"C0":{"type":"commit","parents":[],"author":"Peter Cottle","createTime":"Wed Jul 24 2013 09:58:50 GMT-0700 (PDT)","commitMessage":"Quick commit. Go Bears!","id":"C0","rootCommit":true},"C1":{"type":"commit","parents":["C0"],"author":"Peter Cottle","createTime":"Wed Jul 24 2013 09:58:50 GMT-0700 (PDT)","commitMessage":"Quick commit. Go Bears!","id":"C1"}},"HEAD":{"target":"master","id":"HEAD","type":"general ref"}}}',
{
@@ -173,5 +173,3 @@ describe('Tree Compare', function() {
);
});
});
-
-
diff --git a/src/js/app/index.js b/src/js/app/index.js
index 6c34800d..9f1880e9 100644
--- a/src/js/app/index.js
+++ b/src/js/app/index.js
@@ -21,7 +21,7 @@ var events = assign(
}
}
);
-// Allow unlimited listeners, so FF doesnt break
+// Allow unlimited listeners, so FF doesn't break
events.setMaxListeners(0);
var commandUI;
var sandbox;
diff --git a/src/js/git/commands.js b/src/js/git/commands.js
index fb90d208..cdec783b 100644
--- a/src/js/git/commands.js
+++ b/src/js/git/commands.js
@@ -19,7 +19,7 @@ function isColonRefspec(str) {
}
var assertIsRef = function(engine, ref) {
- engine.resolveID(ref); // will throw giterror if cant resolve
+ engine.resolveID(ref); // will throw git error if can't resolve
};
var validateBranchName = function(engine, name) {
@@ -255,7 +255,7 @@ var commandConfig = {
// get o/master locally if master is specified
destination = engine.origin.refs[source].getPrefixedID();
} else {
- // cant be detached
+ // can't be detached
if (engine.getDetachedHead()) {
throw new GitError({
msg: intl.todo('Git pull can not be executed in detached HEAD mode if no remote branch specified!')
diff --git a/src/js/git/index.js b/src/js/git/index.js
index e38b9934..2825a96a 100644
--- a/src/js/git/index.js
+++ b/src/js/git/index.js
@@ -41,7 +41,7 @@ function GitEngine(options) {
this.eventBaton = options.eventBaton;
this.eventBaton.stealBaton('processGitCommand', this.dispatch, this);
- // poor man's dependency injection. we cant reassign
+ // poor man's dependency injection. we can't reassign
// the module variable because its get clobbered :P
this.animationFactory = (options.animationFactory) ?
options.animationFactory : AnimationFactory;
@@ -1018,12 +1018,12 @@ GitEngine.prototype.getTargetGraphDifference = function(
_.each(here.parents, pushParent);
}
- // filter because we werent doing graph search
+ // filter because we weren't doing graph search
var differenceUnique = Graph.getUniqueObjects(difference);
/**
* Ok now we have to determine the order in which to make these commits.
* We used to just sort by depth because we were lazy but that is incorrect
- * since it doesnt represent the actual dependency tree of the commits.
+ * since it doesn't represent the actual dependency tree of the commits.
*
* So here is what we are going to do -- loop through the differenceUnique
* set and find a commit that has _all_ its parents in the targetSet. Then
@@ -1112,7 +1112,7 @@ GitEngine.prototype.push = function(options) {
);
if (!commitsToMake.length) {
if (!options.force) {
- // We are already up to date, and we cant be deleting
+ // We are already up to date, and we can't be deleting
// either since we don't have --force
throw new GitError({
msg: intl.str('git-error-origin-fetch-uptodate')
@@ -1767,7 +1767,7 @@ GitEngine.prototype.syncRemoteBranchFills = function() {
}
var originBranch = this.origin.refs[branch.getBaseID()];
if (!originBranch.get('visBranch')) {
- // testing mode doesnt get this
+ // testing mode doesn't get this
return;
}
var originFill = originBranch.get('visBranch').get('fill');
@@ -2099,7 +2099,7 @@ GitEngine.prototype.hgRebase = function(destination, base) {
});
chain = chain.then(function() {
- // now we just moved a bunch of commits, but we havent updated the
+ // now we just moved a bunch of commits, but we haven't updated the
// dangling guys. lets do that and then prune
var anyChange = this.updateCommitParentsForHgRebase(masterSet);
if (!anyChange) {
@@ -2801,7 +2801,7 @@ GitEngine.prototype.getCommonAncestor = function(ancestor, cousin, dontThrow) {
}
queue = queue.concat(here.get('parents'));
}
- throw new Error('something has gone very wrong... two nodes arent connected!');
+ throw new Error('something has gone very wrong... two nodes aren\'t connected!');
};
GitEngine.prototype.isUpstreamOf = function(child, ancestor) {
@@ -2913,7 +2913,7 @@ var Branch = Ref.extend({
getBaseID: function() {
if (!this.getIsRemote()) {
- throw new Error('im not remote so cant get base');
+ throw new Error('im not remote so can\'t get base');
}
return this.get('id').replace(ORIGIN_PREFIX, '');
},
diff --git a/src/js/intl/index.js b/src/js/intl/index.js
index 9a1e315c..57fbabed 100644
--- a/src/js/intl/index.js
+++ b/src/js/intl/index.js
@@ -57,7 +57,7 @@ var str = exports.str = function(key, params) {
var getIntlKey = exports.getIntlKey = function(obj, key, overrideLocale) {
if (!obj || !obj[key]) {
- throw new Error('that key ' + key + 'doesnt exist in this blob' + obj);
+ throw new Error('that key ' + key + 'doesn\'t exist in this blob' + obj);
}
if (!obj[key][getDefaultLocale()]) {
console.warn(
@@ -98,7 +98,7 @@ exports.getStartDialog = function(level) {
var startDialog = getIntlKey(level, 'startDialog');
if (startDialog) { return startDialog; }
- // this level translation isnt supported yet, so lets add
+ // this level translation isn't supported yet, so lets add
// an alert to the front and give the english version.
var errorAlert = {
type: 'ModalAlert',
diff --git a/src/js/intl/strings.js b/src/js/intl/strings.js
index a96261b8..34306127 100755
--- a/src/js/intl/strings.js
+++ b/src/js/intl/strings.js
@@ -960,7 +960,7 @@ exports.strings = {
},
///////////////////////////////////////////////////////////////////////////
'level-no-id': {
- '__desc__': 'When you say an id but that level doesnt exist',
+ '__desc__': 'When you say an id but that level doesn\'t exist',
'en_US': 'A level for that id "{id}" was not found! Opening up a level selection view',
'de_DE': 'Konnte keinen Level mit der ID "{id}" finden! Öffne einen Level-Auswahldialog',
'zh_CN': '没找到 id 为 "{id}" 的关卡!打开关卡选择框',
diff --git a/src/js/level/builder.js b/src/js/level/builder.js
index bcb3d552..e823d239 100644
--- a/src/js/level/builder.js
+++ b/src/js/level/builder.js
@@ -68,7 +68,7 @@ var LevelBuilder = Level.extend({
this.definedGoal = true;
}
- // we wont be using this stuff, and it is deleted to ensure we overwrite all functions that
+ // we won't be using this stuff, and it is deleted to ensure we overwrite all functions that
// include that functionality
delete this.treeCompare;
delete this.solved;
@@ -335,7 +335,7 @@ var LevelBuilder = Level.extend({
.then(function() {
// oh boy this is complex
var whenEditedDialog = Q.defer();
- // the undefined here is the command that doesnt need resolving just yet...
+ // the undefined here is the command that doesn't need resolving just yet...
this.editDialog(undefined, whenEditedDialog);
return whenEditedDialog.promise;
}.bind(this))
diff --git a/src/js/stores/LevelStore.js b/src/js/stores/LevelStore.js
index dccf6d84..edacc524 100644
--- a/src/js/stores/LevelStore.js
+++ b/src/js/stores/LevelStore.js
@@ -109,11 +109,11 @@ AppConstants.StoreSubscribePrototype,
getNextLevel: function(id) {
if (!_levelMap[id]) {
- console.warn('that level doesnt exist!!!');
+ console.warn('that level doesn\'t exist!!!');
return null;
}
- // meh, this method could be better. It's a tradeoff between
+ // meh, this method could be better. It's a trade-off between
// having the sequence structure be really simple JSON
// and having no connectivity information between levels, which means
// you have to build that up yourself on every query
@@ -138,7 +138,7 @@ AppConstants.StoreSubscribePrototype,
isLevelSolved: function(levelID) {
if (!_levelMap[levelID]) {
- throw new Error('that level doesnt exist!');
+ throw new Error('that level doesn\'t exist!');
}
return !!_solvedMap[levelID];
},
diff --git a/src/js/util/eventBaton.js b/src/js/util/eventBaton.js
index fcfe4479..278a1475 100644
--- a/src/js/util/eventBaton.js
+++ b/src/js/util/eventBaton.js
@@ -27,7 +27,7 @@ EventBaton.prototype.sliceOffArgs = function(num, args) {
};
EventBaton.prototype.trigger = function(name) {
- // arguments is weird and doesnt do slice right
+ // arguments is weird and doesn't do slice right
var argsToApply = this.sliceOffArgs(1, arguments);
var listeners = this.eventMap[name];
@@ -105,7 +105,7 @@ EventBaton.prototype.releaseBaton = function(name, func, context) {
if (!found) {
console.log('did not find that function', func, context, name, arguments);
console.log(this.eventMap);
- throw new Error('cant releasebaton if yu don\'t have it');
+ throw new Error('can\'t releasebaton if you don\'t have it');
}
this.eventMap[name] = newListeners;
};
diff --git a/src/js/views/index.js b/src/js/views/index.js
index c44320fa..b98d034a 100644
--- a/src/js/views/index.js
+++ b/src/js/views/index.js
@@ -168,7 +168,7 @@ var LeftRightView = PositiveNegativeBase.extend({
};
this.render();
- // For some weird reason backbone events arent working anymore so
+ // For some weird reason backbone events aren't working anymore so
// im going to just wire this up manually
this.$('div.right').click(this.positive.bind(this));
this.$('div.left').click(this.negative.bind(this));
@@ -208,7 +208,7 @@ var ModalView = Backbone.View.extend({
// add ourselves to the DOM
this.$el.html(this.template({}));
$('body').append(this.el);
- // this doesnt necessarily show us though...
+ // this doesn't necessarily show us though...
},
stealKeyboard: function() {
diff --git a/src/js/visuals/index.js b/src/js/visuals/index.js
index 804669b5..604afef6 100644
--- a/src/js/visuals/index.js
+++ b/src/js/visuals/index.js
@@ -359,7 +359,7 @@ GitVisuals.prototype.animateAllFromAttrToAttr = function(fromSnapshot, toSnapsho
}
if (!fromSnapshot[id] || !toSnapshot[id]) {
- // its actually ok it doesnt exist yet
+ // its actually ok it doesn't exist yet
return;
}
obj.animateFromAttrToAttr(fromSnapshot[id], toSnapshot[id]);
@@ -477,7 +477,7 @@ GitVisuals.prototype.getCommitUpstreamBranches = function(commit) {
GitVisuals.prototype.getBlendedHuesForCommit = function(commit) {
var branches = this.upstreamBranchSet[commit.get('id')];
if (!branches) {
- throw new Error('that commit doesnt have upstream branches!');
+ throw new Error('that commit doesn\'t have upstream branches!');
}
return this.blendHuesFromBranchStack(branches);
diff --git a/todo.txt b/todo.txt
index d86f2344..d586514b 100644
--- a/todo.txt
+++ b/todo.txt
@@ -40,19 +40,19 @@ Done things:
(place to merge). o/master gets updated regardless
[x] ok say I have branch banana and its one commit ahead of master. if I git
pull origin master while checked out on banana, it fetches those commits
- (doesnt update origin/master) and then merges them into banana.
+ (doesn't update origin/master) and then merges them into banana.
[x] and then "git pull origin banana:origin/banana" works because it goes into
the remote branch and then merges the fetch HEAD with current location
[x] oh boy heres another data point. git fetch banana:banana will actually
fast-forward banana to what remote has, but not update o/banana. weirdly it
- doesnt let you do this if you are checked out on banana
+ doesn't let you do this if you are checked out on banana
[x] furthermore, if banana has commits and its not a FF, it will reject the command. wth??
[x] test is failing because we create banana when we should only really be creating o/banana
[x] work on TABBED levels layout
[x] EASY -- make colors the same between remote branches and their remote counterparts
[x] fix undo not syncing the remote tracking
[x] get clone as a before command working in demonstration views (related to test infra as well)
-[x] importTreeNow fails if origin isnt updated
+[x] importTreeNow fails if origin isn't updated
[x] set checkout -b branch __remoteBranch to track the remote branch
[x] test coverage for hg!!! (in progress)
[x] tree pruning
@@ -123,7 +123,7 @@ Done things:
[x] what if they just type "levels" ?
[x] hookup for when solving happens
[x] levels dropdown selection?
-[x] git demonstration view -- shouldnt be too bad. LOL WHAT A FUCKING JOKE like 4 hours
+[x] git demonstration view -- shouldn't be too bad. LOL WHAT A FUCKING JOKE like 4 hours
[x] gotoSandbox command
[x] "next level?" dialog after beating level
[x] keyboard input for confirm / cancel
From 052aa1e299852df4404a1cfb7fd1d11752037d96 Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?=EF=BC=A8=EF=BD=8F=EF=BD=8E=EF=BD=87=EF=BD=81=EF=BD=92?=
=?UTF-8?q?=EF=BD=83?=
Date: Sat, 1 Dec 2018 06:07:06 +0700
Subject: [PATCH 025/359] change '_.extend' to 'Object.assign'
---
src/js/git/index.js | 12 ++++++------
src/js/graph/index.js | 8 ++++----
src/js/graph/treeCompare.js | 6 +++---
src/js/level/builder.js | 2 +-
src/js/level/index.js | 4 ++--
src/js/sandbox/commands.js | 2 +-
src/js/views/builderViews.js | 2 +-
src/js/views/gitDemonstrationView.js | 2 +-
src/js/views/index.js | 4 ++--
src/js/views/multiView.js | 2 +-
src/js/visuals/tree.js | 4 ++--
src/js/visuals/visBase.js | 4 ++--
src/js/visuals/visualization.js | 2 +-
13 files changed, 27 insertions(+), 27 deletions(-)
diff --git a/src/js/git/index.js b/src/js/git/index.js
index 2825a96a..7754f2ae 100644
--- a/src/js/git/index.js
+++ b/src/js/git/index.js
@@ -518,7 +518,7 @@ GitEngine.prototype.getOrMakeRecursive = function(
if (type == 'HEAD') {
var headJSON = tree.HEAD;
- var HEAD = new Ref(_.extend(
+ var HEAD = new Ref(Object.assign(
tree.HEAD,
{
target: this.getOrMakeRecursive(tree, createdSoFar, headJSON.target)
@@ -531,7 +531,7 @@ GitEngine.prototype.getOrMakeRecursive = function(
if (type == 'branch') {
var branchJSON = tree.branches[objID];
- var branch = new Branch(_.extend(
+ var branch = new Branch(Object.assign(
tree.branches[objID],
{
target: this.getOrMakeRecursive(tree, createdSoFar, branchJSON.target)
@@ -544,7 +544,7 @@ GitEngine.prototype.getOrMakeRecursive = function(
if (type == 'tag') {
var tagJSON = tree.tags[objID];
- var tag = new Tag(_.extend(
+ var tag = new Tag(Object.assign(
tree.tags[objID],
{
target: this.getOrMakeRecursive(tree, createdSoFar, tagJSON.target)
@@ -563,7 +563,7 @@ GitEngine.prototype.getOrMakeRecursive = function(
parentObjs.push(this.getOrMakeRecursive(tree, createdSoFar, parentID));
}, this);
- var commit = new Commit(_.extend(
+ var commit = new Commit(Object.assign(
commitJSON,
{
parents: parentObjs,
@@ -846,7 +846,7 @@ GitEngine.prototype.makeCommit = function(parents, id, options) {
id = this.getUniqueID();
}
- var commit = new Commit(_.extend({
+ var commit = new Commit(Object.assign({
parents: parents,
id: id,
gitVisuals: this.gitVisuals
@@ -1284,7 +1284,7 @@ GitEngine.prototype.fetchCore = function(sourceDestPairs, options) {
this.origin,
pair.destination,
pair.source,
- _.extend(
+ Object.assign(
{},
options,
{dontThrowOnNoFetch: true}
diff --git a/src/js/graph/index.js b/src/js/graph/index.js
index 49285de0..ed2c0745 100644
--- a/src/js/graph/index.js
+++ b/src/js/graph/index.js
@@ -44,7 +44,7 @@ var Graph = {
if (type == 'HEAD') {
var headJSON = tree.HEAD;
- var HEAD = new Ref(_.extend(
+ var HEAD = new Ref(Object.assign(
tree.HEAD,
{
target: this.getOrMakeRecursive(tree, createdSoFar, headJSON.target)
@@ -57,7 +57,7 @@ var Graph = {
if (type == 'branch') {
var branchJSON = tree.branches[objID];
- var branch = new Branch(_.extend(
+ var branch = new Branch(Object.assign(
tree.branches[objID],
{
target: this.getOrMakeRecursive(tree, createdSoFar, branchJSON.target)
@@ -70,7 +70,7 @@ var Graph = {
if (type == 'tag') {
var tagJSON = tree.tags[objID];
- var tag = new Tag(_.extend(
+ var tag = new Tag(Object.assign(
tree.tags[objID],
{
target: this.getOrMakeRecursive(tree, createdSoFar, tagJSON.target)
@@ -89,7 +89,7 @@ var Graph = {
parentObjs.push(this.getOrMakeRecursive(tree, createdSoFar, parentID));
}, this);
- var commit = new Commit(_.extend(
+ var commit = new Commit(Object.assign(
commitJSON,
{
parents: parentObjs,
diff --git a/src/js/graph/treeCompare.js b/src/js/graph/treeCompare.js
index 132782bd..75835ab6 100644
--- a/src/js/graph/treeCompare.js
+++ b/src/js/graph/treeCompare.js
@@ -92,7 +92,7 @@ TreeCompare.compareAllBranchesWithinTrees = function(treeA, treeB) {
treeA = this.convertTreeSafe(treeA);
treeB = this.convertTreeSafe(treeB);
- var allBranches = _.extend(
+ var allBranches = Object.assign(
{},
treeA.branches,
treeB.branches
@@ -140,7 +140,7 @@ TreeCompare.compareAllBranchesWithinTreesHashAgnostic = function(treeA, treeB) {
treeB = this.convertTreeSafe(treeB);
this.reduceTreeFields([treeA, treeB]);
- var allBranches = _.extend(
+ var allBranches = Object.assign(
{},
treeA.branches,
treeB.branches
@@ -270,7 +270,7 @@ TreeCompare.getRecurseCompareHashAgnostic = function(treeA, treeB) {
// some buildup functions
var getStrippedCommitCopy = function(commit) {
if (!commit) { return {}; }
- return _.extend(
+ return Object.assign(
{},
commit,
{
diff --git a/src/js/level/builder.js b/src/js/level/builder.js
index e823d239..a5a848a6 100644
--- a/src/js/level/builder.js
+++ b/src/js/level/builder.js
@@ -360,7 +360,7 @@ var LevelBuilder = Level.extend({
},
getExportObj: function() {
- var compiledLevel = _.extend(
+ var compiledLevel = Object.assign(
{},
this.level
);
diff --git a/src/js/level/index.js b/src/js/level/index.js
index 62b6a364..e2801d6e 100644
--- a/src/js/level/index.js
+++ b/src/js/level/index.js
@@ -70,7 +70,7 @@ var Level = Sandbox.extend({
// if there is a multiview in the beginning, open that
// and let it resolve our deferred
if (this.level.startDialog && !this.testOption('noIntroDialog')) {
- new MultiView(_.extend(
+ new MultiView(Object.assign(
{},
intl.getStartDialog(this.level),
{ deferred: deferred }
@@ -99,7 +99,7 @@ var Level = Sandbox.extend({
var dialog = $.extend({}, intl.getStartDialog(levelObj));
// grab the last slide only
dialog.childViews = dialog.childViews.slice(-1);
- new MultiView(_.extend(
+ new MultiView(Object.assign(
dialog,
{ deferred: deferred }
));
diff --git a/src/js/sandbox/commands.js b/src/js/sandbox/commands.js
index 6da2b6a6..83a741b0 100644
--- a/src/js/sandbox/commands.js
+++ b/src/js/sandbox/commands.js
@@ -134,7 +134,7 @@ var getAllCommands = function() {
'mobileAlert'
];
- var allCommands = _.extend(
+ var allCommands = Object.assign(
{},
require('../level').regexMap,
regexMap
diff --git a/src/js/views/builderViews.js b/src/js/views/builderViews.js
index bc8cc01d..9d2ba96f 100644
--- a/src/js/views/builderViews.js
+++ b/src/js/views/builderViews.js
@@ -179,7 +179,7 @@ var DemonstrationBuilder = ContainedBase.extend({
this.deferred = options.deferred || Q.defer();
if (options.fromObj) {
var toEdit = options.fromObj.options;
- options = _.extend(
+ options = Object.assign(
{},
options,
toEdit,
diff --git a/src/js/views/gitDemonstrationView.js b/src/js/views/gitDemonstrationView.js
index 0c088c26..f0fa0810 100644
--- a/src/js/views/gitDemonstrationView.js
+++ b/src/js/views/gitDemonstrationView.js
@@ -25,7 +25,7 @@ var GitDemonstrationView = ContainedBase.extend({
initialize: function(options) {
options = options || {};
this.options = options;
- this.JSON = _.extend(
+ this.JSON = Object.assign(
{
beforeMarkdowns: [
'## Git Commits',
diff --git a/src/js/views/index.js b/src/js/views/index.js
index b98d034a..7182d2a0 100644
--- a/src/js/views/index.js
+++ b/src/js/views/index.js
@@ -372,7 +372,7 @@ var ConfirmCancelTerminal = Backbone.View.extend({
options = options || {};
this.deferred = options.deferred || Q.defer();
- this.modalAlert = new ModalAlert(_.extend(
+ this.modalAlert = new ModalAlert(Object.assign(
{},
{ markdown: '#you sure?' },
options
@@ -470,7 +470,7 @@ var NextLevelConfirm = ConfirmCancelTerminal.extend({
'
';
}
- options = _.extend(
+ options = Object.assign(
{},
options,
{
diff --git a/src/js/views/multiView.js b/src/js/views/multiView.js
index 79ec192b..faffa3d0 100644
--- a/src/js/views/multiView.js
+++ b/src/js/views/multiView.js
@@ -159,7 +159,7 @@ var MultiView = Backbone.View.extend({
if (!this.typeToConstructor[type]) {
throw new Error('no constructor for type "' + type + '"');
}
- var view = new this.typeToConstructor[type](_.extend(
+ var view = new this.typeToConstructor[type](Object.assign(
{},
viewJSON.options,
{ wait: true }
diff --git a/src/js/visuals/tree.js b/src/js/visuals/tree.js
index e5952228..5d9b92dd 100644
--- a/src/js/visuals/tree.js
+++ b/src/js/visuals/tree.js
@@ -13,7 +13,7 @@ var VisBase = Backbone.Model.extend({
animateAttrKeys: function(keys, attrObj, speed, easing) {
// either we animate a specific subset of keys or all
// possible things we could animate
- keys = _.extend(
+ keys = Object.assign(
{},
{
include: ['circle', 'arrow', 'rect', 'path', 'text'],
@@ -26,7 +26,7 @@ var VisBase = Backbone.Model.extend({
// safely insert this attribute into all the keys we want
_.each(keys.include, function(key) {
- attr[key] = _.extend(
+ attr[key] = Object.assign(
{},
attr[key],
attrObj
diff --git a/src/js/visuals/visBase.js b/src/js/visuals/visBase.js
index 92eff1b2..5196a575 100644
--- a/src/js/visuals/visBase.js
+++ b/src/js/visuals/visBase.js
@@ -58,7 +58,7 @@ var VisBase = Backbone.Model.extend({
animateAttrKeys: function(keys, attrObj, speed, easing) {
// either we animate a specific subset of keys or all
// possible things we could animate
- keys = _.extend(
+ keys = Object.assign(
{},
{
include: ['circle', 'arrow', 'rect', 'path', 'text'],
@@ -71,7 +71,7 @@ var VisBase = Backbone.Model.extend({
// safely insert this attribute into all the keys we want
_.each(keys.include, function(key) {
- attr[key] = _.extend(
+ attr[key] = Object.assign(
{},
attr[key],
attrObj
diff --git a/src/js/visuals/visualization.js b/src/js/visuals/visualization.js
index 3ac6b0f4..5cf27cb4 100644
--- a/src/js/visuals/visualization.js
+++ b/src/js/visuals/visualization.js
@@ -104,7 +104,7 @@ var Visualization = Backbone.View.extend({
makeOrigin: function(options) {
// oh god, here we go. We basically do a bizarre form of composition here,
// where this visualization actually contains another one of itself.
- this.originVis = new Visualization(_.extend(
+ this.originVis = new Visualization(Object.assign(
{},
// copy all of our options over, except...
this.options,
From 489a4b9095bd96d5ef98746a99f73a56a454f16f Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?=EF=BC=A8=EF=BD=8F=EF=BD=8E=EF=BD=87=EF=BD=81=EF=BD=92?=
=?UTF-8?q?=EF=BD=83?=
Date: Sat, 1 Dec 2018 06:37:25 +0700
Subject: [PATCH 026/359] change '_.clone(..args)' to 'Object.assign({},
..args)'
---
src/js/git/index.js | 2 +-
src/js/graph/treeCompare.js | 4 ++--
src/js/intl/index.js | 5 +++--
src/js/views/gitDemonstrationView.js | 3 +--
src/js/views/index.js | 8 ++++----
src/js/views/levelDropdownView.js | 3 +--
src/js/views/multiView.js | 3 +--
src/js/visuals/visualization.js | 3 +--
8 files changed, 14 insertions(+), 17 deletions(-)
diff --git a/src/js/git/index.js b/src/js/git/index.js
index 7754f2ae..2e163168 100644
--- a/src/js/git/index.js
+++ b/src/js/git/index.js
@@ -726,7 +726,7 @@ GitEngine.prototype.makeTag = function(id, target) {
};
GitEngine.prototype.getHead = function() {
- return _.clone(this.HEAD);
+ return Object.assign({}, this.HEAD);
};
GitEngine.prototype.getTags = function() {
diff --git a/src/js/graph/treeCompare.js b/src/js/graph/treeCompare.js
index 75835ab6..823076b0 100644
--- a/src/js/graph/treeCompare.js
+++ b/src/js/graph/treeCompare.js
@@ -165,8 +165,8 @@ TreeCompare.compareBranchesWithinTreesHashAgnostic = function(treeA, treeB, bran
}
// don't mess up the rest of comparison
- branchA = _.clone(branchA);
- branchB = _.clone(branchB);
+ branchA = Object.assign({}, branchA);
+ branchB = Object.assign({}, branchB);
branchA.target = this.getBaseRef(branchA.target);
branchB.target = this.getBaseRef(branchB.target);
diff --git a/src/js/intl/index.js b/src/js/intl/index.js
index 57fbabed..bab78fe5 100644
--- a/src/js/intl/index.js
+++ b/src/js/intl/index.js
@@ -11,7 +11,7 @@ var fallbackMap = {
// lets change underscores template settings so it interpolates
// things like "{branchName} does not exist".
-var templateSettings = _.clone(_.templateSettings);
+var templateSettings = Object.assign({}, _.templateSettings);
templateSettings.interpolate = /\{(.+?)\}/g;
var template = exports.template = function(str, params) {
return _.template(str, params, templateSettings);
@@ -106,7 +106,8 @@ exports.getStartDialog = function(level) {
markdown: str('error-untranslated')
}
};
- var startCopy = _.clone(
+ var startCopy = Object.assign(
+ {},
level.startDialog[getDefaultLocale()] || level.startDialog
);
startCopy.childViews.unshift(errorAlert);
diff --git a/src/js/views/gitDemonstrationView.js b/src/js/views/gitDemonstrationView.js
index f0fa0810..e769bd78 100644
--- a/src/js/views/gitDemonstrationView.js
+++ b/src/js/views/gitDemonstrationView.js
@@ -55,7 +55,7 @@ var GitDemonstrationView = ContainedBase.extend({
this.render();
this.checkScroll();
- this.navEvents = _.clone(Backbone.Events);
+ this.navEvents = Object.assign({}, Backbone.Events);
this.navEvents.on('positive', this.positive, this);
this.navEvents.on('negative', this.negative, this);
this.keyboardListener = new KeyboardListener({
@@ -244,4 +244,3 @@ var GitDemonstrationView = ContainedBase.extend({
});
exports.GitDemonstrationView = GitDemonstrationView;
-
diff --git a/src/js/views/index.js b/src/js/views/index.js
index 7182d2a0..6f09413b 100644
--- a/src/js/views/index.js
+++ b/src/js/views/index.js
@@ -86,7 +86,7 @@ var GeneralButton = ContainedBase.extend({
initialize: function(options) {
options = options || {};
- this.navEvents = options.navEvents || _.clone(Backbone.Events);
+ this.navEvents = options.navEvents || Object.assign({}, Backbone.Events);
this.destination = options.destination;
if (!this.destination) {
this.container = new ModalTerminal();
@@ -160,7 +160,7 @@ var LeftRightView = PositiveNegativeBase.extend({
// events system to add support for git demonstration view taking control of the
// click events
this.pipeEvents = options.events;
- this.navEvents = _.clone(Backbone.Events);
+ this.navEvents = Object.assign({}, Backbone.Events);
this.JSON = {
showLeft: (options.showLeft === undefined) ? true : options.showLeft,
@@ -305,7 +305,7 @@ var ModalTerminal = ContainedBase.extend({
initialize: function(options) {
options = options || {};
- this.navEvents = options.events || _.clone(Backbone.Events);
+ this.navEvents = options.events || Object.assign({}, Backbone.Events);
this.container = new ModalView();
this.JSON = {
@@ -395,7 +395,7 @@ var ConfirmCancelTerminal = Backbone.View.extend({
}.bind(this));
// also setup keyboard
- this.navEvents = _.clone(Backbone.Events);
+ this.navEvents = Object.assign({}, Backbone.Events);
this.navEvents.on('positive', this.positive, this);
this.navEvents.on('negative', this.negative, this);
this.keyboardListener = new KeyboardListener({
diff --git a/src/js/views/levelDropdownView.js b/src/js/views/levelDropdownView.js
index 79858ed0..31c29024 100644
--- a/src/js/views/levelDropdownView.js
+++ b/src/js/views/levelDropdownView.js
@@ -40,7 +40,7 @@ var LevelDropdownView = ContainedBase.extend({
}]
};
- this.navEvents = _.clone(Backbone.Events);
+ this.navEvents = Object.assign({}, Backbone.Events);
this.navEvents.on('clickedID', _.debounce(
this.loadLevelID.bind(this),
300,
@@ -444,4 +444,3 @@ var SeriesView = BaseView.extend({
});
exports.LevelDropdownView = LevelDropdownView;
-
diff --git a/src/js/views/multiView.js b/src/js/views/multiView.js
index faffa3d0..d85bafb9 100644
--- a/src/js/views/multiView.js
+++ b/src/js/views/multiView.js
@@ -48,7 +48,7 @@ var MultiView = Backbone.View.extend({
this.childViews = [];
this.currentIndex = 0;
- this.navEvents = _.clone(Backbone.Events);
+ this.navEvents = Object.assign({}, Backbone.Events);
this.navEvents.on('negative', this.getNegFunc(), this);
this.navEvents.on('positive', this.getPosFunc(), this);
this.navEvents.on('quit', this.finish, this);
@@ -192,4 +192,3 @@ var MultiView = Backbone.View.extend({
});
exports.MultiView = MultiView;
-
diff --git a/src/js/visuals/visualization.js b/src/js/visuals/visualization.js
index 5cf27cb4..739af574 100644
--- a/src/js/visuals/visualization.js
+++ b/src/js/visuals/visualization.js
@@ -1,4 +1,3 @@
-var _ = require('underscore');
var Backbone = require('backbone');
var Collections = require('../models/collections');
@@ -13,7 +12,7 @@ var Visualization = Backbone.View.extend({
initialize: function(options) {
options = options || {};
this.options = options;
- this.customEvents = _.clone(Backbone.Events);
+ this.customEvents = Object.assign({}, Backbone.Events);
this.containerElement = options.containerElement;
var _this = this;
From 0134bf9870546b30dbedab4ccff114fd0e94897b Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?=EF=BC=A8=EF=BD=8F=EF=BD=8E=EF=BD=87=EF=BD=81=EF=BD=92?=
=?UTF-8?q?=EF=BD=83?=
Date: Sat, 1 Dec 2018 08:05:27 +0700
Subject: [PATCH 027/359] Replace some '_.each' with 'Array.prototype.forEach'
---
Gruntfile.js | 5 +--
src/js/commands/index.js | 4 +-
src/js/git/commands.js | 3 +-
src/js/git/index.js | 94 +++++++++++++++++++---------------------
4 files changed, 50 insertions(+), 56 deletions(-)
diff --git a/Gruntfile.js b/Gruntfile.js
index 4d007c18..ab271d4a 100644
--- a/Gruntfile.js
+++ b/Gruntfile.js
@@ -62,7 +62,7 @@ module.exports = function(grunt) {
hashedMinFile = 'bundle.js';
}
var jsRegex = /bundle\.min\.\w+\.js/;
- _.each(buildFiles, function(jsFile) {
+ buildFiles.forEach(function(jsFile) {
if (jsRegex.test(jsFile)) {
if (hashedMinFile) {
throw new Error('more than one hashed file: ' + jsFile + hashedMinFile);
@@ -76,7 +76,7 @@ module.exports = function(grunt) {
var styleRegex = /main\.\w+\.css/;
var hashedStyleFile;
- _.each(buildFiles, function(styleFile) {
+ buildFiles.forEach(function(styleFile) {
if (styleRegex.test(styleFile)) {
if (hashedStyleFile) {
throw new Error('more than one hashed style: ' + styleFile + hashedStyleFile);
@@ -253,4 +253,3 @@ module.exports = function(grunt) {
grunt.registerTask('test', ['jasmine_node']);
grunt.registerTask('casperTest', ['shell:casperTest']);
};
-
diff --git a/src/js/commands/index.js b/src/js/commands/index.js
index 2f896e1c..64706d34 100644
--- a/src/js/commands/index.js
+++ b/src/js/commands/index.js
@@ -34,7 +34,7 @@ var commands = {
if (result.multiDelegate) {
// we need to do multiple delegations with
// a different command at each step
- _.each(result.multiDelegate, function(delConfig) {
+ result.multiDelegate.forEach(function(delConfig) {
// copy command, and then set opts
commandObj.setOptionsMap(delConfig.options || {});
commandObj.setGeneralArgs(delConfig.args || []);
@@ -70,7 +70,7 @@ var commands = {
var displayName = config.displayName || name;
var thisMap = {};
// start all options off as disabled
- _.each(config.options, function(option) {
+ (config.options || []).forEach(function(option) {
thisMap[option] = false;
});
optionMap[vcs][displayName] = thisMap;
diff --git a/src/js/git/commands.js b/src/js/git/commands.js
index cdec783b..949f47ae 100644
--- a/src/js/git/commands.js
+++ b/src/js/git/commands.js
@@ -431,7 +431,7 @@ var commandConfig = {
names = names.concat(generalArgs);
command.validateArgBounds(names, 1, Number.MAX_VALUE, '-d');
- _.each(names, function(name) {
+ names.forEach(function(name) {
engine.validateAndDeleteBranch(name);
});
return;
@@ -856,4 +856,3 @@ var instantCommands = [
exports.commandConfig = commandConfig;
exports.instantCommands = instantCommands;
-
diff --git a/src/js/git/index.js b/src/js/git/index.js
index 2e163168..e38fe572 100644
--- a/src/js/git/index.js
+++ b/src/js/git/index.js
@@ -170,7 +170,7 @@ GitEngine.prototype.exportTreeForBranch = function(branchName) {
// now loop through and delete commits
var commitsToLoop = tree.commits;
tree.commits = {};
- _.each(commitsToLoop, function(commit, id) {
+ commitsToLoop.forEach(function(commit, id) {
if (set[id]) {
// if included in target branch
tree.commits[id] = commit;
@@ -179,7 +179,7 @@ GitEngine.prototype.exportTreeForBranch = function(branchName) {
var branchesToLoop = tree.branches;
tree.branches = {};
- _.each(branchesToLoop, function(branch, id) {
+ branchesToLoop.forEach(function(branch, id) {
if (id === branchName) {
tree.branches[id] = branch;
}
@@ -200,30 +200,28 @@ GitEngine.prototype.exportTree = function() {
HEAD: null
};
- _.each(this.branchCollection.toJSON(), function(branch) {
+ this.branchCollection.toJSON().forEach(function(branch) {
branch.target = branch.target.get('id');
delete branch.visBranch;
totalExport.branches[branch.id] = branch;
});
- _.each(this.commitCollection.toJSON(), function(commit) {
+ this.commitCollection.toJSON().forEach(function(commit) {
// clear out the fields that reference objects and create circular structure
- _.each(Commit.prototype.constants.circularFields, function(field) {
+ Commit.prototype.constants.circularFields.forEach(function(field) {
delete commit[field];
- }, this);
+ });
// convert parents
- var parents = [];
- _.each(commit.parents, function(par) {
- parents.push(par.get('id'));
+ commit.parents = (commit.parents || []).map(function(par) {
+ return par.get('id');
});
- commit.parents = parents;
totalExport.commits[commit.id] = commit;
}, this);
- _.each(this.tagCollection.toJSON(), function(tag) {
+ this.tagCollection.toJSON().forEach(function(tag) {
delete tag.visTag;
tag.target = tag.target.get('id');
@@ -558,9 +556,8 @@ GitEngine.prototype.getOrMakeRecursive = function(
// for commits, we need to grab all the parents
var commitJSON = tree.commits[objID];
- var parentObjs = [];
- _.each(commitJSON.parents, function(parentID) {
- parentObjs.push(this.getOrMakeRecursive(tree, createdSoFar, parentID));
+ var parentObjs = commitJSON.parents.map(function(parentID) {
+ return this.getOrMakeRecursive(tree, createdSoFar, parentID);
}, this);
var commit = new Commit(Object.assign(
@@ -774,17 +771,16 @@ GitEngine.prototype.printBranchesWithout = function(without) {
var commitToBranches = this.getUpstreamBranchSet();
var commitID = this.getCommitFromRef(without).get('id');
- var toPrint = [];
- _.each(commitToBranches[commitID], function(branchJSON) {
+ var toPrint = commitToBranches[commitID].map(function (branchJSON) {
branchJSON.selected = this.HEAD.get('target').get('id') == branchJSON.id;
- toPrint.push(branchJSON);
+ return branchJSON;
}, this);
this.printBranches(toPrint);
};
GitEngine.prototype.printBranches = function(branches) {
var result = '';
- _.each(branches, function(branch) {
+ branches.forEach(function (branch) {
result += (branch.selected ? '* ' : '') + branch.id + '\n';
});
throw new CommandResult({
@@ -794,7 +790,7 @@ GitEngine.prototype.printBranches = function(branches) {
GitEngine.prototype.printTags = function(tags) {
var result = '';
- _.each(tags, function(tag) {
+ tags.forEach(function (tag) {
result += tag.id + '\n';
});
throw new CommandResult({
@@ -895,11 +891,11 @@ GitEngine.prototype.revert = function(whichCommits) {
}.bind(this);
// set up the promise chain
- _.each(toRevert, function(commit) {
+ toRevert.forEach(function (commit) {
chain = chain.then(function() {
return chainStep(commit);
});
- }, this);
+ });
// done! update our location
chain = chain.then(function() {
@@ -934,7 +930,7 @@ GitEngine.prototype.setupCherrypickChain = function(toCherrypick) {
);
}.bind(this);
- _.each(toCherrypick, function(arg) {
+ toCherrypick.forEach(function (arg) {
chain = chain.then(function() {
return chainStep(arg);
});
@@ -1015,7 +1011,7 @@ GitEngine.prototype.getTargetGraphDifference = function(
while (toExplore.length) {
var here = toExplore.pop();
difference.push(here);
- _.each(here.parents, pushParent);
+ here.parents.forEach(pushParent);
}
// filter because we weren't doing graph search
@@ -1160,7 +1156,7 @@ GitEngine.prototype.push = function(options) {
var deferred = Q.defer();
var chain = deferred.promise;
- _.each(commitsToMake, function(commitJSON) {
+ commitsToMake.forEach(function(commitJSON) {
chain = chain.then(function() {
return this.animationFactory.playHighlightPromiseAnimation(
this.refs[commitJSON.id],
@@ -1267,7 +1263,7 @@ GitEngine.prototype.fetchCore = function(sourceDestPairs, options) {
// first check if our local remote branch is upstream of the origin branch set.
// this check essentially pretends the local remote branch is in origin and
// could be fast forwarded (basic sanity check)
- _.each(sourceDestPairs, function(pair) {
+ sourceDestPairs.forEach(function (pair) {
this.checkUpstreamOfSource(
this,
this.origin,
@@ -1278,7 +1274,7 @@ GitEngine.prototype.fetchCore = function(sourceDestPairs, options) {
// then we get the difference in commits between these two graphs
var commitsToMake = [];
- _.each(sourceDestPairs, function(pair) {
+ sourceDestPairs.forEach(function (pair) {
commitsToMake = commitsToMake.concat(this.getTargetGraphDifference(
this,
this.origin,
@@ -1341,7 +1337,7 @@ GitEngine.prototype.fetchCore = function(sourceDestPairs, options) {
}
var originBranchSet = this.origin.getUpstreamBranchSet();
- _.each(commitsToMake, function(commitJSON) {
+ commitsToMake.forEach(function (commitJSON) {
// technically we could grab the wrong one here
// but this works for now
var originBranch = originBranchSet[commitJSON.id][0].obj;
@@ -1364,7 +1360,7 @@ GitEngine.prototype.fetchCore = function(sourceDestPairs, options) {
chain = chain.then(function() {
// update all the destinations
- _.each(sourceDestPairs, function(pair) {
+ sourceDestPairs.forEach(function (pair) {
var ours = this.refs[pair.destination];
var theirCommitID = this.origin.getCommitFromRef(pair.source).get('id');
// by definition we just made the commit with this id,
@@ -1736,8 +1732,8 @@ GitEngine.prototype.updateBranchesFromSet = function(commitSet) {
var branchesToUpdate = {};
// now loop over the set we got passed in and find which branches
// that means (aka intersection)
- _.each(commitSet, function(val, id) {
- _.each(upstreamSet[id], function(branchJSON) {
+ commitSet.forEach(function (val, id) {
+ upstreamSet[id].forEach(function (branchJSON) {
branchesToUpdate[branchJSON.id] = true;
});
}, this);
@@ -1777,7 +1773,7 @@ GitEngine.prototype.syncRemoteBranchFills = function() {
GitEngine.prototype.updateBranchesForHg = function(branchList) {
var hasUpdated = false;
- _.each(branchList, function(branchID) {
+ branchList.forEach(function (branchID) {
// ok now just check if this branch has a more recent commit available.
// that mapping is easy because we always do rebase alt id --
// theres no way to have C3' and C3''' but no C3''. so just
@@ -1846,7 +1842,7 @@ GitEngine.prototype.pruneTree = function() {
this.command.addWarning(intl.str('hg-prune-tree'));
}
- _.each(toDelete, function(commit) {
+ toDelete.forEach(function (commit) {
commit.removeFromParents();
this.commitCollection.remove(commit);
@@ -1877,7 +1873,7 @@ GitEngine.prototype.getUpstreamCollectionSet = function(collection) {
var inArray = function(arr, id) {
var found = false;
- _.each(arr, function(wrapper) {
+ arr.forEach(function (wrapper) {
if (wrapper.id == id) {
found = true;
}
@@ -1902,7 +1898,7 @@ GitEngine.prototype.getUpstreamCollectionSet = function(collection) {
collection.each(function(ref) {
var set = bfsSearch(ref.get('target'));
- _.each(set, function(id) {
+ set.forEach(function (id) {
commitToSet[id] = commitToSet[id] || [];
// only add it if it's not there, so hue blending is ok
@@ -2156,7 +2152,7 @@ GitEngine.prototype.rebase = function(targetSource, currentLocation, options) {
GitEngine.prototype.getUpstreamDiffSetFromSet = function(stopSet, location) {
var set = {};
- _.each(this.getUpstreamDiffFromSet(stopSet, location), function(commit) {
+ this.getUpstreamDiffFromSet(stopSet, location).forEach(function (commit) {
set[commit.get('id')] = true;
});
return set;
@@ -2189,7 +2185,7 @@ GitEngine.prototype.getInteractiveRebaseCommits = function(targetSource, current
// throw out merge's real fast and see if we have anything to do
var toRebase = [];
- _.each(toRebaseRough, function(commit) {
+ toRebaseRough.forEach(function (commit) {
if (commit.get('parents').length == 1) {
toRebase.push(commit);
}
@@ -2211,7 +2207,7 @@ GitEngine.prototype.rebaseInteractiveTest = function(targetSource, currentLocati
var toRebase = this.getInteractiveRebaseCommits(targetSource, currentLocation);
var rebaseMap = {};
- _.each(toRebase, function(commit) {
+ toRebase.forEach(function (commit) {
var id = commit.get('id');
rebaseMap[id] = commit;
});
@@ -2228,7 +2224,7 @@ GitEngine.prototype.rebaseInteractiveTest = function(targetSource, currentLocati
// Verify each chosen commit exists in the list of commits given to the user
var extraCommits = [];
rebaseOrder = [];
- _.each(idsToRebase, function(id) {
+ idsToRebase.forEach(function (id) {
if (id in rebaseMap) {
rebaseOrder.push(rebaseMap[id]);
} else {
@@ -2281,13 +2277,13 @@ GitEngine.prototype.rebaseInteractive = function(targetSource, currentLocation,
var initialCommitOrdering;
if (options.initialCommitOrdering && options.initialCommitOrdering.length > 0) {
var rebaseMap = {};
- _.each(toRebase, function(commit) {
+ toRebase.forEach(function (commit) {
rebaseMap[commit.get('id')] = true;
});
// Verify each chosen commit exists in the list of commits given to the user
initialCommitOrdering = [];
- _.each(options.initialCommitOrdering[0].split(','), function(id) {
+ options.initialCommitOrdering[0].split(',').forEach(function (id) {
if (!rebaseMap[id]) {
throw new GitError({
msg: intl.todo('Hey those commits don\'t exist in the set!')
@@ -2406,7 +2402,7 @@ GitEngine.prototype.rebaseFinish = function(
}.bind(this);
// set up the promise chain
- _.each(toRebase, function(commit) {
+ toRebase.forEach(function (commit) {
chain = chain.then(function() {
return chainStep(commit);
});
@@ -2561,7 +2557,7 @@ GitEngine.prototype.describe = function(ref) {
// ok we need to BFS from start upwards until we hit a tag. but
// first we need to get a reverse mapping from tag to commit
var tagMap = {};
- _.each(this.tagCollection.toJSON(), function(tag) {
+ this.tagCollection.toJSON().forEach(function (tag) {
tagMap[tag.target.get('id')] = tag.id;
});
@@ -2733,7 +2729,7 @@ GitEngine.prototype.status = function() {
lines.push(intl.str('git-status-readytocommit'));
var msg = '';
- _.each(lines, function(line) {
+ lines.forEach(function (line) {
msg += '# ' + line + '\n';
});
@@ -2776,7 +2772,7 @@ GitEngine.prototype.log = function(ref, omitSet) {
// now go through and collect logs
var bigLogStr = '';
- _.each(toDump, function(c) {
+ toDump.forEach(function (c) {
bigLogStr += c.getLogEntry();
}, this);
@@ -2831,7 +2827,7 @@ GitEngine.prototype.getDownstreamSet = function(ancestor) {
var here = queue.pop();
var children = here.get('children');
- _.each(children, addToExplored);
+ children.forEach(addToExplored);
}
return exploredSet;
};
@@ -3009,7 +3005,7 @@ var Commit = Backbone.Model.extend({
},
removeFromParents: function() {
- _.each(this.get('parents'), function(parent) {
+ this.get('parents').forEach(function (parent) {
parent.removeChild(this);
}, this);
},
@@ -3052,11 +3048,11 @@ var Commit = Backbone.Model.extend({
removeChild: function(childToRemove) {
var newChildren = [];
- _.each(this.get('children'), function(child) {
+ this.get('children').forEach(function (child) {
if (child !== childToRemove) {
newChildren.push(child);
}
- }, this);
+ });
this.set('children', newChildren);
},
@@ -3069,7 +3065,7 @@ var Commit = Backbone.Model.extend({
this.validateAtInit();
this.addNodeToVisuals();
- _.each(this.get('parents'), function(parent) {
+ (this.get('parents') || []).forEach(function (parent) {
parent.get('children').push(this);
this.addEdgeToVisuals(parent);
}, this);
From 7af2db3da50391d12e7a6f00cb55ccf61306b270 Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?=EF=BC=A8=EF=BD=8F=EF=BD=8E=EF=BD=87=EF=BD=81=EF=BD=92?=
=?UTF-8?q?=EF=BD=83?=
Date: Sat, 1 Dec 2018 08:20:42 +0700
Subject: [PATCH 028/359] Replace '_.map' to 'Array.prototype.map'
---
src/js/git/commands.js | 2 +-
src/js/git/index.js | 12 ++++++------
src/js/models/commandModel.js | 2 +-
src/js/views/gitDemonstrationView.js | 4 ++--
src/js/views/levelDropdownView.js | 2 +-
5 files changed, 11 insertions(+), 11 deletions(-)
diff --git a/src/js/git/commands.js b/src/js/git/commands.js
index 949f47ae..0b8528eb 100644
--- a/src/js/git/commands.js
+++ b/src/js/git/commands.js
@@ -190,7 +190,7 @@ var commandConfig = {
var set = Graph.getUpstreamSet(engine, 'HEAD');
// first resolve all the refs (as an error check)
- var toCherrypick = _.map(generalArgs, function(arg) {
+ var toCherrypick = generalArgs.map(function (arg) {
var commit = engine.getCommitFromRef(arg);
// and check that its not upstream
if (set[commit.get('id')]) {
diff --git a/src/js/git/index.js b/src/js/git/index.js
index e38fe572..b6874e8f 100644
--- a/src/js/git/index.js
+++ b/src/js/git/index.js
@@ -857,7 +857,7 @@ GitEngine.prototype.makeCommit = function(parents, id, options) {
GitEngine.prototype.revert = function(whichCommits) {
// resolve the commits we will rebase
- var toRevert = _.map(whichCommits, function(stringRef) {
+ var toRevert = whichCommits.map(function(stringRef) {
return this.getCommitFromRef(stringRef);
}, this);
@@ -1138,7 +1138,7 @@ GitEngine.prototype.push = function(options) {
var makeCommit = function(id, parentIDs) {
// need to get the parents first. since we order by depth, we know
// the dependencies are there already
- var parents = _.map(parentIDs, function(parentID) {
+ var parents = parentIDs.map(function(parentID) {
return this.origin.refs[parentID];
}, this);
return this.origin.makeCommit(parents, id);
@@ -1246,7 +1246,7 @@ GitEngine.prototype.fetch = function(options) {
}
// get all remote branches and specify the dest / source pairs
var allBranchesOnRemote = this.origin.branchCollection.toArray();
- var sourceDestPairs = _.map(allBranchesOnRemote, function(branch) {
+ var sourceDestPairs = allBranchesOnRemote.map(function(branch) {
var branchName = branch.get('id');
didMakeBranch = didMakeBranch || this.makeRemoteBranchIfNeeded(branchName);
@@ -1312,7 +1312,7 @@ GitEngine.prototype.fetchCore = function(sourceDestPairs, options) {
var makeCommit = function(id, parentIDs) {
// need to get the parents first. since we order by depth, we know
// the dependencies are there already
- var parents = _.map(parentIDs, function(parentID) {
+ var parents = parentIDs.map(function(parentID) {
return this.refs[parentID];
}, this);
return this.makeCommit(parents, id);
@@ -1738,7 +1738,7 @@ GitEngine.prototype.updateBranchesFromSet = function(commitSet) {
});
}, this);
- var branchList = _.map(branchesToUpdate, function(val, id) {
+ var branchList = branchesToUpdate.map(function(val, id) {
return id;
});
return this.updateBranchesForHg(branchList);
@@ -2340,7 +2340,7 @@ GitEngine.prototype.filterRebaseCommits = function(
GitEngine.prototype.getRebasePreserveMergesParents = function(oldCommit) {
var oldParents = oldCommit.get('parents');
- return _.map(oldParents, function(parent) {
+ return oldParents.map(function(parent) {
var oldID = parent.get('id');
var newID = this.getMostRecentBumpedID(oldID);
return this.refs[newID];
diff --git a/src/js/models/commandModel.js b/src/js/models/commandModel.js
index a8264ba6..f8932e10 100644
--- a/src/js/models/commandModel.js
+++ b/src/js/models/commandModel.js
@@ -78,7 +78,7 @@ var Command = Backbone.Model.extend({
var generalArgs = this.getGeneralArgs();
var options = this.getOptionsMap();
- generalArgs = _.map(generalArgs, function(arg) {
+ generalArgs = generalArgs.map(function(arg) {
return this.replaceDotWithHead(arg);
}, this);
var newMap = {};
diff --git a/src/js/views/gitDemonstrationView.js b/src/js/views/gitDemonstrationView.js
index e769bd78..96460200 100644
--- a/src/js/views/gitDemonstrationView.js
+++ b/src/js/views/gitDemonstrationView.js
@@ -83,8 +83,8 @@ var GitDemonstrationView = ContainedBase.extend({
},
checkScroll: function() {
- var children = this.$('div.demonstrationText').children();
- var heights = _.map(children, function(child) { return child.clientHeight; });
+ var children = this.$('div.demonstrationText').children().toArray();
+ var heights = children.map(function(child) { return child.clientHeight; });
var totalHeight = _.reduce(heights, function(a, b) { return a + b; });
if (totalHeight < this.$('div.demonstrationText').height()) {
this.$('div.demonstrationText').addClass('noLongText');
diff --git a/src/js/views/levelDropdownView.js b/src/js/views/levelDropdownView.js
index 31c29024..74fd809f 100644
--- a/src/js/views/levelDropdownView.js
+++ b/src/js/views/levelDropdownView.js
@@ -211,7 +211,7 @@ var LevelDropdownView = ContainedBase.extend({
},
getTabIndex: function() {
- var ids = _.map(this.JSON.tabs, function(tab) {
+ var ids = this.JSON.tabs.map(function(tab) {
return tab.id;
});
return ids.indexOf(this.JSON.selectedTab);
From e324e51587263c88fdaf0bbfd38f1735ef11d455 Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?=EF=BC=A8=EF=BD=8F=EF=BD=8E=EF=BD=87=EF=BD=81=EF=BD=92?=
=?UTF-8?q?=EF=BD=83?=
Date: Sat, 1 Dec 2018 08:22:40 +0700
Subject: [PATCH 029/359] Replace '_.reduce' to 'Array.prototype.reduce'
---
src/js/views/gitDemonstrationView.js | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/src/js/views/gitDemonstrationView.js b/src/js/views/gitDemonstrationView.js
index 96460200..13b0469f 100644
--- a/src/js/views/gitDemonstrationView.js
+++ b/src/js/views/gitDemonstrationView.js
@@ -85,7 +85,7 @@ var GitDemonstrationView = ContainedBase.extend({
checkScroll: function() {
var children = this.$('div.demonstrationText').children().toArray();
var heights = children.map(function(child) { return child.clientHeight; });
- var totalHeight = _.reduce(heights, function(a, b) { return a + b; });
+ var totalHeight = heights.reduce(function(a, b) { return a + b; });
if (totalHeight < this.$('div.demonstrationText').height()) {
this.$('div.demonstrationText').addClass('noLongText');
}
From dddf063146890ef4e0a898cd00426fd61f82e62a Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?=EF=BC=A8=EF=BD=8F=EF=BD=8E=EF=BD=87=EF=BD=81=EF=BD=92?=
=?UTF-8?q?=EF=BD=83?=
Date: Sat, 1 Dec 2018 08:27:01 +0700
Subject: [PATCH 030/359] Replace '_.filter' to 'Array.prototype.filter'
---
src/js/git/index.js | 10 +++++-----
src/js/views/levelDropdownView.js | 2 +-
2 files changed, 6 insertions(+), 6 deletions(-)
diff --git a/src/js/git/index.js b/src/js/git/index.js
index b6874e8f..1b3299fc 100644
--- a/src/js/git/index.js
+++ b/src/js/git/index.js
@@ -755,14 +755,14 @@ GitEngine.prototype.getBranches = function() {
GitEngine.prototype.getRemoteBranches = function() {
var all = this.getBranches();
- return _.filter(all, function(branchJSON) {
+ return all.filter(function(branchJSON) {
return branchJSON.remote === true;
});
};
GitEngine.prototype.getLocalBranches = function() {
var all = this.getBranches();
- return _.filter(all, function(branchJSON) {
+ return all.filter(function(branchJSON) {
return branchJSON.remote === false;
});
};
@@ -1131,7 +1131,7 @@ GitEngine.prototype.push = function(options) {
// and remote master might be commits C2, C3, and C4, but the remote
// might already have those commits. In this case, we don't need to
// make them, so filter these out
- commitsToMake = _.filter(commitsToMake, function(commitJSON) {
+ commitsToMake = commitsToMake.filter(function(commitJSON) {
return !this.origin.refs[commitJSON.id];
}, this);
@@ -1305,7 +1305,7 @@ GitEngine.prototype.fetchCore = function(sourceDestPairs, options) {
// and remote master might be commits C2, C3, and C4, but we
// might already have those commits. In this case, we don't need to
// make them, so filter these out
- commitsToMake = _.filter(commitsToMake, function(commitJSON) {
+ commitsToMake = commitsToMake.filter(function(commitJSON) {
return !this.refs[commitJSON.id];
}, this);
@@ -2315,7 +2315,7 @@ GitEngine.prototype.filterRebaseCommits = function(
var uniqueIDs = {};
// resolve the commits we will rebase
- return _.filter(toRebaseRough, function(commit) {
+ return toRebaseRough.filter(function(commit) {
// no merge commits, unless we preserve
if (commit.get('parents').length !== 1 && !options.preserveMerges) {
return false;
diff --git a/src/js/views/levelDropdownView.js b/src/js/views/levelDropdownView.js
index 74fd809f..cfbfec3d 100644
--- a/src/js/views/levelDropdownView.js
+++ b/src/js/views/levelDropdownView.js
@@ -235,7 +235,7 @@ var LevelDropdownView = ContainedBase.extend({
},
getSequencesOnTab: function() {
- return _.filter(this.sequences, function(sequenceName) {
+ return this.sequences.filter(function(sequenceName) {
var tab = LEVELS.getTabForSequence(sequenceName);
return tab === this.JSON.selectedTab;
}, this);
From ce61c97cf0e0309fbed2cccfcdb7545cad76a2ea Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?=EF=BC=A8=EF=BD=8F=EF=BD=8E=EF=BD=87=EF=BD=81=EF=BD=92?=
=?UTF-8?q?=EF=BD=83?=
Date: Sat, 1 Dec 2018 08:29:11 +0700
Subject: [PATCH 031/359] Replace '_.keys' to 'Object.prototype.keys'
---
src/js/stores/LevelStore.js | 2 +-
src/js/views/builderViews.js | 3 +--
src/js/views/rebaseView.js | 2 +-
3 files changed, 3 insertions(+), 4 deletions(-)
diff --git a/src/js/stores/LevelStore.js b/src/js/stores/LevelStore.js
index edacc524..3b160c3e 100644
--- a/src/js/stores/LevelStore.js
+++ b/src/js/stores/LevelStore.js
@@ -89,7 +89,7 @@ AppConstants.StoreSubscribePrototype,
},
getSequences: function() {
- return _.keys(levelSequences);
+ return Object.keys(levelSequences);
},
getLevelsInSequence: function(sequenceName) {
diff --git a/src/js/views/builderViews.js b/src/js/views/builderViews.js
index 9d2ba96f..89a6f8b9 100644
--- a/src/js/views/builderViews.js
+++ b/src/js/views/builderViews.js
@@ -295,7 +295,7 @@ var MultiViewBuilder = ContainedBase.extend({
this.JSON = {
views: this.getChildViews(),
- supportedViews: _.keys(this.typeToConstructor)
+ supportedViews: Object.keys(this.typeToConstructor)
};
this.container = new ModalTerminal({
@@ -416,4 +416,3 @@ exports.DemonstrationBuilder = DemonstrationBuilder;
exports.TextGrabber = TextGrabber;
exports.MultiViewBuilder = MultiViewBuilder;
exports.MarkdownPresenter = MarkdownPresenter;
-
diff --git a/src/js/views/rebaseView.js b/src/js/views/rebaseView.js
index 49403561..accae218 100644
--- a/src/js/views/rebaseView.js
+++ b/src/js/views/rebaseView.js
@@ -78,7 +78,7 @@ var InteractiveRebaseView = ContainedBase.extend({
render: function() {
var json = {
- num: _.keys(this.rebaseMap).length,
+ num: Object.keys(this.rebaseMap).length,
solutionOrder: this.options.initialCommitOrdering
};
From e17d974b55984e87c0cba5b24267d612f5db8d91 Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?=EF=BC=A8=EF=BD=8F=EF=BD=8E=EF=BD=87=EF=BD=81=EF=BD=92?=
=?UTF-8?q?=EF=BD=83?=
Date: Sat, 1 Dec 2018 08:40:56 +0700
Subject: [PATCH 032/359] Use 'util/escapeString' instead of _.escape
---
src/js/git/commands.js | 3 ++-
1 file changed, 2 insertions(+), 1 deletion(-)
diff --git a/src/js/git/commands.js b/src/js/git/commands.js
index 0b8528eb..88bf2bb5 100644
--- a/src/js/git/commands.js
+++ b/src/js/git/commands.js
@@ -1,3 +1,4 @@
+var escapeString = require('../util/escapeString');
var _ = require('underscore');
var intl = require('../intl');
@@ -830,7 +831,7 @@ var instantCommands = [
intl.str('git-version'),
' ',
intl.str('git-usage'),
- _.escape(intl.str('git-usage-command')),
+ escapeString(intl.str('git-usage-command')),
' ',
intl.str('git-supported-commands'),
' '
From d87fd095c083033d2cce7467ec5900318f4d6f1f Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?=EF=BC=A8=EF=BD=8F=EF=BD=8E=EF=BD=87=EF=BD=81=EF=BD=92?=
=?UTF-8?q?=EF=BD=83?=
Date: Sat, 1 Dec 2018 08:51:03 +0700
Subject: [PATCH 033/359] Use 'Object.values' and 'Object.keys' to get list
'keys' and 'values'
---
src/js/git/index.js | 4 +---
src/js/models/commandModel.js | 2 +-
2 files changed, 2 insertions(+), 4 deletions(-)
diff --git a/src/js/git/index.js b/src/js/git/index.js
index 1b3299fc..d92567d7 100644
--- a/src/js/git/index.js
+++ b/src/js/git/index.js
@@ -2090,9 +2090,7 @@ GitEngine.prototype.hgRebase = function(destination, base) {
});
});
- var branchList = _.map(branchMap, function(val, id) {
- return id;
- });
+ var branchList = Object.keys(branchMap);
chain = chain.then(function() {
// now we just moved a bunch of commits, but we haven't updated the
diff --git a/src/js/models/commandModel.js b/src/js/models/commandModel.js
index f8932e10..07f02c87 100644
--- a/src/js/models/commandModel.js
+++ b/src/js/models/commandModel.js
@@ -83,7 +83,7 @@ var Command = Backbone.Model.extend({
}, this);
var newMap = {};
_.each(options, function(args, key) {
- newMap[key] = _.map(args, function(arg) {
+ newMap[key] = Object.values(args).map(function (arg) {
return this.replaceDotWithHead(arg);
}, this);
}, this);
From bd8009386de0cb04763619cb1bb45e036be8c1fd Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?=EF=BC=A8=EF=BD=8F=EF=BD=8E=EF=BD=87=EF=BD=81=EF=BD=92?=
=?UTF-8?q?=EF=BD=83?=
Date: Sat, 1 Dec 2018 11:28:04 +0700
Subject: [PATCH 034/359] Use 'Array.prototype.forEach' instead of '_.each' and
'_.forEach'
---
src/js/git/index.js | 12 +++++-------
src/js/graph/index.js | 6 +++---
src/js/graph/treeCompare.js | 16 ++++++++--------
src/js/level/parseWaterfall.js | 9 ++++-----
src/js/models/commandModel.js | 2 +-
src/js/sandbox/commands.js | 4 ++--
src/js/stores/LevelStore.js | 4 ++--
src/js/views/commandViews.js | 3 +--
src/js/views/gitDemonstrationView.js | 2 +-
src/js/views/levelDropdownView.js | 8 ++++----
src/js/views/multiView.js | 4 ++--
src/js/views/rebaseView.js | 4 ++--
src/js/visuals/index.js | 26 +++++++++++++-------------
src/js/visuals/tree.js | 7 +++----
src/js/visuals/visBase.js | 11 +++++------
src/js/visuals/visBranch.js | 11 +++++------
src/js/visuals/visEdge.js | 2 +-
src/js/visuals/visNode.js | 16 ++++++++--------
src/js/visuals/visTag.js | 9 ++++-----
19 files changed, 74 insertions(+), 82 deletions(-)
diff --git a/src/js/git/index.js b/src/js/git/index.js
index d92567d7..abbf4408 100644
--- a/src/js/git/index.js
+++ b/src/js/git/index.js
@@ -1551,11 +1551,9 @@ GitEngine.prototype.fakeTeamwork = function(numToMake, branch) {
var deferred = Q.defer();
var chain = deferred.promise;
- _.each(_.range(numToMake), function(i) {
- chain = chain.then(function() {
- return chainStep();
- });
- });
+ for(var i = 0; i < numToMake; i++) {
+ chain = chain.then(chainStep);
+ }
this.animationQueue.thenFinish(chain, deferred);
};
@@ -2074,7 +2072,7 @@ GitEngine.prototype.hgRebase = function(destination, base) {
var masterSet = {};
masterSet[baseCommit.get('id')] = true;
- _.each([upstream, downstream].concat(moreSets), function(set) {
+ [upstream, downstream].concat(moreSets).forEach(function(set) {
_.each(set, function(val, id) {
masterSet[id] = true;
});
@@ -2085,7 +2083,7 @@ GitEngine.prototype.hgRebase = function(destination, base) {
var upstreamSet = this.getUpstreamBranchSet();
_.each(masterSet, function(val, commitID) {
// now loop over that commits branches
- _.each(upstreamSet[commitID], function(branchJSON) {
+ upstreamSet[commitID].forEach(function(branchJSON) {
branchMap[branchJSON.id] = true;
});
});
diff --git a/src/js/graph/index.js b/src/js/graph/index.js
index ed2c0745..584f788d 100644
--- a/src/js/graph/index.js
+++ b/src/js/graph/index.js
@@ -85,7 +85,7 @@ var Graph = {
var commitJSON = tree.commits[objID];
var parentObjs = [];
- _.each(commitJSON.parents, function(parentID) {
+ commitJSON.parents.forEach(function(parentID) {
parentObjs.push(this.getOrMakeRecursive(tree, createdSoFar, parentID));
}, this);
@@ -143,7 +143,7 @@ var Graph = {
var here = queue.pop();
var rents = here.get('parents');
- _.each(rents, addToExplored);
+ (rents || []).forEach(addToExplored);
}
return exploredSet;
},
@@ -151,7 +151,7 @@ var Graph = {
getUniqueObjects: function(objects) {
var unique = {};
var result = [];
- _.forEach(objects, function(object) {
+ objects.forEach(function(object) {
if (unique[object.id]) {
return;
}
diff --git a/src/js/graph/treeCompare.js b/src/js/graph/treeCompare.js
index 823076b0..6318a3ec 100644
--- a/src/js/graph/treeCompare.js
+++ b/src/js/graph/treeCompare.js
@@ -115,7 +115,7 @@ TreeCompare.compareAllTagsWithinTrees = function(treeA, treeB) {
TreeCompare.compareBranchesWithinTrees = function(treeA, treeB, branches) {
var result = true;
- _.each(branches, function(branchName) {
+ branches.forEach(function(branchName) {
result = result && this.compareBranchWithinTrees(treeA, treeB, branchName);
}, this);
@@ -176,7 +176,7 @@ TreeCompare.compareBranchesWithinTreesHashAgnostic = function(treeA, treeB, bran
var recurseCompare = this.getRecurseCompareHashAgnostic(treeA, treeB);
var result = true;
- _.each(branches, function(branchName) {
+ branches.forEach(function(branchName) {
var branchA = treeA.branches[branchName];
var branchB = treeB.branches[branchName];
@@ -217,7 +217,7 @@ TreeCompare.evalAssertsOnBranch = function(tree, branchName, asserts) {
}
var result = true;
- _.each(asserts, function(assert) {
+ asserts.forEach(function(assert) {
try {
result = result && assert(data);
} catch (err) {
@@ -305,7 +305,7 @@ TreeCompare.getRecurseCompare = function(treeA, treeB, options) {
// 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 maxNumParents = Math.max(commitA.parents.length, commitB.parents.length);
- _.each(_.range(maxNumParents), function(index) {
+ for (var index = 0; index < maxNumParents; index++) {
var pAid = commitA.parents[index];
var pBid = commitB.parents[index];
@@ -315,7 +315,7 @@ TreeCompare.getRecurseCompare = function(treeA, treeB, options) {
var childB = treeB.commits[pBid];
result = result && recurseCompare(childA, childB);
- }, this);
+ }
// if each of our children recursively are equal, we are good
return result;
};
@@ -377,7 +377,7 @@ TreeCompare.reduceTreeFields = function(trees) {
tags: {}
};
- _.each(trees, function(tree) {
+ trees.forEach(function(tree) {
_.each(treeDefaults, function(val, key) {
if (tree[key] === undefined) {
tree[key] = val;
@@ -391,7 +391,7 @@ TreeCompare.reduceTreeFields = function(trees) {
_.each(objects, function(obj, objKey) {
// our blank slate to copy over
var blank = {};
- _.each(saveFields, function(field) {
+ saveFields.forEach(function(field) {
if (obj[field] !== undefined) {
blank[field] = obj[field];
} else if (defaults[field] !== undefined) {
@@ -410,7 +410,7 @@ TreeCompare.reduceTreeFields = function(trees) {
});
};
- _.each(trees, function(tree) {
+ trees.forEach(function(tree) {
saveOnly(tree, 'commits', commitSaveFields, commitSortFields);
saveOnly(tree, 'branches', branchSaveFields);
saveOnly(tree, 'tags', tagSaveFields);
diff --git a/src/js/level/parseWaterfall.js b/src/js/level/parseWaterfall.js
index 4a711f4f..d84fde97 100644
--- a/src/js/level/parseWaterfall.js
+++ b/src/js/level/parseWaterfall.js
@@ -68,7 +68,7 @@ ParseWaterfall.prototype.addLast = function(which, value) {
};
ParseWaterfall.prototype.expandAllShortcuts = function(commandStr) {
- _.each(this.shortcutWaterfall, function(shortcutMap) {
+ this.shortcutWaterfall.forEach(function(shortcutMap) {
commandStr = this.expandShortcut(commandStr, shortcutMap);
}, this);
return commandStr;
@@ -87,13 +87,13 @@ ParseWaterfall.prototype.expandShortcut = function(commandStr, shortcutMap) {
};
ParseWaterfall.prototype.processAllInstants = function(commandStr) {
- _.each(this.instantWaterfall, function(instantCommands) {
+ this.instantWaterfall.forEach(function(instantCommands) {
this.processInstant(commandStr, instantCommands);
}, this);
};
ParseWaterfall.prototype.processInstant = function(commandStr, instantCommands) {
- _.each(instantCommands, function(tuple) {
+ instantCommands.forEach(function(tuple) {
var regex = tuple[0];
var results = regex.exec(commandStr);
if (results) {
@@ -109,7 +109,7 @@ ParseWaterfall.prototype.parseAll = function(commandStr) {
}
var toReturn = false;
- _.each(this.parseWaterfall, function(parseFunc) {
+ this.parseWaterfall.forEach(function(parseFunc) {
var results = parseFunc(commandStr);
if (results) {
toReturn = results;
@@ -120,4 +120,3 @@ ParseWaterfall.prototype.parseAll = function(commandStr) {
};
exports.ParseWaterfall = ParseWaterfall;
-
diff --git a/src/js/models/commandModel.js b/src/js/models/commandModel.js
index 07f02c87..b8a9569f 100644
--- a/src/js/models/commandModel.js
+++ b/src/js/models/commandModel.js
@@ -93,7 +93,7 @@ var Command = Backbone.Model.extend({
deleteOptions: function(options) {
var map = this.getOptionsMap();
- _.each(options, function(option) {
+ options.forEach(function(option) {
delete map[option];
}, this);
this.setOptionsMap(map);
diff --git a/src/js/sandbox/commands.js b/src/js/sandbox/commands.js
index 83a741b0..8e3f57b1 100644
--- a/src/js/sandbox/commands.js
+++ b/src/js/sandbox/commands.js
@@ -98,7 +98,7 @@ var instantCommands = [
intl.str('show-all-commands'),
' '
];
- _.each(allCommands, function(regex, command) {
+ allCommands.forEach(function(regex, command) {
lines.push(command);
});
@@ -144,7 +144,7 @@ var getAllCommands = function() {
allCommands[vcs + ' ' + method] = regex;
});
});
- _.each(toDelete, function(key) {
+ toDelete.forEach(function(key) {
delete allCommands[key];
});
diff --git a/src/js/stores/LevelStore.js b/src/js/stores/LevelStore.js
index 3b160c3e..9f951b06 100644
--- a/src/js/stores/LevelStore.js
+++ b/src/js/stores/LevelStore.js
@@ -41,7 +41,7 @@ var validateLevel = function(level) {
'solutionCommand'
];
- _.each(requiredFields, function(field) {
+ requiredFields.forEach(function(field) {
if (level[field] === undefined) {
console.log(level);
throw new Error('I need this field for a level: ' + field);
@@ -59,7 +59,7 @@ _.each(levelSequences, function(levels, levelSequenceName) {
}
// for this particular sequence...
- _.each(levels, function(level, index) {
+ levels.forEach(function(level, index) {
validateLevel(level);
var id = levelSequenceName + String(index + 1);
diff --git a/src/js/views/commandViews.js b/src/js/views/commandViews.js
index 63ebef01..8dfa71ef 100644
--- a/src/js/views/commandViews.js
+++ b/src/js/views/commandViews.js
@@ -173,7 +173,7 @@ var CommandPromptView = Backbone.View.extend({
which.reverse();
var str = '';
- _.each(which, function(text) {
+ which.forEach(function(text) {
str += text + ';';
}, this);
@@ -202,4 +202,3 @@ var CommandPromptView = Backbone.View.extend({
});
exports.CommandPromptView = CommandPromptView;
-
diff --git a/src/js/views/gitDemonstrationView.js b/src/js/views/gitDemonstrationView.js
index 13b0469f..fc1da36d 100644
--- a/src/js/views/gitDemonstrationView.js
+++ b/src/js/views/gitDemonstrationView.js
@@ -168,7 +168,7 @@ var GitDemonstrationView = ContainedBase.extend({
var chainDeferred = Q.defer();
var chainPromise = chainDeferred.promise;
- _.each(commands, function(command, index) {
+ commands.forEach(function(command, index) {
chainPromise = chainPromise.then(function() {
var myDefer = Q.defer();
this.mainVis.gitEngine.dispatch(command, myDefer);
diff --git a/src/js/views/levelDropdownView.js b/src/js/views/levelDropdownView.js
index cfbfec3d..faf95b33 100644
--- a/src/js/views/levelDropdownView.js
+++ b/src/js/views/levelDropdownView.js
@@ -292,7 +292,7 @@ var LevelDropdownView = ContainedBase.extend({
$(selector).toggleClass('selected', value);
// also go find the series and update the about
- _.each(this.seriesViews, function(view) {
+ this.seriesViews.forEach(function(view) {
if (view.levelIDs.indexOf(id) === -1) {
return;
}
@@ -343,14 +343,14 @@ var LevelDropdownView = ContainedBase.extend({
},
updateSolvedStatus: function() {
- _.each(this.seriesViews, function(view) {
+ this.seriesViews.forEach(function(view) {
view.updateSolvedStatus();
}, this);
},
buildSequences: function() {
this.seriesViews = [];
- _.each(this.getSequencesOnTab(), function(sequenceName) {
+ this.getSequencesOnTab().forEach(function(sequenceName) {
this.seriesViews.push(new SeriesView({
destination: this.$el,
name: sequenceName,
@@ -377,7 +377,7 @@ var SeriesView = BaseView.extend({
this.levelIDs = [];
var firstLevelInfo = null;
- _.each(this.levels, function(level) {
+ this.levels.forEach(function(level) {
if (firstLevelInfo === null) {
firstLevelInfo = this.formatLevelAbout(level.id);
}
diff --git a/src/js/views/multiView.js b/src/js/views/multiView.js
index d85bafb9..9a3981ae 100644
--- a/src/js/views/multiView.js
+++ b/src/js/views/multiView.js
@@ -142,7 +142,7 @@ var MultiView = Backbone.View.extend({
// other views will take if they need to
this.keyboardListener.mute();
- _.each(this.childViews, function(childView) {
+ this.childViews.forEach(function(childView) {
childView.die();
});
@@ -183,7 +183,7 @@ var MultiView = Backbone.View.extend({
render: function() {
// go through each and render... show the first
- _.each(this.childViewJSONs, function(childViewJSON, index) {
+ this.childViewJSONs.forEach(function(childViewJSON, index) {
var childView = this.createChildView(childViewJSON);
this.childViews.push(childView);
this.addNavToView(childView, index);
diff --git a/src/js/views/rebaseView.js b/src/js/views/rebaseView.js
index accae218..b79e0b64 100644
--- a/src/js/views/rebaseView.js
+++ b/src/js/views/rebaseView.js
@@ -19,7 +19,7 @@ var InteractiveRebaseView = ContainedBase.extend({
this.rebaseEntries = new RebaseEntryCollection();
options.toRebase.reverse();
- _.each(options.toRebase, function(commit) {
+ options.toRebase.forEach(function(commit) {
var id = commit.get('id');
this.rebaseMap[id] = commit;
@@ -63,7 +63,7 @@ var InteractiveRebaseView = ContainedBase.extend({
// now get the real array
var toRebase = [];
- _.each(uiOrder, function(id) {
+ uiOrder.forEach(function(id) {
// the model pick check
if (this.entryObjMap[id].get('pick')) {
toRebase.unshift(this.rebaseMap[id]);
diff --git a/src/js/visuals/index.js b/src/js/visuals/index.js
index 604afef6..08fe4db6 100644
--- a/src/js/visuals/index.js
+++ b/src/js/visuals/index.js
@@ -58,7 +58,7 @@ GitVisuals.prototype.defer = function(action) {
};
GitVisuals.prototype.deferFlush = function() {
- _.each(this.deferred, function(action) {
+ this.deferred.forEach(function(action) {
action();
}, this);
this.deferred = [];
@@ -68,17 +68,17 @@ GitVisuals.prototype.resetAll = function() {
// make sure to copy these collections because we remove
// items in place and underscore is too dumb to detect length change
var edges = this.visEdgeCollection.toArray();
- _.each(edges, function(visEdge) {
+ edges.forEach(function(visEdge) {
visEdge.remove();
}, this);
var branches = this.visBranchCollection.toArray();
- _.each(branches, function(visBranch) {
+ branches.forEach(function(visBranch) {
visBranch.remove();
}, this);
var tags = this.visTagCollection.toArray();
- _.each(tags, function(visTag) {
+ tags.forEach(function(visTag) {
visTag.remove();
}, this);
@@ -332,7 +332,7 @@ GitVisuals.prototype.explodeNodes = function(speed) {
// are called unnecessarily when they have almost
// zero speed. would be interesting to see performance differences
var keepGoing = [];
- _.each(funcs, function(func) {
+ funcs.forEach(function(func) {
if (func()) {
keepGoing.push(func);
}
@@ -485,7 +485,7 @@ GitVisuals.prototype.getBlendedHuesForCommit = function(commit) {
GitVisuals.prototype.blendHuesFromBranchStack = function(branchStackArray) {
var hueStrings = [];
- _.each(branchStackArray, function(branchWrapper) {
+ branchStackArray.forEach(function(branchWrapper) {
var fill = branchWrapper.obj.get('visBranch').get('fill');
if (fill.slice(0,3) !== 'hsb') {
@@ -525,7 +525,7 @@ GitVisuals.prototype.getCommitUpstreamStatus = function(commit) {
GitVisuals.prototype.calcTagStacks = function() {
var tags = this.gitEngine.getTags();
var map = {};
- _.each(tags, function(tag) {
+ tags.forEach(function(tag) {
var thisId = tag.target.get('id');
map[thisId] = map[thisId] || [];
@@ -542,7 +542,7 @@ GitVisuals.prototype.calcTagStacks = function() {
GitVisuals.prototype.calcBranchStacks = function() {
var branches = this.gitEngine.getBranches();
var map = {};
- _.each(branches, function(branch) {
+ branches.forEach(function(branch) {
var thisId = branch.target.get('id');
map[thisId] = map[thisId] || [];
@@ -572,7 +572,7 @@ GitVisuals.prototype.calcWidth = function() {
GitVisuals.prototype.maxWidthRecursive = function(commit) {
var childrenTotalWidth = 0;
- _.each(commit.get('children'), function(child) {
+ commit.get('children').forEach(function(child) {
// only include this if we are the "main" parent of
// this child
if (child.isMainParent(commit)) {
@@ -601,14 +601,14 @@ GitVisuals.prototype.assignBoundsRecursive = function(commit, min, max) {
// basic box-flex model
var totalFlex = 0;
var children = commit.get('children');
- _.each(children, function(child) {
+ children.forEach(function(child) {
if (child.isMainParent(commit)) {
totalFlex += child.get('visNode').getMaxWidthScaled();
}
}, this);
var prevBound = min;
- _.each(children, function(child, index) {
+ children.forEach(function(child, index) {
if (!child.isMainParent(commit)) {
return;
}
@@ -777,7 +777,7 @@ GitVisuals.prototype.calcDepthRecursive = function(commit, depth) {
var children = commit.get('children');
var maxDepth = depth;
- _.each(children, function(child) {
+ children.forEach(function(child) {
var d = this.calcDepthRecursive(child, depth + 1);
maxDepth = Math.max(d, maxDepth);
}, this);
@@ -924,7 +924,7 @@ function blendHueStrings(hueStrings) {
var totalBright = 0;
var length = hueStrings.length;
- _.each(hueStrings, function(hueString) {
+ hueStrings.forEach(function(hueString) {
var exploded = hueString.split('(')[1];
exploded = exploded.split(')')[0];
exploded = exploded.split(',');
diff --git a/src/js/visuals/tree.js b/src/js/visuals/tree.js
index 5d9b92dd..42de848c 100644
--- a/src/js/visuals/tree.js
+++ b/src/js/visuals/tree.js
@@ -3,7 +3,7 @@ var Backbone = require('backbone');
var VisBase = Backbone.Model.extend({
removeKeys: function(keys) {
- _.each(keys, function(key) {
+ keys.forEach(function(key) {
if (this.get(key)) {
this.get(key).remove();
}
@@ -25,7 +25,7 @@ var VisBase = Backbone.Model.extend({
var attr = this.getAttributes();
// safely insert this attribute into all the keys we want
- _.each(keys.include, function(key) {
+ keys.include.forEach(function(key) {
attr[key] = Object.assign(
{},
attr[key],
@@ -33,7 +33,7 @@ var VisBase = Backbone.Model.extend({
);
});
- _.each(keys.exclude, function(key) {
+ keys.exclude.forEach(function(key) {
delete attr[key];
});
@@ -42,4 +42,3 @@ var VisBase = Backbone.Model.extend({
});
exports.VisBase = VisBase;
-
diff --git a/src/js/visuals/visBase.js b/src/js/visuals/visBase.js
index 5196a575..bc4ace2a 100644
--- a/src/js/visuals/visBase.js
+++ b/src/js/visuals/visBase.js
@@ -3,7 +3,7 @@ var Backbone = require('backbone');
var VisBase = Backbone.Model.extend({
removeKeys: function(keys) {
- _.each(keys, function(key) {
+ keys.forEach(function(key) {
if (this.get(key)) {
this.get(key).remove();
}
@@ -35,14 +35,14 @@ var VisBase = Backbone.Model.extend({
},
setAttrBase: function(keys, attr, instant, speed, easing) {
- _.each(keys, function(key) {
+ keys.forEach(function(key) {
if (instant) {
this.get(key).attr(attr[key]);
} else {
this.get(key).stop();
this.get(key).animate(attr[key], speed, easing);
// some keys don't support animating too, so set those instantly here
- _.forEach(this.getNonAnimateKeys(), function(nonAnimateKey) {
+ this.getNonAnimateKeys().forEach(function(nonAnimateKey) {
if (attr[key] && attr[key][nonAnimateKey] !== undefined) {
this.get(key).attr(nonAnimateKey, attr[key][nonAnimateKey]);
}
@@ -70,7 +70,7 @@ var VisBase = Backbone.Model.extend({
var attr = this.getAttributes();
// safely insert this attribute into all the keys we want
- _.each(keys.include, function(key) {
+ keys.include.forEach(function(key) {
attr[key] = Object.assign(
{},
attr[key],
@@ -78,7 +78,7 @@ var VisBase = Backbone.Model.extend({
);
});
- _.each(keys.exclude, function(key) {
+ keys.exclude.forEach(function(key) {
delete attr[key];
});
@@ -87,4 +87,3 @@ var VisBase = Backbone.Model.extend({
});
exports.VisBase = VisBase;
-
diff --git a/src/js/visuals/visBranch.js b/src/js/visuals/visBranch.js
index 27fadfc4..73a55305 100644
--- a/src/js/visuals/visBranch.js
+++ b/src/js/visuals/visBranch.js
@@ -167,7 +167,7 @@ var VisBranch = VisBase.extend({
var myArray = this.getBranchStackArray();
var index = -1;
- _.each(myArray, function(branch, i) {
+ myArray.forEach(function(branch, i) {
if (branch.obj == this.get('branch')) {
index = i;
}
@@ -279,7 +279,7 @@ var VisBranch = VisBase.extend({
arrowInnerLow,
arrowStartLow
];
- _.each(coords, function(pos) {
+ coords.forEach(function(pos) {
pathStr += 'L' + toStringCoords(pos) + ' ';
}, this);
pathStr += 'z';
@@ -309,7 +309,7 @@ var VisBranch = VisBase.extend({
}
var maxWidth = 0;
- _.each(this.getBranchStackArray(), function(branch) {
+ this.getBranchStackArray().forEach(function(branch) {
maxWidth = Math.max(maxWidth, getTextWidth(
branch.obj.get('visBranch')
));
@@ -432,7 +432,7 @@ var VisBranch = VisBase.extend({
// set CSS
var keys = ['text', 'rect', 'arrow'];
- _.each(keys, function(key) {
+ keys.forEach(function(key) {
$(this.get(key).node).css(attr.css);
}, this);
@@ -451,7 +451,7 @@ var VisBranch = VisBase.extend({
this.get('arrow')
];
- _.each(objs, function(rObj) {
+ objs.forEach(function(rObj) {
rObj.click(this.onClick.bind(this));
}, this);
},
@@ -577,4 +577,3 @@ var VisBranchCollection = Backbone.Collection.extend({
exports.VisBranchCollection = VisBranchCollection;
exports.VisBranch = VisBranch;
exports.randomHueString = randomHueString;
-
diff --git a/src/js/visuals/visEdge.js b/src/js/visuals/visEdge.js
index b47ef8de..cf1d7cea 100644
--- a/src/js/visuals/visEdge.js
+++ b/src/js/visuals/visEdge.js
@@ -15,7 +15,7 @@ var VisEdge = VisBase.extend({
validateAtInit: function() {
var required = ['tail', 'head'];
- _.each(required, function(key) {
+ required.forEach(function(key) {
if (!this.get(key)) {
throw new Error(key + ' is required!');
}
diff --git a/src/js/visuals/visNode.js b/src/js/visuals/visNode.js
index 6d3e5cb9..5b42138b 100644
--- a/src/js/visuals/visNode.js
+++ b/src/js/visuals/visNode.js
@@ -261,33 +261,33 @@ var VisNode = VisBase.extend({
},
setOutgoingEdgesOpacity: function(opacity) {
- _.each(this.get('outgoingEdges'), function(edge) {
+ this.get('outgoingEdges').forEach(function(edge) {
edge.setOpacity(opacity);
});
},
animateOutgoingEdgesToAttr: function(snapShot, speed, easing) {
- _.each(this.get('outgoingEdges'), function(edge) {
+ this.get('outgoingEdges').forEach(function(edge) {
var attr = snapShot[edge.getID()];
edge.animateToAttr(attr);
}, this);
},
animateOutgoingEdges: function(speed, easing) {
- _.each(this.get('outgoingEdges'), function(edge) {
+ this.get('outgoingEdges').forEach(function(edge) {
edge.animateUpdatedPath(speed, easing);
}, this);
},
animateOutgoingEdgesFromSnapshot: function(snapshot, speed, easing) {
- _.each(this.get('outgoingEdges'), function(edge) {
+ this.get('outgoingEdges').forEach(function(edge) {
var attr = snapshot[edge.getID()];
edge.animateToAttr(attr, speed, easing);
}, this);
},
setOutgoingEdgesBirthPosition: function(parentCoords) {
- _.each(this.get('outgoingEdges'), function(edge) {
+ this.get('outgoingEdges').forEach(function(edge) {
var headPos = edge.get('head').getScreenCoords();
var path = edge.genSmoothBezierPathStringFromCoords(parentCoords, headPos);
edge.get('path').stop();
@@ -334,7 +334,7 @@ var VisNode = VisBase.extend({
}
var commandStr = 'git checkout ' + this.get('commit').get('id');
var Main = require('../app');
- _.each([this.get('circle'), this.get('text')], function(rObj) {
+ [this.get('circle'), this.get('text')].forEach(function(rObj) {
rObj.click(function() {
Main.getEventBaton().trigger('commandSubmitted', commandStr);
});
@@ -347,7 +347,7 @@ var VisNode = VisBase.extend({
// set the opacity on my stuff
var keys = ['circle', 'text'];
- _.each(keys, function(key) {
+ keys.forEach(function(key) {
this.get(key).attr({
opacity: opacity
});
@@ -371,7 +371,7 @@ var VisNode = VisBase.extend({
},
removeAllEdges: function() {
- _.each(this.get('outgoingEdges'), function(edge) {
+ this.get('outgoingEdges').forEach(function(edge) {
edge.remove();
}, this);
},
diff --git a/src/js/visuals/visTag.js b/src/js/visuals/visTag.js
index f11afe3a..3c22d47c 100644
--- a/src/js/visuals/visTag.js
+++ b/src/js/visuals/visTag.js
@@ -95,7 +95,7 @@ var VisTag = VisBase.extend({
var myArray = this.getTagStackArray();
var index = -1;
- _.each(myArray, function(Tag, i) {
+ myArray.forEach(function(Tag, i) {
if (Tag.obj == this.get('tag')) {
index = i;
}
@@ -175,7 +175,7 @@ var VisTag = VisBase.extend({
var textNode = this.get('text').node;
var maxWidth = 0;
- _.each(this.getTagStackArray(), function(Tag) {
+ this.getTagStackArray().forEach(function(Tag) {
maxWidth = Math.max(maxWidth, getTextWidth(
Tag.obj.get('visTag')
));
@@ -271,7 +271,7 @@ var VisTag = VisBase.extend({
// set CSS
var keys = ['text', 'rect'];
- _.each(keys, function(key) {
+ keys.forEach(function(key) {
$(this.get(key).node).css(attr.css);
}, this);
@@ -289,7 +289,7 @@ var VisTag = VisBase.extend({
this.get('text')
];
- _.each(objs, function(rObj) {
+ objs.forEach(function(rObj) {
rObj.click(this.onClick.bind(this));
}, this);
},
@@ -405,4 +405,3 @@ var VisTagCollection = Backbone.Collection.extend({
exports.VisTagCollection = VisTagCollection;
exports.VisTag = VisTag;
exports.randomHueString = randomHueString;
-
From 96ddb5041a87cd5791fa762d259df117b5007275 Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?=EF=BC=A8=EF=BD=8F=EF=BD=8E=EF=BD=87=EF=BD=81=EF=BD=92?=
=?UTF-8?q?=EF=BD=83?=
Date: Sat, 1 Dec 2018 12:33:23 +0700
Subject: [PATCH 035/359] Use 'Object.values' and 'Object.keys' instead of
'_.each(object)'
---
src/js/commands/index.js | 13 +++++++++----
src/js/git/commands.js | 5 +++--
src/js/git/index.js | 21 +++++++++++----------
src/js/graph/treeCompare.js | 19 +++++++++++--------
src/js/level/index.js | 5 +++--
src/js/level/parseWaterfall.js | 6 ++++--
src/js/models/commandModel.js | 6 ++++--
src/js/sandbox/commands.js | 7 +++++--
src/js/stores/LevelStore.js | 3 ++-
9 files changed, 52 insertions(+), 33 deletions(-)
diff --git a/src/js/commands/index.js b/src/js/commands/index.js
index 64706d34..710c5ab3 100644
--- a/src/js/commands/index.js
+++ b/src/js/commands/index.js
@@ -102,8 +102,10 @@ var commands = {
},
loop: function(callback, context) {
- _.each(commandConfigs, function(commandConfig, vcs) {
- _.each(commandConfig, function(config, name) {
+ Object.keys(commandConfigs).forEach(function(vcs) {
+ var commandConfig = commandConfigs[vcs];
+ Object.keys(commandConfig).forEach(function(name) {
+ var config = commandConfig[name];
callback(config, name, vcs);
});
});
@@ -116,8 +118,11 @@ var parse = function(str) {
var options;
// see if we support this particular command
- _.each(commands.getRegexMap(), function (map, thisVCS) {
- _.each(map, function(regex, thisMethod) {
+ var regexMap = commands.getRegexMap();
+ Object.keys(regexMap).forEach(function (thisVCS) {
+ var map = regexMap[thisVCS];
+ Object.keys(map).forEach(function(thisMethod) {
+ var regex = map[thisMethod];
if (regex.exec(str)) {
vcs = thisVCS;
method = thisMethod;
diff --git a/src/js/git/commands.js b/src/js/git/commands.js
index 88bf2bb5..a34cbfaf 100644
--- a/src/js/git/commands.js
+++ b/src/js/git/commands.js
@@ -839,9 +839,10 @@ var instantCommands = [
var commands = require('../commands').commands.getOptionMap()['git'];
// build up a nice display of what we support
- _.each(commands, function(commandOptions, command) {
+ Object.keys(commands).forEach(function(command) {
+ var commandOptions = commands[command];
lines.push('git ' + command);
- _.each(commandOptions, function(vals, optionName) {
+ Object.keys(commandOptions).forEach(function(optionName) {
lines.push('\t ' + optionName);
}, this);
}, this);
diff --git a/src/js/git/index.js b/src/js/git/index.js
index abbf4408..e3f8b8dd 100644
--- a/src/js/git/index.js
+++ b/src/js/git/index.js
@@ -280,18 +280,18 @@ GitEngine.prototype.instantiateFromTree = function(tree) {
// now we do the loading part
var createdSoFar = {};
- _.each(tree.commits, function(commitJSON) {
+ Object.values(tree.commits).forEach(function(commitJSON) {
var commit = this.getOrMakeRecursive(tree, createdSoFar, commitJSON.id, this.gitVisuals);
this.commitCollection.add(commit);
}, this);
- _.each(tree.branches, function(branchJSON) {
+ Object.values(tree.branches).forEach(function(branchJSON) {
var branch = this.getOrMakeRecursive(tree, createdSoFar, branchJSON.id, this.gitVisuals);
this.branchCollection.add(branch, {silent: true});
}, this);
- _.each(tree.tags, function(tagJSON) {
+ Object.values(tree.tags || {}).forEach(function(tagJSON) {
var tag = this.getOrMakeRecursive(tree, createdSoFar, tagJSON.id, this.gitVisuals);
this.tagCollection.add(tag, {silent: true});
@@ -360,7 +360,8 @@ GitEngine.prototype.makeOrigin = function(treeString) {
var originTree = JSON.parse(unescape(treeString));
// make an origin branch for each branch mentioned in the tree if its
// not made already...
- _.each(originTree.branches, function(branchJSON, branchName) {
+ Object.keys(originTree.branches).forEach(function(branchName) {
+ var branchJSON = originTree.branches[branchName];
if (this.refs[ORIGIN_PREFIX + branchName]) {
// we already have this branch
return;
@@ -1802,7 +1803,7 @@ GitEngine.prototype.updateBranchesForHg = function(branchList) {
GitEngine.prototype.updateCommitParentsForHgRebase = function(commitSet) {
var anyChange = false;
- _.each(commitSet, function(val, commitID) {
+ Object.keys(commitSet).forEach(function(commitID) {
var commit = this.refs[commitID];
var thisUpdated = commit.checkForUpdatedParent(this);
anyChange = anyChange || thisUpdated;
@@ -1819,7 +1820,7 @@ GitEngine.prototype.pruneTree = function() {
var set = this.getUpstreamBranchSet();
// don't prune commits that HEAD depends on
var headSet = Graph.getUpstreamSet(this, 'HEAD');
- _.each(headSet, function(val, commitID) {
+ Object.keys(headSet).forEach(function(commitID) {
set[commitID] = true;
});
@@ -2066,14 +2067,14 @@ GitEngine.prototype.hgRebase = function(destination, base) {
// and NOWWWwwww get all the descendants of this set
var moreSets = [];
- _.each(upstream, function(val, id) {
+ Object.keys(upstream).forEach(function(id) {
moreSets.push(this.getDownstreamSet(id));
}, this);
var masterSet = {};
masterSet[baseCommit.get('id')] = true;
[upstream, downstream].concat(moreSets).forEach(function(set) {
- _.each(set, function(val, id) {
+ Object.keys(set).forEach(function(id) {
masterSet[id] = true;
});
});
@@ -2081,7 +2082,7 @@ GitEngine.prototype.hgRebase = function(destination, base) {
// we also need the branches POINTING to master set
var branchMap = {};
var upstreamSet = this.getUpstreamBranchSet();
- _.each(masterSet, function(val, commitID) {
+ Object.keys(masterSet).forEach(function(commitID) {
// now loop over that commits branches
upstreamSet[commitID].forEach(function(branchJSON) {
branchMap[branchJSON.id] = true;
@@ -2305,7 +2306,7 @@ GitEngine.prototype.filterRebaseCommits = function(
options
) {
var changesAlreadyMade = {};
- _.each(stopSet, function(val, key) {
+ Object.keys(stopSet).forEach(function(key) {
changesAlreadyMade[this.scrapeBaseID(key)] = true;
}, this);
var uniqueIDs = {};
diff --git a/src/js/graph/treeCompare.js b/src/js/graph/treeCompare.js
index 6318a3ec..9b37bc60 100644
--- a/src/js/graph/treeCompare.js
+++ b/src/js/graph/treeCompare.js
@@ -145,8 +145,7 @@ TreeCompare.compareAllBranchesWithinTreesHashAgnostic = function(treeA, treeB) {
treeA.branches,
treeB.branches
);
- var branchNames = [];
- _.each(allBranches, function(obj, name) { branchNames.push(name); });
+ var branchNames = Object.keys(allBranches || {});
return this.compareBranchesWithinTreesHashAgnostic(treeA, treeB, branchNames);
};
@@ -188,7 +187,8 @@ TreeCompare.compareBranchesWithinTreesHashAgnostic = function(treeA, treeB, bran
TreeCompare.evalAsserts = function(tree, assertsPerBranch) {
var result = true;
- _.each(assertsPerBranch, function(asserts, branchName) {
+ Object.keys(assertsPerBranch).forEach(function(branchName) {
+ var asserts = assertsPerBranch[branchName];
result = result && this.evalAssertsOnBranch(tree, branchName, asserts);
}, this);
return result;
@@ -327,9 +327,10 @@ TreeCompare.lowercaseTree = function(tree) {
tree.HEAD.target = tree.HEAD.target.toLocaleLowerCase();
}
- var branches = tree.branches;
+ var branches = tree.branches || {};
tree.branches = {};
- _.each(branches, function(obj, name) {
+ Object.keys(branches).forEach(function(name) {
+ var obj = branches[name];
obj.id = obj.id.toLocaleLowerCase();
tree.branches[name.toLocaleLowerCase()] = obj;
});
@@ -378,7 +379,8 @@ TreeCompare.reduceTreeFields = function(trees) {
};
trees.forEach(function(tree) {
- _.each(treeDefaults, function(val, key) {
+ Object.keys(treeDefaults).forEach(function(key) {
+ var val = treeDefaults[key];
if (tree[key] === undefined) {
tree[key] = val;
}
@@ -388,7 +390,8 @@ TreeCompare.reduceTreeFields = function(trees) {
// this function saves only the specified fields of a tree
var saveOnly = function(tree, treeKey, saveFields, sortFields) {
var objects = tree[treeKey];
- _.each(objects, function(obj, objKey) {
+ Object.keys(objects).forEach(function(objKey) {
+ var obj = objects[objKey];
// our blank slate to copy over
var blank = {};
saveFields.forEach(function(field) {
@@ -399,7 +402,7 @@ TreeCompare.reduceTreeFields = function(trees) {
}
});
- _.each(sortFields, function(field) {
+ Object.values(sortFields || {}).forEach(function(field) {
// also sort some fields
if (obj[field]) {
obj[field].sort();
diff --git a/src/js/level/index.js b/src/js/level/index.js
index e2801d6e..d8737456 100644
--- a/src/js/level/index.js
+++ b/src/js/level/index.js
@@ -406,8 +406,9 @@ var Level = Sandbox.extend({
}
var matched = false;
- _.each(Commands.commands.getCommandsThatCount(), function(map) {
- _.each(map, function(regex) {
+ var commandsThatCount = Commands.commands.getCommandsThatCount();
+ Object.values(commandsThatCount).forEach(function(map) {
+ Object.values(map).forEach(function(regex) {
matched = matched || regex.test(command.get('rawStr'));
});
});
diff --git a/src/js/level/parseWaterfall.js b/src/js/level/parseWaterfall.js
index d84fde97..b457893d 100644
--- a/src/js/level/parseWaterfall.js
+++ b/src/js/level/parseWaterfall.js
@@ -75,8 +75,10 @@ ParseWaterfall.prototype.expandAllShortcuts = function(commandStr) {
};
ParseWaterfall.prototype.expandShortcut = function(commandStr, shortcutMap) {
- _.each(shortcutMap, function(map, vcs) {
- _.each(map, function(regex, method) {
+ Object.keys(shortcutMap).forEach(function(vcs) {
+ var map = shortcutMap[vcs];
+ Object.keys(map).forEach(function(method) {
+ var regex = map[method];
var results = regex.exec(commandStr);
if (results) {
commandStr = vcs + ' ' + method + ' ' + commandStr.slice(results[0].length);
diff --git a/src/js/models/commandModel.js b/src/js/models/commandModel.js
index b8a9569f..7e011896 100644
--- a/src/js/models/commandModel.js
+++ b/src/js/models/commandModel.js
@@ -82,7 +82,8 @@ var Command = Backbone.Model.extend({
return this.replaceDotWithHead(arg);
}, this);
var newMap = {};
- _.each(options, function(args, key) {
+ Object.keys(options).forEach(function(key) {
+ var args = options[key];
newMap[key] = Object.values(args).map(function (arg) {
return this.replaceDotWithHead(arg);
}, this);
@@ -273,7 +274,8 @@ var Command = Backbone.Model.extend({
return false;
}
- _.each(results.toSet, function(obj, key) {
+ Object.keys(results.toSet).forEach(function(key) {
+ var obj = results.toSet[key];
// data comes back from the parsing functions like
// options (etc) that need to be set
this.set(key, obj);
diff --git a/src/js/sandbox/commands.js b/src/js/sandbox/commands.js
index 8e3f57b1..27151ee2 100644
--- a/src/js/sandbox/commands.js
+++ b/src/js/sandbox/commands.js
@@ -139,8 +139,11 @@ var getAllCommands = function() {
require('../level').regexMap,
regexMap
);
- _.each(Commands.commands.getRegexMap(), function(map, vcs) {
- _.each(map, function(regex, method) {
+ var mRegexMap = Commands.commands.getRegexMap();
+ Object.keys(mRegexMap).forEach(function(vcs) {
+ var map = mRegexMap[vcs];
+ Object.keys(map).forEach(function(method) {
+ var regex = map[method];
allCommands[vcs + ' ' + method] = regex;
});
});
diff --git a/src/js/stores/LevelStore.js b/src/js/stores/LevelStore.js
index 9f951b06..c5e1a7ba 100644
--- a/src/js/stores/LevelStore.js
+++ b/src/js/stores/LevelStore.js
@@ -52,7 +52,8 @@ var validateLevel = function(level) {
/**
* Unpack the level sequences.
*/
-_.each(levelSequences, function(levels, levelSequenceName) {
+Object.keys(levelSequences).forEach(function(levelSequenceName) {
+ var levels = levelSequences[levelSequenceName];
_sequences.push(levelSequenceName);
if (!levels || !levels.length) {
throw new Error('no empty sequences allowed');
From 9365454cf36f8f1e9be43839afada0c03b60a592 Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?=EF=BC=A8=EF=BD=8F=EF=BD=8E=EF=BD=87=EF=BD=81=EF=BD=92?=
=?UTF-8?q?=EF=BD=83?=
Date: Sat, 1 Dec 2018 12:51:15 +0700
Subject: [PATCH 036/359] Use 'Array.prototype.includes' instead of '_.include'
---
src/js/visuals/index.js | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/src/js/visuals/index.js b/src/js/visuals/index.js
index 08fe4db6..80d2d806 100644
--- a/src/js/visuals/index.js
+++ b/src/js/visuals/index.js
@@ -354,7 +354,7 @@ GitVisuals.prototype.explodeNodes = function(speed) {
GitVisuals.prototype.animateAllFromAttrToAttr = function(fromSnapshot, toSnapshot, idsToOmit) {
var animate = function(obj) {
var id = obj.getID();
- if (_.include(idsToOmit, id)) {
+ if (idsToOmit.includes(id)) {
return;
}
From 27ef578b2ebc83865f0a4282616869b937da534d Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?=EF=BC=A8=EF=BD=8F=EF=BD=8E=EF=BD=87=EF=BD=81=EF=BD=92?=
=?UTF-8?q?=EF=BD=83?=
Date: Sat, 1 Dec 2018 13:04:24 +0700
Subject: [PATCH 037/359] Remove 16 underscore requires
---
src/js/commands/index.js | 1 -
src/js/git/commands.js | 1 -
src/js/git/index.js | 1 -
src/js/graph/index.js | 2 --
src/js/level/builder.js | 1 -
src/js/level/index.js | 1 -
src/js/level/parseWaterfall.js | 2 --
src/js/models/commandModel.js | 1 -
src/js/sandbox/commands.js | 1 -
src/js/views/commandViews.js | 1 -
src/js/visuals/tree.js | 1 -
src/js/visuals/visBase.js | 1 -
src/js/visuals/visBranch.js | 1 -
src/js/visuals/visEdge.js | 1 -
src/js/visuals/visNode.js | 1 -
src/js/visuals/visTag.js | 1 -
16 files changed, 18 deletions(-)
diff --git a/src/js/commands/index.js b/src/js/commands/index.js
index 710c5ab3..95011224 100644
--- a/src/js/commands/index.js
+++ b/src/js/commands/index.js
@@ -1,4 +1,3 @@
-var _ = require('underscore');
var intl = require('../intl');
var Errors = require('../util/errors');
diff --git a/src/js/git/commands.js b/src/js/git/commands.js
index a34cbfaf..4c083d5e 100644
--- a/src/js/git/commands.js
+++ b/src/js/git/commands.js
@@ -1,5 +1,4 @@
var escapeString = require('../util/escapeString');
-var _ = require('underscore');
var intl = require('../intl');
var Graph = require('../graph');
diff --git a/src/js/git/index.js b/src/js/git/index.js
index e3f8b8dd..d03a2075 100644
--- a/src/js/git/index.js
+++ b/src/js/git/index.js
@@ -1,4 +1,3 @@
-var _ = require('underscore');
var Backbone = require('backbone');
var Q = require('q');
diff --git a/src/js/graph/index.js b/src/js/graph/index.js
index 584f788d..2eaf6cab 100644
--- a/src/js/graph/index.js
+++ b/src/js/graph/index.js
@@ -1,5 +1,3 @@
-var _ = require('underscore');
-
function invariant(truthy, reason) {
if (!truthy) {
throw new Error(reason);
diff --git a/src/js/level/builder.js b/src/js/level/builder.js
index a5a848a6..63ebdef9 100644
--- a/src/js/level/builder.js
+++ b/src/js/level/builder.js
@@ -1,4 +1,3 @@
-var _ = require('underscore');
var Backbone = require('backbone');
var Q = require('q');
diff --git a/src/js/level/index.js b/src/js/level/index.js
index d8737456..4bac1b5b 100644
--- a/src/js/level/index.js
+++ b/src/js/level/index.js
@@ -1,4 +1,3 @@
-var _ = require('underscore');
var Q = require('q');
var util = require('../util');
diff --git a/src/js/level/parseWaterfall.js b/src/js/level/parseWaterfall.js
index b457893d..b58e7e00 100644
--- a/src/js/level/parseWaterfall.js
+++ b/src/js/level/parseWaterfall.js
@@ -1,5 +1,3 @@
-var _ = require('underscore');
-
var GitCommands = require('../git/commands');
var Commands = require('../commands');
var SandboxCommands = require('../sandbox/commands');
diff --git a/src/js/models/commandModel.js b/src/js/models/commandModel.js
index 7e011896..76e94d61 100644
--- a/src/js/models/commandModel.js
+++ b/src/js/models/commandModel.js
@@ -1,4 +1,3 @@
-var _ = require('underscore');
var Backbone = require('backbone');
var Errors = require('../util/errors');
diff --git a/src/js/sandbox/commands.js b/src/js/sandbox/commands.js
index 27151ee2..8b913564 100644
--- a/src/js/sandbox/commands.js
+++ b/src/js/sandbox/commands.js
@@ -1,4 +1,3 @@
-var _ = require('underscore');
var util = require('../util');
var constants = require('../util/constants');
diff --git a/src/js/views/commandViews.js b/src/js/views/commandViews.js
index 8dfa71ef..b47d4bfa 100644
--- a/src/js/views/commandViews.js
+++ b/src/js/views/commandViews.js
@@ -1,4 +1,3 @@
-var _ = require('underscore');
var Backbone = require('backbone');
var Main = require('../app');
diff --git a/src/js/visuals/tree.js b/src/js/visuals/tree.js
index 42de848c..ad270a60 100644
--- a/src/js/visuals/tree.js
+++ b/src/js/visuals/tree.js
@@ -1,4 +1,3 @@
-var _ = require('underscore');
var Backbone = require('backbone');
var VisBase = Backbone.Model.extend({
diff --git a/src/js/visuals/visBase.js b/src/js/visuals/visBase.js
index bc4ace2a..fb6a68a1 100644
--- a/src/js/visuals/visBase.js
+++ b/src/js/visuals/visBase.js
@@ -1,4 +1,3 @@
-var _ = require('underscore');
var Backbone = require('backbone');
var VisBase = Backbone.Model.extend({
diff --git a/src/js/visuals/visBranch.js b/src/js/visuals/visBranch.js
index 73a55305..ddac02f4 100644
--- a/src/js/visuals/visBranch.js
+++ b/src/js/visuals/visBranch.js
@@ -1,4 +1,3 @@
-var _ = require('underscore');
var Backbone = require('backbone');
var GRAPHICS = require('../util/constants').GRAPHICS;
diff --git a/src/js/visuals/visEdge.js b/src/js/visuals/visEdge.js
index cf1d7cea..355efcf4 100644
--- a/src/js/visuals/visEdge.js
+++ b/src/js/visuals/visEdge.js
@@ -1,4 +1,3 @@
-var _ = require('underscore');
var Backbone = require('backbone');
var GRAPHICS = require('../util/constants').GRAPHICS;
diff --git a/src/js/visuals/visNode.js b/src/js/visuals/visNode.js
index 5b42138b..f9952d29 100644
--- a/src/js/visuals/visNode.js
+++ b/src/js/visuals/visNode.js
@@ -1,4 +1,3 @@
-var _ = require('underscore');
var Backbone = require('backbone');
var GRAPHICS = require('../util/constants').GRAPHICS;
diff --git a/src/js/visuals/visTag.js b/src/js/visuals/visTag.js
index 3c22d47c..d07f7435 100644
--- a/src/js/visuals/visTag.js
+++ b/src/js/visuals/visTag.js
@@ -1,4 +1,3 @@
-var _ = require('underscore');
var Backbone = require('backbone');
var GRAPHICS = require('../util/constants').GRAPHICS;
From d088643f2e09f2e57f4184f104f5442cd777d1e5 Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?=EF=BC=A8=EF=BD=8F=EF=BD=8E=EF=BD=87=EF=BD=81=EF=BD=92?=
=?UTF-8?q?=EF=BD=83?=
Date: Sat, 1 Dec 2018 23:11:29 +0700
Subject: [PATCH 038/359] Fix space-group in
---
src/js/commands/index.js | 6 +++---
1 file changed, 3 insertions(+), 3 deletions(-)
diff --git a/src/js/commands/index.js b/src/js/commands/index.js
index 2f896e1c..4ad8128f 100644
--- a/src/js/commands/index.js
+++ b/src/js/commands/index.js
@@ -123,11 +123,11 @@ var parse = function(str) {
method = thisMethod;
// every valid regex has to have the parts of
//
- // because there are always two spaces
+ // because there are always two space-groups
// before our "stuff" we can simply
- // split on spaces and grab everything after
+ // split on space-groups and grab everything after
// the second:
- options = str.split(' ').slice(2).join(' ');
+ options = str.match(/('.*?'|".*?"|\S+)/g).slice(2).join(' ');
}
});
});
From d8c2aed4bc6f2603f7b6effec6827d55dd4cab0d Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?=EF=BC=A8=EF=BD=8F=EF=BD=8E=EF=BD=87=EF=BD=81=EF=BD=92?=
=?UTF-8?q?=EF=BD=83?=
Date: Sat, 1 Dec 2018 23:43:31 +0700
Subject: [PATCH 039/359] No join, no split
---
src/js/commands/index.js | 11 ++++-------
1 file changed, 4 insertions(+), 7 deletions(-)
diff --git a/src/js/commands/index.js b/src/js/commands/index.js
index 4ad8128f..133dbe78 100644
--- a/src/js/commands/index.js
+++ b/src/js/commands/index.js
@@ -127,7 +127,7 @@ var parse = function(str) {
// before our "stuff" we can simply
// split on space-groups and grab everything after
// the second:
- options = str.match(/('.*?'|".*?"|\S+)/g).slice(2).join(' ');
+ options = str.match(/('.*?'|".*?"|\S+)/g).slice(2);
}
});
});
@@ -170,11 +170,8 @@ function CommandOptionParser(vcs, method, options) {
}
CommandOptionParser.prototype.explodeAndSet = function() {
- // TODO -- this is ugly
- // split on spaces, except when inside quotes
- var exploded = this.rawOptions.match(/('.*?'|".*?"|\S+)/g) || [];
- for (var i = 0; i < exploded.length; i++) {
- var part = exploded[i];
+ for (var i = 0; i < this.rawOptions.length; i++) {
+ var part = this.rawOptions[i];
if (part.slice(0,1) == '-') {
// it's an option, check supportedMap
@@ -187,7 +184,7 @@ CommandOptionParser.prototype.explodeAndSet = function() {
});
}
- var next = exploded[i + 1];
+ var next = this.rawOptions[i + 1];
var optionArgs = [];
if (next && next.slice(0,1) !== '-') {
// only store the next argument as this
From 283c88cac2a64fc94f4f992d621e2644ddc759e4 Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?=EF=BC=A8=EF=BD=8F=EF=BD=8E=EF=BD=87=EF=BD=81=EF=BD=92?=
=?UTF-8?q?=EF=BD=83?=
Date: Sun, 2 Dec 2018 13:20:02 +0700
Subject: [PATCH 040/359] Fixed scroll 125% or higher
---
src/style/main.css | 3 +--
1 file changed, 1 insertion(+), 2 deletions(-)
diff --git a/src/style/main.css b/src/style/main.css
index 15a23383..b1096873 100644
--- a/src/style/main.css
+++ b/src/style/main.css
@@ -253,7 +253,7 @@ body.hgMode .visBackgroundColor {
#interfaceWrapper {
min-width: 600px;
- min-height: 600px;
+ min-height: 400px;
}
div.canvasTerminalHolder > div.terminal-window-holder > div.wrapper {
@@ -1256,4 +1256,3 @@ div.gitDemonstrationView {
border-top-color: #9bcbeb;
background: #9bcbeb;
}
-
From c9cb6c016f443fa035575ea68b9294d622f53cc8 Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?=EF=BC=A8=EF=BD=8F=EF=BD=8E=EF=BD=87=EF=BD=81=EF=BD=92?=
=?UTF-8?q?=EF=BD=83?=
Date: Sun, 2 Dec 2018 13:22:17 +0700
Subject: [PATCH 041/359] Fixed don't show all of #commandLineBar
---
src/style/main.css | 1 +
1 file changed, 1 insertion(+)
diff --git a/src/style/main.css b/src/style/main.css
index b1096873..f166455e 100644
--- a/src/style/main.css
+++ b/src/style/main.css
@@ -562,6 +562,7 @@ p.commandLine span.prompt {
margin: 10px;
border-radius: 5px;
box-shadow: 1px 0px 15px rgba(100, 100, 100, 1);
+ overflow: auto;
}
#commandLineHistory #terminal.scrolling {
From b40dde0196587076d2495223c6cc4e48d5f9a107 Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?=EF=BC=A8=EF=BD=8F=EF=BD=8E=EF=BD=87=EF=BD=81=EF=BD=92?=
=?UTF-8?q?=EF=BD=83?=
Date: Sun, 2 Dec 2018 13:30:35 +0700
Subject: [PATCH 042/359] Avoid display 900px in small screen
---
src/style/main.css | 1 +
1 file changed, 1 insertion(+)
diff --git a/src/style/main.css b/src/style/main.css
index f166455e..93c884c3 100644
--- a/src/style/main.css
+++ b/src/style/main.css
@@ -826,6 +826,7 @@ div.modalView.box.inFront.show {
.modalView .terminal-window-holder {
border-radius: 5px;
max-width: 900px;
+ width: 90%;
}
.modalView .terminal-window {
From 57f84f0a361337fca4b21d6bb8022c34f2e6d0b9 Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?=EF=BC=A8=EF=BD=8F=EF=BD=8E=EF=BD=87=EF=BD=81=EF=BD=92?=
=?UTF-8?q?=EF=BD=83?=
Date: Sun, 2 Dec 2018 20:20:33 +0700
Subject: [PATCH 043/359] remove forgot in 'no more native' a9dd27c
---
Gruntfile.js | 7 +------
package.json | 3 +--
src/js/constants/AppStyles.js | 16 ----------------
src/js/constants/Routes.js | 19 -------------------
4 files changed, 2 insertions(+), 43 deletions(-)
delete mode 100644 src/js/constants/AppStyles.js
delete mode 100644 src/js/constants/Routes.js
diff --git a/Gruntfile.js b/Gruntfile.js
index ab271d4a..c3db7ecf 100644
--- a/Gruntfile.js
+++ b/Gruntfile.js
@@ -109,14 +109,9 @@ module.exports = function(grunt) {
'Gruntfile.js',
'__tests__/*.spec.js',
'src/js/**/*.js',
- 'src/js/**/**/*.js',
- 'src/levels/**/*.js'
+ 'src/js/**/**/*.js'
],
options: {
- ignores: [
- 'src/js/**/*.ios.js',
- 'src/js/native_react_views/*.js'
- ],
curly: true,
// sometimes triple equality is just redundant and unnecessary
eqeqeq: false,
diff --git a/package.json b/package.json
index aa736793..0d640ce2 100644
--- a/package.json
+++ b/package.json
@@ -24,8 +24,7 @@
"grunt-react": "^0.12.1",
"grunt-shell-spawn": "~0.3.0",
"jasmine-node": "~1.12.0",
- "prompt": "^1.0.0",
- "react-tools": "^0.13.1"
+ "prompt": "^1.0.0"
},
"dependencies": {
"backbone": "~1.1.2",
diff --git a/src/js/constants/AppStyles.js b/src/js/constants/AppStyles.js
deleted file mode 100644
index 2d1ef06c..00000000
--- a/src/js/constants/AppStyles.js
+++ /dev/null
@@ -1,16 +0,0 @@
-var AppStyles = {
- blueBackground: '#5cbcfc',
- terminalBackground: '#424242',
- terminalText: 'rgb(238, 238, 238)',
- terminalHeader: '#EFEDEE',
- terminalBorder: '#303030',
- terminalFontFamily: 'Courier',
-};
-
-AppStyles.terminalTextStyle = {
- color: AppStyles.terminalText,
- fontFamily: AppStyles.terminalFontFamily,
- fontWeight: 'bold',
-};
-
-module.exports = AppStyles;
diff --git a/src/js/constants/Routes.js b/src/js/constants/Routes.js
deleted file mode 100644
index d9af3475..00000000
--- a/src/js/constants/Routes.js
+++ /dev/null
@@ -1,19 +0,0 @@
-var assign = require('object-assign');
-var keyMirror = require('../util/keyMirror');
-
-module.exports = keyMirror({
- NUX: null,
- LOADING: null,
- SEQUENCE_SELECT: null,
- LEVEL_SELECT: null,
-});
-
-module.exports.getRouteWithParams = function(id, params) {
- return assign({id: id}, params);
-};
-
-module.exports.getRouteForID = function(id) {
- return {
- id: id,
- };
-};
From 0c05bf09a91dc7b035033bf2eab3dd63be9216c9 Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?=EF=BC=A8=EF=BD=8F=EF=BD=8E=EF=BD=87=EF=BD=81=EF=BD=92?=
=?UTF-8?q?=EF=BD=83?=
Date: Mon, 3 Dec 2018 09:03:39 +0700
Subject: [PATCH 044/359] Restore `src/levels` in `Gruntfile.js`
---
Gruntfile.js | 3 ++-
1 file changed, 2 insertions(+), 1 deletion(-)
diff --git a/Gruntfile.js b/Gruntfile.js
index c3db7ecf..d144f722 100644
--- a/Gruntfile.js
+++ b/Gruntfile.js
@@ -109,7 +109,8 @@ module.exports = function(grunt) {
'Gruntfile.js',
'__tests__/*.spec.js',
'src/js/**/*.js',
- 'src/js/**/**/*.js'
+ 'src/js/**/**/*.js',
+ 'src/levels/**/*.js'
],
options: {
curly: true,
From 4acbfde071e6a33b99b0beb686665a74a954d265 Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?=EF=BC=A8=EF=BD=8F=EF=BD=8E=EF=BD=87=EF=BD=81=EF=BD=92?=
=?UTF-8?q?=EF=BD=83?=
Date: Mon, 3 Dec 2018 09:26:40 +0700
Subject: [PATCH 045/359] Add some info about this repository
---
package.json | 3 +++
1 file changed, 3 insertions(+)
diff --git a/package.json b/package.json
index 0d640ce2..51dd2d61 100644
--- a/package.json
+++ b/package.json
@@ -1,6 +1,9 @@
{
"name": "LearnGitBranching",
"version": "0.8.0",
+ "description": "An interactive git visualization to challenge and educate!",
+ "homepage": "https://learngitbranching.js.org",
+ "author": "Peter Cottle ",
"license": "MIT",
"scripts": {
"test": "grunt test"
From b884b0e398ac4b81e8dc622a2d42c0c56ef3fcd9 Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?=EF=BC=A8=EF=BD=8F=EF=BD=8E=EF=BD=87=EF=BD=81=EF=BD=92?=
=?UTF-8?q?=EF=BD=83?=
Date: Tue, 4 Dec 2018 16:51:11 +0700
Subject: [PATCH 046/359] Change npm to yarn
---
.travis.yml | 15 ++-
npm-shrinkwrap.json | 264 --------------------------------------------
2 files changed, 13 insertions(+), 266 deletions(-)
delete mode 100644 npm-shrinkwrap.json
diff --git a/.travis.yml b/.travis.yml
index 89b60a3b..4412d1ed 100644
--- a/.travis.yml
+++ b/.travis.yml
@@ -1,4 +1,15 @@
+sudo: false
language: node_js
node_js:
- - "4.1"
- - "5.3"
+ - "10"
+ - "8"
+ - "7"
+before_install:
+ - curl -o- -L https://yarnpkg.com/install.sh | bash
+ - export PATH="$HOME/.yarn/bin:$PATH"
+cache:
+ yarn: true
+ directories:
+ - "node_modules"
+script:
+ - yarn test
diff --git a/npm-shrinkwrap.json b/npm-shrinkwrap.json
deleted file mode 100644
index 007fdc21..00000000
--- a/npm-shrinkwrap.json
+++ /dev/null
@@ -1,264 +0,0 @@
-{
- "name": "LearnGitBranching",
- "version": "0.8.0",
- "dependencies": {
- "backbone": {
- "version": "1.1.2",
- "from": "backbone@*",
- "resolved": "https://registry.npmjs.org/backbone/-/backbone-1.1.2.tgz",
- "dependencies": {
- "underscore": {
- "version": "1.8.3",
- "from": "underscore@>=1.5.0",
- "resolved": "https://registry.npmjs.org/underscore/-/underscore-1.8.3.tgz"
- }
- }
- },
- "events": {
- "version": "1.0.2",
- "from": "events@*",
- "resolved": "https://registry.npmjs.org/events/-/events-1.0.2.tgz"
- },
- "flux": {
- "version": "2.0.1",
- "from": "flux@*",
- "resolved": "https://registry.npmjs.org/flux/-/flux-2.0.1.tgz"
- },
- "jquery": {
- "version": "1.7.3",
- "from": "jquery@~1.7.3",
- "dependencies": {
- "jsdom": {
- "version": "0.2.19",
- "from": "jsdom@~0.2.14",
- "dependencies": {
- "request": {
- "version": "2.30.0",
- "from": "request@2.x",
- "dependencies": {
- "qs": {
- "version": "0.6.6",
- "from": "qs@~0.6.0"
- },
- "json-stringify-safe": {
- "version": "5.0.0",
- "from": "json-stringify-safe@~5.0.0"
- },
- "forever-agent": {
- "version": "0.5.0",
- "from": "forever-agent@~0.5.0"
- },
- "node-uuid": {
- "version": "1.4.1",
- "from": "node-uuid@~1.4.0"
- },
- "mime": {
- "version": "1.2.11",
- "from": "mime@~1.2.9"
- },
- "tough-cookie": {
- "version": "0.9.15",
- "from": "tough-cookie@~0.9.15",
- "dependencies": {
- "punycode": {
- "version": "1.2.3",
- "from": "punycode@>=0.2.0"
- }
- }
- },
- "form-data": {
- "version": "0.1.2",
- "from": "form-data@~0.1.0",
- "dependencies": {
- "combined-stream": {
- "version": "0.0.4",
- "from": "combined-stream@~0.0.4",
- "dependencies": {
- "delayed-stream": {
- "version": "0.0.5",
- "from": "delayed-stream@0.0.5"
- }
- }
- },
- "async": {
- "version": "0.2.9",
- "from": "async@~0.2.9"
- }
- }
- },
- "tunnel-agent": {
- "version": "0.3.0",
- "from": "tunnel-agent@~0.3.0"
- },
- "http-signature": {
- "version": "0.10.0",
- "from": "http-signature@~0.10.0",
- "dependencies": {
- "assert-plus": {
- "version": "0.1.2",
- "from": "assert-plus@0.1.2"
- },
- "asn1": {
- "version": "0.1.11",
- "from": "asn1@0.1.11"
- },
- "ctype": {
- "version": "0.5.2",
- "from": "ctype@0.5.2"
- }
- }
- },
- "oauth-sign": {
- "version": "0.3.0",
- "from": "oauth-sign@~0.3.0"
- },
- "hawk": {
- "version": "1.0.0",
- "from": "hawk@~1.0.0",
- "dependencies": {
- "hoek": {
- "version": "0.9.1",
- "from": "hoek@0.9.x"
- },
- "boom": {
- "version": "0.4.2",
- "from": "boom@0.4.x"
- },
- "cryptiles": {
- "version": "0.2.2",
- "from": "cryptiles@0.2.x"
- },
- "sntp": {
- "version": "0.2.4",
- "from": "sntp@0.2.x"
- }
- }
- },
- "aws-sign2": {
- "version": "0.5.0",
- "from": "aws-sign2@~0.5.0"
- }
- }
- },
- "cssom": {
- "version": "0.2.5",
- "from": "cssom@0.2.x"
- },
- "cssstyle": {
- "version": "0.2.9",
- "from": "cssstyle@>=0.2.3",
- "dependencies": {
- "cssom": {
- "version": "0.3.0",
- "from": "cssom@0.3.x"
- }
- }
- },
- "contextify": {
- "version": "0.1.6",
- "from": "contextify@0.1.x",
- "dependencies": {
- "bindings": {
- "version": "1.1.1",
- "from": "bindings@*"
- }
- }
- }
- }
- },
- "htmlparser": {
- "version": "1.7.6",
- "from": "htmlparser@1.7.6"
- },
- "xmlhttprequest": {
- "version": "1.4.2",
- "from": "xmlhttprequest@~1.4.2"
- },
- "location": {
- "version": "0.0.1",
- "from": "location@0.0.1"
- },
- "navigator": {
- "version": "1.0.1",
- "from": "navigator@~1.0.1"
- }
- }
- },
- "markdown": {
- "version": "0.4.0",
- "from": "markdown@~0.4.0",
- "dependencies": {
- "nopt": {
- "version": "1.0.10",
- "from": "nopt@1",
- "dependencies": {
- "abbrev": {
- "version": "1.0.4",
- "from": "abbrev@1"
- }
- }
- }
- }
- },
- "object-assign": {
- "version": "2.0.0",
- "from": "object-assign@*",
- "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-2.0.0.tgz"
- },
- "q": {
- "version": "0.8.12",
- "from": "q@~0.8.11"
- },
- "react": {
- "version": "0.13.1",
- "from": "react@*",
- "resolved": "https://registry.npmjs.org/react/-/react-0.13.1.tgz",
- "dependencies": {
- "envify": {
- "version": "3.4.0",
- "from": "envify@>=3.0.0 <4.0.0",
- "resolved": "https://registry.npmjs.org/envify/-/envify-3.4.0.tgz",
- "dependencies": {
- "through": {
- "version": "2.3.6",
- "from": "through@>=2.3.4 <2.4.0",
- "resolved": "https://registry.npmjs.org/through/-/through-2.3.6.tgz"
- },
- "jstransform": {
- "version": "10.1.0",
- "from": "jstransform@>=10.0.1 <11.0.0",
- "resolved": "https://registry.npmjs.org/jstransform/-/jstransform-10.1.0.tgz",
- "dependencies": {
- "base62": {
- "version": "0.1.1",
- "from": "base62@0.1.1",
- "resolved": "https://registry.npmjs.org/base62/-/base62-0.1.1.tgz"
- },
- "esprima-fb": {
- "version": "13001.1001.0-dev-harmony-fb",
- "from": "esprima-fb@13001.1001.0-dev-harmony-fb",
- "resolved": "https://registry.npmjs.org/esprima-fb/-/esprima-fb-13001.1001.0-dev-harmony-fb.tgz"
- },
- "source-map": {
- "version": "0.1.31",
- "from": "source-map@0.1.31",
- "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.1.31.tgz",
- "dependencies": {
- "amdefine": {
- "version": "0.1.0",
- "from": "amdefine@>=0.0.4"
- }
- }
- }
- }
- }
- }
- }
- }
- },
- "underscore": {
- "version": "1.4.4",
- "from": "underscore@~1.4.3"
- }
- }
-}
From e7b7a8db2da538f911c5b3f4f0cbc69490c7f252 Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?=EF=BC=A8=EF=BD=8F=EF=BD=8E=EF=BD=87=EF=BD=81=EF=BD=92?=
=?UTF-8?q?=EF=BD=83?=
Date: Wed, 5 Dec 2018 08:01:28 +0700
Subject: [PATCH 047/359] Remove module unuse
---
package.json | 3 ---
1 file changed, 3 deletions(-)
diff --git a/package.json b/package.json
index 51dd2d61..8f1b0254 100644
--- a/package.json
+++ b/package.json
@@ -16,7 +16,6 @@
"browserify": "^13.0.0",
"grunt": "~0.4.2",
"grunt-browserify": "^4.0.1",
- "grunt-cli": "~0.1.11",
"grunt-contrib-clean": "~0.5.0",
"grunt-contrib-jshint": "~0.7.2",
"grunt-contrib-uglify": "~0.2.7",
@@ -31,9 +30,7 @@
},
"dependencies": {
"backbone": "~1.1.2",
- "events": "^1.0.2",
"flux": "^2.0.1",
- "jquery": "~1.7.3",
"markdown": "~0.4.0",
"q": "~0.8.11",
"react": "^0.13.1",
From 6a067eb9418733fa6ea59797e70a38337a682944 Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?=EF=BC=A8=EF=BD=8F=EF=BD=8E=EF=BD=87=EF=BD=81=EF=BD=92?=
=?UTF-8?q?=EF=BD=83?=
Date: Wed, 5 Dec 2018 08:02:06 +0700
Subject: [PATCH 048/359] Add yarn.lock
---
yarn.lock | 4347 +++++++++++++++++++++++++++++++++++++++++++++++++++++
1 file changed, 4347 insertions(+)
create mode 100644 yarn.lock
diff --git a/yarn.lock b/yarn.lock
new file mode 100644
index 00000000..3c158e95
--- /dev/null
+++ b/yarn.lock
@@ -0,0 +1,4347 @@
+# THIS IS AN AUTOGENERATED FILE. DO NOT EDIT THIS FILE DIRECTLY.
+# yarn lockfile v1
+
+
+JSONStream@^1.0.3:
+ version "1.3.5"
+ resolved "https://registry.yarnpkg.com/JSONStream/-/JSONStream-1.3.5.tgz#3208c1f08d3a4d99261ab64f92302bc15e111ca0"
+ integrity sha512-E+iruNOY8VV9s4JEbe1aNEm6MiszPRr/UfcHMz0TQh1BXSxHK+ASV1R6W4HpjBhSeS+54PIsAMCBmwD06LLsqQ==
+ dependencies:
+ jsonparse "^1.2.0"
+ through ">=2.2.7 <3"
+
+abbrev@1:
+ version "1.1.1"
+ resolved "https://registry.yarnpkg.com/abbrev/-/abbrev-1.1.1.tgz#f8f2c887ad10bf67f634f005b6987fed3179aac8"
+ integrity sha512-nne9/IiQ/hzIhY6pdDnbBtz7DjPTKrY00P/zvPSm5pOFkl6xuGrGnXn/VtTNNfNtAfZ9/1RtehkszU9qcTii0Q==
+
+acorn-dynamic-import@^4.0.0:
+ version "4.0.0"
+ resolved "https://registry.yarnpkg.com/acorn-dynamic-import/-/acorn-dynamic-import-4.0.0.tgz#482210140582a36b83c3e342e1cfebcaa9240948"
+ integrity sha512-d3OEjQV4ROpoflsnUA8HozoIR504TFxNivYEUi6uwz0IYhBkTDXGuWlNdMtybRt3nqVx/L6XqMt0FxkXuWKZhw==
+
+acorn-node@^1.2.0, acorn-node@^1.3.0, acorn-node@^1.5.2:
+ version "1.6.2"
+ resolved "https://registry.yarnpkg.com/acorn-node/-/acorn-node-1.6.2.tgz#b7d7ceca6f22e6417af933a62cad4de01048d5d2"
+ integrity sha512-rIhNEZuNI8ibQcL7ANm/mGyPukIaZsRNX9psFNQURyJW0nu6k8wjSDld20z6v2mDBWqX13pIEnk9gGZJHIlEXg==
+ dependencies:
+ acorn "^6.0.2"
+ acorn-dynamic-import "^4.0.0"
+ acorn-walk "^6.1.0"
+ xtend "^4.0.1"
+
+acorn-walk@^6.1.0:
+ version "6.1.1"
+ resolved "https://registry.yarnpkg.com/acorn-walk/-/acorn-walk-6.1.1.tgz#d363b66f5fac5f018ff9c3a1e7b6f8e310cc3913"
+ integrity sha512-OtUw6JUTgxA2QoqqmrmQ7F2NYqiBPi/L2jqHyFtllhOUvXYQXf0Z1CYUinIfyT4bTCGmrA7gX9FvHA81uzCoVw==
+
+acorn@^4.0.3:
+ version "4.0.13"
+ resolved "https://registry.yarnpkg.com/acorn/-/acorn-4.0.13.tgz#105495ae5361d697bd195c825192e1ad7f253787"
+ integrity sha1-EFSVrlNh1pe9GVyCUZLhrX8lN4c=
+
+acorn@^5.2.1:
+ version "5.7.3"
+ resolved "https://registry.yarnpkg.com/acorn/-/acorn-5.7.3.tgz#67aa231bf8812974b85235a96771eb6bd07ea279"
+ integrity sha512-T/zvzYRfbVojPWahDsE5evJdHb3oJoQfFbsrKM7w5Zcs++Tr257tia3BmMP8XYVjp1S9RZXQMh7gao96BlqZOw==
+
+acorn@^6.0.2:
+ version "6.0.4"
+ resolved "https://registry.yarnpkg.com/acorn/-/acorn-6.0.4.tgz#77377e7353b72ec5104550aa2d2097a2fd40b754"
+ integrity sha512-VY4i5EKSKkofY2I+6QLTbTTN/UvEQPCo6eiwzzSaSWfpaDhOmStMCMod6wmuPciNq+XS0faCglFu2lHZpdHUtg==
+
+amdefine@>=0.0.4:
+ version "1.0.1"
+ resolved "https://registry.yarnpkg.com/amdefine/-/amdefine-1.0.1.tgz#4a5282ac164729e93619bcfd3ad151f817ce91f5"
+ integrity sha1-SlKCrBZHKek2Gbz9OtFR+BfOkfU=
+
+ansi-regex@^2.0.0:
+ version "2.1.1"
+ resolved "https://registry.yarnpkg.com/ansi-regex/-/ansi-regex-2.1.1.tgz#c3b33ab5ee360d86e0e628f0468ae7ef27d654df"
+ integrity sha1-w7M6te42DYbg5ijwRorn7yfWVN8=
+
+ansi-regex@^3.0.0:
+ version "3.0.0"
+ resolved "https://registry.yarnpkg.com/ansi-regex/-/ansi-regex-3.0.0.tgz#ed0317c322064f79466c02966bddb605ab37d998"
+ integrity sha1-7QMXwyIGT3lGbAKWa922Bas32Zg=
+
+ansi-styles@^3.2.1:
+ version "3.2.1"
+ resolved "https://registry.yarnpkg.com/ansi-styles/-/ansi-styles-3.2.1.tgz#41fbb20243e50b12be0f04b8dedbf07520ce841d"
+ integrity sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==
+ dependencies:
+ color-convert "^1.9.0"
+
+anymatch@^1.3.0:
+ version "1.3.2"
+ resolved "https://registry.yarnpkg.com/anymatch/-/anymatch-1.3.2.tgz#553dcb8f91e3c889845dfdba34c77721b90b9d7a"
+ integrity sha512-0XNayC8lTHQ2OI8aljNCN3sSx6hsr/1+rlcDAotXJR7C1oZZHCNsfpbKwMjRA3Uqb5tF1Rae2oloTr4xpq+WjA==
+ dependencies:
+ micromatch "^2.1.5"
+ normalize-path "^2.0.0"
+
+aproba@^1.0.3:
+ version "1.2.0"
+ resolved "https://registry.yarnpkg.com/aproba/-/aproba-1.2.0.tgz#6802e6264efd18c790a1b0d517f0f2627bf2c94a"
+ integrity sha512-Y9J6ZjXtoYh8RnXVCMOU/ttDmk1aBjunq9vO0ta5x85WDQiQfUF9sIPBITdbiiIVcBo03Hi3jMxigBtsddlXRw==
+
+are-we-there-yet@~1.1.2:
+ version "1.1.5"
+ resolved "https://registry.yarnpkg.com/are-we-there-yet/-/are-we-there-yet-1.1.5.tgz#4b35c2944f062a8bfcda66410760350fe9ddfc21"
+ integrity sha512-5hYdAkZlcG8tOLujVDTgCT+uPX0VnpAH28gWsLfzpXYm7wP6mp5Q/gYyR7YQ0cKVJcXJnl3j2kpBan13PtQf6w==
+ dependencies:
+ delegates "^1.0.0"
+ readable-stream "^2.0.6"
+
+argparse@^1.0.2:
+ version "1.0.10"
+ resolved "https://registry.yarnpkg.com/argparse/-/argparse-1.0.10.tgz#bcd6791ea5ae09725e17e5ad988134cd40b3d911"
+ integrity sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg==
+ dependencies:
+ sprintf-js "~1.0.2"
+
+"argparse@~ 0.1.11":
+ version "0.1.16"
+ resolved "https://registry.yarnpkg.com/argparse/-/argparse-0.1.16.tgz#cfd01e0fbba3d6caed049fbd758d40f65196f57c"
+ integrity sha1-z9AeD7uj1srtBJ+9dY1A9lGW9Xw=
+ dependencies:
+ underscore "~1.7.0"
+ underscore.string "~2.4.0"
+
+arr-diff@^2.0.0:
+ version "2.0.0"
+ resolved "https://registry.yarnpkg.com/arr-diff/-/arr-diff-2.0.0.tgz#8f3b827f955a8bd669697e4a4256ac3ceae356cf"
+ integrity sha1-jzuCf5Vai9ZpaX5KQlasPOrjVs8=
+ dependencies:
+ arr-flatten "^1.0.1"
+
+arr-diff@^4.0.0:
+ version "4.0.0"
+ resolved "https://registry.yarnpkg.com/arr-diff/-/arr-diff-4.0.0.tgz#d6461074febfec71e7e15235761a329a5dc7c520"
+ integrity sha1-1kYQdP6/7HHn4VI1dhoyml3HxSA=
+
+arr-flatten@^1.0.1, arr-flatten@^1.1.0:
+ version "1.1.0"
+ resolved "https://registry.yarnpkg.com/arr-flatten/-/arr-flatten-1.1.0.tgz#36048bbff4e7b47e136644316c99669ea5ae91f1"
+ integrity sha512-L3hKV5R/p5o81R7O02IGnwpDmkp6E982XhtbuwSe3O4qOtMMMtodicASA1Cny2U+aCXcNpml+m4dPsvsJ3jatg==
+
+arr-union@^3.1.0:
+ version "3.1.0"
+ resolved "https://registry.yarnpkg.com/arr-union/-/arr-union-3.1.0.tgz#e39b09aea9def866a8f206e288af63919bae39c4"
+ integrity sha1-45sJrqne+Gao8gbiiK9jkZuuOcQ=
+
+array-filter@~0.0.0:
+ version "0.0.1"
+ resolved "https://registry.yarnpkg.com/array-filter/-/array-filter-0.0.1.tgz#7da8cf2e26628ed732803581fd21f67cacd2eeec"
+ integrity sha1-fajPLiZijtcygDWB/SH2fKzS7uw=
+
+array-find-index@^1.0.1:
+ version "1.0.2"
+ resolved "https://registry.yarnpkg.com/array-find-index/-/array-find-index-1.0.2.tgz#df010aa1287e164bbda6f9723b0a96a1ec4187a1"
+ integrity sha1-3wEKoSh+Fku9pvlyOwqWoexBh6E=
+
+array-map@~0.0.0:
+ version "0.0.0"
+ resolved "https://registry.yarnpkg.com/array-map/-/array-map-0.0.0.tgz#88a2bab73d1cf7bcd5c1b118a003f66f665fa662"
+ integrity sha1-iKK6tz0c97zVwbEYoAP2b2ZfpmI=
+
+array-reduce@~0.0.0:
+ version "0.0.0"
+ resolved "https://registry.yarnpkg.com/array-reduce/-/array-reduce-0.0.0.tgz#173899d3ffd1c7d9383e4479525dbe278cab5f2b"
+ integrity sha1-FziZ0//Rx9k4PkR5Ul2+J4yrXys=
+
+array-unique@^0.2.1:
+ version "0.2.1"
+ resolved "https://registry.yarnpkg.com/array-unique/-/array-unique-0.2.1.tgz#a1d97ccafcbc2625cc70fadceb36a50c58b01a53"
+ integrity sha1-odl8yvy8JiXMcPrc6zalDFiwGlM=
+
+array-unique@^0.3.2:
+ version "0.3.2"
+ resolved "https://registry.yarnpkg.com/array-unique/-/array-unique-0.3.2.tgz#a894b75d4bc4f6cd679ef3244a9fd8f46ae2d428"
+ integrity sha1-qJS3XUvE9s1nnvMkSp/Y9Gri1Cg=
+
+asap@~2.0.3:
+ version "2.0.6"
+ resolved "https://registry.yarnpkg.com/asap/-/asap-2.0.6.tgz#e50347611d7e690943208bbdafebcbc2fb866d46"
+ integrity sha1-5QNHYR1+aQlDIIu9r+vLwvuGbUY=
+
+asn1.js@^4.0.0:
+ version "4.10.1"
+ resolved "https://registry.yarnpkg.com/asn1.js/-/asn1.js-4.10.1.tgz#b9c2bf5805f1e64aadeed6df3a2bfafb5a73f5a0"
+ integrity sha512-p32cOF5q0Zqs9uBiONKYLm6BClCoBCM5O9JfeUSlnQLBTxYdTK+pW+nXflm8UkKd2UYlEbYz5qEi0JuZR9ckSw==
+ dependencies:
+ bn.js "^4.0.0"
+ inherits "^2.0.1"
+ minimalistic-assert "^1.0.0"
+
+assert@^1.4.0:
+ version "1.4.1"
+ resolved "https://registry.yarnpkg.com/assert/-/assert-1.4.1.tgz#99912d591836b5a6f5b345c0f07eefc08fc65d91"
+ integrity sha1-mZEtWRg2tab1s0XA8H7vwI/GXZE=
+ dependencies:
+ util "0.10.3"
+
+assert@~1.3.0:
+ version "1.3.0"
+ resolved "https://registry.yarnpkg.com/assert/-/assert-1.3.0.tgz#03939a622582a812cc202320a0b9a56c9b815849"
+ integrity sha1-A5OaYiWCqBLMICMgoLmlbJuBWEk=
+ dependencies:
+ util "0.10.3"
+
+assign-symbols@^1.0.0:
+ version "1.0.0"
+ resolved "https://registry.yarnpkg.com/assign-symbols/-/assign-symbols-1.0.0.tgz#59667f41fadd4f20ccbc2bb96b8d4f7f78ec0367"
+ integrity sha1-WWZ/QfrdTyDMvCu5a41Pf3jsA2c=
+
+ast-types@0.9.6:
+ version "0.9.6"
+ resolved "https://registry.yarnpkg.com/ast-types/-/ast-types-0.9.6.tgz#102c9e9e9005d3e7e3829bf0c4fa24ee862ee9b9"
+ integrity sha1-ECyenpAF0+fjgpvwxPok7oYu6bk=
+
+astw@^2.0.0:
+ version "2.2.0"
+ resolved "https://registry.yarnpkg.com/astw/-/astw-2.2.0.tgz#7bd41784d32493987aeb239b6b4e1c57a873b917"
+ integrity sha1-e9QXhNMkk5h66yOba04cV6hzuRc=
+ dependencies:
+ acorn "^4.0.3"
+
+async-each@^1.0.0:
+ version "1.0.1"
+ resolved "https://registry.yarnpkg.com/async-each/-/async-each-1.0.1.tgz#19d386a1d9edc6e7c1c85d388aedbcc56d33602d"
+ integrity sha1-GdOGodntxufByF04iu28xW0zYC0=
+
+async@^0.9.0, async@~0.9.0:
+ version "0.9.2"
+ resolved "https://registry.yarnpkg.com/async/-/async-0.9.2.tgz#aea74d5e61c1f899613bf64bda66d4c78f2fd17d"
+ integrity sha1-rqdNXmHB+JlhO/ZL2mbUx48v0X0=
+
+async@~0.1.22:
+ version "0.1.22"
+ resolved "https://registry.yarnpkg.com/async/-/async-0.1.22.tgz#0fc1aaa088a0e3ef0ebe2d8831bab0dcf8845061"
+ integrity sha1-D8GqoIig4+8Ovi2IMbqw3PiEUGE=
+
+async@~0.2.6:
+ version "0.2.10"
+ resolved "https://registry.yarnpkg.com/async/-/async-0.2.10.tgz#b6bbe0b0674b9d719708ca38de8c237cb526c3d1"
+ integrity sha1-trvgsGdLnXGXCMo43owjfLUmw9E=
+
+async@~1.0.0:
+ version "1.0.0"
+ resolved "https://registry.yarnpkg.com/async/-/async-1.0.0.tgz#f8fc04ca3a13784ade9e1641af98578cfbd647a9"
+ integrity sha1-+PwEyjoTeErenhZBr5hXjPvWR6k=
+
+async@~1.5.2:
+ version "1.5.2"
+ resolved "https://registry.yarnpkg.com/async/-/async-1.5.2.tgz#ec6a61ae56480c0c3cb241c95618e20892f9672a"
+ integrity sha1-7GphrlZIDAw8skHJVhjiCJL5Zyo=
+
+atob@^2.1.1:
+ version "2.1.2"
+ resolved "https://registry.yarnpkg.com/atob/-/atob-2.1.2.tgz#6d9517eb9e030d2436666651e86bd9f6f13533c9"
+ integrity sha512-Wm6ukoaOGJi/73p/cl2GvLjTI5JM1k/O14isD73YML8StrH/7/lRFgmg8nICZgD3bZZvjwCGxtMOD3wWNAu8cg==
+
+backbone@~1.1.2:
+ version "1.1.2"
+ resolved "https://registry.yarnpkg.com/backbone/-/backbone-1.1.2.tgz#c2c04c66bf87268fb82c177acebeff7d37ba6f2d"
+ integrity sha1-wsBMZr+HJo+4LBd6zr7/fTe6by0=
+ dependencies:
+ underscore ">=1.5.0"
+
+balanced-match@^1.0.0:
+ version "1.0.0"
+ resolved "https://registry.yarnpkg.com/balanced-match/-/balanced-match-1.0.0.tgz#89b4d199ab2bee49de164ea02b89ce462d71b767"
+ integrity sha1-ibTRmasr7kneFk6gK4nORi1xt2c=
+
+base62@0.1.1:
+ version "0.1.1"
+ resolved "https://registry.yarnpkg.com/base62/-/base62-0.1.1.tgz#7b4174c2f94449753b11c2651c083da841a7b084"
+ integrity sha1-e0F0wvlESXU7EcJlHAg9qEGnsIQ=
+
+base62@^1.1.0:
+ version "1.2.8"
+ resolved "https://registry.yarnpkg.com/base62/-/base62-1.2.8.tgz#1264cb0fb848d875792877479dbe8bae6bae3428"
+ integrity sha512-V6YHUbjLxN1ymqNLb1DPHoU1CpfdL7d2YTIp5W3U4hhoG4hhxNmsFDs66M9EXxBiSEke5Bt5dwdfMwwZF70iLA==
+
+base64-js@0.0.8:
+ version "0.0.8"
+ resolved "https://registry.yarnpkg.com/base64-js/-/base64-js-0.0.8.tgz#1101e9544f4a76b1bc3b26d452ca96d7a35e7978"
+ integrity sha1-EQHpVE9KdrG8OybUUsqW16NeeXg=
+
+base64-js@^1.0.2:
+ version "1.3.0"
+ resolved "https://registry.yarnpkg.com/base64-js/-/base64-js-1.3.0.tgz#cab1e6118f051095e58b5281aea8c1cd22bfc0e3"
+ integrity sha512-ccav/yGvoa80BQDljCxsmmQ3Xvx60/UpBIij5QN21W3wBi/hhIC9OoO+KLpu9IJTS9j4DRVJ3aDDF9cMSoa2lw==
+
+base@^0.11.1:
+ version "0.11.2"
+ resolved "https://registry.yarnpkg.com/base/-/base-0.11.2.tgz#7bde5ced145b6d551a90db87f83c558b4eb48a8f"
+ integrity sha512-5T6P4xPgpp0YDFvSWwEZ4NoE3aM4QBQXDzmVbraCkFj8zHM+mba8SyqB5DbZWyR7mYHo6Y7BdQo3MoA4m0TeQg==
+ dependencies:
+ cache-base "^1.0.1"
+ class-utils "^0.3.5"
+ component-emitter "^1.2.1"
+ define-property "^1.0.0"
+ isobject "^3.0.1"
+ mixin-deep "^1.2.0"
+ pascalcase "^0.1.1"
+
+binary-extensions@^1.0.0:
+ version "1.12.0"
+ resolved "https://registry.yarnpkg.com/binary-extensions/-/binary-extensions-1.12.0.tgz#c2d780f53d45bba8317a8902d4ceeaf3a6385b14"
+ integrity sha512-DYWGk01lDcxeS/K9IHPGWfT8PsJmbXRtRd2Sx72Tnb8pcYZQFF1oSDb8hJtS1vhp212q1Rzi5dUf9+nq0o9UIg==
+
+bn.js@^4.0.0, bn.js@^4.1.0, bn.js@^4.1.1, bn.js@^4.4.0:
+ version "4.11.8"
+ resolved "https://registry.yarnpkg.com/bn.js/-/bn.js-4.11.8.tgz#2cde09eb5ee341f484746bb0309b3253b1b1442f"
+ integrity sha512-ItfYfPLkWHUjckQCk8xC+LwxgK8NYcXywGigJgSwOP8Y2iyWT4f2vsZnoOXTTbo+o5yXmIUJ4gn5538SO5S3gA==
+
+brace-expansion@^1.0.0, brace-expansion@^1.1.7:
+ version "1.1.11"
+ resolved "https://registry.yarnpkg.com/brace-expansion/-/brace-expansion-1.1.11.tgz#3c7fcbf529d87226f3d2f52b966ff5271eb441dd"
+ integrity sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==
+ dependencies:
+ balanced-match "^1.0.0"
+ concat-map "0.0.1"
+
+braces@^1.8.2:
+ version "1.8.5"
+ resolved "https://registry.yarnpkg.com/braces/-/braces-1.8.5.tgz#ba77962e12dff969d6b76711e914b737857bf6a7"
+ integrity sha1-uneWLhLf+WnWt2cR6RS3N4V79qc=
+ dependencies:
+ expand-range "^1.8.1"
+ preserve "^0.2.0"
+ repeat-element "^1.1.2"
+
+braces@^2.3.1:
+ version "2.3.2"
+ resolved "https://registry.yarnpkg.com/braces/-/braces-2.3.2.tgz#5979fd3f14cd531565e5fa2df1abfff1dfaee729"
+ integrity sha512-aNdbnj9P8PjdXU4ybaWLK2IF3jc/EoDYbC7AazW6to3TRsfXxscC9UXOB5iDiEQrkyIbWp2SLQda4+QAa7nc3w==
+ dependencies:
+ arr-flatten "^1.1.0"
+ array-unique "^0.3.2"
+ extend-shallow "^2.0.1"
+ fill-range "^4.0.0"
+ isobject "^3.0.1"
+ repeat-element "^1.1.2"
+ snapdragon "^0.8.1"
+ snapdragon-node "^2.0.1"
+ split-string "^3.0.2"
+ to-regex "^3.0.1"
+
+brorand@^1.0.1:
+ version "1.1.0"
+ resolved "https://registry.yarnpkg.com/brorand/-/brorand-1.1.0.tgz#12c25efe40a45e3c323eb8675a0a0ce57b22371f"
+ integrity sha1-EsJe/kCkXjwyPrhnWgoM5XsiNx8=
+
+browser-pack@^5.0.0:
+ version "5.0.1"
+ resolved "https://registry.yarnpkg.com/browser-pack/-/browser-pack-5.0.1.tgz#4197719b20c6e0aaa09451c5111e53efb6fbc18d"
+ integrity sha1-QZdxmyDG4KqglFHFER5T77b7wY0=
+ dependencies:
+ JSONStream "^1.0.3"
+ combine-source-map "~0.6.1"
+ defined "^1.0.0"
+ through2 "^1.0.0"
+ umd "^3.0.0"
+
+browser-pack@^6.0.1:
+ version "6.1.0"
+ resolved "https://registry.yarnpkg.com/browser-pack/-/browser-pack-6.1.0.tgz#c34ba10d0b9ce162b5af227c7131c92c2ecd5774"
+ integrity sha512-erYug8XoqzU3IfcU8fUgyHqyOXqIE4tUTTQ+7mqUjQlvnXkOO6OlT9c/ZoJVHYoAaqGxr09CN53G7XIsO4KtWA==
+ dependencies:
+ JSONStream "^1.0.3"
+ combine-source-map "~0.8.0"
+ defined "^1.0.0"
+ safe-buffer "^5.1.1"
+ through2 "^2.0.0"
+ umd "^3.0.0"
+
+browser-resolve@^1.11.0, browser-resolve@^1.7.0, browser-resolve@^1.7.1:
+ version "1.11.3"
+ resolved "https://registry.yarnpkg.com/browser-resolve/-/browser-resolve-1.11.3.tgz#9b7cbb3d0f510e4cb86bdbd796124d28b5890af6"
+ integrity sha512-exDi1BYWB/6raKHmDTCicQfTkqwN5fioMFV4j8BsfMU4R2DK/QfZfK7kOVkmWCNANf0snkBzqGqAJBao9gZMdQ==
+ dependencies:
+ resolve "1.1.7"
+
+browserify-aes@^1.0.0, browserify-aes@^1.0.4:
+ version "1.2.0"
+ resolved "https://registry.yarnpkg.com/browserify-aes/-/browserify-aes-1.2.0.tgz#326734642f403dabc3003209853bb70ad428ef48"
+ integrity sha512-+7CHXqGuspUn/Sl5aO7Ea0xWGAtETPXNSAjHo48JfLdPWcMng33Xe4znFvQweqc/uzk5zSOI3H52CYnjCfb5hA==
+ dependencies:
+ buffer-xor "^1.0.3"
+ cipher-base "^1.0.0"
+ create-hash "^1.1.0"
+ evp_bytestokey "^1.0.3"
+ inherits "^2.0.1"
+ safe-buffer "^5.0.1"
+
+browserify-cipher@^1.0.0:
+ version "1.0.1"
+ resolved "https://registry.yarnpkg.com/browserify-cipher/-/browserify-cipher-1.0.1.tgz#8d6474c1b870bfdabcd3bcfcc1934a10e94f15f0"
+ integrity sha512-sPhkz0ARKbf4rRQt2hTpAHqn47X3llLkUGn+xEJzLjwY8LRs2p0v7ljvI5EyoRO/mexrNunNECisZs+gw2zz1w==
+ dependencies:
+ browserify-aes "^1.0.4"
+ browserify-des "^1.0.0"
+ evp_bytestokey "^1.0.0"
+
+browserify-des@^1.0.0:
+ version "1.0.2"
+ resolved "https://registry.yarnpkg.com/browserify-des/-/browserify-des-1.0.2.tgz#3af4f1f59839403572f1c66204375f7a7f703e9c"
+ integrity sha512-BioO1xf3hFwz4kc6iBhI3ieDFompMhrMlnDFC4/0/vd5MokpuAc3R+LYbwTA9A5Yc9pq9UYPqffKpW2ObuwX5A==
+ dependencies:
+ cipher-base "^1.0.1"
+ des.js "^1.0.0"
+ inherits "^2.0.1"
+ safe-buffer "^5.1.2"
+
+browserify-rsa@^4.0.0:
+ version "4.0.1"
+ resolved "https://registry.yarnpkg.com/browserify-rsa/-/browserify-rsa-4.0.1.tgz#21e0abfaf6f2029cf2fafb133567a701d4135524"
+ integrity sha1-IeCr+vbyApzy+vsTNWenAdQTVSQ=
+ dependencies:
+ bn.js "^4.1.0"
+ randombytes "^2.0.1"
+
+browserify-sign@^4.0.0:
+ version "4.0.4"
+ resolved "https://registry.yarnpkg.com/browserify-sign/-/browserify-sign-4.0.4.tgz#aa4eb68e5d7b658baa6bf6a57e630cbd7a93d298"
+ integrity sha1-qk62jl17ZYuqa/alfmMMvXqT0pg=
+ dependencies:
+ bn.js "^4.1.1"
+ browserify-rsa "^4.0.0"
+ create-hash "^1.1.0"
+ create-hmac "^1.1.2"
+ elliptic "^6.0.0"
+ inherits "^2.0.1"
+ parse-asn1 "^5.0.0"
+
+browserify-zlib@~0.1.2:
+ version "0.1.4"
+ resolved "https://registry.yarnpkg.com/browserify-zlib/-/browserify-zlib-0.1.4.tgz#bb35f8a519f600e0fa6b8485241c979d0141fb2d"
+ integrity sha1-uzX4pRn2AOD6a4SFJByXnQFB+y0=
+ dependencies:
+ pako "~0.2.0"
+
+browserify-zlib@~0.2.0:
+ version "0.2.0"
+ resolved "https://registry.yarnpkg.com/browserify-zlib/-/browserify-zlib-0.2.0.tgz#2869459d9aa3be245fe8fe2ca1f46e2e7f54d73f"
+ integrity sha512-Z942RysHXmJrhqk88FmKBVq/v5tqmSkDz7p54G/MGyjMnCFFnC79XWNbg+Vta8W6Wb2qtSZTSxIGkJrRpCFEiA==
+ dependencies:
+ pako "~1.0.5"
+
+browserify@^11.0.1:
+ version "11.2.0"
+ resolved "https://registry.yarnpkg.com/browserify/-/browserify-11.2.0.tgz#a11bb9dd209d79572b813f7eeeaf828a5f5c0e4e"
+ integrity sha1-oRu53SCdeVcrgT9+7q+Cil9cDk4=
+ dependencies:
+ JSONStream "^1.0.3"
+ assert "~1.3.0"
+ browser-pack "^5.0.0"
+ browser-resolve "^1.7.1"
+ browserify-zlib "~0.1.2"
+ buffer "^3.0.0"
+ builtins "~0.0.3"
+ commondir "0.0.1"
+ concat-stream "~1.4.1"
+ console-browserify "^1.1.0"
+ constants-browserify "~0.0.1"
+ crypto-browserify "^3.0.0"
+ defined "^1.0.0"
+ deps-sort "^1.3.7"
+ domain-browser "~1.1.0"
+ duplexer2 "~0.0.2"
+ events "~1.0.0"
+ glob "^4.0.5"
+ has "^1.0.0"
+ htmlescape "^1.1.0"
+ https-browserify "~0.0.0"
+ inherits "~2.0.1"
+ insert-module-globals "^6.4.1"
+ isarray "0.0.1"
+ labeled-stream-splicer "^1.0.0"
+ module-deps "^3.7.11"
+ os-browserify "~0.1.1"
+ parents "^1.0.1"
+ path-browserify "~0.0.0"
+ process "~0.11.0"
+ punycode "^1.3.2"
+ querystring-es3 "~0.2.0"
+ read-only-stream "^1.1.1"
+ readable-stream "^2.0.2"
+ resolve "^1.1.4"
+ shasum "^1.0.0"
+ shell-quote "~0.0.1"
+ stream-browserify "^2.0.0"
+ stream-http "^1.2.0"
+ string_decoder "~0.10.0"
+ subarg "^1.0.0"
+ syntax-error "^1.1.1"
+ through2 "^1.0.0"
+ timers-browserify "^1.0.1"
+ tty-browserify "~0.0.0"
+ url "~0.10.1"
+ util "~0.10.1"
+ vm-browserify "~0.0.1"
+ xtend "^4.0.0"
+
+browserify@^13.0.0:
+ version "13.3.0"
+ resolved "https://registry.yarnpkg.com/browserify/-/browserify-13.3.0.tgz#b5a9c9020243f0c70e4675bec8223bc627e415ce"
+ integrity sha1-tanJAgJD8McORnW+yCI7xifkFc4=
+ dependencies:
+ JSONStream "^1.0.3"
+ assert "^1.4.0"
+ browser-pack "^6.0.1"
+ browser-resolve "^1.11.0"
+ browserify-zlib "~0.1.2"
+ buffer "^4.1.0"
+ cached-path-relative "^1.0.0"
+ concat-stream "~1.5.1"
+ console-browserify "^1.1.0"
+ constants-browserify "~1.0.0"
+ crypto-browserify "^3.0.0"
+ defined "^1.0.0"
+ deps-sort "^2.0.0"
+ domain-browser "~1.1.0"
+ duplexer2 "~0.1.2"
+ events "~1.1.0"
+ glob "^7.1.0"
+ has "^1.0.0"
+ htmlescape "^1.1.0"
+ https-browserify "~0.0.0"
+ inherits "~2.0.1"
+ insert-module-globals "^7.0.0"
+ labeled-stream-splicer "^2.0.0"
+ module-deps "^4.0.8"
+ os-browserify "~0.1.1"
+ parents "^1.0.1"
+ path-browserify "~0.0.0"
+ process "~0.11.0"
+ punycode "^1.3.2"
+ querystring-es3 "~0.2.0"
+ read-only-stream "^2.0.0"
+ readable-stream "^2.0.2"
+ resolve "^1.1.4"
+ shasum "^1.0.0"
+ shell-quote "^1.6.1"
+ stream-browserify "^2.0.0"
+ stream-http "^2.0.0"
+ string_decoder "~0.10.0"
+ subarg "^1.0.0"
+ syntax-error "^1.1.1"
+ through2 "^2.0.0"
+ timers-browserify "^1.0.1"
+ tty-browserify "~0.0.0"
+ url "~0.11.0"
+ util "~0.10.1"
+ vm-browserify "~0.0.1"
+ xtend "^4.0.0"
+
+browserify@^16.1.0:
+ version "16.2.3"
+ resolved "https://registry.yarnpkg.com/browserify/-/browserify-16.2.3.tgz#7ee6e654ba4f92bce6ab3599c3485b1cc7a0ad0b"
+ integrity sha512-zQt/Gd1+W+IY+h/xX2NYMW4orQWhqSwyV+xsblycTtpOuB27h1fZhhNQuipJ4t79ohw4P4mMem0jp/ZkISQtjQ==
+ dependencies:
+ JSONStream "^1.0.3"
+ assert "^1.4.0"
+ browser-pack "^6.0.1"
+ browser-resolve "^1.11.0"
+ browserify-zlib "~0.2.0"
+ buffer "^5.0.2"
+ cached-path-relative "^1.0.0"
+ concat-stream "^1.6.0"
+ console-browserify "^1.1.0"
+ constants-browserify "~1.0.0"
+ crypto-browserify "^3.0.0"
+ defined "^1.0.0"
+ deps-sort "^2.0.0"
+ domain-browser "^1.2.0"
+ duplexer2 "~0.1.2"
+ events "^2.0.0"
+ glob "^7.1.0"
+ has "^1.0.0"
+ htmlescape "^1.1.0"
+ https-browserify "^1.0.0"
+ inherits "~2.0.1"
+ insert-module-globals "^7.0.0"
+ labeled-stream-splicer "^2.0.0"
+ mkdirp "^0.5.0"
+ module-deps "^6.0.0"
+ os-browserify "~0.3.0"
+ parents "^1.0.1"
+ path-browserify "~0.0.0"
+ process "~0.11.0"
+ punycode "^1.3.2"
+ querystring-es3 "~0.2.0"
+ read-only-stream "^2.0.0"
+ readable-stream "^2.0.2"
+ resolve "^1.1.4"
+ shasum "^1.0.0"
+ shell-quote "^1.6.1"
+ stream-browserify "^2.0.0"
+ stream-http "^2.0.0"
+ string_decoder "^1.1.1"
+ subarg "^1.0.0"
+ syntax-error "^1.1.1"
+ through2 "^2.0.0"
+ timers-browserify "^1.0.1"
+ tty-browserify "0.0.1"
+ url "~0.11.0"
+ util "~0.10.1"
+ vm-browserify "^1.0.0"
+ xtend "^4.0.0"
+
+buffer-from@^1.0.0:
+ version "1.1.1"
+ resolved "https://registry.yarnpkg.com/buffer-from/-/buffer-from-1.1.1.tgz#32713bc028f75c02fdb710d7c7bcec1f2c6070ef"
+ integrity sha512-MQcXEUbCKtEo7bhqEs6560Hyd4XaovZlO/k9V3hjVUF/zwW7KBVdSK4gIt/bzwS9MbR5qob+F5jusZsb0YQK2A==
+
+buffer-xor@^1.0.3:
+ version "1.0.3"
+ resolved "https://registry.yarnpkg.com/buffer-xor/-/buffer-xor-1.0.3.tgz#26e61ed1422fb70dd42e6e36729ed51d855fe8d9"
+ integrity sha1-JuYe0UIvtw3ULm42cp7VHYVf6Nk=
+
+buffer@^3.0.0:
+ version "3.6.0"
+ resolved "https://registry.yarnpkg.com/buffer/-/buffer-3.6.0.tgz#a72c936f77b96bf52f5f7e7b467180628551defb"
+ integrity sha1-pyyTb3e5a/UvX357RnGAYoVR3vs=
+ dependencies:
+ base64-js "0.0.8"
+ ieee754 "^1.1.4"
+ isarray "^1.0.0"
+
+buffer@^4.1.0:
+ version "4.9.1"
+ resolved "https://registry.yarnpkg.com/buffer/-/buffer-4.9.1.tgz#6d1bb601b07a4efced97094132093027c95bc298"
+ integrity sha1-bRu2AbB6TvztlwlBMgkwJ8lbwpg=
+ dependencies:
+ base64-js "^1.0.2"
+ ieee754 "^1.1.4"
+ isarray "^1.0.0"
+
+buffer@^5.0.2:
+ version "5.2.1"
+ resolved "https://registry.yarnpkg.com/buffer/-/buffer-5.2.1.tgz#dd57fa0f109ac59c602479044dca7b8b3d0b71d6"
+ integrity sha512-c+Ko0loDaFfuPWiL02ls9Xd3GO3cPVmUobQ6t3rXNUk304u6hGq+8N/kFi+QEIKhzK3uwolVhLzszmfLmMLnqg==
+ dependencies:
+ base64-js "^1.0.2"
+ ieee754 "^1.1.4"
+
+builtin-modules@^1.0.0:
+ version "1.1.1"
+ resolved "https://registry.yarnpkg.com/builtin-modules/-/builtin-modules-1.1.1.tgz#270f076c5a72c02f5b65a47df94c5fe3a278892f"
+ integrity sha1-Jw8HbFpywC9bZaR9+Uxf46J4iS8=
+
+builtin-status-codes@^1.0.0:
+ version "1.0.0"
+ resolved "https://registry.yarnpkg.com/builtin-status-codes/-/builtin-status-codes-1.0.0.tgz#30637ee262978ac07174e16d7f82f0ad06e085ad"
+ integrity sha1-MGN+4mKXisBxdOFtf4LwrQbgha0=
+
+builtin-status-codes@^3.0.0:
+ version "3.0.0"
+ resolved "https://registry.yarnpkg.com/builtin-status-codes/-/builtin-status-codes-3.0.0.tgz#85982878e21b98e1c66425e03d0174788f569ee8"
+ integrity sha1-hZgoeOIbmOHGZCXgPQF0eI9Wnug=
+
+builtins@~0.0.3:
+ version "0.0.7"
+ resolved "https://registry.yarnpkg.com/builtins/-/builtins-0.0.7.tgz#355219cd6cf18dbe7c01cc7fd2dce765cfdc549a"
+ integrity sha1-NVIZzWzxjb58Acx/0tznZc/cVJo=
+
+cache-base@^1.0.1:
+ version "1.0.1"
+ resolved "https://registry.yarnpkg.com/cache-base/-/cache-base-1.0.1.tgz#0a7f46416831c8b662ee36fe4e7c59d76f666ab2"
+ integrity sha512-AKcdTnFSWATd5/GCPRxr2ChwIJ85CeyrEyjRHlKxQ56d4XJMGym0uAiKn0xbLOGOl3+yRpOTi484dVCEc5AUzQ==
+ dependencies:
+ collection-visit "^1.0.0"
+ component-emitter "^1.2.1"
+ get-value "^2.0.6"
+ has-value "^1.0.0"
+ isobject "^3.0.1"
+ set-value "^2.0.0"
+ to-object-path "^0.3.0"
+ union-value "^1.0.0"
+ unset-value "^1.0.0"
+
+cached-path-relative@^1.0.0:
+ version "1.0.2"
+ resolved "https://registry.yarnpkg.com/cached-path-relative/-/cached-path-relative-1.0.2.tgz#a13df4196d26776220cc3356eb147a52dba2c6db"
+ integrity sha512-5r2GqsoEb4qMTTN9J+WzXfjov+hjxT+j3u5K+kIVNIwAd99DLCJE9pBIMP1qVeybV6JiijL385Oz0DcYxfbOIg==
+
+camelcase-keys@^2.0.0:
+ version "2.1.0"
+ resolved "https://registry.yarnpkg.com/camelcase-keys/-/camelcase-keys-2.1.0.tgz#308beeaffdf28119051efa1d932213c91b8f92e7"
+ integrity sha1-MIvur/3ygRkFHvodkyITyRuPkuc=
+ dependencies:
+ camelcase "^2.0.0"
+ map-obj "^1.0.0"
+
+camelcase@^1.0.2:
+ version "1.2.1"
+ resolved "https://registry.yarnpkg.com/camelcase/-/camelcase-1.2.1.tgz#9bb5304d2e0b56698b2c758b08a3eaa9daa58a39"
+ integrity sha1-m7UwTS4LVmmLLHWLCKPqqdqlijk=
+
+camelcase@^2.0.0:
+ version "2.1.1"
+ resolved "https://registry.yarnpkg.com/camelcase/-/camelcase-2.1.1.tgz#7c1d16d679a1bbe59ca02cacecfb011e201f5a1f"
+ integrity sha1-fB0W1nmhu+WcoCys7PsBHiAfWh8=
+
+chalk@~2.4.1:
+ version "2.4.1"
+ resolved "https://registry.yarnpkg.com/chalk/-/chalk-2.4.1.tgz#18c49ab16a037b6eb0152cc83e3471338215b66e"
+ integrity sha512-ObN6h1v2fTJSmUXoS3nMQ92LbDK9be4TV+6G+omQlGJFdcUX5heKi1LZ1YnRMIgwTLEj3E24bT6tYni50rlCfQ==
+ dependencies:
+ ansi-styles "^3.2.1"
+ escape-string-regexp "^1.0.5"
+ supports-color "^5.3.0"
+
+chokidar@^1.0.0:
+ version "1.7.0"
+ resolved "https://registry.yarnpkg.com/chokidar/-/chokidar-1.7.0.tgz#798e689778151c8076b4b360e5edd28cda2bb468"
+ integrity sha1-eY5ol3gVHIB2tLNg5e3SjNortGg=
+ dependencies:
+ anymatch "^1.3.0"
+ async-each "^1.0.0"
+ glob-parent "^2.0.0"
+ inherits "^2.0.1"
+ is-binary-path "^1.0.0"
+ is-glob "^2.0.0"
+ path-is-absolute "^1.0.0"
+ readdirp "^2.0.0"
+ optionalDependencies:
+ fsevents "^1.0.0"
+
+chownr@^1.1.1:
+ version "1.1.1"
+ resolved "https://registry.yarnpkg.com/chownr/-/chownr-1.1.1.tgz#54726b8b8fff4df053c42187e801fb4412df1494"
+ integrity sha512-j38EvO5+LHX84jlo6h4UzmOwi0UgW61WRyPtJz4qaadK5eY3BTS5TY/S1Stc3Uk2lIM6TPevAlULiEJwie860g==
+
+cipher-base@^1.0.0, cipher-base@^1.0.1, cipher-base@^1.0.3:
+ version "1.0.4"
+ resolved "https://registry.yarnpkg.com/cipher-base/-/cipher-base-1.0.4.tgz#8760e4ecc272f4c363532f926d874aae2c1397de"
+ integrity sha512-Kkht5ye6ZGmwv40uUDZztayT2ThLQGfnj/T71N/XzeZeo3nf8foyW7zGTsPYkEya3m5f3cAypH+qe7YOrM1U2Q==
+ dependencies:
+ inherits "^2.0.1"
+ safe-buffer "^5.0.1"
+
+class-utils@^0.3.5:
+ version "0.3.6"
+ resolved "https://registry.yarnpkg.com/class-utils/-/class-utils-0.3.6.tgz#f93369ae8b9a7ce02fd41faad0ca83033190c463"
+ integrity sha512-qOhPa/Fj7s6TY8H8esGu5QNpMMQxz79h+urzrNYN6mn+9BnxlDGf5QZ+XeCDsxSjPqsSR56XOZOJmpeurnLMeg==
+ dependencies:
+ arr-union "^3.1.0"
+ define-property "^0.2.5"
+ isobject "^3.0.0"
+ static-extend "^0.1.1"
+
+cli@0.4.x:
+ version "0.4.5"
+ resolved "https://registry.yarnpkg.com/cli/-/cli-0.4.5.tgz#78f9485cd161b566e9a6c72d7170c4270e81db61"
+ integrity sha1-ePlIXNFhtWbppsctcXDEJw6B22E=
+ dependencies:
+ glob ">= 3.1.4"
+
+cli@0.6.x:
+ version "0.6.6"
+ resolved "https://registry.yarnpkg.com/cli/-/cli-0.6.6.tgz#02ad44a380abf27adac5e6f0cdd7b043d74c53e3"
+ integrity sha1-Aq1Eo4Cr8nraxebwzdewQ9dMU+M=
+ dependencies:
+ exit "0.1.2"
+ glob "~ 3.2.1"
+
+code-point-at@^1.0.0:
+ version "1.1.0"
+ resolved "https://registry.yarnpkg.com/code-point-at/-/code-point-at-1.1.0.tgz#0d070b4d043a5bea33a2f1a40e2edb3d9a4ccf77"
+ integrity sha1-DQcLTQQ6W+ozovGkDi7bPZpMz3c=
+
+coffee-script@>=1.0.1:
+ version "1.12.7"
+ resolved "https://registry.yarnpkg.com/coffee-script/-/coffee-script-1.12.7.tgz#c05dae0cb79591d05b3070a8433a98c9a89ccc53"
+ integrity sha512-fLeEhqwymYat/MpTPUjSKHVYYl0ec2mOyALEMLmzr5i1isuG+6jfI2j2d5oBO3VIzgUXgBVIcOT9uH1TFxBckw==
+
+coffee-script@~1.3.3:
+ version "1.3.3"
+ resolved "https://registry.yarnpkg.com/coffee-script/-/coffee-script-1.3.3.tgz#150d6b4cb522894369efed6a2101c20bc7f4a4f4"
+ integrity sha1-FQ1rTLUiiUNp7+1qIQHCC8f0pPQ=
+
+coffeescript@~1.10.0:
+ version "1.10.0"
+ resolved "https://registry.yarnpkg.com/coffeescript/-/coffeescript-1.10.0.tgz#e7aa8301917ef621b35d8a39f348dcdd1db7e33e"
+ integrity sha1-56qDAZF+9iGzXYo580jc3R234z4=
+
+coffeescript@~1.12.7:
+ version "1.12.7"
+ resolved "https://registry.yarnpkg.com/coffeescript/-/coffeescript-1.12.7.tgz#e57ee4c4867cf7f606bfc4a0f2d550c0981ddd27"
+ integrity sha512-pLXHFxQMPklVoEekowk8b3erNynC+DVJzChxS/LCBBgR6/8AJkHivkm//zbowcfc7BTCAjryuhx6gPqPRfsFoA==
+
+collection-visit@^1.0.0:
+ version "1.0.0"
+ resolved "https://registry.yarnpkg.com/collection-visit/-/collection-visit-1.0.0.tgz#4bc0373c164bc3291b4d368c829cf1a80a59dca0"
+ integrity sha1-S8A3PBZLwykbTTaMgpzxqApZ3KA=
+ dependencies:
+ map-visit "^1.0.0"
+ object-visit "^1.0.0"
+
+color-convert@^1.9.0:
+ version "1.9.3"
+ resolved "https://registry.yarnpkg.com/color-convert/-/color-convert-1.9.3.tgz#bb71850690e1f136567de629d2d5471deda4c1e8"
+ integrity sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==
+ dependencies:
+ color-name "1.1.3"
+
+color-name@1.1.3:
+ version "1.1.3"
+ resolved "https://registry.yarnpkg.com/color-name/-/color-name-1.1.3.tgz#a7d0558bd89c42f795dd42328f740831ca53bc25"
+ integrity sha1-p9BVi9icQveV3UIyj3QIMcpTvCU=
+
+colors@1.0.x:
+ version "1.0.3"
+ resolved "https://registry.yarnpkg.com/colors/-/colors-1.0.3.tgz#0433f44d809680fdeb60ed260f1b0c262e82a40b"
+ integrity sha1-BDP0TYCWgP3rYO0mDxsMJi6CpAs=
+
+colors@^1.1.2:
+ version "1.3.2"
+ resolved "https://registry.yarnpkg.com/colors/-/colors-1.3.2.tgz#2df8ff573dfbf255af562f8ce7181d6b971a359b"
+ integrity sha512-rhP0JSBGYvpcNQj4s5AdShMeE5ahMop96cTeDl/v9qQQm2fYClE2QXZRi8wLzc+GmXSxdIqqbOIAhyObEXDbfQ==
+
+colors@~0.6.2:
+ version "0.6.2"
+ resolved "https://registry.yarnpkg.com/colors/-/colors-0.6.2.tgz#2423fe6678ac0c5dae8852e5d0e5be08c997abcc"
+ integrity sha1-JCP+ZnisDF2uiFLl0OW+CMmXq8w=
+
+colors@~1.1.2:
+ version "1.1.2"
+ resolved "https://registry.yarnpkg.com/colors/-/colors-1.1.2.tgz#168a4701756b6a7f51a12ce0c97bfa28c084ed63"
+ integrity sha1-FopHAXVran9RoSzgyXv6KMCE7WM=
+
+combine-source-map@^0.8.0, combine-source-map@~0.8.0:
+ version "0.8.0"
+ resolved "https://registry.yarnpkg.com/combine-source-map/-/combine-source-map-0.8.0.tgz#a58d0df042c186fcf822a8e8015f5450d2d79a8b"
+ integrity sha1-pY0N8ELBhvz4IqjoAV9UUNLXmos=
+ dependencies:
+ convert-source-map "~1.1.0"
+ inline-source-map "~0.6.0"
+ lodash.memoize "~3.0.3"
+ source-map "~0.5.3"
+
+combine-source-map@~0.6.1:
+ version "0.6.1"
+ resolved "https://registry.yarnpkg.com/combine-source-map/-/combine-source-map-0.6.1.tgz#9b4a09c316033d768e0f11e029fa2730e079ad96"
+ integrity sha1-m0oJwxYDPXaODxHgKfonMOB5rZY=
+ dependencies:
+ convert-source-map "~1.1.0"
+ inline-source-map "~0.5.0"
+ lodash.memoize "~3.0.3"
+ source-map "~0.4.2"
+
+commander@^2.5.0:
+ version "2.19.0"
+ resolved "https://registry.yarnpkg.com/commander/-/commander-2.19.0.tgz#f6198aa84e5b83c46054b94ddedbfed5ee9ff12a"
+ integrity sha512-6tvAOO+D6OENvRAh524Dh9jcfKTYDQAqvqezbCW82xj5X0pSrcpxtvRKHLG0yBY6SD7PSDrJaj+0AiOcKVd1Xg==
+
+commondir@0.0.1:
+ version "0.0.1"
+ resolved "https://registry.yarnpkg.com/commondir/-/commondir-0.0.1.tgz#89f00fdcd51b519c578733fec563e6a6da7f5be2"
+ integrity sha1-ifAP3NUbUZxXhzP+xWPmptp/W+I=
+
+commoner@^0.10.0, commoner@^0.10.1:
+ version "0.10.8"
+ resolved "https://registry.yarnpkg.com/commoner/-/commoner-0.10.8.tgz#34fc3672cd24393e8bb47e70caa0293811f4f2c5"
+ integrity sha1-NPw2cs0kOT6LtH5wyqApOBH08sU=
+ dependencies:
+ commander "^2.5.0"
+ detective "^4.3.1"
+ glob "^5.0.15"
+ graceful-fs "^4.1.2"
+ iconv-lite "^0.4.5"
+ mkdirp "^0.5.0"
+ private "^0.1.6"
+ q "^1.1.2"
+ recast "^0.11.17"
+
+component-emitter@^1.2.1:
+ version "1.2.1"
+ resolved "https://registry.yarnpkg.com/component-emitter/-/component-emitter-1.2.1.tgz#137918d6d78283f7df7a6b7c5a63e140e69425e6"
+ integrity sha1-E3kY1teCg/ffemt8WmPhQOaUJeY=
+
+concat-map@0.0.1:
+ version "0.0.1"
+ resolved "https://registry.yarnpkg.com/concat-map/-/concat-map-0.0.1.tgz#d8a96bd77fd68df7793a73036a3ba0d5405d477b"
+ integrity sha1-2Klr13/Wjfd5OnMDajug1UBdR3s=
+
+concat-stream@^1.6.0, concat-stream@^1.6.1, concat-stream@~1.6.0:
+ version "1.6.2"
+ resolved "https://registry.yarnpkg.com/concat-stream/-/concat-stream-1.6.2.tgz#904bdf194cd3122fc675c77fc4ac3d4ff0fd1a34"
+ integrity sha512-27HBghJxjiZtIk3Ycvn/4kbJk/1uZuJFfuPEns6LaEvpvG1f0hTea8lilrouyo9mVc2GWdcEZ8OLoGmSADlrCw==
+ dependencies:
+ buffer-from "^1.0.0"
+ inherits "^2.0.3"
+ readable-stream "^2.2.2"
+ typedarray "^0.0.6"
+
+concat-stream@~1.4.1, concat-stream@~1.4.5:
+ version "1.4.11"
+ resolved "https://registry.yarnpkg.com/concat-stream/-/concat-stream-1.4.11.tgz#1dc9f666f2621da9c618b1e7f8f3b2ff70b5f76f"
+ integrity sha512-X3JMh8+4je3U1cQpG87+f9lXHDrqcb2MVLg9L7o8b1UZ0DzhRrUpdn65ttzu10PpJPPI3MQNkis+oha6TSA9Mw==
+ dependencies:
+ inherits "~2.0.1"
+ readable-stream "~1.1.9"
+ typedarray "~0.0.5"
+
+concat-stream@~1.5.0, concat-stream@~1.5.1:
+ version "1.5.2"
+ resolved "https://registry.yarnpkg.com/concat-stream/-/concat-stream-1.5.2.tgz#708978624d856af41a5a741defdd261da752c266"
+ integrity sha1-cIl4Yk2FavQaWnQd790mHadSwmY=
+ dependencies:
+ inherits "~2.0.1"
+ readable-stream "~2.0.0"
+ typedarray "~0.0.5"
+
+console-browserify@0.1.x:
+ version "0.1.6"
+ resolved "https://registry.yarnpkg.com/console-browserify/-/console-browserify-0.1.6.tgz#d128a3c0bb88350eb5626c6e7c71a6f0fd48983c"
+ integrity sha1-0SijwLuINQ61YmxufHGm8P1ImDw=
+
+console-browserify@1.1.x, console-browserify@^1.1.0:
+ version "1.1.0"
+ resolved "https://registry.yarnpkg.com/console-browserify/-/console-browserify-1.1.0.tgz#f0241c45730a9fc6323b206dbf38edc741d0bb10"
+ integrity sha1-8CQcRXMKn8YyOyBtvzjtx0HQuxA=
+ dependencies:
+ date-now "^0.1.4"
+
+console-control-strings@^1.0.0, console-control-strings@~1.1.0:
+ version "1.1.0"
+ resolved "https://registry.yarnpkg.com/console-control-strings/-/console-control-strings-1.1.0.tgz#3d7cf4464db6446ea644bf4b39507f9851008e8e"
+ integrity sha1-PXz0Rk22RG6mRL9LOVB/mFEAjo4=
+
+constants-browserify@~0.0.1:
+ version "0.0.1"
+ resolved "https://registry.yarnpkg.com/constants-browserify/-/constants-browserify-0.0.1.tgz#92577db527ba6c4cf0a4568d84bc031f441e21f2"
+ integrity sha1-kld9tSe6bEzwpFaNhLwDH0QeIfI=
+
+constants-browserify@~1.0.0:
+ version "1.0.0"
+ resolved "https://registry.yarnpkg.com/constants-browserify/-/constants-browserify-1.0.0.tgz#c20b96d8c617748aaf1c16021760cd27fcb8cb75"
+ integrity sha1-wguW2MYXdIqvHBYCF2DNJ/y4y3U=
+
+convert-source-map@~1.1.0:
+ version "1.1.3"
+ resolved "https://registry.yarnpkg.com/convert-source-map/-/convert-source-map-1.1.3.tgz#4829c877e9fe49b3161f3bf3673888e204699860"
+ integrity sha1-SCnId+n+SbMWHzvzZziI4gRpmGA=
+
+copy-descriptor@^0.1.0:
+ version "0.1.1"
+ resolved "https://registry.yarnpkg.com/copy-descriptor/-/copy-descriptor-0.1.1.tgz#676f6eb3c39997c2ee1ac3a924fd6124748f578d"
+ integrity sha1-Z29us8OZl8LuGsOpJP1hJHSPV40=
+
+core-js@^1.0.0:
+ version "1.2.7"
+ resolved "https://registry.yarnpkg.com/core-js/-/core-js-1.2.7.tgz#652294c14651db28fa93bd2d5ff2983a4f08c636"
+ integrity sha1-ZSKUwUZR2yj6k70tX/KYOk8IxjY=
+
+core-util-is@~1.0.0:
+ version "1.0.2"
+ resolved "https://registry.yarnpkg.com/core-util-is/-/core-util-is-1.0.2.tgz#b5fd54220aa2bc5ab57aab7140c940754503c1a7"
+ integrity sha1-tf1UIgqivFq1eqtxQMlAdUUDwac=
+
+create-ecdh@^4.0.0:
+ version "4.0.3"
+ resolved "https://registry.yarnpkg.com/create-ecdh/-/create-ecdh-4.0.3.tgz#c9111b6f33045c4697f144787f9254cdc77c45ff"
+ integrity sha512-GbEHQPMOswGpKXM9kCWVrremUcBmjteUaQ01T9rkKCPDXfUHX0IoP9LpHYo2NPFampa4e+/pFDc3jQdxrxQLaw==
+ dependencies:
+ bn.js "^4.1.0"
+ elliptic "^6.0.0"
+
+create-hash@^1.1.0, create-hash@^1.1.2:
+ version "1.2.0"
+ resolved "https://registry.yarnpkg.com/create-hash/-/create-hash-1.2.0.tgz#889078af11a63756bcfb59bd221996be3a9ef196"
+ integrity sha512-z00bCGNHDG8mHAkP7CtT1qVu+bFQUPjYq/4Iv3C3kWjTFV10zIjfSoeqXo9Asws8gwSHDGj/hl2u4OGIjapeCg==
+ dependencies:
+ cipher-base "^1.0.1"
+ inherits "^2.0.1"
+ md5.js "^1.3.4"
+ ripemd160 "^2.0.1"
+ sha.js "^2.4.0"
+
+create-hmac@^1.1.0, create-hmac@^1.1.2, create-hmac@^1.1.4:
+ version "1.1.7"
+ resolved "https://registry.yarnpkg.com/create-hmac/-/create-hmac-1.1.7.tgz#69170c78b3ab957147b2b8b04572e47ead2243ff"
+ integrity sha512-MJG9liiZ+ogc4TzUwuvbER1JRdgvUFSB5+VR/g5h82fGaIRWMWddtKBHi7/sVhfjQZ6SehlyhvQYrcYkaUIpLg==
+ dependencies:
+ cipher-base "^1.0.3"
+ create-hash "^1.1.0"
+ inherits "^2.0.1"
+ ripemd160 "^2.0.0"
+ safe-buffer "^5.0.1"
+ sha.js "^2.4.8"
+
+crypto-browserify@^3.0.0:
+ version "3.12.0"
+ resolved "https://registry.yarnpkg.com/crypto-browserify/-/crypto-browserify-3.12.0.tgz#396cf9f3137f03e4b8e532c58f698254e00f80ec"
+ integrity sha512-fz4spIh+znjO2VjL+IdhEpRJ3YN6sMzITSBijk6FK2UvTqruSQW+/cCZTSNsMiZNvUeq0CqurF+dAbyiGOY6Wg==
+ dependencies:
+ browserify-cipher "^1.0.0"
+ browserify-sign "^4.0.0"
+ create-ecdh "^4.0.0"
+ create-hash "^1.1.0"
+ create-hmac "^1.1.0"
+ diffie-hellman "^5.0.0"
+ inherits "^2.0.1"
+ pbkdf2 "^3.0.3"
+ public-encrypt "^4.0.0"
+ randombytes "^2.0.0"
+ randomfill "^1.0.3"
+
+currently-unhandled@^0.4.1:
+ version "0.4.1"
+ resolved "https://registry.yarnpkg.com/currently-unhandled/-/currently-unhandled-0.4.1.tgz#988df33feab191ef799a61369dd76c17adf957ea"
+ integrity sha1-mI3zP+qxke95mmE2nddsF635V+o=
+ dependencies:
+ array-find-index "^1.0.1"
+
+cycle@1.0.x:
+ version "1.0.3"
+ resolved "https://registry.yarnpkg.com/cycle/-/cycle-1.0.3.tgz#21e80b2be8580f98b468f379430662b046c34ad2"
+ integrity sha1-IegLK+hYD5i0aPN5QwZisEbDStI=
+
+date-now@^0.1.4:
+ version "0.1.4"
+ resolved "https://registry.yarnpkg.com/date-now/-/date-now-0.1.4.tgz#eaf439fd4d4848ad74e5cc7dbef200672b9e345b"
+ integrity sha1-6vQ5/U1ISK105cx9vvIAZyueNFs=
+
+dateformat@1.0.2-1.2.3:
+ version "1.0.2-1.2.3"
+ resolved "https://registry.yarnpkg.com/dateformat/-/dateformat-1.0.2-1.2.3.tgz#b0220c02de98617433b72851cf47de3df2cdbee9"
+ integrity sha1-sCIMAt6YYXQztyhRz0fePfLNvuk=
+
+dateformat@~1.0.12:
+ version "1.0.12"
+ resolved "https://registry.yarnpkg.com/dateformat/-/dateformat-1.0.12.tgz#9f124b67594c937ff706932e4a642cca8dbbfee9"
+ integrity sha1-nxJLZ1lMk3/3BpMuSmQsyo27/uk=
+ dependencies:
+ get-stdin "^4.0.1"
+ meow "^3.3.0"
+
+debug@^2.1.2, debug@^2.2.0, debug@^2.3.3:
+ version "2.6.9"
+ resolved "https://registry.yarnpkg.com/debug/-/debug-2.6.9.tgz#5d128515df134ff327e90a4c93f4e077a536341f"
+ integrity sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==
+ dependencies:
+ ms "2.0.0"
+
+decamelize@^1.0.0, decamelize@^1.1.2:
+ version "1.2.0"
+ resolved "https://registry.yarnpkg.com/decamelize/-/decamelize-1.2.0.tgz#f6534d15148269b20352e7bee26f501f9a191290"
+ integrity sha1-9lNNFRSCabIDUue+4m9QH5oZEpA=
+
+decode-uri-component@^0.2.0:
+ version "0.2.0"
+ resolved "https://registry.yarnpkg.com/decode-uri-component/-/decode-uri-component-0.2.0.tgz#eb3913333458775cb84cd1a1fae062106bb87545"
+ integrity sha1-6zkTMzRYd1y4TNGh+uBiEGu4dUU=
+
+deep-equal@~0.2.1:
+ version "0.2.2"
+ resolved "https://registry.yarnpkg.com/deep-equal/-/deep-equal-0.2.2.tgz#84b745896f34c684e98f2ce0e42abaf43bba017d"
+ integrity sha1-hLdFiW80xoTpjyzg5Cq69Du6AX0=
+
+deep-extend@^0.6.0:
+ version "0.6.0"
+ resolved "https://registry.yarnpkg.com/deep-extend/-/deep-extend-0.6.0.tgz#c4fa7c95404a17a9c3e8ca7e1537312b736330ac"
+ integrity sha512-LOHxIOaPYdHlJRtCQfDIVZtfw/ufM8+rVj649RIHzcm/vGwQRXFt6OPqIFWsm2XEMrNIEtWR64sY1LEKD2vAOA==
+
+define-property@^0.2.5:
+ version "0.2.5"
+ resolved "https://registry.yarnpkg.com/define-property/-/define-property-0.2.5.tgz#c35b1ef918ec3c990f9a5bc57be04aacec5c8116"
+ integrity sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY=
+ dependencies:
+ is-descriptor "^0.1.0"
+
+define-property@^1.0.0:
+ version "1.0.0"
+ resolved "https://registry.yarnpkg.com/define-property/-/define-property-1.0.0.tgz#769ebaaf3f4a63aad3af9e8d304c9bbe79bfb0e6"
+ integrity sha1-dp66rz9KY6rTr56NMEybvnm/sOY=
+ dependencies:
+ is-descriptor "^1.0.0"
+
+define-property@^2.0.2:
+ version "2.0.2"
+ resolved "https://registry.yarnpkg.com/define-property/-/define-property-2.0.2.tgz#d459689e8d654ba77e02a817f8710d702cb16e9d"
+ integrity sha512-jwK2UV4cnPpbcG7+VRARKTZPUWowwXA8bzH5NP6ud0oeAxyYPuGZUAC7hMugpCdz4BeSZl2Dl9k66CHJ/46ZYQ==
+ dependencies:
+ is-descriptor "^1.0.2"
+ isobject "^3.0.1"
+
+defined@^1.0.0:
+ version "1.0.0"
+ resolved "https://registry.yarnpkg.com/defined/-/defined-1.0.0.tgz#c98d9bcef75674188e110969151199e39b1fa693"
+ integrity sha1-yY2bzvdWdBiOEQlpFRGZ45sfppM=
+
+delegates@^1.0.0:
+ version "1.0.0"
+ resolved "https://registry.yarnpkg.com/delegates/-/delegates-1.0.0.tgz#84c6e159b81904fdca59a0ef44cd870d31250f9a"
+ integrity sha1-hMbhWbgZBP3KWaDvRM2HDTElD5o=
+
+deps-sort@^1.3.7:
+ version "1.3.9"
+ resolved "https://registry.yarnpkg.com/deps-sort/-/deps-sort-1.3.9.tgz#29dfff53e17b36aecae7530adbbbf622c2ed1a71"
+ integrity sha1-Kd//U+F7Nq7K51MK27v2IsLtGnE=
+ dependencies:
+ JSONStream "^1.0.3"
+ shasum "^1.0.0"
+ subarg "^1.0.0"
+ through2 "^1.0.0"
+
+deps-sort@^2.0.0:
+ version "2.0.0"
+ resolved "https://registry.yarnpkg.com/deps-sort/-/deps-sort-2.0.0.tgz#091724902e84658260eb910748cccd1af6e21fb5"
+ integrity sha1-CRckkC6EZYJg65EHSMzNGvbiH7U=
+ dependencies:
+ JSONStream "^1.0.3"
+ shasum "^1.0.0"
+ subarg "^1.0.0"
+ through2 "^2.0.0"
+
+des.js@^1.0.0:
+ version "1.0.0"
+ resolved "https://registry.yarnpkg.com/des.js/-/des.js-1.0.0.tgz#c074d2e2aa6a8a9a07dbd61f9a15c2cd83ec8ecc"
+ integrity sha1-wHTS4qpqipoH29YfmhXCzYPsjsw=
+ dependencies:
+ inherits "^2.0.1"
+ minimalistic-assert "^1.0.0"
+
+detect-libc@^1.0.2:
+ version "1.0.3"
+ resolved "https://registry.yarnpkg.com/detect-libc/-/detect-libc-1.0.3.tgz#fa137c4bd698edf55cd5cd02ac559f91a4c4ba9b"
+ integrity sha1-+hN8S9aY7fVc1c0CrFWfkaTEups=
+
+detective@^4.0.0, detective@^4.3.1:
+ version "4.7.1"
+ resolved "https://registry.yarnpkg.com/detective/-/detective-4.7.1.tgz#0eca7314338442febb6d65da54c10bb1c82b246e"
+ integrity sha512-H6PmeeUcZloWtdt4DAkFyzFL94arpHr3NOwwmVILFiy+9Qd4JTxxXrzfyGk/lmct2qVGBwTSwSXagqu2BxmWig==
+ dependencies:
+ acorn "^5.2.1"
+ defined "^1.0.0"
+
+detective@^5.0.2:
+ version "5.1.0"
+ resolved "https://registry.yarnpkg.com/detective/-/detective-5.1.0.tgz#7a20d89236d7b331ccea65832e7123b5551bb7cb"
+ integrity sha512-TFHMqfOvxlgrfVzTEkNBSh9SvSNX/HfF4OFI2QFGCyPm02EsyILqnUeb5P6q7JZ3SFNTBL5t2sePRgrN4epUWQ==
+ dependencies:
+ acorn-node "^1.3.0"
+ defined "^1.0.0"
+ minimist "^1.1.1"
+
+diffie-hellman@^5.0.0:
+ version "5.0.3"
+ resolved "https://registry.yarnpkg.com/diffie-hellman/-/diffie-hellman-5.0.3.tgz#40e8ee98f55a2149607146921c63e1ae5f3d2875"
+ integrity sha512-kqag/Nl+f3GwyK25fhUMYj81BUOrZ9IuJsjIcDE5icNM9FJHAVm3VcUDxdLPoQtTuUylWm6ZIknYJwwaPxsUzg==
+ dependencies:
+ bn.js "^4.1.0"
+ miller-rabin "^4.0.0"
+ randombytes "^2.0.0"
+
+dom-serializer@0:
+ version "0.1.0"
+ resolved "https://registry.yarnpkg.com/dom-serializer/-/dom-serializer-0.1.0.tgz#073c697546ce0780ce23be4a28e293e40bc30c82"
+ integrity sha1-BzxpdUbOB4DOI75KKOKT5AvDDII=
+ dependencies:
+ domelementtype "~1.1.1"
+ entities "~1.1.1"
+
+domain-browser@^1.2.0:
+ version "1.2.0"
+ resolved "https://registry.yarnpkg.com/domain-browser/-/domain-browser-1.2.0.tgz#3d31f50191a6749dd1375a7f522e823d42e54eda"
+ integrity sha512-jnjyiM6eRyZl2H+W8Q/zLMA481hzi0eszAaBUzIVnmYVDBbnLxVNnfu1HgEBvCbL+71FrxMl3E6lpKH7Ge3OXA==
+
+domain-browser@~1.1.0:
+ version "1.1.7"
+ resolved "https://registry.yarnpkg.com/domain-browser/-/domain-browser-1.1.7.tgz#867aa4b093faa05f1de08c06f4d7b21fdf8698bc"
+ integrity sha1-hnqksJP6oF8d4IwG9NeyH9+GmLw=
+
+domelementtype@1:
+ version "1.2.1"
+ resolved "https://registry.yarnpkg.com/domelementtype/-/domelementtype-1.2.1.tgz#578558ef23befac043a1abb0db07635509393479"
+ integrity sha512-SQVCLFS2E7G5CRCMdn6K9bIhRj1bS6QBWZfF0TUPh4V/BbqrQ619IdSS3/izn0FZ+9l+uODzaZjb08fjOfablA==
+
+domelementtype@~1.1.1:
+ version "1.1.3"
+ resolved "https://registry.yarnpkg.com/domelementtype/-/domelementtype-1.1.3.tgz#bd28773e2642881aec51544924299c5cd822185b"
+ integrity sha1-vSh3PiZCiBrsUVRJJCmcXNgiGFs=
+
+domhandler@2.3:
+ version "2.3.0"
+ resolved "https://registry.yarnpkg.com/domhandler/-/domhandler-2.3.0.tgz#2de59a0822d5027fabff6f032c2b25a2a8abe738"
+ integrity sha1-LeWaCCLVAn+r/28DLCsloqir5zg=
+ dependencies:
+ domelementtype "1"
+
+domutils@1.5:
+ version "1.5.1"
+ resolved "https://registry.yarnpkg.com/domutils/-/domutils-1.5.1.tgz#dcd8488a26f563d61079e48c9f7b7e32373682cf"
+ integrity sha1-3NhIiib1Y9YQeeSMn3t+Mjc2gs8=
+ dependencies:
+ dom-serializer "0"
+ domelementtype "1"
+
+duplexer2@0.0.2, duplexer2@~0.0.2:
+ version "0.0.2"
+ resolved "https://registry.yarnpkg.com/duplexer2/-/duplexer2-0.0.2.tgz#c614dcf67e2fb14995a91711e5a617e8a60a31db"
+ integrity sha1-xhTc9n4vsUmVqRcR5aYX6KYKMds=
+ dependencies:
+ readable-stream "~1.1.9"
+
+duplexer2@^0.1.2, duplexer2@~0.1.0, duplexer2@~0.1.2:
+ version "0.1.4"
+ resolved "https://registry.yarnpkg.com/duplexer2/-/duplexer2-0.1.4.tgz#8b12dab878c0d69e3e7891051662a32fc6bddcc1"
+ integrity sha1-ixLauHjA1p4+eJEFFmKjL8a93ME=
+ dependencies:
+ readable-stream "^2.0.2"
+
+elliptic@^6.0.0:
+ version "6.4.1"
+ resolved "https://registry.yarnpkg.com/elliptic/-/elliptic-6.4.1.tgz#c2d0b7776911b86722c632c3c06c60f2f819939a"
+ integrity sha512-BsXLz5sqX8OHcsh7CqBMztyXARmGQ3LWPtGjJi6DiJHq5C/qvi9P3OqgswKSDftbu8+IoI/QDTAm2fFnQ9SZSQ==
+ dependencies:
+ bn.js "^4.4.0"
+ brorand "^1.0.1"
+ hash.js "^1.0.0"
+ hmac-drbg "^1.0.0"
+ inherits "^2.0.1"
+ minimalistic-assert "^1.0.0"
+ minimalistic-crypto-utils "^1.0.0"
+
+encoding@^0.1.11:
+ version "0.1.12"
+ resolved "https://registry.yarnpkg.com/encoding/-/encoding-0.1.12.tgz#538b66f3ee62cd1ab51ec323829d1f9480c74beb"
+ integrity sha1-U4tm8+5izRq1HsMjgp0flIDHS+s=
+ dependencies:
+ iconv-lite "~0.4.13"
+
+entities@1.0:
+ version "1.0.0"
+ resolved "https://registry.yarnpkg.com/entities/-/entities-1.0.0.tgz#b2987aa3821347fcde642b24fdfc9e4fb712bf26"
+ integrity sha1-sph6o4ITR/zeZCsk/fyeT7cSvyY=
+
+entities@~1.1.1:
+ version "1.1.2"
+ resolved "https://registry.yarnpkg.com/entities/-/entities-1.1.2.tgz#bdfa735299664dfafd34529ed4f8522a275fea56"
+ integrity sha512-f2LZMYl1Fzu7YSBKg+RoROelpOaNrcGmE9AZubeDfrCEia483oW4MI4VyFd5VNHIgQ/7qm1I0wUHK1eJnn2y2w==
+
+envify@^3.0.0:
+ version "3.4.1"
+ resolved "https://registry.yarnpkg.com/envify/-/envify-3.4.1.tgz#d7122329e8df1688ba771b12501917c9ce5cbce8"
+ integrity sha1-1xIjKejfFoi6dxsSUBkXyc5cvOg=
+ dependencies:
+ jstransform "^11.0.3"
+ through "~2.3.4"
+
+error-ex@^1.2.0:
+ version "1.3.2"
+ resolved "https://registry.yarnpkg.com/error-ex/-/error-ex-1.3.2.tgz#b4ac40648107fdcdcfae242f428bea8a14d4f1bf"
+ integrity sha512-7dFHNmqeFSEt2ZBsCriorKnn3Z2pj+fd9kmI6QoWw4//DL+icEBfc0U7qJCisqrTsKTjw4fNFy2pW9OqStD84g==
+ dependencies:
+ is-arrayish "^0.2.1"
+
+escape-string-regexp@^1.0.5:
+ version "1.0.5"
+ resolved "https://registry.yarnpkg.com/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz#1b61c0562190a8dff6ae3bb2cf0200ca130b86d4"
+ integrity sha1-G2HAViGQqN/2rjuyzwIAyhMLhtQ=
+
+esprima-fb@13001.1001.0-dev-harmony-fb:
+ version "13001.1001.0-dev-harmony-fb"
+ resolved "https://registry.yarnpkg.com/esprima-fb/-/esprima-fb-13001.1001.0-dev-harmony-fb.tgz#633acdb40d9bd4db8a1c1d68c06a942959fad2b0"
+ integrity sha1-YzrNtA2b1NuKHB1owGqUKVn60rA=
+
+esprima-fb@^15001.1.0-dev-harmony-fb:
+ version "15001.1.0-dev-harmony-fb"
+ resolved "https://registry.yarnpkg.com/esprima-fb/-/esprima-fb-15001.1.0-dev-harmony-fb.tgz#30a947303c6b8d5e955bee2b99b1d233206a6901"
+ integrity sha1-MKlHMDxrjV6VW+4rmbHSMyBqaQE=
+
+esprima@^2.6.0:
+ version "2.7.3"
+ resolved "https://registry.yarnpkg.com/esprima/-/esprima-2.7.3.tgz#96e3b70d5779f6ad49cd032673d1c312767ba581"
+ integrity sha1-luO3DVd59q1JzQMmc9HDEnZ7pYE=
+
+"esprima@~ 1.0.2":
+ version "1.0.4"
+ resolved "https://registry.yarnpkg.com/esprima/-/esprima-1.0.4.tgz#9f557e08fc3b4d26ece9dd34f8fbf476b62585ad"
+ integrity sha1-n1V+CPw7TSbs6d00+Pv0drYlha0=
+
+esprima@~3.1.0:
+ version "3.1.3"
+ resolved "https://registry.yarnpkg.com/esprima/-/esprima-3.1.3.tgz#fdca51cee6133895e3c88d535ce49dbff62a4633"
+ integrity sha1-/cpRzuYTOJXjyI1TXOSdv/YqRjM=
+
+eventemitter2@~0.4.13:
+ version "0.4.14"
+ resolved "https://registry.yarnpkg.com/eventemitter2/-/eventemitter2-0.4.14.tgz#8f61b75cde012b2e9eb284d4545583b5643b61ab"
+ integrity sha1-j2G3XN4BKy6esoTUVFWDtWQ7Yas=
+
+events@^2.0.0:
+ version "2.1.0"
+ resolved "https://registry.yarnpkg.com/events/-/events-2.1.0.tgz#2a9a1e18e6106e0e812aa9ebd4a819b3c29c0ba5"
+ integrity sha512-3Zmiobend8P9DjmKAty0Era4jV8oJ0yGYe2nJJAxgymF9+N8F2m0hhZiMoWtcfepExzNKZumFU3ksdQbInGWCg==
+
+events@~1.0.0:
+ version "1.0.2"
+ resolved "https://registry.yarnpkg.com/events/-/events-1.0.2.tgz#75849dcfe93d10fb057c30055afdbd51d06a8e24"
+ integrity sha1-dYSdz+k9EPsFfDAFWv29UdBqjiQ=
+
+events@~1.1.0:
+ version "1.1.1"
+ resolved "https://registry.yarnpkg.com/events/-/events-1.1.1.tgz#9ebdb7635ad099c70dcc4c2a1f5004288e8bd924"
+ integrity sha1-nr23Y1rQmccNzEwqH1AEKI6L2SQ=
+
+evp_bytestokey@^1.0.0, evp_bytestokey@^1.0.3:
+ version "1.0.3"
+ resolved "https://registry.yarnpkg.com/evp_bytestokey/-/evp_bytestokey-1.0.3.tgz#7fcbdb198dc71959432efe13842684e0525acb02"
+ integrity sha512-/f2Go4TognH/KvCISP7OUsHn85hT9nUkxxA9BEWxFn+Oj9o8ZNLm/40hdlgSLyuOimsrTKLUMEorQexp/aPQeA==
+ dependencies:
+ md5.js "^1.3.4"
+ safe-buffer "^5.1.1"
+
+exit@0.1.2, exit@0.1.x, exit@~0.1.1:
+ version "0.1.2"
+ resolved "https://registry.yarnpkg.com/exit/-/exit-0.1.2.tgz#0632638f8d877cc82107d30a0fff1a17cba1cd0c"
+ integrity sha1-BjJjj42HfMghB9MKD/8aF8uhzQw=
+
+expand-brackets@^0.1.4:
+ version "0.1.5"
+ resolved "https://registry.yarnpkg.com/expand-brackets/-/expand-brackets-0.1.5.tgz#df07284e342a807cd733ac5af72411e581d1177b"
+ integrity sha1-3wcoTjQqgHzXM6xa9yQR5YHRF3s=
+ dependencies:
+ is-posix-bracket "^0.1.0"
+
+expand-brackets@^2.1.4:
+ version "2.1.4"
+ resolved "https://registry.yarnpkg.com/expand-brackets/-/expand-brackets-2.1.4.tgz#b77735e315ce30f6b6eff0f83b04151a22449622"
+ integrity sha1-t3c14xXOMPa27/D4OwQVGiJEliI=
+ dependencies:
+ debug "^2.3.3"
+ define-property "^0.2.5"
+ extend-shallow "^2.0.1"
+ posix-character-classes "^0.1.0"
+ regex-not "^1.0.0"
+ snapdragon "^0.8.1"
+ to-regex "^3.0.1"
+
+expand-range@^1.8.1:
+ version "1.8.2"
+ resolved "https://registry.yarnpkg.com/expand-range/-/expand-range-1.8.2.tgz#a299effd335fe2721ebae8e257ec79644fc85337"
+ integrity sha1-opnv/TNf4nIeuujiV+x5ZE/IUzc=
+ dependencies:
+ fill-range "^2.1.0"
+
+extend-shallow@^2.0.1:
+ version "2.0.1"
+ resolved "https://registry.yarnpkg.com/extend-shallow/-/extend-shallow-2.0.1.tgz#51af7d614ad9a9f610ea1bafbb989d6b1c56890f"
+ integrity sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=
+ dependencies:
+ is-extendable "^0.1.0"
+
+extend-shallow@^3.0.0, extend-shallow@^3.0.2:
+ version "3.0.2"
+ resolved "https://registry.yarnpkg.com/extend-shallow/-/extend-shallow-3.0.2.tgz#26a71aaf073b39fb2127172746131c2704028db8"
+ integrity sha1-Jqcarwc7OfshJxcnRhMcJwQCjbg=
+ dependencies:
+ assign-symbols "^1.0.0"
+ is-extendable "^1.0.1"
+
+extglob@^0.3.1:
+ version "0.3.2"
+ resolved "https://registry.yarnpkg.com/extglob/-/extglob-0.3.2.tgz#2e18ff3d2f49ab2765cec9023f011daa8d8349a1"
+ integrity sha1-Lhj/PS9JqydlzskCPwEdqo2DSaE=
+ dependencies:
+ is-extglob "^1.0.0"
+
+extglob@^2.0.4:
+ version "2.0.4"
+ resolved "https://registry.yarnpkg.com/extglob/-/extglob-2.0.4.tgz#ad00fe4dc612a9232e8718711dc5cb5ab0285543"
+ integrity sha512-Nmb6QXkELsuBr24CJSkilo6UHHgbekK5UiZgfE6UHD3Eb27YC6oD+bhcT+tJ6cl8dmsgdQxnWlcry8ksBIBLpw==
+ dependencies:
+ array-unique "^0.3.2"
+ define-property "^1.0.0"
+ expand-brackets "^2.1.4"
+ extend-shallow "^2.0.1"
+ fragment-cache "^0.2.1"
+ regex-not "^1.0.0"
+ snapdragon "^0.8.1"
+ to-regex "^3.0.1"
+
+eyes@0.1.x:
+ version "0.1.8"
+ resolved "https://registry.yarnpkg.com/eyes/-/eyes-0.1.8.tgz#62cf120234c683785d902348a800ef3e0cc20bc0"
+ integrity sha1-Ys8SAjTGg3hdkCNIqADvPgzCC8A=
+
+fbemitter@^2.0.0:
+ version "2.1.1"
+ resolved "https://registry.yarnpkg.com/fbemitter/-/fbemitter-2.1.1.tgz#523e14fdaf5248805bb02f62efc33be703f51865"
+ integrity sha1-Uj4U/a9SSIBbsC9i78M75wP1GGU=
+ dependencies:
+ fbjs "^0.8.4"
+
+fbjs@0.1.0-alpha.7:
+ version "0.1.0-alpha.7"
+ resolved "https://registry.yarnpkg.com/fbjs/-/fbjs-0.1.0-alpha.7.tgz#ad4308b8f232fb3c73603349ea725d1e9c39323c"
+ integrity sha1-rUMIuPIy+zxzYDNJ6nJdHpw5Mjw=
+ dependencies:
+ core-js "^1.0.0"
+ promise "^7.0.3"
+ whatwg-fetch "^0.9.0"
+
+fbjs@^0.8.4:
+ version "0.8.17"
+ resolved "https://registry.yarnpkg.com/fbjs/-/fbjs-0.8.17.tgz#c4d598ead6949112653d6588b01a5cdcd9f90fdd"
+ integrity sha1-xNWY6taUkRJlPWWIsBpc3Nn5D90=
+ dependencies:
+ core-js "^1.0.0"
+ isomorphic-fetch "^2.1.1"
+ loose-envify "^1.0.0"
+ object-assign "^4.1.0"
+ promise "^7.1.1"
+ setimmediate "^1.0.5"
+ ua-parser-js "^0.7.18"
+
+filename-regex@^2.0.0:
+ version "2.0.1"
+ resolved "https://registry.yarnpkg.com/filename-regex/-/filename-regex-2.0.1.tgz#c1c4b9bee3e09725ddb106b75c1e301fe2f18b26"
+ integrity sha1-wcS5vuPglyXdsQa3XB4wH+LxiyY=
+
+fileset@~0.1.5:
+ version "0.1.8"
+ resolved "https://registry.yarnpkg.com/fileset/-/fileset-0.1.8.tgz#506b91a9396eaa7e32fb42a84077c7a0c736b741"
+ integrity sha1-UGuRqTluqn4y+0KoQHfHoMc2t0E=
+ dependencies:
+ glob "3.x"
+ minimatch "0.x"
+
+fill-range@^2.1.0:
+ version "2.2.4"
+ resolved "https://registry.yarnpkg.com/fill-range/-/fill-range-2.2.4.tgz#eb1e773abb056dcd8df2bfdf6af59b8b3a936565"
+ integrity sha512-cnrcCbj01+j2gTG921VZPnHbjmdAf8oQV/iGeV2kZxGSyfYjjTyY79ErsK1WJWMpw6DaApEX72binqJE+/d+5Q==
+ dependencies:
+ is-number "^2.1.0"
+ isobject "^2.0.0"
+ randomatic "^3.0.0"
+ repeat-element "^1.1.2"
+ repeat-string "^1.5.2"
+
+fill-range@^4.0.0:
+ version "4.0.0"
+ resolved "https://registry.yarnpkg.com/fill-range/-/fill-range-4.0.0.tgz#d544811d428f98eb06a63dc402d2403c328c38f7"
+ integrity sha1-1USBHUKPmOsGpj3EAtJAPDKMOPc=
+ dependencies:
+ extend-shallow "^2.0.1"
+ is-number "^3.0.0"
+ repeat-string "^1.6.1"
+ to-regex-range "^2.1.0"
+
+find-up@^1.0.0:
+ version "1.1.2"
+ resolved "https://registry.yarnpkg.com/find-up/-/find-up-1.1.2.tgz#6b2e9822b1a2ce0a60ab64d610eccad53cb24d0f"
+ integrity sha1-ay6YIrGizgpgq2TWEOzK1TyyTQ8=
+ dependencies:
+ path-exists "^2.0.0"
+ pinkie-promise "^2.0.0"
+
+findup-sync@~0.1.2:
+ version "0.1.3"
+ resolved "https://registry.yarnpkg.com/findup-sync/-/findup-sync-0.1.3.tgz#7f3e7a97b82392c653bf06589bd85190e93c3683"
+ integrity sha1-fz56l7gjksZTvwZYm9hRkOk8NoM=
+ dependencies:
+ glob "~3.2.9"
+ lodash "~2.4.1"
+
+findup-sync@~0.3.0:
+ version "0.3.0"
+ resolved "https://registry.yarnpkg.com/findup-sync/-/findup-sync-0.3.0.tgz#37930aa5d816b777c03445e1966cc6790a4c0b16"
+ integrity sha1-N5MKpdgWt3fANEXhlmzGeQpMCxY=
+ dependencies:
+ glob "~5.0.0"
+
+flux@^2.0.1:
+ version "2.1.1"
+ resolved "https://registry.yarnpkg.com/flux/-/flux-2.1.1.tgz#2c6ac652d4337488968489c6586f3aff26a38ea4"
+ integrity sha1-LGrGUtQzdIiWhInGWG86/yajjqQ=
+ dependencies:
+ fbemitter "^2.0.0"
+ fbjs "0.1.0-alpha.7"
+ immutable "^3.7.4"
+
+for-in@^1.0.1, for-in@^1.0.2:
+ version "1.0.2"
+ resolved "https://registry.yarnpkg.com/for-in/-/for-in-1.0.2.tgz#81068d295a8142ec0ac726c6e2200c30fb6d5e80"
+ integrity sha1-gQaNKVqBQuwKxybG4iAMMPttXoA=
+
+for-own@^0.1.4:
+ version "0.1.5"
+ resolved "https://registry.yarnpkg.com/for-own/-/for-own-0.1.5.tgz#5265c681a4f294dabbf17c9509b6763aa84510ce"
+ integrity sha1-UmXGgaTylNq78XyVCbZ2OqhFEM4=
+ dependencies:
+ for-in "^1.0.1"
+
+foreach@^2.0.5:
+ version "2.0.5"
+ resolved "https://registry.yarnpkg.com/foreach/-/foreach-2.0.5.tgz#0bee005018aeb260d0a3af3ae658dd0136ec1b99"
+ integrity sha1-C+4AUBiusmDQo6865ljdATbsG5k=
+
+fragment-cache@^0.2.1:
+ version "0.2.1"
+ resolved "https://registry.yarnpkg.com/fragment-cache/-/fragment-cache-0.2.1.tgz#4290fad27f13e89be7f33799c6bc5a0abfff0d19"
+ integrity sha1-QpD60n8T6Jvn8zeZxrxaCr//DRk=
+ dependencies:
+ map-cache "^0.2.2"
+
+fs-minipass@^1.2.5:
+ version "1.2.5"
+ resolved "https://registry.yarnpkg.com/fs-minipass/-/fs-minipass-1.2.5.tgz#06c277218454ec288df77ada54a03b8702aacb9d"
+ integrity sha512-JhBl0skXjUPCFH7x6x61gQxrKyXsxB5gcgePLZCwfyCGGsTISMoIeObbrvVeP6Xmyaudw4TT43qV2Gz+iyd2oQ==
+ dependencies:
+ minipass "^2.2.1"
+
+fs.realpath@^1.0.0:
+ version "1.0.0"
+ resolved "https://registry.yarnpkg.com/fs.realpath/-/fs.realpath-1.0.0.tgz#1504ad2523158caa40db4a2787cb01411994ea4f"
+ integrity sha1-FQStJSMVjKpA20onh8sBQRmU6k8=
+
+fsevents@^1.0.0:
+ version "1.2.4"
+ resolved "https://registry.yarnpkg.com/fsevents/-/fsevents-1.2.4.tgz#f41dcb1af2582af3692da36fc55cbd8e1041c426"
+ integrity sha512-z8H8/diyk76B7q5wg+Ud0+CqzcAF3mBBI/bA5ne5zrRUUIvNkJY//D3BqyH571KuAC4Nr7Rw7CjWX4r0y9DvNg==
+ dependencies:
+ nan "^2.9.2"
+ node-pre-gyp "^0.10.0"
+
+function-bind@^1.1.1:
+ version "1.1.1"
+ resolved "https://registry.yarnpkg.com/function-bind/-/function-bind-1.1.1.tgz#a56899d3ea3c9bab874bb9773b7c5ede92f4895d"
+ integrity sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A==
+
+gauge@~2.7.3:
+ version "2.7.4"
+ resolved "https://registry.yarnpkg.com/gauge/-/gauge-2.7.4.tgz#2c03405c7538c39d7eb37b317022e325fb018bf7"
+ integrity sha1-LANAXHU4w51+s3sxcCLjJfsBi/c=
+ dependencies:
+ aproba "^1.0.3"
+ console-control-strings "^1.0.0"
+ has-unicode "^2.0.0"
+ object-assign "^4.1.0"
+ signal-exit "^3.0.0"
+ string-width "^1.0.1"
+ strip-ansi "^3.0.1"
+ wide-align "^1.1.0"
+
+gaze@~0.3.2:
+ version "0.3.4"
+ resolved "https://registry.yarnpkg.com/gaze/-/gaze-0.3.4.tgz#5f94bdda0afe53bc710969bcd6f282548d60c279"
+ integrity sha1-X5S92gr+U7xxCWm81vKCVI1gwnk=
+ dependencies:
+ fileset "~0.1.5"
+ minimatch "~0.2.9"
+
+gaze@~1.1.2:
+ version "1.1.3"
+ resolved "https://registry.yarnpkg.com/gaze/-/gaze-1.1.3.tgz#c441733e13b927ac8c0ff0b4c3b033f28812924a"
+ integrity sha512-BRdNm8hbWzFzWHERTrejLqwHDfS4GibPoq5wjTPIoJHoBtKGPg3xAFfxmM+9ztbXelxcf2hwQcaz1PtmFeue8g==
+ dependencies:
+ globule "^1.0.0"
+
+get-assigned-identifiers@^1.2.0:
+ version "1.2.0"
+ resolved "https://registry.yarnpkg.com/get-assigned-identifiers/-/get-assigned-identifiers-1.2.0.tgz#6dbf411de648cbaf8d9169ebb0d2d576191e2ff1"
+ integrity sha512-mBBwmeGTrxEMO4pMaaf/uUEFHnYtwr8FTe8Y/mer4rcV/bye0qGm6pw1bGZFGStxC5O76c5ZAVBGnqHmOaJpdQ==
+
+get-stdin@^4.0.1:
+ version "4.0.1"
+ resolved "https://registry.yarnpkg.com/get-stdin/-/get-stdin-4.0.1.tgz#b968c6b0a04384324902e8bf1a5df32579a450fe"
+ integrity sha1-uWjGsKBDhDJJAui/Gl3zJXmkUP4=
+
+get-value@^2.0.3, get-value@^2.0.6:
+ version "2.0.6"
+ resolved "https://registry.yarnpkg.com/get-value/-/get-value-2.0.6.tgz#dc15ca1c672387ca76bd37ac0a395ba2042a2c28"
+ integrity sha1-3BXKHGcjh8p2vTesCjlbogQqLCg=
+
+getobject@~0.1.0:
+ version "0.1.0"
+ resolved "https://registry.yarnpkg.com/getobject/-/getobject-0.1.0.tgz#047a449789fa160d018f5486ed91320b6ec7885c"
+ integrity sha1-BHpEl4n6Fg0Bj1SG7ZEyC27HiFw=
+
+glob-base@^0.3.0:
+ version "0.3.0"
+ resolved "https://registry.yarnpkg.com/glob-base/-/glob-base-0.3.0.tgz#dbb164f6221b1c0b1ccf82aea328b497df0ea3c4"
+ integrity sha1-27Fk9iIbHAscz4Kuoyi0l98Oo8Q=
+ dependencies:
+ glob-parent "^2.0.0"
+ is-glob "^2.0.0"
+
+glob-parent@^2.0.0:
+ version "2.0.0"
+ resolved "https://registry.yarnpkg.com/glob-parent/-/glob-parent-2.0.0.tgz#81383d72db054fcccf5336daa902f182f6edbb28"
+ integrity sha1-gTg9ctsFT8zPUzbaqQLxgvbtuyg=
+ dependencies:
+ is-glob "^2.0.0"
+
+glob@3.x, "glob@~ 3.2.1", glob@~3.2.9:
+ version "3.2.11"
+ resolved "https://registry.yarnpkg.com/glob/-/glob-3.2.11.tgz#4a973f635b9190f715d10987d5c00fd2815ebe3d"
+ integrity sha1-Spc/Y1uRkPcV0QmH1cAP0oFevj0=
+ dependencies:
+ inherits "2"
+ minimatch "0.3"
+
+"glob@>= 3.1.4", glob@^7.0.5, glob@^7.1.0, glob@~7.1.1:
+ version "7.1.3"
+ resolved "https://registry.yarnpkg.com/glob/-/glob-7.1.3.tgz#3960832d3f1574108342dafd3a67b332c0969df1"
+ integrity sha512-vcfuiIxogLV4DlGBHIUOwI0IbrJ8HWPc4MU7HzviGeNho/UJDfi6B5p3sHeWIQ0KGIU0Jpxi5ZHxemQfLkkAwQ==
+ dependencies:
+ fs.realpath "^1.0.0"
+ inflight "^1.0.4"
+ inherits "2"
+ minimatch "^3.0.4"
+ once "^1.3.0"
+ path-is-absolute "^1.0.0"
+
+glob@^4.0.5:
+ version "4.5.3"
+ resolved "https://registry.yarnpkg.com/glob/-/glob-4.5.3.tgz#c6cb73d3226c1efef04de3c56d012f03377ee15f"
+ integrity sha1-xstz0yJsHv7wTePFbQEvAzd+4V8=
+ dependencies:
+ inflight "^1.0.4"
+ inherits "2"
+ minimatch "^2.0.1"
+ once "^1.3.0"
+
+glob@^5.0.15, glob@^5.0.5, glob@~5.0.0:
+ version "5.0.15"
+ resolved "https://registry.yarnpkg.com/glob/-/glob-5.0.15.tgz#1bc936b9e02f4a603fcc222ecf7633d30b8b93b1"
+ integrity sha1-G8k2ueAvSmA/zCIuz3Yz0wuLk7E=
+ dependencies:
+ inflight "^1.0.4"
+ inherits "2"
+ minimatch "2 || 3"
+ once "^1.3.0"
+ path-is-absolute "^1.0.0"
+
+glob@~3.1.21:
+ version "3.1.21"
+ resolved "https://registry.yarnpkg.com/glob/-/glob-3.1.21.tgz#d29e0a055dea5138f4d07ed40e8982e83c2066cd"
+ integrity sha1-0p4KBV3qUTj00H7UDomC6DwgZs0=
+ dependencies:
+ graceful-fs "~1.2.0"
+ inherits "1"
+ minimatch "~0.2.11"
+
+glob@~7.0.0:
+ version "7.0.6"
+ resolved "https://registry.yarnpkg.com/glob/-/glob-7.0.6.tgz#211bafaf49e525b8cd93260d14ab136152b3f57a"
+ integrity sha1-IRuvr0nlJbjNkyYNFKsTYVKz9Xo=
+ dependencies:
+ fs.realpath "^1.0.0"
+ inflight "^1.0.4"
+ inherits "2"
+ minimatch "^3.0.2"
+ once "^1.3.0"
+ path-is-absolute "^1.0.0"
+
+globule@^1.0.0:
+ version "1.2.1"
+ resolved "https://registry.yarnpkg.com/globule/-/globule-1.2.1.tgz#5dffb1b191f22d20797a9369b49eab4e9839696d"
+ integrity sha512-g7QtgWF4uYSL5/dn71WxubOrS7JVGCnFPEnoeChJmBnyR9Mw8nGoEwOgJL/RC2Te0WhbsEUCejfH8SZNJ+adYQ==
+ dependencies:
+ glob "~7.1.1"
+ lodash "~4.17.10"
+ minimatch "~3.0.2"
+
+graceful-fs@^4.1.11, graceful-fs@^4.1.2:
+ version "4.1.15"
+ resolved "https://registry.yarnpkg.com/graceful-fs/-/graceful-fs-4.1.15.tgz#ffb703e1066e8a0eeaa4c8b80ba9253eeefbfb00"
+ integrity sha512-6uHUhOPEBgQ24HM+r6b/QwWfZq+yiFcipKFrOFiBEnWdy5sdzYoi+pJeQaPI5qOLRFqWmAXUPQNsielzdLoecA==
+
+graceful-fs@~1.2.0:
+ version "1.2.3"
+ resolved "https://registry.yarnpkg.com/graceful-fs/-/graceful-fs-1.2.3.tgz#15a4806a57547cb2d2dbf27f42e89a8c3451b364"
+ integrity sha1-FaSAaldUfLLS2/J/QuiajDRRs2Q=
+
+growl@~1.7.0:
+ version "1.7.0"
+ resolved "https://registry.yarnpkg.com/growl/-/growl-1.7.0.tgz#de2d66136d002e112ba70f3f10c31cf7c350b2da"
+ integrity sha1-3i1mE20ALhErpw8/EMMc98NQsto=
+
+grunt-browserify@^4.0.1:
+ version "4.0.1"
+ resolved "https://registry.yarnpkg.com/grunt-browserify/-/grunt-browserify-4.0.1.tgz#f5ced9026958a800f2e8898e1a4df1e525ff69ff"
+ integrity sha1-9c7ZAmlYqADy6ImOGk3x5SX/af8=
+ dependencies:
+ async "^0.9.0"
+ browserify "^11.0.1"
+ glob "^5.0.5"
+ lodash "^3.8.0"
+ resolve "^1.1.6"
+ watchify "^3.3.1"
+
+grunt-cli@~1.2.0:
+ version "1.2.0"
+ resolved "https://registry.yarnpkg.com/grunt-cli/-/grunt-cli-1.2.0.tgz#562b119ebb069ddb464ace2845501be97b35b6a8"
+ integrity sha1-VisRnrsGndtGSs4oRVAb6Xs1tqg=
+ dependencies:
+ findup-sync "~0.3.0"
+ grunt-known-options "~1.1.0"
+ nopt "~3.0.6"
+ resolve "~1.1.0"
+
+grunt-contrib-clean@~0.5.0:
+ version "0.5.0"
+ resolved "https://registry.yarnpkg.com/grunt-contrib-clean/-/grunt-contrib-clean-0.5.0.tgz#f53dfdee0849b1c7b40e9ebbba69f48c4c6079c5"
+ integrity sha1-9T397ghJsce0Dp67umn0jExgecU=
+ dependencies:
+ rimraf "~2.2.1"
+
+grunt-contrib-jshint@0.11.0:
+ version "0.11.0"
+ resolved "https://registry.yarnpkg.com/grunt-contrib-jshint/-/grunt-contrib-jshint-0.11.0.tgz#2ba17953d30471c3ba58792a5aa92e447059de45"
+ integrity sha1-K6F5U9MEccO6WHkqWqkuRHBZ3kU=
+ dependencies:
+ hooker "~0.2.3"
+ jshint "~2.6.0"
+
+grunt-contrib-jshint@~0.7.2:
+ version "0.7.2"
+ resolved "https://registry.yarnpkg.com/grunt-contrib-jshint/-/grunt-contrib-jshint-0.7.2.tgz#29859ddcf42e7f6c54c43fe75da3c4bd90384a8e"
+ integrity sha1-KYWd3PQuf2xUxD/nXaPEvZA4So4=
+ dependencies:
+ jshint "~2.3.0"
+
+grunt-contrib-uglify@~0.2.7:
+ version "0.2.7"
+ resolved "https://registry.yarnpkg.com/grunt-contrib-uglify/-/grunt-contrib-uglify-0.2.7.tgz#e6bda51e0c40a1459f6cead423c65efd725a1bf7"
+ integrity sha1-5r2lHgxAoUWfbOrUI8Ze/XJaG/c=
+ dependencies:
+ grunt-lib-contrib "~0.6.1"
+ uglify-js "~2.4.0"
+
+grunt-env@^0.4.4:
+ version "0.4.4"
+ resolved "https://registry.yarnpkg.com/grunt-env/-/grunt-env-0.4.4.tgz#3b38843a8d737177ddc9f893879fb69ce1a0bc2f"
+ integrity sha1-OziEOo1zcXfdyfiTh5+2nOGgvC8=
+ dependencies:
+ ini "~1.3.0"
+ lodash "~2.4.1"
+
+grunt-hash@~0.5.0:
+ version "0.5.0"
+ resolved "https://registry.yarnpkg.com/grunt-hash/-/grunt-hash-0.5.0.tgz#98781d799f74b29538692f58c61d50648c1bd29e"
+ integrity sha1-mHgdeZ90spU4aS9Yxh1QZIwb0p4=
+
+grunt-jasmine-node@~0.1.0:
+ version "0.1.0"
+ resolved "https://registry.yarnpkg.com/grunt-jasmine-node/-/grunt-jasmine-node-0.1.0.tgz#063b80c5d73ae4e9640d4ad47263f94d98092eaa"
+ integrity sha1-BjuAxdc65OlkDUrUcmP5TZgJLqo=
+ dependencies:
+ jasmine-node ">=1.4.0"
+
+grunt-jsxhint@^0.5.0:
+ version "0.5.0"
+ resolved "https://registry.yarnpkg.com/grunt-jsxhint/-/grunt-jsxhint-0.5.0.tgz#f2c701b0cafc7b34d37d1f46f1e374e8114926b6"
+ integrity sha1-8scBsMr8ezTTfR9G8eN06BFJJrY=
+ dependencies:
+ grunt-contrib-jshint "0.11.0"
+ jshint "~2.6.0"
+ proxyquire "~1.3.1"
+ rewire "~2.1.5"
+
+grunt-known-options@~1.1.0:
+ version "1.1.1"
+ resolved "https://registry.yarnpkg.com/grunt-known-options/-/grunt-known-options-1.1.1.tgz#6cc088107bd0219dc5d3e57d91923f469059804d"
+ integrity sha512-cHwsLqoighpu7TuYj5RonnEuxGVFnztcUqTqp5rXFGYL4OuPFofwC4Ycg7n9fYwvK6F5WbYgeVOwph9Crs2fsQ==
+
+grunt-legacy-log-utils@~0.1.1:
+ version "0.1.1"
+ resolved "https://registry.yarnpkg.com/grunt-legacy-log-utils/-/grunt-legacy-log-utils-0.1.1.tgz#c0706b9dd9064e116f36f23fe4e6b048672c0f7e"
+ integrity sha1-wHBrndkGThFvNvI/5OawSGcsD34=
+ dependencies:
+ colors "~0.6.2"
+ lodash "~2.4.1"
+ underscore.string "~2.3.3"
+
+grunt-legacy-log-utils@~2.0.0:
+ version "2.0.1"
+ resolved "https://registry.yarnpkg.com/grunt-legacy-log-utils/-/grunt-legacy-log-utils-2.0.1.tgz#d2f442c7c0150065d9004b08fd7410d37519194e"
+ integrity sha512-o7uHyO/J+i2tXG8r2bZNlVk20vlIFJ9IEYyHMCQGfWYru8Jv3wTqKZzvV30YW9rWEjq0eP3cflQ1qWojIe9VFA==
+ dependencies:
+ chalk "~2.4.1"
+ lodash "~4.17.10"
+
+grunt-legacy-log@~0.1.0:
+ version "0.1.3"
+ resolved "https://registry.yarnpkg.com/grunt-legacy-log/-/grunt-legacy-log-0.1.3.tgz#ec29426e803021af59029f87d2f9cd7335a05531"
+ integrity sha1-7ClCboAwIa9ZAp+H0vnNczWgVTE=
+ dependencies:
+ colors "~0.6.2"
+ grunt-legacy-log-utils "~0.1.1"
+ hooker "~0.2.3"
+ lodash "~2.4.1"
+ underscore.string "~2.3.3"
+
+grunt-legacy-log@~2.0.0:
+ version "2.0.0"
+ resolved "https://registry.yarnpkg.com/grunt-legacy-log/-/grunt-legacy-log-2.0.0.tgz#c8cd2c6c81a4465b9bbf2d874d963fef7a59ffb9"
+ integrity sha512-1m3+5QvDYfR1ltr8hjiaiNjddxGdQWcH0rw1iKKiQnF0+xtgTazirSTGu68RchPyh1OBng1bBUjLmX8q9NpoCw==
+ dependencies:
+ colors "~1.1.2"
+ grunt-legacy-log-utils "~2.0.0"
+ hooker "~0.2.3"
+ lodash "~4.17.5"
+
+grunt-legacy-util@~0.2.0:
+ version "0.2.0"
+ resolved "https://registry.yarnpkg.com/grunt-legacy-util/-/grunt-legacy-util-0.2.0.tgz#93324884dbf7e37a9ff7c026dff451d94a9e554b"
+ integrity sha1-kzJIhNv343qf98Am3/RR2UqeVUs=
+ dependencies:
+ async "~0.1.22"
+ exit "~0.1.1"
+ getobject "~0.1.0"
+ hooker "~0.2.3"
+ lodash "~0.9.2"
+ underscore.string "~2.2.1"
+ which "~1.0.5"
+
+grunt-legacy-util@~1.1.1:
+ version "1.1.1"
+ resolved "https://registry.yarnpkg.com/grunt-legacy-util/-/grunt-legacy-util-1.1.1.tgz#e10624e7c86034e5b870c8a8616743f0a0845e42"
+ integrity sha512-9zyA29w/fBe6BIfjGENndwoe1Uy31BIXxTH3s8mga0Z5Bz2Sp4UCjkeyv2tI449ymkx3x26B+46FV4fXEddl5A==
+ dependencies:
+ async "~1.5.2"
+ exit "~0.1.1"
+ getobject "~0.1.0"
+ hooker "~0.2.3"
+ lodash "~4.17.10"
+ underscore.string "~3.3.4"
+ which "~1.3.0"
+
+grunt-lib-contrib@~0.6.1:
+ version "0.6.1"
+ resolved "https://registry.yarnpkg.com/grunt-lib-contrib/-/grunt-lib-contrib-0.6.1.tgz#3f56adb7da06e814795ee2415b0ebe5fb8903ebb"
+ integrity sha1-P1att9oG6BR5XuJBWw6+X7iQPrs=
+ dependencies:
+ zlib-browserify "0.0.1"
+
+grunt-react@^0.12.1:
+ version "0.12.3"
+ resolved "https://registry.yarnpkg.com/grunt-react/-/grunt-react-0.12.3.tgz#4c53590127e4a5235c04d1227f3910903af48c16"
+ integrity sha1-TFNZASfkpSNcBNEifzkQkDr0jBY=
+ dependencies:
+ react-tools "^0.13.0"
+ through "~2.3.6"
+
+grunt-shell-spawn@~0.3.0:
+ version "0.3.10"
+ resolved "https://registry.yarnpkg.com/grunt-shell-spawn/-/grunt-shell-spawn-0.3.10.tgz#81bb8d457ec47d3182a87d6308ef845ddfb9488f"
+ integrity sha1-gbuNRX7EfTGCqH1jCO+EXd+5SI8=
+ dependencies:
+ grunt ">=0.4.x"
+ sync-exec "~0.6.2"
+
+grunt@>=0.4.x:
+ version "1.0.3"
+ resolved "https://registry.yarnpkg.com/grunt/-/grunt-1.0.3.tgz#b3c99260c51d1b42835766e796527b60f7bba374"
+ integrity sha512-/JzmZNPfKorlCrrmxWqQO4JVodO+DVd5XX4DkocL/1WlLlKVLE9+SdEIempOAxDhWPysLle6afvn/hg7Ck2k9g==
+ dependencies:
+ coffeescript "~1.10.0"
+ dateformat "~1.0.12"
+ eventemitter2 "~0.4.13"
+ exit "~0.1.1"
+ findup-sync "~0.3.0"
+ glob "~7.0.0"
+ grunt-cli "~1.2.0"
+ grunt-known-options "~1.1.0"
+ grunt-legacy-log "~2.0.0"
+ grunt-legacy-util "~1.1.1"
+ iconv-lite "~0.4.13"
+ js-yaml "~3.5.2"
+ minimatch "~3.0.2"
+ mkdirp "~0.5.1"
+ nopt "~3.0.6"
+ path-is-absolute "~1.0.0"
+ rimraf "~2.6.2"
+
+grunt@~0.4.2:
+ version "0.4.5"
+ resolved "https://registry.yarnpkg.com/grunt/-/grunt-0.4.5.tgz#56937cd5194324adff6d207631832a9d6ba4e7f0"
+ integrity sha1-VpN81RlDJK3/bSB2MYMqnWuk5/A=
+ dependencies:
+ async "~0.1.22"
+ coffee-script "~1.3.3"
+ colors "~0.6.2"
+ dateformat "1.0.2-1.2.3"
+ eventemitter2 "~0.4.13"
+ exit "~0.1.1"
+ findup-sync "~0.1.2"
+ getobject "~0.1.0"
+ glob "~3.1.21"
+ grunt-legacy-log "~0.1.0"
+ grunt-legacy-util "~0.2.0"
+ hooker "~0.2.3"
+ iconv-lite "~0.2.11"
+ js-yaml "~2.0.5"
+ lodash "~0.9.2"
+ minimatch "~0.2.12"
+ nopt "~1.0.10"
+ rimraf "~2.2.8"
+ underscore.string "~2.2.1"
+ which "~1.0.5"
+
+has-flag@^3.0.0:
+ version "3.0.0"
+ resolved "https://registry.yarnpkg.com/has-flag/-/has-flag-3.0.0.tgz#b5d454dc2199ae225699f3467e5a07f3b955bafd"
+ integrity sha1-tdRU3CGZriJWmfNGfloH87lVuv0=
+
+has-unicode@^2.0.0:
+ version "2.0.1"
+ resolved "https://registry.yarnpkg.com/has-unicode/-/has-unicode-2.0.1.tgz#e0e6fe6a28cf51138855e086d1691e771de2a8b9"
+ integrity sha1-4Ob+aijPUROIVeCG0Wkedx3iqLk=
+
+has-value@^0.3.1:
+ version "0.3.1"
+ resolved "https://registry.yarnpkg.com/has-value/-/has-value-0.3.1.tgz#7b1f58bada62ca827ec0a2078025654845995e1f"
+ integrity sha1-ex9YutpiyoJ+wKIHgCVlSEWZXh8=
+ dependencies:
+ get-value "^2.0.3"
+ has-values "^0.1.4"
+ isobject "^2.0.0"
+
+has-value@^1.0.0:
+ version "1.0.0"
+ resolved "https://registry.yarnpkg.com/has-value/-/has-value-1.0.0.tgz#18b281da585b1c5c51def24c930ed29a0be6b177"
+ integrity sha1-GLKB2lhbHFxR3vJMkw7SmgvmsXc=
+ dependencies:
+ get-value "^2.0.6"
+ has-values "^1.0.0"
+ isobject "^3.0.0"
+
+has-values@^0.1.4:
+ version "0.1.4"
+ resolved "https://registry.yarnpkg.com/has-values/-/has-values-0.1.4.tgz#6d61de95d91dfca9b9a02089ad384bff8f62b771"
+ integrity sha1-bWHeldkd/Km5oCCJrThL/49it3E=
+
+has-values@^1.0.0:
+ version "1.0.0"
+ resolved "https://registry.yarnpkg.com/has-values/-/has-values-1.0.0.tgz#95b0b63fec2146619a6fe57fe75628d5a39efe4f"
+ integrity sha1-lbC2P+whRmGab+V/51Yo1aOe/k8=
+ dependencies:
+ is-number "^3.0.0"
+ kind-of "^4.0.0"
+
+has@^1.0.0:
+ version "1.0.3"
+ resolved "https://registry.yarnpkg.com/has/-/has-1.0.3.tgz#722d7cbfc1f6aa8241f16dd814e011e1f41e8796"
+ integrity sha512-f2dvO0VU6Oej7RkWJGrehjbzMAjFp5/VKPp5tTpWIV4JHHZK1/BxbFRtf/siA2SWTe09caDmVtYYzWEIbBS4zw==
+ dependencies:
+ function-bind "^1.1.1"
+
+hash-base@^3.0.0:
+ version "3.0.4"
+ resolved "https://registry.yarnpkg.com/hash-base/-/hash-base-3.0.4.tgz#5fc8686847ecd73499403319a6b0a3f3f6ae4918"
+ integrity sha1-X8hoaEfs1zSZQDMZprCj8/auSRg=
+ dependencies:
+ inherits "^2.0.1"
+ safe-buffer "^5.0.1"
+
+hash.js@^1.0.0, hash.js@^1.0.3:
+ version "1.1.7"
+ resolved "https://registry.yarnpkg.com/hash.js/-/hash.js-1.1.7.tgz#0babca538e8d4ee4a0f8988d68866537a003cf42"
+ integrity sha512-taOaskGt4z4SOANNseOviYDvjEJinIkRgmp7LbKP2YTTmVxWBl87s/uzK9r+44BclBSp2X7K1hqeNfz9JbBeXA==
+ dependencies:
+ inherits "^2.0.3"
+ minimalistic-assert "^1.0.1"
+
+hmac-drbg@^1.0.0:
+ version "1.0.1"
+ resolved "https://registry.yarnpkg.com/hmac-drbg/-/hmac-drbg-1.0.1.tgz#d2745701025a6c775a6c545793ed502fc0c649a1"
+ integrity sha1-0nRXAQJabHdabFRXk+1QL8DGSaE=
+ dependencies:
+ hash.js "^1.0.3"
+ minimalistic-assert "^1.0.0"
+ minimalistic-crypto-utils "^1.0.1"
+
+hooker@~0.2.3:
+ version "0.2.3"
+ resolved "https://registry.yarnpkg.com/hooker/-/hooker-0.2.3.tgz#b834f723cc4a242aa65963459df6d984c5d3d959"
+ integrity sha1-uDT3I8xKJCqmWWNFnfbZhMXT2Vk=
+
+hosted-git-info@^2.1.4:
+ version "2.7.1"
+ resolved "https://registry.yarnpkg.com/hosted-git-info/-/hosted-git-info-2.7.1.tgz#97f236977bd6e125408930ff6de3eec6281ec047"
+ integrity sha512-7T/BxH19zbcCTa8XkMlbK5lTo1WtgkFi3GvdWEyNuc4Vex7/9Dqbnpsf4JMydcfj9HCg4zUWFTL3Za6lapg5/w==
+
+htmlescape@^1.1.0:
+ version "1.1.1"
+ resolved "https://registry.yarnpkg.com/htmlescape/-/htmlescape-1.1.1.tgz#3a03edc2214bca3b66424a3e7959349509cb0351"
+ integrity sha1-OgPtwiFLyjtmQko+eVk0lQnLA1E=
+
+htmlparser2@3.8.x:
+ version "3.8.3"
+ resolved "https://registry.yarnpkg.com/htmlparser2/-/htmlparser2-3.8.3.tgz#996c28b191516a8be86501a7d79757e5c70c1068"
+ integrity sha1-mWwosZFRaovoZQGn15dX5ccMEGg=
+ dependencies:
+ domelementtype "1"
+ domhandler "2.3"
+ domutils "1.5"
+ entities "1.0"
+ readable-stream "1.1"
+
+https-browserify@^1.0.0:
+ version "1.0.0"
+ resolved "https://registry.yarnpkg.com/https-browserify/-/https-browserify-1.0.0.tgz#ec06c10e0a34c0f2faf199f7fd7fc78fffd03c73"
+ integrity sha1-7AbBDgo0wPL68Zn3/X/Hj//QPHM=
+
+https-browserify@~0.0.0:
+ version "0.0.1"
+ resolved "https://registry.yarnpkg.com/https-browserify/-/https-browserify-0.0.1.tgz#3f91365cabe60b77ed0ebba24b454e3e09d95a82"
+ integrity sha1-P5E2XKvmC3ftDruiS0VOPgnZWoI=
+
+i@0.3.x:
+ version "0.3.6"
+ resolved "https://registry.yarnpkg.com/i/-/i-0.3.6.tgz#d96c92732076f072711b6b10fd7d4f65ad8ee23d"
+ integrity sha1-2WyScyB28HJxG2sQ/X1PZa2O4j0=
+
+iconv-lite@^0.4.4, iconv-lite@^0.4.5, iconv-lite@~0.4.13:
+ version "0.4.24"
+ resolved "https://registry.yarnpkg.com/iconv-lite/-/iconv-lite-0.4.24.tgz#2022b4b25fbddc21d2f524974a474aafe733908b"
+ integrity sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA==
+ dependencies:
+ safer-buffer ">= 2.1.2 < 3"
+
+iconv-lite@~0.2.11:
+ version "0.2.11"
+ resolved "https://registry.yarnpkg.com/iconv-lite/-/iconv-lite-0.2.11.tgz#1ce60a3a57864a292d1321ff4609ca4bb965adc8"
+ integrity sha1-HOYKOleGSiktEyH/RgnKS7llrcg=
+
+ieee754@^1.1.4:
+ version "1.1.12"
+ resolved "https://registry.yarnpkg.com/ieee754/-/ieee754-1.1.12.tgz#50bf24e5b9c8bb98af4964c941cdb0918da7b60b"
+ integrity sha512-GguP+DRY+pJ3soyIiGPTvdiVXjZ+DbXOxGpXn3eMvNW4x4irjqXm4wHKscC+TfxSJ0yw/S1F24tqdMNsMZTiLA==
+
+ignore-walk@^3.0.1:
+ version "3.0.1"
+ resolved "https://registry.yarnpkg.com/ignore-walk/-/ignore-walk-3.0.1.tgz#a83e62e7d272ac0e3b551aaa82831a19b69f82f8"
+ integrity sha512-DTVlMx3IYPe0/JJcYP7Gxg7ttZZu3IInhuEhbchuqneY9wWe5Ojy2mXLBaQFUQmo0AW2r3qG7m1mg86js+gnlQ==
+ dependencies:
+ minimatch "^3.0.4"
+
+immutable@^3.7.4:
+ version "3.8.2"
+ resolved "https://registry.yarnpkg.com/immutable/-/immutable-3.8.2.tgz#c2439951455bb39913daf281376f1530e104adf3"
+ integrity sha1-wkOZUUVbs5kT2vKBN28VMOEErfM=
+
+indent-string@^2.1.0:
+ version "2.1.0"
+ resolved "https://registry.yarnpkg.com/indent-string/-/indent-string-2.1.0.tgz#8e2d48348742121b4a8218b7a137e9a52049dc80"
+ integrity sha1-ji1INIdCEhtKghi3oTfppSBJ3IA=
+ dependencies:
+ repeating "^2.0.0"
+
+indexof@0.0.1:
+ version "0.0.1"
+ resolved "https://registry.yarnpkg.com/indexof/-/indexof-0.0.1.tgz#82dc336d232b9062179d05ab3293a66059fd435d"
+ integrity sha1-gtwzbSMrkGIXnQWrMpOmYFn9Q10=
+
+inflight@^1.0.4:
+ version "1.0.6"
+ resolved "https://registry.yarnpkg.com/inflight/-/inflight-1.0.6.tgz#49bd6331d7d02d0c09bc910a1075ba8165b56df9"
+ integrity sha1-Sb1jMdfQLQwJvJEKEHW6gWW1bfk=
+ dependencies:
+ once "^1.3.0"
+ wrappy "1"
+
+inherits@1:
+ version "1.0.2"
+ resolved "https://registry.yarnpkg.com/inherits/-/inherits-1.0.2.tgz#ca4309dadee6b54cc0b8d247e8d7c7a0975bdc9b"
+ integrity sha1-ykMJ2t7mtUzAuNJH6NfHoJdb3Js=
+
+inherits@2, inherits@2.0.3, inherits@^2.0.1, inherits@^2.0.3, inherits@~2.0.1, inherits@~2.0.3:
+ version "2.0.3"
+ resolved "https://registry.yarnpkg.com/inherits/-/inherits-2.0.3.tgz#633c2c83e3da42a502f52466022480f4208261de"
+ integrity sha1-Yzwsg+PaQqUC9SRmAiSA9CCCYd4=
+
+inherits@2.0.1:
+ version "2.0.1"
+ resolved "https://registry.yarnpkg.com/inherits/-/inherits-2.0.1.tgz#b17d08d326b4423e568eff719f91b0b1cbdf69f1"
+ integrity sha1-sX0I0ya0Qj5Wjv9xn5GwscvfafE=
+
+ini@~1.3.0:
+ version "1.3.5"
+ resolved "https://registry.yarnpkg.com/ini/-/ini-1.3.5.tgz#eee25f56db1c9ec6085e0c22778083f596abf927"
+ integrity sha512-RZY5huIKCMRWDUqZlEi72f/lmXKMvuszcMBduliQ3nnWbx9X/ZBQO7DijMEYS9EhHBb2qacRUMtC7svLwe0lcw==
+
+inline-source-map@~0.5.0:
+ version "0.5.0"
+ resolved "https://registry.yarnpkg.com/inline-source-map/-/inline-source-map-0.5.0.tgz#4a4c5dd8e4fb5e9b3cda60c822dfadcaee66e0af"
+ integrity sha1-Skxd2OT7Xps82mDIIt+tyu5m4K8=
+ dependencies:
+ source-map "~0.4.0"
+
+inline-source-map@~0.6.0:
+ version "0.6.2"
+ resolved "https://registry.yarnpkg.com/inline-source-map/-/inline-source-map-0.6.2.tgz#f9393471c18a79d1724f863fa38b586370ade2a5"
+ integrity sha1-+Tk0ccGKedFyT4Y/o4tYY3Ct4qU=
+ dependencies:
+ source-map "~0.5.3"
+
+insert-module-globals@^6.4.1:
+ version "6.6.3"
+ resolved "https://registry.yarnpkg.com/insert-module-globals/-/insert-module-globals-6.6.3.tgz#20638e29a30f9ed1ca2e3a825fbc2cba5246ddfc"
+ integrity sha1-IGOOKaMPntHKLjqCX7wsulJG3fw=
+ dependencies:
+ JSONStream "^1.0.3"
+ combine-source-map "~0.6.1"
+ concat-stream "~1.4.1"
+ is-buffer "^1.1.0"
+ lexical-scope "^1.2.0"
+ process "~0.11.0"
+ through2 "^1.0.0"
+ xtend "^4.0.0"
+
+insert-module-globals@^7.0.0:
+ version "7.2.0"
+ resolved "https://registry.yarnpkg.com/insert-module-globals/-/insert-module-globals-7.2.0.tgz#ec87e5b42728479e327bd5c5c71611ddfb4752ba"
+ integrity sha512-VE6NlW+WGn2/AeOMd496AHFYmE7eLKkUY6Ty31k4og5vmA3Fjuwe9v6ifH6Xx/Hz27QvdoMoviw1/pqWRB09Sw==
+ dependencies:
+ JSONStream "^1.0.3"
+ acorn-node "^1.5.2"
+ combine-source-map "^0.8.0"
+ concat-stream "^1.6.1"
+ is-buffer "^1.1.0"
+ path-is-absolute "^1.0.1"
+ process "~0.11.0"
+ through2 "^2.0.0"
+ undeclared-identifiers "^1.1.2"
+ xtend "^4.0.0"
+
+is-accessor-descriptor@^0.1.6:
+ version "0.1.6"
+ resolved "https://registry.yarnpkg.com/is-accessor-descriptor/-/is-accessor-descriptor-0.1.6.tgz#a9e12cb3ae8d876727eeef3843f8a0897b5c98d6"
+ integrity sha1-qeEss66Nh2cn7u84Q/igiXtcmNY=
+ dependencies:
+ kind-of "^3.0.2"
+
+is-accessor-descriptor@^1.0.0:
+ version "1.0.0"
+ resolved "https://registry.yarnpkg.com/is-accessor-descriptor/-/is-accessor-descriptor-1.0.0.tgz#169c2f6d3df1f992618072365c9b0ea1f6878656"
+ integrity sha512-m5hnHTkcVsPfqx3AKlyttIPb7J+XykHvJP2B9bZDjlhLIoEq4XoK64Vg7boZlVWYK6LUY94dYPEE7Lh0ZkZKcQ==
+ dependencies:
+ kind-of "^6.0.0"
+
+is-arrayish@^0.2.1:
+ version "0.2.1"
+ resolved "https://registry.yarnpkg.com/is-arrayish/-/is-arrayish-0.2.1.tgz#77c99840527aa8ecb1a8ba697b80645a7a926a9d"
+ integrity sha1-d8mYQFJ6qOyxqLppe4BkWnqSap0=
+
+is-binary-path@^1.0.0:
+ version "1.0.1"
+ resolved "https://registry.yarnpkg.com/is-binary-path/-/is-binary-path-1.0.1.tgz#75f16642b480f187a711c814161fd3a4a7655898"
+ integrity sha1-dfFmQrSA8YenEcgUFh/TpKdlWJg=
+ dependencies:
+ binary-extensions "^1.0.0"
+
+is-buffer@^1.1.0, is-buffer@^1.1.5:
+ version "1.1.6"
+ resolved "https://registry.yarnpkg.com/is-buffer/-/is-buffer-1.1.6.tgz#efaa2ea9daa0d7ab2ea13a97b2b8ad51fefbe8be"
+ integrity sha512-NcdALwpXkTm5Zvvbk7owOUSvVvBKDgKP5/ewfXEznmQFfs4ZRmanOeKBTjRVjka3QFoN6XJ+9F3USqfHqTaU5w==
+
+is-builtin-module@^1.0.0:
+ version "1.0.0"
+ resolved "https://registry.yarnpkg.com/is-builtin-module/-/is-builtin-module-1.0.0.tgz#540572d34f7ac3119f8f76c30cbc1b1e037affbe"
+ integrity sha1-VAVy0096wxGfj3bDDLwbHgN6/74=
+ dependencies:
+ builtin-modules "^1.0.0"
+
+is-data-descriptor@^0.1.4:
+ version "0.1.4"
+ resolved "https://registry.yarnpkg.com/is-data-descriptor/-/is-data-descriptor-0.1.4.tgz#0b5ee648388e2c860282e793f1856fec3f301b56"
+ integrity sha1-C17mSDiOLIYCgueT8YVv7D8wG1Y=
+ dependencies:
+ kind-of "^3.0.2"
+
+is-data-descriptor@^1.0.0:
+ version "1.0.0"
+ resolved "https://registry.yarnpkg.com/is-data-descriptor/-/is-data-descriptor-1.0.0.tgz#d84876321d0e7add03990406abbbbd36ba9268c7"
+ integrity sha512-jbRXy1FmtAoCjQkVmIVYwuuqDFUbaOeDjmed1tOGPrsMhtJA4rD9tkgA0F1qJ3gRFRXcHYVkdeaP50Q5rE/jLQ==
+ dependencies:
+ kind-of "^6.0.0"
+
+is-descriptor@^0.1.0:
+ version "0.1.6"
+ resolved "https://registry.yarnpkg.com/is-descriptor/-/is-descriptor-0.1.6.tgz#366d8240dde487ca51823b1ab9f07a10a78251ca"
+ integrity sha512-avDYr0SB3DwO9zsMov0gKCESFYqCnE4hq/4z3TdUlukEy5t9C0YRq7HLrsN52NAcqXKaepeCD0n+B0arnVG3Hg==
+ dependencies:
+ is-accessor-descriptor "^0.1.6"
+ is-data-descriptor "^0.1.4"
+ kind-of "^5.0.0"
+
+is-descriptor@^1.0.0, is-descriptor@^1.0.2:
+ version "1.0.2"
+ resolved "https://registry.yarnpkg.com/is-descriptor/-/is-descriptor-1.0.2.tgz#3b159746a66604b04f8c81524ba365c5f14d86ec"
+ integrity sha512-2eis5WqQGV7peooDyLmNEPUrps9+SXX5c9pL3xEB+4e9HnGuDa7mB7kHxHw4CbqS9k1T2hOH3miL8n8WtiYVtg==
+ dependencies:
+ is-accessor-descriptor "^1.0.0"
+ is-data-descriptor "^1.0.0"
+ kind-of "^6.0.2"
+
+is-dotfile@^1.0.0:
+ version "1.0.3"
+ resolved "https://registry.yarnpkg.com/is-dotfile/-/is-dotfile-1.0.3.tgz#a6a2f32ffd2dfb04f5ca25ecd0f6b83cf798a1e1"
+ integrity sha1-pqLzL/0t+wT1yiXs0Pa4PPeYoeE=
+
+is-equal-shallow@^0.1.3:
+ version "0.1.3"
+ resolved "https://registry.yarnpkg.com/is-equal-shallow/-/is-equal-shallow-0.1.3.tgz#2238098fc221de0bcfa5d9eac4c45d638aa1c534"
+ integrity sha1-IjgJj8Ih3gvPpdnqxMRdY4qhxTQ=
+ dependencies:
+ is-primitive "^2.0.0"
+
+is-extendable@^0.1.0, is-extendable@^0.1.1:
+ version "0.1.1"
+ resolved "https://registry.yarnpkg.com/is-extendable/-/is-extendable-0.1.1.tgz#62b110e289a471418e3ec36a617d472e301dfc89"
+ integrity sha1-YrEQ4omkcUGOPsNqYX1HLjAd/Ik=
+
+is-extendable@^1.0.1:
+ version "1.0.1"
+ resolved "https://registry.yarnpkg.com/is-extendable/-/is-extendable-1.0.1.tgz#a7470f9e426733d81bd81e1155264e3a3507cab4"
+ integrity sha512-arnXMxT1hhoKo9k1LZdmlNyJdDDfy2v0fXjFlmok4+i8ul/6WlbVge9bhM74OpNPQPMGUToDtz+KXa1PneJxOA==
+ dependencies:
+ is-plain-object "^2.0.4"
+
+is-extglob@^1.0.0:
+ version "1.0.0"
+ resolved "https://registry.yarnpkg.com/is-extglob/-/is-extglob-1.0.0.tgz#ac468177c4943405a092fc8f29760c6ffc6206c0"
+ integrity sha1-rEaBd8SUNAWgkvyPKXYMb/xiBsA=
+
+is-finite@^1.0.0:
+ version "1.0.2"
+ resolved "https://registry.yarnpkg.com/is-finite/-/is-finite-1.0.2.tgz#cc6677695602be550ef11e8b4aa6305342b6d0aa"
+ integrity sha1-zGZ3aVYCvlUO8R6LSqYwU0K20Ko=
+ dependencies:
+ number-is-nan "^1.0.0"
+
+is-fullwidth-code-point@^1.0.0:
+ version "1.0.0"
+ resolved "https://registry.yarnpkg.com/is-fullwidth-code-point/-/is-fullwidth-code-point-1.0.0.tgz#ef9e31386f031a7f0d643af82fde50c457ef00cb"
+ integrity sha1-754xOG8DGn8NZDr4L95QxFfvAMs=
+ dependencies:
+ number-is-nan "^1.0.0"
+
+is-fullwidth-code-point@^2.0.0:
+ version "2.0.0"
+ resolved "https://registry.yarnpkg.com/is-fullwidth-code-point/-/is-fullwidth-code-point-2.0.0.tgz#a3b30a5c4f199183167aaab93beefae3ddfb654f"
+ integrity sha1-o7MKXE8ZkYMWeqq5O+764937ZU8=
+
+is-glob@^2.0.0, is-glob@^2.0.1:
+ version "2.0.1"
+ resolved "https://registry.yarnpkg.com/is-glob/-/is-glob-2.0.1.tgz#d096f926a3ded5600f3fdfd91198cb0888c2d863"
+ integrity sha1-0Jb5JqPe1WAPP9/ZEZjLCIjC2GM=
+ dependencies:
+ is-extglob "^1.0.0"
+
+is-number@^2.1.0:
+ version "2.1.0"
+ resolved "https://registry.yarnpkg.com/is-number/-/is-number-2.1.0.tgz#01fcbbb393463a548f2f466cce16dece49db908f"
+ integrity sha1-Afy7s5NGOlSPL0ZszhbezknbkI8=
+ dependencies:
+ kind-of "^3.0.2"
+
+is-number@^3.0.0:
+ version "3.0.0"
+ resolved "https://registry.yarnpkg.com/is-number/-/is-number-3.0.0.tgz#24fd6201a4782cf50561c810276afc7d12d71195"
+ integrity sha1-JP1iAaR4LPUFYcgQJ2r8fRLXEZU=
+ dependencies:
+ kind-of "^3.0.2"
+
+is-number@^4.0.0:
+ version "4.0.0"
+ resolved "https://registry.yarnpkg.com/is-number/-/is-number-4.0.0.tgz#0026e37f5454d73e356dfe6564699867c6a7f0ff"
+ integrity sha512-rSklcAIlf1OmFdyAqbnWTLVelsQ58uvZ66S/ZyawjWqIviTWCjg2PzVGw8WUA+nNuPTqb4wgA+NszrJ+08LlgQ==
+
+is-plain-object@^2.0.1, is-plain-object@^2.0.3, is-plain-object@^2.0.4:
+ version "2.0.4"
+ resolved "https://registry.yarnpkg.com/is-plain-object/-/is-plain-object-2.0.4.tgz#2c163b3fafb1b606d9d17928f05c2a1c38e07677"
+ integrity sha512-h5PpgXkWitc38BBMYawTYMWJHFZJVnBquFE57xFpjB8pJFiF6gZ+bU+WyI/yqXiFR5mdLsgYNaPe8uao6Uv9Og==
+ dependencies:
+ isobject "^3.0.1"
+
+is-posix-bracket@^0.1.0:
+ version "0.1.1"
+ resolved "https://registry.yarnpkg.com/is-posix-bracket/-/is-posix-bracket-0.1.1.tgz#3334dc79774368e92f016e6fbc0a88f5cd6e6bc4"
+ integrity sha1-MzTceXdDaOkvAW5vvAqI9c1ua8Q=
+
+is-primitive@^2.0.0:
+ version "2.0.0"
+ resolved "https://registry.yarnpkg.com/is-primitive/-/is-primitive-2.0.0.tgz#207bab91638499c07b2adf240a41a87210034575"
+ integrity sha1-IHurkWOEmcB7Kt8kCkGochADRXU=
+
+is-stream@^1.0.1:
+ version "1.1.0"
+ resolved "https://registry.yarnpkg.com/is-stream/-/is-stream-1.1.0.tgz#12d4a3dd4e68e0b79ceb8dbc84173ae80d91ca44"
+ integrity sha1-EtSj3U5o4Lec6428hBc66A2RykQ=
+
+is-utf8@^0.2.0:
+ version "0.2.1"
+ resolved "https://registry.yarnpkg.com/is-utf8/-/is-utf8-0.2.1.tgz#4b0da1442104d1b336340e80797e865cf39f7d72"
+ integrity sha1-Sw2hRCEE0bM2NA6AeX6GXPOffXI=
+
+is-windows@^1.0.2:
+ version "1.0.2"
+ resolved "https://registry.yarnpkg.com/is-windows/-/is-windows-1.0.2.tgz#d1850eb9791ecd18e6182ce12a30f396634bb19d"
+ integrity sha512-eXK1UInq2bPmjyX6e3VHIzMLobc4J94i4AWn+Hpq3OU5KkrRC96OAcR3PRJ/pGu6m8TRnBHP9dkXQVsT/COVIA==
+
+isarray@0.0.1, isarray@~0.0.1:
+ version "0.0.1"
+ resolved "https://registry.yarnpkg.com/isarray/-/isarray-0.0.1.tgz#8a18acfca9a8f4177e09abfc6038939b05d1eedf"
+ integrity sha1-ihis/Kmo9Bd+Cav8YDiTmwXR7t8=
+
+isarray@1.0.0, isarray@^1.0.0, isarray@~1.0.0:
+ version "1.0.0"
+ resolved "https://registry.yarnpkg.com/isarray/-/isarray-1.0.0.tgz#bb935d48582cba168c06834957a54a3e07124f11"
+ integrity sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE=
+
+isarray@^2.0.4:
+ version "2.0.4"
+ resolved "https://registry.yarnpkg.com/isarray/-/isarray-2.0.4.tgz#38e7bcbb0f3ba1b7933c86ba1894ddfc3781bbb7"
+ integrity sha512-GMxXOiUirWg1xTKRipM0Ek07rX+ubx4nNVElTJdNLYmNO/2YrDkgJGw9CljXn+r4EWiDQg/8lsRdHyg2PJuUaA==
+
+isexe@^2.0.0:
+ version "2.0.0"
+ resolved "https://registry.yarnpkg.com/isexe/-/isexe-2.0.0.tgz#e8fbf374dc556ff8947a10dcb0572d633f2cfa10"
+ integrity sha1-6PvzdNxVb/iUehDcsFctYz8s+hA=
+
+isobject@^2.0.0:
+ version "2.1.0"
+ resolved "https://registry.yarnpkg.com/isobject/-/isobject-2.1.0.tgz#f065561096a3f1da2ef46272f815c840d87e0c89"
+ integrity sha1-8GVWEJaj8dou9GJy+BXIQNh+DIk=
+ dependencies:
+ isarray "1.0.0"
+
+isobject@^3.0.0, isobject@^3.0.1:
+ version "3.0.1"
+ resolved "https://registry.yarnpkg.com/isobject/-/isobject-3.0.1.tgz#4e431e92b11a9731636aa1f9c8d1ccbcfdab78df"
+ integrity sha1-TkMekrEalzFjaqH5yNHMvP2reN8=
+
+isomorphic-fetch@^2.1.1:
+ version "2.2.1"
+ resolved "https://registry.yarnpkg.com/isomorphic-fetch/-/isomorphic-fetch-2.2.1.tgz#611ae1acf14f5e81f729507472819fe9733558a9"
+ integrity sha1-YRrhrPFPXoH3KVB0coGf6XM1WKk=
+ dependencies:
+ node-fetch "^1.0.1"
+ whatwg-fetch ">=0.10.0"
+
+isstream@0.1.x:
+ version "0.1.2"
+ resolved "https://registry.yarnpkg.com/isstream/-/isstream-0.1.2.tgz#47e63f7af55afa6f92e1500e690eb8b8529c099a"
+ integrity sha1-R+Y/evVa+m+S4VAOaQ64uFKcCZo=
+
+jasmine-growl-reporter@~0.0.2:
+ version "0.0.3"
+ resolved "https://registry.yarnpkg.com/jasmine-growl-reporter/-/jasmine-growl-reporter-0.0.3.tgz#b87ae551e359d28ad5217765eaef6c07b763f6c8"
+ integrity sha1-uHrlUeNZ0orVIXdl6u9sB7dj9sg=
+ dependencies:
+ growl "~1.7.0"
+
+jasmine-growl-reporter@~0.2.0:
+ version "0.2.1"
+ resolved "https://registry.yarnpkg.com/jasmine-growl-reporter/-/jasmine-growl-reporter-0.2.1.tgz#d5f0a37b92f6a83fd5c6482b809495c90a8b55fe"
+ integrity sha1-1fCje5L2qD/VxkgrgJSVyQqLVf4=
+ dependencies:
+ growl "~1.7.0"
+
+jasmine-node@>=1.4.0:
+ version "1.16.2"
+ resolved "https://registry.yarnpkg.com/jasmine-node/-/jasmine-node-1.16.2.tgz#c9cec44f4bccc3bb9c3eb2c8f877590ce6530f38"
+ integrity sha512-A4AA2WaikuE7s/NYQCqfYsyCczEgObLgNH7IxRQ2SBshLBZg7vUEiiGX4GPbveW5f06nYmXYlzY4UjnZjXjV9g==
+ dependencies:
+ coffeescript "~1.12.7"
+ gaze "~1.1.2"
+ jasmine-growl-reporter "~0.2.0"
+ jasmine-reporters "~1.0.0"
+ mkdirp "~0.3.5"
+ requirejs "~2.3.6"
+ underscore "~1.9.1"
+ walkdir "~0.0.12"
+
+jasmine-node@~1.12.0:
+ version "1.12.1"
+ resolved "https://registry.yarnpkg.com/jasmine-node/-/jasmine-node-1.12.1.tgz#a7ddd86bb0b4cca06ffa48de28abb4e9192ba47b"
+ integrity sha1-p93Ya7C0zKBv+kjeKKu06RkrpHs=
+ dependencies:
+ coffee-script ">=1.0.1"
+ gaze "~0.3.2"
+ jasmine-growl-reporter "~0.0.2"
+ jasmine-reporters ">=0.2.0"
+ mkdirp "~0.3.5"
+ requirejs ">=0.27.1"
+ underscore ">= 1.3.1"
+ walkdir ">= 0.0.1"
+
+jasmine-reporters@>=0.2.0:
+ version "2.3.2"
+ resolved "https://registry.yarnpkg.com/jasmine-reporters/-/jasmine-reporters-2.3.2.tgz#898818ffc234eb8b3f635d693de4586f95548d43"
+ integrity sha512-u/7AT9SkuZsUfFBLLzbErohTGNsEUCKaQbsVYnLFW1gEuL2DzmBL4n8v90uZsqIqlWvWUgian8J6yOt5Fyk/+A==
+ dependencies:
+ mkdirp "^0.5.1"
+ xmldom "^0.1.22"
+
+jasmine-reporters@~1.0.0:
+ version "1.0.2"
+ resolved "https://registry.yarnpkg.com/jasmine-reporters/-/jasmine-reporters-1.0.2.tgz#ab613ed5977dc7487e85b3c12f6a8ea8db2ade31"
+ integrity sha1-q2E+1Zd9x0h+hbPBL2qOqNsq3jE=
+ dependencies:
+ mkdirp "~0.3.5"
+
+"js-tokens@^3.0.0 || ^4.0.0":
+ version "4.0.0"
+ resolved "https://registry.yarnpkg.com/js-tokens/-/js-tokens-4.0.0.tgz#19203fb59991df98e3a287050d4647cdeaf32499"
+ integrity sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==
+
+js-yaml@~2.0.5:
+ version "2.0.5"
+ resolved "https://registry.yarnpkg.com/js-yaml/-/js-yaml-2.0.5.tgz#a25ae6509999e97df278c6719da11bd0687743a8"
+ integrity sha1-olrmUJmZ6X3yeMZxnaEb0Gh3Q6g=
+ dependencies:
+ argparse "~ 0.1.11"
+ esprima "~ 1.0.2"
+
+js-yaml@~3.5.2:
+ version "3.5.5"
+ resolved "https://registry.yarnpkg.com/js-yaml/-/js-yaml-3.5.5.tgz#0377c38017cabc7322b0d1fbcd25a491641f2fbe"
+ integrity sha1-A3fDgBfKvHMisNH7zSWkkWQfL74=
+ dependencies:
+ argparse "^1.0.2"
+ esprima "^2.6.0"
+
+jshint@~2.3.0:
+ version "2.3.0"
+ resolved "https://registry.yarnpkg.com/jshint/-/jshint-2.3.0.tgz#19504455a2c20c46ee183361eb87f3a1c0b7dc47"
+ integrity sha1-GVBEVaLCDEbuGDNh64fzocC33Ec=
+ dependencies:
+ cli "0.4.x"
+ console-browserify "0.1.x"
+ minimatch "0.x.x"
+ shelljs "0.1.x"
+ underscore "1.4.x"
+
+jshint@~2.6.0:
+ version "2.6.3"
+ resolved "https://registry.yarnpkg.com/jshint/-/jshint-2.6.3.tgz#84b470b8e5d5cd7adf0a3bd4975250443c9d311a"
+ integrity sha1-hLRwuOXVzXrfCjvUl1JQRDydMRo=
+ dependencies:
+ cli "0.6.x"
+ console-browserify "1.1.x"
+ exit "0.1.x"
+ htmlparser2 "3.8.x"
+ minimatch "1.0.x"
+ shelljs "0.3.x"
+ strip-json-comments "1.0.x"
+ underscore "1.6.x"
+
+json-stable-stringify@~0.0.0:
+ version "0.0.1"
+ resolved "https://registry.yarnpkg.com/json-stable-stringify/-/json-stable-stringify-0.0.1.tgz#611c23e814db375527df851193db59dd2af27f45"
+ integrity sha1-YRwj6BTbN1Un34URk9tZ3Sryf0U=
+ dependencies:
+ jsonify "~0.0.0"
+
+jsonify@~0.0.0:
+ version "0.0.0"
+ resolved "https://registry.yarnpkg.com/jsonify/-/jsonify-0.0.0.tgz#2c74b6ee41d93ca51b7b5aaee8f503631d252a73"
+ integrity sha1-LHS27kHZPKUbe1qu6PUDYx0lKnM=
+
+jsonparse@^1.2.0:
+ version "1.3.1"
+ resolved "https://registry.yarnpkg.com/jsonparse/-/jsonparse-1.3.1.tgz#3f4dae4a91fac315f71062f8521cc239f1366280"
+ integrity sha1-P02uSpH6wxX3EGL4UhzCOfE2YoA=
+
+jstransform@^10.1.0:
+ version "10.1.0"
+ resolved "https://registry.yarnpkg.com/jstransform/-/jstransform-10.1.0.tgz#b4c49bf63f162c108b0348399a8737c713b0a83a"
+ integrity sha1-tMSb9j8WLBCLA0g5moc3xxOwqDo=
+ dependencies:
+ base62 "0.1.1"
+ esprima-fb "13001.1001.0-dev-harmony-fb"
+ source-map "0.1.31"
+
+jstransform@^11.0.3:
+ version "11.0.3"
+ resolved "https://registry.yarnpkg.com/jstransform/-/jstransform-11.0.3.tgz#09a78993e0ae4d4ef4487f6155a91f6190cb4223"
+ integrity sha1-CaeJk+CuTU70SH9hVakfYZDLQiM=
+ dependencies:
+ base62 "^1.1.0"
+ commoner "^0.10.1"
+ esprima-fb "^15001.1.0-dev-harmony-fb"
+ object-assign "^2.0.0"
+ source-map "^0.4.2"
+
+kind-of@^3.0.2, kind-of@^3.0.3, kind-of@^3.2.0:
+ version "3.2.2"
+ resolved "https://registry.yarnpkg.com/kind-of/-/kind-of-3.2.2.tgz#31ea21a734bab9bbb0f32466d893aea51e4a3c64"
+ integrity sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=
+ dependencies:
+ is-buffer "^1.1.5"
+
+kind-of@^4.0.0:
+ version "4.0.0"
+ resolved "https://registry.yarnpkg.com/kind-of/-/kind-of-4.0.0.tgz#20813df3d712928b207378691a45066fae72dd57"
+ integrity sha1-IIE989cSkosgc3hpGkUGb65y3Vc=
+ dependencies:
+ is-buffer "^1.1.5"
+
+kind-of@^5.0.0:
+ version "5.1.0"
+ resolved "https://registry.yarnpkg.com/kind-of/-/kind-of-5.1.0.tgz#729c91e2d857b7a419a1f9aa65685c4c33f5845d"
+ integrity sha512-NGEErnH6F2vUuXDh+OlbcKW7/wOcfdRHaZ7VWtqCztfHri/++YKmP51OdWeGPuqCOba6kk2OTe5d02VmTB80Pw==
+
+kind-of@^6.0.0, kind-of@^6.0.2:
+ version "6.0.2"
+ resolved "https://registry.yarnpkg.com/kind-of/-/kind-of-6.0.2.tgz#01146b36a6218e64e58f3a8d66de5d7fc6f6d051"
+ integrity sha512-s5kLOcnH0XqDO+FvuaLX8DDjZ18CGFk7VygH40QoKPUQhW4e2rvM0rwUq0t8IQDOwYSeLK01U90OjzBTme2QqA==
+
+labeled-stream-splicer@^1.0.0:
+ version "1.0.2"
+ resolved "https://registry.yarnpkg.com/labeled-stream-splicer/-/labeled-stream-splicer-1.0.2.tgz#4615331537784981e8fd264e1f3a434c4e0ddd65"
+ integrity sha1-RhUzFTd4SYHo/SZOHzpDTE4N3WU=
+ dependencies:
+ inherits "^2.0.1"
+ isarray "~0.0.1"
+ stream-splicer "^1.1.0"
+
+labeled-stream-splicer@^2.0.0:
+ version "2.0.1"
+ resolved "https://registry.yarnpkg.com/labeled-stream-splicer/-/labeled-stream-splicer-2.0.1.tgz#9cffa32fd99e1612fd1d86a8db962416d5292926"
+ integrity sha512-MC94mHZRvJ3LfykJlTUipBqenZz1pacOZEMhhQ8dMGcDHs0SBE5GbsavUXV7YtP3icBW17W0Zy1I0lfASmo9Pg==
+ dependencies:
+ inherits "^2.0.1"
+ isarray "^2.0.4"
+ stream-splicer "^2.0.0"
+
+lexical-scope@^1.2.0:
+ version "1.2.0"
+ resolved "https://registry.yarnpkg.com/lexical-scope/-/lexical-scope-1.2.0.tgz#fcea5edc704a4b3a8796cdca419c3a0afaf22df4"
+ integrity sha1-/Ope3HBKSzqHls3KQZw6CvryLfQ=
+ dependencies:
+ astw "^2.0.0"
+
+load-json-file@^1.0.0:
+ version "1.1.0"
+ resolved "https://registry.yarnpkg.com/load-json-file/-/load-json-file-1.1.0.tgz#956905708d58b4bab4c2261b04f59f31c99374c0"
+ integrity sha1-lWkFcI1YtLq0wiYbBPWfMcmTdMA=
+ dependencies:
+ graceful-fs "^4.1.2"
+ parse-json "^2.2.0"
+ pify "^2.0.0"
+ pinkie-promise "^2.0.0"
+ strip-bom "^2.0.0"
+
+lodash.memoize@~3.0.3:
+ version "3.0.4"
+ resolved "https://registry.yarnpkg.com/lodash.memoize/-/lodash.memoize-3.0.4.tgz#2dcbd2c287cbc0a55cc42328bd0c736150d53e3f"
+ integrity sha1-LcvSwofLwKVcxCMovQxzYVDVPj8=
+
+lodash@^3.8.0:
+ version "3.10.1"
+ resolved "https://registry.yarnpkg.com/lodash/-/lodash-3.10.1.tgz#5bf45e8e49ba4189e17d482789dfd15bd140b7b6"
+ integrity sha1-W/Rejkm6QYnhfUgnid/RW9FAt7Y=
+
+lodash@~0.9.2:
+ version "0.9.2"
+ resolved "https://registry.yarnpkg.com/lodash/-/lodash-0.9.2.tgz#8f3499c5245d346d682e5b0d3b40767e09f1a92c"
+ integrity sha1-jzSZxSRdNG1oLlsNO0B2fgnxqSw=
+
+lodash@~2.4.1:
+ version "2.4.2"
+ resolved "https://registry.yarnpkg.com/lodash/-/lodash-2.4.2.tgz#fadd834b9683073da179b3eae6d9c0d15053f73e"
+ integrity sha1-+t2DS5aDBz2hebPq5tnA0VBT9z4=
+
+lodash@~4.17.10, lodash@~4.17.5:
+ version "4.17.11"
+ resolved "https://registry.yarnpkg.com/lodash/-/lodash-4.17.11.tgz#b39ea6229ef607ecd89e2c8df12536891cac9b8d"
+ integrity sha512-cQKh8igo5QUhZ7lg38DYWAxMvjSAKG0A8wGSVimP07SIUEK2UO+arSRKbRZWtelMtN5V0Hkwh5ryOto/SshYIg==
+
+loose-envify@^1.0.0:
+ version "1.4.0"
+ resolved "https://registry.yarnpkg.com/loose-envify/-/loose-envify-1.4.0.tgz#71ee51fa7be4caec1a63839f7e682d8132d30caf"
+ integrity sha512-lyuxPGr/Wfhrlem2CL/UcnUc1zcqKAImBDzukY7Y5F/yQiNdko6+fRLevlw1HgMySw7f611UIY408EtxRSoK3Q==
+ dependencies:
+ js-tokens "^3.0.0 || ^4.0.0"
+
+loud-rejection@^1.0.0:
+ version "1.6.0"
+ resolved "https://registry.yarnpkg.com/loud-rejection/-/loud-rejection-1.6.0.tgz#5b46f80147edee578870f086d04821cf998e551f"
+ integrity sha1-W0b4AUft7leIcPCG0Eghz5mOVR8=
+ dependencies:
+ currently-unhandled "^0.4.1"
+ signal-exit "^3.0.0"
+
+lru-cache@2:
+ version "2.7.3"
+ resolved "https://registry.yarnpkg.com/lru-cache/-/lru-cache-2.7.3.tgz#6d4524e8b955f95d4f5b58851ce21dd72fb4e952"
+ integrity sha1-bUUk6LlV+V1PW1iFHOId1y+06VI=
+
+map-cache@^0.2.2:
+ version "0.2.2"
+ resolved "https://registry.yarnpkg.com/map-cache/-/map-cache-0.2.2.tgz#c32abd0bd6525d9b051645bb4f26ac5dc98a0dbf"
+ integrity sha1-wyq9C9ZSXZsFFkW7TyasXcmKDb8=
+
+map-obj@^1.0.0, map-obj@^1.0.1:
+ version "1.0.1"
+ resolved "https://registry.yarnpkg.com/map-obj/-/map-obj-1.0.1.tgz#d933ceb9205d82bdcf4886f6742bdc2b4dea146d"
+ integrity sha1-2TPOuSBdgr3PSIb2dCvcK03qFG0=
+
+map-visit@^1.0.0:
+ version "1.0.0"
+ resolved "https://registry.yarnpkg.com/map-visit/-/map-visit-1.0.0.tgz#ecdca8f13144e660f1b5bd41f12f3479d98dfb8f"
+ integrity sha1-7Nyo8TFE5mDxtb1B8S80edmN+48=
+ dependencies:
+ object-visit "^1.0.0"
+
+markdown@~0.4.0:
+ version "0.4.0"
+ resolved "https://registry.yarnpkg.com/markdown/-/markdown-0.4.0.tgz#a4b545adb6c66494f97168f3290c8d1b073e5b2a"
+ integrity sha1-pLVFrbbGZJT5cWjzKQyNGwc+Wyo=
+ dependencies:
+ nopt "1"
+
+math-random@^1.0.1:
+ version "1.0.1"
+ resolved "https://registry.yarnpkg.com/math-random/-/math-random-1.0.1.tgz#8b3aac588b8a66e4975e3cdea67f7bb329601fac"
+ integrity sha1-izqsWIuKZuSXXjzepn97sylgH6w=
+
+md5.js@^1.3.4:
+ version "1.3.5"
+ resolved "https://registry.yarnpkg.com/md5.js/-/md5.js-1.3.5.tgz#b5d07b8e3216e3e27cd728d72f70d1e6a342005f"
+ integrity sha512-xitP+WxNPcTTOgnTJcrhM0xvdPepipPSf3I8EIpGKeFLjt3PlJLIDG3u8EX53ZIubkb+5U2+3rELYpEhHhzdkg==
+ dependencies:
+ hash-base "^3.0.0"
+ inherits "^2.0.1"
+ safe-buffer "^5.1.2"
+
+meow@^3.3.0:
+ version "3.7.0"
+ resolved "https://registry.yarnpkg.com/meow/-/meow-3.7.0.tgz#72cb668b425228290abbfa856892587308a801fb"
+ integrity sha1-cstmi0JSKCkKu/qFaJJYcwioAfs=
+ dependencies:
+ camelcase-keys "^2.0.0"
+ decamelize "^1.1.2"
+ loud-rejection "^1.0.0"
+ map-obj "^1.0.1"
+ minimist "^1.1.3"
+ normalize-package-data "^2.3.4"
+ object-assign "^4.0.1"
+ read-pkg-up "^1.0.1"
+ redent "^1.0.0"
+ trim-newlines "^1.0.0"
+
+micromatch@^2.1.5:
+ version "2.3.11"
+ resolved "https://registry.yarnpkg.com/micromatch/-/micromatch-2.3.11.tgz#86677c97d1720b363431d04d0d15293bd38c1565"
+ integrity sha1-hmd8l9FyCzY0MdBNDRUpO9OMFWU=
+ dependencies:
+ arr-diff "^2.0.0"
+ array-unique "^0.2.1"
+ braces "^1.8.2"
+ expand-brackets "^0.1.4"
+ extglob "^0.3.1"
+ filename-regex "^2.0.0"
+ is-extglob "^1.0.0"
+ is-glob "^2.0.1"
+ kind-of "^3.0.2"
+ normalize-path "^2.0.1"
+ object.omit "^2.0.0"
+ parse-glob "^3.0.4"
+ regex-cache "^0.4.2"
+
+micromatch@^3.1.10:
+ version "3.1.10"
+ resolved "https://registry.yarnpkg.com/micromatch/-/micromatch-3.1.10.tgz#70859bc95c9840952f359a068a3fc49f9ecfac23"
+ integrity sha512-MWikgl9n9M3w+bpsY3He8L+w9eF9338xRl8IAO5viDizwSzziFEyUzo2xrrloB64ADbTf8uA8vRqqttDTOmccg==
+ dependencies:
+ arr-diff "^4.0.0"
+ array-unique "^0.3.2"
+ braces "^2.3.1"
+ define-property "^2.0.2"
+ extend-shallow "^3.0.2"
+ extglob "^2.0.4"
+ fragment-cache "^0.2.1"
+ kind-of "^6.0.2"
+ nanomatch "^1.2.9"
+ object.pick "^1.3.0"
+ regex-not "^1.0.0"
+ snapdragon "^0.8.1"
+ to-regex "^3.0.2"
+
+miller-rabin@^4.0.0:
+ version "4.0.1"
+ resolved "https://registry.yarnpkg.com/miller-rabin/-/miller-rabin-4.0.1.tgz#f080351c865b0dc562a8462966daa53543c78a4d"
+ integrity sha512-115fLhvZVqWwHPbClyntxEVfVDfl9DLLTuJvq3g2O/Oxi8AiNouAHvDSzHS0viUJc+V5vm3eq91Xwqn9dp4jRA==
+ dependencies:
+ bn.js "^4.0.0"
+ brorand "^1.0.1"
+
+minimalistic-assert@^1.0.0, minimalistic-assert@^1.0.1:
+ version "1.0.1"
+ resolved "https://registry.yarnpkg.com/minimalistic-assert/-/minimalistic-assert-1.0.1.tgz#2e194de044626d4a10e7f7fbc00ce73e83e4d5c7"
+ integrity sha512-UtJcAD4yEaGtjPezWuO9wC4nwUnVH/8/Im3yEHQP4b67cXlD/Qr9hdITCU1xDbSEXg2XKNaP8jsReV7vQd00/A==
+
+minimalistic-crypto-utils@^1.0.0, minimalistic-crypto-utils@^1.0.1:
+ version "1.0.1"
+ resolved "https://registry.yarnpkg.com/minimalistic-crypto-utils/-/minimalistic-crypto-utils-1.0.1.tgz#f6c00c1c0b082246e5c4d99dfb8c7c083b2b582a"
+ integrity sha1-9sAMHAsIIkblxNmd+4x8CDsrWCo=
+
+minimatch@0.3:
+ version "0.3.0"
+ resolved "https://registry.yarnpkg.com/minimatch/-/minimatch-0.3.0.tgz#275d8edaac4f1bb3326472089e7949c8394699dd"
+ integrity sha1-J12O2qxPG7MyZHIInnlJyDlGmd0=
+ dependencies:
+ lru-cache "2"
+ sigmund "~1.0.0"
+
+minimatch@0.x, minimatch@0.x.x:
+ version "0.4.0"
+ resolved "https://registry.yarnpkg.com/minimatch/-/minimatch-0.4.0.tgz#bd2c7d060d2c8c8fd7cde7f1f2ed2d5b270fdb1b"
+ integrity sha1-vSx9Bg0sjI/Xzefx8u0tWycP2xs=
+ dependencies:
+ lru-cache "2"
+ sigmund "~1.0.0"
+
+minimatch@1.0.x:
+ version "1.0.0"
+ resolved "https://registry.yarnpkg.com/minimatch/-/minimatch-1.0.0.tgz#e0dd2120b49e1b724ce8d714c520822a9438576d"
+ integrity sha1-4N0hILSeG3JM6NcUxSCCKpQ4V20=
+ dependencies:
+ lru-cache "2"
+ sigmund "~1.0.0"
+
+"minimatch@2 || 3", minimatch@^3.0.2, minimatch@^3.0.4, minimatch@~3.0.2:
+ version "3.0.4"
+ resolved "https://registry.yarnpkg.com/minimatch/-/minimatch-3.0.4.tgz#5166e286457f03306064be5497e8dbb0c3d32083"
+ integrity sha512-yJHVQEhyqPLUTgt9B83PXu6W3rx4MvvHvSUvToogpwoGDOUQ+yDrR0HRot+yOCdCO7u4hX3pWft6kWBBcqh0UA==
+ dependencies:
+ brace-expansion "^1.1.7"
+
+minimatch@^2.0.1:
+ version "2.0.10"
+ resolved "https://registry.yarnpkg.com/minimatch/-/minimatch-2.0.10.tgz#8d087c39c6b38c001b97fca7ce6d0e1e80afbac7"
+ integrity sha1-jQh8OcazjAAbl/ynzm0OHoCvusc=
+ dependencies:
+ brace-expansion "^1.0.0"
+
+minimatch@~0.2.11, minimatch@~0.2.12, minimatch@~0.2.9:
+ version "0.2.14"
+ resolved "https://registry.yarnpkg.com/minimatch/-/minimatch-0.2.14.tgz#c74e780574f63c6f9a090e90efbe6ef53a6a756a"
+ integrity sha1-x054BXT2PG+aCQ6Q775u9TpqdWo=
+ dependencies:
+ lru-cache "2"
+ sigmund "~1.0.0"
+
+minimist@0.0.8:
+ version "0.0.8"
+ resolved "https://registry.yarnpkg.com/minimist/-/minimist-0.0.8.tgz#857fcabfc3397d2625b8228262e86aa7a011b05d"
+ integrity sha1-hX/Kv8M5fSYluCKCYuhqp6ARsF0=
+
+minimist@^1.1.0, minimist@^1.1.1, minimist@^1.1.3, minimist@^1.2.0:
+ version "1.2.0"
+ resolved "https://registry.yarnpkg.com/minimist/-/minimist-1.2.0.tgz#a35008b20f41383eec1fb914f4cd5df79a264284"
+ integrity sha1-o1AIsg9BOD7sH7kU9M1d95omQoQ=
+
+minipass@^2.2.1, minipass@^2.3.4:
+ version "2.3.5"
+ resolved "https://registry.yarnpkg.com/minipass/-/minipass-2.3.5.tgz#cacebe492022497f656b0f0f51e2682a9ed2d848"
+ integrity sha512-Gi1W4k059gyRbyVUZQ4mEqLm0YIUiGYfvxhF6SIlk3ui1WVxMTGfGdQ2SInh3PDrRTVvPKgULkpJtT4RH10+VA==
+ dependencies:
+ safe-buffer "^5.1.2"
+ yallist "^3.0.0"
+
+minizlib@^1.1.1:
+ version "1.1.1"
+ resolved "https://registry.yarnpkg.com/minizlib/-/minizlib-1.1.1.tgz#6734acc045a46e61d596a43bb9d9cd326e19cc42"
+ integrity sha512-TrfjCjk4jLhcJyGMYymBH6oTXcWjYbUAXTHDbtnWHjZC25h0cdajHuPE1zxb4DVmu8crfh+HwH/WMuyLG0nHBg==
+ dependencies:
+ minipass "^2.2.1"
+
+mixin-deep@^1.2.0:
+ version "1.3.1"
+ resolved "https://registry.yarnpkg.com/mixin-deep/-/mixin-deep-1.3.1.tgz#a49e7268dce1a0d9698e45326c5626df3543d0fe"
+ integrity sha512-8ZItLHeEgaqEvd5lYBXfm4EZSFCX29Jb9K+lAHhDKzReKBQKj3R+7NOF6tjqYi9t4oI8VUfaWITJQm86wnXGNQ==
+ dependencies:
+ for-in "^1.0.2"
+ is-extendable "^1.0.1"
+
+mkdirp@0.x.x, mkdirp@^0.5.0, mkdirp@^0.5.1, mkdirp@~0.5.1:
+ version "0.5.1"
+ resolved "https://registry.yarnpkg.com/mkdirp/-/mkdirp-0.5.1.tgz#30057438eac6cf7f8c4767f38648d6697d75c903"
+ integrity sha1-MAV0OOrGz3+MR2fzhkjWaX11yQM=
+ dependencies:
+ minimist "0.0.8"
+
+mkdirp@~0.3.5:
+ version "0.3.5"
+ resolved "https://registry.yarnpkg.com/mkdirp/-/mkdirp-0.3.5.tgz#de3e5f8961c88c787ee1368df849ac4413eca8d7"
+ integrity sha1-3j5fiWHIjHh+4TaN+EmsRBPsqNc=
+
+module-deps@^3.7.11:
+ version "3.9.1"
+ resolved "https://registry.yarnpkg.com/module-deps/-/module-deps-3.9.1.tgz#ea75caf9199090d25b0d5512b5acacb96e7f87f3"
+ integrity sha1-6nXK+RmQkNJbDVUStaysuW5/h/M=
+ dependencies:
+ JSONStream "^1.0.3"
+ browser-resolve "^1.7.0"
+ concat-stream "~1.4.5"
+ defined "^1.0.0"
+ detective "^4.0.0"
+ duplexer2 "0.0.2"
+ inherits "^2.0.1"
+ parents "^1.0.0"
+ readable-stream "^1.1.13"
+ resolve "^1.1.3"
+ stream-combiner2 "~1.0.0"
+ subarg "^1.0.0"
+ through2 "^1.0.0"
+ xtend "^4.0.0"
+
+module-deps@^4.0.8:
+ version "4.1.1"
+ resolved "https://registry.yarnpkg.com/module-deps/-/module-deps-4.1.1.tgz#23215833f1da13fd606ccb8087b44852dcb821fd"
+ integrity sha1-IyFYM/HaE/1gbMuAh7RIUty4If0=
+ dependencies:
+ JSONStream "^1.0.3"
+ browser-resolve "^1.7.0"
+ cached-path-relative "^1.0.0"
+ concat-stream "~1.5.0"
+ defined "^1.0.0"
+ detective "^4.0.0"
+ duplexer2 "^0.1.2"
+ inherits "^2.0.1"
+ parents "^1.0.0"
+ readable-stream "^2.0.2"
+ resolve "^1.1.3"
+ stream-combiner2 "^1.1.1"
+ subarg "^1.0.0"
+ through2 "^2.0.0"
+ xtend "^4.0.0"
+
+module-deps@^6.0.0:
+ version "6.2.0"
+ resolved "https://registry.yarnpkg.com/module-deps/-/module-deps-6.2.0.tgz#d41a2e790245ce319171e4e7c4d8c73993ba3cd5"
+ integrity sha512-hKPmO06so6bL/ZvqVNVqdTVO8UAYsi3tQWlCa+z9KuWhoN4KDQtb5hcqQQv58qYiDE21wIvnttZEPiDgEbpwbA==
+ dependencies:
+ JSONStream "^1.0.3"
+ browser-resolve "^1.7.0"
+ cached-path-relative "^1.0.0"
+ concat-stream "~1.6.0"
+ defined "^1.0.0"
+ detective "^5.0.2"
+ duplexer2 "^0.1.2"
+ inherits "^2.0.1"
+ parents "^1.0.0"
+ readable-stream "^2.0.2"
+ resolve "^1.4.0"
+ stream-combiner2 "^1.1.1"
+ subarg "^1.0.0"
+ through2 "^2.0.0"
+ xtend "^4.0.0"
+
+ms@2.0.0:
+ version "2.0.0"
+ resolved "https://registry.yarnpkg.com/ms/-/ms-2.0.0.tgz#5608aeadfc00be6c2901df5f9861788de0d597c8"
+ integrity sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=
+
+mute-stream@~0.0.4:
+ version "0.0.7"
+ resolved "https://registry.yarnpkg.com/mute-stream/-/mute-stream-0.0.7.tgz#3075ce93bc21b8fab43e1bc4da7e8115ed1e7bab"
+ integrity sha1-MHXOk7whuPq0PhvE2n6BFe0ee6s=
+
+nan@^2.9.2:
+ version "2.11.1"
+ resolved "https://registry.yarnpkg.com/nan/-/nan-2.11.1.tgz#90e22bccb8ca57ea4cd37cc83d3819b52eea6766"
+ integrity sha512-iji6k87OSXa0CcrLl9z+ZiYSuR2o+c0bGuNmXdrhTQTakxytAFsC56SArGYoiHlJlFoHSnvmhpceZJaXkVuOtA==
+
+nanomatch@^1.2.9:
+ version "1.2.13"
+ resolved "https://registry.yarnpkg.com/nanomatch/-/nanomatch-1.2.13.tgz#b87a8aa4fc0de8fe6be88895b38983ff265bd119"
+ integrity sha512-fpoe2T0RbHwBTBUOftAfBPaDEi06ufaUai0mE6Yn1kacc3SnTErfb/h+X94VXzI64rKFHYImXSvdwGGCmwOqCA==
+ dependencies:
+ arr-diff "^4.0.0"
+ array-unique "^0.3.2"
+ define-property "^2.0.2"
+ extend-shallow "^3.0.2"
+ fragment-cache "^0.2.1"
+ is-windows "^1.0.2"
+ kind-of "^6.0.2"
+ object.pick "^1.3.0"
+ regex-not "^1.0.0"
+ snapdragon "^0.8.1"
+ to-regex "^3.0.1"
+
+ncp@1.0.x:
+ version "1.0.1"
+ resolved "https://registry.yarnpkg.com/ncp/-/ncp-1.0.1.tgz#d15367e5cb87432ba117d2bf80fdf45aecfb4246"
+ integrity sha1-0VNn5cuHQyuhF9K/gP30Wuz7QkY=
+
+needle@^2.2.1:
+ version "2.2.4"
+ resolved "https://registry.yarnpkg.com/needle/-/needle-2.2.4.tgz#51931bff82533b1928b7d1d69e01f1b00ffd2a4e"
+ integrity sha512-HyoqEb4wr/rsoaIDfTH2aVL9nWtQqba2/HvMv+++m8u0dz808MaagKILxtfeSN7QU7nvbQ79zk3vYOJp9zsNEA==
+ dependencies:
+ debug "^2.1.2"
+ iconv-lite "^0.4.4"
+ sax "^1.2.4"
+
+node-fetch@^1.0.1:
+ version "1.7.3"
+ resolved "https://registry.yarnpkg.com/node-fetch/-/node-fetch-1.7.3.tgz#980f6f72d85211a5347c6b2bc18c5b84c3eb47ef"
+ integrity sha512-NhZ4CsKx7cYm2vSrBAr2PvFOe6sWDf0UYLRqA6svUYg7+/TSfVAu49jYC4BvQ4Sms9SZgdqGBgroqfDhJdTyKQ==
+ dependencies:
+ encoding "^0.1.11"
+ is-stream "^1.0.1"
+
+node-pre-gyp@^0.10.0:
+ version "0.10.3"
+ resolved "https://registry.yarnpkg.com/node-pre-gyp/-/node-pre-gyp-0.10.3.tgz#3070040716afdc778747b61b6887bf78880b80fc"
+ integrity sha512-d1xFs+C/IPS8Id0qPTZ4bUT8wWryfR/OzzAFxweG+uLN85oPzyo2Iw6bVlLQ/JOdgNonXLCoRyqDzDWq4iw72A==
+ dependencies:
+ detect-libc "^1.0.2"
+ mkdirp "^0.5.1"
+ needle "^2.2.1"
+ nopt "^4.0.1"
+ npm-packlist "^1.1.6"
+ npmlog "^4.0.2"
+ rc "^1.2.7"
+ rimraf "^2.6.1"
+ semver "^5.3.0"
+ tar "^4"
+
+nopt@1, nopt@~1.0.10:
+ version "1.0.10"
+ resolved "https://registry.yarnpkg.com/nopt/-/nopt-1.0.10.tgz#6ddd21bd2a31417b92727dd585f8a6f37608ebee"
+ integrity sha1-bd0hvSoxQXuScn3Vhfim83YI6+4=
+ dependencies:
+ abbrev "1"
+
+nopt@^4.0.1:
+ version "4.0.1"
+ resolved "https://registry.yarnpkg.com/nopt/-/nopt-4.0.1.tgz#d0d4685afd5415193c8c7505602d0d17cd64474d"
+ integrity sha1-0NRoWv1UFRk8jHUFYC0NF81kR00=
+ dependencies:
+ abbrev "1"
+ osenv "^0.1.4"
+
+nopt@~3.0.6:
+ version "3.0.6"
+ resolved "https://registry.yarnpkg.com/nopt/-/nopt-3.0.6.tgz#c6465dbf08abcd4db359317f79ac68a646b28ff9"
+ integrity sha1-xkZdvwirzU2zWTF/eaxopkayj/k=
+ dependencies:
+ abbrev "1"
+
+normalize-package-data@^2.3.2, normalize-package-data@^2.3.4:
+ version "2.4.0"
+ resolved "https://registry.yarnpkg.com/normalize-package-data/-/normalize-package-data-2.4.0.tgz#12f95a307d58352075a04907b84ac8be98ac012f"
+ integrity sha512-9jjUFbTPfEy3R/ad/2oNbKtW9Hgovl5O1FvFWKkKblNXoN/Oou6+9+KKohPK13Yc3/TyunyWhJp6gvRNR/PPAw==
+ dependencies:
+ hosted-git-info "^2.1.4"
+ is-builtin-module "^1.0.0"
+ semver "2 || 3 || 4 || 5"
+ validate-npm-package-license "^3.0.1"
+
+normalize-path@^2.0.0, normalize-path@^2.0.1:
+ version "2.1.1"
+ resolved "https://registry.yarnpkg.com/normalize-path/-/normalize-path-2.1.1.tgz#1ab28b556e198363a8c1a6f7e6fa20137fe6aed9"
+ integrity sha1-GrKLVW4Zg2Oowab35vogE3/mrtk=
+ dependencies:
+ remove-trailing-separator "^1.0.1"
+
+npm-bundled@^1.0.1:
+ version "1.0.5"
+ resolved "https://registry.yarnpkg.com/npm-bundled/-/npm-bundled-1.0.5.tgz#3c1732b7ba936b3a10325aef616467c0ccbcc979"
+ integrity sha512-m/e6jgWu8/v5niCUKQi9qQl8QdeEduFA96xHDDzFGqly0OOjI7c+60KM/2sppfnUU9JJagf+zs+yGhqSOFj71g==
+
+npm-packlist@^1.1.6:
+ version "1.1.12"
+ resolved "https://registry.yarnpkg.com/npm-packlist/-/npm-packlist-1.1.12.tgz#22bde2ebc12e72ca482abd67afc51eb49377243a"
+ integrity sha512-WJKFOVMeAlsU/pjXuqVdzU0WfgtIBCupkEVwn+1Y0ERAbUfWw8R4GjgVbaKnUjRoD2FoQbHOCbOyT5Mbs9Lw4g==
+ dependencies:
+ ignore-walk "^3.0.1"
+ npm-bundled "^1.0.1"
+
+npmlog@^4.0.2:
+ version "4.1.2"
+ resolved "https://registry.yarnpkg.com/npmlog/-/npmlog-4.1.2.tgz#08a7f2a8bf734604779a9efa4ad5cc717abb954b"
+ integrity sha512-2uUqazuKlTaSI/dC8AzicUck7+IrEaOnN/e0jd3Xtt1KcGpwx30v50mL7oPyr/h9bL3E4aZccVwpwP+5W9Vjkg==
+ dependencies:
+ are-we-there-yet "~1.1.2"
+ console-control-strings "~1.1.0"
+ gauge "~2.7.3"
+ set-blocking "~2.0.0"
+
+number-is-nan@^1.0.0:
+ version "1.0.1"
+ resolved "https://registry.yarnpkg.com/number-is-nan/-/number-is-nan-1.0.1.tgz#097b602b53422a522c1afb8790318336941a011d"
+ integrity sha1-CXtgK1NCKlIsGvuHkDGDNpQaAR0=
+
+object-assign@^2.0.0:
+ version "2.1.1"
+ resolved "https://registry.yarnpkg.com/object-assign/-/object-assign-2.1.1.tgz#43c36e5d569ff8e4816c4efa8be02d26967c18aa"
+ integrity sha1-Q8NuXVaf+OSBbE76i+AtJpZ8GKo=
+
+object-assign@^4.0.1, object-assign@^4.1.0:
+ version "4.1.1"
+ resolved "https://registry.yarnpkg.com/object-assign/-/object-assign-4.1.1.tgz#2109adc7965887cfc05cbbd442cac8bfbb360863"
+ integrity sha1-IQmtx5ZYh8/AXLvUQsrIv7s2CGM=
+
+object-copy@^0.1.0:
+ version "0.1.0"
+ resolved "https://registry.yarnpkg.com/object-copy/-/object-copy-0.1.0.tgz#7e7d858b781bd7c991a41ba975ed3812754e998c"
+ integrity sha1-fn2Fi3gb18mRpBupde04EnVOmYw=
+ dependencies:
+ copy-descriptor "^0.1.0"
+ define-property "^0.2.5"
+ kind-of "^3.0.3"
+
+object-keys@^1.0.4:
+ version "1.0.12"
+ resolved "https://registry.yarnpkg.com/object-keys/-/object-keys-1.0.12.tgz#09c53855377575310cca62f55bb334abff7b3ed2"
+ integrity sha512-FTMyFUm2wBcGHnH2eXmz7tC6IwlqQZ6mVZ+6dm6vZ4IQIHjs6FdNsQBuKGPuUUUY6NfJw2PshC08Tn6LzLDOag==
+
+object-visit@^1.0.0:
+ version "1.0.1"
+ resolved "https://registry.yarnpkg.com/object-visit/-/object-visit-1.0.1.tgz#f79c4493af0c5377b59fe39d395e41042dd045bb"
+ integrity sha1-95xEk68MU3e1n+OdOV5BBC3QRbs=
+ dependencies:
+ isobject "^3.0.0"
+
+object.omit@^2.0.0:
+ version "2.0.1"
+ resolved "https://registry.yarnpkg.com/object.omit/-/object.omit-2.0.1.tgz#1a9c744829f39dbb858c76ca3579ae2a54ebd1fa"
+ integrity sha1-Gpx0SCnznbuFjHbKNXmuKlTr0fo=
+ dependencies:
+ for-own "^0.1.4"
+ is-extendable "^0.1.1"
+
+object.pick@^1.3.0:
+ version "1.3.0"
+ resolved "https://registry.yarnpkg.com/object.pick/-/object.pick-1.3.0.tgz#87a10ac4c1694bd2e1cbf53591a66141fb5dd747"
+ integrity sha1-h6EKxMFpS9Lhy/U1kaZhQftd10c=
+ dependencies:
+ isobject "^3.0.1"
+
+once@^1.3.0:
+ version "1.4.0"
+ resolved "https://registry.yarnpkg.com/once/-/once-1.4.0.tgz#583b1aa775961d4b113ac17d9c50baef9dd76bd1"
+ integrity sha1-WDsap3WWHUsROsF9nFC6753Xa9E=
+ dependencies:
+ wrappy "1"
+
+os-browserify@~0.1.1:
+ version "0.1.2"
+ resolved "https://registry.yarnpkg.com/os-browserify/-/os-browserify-0.1.2.tgz#49ca0293e0b19590a5f5de10c7f265a617d8fe54"
+ integrity sha1-ScoCk+CxlZCl9d4Qx/JlphfY/lQ=
+
+os-browserify@~0.3.0:
+ version "0.3.0"
+ resolved "https://registry.yarnpkg.com/os-browserify/-/os-browserify-0.3.0.tgz#854373c7f5c2315914fc9bfc6bd8238fdda1ec27"
+ integrity sha1-hUNzx/XCMVkU/Jv8a9gjj92h7Cc=
+
+os-homedir@^1.0.0:
+ version "1.0.2"
+ resolved "https://registry.yarnpkg.com/os-homedir/-/os-homedir-1.0.2.tgz#ffbc4988336e0e833de0c168c7ef152121aa7fb3"
+ integrity sha1-/7xJiDNuDoM94MFox+8VISGqf7M=
+
+os-tmpdir@^1.0.0:
+ version "1.0.2"
+ resolved "https://registry.yarnpkg.com/os-tmpdir/-/os-tmpdir-1.0.2.tgz#bbe67406c79aa85c5cfec766fe5734555dfa1274"
+ integrity sha1-u+Z0BseaqFxc/sdm/lc0VV36EnQ=
+
+osenv@^0.1.4:
+ version "0.1.5"
+ resolved "https://registry.yarnpkg.com/osenv/-/osenv-0.1.5.tgz#85cdfafaeb28e8677f416e287592b5f3f49ea410"
+ integrity sha512-0CWcCECdMVc2Rw3U5w9ZjqX6ga6ubk1xDVKxtBQPK7wis/0F2r9T6k4ydGYhecl7YUBxBVxhL5oisPsNxAPe2g==
+ dependencies:
+ os-homedir "^1.0.0"
+ os-tmpdir "^1.0.0"
+
+outpipe@^1.1.0:
+ version "1.1.1"
+ resolved "https://registry.yarnpkg.com/outpipe/-/outpipe-1.1.1.tgz#50cf8616365e87e031e29a5ec9339a3da4725fa2"
+ integrity sha1-UM+GFjZeh+Ax4ppeyTOaPaRyX6I=
+ dependencies:
+ shell-quote "^1.4.2"
+
+pako@~0.2.0:
+ version "0.2.9"
+ resolved "https://registry.yarnpkg.com/pako/-/pako-0.2.9.tgz#f3f7522f4ef782348da8161bad9ecfd51bf83a75"
+ integrity sha1-8/dSL073gjSNqBYbrZ7P1Rv4OnU=
+
+pako@~1.0.5:
+ version "1.0.7"
+ resolved "https://registry.yarnpkg.com/pako/-/pako-1.0.7.tgz#2473439021b57f1516c82f58be7275ad8ef1bb27"
+ integrity sha512-3HNK5tW4x8o5mO8RuHZp3Ydw9icZXx0RANAOMzlMzx7LVXhMJ4mo3MOBpzyd7r/+RUu8BmndP47LXT+vzjtWcQ==
+
+parents@^1.0.0, parents@^1.0.1:
+ version "1.0.1"
+ resolved "https://registry.yarnpkg.com/parents/-/parents-1.0.1.tgz#fedd4d2bf193a77745fe71e371d73c3307d9c751"
+ integrity sha1-/t1NK/GTp3dF/nHjcdc8MwfZx1E=
+ dependencies:
+ path-platform "~0.11.15"
+
+parse-asn1@^5.0.0:
+ version "5.1.1"
+ resolved "https://registry.yarnpkg.com/parse-asn1/-/parse-asn1-5.1.1.tgz#f6bf293818332bd0dab54efb16087724745e6ca8"
+ integrity sha512-KPx7flKXg775zZpnp9SxJlz00gTd4BmJ2yJufSc44gMCRrRQ7NSzAcSJQfifuOLgW6bEi+ftrALtsgALeB2Adw==
+ dependencies:
+ asn1.js "^4.0.0"
+ browserify-aes "^1.0.0"
+ create-hash "^1.1.0"
+ evp_bytestokey "^1.0.0"
+ pbkdf2 "^3.0.3"
+
+parse-glob@^3.0.4:
+ version "3.0.4"
+ resolved "https://registry.yarnpkg.com/parse-glob/-/parse-glob-3.0.4.tgz#b2c376cfb11f35513badd173ef0bb6e3a388391c"
+ integrity sha1-ssN2z7EfNVE7rdFz7wu246OIORw=
+ dependencies:
+ glob-base "^0.3.0"
+ is-dotfile "^1.0.0"
+ is-extglob "^1.0.0"
+ is-glob "^2.0.0"
+
+parse-json@^2.2.0:
+ version "2.2.0"
+ resolved "https://registry.yarnpkg.com/parse-json/-/parse-json-2.2.0.tgz#f480f40434ef80741f8469099f8dea18f55a4dc9"
+ integrity sha1-9ID0BDTvgHQfhGkJn43qGPVaTck=
+ dependencies:
+ error-ex "^1.2.0"
+
+pascalcase@^0.1.1:
+ version "0.1.1"
+ resolved "https://registry.yarnpkg.com/pascalcase/-/pascalcase-0.1.1.tgz#b363e55e8006ca6fe21784d2db22bd15d7917f14"
+ integrity sha1-s2PlXoAGym/iF4TS2yK9FdeRfxQ=
+
+path-browserify@~0.0.0:
+ version "0.0.1"
+ resolved "https://registry.yarnpkg.com/path-browserify/-/path-browserify-0.0.1.tgz#e6c4ddd7ed3aa27c68a20cc4e50e1a4ee83bbc4a"
+ integrity sha512-BapA40NHICOS+USX9SN4tyhq+A2RrN/Ws5F0Z5aMHDp98Fl86lX8Oti8B7uN93L4Ifv4fHOEA+pQw87gmMO/lQ==
+
+path-exists@^2.0.0:
+ version "2.1.0"
+ resolved "https://registry.yarnpkg.com/path-exists/-/path-exists-2.1.0.tgz#0feb6c64f0fc518d9a754dd5efb62c7022761f4b"
+ integrity sha1-D+tsZPD8UY2adU3V77YscCJ2H0s=
+ dependencies:
+ pinkie-promise "^2.0.0"
+
+path-is-absolute@^1.0.0, path-is-absolute@^1.0.1, path-is-absolute@~1.0.0:
+ version "1.0.1"
+ resolved "https://registry.yarnpkg.com/path-is-absolute/-/path-is-absolute-1.0.1.tgz#174b9268735534ffbc7ace6bf53a5a9e1b5c5f5f"
+ integrity sha1-F0uSaHNVNP+8es5r9TpanhtcX18=
+
+path-parse@^1.0.5:
+ version "1.0.6"
+ resolved "https://registry.yarnpkg.com/path-parse/-/path-parse-1.0.6.tgz#d62dbb5679405d72c4737ec58600e9ddcf06d24c"
+ integrity sha512-GSmOT2EbHrINBf9SR7CDELwlJ8AENk3Qn7OikK4nFYAu3Ote2+JYNVvkpAEQm3/TLNEJFD/xZJjzyxg3KBWOzw==
+
+path-platform@~0.11.15:
+ version "0.11.15"
+ resolved "https://registry.yarnpkg.com/path-platform/-/path-platform-0.11.15.tgz#e864217f74c36850f0852b78dc7bf7d4a5721bf2"
+ integrity sha1-6GQhf3TDaFDwhSt43Hv31KVyG/I=
+
+path-type@^1.0.0:
+ version "1.1.0"
+ resolved "https://registry.yarnpkg.com/path-type/-/path-type-1.1.0.tgz#59c44f7ee491da704da415da5a4070ba4f8fe441"
+ integrity sha1-WcRPfuSR2nBNpBXaWkBwuk+P5EE=
+ dependencies:
+ graceful-fs "^4.1.2"
+ pify "^2.0.0"
+ pinkie-promise "^2.0.0"
+
+pbkdf2@^3.0.3:
+ version "3.0.17"
+ resolved "https://registry.yarnpkg.com/pbkdf2/-/pbkdf2-3.0.17.tgz#976c206530617b14ebb32114239f7b09336e93a6"
+ integrity sha512-U/il5MsrZp7mGg3mSQfn742na2T+1/vHDCG5/iTI3X9MKUuYUZVLQhyRsg06mCgDBTd57TxzgZt7P+fYfjRLtA==
+ dependencies:
+ create-hash "^1.1.2"
+ create-hmac "^1.1.4"
+ ripemd160 "^2.0.1"
+ safe-buffer "^5.0.1"
+ sha.js "^2.4.8"
+
+pify@^2.0.0:
+ version "2.3.0"
+ resolved "https://registry.yarnpkg.com/pify/-/pify-2.3.0.tgz#ed141a6ac043a849ea588498e7dca8b15330e90c"
+ integrity sha1-7RQaasBDqEnqWISY59yosVMw6Qw=
+
+pinkie-promise@^2.0.0:
+ version "2.0.1"
+ resolved "https://registry.yarnpkg.com/pinkie-promise/-/pinkie-promise-2.0.1.tgz#2135d6dfa7a358c069ac9b178776288228450ffa"
+ integrity sha1-ITXW36ejWMBprJsXh3YogihFD/o=
+ dependencies:
+ pinkie "^2.0.0"
+
+pinkie@^2.0.0:
+ version "2.0.4"
+ resolved "https://registry.yarnpkg.com/pinkie/-/pinkie-2.0.4.tgz#72556b80cfa0d48a974e80e77248e80ed4f7f870"
+ integrity sha1-clVrgM+g1IqXToDnckjoDtT3+HA=
+
+pkginfo@0.3.x:
+ version "0.3.1"
+ resolved "https://registry.yarnpkg.com/pkginfo/-/pkginfo-0.3.1.tgz#5b29f6a81f70717142e09e765bbeab97b4f81e21"
+ integrity sha1-Wyn2qB9wcXFC4J52W76rl7T4HiE=
+
+pkginfo@0.x.x:
+ version "0.4.1"
+ resolved "https://registry.yarnpkg.com/pkginfo/-/pkginfo-0.4.1.tgz#b5418ef0439de5425fc4995042dced14fb2a84ff"
+ integrity sha1-tUGO8EOd5UJfxJlQQtztFPsqhP8=
+
+posix-character-classes@^0.1.0:
+ version "0.1.1"
+ resolved "https://registry.yarnpkg.com/posix-character-classes/-/posix-character-classes-0.1.1.tgz#01eac0fe3b5af71a2a6c02feabb8c1fef7e00eab"
+ integrity sha1-AerA/jta9xoqbAL+q7jB/vfgDqs=
+
+preserve@^0.2.0:
+ version "0.2.0"
+ resolved "https://registry.yarnpkg.com/preserve/-/preserve-0.2.0.tgz#815ed1f6ebc65926f865b310c0713bcb3315ce4b"
+ integrity sha1-gV7R9uvGWSb4ZbMQwHE7yzMVzks=
+
+private@^0.1.6, private@~0.1.5:
+ version "0.1.8"
+ resolved "https://registry.yarnpkg.com/private/-/private-0.1.8.tgz#2381edb3689f7a53d653190060fcf822d2f368ff"
+ integrity sha512-VvivMrbvd2nKkiG38qjULzlc+4Vx4wm/whI9pQD35YrARNnhxeiRktSOhSukRLFNlzg6Br/cJPet5J/u19r/mg==
+
+process-nextick-args@~1.0.6:
+ version "1.0.7"
+ resolved "https://registry.yarnpkg.com/process-nextick-args/-/process-nextick-args-1.0.7.tgz#150e20b756590ad3f91093f25a4f2ad8bff30ba3"
+ integrity sha1-FQ4gt1ZZCtP5EJPyWk8q2L/zC6M=
+
+process-nextick-args@~2.0.0:
+ version "2.0.0"
+ resolved "https://registry.yarnpkg.com/process-nextick-args/-/process-nextick-args-2.0.0.tgz#a37d732f4271b4ab1ad070d35508e8290788ffaa"
+ integrity sha512-MtEC1TqN0EU5nephaJ4rAtThHtC86dNN9qCuEhtshvpVBkAW5ZO7BASN9REnF9eoXGcRub+pFuKEpOHE+HbEMw==
+
+process@~0.11.0:
+ version "0.11.10"
+ resolved "https://registry.yarnpkg.com/process/-/process-0.11.10.tgz#7332300e840161bda3e69a1d1d91a7d4bc16f182"
+ integrity sha1-czIwDoQBYb2j5podHZGn1LwW8YI=
+
+promise@^7.0.3, promise@^7.1.1:
+ version "7.3.1"
+ resolved "https://registry.yarnpkg.com/promise/-/promise-7.3.1.tgz#064b72602b18f90f29192b8b1bc418ffd1ebd3bf"
+ integrity sha512-nolQXZ/4L+bP/UGlkfaIujX9BKxGwmQ9OT4mOt5yvy8iK1h3wqTEJCijzGANTCCl9nWjY41juyAn2K3Q1hLLTg==
+ dependencies:
+ asap "~2.0.3"
+
+prompt@^1.0.0:
+ version "1.0.0"
+ resolved "https://registry.yarnpkg.com/prompt/-/prompt-1.0.0.tgz#8e57123c396ab988897fb327fd3aedc3e735e4fe"
+ integrity sha1-jlcSPDlquYiJf7Mn/Trtw+c15P4=
+ dependencies:
+ colors "^1.1.2"
+ pkginfo "0.x.x"
+ read "1.0.x"
+ revalidator "0.1.x"
+ utile "0.3.x"
+ winston "2.1.x"
+
+proxyquire@~1.3.1:
+ version "1.3.2"
+ resolved "https://registry.yarnpkg.com/proxyquire/-/proxyquire-1.3.2.tgz#d6e801ac00b0c05efb20947ba34738b5aa02f48d"
+ integrity sha1-1ugBrACwwF77IJR7o0c4taoC9I0=
+
+public-encrypt@^4.0.0:
+ version "4.0.3"
+ resolved "https://registry.yarnpkg.com/public-encrypt/-/public-encrypt-4.0.3.tgz#4fcc9d77a07e48ba7527e7cbe0de33d0701331e0"
+ integrity sha512-zVpa8oKZSz5bTMTFClc1fQOnyyEzpl5ozpi1B5YcvBrdohMjH2rfsBtyXcuNuwjsDIXmBYlF2N5FlJYhR29t8Q==
+ dependencies:
+ bn.js "^4.1.0"
+ browserify-rsa "^4.0.0"
+ create-hash "^1.1.0"
+ parse-asn1 "^5.0.0"
+ randombytes "^2.0.1"
+ safe-buffer "^5.1.2"
+
+punycode@1.3.2:
+ version "1.3.2"
+ resolved "https://registry.yarnpkg.com/punycode/-/punycode-1.3.2.tgz#9653a036fb7c1ee42342f2325cceefea3926c48d"
+ integrity sha1-llOgNvt8HuQjQvIyXM7v6jkmxI0=
+
+punycode@^1.3.2:
+ version "1.4.1"
+ resolved "https://registry.yarnpkg.com/punycode/-/punycode-1.4.1.tgz#c0d5a63b2718800ad8e1eb0fa5269c84dd41845e"
+ integrity sha1-wNWmOycYgArY4esPpSachN1BhF4=
+
+q@^1.1.2:
+ version "1.5.1"
+ resolved "https://registry.yarnpkg.com/q/-/q-1.5.1.tgz#7e32f75b41381291d04611f1bf14109ac00651d7"
+ integrity sha1-fjL3W0E4EpHQRhHxvxQQmsAGUdc=
+
+q@~0.8.11:
+ version "0.8.12"
+ resolved "https://registry.yarnpkg.com/q/-/q-0.8.12.tgz#9162a91e11819c4bcda7da15cf5fefaad0778823"
+ integrity sha1-kWKpHhGBnEvNp9oVz1/vqtB3iCM=
+
+querystring-es3@~0.2.0:
+ version "0.2.1"
+ resolved "https://registry.yarnpkg.com/querystring-es3/-/querystring-es3-0.2.1.tgz#9ec61f79049875707d69414596fd907a4d711e73"
+ integrity sha1-nsYfeQSYdXB9aUFFlv2Qek1xHnM=
+
+querystring@0.2.0:
+ version "0.2.0"
+ resolved "https://registry.yarnpkg.com/querystring/-/querystring-0.2.0.tgz#b209849203bb25df820da756e747005878521620"
+ integrity sha1-sgmEkgO7Jd+CDadW50cAWHhSFiA=
+
+randomatic@^3.0.0:
+ version "3.1.1"
+ resolved "https://registry.yarnpkg.com/randomatic/-/randomatic-3.1.1.tgz#b776efc59375984e36c537b2f51a1f0aff0da1ed"
+ integrity sha512-TuDE5KxZ0J461RVjrJZCJc+J+zCkTb1MbH9AQUq68sMhOMcy9jLcb3BrZKgp9q9Ncltdg4QVqWrH02W2EFFVYw==
+ dependencies:
+ is-number "^4.0.0"
+ kind-of "^6.0.0"
+ math-random "^1.0.1"
+
+randombytes@^2.0.0, randombytes@^2.0.1, randombytes@^2.0.5:
+ version "2.0.6"
+ resolved "https://registry.yarnpkg.com/randombytes/-/randombytes-2.0.6.tgz#d302c522948588848a8d300c932b44c24231da80"
+ integrity sha512-CIQ5OFxf4Jou6uOKe9t1AOgqpeU5fd70A8NPdHSGeYXqXsPe6peOwI0cUl88RWZ6sP1vPMV3avd/R6cZ5/sP1A==
+ dependencies:
+ safe-buffer "^5.1.0"
+
+randomfill@^1.0.3:
+ version "1.0.4"
+ resolved "https://registry.yarnpkg.com/randomfill/-/randomfill-1.0.4.tgz#c92196fc86ab42be983f1bf31778224931d61458"
+ integrity sha512-87lcbR8+MhcWcUiQ+9e+Rwx8MyR2P7qnt15ynUlbm3TU/fjbgz4GsvfSUDTemtCCtVCqb4ZcEFlyPNTh9bBTLw==
+ dependencies:
+ randombytes "^2.0.5"
+ safe-buffer "^5.1.0"
+
+rc@^1.2.7:
+ version "1.2.8"
+ resolved "https://registry.yarnpkg.com/rc/-/rc-1.2.8.tgz#cd924bf5200a075b83c188cd6b9e211b7fc0d3ed"
+ integrity sha512-y3bGgqKj3QBdxLbLkomlohkvsA8gdAiUQlSBJnBhfn+BPxg4bc62d8TcBW15wavDfgexCgccckhcZvywyQYPOw==
+ dependencies:
+ deep-extend "^0.6.0"
+ ini "~1.3.0"
+ minimist "^1.2.0"
+ strip-json-comments "~2.0.1"
+
+react-tools@^0.13.0:
+ version "0.13.3"
+ resolved "https://registry.yarnpkg.com/react-tools/-/react-tools-0.13.3.tgz#da6ac7d4d7777a59a5e951cf46e72fd4b6b40a2c"
+ integrity sha1-2mrH1Nd3elml6VHPRucv1La0Ciw=
+ dependencies:
+ commoner "^0.10.0"
+ jstransform "^10.1.0"
+
+react@^0.13.1:
+ version "0.13.3"
+ resolved "https://registry.yarnpkg.com/react/-/react-0.13.3.tgz#a2dfa85335d7dc02b82b482f089582e64cc13356"
+ integrity sha1-ot+oUzXX3AK4K0gvCJWC5kzBM1Y=
+ dependencies:
+ envify "^3.0.0"
+
+read-only-stream@^1.1.1:
+ version "1.1.1"
+ resolved "https://registry.yarnpkg.com/read-only-stream/-/read-only-stream-1.1.1.tgz#5da77c799ed1388d3ef88a18471bb5924f8a0ba1"
+ integrity sha1-Xad8eZ7ROI0++IoYRxu1kk+KC6E=
+ dependencies:
+ readable-stream "^1.0.31"
+ readable-wrap "^1.0.0"
+
+read-only-stream@^2.0.0:
+ version "2.0.0"
+ resolved "https://registry.yarnpkg.com/read-only-stream/-/read-only-stream-2.0.0.tgz#2724fd6a8113d73764ac288d4386270c1dbf17f0"
+ integrity sha1-JyT9aoET1zdkrCiNQ4YnDB2/F/A=
+ dependencies:
+ readable-stream "^2.0.2"
+
+read-pkg-up@^1.0.1:
+ version "1.0.1"
+ resolved "https://registry.yarnpkg.com/read-pkg-up/-/read-pkg-up-1.0.1.tgz#9d63c13276c065918d57f002a57f40a1b643fb02"
+ integrity sha1-nWPBMnbAZZGNV/ACpX9AobZD+wI=
+ dependencies:
+ find-up "^1.0.0"
+ read-pkg "^1.0.0"
+
+read-pkg@^1.0.0:
+ version "1.1.0"
+ resolved "https://registry.yarnpkg.com/read-pkg/-/read-pkg-1.1.0.tgz#f5ffaa5ecd29cb31c0474bca7d756b6bb29e3f28"
+ integrity sha1-9f+qXs0pyzHAR0vKfXVra7KePyg=
+ dependencies:
+ load-json-file "^1.0.0"
+ normalize-package-data "^2.3.2"
+ path-type "^1.0.0"
+
+read@1.0.x:
+ version "1.0.7"
+ resolved "https://registry.yarnpkg.com/read/-/read-1.0.7.tgz#b3da19bd052431a97671d44a42634adf710b40c4"
+ integrity sha1-s9oZvQUkMal2cdRKQmNK33ELQMQ=
+ dependencies:
+ mute-stream "~0.0.4"
+
+readable-stream@1.1:
+ version "1.1.13"
+ resolved "https://registry.yarnpkg.com/readable-stream/-/readable-stream-1.1.13.tgz#f6eef764f514c89e2b9e23146a75ba106756d23e"
+ integrity sha1-9u73ZPUUyJ4rniMUanW6EGdW0j4=
+ dependencies:
+ core-util-is "~1.0.0"
+ inherits "~2.0.1"
+ isarray "0.0.1"
+ string_decoder "~0.10.x"
+
+"readable-stream@>=1.1.13-1 <1.2.0-0", readable-stream@^1.0.31, readable-stream@^1.1.13, readable-stream@^1.1.13-1, readable-stream@~1.1.9:
+ version "1.1.14"
+ resolved "https://registry.yarnpkg.com/readable-stream/-/readable-stream-1.1.14.tgz#7cf4c54ef648e3813084c636dd2079e166c081d9"
+ integrity sha1-fPTFTvZI44EwhMY23SB54WbAgdk=
+ dependencies:
+ core-util-is "~1.0.0"
+ inherits "~2.0.1"
+ isarray "0.0.1"
+ string_decoder "~0.10.x"
+
+readable-stream@^2.0.2, readable-stream@^2.0.6, readable-stream@^2.2.2, readable-stream@^2.3.6, readable-stream@~2.3.6:
+ version "2.3.6"
+ resolved "https://registry.yarnpkg.com/readable-stream/-/readable-stream-2.3.6.tgz#b11c27d88b8ff1fbe070643cf94b0c79ae1b0aaf"
+ integrity sha512-tQtKA9WIAhBF3+VLAseyMqZeBjW0AHJoxOtYqSUZNJxauErmLbVm2FW1y+J/YA9dUrAC39ITejlZWhVIwawkKw==
+ dependencies:
+ core-util-is "~1.0.0"
+ inherits "~2.0.3"
+ isarray "~1.0.0"
+ process-nextick-args "~2.0.0"
+ safe-buffer "~5.1.1"
+ string_decoder "~1.1.1"
+ util-deprecate "~1.0.1"
+
+readable-stream@~1.0.17:
+ version "1.0.34"
+ resolved "https://registry.yarnpkg.com/readable-stream/-/readable-stream-1.0.34.tgz#125820e34bc842d2f2aaafafe4c2916ee32c157c"
+ integrity sha1-Elgg40vIQtLyqq+v5MKRbuMsFXw=
+ dependencies:
+ core-util-is "~1.0.0"
+ inherits "~2.0.1"
+ isarray "0.0.1"
+ string_decoder "~0.10.x"
+
+readable-stream@~2.0.0:
+ version "2.0.6"
+ resolved "https://registry.yarnpkg.com/readable-stream/-/readable-stream-2.0.6.tgz#8f90341e68a53ccc928788dacfcd11b36eb9b78e"
+ integrity sha1-j5A0HmilPMySh4jaz80Rs265t44=
+ dependencies:
+ core-util-is "~1.0.0"
+ inherits "~2.0.1"
+ isarray "~1.0.0"
+ process-nextick-args "~1.0.6"
+ string_decoder "~0.10.x"
+ util-deprecate "~1.0.1"
+
+readable-wrap@^1.0.0:
+ version "1.0.0"
+ resolved "https://registry.yarnpkg.com/readable-wrap/-/readable-wrap-1.0.0.tgz#3b5a211c631e12303a54991c806c17e7ae206bff"
+ integrity sha1-O1ohHGMeEjA6VJkcgGwX564ga/8=
+ dependencies:
+ readable-stream "^1.1.13-1"
+
+readdirp@^2.0.0:
+ version "2.2.1"
+ resolved "https://registry.yarnpkg.com/readdirp/-/readdirp-2.2.1.tgz#0e87622a3325aa33e892285caf8b4e846529a525"
+ integrity sha512-1JU/8q+VgFZyxwrJ+SVIOsh+KywWGpds3NTqikiKpDMZWScmAYyKIgqkO+ARvNWJfXeXR1zxz7aHF4u4CyH6vQ==
+ dependencies:
+ graceful-fs "^4.1.11"
+ micromatch "^3.1.10"
+ readable-stream "^2.0.2"
+
+recast@^0.11.17:
+ version "0.11.23"
+ resolved "https://registry.yarnpkg.com/recast/-/recast-0.11.23.tgz#451fd3004ab1e4df9b4e4b66376b2a21912462d3"
+ integrity sha1-RR/TAEqx5N+bTktmN2sqIZEkYtM=
+ dependencies:
+ ast-types "0.9.6"
+ esprima "~3.1.0"
+ private "~0.1.5"
+ source-map "~0.5.0"
+
+redent@^1.0.0:
+ version "1.0.0"
+ resolved "https://registry.yarnpkg.com/redent/-/redent-1.0.0.tgz#cf916ab1fd5f1f16dfb20822dd6ec7f730c2afde"
+ integrity sha1-z5Fqsf1fHxbfsggi3W7H9zDCr94=
+ dependencies:
+ indent-string "^2.1.0"
+ strip-indent "^1.0.1"
+
+regex-cache@^0.4.2:
+ version "0.4.4"
+ resolved "https://registry.yarnpkg.com/regex-cache/-/regex-cache-0.4.4.tgz#75bdc58a2a1496cec48a12835bc54c8d562336dd"
+ integrity sha512-nVIZwtCjkC9YgvWkpM55B5rBhBYRZhAaJbgcFYXXsHnbZ9UZI9nnVWYZpBlCqv9ho2eZryPnWrZGsOdPwVWXWQ==
+ dependencies:
+ is-equal-shallow "^0.1.3"
+
+regex-not@^1.0.0, regex-not@^1.0.2:
+ version "1.0.2"
+ resolved "https://registry.yarnpkg.com/regex-not/-/regex-not-1.0.2.tgz#1f4ece27e00b0b65e0247a6810e6a85d83a5752c"
+ integrity sha512-J6SDjUgDxQj5NusnOtdFxDwN/+HWykR8GELwctJ7mdqhcyy1xEc4SRFHUXvxTp661YaVKAjfRLZ9cCqS6tn32A==
+ dependencies:
+ extend-shallow "^3.0.2"
+ safe-regex "^1.1.0"
+
+remove-trailing-separator@^1.0.1:
+ version "1.1.0"
+ resolved "https://registry.yarnpkg.com/remove-trailing-separator/-/remove-trailing-separator-1.1.0.tgz#c24bce2a283adad5bc3f58e0d48249b92379d8ef"
+ integrity sha1-wkvOKig62tW8P1jg1IJJuSN52O8=
+
+repeat-element@^1.1.2:
+ version "1.1.3"
+ resolved "https://registry.yarnpkg.com/repeat-element/-/repeat-element-1.1.3.tgz#782e0d825c0c5a3bb39731f84efee6b742e6b1ce"
+ integrity sha512-ahGq0ZnV5m5XtZLMb+vP76kcAM5nkLqk0lpqAuojSKGgQtn4eRi4ZZGm2olo2zKFH+sMsWaqOCW1dqAnOru72g==
+
+repeat-string@^1.5.2, repeat-string@^1.6.1:
+ version "1.6.1"
+ resolved "https://registry.yarnpkg.com/repeat-string/-/repeat-string-1.6.1.tgz#8dcae470e1c88abc2d600fff4a776286da75e637"
+ integrity sha1-jcrkcOHIirwtYA//Sndihtp15jc=
+
+repeating@^2.0.0:
+ version "2.0.1"
+ resolved "https://registry.yarnpkg.com/repeating/-/repeating-2.0.1.tgz#5214c53a926d3552707527fbab415dbc08d06dda"
+ integrity sha1-UhTFOpJtNVJwdSf7q0FdvAjQbdo=
+ dependencies:
+ is-finite "^1.0.0"
+
+requirejs@>=0.27.1, requirejs@~2.3.6:
+ version "2.3.6"
+ resolved "https://registry.yarnpkg.com/requirejs/-/requirejs-2.3.6.tgz#e5093d9601c2829251258c0b9445d4d19fa9e7c9"
+ integrity sha512-ipEzlWQe6RK3jkzikgCupiTbTvm4S0/CAU5GlgptkN5SO6F3u0UD0K18wy6ErDqiCyP4J4YYe1HuAShvsxePLg==
+
+resolve-url@^0.2.1:
+ version "0.2.1"
+ resolved "https://registry.yarnpkg.com/resolve-url/-/resolve-url-0.2.1.tgz#2c637fe77c893afd2a663fe21aa9080068e2052a"
+ integrity sha1-LGN/53yJOv0qZj/iGqkIAGjiBSo=
+
+resolve@1.1.7, resolve@~1.1.0:
+ version "1.1.7"
+ resolved "https://registry.yarnpkg.com/resolve/-/resolve-1.1.7.tgz#203114d82ad2c5ed9e8e0411b3932875e889e97b"
+ integrity sha1-IDEU2CrSxe2ejgQRs5ModeiJ6Xs=
+
+resolve@^1.1.3, resolve@^1.1.4, resolve@^1.1.6, resolve@^1.4.0:
+ version "1.8.1"
+ resolved "https://registry.yarnpkg.com/resolve/-/resolve-1.8.1.tgz#82f1ec19a423ac1fbd080b0bab06ba36e84a7a26"
+ integrity sha512-AicPrAC7Qu1JxPCZ9ZgCZlY35QgFnNqc+0LtbRNxnVw4TXvjQ72wnuL9JQcEBgXkI9JM8MsT9kaQoHcpCRJOYA==
+ dependencies:
+ path-parse "^1.0.5"
+
+ret@~0.1.10:
+ version "0.1.15"
+ resolved "https://registry.yarnpkg.com/ret/-/ret-0.1.15.tgz#b8a4825d5bdb1fc3f6f53c2bc33f81388681c7bc"
+ integrity sha512-TTlYpa+OL+vMMNG24xSlQGEJ3B/RzEfUlLct7b5G/ytav+wPrplCpVMFuwzXbkecJrb6IYo1iFb0S9v37754mg==
+
+revalidator@0.1.x:
+ version "0.1.8"
+ resolved "https://registry.yarnpkg.com/revalidator/-/revalidator-0.1.8.tgz#fece61bfa0c1b52a206bd6b18198184bdd523a3b"
+ integrity sha1-/s5hv6DBtSoga9axgZgYS91SOjs=
+
+rewire@~2.1.5:
+ version "2.1.5"
+ resolved "https://registry.yarnpkg.com/rewire/-/rewire-2.1.5.tgz#764599179cae5e393839bf3ad6e0be371ee49d81"
+ integrity sha1-dkWZF5yuXjk4Ob861uC+Nx7knYE=
+
+rimraf@2.x.x, rimraf@^2.6.1, rimraf@~2.6.2:
+ version "2.6.2"
+ resolved "https://registry.yarnpkg.com/rimraf/-/rimraf-2.6.2.tgz#2ed8150d24a16ea8651e6d6ef0f47c4158ce7a36"
+ integrity sha512-lreewLK/BlghmxtfH36YYVg1i8IAce4TI7oao75I1g245+6BctqTVQiBP3YUJ9C6DQOXJmkYR9X9fCLtCOJc5w==
+ dependencies:
+ glob "^7.0.5"
+
+rimraf@~2.2.1, rimraf@~2.2.8:
+ version "2.2.8"
+ resolved "https://registry.yarnpkg.com/rimraf/-/rimraf-2.2.8.tgz#e439be2aaee327321952730f99a8929e4fc50582"
+ integrity sha1-5Dm+Kq7jJzIZUnMPmaiSnk/FBYI=
+
+ripemd160@^2.0.0, ripemd160@^2.0.1:
+ version "2.0.2"
+ resolved "https://registry.yarnpkg.com/ripemd160/-/ripemd160-2.0.2.tgz#a1c1a6f624751577ba5d07914cbc92850585890c"
+ integrity sha512-ii4iagi25WusVoiC4B4lq7pbXfAp3D9v5CwfkY33vffw2+pkDjY1D8GaN7spsxvCSx8dkPqOZCEZyfxcmJG2IA==
+ dependencies:
+ hash-base "^3.0.0"
+ inherits "^2.0.1"
+
+safe-buffer@^5.0.1, safe-buffer@^5.1.0, safe-buffer@^5.1.1, safe-buffer@^5.1.2, safe-buffer@~5.1.0, safe-buffer@~5.1.1:
+ version "5.1.2"
+ resolved "https://registry.yarnpkg.com/safe-buffer/-/safe-buffer-5.1.2.tgz#991ec69d296e0313747d59bdfd2b745c35f8828d"
+ integrity sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==
+
+safe-regex@^1.1.0:
+ version "1.1.0"
+ resolved "https://registry.yarnpkg.com/safe-regex/-/safe-regex-1.1.0.tgz#40a3669f3b077d1e943d44629e157dd48023bf2e"
+ integrity sha1-QKNmnzsHfR6UPURinhV91IAjvy4=
+ dependencies:
+ ret "~0.1.10"
+
+"safer-buffer@>= 2.1.2 < 3":
+ version "2.1.2"
+ resolved "https://registry.yarnpkg.com/safer-buffer/-/safer-buffer-2.1.2.tgz#44fa161b0187b9549dd84bb91802f9bd8385cd6a"
+ integrity sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==
+
+sax@^1.2.4:
+ version "1.2.4"
+ resolved "https://registry.yarnpkg.com/sax/-/sax-1.2.4.tgz#2816234e2378bddc4e5354fab5caa895df7100d9"
+ integrity sha512-NqVDv9TpANUjFm0N8uM5GxL36UgKi9/atZw+x7YFnQ8ckwFGKrl4xX4yWtrey3UJm5nP1kUbnYgLopqWNSRhWw==
+
+"semver@2 || 3 || 4 || 5", semver@^5.3.0:
+ version "5.6.0"
+ resolved "https://registry.yarnpkg.com/semver/-/semver-5.6.0.tgz#7e74256fbaa49c75aa7c7a205cc22799cac80004"
+ integrity sha512-RS9R6R35NYgQn++fkDWaOmqGoj4Ek9gGs+DPxNUZKuwE183xjJroKvyo1IzVFeXvUrvmALy6FWD5xrdJT25gMg==
+
+set-blocking@~2.0.0:
+ version "2.0.0"
+ resolved "https://registry.yarnpkg.com/set-blocking/-/set-blocking-2.0.0.tgz#045f9782d011ae9a6803ddd382b24392b3d890f7"
+ integrity sha1-BF+XgtARrppoA93TgrJDkrPYkPc=
+
+set-value@^0.4.3:
+ version "0.4.3"
+ resolved "https://registry.yarnpkg.com/set-value/-/set-value-0.4.3.tgz#7db08f9d3d22dc7f78e53af3c3bf4666ecdfccf1"
+ integrity sha1-fbCPnT0i3H945Trzw79GZuzfzPE=
+ dependencies:
+ extend-shallow "^2.0.1"
+ is-extendable "^0.1.1"
+ is-plain-object "^2.0.1"
+ to-object-path "^0.3.0"
+
+set-value@^2.0.0:
+ version "2.0.0"
+ resolved "https://registry.yarnpkg.com/set-value/-/set-value-2.0.0.tgz#71ae4a88f0feefbbf52d1ea604f3fb315ebb6274"
+ integrity sha512-hw0yxk9GT/Hr5yJEYnHNKYXkIA8mVJgd9ditYZCe16ZczcaELYYcfvaXesNACk2O8O0nTiPQcQhGUQj8JLzeeg==
+ dependencies:
+ extend-shallow "^2.0.1"
+ is-extendable "^0.1.1"
+ is-plain-object "^2.0.3"
+ split-string "^3.0.1"
+
+setimmediate@^1.0.5:
+ version "1.0.5"
+ resolved "https://registry.yarnpkg.com/setimmediate/-/setimmediate-1.0.5.tgz#290cbb232e306942d7d7ea9b83732ab7856f8285"
+ integrity sha1-KQy7Iy4waULX1+qbg3Mqt4VvgoU=
+
+sha.js@^2.4.0, sha.js@^2.4.8, sha.js@~2.4.4:
+ version "2.4.11"
+ resolved "https://registry.yarnpkg.com/sha.js/-/sha.js-2.4.11.tgz#37a5cf0b81ecbc6943de109ba2960d1b26584ae7"
+ integrity sha512-QMEp5B7cftE7APOjk5Y6xgrbWu+WkLVQwk8JNjZ8nKRciZaByEW6MubieAiToS7+dwvrjGhH8jRXz3MVd0AYqQ==
+ dependencies:
+ inherits "^2.0.1"
+ safe-buffer "^5.0.1"
+
+shasum@^1.0.0:
+ version "1.0.2"
+ resolved "https://registry.yarnpkg.com/shasum/-/shasum-1.0.2.tgz#e7012310d8f417f4deb5712150e5678b87ae565f"
+ integrity sha1-5wEjENj0F/TetXEhUOVni4euVl8=
+ dependencies:
+ json-stable-stringify "~0.0.0"
+ sha.js "~2.4.4"
+
+shell-quote@^1.4.2, shell-quote@^1.6.1:
+ version "1.6.1"
+ resolved "https://registry.yarnpkg.com/shell-quote/-/shell-quote-1.6.1.tgz#f4781949cce402697127430ea3b3c5476f481767"
+ integrity sha1-9HgZSczkAmlxJ0MOo7PFR29IF2c=
+ dependencies:
+ array-filter "~0.0.0"
+ array-map "~0.0.0"
+ array-reduce "~0.0.0"
+ jsonify "~0.0.0"
+
+shell-quote@~0.0.1:
+ version "0.0.1"
+ resolved "https://registry.yarnpkg.com/shell-quote/-/shell-quote-0.0.1.tgz#1a41196f3c0333c482323593d6886ecf153dd986"
+ integrity sha1-GkEZbzwDM8SCMjWT1ohuzxU92YY=
+
+shelljs@0.1.x:
+ version "0.1.4"
+ resolved "https://registry.yarnpkg.com/shelljs/-/shelljs-0.1.4.tgz#dfbbe78d56c3c0168d2fb79e10ecd1dbcb07ec0e"
+ integrity sha1-37vnjVbDwBaNL7eeEOzR28sH7A4=
+
+shelljs@0.3.x:
+ version "0.3.0"
+ resolved "https://registry.yarnpkg.com/shelljs/-/shelljs-0.3.0.tgz#3596e6307a781544f591f37da618360f31db57b1"
+ integrity sha1-NZbmMHp4FUT1kfN9phg2DzHbV7E=
+
+sigmund@~1.0.0:
+ version "1.0.1"
+ resolved "https://registry.yarnpkg.com/sigmund/-/sigmund-1.0.1.tgz#3ff21f198cad2175f9f3b781853fd94d0d19b590"
+ integrity sha1-P/IfGYytIXX587eBhT/ZTQ0ZtZA=
+
+signal-exit@^3.0.0:
+ version "3.0.2"
+ resolved "https://registry.yarnpkg.com/signal-exit/-/signal-exit-3.0.2.tgz#b5fdc08f1287ea1178628e415e25132b73646c6d"
+ integrity sha1-tf3AjxKH6hF4Yo5BXiUTK3NkbG0=
+
+simple-concat@^1.0.0:
+ version "1.0.0"
+ resolved "https://registry.yarnpkg.com/simple-concat/-/simple-concat-1.0.0.tgz#7344cbb8b6e26fb27d66b2fc86f9f6d5997521c6"
+ integrity sha1-c0TLuLbib7J9ZrL8hvn21Zl1IcY=
+
+snapdragon-node@^2.0.1:
+ version "2.1.1"
+ resolved "https://registry.yarnpkg.com/snapdragon-node/-/snapdragon-node-2.1.1.tgz#6c175f86ff14bdb0724563e8f3c1b021a286853b"
+ integrity sha512-O27l4xaMYt/RSQ5TR3vpWCAB5Kb/czIcqUFOM/C4fYcLnbZUc1PkjTAMjof2pBWaSTwOUd6qUHcFGVGj7aIwnw==
+ dependencies:
+ define-property "^1.0.0"
+ isobject "^3.0.0"
+ snapdragon-util "^3.0.1"
+
+snapdragon-util@^3.0.1:
+ version "3.0.1"
+ resolved "https://registry.yarnpkg.com/snapdragon-util/-/snapdragon-util-3.0.1.tgz#f956479486f2acd79700693f6f7b805e45ab56e2"
+ integrity sha512-mbKkMdQKsjX4BAL4bRYTj21edOf8cN7XHdYUJEe+Zn99hVEYcMvKPct1IqNe7+AZPirn8BCDOQBHQZknqmKlZQ==
+ dependencies:
+ kind-of "^3.2.0"
+
+snapdragon@^0.8.1:
+ version "0.8.2"
+ resolved "https://registry.yarnpkg.com/snapdragon/-/snapdragon-0.8.2.tgz#64922e7c565b0e14204ba1aa7d6964278d25182d"
+ integrity sha512-FtyOnWN/wCHTVXOMwvSv26d+ko5vWlIDD6zoUJ7LW8vh+ZBC8QdljveRP+crNrtBwioEUWy/4dMtbBjA4ioNlg==
+ dependencies:
+ base "^0.11.1"
+ debug "^2.2.0"
+ define-property "^0.2.5"
+ extend-shallow "^2.0.1"
+ map-cache "^0.2.2"
+ source-map "^0.5.6"
+ source-map-resolve "^0.5.0"
+ use "^3.1.0"
+
+source-map-resolve@^0.5.0:
+ version "0.5.2"
+ resolved "https://registry.yarnpkg.com/source-map-resolve/-/source-map-resolve-0.5.2.tgz#72e2cc34095543e43b2c62b2c4c10d4a9054f259"
+ integrity sha512-MjqsvNwyz1s0k81Goz/9vRBe9SZdB09Bdw+/zYyO+3CuPk6fouTaxscHkgtE8jKvf01kVfl8riHzERQ/kefaSA==
+ dependencies:
+ atob "^2.1.1"
+ decode-uri-component "^0.2.0"
+ resolve-url "^0.2.1"
+ source-map-url "^0.4.0"
+ urix "^0.1.0"
+
+source-map-url@^0.4.0:
+ version "0.4.0"
+ resolved "https://registry.yarnpkg.com/source-map-url/-/source-map-url-0.4.0.tgz#3e935d7ddd73631b97659956d55128e87b5084a3"
+ integrity sha1-PpNdfd1zYxuXZZlW1VEo6HtQhKM=
+
+source-map@0.1.31:
+ version "0.1.31"
+ resolved "https://registry.yarnpkg.com/source-map/-/source-map-0.1.31.tgz#9f704d0d69d9e138a81badf6ebb4fde33d151c61"
+ integrity sha1-n3BNDWnZ4TioG63267T94z0VHGE=
+ dependencies:
+ amdefine ">=0.0.4"
+
+source-map@0.1.34:
+ version "0.1.34"
+ resolved "https://registry.yarnpkg.com/source-map/-/source-map-0.1.34.tgz#a7cfe89aec7b1682c3b198d0acfb47d7d090566b"
+ integrity sha1-p8/omux7FoLDsZjQrPtH19CQVms=
+ dependencies:
+ amdefine ">=0.0.4"
+
+source-map@^0.4.2, source-map@~0.4.0, source-map@~0.4.2:
+ version "0.4.4"
+ resolved "https://registry.yarnpkg.com/source-map/-/source-map-0.4.4.tgz#eba4f5da9c0dc999de68032d8b4f76173652036b"
+ integrity sha1-66T12pwNyZneaAMti092FzZSA2s=
+ dependencies:
+ amdefine ">=0.0.4"
+
+source-map@^0.5.6, source-map@~0.5.0, source-map@~0.5.3:
+ version "0.5.7"
+ resolved "https://registry.yarnpkg.com/source-map/-/source-map-0.5.7.tgz#8a039d2d1021d22d1ea14c80d8ea468ba2ef3fcc"
+ integrity sha1-igOdLRAh0i0eoUyA2OpGi6LvP8w=
+
+spdx-correct@^3.0.0:
+ version "3.0.2"
+ resolved "https://registry.yarnpkg.com/spdx-correct/-/spdx-correct-3.0.2.tgz#19bb409e91b47b1ad54159243f7312a858db3c2e"
+ integrity sha512-q9hedtzyXHr5S0A1vEPoK/7l8NpfkFYTq6iCY+Pno2ZbdZR6WexZFtqeVGkGxW3TEJMN914Z55EnAGMmenlIQQ==
+ dependencies:
+ spdx-expression-parse "^3.0.0"
+ spdx-license-ids "^3.0.0"
+
+spdx-exceptions@^2.1.0:
+ version "2.2.0"
+ resolved "https://registry.yarnpkg.com/spdx-exceptions/-/spdx-exceptions-2.2.0.tgz#2ea450aee74f2a89bfb94519c07fcd6f41322977"
+ integrity sha512-2XQACfElKi9SlVb1CYadKDXvoajPgBVPn/gOQLrTvHdElaVhr7ZEbqJaRnJLVNeaI4cMEAgVCeBMKF6MWRDCRA==
+
+spdx-expression-parse@^3.0.0:
+ version "3.0.0"
+ resolved "https://registry.yarnpkg.com/spdx-expression-parse/-/spdx-expression-parse-3.0.0.tgz#99e119b7a5da00e05491c9fa338b7904823b41d0"
+ integrity sha512-Yg6D3XpRD4kkOmTpdgbUiEJFKghJH03fiC1OPll5h/0sO6neh2jqRDVHOQ4o/LMea0tgCkbMgea5ip/e+MkWyg==
+ dependencies:
+ spdx-exceptions "^2.1.0"
+ spdx-license-ids "^3.0.0"
+
+spdx-license-ids@^3.0.0:
+ version "3.0.2"
+ resolved "https://registry.yarnpkg.com/spdx-license-ids/-/spdx-license-ids-3.0.2.tgz#a59efc09784c2a5bada13cfeaf5c75dd214044d2"
+ integrity sha512-qky9CVt0lVIECkEsYbNILVnPvycuEBkXoMFLRWsREkomQLevYhtRKC+R91a5TOAQ3bCMjikRwhyaRqj1VYatYg==
+
+split-string@^3.0.1, split-string@^3.0.2:
+ version "3.1.0"
+ resolved "https://registry.yarnpkg.com/split-string/-/split-string-3.1.0.tgz#7cb09dda3a86585705c64b39a6466038682e8fe2"
+ integrity sha512-NzNVhJDYpwceVVii8/Hu6DKfD2G+NrQHlS/V/qgv763EYudVwEcMQNxd2lh+0VrUByXN/oJkl5grOhYWvQUYiw==
+ dependencies:
+ extend-shallow "^3.0.0"
+
+sprintf-js@^1.0.3:
+ version "1.1.1"
+ resolved "https://registry.yarnpkg.com/sprintf-js/-/sprintf-js-1.1.1.tgz#36be78320afe5801f6cea3ee78b6e5aab940ea0c"
+ integrity sha1-Nr54Mgr+WAH2zqPueLblqrlA6gw=
+
+sprintf-js@~1.0.2:
+ version "1.0.3"
+ resolved "https://registry.yarnpkg.com/sprintf-js/-/sprintf-js-1.0.3.tgz#04e6926f662895354f3dd015203633b857297e2c"
+ integrity sha1-BOaSb2YolTVPPdAVIDYzuFcpfiw=
+
+stack-trace@0.0.x:
+ version "0.0.10"
+ resolved "https://registry.yarnpkg.com/stack-trace/-/stack-trace-0.0.10.tgz#547c70b347e8d32b4e108ea1a2a159e5fdde19c0"
+ integrity sha1-VHxws0fo0ytOEI6hoqFZ5f3eGcA=
+
+static-extend@^0.1.1:
+ version "0.1.2"
+ resolved "https://registry.yarnpkg.com/static-extend/-/static-extend-0.1.2.tgz#60809c39cbff55337226fd5e0b520f341f1fb5c6"
+ integrity sha1-YICcOcv/VTNyJv1eC1IPNB8ftcY=
+ dependencies:
+ define-property "^0.2.5"
+ object-copy "^0.1.0"
+
+stream-browserify@^2.0.0:
+ version "2.0.1"
+ resolved "https://registry.yarnpkg.com/stream-browserify/-/stream-browserify-2.0.1.tgz#66266ee5f9bdb9940a4e4514cafb43bb71e5c9db"
+ integrity sha1-ZiZu5fm9uZQKTkUUyvtDu3Hlyds=
+ dependencies:
+ inherits "~2.0.1"
+ readable-stream "^2.0.2"
+
+stream-combiner2@^1.1.1:
+ version "1.1.1"
+ resolved "https://registry.yarnpkg.com/stream-combiner2/-/stream-combiner2-1.1.1.tgz#fb4d8a1420ea362764e21ad4780397bebcb41cbe"
+ integrity sha1-+02KFCDqNidk4hrUeAOXvry0HL4=
+ dependencies:
+ duplexer2 "~0.1.0"
+ readable-stream "^2.0.2"
+
+stream-combiner2@~1.0.0:
+ version "1.0.2"
+ resolved "https://registry.yarnpkg.com/stream-combiner2/-/stream-combiner2-1.0.2.tgz#ba72a6b50cbfabfa950fc8bc87604bd01eb60671"
+ integrity sha1-unKmtQy/q/qVD8i8h2BL0B62BnE=
+ dependencies:
+ duplexer2 "~0.0.2"
+ through2 "~0.5.1"
+
+stream-http@^1.2.0:
+ version "1.7.1"
+ resolved "https://registry.yarnpkg.com/stream-http/-/stream-http-1.7.1.tgz#d3d2a6e14c36a38b9dafb199aee7bbc570519978"
+ integrity sha1-09Km4Uw2o4udr7GZrue7xXBRmXg=
+ dependencies:
+ builtin-status-codes "^1.0.0"
+ foreach "^2.0.5"
+ indexof "0.0.1"
+ inherits "^2.0.1"
+ object-keys "^1.0.4"
+ xtend "^4.0.0"
+
+stream-http@^2.0.0:
+ version "2.8.3"
+ resolved "https://registry.yarnpkg.com/stream-http/-/stream-http-2.8.3.tgz#b2d242469288a5a27ec4fe8933acf623de6514fc"
+ integrity sha512-+TSkfINHDo4J+ZobQLWiMouQYB+UVYFttRA94FpEzzJ7ZdqcL4uUUQ7WkdkI4DSozGmgBUE/a47L+38PenXhUw==
+ dependencies:
+ builtin-status-codes "^3.0.0"
+ inherits "^2.0.1"
+ readable-stream "^2.3.6"
+ to-arraybuffer "^1.0.0"
+ xtend "^4.0.0"
+
+stream-splicer@^1.1.0:
+ version "1.3.2"
+ resolved "https://registry.yarnpkg.com/stream-splicer/-/stream-splicer-1.3.2.tgz#3c0441be15b9bf4e226275e6dc83964745546661"
+ integrity sha1-PARBvhW5v04iYnXm3IOWR0VUZmE=
+ dependencies:
+ indexof "0.0.1"
+ inherits "^2.0.1"
+ isarray "~0.0.1"
+ readable-stream "^1.1.13-1"
+ readable-wrap "^1.0.0"
+ through2 "^1.0.0"
+
+stream-splicer@^2.0.0:
+ version "2.0.0"
+ resolved "https://registry.yarnpkg.com/stream-splicer/-/stream-splicer-2.0.0.tgz#1b63be438a133e4b671cc1935197600175910d83"
+ integrity sha1-G2O+Q4oTPktnHMGTUZdgAXWRDYM=
+ dependencies:
+ inherits "^2.0.1"
+ readable-stream "^2.0.2"
+
+string-width@^1.0.1:
+ version "1.0.2"
+ resolved "https://registry.yarnpkg.com/string-width/-/string-width-1.0.2.tgz#118bdf5b8cdc51a2a7e70d211e07e2b0b9b107d3"
+ integrity sha1-EYvfW4zcUaKn5w0hHgfisLmxB9M=
+ dependencies:
+ code-point-at "^1.0.0"
+ is-fullwidth-code-point "^1.0.0"
+ strip-ansi "^3.0.0"
+
+"string-width@^1.0.2 || 2":
+ version "2.1.1"
+ resolved "https://registry.yarnpkg.com/string-width/-/string-width-2.1.1.tgz#ab93f27a8dc13d28cac815c462143a6d9012ae9e"
+ integrity sha512-nOqH59deCq9SRHlxq1Aw85Jnt4w6KvLKqWVik6oA9ZklXLNIOlqg4F2yrT1MVaTjAqvVwdfeZ7w7aCvJD7ugkw==
+ dependencies:
+ is-fullwidth-code-point "^2.0.0"
+ strip-ansi "^4.0.0"
+
+string_decoder@^1.1.1:
+ version "1.2.0"
+ resolved "https://registry.yarnpkg.com/string_decoder/-/string_decoder-1.2.0.tgz#fe86e738b19544afe70469243b2a1ee9240eae8d"
+ integrity sha512-6YqyX6ZWEYguAxgZzHGL7SsCeGx3V2TtOTqZz1xSTSWnqsbWwbptafNyvf/ACquZUXV3DANr5BDIwNYe1mN42w==
+ dependencies:
+ safe-buffer "~5.1.0"
+
+string_decoder@~0.10.0, string_decoder@~0.10.x:
+ version "0.10.31"
+ resolved "https://registry.yarnpkg.com/string_decoder/-/string_decoder-0.10.31.tgz#62e203bc41766c6c28c9fc84301dab1c5310fa94"
+ integrity sha1-YuIDvEF2bGwoyfyEMB2rHFMQ+pQ=
+
+string_decoder@~1.1.1:
+ version "1.1.1"
+ resolved "https://registry.yarnpkg.com/string_decoder/-/string_decoder-1.1.1.tgz#9cf1611ba62685d7030ae9e4ba34149c3af03fc8"
+ integrity sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==
+ dependencies:
+ safe-buffer "~5.1.0"
+
+strip-ansi@^3.0.0, strip-ansi@^3.0.1:
+ version "3.0.1"
+ resolved "https://registry.yarnpkg.com/strip-ansi/-/strip-ansi-3.0.1.tgz#6a385fb8853d952d5ff05d0e8aaf94278dc63dcf"
+ integrity sha1-ajhfuIU9lS1f8F0Oiq+UJ43GPc8=
+ dependencies:
+ ansi-regex "^2.0.0"
+
+strip-ansi@^4.0.0:
+ version "4.0.0"
+ resolved "https://registry.yarnpkg.com/strip-ansi/-/strip-ansi-4.0.0.tgz#a8479022eb1ac368a871389b635262c505ee368f"
+ integrity sha1-qEeQIusaw2iocTibY1JixQXuNo8=
+ dependencies:
+ ansi-regex "^3.0.0"
+
+strip-bom@^2.0.0:
+ version "2.0.0"
+ resolved "https://registry.yarnpkg.com/strip-bom/-/strip-bom-2.0.0.tgz#6219a85616520491f35788bdbf1447a99c7e6b0e"
+ integrity sha1-YhmoVhZSBJHzV4i9vxRHqZx+aw4=
+ dependencies:
+ is-utf8 "^0.2.0"
+
+strip-indent@^1.0.1:
+ version "1.0.1"
+ resolved "https://registry.yarnpkg.com/strip-indent/-/strip-indent-1.0.1.tgz#0c7962a6adefa7bbd4ac366460a638552ae1a0a2"
+ integrity sha1-DHlipq3vp7vUrDZkYKY4VSrhoKI=
+ dependencies:
+ get-stdin "^4.0.1"
+
+strip-json-comments@1.0.x:
+ version "1.0.4"
+ resolved "https://registry.yarnpkg.com/strip-json-comments/-/strip-json-comments-1.0.4.tgz#1e15fbcac97d3ee99bf2d73b4c656b082bbafb91"
+ integrity sha1-HhX7ysl9Pumb8tc7TGVrCCu6+5E=
+
+strip-json-comments@~2.0.1:
+ version "2.0.1"
+ resolved "https://registry.yarnpkg.com/strip-json-comments/-/strip-json-comments-2.0.1.tgz#3c531942e908c2697c0ec344858c286c7ca0a60a"
+ integrity sha1-PFMZQukIwml8DsNEhYwobHygpgo=
+
+subarg@^1.0.0:
+ version "1.0.0"
+ resolved "https://registry.yarnpkg.com/subarg/-/subarg-1.0.0.tgz#f62cf17581e996b48fc965699f54c06ae268b8d2"
+ integrity sha1-9izxdYHplrSPyWVpn1TAauJouNI=
+ dependencies:
+ minimist "^1.1.0"
+
+supports-color@^5.3.0:
+ version "5.5.0"
+ resolved "https://registry.yarnpkg.com/supports-color/-/supports-color-5.5.0.tgz#e2e69a44ac8772f78a1ec0b35b689df6530efc8f"
+ integrity sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==
+ dependencies:
+ has-flag "^3.0.0"
+
+sync-exec@~0.6.2:
+ version "0.6.2"
+ resolved "https://registry.yarnpkg.com/sync-exec/-/sync-exec-0.6.2.tgz#717d22cc53f0ce1def5594362f3a89a2ebb91105"
+ integrity sha1-cX0izFPwzh3vVZQ2LzqJouu5EQU=
+
+syntax-error@^1.1.1:
+ version "1.4.0"
+ resolved "https://registry.yarnpkg.com/syntax-error/-/syntax-error-1.4.0.tgz#2d9d4ff5c064acb711594a3e3b95054ad51d907c"
+ integrity sha512-YPPlu67mdnHGTup2A8ff7BC2Pjq0e0Yp/IyTFN03zWO0RcK07uLcbi7C2KpGR2FvWbaB0+bfE27a+sBKebSo7w==
+ dependencies:
+ acorn-node "^1.2.0"
+
+tar@^4:
+ version "4.4.8"
+ resolved "https://registry.yarnpkg.com/tar/-/tar-4.4.8.tgz#b19eec3fde2a96e64666df9fdb40c5ca1bc3747d"
+ integrity sha512-LzHF64s5chPQQS0IYBn9IN5h3i98c12bo4NCO7e0sGM2llXQ3p2FGC5sdENN4cTW48O915Sh+x+EXx7XW96xYQ==
+ dependencies:
+ chownr "^1.1.1"
+ fs-minipass "^1.2.5"
+ minipass "^2.3.4"
+ minizlib "^1.1.1"
+ mkdirp "^0.5.0"
+ safe-buffer "^5.1.2"
+ yallist "^3.0.2"
+
+through2@^1.0.0:
+ version "1.1.1"
+ resolved "https://registry.yarnpkg.com/through2/-/through2-1.1.1.tgz#0847cbc4449f3405574dbdccd9bb841b83ac3545"
+ integrity sha1-CEfLxESfNAVXTb3M2buEG4OsNUU=
+ dependencies:
+ readable-stream ">=1.1.13-1 <1.2.0-0"
+ xtend ">=4.0.0 <4.1.0-0"
+
+through2@^2.0.0:
+ version "2.0.5"
+ resolved "https://registry.yarnpkg.com/through2/-/through2-2.0.5.tgz#01c1e39eb31d07cb7d03a96a70823260b23132cd"
+ integrity sha512-/mrRod8xqpA+IHSLyGCQ2s8SPHiCDEeQJSep1jqLYeEUClOFG2Qsh+4FU6G9VeqpZnGW/Su8LQGc4YKni5rYSQ==
+ dependencies:
+ readable-stream "~2.3.6"
+ xtend "~4.0.1"
+
+through2@~0.5.1:
+ version "0.5.1"
+ resolved "https://registry.yarnpkg.com/through2/-/through2-0.5.1.tgz#dfdd012eb9c700e2323fd334f38ac622ab372da7"
+ integrity sha1-390BLrnHAOIyP9M084rGIqs3Lac=
+ dependencies:
+ readable-stream "~1.0.17"
+ xtend "~3.0.0"
+
+"through@>=2.2.7 <3", through@~2.3.4, through@~2.3.6:
+ version "2.3.8"
+ resolved "https://registry.yarnpkg.com/through/-/through-2.3.8.tgz#0dd4c9ffaabc357960b1b724115d7e0e86a2e1f5"
+ integrity sha1-DdTJ/6q8NXlgsbckEV1+Doai4fU=
+
+timers-browserify@^1.0.1:
+ version "1.4.2"
+ resolved "https://registry.yarnpkg.com/timers-browserify/-/timers-browserify-1.4.2.tgz#c9c58b575be8407375cb5e2462dacee74359f41d"
+ integrity sha1-ycWLV1voQHN1y14kYtrO50NZ9B0=
+ dependencies:
+ process "~0.11.0"
+
+to-arraybuffer@^1.0.0:
+ version "1.0.1"
+ resolved "https://registry.yarnpkg.com/to-arraybuffer/-/to-arraybuffer-1.0.1.tgz#7d229b1fcc637e466ca081180836a7aabff83f43"
+ integrity sha1-fSKbH8xjfkZsoIEYCDanqr/4P0M=
+
+to-object-path@^0.3.0:
+ version "0.3.0"
+ resolved "https://registry.yarnpkg.com/to-object-path/-/to-object-path-0.3.0.tgz#297588b7b0e7e0ac08e04e672f85c1f4999e17af"
+ integrity sha1-KXWIt7Dn4KwI4E5nL4XB9JmeF68=
+ dependencies:
+ kind-of "^3.0.2"
+
+to-regex-range@^2.1.0:
+ version "2.1.1"
+ resolved "https://registry.yarnpkg.com/to-regex-range/-/to-regex-range-2.1.1.tgz#7c80c17b9dfebe599e27367e0d4dd5590141db38"
+ integrity sha1-fIDBe53+vlmeJzZ+DU3VWQFB2zg=
+ dependencies:
+ is-number "^3.0.0"
+ repeat-string "^1.6.1"
+
+to-regex@^3.0.1, to-regex@^3.0.2:
+ version "3.0.2"
+ resolved "https://registry.yarnpkg.com/to-regex/-/to-regex-3.0.2.tgz#13cfdd9b336552f30b51f33a8ae1b42a7a7599ce"
+ integrity sha512-FWtleNAtZ/Ki2qtqej2CXTOayOH9bHDQF+Q48VpWyDXjbYxA4Yz8iDB31zXOBUlOHHKidDbqGVrTUvQMPmBGBw==
+ dependencies:
+ define-property "^2.0.2"
+ extend-shallow "^3.0.2"
+ regex-not "^1.0.2"
+ safe-regex "^1.1.0"
+
+trim-newlines@^1.0.0:
+ version "1.0.0"
+ resolved "https://registry.yarnpkg.com/trim-newlines/-/trim-newlines-1.0.0.tgz#5887966bb582a4503a41eb524f7d35011815a613"
+ integrity sha1-WIeWa7WCpFA6QetST301ARgVphM=
+
+tty-browserify@0.0.1, tty-browserify@~0.0.0:
+ version "0.0.1"
+ resolved "https://registry.yarnpkg.com/tty-browserify/-/tty-browserify-0.0.1.tgz#3f05251ee17904dfd0677546670db9651682b811"
+ integrity sha512-C3TaO7K81YvjCgQH9Q1S3R3P3BtN3RIM8n+OvX4il1K1zgE8ZhI0op7kClgkxtutIE8hQrcrHBXvIheqKUUCxw==
+
+typedarray@^0.0.6, typedarray@~0.0.5:
+ version "0.0.6"
+ resolved "https://registry.yarnpkg.com/typedarray/-/typedarray-0.0.6.tgz#867ac74e3864187b1d3d47d996a78ec5c8830777"
+ integrity sha1-hnrHTjhkGHsdPUfZlqeOxciDB3c=
+
+ua-parser-js@^0.7.18:
+ version "0.7.19"
+ resolved "https://registry.yarnpkg.com/ua-parser-js/-/ua-parser-js-0.7.19.tgz#94151be4c0a7fb1d001af7022fdaca4642659e4b"
+ integrity sha512-T3PVJ6uz8i0HzPxOF9SWzWAlfN/DavlpQqepn22xgve/5QecC+XMCAtmUNnY7C9StehaV6exjUCI801lOI7QlQ==
+
+uglify-js@~2.4.0:
+ version "2.4.24"
+ resolved "https://registry.yarnpkg.com/uglify-js/-/uglify-js-2.4.24.tgz#fad5755c1e1577658bb06ff9ab6e548c95bebd6e"
+ integrity sha1-+tV1XB4Vd2WLsG/5q25UjJW+vW4=
+ dependencies:
+ async "~0.2.6"
+ source-map "0.1.34"
+ uglify-to-browserify "~1.0.0"
+ yargs "~3.5.4"
+
+uglify-to-browserify@~1.0.0:
+ version "1.0.2"
+ resolved "https://registry.yarnpkg.com/uglify-to-browserify/-/uglify-to-browserify-1.0.2.tgz#6e0924d6bda6b5afe349e39a6d632850a0f882b7"
+ integrity sha1-bgkk1r2mta/jSeOabWMoUKD4grc=
+
+umd@^3.0.0:
+ version "3.0.3"
+ resolved "https://registry.yarnpkg.com/umd/-/umd-3.0.3.tgz#aa9fe653c42b9097678489c01000acb69f0b26cf"
+ integrity sha512-4IcGSufhFshvLNcMCV80UnQVlZ5pMOC8mvNPForqwA4+lzYQuetTESLDQkeLmihq8bRcnpbQa48Wb8Lh16/xow==
+
+undeclared-identifiers@^1.1.2:
+ version "1.1.2"
+ resolved "https://registry.yarnpkg.com/undeclared-identifiers/-/undeclared-identifiers-1.1.2.tgz#7d850a98887cff4bd0bf64999c014d08ed6d1acc"
+ integrity sha512-13EaeocO4edF/3JKime9rD7oB6QI8llAGhgn5fKOPyfkJbRb6NFv9pYV6dFEmpa4uRjKeBqLZP8GpuzqHlKDMQ==
+ dependencies:
+ acorn-node "^1.3.0"
+ get-assigned-identifiers "^1.2.0"
+ simple-concat "^1.0.0"
+ xtend "^4.0.1"
+
+underscore.string@~2.2.1:
+ version "2.2.1"
+ resolved "https://registry.yarnpkg.com/underscore.string/-/underscore.string-2.2.1.tgz#d7c0fa2af5d5a1a67f4253daee98132e733f0f19"
+ integrity sha1-18D6KvXVoaZ/QlPa7pgTLnM/Dxk=
+
+underscore.string@~2.3.3:
+ version "2.3.3"
+ resolved "https://registry.yarnpkg.com/underscore.string/-/underscore.string-2.3.3.tgz#71c08bf6b428b1133f37e78fa3a21c82f7329b0d"
+ integrity sha1-ccCL9rQosRM/N+ePo6Icgvcymw0=
+
+underscore.string@~2.4.0:
+ version "2.4.0"
+ resolved "https://registry.yarnpkg.com/underscore.string/-/underscore.string-2.4.0.tgz#8cdd8fbac4e2d2ea1e7e2e8097c42f442280f85b"
+ integrity sha1-jN2PusTi0uoefi6Al8QvRCKA+Fs=
+
+underscore.string@~3.3.4:
+ version "3.3.5"
+ resolved "https://registry.yarnpkg.com/underscore.string/-/underscore.string-3.3.5.tgz#fc2ad255b8bd309e239cbc5816fd23a9b7ea4023"
+ integrity sha512-g+dpmgn+XBneLmXXo+sGlW5xQEt4ErkS3mgeN2GFbremYeMBSJKr9Wf2KJplQVaiPY/f7FN6atosWYNm9ovrYg==
+ dependencies:
+ sprintf-js "^1.0.3"
+ util-deprecate "^1.0.2"
+
+underscore@1.4.x, underscore@~1.4.3:
+ version "1.4.4"
+ resolved "https://registry.yarnpkg.com/underscore/-/underscore-1.4.4.tgz#61a6a32010622afa07963bf325203cf12239d604"
+ integrity sha1-YaajIBBiKvoHljvzJSA88SI51gQ=
+
+underscore@1.6.x:
+ version "1.6.0"
+ resolved "https://registry.yarnpkg.com/underscore/-/underscore-1.6.0.tgz#8b38b10cacdef63337b8b24e4ff86d45aea529a8"
+ integrity sha1-izixDKze9jM3uLJOT/htRa6lKag=
+
+"underscore@>= 1.3.1", underscore@>=1.5.0, underscore@~1.9.1:
+ version "1.9.1"
+ resolved "https://registry.yarnpkg.com/underscore/-/underscore-1.9.1.tgz#06dce34a0e68a7babc29b365b8e74b8925203961"
+ integrity sha512-5/4etnCkd9c8gwgowi5/om/mYO5ajCaOgdzj/oW+0eQV9WxKBDZw5+ycmKmeaTXjInS/W0BzpGLo2xR2aBwZdg==
+
+underscore@~1.7.0:
+ version "1.7.0"
+ resolved "https://registry.yarnpkg.com/underscore/-/underscore-1.7.0.tgz#6bbaf0877500d36be34ecaa584e0db9fef035209"
+ integrity sha1-a7rwh3UA02vjTsqlhODbn+8DUgk=
+
+union-value@^1.0.0:
+ version "1.0.0"
+ resolved "https://registry.yarnpkg.com/union-value/-/union-value-1.0.0.tgz#5c71c34cb5bad5dcebe3ea0cd08207ba5aa1aea4"
+ integrity sha1-XHHDTLW61dzr4+oM0IIHulqhrqQ=
+ dependencies:
+ arr-union "^3.1.0"
+ get-value "^2.0.6"
+ is-extendable "^0.1.1"
+ set-value "^0.4.3"
+
+unset-value@^1.0.0:
+ version "1.0.0"
+ resolved "https://registry.yarnpkg.com/unset-value/-/unset-value-1.0.0.tgz#8376873f7d2335179ffb1e6fc3a8ed0dfc8ab559"
+ integrity sha1-g3aHP30jNRef+x5vw6jtDfyKtVk=
+ dependencies:
+ has-value "^0.3.1"
+ isobject "^3.0.0"
+
+urix@^0.1.0:
+ version "0.1.0"
+ resolved "https://registry.yarnpkg.com/urix/-/urix-0.1.0.tgz#da937f7a62e21fec1fd18d49b35c2935067a6c72"
+ integrity sha1-2pN/emLiH+wf0Y1Js1wpNQZ6bHI=
+
+url@~0.10.1:
+ version "0.10.3"
+ resolved "https://registry.yarnpkg.com/url/-/url-0.10.3.tgz#021e4d9c7705f21bbf37d03ceb58767402774c64"
+ integrity sha1-Ah5NnHcF8hu/N9A861h2dAJ3TGQ=
+ dependencies:
+ punycode "1.3.2"
+ querystring "0.2.0"
+
+url@~0.11.0:
+ version "0.11.0"
+ resolved "https://registry.yarnpkg.com/url/-/url-0.11.0.tgz#3838e97cfc60521eb73c525a8e55bfdd9e2e28f1"
+ integrity sha1-ODjpfPxgUh63PFJajlW/3Z4uKPE=
+ dependencies:
+ punycode "1.3.2"
+ querystring "0.2.0"
+
+use@^3.1.0:
+ version "3.1.1"
+ resolved "https://registry.yarnpkg.com/use/-/use-3.1.1.tgz#d50c8cac79a19fbc20f2911f56eb973f4e10070f"
+ integrity sha512-cwESVXlO3url9YWlFW/TA9cshCEhtu7IKJ/p5soJ/gGpj7vbvFrAY/eIioQ6Dw23KjZhYgiIo8HOs1nQ2vr/oQ==
+
+util-deprecate@^1.0.2, util-deprecate@~1.0.1:
+ version "1.0.2"
+ resolved "https://registry.yarnpkg.com/util-deprecate/-/util-deprecate-1.0.2.tgz#450d4dc9fa70de732762fbd2d4a28981419a0ccf"
+ integrity sha1-RQ1Nyfpw3nMnYvvS1KKJgUGaDM8=
+
+util@0.10.3:
+ version "0.10.3"
+ resolved "https://registry.yarnpkg.com/util/-/util-0.10.3.tgz#7afb1afe50805246489e3db7fe0ed379336ac0f9"
+ integrity sha1-evsa/lCAUkZInj23/g7TeTNqwPk=
+ dependencies:
+ inherits "2.0.1"
+
+util@~0.10.1:
+ version "0.10.4"
+ resolved "https://registry.yarnpkg.com/util/-/util-0.10.4.tgz#3aa0125bfe668a4672de58857d3ace27ecb76901"
+ integrity sha512-0Pm9hTQ3se5ll1XihRic3FDIku70C+iHUdT/W926rSgHV5QgXsYbKZN8MSC3tJtSkhuROzvsQjAaFENRXr+19A==
+ dependencies:
+ inherits "2.0.3"
+
+utile@0.3.x:
+ version "0.3.0"
+ resolved "https://registry.yarnpkg.com/utile/-/utile-0.3.0.tgz#1352c340eb820e4d8ddba039a4fbfaa32ed4ef3a"
+ integrity sha1-E1LDQOuCDk2N26A5pPv6oy7U7zo=
+ dependencies:
+ async "~0.9.0"
+ deep-equal "~0.2.1"
+ i "0.3.x"
+ mkdirp "0.x.x"
+ ncp "1.0.x"
+ rimraf "2.x.x"
+
+validate-npm-package-license@^3.0.1:
+ version "3.0.4"
+ resolved "https://registry.yarnpkg.com/validate-npm-package-license/-/validate-npm-package-license-3.0.4.tgz#fc91f6b9c7ba15c857f4cb2c5defeec39d4f410a"
+ integrity sha512-DpKm2Ui/xN7/HQKCtpZxoRWBhZ9Z0kqtygG8XCgNQ8ZlDnxuQmWhj566j8fN4Cu3/JmbhsDo7fcAJq4s9h27Ew==
+ dependencies:
+ spdx-correct "^3.0.0"
+ spdx-expression-parse "^3.0.0"
+
+vm-browserify@^1.0.0:
+ version "1.1.0"
+ resolved "https://registry.yarnpkg.com/vm-browserify/-/vm-browserify-1.1.0.tgz#bd76d6a23323e2ca8ffa12028dc04559c75f9019"
+ integrity sha512-iq+S7vZJE60yejDYM0ek6zg308+UZsdtPExWP9VZoCFCz1zkJoXFnAX7aZfd/ZwrkidzdUZL0C/ryW+JwAiIGw==
+
+vm-browserify@~0.0.1:
+ version "0.0.4"
+ resolved "https://registry.yarnpkg.com/vm-browserify/-/vm-browserify-0.0.4.tgz#5d7ea45bbef9e4a6ff65f95438e0a87c357d5a73"
+ integrity sha1-XX6kW7755Kb/ZflUOOCofDV9WnM=
+ dependencies:
+ indexof "0.0.1"
+
+"walkdir@>= 0.0.1", walkdir@~0.0.12:
+ version "0.0.12"
+ resolved "https://registry.yarnpkg.com/walkdir/-/walkdir-0.0.12.tgz#2f24f1ade64aab1e458591d4442c8868356e9281"
+ integrity sha512-HFhaD4mMWPzFSqhpyDG48KDdrjfn409YQuVW7ckZYhW4sE87mYtWifdB/+73RA7+p4s4K18n5Jfx1kHthE1gBw==
+
+watchify@^3.3.1:
+ version "3.11.0"
+ resolved "https://registry.yarnpkg.com/watchify/-/watchify-3.11.0.tgz#03f1355c643955e7ab8dcbf399f624644221330f"
+ integrity sha512-7jWG0c3cKKm2hKScnSAMUEUjRJKXUShwMPk0ASVhICycQhwND3IMAdhJYmc1mxxKzBUJTSF5HZizfrKrS6BzkA==
+ dependencies:
+ anymatch "^1.3.0"
+ browserify "^16.1.0"
+ chokidar "^1.0.0"
+ defined "^1.0.0"
+ outpipe "^1.1.0"
+ through2 "^2.0.0"
+ xtend "^4.0.0"
+
+whatwg-fetch@>=0.10.0:
+ version "3.0.0"
+ resolved "https://registry.yarnpkg.com/whatwg-fetch/-/whatwg-fetch-3.0.0.tgz#fc804e458cc460009b1a2b966bc8817d2578aefb"
+ integrity sha512-9GSJUgz1D4MfyKU7KRqwOjXCXTqWdFNvEr7eUBYchQiVc744mqK/MzXPNR2WsPkmkOa4ywfg8C2n8h+13Bey1Q==
+
+whatwg-fetch@^0.9.0:
+ version "0.9.0"
+ resolved "https://registry.yarnpkg.com/whatwg-fetch/-/whatwg-fetch-0.9.0.tgz#0e3684c6cb9995b43efc9df03e4c365d95fd9cc0"
+ integrity sha1-DjaExsuZlbQ+/J3wPkw2XZX9nMA=
+
+which@~1.0.5:
+ version "1.0.9"
+ resolved "https://registry.yarnpkg.com/which/-/which-1.0.9.tgz#460c1da0f810103d0321a9b633af9e575e64486f"
+ integrity sha1-RgwdoPgQED0DIam2M6+eV15kSG8=
+
+which@~1.3.0:
+ version "1.3.1"
+ resolved "https://registry.yarnpkg.com/which/-/which-1.3.1.tgz#a45043d54f5805316da8d62f9f50918d3da70b0a"
+ integrity sha512-HxJdYWq1MTIQbJ3nw0cqssHoTNU267KlrDuGZ1WYlxDStUtKUhOaJmh112/TZmHxxUfuJqPXSOm7tDyas0OSIQ==
+ dependencies:
+ isexe "^2.0.0"
+
+wide-align@^1.1.0:
+ version "1.1.3"
+ resolved "https://registry.yarnpkg.com/wide-align/-/wide-align-1.1.3.tgz#ae074e6bdc0c14a431e804e624549c633b000457"
+ integrity sha512-QGkOQc8XL6Bt5PwnsExKBPuMKBxnGxWWW3fU55Xt4feHozMUhdUMaBCk290qpm/wG5u/RSKzwdAC4i51YigihA==
+ dependencies:
+ string-width "^1.0.2 || 2"
+
+window-size@0.1.0:
+ version "0.1.0"
+ resolved "https://registry.yarnpkg.com/window-size/-/window-size-0.1.0.tgz#5438cd2ea93b202efa3a19fe8887aee7c94f9c9d"
+ integrity sha1-VDjNLqk7IC76Ohn+iIeu58lPnJ0=
+
+winston@2.1.x:
+ version "2.1.1"
+ resolved "https://registry.yarnpkg.com/winston/-/winston-2.1.1.tgz#3c9349d196207fd1bdff9d4bc43ef72510e3a12e"
+ integrity sha1-PJNJ0ZYgf9G9/51LxD73JRDjoS4=
+ dependencies:
+ async "~1.0.0"
+ colors "1.0.x"
+ cycle "1.0.x"
+ eyes "0.1.x"
+ isstream "0.1.x"
+ pkginfo "0.3.x"
+ stack-trace "0.0.x"
+
+wordwrap@0.0.2:
+ version "0.0.2"
+ resolved "https://registry.yarnpkg.com/wordwrap/-/wordwrap-0.0.2.tgz#b79669bb42ecb409f83d583cad52ca17eaa1643f"
+ integrity sha1-t5Zpu0LstAn4PVg8rVLKF+qhZD8=
+
+wrappy@1:
+ version "1.0.2"
+ resolved "https://registry.yarnpkg.com/wrappy/-/wrappy-1.0.2.tgz#b5243d8f3ec1aa35f1364605bc0d1036e30ab69f"
+ integrity sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8=
+
+xmldom@^0.1.22:
+ version "0.1.27"
+ resolved "https://registry.yarnpkg.com/xmldom/-/xmldom-0.1.27.tgz#d501f97b3bdb403af8ef9ecc20573187aadac0e9"
+ integrity sha1-1QH5ezvbQDr4757MIFcxh6rawOk=
+
+"xtend@>=4.0.0 <4.1.0-0", xtend@^4.0.0, xtend@^4.0.1, xtend@~4.0.1:
+ version "4.0.1"
+ resolved "https://registry.yarnpkg.com/xtend/-/xtend-4.0.1.tgz#a5c6d532be656e23db820efb943a1f04998d63af"
+ integrity sha1-pcbVMr5lbiPbgg77lDofBJmNY68=
+
+xtend@~3.0.0:
+ version "3.0.0"
+ resolved "https://registry.yarnpkg.com/xtend/-/xtend-3.0.0.tgz#5cce7407baf642cba7becda568111c493f59665a"
+ integrity sha1-XM50B7r2Qsunvs2laBEcST9ZZlo=
+
+yallist@^3.0.0, yallist@^3.0.2:
+ version "3.0.3"
+ resolved "https://registry.yarnpkg.com/yallist/-/yallist-3.0.3.tgz#b4b049e314be545e3ce802236d6cd22cd91c3de9"
+ integrity sha512-S+Zk8DEWE6oKpV+vI3qWkaK+jSbIK86pCwe2IF/xwIpQ8jEuxpw9NyaGjmp9+BoJv5FV2piqCDcoCtStppiq2A==
+
+yargs@~3.5.4:
+ version "3.5.4"
+ resolved "https://registry.yarnpkg.com/yargs/-/yargs-3.5.4.tgz#d8aff8f665e94c34bd259bdebd1bfaf0ddd35361"
+ integrity sha1-2K/49mXpTDS9JZvevRv68N3TU2E=
+ dependencies:
+ camelcase "^1.0.2"
+ decamelize "^1.0.0"
+ window-size "0.1.0"
+ wordwrap "0.0.2"
+
+zlib-browserify@0.0.1:
+ version "0.0.1"
+ resolved "https://registry.yarnpkg.com/zlib-browserify/-/zlib-browserify-0.0.1.tgz#4fa6a45d00dbc15f318a4afa1d9afc0258e176cc"
+ integrity sha1-T6akXQDbwV8xikr6HZr8Aljhdsw=
From e6d7edd130249bac0b6ebb3d36668224bc7753ab Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?=EF=BC=A8=EF=BD=8F=EF=BD=8E=EF=BD=87=EF=BD=81=EF=BD=92?=
=?UTF-8?q?=EF=BD=83?=
Date: Wed, 5 Dec 2018 12:08:41 +0700
Subject: [PATCH 049/359] Create simple debounce and throttle instead of _.
---
src/js/util/debounce.js | 17 +++++++++++++++++
src/js/util/throttle.js | 13 +++++++++++++
src/js/views/builderViews.js | 3 ++-
src/js/views/index.js | 6 ++++--
src/js/views/levelDropdownView.js | 3 ++-
src/js/views/multiView.js | 6 +++---
src/js/visuals/index.js | 3 ++-
7 files changed, 43 insertions(+), 8 deletions(-)
create mode 100644 src/js/util/debounce.js
create mode 100644 src/js/util/throttle.js
diff --git a/src/js/util/debounce.js b/src/js/util/debounce.js
new file mode 100644
index 00000000..0f8bd3b4
--- /dev/null
+++ b/src/js/util/debounce.js
@@ -0,0 +1,17 @@
+module.exports = function(func, time, immediate) {
+ var timeout;
+ return function() {
+ var later = function() {
+ timeout = null;
+ if (!immediate) {
+ func.apply(this, arguments);
+ }
+ };
+ var callNow = immediate && !timeout;
+ clearTimeout(timeout);
+ timeout = setTimeout(later, time);
+ if (callNow) {
+ func.apply(this, arguments);
+ }
+ };
+ };
diff --git a/src/js/util/throttle.js b/src/js/util/throttle.js
new file mode 100644
index 00000000..45d85e72
--- /dev/null
+++ b/src/js/util/throttle.js
@@ -0,0 +1,13 @@
+module.exports = function(func, time) {
+ var wait = false;
+ return function() {
+ if (!wait) {
+ func.apply(this, arguments);
+ wait = true;
+
+ setTimeout(function() {
+ wait = false;
+ }, time);
+ }
+ };
+ };
diff --git a/src/js/views/builderViews.js b/src/js/views/builderViews.js
index 89a6f8b9..592e1975 100644
--- a/src/js/views/builderViews.js
+++ b/src/js/views/builderViews.js
@@ -2,6 +2,7 @@ var _ = require('underscore');
var Q = require('q');
var Views = require('../views');
+var throttle = require('../util/throttle');
var ModalTerminal = Views.ModalTerminal;
var ContainedBase = Views.ContainedBase;
@@ -97,7 +98,7 @@ var MarkdownGrabber = ContainedBase.extend({
keyup: function() {
if (!this.throttledPreview) {
- this.throttledPreview = _.throttle(
+ this.throttledPreview = throttle(
this.updatePreview.bind(this),
500
);
diff --git a/src/js/views/index.js b/src/js/views/index.js
index 6f09413b..3fa26ce6 100644
--- a/src/js/views/index.js
+++ b/src/js/views/index.js
@@ -7,6 +7,8 @@ var intl = require('../intl');
var log = require('../log');
var Constants = require('../util/constants');
var KeyboardListener = require('../util/keyboard').KeyboardListener;
+var debounce = require('../util/debounce');
+var throttle = require('../util/throttle');
var BaseView = Backbone.View.extend({
getDestination: function() {
@@ -106,7 +108,7 @@ var GeneralButton = ContainedBase.extend({
click: function() {
if (!this.clickFunc) {
- this.clickFunc = _.throttle(
+ this.clickFunc = throttle(
this.sendClick.bind(this),
500
);
@@ -580,7 +582,7 @@ var CanvasTerminalHolder = BaseView.extend({
// If the entire window gets resized such that the terminal is outside the view, then
// move it back into the view, and expand/shrink it vertically as necessary.
- $(window).on('resize', _.debounce(this.recalcLayout.bind(this), 300));
+ $(window).on('resize', debounce(this.recalcLayout.bind(this), 300));
if (options.additionalClass) {
this.$el.addClass(options.additionalClass);
diff --git a/src/js/views/levelDropdownView.js b/src/js/views/levelDropdownView.js
index faf95b33..a5e9adbe 100644
--- a/src/js/views/levelDropdownView.js
+++ b/src/js/views/levelDropdownView.js
@@ -4,6 +4,7 @@ var Backbone = require('backbone');
var LocaleStore = require('../stores/LocaleStore');
var util = require('../util');
+var debounce = require('../util/debounce');
var intl = require('../intl');
var log = require('../log');
var KeyboardListener = require('../util/keyboard').KeyboardListener;
@@ -41,7 +42,7 @@ var LevelDropdownView = ContainedBase.extend({
};
this.navEvents = Object.assign({}, Backbone.Events);
- this.navEvents.on('clickedID', _.debounce(
+ this.navEvents.on('clickedID', debounce(
this.loadLevelID.bind(this),
300,
true
diff --git a/src/js/views/multiView.js b/src/js/views/multiView.js
index 9a3981ae..7d44a39a 100644
--- a/src/js/views/multiView.js
+++ b/src/js/views/multiView.js
@@ -1,4 +1,3 @@
-var _ = require('underscore');
var Q = require('q');
var Backbone = require('backbone');
@@ -10,6 +9,7 @@ var BuilderViews = require('../views/builderViews');
var MarkdownPresenter = BuilderViews.MarkdownPresenter;
var KeyboardListener = require('../util/keyboard').KeyboardListener;
+var debounce = require('../util/debounce');
var MultiView = Backbone.View.extend({
tagName: 'div',
@@ -84,13 +84,13 @@ var MultiView = Backbone.View.extend({
},
getPosFunc: function() {
- return _.debounce(function() {
+ return debounce(function() {
this.navForward();
}.bind(this), this.navEventDebounce, true);
},
getNegFunc: function() {
- return _.debounce(function() {
+ return debounce(function() {
this.navBackward();
}.bind(this), this.navEventDebounce, true);
},
diff --git a/src/js/visuals/index.js b/src/js/visuals/index.js
index 80d2d806..9029c2d5 100644
--- a/src/js/visuals/index.js
+++ b/src/js/visuals/index.js
@@ -3,6 +3,7 @@ var Q = require('q');
var intl = require('../intl');
var GRAPHICS = require('../util/constants').GRAPHICS;
+var debounce = require('../util/debounce');
var GlobalStateStore = require('../stores/GlobalStateStore');
var VisNode = require('../visuals/visNode').VisNode;
@@ -795,7 +796,7 @@ GitVisuals.prototype.canvasResize = function(width, height) {
};
GitVisuals.prototype.genResizeFunc = function() {
- this.resizeFunc = _.debounce(
+ this.resizeFunc = debounce(
function(width, height) {
this.refreshTree();
}.bind(this),
From 70b7a72bd7f7d7ff7bcb5c7aead45e69d8ae8398 Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?=EF=BC=A8=EF=BD=8F=EF=BD=8E=EF=BD=87=EF=BD=81=EF=BD=92?=
=?UTF-8?q?=EF=BD=83?=
Date: Wed, 5 Dec 2018 12:18:35 +0700
Subject: [PATCH 050/359] Use Object.values instead of _.each : 96ddb50
---
src/js/visuals/index.js | 19 +++++++++----------
1 file changed, 9 insertions(+), 10 deletions(-)
diff --git a/src/js/visuals/index.js b/src/js/visuals/index.js
index 9029c2d5..31afd596 100644
--- a/src/js/visuals/index.js
+++ b/src/js/visuals/index.js
@@ -1,4 +1,3 @@
-var _ = require('underscore');
var Q = require('q');
var intl = require('../intl');
@@ -83,7 +82,7 @@ GitVisuals.prototype.resetAll = function() {
visTag.remove();
}, this);
- _.each(this.visNodeMap, function(visNode) {
+ Object.values(this.visNodeMap).forEach(function(visNode) {
visNode.remove();
}, this);
@@ -207,7 +206,7 @@ GitVisuals.prototype.animateAllAttrKeys = function(keys, attr, speed, easing) {
this.visBranchCollection.each(animate);
this.visEdgeCollection.each(animate);
this.visTagCollection.each(animate);
- _.each(this.visNodeMap, animate);
+ Object.values(this.visNodeMap).forEach(animate);
var time = (speed !== undefined) ? speed : GRAPHICS.defaultAnimationTime;
setTimeout(function() {
@@ -322,7 +321,7 @@ GitVisuals.prototype.finishAnimation = function(speed) {
GitVisuals.prototype.explodeNodes = function(speed) {
var deferred = Q.defer();
var funcs = [];
- _.each(this.visNodeMap, function(visNode) {
+ Object.values(this.visNodeMap).forEach(function(visNode) {
funcs.push(visNode.getExplodeStepFunc(speed));
});
@@ -369,7 +368,7 @@ GitVisuals.prototype.animateAllFromAttrToAttr = function(fromSnapshot, toSnapsho
this.visBranchCollection.each(animate);
this.visEdgeCollection.each(animate);
this.visTagCollection.each(animate);
- _.each(this.visNodeMap, animate);
+ Object.values(this.visNodeMap).forEach(animate);
};
/***************************************
@@ -393,7 +392,7 @@ GitVisuals.prototype.genSnapshot = function() {
this.fullCalc();
var snapshot = {};
- _.each(this.visNodeMap, function(visNode) {
+ Object.values(this.visNodeMap).forEach(function(visNode) {
snapshot[visNode.get('id')] = visNode.getAttributes();
}, this);
@@ -633,7 +632,7 @@ GitVisuals.prototype.calcDepth = function() {
}
var depthIncrement = this.getDepthIncrement(maxDepth);
- _.each(this.visNodeMap, function(visNode) {
+ Object.values(this.visNodeMap).forEach(function(visNode) {
visNode.setDepthBasedOn(depthIncrement, this.getHeaderOffset());
}, this);
};
@@ -656,7 +655,7 @@ GitVisuals.prototype.calcDepth = function() {
**************************************/
GitVisuals.prototype.animateNodePositions = function(speed) {
- _.each(this.visNodeMap, function(visNode) {
+ Object.values(this.visNodeMap).forEach(function(visNode) {
visNode.animateUpdatedPosition(speed);
}, this);
};
@@ -854,7 +853,7 @@ GitVisuals.prototype.zIndexReflow = function() {
};
GitVisuals.prototype.visNodesFront = function() {
- _.each(this.visNodeMap, function(visNode) {
+ Object.values(this.visNodeMap).forEach(function(visNode) {
visNode.toFront();
});
};
@@ -893,7 +892,7 @@ GitVisuals.prototype.drawTreeFirstTime = function() {
this.gitReady = true;
this.calcTreeCoords();
- _.each(this.visNodeMap, function(visNode) {
+ Object.values(this.visNodeMap).forEach(function(visNode) {
visNode.genGraphics(this.paper);
}, this);
From d36619b7f6192e9dc71e54383868ff586e4e7827 Mon Sep 17 00:00:00 2001
From: Guodong Qu
Date: Wed, 5 Dec 2018 17:30:59 +0800
Subject: [PATCH 051/359] fix a little typo in cn
---
src/levels/remote/remoteBranches.js | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/src/levels/remote/remoteBranches.js b/src/levels/remote/remoteBranches.js
index 92b6a6c6..37ef477d 100644
--- a/src/levels/remote/remoteBranches.js
+++ b/src/levels/remote/remoteBranches.js
@@ -409,7 +409,7 @@ exports.level = {
"",
"远程分支反映了远程仓库(在你上次和它通信时)的**状态**。这会有助于你理解本地的工作与公共工作的差别 —— 这是你与别人分享工作成果前至关重要的一步.",
"",
- "远程分得有一个特别的属性,在你检出时自动进入分离 HEAD 状态。Git 这么做是出于不能直接在这些分支上进行操作的原因, 你必须在别的地方完成你的工作, (更新了远程分支之后)再用远程分享你的工作成果。"
+ "远程分支有一个特别的属性,在你检出时自动进入分离 HEAD 状态。Git 这么做是出于不能直接在这些分支上进行操作的原因, 你必须在别的地方完成你的工作, (更新了远程分支之后)再用远程分享你的工作成果。"
]
}
},
From d06e024a2a12c97d22a2753463bf795f66135e63 Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?=EF=BC=A8=EF=BD=8F=EF=BD=8E=EF=BD=87=EF=BD=81=EF=BD=92?=
=?UTF-8?q?=EF=BD=83?=
Date: Thu, 6 Dec 2018 23:14:46 +0700
Subject: [PATCH 052/359] fix(css): fix offset top of select level (in firefox)
---
src/style/main.css | 4 ++++
1 file changed, 4 insertions(+)
diff --git a/src/style/main.css b/src/style/main.css
index 93c884c3..be68b9d7 100644
--- a/src/style/main.css
+++ b/src/style/main.css
@@ -72,6 +72,10 @@ body,
display: -ms-flexbox;
}
+.contentHolder {
+ display: flex;
+}
+
body,
.flex1 {
-webkit-box-flex: 1;
From 94217601654b7a70bd25da76338d30b0b9122b42 Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?=EF=BC=A8=EF=BD=8F=EF=BD=8E=EF=BD=87=EF=BD=81=EF=BD=92?=
=?UTF-8?q?=EF=BD=83?=
Date: Fri, 7 Dec 2018 23:37:12 +0700
Subject: [PATCH 053/359] chore(git): remove some line is covered by other line
---
.gitignore | 9 ---------
1 file changed, 9 deletions(-)
diff --git a/.gitignore b/.gitignore
index f274b4d7..061b58db 100644
--- a/.gitignore
+++ b/.gitignore
@@ -4,9 +4,6 @@ node_modules/
# Build artifacts and asset stuff
build/*
-build/bundle.js
-build/bundle.*.js
-build/main.*.css
screens
FontAwesome-Vectors.pdf
index.html
@@ -22,7 +19,6 @@ index.html
*.xcworkspace
xcuserdata
UserInterfaceState.xcuserstate
-xcuserdata/
*.pbxuser
*.perspective
@@ -40,7 +36,6 @@ xcuserdata/
.User.xcconfig
-xcuserdata
Tools/xctool/build
Tools/clang/analyzer/build
Tools/clang/libtooling/build
@@ -50,7 +45,3 @@ VendorLib/Breakpad/src/tools/mac/dump_syms/build
DerivedData
VendorLib/clang/lib/arc
VendorLib/clang/lib/c++
-
-*.swp
-
-
From 882526f5ab5f9a1825ee8f9737620c944d4207e3 Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?=EF=BC=A8=EF=BD=8F=EF=BD=8E=EF=BD=87=EF=BD=81=EF=BD=92?=
=?UTF-8?q?=EF=BD=83?=
Date: Fri, 7 Dec 2018 23:41:09 +0700
Subject: [PATCH 054/359] chore(git): add yarn-error.log to .gitignore
---
.gitignore | 3 ++-
1 file changed, 2 insertions(+), 1 deletion(-)
diff --git a/.gitignore b/.gitignore
index 061b58db..b2903c14 100644
--- a/.gitignore
+++ b/.gitignore
@@ -1,5 +1,6 @@
-# NPM
+# NPM and Yarn
npm-debug.log
+yarn-error.log
node_modules/
# Build artifacts and asset stuff
From e8101470e49b8324fd49753dd3cf0e0f46635dba Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?=EF=BC=A8=EF=BD=8F=EF=BD=8E=EF=BD=87=EF=BD=81=EF=BD=92?=
=?UTF-8?q?=EF=BD=83?=
Date: Sat, 8 Dec 2018 18:21:18 +0700
Subject: [PATCH 055/359] refactor(html): don't use underscore.min.js
---
Gruntfile.js | 2 --
lib/underscore-min.js | 32 --------------------------------
2 files changed, 34 deletions(-)
delete mode 100644 lib/underscore-min.js
diff --git a/Gruntfile.js b/Gruntfile.js
index d144f722..6df6a1ba 100644
--- a/Gruntfile.js
+++ b/Gruntfile.js
@@ -22,13 +22,11 @@ var indexTemplate = _.template(indexFile);
var prodDependencies = [
'',
'',
- '',
''
];
var devDependencies = [
'',
- '',
'',
''
];
diff --git a/lib/underscore-min.js b/lib/underscore-min.js
deleted file mode 100644
index 5a0cb3b0..00000000
--- a/lib/underscore-min.js
+++ /dev/null
@@ -1,32 +0,0 @@
-// Underscore.js 1.3.3
-// (c) 2009-2012 Jeremy Ashkenas, DocumentCloud Inc.
-// Underscore is freely distributable under the MIT license.
-// Portions of Underscore are inspired or borrowed from Prototype,
-// Oliver Steele's Functional, and John Resig's Micro-Templating.
-// For all details and documentation:
-// http://documentcloud.github.com/underscore
-(function(){function r(a,c,d){if(a===c)return 0!==a||1/a==1/c;if(null==a||null==c)return a===c;a._chain&&(a=a._wrapped);c._chain&&(c=c._wrapped);if(a.isEqual&&b.isFunction(a.isEqual))return a.isEqual(c);if(c.isEqual&&b.isFunction(c.isEqual))return c.isEqual(a);var e=l.call(a);if(e!=l.call(c))return!1;switch(e){case "[object String]":return a==""+c;case "[object Number]":return a!=+a?c!=+c:0==a?1/a==1/c:a==+c;case "[object Date]":case "[object Boolean]":return+a==+c;case "[object RegExp]":return a.source==
-c.source&&a.global==c.global&&a.multiline==c.multiline&&a.ignoreCase==c.ignoreCase}if("object"!=typeof a||"object"!=typeof c)return!1;for(var f=d.length;f--;)if(d[f]==a)return!0;d.push(a);var f=0,g=!0;if("[object Array]"==e){if(f=a.length,g=f==c.length)for(;f--&&(g=f in a==f in c&&r(a[f],c[f],d)););}else{if("constructor"in a!="constructor"in c||a.constructor!=c.constructor)return!1;for(var h in a)if(b.has(a,h)&&(f++,!(g=b.has(c,h)&&r(a[h],c[h],d))))break;if(g){for(h in c)if(b.has(c,h)&&!f--)break;
-g=!f}}d.pop();return g}var s=this,I=s._,o={},k=Array.prototype,p=Object.prototype,i=k.slice,J=k.unshift,l=p.toString,K=p.hasOwnProperty,y=k.forEach,z=k.map,A=k.reduce,B=k.reduceRight,C=k.filter,D=k.every,E=k.some,q=k.indexOf,F=k.lastIndexOf,p=Array.isArray,L=Object.keys,t=Function.prototype.bind,b=function(a){return new m(a)};"undefined"!==typeof exports?("undefined"!==typeof module&&module.exports&&(exports=module.exports=b),exports._=b):s._=b;b.VERSION="1.3.3";var j=b.each=b.forEach=function(a,
-c,d){if(a!=null)if(y&&a.forEach===y)a.forEach(c,d);else if(a.length===+a.length)for(var e=0,f=a.length;e2;a==null&&(a=[]);if(A&&
-a.reduce===A){e&&(c=b.bind(c,e));return f?a.reduce(c,d):a.reduce(c)}j(a,function(a,b,i){if(f)d=c.call(e,d,a,b,i);else{d=a;f=true}});if(!f)throw new TypeError("Reduce of empty array with no initial value");return d};b.reduceRight=b.foldr=function(a,c,d,e){var f=arguments.length>2;a==null&&(a=[]);if(B&&a.reduceRight===B){e&&(c=b.bind(c,e));return f?a.reduceRight(c,d):a.reduceRight(c)}var g=b.toArray(a).reverse();e&&!f&&(c=b.bind(c,e));return f?b.reduce(g,c,d,e):b.reduce(g,c)};b.find=b.detect=function(a,
-c,b){var e;G(a,function(a,g,h){if(c.call(b,a,g,h)){e=a;return true}});return e};b.filter=b.select=function(a,c,b){var e=[];if(a==null)return e;if(C&&a.filter===C)return a.filter(c,b);j(a,function(a,g,h){c.call(b,a,g,h)&&(e[e.length]=a)});return e};b.reject=function(a,c,b){var e=[];if(a==null)return e;j(a,function(a,g,h){c.call(b,a,g,h)||(e[e.length]=a)});return e};b.every=b.all=function(a,c,b){var e=true;if(a==null)return e;if(D&&a.every===D)return a.every(c,b);j(a,function(a,g,h){if(!(e=e&&c.call(b,
-a,g,h)))return o});return!!e};var G=b.some=b.any=function(a,c,d){c||(c=b.identity);var e=false;if(a==null)return e;if(E&&a.some===E)return a.some(c,d);j(a,function(a,b,h){if(e||(e=c.call(d,a,b,h)))return o});return!!e};b.include=b.contains=function(a,c){var b=false;if(a==null)return b;if(q&&a.indexOf===q)return a.indexOf(c)!=-1;return b=G(a,function(a){return a===c})};b.invoke=function(a,c){var d=i.call(arguments,2);return b.map(a,function(a){return(b.isFunction(c)?c||a:a[c]).apply(a,d)})};b.pluck=
-function(a,c){return b.map(a,function(a){return a[c]})};b.max=function(a,c,d){if(!c&&b.isArray(a)&&a[0]===+a[0])return Math.max.apply(Math,a);if(!c&&b.isEmpty(a))return-Infinity;var e={computed:-Infinity};j(a,function(a,b,h){b=c?c.call(d,a,b,h):a;b>=e.computed&&(e={value:a,computed:b})});return e.value};b.min=function(a,c,d){if(!c&&b.isArray(a)&&a[0]===+a[0])return Math.min.apply(Math,a);if(!c&&b.isEmpty(a))return Infinity;var e={computed:Infinity};j(a,function(a,b,h){b=c?c.call(d,a,b,h):a;bd?1:0}),"value")};b.groupBy=function(a,c){var d={},e=b.isFunction(c)?c:function(a){return a[c]};
-j(a,function(a,b){var c=e(a,b);(d[c]||(d[c]=[])).push(a)});return d};b.sortedIndex=function(a,c,d){d||(d=b.identity);for(var e=0,f=a.length;e>1;d(a[g])=0})})};b.difference=function(a){var c=b.flatten(i.call(arguments,1),true);return b.filter(a,function(a){return!b.include(c,a)})};b.zip=function(){for(var a=
-i.call(arguments),c=b.max(b.pluck(a,"length")),d=Array(c),e=0;e=0;d--)b=[a[d].apply(this,b)];return b[0]}};b.after=function(a,b){return a<=0?b():function(){if(--a<1)return b.apply(this,arguments)}};b.keys=L||function(a){if(a!==Object(a))throw new TypeError("Invalid object");var c=[],d;for(d in a)b.has(a,d)&&(c[c.length]=d);return c};b.values=function(a){return b.map(a,b.identity)};b.functions=b.methods=function(a){var c=[],d;for(d in a)b.isFunction(a[d])&&
-c.push(d);return c.sort()};b.extend=function(a){j(i.call(arguments,1),function(b){for(var d in b)a[d]=b[d]});return a};b.pick=function(a){var c={};j(b.flatten(i.call(arguments,1)),function(b){b in a&&(c[b]=a[b])});return c};b.defaults=function(a){j(i.call(arguments,1),function(b){for(var d in b)a[d]==null&&(a[d]=b[d])});return a};b.clone=function(a){return!b.isObject(a)?a:b.isArray(a)?a.slice():b.extend({},a)};b.tap=function(a,b){b(a);return a};b.isEqual=function(a,b){return r(a,b,[])};b.isEmpty=
-function(a){if(a==null)return true;if(b.isArray(a)||b.isString(a))return a.length===0;for(var c in a)if(b.has(a,c))return false;return true};b.isElement=function(a){return!!(a&&a.nodeType==1)};b.isArray=p||function(a){return l.call(a)=="[object Array]"};b.isObject=function(a){return a===Object(a)};b.isArguments=function(a){return l.call(a)=="[object Arguments]"};b.isArguments(arguments)||(b.isArguments=function(a){return!(!a||!b.has(a,"callee"))});b.isFunction=function(a){return l.call(a)=="[object Function]"};
-b.isString=function(a){return l.call(a)=="[object String]"};b.isNumber=function(a){return l.call(a)=="[object Number]"};b.isFinite=function(a){return b.isNumber(a)&&isFinite(a)};b.isNaN=function(a){return a!==a};b.isBoolean=function(a){return a===true||a===false||l.call(a)=="[object Boolean]"};b.isDate=function(a){return l.call(a)=="[object Date]"};b.isRegExp=function(a){return l.call(a)=="[object RegExp]"};b.isNull=function(a){return a===null};b.isUndefined=function(a){return a===void 0};b.has=function(a,
-b){return K.call(a,b)};b.noConflict=function(){s._=I;return this};b.identity=function(a){return a};b.times=function(a,b,d){for(var e=0;e/g,">").replace(/"/g,""").replace(/'/g,"'").replace(/\//g,"/")};b.result=function(a,c){if(a==null)return null;var d=a[c];return b.isFunction(d)?d.call(a):d};b.mixin=function(a){j(b.functions(a),function(c){M(c,b[c]=a[c])})};var N=0;b.uniqueId=
-function(a){var b=N++;return a?a+b:b};b.templateSettings={evaluate:/<%([\s\S]+?)%>/g,interpolate:/<%=([\s\S]+?)%>/g,escape:/<%-([\s\S]+?)%>/g};var u=/.^/,n={"\\":"\\","'":"'",r:"\r",n:"\n",t:"\t",u2028:"\u2028",u2029:"\u2029"},v;for(v in n)n[n[v]]=v;var O=/\\|'|\r|\n|\t|\u2028|\u2029/g,P=/\\(\\|'|r|n|t|u2028|u2029)/g,w=function(a){return a.replace(P,function(a,b){return n[b]})};b.template=function(a,c,d){d=b.defaults(d||{},b.templateSettings);a="__p+='"+a.replace(O,function(a){return"\\"+n[a]}).replace(d.escape||
-u,function(a,b){return"'+\n_.escape("+w(b)+")+\n'"}).replace(d.interpolate||u,function(a,b){return"'+\n("+w(b)+")+\n'"}).replace(d.evaluate||u,function(a,b){return"';\n"+w(b)+"\n;__p+='"})+"';\n";d.variable||(a="with(obj||{}){\n"+a+"}\n");var a="var __p='';var print=function(){__p+=Array.prototype.join.call(arguments, '')};\n"+a+"return __p;\n",e=new Function(d.variable||"obj","_",a);if(c)return e(c,b);c=function(a){return e.call(this,a,b)};c.source="function("+(d.variable||"obj")+"){\n"+a+"}";return c};
-b.chain=function(a){return b(a).chain()};var m=function(a){this._wrapped=a};b.prototype=m.prototype;var x=function(a,c){return c?b(a).chain():a},M=function(a,c){m.prototype[a]=function(){var a=i.call(arguments);J.call(a,this._wrapped);return x(c.apply(b,a),this._chain)}};b.mixin(b);j("pop,push,reverse,shift,sort,splice,unshift".split(","),function(a){var b=k[a];m.prototype[a]=function(){var d=this._wrapped;b.apply(d,arguments);var e=d.length;(a=="shift"||a=="splice")&&e===0&&delete d[0];return x(d,
-this._chain)}});j(["concat","join","slice"],function(a){var b=k[a];m.prototype[a]=function(){return x(b.apply(this._wrapped,arguments),this._chain)}});m.prototype.chain=function(){this._chain=true;return this};m.prototype.value=function(){return this._wrapped}}).call(this);
From 2aebbb3b400bf574cd97895007b9685dd5a9f3fe Mon Sep 17 00:00:00 2001
From: wasd845
Date: Sun, 16 Dec 2018 13:53:00 +0800
Subject: [PATCH 056/359] fix chinese translate
---
src/levels/rampup/cherryPick.js | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/src/levels/rampup/cherryPick.js b/src/levels/rampup/cherryPick.js
index ce0094a3..197c8967 100644
--- a/src/levels/rampup/cherryPick.js
+++ b/src/levels/rampup/cherryPick.js
@@ -328,7 +328,7 @@
"",
"到现在我们已经学习了 Git 的基础知识 —— 提交、分支以及在提交树上移动。 这些概念涵盖了 Git 90% 的功能,同样也足够满足开发者的日常需求 ",
"",
- "然而, 剩余的 10% 在处理复杂的工作流时(或者当你陷入困惑时)可能就显示尤为重要了。接下来要讨论的这个话题是“整理提交记录” —— 开发人员有时会说“我想要把这个提交放到这里, 那个提交放到刚才那个提交的后面”, 而接下来就讲的就是它的实现方式,非常清晰、灵活,还很生动。",
+ "然而, 剩余的 10% 在处理复杂的工作流时(或者当你陷入困惑时)可能就显得尤为重要了。接下来要讨论的这个话题是“整理提交记录” —— 开发人员有时会说“我想要把这个提交放到这里, 那个提交放到刚才那个提交的后面”, 而接下来就讲的就是它的实现方式,非常清晰、灵活,还很生动。",
"",
"看起来挺复杂, 其实是个很简单的概念。"
]
From 2b4046c3e4521fb6beabb3715505618d77badc51 Mon Sep 17 00:00:00 2001
From: labixiaoshuai <35826995+labixiaoshuai@users.noreply.github.com>
Date: Fri, 21 Dec 2018 11:29:51 +0800
Subject: [PATCH 057/359] Update interactiveRebase.js
Modify zh_CN translation
---
src/levels/rampup/interactiveRebase.js | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/src/levels/rampup/interactiveRebase.js b/src/levels/rampup/interactiveRebase.js
index ed3aaf1e..a99713f9 100644
--- a/src/levels/rampup/interactiveRebase.js
+++ b/src/levels/rampup/interactiveRebase.js
@@ -236,7 +236,7 @@
"markdowns": [
"## 交互式的 rebase",
"",
- "当你你知道你所需要的提交记录(**并且**还知道这些提交记录的哈希值)时, 用 cherry-pick 再好不过了 —— 没有比这更简单的方式了。",
+ "当你知道你所需要的提交记录(**并且**还知道这些提交记录的哈希值)时, 用 cherry-pick 再好不过了 —— 没有比这更简单的方式了。",
"",
"但是如果你不清楚你想要的提交记录的哈希值呢? 幸好 Git 帮你想到了这一点, 我们可以利用交互式的 rebase —— 如果你想从一系列的提交记录中找到想要的记录, 这就是最好的方法了",
"",
From 07fd775ce47a74c30fa70f3e1cd2c63d093f6558 Mon Sep 17 00:00:00 2001
From: Bezout
Date: Sun, 20 Jan 2019 09:43:37 +0100
Subject: [PATCH 058/359] update french spelling
---
src/js/dialogs/confirmShowSolution.js | 2 +-
src/js/intl/strings.js | 12 ++++++------
src/levels/advanced/multipleParents.js | 6 +++---
src/levels/index.js | 4 ++--
src/levels/intro/branching.js | 2 +-
src/levels/intro/merging.js | 4 ++--
src/levels/intro/rebasing.js | 2 +-
src/levels/mixed/describe.js | 6 +++---
src/levels/mixed/jugglingCommits.js | 10 +++++-----
src/levels/mixed/jugglingCommits2.js | 2 +-
src/levels/mixed/tags.js | 2 +-
src/levels/rampup/cherryPick.js | 2 +-
src/levels/rampup/detachedHead.js | 4 ++--
src/levels/rampup/interactiveRebase.js | 4 ++--
src/levels/rampup/relativeRefs2.js | 2 +-
src/levels/rampup/reversingChanges.js | 4 ++--
src/levels/rebase/selectiveRebase.js | 4 ++--
src/levels/remote/pushManyFeatures.js | 2 +-
18 files changed, 37 insertions(+), 37 deletions(-)
diff --git a/src/js/dialogs/confirmShowSolution.js b/src/js/dialogs/confirmShowSolution.js
index edd92462..b846cb43 100644
--- a/src/js/dialogs/confirmShowSolution.js
+++ b/src/js/dialogs/confirmShowSolution.js
@@ -65,7 +65,7 @@ exports.dialog = {
markdowns: [
'## Êtes-vous sûr de vouloir voir la solution ?',
'',
- 'Je crois en vous ! Vous pouvez le faire'
+ 'Je crois en vous ! Vous pouvez le faire !'
]
}
}],
diff --git a/src/js/intl/strings.js b/src/js/intl/strings.js
index 34306127..20683cc4 100755
--- a/src/js/intl/strings.js
+++ b/src/js/intl/strings.js
@@ -88,7 +88,7 @@ exports.strings = {
'es_ES': 'La opción -A no se necesita para este aplicación, sólo hace un commit!',
'pt_BR': 'A opção -A não é necessária para este aplicativo, simplesmente faça commit',
'de_DE': 'Die Option -A wird in dieser Anwendung nicht benötigt, committe einfach!',
- 'fr_FR': 'L\'option -A n\'est pas nécessaire pour cette application, simplemer commiter',
+ 'fr_FR': 'L\'option -A n\'est pas nécessaire pour cette application, simplement commiter',
'ru_RU': 'Опция -A не требуется для этого приложения, просто сделайте коммит.',
'uk': 'Опція -A не потрібна для цього застосунку, можна просто комітити!',
'ko': '이 앱에선 -A 옵션은 필요 없습니다. 그냥 커밋하세요!'
@@ -102,7 +102,7 @@ exports.strings = {
'es_AR': 'No hay un comando status para esta aplicación, dado que no hay archivos que indexar. Probá hg summary, en cambio',
'es_ES': 'No hay un comando status para esta aplicación, porque que no hay archivos que indexar. Prueba el comando hg summary, en cambio',
'pt_BR': 'Não existe um comando status para este aplicativo, já que não há staging de arquivos. Tente hg summary',
- 'fr_FR': 'Il n\'y a pas de commande status pour cette application, car il n\'y a pas de fichier stagé. Essayé hg summary à la place.',
+ 'fr_FR': 'Il n\'y a pas de commande status pour cette application, car il n\'y a pas de fichier stagé. Essayez hg summary à la place.',
'de_DE': 'Es gibt keinen Befehl status in dieser Anwendung, da es kein Staging von Dateien gibt. Probier stattdessen hg summary',
'ru_RU': 'Команда status не поддерживается в этом приложении, так как здесь нет файлов. Попробуйте выполнить hg summary',
'uk': 'Команда status не підтримується в цьому застосунку, так як немає стейджингу(staging) файлів. Натомість спробуй hg summary ',
@@ -324,7 +324,7 @@ exports.strings = {
'es_AR': '¡No hay commits para rebasear! Son todos commits de merge o cambios ya aplicados',
'es_ES': '¡No hay commits para hacer rebase! Todo es un merge commit o cambios ya hecho.',
'pt_BR': 'Não há commits para o rebase! São todos commits de merge ou mudanças já aplicadas',
- 'fr_FR': 'Aucune commit à rebaser ! Tout est soit un commit de merge, soit des modifications déjà appliquées',
+ 'fr_FR': 'Aucun commit à rebaser ! C\'est soit un commit de merge, soit des modifications déjà appliquées',
'ru_RU': 'Нет коммитов для rebase! Все в коммите слияния или изменения уже применены',
'uk': 'Нема комітів для rebase! Все в коміті злиття (merge commit) чи зміни вже застосовані',
'ko': 'rebase를 하기 위한 커밋이 없습니다! 모든 커밋과 변경 사항들의 병합은 이미 적용되었습니다.'
@@ -474,7 +474,7 @@ exports.strings = {
'es_AR': 'No podés hacer reset en el modo detached. Usá checkout si querés moverte',
'es_ES': 'No puedes hacer reset en el modo separado. Usa checkout si quieres moverte.',
'pt_BR': 'Não se pode fazer reset no modo detached. Use checkout se quiser se mover',
- 'fr_FR': 'On ne peut pas effectuer un reset quand head est détaché. Utilisez checkout pour déplacer',
+ 'fr_FR': 'On ne peut pas effectuer un reset quand HEAD est détaché. Utilisez checkout pour déplacer',
'ru_RU': 'Это невозможно в режиме detached HEAD! Используйте checkout!',
'uk': 'Неможливо зробити reset в стані detached head! Використовуй checkout якщо хочеш змінити розташування',
'ko': '분리된 HEAD에서 reset할 수 없습니다. 만약 이동시키기를 원한다면 checkout을 사용하세요.'
@@ -685,7 +685,7 @@ exports.strings = {
'es_ES': 'El nombre "{tag}" es prohibido para nombrar un tag.',
'pt_BR': 'Uma tag não pode ser chamada de "{tag}"!',
'de_DE': 'Der Tag-Name "{tag}" ist nicht erlaubt!',
- 'fr_FR': 'Le nom de tag "{tag}" n\'est pas autorisé!',
+ 'fr_FR': 'Le nom de tag "{tag}" n\'est pas autorisé',
'ru_RU': 'Название для тега "{tag}" недопустимо!',
'uk': 'Назва тегу "{tag}" є недопустимою',
'ko': '"{tag}"라는 태그명은 사용할 수 없습니다.'
@@ -834,7 +834,7 @@ exports.strings = {
'es_AR': 'Usá alguno de estos comandos para tener más información:',
'es_ES': 'Por favor usa uno de los siguientes comandos para más información:',
'pt_BR': 'Use algum destes comandos para ter mais informações:',
- 'fr_FR': 'Merci d\'utiliser une des commandes suivantes pour obtenir plus d\'info',
+ 'fr_FR': 'Merci d\'utiliser une des commandes suivantes pour obtenir plus d\'informations',
'ru_RU': 'Для получения большей информации используй следующие команды:',
'uk': 'Щоб отримати більше інформації використовуй наступні команди:',
'ko': '더 많은 정보를 위해 다음 명령어들중 하나를 사용하세요.'
diff --git a/src/levels/advanced/multipleParents.js b/src/levels/advanced/multipleParents.js
index 4a67f00d..93b5e3b7 100644
--- a/src/levels/advanced/multipleParents.js
+++ b/src/levels/advanced/multipleParents.js
@@ -209,13 +209,13 @@ exports.level = {
"type": "ModalAlert",
"options": {
"markdowns": [
- "### Determine les Parents",
+ "### Détermine les parents",
"",
"Comme le symbole `~`, le symbole `^` accepte un numéro après lui.",
"",
"Au lieu d'entrer le nombre de générations à remonter (ce que `~` fait), le symbole `^` détermine quel parent est à remonter. Attention, un merge commit a deux parents ce qui peut porter à confusion.",
"",
- "Normalement Git suit le \"premier\" parent pour un commit/merge, mais avec un numéro suivi de `^` le comportement par défault est modifié.",
+ "Normalement Git suit le \"premier\" parent pour un commit/merge, mais avec un numéro suivi de `^` le comportement par défaut est modifié.",
"",
"Assez de bla bla, passons à l\'action",
""
@@ -282,7 +282,7 @@ exports.level = {
"markdowns": [
"### Un peu de pratique",
"",
- "Pour réussir le niveau, créez une nouvelle branche à la destination indiquée",
+ "Pour réussir le niveau, créez une nouvelle branche à la destination indiquée.",
"",
"Évidement ce serait plus rapide de spécifier le commit (C6 par exemple), mais faites-le plutôt avec les symboles de déplacement dont nous venons de parler !"
]
diff --git a/src/levels/index.js b/src/levels/index.js
index af38e18a..f35474ad 100644
--- a/src/levels/index.js
+++ b/src/levels/index.js
@@ -183,7 +183,7 @@ var sequenceInfo = exports.sequenceInfo = {
about: {
'en_US': 'Get comfortable with modifying the source tree',
'de_DE': 'Gewöhn dich daran, den Git-Baum zu verändern',
- 'fr_FR': 'Soyez alaise de modifier l\'arbre Git',
+ 'fr_FR': 'Soyez à l\'aise pour modifier l\'arbre Git',
'es_AR': 'Ponete cómodo con modificar el directorio fuente',
'pt_BR': 'Fique confortável em modificar a árvore de códigos',
'ko' : '작업 트리를 수정하는건 식은죽 먹기지요 이제',
@@ -227,7 +227,7 @@ var sequenceInfo = exports.sequenceInfo = {
'en_US': 'Advanced Topics',
'de_DE': 'Themen für Fortgeschrittene',
'ja' : '上級トピック',
- 'fr_FR': 'Sujets Avancés',
+ 'fr_FR': 'Sujets avancés',
'es_AR': 'Temas avanzados',
'pt_BR': 'Temas avançados',
'zh_CN': '高级话题',
diff --git a/src/levels/intro/branching.js b/src/levels/intro/branching.js
index b77195ca..79c00471 100644
--- a/src/levels/intro/branching.js
+++ b/src/levels/intro/branching.js
@@ -462,7 +462,7 @@ exports.level = {
"Travaillons mainenant dans cette branche. Appuyez sur le bouton ci-dessous."
],
"afterMarkdowns": [
- "Oh non! La branche `master` a bougé mais pas la branche `newImage` ! C'est parce que nous n'étions pas \"sur\" la nouvelle branche, comme indiqué par l'asterisque (*) sur `master`"
+ "Oh non! La branche `master` a bougé mais pas la branche `newImage` ! C'est parce que nous n'étions pas \"sur\" la nouvelle branche, comme indiqué par l'astérisque (*) sur `master`"
],
"command": "git commit",
"beforeCommand": "git branch newImage"
diff --git a/src/levels/intro/merging.js b/src/levels/intro/merging.js
index 21f2be7c..35a1d2bb 100644
--- a/src/levels/intro/merging.js
+++ b/src/levels/intro/merging.js
@@ -384,7 +384,7 @@ exports.level = {
"markdowns": [
"## Branches et Merges",
"",
- "Super ! Nous savons désormais comment faire des commits et des branches. Maintenant nous devons apprendre comment combiner ensemble les contenus de deux branches différentes. Ceci nous permettra de créer une nouvelle branche, développer une nouvelle fonctionnalité sur cette dernière, puis intégrer cette fonctionnalité en combinant le contenu de cette branche de développement à la branche d'origine(master par exemple).",
+ "Super ! Nous savons désormais comment faire des commits et des branches. Maintenant nous devons apprendre comment combiner ensemble les contenus de deux branches différentes. Ceci nous permettra de créer une nouvelle branche, développer une nouvelle fonctionnalité sur cette dernière, puis intégrer cette fonctionnalité en combinant le contenu de cette branche de développement à la branche d'origine (master par exemple).",
"",
"La première méthode que nous allons voir pour combiner le contenu de deux branches est `git merge`. Faire un 'merge' avec Git crée un commit spécial qui a deux parents. Un commit avec deux parents indique en susbtance \"Je veux inclure le contenu de ce parent et le contenu de cet autre parent, *et* l'ensemble de leurs parents.\"",
"",
@@ -418,7 +418,7 @@ exports.level = {
"Faisons un merge de `master` dans `bugFix`:"
],
"afterMarkdowns": [
- "Puisque `bugFix` était un descendant de `master`, git n'avait aucun travail à effectuer ; il a simplement déplacé `bugFix` au même commit auquel `master` est attaché.",
+ "Puisque `bugFix` était un descendant de `master`, git n'avait aucun travail à effectuer; il a simplement déplacé `bugFix` au même commit auquel `master` est attaché.",
"",
"Maintenant tous les commits sont de la même couleur, ce qui indique que chaque branche contient tout le contenu du dépôt ! Woohoo!"
],
diff --git a/src/levels/intro/rebasing.js b/src/levels/intro/rebasing.js
index 6d7c2f47..3cfb56bd 100644
--- a/src/levels/intro/rebasing.js
+++ b/src/levels/intro/rebasing.js
@@ -386,7 +386,7 @@ exports.level = {
"type": "GitDemonstrationView",
"options": {
"beforeMarkdowns": [
- "Ici nous avons encore une fois deux branches; notez que nous sommes sur la branche bugFix (cf. l'asterisque)",
+ "Ici nous avons encore une fois deux branches; notez que nous sommes sur la branche bugFix (cf. l'astérisque)",
"",
"Nous voudrions transférer notre travail de la branche 'bugFix' directement sur le travail existant dans 'master'. Ainsi on aurait l'impression que ces deux travaux ont été développés séquentiellement alors qu'en réalité ils ont été réalisés en parallèle.",
"",
diff --git a/src/levels/mixed/describe.js b/src/levels/mixed/describe.js
index 167cf55c..a1442d8b 100644
--- a/src/levels/mixed/describe.js
+++ b/src/levels/mixed/describe.js
@@ -17,7 +17,7 @@
},
"hint": {
"en_US": "Just commit once on bugFix when you're ready to move on",
- "fr_FR": "Faites un commit sur bugFix quand vous êtes pret",
+ "fr_FR": "Faites un commit sur bugFix quand vous êtes prêt",
"de_DE": "Committe nur einmal auf bugFix, wenn du soweit bist",
"ja" : "次に進む準備が整ったなら、bugFixに対して一回commitしてください",
"es_AR": "Simplemente commiteá una vez en bugFix cuando estés listo para seguir",
@@ -102,7 +102,7 @@
"",
"Parce ce que les tags sont de très bonnes références dans le code, git à une commande pour *décrire* (describe) la différence entre le commit et le tag le plus récent. Cette commande s'appelle `git describe` !",
"",
- "Git describe peut vous aider lorsque vous vous êtes beaucoup déplacé ; cela peut arriver après un git bisect (chercher l'apparition d'un bug) ou lorsque vous revenez de vacances après 3 semaines sur l'ordinateur d'un collègue."
+ "Git describe peut vous aider lorsque vous vous êtes beaucoup déplacé; cela peut arriver après un git bisect (chercher l'apparition d'un bug) ou lorsque vous revenez de vacances après 3 semaines sur l'ordinateur d'un collègue."
]
}
},
@@ -114,7 +114,7 @@
"",
"`git describe `",
"",
- "où `` est un n'importe quelle chose que git peut résoudre en un commit. Si vous ne specifiez pas de ref, `HEAD` est pris par défault.",
+ "où `` est un n'importe quelle chose que git peut résoudre en un commit. Si vous ne spécifiez pas de ref, `HEAD` est pris par défaut.",
"",
"Le résultat de la commande ressemble à :",
"",
diff --git a/src/levels/mixed/jugglingCommits.js b/src/levels/mixed/jugglingCommits.js
index b7268699..7b2d2533 100644
--- a/src/levels/mixed/jugglingCommits.js
+++ b/src/levels/mixed/jugglingCommits.js
@@ -21,7 +21,7 @@ exports.level = {
"ko": "커밋들 갖고 놀기",
"en_US": "Juggling Commits",
"de_DE": "Jonglieren mit Commits",
- "fr_FR": "Jongler avec les Commits",
+ "fr_FR": "Jongler avec les commits",
"es_AR": "Haciendo malabares con los commits",
"pt_BR": "Malabarismo com commits",
"ja": "コミットをやりくりする",
@@ -84,9 +84,9 @@ exports.level = {
"type": "ModalAlert",
"options": {
"markdowns": [
- "## Jongler avec les Commits",
+ "## Jongler avec les commits",
"",
- "Voici une autre situation fréquente. Vous avez certains changements (`newImage`) et un autre groupe de changements (`caption`) qui sont reliés, ils sont donc empilés l'un sur l'autre dans votre dépôt Git (i.e. un après l'autre).",
+ "Voici une autre situation fréquente. Vous avez certains changements (`newImage`) et un autre groupe de changements (`caption`) qui sont reliés, ils sont donc empilés l'un sur l'autre dans votre dépôt Git (i.e. l'un après l'autre).",
"",
"Là où ça se complique c'est lorsque vous devez faire une petite modification dans un commit antérieur. Dans ce cas, les configurations de `newImage` devront changer un peu, même si ce commit est loin dans notre historique !!"
]
@@ -105,9 +105,9 @@ exports.level = {
"",
"Il y a plusieurs façons d'atteindre ce but (cherry-pick semble très tentant), mais nous allons parler de cherry-pick plus tard, pour le moment concentrez-vous sur cette technique.",
"",
- "Pour terminer, Faites attention au but -- Dû au fait que nous déplaçons les commits 2 fois, ils se retrouvent les deux avec une apostrophe. Une deuxième apostrophe est ajouté sur le commit que nous modifions, ce qui nous donne l'arbre finale ",
+ "Pour terminer, Faites attention au but -- Dû au fait que nous déplaçons les commits 2 fois, ils se retrouvent tous les deux avec une apostrophe. Une deuxième apostrophe est ajoutée sur le commit que nous modifions, ce qui nous donne la forme finale de l'arbre.",
"",
- "Ceci étant dit, je peux comparer le résultat avec la stucture et les différentes apostophes. Tant que votre arbre master a la même structure et apostrophe le niveau sera considéré réussi."
+ "Ceci étant dit, je peux comparer le résultat avec la structure et les différentes apostrophes. Tant que votre arbre `master` a la même structure et les différentes apostrophes le niveau sera considéré réussi."
]
}
},
diff --git a/src/levels/mixed/jugglingCommits2.js b/src/levels/mixed/jugglingCommits2.js
index 0c2b3615..067a0ab1 100644
--- a/src/levels/mixed/jugglingCommits2.js
+++ b/src/levels/mixed/jugglingCommits2.js
@@ -31,7 +31,7 @@ exports.level = {
},
"hint": {
"en_US": "Don't forget to forward master to the updated changes!",
- "fr_FR": "N'oubliez pas de forwarder la branch master dans la nouvelle branch",
+ "fr_FR": "N'oubliez pas d'appliquer les changements depuis la branche master",
"es_AR": "¡No te olvides de avanzar master a los cambios actualizados!",
"pt_BR": "Não se esqueça de avançar a referência do master para as mudanças efetuadas!",
"de_DE": "Vergiss nicht den master auf die aktuelle Version vorzuspulen",
diff --git a/src/levels/mixed/tags.js b/src/levels/mixed/tags.js
index 1e00da6a..a52c5ea7 100644
--- a/src/levels/mixed/tags.js
+++ b/src/levels/mixed/tags.js
@@ -100,7 +100,7 @@
"type": "ModalAlert",
"options": {
"markdowns": [
- "Vous l'avez deviné ! Git tags offre cette fonctionnalité : les tags marquent à jamais certains commits comme \"milestone\" auxquels vous pouvez vous référez comme à des branches.",
+ "Vous l'avez deviné ! Les tags Git offrent cette fonctionnalité : les tags marquent à jamais certains commits comme \"milestone\" (étape clé) auxquels vous pouvez vous référer comme à des branches.",
"",
"Encore plus important, il sont définitifs. Vous ne pouvez donc pas rajouter de commit dans un tag : les tags sont un peu comme un pointeur définitif dans l'arbre des commits.",
"",
diff --git a/src/levels/rampup/cherryPick.js b/src/levels/rampup/cherryPick.js
index ce0094a3..c82bce2d 100644
--- a/src/levels/rampup/cherryPick.js
+++ b/src/levels/rampup/cherryPick.js
@@ -20,7 +20,7 @@
"uk": "Знайомство з cherry-pick"
},
"hint": {
- "fr_FR": "git cherry-pick suivis par les noms de commits",
+ "fr_FR": "git cherry-pick suivi par les noms de commits",
"en_US": "git cherry-pick followed by commit names!",
"de_DE": "git cherry-pick gefolgt von Commit-Namen.",
"ja" : "git cherry-pickの後にコミット名を追加",
diff --git a/src/levels/rampup/detachedHead.js b/src/levels/rampup/detachedHead.js
index 887c635a..62b9200a 100644
--- a/src/levels/rampup/detachedHead.js
+++ b/src/levels/rampup/detachedHead.js
@@ -6,7 +6,7 @@ exports.level = {
"en_US": "Detach yo' HEAD",
"es_AR": "Desatacheá tu HEAD",
"pt_BR": "Solte a sua cabeça",
- "fr_FR": "Détachez votre HEAD",
+ "fr_FR": "Détacher votre HEAD",
"zh_CN": "分离 HEAD",
"zh_TW": "分離 HEAD",
"de_DE": "Den Kopf abtrennen",
@@ -21,7 +21,7 @@ exports.level = {
"pt_BR": "Use o identificador (hash) sobre o commit para te ajudar!",
"de_DE": "Benutze den Bezeichner (den Hash) des Commits.",
"ja" : "コミットのラベル(hash)を使用",
- "fr_FR": "Utiiser le label (identifiant) du commit pour aider !",
+ "fr_FR": "Utilisez le label (identifiant) du commit pour aider !",
"zh_TW": "使用 commit 上的標籤(hash)來幫助你!",
"zh_CN": "使用提交记录上的标签(哈希值)来指定提交记录!",
"ru_RU": "Ориентируйся по идентификаторам (hash) коммитов.",
diff --git a/src/levels/rampup/interactiveRebase.js b/src/levels/rampup/interactiveRebase.js
index a99713f9..d4f79450 100644
--- a/src/levels/rampup/interactiveRebase.js
+++ b/src/levels/rampup/interactiveRebase.js
@@ -11,7 +11,7 @@
"es_AR": "podés usar tanto ramas como referencias relativas (HEAD~) para especificar el objetivo del rebase",
"pt_BR": "Você pode usar ou ramos ou referências relativas (HEAD~) para especificar o alvo do rebase",
"de_DE": "Du kannst entweder Branches oder relative Ref-Angaben (z.B. HEAD~) benutzen, um das Ziel des Rebase anzugeben.",
- "fr_FR": "Vous pouvez utiliser soit les branches, soit les références relatives (HEAD~) pour spéficier la cible à rebaser",
+ "fr_FR": "Vous pouvez utiliser soit les branches, soit les références relatives (HEAD~) pour spécifier la cible à rebaser",
"zh_CN": "branch 或者是相对位置(HEAD~)都可以用來指定 rebase 的目标",
"zh_TW": "你可以指定 branch 或者是相對位置(HEAD~)來表示 rebase 的目標",
"ru_RU": "Можно использовать либо ветки, либо относительные ссылки (HEAD~), чтобы указать цель для Rebase",
@@ -108,7 +108,7 @@
"",
"Git cherry-pick est pratique quand vous savez exactement quels commits vous voulez (_et_ que vous connaissez leurs identifiants) -- il est difficile de battre la simplicité qu'il procure.",
"",
- "Mais que faire quand vous ne connaissez pas les identifiants des commits ? Heureusement git a pensé à vous dans pour ce cas-là ! Nous pouvons utiliser un rebase interactif pour cela -- c'est la meilleure façon de reconsidérer une série de commits que vous vous apprêtez à rebaser.",
+ "Mais que faire quand vous ne connaissez pas les identifiants des commits ? Heureusement git a pensé à vous pour ce cas-là ! Nous pouvons utiliser un rebase interactif pour cela -- c'est la meilleure façon de reconsidérer une série de commits que vous vous apprêtez à rebaser.",
"",
"Allons un peu plus dans les détails ..."
]
diff --git a/src/levels/rampup/relativeRefs2.js b/src/levels/rampup/relativeRefs2.js
index c3ac4171..03acaf62 100644
--- a/src/levels/rampup/relativeRefs2.js
+++ b/src/levels/rampup/relativeRefs2.js
@@ -287,7 +287,7 @@ exports.level = {
"Voyons l'effet de la précédente commande"
],
"afterMarkdowns": [
- "On y est ! Les références relatives nous donne une méthode concise pour référencer `C1` et le forçage de branche (`-f`) nous donne une méthode rapide pour bouger une branche à cet emplacement."
+ "On y est ! Les références relatives nous donnent une méthode concise pour référencer `C1` et le forçage de branche (`-f`) nous donne une méthode rapide pour bouger une branche à cet emplacement."
],
"command": "git branch -f master HEAD~3",
"beforeCommand": "git commit; git commit; git commit; git checkout -b bugFix"
diff --git a/src/levels/rampup/reversingChanges.js b/src/levels/rampup/reversingChanges.js
index c84ac7e5..2746c8ed 100644
--- a/src/levels/rampup/reversingChanges.js
+++ b/src/levels/rampup/reversingChanges.js
@@ -353,7 +353,7 @@ exports.level = {
"markdowns": [
"## Annuler des changements avec Git",
"",
- "Il y a de nombreuses façons d'annuler des changement avec Git. De même que pour les commits, annuler des changements avec Git est à la fois un aspect bas-niveau (gestion des fichiers et morceaux de fichiers) et un aspect de plus haut niveau (comment les changements sont effectivement annulés). Nous allons nous intéresser à ce dernier point.",
+ "Il y a de nombreuses façons d'annuler des changements avec Git. De même que pour les commits, annuler des changements avec Git est à la fois un aspect bas-niveau (gestion des fichiers et morceaux de fichiers) et un aspect de plus haut niveau (comment les changements sont effectivement annulés). Nous allons nous intéresser à ce dernier point.",
"",
"Il y a principalement deux façons d'annuler des changements avec Git : l'une est `git reset` et l'autre est `git revert`. Nous allons maintenant voir chacune de ces façons.",
""
@@ -400,7 +400,7 @@ exports.level = {
"type": "ModalAlert",
"options": {
"markdowns": [
- "Pour accomplir ce niveau, annulez les deux derniers commits à la fois sur `local` et sur `pushed`.",
+ "Pour accomplir ce niveau, annulez les derniers commits à la fois sur `local` et sur `pushed`. Vous devez annuler en tout 2 commits (un pour chaque branche).",
"",
"Ayez à l'esprit que `pushed` est une branche distante et `local` est une branche locale ; cela devrait vous guider dans le choix de la méthode à employer."
]
diff --git a/src/levels/rebase/selectiveRebase.js b/src/levels/rebase/selectiveRebase.js
index f337a353..328216d3 100644
--- a/src/levels/rebase/selectiveRebase.js
+++ b/src/levels/rebase/selectiveRebase.js
@@ -65,9 +65,9 @@ exports.level = {
"",
"Actuellement nous avons `master` qui se situe quelques commits devant les branches `one` `two` et `three`. Pour une raison quelconque, nous avons besoin de mettre ces trois branches à jour avec les modifications des derniers commits sur master.",
"",
- "La branche `one` a besoin d'une réorganisation et de la suppression de `C5`. `two` doit simplement être reordonnée, et `three` ne nécessite qu'un commit !",
+ "La branche `one` a besoin d'une réorganisation et de la suppression de `C5`. `two` doit simplement être réordonnée, et `three` ne nécessite qu'un commit !",
"",
- "Nous vous laissons imaginer la solution pour ce niveau ; comparez avec notre solution après-coup avec la commande `show solution`. "
+ "Nous vous laissons imaginer la solution pour ce niveau; comparez avec notre solution après-coup avec la commande `show solution`. "
]
}
}
diff --git a/src/levels/remote/pushManyFeatures.js b/src/levels/remote/pushManyFeatures.js
index 976fd613..da1742ae 100644
--- a/src/levels/remote/pushManyFeatures.js
+++ b/src/levels/remote/pushManyFeatures.js
@@ -124,7 +124,7 @@ exports.level = {
"type": "ModalAlert",
"options": {
"markdowns": [
- "Ce niveau est assez conséquent ; voici l'idée générale de la solution :",
+ "Ce niveau est assez conséquent; voici l'idée générale de la solution :",
"",
"* Il y a trois feature branches : `side1` `side2` et `side3`",
"* Nous voulons envoyer chacune de ces modifications, dans l'ordre, sur le dépôt distant",
From 5c92e692d3f4c310cab563165cfdc88b22a69c9e Mon Sep 17 00:00:00 2001
From: Daniel Le Berre
Date: Tue, 22 Jan 2019 09:50:51 +0100
Subject: [PATCH 059/359] Fix french translation
---
src/levels/rampup/interactiveRebase.js | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/src/levels/rampup/interactiveRebase.js b/src/levels/rampup/interactiveRebase.js
index a99713f9..9571eb86 100644
--- a/src/levels/rampup/interactiveRebase.js
+++ b/src/levels/rampup/interactiveRebase.js
@@ -108,7 +108,7 @@
"",
"Git cherry-pick est pratique quand vous savez exactement quels commits vous voulez (_et_ que vous connaissez leurs identifiants) -- il est difficile de battre la simplicité qu'il procure.",
"",
- "Mais que faire quand vous ne connaissez pas les identifiants des commits ? Heureusement git a pensé à vous dans pour ce cas-là ! Nous pouvons utiliser un rebase interactif pour cela -- c'est la meilleure façon de reconsidérer une série de commits que vous vous apprêtez à rebaser.",
+ "Mais que faire quand vous ne connaissez pas les identifiants des commits ? Heureusement git a pensé à vous pour ce cas-là ! Nous pouvons utiliser un rebase interactif pour cela -- c'est la meilleure façon de reconsidérer une série de commits que vous vous apprêtez à rebaser.",
"",
"Allons un peu plus dans les détails ..."
]
From e86175843b946649389865e87d7c258905c03e34 Mon Sep 17 00:00:00 2001
From: Daniel Le Berre
Date: Tue, 22 Jan 2019 10:19:01 +0100
Subject: [PATCH 060/359] Yet another small french typo fix
---
src/levels/index.js | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/src/levels/index.js b/src/levels/index.js
index af38e18a..a305f8f3 100644
--- a/src/levels/index.js
+++ b/src/levels/index.js
@@ -183,7 +183,7 @@ var sequenceInfo = exports.sequenceInfo = {
about: {
'en_US': 'Get comfortable with modifying the source tree',
'de_DE': 'Gewöhn dich daran, den Git-Baum zu verändern',
- 'fr_FR': 'Soyez alaise de modifier l\'arbre Git',
+ 'fr_FR': 'Soyez à l\'aise pour modifier l\'arbre Git',
'es_AR': 'Ponete cómodo con modificar el directorio fuente',
'pt_BR': 'Fique confortável em modificar a árvore de códigos',
'ko' : '작업 트리를 수정하는건 식은죽 먹기지요 이제',
From 7c0251fe0ceb73f45548a240d1c60a3cbbb3b3e5 Mon Sep 17 00:00:00 2001
From: Bezout
Date: Sun, 20 Jan 2019 09:53:21 +0100
Subject: [PATCH 061/359] pick -> Omit/Pick
---
src/template.index.html | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/src/template.index.html b/src/template.index.html
index 5fbc5fd6..6647fd8b 100644
--- a/src/template.index.html
+++ b/src/template.index.html
@@ -399,7 +399,7 @@
<% } %>
- (Drag and drop to re-order. Toggle the "pick" button to omit or re-add a commit)
+ (Drag and drop to re-order. Toggle the "Omit/Pick" button to omit or re-add a commit)
From 70fd61b68476ca179fce8792eb1380f18aebd191 Mon Sep 17 00:00:00 2001
From: Nikita Volobuev
Date: Tue, 19 Feb 2019 16:28:13 +0200
Subject: [PATCH 062/359] Make button text unselectable
---
src/style/main.css | 6 ++++++
1 file changed, 6 insertions(+)
diff --git a/src/style/main.css b/src/style/main.css
index be68b9d7..43a05ba9 100644
--- a/src/style/main.css
+++ b/src/style/main.css
@@ -1168,6 +1168,12 @@ div.gitDemonstrationView {
text-shadow: rgba(0,0,0,.4) 0 1px 0;
color: white;
+ -webkit-touch-callout: none;
+ -webkit-user-select: none;
+ -moz-user-select: none;
+ -ms-user-select: none;
+ user-select: none;
+
vertical-align: middle;
cursor: pointer;
}
From e4fd2065515093a1f892179eeb9c17feb32a4b24 Mon Sep 17 00:00:00 2001
From: Peter Cottle
Date: Wed, 20 Feb 2019 14:14:24 -0800
Subject: [PATCH 063/359] Resolves #540
---
src/levels/remote/pullArgs.js | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/src/levels/remote/pullArgs.js b/src/levels/remote/pullArgs.js
index a746ef3b..7b63fc00 100644
--- a/src/levels/remote/pullArgs.js
+++ b/src/levels/remote/pullArgs.js
@@ -74,7 +74,7 @@ exports.level = {
"If we specify the place to fetch, everything happens as before with fetch but we merge in whatever was just fetched"
],
"afterMarkdowns": [
- "See! by specifying `master` we downloaded commits onto `o/master` just as normal. Then we merged `o/master` to where we are, *regardless* of what was currently checked out."
+ "See! by specifying `master` we downloaded commits onto `o/master` just as normal. Then we merged `o/master` to our currently checked out location which is *not* the local branch `master`. For this reason it can actually make sense to run git pull multiple times (with the same args) from different locations in order to update multiple branches."
],
"command": "git pull origin master",
"beforeCommand": "git clone; go -b bar; git commit; git fakeTeamwork"
From 9a7a4d4c46fa88d02d92fdc6d75bce0cb307b9a3 Mon Sep 17 00:00:00 2001
From: Bernhard Weichel
Date: Mon, 25 Feb 2019 15:50:29 +0000
Subject: [PATCH 064/359] see #543 improved git describe
---
src/levels/mixed/describe.js | 6 ++++--
1 file changed, 4 insertions(+), 2 deletions(-)
diff --git a/src/levels/mixed/describe.js b/src/levels/mixed/describe.js
index a1442d8b..b0445568 100644
--- a/src/levels/mixed/describe.js
+++ b/src/levels/mixed/describe.js
@@ -1,4 +1,4 @@
-exports.level = {
+exports.level = {
"goalTreeString": "{\"branches\":{\"master\":{\"target\":\"C2\",\"id\":\"master\",\"remoteTrackingBranchID\":null},\"side\":{\"target\":\"C4\",\"id\":\"side\",\"remoteTrackingBranchID\":null},\"bugFix\":{\"target\":\"C7\",\"id\":\"bugFix\",\"remoteTrackingBranchID\":null}},\"commits\":{\"C0\":{\"parents\":[],\"id\":\"C0\",\"rootCommit\":true},\"C1\":{\"parents\":[\"C0\"],\"id\":\"C1\"},\"C2\":{\"parents\":[\"C1\"],\"id\":\"C2\"},\"C3\":{\"parents\":[\"C1\"],\"id\":\"C3\"},\"C4\":{\"parents\":[\"C3\"],\"id\":\"C4\"},\"C5\":{\"parents\":[\"C3\"],\"id\":\"C5\"},\"C6\":{\"parents\":[\"C5\"],\"id\":\"C6\"},\"C7\":{\"parents\":[\"C6\"],\"id\":\"C7\"}},\"tags\":{\"v0\":{\"target\":\"C0\",\"id\":\"v0\",\"type\":\"tag\"},\"v1\":{\"target\":\"C3\",\"id\":\"v1\",\"type\":\"tag\"}},\"HEAD\":{\"target\":\"bugFix\",\"id\":\"HEAD\"}}",
"solutionCommand": "git commit ",
"startTree": "{\"branches\":{\"master\":{\"target\":\"C2\",\"id\":\"master\",\"remoteTrackingBranchID\":null},\"side\":{\"target\":\"C4\",\"id\":\"side\",\"remoteTrackingBranchID\":null},\"bugFix\":{\"target\":\"C6\",\"id\":\"bugFix\",\"remoteTrackingBranchID\":null}},\"commits\":{\"C0\":{\"parents\":[],\"id\":\"C0\",\"rootCommit\":true},\"C1\":{\"parents\":[\"C0\"],\"id\":\"C1\"},\"C2\":{\"parents\":[\"C1\"],\"id\":\"C2\"},\"C3\":{\"parents\":[\"C1\"],\"id\":\"C3\"},\"C4\":{\"parents\":[\"C3\"],\"id\":\"C4\"},\"C5\":{\"parents\":[\"C3\"],\"id\":\"C5\"},\"C6\":{\"parents\":[\"C5\"],\"id\":\"C6\"}},\"tags\":{\"v0\":{\"target\":\"C0\",\"id\":\"v0\",\"type\":\"tag\"},\"v1\":{\"target\":\"C3\",\"id\":\"v1\",\"type\":\"tag\"}},\"HEAD\":{\"target\":\"bugFix\",\"id\":\"HEAD\"}}",
@@ -437,7 +437,9 @@
"",
"`__g`",
"",
- "`` ist dabei der nächstliegende Tag in den Vorgänger-Commits, `` zeigt an, wieviele Commits dieses Tag entfernt ist und `` ist das SHA des Commits, auf den das Tag zeigt."
+ "`` ist dabei der nächstliegende Tag in den Vorgänger-Commits, `` zeigt an, wieviele Commits dieses Tag entfernt ist und `` ist das SHA des Commits, auf den HEAD zeigt.",
+ "",
+ "**Achtung**: `` und `` erscheint nur, wenn HEAD nicht auf ein Tag zeigt. `git describe` verarbeitet standardmässig nur annotierte Tags. Um nicht annotierte tags zu sehen, verwende bitte`git describe --tags`."
]
}
},
From 79c8b1551cbd82943645591ad7402a655ac826ad Mon Sep 17 00:00:00 2001
From: Marcel Richter
Date: Mon, 25 Feb 2019 17:46:21 +0100
Subject: [PATCH 065/359] German translation fix
---
src/levels/remote/tracking.js | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/src/levels/remote/tracking.js b/src/levels/remote/tracking.js
index 8892cd6b..150e8956 100644
--- a/src/levels/remote/tracking.js
+++ b/src/levels/remote/tracking.js
@@ -782,7 +782,7 @@ exports.level = {
"",
" git checkout -b absolut_nicht_master o/master",
"",
- "eingibt, wir ein neuer lokaler Branch namens `absolut_nicht_master` angelegt, der `o/master` trackt."
+ "eingibt, wird ein neuer lokaler Branch namens `absolut_nicht_master` angelegt, der `o/master` trackt."
]
}
},
From 8ea87eb55da7db41a1aa61c99c62cd4b3dea4e96 Mon Sep 17 00:00:00 2001
From: Jan Keromnes
Date: Tue, 26 Feb 2019 14:52:10 +0000
Subject: [PATCH 066/359] Make contributions easier
---
.gitpod.yml | 6 ++++++
README.md | 6 +++++-
2 files changed, 11 insertions(+), 1 deletion(-)
create mode 100644 .gitpod.yml
diff --git a/.gitpod.yml b/.gitpod.yml
new file mode 100644
index 00000000..8fd958bc
--- /dev/null
+++ b/.gitpod.yml
@@ -0,0 +1,6 @@
+ports:
+- port: 8000
+ onOpen: open-preview
+tasks:
+- init: npm install && npm install -g grunt-cli
+ command: grunt build && python3 -m http.server 8000
diff --git a/README.md b/README.md
index 371266bc..bd03cc58 100644
--- a/README.md
+++ b/README.md
@@ -77,7 +77,7 @@ You'll also need `npm` to download all the dependencies of the project.
The general workflow / steps are below:
-```
+```bash
git clone
cd learnGitBranching
npm install # to install all the node modules I depend on
@@ -97,6 +97,10 @@ git push
# go online and request a pull
```
+Alternatively, you can also build and run the app in a pre-configured online workspace:
+
+[](https://gitpod.io/#https://github.com/pcottle/learnGitBranching/blob/master/src/js/git/index.js)
+
## Helpful Folks
A big shoutout to these brave souls for extensively testing our sandbox and finding bugs and/or inconsistencies:
From a5a2d149e90ee71fb81478fd71e5ac1d588d0a96 Mon Sep 17 00:00:00 2001
From: MichaWiedenmann
Date: Tue, 26 Feb 2019 21:48:06 +0100
Subject: [PATCH 067/359] Update German translation
Update translation of "Show Goal" and "Hide Goal".
---
src/js/intl/strings.js | 4 ++--
1 file changed, 2 insertions(+), 2 deletions(-)
diff --git a/src/js/intl/strings.js b/src/js/intl/strings.js
index 20683cc4..d465b700 100755
--- a/src/js/intl/strings.js
+++ b/src/js/intl/strings.js
@@ -1169,7 +1169,7 @@ exports.strings = {
'show-goal-button': {
'__desc__': 'button label to show goal',
'en_US': 'Show Goal',
- 'de_DE': 'Schauen Ziel',
+ 'de_DE': 'Ziel anzeigen',
'zh_TW': '顯示目標',
'zh_CN': '显示目标',
'fr_FR': 'Afficher les cibles',
@@ -1185,7 +1185,7 @@ exports.strings = {
'hide-goal-button': {
'__desc__': 'button label to hide goal',
'en_US': 'Hide Goal',
- 'de_DE': 'Verstecken Ziel',
+ 'de_DE': 'Ziel verstecken',
'fr_FR': 'Cacher les cibles',
'zh_TW': '隱藏目標',
'zh_CN': '隐藏目标',
From 21d8bf2858ca490a0f74b02657243fbec1523668 Mon Sep 17 00:00:00 2001
From: Jan Keromnes
Date: Wed, 27 Feb 2019 08:59:21 +0100
Subject: [PATCH 068/359] Use 'grunt fastBuild' in Gitpod to build the app
faster
---
.gitpod.yml | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/.gitpod.yml b/.gitpod.yml
index 8fd958bc..4ecce526 100644
--- a/.gitpod.yml
+++ b/.gitpod.yml
@@ -3,4 +3,4 @@ ports:
onOpen: open-preview
tasks:
- init: npm install && npm install -g grunt-cli
- command: grunt build && python3 -m http.server 8000
+ command: grunt fastBuild && python3 -m http.server 8000
From d2e4fa9d71e86914c110a5d9dd970073f0889bd7 Mon Sep 17 00:00:00 2001
From: Peter Cottle
Date: Wed, 27 Feb 2019 10:13:27 -0800
Subject: [PATCH 069/359] whitespace for travis
---
README.md | 1 +
1 file changed, 1 insertion(+)
diff --git a/README.md b/README.md
index bd03cc58..8e9a6cd1 100644
--- a/README.md
+++ b/README.md
@@ -130,3 +130,4 @@ And the following heroes for assisting in translating:
Also huge shoutout for everyone who has put up a pull request that was pulled! Check out the 30+ contributors we have in the [Contributors View](https://github.com/pcottle/learnGitBranching/graphs/contributors)
And everyone who has reported an issue that was successfully closed!
+
From a7b537787c9eef716152c6dce0fbefb816d5b63e Mon Sep 17 00:00:00 2001
From: Jan Keromnes
Date: Thu, 28 Feb 2019 11:47:39 +0000
Subject: [PATCH 070/359] Print helpful welcome message in Gitpod
---
.gitpod.yml | 5 ++++-
1 file changed, 4 insertions(+), 1 deletion(-)
diff --git a/.gitpod.yml b/.gitpod.yml
index 4ecce526..325d71a3 100644
--- a/.gitpod.yml
+++ b/.gitpod.yml
@@ -3,4 +3,7 @@ ports:
onOpen: open-preview
tasks:
- init: npm install && npm install -g grunt-cli
- command: grunt fastBuild && python3 -m http.server 8000
+ command: >
+ grunt fastBuild &&
+ printf "\nWelcome to Learn Git Branching\nTo rebuild the app, simply run 'grunt fastBuild' and reload index.html.\n\n" &&
+ python3 -m http.server 8000 2>/dev/null
From 904a2c5fbf4d316896c547ef73e4e913759b984b Mon Sep 17 00:00:00 2001
From: Rocky Gray
Date: Fri, 1 Mar 2019 17:48:22 -0500
Subject: [PATCH 071/359] Refactor show commands to extract keys from the
object
fixes #541
---
src/js/sandbox/commands.js | 7 ++++---
1 file changed, 4 insertions(+), 3 deletions(-)
diff --git a/src/js/sandbox/commands.js b/src/js/sandbox/commands.js
index 8b913564..7f4e359d 100644
--- a/src/js/sandbox/commands.js
+++ b/src/js/sandbox/commands.js
@@ -97,9 +97,10 @@ var instantCommands = [
intl.str('show-all-commands'),
' '
];
- allCommands.forEach(function(regex, command) {
- lines.push(command);
- });
+ Object.keys(allCommands)
+ .forEach(function(command) {
+ lines.push(command);
+ });
throw new CommandResult({
msg: lines.join('\n')
From e26044e0a91da6d4216172240bd29feb3a7781f2 Mon Sep 17 00:00:00 2001
From: Victor Lopez Romero
Date: Fri, 25 Jan 2019 13:48:31 +0100
Subject: [PATCH 072/359] Add configuration for Galician language
Add translations for intro1
Add translations for intro2
Fix intro
Add translations for intro3
Add translations for intro4
Fix intro - rebasing
Add translations for rampup1
Add translations for level index
add dialog translations
Fix dialogs
add transations over rebase module
rebase
add advances transations
Add Strings file in intl
Fix hit message
Add translations to mixed module
Fix mixed
Add rampup1
Add rampup2
Add rampup3
Add rampup4
Add translations to move1
Add move2
Add remote1
Add remote6
Add fakeTeamwork
Add fetch file
Add fetchArgs
fetch rebase
Tracking
source nothing
Remote branches
push many features
Merge many feautures
Pull
Pull args
push args
Push args2
Fix erratas
---
src/js/dialogs/confirmShowSolution.js | 10 ++
src/js/dialogs/levelBuilder.js | 19 +++
src/js/dialogs/nextLevel.js | 11 ++
src/js/dialogs/sandbox.js | 56 +++++++++
src/js/intl/strings.js | 97 ++++++++++++++-
src/js/react_views/IntlHelperBarView.jsx | 6 +
src/levels/advanced/multipleParents.js | 90 ++++++++++++++
src/levels/index.js | 14 +++
src/levels/intro/branching.js | 84 +++++++++++++
src/levels/intro/commits.js | 44 +++++++
src/levels/intro/merging.js | 71 +++++++++++
src/levels/intro/rebasing.js | 69 +++++++++++
src/levels/mixed/describe.js | 65 ++++++++++
src/levels/mixed/grabbingOneCommit.js | 41 +++++++
src/levels/mixed/jugglingCommits.js | 37 ++++++
src/levels/mixed/jugglingCommits2.js | 45 +++++++
src/levels/mixed/tags.js | 54 +++++++++
src/levels/rampup/cherryPick.js | 63 +++++++++-
src/levels/rampup/detachedHead.js | 80 +++++++++++++
src/levels/rampup/interactiveRebase.js | 67 +++++++++++
src/levels/rampup/relativeRefs.js | 77 ++++++++++++
src/levels/rampup/relativeRefs2.js | 71 +++++++++++
src/levels/rampup/reversingChanges.js | 67 ++++++++++-
src/levels/rebase/manyRebases.js | 20 ++++
src/levels/rebase/selectiveRebase.js | 22 ++++
src/levels/remote/clone.js | 59 +++++++++
src/levels/remote/fakeTeamwork.js | 56 +++++++++
src/levels/remote/fetch.js | 75 ++++++++++++
src/levels/remote/fetchArgs.js | 125 +++++++++++++++++++
src/levels/remote/fetchRebase.js | 146 +++++++++++++++++++++++
src/levels/remote/mergeManyFeatures.js | 47 ++++++++
src/levels/remote/pull.js | 61 ++++++++++
src/levels/remote/pullArgs.js | 76 ++++++++++++
src/levels/remote/push.js | 44 +++++++
src/levels/remote/pushArgs.js | 74 ++++++++++++
src/levels/remote/pushArgs2.js | 72 +++++++++++
src/levels/remote/pushManyFeatures.js | 55 +++++++++
src/levels/remote/remoteBranches.js | 64 ++++++++++
src/levels/remote/sourceNothing.js | 55 +++++++++
src/levels/remote/tracking.js | 122 +++++++++++++++++++
40 files changed, 2405 insertions(+), 6 deletions(-)
diff --git a/src/js/dialogs/confirmShowSolution.js b/src/js/dialogs/confirmShowSolution.js
index b846cb43..966b993e 100644
--- a/src/js/dialogs/confirmShowSolution.js
+++ b/src/js/dialogs/confirmShowSolution.js
@@ -59,6 +59,16 @@ exports.dialog = {
]
}
}],
+ 'gl': [{
+ type: 'ModalAlert',
+ options: {
+ markdowns: [
+ '## ¿Queres ver a solución?',
+ '',
+ 'Seguro que podes, ¡inténtao unha vez máis!'
+ ]
+ }
+ }],
'fr_FR': [{
type: 'ModalAlert',
options: {
diff --git a/src/js/dialogs/levelBuilder.js b/src/js/dialogs/levelBuilder.js
index 8ea2f989..411a88ae 100644
--- a/src/js/dialogs/levelBuilder.js
+++ b/src/js/dialogs/levelBuilder.js
@@ -113,6 +113,25 @@ exports.dialog = {
]
}
}],
+ 'gl': [{
+ type: 'ModalAlert',
+ options: {
+ markdowns: [
+ '## Benvido ó constructor de niveis!',
+ '',
+ 'Estes son os pasos principais:',
+ '',
+ ' * Prepara o eido inicial usando comandos de Git',
+ ' * Define a árbore inicial con ```define start```',
+ ' * Inserta a secuencia de comandos de git que representan a mellor solución',
+ ' * Define a árbore obxectivo con ```define goal```. O obxectivo tamén determina a solución',
+ ' * Opcionalmente, define axudas con ```define hint```',
+ ' * Dalle un nome con ```define name```',
+ ' * Opcionalmente, define unha mensaxe inicial con ```edit dialog```',
+ ' * Escribe o comando ```finish``` para obter seu nivel en formato JSON!'
+ ]
+ }
+ }],
'fr_FR': [{
type: 'ModalAlert',
options: {
diff --git a/src/js/dialogs/nextLevel.js b/src/js/dialogs/nextLevel.js
index 49d1ebc9..69d0c9ad 100644
--- a/src/js/dialogs/nextLevel.js
+++ b/src/js/dialogs/nextLevel.js
@@ -78,6 +78,17 @@ exports.dialog = {
]
}
}],
+ 'gl': [{
+ type: 'ModalAlert',
+ options: {
+ markdowns: [
+ '## Bo traballo!!',
+ '',
+ 'Resolviches o nivel empregando *{numCommands}* comandos; ',
+ 'a nosa mellor solución é en {best}.'
+ ]
+ }
+ }],
'fr_FR': [{
type: 'ModalAlert',
options: {
diff --git a/src/js/dialogs/sandbox.js b/src/js/dialogs/sandbox.js
index bb088acc..84c69806 100644
--- a/src/js/dialogs/sandbox.js
+++ b/src/js/dialogs/sandbox.js
@@ -134,6 +134,62 @@ exports.dialog = {
]
}
}],
+ 'gl': [{
+ type: 'ModalAlert',
+ options: {
+ markdowns: [
+ '## Benvido a Learn Git Branching!',
+ '',
+ 'Esta aplicación foi desenvolvida para axudar os iniciados en git a ',
+ 'aprender os poderosos conceptos que hai por detrás do branching con ',
+ ' git. Agardamos que disfrutes desta aplicación, e tal vez, ',
+ 'ata aprendas algunha cousa!',
+ '',
+ '# Demostracións!',
+ '',
+ 'Se aínda non viches a demo, olla aquí:',
+ '',
+ '[https://pcottle.github.io/learnGitBranching/?demo](https://pcottle.github.io/learnGitBranching/?demo)',
+ '',
+ '¿Farto destas mensaxes? Engade `?NODEMO` á dirección para librarte dela, como no link de abaixo:',
+ '',
+ '[https://pcottle.github.io/learnGitBranching/?NODEMO](?NODEMO)'
+ ]
+ }
+ }, {
+ type: 'ModalAlert',
+ options: {
+ markdowns: [
+ '## Comandos de git',
+ '',
+ 'Tes a túa disposición unha caixa de área con unha variedade de comandos de git:',
+ '',
+ ' * commit',
+ ' * branch',
+ ' * checkout',
+ ' * cherry-pick',
+ ' * reset',
+ ' * revert',
+ ' * rebase',
+ ' * merge'
+ ]
+ }
+ }, {
+ type: 'ModalAlert',
+ options: {
+ markdowns: [
+ '## Compartir e importar!',
+ '',
+ 'Comparte árbores cos seus amigas con `export tree` e `import tree`',
+ '',
+ '¿Tes un enlace moi grande para compartir? Intenta construír un nivel con `build level` ou importe o nivel dun amigo con `import level`',
+ '',
+ 'Para ver tódolos comandos, usa `show commands`. Hai algunha xoia como `undo` e `reset`',
+ '',
+ 'Por agora, imos comezar cos `levels`...'
+ ]
+ }
+ }],
'de_DE': [{
type: 'ModalAlert',
options: {
diff --git a/src/js/intl/strings.js b/src/js/intl/strings.js
index d465b700..b7c2c416 100755
--- a/src/js/intl/strings.js
+++ b/src/js/intl/strings.js
@@ -10,6 +10,7 @@ exports.strings = {
'es_AR': '¡Ea! Terminaste el último nivel, ¡genial!',
'es_ES': '¡Felicitaciones! Terminaste el último nivel!',
'pt_BR': 'Uia! Você terminou o último nível, massa!',
+ 'gl' : '¡Yeeeha! Remataches o derradeiro nivel, ¡a tope!',
'fr_FR': 'Félicitations, vous avez réussi le dernier niveau !',
'ru_RU': 'Вау! Вы прошли последний уровень, отлично!',
'uk': 'Вау! Ти пройшов останній рівень, круто!',
@@ -26,6 +27,7 @@ exports.strings = {
'es_AR': '¿Querés seguir con *"{nextLevel}"*, el próximo nivel?',
'es_ES': '¿Quieres seguir al nivel *"{nextLevel}"*, el próximo nivel?',
'pt_BR': 'Você gostaria de ir para o próximo nível: *"{nextLevel}"*?',
+ 'gl' : '¿Gustaríache ir o seguinte nivel: *"{nextLevel}"*?',
'fr_FR': 'Voulez-vous passer à *"{nextLevel}"*, le prochain niveau ?',
'ru_RU': 'Хотите перейти на следующий уровень: *"{nextLevel}"*?',
'uk': 'Хочеш перейти на наступний рівень -- *"{nextLevel}"*?',
@@ -42,6 +44,7 @@ exports.strings = {
'zh_TW': '太強了,您的答案符合我們的預期甚至更好!',
'es_AR': '¡Fabuloso! Igualaste o superaste nuestra solución.',
'es_ES': '¡Fabuloso! Igualaste o superaste nuestra solución.',
+ 'gl' : '¡Fabuloso! Fixécholo igual ou mellor ca nosa solución.',
'fr_FR': 'Fabuleux ! Votre solution a égalé ou surpassé notre solution.',
'ru_RU': 'Отлично! Ваше решение соответствует или превосходит наше.',
'uk': 'Чудово! Твій розв’язок на рівні або кращий від нашого.',
@@ -58,6 +61,7 @@ exports.strings = {
'es_AR': 'Fijate si podés bajarlo a usar sólo {best} comandos :D',
'es_ES': 'Trata de usar sólo {best} comandos :D',
'pt_BR': 'Veja se consegue reduzir para somente {best} :D',
+ 'gl' : 'Mira se consigues reducir a solo {best} :D',
'fr_FR': 'Voyons si vous pouvez descendre à {best} :D',
'ru_RU': 'Попробуйте, может вы сможете уложиться в {best} : D',
'uk': 'Спробуй, можливо ти зможеш вкластися в {best} кроків :D',
@@ -72,6 +76,7 @@ exports.strings = {
'es_AR': '¡Cuidado! Mercurial hace garbage collection agresivamente y necesita eliminar tu árbol',
'es_ES': '¡Cuidado! Mercurial hace la colección de basura agresivamente (para administrar memoria) y necesita podar tu árbol.',
'pt_BR': 'Cuidado! O Mercurial faz coleção de lixo agressiva e precisa prunar sua árvore',
+ 'gl' : '¡Coidado! Mercurial fai que recolección de lixo agresivamente (para limpar memoria) e precisa podar a túa árbore.',
'fr_FR': 'Attention, Mercurial supprime de façon agressive et nécessite un prune du repository',
'de_DE': 'Achtung! Mercurial macht aggressive Garbage Collection und muss daher deinen Baum reduzieren',
'ru_RU': 'Внимание! Mercurial использует агрессивный сборщик мусора и обрезает ваше дерево',
@@ -87,6 +92,7 @@ exports.strings = {
'es_AR': 'La opción -A no es necesaria para esta aplicación, simplemente hacé commit',
'es_ES': 'La opción -A no se necesita para este aplicación, sólo hace un commit!',
'pt_BR': 'A opção -A não é necessária para este aplicativo, simplesmente faça commit',
+ 'gl' : 'A opción -A non se necesita para este aplicativo, ¡fai só un commit!',
'de_DE': 'Die Option -A wird in dieser Anwendung nicht benötigt, committe einfach!',
'fr_FR': 'L\'option -A n\'est pas nécessaire pour cette application, simplement commiter',
'ru_RU': 'Опция -A не требуется для этого приложения, просто сделайте коммит.',
@@ -102,6 +108,7 @@ exports.strings = {
'es_AR': 'No hay un comando status para esta aplicación, dado que no hay archivos que indexar. Probá hg summary, en cambio',
'es_ES': 'No hay un comando status para esta aplicación, porque que no hay archivos que indexar. Prueba el comando hg summary, en cambio',
'pt_BR': 'Não existe um comando status para este aplicativo, já que não há staging de arquivos. Tente hg summary',
+ 'gl' : 'Non hai un comando status para esta aplicación, xa que non hai ficheiros que indexar. Proba hg summary',
'fr_FR': 'Il n\'y a pas de commande status pour cette application, car il n\'y a pas de fichier stagé. Essayez hg summary à la place.',
'de_DE': 'Es gibt keinen Befehl status in dieser Anwendung, da es kein Staging von Dateien gibt. Probier stattdessen hg summary',
'ru_RU': 'Команда status не поддерживается в этом приложении, так как здесь нет файлов. Попробуйте выполнить hg summary',
@@ -117,6 +124,7 @@ exports.strings = {
'es_AR': '¡Necesito la opción {opcion} para ese comando!',
'es_ES': '¡Necesito la opción {opcion} para ese comando!',
'pt_BR': 'Eu preciso da opção {option} para esse comando!',
+ 'gl' : 'Preciso da opción {option} para ese comando!',
'fr_FR': 'J\'ai besoin de l\'option {option} pour cette commande',
'de_DE': 'Ich benötige die Option {option} für diesen Befehl!',
'ru_RU': 'Для этой команды требуется опция {option}',
@@ -132,6 +140,7 @@ exports.strings = {
'es_AR': 'hg log sin el parámetro -f no está soportado, usá -f',
'es_ES': 'Actualmente hg log sin -f no es compatible con esta aplicación. Usa -f.',
'pt_BR': 'hg log sem -f atualmente não é suportado, use -f',
+ 'gl' : 'hg log sen -f actulamente non é soportado, usa -f',
'fr_FR': 'hg log sans -f n\'est pas supporté',
'de_DE': 'hg log ohne -f wird aktuell nicht unterstützt, benutze bitte -f',
'ru_RU': 'hg log без опции -f в настоящий момент не поддерживается, используйте -f',
@@ -148,6 +157,7 @@ exports.strings = {
'es_AR': '¡Detached HEAD!',
'es_ES': '¡HEAD separado! (Detached HEAD).',
'pt_BR': 'Detached HEAD!',
+ 'gl' : '¡Detached HEAD!',
'fr_FR': 'head détaché !',
'ru_RU': 'Отделенный HEAD',
'uk': 'Відокремлений HEAD',
@@ -163,6 +173,7 @@ exports.strings = {
'es_AR': 'En la rama {branch}',
'es_ES': 'En la rama {branch}',
'pt_BR': 'No ramo {branch}',
+ 'gl' : 'Non na rama {branch}',
'fr_FR': 'Sur la branche {branch}',
'ru_RU': 'В ветке {branch}',
'uk': 'В гілці {branch}',
@@ -178,6 +189,7 @@ exports.strings = {
'es_AR': '¡Listo para commitear! (como siempre en esta demo ;-) )',
'es_ES': '¡Listo para hacer un commit (como siempre en esta demo)!',
'pt_BR': 'Pronto para commitar! (como sempre neste demo ;-) )',
+ 'gl' : '¡Praparado para facer un commit (como sempre nesta demo ;-) )!',
'fr_FR': 'Prêt à commit ! (comme toujours dans cette démo)',
'ru_RU': 'Готово к коммиту! (как и всегда в этом демо)',
'uk': 'Готово до коміту! (як завжди в цьому демо)',
@@ -194,6 +206,7 @@ exports.strings = {
'es_AR': 'Otro commit más, y van...',
'es_ES': 'Hagamos un commit. Atlanta, Georgia! Escucha WHATUPRG también.',
'pt_BR': 'Commitando.. Vai Timão!',
+ 'gl' : 'Mesturando.. ¡Alá imos!',
'fr_FR': 'Commit rapide. NoMaN Sux!',
'ru_RU': 'Быстрый коммит. А надо!',
'uk': 'Швидкий коміт. Динамо!',
@@ -207,6 +220,7 @@ exports.strings = {
'es_AR': 'Estás en la versión más reciente',
'es_ES': 'Ya actualizado con la versión más reciente.',
'pt_BR': 'Já estamos na versão mais recente!',
+ 'gl' : 'Xa estamos actualizados ca versión máis recente',
'zh_TW': '已經是最新的了',
'zh_CN': '已经是最新的了',
'ru_RU': 'Уже обновлено!',
@@ -222,6 +236,7 @@ exports.strings = {
'es_AR': 'Tu rama origin está desincronizada con la rama remota, por lo que no se puede hacer el fetch',
'es_ES': 'Tu rama origin no está sicronizada con la rama remota, así que un fetch no se puede realizar.',
'pt_BR': 'O fetch não pode ser realizado pois o ramo de origem está fora de sincronia com o ramo remoto',
+ 'gl' : 'O fetch non pode ser realizado xa que a rama de orixe non está sincronizada ca rama remota',
'fr_FR': 'Votre branche origin n\'est plus synchronisée avec la branche distante et fetch ne peut pas être appliqué. Essayez avec l\'option --force',
'ru_RU': 'Ваша origin ветка не синхронизирована с удаленной веткой, невозможно выполнить fetch',
'uk': 'Твоя гілка origin не синхронізована з віддаленою гілкою, неможливо виконати fetch',
@@ -234,8 +249,9 @@ exports.strings = {
'zh_TW': '遠端倉庫與你的本地倉庫產生了分歧,故此上傳操作無法通過簡單地快進實現(因此你的 push 被拒絕了)。請 pull 下來遠端裡最新的更改,與本地合併之後再試一次。你可以通過 git pull 或 git pull --rebase 實現。',
'de_DE': 'Das entfernte Repository weicht von deinem lokalen Repository ab, daher können deine Änderungen nicht mit einem einfachen fast forward hochgeladen werden (und daher ist dein push abgelehnt worden). Bitte pull erst die neuen Änderungen in das lokale Repository, integriere sie in den Branch und versuch es nochmal. Das kannst du mit git pull oder git pull --rebase machen',
'es_AR': 'El repositorio remoto divergió de tu repositorio local, por lo que subir tus cambios no es un simple fast forward (y por eso se rechazó tu push). Por favor, hacé pull de los nuevos cambios en el repositorio remoto, incorporalos a esta rama y probá de nuevo. Podés hacerlo con git pull o git pull --rebase',
- 'es_ES': 'El depósito remoto se ha desviado del depósito local. Subir cambios no es un avance rápido sencillo (por eso fue rechazado tu push). Por favor haz pull para descaragar los cambios en el depósito remoto para que los incorpores en la rama actual. Los cambios se pueden hacer pull con el comando "git pull" o "git pull--rebase"',
+ 'es_ES': 'El depósito remoto se ha desviado del depósito local. Subir cambios no es un avance rápido sencillo (por eso fue rechazado tu push). Por favor haz pull para descaragar los cambios en el depósito remoto para que los incorpores en la rama actual. Los cambios se pueden hacer pull con el comando "git pull" o "git pull --rebase"',
'pt_BR': 'O repositório remoto divergiu do repositório local, então enviar suas mudanças não é um simples fast forward (e por isso seu push foi rejeitado). Por favor, faça pull das novas mudanças do repositório remoto, incorpore-os a este ramo, e tente novamente. Você pode fazê-lo com git pull ou git pull --rebase',
+ 'gl' : 'O repositorio remoto diverxe do teu repositorio local. Subir os cambios non é un fast-forward (avance rápido) e por iso foi rechazado o teu push. Por favor, fai un pull dos novos cambios do repositorio remoto e inclúeos na túa rama actual. Os cambios pódense facer co comando "git pull" ou "git pull --rebase"',
'fr_FR': 'Le dépôt distant a divergé de votre référentiel local, donc l\'envoi de vos modifications n\'est pas en simple avance rapide (et donc votre envoi a été rejeté). Veuillez récupérer les nouveaux changements depuis le dépôt distant, les intégrer dans cette branche, et essayez à nouveau. Vous pouvez le faire avec git pull ou git pull --rebase',
'ru_RU': 'Удаленный репозиторий разошелся с вашим локальным репозиторием, поэтому выгрузка ваших изменений не может быть в режиме fast forward (и следовательно ваш push будет отклонён). Пожалуйста, удалите изменения в удаленном репозитории которые, объедините их в эту ветку и попробуйте еще раз. Вы можете сделать это с помощью git pull или git pull --rebase',
'uk': 'Віддалений репозиторій розбігся з твоїм локальним репозиторієм, тому відвантаження твоїх змін не є простим fast forward (і тому твій push був відхилений). Будь-ласка, витягни зміни з віддаленого репозиторію, включи їх в цю гілку, й спробуй ще. Ти можеш зробити це за допомогою git pull чи git pull --rebase',
@@ -250,6 +266,7 @@ exports.strings = {
'es_AR': 'No podés ejecutar ese comando en una rama remota',
'es_ES': 'No puedes ejecutar ese comando en una rama remota',
'pt_BR': 'Você não pode executar esse comando em um ramo remoto',
+ 'gl' : 'Non podes executar ese comando nunha rama remota',
'fr_FR': 'Vous ne pouvez exécuter cette commande sur une branche distante',
'ru_RU': 'Вы не можете выполнить эту команду на удаленной ветке',
'uk': 'Ти не можеш виконати цю команду на віддаленій гілці',
@@ -264,6 +281,7 @@ exports.strings = {
'es_AR': 'Necesitás un origen para ese comando',
'es_ES': 'Se requiere un origen para ese comando.',
'pt_BR': 'É necessário informar uma origem para esse comando',
+ 'gl' : 'É necesario informar unha orixe para ese comando',
'fr_FR': 'Une origine est requise pour cette commande',
'ru_RU': 'Origin требуется для этой команды',
'uk': 'Для цієї команди потрібний origin',
@@ -278,6 +296,7 @@ exports.strings = {
'es_AR': '¡Ya existe el origen! No podés crear uno nuevo',
'es_ES': '¡Ya existe un origen! No puedes crearlo de nuevo.',
'pt_BR': 'A origem já existe! Você não pode criar uma nova',
+ 'gl' : 'A orixe xa existe! Non podes crear unha nova',
'fr_FR': 'Une origine existe déjà ! Vous ne pouvez pas en créer une nouvelle',
'ru_RU': 'Origin уже существует! Невозможно создать еще один',
'uk': 'Origin вже існує! Неможливо створити ще один',
@@ -294,6 +313,7 @@ exports.strings = {
'es_AR': 'No podés borrar la rama master, la rama en la que estás, o cosas que no son ramas',
'es_ES': 'No puedes eliminar la rama master, la rama en que estás, o cosas que no son ramas.',
'pt_BR': 'Você não pode apagar o ramo master, nem o ramo em que você está, nem coisas que não sejam ramos',
+ 'gl' : 'Non podes borrala rama master, nin a rama na que ti estás, nin cousas que non sexan ramas',
'fr_FR': 'Vous ne pouvez supprimer la branche master, la branche sur laquelle vous êtes, ou ce qui n\'est pas une branche',
'ru_RU' : 'Невозможно удалить ветку master, ветку на которой вы сейчас и то что не является веткой',
'uk': 'Неможливо видалити гілку master, гілку на якій ти зараз знаходишся чи штуки які не є гілкою',
@@ -309,6 +329,7 @@ exports.strings = {
'es_AR': 'Mergear {target} a {current}',
'es_ES': 'Incorporar {target} en {current}',
'pt_BR': 'Merge de {target} em {current}',
+ 'gl' : 'Merge de {target} en {current}',
'fr_FR': 'Merge de {target} dans {current}',
'ru_RU': 'Слияние {target} в {current}',
'uk': 'Злиття {target} в {current}',
@@ -324,6 +345,7 @@ exports.strings = {
'es_AR': '¡No hay commits para rebasear! Son todos commits de merge o cambios ya aplicados',
'es_ES': '¡No hay commits para hacer rebase! Todo es un merge commit o cambios ya hecho.',
'pt_BR': 'Não há commits para o rebase! São todos commits de merge ou mudanças já aplicadas',
+ 'gl' : '¡Non hai commits para o rebase! Son todos commits de merge ou cambios xa aplicados',
'fr_FR': 'Aucun commit à rebaser ! C\'est soit un commit de merge, soit des modifications déjà appliquées',
'ru_RU': 'Нет коммитов для rebase! Все в коммите слияния или изменения уже применены',
'uk': 'Нема комітів для rebase! Все в коміті злиття (merge commit) чи зміни вже застосовані',
@@ -339,6 +361,7 @@ exports.strings = {
'es_AR': 'Nada para hacer...',
'es_ES': 'Nada para hacer...',
'pt_BR': 'Nada a ser feito...',
+ 'gl' : 'Nada para facer...',
'fr_FR': 'Rien à effectuer…',
'ru_RU': 'Нечего выполнять...',
'uk': 'Нічого виконувати...',
@@ -354,6 +377,7 @@ exports.strings = {
'es_AR': 'Fast forwardeando...',
'es_ES': 'Avanzando rápidamente...',
'pt_BR': 'Fast forward...',
+ 'gl' : 'Fast forward...',
'fr_FR': 'En avance rapide…',
'ru_RU': 'Выполняю Fast forward...',
'uk': 'Виконую Fast forward',
@@ -369,6 +393,7 @@ exports.strings = {
'es_AR': 'Rama actualmente actualizada',
'es_ES': 'La rama ya se ha actualizado.',
'pt_BR': 'Ramo já atualizado',
+ 'gl' : 'Rama xa actualizada',
'fr_FR': 'Branche déjà à jour',
'ru_RU': 'Ветка уже обновлена',
'uk': 'Гілку вже оновлено',
@@ -384,6 +409,7 @@ exports.strings = {
'es_AR': 'La referencia {ref} no existe o es desconocida',
'es_ES': 'La referencia {ref} no existe o es desconocida',
'pt_BR': 'A referência {ref} não existe ou é desconhecida',
+ 'gl' : 'A referencia {ref} non existe ou é descoñecida',
'fr_FR': 'La référence {ref} n\'existe pas ou est inconnue',
'ru_RU': 'Ссылка {ref} не существует или неизвестна',
'uk': 'Посилання {ref} не існує чи невідоме',
@@ -399,6 +425,7 @@ exports.strings = {
'es_AR': 'El commit {commit} no tiene un {match}',
'es_ES': 'El commit {commit} no tiene un {match}',
'pt_BR': 'O commit {commit} não tem um {match}',
+ 'gl' : 'O commit {commit} non ten un {match}',
'fr_FR': 'Le commit {commit} n\'a pas de correspondance {match}',
'ru_RU': 'Коммит {commit} не содержит {match}',
'uk': 'Коміт {commit} не містить {match}',
@@ -414,6 +441,7 @@ exports.strings = {
'es_AR': '¡Cuidado! Modo de detached HEAD',
'es_ES': '¡Cuidado! Modo de HEAD separado (detached HEAD)',
'pt_BR': 'Cuidado! Modo Detached HEAD',
+ 'gl' : '¡Coidado! Modo Detached HEAD',
'fr_FR': 'Attention ! HEAD est détaché',
'ru_RU': 'Внимание! Репозиторий в состоянии detached HEAD, то есть не находится ни на какой ветке!',
'uk': 'Увага! Репозиторій в стані detached HEAD, тобто не знаходиться в жодній гілці!',
@@ -429,6 +457,7 @@ exports.strings = {
'es_AR': 'No es necesario hacer add a los archivos en esta demo',
'es_ES': 'No es necesario agregar los archivos en esta demo',
'pt_BR': 'Não é necessário adicionar arquivos neste demo',
+ 'gl' : 'Non é necesario incluír arquivos nesta demo',
'fr_FR': 'Aucun besoin d\'ajouter des fichiers dans cette démo',
'ru_RU': 'Это демо не оперирует файлами',
'uk': 'Не потрібно додавати файли для цього демо',
@@ -444,6 +473,7 @@ exports.strings = {
'es_ES': 'Las opciones que especificaste son incompatibles o incorrectas.',
'es_AR': 'No es necesario hacer add a los archivos en esta demo',
'pt_BR': 'As opções que você especificou são incompatíveis ou incorretas',
+ 'gl' : 'As opcións que especificaches son incompatibles ou incorrectas',
'fr_FR': 'Les options que vous avez spécifiées sont incompatibles ou incorrectes',
'ru_RU': 'Неправильные опции',
'uk': 'Опції, які ти ввів, або некорректні або не підтримуються',
@@ -459,6 +489,7 @@ exports.strings = {
'es_AR': 'El commit {commit} ya existe en tus cambios, ¡abortando!',
'es_ES': 'El commit {commit} ya existe en tus cambios, ¡abortando!',
'pt_BR': 'O commit {commit} já existe nas suas mudanças, abortando!',
+ 'gl' : 'O commit {commit} xa existe nos seus cambios, ¡abortando!',
'fr_FR': 'Le commit {commit} existe déjà dans votre ensemble de modifications, opération avortée !',
'ru_RU': 'Коммит {commit} существует, отменяю!',
'uk': 'Коміт {commit} вже існує в твоєму change set, відміна!',
@@ -474,6 +505,7 @@ exports.strings = {
'es_AR': 'No podés hacer reset en el modo detached. Usá checkout si querés moverte',
'es_ES': 'No puedes hacer reset en el modo separado. Usa checkout si quieres moverte.',
'pt_BR': 'Não se pode fazer reset no modo detached. Use checkout se quiser se mover',
+ 'gl' : 'Non se pode facer reset no modo detached. Use checkout se te queres mover',
'fr_FR': 'On ne peut pas effectuer un reset quand HEAD est détaché. Utilisez checkout pour déplacer',
'ru_RU': 'Это невозможно в режиме detached HEAD! Используйте checkout!',
'uk': 'Неможливо зробити reset в стані detached head! Використовуй checkout якщо хочеш змінити розташування',
@@ -492,6 +524,7 @@ exports.strings = {
'es_ES': 'El comportamiento default para reajustes es --hard, pero siéntete libre de omitir esa ' +
'opción si te cansas de escribirla en nuestras lecciones. Recuerda quepor defecto el comportamiento en GitHub es --mixed.',
'pt_BR': 'O comportamento padrão é um reset --hard, fique livre para omitir essa opção!',
+ 'gl' : 'O comportamente por defecto é un reset --hard, Lembra que por defecto en GitHub é --mixed.',
'fr_FR': 'Le comportement par défaut est un --hard reset, soyez libre d\'omettre cette option !',
'ru_RU': 'По умолчанию будет выполнен --hard reset, эту опцию можно опускать!',
'uk': 'На LearnGitBranching reset по замовчуванню використовує --hard, тому цю опцію ' +
@@ -510,6 +543,7 @@ exports.strings = {
'es_AR': 'No existe el concepto de agregar/indexar cambios, así que esa opción o comando es inválido',
'es_ES': 'No existe el concepto de agregar/indexar cambios, así que esa opción o comando es inválido.',
'pt_BR': 'Não existe o conceito de adicionar/indexar mudanças, de forma que essa opção ou comando é inválida',
+ 'gl' : 'Non existe o concepto de agregar/indexar cambios, así que esa opción ou comando é inválido.',
'fr_FR': 'Il n\'y a pas le concept d\'ajouter / mettre en staging, donc cette option ou commande est invalide',
'ru_RU': 'Это демо не работает с файлами, так что git add не нужен!',
'uk': 'В цьому демо немає можливості додати файл до робочої копії чи до стейджингу, тому ця опція чи команда некоректна чи не підтримується',
@@ -525,6 +559,7 @@ exports.strings = {
'es_AR': 'Revirtiendo {oldCommit}: {oldMsg}',
'es_ES': 'Volviendo a {oldCommit}: {oldMsg}',
'pt_BR': 'Revertendo {oldCommit}: {oldMsg}',
+ 'gl' : 'Revertindo {oldCommit}: {oldMsg}',
'fr_FR': 'Revert {oldCommit}: {oldMsg}',
'ru_RU': 'Откатываю {oldCommit}: {oldMsg}',
'uk': 'Повертаю {oldCommit}: {oldMsg}',
@@ -540,6 +575,7 @@ exports.strings = {
'es_AR': 'Espero como máximo {upper} parámetros para {what}',
'es_ES': 'Espero al máximo {upper} parámetros para {what}.',
'pt_BR': 'Espero no máximo {upper} parâmetros para {what}',
+ 'gl' : 'Espero ó máximo {upper} parámetros para {what}',
'fr_FR': 'J\'attends au plus {upper} argument(s) pour {what}',
'ru_RU': 'Ожидается максимум {upper} аргумент(ов) для {what}',
'uk': 'Я очікую максимум {upper} аргумент(ів) для {what}',
@@ -555,6 +591,7 @@ exports.strings = {
'es_AR': 'Espero al menos {lower} parámetros para {what}',
'es_ES': 'Espero al menos {lower} parámetros para {what}.',
'pt_BR': 'Espero pelo menos {lower} parâmetros para {what}',
+ 'gl' : 'Agardo polo menos {lower} parámetros para {what}',
'fr_FR': 'J\'attends au moins {upper} argument(s) pour {what}',
'ru_RU': 'Ожидается как минимум {lower} аргументов для {what}',
'uk': 'Я очікую як мінімум {lower} аргумент(ів) для {what}',
@@ -570,6 +607,7 @@ exports.strings = {
'es_AR': 'Ese comando no acepta parámetros comunes',
'es_ES': 'Ese comando no acepta parámetros generales.',
'pt_BR': 'Este comando não aceita parâmetros gerais',
+ 'gl' : 'Este comando non acepta parámetros xeráis',
'fr_FR': 'Cette commande n\'accepte aucun argument général',
'ru_RU': 'Это команда без аргументов',
'uk': 'Ця команда не приймає загальних аргументів',
@@ -585,6 +623,7 @@ exports.strings = {
'es_AR': 'Copiá el código de acá abajo',
'es_ES': 'Copia el código que sigue.',
'pt_BR': 'Copie o código abaixo',
+ 'gl' : 'Copie o código abaixo',
'fr_FR': 'Copiez la chaîne d\'arbre ci-dessous',
'ru_RU': 'Скопируй текст ниже',
'uk': 'Скопіюй рядок дерева нижче',
@@ -601,6 +640,7 @@ exports.strings = {
'es_AR': 'Aprendé a Branchear en Git',
'es_ES': 'Aprende Git Branching',
'pt_BR': 'Learn Git Branching',
+ 'gl' : 'Aprende Git Branching',
'fr_FR': 'Apprenez Git Branching',
'ru_RU': 'Изучаем ветвление в git',
'uk': 'Learn Git Branching',
@@ -616,6 +656,7 @@ exports.strings = {
'es_AR': 'Seleccioná un nivel',
'es_ES': 'Selecciona un nivel',
'pt_BR': 'Selecione um nível',
+ 'gl' : 'Selecciona un nivel',
'fr_FR': 'Choisissez un niveau',
'ru_RU': 'Выбери уровень',
'uk': 'Обери рівень',
@@ -629,6 +670,7 @@ exports.strings = {
'zh_CN': '主要',
'zh_TW': '主要',
'es_ES': 'Principal',
+ 'gl' : 'Principal',
'ru_RU': 'Основы',
'uk' : 'Основи',
'ko': '메인'
@@ -641,6 +683,7 @@ exports.strings = {
'zh_CN': '远程',
'zh_TW': '遠端',
'es_ES': 'Remota',
+ 'gl' : 'Remota',
'ru_RU': 'Удаленные репозитории',
'uk' : 'Віддалені репозиторії',
'ko' : '원격'
@@ -655,6 +698,7 @@ exports.strings = {
'es_AR': 'Perdón, necesitamos mantener los nombres de los branches cortos para visualizarlos. El nombre de tu rama se truncó a 9 caracteres, resultando en "{branch}"',
'es_ES': 'Perdón, necesitamos mantener los nombres de los branches cortos para visualizarlos. El nombre de tu rama se truncó a 9 caracteres, resultando en "{branch}"',
'pt_BR': 'Desculpe, precisamos manter os nomes dos ramos curtos para visualizá-los. O nome do seu ramo foi truncado para 9 caracteres, resultando em "{branch}"',
+ 'gl' : 'Desculpe, precisamos manter os nomes das ramas curtas para poder velas. O nome da súa rama foi truncada a 9 letras, resultado en "{branch}"',
'fr_FR': 'Désolé, nous devons garder les noms de branches courts pour la visualisation. Votre nom de branche a été tronqué à 9 caractères, devenant "{branch}"',
'ru_RU': 'Для наглядности нам нужно сохранять имена веток короткими. Твоё название сокращено до 9 символов и теперь это "{branch}"',
'uk': 'Вибач, нам потрібно щоб ім’я гілок було як можна коротше для наглядності. Твоє ім’я гілки було скорочене до 9 літер й тепер це "{branch}"',
@@ -670,6 +714,7 @@ exports.strings = {
'es_AR': 'El nombre "{branch}" no está permitido para los branches',
'es_ES': 'El nombre "{branch}" es prohibido para nombrar una rama.',
'pt_BR': 'Um ramo não pode ser chamado de "{branch}"!',
+ 'gl' : 'Unha rama non pode ser chamada "{branch}',
'fr_FR': 'Ce nom de branche "{branch}" n\'est pas autorisé',
'ru_RU': 'Название для ветки "{branch}" недопустимо!',
'uk': 'Назва гілки "{branch}" є недопустимою',
@@ -684,6 +729,7 @@ exports.strings = {
'es_AR': 'El nombre "{tag}" no está permitido para los tags',
'es_ES': 'El nombre "{tag}" es prohibido para nombrar un tag.',
'pt_BR': 'Uma tag não pode ser chamada de "{tag}"!',
+ 'gl' : 'Unha etiqueta non pode ser chamada "{tag}"',
'de_DE': 'Der Tag-Name "{tag}" ist nicht erlaubt!',
'fr_FR': 'Le nom de tag "{tag}" n\'est pas autorisé',
'ru_RU': 'Название для тега "{tag}" недопустимо!',
@@ -700,6 +746,7 @@ exports.strings = {
'es_AR': 'La opción {option} no está soportada',
'es_ES': 'La opción {option} no compatible con esta demo.',
'pt_BR': 'A opção {option} não é suportada',
+ 'gl' : 'A opción {option} non está soportada',
'fr_FR': 'L\'option "{option}" n\'est pas supportée',
'ru_RU': 'Опция "{option}" недопустима!',
'uk': 'Опція "{option}" не підтримується!',
@@ -714,7 +761,8 @@ exports.strings = {
'zh_TW': 'git <指令> [<參數>]',
'es_AR': 'git []',
'es_ES': 'git []',
- 'pt_BR': 'git ]',
+ 'pt_BR': 'git []',
+ 'gl' : 'git []',
'fr_FR': 'git []',
'ru_RU': 'git <команда> [<аргументы>]',
'uk': 'git <команда> [<аргументи>]',
@@ -730,6 +778,7 @@ exports.strings = {
'es_AR': 'Comandos soportados:',
'es_ES': 'Comandos compatibles:',
'pt_BR': 'Comandos suportados:',
+ 'gl' : 'Comandos soportados:',
'fr_FR': 'Commandes supportées',
'ru_RU': 'Поддерживаемые команды',
'uk': 'Допустимі команди',
@@ -745,6 +794,7 @@ exports.strings = {
'es_AR': 'Uso:',
'es_ES': 'Uso:',
'pt_BR': 'Uso:',
+ 'gl' : 'Uso:',
'fr_FR': 'Utilisation :',
'ru_RU': 'Использование:',
'uk': 'Використання:',
@@ -760,6 +810,7 @@ exports.strings = {
'es_AR': 'Git Versión PCOTTLE.1.0',
'es_ES': 'Git Versión PCOTTLE.1.0',
'pt_BR': 'Git versão PCOTTLE.1.0',
+ 'gl' : 'Git versión PCOTTLE.1.0',
'fr_FR': 'Git version PCOTTLE.1.0',
'ru_RU': 'Версия git PCOTTLE.1.0',
'uk': 'Версія git PCOTTLE.1.0',
@@ -774,6 +825,7 @@ exports.strings = {
'es_AR': 'Invirtiendo el árbol...',
'es_ES': 'Invirtiendo el árbol...',
'pt_BR': 'Invertendo a árvore...',
+ 'gl' : 'Invirtindo a árbore...',
'fr_FR': 'Inversion de l\'arbre...',
'ru_RU': 'Переворачиваю дерево...',
'uk': 'Перевертаю дерево...',
@@ -789,6 +841,7 @@ exports.strings = {
'es_AR': 'Refrezcando el árbol...',
'es_ES': 'Actualizando el árbol...',
'pt_BR': 'Atualizando a árvore...',
+ 'gl' : 'Actualizando a árbore...',
'fr_FR': 'Actualisation de l\'arbre…',
'ru_RU': 'Обновляю дерево...',
'uk': 'Оновлюю дерево...',
@@ -804,6 +857,7 @@ exports.strings = {
'es_AR': 'Localización actualizada a {locale}',
'es_ES': 'Idioma puesto a {locale}',
'pt_BR': 'Língua trocada para {locale}',
+ 'gl' : 'Cambiado o idioma a {locale}',
'fr_FR': 'Langue changée à {locale}',
'ru_RU': 'Локаль теперь равна {locale}',
'uk': 'Локаль тепер дорівнює {locale}',
@@ -819,6 +873,7 @@ exports.strings = {
'es_AR': 'Localización vuelta al default, que es {locale}',
'es_ES': 'Idioma reajustado a su valor por defecto ({locale})',
'pt_BR': 'Língua retornada para a padrão, que é {locale}',
+ 'gl' : 'Lingua reaxustada ó seu valor por defecto {locale}',
'fr_FR': 'Langue remise par défaut, qui est {locale}',
'ru_RU': 'Локаль сброшена. Теперь она равна {locale}',
'uk': 'Локаль скинута. Тепер вона дорівнює {locale}',
@@ -834,6 +889,7 @@ exports.strings = {
'es_AR': 'Usá alguno de estos comandos para tener más información:',
'es_ES': 'Por favor usa uno de los siguientes comandos para más información:',
'pt_BR': 'Use algum destes comandos para ter mais informações:',
+ 'gl' : 'Usa algún destes comandos para ter máis información:',
'fr_FR': 'Merci d\'utiliser une des commandes suivantes pour obtenir plus d\'informations',
'ru_RU': 'Для получения большей информации используй следующие команды:',
'uk': 'Щоб отримати більше інформації використовуй наступні команди:',
@@ -849,6 +905,7 @@ exports.strings = {
'es_AR': 'Esta es una lista de los comandos disponibles:',
'es_ES': 'Esta es una lista de todos los comandos disponibles:',
'pt_BR': 'Esta é uma lista dos comandos disponíveis:',
+ 'gl' : 'Esta é unha lista dos comando dispoñibles:',
'fr_FR': 'Ci-dessous est la liste de toutes les commandes disponibles :',
'ru_RU': 'Вот все поддерживаемуе команды:',
'uk': 'Ось список всіх можливих команд:',
@@ -864,6 +921,7 @@ exports.strings = {
'es_AR': 'Directorio cambiado a "/los/directorios/no/importan/en/esta/demo"',
'es_ES': 'Directorio cambiado a "/los/directorios/no/importan/en/esta/demo"',
'pt_BR': 'Diretório mudado para "/diretorios/nao/importam/neste/demo"',
+ 'gl' : 'Directorio cambiado a "/os/directorios/non/importan/nesta/demo"',
'fr_FR': 'Répertoire changé à "/directories/dont/matter/in/this/demo" (les répertoires ne servent à rien dans cette démo)',
'ru_RU': 'Директория изменена на "/директории/не/важны/в/этом/демо"',
'uk': 'Директорія змінена на "/директорії/не/мають/значення/в/цьому/демо"',
@@ -879,6 +937,7 @@ exports.strings = {
'es_AR': 'NoTePreocupesPorLosArchivosEnEstaDemo.txt',
'es_ES': 'NoTePreocupesPorLosArchivosEnEstaDemo.txt',
'pt_BR': 'NaoSePreocupeComNomesDeArquivoNesteDemo.txt',
+ 'gl' : 'NonTePreocupesPolosCambiosNestaDemo.txt',
'fr_FR': 'DontWorryAboutFilesInThisDemo.txt (ne vous préoccupez pas des noms de fichier dans cette démo)',
'ru_RU': 'НеНадоЗаботитьсяОФайлахВЭтомДемо.txt',
'uk': 'ЗабийНаФайлиВЦьомуДемо.txt',
@@ -893,6 +952,7 @@ exports.strings = {
'es_AR': 'LGB no puede recibir comandos en dispositivos móviles. Visitanos desde una desktop, ¡lo vale! :D',
'es_ES': 'LGB no puede recibir comandos en dispositivos móviles. Visítanos en una computadora de escritorio, ¡lo vale! :D',
'pt_BR': 'Provavelmente você não vai conseguir digitar comandos no celular, neste caso tente acessar de um computador',
+ 'gl' : 'LGB non pode recibir os comandos nos dispositivos móbiles. Visítanos dende un ordenador de escritorio, ¡paga a pena! :D',
'fr_FR': 'Impossible de faire apparaître le clavier sur mobile / tablette :( Essayez de passer sur un ordinateur de bureau :D',
'ru_RU': 'Мобильные не поддерживаются, зайди с компьютера!',
'uk': 'LGB не підтримує ввід тексту з мобільного, зайди з компьютера! Це цього варте!',
@@ -908,6 +968,7 @@ exports.strings = {
'es_AR': '¡Compartí este árbol con amigos! Pueden cargarlo con "import tree"',
'es_ES': '¡Comparte este árbol con amigos! Pueden cargarlo con "import tree"',
'pt_BR': 'Compartilhe esta árvore com seus amigos! Eles podem carregá-la com "import tree"',
+ 'gl' : '¡Comparte esta árbore cos teus amigos! Eles poden cargalo con "import tree"',
'fr_FR': 'Partagez cet arbre avec vos amis ! Ils peuvent le charger avec "import tree"',
'ru_RU': 'Поделись деревом с друзьями! Они могут загрузить его при помощи "import tree"',
'uk': 'Поділись цим деревом з друзями! Вони зможуть його завантажити за допомогою "import tree"',
@@ -923,6 +984,7 @@ exports.strings = {
'es_AR': '¡Pegá un blob JSON abajo!',
'es_ES': '¡Pega un blob JSON abajo!',
'pt_BR': 'Cole o JSON abaixo!',
+ 'gl' : 'Pega un JSON abaixo!',
'fr_FR': 'Collez un blob JSON ci-dessous !',
'ru_RU': 'Вставь JSON ниже!',
'uk': 'Встав JSON нижче!',
@@ -938,6 +1000,7 @@ exports.strings = {
'es_AR': 'El mapa resuelto fue eliminado, estás arrancando desde un estado limpio',
'es_ES': 'El mapa resuelto fue eliminado, estás empezando de un estado limpio.',
'pt_BR': 'Mapa de resolvidos descartado, você está começando com ficha limpa!',
+ 'gl' : 'O mapa resolto foi eliminado, estás arrancando dende un estado limpo.',
'fr_FR': 'La carte des niveaux résolus a été effacée, vous repartez de zéro !',
'ru_RU': 'Всё сброшено! Можно начать с чистого листа!',
'uk': 'Все скинуте! Можна починати з чистого аркушу!',
@@ -953,6 +1016,7 @@ exports.strings = {
'es_AR': '¡No estás en un nivel! Estás en el sandbox, comenzá un nivel usando "levels"',
'es_ES': '¡No estás en un nivel! Estás en el sandbox, comienza un nivel con "levels"',
'pt_BR': 'Você não está em um nível! Você está no sandbox, comece um nível com "levels"',
+ 'gl' : '¡Non estás en ningún nivel! Estás nunha caixa de arena, comeza un nivel usando "levels"',
'fr_FR': 'Vous n\'êtes pas dans un niveau ! Vous êtes dans le mode bac à sable, commencez un niveau avec "levels"',
'ru_RU': 'Ты не проходишь уровень! Ты в песочнице! Чтобы начать уровень, используй команду "levels"!',
'uk': 'Ти не в рівні! Ти в пісочниці! Почни рівень з "levels"',
@@ -968,6 +1032,7 @@ exports.strings = {
'es_AR': 'No se encontró ningún nivel {id}. Abriendo la vista de selección de niveles...',
'es_ES': 'No se encontró ningún nivel {id}. Abriendo la vista de selección de niveles...',
'pt_BR': 'O nível "{id}" não existe! Abrindo uma caixa de seleção de nível',
+ 'gl' : 'O nivel "{id}" non existe! Abrindo unha caixa de seleción de nivel',
'fr_FR': 'Le niveau dont l\'identifiant est {id} n\'a pas été trouvé ! Ouverture de la vue de sélection des niveaux',
'ru_RU': 'Уровень с id "{id}" не найден! Открываю выбор уровней',
'uk': 'Рівень з id "{id}" не знайдений! Відкриваю вибір рівней',
@@ -983,6 +1048,7 @@ exports.strings = {
'es_AR': 'No hay comandos que deshacer',
'es_ES': 'No hay comandos que deshacer',
'pt_BR': 'Você já desfez tudo!',
+ 'gl' : 'Nonn hai comandos que desfacer',
'fr_FR': 'La pile d\'annulation est vide !',
'ru_RU': 'Некуда откатывать!',
'uk': 'Нема куди відкатуватися',
@@ -998,6 +1064,7 @@ exports.strings = {
'es_AR': 'Ya resolviste este nivel, probá otros usando "levels" o volvé al sandbox usando "sandbox"',
'es_ES': 'Ya resolviste este nivel, prueba otros usando "levels" o vuelve al sandbox usando "sandbox"',
'pt_BR': 'Você já resolveu este nível, tente outros com "levels" ou volte ao sandbox com "sandbox"',
+ 'gl' : 'Xa resolviches este nivel, proba outros usando "levels" ou volve á caixa de area con "sandbox"',
'fr_FR': 'Vous avez déjà résolu ce niveau, essayez d\'autres niveaux avec "levels" ou revenez au bac à sable avec "sandbox"',
'ru_RU': 'Ты уже прошел этот уровень, попробуй пройти другие при помощи команды "levels" или иди в песочницу "sandbox"',
'uk': 'Ти вже пройшов цей рівень, спробуй інші рівні з "levels" чи повернись в пісочницю з "sandbox"',
@@ -1011,6 +1078,7 @@ exports.strings = {
'zh_CN': '恭喜过关!!',
'zh_TW': '恭喜,本關解決了!!',
'es_ES': '¡Resuelto!\n:D',
+ 'gl' : '¡Resolto!',
'ru_RU': 'Решено!!\n:D',
'uk' : 'Вирішено!!\n:D',
'ko' : '해결 완료!!\n:D'
@@ -1025,6 +1093,7 @@ exports.strings = {
'es_AR': '¡Ese comando de git está deshabilitado para este nivel!',
'es_ES': '¡Ese comando de git está deshabilitado para este nivel!',
'pt_BR': 'Achou que seria fácil assim? Desabilitamos esse comando durante este nível, só para dificultar ;-)',
+ 'gl' : '¡Ese comando de git está deshabilitado para este nivel!',
'fr_FR': 'Cette commande git est désactivée pour ce niveau !',
'ru_RU': 'На этом уровне нельзя использовать эту команду!',
'uk': 'На цьому рівні не можна використовувати цю команду!',
@@ -1040,6 +1109,7 @@ exports.strings = {
'es_AR': 'Este es el JSON de este nivel. Compartilo con quien quieras o mandámelo por Github',
'es_ES': 'Este es el JSON de este nivel. Compártelo con quien quieras o mandámelo por Github.',
'pt_BR': 'Aqui está o JSON para este nível! Compartilhe com alguém ou me envie pelo Github',
+ 'gl' : 'Este é o JSON deste nivel. Comparteo con quen queiras ou mándao por Github',
'fr_FR': 'Voici le JSON pour ce niveau ! Partagez-le avec quelqu\'un ou envoyez-le moi sur Github',
'ru_RU': 'Вот JSON для этого уровня! Поделись им с кем-нибудь или отправь его нам на GitHub',
'uk': 'Ось JSON для цього рівня! Поділись з кимось чи відправ мені його на Github',
@@ -1055,6 +1125,7 @@ exports.strings = {
'es_AR': 'No especificaste un mensaje de inicio, ¿querés agregar uno?',
'es_ES': 'No especificaste un mensaje de inicio, ¿quieres agregar uno?',
'pt_BR': 'Você não especificou uma mensagem de início, quer colocar uma?',
+ 'gl' : 'Non especificaches unha mensaxe de incio. ¿queres agregar un?',
'fr_FR': 'Vous n\'avez pas spécifié de dialogue de départ, voulez-vous en ajouter un ?',
'ru_RU': 'Не указано стартово сообщение! Точно продолжаем?',
'uk': 'Не вказано стартовий діалог, хочеш додати стартовий діалог?',
@@ -1070,6 +1141,7 @@ exports.strings = {
'es_AR': 'No especificaste ninguna pista, ¿querés agregar alguna?',
'es_ES': 'No especificaste ninguna pista, ¿quieres agregar alguna?',
'pt_BR': 'Você não especificou uma dica, quer colocar uma?',
+ 'gl' : 'Ti non especificaches unha pista, ¿queres agregar algunha?',
'fr_FR': 'Vous n\'avez pas spécifié d\'indice, voulez-vous en ajouter un ?',
'ru_RU': 'Не указана подсказка для уровня! Пренебречь? Вальсируем?',
'uk': 'Не вказана підказка, хочеш додати підказку?',
@@ -1085,6 +1157,7 @@ exports.strings = {
'es_AR': 'Ingresá una pista para este nivel, o dejalo en blanco si no querés incluir ninguna',
'es_ES': 'Ingresa una pista para este nivel, o déjalo en blanco si no quieres incluir ninguna.',
'pt_BR': 'Colocque uma dica para este nível, ou deixe em branco se não quiser incluir',
+ 'gl' : 'Ingresa unha pista para este nivel, ou déixao en branco se non a queres incluír.',
'fr_FR': 'Entrez l\'indice pour ce niveau, ou laissez-le vide pour ne pas l\'inclure',
'ru_RU': 'Введи подсказку для уровня, если хочешь.',
'uk': 'Додай підказку для рівня, якщо хочеш',
@@ -1100,6 +1173,7 @@ exports.strings = {
'es_AR': 'Ingresá el nombre del nivel',
'es_ES': 'Ingresa el nombre del nivel.',
'pt_BR': 'Coloque o nome do nível',
+ 'gl' : 'Coloque o nome do nivel',
'fr_FR': 'Entrez le nom pour ce niveau',
'ru_RU': 'Введи название уровня',
'uk': 'Введи назву рівня',
@@ -1115,6 +1189,7 @@ exports.strings = {
'es_AR': '¡Tu solución está vacía! Algo hay que hacer',
'es_ES': '¡Tu solución está vacía! Algo hay que hacer.',
'pt_BR': 'Sua solução está vazia! O aprendiz deveria ter que fazer alguma coisa',
+ 'gl' : '¡Su solución está vacía! Algo haberá que facer.',
'fr_FR': 'Votre solution est vide !! Quelque chose ne tourne pas rond',
'ru_RU': 'Решение не указано! Так не годится!',
'uk': 'Розв’язок порожній!! Щось не так',
@@ -1130,6 +1205,7 @@ exports.strings = {
'es_AR': 'Estableciendo el punto de inicio... La solución y el objetivo serán sobreescritos si ya habían sido definidos',
'es_ES': 'Estableciendo el punto de inicio... La solución y el objetivo serán sobreescritos si ya habían sido definidos.',
'pt_BR': 'Esbelecendo o ponto de início... a solução e o objetivo serão sobrescritos caso já existirem',
+ 'gl' : 'Establecendo o punto de inicio... A solución e o obxectivo serán sobreescritos se xa foron definidos.',
'fr_FR': 'Redéfinition du point de départ… la solution et la cible seront écrasés s\'ils ont déjà été définis',
'ru_RU': 'Устанавливаю стартовую точку... Решение и итоговое состояние будут стёрты, если они указаны ранее',
'uk': 'Встановлюю стартову точку... розв’язок та ціль будуть переписані якщо вони були задані раніше',
@@ -1145,6 +1221,7 @@ exports.strings = {
'es_AR': 'Estás en un nivel, por lo que hay varios tipos de ayuda. Por favor elegí entre "help level" para aprender algo más sobre esta lección, "help general" para ayuda sobre el uso de Learn GitBranching, o "objective" para aprender a resolver este nivel.',
'es_ES': 'Estás en un nivel, por lo que hay varios tipos de ayuda. Por favor elige "help level" para aprender más sobre esta lección, "help general" para ayuda sobre el uso de Learn GitBranching, o "objective" para aprender a resolver este nivel.',
'pt_BR': 'Você está em um nível, então há vários tipos de ajuda. Selecione "help level" para aprender mais sobre esta lição, "help general" para aprender a usar o Learn GitBranching, ou "objective" ver como resolver o nível.',
+ 'gl' : 'Estás nun nivel, entón hai varios tipos de axuda. Selecione "help level" para aprender máis sobre esta lección, "gelp general" para aprender a usar o Learn Git Branching, ou "objective" para ver como resolver o nivel.',
'fr_FR': 'Vous êtes dans un niveau, donc plusieurs formes d\'aide sont disponibles. Merci de sélectionner soit "help level" pour en apprendre plus sur cette leçon, "help general" pour l\'utilisation de Learn GitBranching, ou "objective" pour apprendre comment résoudre le niveau',
'ru_RU': 'При прохождении уровня доступны несколько видов помощи. Определить что нужно: "help level" чтобы получить информацию об этом уровне, "help general" для того, чтобы узнать о игре в целом или "objective" чтобы узнать что надо сделать в этом уровне.',
'uk': 'При проходженні рівня доступні декілька різновидів допомоги. Виберіть або "help level" щоб взнати більше про цей рівень, чи "help general" щоб взнати більше про Learn Git Branching, чи "objective" щоб дізнатись більше про проходження цього рівня',
@@ -1160,6 +1237,7 @@ exports.strings = {
'es_AR': 'Estás en el constructor de niveles, por lo que hay varios tipos de ayuda. Elegí entre "help general" para ayuda sobre Learn GitBranching y "help builder" para ayuda sobre el constructor de niveles',
'es_ES': 'Estás en un constructor de niveles, por lo que hay varios tipos de ayuda. Elige "help general" para ayuda sobre Learn GitBranching o "help builder" para ayuda sobre el constructor de niveles',
'pt_BR': 'Você está no construtor de nívels, então há vários tipos de ajuda. Selecione "help general" ou "help builder"',
+ 'gl' : 'Estás no constructor de niveis, polo que hai varios tipos de axuda. Elixe "help general" ou "help builder"',
'fr_FR': 'Vous êtes dans l\'éditeur de niveaux, donc plusieurs formes d\'aide sont disponibles. Merci de sélectionner soit "help general" soit "help builder"',
'ru_RU': 'При создании уровней доступны несколько видов помощи. Выбери между "help general" и "help builder"',
'uk': 'При створенні рівня доступні декілька різновидів допомоги. Виберіть або "help general", чи "help builder"',
@@ -1174,6 +1252,7 @@ exports.strings = {
'zh_CN': '显示目标',
'fr_FR': 'Afficher les cibles',
'pt_BR': 'Mostrar objetivo',
+ 'gl' : 'Amosar obxectivo',
'es_AR': 'Mostrar objetivo',
'es_ES': 'Mostrar objetivo',
'ja' : 'ゴールを表示',
@@ -1190,6 +1269,7 @@ exports.strings = {
'zh_TW': '隱藏目標',
'zh_CN': '隐藏目标',
'pt_BR': 'Ocultar objetivo',
+ 'gl' : 'Ocultar obxectivo',
'es_AR': 'Ocultar objetivo',
'es_ES': 'Ocultar objetivo',
'ja' : 'ゴールを隠す',
@@ -1205,6 +1285,7 @@ exports.strings = {
'zh_TW': '提示',
'zh_CN': '提示',
'es_ES': 'Objetivo',
+ 'gl' : 'Obxectivo',
'ru_RU': 'Задача',
'uk': 'Задача',
'ko': '목적'
@@ -1216,7 +1297,8 @@ exports.strings = {
'de_DE': 'Git Demonstration',
'zh_TW': 'Git示範',
'zh_CN': 'Git示范',
- 'es_ES': 'Demonstración de Git',
+ 'es_ES': 'Demostración de Git',
+ 'gl' : 'Demostración de Git',
'ru_RU': 'Git демо',
'uk' : 'Git демо',
'ko' : 'Git 데모'
@@ -1231,6 +1313,7 @@ exports.strings = {
'es_AR': 'Objetivo a cumplir',
'es_ES': 'Objetivo a cumplir',
'pt_BR': 'Objetivo a cumprir',
+ 'gl' : 'Obxectivo a cumprir',
'fr_FR': 'Cible à atteindre',
'ja' : '到達目標',
'ru_RU': 'Цель уровня',
@@ -1246,6 +1329,7 @@ exports.strings = {
'es_AR': 'Nota: Sólo la rama master va a ser chequeada en este nivel. Las otras ramas sólo son para referencia. Como siempre, podés ocultar este mensaje con "hide goal"',
'es_ES': 'Nota: Sólo la rama master va a ser inspeccionado en este nivel. Las otras ramas sólo son para referencia (etiquetados abajo con guion). Siempre puedes ocultar este mensaje con "hide goal."',
'pt_BR': 'Nota: Apenas o ramo master será verificado neste nível. Os outros ramos (dentro das caixas clareadas) são somente para referência. Como sempre, você pode ocultar esta janela com "hide goal"',
+ 'gl': 'Nota: Só a rama master será verificada neste nivel. As outras ramas (dentro das caixas clareadas) son soamente de referencia. Coma sempre, podes ocultar está ventá con "hide goal"',
'zh_CN': '注意:本关卡中,只检查 master 分支,其他分支只是用作 reference 存在(以虚线标签表示)。照常,你可以用 “hide goal” 来隐藏此窗口。',
'zh_TW': '在這個關卡中,只有 master branch 會被檢查,別的 branch 只是用來做為 reference (下面用虛線符號表示)。一如往常,你可以利用 "hide goal" 來隱藏這個對話視窗',
'ja': 'Note: masterブランチだけをこのlevelではチェックします。その他のブランチ(以下では、破線で示されています)に関しては、参照のためにあります。また、いつでもこのウィンドウは"hide goal"と打つかクリックで閉じれます',
@@ -1263,6 +1347,7 @@ exports.strings = {
'es_AR': 'Podés ocultar esta ventana con "hide goal"',
'es_ES': 'Puedes ocultar esta ventana con "hide goal."',
'pt_BR': 'Você pode ocultar esta janela com "hide goal"',
+ 'gl' : 'Podes ocultar esta ventá con "hide goal"',
'fr_FR': 'Vous pouvez masquer cette fenêtre avec "Cacher les cibles"',
'ja' : 'このウィンドウは"hide goal"と打つかクリックで閉じれます',
'ru_RU': 'Можно скрыть это окно при помощи "hide goal"',
@@ -1279,6 +1364,7 @@ exports.strings = {
'es_AR': 'Podés ocultar esta ventana con "hide start"',
'es_ES': 'Puedes ocultar esta ventana con "hide start."',
'pt_BR': 'Você pode ocultar esta janela com "hide start"',
+ 'gl' : 'Podes ocultar esta ventá con "hide start"',
'fr_FR': 'Vous pouvez masquer cette fenêtre avec "hide start"',
'ja' : 'このウィンドウは"hide start"かクリックで閉じれます',
'ru_RU': 'Можно скрыть это окно при помощи "hide start"',
@@ -1295,6 +1381,7 @@ exports.strings = {
'es_AR': 'Constructor de niveles',
'es_ES': 'Constructor de niveles',
'pt_BR': 'Construtor de níveis',
+ 'gl' : 'Constructor de nivéis',
'fr_FR': 'Éditeur de niveaux',
'ja' : 'Levelエディタ',
'ru_RU': 'Редактор уровней',
@@ -1311,6 +1398,7 @@ exports.strings = {
'es_AR': '¡No hay mensaje de inicio para este nivel!',
'es_ES': '¡No hay mensaje de inicio para este nivel!',
'pt_BR': 'Não há mensagem de início para este nível!',
+ 'gl' : '¡Non hai mensaxe de inicio para este nivel!',
'fr_FR': 'Il n\'y a aucun dialogue de départ à afficher pour ce niveau !',
'ja' : 'このLevelにはスタートダイアログが存在しません',
'ru_RU': 'Нет стартового сообщение для уровня!',
@@ -1327,6 +1415,7 @@ exports.strings = {
'es_AR': 'Mmm... Pareciera no haber pistas para este nivel :-/',
'es_ES': 'Mmm... Parece que no hay pistas para este nivel. :-/',
'pt_BR': 'Hmm, não existe nenhuma pista para este nível :-/',
+ 'gl' : 'Hmm, non existe ningunha pista para este nivel :-/',
'fr_FR': 'Hum, il ne semble pas y avoir d\'indice pour ce niveau :-/',
'ja' : 'あらら、このLevelでは、残念ながらヒントが存在しません :-/',
'ru_RU': "Милый мой, хороший, догадайся сам :-/ Подсказка не создана...",
@@ -1343,6 +1432,7 @@ exports.strings = {
'es_AR': 'Aún no hay traducción para {key} :( ¡Metete en Github y sugerí una! :)',
'es_ES': 'Aún no hay traducción para {key}. :( ¡Métete en Github y sugiere una! :)',
'pt_BR': 'Não existe tradução para {key} :( Pule no Github e sugira uma! :)',
+ 'gl' : 'Non existe tradución para {key} :( Axúdanos en Github e suxire unha! :)',
'fr_FR': 'La traduction pour {key} n\'existe pas encore :( Venez sur Github pour en offrir une !',
'ja' : '{key}の翻訳がまだ存在しません :( GitHubでの、翻訳の協力をお願いします m(_)m',
'ru_RU': 'Перевода для {key} не создано :( Пожалуйста, предложи перевод на GitHub',
@@ -1359,6 +1449,7 @@ exports.strings = {
'es_AR': 'Este mensaje o texto aún no fue traducido a tu idioma :( ¡Metete en Github y ayudanos a traducirlo!',
'es_ES': 'Este mensaje o texto aún no fue traducido a tu idioma. :( ¡Métete en Github y ayúdanos a traducirlo!',
'pt_BR': 'Esta mensagem ou texto não foi traduzida para Português :( Ajude-nos a traduzir no Github!',
+ 'gl' : 'Esta mensaxe ou texto non foi traducida ó teu idioma :( Axúdanos a traducir a web en Github, é moi doado!',
'fr_FR': 'Ce message n\'a pas encore été traduit dans votre langue :( Venez sur Github aider à la traduction !',
'ja' : 'このダイアログ、またはテキストの翻訳がまだ存在しません :( GitHubでの、翻訳の協力をお願いします m(_)m',
'ru_RU': 'Для этого сообщения нет перевода :( Пожалуйста, предложи перевод на GitHub',
diff --git a/src/js/react_views/IntlHelperBarView.jsx b/src/js/react_views/IntlHelperBarView.jsx
index 7b9a1cf7..e0756dcc 100644
--- a/src/js/react_views/IntlHelperBarView.jsx
+++ b/src/js/react_views/IntlHelperBarView.jsx
@@ -93,6 +93,12 @@ var IntlHelperBarView = React.createClass({
onClick: function() {
this.fireCommand('locale uk; levels');
}.bind(this)
+ }, {
+ text: 'Galego',
+ testID: 'galician',
+ onClick: function() {
+ this.fireCommand('locale gl; levels');
+ }.bind(this)
}, {
icon: 'signout',
onClick: function() {
diff --git a/src/levels/advanced/multipleParents.js b/src/levels/advanced/multipleParents.js
index 93b5e3b7..7b40b4dc 100644
--- a/src/levels/advanced/multipleParents.js
+++ b/src/levels/advanced/multipleParents.js
@@ -10,6 +10,7 @@ exports.level = {
"ja" : "複数の親",
"es_AR": "Múltiples padres",
"pt_BR": "Múltiplos pais",
+ "gl" : "Múltiples pais",
"zh_TW": "多個 parent commit",
"ru_RU": "Здоровая семья, или несколько родителей",
"ko" : "다수의 부모",
@@ -23,6 +24,7 @@ exports.level = {
"zh_CN": "使用 `git branch bugWork` 加上一个目标提交记录来创建消失的引用。",
"es_AR": "Usá `git branch bugWork` sobre algún commit para crear la referencia faltante",
"pt_BR": "Use `git branch bugWork` com um commit alvo para criar a referência que falta",
+ "gl" : "Usa `git branch bugWork` sobre calquera commit para crear a referencia que falta",
"zh_TW": "在一個指定的 commit 上面使用 `git branch bugWork`。",
"ru_RU": "`git branch bugWork` на нужном коммите поможет создать нужную ссылку.",
"ko" : "`git branch bugWork`를 대상 커밋과 함께 사용해서 부족한 참조를 만드세요",
@@ -551,6 +553,94 @@ exports.level = {
}
]
},
+
+ "gl": {
+ "childViews": [
+ {
+ "type": "ModalAlert",
+ "options": {
+ "markdowns": [
+ "### Especificando pais",
+ "",
+ "Tanto o modificador `~`, como o modificador `^` aceptan un número opcional despois del.",
+ "",
+ "Mellor que especificar o número de commits que percorrer cara atrás (que é o que o `~` fai), o modificador sobre `^` especifica qué referencia do pai vai ser seguida dende o commit con merge. Lembra qué os commits do merge teñen varios pais, entón o camiño a seguir é ambiguo.",
+ "",
+ "Git normalmente seguirá ó \"primeiro\" pai de un commit de merge, pero especificando un número co `^` muda o comportamento do pai.",
+ "",
+ "Xa chega de faladoiros, vexamos o comando en acción.",
+ ""
+ ]
+ }
+ },
+ {
+ "type": "GitDemonstrationView",
+ "options": {
+ "beforeMarkdowns": [
+ "Aquí temos un commit do merge. Se fixéramos checkout en `master^` sen especificar un número, imos seguir ó primeiro pai enriba do commit do merge. ",
+ "",
+ "(*Na nosa vista, o primeiro pai é aquel directamente enriba do commit do merge.*)"
+ ],
+ "afterMarkdowns": [
+ "Sinxelo, eso é aquelo co que xa estamos acostumados."
+ ],
+ "command": "git checkout master^",
+ "beforeCommand": "git checkout HEAD^; git commit; git checkout master; git merge C2"
+ }
+ },
+ {
+ "type": "GitDemonstrationView",
+ "options": {
+ "beforeMarkdowns": [
+ "Agora imos, en vez de iso, especificar o segundo pai..."
+ ],
+ "afterMarkdowns": [
+ "¿Viches? Subimos para o outro pai."
+ ],
+ "command": "git checkout master^2",
+ "beforeCommand": "git checkout HEAD^; git commit; git checkout master; git merge C2"
+ }
+ },
+ {
+ "type": "GitDemonstrationView",
+ "options": {
+ "beforeMarkdowns": [
+ "Os modificadores `^` e `~` pódense mover ao redor da árbore de commits con moito poder:"
+ ],
+ "afterMarkdowns": [
+ "Rápido coma a luz!"
+ ],
+ "command": "git checkout HEAD~; git checkout HEAD^2; git checkout HEAD~2",
+ "beforeCommand": "git commit; git checkout C0; git commit; git commit; git commit; git checkout master; git merge C5; git commit"
+ }
+ },
+ {
+ "type": "GitDemonstrationView",
+ "options": {
+ "beforeMarkdowns": [
+ "Aínda máis tolo, eses modificadores poden ser encadeados en conxunto! Olla ahí:"
+ ],
+ "afterMarkdowns": [
+ "O mesmo movemento feito antes, pero feito nun só comando."
+ ],
+ "command": "git checkout HEAD~^2~2",
+ "beforeCommand": "git commit; git checkout C0; git commit; git commit; git commit; git checkout master; git merge C5; git commit"
+ }
+ },
+ {
+ "type": "ModalAlert",
+ "options": {
+ "markdowns": [
+ "### Pono na práctica",
+ "",
+ "Para completar este nível, crea unha nova rama no destino especificado.",
+ "",
+ "Obviamente sería máis sinxelo especificar o commit diretamente (algo como `C6`), pero en vez de facer eso, ¡podes usar os modificadores dos que falamos!"
+ ]
+ }
+ }
+ ]
+ },
"zh_TW": {
"childViews": [
{
diff --git a/src/levels/index.js b/src/levels/index.js
index f35474ad..957193c7 100644
--- a/src/levels/index.js
+++ b/src/levels/index.js
@@ -60,6 +60,7 @@ var sequenceInfo = exports.sequenceInfo = {
'fr_FR': 'Séquence d\'introduction',
'es_AR': 'Secuencia introductoria',
'pt_BR': 'Sequência introdutória',
+ 'gl' : 'Secuencia introductoria',
'zh_CN': '基础篇',
'zh_TW': '基礎篇',
'ko' : 'git 기본',
@@ -73,6 +74,7 @@ var sequenceInfo = exports.sequenceInfo = {
'fr_FR': 'Une introduction en douceur à la majorité des commandes git',
'es_AR': 'Una breve introducción a la mayoría de los comandos de git',
'pt_BR': 'Uma breve introdução à maioria dos comandos do git',
+ 'gl' : 'Unha breve introducción á maioría dos comandos de git',
'zh_CN': '循序渐进地介绍 Git 主要命令',
'zh_TW': '循序漸進地介紹 git 主要命令',
'ko' : 'git의 주요 명령어를 깔끔하게 알려드립니다',
@@ -88,6 +90,7 @@ var sequenceInfo = exports.sequenceInfo = {
'fr_FR': 'Montée en puissance',
'es_AR': 'Acelerando',
'pt_BR': 'Acelerando',
+ 'gl' : 'Alixeirando',
'zh_CN': '高级篇',
'zh_TW': '進階篇',
'ru_RU': 'Едем дальше',
@@ -101,6 +104,7 @@ var sequenceInfo = exports.sequenceInfo = {
'fr_FR': 'Le prochain excellent plat de pur git. J\'espère que vous êtes affamés',
'es_AR': 'La próxima porción de 100% maravillas git. Espero que estés hambriento',
'pt_BR': 'A próxima porção de maravilhas do git. Faminto?',
+ 'gl' : 'A próxima porción das marabillas de git. Agardo que estés esfameado',
'zh_CN': '要开始介绍 Git 的超棒特性了,快来吧!',
'zh_TW': '接下來是 git 非常厲害的地方!相信你已經迫不及待了吧!',
'ru_RU': 'Следующая порция абсолютной git-крутотенюшки. Проголодались?',
@@ -117,6 +121,7 @@ var sequenceInfo = exports.sequenceInfo = {
'fr_FR': 'Push & Pull -- dépôts gits distants !',
'es_AR': 'Push & Pull -- Git Remotes!',
'pt_BR': 'Push & Pull -- repositórios remotos no Git!',
+ 'gl' : 'Push & Pull -- Repositorios remotos no Git!',
'zh_CN': 'Push & Pull —— Git 远程仓库!',
'zh_TW': 'Push & Pull -- Git Remotes!',
'ru_RU': 'Push & Pull - удалённые репозитории в Git!',
@@ -130,6 +135,7 @@ var sequenceInfo = exports.sequenceInfo = {
'de_DE': 'Zeit Eure 1en und 0en zu teilen; Coding mit sozialer Komponente',
'es_AR': 'Hora de compartir sus 1\'s y 0\'s, chicos; programar se volvió social!',
'pt_BR': 'Hora de compartilhar seus 1\'s e 0\'s, crianças; programar agora é social!',
+ 'gl' : 'Hora de compartilos seus 1\' e 0\'s, rapaces; programar agora é social!',
'zh_CN': '是时候分享你的代码了,让编码变得社交化吧',
'zh_TW': '是時候分享你的程式碼了',
'ru_RU': 'Настало время поделиться своими единичками и нулями. Время коллективного программирования',
@@ -146,6 +152,7 @@ var sequenceInfo = exports.sequenceInfo = {
'fr_FR': 'Vers l\'infini et au-delà -- dépôts distants version avancée',
'es_AR': 'Hasta el origin y más allá -- Git Remotes avanzado!',
'pt_BR': 'Até a origin e além -- repositórios remotos avançados!',
+ 'gl' : 'Ata á orixe e máis aló -- repositorios remotos avanzados!',
'zh_CN': '关于 origin 和它的周边 —— Git 远程仓库高级操作',
'zh_TW': '關於 origin 和其它 repo,git remote 的進階指令',
'ru_RU': 'Через origin – к звёздам. Продвинутое использование Git Remotes',
@@ -158,6 +165,7 @@ var sequenceInfo = exports.sequenceInfo = {
'ja' : '絶えず上級者の仕事は存在する。。。',
'es_AR': 'Y pensabas que ser un dictador benévolo sería divertido...',
'pt_BR': 'E você achava que ser um déspota esclarecido seria mais divertido...',
+ 'gl' : 'E pensabas que ser un dictador benévolo sería divertido...',
'zh_CN': '做一名仁慈的独裁者一定会很有趣……',
'zh_TW': '而且你會覺得做一個仁慈的獨裁者會很有趣...',
'de_DE': 'Git Remotes für Fortgeschrittene',
@@ -173,6 +181,7 @@ var sequenceInfo = exports.sequenceInfo = {
'fr_FR': 'Déplacer le travail',
'es_AR': 'Moviendo el trabajo por ahí',
'pt_BR': 'Movendo trabalho por aí',
+ 'gl' : 'Movendo o traballo por ahí',
'ja' : 'コードの移動',
'ko' : '코드 이리저리 옮기기',
'zh_CN': '移动提交记录',
@@ -186,6 +195,7 @@ var sequenceInfo = exports.sequenceInfo = {
'fr_FR': 'Soyez à l\'aise pour modifier l\'arbre Git',
'es_AR': 'Ponete cómodo con modificar el directorio fuente',
'pt_BR': 'Fique confortável em modificar a árvore de códigos',
+ 'gl' : 'Ponte cómodo modificando a árbore de git',
'ko' : '작업 트리를 수정하는건 식은죽 먹기지요 이제',
'ja' : '話題のrebaseってどんなものだろう?って人にオススメ',
'zh_CN': '自由修改提交树',
@@ -202,6 +212,7 @@ var sequenceInfo = exports.sequenceInfo = {
'fr_FR': 'Un assortiment',
'es_AR': 'Bolsa de gatos',
'pt_BR': 'Sortidos',
+ 'gl' : 'Todo mesturado',
'ko' : '종합선물세트',
'zh_CN': '杂项',
'zh_TW': '活用 git 的指令',
@@ -215,6 +226,7 @@ var sequenceInfo = exports.sequenceInfo = {
'fr_FR': 'Un assortiment de techniques et astuces pour utiliser Git',
'es_AR': 'Un rejunte de técnicas, trucos y tips sobre Git',
'pt_BR': 'Técnicas, truques e dicas sortidas sobre Git',
+ 'gl' : 'Mestura de técnicas, trucos e consellos',
'ko' : 'Git을 다루는 다양한 팁과 테크닉을 다양하게 알아봅니다',
'zh_CN': 'Git 技术、技巧与贴士大集合',
'zh_TW': 'git 的技術,招數與技巧',
@@ -230,6 +242,7 @@ var sequenceInfo = exports.sequenceInfo = {
'fr_FR': 'Sujets avancés',
'es_AR': 'Temas avanzados',
'pt_BR': 'Temas avançados',
+ 'gl' : 'Temas avanzados',
'zh_CN': '高级话题',
'zh_TW': '進階主題',
'ru_RU': 'Продвинутый уровень',
@@ -243,6 +256,7 @@ var sequenceInfo = exports.sequenceInfo = {
'fr_FR': 'Pour les plus courageux !',
'es_AR': '¡Para los verdaderos valientes!',
'pt_BR': 'Para os verdadeiros valentes!',
+ 'gl' : '¡Para os verdadeiros valerosos!',
'zh_CN': '只为真正的勇士!',
'zh_TW': '來成為真正的強者吧!',
'ru_RU': 'Если ты смелый, ловкий, умелый – потренируйся тут',
diff --git a/src/levels/intro/branching.js b/src/levels/intro/branching.js
index 79c00471..7ecdc005 100644
--- a/src/levels/intro/branching.js
+++ b/src/levels/intro/branching.js
@@ -8,6 +8,7 @@ exports.level = {
"ko": "Git에서 브랜치 쓰기",
"es_AR": "Brancheando en Git",
"pt_BR": "Ramos no Git",
+ "gl" : "Ramas en Git",
"fr_FR": "Gérer les branches avec Git",
"zh_CN": "Git Branch",
"zh_TW": "建立 git branch",
@@ -20,6 +21,7 @@ exports.level = {
"ja" : "ブランチの作成(\"git branch [ブランチ名]\")と、チェックアウト(\"git checkout [ブランチ名]\")",
"es_AR": "Hacé una nueva rama con \"git branch [nombre]\" y cambiá a ella con \"git checkout [nombre]\"",
"pt_BR": "Crie um novo ramo com \"git branch [nome]\" e mude para ele com \"git checkout [nome]\"",
+ "gl" : "Crea unha nova rama con \"git branch [nome]\" e cambiate a ela facendo \"git checkout [nome]\"",
"fr_FR": "Faites une nouvelle branche avec \"git branch [nom]\" positionnez-vous dans celle-ci avec \"git checkout [nom]\"",
"zh_CN": "用 'git branch <分支名>' 来创建分支,用 'git checkout <分支名>' 来切换到分支",
"zh_TW": "用 'git branch [ branch 名稱]' 來建立 branch,用 'git checkout [ branch 名稱]' 切換到該 branch",
@@ -420,6 +422,88 @@ exports.level = {
}
]
},
+ "gl": {
+ "childViews": [
+ {
+ "type": "ModalAlert",
+ "options": {
+ "markdowns": [
+ "## Ramas en Git",
+ "",
+ "As Ramas en Git son tamén increiblemente liviás. Elas sinxelamente son referencias a un mesmo commit específico, e nada máis. É por iso que moitos entusiastas do Git entonan o mantra:",
+ "",
+ "```",
+ "ramifica cedo, ramifica sempre",
+ "```",
+ "",
+ "Debido a non existir sobrecarga de memoria facendo moitas ramas, é máis sinxelo dividir a lóxica do teu traballo en ramas que ter unha enorme.",
+ "",
+ "Cando comezamos a mesturar ramas e commits imos ver como eses dous recursos combínanse ben. Por agora lembra que unha rama esencialmente di \"Quero incluír o traballo deste commit e de todos os seus ancestros\"."
+ ]
+ }
+ },
+ {
+ "type": "GitDemonstrationView",
+ "options": {
+ "beforeMarkdowns": [
+ "Vexamos cómo as ramas funcionan na práctica.",
+ "",
+ "Aquí imos crear unha nova rama chamada `newImage`"
+ ],
+ "afterMarkdowns": [
+ "Mira, solo tes que poñer eso para crear unha rama! A rama `newImage` agora apunta ó commit `C1`"
+ ],
+ "command": "git branch newImage",
+ "beforeCommand": ""
+ }
+ },
+ {
+ "type": "GitDemonstrationView",
+ "options": {
+ "beforeMarkdowns": [
+ "Imos intentar colocar algún traballo nesta nova rama. Pincha no botón de abaixo"
+ ],
+ "afterMarkdowns": [
+ "¡Bueno home! A rama `master` moveuse pero a rama `newImage` non! Eso é porque a nova rama non era a \"actual\", e é por iso que o asterisco (*) ficaba na rama `master`"
+ ],
+ "command": "git commit",
+ "beforeCommand": "git branch newImage"
+ }
+ },
+ {
+ "type": "GitDemonstrationView",
+ "options": {
+ "beforeMarkdowns": [
+ "Ímoslle decir a Git que nos queremos mover á rama con:",
+ "",
+ "```",
+ "git checkout [nome]",
+ "```",
+ "",
+ "Esto vainos levar á rama que tiñamos antes de facer os nosos cambios."
+ ],
+ "afterMarkdowns": [
+ "¡Imos alá! Os nosos cambios foron grabados na nova rama."
+ ],
+ "command": "git checkout newImage; git commit",
+ "beforeCommand": "git branch newImage"
+ }
+ },
+ {
+ "type": "ModalAlert",
+ "options": {
+ "markdowns": [
+ "¡Ok! Estas preparado para facer ramas. Así que podes pechar a ventá,",
+ "crear unha rama chamada `bugFix` e moverte para esa rama.",
+ "",
+ "Inda así, hai un atallo: se ti quixeras crear unha nova ",
+ "rama e moverte a ela ó mesmo tempo, ti podes escribir simplemente ",
+ "`git checkout -b [a-tua- rama]`."
+ ]
+ }
+ }
+ ]
+ },
"fr_FR": {
"childViews": [
{
diff --git a/src/levels/intro/commits.js b/src/levels/intro/commits.js
index a9ee3309..9f74fc72 100644
--- a/src/levels/intro/commits.js
+++ b/src/levels/intro/commits.js
@@ -4,6 +4,7 @@ exports.level = {
"de_DE": "Einführung in Git Commits",
"es_AR": "Introducción a los commits de Git",
"pt_BR": "Introdução aos commits no Git",
+ "gl" : "Introducción ós commits de Git",
"fr_FR": "Introduction aux commits avec Git",
"ja" : "Gitのコミット",
'ko': 'Git 커밋 소개',
@@ -20,6 +21,7 @@ exports.level = {
"de_DE": "Gib einfach zweimal 'git commit' ein um den Level abzuschließen",
"es_AR": "¡Simplemente tipeá 'git commit' dos veces para terminar!",
"pt_BR": "Simplesmente digite 'git commit' duas vezes para concluir!",
+ "gl" : "Simplemente escribe 'git commit' dúas veces para terminar.",
"fr_FR": "Il suffit de saisir 'git commit' deux fois pour réussir !",
"zh_CN": "执行两次 'git commit' 就可以过关了!",
"zh_TW": "輸入兩次 'git commit' 就可以完成!",
@@ -246,6 +248,48 @@ exports.level = {
}
]
},
+ "gl": {
+ "childViews": [
+ {
+ "type": "ModalAlert",
+ "options": {
+ "markdowns": [
+ "## Commits en Git",
+ "Un commit nun repositorio de git rexistra unha fotografía (snapshot) de tódolos arquivos no seu directorio. É coma un copy&paste xigante, ¡pero todavía mellor!",
+ "",
+ "Git quere gardar os commits o máis pequenos posíbel, por iso non copia directamente o directorio completo sempre que fas un commit. El pode (cando é posíbel) comprimir nun commit un conxunto de cambios (ou un _\"delta\"_) entre unha versión do teu respositorio e o seguinte.",
+ "",
+ "Git tamén garda un histórico de cando se fixo cada cambio. Por iso a maioría dos commits teñen ancestros enriba deles, e nos indicámolos con frechas na nosa visualización. ¡Manter a historia é óptimo para tódolos que traballan no proxecto!",
+ "",
+ "Hai moito que aprender, pero por agora podes pensar que os commits son fotos do teu proxecto. Os commits son liviáns, e cambiar dun para o outro é extremadamente rápido!"
+ ]
+ }
+ },
+ {
+ "type": "GitDemonstrationView",
+ "options": {
+ "beforeMarkdowns": [
+ "Vexamos o que iso significa na práctica. Á dereita, temos unha visualización dun (pequeno) repositorio de git. Hai dous commits por agora: o commit inicial, `C0`, e un commit que lle segue, `C1`, que podería ter algúns cambios interesantes.",
+ "",
+ "Pincha no botón de abaixo para facer un novo commit"
+ ],
+ "afterMarkdowns": [
+ "¡Alá imos! Mi ma!. Fixemos cambios no repositorio e gardámolos nun commit. O commit que creaches ten un pai, `C1`, que é unha referencia do commit no que se basea."
+ ],
+ "command": "git commit",
+ "beforeCommand": ""
+ }
+ },
+ {
+ "type": "ModalAlert",
+ "options": {
+ "markdowns": [
+ "Alá imos. ¡Inténtao ti agora! Cando se peche a ventá, fai dous commits para completar o nivel."
+ ]
+ }
+ }
+ ]
+ },
"fr_FR": {
"childViews": [
{
diff --git a/src/levels/intro/merging.js b/src/levels/intro/merging.js
index 35a1d2bb..4e69ba24 100644
--- a/src/levels/intro/merging.js
+++ b/src/levels/intro/merging.js
@@ -6,6 +6,7 @@ exports.level = {
"de_DE": "Mergen in git",
"es_AR": "Mergeando en Git",
"pt_BR": "Merge no Git",
+ "gl" : "Merge en Git",
"fr_FR": "Faire des 'merge' (fusions de branches) avec Git",
"ko": "Git에서 브랜치 합치기(Merge)",
"ja" : "ブランチとマージ",
@@ -20,6 +21,7 @@ exports.level = {
"ja" : "指示された順番でコミットすること(masterの前にbugFixで)",
"es_AR": "Acordate de commitear en el orden especificado (bugFix antes de master)",
"pt_BR": "Lembre-se de commitar na ordem especificada (bugFix antes de master)",
+ "gl" : "Lembrate de facer commit na orde específica (bugFix antes de master)",
"fr_FR": "Pensez à faire des commits dans l'ordre indiqué (bugFix avant master)",
"zh_CN": "要按目标窗口中指定的顺序进行提交(bugFix 先于 master)",
"zh_TW": "記住按指定的順序 commit(bugFix 比 master 優先)",
@@ -376,6 +378,75 @@ exports.level = {
}
]
},
+ "gl": {
+ "childViews": [
+ {
+ "type": "ModalAlert",
+ "options": {
+ "markdowns": [
+ "## Ramas e merges",
+ "",
+ "¡Xenial! Agora sabemos como facer commits e crear ramas. Agora precisamos aprender unha forma de combinar o traballo de dúas ramas diferentes. Iso permitiríanos ramificar, facer un novo cambio, e entón mesturalo de volta.",
+ "",
+ "O primeiro comando para mesturar o traballo que imos ver é `git merge`. O merge de Git crea un commit especial que ten dous pais únicos. Un commit con dous pais significa \"Quero incluír todo o traballo deste pai cos cambios do outro pai, *e* o conxunto de tódolos ancestros.\"",
+ "",
+ "É máis doado con unha visualización, ímolo ver na seguinte vista."
+ ]
+ }
+ },
+ {
+ "type": "GitDemonstrationView",
+ "options": {
+ "beforeMarkdowns": [
+ "Aquí nos temos dúas ramas; cada unha ten un commit que é único. Isto significa que ningunha rama inclúe o conxunto de \"traballo\" feito no noso repositorio. Imos arranxar esto cun merge.",
+ "",
+ "Imos xuntar a rama `bugFix` na `master`"
+ ],
+ "afterMarkdowns": [
+ "¡Uah! ¿Viches? Antes de todo, `master` agora apunta a un commit que ten dous pais. Se ti sigues as frechas subindo a árbore de commits a partir de `master`, serás capaz de ver tódolos commits ata a raíz, calquera de eles. Isto significa que a rama `master` contén todo o traballo realizado no repositorio ata ese momento.",
+ "",
+ "Ademáis, ¿viches como cambiaron as cores dos commits? Para axudarte a aprender, hai unha lenda. Cada rama ten unha única cor. Cada commit ten a cor resultante de mesturar as cores de tódalas ramas que contén.",
+ "",
+ "Aquí vemos que a rama `master` está mesturada en todos os commits, pero a cor da rama `bugFix` non o está. Imos arranxar eso..."
+ ],
+ "command": "git merge bugFix",
+ "beforeCommand": "git checkout -b bugFix; git commit; git checkout master; git commit"
+ }
+ },
+ {
+ "type": "GitDemonstrationView",
+ "options": {
+ "beforeMarkdowns": [
+ "Imos mesturar a rama `master` en `bugFix`:"
+ ],
+ "afterMarkdowns": [
+ "Como o `bugFix` é un ancestro de `master`, o git non ten traballo que facer; el só ten que mover o punteiro de `bugFix` para o mesmo commit que `master`.",
+ "",
+ "Agora tódolos commits teñen a mesma cor, o que significa que ambas ramas teñen o mesmo traballo no repositorios! Iepa!"
+ ],
+ "command": "git checkout bugFix; git merge master",
+ "beforeCommand": "git checkout -b bugFix; git commit; git checkout master; git commit; git merge bugFix"
+ }
+ },
+ {
+ "type": "ModalAlert",
+ "options": {
+ "markdowns": [
+ "Para completar este nivel, fai o seguinte:",
+ "",
+ "* Crea unha nova ramara chamada `bugFix`",
+ "* Fai checkout da rama `bugFix` con `git checkout bugFix`",
+ "* Fai un commit",
+ "* Volve á rama `master` con `git checkout`",
+ "* Fai un novo commit",
+ "* Xunta a rama `bugFix` en `master` con `git merge`",
+ "",
+ "¡Recorda, podes amosar esta mensaxe novamente co comando \"objective\"!"
+ ]
+ }
+ }
+ ]
+ },
"fr_FR": {
"childViews": [
{
diff --git a/src/levels/intro/rebasing.js b/src/levels/intro/rebasing.js
index 3cfb56bd..29a46107 100644
--- a/src/levels/intro/rebasing.js
+++ b/src/levels/intro/rebasing.js
@@ -7,6 +7,7 @@ exports.level = {
"ja" : "Rebaseの解説",
"es_AR": "Introducción a rebase",
"pt_BR": "Introdução ao rebase",
+ "gl" : "Introducción a rebase",
"fr_FR": "Introduction à rebase",
"ko": "리베이스(rebase)의 기본",
"zh_CN": "Git Rebase",
@@ -21,6 +22,7 @@ exports.level = {
"fr_FR": "Assurez-vous de bien faire votre commit sur bugFix en premier",
"es_AR": "Asegurate de commitear desde bugFix primero",
"pt_BR": "O bugFix precisa ser commitado primeiro",
+ "gl" : "Asegurate de facer o commit dende bugFix primeiro",
"ko": "bugFix 브랜치에서 먼저 커밋하세요",
"zh_CN": "先在 bugFix 分支上进行提交",
"zh_TW": "你要先在 bugFix branch 進行 commit",
@@ -366,6 +368,73 @@ exports.level = {
}
]
},
+ "gl": {
+ "childViews": [
+ {
+ "type": "ModalAlert",
+ "options": {
+ "markdowns": [
+ "## Rebase en Git",
+ "",
+ "A segunda forma de mesturar traballo entre ramas é o *rebase*. O rebase esencialmente pega un conxunto de commits, \"copia\" os commits, e os sitúa en outro lugar.",
+ "",
+ "Esto pode paracer confuso, pero a vantaxe do rebase é que se pode usar para construír unha secuencia máis bonita e linial de commits. O rexisto de commits do repositorio estará máis limpo se só se permite facer rebases.",
+ "",
+ "Ímolo ver en acción..."
+ ]
+ }
+ },
+ {
+ "type": "GitDemonstrationView",
+ "options": {
+ "beforeMarkdowns": [
+ "Aquí temos dúas ramas novamente; decátate de que a rama `bugFix` está seleccionada (olla ó asterisco)",
+ "",
+ "Queremos mover o noso traballo do `bugFix` directamente dentro da rama `master`. Desta forma, vai parecer que eses dous recursos foron editados secuencialmente, cando a realidade é que se fixeron en paralelo.",
+ "",
+ "Imos lanzar o comando `git rebase`"
+ ],
+ "afterMarkdowns": [
+ "¡Buah chorvo! Agora o traballo da nosa rama `bugFix` está seguida de master, e temos unha fermosa línea de commits.",
+ "",
+ "Percibe que o commit `C3` aínda existe nalgún lugar (el está borrado na árbore), e que `C3'` é a \"copia\" que rebasamos en master.",
+ "",
+ "O único problema é que a rama master non foi actualizada tamén, ímolo facer agora..."
+ ],
+ "command": "git rebase master",
+ "beforeCommand": "git commit; git checkout -b bugFix C1; git commit"
+ }
+ },
+ {
+ "type": "GitDemonstrationView",
+ "options": {
+ "beforeMarkdowns": [
+ "Agora a rama `master` está ativa. Continuamos facendo o rebase na `bugFix`..."
+ ],
+ "afterMarkdowns": [
+ "¡Xa está! Como `master` era um ancestro de `bugFix`, git simplemente moveu a referencia da rama `master` máis adiante na historia."
+ ],
+ "command": "git rebase bugFix",
+ "beforeCommand": "git commit; git checkout -b bugFix C1; git commit; git rebase master; git checkout master"
+ }
+ },
+ {
+ "type": "ModalAlert",
+ "options": {
+ "markdowns": [
+ "Para completar este nivel, fai o seguinte",
+ "",
+ "* Fai checkout de un novo branch chamado `bugFix`",
+ "* Fai un commit",
+ "* Regresa a master e fai un commit novamente",
+ "* Móvete á rama bugFix outra vez e fai rebase sobre master",
+ "",
+ "Boa sorte!"
+ ]
+ }
+ }
+ ]
+ },
"fr_FR": {
"childViews": [
{
diff --git a/src/levels/mixed/describe.js b/src/levels/mixed/describe.js
index b0445568..0bef2010 100644
--- a/src/levels/mixed/describe.js
+++ b/src/levels/mixed/describe.js
@@ -9,6 +9,7 @@ exports.level = {
"ja" : "Git Describe",
"es_AR": "Git Describe",
"pt_BR": "Git Describe",
+ "gl" : "Git Describe",
"zh_TW": "git describe",
"zh_CN": "Git Describe",
"ru_RU": "Git describe",
@@ -22,6 +23,7 @@ exports.level = {
"ja" : "次に進む準備が整ったなら、bugFixに対して一回commitしてください",
"es_AR": "Simplemente commiteá una vez en bugFix cuando estés listo para seguir",
"pt_BR": "Simplesmente commite uma vez em bugFix quando quiser parar de experimentar",
+ "gl" : "Simplemente fai commit en bugFix cando estés listo para continuar.",
"zh_TW": "當你要移動的時候,只要在 bugFix 上面 commit 就好了",
"zh_CN": "当你准备好时,在 bugFix 分支上面提交一次就可以了",
"ru_RU": "Когда закончишь, просто сделай commit",
@@ -409,6 +411,69 @@ exports.level = {
}
]
},
+ "gl" : {
+ "childViews": [
+ {
+ "type": "ModalAlert",
+ "options": {
+ "markdowns": [
+ "### Git Describe",
+ "",
+ "Como as tags fan a función de \"áncora\" no repositorio, Git ten un comando para *describir* ónde podes estar ti en relación á \"áncora\" (tag) máis próxima. Ese comando chámase `git describe`!",
+ "",
+ "Git describe pode axudar a recuperar a túa posición despois de mover moitos commits para atrás ou para adiante na historia; esto pode suceder depois de que fagas un git bisect (unha búsqueda para atopar erros) ou cando te sentas no ordenador dun colega que chegou das vacacións."
+ ]
+ }
+ },
+ {
+ "type": "ModalAlert",
+ "options": {
+ "markdowns": [
+ "Git describe lánzase do seguinte xeito:",
+ "",
+ "`git describe `",
+ "",
+ "Onde `` é qualquera cousa que git poida resolver como unha referencia a un commit. Se non especificas a ref, git usará o commit actual no que se esté traballando (`HEAD`).",
+ "",
+ "A resposta do comando é algo semellante a esto:",
+ "",
+ "`__g`",
+ "",
+ "Onde `tag` é a tag anterior máis próxima na historia, `numCommits` é o número de commits de distancia ó tag, e `` é o hash do commit no que estamos."
+ ]
+ }
+ },
+ {
+ "type": "GitDemonstrationView",
+ "options": {
+ "beforeMarkdowns": [
+ "Vexamos un exemplo rápido. Para a árbore de abaixo:"
+ ],
+ "afterMarkdowns": [
+ "O comando `git describe master` daría a saída:",
+ "",
+ "`v1_2_gC2`",
+ "",
+ "Mentres que `git describe side` daría:",
+ "",
+ "`v2_1_gC4`"
+ ],
+ "command": "git tag v2 C3",
+ "beforeCommand": "git commit; go -b side HEAD~1; gc; gc; git tag v1 C0"
+ }
+ },
+ {
+ "type": "ModalAlert",
+ "options": {
+ "markdowns": [
+ "¡Básicamente é iso do que trata git describe! Intenta descubrir algúns locais da árbore para sentir como se comporta o comando.",
+ "",
+ "Cando estés listo, fai un commit para que o nivel remate. Esa é a gracia."
+ ]
+ }
+ }
+ ]
+ },
"de_DE": {
"childViews": [
{
diff --git a/src/levels/mixed/grabbingOneCommit.js b/src/levels/mixed/grabbingOneCommit.js
index 898cf581..42e748d3 100644
--- a/src/levels/mixed/grabbingOneCommit.js
+++ b/src/levels/mixed/grabbingOneCommit.js
@@ -20,6 +20,7 @@ exports.level = {
"de_DE": "Einen Commit pflücken",
"es_AR": "Tomando un único commit",
"pt_BR": "Pegando um único commit",
+ "gl" : "Escollendo un único commit",
"ja": "一つのコミットのみを取得",
"zh_CN": "只取一个提交记录",
"zh_TW": "只取一個 commit",
@@ -32,6 +33,7 @@ exports.level = {
"fr_FR": "Souvenez-vous, les rebases interactifs ou cherry-pick sont vos amis ici.",
"es_AR": "Acordate, el rebase interactivo o cherry-pick son tus amigos acá",
"pt_BR": "Lembre-se, o rebase interativo ou o cherry-pick são seus amigos aqui",
+ "gl" : "Recorda, o rebase interativo ou cherry-pick é un dos teus colegas aquí",
"ja": "このレベルではインタラクティブモードのrebaseやcherry-pickがクリアのカギです",
"ko": "대화식 리베이스(rebase -i)나 or 체리픽(cherry-pick)을 사용하세요",
"zh_CN": "你有两个朋友,cherry-pick 和 rebase -i",
@@ -194,6 +196,45 @@ exports.level = {
}
]
},
+ "gl": {
+ "childViews": [
+ {
+ "type": "ModalAlert",
+ "options": {
+ "markdowns": [
+ "## Commits apilados localmente",
+ "",
+ "Aquí estamos nunha situación que acontece de cotio con desenvolvedores: Estou intentando atopar un erro, mais é escorredizo. Para axudar ó meu traballo de detective, eu coloco algúns comandos de debug e prints.",
+ "",
+ "¡Todos esos comandos de debug e mensaxes están nas súas ramas propias. Finalmente eu atopo o erro, arránxoo e reorganizo!",
+ "",
+ "O único problema é que agora eu preciso devolver o meu `bugFix` á rama `master`. Se eu fixera simplemente un fast-forward en `master`, entón o `master` rematará contendo tódolos comandos de debug, o que é indesexable. Debe existir algunha outra forma..."
+ ]
+ }
+ },
+ {
+ "type": "ModalAlert",
+ "options": {
+ "markdowns": [
+ "Precisamos decirlle a git que copie só os commits que nos interesa. Esta situación é exatamente a mesma dos niveis anteriores respecto de como mover o traballo -- podemos usar os mesmos comandos:",
+ "",
+ "* `git rebase -i`",
+ "* `git cherry-pick`",
+ "",
+ "Para acadar o objetivo."
+ ]
+ }
+ },
+ {
+ "type": "ModalAlert",
+ "options": {
+ "markdowns": [
+ "Este é un nivel avanzado, entón imos deixarche a decisión de qué comando empregar, pero para completar este nivel, asegurate de que a rama `master` colla o commit referenciado por `bugFix`."
+ ]
+ }
+ }
+ ]
+ },
"de_DE": {
"childViews": [
{
diff --git a/src/levels/mixed/jugglingCommits.js b/src/levels/mixed/jugglingCommits.js
index 7b2d2533..747a518e 100644
--- a/src/levels/mixed/jugglingCommits.js
+++ b/src/levels/mixed/jugglingCommits.js
@@ -24,6 +24,7 @@ exports.level = {
"fr_FR": "Jongler avec les commits",
"es_AR": "Haciendo malabares con los commits",
"pt_BR": "Malabarismo com commits",
+ "gl" : "Argallando cos commits",
"ja": "コミットをやりくりする",
"zh_CN": "提交的技巧 #1",
"zh_TW": "commit 的戲法",
@@ -36,6 +37,7 @@ exports.level = {
"fr_FR": "La première commande est git rebase -i HEAD~2",
"es_AR": "El primer comando es git rebase -i HEAD~2",
"pt_BR": "O primeiro comando é git rebase -i HEAD~2",
+ "gl" : "O primeiro comando é git rebase -i HEAD~2",
"ja": "最初に打つコマンドはgit rebase -i HEAD~2",
"ko": "첫번째 명령은 git rebase -i HEAD~2 입니다",
"zh_CN": "第一个命令是 `git rebase -i HEAD~2`",
@@ -183,6 +185,41 @@ exports.level = {
},
]
},
+ "gl": {
+ "childViews": [
+ {
+ "type": "ModalAlert",
+ "options": {
+ "markdowns": [
+ "## Argallando cos commits",
+ "",
+ "Aquí está outra situación que acontece con bastante frecuencia. Estás facendo algúns cambios (`newImage`), separado do resto de cambios (`caption`) que están relacionados, deste xeito están apilados un enriba do outro no teu repositorio.",
+ "",
+ "O complicado é que ás veces, poida que precises facer unha pequena nota nun commit máis antigo. Neste caso, a persoa de deseño quere mudar un pouco as dimensións da imaxe introducida en `newImage`, a pesar de que ese commit está máis abaixo no noso histórico!!"
+ ]
+ }
+ },
+ {
+ "type": "ModalAlert",
+ "options": {
+ "markdowns": [
+ "Superamos este problema facendo o seguinte:",
+ "",
+ "* Reordenaremos os commits seleccionando aqueles que desexamos que estén no cambio, con `git rebase -i`",
+ "* Empregaremos o comando `git commit --amend` para facer unha pequena modificación",
+ "* Imos, entón, reordear os commits na mesma orde na que estaban anteriormente con `git rebase -i`",
+ "* Finalmente, moveremos o master para esa parte atualizada da árbore e así finalizar o nivel (usando o método que máis che pete)",
+ "",
+ "Hai moitas formas de obter o obxectivo final (eu vexo o cherry-pick pasando pola túa cachola), e verémolo máis adiante, pero agora ímonos centrar nesta técnica.",
+ "",
+ "Por último, preste atención no estado do \"objectivo\" aquí -- como movemos os commits dúas veces, ambos teñen o apóstrofo sumado. O apóstrofo engádese polo commit que nos correximos (amend), o cal danos a forma final da árbore.",
+ "",
+ "Contado todo esto, a resposta valídase baseándose na estructura e nos diferentes apóstrofes. Cando a rama `master` teña a mesma estructura, e o número de apóstrofos sexa igual, obterás todos os puntos da tarefa."
+ ]
+ }
+ },
+ ]
+ },
"de_DE": {
"childViews": [
{
diff --git a/src/levels/mixed/jugglingCommits2.js b/src/levels/mixed/jugglingCommits2.js
index 067a0ab1..29a97a31 100644
--- a/src/levels/mixed/jugglingCommits2.js
+++ b/src/levels/mixed/jugglingCommits2.js
@@ -22,6 +22,7 @@ exports.level = {
"fr_FR": "Jongler avec les commits #2",
"es_AR": "Haciendo malabares con los commits #2",
"pt_BR": "Malabarismo com commits #2",
+ "gl" : "Argallando cos commits #2",
"de_DE": "Jonglieren mit Commits Teil 2",
"ja": "コミットをやりくりする その2",
"zh_CN": "提交的技巧 #2",
@@ -34,6 +35,7 @@ exports.level = {
"fr_FR": "N'oubliez pas d'appliquer les changements depuis la branche master",
"es_AR": "¡No te olvides de avanzar master a los cambios actualizados!",
"pt_BR": "Não se esqueça de avançar a referência do master para as mudanças efetuadas!",
+ "gl" : "¡Non te esquezas de avanzar master ós cambios actualizados!",
"de_DE": "Vergiss nicht den master auf die aktuelle Version vorzuspulen",
"ja": "masterのポインタを先に進めることを忘れずに!",
"ko": "master를 변경 완료한 커밋으로 이동(forward)시키는 것을 잊지 마세요!",
@@ -215,6 +217,49 @@ exports.level = {
}
]
},
+ "gl": {
+ "childViews": [
+ {
+ "type": "ModalAlert",
+ "options": {
+ "markdowns": [
+ "## Argallando cos commits #2",
+ "",
+ "*No caso de non ter rematado o tema anterior (Argallando cos commits #1), por favor faino antes de continuar*.",
+ "",
+ "Como puideches ver no anterior tema, usamos `rebase -i` para reordear os commits. Unha vez que atopamos o commit que queriamos modificar, puidemos empregar sinxelamente o `--amend`, e depois reordenalo de volta para obter a nosa orde preferida.",
+ "",
+ "O único problema aquí é que hai moita reordenación ocorrendo, o que pode introducir conflitos no rebase. Imos votar unha ollada a outro método, o uso de `git cherry-pick`"
+ ]
+ }
+ },
+ {
+ "type": "GitDemonstrationView",
+ "options": {
+ "beforeMarkdowns": [
+ "Lembra que `git cherry-pick` copiará un commit de qualquera lugar na árbore enriba do HEAD (sempre e cando non sexa ancestro do HEAD).",
+ "",
+ "Aquí está unha demostración para que refresques a memoria:"
+ ],
+ "afterMarkdowns": [
+ "¡A tope! Seguimos."
+ ],
+ "command": "git cherry-pick C2",
+ "beforeCommand": "git checkout -b bugFix; git commit; git checkout master; git commit"
+ }
+ },
+ {
+ "type": "ModalAlert",
+ "options": {
+ "markdowns": [
+ "Entón, neste nivel, imos completar o mesmo obxectivo que facendo \"amend\" no `C2`, pero evitando facer o `rebase -i`. Agora deixámoste que lle des os miolos para sacar o exercicio! :D",
+ "",
+ "Recorda, o número exacto de apóstrofos (') nos commits non é importante, só as diferencias relativas. Por exemplo, levarás todos os puntos desta tarefa se obtés o mesmo resultado da árbore que se mostra na visualización do exercicio con un apóstrofo extra en tódolos commits."
+ ]
+ }
+ }
+ ]
+ },
"de_DE": {
"childViews": [
{
diff --git a/src/levels/mixed/tags.js b/src/levels/mixed/tags.js
index a52c5ea7..2d7c1b45 100644
--- a/src/levels/mixed/tags.js
+++ b/src/levels/mixed/tags.js
@@ -8,6 +8,7 @@
"ja" : "Gitのタグ",
"es_AR": "Tags en git",
"pt_BR": "Tags no Git",
+ "gl" : "Etiquetas en git",
"fr_FR": "Git Tags",
"zh_CN": "Git Tag",
"zh_TW": "git tag",
@@ -22,6 +23,7 @@
"ja" : "コミットを直接チェックアウトできますが、簡単にタグでチェックアウトすることも可能!",
"es_AR": "Podés checkoutear directamente el commit, ¡o simplemente el tag!",
"pt_BR": "Você pode fazer checkout diretamente no commit ou na tag correspondente!",
+ "gl" : "Podes saltar directamente ó commit, ¡ou a etiqueta, que é máis doado!",
"zh_TW": "你可以直接 checkout 到 commit 上,或是簡單的 checkout 到 tag 上",
"zh_CN": "你可以直接 checkout 到 commit 上,或是简单地 checkout 到 tag 上",
"ru_RU": "Можно сделать checkout напрямую на коммит или же на тег",
@@ -341,6 +343,58 @@
}
]
},
+ "gl": {
+ "childViews": [
+ {
+ "type": "ModalAlert",
+ "options": {
+ "markdowns": [
+ "## Etiquetas en Git",
+ "",
+ "Como aprendiches nas leccións previas, as ramas pódense mover sinxelamente, e xeralmente refírense a distintos commits según vas completando o código. As ramas mutan con facilidade, soen ser temporais, e sempre cambiantes.",
+ "",
+ "Se estamos nese caso, podes preguntarte se existe unha forma de marcar *permanentemente* puntos históricos no proxecto. Para cousas como grandes entregas ou grandes merges, ¿existe algunha forma de marcar commits con algo máis permanente que unha rama?",
+ ""
+ ]
+ }
+ },
+ {
+ "type": "ModalAlert",
+ "options": {
+ "markdowns": [
+ "Acertaches seguro, ¡si que existe! As etiquetas de git foron creadas para ese propósito -- elas marcan de forma (relativamente) permanente algún commits coma se fosen \"marcos das fincas\" (\"milestones\") nun campeiro, e podes facer referencias a elas mellor que o catastro.",
+ "",
+ "É moi importante saber que, as etiquetas non avanzan cando se crean novos commits. Non podes facer \"checkout\" nun tag e completar o traballo de esa etiqueta cun commit amend ou rebasándoo -- as etiquetas existen como áncoras na árbore de commits que están pegadas a certos puntos.",
+ "",
+ "Vexamos como se comportan as etiquetas na práctica."
+ ]
+ }
+ },
+ {
+ "type": "GitDemonstrationView",
+ "options": {
+ "beforeMarkdowns": [
+ "Creamos un tag na rama `C1`, que é o noso prototipo da versión 1"
+ ],
+ "afterMarkdowns": [
+ "¡Ahí o tes!. Sinxelo. Nomeamos a etiqueta de `v1` e referenciamos o commit `C1` explícitamente. Se non indicas o commit, git vai empregar o commit onde está situado o `HEAD`."
+ ],
+ "command": "git tag v1 C1",
+ "beforeCommand": "git commit"
+ }
+ },
+ {
+ "type": "ModalAlert",
+ "options": {
+ "markdowns": [
+ "Para completar esta tarefa, crea as etiquetas amosadas na visualización do obxectivo, e entón fai checkout en `v1`. Mira que terminas no estado \"Detached HEAD\" -- eso é porque non podes facer commit directamente na etiqueta `v1`.",
+ "",
+ "No próximo nivel, examinaremos un caso de uso máis interesante para as etiquetas."
+ ]
+ }
+ }
+ ]
+ },
"de_DE": {
"childViews": [
{
diff --git a/src/levels/rampup/cherryPick.js b/src/levels/rampup/cherryPick.js
index 8908112e..4f1ba889 100644
--- a/src/levels/rampup/cherryPick.js
+++ b/src/levels/rampup/cherryPick.js
@@ -13,6 +13,7 @@
"ja" : "cherry-pick入門",
"es_AR": "Introducción a cherry-pick",
"pt_BR": "Introdução ao cherry-pick",
+ "gl" : "Introuducción a cherry-pick",
"zh_CN": "Git Cherry-pick",
"zh_TW": "介紹 cherry-pick",
"ru_RU": "Введение в Cherry-pick",
@@ -26,6 +27,7 @@
"ja" : "git cherry-pickの後にコミット名を追加",
"es_AR": "git cherry-pick seguido de los nombres de los commits",
"pt_BR": "git cherry-pick seguido dos nomes dos commits",
+ "gl" : "git cherry-pick seguido das referencias a commits",
"zh_CN": "git cherry-pick 后面要跟提交的名字",
"zh_TW": "git cherry-pick 後面要接著 commit 的名稱",
"ru_RU": "git cherry-pick основывается на именах коммитов!",
@@ -171,7 +173,7 @@
"",
"El primer comando en esta serie se llama `git cherry-pick`. Tiene la siguiente forma:",
"",
- "* `git cherry-pick <...>`",
+ " `git cherry-pick <...>`",
"",
"Es una manera bastante directa de decir que querés copiar una serie de commits sobre tu ubicación actual (`HEAD`). Personalmente amo `cherry-pick` porque hay muy poca magia involucrada y es bastante simple de entender.",
"",
@@ -210,7 +212,7 @@
"type": "ModalAlert",
"options": {
"markdowns": [
- "## Movendo trabalho por aí",
+ "## Movendo o trabalho por aí",
"",
"Por enquanto nós abordamos o básico do Git -- commitar, criar ramos, e mover-se pela árvore. Apenas esses conceitos já são suficientes para utilizar 90% do poder dos repositórios Git, e cobrem as principais necessidades dos desenvolvedores.",
"",
@@ -261,6 +263,63 @@
}
]
},
+ "gl": {
+ "childViews": [
+ {
+ "type": "ModalAlert",
+ "options": {
+ "markdowns": [
+ "## Movendo traballo por ahí",
+ "",
+ "Ata agora cubrimos o uso básico de git -- facer commit, crear ramas, e moverse pola árbore. Estes conceptos chegan para aproveitar o 90% do poder dos repositorios de git e cubrilas necesidades principais dos desenvolvedores.",
+ "",
+ "O 10% restante, ademáis, poden ser extremadamente útiles nos fluxos de traballo complexos (ou cando te meteches nalgún problema complicado). O próximo concepto que imos abordar é \"movendo o traballo por ahí\" -- noutras verbas, unha forma que teñen os desenvolvedores de dicir \"eu quero este traballo aquí, e aquel alí\" de forma precisa, elocuente e flexible.",
+ "",
+ "Eso pode ser moito, pero os conceptos son simples."
+ ]
+ }
+ },
+ {
+ "type": "ModalAlert",
+ "options": {
+ "markdowns": [
+ "## Git Cherry-pick",
+ "",
+ "O primeiro comando desta serie é `git cherry-pick`. O comando emprégase da seguinte forma:",
+ "",
+ "* `git cherry-pick <...>`",
+ "",
+ "Trátase dunha forma bastante directa de dicir que queres copiar unha serie de commits sobre a túa ubicación actual (`HEAD`). Eu persoalmente adoro `cherry-pick` porque hai moita maxia envolta e é un funcionamento sinxelo de entender.",
+ "",
+ "Vexamos unha demostración!",
+ ""
+ ]
+ }
+ },
+ {
+ "type": "GitDemonstrationView",
+ "options": {
+ "beforeMarkdowns": [
+ "Aquí está un repositorio onde hai algún traballo na rama `side` que desexamos copiar para a rama `master`. Iso podería ser obtido por medio dun rebase (que xa aprendemos), pero imos ver como o resolve cherry-pick."
+ ],
+ "afterMarkdowns": [
+ "¡Eso é! Queríamos os commits `C2` e `C4` e git insertounos por baixo de nós. ¡Moi sinxelo!"
+ ],
+ "command": "git cherry-pick C2 C4",
+ "beforeCommand": "git checkout -b side; git commit; git commit; git commit; git checkout master; git commit;"
+ }
+ },
+ {
+ "type": "ModalAlert",
+ "options": {
+ "markdowns": [
+ "Para completar este nivel, copia algo de traballo das outras ramas na master. Podes ver qué commits queremos copiar na visualización do obxectivo.",
+ ""
+ ]
+ }
+ }
+ ]
+ },
"zh_TW": {
"childViews": [
{
diff --git a/src/levels/rampup/detachedHead.js b/src/levels/rampup/detachedHead.js
index 62b9200a..498c55bd 100644
--- a/src/levels/rampup/detachedHead.js
+++ b/src/levels/rampup/detachedHead.js
@@ -6,6 +6,7 @@ exports.level = {
"en_US": "Detach yo' HEAD",
"es_AR": "Desatacheá tu HEAD",
"pt_BR": "Solte a sua cabeça",
+ "gl" : "Abandona o teu HEAD",
"fr_FR": "Détacher votre HEAD",
"zh_CN": "分离 HEAD",
"zh_TW": "分離 HEAD",
@@ -19,6 +20,7 @@ exports.level = {
"en_US": "Use the label (hash) on the commit for help!",
"es_AR": "¡Usá la etiqueta (hash) sobre el commit para ayudarte!",
"pt_BR": "Use o identificador (hash) sobre o commit para te ajudar!",
+ "gl" : "¡Usa a etiqueta (hash) sobre o commit para axudarte!",
"de_DE": "Benutze den Bezeichner (den Hash) des Commits.",
"ja" : "コミットのラベル(hash)を使用",
"fr_FR": "Utilisez le label (identifiant) du commit pour aider !",
@@ -263,6 +265,84 @@ exports.level = {
}
]
},
+ "gl": {
+ "childViews": [
+ {
+ "type": "ModalAlert",
+ "options": {
+ "markdowns": [
+ "## Movéndose en Git",
+ "",
+ "Antes de seguir con algunhas das funcionalidades máis avanzadas de Git, é importante entender as diferentes formas de se mover a través da árbore de commits que representa o teu proxecto.",
+ "",
+ "¡Unha vez que te sintas ben ó teu redor, os teus poderes empregando outros comandos de git serán amplificados!",
+ "",
+ "",
+ "",
+ "",
+ ""
+ ]
+ }
+ },
+ {
+ "type": "ModalAlert",
+ "options": {
+ "markdowns": [
+ "## HEAD",
+ "",
+ "Primeiro temos que falar sobre o \"commit actual\" (\"HEAD\"). HEAD é un nome simbólico para o commit atualmente ativo (o último checkout que se fixo) -- é esencialmente o commit sobre o cal estás traballando nese momento.",
+ "",
+ "O HEAD sempre apunta para o commit máis recentemente copiado sobre a árbore de traballo (arquivos do proxecto). A maioría dos comandos de git que fan algún cambio sobre a árbore de traballo empezarán movendo o HEAD.",
+ "",
+ "Normalmente o HEAD apunta para o nome dunha rama (por exemplo, bugFix). Quando fagas commit, o status do bugFix é alterado e ese cambio ocorre tamén sobre o HEAD."
+ ]
+ }
+ },
+ {
+ "type": "GitDemonstrationView",
+ "options": {
+ "beforeMarkdowns": [
+ "Vexamos isto en acción. Aquí imos mostrar o HEAD antes e depois dun commit."
+ ],
+ "afterMarkdowns": [
+ "Ves! O HEAD estivo ó lado do noso `master` todo este tempo."
+ ],
+ "command": "git checkout C1; git checkout master; git commit; git checkout C2",
+ "beforeCommand": ""
+ }
+ },
+ {
+ "type": "GitDemonstrationView",
+ "options": {
+ "beforeMarkdowns": [
+ "### Soltando a cabeza",
+ "",
+ "Soltar o HEAD significa apuntar a un commit en vez de apuntar a unha rama. Antes do estado solo (\"detached\"), é así como aparece:",
+ "",
+ "HEAD -> master -> C1",
+ ""
+ ],
+ "afterMarkdowns": [
+ "E agora é",
+ "",
+ "HEAD -> C1"
+ ],
+ "command": "git checkout C1",
+ "beforeCommand": ""
+ }
+ },
+ {
+ "type": "ModalAlert",
+ "options": {
+ "markdowns": [
+ "Para completar este nivel, imos soltar o HEAD de `bugFix` e en vez diso apuntamos ó commit.",
+ "",
+ "Especifica o commit por medio do hash correspondente. O hash de cada commit está dentro do círculo que representa ó commit (a letra C seguida dun número)."
+ ]
+ }
+ }
+ ]
+ },
"fr_FR": {
"childViews": [
{
diff --git a/src/levels/rampup/interactiveRebase.js b/src/levels/rampup/interactiveRebase.js
index d4f79450..54ade7fb 100644
--- a/src/levels/rampup/interactiveRebase.js
+++ b/src/levels/rampup/interactiveRebase.js
@@ -10,6 +10,7 @@
"en_US": "you can use either branches or relative refs (HEAD~) to specify the rebase target",
"es_AR": "podés usar tanto ramas como referencias relativas (HEAD~) para especificar el objetivo del rebase",
"pt_BR": "Você pode usar ou ramos ou referências relativas (HEAD~) para especificar o alvo do rebase",
+ "gl" : "Podes usar ramas ou referencias relativas (HEAD~) para especificar o obxectivo do rebase",
"de_DE": "Du kannst entweder Branches oder relative Ref-Angaben (z.B. HEAD~) benutzen, um das Ziel des Rebase anzugeben.",
"fr_FR": "Vous pouvez utiliser soit les branches, soit les références relatives (HEAD~) pour spécifier la cible à rebaser",
"zh_CN": "branch 或者是相对位置(HEAD~)都可以用來指定 rebase 的目标",
@@ -23,6 +24,7 @@
"en_US": "Interactive Rebase Intro",
"es_AR": "Introducción al rebase interactivo",
"pt_BR": "Introdução ao rebase interativo",
+ "gl" : "Introducción ó rebase interativo",
"de_DE": "Einführung Interactive Rebase",
"ja" : "インタラクティブrebase入門",
"fr_FR": "Introduction à rebase",
@@ -423,6 +425,71 @@
}
]
},
+ "gl": {
+ "childViews": [
+ {
+ "type": "ModalAlert",
+ "options": {
+ "markdowns": [
+ "## Rebase Interativo en Git",
+ "",
+ "Empregar cherry-pick é xenial cando coñeces qué commits queres (_e_ coñeces os seus códigos hash) -- é difícil mellorar a súa simplicidade.",
+ "",
+ "Pero ¿qué pasa cando non sabes qué commits son os que queres? Por sorte, ¡git cúbrete nesta situación tamén! Podemos empregar o rebase interactivo para esto -- é a mellor forma de revisar unha serie de commits que estás a rebasar.",
+ "",
+ "Mergullémonos nos detalles..."
+ ]
+ }
+ },
+ {
+ "type": "ModalAlert",
+ "options": {
+ "markdowns": [
+ "O rebase interativo é o comando `rebase` coa opción `-i`.",
+ "",
+ "Se ti inclúes esta opción, o git abrirá unha interfaz para mostrar qué commits están hábiles para ser copiados sobre o obxectivo do rebase. Tamén amosa os seus códigos hash e mensaxes dos commits, o cal axuda moito para saber qué é cada commit.",
+ "",
+ "En git \"de verdade\", a interfaz significa abrir un arquivo de texto nun editor (por exemplo `vim`). Para os nosos propósitos, aquí aparecerá unha pequena ventá que se comporta do mesmo xeito."
+ ]
+ }
+ },
+ {
+ "type": "ModalAlert",
+ "options": {
+ "markdowns": [
+ "Cando a xanela de rebase interativo abra, poderás facer 3 cousas distintas:",
+ "",
+ "* Podes reordenar os commits simplemente cambiando a súa orde na interface (na nosa ventá significa arrastrar e soltar os commits).",
+ "* Podes escoller a opción de omitir algúns commits. Para iso, pincha no botón `pick` -- deixar o `pick` desligado significa que queres descartar o commit.",
+ "* Ademáis, ti podes \"esmagar\" (fazer squash) nos commits. Tristemente, este tutorial non será capaz de cubrir esa funcionalidade por algúns motivos loxísticos, entón imos pulir algúns detalles ó respecto. Resumindo, o squash permite combinar commits.",
+ "",
+ "¡Xenial! Vexamos un exemplo."
+ ]
+ }
+ },
+ {
+ "type": "GitDemonstrationView",
+ "options": {
+ "beforeMarkdowns": [
+ "Cando pinches o botón, unha ventá de rebase interativo abrirase. Reordena algúns commits da forma que ti prefieras (ou se o prefires desmarca o `pick` de algúns) e mira o seu resultado!"
+ ],
+ "afterMarkdowns": [
+ "¡Veña! Git copiou algúns commits exatamente da mesma forma que o indicaches na ventá"
+ ],
+ "command": "git rebase -i HEAD~4 --aboveAll",
+ "beforeCommand": "git commit; git commit; git commit; git commit"
+ }
+ },
+ {
+ "type": "ModalAlert",
+ "options": {
+ "markdowns": [
+ "Para finalizar este nivel, fai un rebase interativo e obteñaa a orde amosada na visualización do obxectivo. Lembra que podes usar os comandos `undo` ou `reset` para correxir erros :D"
+ ]
+ }
+ }
+ ]
+ },
"de_DE": {
"childViews": [
{
diff --git a/src/levels/rampup/relativeRefs.js b/src/levels/rampup/relativeRefs.js
index 2fd6e3f1..b008011b 100644
--- a/src/levels/rampup/relativeRefs.js
+++ b/src/levels/rampup/relativeRefs.js
@@ -10,6 +10,7 @@ exports.level = {
"zh_TW": "相對引用(^)",
"es_AR": "Referencias relativas (^)",
"pt_BR": "Referências relativas (^)",
+ "gl" : "Referencias relativas (^)",
"de_DE": "Relative Referenzen (^)",
"ru_RU": "Относительные ссылки (^)",
"ko" : "상대 참조 (^) (Relative Refs)",
@@ -22,6 +23,7 @@ exports.level = {
"de_DE": "Denk an den Dach-Operator (^)!",
"es_AR": "¡No te olvides del operador ^!",
"pt_BR": "Não se esqueça do operador circunflexo (^)",
+ "gl" : "Non se esqueza do operador circunflexo (^)",
"zh_CN": "记住操作符(^)!",
"zh_TW": "不要忘記插入(^)符號!",
"ru_RU": "Не забудь оператор `^`",
@@ -404,6 +406,81 @@ exports.level = {
}
]
},
+ "gl": {
+ "childViews": [
+ {
+ "type": "ModalAlert",
+ "options": {
+ "markdowns": [
+ "## Referencias relativas",
+ "",
+ "Moverse por a árbore de git usando os códigos hash dos commits pode volverse un pouco tedioso. Neste mundo real non vas ter unha visualización dos commits tan bonita no terminal, así que vas ter que usar `git log` para ver cada código hash.",
+ "",
+ "Inda peor, os códigos hash són xeralmente moito máis grandes no mundo real. Por exemplo, o hash do commit que introduxemos no nivel anterior é `fed2da64c0efc5293610bdd892f82a58e8cbc5d8`. Non é algo sinxelo de lembrar.",
+ "",
+ "O bo é que git aínda afina cos hashes. El só precisa que expecifiques a cantidade mínima de caracteres suficientes para identificar unívocamente ó commit. Entón eu podo escribir `fed2` e non o hash completo."
+ ]
+ }
+ },
+ {
+ "type": "ModalAlert",
+ "options": {
+ "markdowns": [
+ "Como xa dixemos, indicar os commits polo seu código hash non é a forma máis convinte, e é por eso que git ten referencias relativas. ¡Son a caña!",
+ "",
+ "Cas referencias relativas, podes comezar por un punto sinxelo de lembrar (como a rama `bugFix` ou o `HEAD`) e referenciar a partir de ahí.",
+ "",
+ "Os commits relativos son poderosos, pero agora imos presentar só dous formas sinxelas:",
+ "",
+ "* Moverse un commit por riba con `^`",
+ "* Mover unha cantidade de commits atrás con `~`"
+ ]
+ }
+ },
+ {
+ "type": "GitDemonstrationView",
+ "options": {
+ "beforeMarkdowns": [
+ "Votémoslle unha ollada o operador (^) primeiro. Cada vez que o engadimos a unha referencia, estaslle dicindo a commit que queres o pai de esa referencia.",
+ "",
+ "Entón, dicir `master^` é equivalente a \"o primeiro pai do `master`\".",
+ "",
+ "`master^^` é o avó (ancestral de segunda xeración) do `master`",
+ "",
+ "Imos facer checkout do commit que está enriba de master"
+ ],
+ "afterMarkdowns": [
+ "Boom! Ahí o tes. Moito máis rápido que por o hash do commit"
+ ],
+ "command": "git checkout master^",
+ "beforeCommand": "git commit"
+ }
+ },
+ {
+ "type": "GitDemonstrationView",
+ "options": {
+ "beforeMarkdowns": [
+ "Tamén podes usar o `HEAD` como parte dunha referencia relativa. Ímolo utilizar para nos mover uns commits cara arriba na árbore."
+ ],
+ "afterMarkdowns": [
+ "¡Chupado! Podemos viaxar cara atrás no tempo con `HEAD^`"
+ ],
+ "command": "git checkout C3; git checkout HEAD^; git checkout HEAD^; git checkout HEAD^",
+ "beforeCommand": "git commit; git commit"
+ }
+ },
+ {
+ "type": "ModalAlert",
+ "options": {
+ "markdowns": [
+ "Para completar este nivel, fai checkout do commit pai de `bugFix`. Iso soltará o `HEAD`.",
+ "",
+ "¡Podes indicar o hash que queiras, pero intenta empregar as referencias relativas, é moito mellor!"
+ ]
+ }
+ }
+ ]
+ },
"zh_CN": {
"childViews": [
{
diff --git a/src/levels/rampup/relativeRefs2.js b/src/levels/rampup/relativeRefs2.js
index 03acaf62..4d269a8c 100644
--- a/src/levels/rampup/relativeRefs2.js
+++ b/src/levels/rampup/relativeRefs2.js
@@ -9,6 +9,7 @@ exports.level = {
"zh_TW": "這一關至少要用到一次直接參考(hash)",
"es_AR": "Vas a necesitar usar al menos una referencia directa (hash) para completar este nivel",
"pt_BR": "Você precisará usar pelo menos uma referência direta (hash) para completar este nível",
+ "gl" : "Precisarás usar polo menos unha referencia directa (hash) para completar este nivel",
"de_DE": "Du musst mindestens einen Hash benutzen, um dieses Level zu schaffen",
"ja" : "このレベルをクリアするには少なくとも一つの直接リファレンス(hash)を使用する必要があります",
"ru_RU": "Понадобится использовать как минимум одну прямую ссылку (хеш), чтобы пройти этот уровень",
@@ -21,6 +22,7 @@ exports.level = {
"ja" : "相対リファレンス その2 (~)",
"es_AR": "Referencias relativas #2 (~)",
"pt_BR": "Referências relativas #2 (~)",
+ "gl" : "Referencias relativas #2 (~)",
"fr_FR": "Références relatives #2 (~)",
"zh_CN": "相对引用2(~)",
"zh_TW": "相對引用二(~)",
@@ -236,6 +238,75 @@ exports.level = {
}
]
},
+ "gl": {
+ "childViews": [
+ {
+ "type": "ModalAlert",
+ "options": {
+ "markdowns": [
+ "### O operador \"~\"",
+ "",
+ "Digamos que queres moverte un montón de commits cara atrás nunha árbore de git. Sería moi tedioso escribir `^` moitas veces, e por iso que git tamén ten o operador (`~`).",
+ "",
+ "",
+ "Pódeselle pasar un número (opcionalmente) despois da tilde, especificando o número de commits que se quere mover cara atrás. Mira como é en acción."
+ ]
+ }
+ },
+ {
+ "type": "GitDemonstrationView",
+ "options": {
+ "beforeMarkdowns": [
+ "Imos especificar un número de commits cara atrás con `~`."
+ ],
+ "afterMarkdowns": [
+ "¡Veeeña! Ben apuntado -- as referencias relativas son a leche."
+ ],
+ "command": "git checkout HEAD~4",
+ "beforeCommand": "git commit; git commit; git commit"
+ }
+ },
+ {
+ "type": "ModalAlert",
+ "options": {
+ "markdowns": [
+ "### Forzando as ramas",
+ "",
+ "Agora que eres un especialista en referencias relativas, imos *usalas* para algunha cousiña.",
+ "",
+ "Un dos usos máis comúns para o uso das referencias relativas é para movelas ramas de lugar. Ti podes reasignar directamente unha rama a un commit usando a opción `-f`. Así que con algo coma:",
+ "",
+ "`git branch -f master HEAD~3`",
+ "",
+ "Move (de forma forzosa) a rama master 3 commits enriba do HEAD."
+ ]
+ }
+ },
+ {
+ "type": "GitDemonstrationView",
+ "options": {
+ "beforeMarkdowns": [
+ "Vexamos o comando anterior en acción"
+ ],
+ "afterMarkdowns": [
+ "¡Agora é o a nosa quenda! As referencias relativas nos darán unha forma concisa de nos referír a `C1`, e forzar a rama (con `-f`) deunos unha forma rápida de movela rama `master` a esa posición."
+ ],
+ "command": "git branch -f master HEAD~3",
+ "beforeCommand": "git commit; git commit; git commit; git checkout -b bugFix"
+ }
+ },
+ {
+ "type": "ModalAlert",
+ "options": {
+ "markdowns": [
+ "Xa viches as referencias relativas e o movemento de ramas combinadas, ímolas usar para resolver o próximo exercicio.",
+ "",
+ "Para completar este nivel, mova o `HEAD` e as ramas `master` e `bugFix` para os destinos mostrados no obxectivo."
+ ]
+ }
+ }
+ ]
+ },
"fr_FR": {
"childViews": [
{
diff --git a/src/levels/rampup/reversingChanges.js b/src/levels/rampup/reversingChanges.js
index 2746c8ed..b1c8f926 100644
--- a/src/levels/rampup/reversingChanges.js
+++ b/src/levels/rampup/reversingChanges.js
@@ -10,7 +10,8 @@ exports.level = {
"fr_FR": "Annuler des changements avec Git",
"es_AR": "Revirtiendo cambios en git",
"pt_BR": "Revertendo mudanças no Git",
- "ko": "Git에서 작업 되돌리기",
+ "gl" : "Revertindo cambios en git",
+ "ko" : "Git에서 작업 되돌리기",
"zh_CN": "撤销变更",
"zh_TW": "在 git 中取消修改 ",
"ru_RU": "Отмена изменений в Git",
@@ -22,6 +23,7 @@ exports.level = {
"fr_FR": "Notez que `revert` et `reset` n'ont pas les mêmes arguments.",
"es_AR": "Notá que revert y reset toman parámetros distintos",
"pt_BR": "Lembre que revert e reset recebem parâmetros diferentes",
+ "gl" : "Lembra que revert e reset usan parámetros distintos",
"zh_CN": "注意 revert 和 reset 使用的参数不同。",
"zh_TW": "注意 revert 和 reset 使用不同的參數。",
"ko": "revert와 reset이 받는 인자가 다름을 기억하세요",
@@ -219,6 +221,69 @@ exports.level = {
}
]
},
+ "gl": {
+ "childViews": [
+ {
+ "type": "ModalAlert",
+ "options": {
+ "markdowns": [
+ "## Revertindo cambios en Git",
+ "",
+ "Existen varias formas de revertir os cambios en git. E, como cando se fai commit, desfacer cambios supon unha operación de baixo nivel (a indexación de arquivos ou trozos de eles) e unha operación de alto nivel (desfacer os cambios xa aplicados). Aquí ímonos enfocar neste último punto.",
+ "",
+ "Hai dúas formas de desfacer os cambios en git -- unha delas é `git reset`, e a outra é usando `git revert`. Imos comparalas na próxima ventá.",
+ ""
+ ]
+ }
+ },
+ {
+ "type": "GitDemonstrationView",
+ "options": {
+ "beforeMarkdowns": [
+ "## Git Reset",
+ "",
+ "O comando `git reset` desfai os cambios movendo a referencia dunha rama cara un commit máis antigo na rama. Desta forma, podes pensar nesta operación como \"reescritura do histórico\"; o `git reset` vai movela rama cara atrás, como se ós commits nunca antes se fixeran.",
+ "",
+ "Vexamos o seu funcionamento:"
+ ],
+ "afterMarkdowns": [
+ "¡Bye bye! Git moveu a referencia da rama master cara atrás, ata o commit `C1`; agora o teu repositorio local está coma se o commit `C2` nunca acontecera."
+ ],
+ "command": "git reset HEAD~1",
+ "beforeCommand": "git commit"
+ }
+ },
+ {
+ "type": "GitDemonstrationView",
+ "options": {
+ "beforeMarkdowns": [
+ "## Git Revert",
+ "",
+ "Mentres que resetear os cambios funciona xenial para as ramas locales na túa máquina, o método utilizado de \"reescribir o histórico\" non funciona con ramas remotas que outra xente usa.",
+ "",
+ "Para revervir os cambios e *compartir* eses cambios ca outra xente, precisamos usar `git revert`. Atende a cómo funciona"
+ ],
+ "afterMarkdowns": [
+ "Estrano, xurdíu un novo commit por baixo do commit que queriamos desfacer. Iso é porque o novo commit `C2'` engadíu *cambios* -- o que pasa é que o commit desfai exactamente os cambios feitos no commit `C2`.",
+ "",
+ "Con `revert`, ti podes facer `push` dos teus cambios para compartilos cos outros."
+ ],
+ "command": "git revert HEAD",
+ "beforeCommand": "git commit"
+ }
+ },
+ {
+ "type": "ModalAlert",
+ "options": {
+ "markdowns": [
+ "Para completar este nivel, reverte os dous commits máis recentes tanto en `local` como en `pushed`.",
+ "",
+ "Ten en mente que `pushed` é unha rama remota, e `local` é unha rama local -- Iso poida que te axude a aplicar o método apropriado."
+ ]
+ }
+ }
+ ]
+ },
"de_DE": {
"childViews": [
{
diff --git a/src/levels/rebase/manyRebases.js b/src/levels/rebase/manyRebases.js
index dd99b175..6da53c7b 100644
--- a/src/levels/rebase/manyRebases.js
+++ b/src/levels/rebase/manyRebases.js
@@ -12,6 +12,7 @@ exports.level = {
"de_DE": "10000 Rebases unter dem `HEAD`",
"es_AR": "Rebaseando más de 9000 veces",
"pt_BR": "Fazendo mais de 9000 rebases",
+ "gl" : "Facendo máis de 9000 rebases",
"fr_FR": "Rebaser plus de 1000 fois",
"ko": "9천번이 넘는 리베이스",
"ja" : "9000回以上のrebase",
@@ -25,6 +26,7 @@ exports.level = {
"de_DE": "Nicht vergessen: die effizienteste Möglichkeit könnte sein, schließlich einfach nur den master zu aktualisieren ...",
"es_AR": "Acordate, la manera más eficiente podría ser actualizar master sólo al final...",
"pt_BR": "Lembre-se, a forma mais eficiente pode ser atualizar o master por último...",
+ "gl" : "Lembra, a forma máis eficiente pode ser actualizar a rama master ó final...",
"fr_FR": "Rappelez-vous, la façon la plus efficace peut être de mettre à jour master seulement à la fin ...",
"ja" : "最も効率的なやり方はmasterを最後に更新するだけかもしれない・・・",
"ko": "아마도 master를 마지막에 업데이트하는 것이 가장 효율적인 방법일 것입니다...",
@@ -88,6 +90,24 @@ exports.level = {
}
]
},
+ "gl": {
+ "childViews": [
+ {
+ "type": "ModalAlert",
+ "options": {
+ "markdowns": [
+ "### Fazendo rebase en múltiples ramas",
+ "",
+ "Neno, temos unha chea de ramas aquí! Imos facer rebase de todo o traballo contido nesas ramas para a master.",
+ "",
+ "A xente de administración estanos a facer as cousas complicadas, igual eles queren que os commits estén todos en orde secuencial. Isto significa que a nosa árbore final precisa ter `C7'` de último, `C6'` inda por riba, está por adiante, todo ordeado.",
+ "",
+ "Se te fas un lio polo camiño, síntete ceibe para usar o comando `reset` para comezar de cero outra vez. Despois lembra ollar a nosa solución para ver se consegues resolver a tarefa usando menos comandos!"
+ ]
+ }
+ }
+ ]
+ },
"fr_FR": {
"childViews": [
{
diff --git a/src/levels/rebase/selectiveRebase.js b/src/levels/rebase/selectiveRebase.js
index 328216d3..b38d3ddf 100644
--- a/src/levels/rebase/selectiveRebase.js
+++ b/src/levels/rebase/selectiveRebase.js
@@ -13,6 +13,7 @@ exports.level = {
"de_DE": "Branch-Spaghetti",
"es_AR": "Enslada de branches",
"pt_BR": "Espaguete de ramos",
+ "gl" : "Espaguete de ramas",
"ja": "ブランチスパゲッティ",
"zh_CN": "纠缠不清的分支",
"zh_TW": "branch 漿糊",
@@ -25,6 +26,7 @@ exports.level = {
"de_DE": "Stelle sicher, dass du alles in der richtigen Reihenfolge machst! Branche erst one, dann two, dann three.",
"es_AR": "¡Asegurate de hacer las cosas en el orden correcto! Brancheá `one` primero, después `two`, y después `three`.",
"pt_BR": "Certifique-se de fazer tudo na ordem correta! Crie o ramo `one` primeiro, depois `two`, depois `three`.",
+ "gl" : "¡Afiánzate de facer as cousas no orde correcto! Crea ramas `one` de primeiras, e logo `two` e `three`.",
"ja": "全て正しい順番で処理すること!oneが最初で、次がtwo、最後にthreeを片付ける。",
"ko": "이 문제를 해결하는 방법은 여러가지가 있습니다! 체리픽(cherry-pick)이 가장 쉽지만 오래걸리는 방법이고, 리베이스(rebase -i)가 빠른 방법입니다",
"zh_CN": "确保你是按照正确的顺序来操作!先操作分支 `one`, 然后 `two`, 最后才是 `three`",
@@ -113,6 +115,26 @@ exports.level = {
}
]
},
+ "gl": {
+ "childViews": [
+ {
+ "type": "ModalAlert",
+ "options": {
+ "markdowns": [
+ "## Espaguete de ramas",
+ "",
+ "¡Íscalle lura! Temos un _pequeno_ obxectivo que acadar neste nivel.",
+ "",
+ "Temos aquí un `master` que está algúns commits por detrás das ramas `one`, `two` e `three`. Por algunha razón, precisamos atualizar esas tres ramas con versións modificadas dos últimos commits de master.",
+ "",
+ "A rama `one` precisa de unha reordenación, e votar fora a `C5`. O `two` precisa apenas de reordenacións. O `three` precisa dun único commit!",
+ "",
+ "Ímoste deixar resolver o problema por ti mesmo -- pero non deixes de ver a nosa solución, para eso escrebe `show solution`. "
+ ]
+ }
+ }
+ ]
+ },
"de_DE": {
"childViews": [
{
diff --git a/src/levels/remote/clone.js b/src/levels/remote/clone.js
index 63ff1be4..5ef9ff65 100644
--- a/src/levels/remote/clone.js
+++ b/src/levels/remote/clone.js
@@ -8,6 +8,7 @@ exports.level = {
"ja" : "Clone入門",
"es_AR": "Introducción a clone",
"pt_BR": "Introdução à clonagem",
+ "gl" : "Introducción a clone",
"zh_CN": "Git Clone",
"zh_TW": "介紹 clone",
"ru_RU": "Введение в клонирование",
@@ -22,6 +23,7 @@ exports.level = {
"zh_CN": "只要 git clone 就可以了!",
"es_AR": "Simplemente hacé git clone!",
"pt_BR": "Basta fazer um git clone!",
+ "gl" : "¡Chega con facer git clone!",
"zh_TW": "只要 git clone 就好了",
"ru_RU": "Простой git clone!",
"ko" : "그냥 git clone 하세요!",
@@ -256,6 +258,63 @@ exports.level = {
}
]
},
+ "gl": {
+ "childViews": [
+ {
+ "type": "ModalAlert",
+ "options": {
+ "markdowns": [
+ "## Repositorios remotos en Git",
+ "",
+ "Os repositorios remotos non son complicados en git. Actualmente ca computación na nube, pódese pensar que hai moita maxia tras os repositorios remotos de git, pero para nada é así -- en verdade son copias do repositorio, pero noutra máquina. Ti podes comunicarte xeralmente con esa outra máquina por medio de internet, o que permite que mandes commits de un repositorio cara o outro.",
+ "",
+ "Dito isto, os repositorios remotos teñen propiedades interesantes:",
+ "",
+ "- Primeiro e antes de todo, os repositorios remotos serven como unha copia de seguranza! Os repositorios locais posúen a habilidade de restaurar un arquivo nun estado anterior (como xa sabes), pero toda á información está gardada. Tendo copias do repositorio noutras máquinas, incluso poderías perder tódolos datos da túa computadora, e comenzar a traballar no punto onde o deixaches no último commit.",
+ "",
+ "- Máis importante aún, ¡os repositorios remotos fan que o desenvolvemento sexa social! Agora que existe unha copia do teu código noutro lugar, os teus amigos poden contribuír no teu proxecto (ou obter os últimos cambios) dunha forma moi simple.",
+ "",
+ "Hai webs moi populares onde se pode ver a actividade dos repositorios (como [Github](https://github.com/) ou [Phabricator](http://phabricator.org/)), pero estes recursos remotos _sempre_ axudan como mecanismo de base para esas ferramentas. ¡Entón é importante saber cómo funcionan!"
+ ]
+ }
+ },
+ {
+ "type": "ModalAlert",
+ "options": {
+ "markdowns": [
+ "## O noso comando para crear remotos",
+ "",
+ "Ata este punto, Learn Git Branching enfocouse en ensinar o básico respecto do traballo en repositorios _locais_ (branch, merge, rebase, etc). Entretanto, agora que queremos aprender como os repositorios remotos funcionan, precisamos dun comando para configurar o entorno para esas leccións. Este comando será `git clone`.",
+ "",
+ "Técnicamente, `git clone` no mundo real é un comando que fai copias _locais_ de repositório remotos (de GitHub para a túa máquina, por exemplo). Todavía, por motivos loxísticos, nós usaremos ese comando dunha forma un pouco diferente, Learn Git Branching -- aquí `git clone` creará un repositorio remoto a partir do repositorio local. Certamente, ese comportamento é exactamente o oposto do comando real, pero a pesares de iso axudarate a formar unha conexión mental entre a clonación e como funcionan os repositorios remotos, entón imos usalo desa forma.",
+ ""
+ ]
+ }
+ },
+ {
+ "type": "GitDemonstrationView",
+ "options": {
+ "beforeMarkdowns": [
+ "Imos comenzar a modo, e só ollar cómo un repositorio remoto semellase á nosa visualización.",
+ ""
+ ],
+ "afterMarkdowns": [
+ "¡Aquí o tes! Agora temos un respositorio remoto do noso proxecto. El é moi parecido exceto por algúns cambios visuais para ter a unha distinción visible -- nas tarefas a seguir veremos como compartir o traballo entre eses repositorios."
+ ],
+ "command": "git clone",
+ "beforeCommand": ""
+ }
+ },
+ {
+ "type": "ModalAlert",
+ "options": {
+ "markdowns": [
+ "Para completar este nivel, escribe o comando `git clone`. Aprenderás algo de verdade sóamente nas próximas leccións."
+ ]
+ }
+ }
+ ]
+ },
"zh_TW": {
"childViews": [
{
diff --git a/src/levels/remote/fakeTeamwork.js b/src/levels/remote/fakeTeamwork.js
index 22d2b866..ca08387f 100644
--- a/src/levels/remote/fakeTeamwork.js
+++ b/src/levels/remote/fakeTeamwork.js
@@ -9,6 +9,7 @@ exports.level = {
"ja" : "擬似的なチーム作業",
"es_AR": "Simulando el trabajo en equipo",
"pt_BR": "Simulando trabalho em equipe",
+ "gl" : "Simulando o traballo no repositorio",
"zh_CN": "模拟团队合作",
"zh_TW": "模擬團隊合作",
"ru_RU": "Коллективная работа",
@@ -22,6 +23,7 @@ exports.level = {
"ja" : "擬似的に作成するコミット数を指定できるのをお忘れなく",
"es_AR": "Acordate que podés especificar cuántos commits simular",
"pt_BR": "Lembre-se que você pode especificar quantos commits quer simular",
+ "gl" : "Lembra que podes especifar cantos commits queres simular",
"zh_CN": "记住你可以指定仿真提交的个数",
"zh_TW": "你要記得指定要送多少個 commit 出去",
"ru_RU": "помните, Вы можете указать количество фейковых коммитов",
@@ -245,6 +247,60 @@ exports.level = {
}
]
},
+ "gl": {
+ "childViews": [
+ {
+ "type": "ModalAlert",
+ "options": {
+ "markdowns": [
+ "## Simulando o traballo no repositorio",
+ "",
+ "Entón, hai algo con trampa aquí -- para algunhas das leccións seguintes, precisamos explicarche cómo baixar os cambios introducidos no repositorio remoto.",
+ "",
+ "Eso significa que escencialmente temos que \"finxir\" que o repositorio remoto foi actualizado por algún compañeiro, amigo ou incluso nalgunha rama específica a cantidade de commits feitos.",
+ "",
+ "Para acadar esto, introduxemos o ben chamado comando `git fakeTeamwork`! É bastante auto-explicativo: semella traballo dos nosos colegas. Vexamos una demo..."
+ ]
+ }
+ },
+ {
+ "type": "GitDemonstrationView",
+ "options": {
+ "beforeMarkdowns": [
+ "O comportamento por defecto de `fakeTeamwork` é simplemente crear un commit en master na rama remota"
+ ],
+ "afterMarkdowns": [
+ "Ahí o tes: a rama remota actualizouse cun novo commit, e aínda non nos baixamos ese commit porque inda non fixemos `git fetch`."
+ ],
+ "command": "git fakeTeamwork",
+ "beforeCommand": "git clone"
+ }
+ },
+ {
+ "type": "GitDemonstrationView",
+ "options": {
+ "beforeMarkdowns": [
+ "Tamén podes especificar a cantidad de commits ou a rama agregándoos ó comando"
+ ],
+ "afterMarkdowns": [
+ "Cun único comando simulamos que un colega do equipo empurrou tres commits á rama `foo` do noso remoto"
+ ],
+ "command": "git fakeTeamwork foo 3",
+ "beforeCommand": "git branch foo; git clone"
+ }
+ },
+ {
+ "type": "ModalAlert",
+ "options": {
+ "markdowns": [
+ "Os niveis seguintes van ser un pouco máis complicados, así que imos a esixirte un pouco máis neste nivel.",
+ "",
+ "Anímate e crea unha rama remota (con `git clone`), e simula algúns cambios no repositorio remoto, logo desto, fai commit do teu repo local, e logo descarga os cambios. ¡É coma varias leccións nunha soa!"
+ ]
+ }
+ }
+ ]
+ },
"zh_TW": {
"childViews": [
{
diff --git a/src/levels/remote/fetch.js b/src/levels/remote/fetch.js
index 5501167b..29c94e80 100644
--- a/src/levels/remote/fetch.js
+++ b/src/levels/remote/fetch.js
@@ -9,6 +9,7 @@ exports.level = {
"ja" : "Git Fetch",
"es_AR": "git fetch",
"pt_BR": "Git Fetch",
+ "gl" : "Git Fetch",
"zh_CN": "Git Fetch",
"zh_TW": "git fetch",
"ru_RU": "Git fetch",
@@ -22,6 +23,7 @@ exports.level = {
"ja" : "単にgit fetchを実行!",
"es_AR": "Simplemente ¡hacé git fetch!",
"pt_BR": "Simplesmente chame git fetch!",
+ "gl" : "¡Sinxelamente fai git fetch!",
"zh_CN": "只需要运行 git fetch 命令!",
"zh_TW": "只要下 git fetch 指令",
"ru_RU": "Просто выполните git fetch!",
@@ -321,6 +323,79 @@ exports.level = {
}
]
},
+ "gl": {
+ "childViews": [
+ {
+ "type": "ModalAlert",
+ "options": {
+ "markdowns": [
+ "## Git Fetch",
+ "",
+ "Traballar con respositorios remotos en Git, a fin de contas, resúmese en transferir datos _dun_ repositorio _cara_ outros repositorios. Dende que podemos enviar commits dun lado cara o outro, poderemos compartir calquera tipo de actualización que sexa xerada por git (e polo tanto compartir o traballo, novos arquivos, novas ideas, cartas de amor, etc).",
+ "",
+ "Nesta lección imos aprender como baixar os cambios _dun_ repositorio remoto -- o comando para iso é `git fetch`.",
+ "",
+ "Percibirás que conforme atualizamos a representación do repositorio remoto, as nosas ramas _remotas_ actualizaranse para reflexar a nova representación. Iso ten que ver co que vimos na lección anterior sobre as ramas remotas"
+ ]
+ }
+ },
+ {
+ "type": "GitDemonstrationView",
+ "options": {
+ "beforeMarkdowns": [
+ "Ántes de entrar nos detalles de `git fetch`, vexámolo en acción! Aquí temos un repositorio remoto que contén dous commits que o noso repositorio local non ten."
+ ],
+ "afterMarkdowns": [
+ "Alá imos! Os commits `C2` e `C3` baixáronse ó noso repositorio local, e a nosa rama `o/master` actualizouse para reflexar ese cambio."
+ ],
+ "command": "git fetch",
+ "beforeCommand": "git clone; git fakeTeamwork 2"
+ }
+ },
+ {
+ "type": "ModalAlert",
+ "options": {
+ "markdowns": [
+ "### O que fai o fetch",
+ "",
+ "`git fetch` fai dous pasos pasos principais, e soamente estes dous pasos princpipais. Son:",
+ "",
+ "* Baixa os commits que o repositório remoto contén pero non temos nos no noso repositoiro local, e...",
+ "* Actualiza a referencia nas ramas remotas (por exemplo, `o/master`) nas que se está apuntando",
+ "",
+ "`git fetch` esencialmente fai que a nosa representación _local_ do repositorio remoto se sincronice ca forma que posúe o repositorio remoto, _de feito_ parecese (nese momento).",
+ "",
+ "Se ti lembras a lección anterior, nos dixemos que as ramas remotas reflexan o estado dos repositorios remotos _dende a última vez_ na que ti fixeches un commit dese repositorio. O `git fetch` é a única forma de falar con eses repositorios remotos! Agardo que a conexión entre as ramas remotas e o `git fetch` esté clara dabondo agora.",
+ "",
+ "`git fetch` xeralmente fala co repositorio remoto por medio da rede (usando un protocolo como `http://`, `git://` ou `ssh`).",
+ ""
+ ]
+ }
+ },
+ {
+ "type": "ModalAlert",
+ "options": {
+ "markdowns": [
+ "### O que fetch NON fai",
+ "",
+ "`git fetch`, por agora, non cambia nada no estado _local_ do repositorio. El solo actualiza a rama `master` sen facer cambios na forma de cómo está o teu sistema de arquivos nese momento.",
+ "",
+ "É importante entender iso, xa que moitos desenvolvedores pensan que executar `git fetch` fará que o traballo local se vexa modificado polo repositorio remoto. El pode que baixara todos os cambios necesarios para facelo, pero, o comando _non_ cambia cómo están os teus arquivos locais. Imos aprender comandos para facer esas conexións :D",
+ "",
+ "A fin de contas, ti podes pensar en `git fetch` como unha descarga."
+ ]
+ }
+ },
+ {
+ "type": "ModalAlert",
+ "options": {
+ "markdowns": [
+ "Para rematar este nivel, so executa `git fetch` e baixa todos os commits!"
+ ]
+ }
+ }
+ ]
+ },
"zh_TW": {
"childViews": [
{
diff --git a/src/levels/remote/fetchArgs.js b/src/levels/remote/fetchArgs.js
index 405329c1..efb61364 100644
--- a/src/levels/remote/fetchArgs.js
+++ b/src/levels/remote/fetchArgs.js
@@ -9,6 +9,7 @@ exports.level = {
"zh_TW": "fetch 的參數",
"es_AR": "Parámetros de fetch",
"pt_BR": "Parâmetros do fetch",
+ "gl" : "Parámetros de fetch",
"de_DE": "Optionen für Fetch",
"ja" : "Fetchの引数",
"ru_RU": "Аргументы для fetch",
@@ -22,6 +23,7 @@ exports.level = {
"zh_TW": "注意 commit 的 id 是怎麼被交換的!你可以透過 `help level` 來閱讀對話視窗!",
"es_AR": "¡Prestá atención a cómo podrían haberse invertido los ids de los commits! Podés volver a leer toda la lección usando \"help level\"",
"pt_BR": "Preste atenção em como os identificadores dos commits podem ter trocado! Você pode ler os slides novamente com \"help level\"",
+ "gl" : "Preste atención en como poderían invertirse os ids dos commits! Podes volver ler toda a lección usando \"help level\"",
"de_DE": "Beachte wie die Commit IDs getauscht wurden! Du kannst den Einführungsdialog mit \"help level\" erneut anzeigen",
"ja" : "コミットIDの入れ替わりに注意!スライドを復習するには`help level`を実行",
"ru_RU": "Обратите внимание на то, как номера коммитов могут меняться! Вы можете прочесть слайды вновь, воспользовавшись командой \"help level\"",
@@ -521,6 +523,129 @@ exports.level = {
}
]
},
+ "gl": {
+ "childViews": [
+ {
+ "type": "ModalAlert",
+ "options": {
+ "markdowns": [
+ "## Parámetros de fetch",
+ "",
+ "Entonces, aprendido todo sobre os parámetros de push, este parámetro `` molón, e incluso as referencias separadas por dous puntos (`:`). ¿Poderemos empregar todo este coñecemento para `git fetch` tamén?",
+ "",
+ "¡Home claro! Os parámetros para `git fetch` son realmente *moi, moi* semellantes os de `git push`. É o mesmo tipo de conceptos, pero aplicados na dirección contraria (xa que agora estás baixando os commits en lugar de subilos).",
+ "",
+ "Vexamos os conceptos dunha puntada..."
+ ]
+ }
+ },
+ {
+ "type": "ModalAlert",
+ "options": {
+ "markdowns": [
+ "### O parámetro ``",
+ "",
+ "Se especificar o lugar co git fetch como no comando seguinte:",
+ "",
+ "`git fetch origin foo`",
+ "",
+ "Git vai ir á rama `foo` no remoto, vai traer tódolos commits que non estén presentes localmente, e logo aplicaráos sobre a rama `o/foo` localmente.",
+ "",
+ "Vexámolo en acción (refresquemos o concepto)."
+ ]
+ }
+ },
+ {
+ "type": "GitDemonstrationView",
+ "options": {
+ "beforeMarkdowns": [
+ "Especificando un lugar..."
+ ],
+ "afterMarkdowns": [
+ "Sólo baixamos os commits de `foo` e os poñemos en `o/foo`"
+ ],
+ "command": "git fetch origin foo",
+ "beforeCommand": "git branch foo; git clone; git fakeTeamwork foo 2"
+ }
+ },
+ {
+ "type": "ModalAlert",
+ "options": {
+ "markdowns": [
+ "Poderás preguntarte \"¿Por qué git aplicou eses commits sobre a rama `origin/foo` e non os aplicou sobre a rama `foo` local? Lembra que o parámetro `` era un lugar que existía tanto no local como no remoto.\"",
+ "",
+ "Bueno, git fai unha excepción especial neste caso, xa que poderías ter traballo na rama `foo` que non quixeras mesturar. Esto refírese á lección anterior sobre `git fetch` - non actualiza as túas ramas locais non-remotas, só descarga os commits (para que poidas velos ou mesturalos despois).",
+ ""
+ ]
+ }
+ },
+ {
+ "type": "ModalAlert",
+ "options": {
+ "markdowns": [
+ "\"Bueno, e, neste caso, ¿qué pasa se explícitamente definimos o orixe e destino con `:`?\"",
+ "",
+ "Se te sentes o suficientemente seguro como para traer os commits *directamente* da rama local, entón, sí, podes especificalo empregando a referencia con dous puntos. Non podes traer commits a unha rama que non teñas, pero en calquera outro caso, git vaino facer.",
+ "",
+ "Este é o único problema, igual: `` é agora un lugar no *remoto*, e `` é un lugar *local* onde poñer esos commits. É exactamente o oposto a git push, e eso ten sentido xa que ¡estamos enviando os datos no sentido contrario!",
+ "",
+ "Dito esto, difícilmente alguén use esto na práctica. Estouno presentando principalmente como un modo de traballar no que `fetch` e `push` son moi semellantes, só que en direccións opostas."
+ ]
+ }
+ },
+ {
+ "type": "GitDemonstrationView",
+ "options": {
+ "beforeMarkdowns": [
+ "Vexamos esta locura en acción"
+ ],
+ "afterMarkdowns": [
+ "¡Wow! Mira: git resolveu `foo~1` como un lugar no que a orixe descargou eses commits a `bar` (que era unha rama local). Nota como `foo` e `o/foo` non foron actualizados, xa que especificamos o destino."
+ ],
+ "command": "git fetch origin foo~1:bar",
+ "beforeCommand": "git branch foo; git clone; git branch bar; git fakeTeamwork foo 2"
+ }
+ },
+ {
+ "type": "GitDemonstrationView",
+ "options": {
+ "beforeMarkdowns": [
+ "¿Qué pasa si o destino non existe antes de lanzar este comando? Vexamos o último exemplo pero sin que `bar` exista de antemán."
+ ],
+ "afterMarkdowns": [
+ "Mira: é IGUAL que git push. Git creou o destino localmente antes de facer o fetch, tal e como git creará o destino no remoto antes de empurrar (se non existiran)."
+ ],
+ "command": "git fetch origin foo~1:bar",
+ "beforeCommand": "git branch foo; git clone; git fakeTeamwork foo 2"
+ }
+ },
+ {
+ "type": "GitDemonstrationView",
+ "options": {
+ "beforeMarkdowns": [
+ "¿Sen argumentos?",
+ "",
+ "Se `git fetch` non recibe ningún argumento, simplemente descarga tódolos commits do remoto a tódalas ramas remotas..."
+ ],
+ "afterMarkdowns": [
+ "Moi sinxelo, pero vale a pena velo ó menos unha vez."
+ ],
+ "command": "git fetch",
+ "beforeCommand": "git branch foo; git clone; git fakeTeamwork foo; git fakeTeamwork master"
+ }
+ },
+ {
+ "type": "ModalAlert",
+ "options": {
+ "markdowns": [
+ "Bueno, moitas verbas. Para rematar o nivel, descarga só os commits especificados na visualización do obxectivo. ¡Faite colega destes comandos!",
+ "",
+ "Vas ter que especificar a orixe e o destino para ámbolos dous comandos fetch. Presta atención ó objetivo dado que ¡os IDs poden estar invertidos!"
+ ]
+ }
+ }
+ ]
+ },
"zh_TW": {
"childViews": [
{
diff --git a/src/levels/remote/fetchRebase.js b/src/levels/remote/fetchRebase.js
index 851316bd..f44b2aab 100644
--- a/src/levels/remote/fetchRebase.js
+++ b/src/levels/remote/fetchRebase.js
@@ -8,6 +8,7 @@ exports.level = {
"zh_TW": "diverged history",
"es_AR": "Historia divergente",
"pt_BR": "Histórico divergente",
+ "gl" : "Histórico diverxente",
"de_DE": "Abweichende History",
"fr_FR": "Historique divergent",
"ja" : "履歴の分岐",
@@ -21,6 +22,7 @@ exports.level = {
"zh_TW": "確認視覺化的目標中的順序",
"es_AR": "Prestá atención al orden del objetivo",
"pt_BR": "Preste atenção na ordem da visualização do objetivo",
+ "gl" : "Presta atención ó orixe do obxectivo",
"de_DE": "Beachte die Reihenfolge in der Zieldarstellung",
"ja" : "ゴールのツリーの順番を参考にすること",
"fr_FR": "regardez l'ordre dans la fenêtre de visualisation d'objectif",
@@ -601,6 +603,150 @@ exports.level = {
}
]
},
+
+ "gl": {
+ "childViews": [
+ {
+ "type": "ModalAlert",
+ "options": {
+ "markdowns": [
+ "## Traballo diverxente",
+ "",
+ "Ata agora vimos cómo descargar e mesturar os commits de outros e como empurrar os nosos. Parece bastante sinxelo, así que ¿cómo pode confundirse tanto a xente?",
+ "",
+ "A dificultade ven cando a historia dos repositorios *diverxe*. Antes de entrar nos detalles, vexamos un examplo...",
+ ""
+ ]
+ }
+ },
+ {
+ "type": "ModalAlert",
+ "options": {
+ "markdowns": [
+ "Imaxínate que clonas un repositorio o luns e comezas a desenvolver algo. Para o venres, xa estás listo para publicar o teu traballo, pero, ¡oh, oh! Os teus colegas tamén fixeron código durante a semana, facendo que o teu traballo quede desactualizado (e obsoleto). Ademáis, eles publicaron eses commits no repositorio remoto, así que agora o *teu* traballo está baseado nunha versión *vella* do proxecto, que xa non lle interesa a ninguén.",
+ "",
+ "Neste caso, o comando `git push` é ambiguo. Se executas `git push`, ¿git debería mudar o repositorio para como estaba o luns? ¿Deberías arranxar o teu código sen eliminar o código novo? ¿Ou debería ignorar completamente os teus cambio porque xa están desactualizados?",
+ "",
+ "Como hai tanta ambiguedade nesta situación (na que a historia diverxeu), git non che permite empurrar os teus cambios. En cambio, fórzate a integrar o último estado do respositorio remoto antes de poder compartir o teu traballo."
+ ]
+ }
+ },
+ {
+ "type": "GitDemonstrationView",
+ "options": {
+ "beforeMarkdowns": [
+ "¡Demasiada charla, vexámolo en acción!"
+ ],
+ "afterMarkdowns": [
+ "¿Ves? Non pasou nada, porque o comando falla. `git push` falla porque `C3`, o teu commit máis recente, está baseado no remoto sobre `C1`. O remoto foi actualizado a `C2` dende entonces, polo que git rechaza o teu push."
+ ],
+ "command": "git push",
+ "beforeCommand": "git clone; git fakeTeamwork; git commit"
+ }
+ },
+ {
+ "type": "ModalAlert",
+ "options": {
+ "markdowns": [
+ "¿Cómo resolves esta situación? É sinxelo, todo o que tes que facer é basear o teu traballo na versión máis recente da rama remota.",
+ "",
+ "Hai un par de formas de facer esto, pero a máis sinxela é mover o teu traballo facendo un rebase. Probémolo a ver cómo se ve."
+ ]
+ }
+ },
+ {
+ "type": "GitDemonstrationView",
+ "options": {
+ "beforeMarkdowns": [
+ "Agora, se facemos rebase antes de empurrar..."
+ ],
+ "afterMarkdowns": [
+ "¡Boom! Actualizamos a nosa representación local do remoto con `git fetch`, rebasamos o noso traballo para reflexar os novos cambios do remoto, e despois os empurramos con `git push`"
+ ],
+ "command": "git fetch; git rebase o/master; git push",
+ "beforeCommand": "git clone; git fakeTeamwork; git commit"
+ }
+ },
+ {
+ "type": "ModalAlert",
+ "options": {
+ "markdowns": [
+ "¿Hai outra forma de actualizar o meu traballo se actualizaran o repositorio remoto? ¡Pois claro! Vexamos cómo facer o mesmo pero empregando `merge`.",
+ "",
+ "Por máis que `git merge` non mova o teu traballo (só crea un commit de merge), é un modo de decirlle a git que integrase tódolos cambios do remoto. Esto é porque agora unha rama remota pasou a ser un *ancestro* da tua propia rama, o que significa que o teu commit reflexa os cambios de tódolos commits da rama remota.",
+ "",
+ "Vexamos unha mostra..."
+ ]
+ }
+ },
+ {
+ "type": "GitDemonstrationView",
+ "options": {
+ "beforeMarkdowns": [
+ "Si no lugar de rebasar facemos un merge..."
+ ],
+ "afterMarkdowns": [
+ "¡Boom! Actualizamos a nosa representación local do remoto usando `git fetch`, *mesturamos* ou *mergeamos* o novo traballo xunto co noso (para reflexar os novos cambios no remoto), e despois os empurramos empregando `git push`"
+ ],
+ "command": "git fetch; git merge o/master; git push",
+ "beforeCommand": "git clone; git fakeTeamwork; git commit"
+ }
+ },
+ {
+ "type": "ModalAlert",
+ "options": {
+ "markdowns": [
+ "¡Asombroso! ¿Hai forma de facer esto sen escreber tantos comandos?",
+ "",
+ "¡Claro que sí! Xa sabes que `git pull` é sinxelamente un atallo para facer fetch e merge. Ademáis, ¡`git pull --rebase` é un atallo para facer fetch e rebase!",
+ "",
+ "Vexamos estos atallos funcionando."
+ ]
+ }
+ },
+ {
+ "type": "GitDemonstrationView",
+ "options": {
+ "beforeMarkdowns": [
+ "Primeiro con `--rebase`..."
+ ],
+ "afterMarkdowns": [
+ "¡Igual que antes! Só que máis corto."
+ ],
+ "command": "git pull --rebase; git push",
+ "beforeCommand": "git clone; git fakeTeamwork; git commit"
+ }
+ },
+ {
+ "type": "GitDemonstrationView",
+ "options": {
+ "beforeMarkdowns": [
+ "E agora un `pull` común"
+ ],
+ "afterMarkdowns": [
+ "Outra vez, ¡exactamente o mesmo que antes!"
+ ],
+ "command": "git pull; git push",
+ "beforeCommand": "git clone; git fakeTeamwork; git commit"
+ }
+ },
+ {
+ "type": "ModalAlert",
+ "options": {
+ "markdowns": [
+ "Toda esta movida de fetchear, rebasear/mergear e pushear é bastante común. Nas seguintes leccións imos ver formas máis complexas de estes fluxos de traballo, pero por agora probemos o que vimos.",
+ "",
+ "Para resolver este nivel, fai o siguiente:",
+ "",
+ "* Clona o teu repositorio",
+ "* Simula algo de trabajo dun colega (1 commit)",
+ "* Commitea algo de traballo propio (1 commit)",
+ "* Publica o teu traballo *rebasando*"
+ ]
+ }
+ }
+ ]
+ },
"zh_TW": {
"childViews": [
{
diff --git a/src/levels/remote/mergeManyFeatures.js b/src/levels/remote/mergeManyFeatures.js
index e9d2223e..136a202c 100644
--- a/src/levels/remote/mergeManyFeatures.js
+++ b/src/levels/remote/mergeManyFeatures.js
@@ -8,6 +8,7 @@ exports.level = {
"zh_TW": "merge with remotes",
"es_AR": "Mergeando con los remotos",
"pt_BR": "Merge com remotos",
+ "gl" : "Merge cos repos remotos",
"de_DE": "Änderungen vom Remote zusammenführen",
"ja" : "リモートとのmerge",
"fr_FR": "Fusionner avec les branches distantes",
@@ -21,6 +22,7 @@ exports.level = {
"zh_TW": "注意最後要完成的目標!",
"es_AR": "¡Prestá atención al árbol final!",
"pt_BR": "Preste atenção na árvore do objetivo!",
+ "gl" : "Presta atención á arbore final!",
"de_DE": "Beachte den Ziel-Baum!",
"ja" : "ゴールツリーをよく見てください!",
"fr_FR": "Respectez l'arbre représentant l'objectif !",
@@ -210,6 +212,51 @@ exports.level = {
}
]
},
+ "gl": {
+ "childViews": [
+ {
+ "type": "ModalAlert",
+ "options": {
+ "markdowns": [
+ "## ¿Por qué non mesturar?",
+ "",
+ "Para empurrar as túas novidades ó remoto, todo o que tes que facer é *integrar* os últimos cambios do remoto cos teus. Eso significa que podes facer tanto rebase como merge ca rama remota (por exemplo, `o/master`).",
+ "",
+ "Así que podes facer calquera das dúas, ¿por qué as leccións só se centraron en rebasar ata agora? ¿Por qué non adicarlle algo de amor ó `merge` cando traballamos con remotos?",
+ ""
+ ]
+ }
+ },
+ {
+ "type": "ModalAlert",
+ "options": {
+ "markdowns": [
+ "Hai moito debate entre os desenvolvedores sobre os pros e contras de mesturar vs rebasar. Aquí temos os pros e os contras de rebasar:",
+ "",
+ "Pros:",
+ "",
+ "* Rebasar fai que a túa árbore de commits sexa bastante limpa, xa que tódolos commits seguen unha única línea.",
+ "",
+ "Contras:",
+ "",
+ "* Rebasar modifica a historia (aparente) da túa árbore de commits.",
+ "",
+ "Por exemplo, o commit `C1` pode rebasarse para que apareza *despois* de `C3`. Entón, parece que o traballo de `C1'` fíxose despois de `C3`, inda que na realidade fixérase antes.",
+ "",
+ "Algúns desenvolvedores aman preservar a historia, polo que prefiren mesturar. Outros (coma min) preferimos ter unha árbore de commits limpos, e preferimos rebasar. Todo é unha cuestión de preferencias :D"
+ ]
+ }
+ },
+ {
+ "type": "ModalAlert",
+ "options": {
+ "markdowns": [
+ "Para este nivel, tratemos de resolvelo nivel anterior, pero *mesturando*. Pode poñerse un pouco oscuro, pero ilustra a idea bastante ben."
+ ]
+ }
+ }
+ ]
+ },
"zh_TW": {
"childViews": [
{
diff --git a/src/levels/remote/pull.js b/src/levels/remote/pull.js
index d1fa8cf9..a19a0f80 100644
--- a/src/levels/remote/pull.js
+++ b/src/levels/remote/pull.js
@@ -8,6 +8,7 @@ exports.level = {
"zh_TW": "git pull",
"es_AR": "git pull",
"pt_BR": "Git Pull",
+ "gl" : "Git Pull",
"de_DE": "Git Pull",
"ja" : "Git Pull",
"fr_FR": "Git pull",
@@ -21,6 +22,7 @@ exports.level = {
"zh_TW": "只要下 git pull 這個指令即可",
"es_AR": "Simplemente ¡hacé git pull!",
"pt_BR": "Basta executar git pull!",
+ "gl" : "Sinxelamente fai git pull!",
"de_DE": "Führe einfach git pull aus.",
"ja" : "単にgit pullを実行!",
"fr_FR": "Utilisez facilement git pull !",
@@ -265,6 +267,65 @@ exports.level = {
}
]
},
+ "gl": {
+ "childViews": [
+ {
+ "type": "ModalAlert",
+ "options": {
+ "markdowns": [
+ "## Git Pull",
+ "",
+ "Agora que vimos cómo traer os datos dun repositorio remoto con `git fetch`, ¡actualicemos o noso traballo local para reflexar eses cambios!",
+ "",
+ "Realmente hai varias formas de facer esto: unha vez que teñas os commits dispoñibles localmente, podes integralos coma se foran commits comúns de outras ramas. Esto significa que poderías executar comandos como:",
+ "",
+ "* `git cherry-pick o/master`",
+ "* `git rebase o/master`",
+ "* `git merge o/master`",
+ "* etc., etc.",
+ "",
+ "De feito, o fluxo de traballo de *fetchear* os cambios remotos e depois *mesturalos* é tan común que git inclúe un comando que fai as dúas operacións nunha sola: ¡`giti pull`!"
+ ]
+ }
+ },
+ {
+ "type": "GitDemonstrationView",
+ "options": {
+ "beforeMarkdowns": [
+ "Vexamos primeiro un `fetch` e un `merge` executados secuencialmente"
+ ],
+ "afterMarkdowns": [
+ "Boom: descargamos `C3` cun `fetch` e logo mesturámolos con `git merge o/master`. Agora a nosa rama `master` reflexa o novo traballo do remoto (neste caso, chamado `origin`)"
+ ],
+ "command": "git fetch; git merge o/master",
+ "beforeCommand": "git clone; git commit; git fakeTeamwork"
+ }
+ },
+ {
+ "type": "GitDemonstrationView",
+ "options": {
+ "beforeMarkdowns": [
+ "¿Qué pasaría se usáramos `git pull` en cambio?"
+ ],
+ "afterMarkdowns": [
+ "¡O mesmo! Eso debía deixar ben claro que `git pull` é básicamente un atallo para facer `git fetch` seguido pola mestura ca rama que houbésemos descargado."
+ ],
+ "command": "git pull",
+ "beforeCommand": "git clone; git commit; git fakeTeamwork"
+ }
+ },
+ {
+ "type": "ModalAlert",
+ "options": {
+ "markdowns": [
+ "Exploraremos os detalles de `git pull` despois (incluíndo as súas operacións e parámetros), pero por agora probarémolo neste nivel.",
+ "",
+ "Lémbrate: podes resolver este comando sinxelamente con `fetch` e `merge`, pero eso costaríache un comando extra :P"
+ ]
+ }
+ }
+ ]
+ },
"zh_TW": {
"childViews": [
{
diff --git a/src/levels/remote/pullArgs.js b/src/levels/remote/pullArgs.js
index 7b63fc00..c719162a 100644
--- a/src/levels/remote/pullArgs.js
+++ b/src/levels/remote/pullArgs.js
@@ -8,6 +8,7 @@ exports.level = {
"zh_TW": "pull 的參數",
"es_AR": "Parámetros de pull",
"pt_BR": "Parâmetros do pull",
+ "gl" : "Parámetros de pull",
"de_DE": "Optionen für Pull",
"ja" : "Pullの引数",
"fr_FR": "Arguments de pull",
@@ -21,6 +22,7 @@ exports.level = {
"zh_TW": "記住,你可以透過 fetch 以及 pull 來建立一個新的 local 的 branch",
"es_AR": "Acordate de que podés crear nuevas ramas locales usando los parámetros de fetch/pull",
"pt_BR": "Lembre-se que você pode criar novos ramos locais com parâmetros de fetch/pull",
+ "gl" : "Lémbrate que podes crear novas ramas locais con parámetros de fetch/pull",
"de_DE": "Du kannst neue lokale Branches mittels fetch / pull erstellen",
"ja" : "Fetchとpullの引数を利用してローカルで新規ブランチを作成できるのをお忘れなく",
"fr_FR": "Vous pouvez aussi créer une nouvelle branche locale avec les arguments de fetch/pull",
@@ -325,6 +327,80 @@ exports.level = {
}
]
},
+ "gl": {
+ "childViews": [
+ {
+ "type": "ModalAlert",
+ "options": {
+ "markdowns": [
+ "## Parámetros de git pull",
+ "",
+ "Agora que sabes prácticamente *todo* o que hai que saber sobre os parámetros de `git fetch` e `git push`, casi que non queda nada para cubrir os de git pull :D",
+ "",
+ "Eso é porque git pull é sinxelamente un atallo para facer un fetch seguido dun merge. Podes pensalo como executar git fetch cos *mesmos* parámetros, e logo mesturar aquelo onde esos commits houberan ido ficar.",
+ "",
+ "Esto aplica incluso cando usas parámetros hiper-complexos. Vexamos algúns exemplos:"
+ ]
+ }
+ },
+ {
+ "type": "ModalAlert",
+ "options": {
+ "markdowns": [
+ "Estos son algúns comandos equivalentes de git:",
+ "",
+ "`git pull origin foo` equivale a:",
+ "",
+ "`git fetch origin foo; git merge o/foo`",
+ "",
+ "E...",
+ "",
+ "`git pull origin bar~1:bugFix` equivale a:",
+ "",
+ "`git fetch origin bar~1:bugFix; git merge bugFix`",
+ "",
+ "¿Ves? git pull é sinxelamente un atallo para un fetch + merge, e todo o que lle importa a git pull é ónde terminaron eses commits (o parámetro `destino` que indícase durante o fetch).",
+ "",
+ "Vexamos unha demostración:"
+ ]
+ }
+ },
+ {
+ "type": "GitDemonstrationView",
+ "options": {
+ "beforeMarkdowns": [
+ "Se especificamos o lugar do que facer o fetch, todo ocorre coma antes, pero só mesturamos o que se descargou"
+ ],
+ "afterMarkdowns": [
+ "¡Ves! Indicando `master` baixamos os commits á `o/master` coma sempre. Despois mesturamos `o/master` á nosa rama actual, *sen importar* qué tiñamos na nos copia de traballo."
+ ],
+ "command": "git pull origin master",
+ "beforeCommand": "git clone; go -b bar; git commit; git fakeTeamwork"
+ }
+ },
+ {
+ "type": "GitDemonstrationView",
+ "options": {
+ "beforeMarkdowns": [
+ "¿Esto funciona co orixe e o destino, tamén? ¡Máis lle vale! Vexámolo:"
+ ],
+ "afterMarkdowns": [
+ "Wow, eso es unha CHEA nun único comando. Creamos unha nova rama local chamada `foo`, descargamos os commits do master do remoto a esta rama `foo`, e logo mesturamos esa rama á nosa rama actual `bar`. ¡¡¡Supera os 9000!!!"
+ ],
+ "command": "git pull origin master:foo",
+ "beforeCommand": "git clone; git fakeTeamwork; go -b bar; git commit"
+ }
+ },
+ {
+ "type": "ModalAlert",
+ "options": {
+ "markdowns": [
+ "OK: para rematar, alcanza o estado do obxectivo. Vase necesitar descargar algúns commits, crear algunhas ramas novas, e mesturar esas ramas xunto con outras, pero non debería levar demasiados domandos :P"
+ ]
+ }
+ }
+ ]
+ },
"zh_TW": {
"childViews": [
{
diff --git a/src/levels/remote/push.js b/src/levels/remote/push.js
index 9d8591ab..9377579e 100644
--- a/src/levels/remote/push.js
+++ b/src/levels/remote/push.js
@@ -8,6 +8,7 @@ exports.level = {
"zh_TW": "git push",
"es_AR": "git push",
"pt_BR": "Git Push",
+ "gl" : "Git Push",
"de_DE": "Git Push",
"ja" : "Git Push",
"fr_FR": "Git push",
@@ -199,6 +200,49 @@ exports.level = {
}
]
},
+ "gl": {
+ "childViews": [
+ {
+ "type": "ModalAlert",
+ "options": {
+ "markdowns": [
+ "## Git Push",
+ "",
+ "Ok, entón xa baixamos os cambios dun repositorio remoto e integrámolos na árbore local. Esto está xenial... pero ¿cómo comparto o _meu_ sensacional traballo cas outras persoas?",
+ "",
+ "Ben, a forma de subir traballo para ser compartido é a oposta daquela de baixar o traballo que foi compartido. E ¿qué é o oposto a `git pull` (tirar)? ¡É `git push` (empuxar)!",
+ "",
+ "`git push` é o responsable de subilos _teus_ cambios para un repositorio remoto especificado, e atualizar ese repositorio remoto para incorporar os seus novos commits. Unha vez que `git push` complétase, todos os teus amigos poderán baixar o teu traballo do repositorio remoto.",
+ "",
+ "Podes pensar en `git push` como un comando para \"publicar\" o teu traballo. O comando ten unha serie de detalles cos que imos xogar logo, pero comezemos con pasos curtos...",
+ "",
+ "*Nota -- o comportamento de `git push` sen argumentos varía dependendo da configuración `push.default` de Git. O valor para esa configuración depende da versión de Git que esteas empregando, pero imos asumir o valor `upstream` nestas leccións. Eso non é un gran problema, pero paga a pena verificalas súas configuracións antes de facer push nos teus propios proxectos.*"
+ ]
+ }
+ },
+ {
+ "type": "GitDemonstrationView",
+ "options": {
+ "beforeMarkdowns": [
+ "Aquí temos algúns cambios que o repositorio remoto non contén. ¡Imos subilas!"
+ ],
+ "afterMarkdowns": [
+ "Ahí imos -- o repositorio remoto recibiu o commit `C2`, a rama `master` do repositorio remoto foi actualizado para apuntar para `C2`, e o *noso* reflexo do remoto (`o/master`) foi atualizado tamén. ¡Está todo sincronizado!"
+ ],
+ "command": "git push",
+ "beforeCommand": "git clone; git commit"
+ }
+ },
+ {
+ "type": "ModalAlert",
+ "options": {
+ "markdowns": [
+ "Para completar este nivel, comparte dous novos commits co repositorio remoto. Igual, non te confíes, ¡xa se complicará nas seguintes leccións!"
+ ]
+ }
+ }
+ ]
+ },
"zh_TW": {
"childViews": [
{
diff --git a/src/levels/remote/pushArgs.js b/src/levels/remote/pushArgs.js
index 7da6ee93..c7d72ea9 100644
--- a/src/levels/remote/pushArgs.js
+++ b/src/levels/remote/pushArgs.js
@@ -11,6 +11,7 @@ exports.level = {
"zh_TW": "git push 的參數",
"es_AR": "Parámetros de git push",
"pt_BR": "Parâmetros do git push",
+ "gl" : "Parámetros de git push",
"de_DE": "Optionen für Git Push",
"ja" : "Git pushの引数",
"fr_FR": "Arguments de git push",
@@ -24,6 +25,7 @@ exports.level = {
"zh_TW": "你可以利用 \"objective\" 來閱讀對話視窗的最後一頁",
"es_AR": "Siempre podés ver el último mensaje tipeando \"objective\"",
"pt_BR": "Você sempre pode rever o último slide com o comando \"objective\"",
+ "gl" : "Ti sempre podes desfacer último mensaxe escribindo \"objective\"",
"de_DE": "Du kannst dir die Zielsetzung des Levels immer wieder mit \"objective\" anzeigen lassen",
"ja" : "ダイアログの最後のスライドを参照するには\"objective\"を実行",
"fr_FR": "Vous pouvez toujours regarder le dernier slide des dialogues en tapant \"objective\".",
@@ -323,6 +325,78 @@ exports.level = {
}
]
},
+ "gl": {
+ "childViews": [
+ {
+ "type": "ModalAlert",
+ "options": {
+ "markdowns": [
+ "## Parámetros de push",
+ "",
+ "¡Xenial! Agora que sabes acerca das ramas que seguen remotos, podemos empezas a desvelar algo do misterio detrás do git push, fetch e pull. Imos atacar cun só comando dunha vez, pero os conceptos entre eles son moi semellantes.",
+ "",
+ "Vexamos primeiro `git push`. Xa aprendiches na lección sobre as ramas remotas que git determina o remoto *e* a rama á que empurrar mirando as propiedades da rama actual (o remoto ó que seguir). Este é o comportamento por defecto para cando non se especifican parámetros, pero git push toma, opcionalmente, parámetros da forma:",
+ "",
+ "`git push `",
+ "",
+ ""
+ ]
+ }
+ },
+ {
+ "type": "ModalAlert",
+ "options": {
+ "markdowns": [
+ "¿Qué será este parámetro ``, fixécheste esa pregunta? Xa imos entrar en detalle, pero primeiro un exemplo. Executa o comando:",
+ "",
+ "`git push origin master`",
+ "",
+ "tradúcese así ó galego:",
+ "",
+ "*Vai á rama chamada \"master\" no meu repositorio, colle tódolos commits, e despois vai á rama \"master\" do remoto chamado \"origin\". Aplica ahí tódolos commits que falten, e avísame cando remates.*",
+ "",
+ "Indicando `master` como o parámetro \"lugar\", dixémoslle a git ónde traer os commits, e ónde mandalos. É básicamente, o \"lugar\" ou \"ubicación\" que sincroniza entre ámbolos dous repositorios.",
+ "",
+ "Ten en conta que, como lle dixemos a git todo o que precisaba saber (indicando ambos parámetros), ¡ignora totalmente ónde andabamos neste momento!"
+ ]
+ }
+ },
+ {
+ "type": "GitDemonstrationView",
+ "options": {
+ "beforeMarkdowns": [
+ "Vexamos un exemplo especificando os parámetros. Nota ónde ficamos parados neste exemplo."
+ ],
+ "afterMarkdowns": [
+ "¡Ahí o tes! Actualizouse `master` no remoto, porque especificamos eses parámetros."
+ ],
+ "command": "git checkout C0; git push origin master",
+ "beforeCommand": "git clone; git commit"
+ }
+ },
+ {
+ "type": "GitDemonstrationView",
+ "options": {
+ "beforeMarkdowns": [
+ "¿E se non especificáramos os parámetros? ¿Que ocorrería?"
+ ],
+ "afterMarkdowns": [
+ "O comando falla (como podes ver), xa que `HEAD` non está sobre ningunha rama que siga algún remoto."
+ ],
+ "command": "git checkout C0; git push",
+ "beforeCommand": "git clone; git commit"
+ }
+ },
+ {
+ "type": "ModalAlert",
+ "options": {
+ "markdowns": [
+ "Ok. Para este nivel, actualiza tanto `foo` como `master` no remoto. O tema está en que ¡temos deshabilitado `git checkout` neste nivel!"
+ ]
+ }
+ }
+ ]
+ },
"zh_TW": {
"childViews": [
{
diff --git a/src/levels/remote/pushArgs2.js b/src/levels/remote/pushArgs2.js
index 8e15cf6f..bf464f5e 100644
--- a/src/levels/remote/pushArgs2.js
+++ b/src/levels/remote/pushArgs2.js
@@ -8,6 +8,7 @@ exports.level = {
"zh_TW": "git push 的參數,延伸討論!",
"es_AR": "¡Más! Parámetros de git push",
"pt_BR": "Parâmetros do git push -- expandido",
+ "gl" : "Parámetros de git push -- ampliado",
"de_DE": "Optionen für Git Push -- noch mehr!",
"ja" : "Git pushの引数 -- 拡張編!",
"fr_FR": "Arguments de git push -- toujours plus !",
@@ -21,6 +22,7 @@ exports.level = {
"zh_TW": "如果你失敗了,可以利用 \"show solution\" 來找到解答:P",
"es_AR": "Recordá que podés admitir tu derrota y tipear \"show solution\" para ver la solución :P",
"pt_BR": "Lembre-se que você pode admitir que foi derrotado e digitar \"show solution\" :P",
+ "gl" : "Lembrate que podes admitir que fuches derrotado e escribir \"show solution\" para amosala solución :P",
"de_DE": "Vergiss nicht dass du aufgeben kannst, indem du \"show solution\" eingibst :P",
"ja" : "降参して解説を見るには\"show solution\"を実行できるのをお忘れなく",
"fr_FR": "N'oubliez pas que vous pouvez toujours déclarer forfait avec \"show solution\" :P",
@@ -309,6 +311,76 @@ exports.level = {
}
]
},
+ "gl": {
+ "childViews": [
+ {
+ "type": "ModalAlert",
+ "options": {
+ "markdowns": [
+ "## Detalles sobre o parámetro ``",
+ "",
+ "Lémbrate da lección anterior cando especificamos `master` como o parámetro lugar de git push, especificamos tanto a *orixe* do que sacar os commits como o *destino* ó que envialos.",
+ "",
+ "Poderías estar a preguntarte ¿E se quixéramos que a orixe e o destino sexan distintos? ¿Se quixéramos empurrar os commits da rama local `foo` á rama `bar` do remoto?",
+ "",
+ "Bueno, esto non se pode facer en git... ¡Caramboliñas! Claro que se pode :D. git é extremadísimamente flexibe (case case que de máis).",
+ "",
+ "Vexamos cómo facelo a continuación..."
+ ]
+ }
+ },
+ {
+ "type": "ModalAlert",
+ "options": {
+ "markdowns": [
+ "Para especificar tanto a orixe como o destino de ``, sinxelamente úneos empregando dous puntos:",
+ "",
+ "`git push origin :`",
+ "",
+ "Esto pódeselle chamar refspec con dous puntos. Refspec é sinxelamente un nome cool para unha ubicación que git pode entender (como a rama `foo`, ou incluso `HEAD~1`)",
+ "",
+ "Unha vez que especificas a orixe e o destino independientemente, podes poñerte cómodo e preciso cos comandos remotos. ¡Vexamos a demo!"
+ ]
+ }
+ },
+ {
+ "type": "GitDemonstrationView",
+ "options": {
+ "beforeMarkdowns": [
+ "Lembra: `orixe` é calquera ubicación que git poida entender:"
+ ],
+ "afterMarkdowns": [
+ "¡Woow! Ese commando é unha tolemia, pero ten sentido: git resolveu `foo^` a unha ubicación, subiu calquera commit de ahí que aún non estivera no remoto, e logo actualizou o destino."
+ ],
+ "command": "git push origin foo^:master",
+ "beforeCommand": "git clone; go -b foo; git commit; git commit"
+ }
+ },
+ {
+ "type": "GitDemonstrationView",
+ "options": {
+ "beforeMarkdowns": [
+ "¿E qué hai se o destino ó que queres empurrar non existise? ¡Non pasa nada! Sinxelamente dalle un nome á rama e git vaise encargar de crealo no remoto."
+ ],
+ "afterMarkdowns": [
+ "Xenial, sinxelamente tira para adiante"
+ ],
+ "command": "git push origin master:newBranch",
+ "beforeCommand": "git clone; git commit"
+ }
+ },
+ {
+ "type": "ModalAlert",
+ "options": {
+ "markdowns": [
+ "Para este nivel, intenta chegar o obxectivo final, e lembrate do formato:",
+ "",
+ "`:`"
+ ]
+ }
+ }
+ ]
+ },
"zh_TW": {
"childViews": [
{
diff --git a/src/levels/remote/pushManyFeatures.js b/src/levels/remote/pushManyFeatures.js
index da1742ae..3069169a 100644
--- a/src/levels/remote/pushManyFeatures.js
+++ b/src/levels/remote/pushManyFeatures.js
@@ -8,6 +8,7 @@ exports.level = {
"zh_TW": "你隨時都可以使用 undo 或 reset 指令。",
"es_AR": "Acordate que siempre podés usar los comandos reset y undo",
"pt_BR": "Lembre-se que você sempre pode usar undo ou reset",
+ "gl" : "Lembra que sempre podes usar undo ou reset",
"de_DE": "Denk dran, du kannst immer undo oder reset benutzen, um deine Befehle zurück zu nehmen.",
"ja" : "undoやresetコマンドをいつでも使用することができるのをお忘れなく",
"fr_FR": "Rappelez-vous que vous pouvez toujours utiliser les commandes undo et reset.",
@@ -21,6 +22,7 @@ exports.level = {
"zh_TW": "push master!",
"es_AR": "¡Push Master!",
"pt_BR": "Push Master!",
+ "gl" : "Empurra ó Master!",
"de_DE": "Push Master!",
"ja" : "Push Master!",
"fr_FR": "Maître du push !",
@@ -242,6 +244,59 @@ exports.level = {
}
]
},
+ "gl": {
+ "childViews": [
+ {
+ "type": "ModalAlert",
+ "options": {
+ "markdowns": [
+ "## Mesturando ramas",
+ "",
+ "Agora que estás afeito a descargar, mesturar e empurrar, poñamos a proba estas habilidades cun novo fluxo de traballo.",
+ "",
+ "É bastante común que os desenvolvedores nos grandes proxectos traballen sobre ramas específicas para cada tarefa (feature branches) baseadas en `mater`, e que as integren só cando están preparadas. Esto é similar á lección anterior, na que empurrábamos as ramas periféricas ó remoto, pero acá temos un paso máis.",
+ "",
+ "Algúns desenvovledores só empurran e descargan cando están en `master`: de ese xeito, `master` sempre mantén actualizado o seu estado co remoto (`o/master`).",
+ "",
+ "Entón, neste fluxo de traballo combinamos dúas cousas:",
+ "",
+ "* integramos o traballo das ramas específicas a `master`, e",
+ "* empurramos e turramos do remoto"
+ ]
+ }
+ },
+ {
+ "type": "GitDemonstrationView",
+ "options": {
+ "beforeMarkdowns": [
+ "Refresquemos un pouco cómo actualizar `master` e empurrar o noso traballo."
+ ],
+ "afterMarkdowns": [
+ "Agora executamos dous comandos que:",
+ "",
+ "* rebasamos o noso traballo sobre os novos commits do remoto, e",
+ "* publicamos o noso traballo nese remoto"
+ ],
+ "command": "git pull --rebase; git push",
+ "beforeCommand": "git clone; git commit; git fakeTeamwork"
+ }
+ },
+ {
+ "type": "ModalAlert",
+ "options": {
+ "markdowns": [
+ "Este nivel é bastante pesado. Aquí tes algúns patróns para resolvelo:",
+ "",
+ "* Temos tres ramas específicas -- `side1` `side2` e `side3`",
+ "* Queremos empurrar cada unha de esas ramas, en orde, ó remoto",
+ "* O remoto foi actualizado, así que imos ter que integrar eses cambios tamén",
+ "",
+ ":O ¡Intenso! ¡Éxitos! Completar este nivel representa un grande avance."
+ ]
+ }
+ }
+ ]
+ },
"zh_TW": {
"childViews": [
{
diff --git a/src/levels/remote/remoteBranches.js b/src/levels/remote/remoteBranches.js
index 37ef477d..1196c57a 100644
--- a/src/levels/remote/remoteBranches.js
+++ b/src/levels/remote/remoteBranches.js
@@ -8,6 +8,7 @@ exports.level = {
"zh_TW": "remote branch (遠端分支)",
"es_AR": "Ramas remotas",
"pt_BR": "Ramos remotos",
+ "gl" : "Ramas remotas",
"de_DE": "Branches auf entfernten Servern",
"ja" : "リモートのブランチ",
"fr_FR": "Les branches distantes",
@@ -21,6 +22,7 @@ exports.level = {
"zh_TW": "注意順序的問題喔!先在 master branch 上面送 commit",
"es_AR": "Prestá atención al orden: ¡commiteá sobre master primero!",
"pt_BR": "Preste atenção na ordem: commite no master primeiro!",
+ "gl" : "Preta atención á orde: fai commit no master primeiro",
"de_DE": "Beachte die Sortierung -- committe zuerst auf dem master!",
"ja" : "順番に注意 -- まずmasterに対してcommitしましょう",
"fr_FR": "Prêtez attention à l'ordre -- les commits sur master d'abord !",
@@ -273,6 +275,68 @@ exports.level = {
}
]
},
+ "gl": {
+ "childViews": [
+ {
+ "type": "ModalAlert",
+ "options": {
+ "markdowns": [
+ "## Ramas remotas de git",
+ "",
+ "Agora que viches `git clone` en acción, mergullémonos no que realmente mudou.",
+ "",
+ "O primeiro que notarías é que apareceu unha nova rama no teu repositorio local chamada `o/master`. A este tipo de ramas chámaselle ramas _remotas_. As ramas remotas teñén propiedades especiais porque serven para un propósito específico.",
+ "",
+ "As ramas remotas reflexan o _estado_ dos repositorios remotos (como estaban á última vez que falaches con eles). Axúdante a entender as diferencias entre o teu traballo local e o teu traballo que xa está publicado - un paso crítico antes de compartir o teu traballo cos demáis.",
+ uU
+ "",
+ "As ramas remotas teñen a propiedade especial de que cando fas checkout, pasas o modo detached `HEAD`. Git faino a drede porque non podes traballar nesas ramas directamente: tes que traballar nalgún outro lado e despois compartir o teu traballo co remoto (tras o que as túas ramas remotas actualizaranse)."
+ ]
+ }
+ },
+ {
+ "type": "ModalAlert",
+ "options": {
+ "markdowns": [
+ "### ¿Qué é `o/`?",
+ "",
+ "Poderías estar a preguntarte qué significa ese `o/` ó principio das ramas remotas. Bueno, as ramas remotas tamén teñen unha convención de nomes obligatoria -- se as amosas co formato:",
+ "",
+ "* `/`",
+ "",
+ "Entonces, se miras unha rama chamada `o/master`, o nome da rama é `master`, e o nome do remoto é `o`.",
+ "",
+ "A maioría dos desenvolvedores chaman `origin` ó seu remoto no lugar de `o`. Esto é tan común que git efectivamente crea o teu remoto chamandoo `origin` cando fas `git clone` dun repositorio.",
+ "",
+ "Desafortunadamente o nome `origin` completo non entra na nosa UI, así que empregaremos `o` para acortar: (Sinxelamente recorda que cando uses git na vida real, o teu remote ¡probablemente se chame `origin`!)",
+ "",
+ "Hai moito para procesar, así que vexámolo en acción."
+ ]
+ }
+ },
+ {
+ "type": "GitDemonstrationView",
+ "options": {
+ "beforeMarkdowns": [
+ "Fagamos checkout a unha rama remota a ver qué pasa"
+ ],
+ "afterMarkdowns": [
+ "Como ves, git púxonos no modo detached `HEAD` e non actualizou `o/mater` cando creamos un novo commit. Esto é porque `o/mater` só vai actualizarse cando o remoto se actualice."
+ ],
+ "command": "git checkout o/master; git commit",
+ "beforeCommand": "git clone"
+ }
+ },
+ {
+ "type": "ModalAlert",
+ "options": {
+ "markdowns": [
+ "Para completar este nivel, fai commit unha vez sobre `mater` e despois de facer o checkout a `o/master`. Esto vaite axudar a entender cómo funcionan as ramas remotas, e que só se actualizan para reflexar o estado do remoto."
+ ]
+ }
+ }
+ ]
+ },
"zh_TW": {
"childViews": [
{
diff --git a/src/levels/remote/sourceNothing.js b/src/levels/remote/sourceNothing.js
index 40899640..d94359be 100644
--- a/src/levels/remote/sourceNothing.js
+++ b/src/levels/remote/sourceNothing.js
@@ -8,6 +8,7 @@ exports.level = {
"zh_TW": "沒有 source",
"es_AR": "Origen de nada",
"pt_BR": "Origem vazia",
+ "gl" : "Orixen de nada",
"de_DE": "Die Quelle des Nichts",
"ja" : "無のsource",
"fr_FR": "Source de rien du tout",
@@ -21,6 +22,7 @@ exports.level = {
"zh_TW": "在本關卡中,不允許使用 branch 指令,因此你只能使用 fetch!",
"es_AR": "El comando branch está deshabilitado para este nivel, así que ¡vas a tener que usar fetch!",
"pt_BR": "O comando branch está desabilitado para este nível, então você terá de usar o fetch!",
+ "gl" : "O comando branch está deshabilitado para este nivel, entón terás que empregar o comando fetch!",
"de_DE": "Der branch Befehl ist für diesen Level inaktiv, du musst also fetch benutzen",
"ja" : "このレベルではbranchコマンドが無効になっているのでfetchを使うしかない!",
"fr_FR": "La commande branch est désactivée pour ce niveau, vous devrez donc utiliser fetch !",
@@ -241,6 +243,59 @@ exports.level = {
}
]
},
+ "gl": {
+ "childViews": [
+ {
+ "type": "ModalAlert",
+ "options": {
+ "markdowns": [
+ "### Rarezas do ``",
+ "",
+ "Git abusa do parámetro `` de dúas maneiras extranas. Estos dous abusos veñen do feito de que técnicamente podes especificar \"á nada\" como un `orixe` válido tanto para git push como para git fetch. O modo de especificar a nada é a través dun parámetro vacío:",
+ "",
+ "* `git push origin :side`",
+ "* `git fetch origin :bugFix`",
+ "",
+ "Vexamos qué fan..."
+ ]
+ }
+ },
+ {
+ "type": "GitDemonstrationView",
+ "options": {
+ "beforeMarkdowns": [
+ "¿Qué fai cando se empurra a \"nada\" a unha rama remota? ¡Eliminaa!"
+ ],
+ "afterMarkdowns": [
+ "Ahí está, borramos a rama `foo` exitosamente do remoto empurrando o concepto da \"nada\". Ten algo de sentido..."
+ ],
+ "command": "git push origin :foo",
+ "beforeCommand": "git clone; git push origin master:foo"
+ }
+ },
+ {
+ "type": "GitDemonstrationView",
+ "options": {
+ "beforeMarkdowns": [
+ "Finalmente, descargar a \"nada\" a un lugar local na realidade crea unha nova rama"
+ ],
+ "afterMarkdowns": [
+ "Bastante bizarro, pero, meh, da igual. Así é git."
+ ],
+ "command": "git fetch origin :bar",
+ "beforeCommand": "git clone"
+ }
+ },
+ {
+ "type": "ModalAlert",
+ "options": {
+ "markdowns": [
+ "Este é un nivel rápido: simplemente borra unha rama remota e crea unha nova empregando `git fetch` para completalo."
+ ]
+ }
+ }
+ ]
+ },
"zh_TW": {
"childViews": [
{
diff --git a/src/levels/remote/tracking.js b/src/levels/remote/tracking.js
index 150e8956..1928e943 100644
--- a/src/levels/remote/tracking.js
+++ b/src/levels/remote/tracking.js
@@ -8,6 +8,7 @@ exports.level = {
"zh_TW": "remote tracking",
"es_AR": "Trackeando remotos",
"pt_BR": "Seguindo remotos",
+ "gl" : "Traceando os remotos",
"de_DE": "Remote Tracking",
"ja" : "リモートのトラッキング",
"fr_FR": "Suivi de branche distante",
@@ -21,6 +22,7 @@ exports.level = {
"zh_TW": "記住喔,有兩個方式可以去設定 remote tracking",
"es_AR": "¡Acordate de que hay dos formas de trackear un remoto!",
"pt_BR": "Lembre-se que há duas formas de seguir um ramo remoto!",
+ "gl" : "¡Lembrate de que hai dúas formas de seguir unha rama remota!",
"de_DE": "Nicht vergessen, es gibt zwei Arten Remote Tracking einzurichten!",
"ja" : "リモートトラッキングを設定する方法が二つあるのをお忘れなく!",
"fr_FR": "Rappelez-vous qu'il existe deux façons de configurer le suivi de branche distante !",
@@ -503,6 +505,126 @@ exports.level = {
}
]
},
+ "gl": {
+ "childViews": [
+ {
+ "type": "ModalAlert",
+ "options": {
+ "markdowns": [
+ "### Ramas que trackean os remotos",
+ "",
+ "Unha das cousas que poden semellar \"máxicas\" das últimas leccións é que git sabía que a rama `master` estaba relacionada co `o/master`. Obviamente, estas ramas teñen nomes semellantes, e podería semellar lóxico conectar a rama `master` do remoto ca rama `master` local, pero esta conexión é ben evidente nos dous escenarios:",
+ "",
+ "* Durante unha operación de pull, os commits descarganse ó `o/master` e logo *mesturanse* á rama `master`. O obxectivo implícito do merge determinase con esta conexión.",
+ "* Durante un push, o traballo da rama `master` súbese á rama `master` do remoto (que estaba representada localmente por `o/master`). O *destino* do push determinouse con esta conexión entre `master` e `o/master`.",
+ ""
+ ]
+ }
+ },
+ {
+ "type": "ModalAlert",
+ "options": {
+ "markdowns": [
+ "## Trackeando remotos",
+ "",
+ "Facéndoa curta, esta conexión entre `master` e `o/master` ensínase pola propiedade de \"trackear (seguir) remotos\" das ramas. A rama `master` está configurada para trackear `o/master` -- o que quere dicir, que hai un obxectivo implícito para o merge e un destino implícito para a rama `master`.",
+ "",
+ "Poderías estar pensando cómo esa propiedade apareceu na túa rama `master` se ti non executaches ningún comando para especificalo. Bueno, cando clonas un repositorio co git, esta propiedade asignase por ti automáticamente.",
+ "",
+ "Durante un clone, git crea unha rama remota por cada rama no remoto (por exemplo, ramas como `o/master`). Pero despois crea unha rama local que trakea a rama activa do remoto, que habitúa ser `master`.",
+ "",
+ "Una vez completado o git clone, só tés unha única rama local (para que non te asustes) pero podes ver todalas ramas que do remoto (se fora tan curioso). ¡É o mellor de ámbolos dous mundos!",
+ "",
+ "Esto tamén explica por qué poderías ver unha mensaxe como este durante a clonación:",
+ "",
+ " local branch \"master\" set to track remote branch \"o/master\"",
+ "",
+ " rama local \"master\" establecida para trackear a rama remota \"o/master\""
+ ]
+ }
+ },
+ {
+ "type": "ModalAlert",
+ "options": {
+ "markdowns": [
+ "### ¿Podo especificalo eu?",
+ "",
+ "¡Claro que sí! Podes facer que calquera rama que quixeras seguir `o/master`, e se o fixeras, esa rama vai ter o mesmo destino implícito de push e obxectivo implícito de merge que `master`. Eso significa que podes executar `git push` nunha rama chamada `nonMaster` e ¡que o teu traballo se empurre á rama `master` do remoto!",
+ "",
+ "Hai dúas formas de establecer esta propiedade. A primeira é facer checkout a unha nova rama empregando unha rama remota como a referencia especificada. Executar",
+ "",
+ "`git checkout -b nonMaster o/master`",
+ "",
+ "Crea unha nova rama chamada `nonMaster` e persigue a `o/master`."
+ ]
+ }
+ },
+ {
+ "type": "GitDemonstrationView",
+ "options": {
+ "beforeMarkdowns": [
+ "Suficiente charla, ¡vexamos unha demo! Imos facer checkout a unha nova rama chamada `foo` e facer que siga a `master` no remoto."
+ ],
+ "afterMarkdowns": [
+ "Como podes ver, empregamos o obxectivo implícito de merge `o/master` para actualizar a rama `foo`. ¡Nota como `master` non foi actualizada!"
+ ],
+ "command": "git checkout -b foo o/master; git pull",
+ "beforeCommand": "git clone; git fakeTeamwork"
+ }
+ },
+ {
+ "type": "GitDemonstrationView",
+ "options": {
+ "beforeMarkdowns": [
+ "O mismo aplica para git push"
+ ],
+ "afterMarkdowns": [
+ "Boom. Empurramos o noso traballo á rama `master` do remoto incluso cando a nosa rama se chamaba totalmete distinto"
+ ],
+ "command": "git checkout -b foo o/master; git commit; git push",
+ "beforeCommand": "git clone"
+ }
+ },
+ {
+ "type": "ModalAlert",
+ "options": {
+ "markdowns": [
+ "### Forma número 2",
+ "",
+ "Outra forma de especificar a rama a seguir é usar a opción `git branch -u`. Executando",
+ "",
+ "`git branch -u o/master foo`",
+ "",
+ "establecemos que a rama `foo` segue a `o/mater`. Se por riba estás parado en `foo`, incluso podes obvialo:",
+ "",
+ "`git branch -u o/master`",
+ ""
+ ]
+ }
+ },
+ {
+ "type": "GitDemonstrationView",
+ "options": {
+ "beforeMarkdowns": [
+ "Vexamos rápidamente está outra forma de especificar a rama a seguir..."
+ ],
+ "afterMarkdowns": [
+ "O mesmo que antes, só que un comando bastante máis explícito. ¡Unha cousa preciosa!"
+ ],
+ "command": "git branch -u o/master foo; git commit; git push",
+ "beforeCommand": "git clone; git checkout -b foo"
+ }
+ },
+ {
+ "type": "ModalAlert",
+ "options": {
+ "markdowns": [
+ "¡Ok! Para este nivel, empurra o teu traballo á rama `master` do remoto *sen* estar parado sobre `master` localmente. Déixote que te decates do resto ti só, que para algo estás nun nivel avanzado :P"
+ ]
+ }
+ }
+ ]
+ },
"zh_TW": {
"childViews": [
{
From cfa547de92fb36e93ae215e4f4e3048b788713f2 Mon Sep 17 00:00:00 2001
From: Prou Yann
Date: Tue, 12 Mar 2019 16:47:03 +0100
Subject: [PATCH 073/359] Fix: file remoteBranches.js
---
src/levels/remote/remoteBranches.js | 1 -
1 file changed, 1 deletion(-)
diff --git a/src/levels/remote/remoteBranches.js b/src/levels/remote/remoteBranches.js
index 1196c57a..82f630cf 100644
--- a/src/levels/remote/remoteBranches.js
+++ b/src/levels/remote/remoteBranches.js
@@ -288,7 +288,6 @@ exports.level = {
"O primeiro que notarías é que apareceu unha nova rama no teu repositorio local chamada `o/master`. A este tipo de ramas chámaselle ramas _remotas_. As ramas remotas teñén propiedades especiais porque serven para un propósito específico.",
"",
"As ramas remotas reflexan o _estado_ dos repositorios remotos (como estaban á última vez que falaches con eles). Axúdante a entender as diferencias entre o teu traballo local e o teu traballo que xa está publicado - un paso crítico antes de compartir o teu traballo cos demáis.",
- uU
"",
"As ramas remotas teñen a propiedade especial de que cando fas checkout, pasas o modo detached `HEAD`. Git faino a drede porque non podes traballar nesas ramas directamente: tes que traballar nalgún outro lado e despois compartir o teu traballo co remoto (tras o que as túas ramas remotas actualizaranse)."
]
From f097d7be0e6740df46481c1b45fa56052339f568 Mon Sep 17 00:00:00 2001
From: Peter Cottle
Date: Fri, 22 Mar 2019 14:25:23 -0700
Subject: [PATCH 074/359] Resolves #554
---
src/levels/intro/merging.js | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/src/levels/intro/merging.js b/src/levels/intro/merging.js
index 4e69ba24..894501ff 100644
--- a/src/levels/intro/merging.js
+++ b/src/levels/intro/merging.js
@@ -849,7 +849,7 @@ exports.level = {
"Щоб пройти цей рівень виконай наступні кроки:",
"",
"* Зроби нову гілку (branch) з назвою `bugFix`",
- "* Перейди на кілку `bugFix` за допомогою `git checkout bugFix`",
+ "* Перейди на гілку `bugFix` за допомогою `git checkout bugFix`",
"* Зроби один коміт",
"* Повернись до `master` за допомогою `git checkout`",
"* Зроби ще один коміт",
From 699898debf009958f18ea1b8a3c78a8abe84253a Mon Sep 17 00:00:00 2001
From: Hongarc
Date: Sat, 6 Apr 2019 00:26:15 +0700
Subject: [PATCH 075/359] Update `grunt` version
Fix error can't find `grunt`
---
package.json | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/package.json b/package.json
index 8f1b0254..f44d5db0 100644
--- a/package.json
+++ b/package.json
@@ -14,7 +14,7 @@
},
"devDependencies": {
"browserify": "^13.0.0",
- "grunt": "~0.4.2",
+ "grunt": "^1.0.4",
"grunt-browserify": "^4.0.1",
"grunt-contrib-clean": "~0.5.0",
"grunt-contrib-jshint": "~0.7.2",
From 8c3966ed480ee44e1d0db8d38db7281152861245 Mon Sep 17 00:00:00 2001
From: Peter Cottle
Date: Tue, 9 Apr 2019 17:23:00 -0700
Subject: [PATCH 076/359] Resolves #557 -- add contributor faces
---
README.md | 34 ++++++++++++++++++++++++++++++++++
package.json | 1 +
2 files changed, 35 insertions(+)
diff --git a/README.md b/README.md
index 8e9a6cd1..5c287241 100644
--- a/README.md
+++ b/README.md
@@ -100,6 +100,40 @@ git push
Alternatively, you can also build and run the app in a pre-configured online workspace:
[](https://gitpod.io/#https://github.com/pcottle/learnGitBranching/blob/master/src/js/git/index.js)
+[//]: contributor-faces
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+[//]: contributor-faces
## Helpful Folks
A big shoutout to these brave souls for extensively testing our sandbox and finding bugs and/or inconsistencies:
diff --git a/package.json b/package.json
index f44d5db0..936132b9 100644
--- a/package.json
+++ b/package.json
@@ -30,6 +30,7 @@
},
"dependencies": {
"backbone": "~1.1.2",
+ "contributor-faces": "^1.0.2",
"flux": "^2.0.1",
"markdown": "~0.4.0",
"q": "~0.8.11",
From a44b5d5af57f2f0546e32bd1e8b5eb3e55bed17e Mon Sep 17 00:00:00 2001
From: Hongarc
Date: Wed, 10 Apr 2019 10:31:36 +0700
Subject: [PATCH 077/359] fix(readme): hide comment in README.md
---
README.md | 1 +
1 file changed, 1 insertion(+)
diff --git a/README.md b/README.md
index 5c287241..a73d7215 100644
--- a/README.md
+++ b/README.md
@@ -100,6 +100,7 @@ git push
Alternatively, you can also build and run the app in a pre-configured online workspace:
[](https://gitpod.io/#https://github.com/pcottle/learnGitBranching/blob/master/src/js/git/index.js)
+
[//]: contributor-faces
From 135730b662b6152c32e2e38b63541f0bbe070b37 Mon Sep 17 00:00:00 2001
From: Hongarc
Date: Wed, 10 Apr 2019 11:20:25 +0700
Subject: [PATCH 078/359] chore(deps): `contributor-faces` to `devDepen`
`contributor-faces` is a package to build `README.md`, not require in code so we need to change it from `dependencies` to `devDependencies`
---
package.json | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/package.json b/package.json
index 936132b9..54f69cec 100644
--- a/package.json
+++ b/package.json
@@ -14,6 +14,7 @@
},
"devDependencies": {
"browserify": "^13.0.0",
+ "contributor-faces": "^1.0.2",
"grunt": "^1.0.4",
"grunt-browserify": "^4.0.1",
"grunt-contrib-clean": "~0.5.0",
@@ -30,7 +31,6 @@
},
"dependencies": {
"backbone": "~1.1.2",
- "contributor-faces": "^1.0.2",
"flux": "^2.0.1",
"markdown": "~0.4.0",
"q": "~0.8.11",
From 0a9fe8a89f248746d544de25c1bbc0505c693d50 Mon Sep 17 00:00:00 2001
From: Hongarc
Date: Wed, 10 Apr 2019 11:23:38 +0700
Subject: [PATCH 079/359] chore(readme): remove blamk line
This line will be removed by `contributor-faces`
---
README.md | 1 -
1 file changed, 1 deletion(-)
diff --git a/README.md b/README.md
index a73d7215..9c187699 100644
--- a/README.md
+++ b/README.md
@@ -102,7 +102,6 @@ Alternatively, you can also build and run the app in a pre-configured online wor
[](https://gitpod.io/#https://github.com/pcottle/learnGitBranching/blob/master/src/js/git/index.js)
[//]: contributor-faces
-
From 428be3e2f8aa57fd229348cc6cad897ff26d6716 Mon Sep 17 00:00:00 2001
From: Hongarc
Date: Wed, 10 Apr 2019 23:18:01 +0700
Subject: [PATCH 080/359] remove Node.js v7 in travis-ci
This project uses `contributor-faces`, it includes `gh-got`.
And `gh-got` require Node v8 so `travis-ci` will have the error.
So I have 2 option:
- Remove Nodejs v7 in `.travis.yml`
- Or install `contributor-faces` in your machine(require Node >= 8) and sometime run `contributor-faces .` in your project to update list contributor.
---
.travis.yml | 1 -
1 file changed, 1 deletion(-)
diff --git a/.travis.yml b/.travis.yml
index 4412d1ed..55656971 100644
--- a/.travis.yml
+++ b/.travis.yml
@@ -3,7 +3,6 @@ language: node_js
node_js:
- "10"
- "8"
- - "7"
before_install:
- curl -o- -L https://yarnpkg.com/install.sh | bash
- export PATH="$HOME/.yarn/bin:$PATH"
From 638a711c4d5bfd49fb9b7fa42222ccd122f278e6 Mon Sep 17 00:00:00 2001
From: Hongarc
Date: Sat, 13 Apr 2019 09:31:07 +0700
Subject: [PATCH 081/359] use `every` instead of _.uniq
Array.every is better for check all pass
---
src/js/graph/treeCompare.js | 8 +++-----
1 file changed, 3 insertions(+), 5 deletions(-)
diff --git a/src/js/graph/treeCompare.js b/src/js/graph/treeCompare.js
index 9b37bc60..ad3324f4 100644
--- a/src/js/graph/treeCompare.js
+++ b/src/js/graph/treeCompare.js
@@ -98,11 +98,9 @@ TreeCompare.compareAllBranchesWithinTrees = function(treeA, treeB) {
treeB.branches
);
- var result = true;
- _.uniq(allBranches, function(info, branch) {
- result = result && this.compareBranchWithinTrees(treeA, treeB, branch);
- }, this);
- return result;
+ return Object.keys(allBranches).every(function(branch) {
+ return this.compareBranchWithinTrees(treeA, treeB, branch);
+ }.bind(this));
};
TreeCompare.compareAllTagsWithinTrees = function(treeA, treeB) {
From 39457f14ba88a64d3b78709dbef23f3f291fe754 Mon Sep 17 00:00:00 2001
From: Hongarc
Date: Sat, 13 Apr 2019 09:37:25 +0700
Subject: [PATCH 082/359] remove unused `underscore`
---
src/js/stores/LevelStore.js | 2 --
1 file changed, 2 deletions(-)
diff --git a/src/js/stores/LevelStore.js b/src/js/stores/LevelStore.js
index c5e1a7ba..57ce98f8 100644
--- a/src/js/stores/LevelStore.js
+++ b/src/js/stores/LevelStore.js
@@ -3,8 +3,6 @@
var AppConstants = require('../constants/AppConstants');
var AppDispatcher = require('../dispatcher/AppDispatcher');
var EventEmitter = require('events').EventEmitter;
-
-var _ = require('underscore');
var assign = require('object-assign');
var levelSequences = require('../../levels').levelSequences;
var sequenceInfo = require('../../levels').sequenceInfo;
From d4a2fbb2de7c289ad79a134bfe1099ac4e1c4f05 Mon Sep 17 00:00:00 2001
From: David Nelson
Date: Thu, 18 Apr 2019 14:51:14 -0500
Subject: [PATCH 083/359] Explicitly fail when unsupported range operator is
specified
---
__tests__/git.spec.js | 7 +++++++
src/js/git/index.js | 2 +-
2 files changed, 8 insertions(+), 1 deletion(-)
diff --git a/__tests__/git.spec.js b/__tests__/git.spec.js
index 656d197e..6b7c8ece 100644
--- a/__tests__/git.spec.js
+++ b/__tests__/git.spec.js
@@ -142,6 +142,13 @@ describe('Git', function() {
);
});
+ it('Range operator is not supported', function() {
+ expectTreeAsync(
+ 'git checkout -b side C0; git cherry-pick C1..C0',
+ '{"branches":{"master":{"target": "C1","id": "master"},"side":{"target":"C0","id": "side"}},"commits":{"C0":{"parents":[],"id": "C0","rootCommit": true},"C1":{"parents":["C0"],"id": "C1"}},"HEAD":{"id": "HEAD","target":"side"}}'
+ );
+ });
+
it('Forces branches', function() {
expectTreeAsync(
'git checkout -b side; git branch -f side C0',
diff --git a/src/js/git/index.js b/src/js/git/index.js
index d03a2075..dcac6ea9 100644
--- a/src/js/git/index.js
+++ b/src/js/git/index.js
@@ -1665,7 +1665,7 @@ GitEngine.prototype.resolveStringRef = function(ref) {
// Attempt to split ref string into a reference and a string of ~ and ^ modifiers.
var startRef = null;
var relative = null;
- var regex = /^([a-zA-Z0-9]+)(([~\^]\d*)*)/;
+ var regex = /^([a-zA-Z0-9]+)(([~\^]\d*)*)$/;
var matches = regex.exec(ref);
if (matches) {
startRef = matches[1];
From 6e5d6a64e99d6e580471199279e5dfd55e791f10 Mon Sep 17 00:00:00 2001
From: David Nelson
Date: Thu, 18 Apr 2019 17:55:02 -0500
Subject: [PATCH 084/359] Add tests for currently supported log arguments
---
__tests__/base.js | 26 +++++++++++++++++++++++++-
__tests__/git.spec.js | 40 ++++++++++++++++++++++++++++++++++++++++
src/js/git/headless.js | 5 ++++-
3 files changed, 69 insertions(+), 2 deletions(-)
diff --git a/__tests__/base.js b/__tests__/base.js
index 76a6ec7f..ba3cf434 100644
--- a/__tests__/base.js
+++ b/__tests__/base.js
@@ -1,3 +1,5 @@
+var Q = require('q');
+
var HeadlessGit = require('../src/js/git/headless').HeadlessGit;
var TreeCompare = require('../src/js/graph/treeCompare.js');
@@ -95,6 +97,27 @@ var expectLevelSolved = function(levelBlob) {
expectLevelAsync(headless, levelBlob);
};
+var runCommand = function(command, resultHandler) {
+ var headless = new HeadlessGit();
+ var deferred = Q.defer();
+ var msg = null;
+
+ deferred.promise.then(function(commands) {
+ msg = commands[commands.length - 1].get('error').get('msg');
+ });
+
+ runs(function() {
+ headless.sendCommand(command, deferred);
+ });
+ waitsFor(function() {
+ if(null == msg) {
+ return false;
+ }
+ resultHandler(msg);
+ return true;
+ }, 'commands should be finished', 500);
+};
+
var TIME = 150;
// useful for throwing garbage and then expecting one commit
var ONE_COMMIT_TREE = '{"branches":{"master":{"target":"C2","id":"master"}},"commits":{"C0":{"parents":[],"id":"C0","rootCommit":true},"C1":{"parents":["C0"],"id":"C1"},"C2":{"parents":["C1"],"id":"C2"}},"HEAD":{"target":"master","id":"HEAD"}}';
@@ -105,6 +128,7 @@ module.exports = {
TIME: TIME,
expectTreeAsync: expectTreeAsync,
expectLevelSolved: expectLevelSolved,
- ONE_COMMIT_TREE: ONE_COMMIT_TREE
+ ONE_COMMIT_TREE: ONE_COMMIT_TREE,
+ runCommand: runCommand
};
diff --git a/__tests__/git.spec.js b/__tests__/git.spec.js
index 656d197e..810f4e9f 100644
--- a/__tests__/git.spec.js
+++ b/__tests__/git.spec.js
@@ -1,5 +1,6 @@
var base = require('./base');
var expectTreeAsync = base.expectTreeAsync;
+var runCommand = base.runCommand;
describe('Git', function() {
it('Commits', function() {
@@ -275,4 +276,43 @@ describe('Git', function() {
);
});
+ describe('Log supports', function() {
+ var SETUP = 'git co -b left C0; gc; git merge master; git co -b right C0; gc; git merge master; git co -b all left; git merge right; ';
+
+ it('implied HEAD', function() {
+ runCommand(SETUP + '; git co right; git log', function(commandMsg) {
+ expect(commandMsg).toContain('Commit: C0\n');
+ expect(commandMsg).toContain('Commit: C1\n');
+ expect(commandMsg).not.toContain('Commit: C2\n');
+ expect(commandMsg).not.toContain('Commit: C3\n');
+ expect(commandMsg).toContain('Commit: C4\n');
+ expect(commandMsg).toContain('Commit: C5\n');
+ expect(commandMsg).not.toContain('Commit: C6\n');
+ });
+ });
+
+ it('single included revision', function() {
+ runCommand(SETUP + 'git log right', function(commandMsg) {
+ expect(commandMsg).toContain('Commit: C0\n');
+ expect(commandMsg).toContain('Commit: C1\n');
+ expect(commandMsg).not.toContain('Commit: C2\n');
+ expect(commandMsg).not.toContain('Commit: C3\n');
+ expect(commandMsg).toContain('Commit: C4\n');
+ expect(commandMsg).toContain('Commit: C5\n');
+ expect(commandMsg).not.toContain('Commit: C6\n');
+ });
+ });
+
+ it('single excluded revision', function() {
+ runCommand(SETUP + 'git log all ^right', function(commandMsg) {
+ expect(commandMsg).not.toContain('Commit: C0\n');
+ expect(commandMsg).not.toContain('Commit: C1\n');
+ expect(commandMsg).toContain('Commit: C2\n');
+ expect(commandMsg).toContain('Commit: C3\n');
+ expect(commandMsg).not.toContain('Commit: C4\n');
+ expect(commandMsg).not.toContain('Commit: C5\n');
+ expect(commandMsg).toContain('Commit: C6\n');
+ });
+ });
+ });
});
diff --git a/src/js/git/headless.js b/src/js/git/headless.js
index a82081b9..f2b2c0bc 100644
--- a/src/js/git/headless.js
+++ b/src/js/git/headless.js
@@ -109,6 +109,8 @@ HeadlessGit.prototype.sendCommand = function(value, entireCommandPromise) {
var chain = deferred.promise;
var startTime = new Date().getTime();
+ var commands = [];
+
util.splitTextCommand(value, function(commandStr) {
chain = chain.then(function() {
var commandObj = new Command({
@@ -117,6 +119,7 @@ HeadlessGit.prototype.sendCommand = function(value, entireCommandPromise) {
var thisDeferred = Q.defer();
this.gitEngine.dispatch(commandObj, thisDeferred);
+ commands.push(commandObj);
return thisDeferred.promise;
}.bind(this));
}, this);
@@ -124,7 +127,7 @@ HeadlessGit.prototype.sendCommand = function(value, entireCommandPromise) {
chain.then(function() {
var nowTime = new Date().getTime();
if (entireCommandPromise) {
- entireCommandPromise.resolve();
+ entireCommandPromise.resolve(commands);
}
});
From 8529a3aac76eece97f7dc0ebbf86152ae26ccfbb Mon Sep 17 00:00:00 2001
From: David Nelson
Date: Thu, 18 Apr 2019 20:57:06 -0500
Subject: [PATCH 085/359] Implement rev-list
This commit introduces the RevisionRange, which more closely follows real git
in terms of identifying a range of revisions than the current implementation of
log. RevisionRange is being used in the new rev-list command first because it
is easy to test for ordering. A future commit will replace the existing
implementation of log with RevisionRange.
---
__tests__/git.spec.js | 37 ++++++++++++++++++++
src/js/git/commands.js | 12 +++++++
src/js/git/index.js | 79 ++++++++++++++++++++++++++++++++++++++++++
3 files changed, 128 insertions(+)
diff --git a/__tests__/git.spec.js b/__tests__/git.spec.js
index 810f4e9f..73c46a82 100644
--- a/__tests__/git.spec.js
+++ b/__tests__/git.spec.js
@@ -276,6 +276,43 @@ describe('Git', function() {
);
});
+ describe('RevList', function() {
+
+ it('requires at least 1 argument', function() {
+ runCommand('git rev-list', function(commandMsg) {
+ expect(commandMsg).toContain('at least 1');
+ });
+ });
+
+ describe('supports', function() {
+ var SETUP = 'git co -b left C0; gc; git merge master; git co -b right C0; gc; git merge master; git co -b all left; git merge right; ';
+
+ it('single included revision', function() {
+ runCommand(SETUP + 'git rev-list all', function(commandMsg) {
+ expect(commandMsg).toBe('C6\nC5\nC4\nC3\nC2\nC1\nC0\n');
+ });
+ });
+
+ it('single excluded revision', function() {
+ runCommand(SETUP + 'git rev-list all ^right', function(commandMsg) {
+ expect(commandMsg).toBe('C6\nC3\nC2\n');
+ });
+ });
+
+ it('multiple included revisions', function() {
+ runCommand(SETUP + 'git rev-list right left', function(commandMsg) {
+ expect(commandMsg).toBe('C5\nC4\nC3\nC2\nC1\nC0\n');
+ });
+ });
+
+ it('multiple excluded revisions', function() {
+ runCommand(SETUP + 'git rev-list all ^right ^left', function(commandMsg) {
+ expect(commandMsg).toBe('C6\n');
+ });
+ });
+ });
+ });
+
describe('Log supports', function() {
var SETUP = 'git co -b left C0; gc; git merge master; git co -b right C0; gc; git merge master; git co -b all left; git merge right; ';
diff --git a/src/js/git/commands.js b/src/js/git/commands.js
index 4c083d5e..83e21e80 100644
--- a/src/js/git/commands.js
+++ b/src/js/git/commands.js
@@ -574,6 +574,18 @@ var commandConfig = {
}
},
+ revlist: {
+ dontCountForGolf: true,
+ displayName: 'rev-list',
+ regex: /^git +rev-list($|\s)/,
+ execute: function(engine, command) {
+ var generalArgs = command.getGeneralArgs();
+ command.validateArgBounds(generalArgs, 1);
+
+ engine.revlist(generalArgs);
+ }
+ },
+
log: {
dontCountForGolf: true,
regex: /^git +log($|\s)/,
diff --git a/src/js/git/index.js b/src/js/git/index.js
index d03a2075..ff811f8e 100644
--- a/src/js/git/index.js
+++ b/src/js/git/index.js
@@ -2740,6 +2740,20 @@ GitEngine.prototype.logWithout = function(ref, omitBranch) {
this.log(ref, Graph.getUpstreamSet(this, omitBranch));
};
+GitEngine.prototype.revlist = function(refs) {
+ var range = new RevisionRange(this, refs);
+
+ // now go through and collect ids
+ var bigLogStr = '';
+ range.revisions.forEach(function(c) {
+ bigLogStr += c.id + '\n';
+ });
+
+ throw new CommandResult({
+ msg: bigLogStr
+ });
+};
+
GitEngine.prototype.log = function(ref, omitSet) {
// omit set is for doing stuff like git log branchA ^branchB
omitSet = omitSet || {};
@@ -3079,6 +3093,71 @@ var Tag = Ref.extend({
}
});
+function RevisionRange(engine, specifiers) {
+ this.engine = engine;
+ this.included = {};
+ this.excluded = {};
+ this.revisions = [];
+
+ this.processSpecifiers(specifiers);
+}
+
+RevisionRange.prototype.isExclusion = function(specifier) {
+ return specifier.startsWith('^');
+};
+
+RevisionRange.prototype.processSpecifiers = function(specifiers) {
+ var self = this;
+ var inclusions = [];
+ var exclusions = [];
+
+ specifiers.forEach(function(specifier) {
+ if(self.isExclusion(specifier)) {
+ exclusions.push(specifier.slice(1));
+ } else {
+ inclusions.push(specifier);
+ }
+ });
+
+ exclusions.forEach(function(exclusion) {
+ self.addExcluded(Graph.getUpstreamSet(self.engine, exclusion));
+ });
+
+ inclusions.forEach(function(inclusion) {
+ self.addIncluded(Graph.getUpstreamSet(self.engine, inclusion));
+ });
+
+ var includedKeys = Array.from(Object.keys(self.included));
+
+ self.revisions = includedKeys.map(function(revision) {
+ return self.engine.resolveStringRef(revision);
+ });
+ self.revisions.sort(self.engine.dateSortFunc);
+ self.revisions.reverse();
+};
+
+RevisionRange.prototype.isExcluded = function(revision) {
+ return this.excluded.hasOwnProperty(revision);
+};
+
+RevisionRange.prototype.addExcluded = function(setToExclude) {
+ var self = this;
+ Object.keys(setToExclude).forEach(function(toExclude) {
+ if(!self.isExcluded(toExclude)) {
+ self.excluded[toExclude] = true;
+ }
+ });
+};
+
+RevisionRange.prototype.addIncluded = function(setToInclude) {
+ var self = this;
+ Object.keys(setToInclude).forEach(function(toInclude) {
+ if(!self.isExcluded(toInclude)) {
+ self.included[toInclude] = true;
+ }
+ });
+};
+
exports.GitEngine = GitEngine;
exports.Commit = Commit;
exports.Branch = Branch;
From b9f8e191628693b94c0fa4ee96b32442ea6c6878 Mon Sep 17 00:00:00 2001
From: David Nelson
Date: Thu, 18 Apr 2019 20:57:29 -0500
Subject: [PATCH 086/359] Implement log using RevisionRange
This changes the implementation of the "log" command to use the RevisionRange
functionality. RevisionRange sorts the results in order of reverse create time,
to match real git. This is a change from the previous implementation of log,
which essentially produced a breadth-first ordering.
---
__tests__/git.spec.js | 24 ++++++++++++++++++
src/js/git/commands.js | 15 ++---------
src/js/git/index.js | 47 +++++++++++------------------------
src/js/models/commandModel.js | 14 ++++++-----
4 files changed, 49 insertions(+), 51 deletions(-)
diff --git a/__tests__/git.spec.js b/__tests__/git.spec.js
index 73c46a82..fd10ad41 100644
--- a/__tests__/git.spec.js
+++ b/__tests__/git.spec.js
@@ -351,5 +351,29 @@ describe('Git', function() {
expect(commandMsg).toContain('Commit: C6\n');
});
});
+
+ it('multiple included revisions', function() {
+ runCommand(SETUP + 'git log right left', function(commandMsg) {
+ expect(commandMsg).toContain('Commit: C0\n');
+ expect(commandMsg).toContain('Commit: C1\n');
+ expect(commandMsg).toContain('Commit: C2\n');
+ expect(commandMsg).toContain('Commit: C3\n');
+ expect(commandMsg).toContain('Commit: C4\n');
+ expect(commandMsg).toContain('Commit: C5\n');
+ expect(commandMsg).not.toContain('Commit: C6\n');
+ });
+ });
+
+ it('multiple excluded revisions', function() {
+ runCommand(SETUP + 'git log all ^right ^left', function(commandMsg) {
+ expect(commandMsg).not.toContain('Commit: C0\n');
+ expect(commandMsg).not.toContain('Commit: C1\n');
+ expect(commandMsg).not.toContain('Commit: C2\n');
+ expect(commandMsg).not.toContain('Commit: C3\n');
+ expect(commandMsg).not.toContain('Commit: C4\n');
+ expect(commandMsg).not.toContain('Commit: C5\n');
+ expect(commandMsg).toContain('Commit: C6\n');
+ });
+ });
});
});
diff --git a/src/js/git/commands.js b/src/js/git/commands.js
index 83e21e80..50e93d5a 100644
--- a/src/js/git/commands.js
+++ b/src/js/git/commands.js
@@ -592,19 +592,8 @@ var commandConfig = {
execute: function(engine, command) {
var generalArgs = command.getGeneralArgs();
- if (generalArgs.length == 2) {
- // do fancy git log branchA ^branchB
- if (generalArgs[1][0] == '^') {
- engine.logWithout(generalArgs[0], generalArgs[1]);
- } else {
- throw new GitError({
- msg: intl.str('git-error-options')
- });
- }
- }
-
- command.oneArgImpliedHead(generalArgs);
- engine.log(generalArgs[0]);
+ command.impliedHead(generalArgs, 0);
+ engine.log(generalArgs);
}
},
diff --git a/src/js/git/index.js b/src/js/git/index.js
index ff811f8e..c0c64024 100644
--- a/src/js/git/index.js
+++ b/src/js/git/index.js
@@ -2744,9 +2744,8 @@ GitEngine.prototype.revlist = function(refs) {
var range = new RevisionRange(this, refs);
// now go through and collect ids
- var bigLogStr = '';
- range.revisions.forEach(function(c) {
- bigLogStr += c.id + '\n';
+ var bigLogStr = range.formatRevisions(function(c) {
+ return c.id + '\n';
});
throw new CommandResult({
@@ -2754,37 +2753,13 @@ GitEngine.prototype.revlist = function(refs) {
});
};
-GitEngine.prototype.log = function(ref, omitSet) {
- // omit set is for doing stuff like git log branchA ^branchB
- omitSet = omitSet || {};
- // first get the commit we referenced
- var commit = this.getCommitFromRef(ref);
-
- // then get as many far back as we can from here, order by commit date
- var toDump = [];
- var pQueue = [commit];
-
- var seen = {};
-
- while (pQueue.length) {
- var popped = pQueue.shift(0);
- if (seen[popped.get('id')] || omitSet[popped.get('id')]) {
- continue;
- }
- seen[popped.get('id')] = true;
-
- toDump.push(popped);
-
- if (popped.get('parents') && popped.get('parents').length) {
- pQueue = pQueue.concat(popped.get('parents'));
- }
- }
+GitEngine.prototype.log = function(refs) {
+ var range = new RevisionRange(this, refs);
// now go through and collect logs
- var bigLogStr = '';
- toDump.forEach(function (c) {
- bigLogStr += c.getLogEntry();
- }, this);
+ var bigLogStr = range.formatRevisions(function(c) {
+ return c.getLogEntry();
+ });
throw new CommandResult({
msg: bigLogStr
@@ -3158,6 +3133,14 @@ RevisionRange.prototype.addIncluded = function(setToInclude) {
});
};
+RevisionRange.prototype.formatRevisions = function(revisionFormatter) {
+ var output = "";
+ this.revisions.forEach(function(c) {
+ output += revisionFormatter(c);
+ });
+ return output;
+};
+
exports.GitEngine = GitEngine;
exports.Commit = Commit;
exports.Branch = Branch;
diff --git a/src/js/models/commandModel.js b/src/js/models/commandModel.js
index 76e94d61..138f9024 100644
--- a/src/js/models/commandModel.js
+++ b/src/js/models/commandModel.js
@@ -126,18 +126,14 @@ var Command = Backbone.Model.extend({
oneArgImpliedHead: function(args, option) {
this.validateArgBounds(args, 0, 1, option);
// and if it's one, add a HEAD to the back
- if (args.length === 0) {
- args.push('HEAD');
- }
+ this.impliedHead(args, 0);
},
twoArgsImpliedHead: function(args, option) {
// our args we expect to be between 1 and 2
this.validateArgBounds(args, 1, 2, option);
// and if it's one, add a HEAD to the back
- if (args.length == 1) {
- args.push('HEAD');
- }
+ this.impliedHead(args, 1);
},
oneArgImpliedOrigin: function(args) {
@@ -151,6 +147,12 @@ var Command = Backbone.Model.extend({
this.validateArgBounds(args, 0, 2);
},
+ impliedHead: function(args, min) {
+ if(args.length == min) {
+ args.push('HEAD');
+ }
+ },
+
// this is a little utility class to help arg validation that happens over and over again
validateArgBounds: function(args, lower, upper, option) {
var what = (option === undefined) ?
From ff2adc069037cd921d1f3571ea5b924694a19d75 Mon Sep 17 00:00:00 2001
From: Hongarc
Date: Fri, 19 Apr 2019 20:19:16 +0700
Subject: [PATCH 087/359] chore: add PRs wellcome to `README.md`
---
README.md | 1 +
1 file changed, 1 insertion(+)
diff --git a/README.md b/README.md
index 9c187699..9737ca2f 100644
--- a/README.md
+++ b/README.md
@@ -1,6 +1,7 @@
# LearnGitBranching
[](https://travis-ci.org/pcottle/learnGitBranching)
+[](https://github.com/pcottle/learnGitBranching/pulls)
LearnGitBranching is a git repository visualizer, sandbox, and a series of educational tutorials and challenges. Its primary purpose is to help developers understand git through the power of visualization (something that's absent when working on the command line). This is achieved through a game with different levels to get acquainted with the different git commands.
From 58f2dc41560f56b502066494124a1dbc6b679e1a Mon Sep 17 00:00:00 2001
From: Hongarc
Date: Mon, 22 Apr 2019 06:42:33 +0700
Subject: [PATCH 088/359] Use `Object.assign` instead of module `assign`
---
src/js/stores/CommandLineStore.js | 4 +---
src/js/stores/GlobalStateStore.js | 4 +---
src/js/stores/LevelStore.js | 5 ++---
src/js/stores/LocaleStore.js | 8 +++-----
4 files changed, 7 insertions(+), 14 deletions(-)
diff --git a/src/js/stores/CommandLineStore.js b/src/js/stores/CommandLineStore.js
index c97e80d6..a2cf9fa1 100644
--- a/src/js/stores/CommandLineStore.js
+++ b/src/js/stores/CommandLineStore.js
@@ -4,8 +4,6 @@ var AppConstants = require('../constants/AppConstants');
var AppDispatcher = require('../dispatcher/AppDispatcher');
var EventEmitter = require('events').EventEmitter;
-var assign = require('object-assign');
-
var ActionTypes = AppConstants.ActionTypes;
var COMMAND_HISTORY_KEY = 'lgb_CommandHistory';
var COMMAND_HISTORY_MAX_LENGTH = 100;
@@ -38,7 +36,7 @@ function _saveToLocalStorage() {
}
}
-var CommandLineStore = assign(
+var CommandLineStore = Object.assign(
{},
EventEmitter.prototype,
AppConstants.StoreSubscribePrototype,
diff --git a/src/js/stores/GlobalStateStore.js b/src/js/stores/GlobalStateStore.js
index 35897d2d..50f764bb 100644
--- a/src/js/stores/GlobalStateStore.js
+++ b/src/js/stores/GlobalStateStore.js
@@ -4,15 +4,13 @@ var AppConstants = require('../constants/AppConstants');
var AppDispatcher = require('../dispatcher/AppDispatcher');
var EventEmitter = require('events').EventEmitter;
-var assign = require('object-assign');
-
var ActionTypes = AppConstants.ActionTypes;
var _isAnimating = false;
var _flipTreeY = false;
var _numLevelsSolved = 0;
-var GlobalStateStore = assign(
+var GlobalStateStore = Object.assign(
{},
EventEmitter.prototype,
AppConstants.StoreSubscribePrototype,
diff --git a/src/js/stores/LevelStore.js b/src/js/stores/LevelStore.js
index 57ce98f8..e486dac8 100644
--- a/src/js/stores/LevelStore.js
+++ b/src/js/stores/LevelStore.js
@@ -3,7 +3,6 @@
var AppConstants = require('../constants/AppConstants');
var AppDispatcher = require('../dispatcher/AppDispatcher');
var EventEmitter = require('events').EventEmitter;
-var assign = require('object-assign');
var levelSequences = require('../../levels').levelSequences;
var sequenceInfo = require('../../levels').sequenceInfo;
@@ -62,7 +61,7 @@ Object.keys(levelSequences).forEach(function(levelSequenceName) {
validateLevel(level);
var id = levelSequenceName + String(index + 1);
- var compiledLevel = assign(
+ var compiledLevel = Object.assign(
{},
level,
{
@@ -78,7 +77,7 @@ Object.keys(levelSequences).forEach(function(levelSequenceName) {
});
});
-var LevelStore = assign(
+var LevelStore = Object.assign(
{},
EventEmitter.prototype,
AppConstants.StoreSubscribePrototype,
diff --git a/src/js/stores/LocaleStore.js b/src/js/stores/LocaleStore.js
index 544a5af7..2be9c38b 100644
--- a/src/js/stores/LocaleStore.js
+++ b/src/js/stores/LocaleStore.js
@@ -4,8 +4,6 @@ var AppConstants = require('../constants/AppConstants');
var AppDispatcher = require('../dispatcher/AppDispatcher');
var EventEmitter = require('events').EventEmitter;
-var assign = require('object-assign');
-
var ActionTypes = AppConstants.ActionTypes;
var DEFAULT_LOCALE = 'en_US';
@@ -55,7 +53,7 @@ function _getLocaleFromHeader(langString) {
}
var _locale = DEFAULT_LOCALE;
-var LocaleStore = assign(
+var LocaleStore = Object.assign(
{},
EventEmitter.prototype,
AppConstants.StoreSubscribePrototype,
@@ -66,11 +64,11 @@ AppConstants.StoreSubscribePrototype,
},
getLangLocaleMap: function() {
- return assign({}, langLocaleMap);
+ return Object.assign({}, langLocaleMap);
},
getHeaderLocaleMap: function() {
- return assign({}, headerLocaleMap);
+ return Object.assign({}, headerLocaleMap);
},
getLocale: function() {
From 10bcc0a02fe01823fa40708a948153a017100704 Mon Sep 17 00:00:00 2001
From: Hongarc
Date: Mon, 22 Apr 2019 06:44:05 +0700
Subject: [PATCH 089/359] Remove all white space at end of line
---
assets/emoji_table.rtf | 1674 +++++++++++------------
src/js/commands/index.js | 2 +-
src/js/intl/index.js | 2 +-
src/js/mercurial/commands.js | 2 +-
src/js/models/commandModel.js | 2 +-
src/js/react_views/LevelToolbarView.jsx | 2 +-
src/js/util/constants.js | 2 +-
src/js/util/throttle.js | 2 +-
src/js/views/index.js | 2 +-
src/levels/mixed/tags.js | 2 +-
src/levels/rampup/cherryPick.js | 2 +-
src/levels/rampup/interactiveRebase.js | 2 +-
src/levels/remote/fetchArgs.js | 2 +-
src/levels/remote/pushArgs2.js | 2 +-
src/levels/remote/tracking.js | 2 +-
src/style/rainbows.css | 36 +-
src/template.index.html | 2 +-
17 files changed, 870 insertions(+), 870 deletions(-)
diff --git a/assets/emoji_table.rtf b/assets/emoji_table.rtf
index 6704f314..14ccbdc8 100644
--- a/assets/emoji_table.rtf
+++ b/assets/emoji_table.rtf
@@ -6,2518 +6,2518 @@
\margl1440\margr1440\vieww18700\viewh19820\viewkind0
\pard\tx720\tx1440\tx2160\tx2880\tx3600\tx4320\tx5040\tx5760\tx6480\tx7200\tx7920\tx8640\pardirnatural
-\f0\fs24 \cf0 \uc0\u55357 \u56833
+\f0\fs24 \cf0 \uc0\u55357 \u56833
\f1 \\ud83d\\ude01 grinning face with smiling eyes\
-\f0 \uc0\u55357 \u56834
+\f0 \uc0\u55357 \u56834
\f1 \\ud83d\\ude02 face with tears of joy\
-\f0 \uc0\u55357 \u56835
+\f0 \uc0\u55357 \u56835
\f1 \\ud83d\\ude03 smiling face with open mouth\
-\f0 \uc0\u55357 \u56836
+\f0 \uc0\u55357 \u56836
\f1 \\ud83d\\ude04 smiling face with open mouth and smiling eyes\
-\f0 \uc0\u55357 \u56837
+\f0 \uc0\u55357 \u56837
\f1 \\ud83d\\ude05 smiling face with open mouth and cold sweat\
-\f0 \uc0\u55357 \u56838
+\f0 \uc0\u55357 \u56838
\f1 \\ud83d\\ude06 smiling face with open mouth and tightly-closed eyes\
-\f0 \uc0\u55357 \u56841
+\f0 \uc0\u55357 \u56841
\f1 \\ud83d\\ude09 winking face\
-\f0 \uc0\u55357 \u56842
+\f0 \uc0\u55357 \u56842
\f1 \\ud83d\\ude0a smiling face with smiling eyes\
-\f0 \uc0\u55357 \u56843
+\f0 \uc0\u55357 \u56843
\f1 \\ud83d\\ude0b face savouring delicious food\
-\f0 \uc0\u55357 \u56844
+\f0 \uc0\u55357 \u56844
\f1 \\ud83d\\ude0c relieved face\
-\f0 \uc0\u55357 \u56845
+\f0 \uc0\u55357 \u56845
\f1 \\ud83d\\ude0d smiling face with heart-shaped eyes\
-\f0 \uc0\u55357 \u56847
+\f0 \uc0\u55357 \u56847
\f1 \\ud83d\\ude0f smirking face\
-\f0 \uc0\u55357 \u56850
+\f0 \uc0\u55357 \u56850
\f1 \\ud83d\\ude12 unamused face\
-\f0 \uc0\u55357 \u56851
+\f0 \uc0\u55357 \u56851
\f1 \\ud83d\\ude13 face with cold sweat\
-\f0 \uc0\u55357 \u56852
+\f0 \uc0\u55357 \u56852
\f1 \\ud83d\\ude14 pensive face\
-\f0 \uc0\u55357 \u56854
+\f0 \uc0\u55357 \u56854
\f1 \\ud83d\\ude16 confounded face\
-\f0 \uc0\u55357 \u56856
+\f0 \uc0\u55357 \u56856
\f1 \\ud83d\\ude18 face throwing a kiss\
-\f0 \uc0\u55357 \u56858
+\f0 \uc0\u55357 \u56858
\f1 \\ud83d\\ude1a kissing face with closed eyes\
-\f0 \uc0\u55357 \u56860
+\f0 \uc0\u55357 \u56860
\f1 \\ud83d\\ude1c face with stuck-out tongue and winking eye\
-\f0 \uc0\u55357 \u56861
+\f0 \uc0\u55357 \u56861
\f1 \\ud83d\\ude1d face with stuck-out tongue and tightly-closed eyes\
-\f0 \uc0\u55357 \u56862
+\f0 \uc0\u55357 \u56862
\f1 \\ud83d\\ude1e disappointed face\
-\f0 \uc0\u55357 \u56864
+\f0 \uc0\u55357 \u56864
\f1 \\ud83d\\ude20 angry face\
-\f0 \uc0\u55357 \u56865
+\f0 \uc0\u55357 \u56865
\f1 \\ud83d\\ude21 pouting face\
-\f0 \uc0\u55357 \u56866
+\f0 \uc0\u55357 \u56866
\f1 \\ud83d\\ude22 crying face\
-\f0 \uc0\u55357 \u56867
+\f0 \uc0\u55357 \u56867
\f1 \\ud83d\\ude23 persevering face\
-\f0 \uc0\u55357 \u56868
+\f0 \uc0\u55357 \u56868
\f1 \\ud83d\\ude24 face with look of triumph\
-\f0 \uc0\u55357 \u56869
+\f0 \uc0\u55357 \u56869
\f1 \\ud83d\\ude25 disappointed but relieved face\
-\f0 \uc0\u55357 \u56872
+\f0 \uc0\u55357 \u56872
\f1 \\ud83d\\ude28 fearful face\
-\f0 \uc0\u55357 \u56873
+\f0 \uc0\u55357 \u56873
\f1 \\ud83d\\ude29 weary face\
-\f0 \uc0\u55357 \u56874
+\f0 \uc0\u55357 \u56874
\f1 \\ud83d\\ude2a sleepy face\
-\f0 \uc0\u55357 \u56875
+\f0 \uc0\u55357 \u56875
\f1 \\ud83d\\ude2b tired face\
-\f0 \uc0\u55357 \u56877
+\f0 \uc0\u55357 \u56877
\f1 \\ud83d\\ude2d loudly crying face\
-\f0 \uc0\u55357 \u56880
+\f0 \uc0\u55357 \u56880
\f1 \\ud83d\\ude30 face with open mouth and cold sweat\
-\f0 \uc0\u55357 \u56881
+\f0 \uc0\u55357 \u56881
\f1 \\ud83d\\ude31 face screaming in fear\
-\f0 \uc0\u55357 \u56882
+\f0 \uc0\u55357 \u56882
\f1 \\ud83d\\ude32 astonished face\
-\f0 \uc0\u55357 \u56883
+\f0 \uc0\u55357 \u56883
\f1 \\ud83d\\ude33 flushed face\
-\f0 \uc0\u55357 \u56885
+\f0 \uc0\u55357 \u56885
\f1 \\ud83d\\ude35 dizzy face\
-\f0 \uc0\u55357 \u56887
+\f0 \uc0\u55357 \u56887
\f1 \\ud83d\\ude37 face with medical mask\
-\f0 \uc0\u55357 \u56888
+\f0 \uc0\u55357 \u56888
\f1 \\ud83d\\ude38 grinning cat face with smiling eyes\
-\f0 \uc0\u55357 \u56889
+\f0 \uc0\u55357 \u56889
\f1 \\ud83d\\ude39 cat face with tears of joy\
-\f0 \uc0\u55357 \u56890
+\f0 \uc0\u55357 \u56890
\f1 \\ud83d\\ude3a smiling cat face with open mouth\
-\f0 \uc0\u55357 \u56891
+\f0 \uc0\u55357 \u56891
\f1 \\ud83d\\ude3b smiling cat face with heart-shaped eyes\
-\f0 \uc0\u55357 \u56892
+\f0 \uc0\u55357 \u56892
\f1 \\ud83d\\ude3c cat face with wry smile\
-\f0 \uc0\u55357 \u56893
+\f0 \uc0\u55357 \u56893
\f1 \\ud83d\\ude3d kissing cat face with closed eyes\
-\f0 \uc0\u55357 \u56894
+\f0 \uc0\u55357 \u56894
\f1 \\ud83d\\ude3e pouting cat face\
-\f0 \uc0\u55357 \u56895
+\f0 \uc0\u55357 \u56895
\f1 \\ud83d\\ude3f crying cat face\
-\f0 \uc0\u55357 \u56896
+\f0 \uc0\u55357 \u56896
\f1 \\ud83d\\ude40 weary cat face\
-\f0 \uc0\u55357 \u56901
+\f0 \uc0\u55357 \u56901
\f1 \\ud83d\\ude45 face with no good gesture\
-\f0 \uc0\u55357 \u56902
+\f0 \uc0\u55357 \u56902
\f1 \\ud83d\\ude46 face with ok gesture\
-\f0 \uc0\u55357 \u56903
+\f0 \uc0\u55357 \u56903
\f1 \\ud83d\\ude47 person bowing deeply\
-\f0 \uc0\u55357 \u56904
+\f0 \uc0\u55357 \u56904
\f1 \\ud83d\\ude48 see-no-evil monkey\
-\f0 \uc0\u55357 \u56905
+\f0 \uc0\u55357 \u56905
\f1 \\ud83d\\ude49 hear-no-evil monkey\
-\f0 \uc0\u55357 \u56906
+\f0 \uc0\u55357 \u56906
\f1 \\ud83d\\ude4a speak-no-evil monkey\
-\f0 \uc0\u55357 \u56907
+\f0 \uc0\u55357 \u56907
\f1 \\ud83d\\ude4b happy person raising one hand\
-\f0 \uc0\u55357 \u56908
+\f0 \uc0\u55357 \u56908
\f1 \\ud83d\\ude4c person raising both hands in celebration\
-\f0 \uc0\u55357 \u56909
+\f0 \uc0\u55357 \u56909
\f1 \\ud83d\\ude4d person frowning\
-\f0 \uc0\u55357 \u56910
+\f0 \uc0\u55357 \u56910
\f1 \\ud83d\\ude4e person with pouting face\
-\f0 \uc0\u55357 \u56911
+\f0 \uc0\u55357 \u56911
\f1 \\ud83d\\ude4f person with folded hands\
-\f2 \uc0\u9986
+\f2 \uc0\u9986
\f1 \\u2702 black scissors\
-\f0 \uc0\u9989
+\f0 \uc0\u9989
\f1 \\u2705 white heavy check mark\
-\f2 \uc0\u9992
+\f2 \uc0\u9992
\f1 \\u2708 airplane\
-\f2 \uc0\u9993
+\f2 \uc0\u9993
\f1 \\u2709 envelope\
-\f0 \uc0\u9994
+\f0 \uc0\u9994
\f1 \\u270a raised fist\
-\f0 \uc0\u9995
+\f0 \uc0\u9995
\f1 \\u270b raised hand\
-\f2 \uc0\u9996
+\f2 \uc0\u9996
\f1 \\u270c victory hand\
-\f2 \uc0\u9999
+\f2 \uc0\u9999
\f1 \\u270f pencil\
-\f2 \uc0\u10002
+\f2 \uc0\u10002
\f1 \\u2712 black nib\
-\f2 \uc0\u10004
+\f2 \uc0\u10004
\f1 \\u2714 heavy check mark\
-\f2 \uc0\u10006
+\f2 \uc0\u10006
\f1 \\u2716 heavy multiplication x\
-\f0 \uc0\u10024
+\f0 \uc0\u10024
\f1 \\u2728 sparkles\
-\f2 \uc0\u10035
+\f2 \uc0\u10035
\f1 \\u2733 eight spoked asterisk\
-\f2 \uc0\u10036
+\f2 \uc0\u10036
\f1 \\u2734 eight pointed black star\
-\f2 \uc0\u10052
+\f2 \uc0\u10052
\f1 \\u2744 snowflake\
-\f2 \uc0\u10055
+\f2 \uc0\u10055
\f1 \\u2747 sparkle\
-\f0 \uc0\u10060
+\f0 \uc0\u10060
\f1 \\u274c cross mark\
-\f0 \uc0\u10062
+\f0 \uc0\u10062
\f1 \\u274e negative squared cross mark\
-\f0 \uc0\u10067
+\f0 \uc0\u10067
\f1 \\u2753 black question mark ornament\
-\f0 \uc0\u10068
+\f0 \uc0\u10068
\f1 \\u2754 white question mark ornament\
-\f0 \uc0\u10069
+\f0 \uc0\u10069
\f1 \\u2755 white exclamation mark ornament\
-\f0 \uc0\u10071
+\f0 \uc0\u10071
\f1 \\u2757 heavy exclamation mark symbol\
-\f2 \uc0\u10084
+\f2 \uc0\u10084
\f1 \\u2764 heavy black heart\
-\f0 \uc0\u10133
+\f0 \uc0\u10133
\f1 \\u2795 heavy plus sign\
-\f0 \uc0\u10134
+\f0 \uc0\u10134
\f1 \\u2796 heavy minus sign\
-\f0 \uc0\u10135
+\f0 \uc0\u10135
\f1 \\u2797 heavy division sign\
-\f2 \uc0\u10145
+\f2 \uc0\u10145
\f1 \\u27a1 black rightwards arrow\
-\f0 \uc0\u10160
+\f0 \uc0\u10160
\f1 \\u27b0 curly loop\
-\f0 \uc0\u55357 \u56960
+\f0 \uc0\u55357 \u56960
\f1 \\ud83d\\ude80 rocket\
-\f0 \uc0\u55357 \u56963
+\f0 \uc0\u55357 \u56963
\f1 \\ud83d\\ude83 railway car\
-\f0 \uc0\u55357 \u56964
+\f0 \uc0\u55357 \u56964
\f1 \\ud83d\\ude84 high-speed train\
-\f0 \uc0\u55357 \u56965
+\f0 \uc0\u55357 \u56965
\f1 \\ud83d\\ude85 high-speed train with bullet nose\
-\f0 \uc0\u55357 \u56967
+\f0 \uc0\u55357 \u56967
\f1 \\ud83d\\ude87 metro\
-\f0 \uc0\u55357 \u56969
+\f0 \uc0\u55357 \u56969
\f1 \\ud83d\\ude89 station\
-\f0 \uc0\u55357 \u56972
+\f0 \uc0\u55357 \u56972
\f1 \\ud83d\\ude8c bus\
-\f0 \uc0\u55357 \u56975
+\f0 \uc0\u55357 \u56975
\f1 \\ud83d\\ude8f bus stop\
-\f0 \uc0\u55357 \u56977
+\f0 \uc0\u55357 \u56977
\f1 \\ud83d\\ude91 ambulance\
-\f0 \uc0\u55357 \u56978
+\f0 \uc0\u55357 \u56978
\f1 \\ud83d\\ude92 fire engine\
-\f0 \uc0\u55357 \u56979
+\f0 \uc0\u55357 \u56979
\f1 \\ud83d\\ude93 police car\
-\f0 \uc0\u55357 \u56981
+\f0 \uc0\u55357 \u56981
\f1 \\ud83d\\ude95 taxi\
-\f0 \uc0\u55357 \u56983
+\f0 \uc0\u55357 \u56983
\f1 \\ud83d\\ude97 automobile\
-\f0 \uc0\u55357 \u56985
+\f0 \uc0\u55357 \u56985
\f1 \\ud83d\\ude99 recreational vehicle\
-\f0 \uc0\u55357 \u56986
+\f0 \uc0\u55357 \u56986
\f1 \\ud83d\\ude9a delivery truck\
-\f0 \uc0\u55357 \u56994
+\f0 \uc0\u55357 \u56994
\f1 \\ud83d\\udea2 ship\
-\f0 \uc0\u55357 \u56996
+\f0 \uc0\u55357 \u56996
\f1 \\ud83d\\udea4 speedboat\
-\f0 \uc0\u55357 \u56997
+\f0 \uc0\u55357 \u56997
\f1 \\ud83d\\udea5 horizontal traffic light\
-\f0 \uc0\u55357 \u56999
+\f0 \uc0\u55357 \u56999
\f1 \\ud83d\\udea7 construction sign\
-\f0 \uc0\u55357 \u57000
+\f0 \uc0\u55357 \u57000
\f1 \\ud83d\\udea8 police cars revolving light\
-\f0 \uc0\u55357 \u57001
+\f0 \uc0\u55357 \u57001
\f1 \\ud83d\\udea9 triangular flag on post\
-\f0 \uc0\u55357 \u57002
+\f0 \uc0\u55357 \u57002
\f1 \\ud83d\\udeaa door\
-\f0 \uc0\u55357 \u57003
+\f0 \uc0\u55357 \u57003
\f1 \\ud83d\\udeab no entry sign\
-\f0 \uc0\u55357 \u57004
+\f0 \uc0\u55357 \u57004
\f1 \\ud83d\\udeac smoking symbol\
-\f0 \uc0\u55357 \u57005
+\f0 \uc0\u55357 \u57005
\f1 \\ud83d\\udead no smoking symbol\
-\f0 \uc0\u55357 \u57010
+\f0 \uc0\u55357 \u57010
\f1 \\ud83d\\udeb2 bicycle\
-\f0 \uc0\u55357 \u57014
+\f0 \uc0\u55357 \u57014
\f1 \\ud83d\\udeb6 pedestrian\
-\f0 \uc0\u55357 \u57017
+\f0 \uc0\u55357 \u57017
\f1 \\ud83d\\udeb9 mens symbol\
-\f0 \uc0\u55357 \u57018
+\f0 \uc0\u55357 \u57018
\f1 \\ud83d\\udeba womens symbol\
-\f0 \uc0\u55357 \u57019
+\f0 \uc0\u55357 \u57019
\f1 \\ud83d\\udebb restroom\
-\f0 \uc0\u55357 \u57020
+\f0 \uc0\u55357 \u57020
\f1 \\ud83d\\udebc baby symbol\
-\f0 \uc0\u55357 \u57021
+\f0 \uc0\u55357 \u57021
\f1 \\ud83d\\udebd toilet\
-\f0 \uc0\u55357 \u57022
+\f0 \uc0\u55357 \u57022
\f1 \\ud83d\\udebe water closet\
-\f0 \uc0\u55357 \u57024
+\f0 \uc0\u55357 \u57024
\f1 \\ud83d\\udec0 bath\
-\f3 \uc0\u9410
+\f3 \uc0\u9410
\f1 \\u24c2 circled latin capital letter m\
-\f3 \uc0\u55356 \u56688
+\f3 \uc0\u55356 \u56688
\f1 \\ud83c\\udd70 negative squared latin capital letter a\
-\f3 \uc0\u55356 \u56689
+\f3 \uc0\u55356 \u56689
\f1 \\ud83c\\udd71 negative squared latin capital letter b\
-\f3 \uc0\u55356 \u56702
+\f3 \uc0\u55356 \u56702
\f1 \\ud83c\\udd7e negative squared latin capital letter o\
-\f3 \uc0\u55356 \u56703
+\f3 \uc0\u55356 \u56703
\f1 \\ud83c\\udd7f negative squared latin capital letter p\
-\f0 \uc0\u55356 \u56718
+\f0 \uc0\u55356 \u56718
\f1 \\ud83c\\udd8e negative squared ab\
-\f0 \uc0\u55356 \u56721
+\f0 \uc0\u55356 \u56721
\f1 \\ud83c\\udd91 squared cl\
-\f0 \uc0\u55356 \u56722
+\f0 \uc0\u55356 \u56722
\f1 \\ud83c\\udd92 squared cool\
-\f0 \uc0\u55356 \u56723
+\f0 \uc0\u55356 \u56723
\f1 \\ud83c\\udd93 squared free\
-\f0 \uc0\u55356 \u56724
+\f0 \uc0\u55356 \u56724
\f1 \\ud83c\\udd94 squared id\
-\f0 \uc0\u55356 \u56725
+\f0 \uc0\u55356 \u56725
\f1 \\ud83c\\udd95 squared new\
-\f0 \uc0\u55356 \u56726
+\f0 \uc0\u55356 \u56726
\f1 \\ud83c\\udd96 squared ng\
-\f0 \uc0\u55356 \u56727
+\f0 \uc0\u55356 \u56727
\f1 \\ud83c\\udd97 squared ok\
-\f0 \uc0\u55356 \u56728
+\f0 \uc0\u55356 \u56728
\f1 \\ud83c\\udd98 squared sos\
-\f0 \uc0\u55356 \u56729
+\f0 \uc0\u55356 \u56729
\f1 \\ud83c\\udd99 squared up with exclamation mark\
-\f0 \uc0\u55356 \u56730
+\f0 \uc0\u55356 \u56730
\f1 \\ud83c\\udd9a squared vs\
-\f0 \uc0\u55356 \u56809 \u55356 \u56810
+\f0 \uc0\u55356 \u56809 \u55356 \u56810
\f1 \\ud83c\\udde9\\ud83c\\uddea regional indicator symbol letter d + regional indicator symbol letter e\
-\f0 \uc0\u55356 \u56812 \u55356 \u56807
+\f0 \uc0\u55356 \u56812 \u55356 \u56807
\f1 \\ud83c\\uddec\\ud83c\\udde7 regional indicator symbol letter g + regional indicator symbol letter b\
-\f0 \uc0\u55356 \u56808 \u55356 \u56819
+\f0 \uc0\u55356 \u56808 \u55356 \u56819
\f1 \\ud83c\\udde8\\ud83c\\uddf3 regional indicator symbol letter c + regional indicator symbol letter n\
-\f0 \uc0\u55356 \u56815 \u55356 \u56821
+\f0 \uc0\u55356 \u56815 \u55356 \u56821
\f1 \\ud83c\\uddef\\ud83c\\uddf5 regional indicator symbol letter j + regional indicator symbol letter p\
-\f0 \uc0\u55356 \u56816 \u55356 \u56823
+\f0 \uc0\u55356 \u56816 \u55356 \u56823
\f1 \\ud83c\\uddf0\\ud83c\\uddf7 regional indicator symbol letter k + regional indicator symbol letter r\
-\f0 \uc0\u55356 \u56811 \u55356 \u56823
+\f0 \uc0\u55356 \u56811 \u55356 \u56823
\f1 \\ud83c\\uddeb\\ud83c\\uddf7 regional indicator symbol letter f + regional indicator symbol letter r\
-\f0 \uc0\u55356 \u56810 \u55356 \u56824
+\f0 \uc0\u55356 \u56810 \u55356 \u56824
\f1 \\ud83c\\uddea\\ud83c\\uddf8 regional indicator symbol letter e + regional indicator symbol letter s\
-\f0 \uc0\u55356 \u56814 \u55356 \u56825
+\f0 \uc0\u55356 \u56814 \u55356 \u56825
\f1 \\ud83c\\uddee\\ud83c\\uddf9 regional indicator symbol letter i + regional indicator symbol letter t\
-\f0 \uc0\u55356 \u56826 \u55356 \u56824
+\f0 \uc0\u55356 \u56826 \u55356 \u56824
\f1 \\ud83c\\uddfa\\ud83c\\uddf8 regional indicator symbol letter u + regional indicator symbol letter s\
-\f0 \uc0\u55356 \u56823 \u55356 \u56826
+\f0 \uc0\u55356 \u56823 \u55356 \u56826
\f1 \\ud83c\\uddf7\\ud83c\\uddfa regional indicator symbol letter r + regional indicator symbol letter u\
-\f0 \uc0\u55356 \u56833
+\f0 \uc0\u55356 \u56833
\f1 \\ud83c\\ude01 squared katakana koko\
-\f3 \uc0\u55356 \u56834
+\f3 \uc0\u55356 \u56834
\f1 \\ud83c\\ude02 squared katakana sa\
-\f0 \uc0\u55356 \u56858
+\f0 \uc0\u55356 \u56858
\f1 \\ud83c\\ude1a squared cjk unified ideograph-7121\
-\f0 \uc0\u55356 \u56879
+\f0 \uc0\u55356 \u56879
\f1 \\ud83c\\ude2f squared cjk unified ideograph-6307\
-\f0 \uc0\u55356 \u56882
+\f0 \uc0\u55356 \u56882
\f1 \\ud83c\\ude32 squared cjk unified ideograph-7981\
-\f0 \uc0\u55356 \u56883
+\f0 \uc0\u55356 \u56883
\f1 \\ud83c\\ude33 squared cjk unified ideograph-7a7a\
-\f0 \uc0\u55356 \u56884
+\f0 \uc0\u55356 \u56884
\f1 \\ud83c\\ude34 squared cjk unified ideograph-5408\
-\f0 \uc0\u55356 \u56885
+\f0 \uc0\u55356 \u56885
\f1 \\ud83c\\ude35 squared cjk unified ideograph-6e80\
-\f0 \uc0\u55356 \u56886
+\f0 \uc0\u55356 \u56886
\f1 \\ud83c\\ude36 squared cjk unified ideograph-6709\
-\f3 \uc0\u55356 \u56887
+\f3 \uc0\u55356 \u56887
\f1 \\ud83c\\ude37 squared cjk unified ideograph-6708\
-\f0 \uc0\u55356 \u56888
+\f0 \uc0\u55356 \u56888
\f1 \\ud83c\\ude38 squared cjk unified ideograph-7533\
-\f0 \uc0\u55356 \u56889
+\f0 \uc0\u55356 \u56889
\f1 \\ud83c\\ude39 squared cjk unified ideograph-5272\
-\f0 \uc0\u55356 \u56890
+\f0 \uc0\u55356 \u56890
\f1 \\ud83c\\ude3a squared cjk unified ideograph-55b6\
-\f0 \uc0\u55356 \u56912
+\f0 \uc0\u55356 \u56912
\f1 \\ud83c\\ude50 circled ideograph advantage\
-\f0 \uc0\u55356 \u56913
+\f0 \uc0\u55356 \u56913
\f1 \\ud83c\\ude51 circled ideograph accept\
\'a9 \\ua9 copyright sign\
\'ae \\uae registered sign\
\uc0\u8252 \\u203c double exclamation mark\
\uc0\u8265 \\u2049 exclamation question mark\
-\f4 8\uc0\u8419
+\f4 8\uc0\u8419
\f1 \\u38\\u20e3 digit eight + combining enclosing keycap\
-\f4 9\uc0\u8419
+\f4 9\uc0\u8419
\f1 \\u39\\u20e3 digit nine + combining enclosing keycap\
-\f4 7\uc0\u8419
+\f4 7\uc0\u8419
\f1 \\u37\\u20e3 digit seven + combining enclosing keycap\
-\f4 6\uc0\u8419
+\f4 6\uc0\u8419
\f1 \\u36\\u20e3 digit six + combining enclosing keycap\
-\f4 1\uc0\u8419
+\f4 1\uc0\u8419
\f1 \\u31\\u20e3 digit one + combining enclosing keycap\
-\f4 0\uc0\u8419
+\f4 0\uc0\u8419
\f1 \\u30\\u20e3 digit zero + combining enclosing keycap\
-\f4 2\uc0\u8419
+\f4 2\uc0\u8419
\f1 \\u32\\u20e3 digit two + combining enclosing keycap\
-\f4 3\uc0\u8419
+\f4 3\uc0\u8419
\f1 \\u33\\u20e3 digit three + combining enclosing keycap\
-\f4 5\uc0\u8419
+\f4 5\uc0\u8419
\f1 \\u35\\u20e3 digit five + combining enclosing keycap\
-\f4 4\uc0\u8419
+\f4 4\uc0\u8419
\f1 \\u34\\u20e3 digit four + combining enclosing keycap\
-\f4 #\uc0\u8419
+\f4 #\uc0\u8419
\f1 \\u23\\u20e3 number sign + combining enclosing keycap\
\'99 \\u2122 trade mark sign\
-\f5 \uc0\u8505
+\f5 \uc0\u8505
\f1 \\u2139 information source\
-\f3 \uc0\u8596
+\f3 \uc0\u8596
\f1 \\u2194 left right arrow\
-\f6 \uc0\u8597
+\f6 \uc0\u8597
\f1 \\u2195 up down arrow\
-\f4 \uc0\u8598
+\f4 \uc0\u8598
\f1 \\u2196 north west arrow\
-\f3 \uc0\u8599
+\f3 \uc0\u8599
\f1 \\u2197 north east arrow\
-\f4 \uc0\u8600
+\f4 \uc0\u8600
\f1 \\u2198 south east arrow\
-\f3 \uc0\u8601
+\f3 \uc0\u8601
\f1 \\u2199 south west arrow\
-\f4 \uc0\u8617
+\f4 \uc0\u8617
\f1 \\u21a9 leftwards arrow with hook\
-\f4 \uc0\u8618
+\f4 \uc0\u8618
\f1 \\u21aa rightwards arrow with hook\
-\f0 \uc0\u8986
+\f0 \uc0\u8986
\f1 \\u231a watch\
-\f0 \uc0\u8987
+\f0 \uc0\u8987
\f1 \\u231b hourglass\
-\f0 \uc0\u9193
+\f0 \uc0\u9193
\f1 \\u23e9 black right-pointing double triangle\
-\f0 \uc0\u9194
+\f0 \uc0\u9194
\f1 \\u23ea black left-pointing double triangle\
-\f0 \uc0\u9195
+\f0 \uc0\u9195
\f1 \\u23eb black up-pointing double triangle\
-\f0 \uc0\u9196
+\f0 \uc0\u9196
\f1 \\u23ec black down-pointing double triangle\
-\f0 \uc0\u9200
+\f0 \uc0\u9200
\f1 \\u23f0 alarm clock\
-\f0 \uc0\u9203
+\f0 \uc0\u9203
\f1 \\u23f3 hourglass with flowing sand\
-\f4 \uc0\u9642
+\f4 \uc0\u9642
\f1 \\u25aa black small square\
-\f4 \uc0\u9643
+\f4 \uc0\u9643
\f1 \\u25ab white small square\
-\f4 \uc0\u9654
+\f4 \uc0\u9654
\f1 \\u25b6 black right-pointing triangle\
-\f3 \uc0\u9664
+\f3 \uc0\u9664
\f1 \\u25c0 black left-pointing triangle\
-\f7 \uc0\u9723
+\f7 \uc0\u9723
\f1 \\u25fb white medium square\
-\f7 \uc0\u9724
+\f7 \uc0\u9724
\f1 \\u25fc black medium square\
-\f0 \uc0\u9725
+\f0 \uc0\u9725
\f1 \\u25fd white medium small square\
-\f0 \uc0\u9726
+\f0 \uc0\u9726
\f1 \\u25fe black medium small square\
-\f3 \uc0\u9728
+\f3 \uc0\u9728
\f1 \\u2600 black sun with rays\
-\f3 \uc0\u9729
+\f3 \uc0\u9729
\f1 \\u2601 cloud\
-\f3 \uc0\u9742
+\f3 \uc0\u9742
\f1 \\u260e black telephone\
-\f5 \uc0\u9745
+\f5 \uc0\u9745
\f1 \\u2611 ballot box with check\
-\f0 \uc0\u9748
+\f0 \uc0\u9748
\f1 \\u2614 umbrella with rain drops\
-\f0 \uc0\u9749
+\f0 \uc0\u9749
\f1 \\u2615 hot beverage\
-\f3 \uc0\u9757
+\f3 \uc0\u9757
\f1 \\u261d white up pointing index\
-\f6 \uc0\u9786
+\f6 \uc0\u9786
\f1 \\u263a white smiling face\
-\f0 \uc0\u9800
+\f0 \uc0\u9800
\f1 \\u2648 aries\
-\f0 \uc0\u9801
+\f0 \uc0\u9801
\f1 \\u2649 taurus\
-\f0 \uc0\u9802
+\f0 \uc0\u9802
\f1 \\u264a gemini\
-\f0 \uc0\u9803
+\f0 \uc0\u9803
\f1 \\u264b cancer\
-\f0 \uc0\u9804
+\f0 \uc0\u9804
\f1 \\u264c leo\
-\f0 \uc0\u9805
+\f0 \uc0\u9805
\f1 \\u264d virgo\
-\f0 \uc0\u9806
+\f0 \uc0\u9806
\f1 \\u264e libra\
-\f0 \uc0\u9807
+\f0 \uc0\u9807
\f1 \\u264f scorpius\
-\f0 \uc0\u9808
+\f0 \uc0\u9808
\f1 \\u2650 sagittarius\
-\f0 \uc0\u9809
+\f0 \uc0\u9809
\f1 \\u2651 capricorn\
-\f0 \uc0\u9810
+\f0 \uc0\u9810
\f1 \\u2652 aquarius\
-\f0 \uc0\u9811
+\f0 \uc0\u9811
\f1 \\u2653 pisces\
-\f3 \uc0\u9824
+\f3 \uc0\u9824
\f1 \\u2660 black spade suit\
-\f3 \uc0\u9827
+\f3 \uc0\u9827
\f1 \\u2663 black club suit\
-\f3 \uc0\u9829
+\f3 \uc0\u9829
\f1 \\u2665 black heart suit\
-\f3 \uc0\u9830
+\f3 \uc0\u9830
\f1 \\u2666 black diamond suit\
-\f3 \uc0\u9832
+\f3 \uc0\u9832
\f1 \\u2668 hot springs\
-\f3 \uc0\u9851
+\f3 \uc0\u9851
\f1 \\u267b black universal recycling symbol\
-\f0 \uc0\u9855
+\f0 \uc0\u9855
\f1 \\u267f wheelchair symbol\
-\f0 \uc0\u9875
+\f0 \uc0\u9875
\f1 \\u2693 anchor\
-\f3 \uc0\u9888
+\f3 \uc0\u9888
\f1 \\u26a0 warning sign\
-\f0 \uc0\u9889
+\f0 \uc0\u9889
\f1 \\u26a1 high voltage sign\
-\f0 \uc0\u9898
+\f0 \uc0\u9898
\f1 \\u26aa medium white circle\
-\f0 \uc0\u9899
+\f0 \uc0\u9899
\f1 \\u26ab medium black circle\
-\f0 \uc0\u9917
+\f0 \uc0\u9917
\f1 \\u26bd soccer ball\
-\f3 \uc0\u9918
+\f3 \uc0\u9918
\f1 \\u26be baseball\
-\f0 \uc0\u9924
+\f0 \uc0\u9924
\f1 \\u26c4 snowman without snow\
-\f0 \uc0\u9925
+\f0 \uc0\u9925
\f1 \\u26c5 sun behind cloud\
-\f0 \uc0\u9934
+\f0 \uc0\u9934
\f1 \\u26ce ophiuchus\
-\f0 \uc0\u9940
+\f0 \uc0\u9940
\f1 \\u26d4 no entry\
-\f0 \uc0\u9962
+\f0 \uc0\u9962
\f1 \\u26ea church\
-\f0 \uc0\u9970
+\f0 \uc0\u9970
\f1 \\u26f2 fountain\
-\f0 \uc0\u9971
+\f0 \uc0\u9971
\f1 \\u26f3 flag in hole\
-\f0 \uc0\u9973
+\f0 \uc0\u9973
\f1 \\u26f5 sailboat\
-\f0 \uc0\u9978
+\f0 \uc0\u9978
\f1 \\u26fa tent\
-\f0 \uc0\u9981
+\f0 \uc0\u9981
\f1 \\u26fd fuel pump\
-\f3 \uc0\u10548
+\f3 \uc0\u10548
\f1 \\u2934 arrow pointing rightwards then curving upwards\
-\f3 \uc0\u10549
+\f3 \uc0\u10549
\f1 \\u2935 arrow pointing rightwards then curving downwards\
-\f3 \uc0\u11013
+\f3 \uc0\u11013
\f1 \\u2b05 leftwards black arrow\
-\f3 \uc0\u11014
+\f3 \uc0\u11014
\f1 \\u2b06 upwards black arrow\
-\f3 \uc0\u11015
+\f3 \uc0\u11015
\f1 \\u2b07 downwards black arrow\
-\f0 \uc0\u11035
+\f0 \uc0\u11035
\f1 \\u2b1b black large square\
-\f0 \uc0\u11036
+\f0 \uc0\u11036
\f1 \\u2b1c white large square\
-\f0 \uc0\u11088
+\f0 \uc0\u11088
\f1 \\u2b50 white medium star\
-\f0 \uc0\u11093
+\f0 \uc0\u11093
\f1 \\u2b55 heavy large circle\
-\f3 \uc0\u12336
+\f3 \uc0\u12336
\f1 \\u3030 wavy dash\
-\f3 \uc0\u12349
+\f3 \uc0\u12349
\f1 \\u303d part alternation mark\
-\f3 \uc0\u12951
+\f3 \uc0\u12951
\f1 \\u3297 circled ideograph congratulation\
-\f3 \uc0\u12953
+\f3 \uc0\u12953
\f1 \\u3299 circled ideograph secret\
-\f0 \uc0\u55356 \u56324
+\f0 \uc0\u55356 \u56324
\f1 \\ud83c\\udc04 mahjong tile red dragon\
-\f0 \uc0\u55356 \u56527
+\f0 \uc0\u55356 \u56527
\f1 \\ud83c\\udccf playing card black joker\
-\f0 \uc0\u55356 \u57088
+\f0 \uc0\u55356 \u57088
\f1 \\ud83c\\udf00 cyclone\
-\f0 \uc0\u55356 \u57089
+\f0 \uc0\u55356 \u57089
\f1 \\ud83c\\udf01 foggy\
-\f0 \uc0\u55356 \u57090
+\f0 \uc0\u55356 \u57090
\f1 \\ud83c\\udf02 closed umbrella\
-\f0 \uc0\u55356 \u57091
+\f0 \uc0\u55356 \u57091
\f1 \\ud83c\\udf03 night with stars\
-\f0 \uc0\u55356 \u57092
+\f0 \uc0\u55356 \u57092
\f1 \\ud83c\\udf04 sunrise over mountains\
-\f0 \uc0\u55356 \u57093
+\f0 \uc0\u55356 \u57093
\f1 \\ud83c\\udf05 sunrise\
-\f0 \uc0\u55356 \u57094
+\f0 \uc0\u55356 \u57094
\f1 \\ud83c\\udf06 cityscape at dusk\
-\f0 \uc0\u55356 \u57095
+\f0 \uc0\u55356 \u57095
\f1 \\ud83c\\udf07 sunset over buildings\
-\f0 \uc0\u55356 \u57096
+\f0 \uc0\u55356 \u57096
\f1 \\ud83c\\udf08 rainbow\
-\f0 \uc0\u55356 \u57097
+\f0 \uc0\u55356 \u57097
\f1 \\ud83c\\udf09 bridge at night\
-\f0 \uc0\u55356 \u57098
+\f0 \uc0\u55356 \u57098
\f1 \\ud83c\\udf0a water wave\
-\f0 \uc0\u55356 \u57099
+\f0 \uc0\u55356 \u57099
\f1 \\ud83c\\udf0b volcano\
-\f0 \uc0\u55356 \u57100
+\f0 \uc0\u55356 \u57100
\f1 \\ud83c\\udf0c milky way\
-\f0 \uc0\u55356 \u57103
+\f0 \uc0\u55356 \u57103
\f1 \\ud83c\\udf0f earth globe asia-australia\
-\f0 \uc0\u55356 \u57105
+\f0 \uc0\u55356 \u57105
\f1 \\ud83c\\udf11 new moon symbol\
-\f0 \uc0\u55356 \u57107
+\f0 \uc0\u55356 \u57107
\f1 \\ud83c\\udf13 first quarter moon symbol\
-\f0 \uc0\u55356 \u57108
+\f0 \uc0\u55356 \u57108
\f1 \\ud83c\\udf14 waxing gibbous moon symbol\
-\f0 \uc0\u55356 \u57109
+\f0 \uc0\u55356 \u57109
\f1 \\ud83c\\udf15 full moon symbol\
-\f0 \uc0\u55356 \u57113
+\f0 \uc0\u55356 \u57113
\f1 \\ud83c\\udf19 crescent moon\
-\f0 \uc0\u55356 \u57115
+\f0 \uc0\u55356 \u57115
\f1 \\ud83c\\udf1b first quarter moon with face\
-\f0 \uc0\u55356 \u57119
+\f0 \uc0\u55356 \u57119
\f1 \\ud83c\\udf1f glowing star\
-\f0 \uc0\u55356 \u57120
+\f0 \uc0\u55356 \u57120
\f1 \\ud83c\\udf20 shooting star\
-\f0 \uc0\u55356 \u57136
+\f0 \uc0\u55356 \u57136
\f1 \\ud83c\\udf30 chestnut\
-\f0 \uc0\u55356 \u57137
+\f0 \uc0\u55356 \u57137
\f1 \\ud83c\\udf31 seedling\
-\f0 \uc0\u55356 \u57140
+\f0 \uc0\u55356 \u57140
\f1 \\ud83c\\udf34 palm tree\
-\f0 \uc0\u55356 \u57141
+\f0 \uc0\u55356 \u57141
\f1 \\ud83c\\udf35 cactus\
-\f0 \uc0\u55356 \u57143
+\f0 \uc0\u55356 \u57143
\f1 \\ud83c\\udf37 tulip\
-\f0 \uc0\u55356 \u57144
+\f0 \uc0\u55356 \u57144
\f1 \\ud83c\\udf38 cherry blossom\
-\f0 \uc0\u55356 \u57145
+\f0 \uc0\u55356 \u57145
\f1 \\ud83c\\udf39 rose\
-\f0 \uc0\u55356 \u57146
+\f0 \uc0\u55356 \u57146
\f1 \\ud83c\\udf3a hibiscus\
-\f0 \uc0\u55356 \u57147
+\f0 \uc0\u55356 \u57147
\f1 \\ud83c\\udf3b sunflower\
-\f0 \uc0\u55356 \u57148
+\f0 \uc0\u55356 \u57148
\f1 \\ud83c\\udf3c blossom\
-\f0 \uc0\u55356 \u57149
+\f0 \uc0\u55356 \u57149
\f1 \\ud83c\\udf3d ear of maize\
-\f0 \uc0\u55356 \u57150
+\f0 \uc0\u55356 \u57150
\f1 \\ud83c\\udf3e ear of rice\
-\f0 \uc0\u55356 \u57151
+\f0 \uc0\u55356 \u57151
\f1 \\ud83c\\udf3f herb\
-\f0 \uc0\u55356 \u57152
+\f0 \uc0\u55356 \u57152
\f1 \\ud83c\\udf40 four leaf clover\
-\f0 \uc0\u55356 \u57153
+\f0 \uc0\u55356 \u57153
\f1 \\ud83c\\udf41 maple leaf\
-\f0 \uc0\u55356 \u57154
+\f0 \uc0\u55356 \u57154
\f1 \\ud83c\\udf42 fallen leaf\
-\f0 \uc0\u55356 \u57155
+\f0 \uc0\u55356 \u57155
\f1 \\ud83c\\udf43 leaf fluttering in wind\
-\f0 \uc0\u55356 \u57156
+\f0 \uc0\u55356 \u57156
\f1 \\ud83c\\udf44 mushroom\
-\f0 \uc0\u55356 \u57157
+\f0 \uc0\u55356 \u57157
\f1 \\ud83c\\udf45 tomato\
-\f0 \uc0\u55356 \u57158
+\f0 \uc0\u55356 \u57158
\f1 \\ud83c\\udf46 aubergine\
-\f0 \uc0\u55356 \u57159
+\f0 \uc0\u55356 \u57159
\f1 \\ud83c\\udf47 grapes\
-\f0 \uc0\u55356 \u57160
+\f0 \uc0\u55356 \u57160
\f1 \\ud83c\\udf48 melon\
-\f0 \uc0\u55356 \u57161
+\f0 \uc0\u55356 \u57161
\f1 \\ud83c\\udf49 watermelon\
-\f0 \uc0\u55356 \u57162
+\f0 \uc0\u55356 \u57162
\f1 \\ud83c\\udf4a tangerine\
-\f0 \uc0\u55356 \u57164
+\f0 \uc0\u55356 \u57164
\f1 \\ud83c\\udf4c banana\
-\f0 \uc0\u55356 \u57165
+\f0 \uc0\u55356 \u57165
\f1 \\ud83c\\udf4d pineapple\
-\f0 \uc0\u55356 \u57166
+\f0 \uc0\u55356 \u57166
\f1 \\ud83c\\udf4e red apple\
-\f0 \uc0\u55356 \u57167
+\f0 \uc0\u55356 \u57167
\f1 \\ud83c\\udf4f green apple\
-\f0 \uc0\u55356 \u57169
+\f0 \uc0\u55356 \u57169
\f1 \\ud83c\\udf51 peach\
-\f0 \uc0\u55356 \u57170
+\f0 \uc0\u55356 \u57170
\f1 \\ud83c\\udf52 cherries\
-\f0 \uc0\u55356 \u57171
+\f0 \uc0\u55356 \u57171
\f1 \\ud83c\\udf53 strawberry\
-\f0 \uc0\u55356 \u57172
+\f0 \uc0\u55356 \u57172
\f1 \\ud83c\\udf54 hamburger\
-\f0 \uc0\u55356 \u57173
+\f0 \uc0\u55356 \u57173
\f1 \\ud83c\\udf55 slice of pizza\
-\f0 \uc0\u55356 \u57174
+\f0 \uc0\u55356 \u57174
\f1 \\ud83c\\udf56 meat on bone\
-\f0 \uc0\u55356 \u57175
+\f0 \uc0\u55356 \u57175
\f1 \\ud83c\\udf57 poultry leg\
-\f0 \uc0\u55356 \u57176
+\f0 \uc0\u55356 \u57176
\f1 \\ud83c\\udf58 rice cracker\
-\f0 \uc0\u55356 \u57177
+\f0 \uc0\u55356 \u57177
\f1 \\ud83c\\udf59 rice ball\
-\f0 \uc0\u55356 \u57178
+\f0 \uc0\u55356 \u57178
\f1 \\ud83c\\udf5a cooked rice\
-\f0 \uc0\u55356 \u57179
+\f0 \uc0\u55356 \u57179
\f1 \\ud83c\\udf5b curry and rice\
-\f0 \uc0\u55356 \u57180
+\f0 \uc0\u55356 \u57180
\f1 \\ud83c\\udf5c steaming bowl\
-\f0 \uc0\u55356 \u57181
+\f0 \uc0\u55356 \u57181
\f1 \\ud83c\\udf5d spaghetti\
-\f0 \uc0\u55356 \u57182
+\f0 \uc0\u55356 \u57182
\f1 \\ud83c\\udf5e bread\
-\f0 \uc0\u55356 \u57183
+\f0 \uc0\u55356 \u57183
\f1 \\ud83c\\udf5f french fries\
-\f0 \uc0\u55356 \u57184
+\f0 \uc0\u55356 \u57184
\f1 \\ud83c\\udf60 roasted sweet potato\
-\f0 \uc0\u55356 \u57185
+\f0 \uc0\u55356 \u57185
\f1 \\ud83c\\udf61 dango\
-\f0 \uc0\u55356 \u57186
+\f0 \uc0\u55356 \u57186
\f1 \\ud83c\\udf62 oden\
-\f0 \uc0\u55356 \u57187
+\f0 \uc0\u55356 \u57187
\f1 \\ud83c\\udf63 sushi\
-\f0 \uc0\u55356 \u57188
+\f0 \uc0\u55356 \u57188
\f1 \\ud83c\\udf64 fried shrimp\
-\f0 \uc0\u55356 \u57189
+\f0 \uc0\u55356 \u57189
\f1 \\ud83c\\udf65 fish cake with swirl design\
-\f0 \uc0\u55356 \u57190
+\f0 \uc0\u55356 \u57190
\f1 \\ud83c\\udf66 soft ice cream\
-\f0 \uc0\u55356 \u57191
+\f0 \uc0\u55356 \u57191
\f1 \\ud83c\\udf67 shaved ice\
-\f0 \uc0\u55356 \u57192
+\f0 \uc0\u55356 \u57192
\f1 \\ud83c\\udf68 ice cream\
-\f0 \uc0\u55356 \u57193
+\f0 \uc0\u55356 \u57193
\f1 \\ud83c\\udf69 doughnut\
-\f0 \uc0\u55356 \u57194
+\f0 \uc0\u55356 \u57194
\f1 \\ud83c\\udf6a cookie\
-\f0 \uc0\u55356 \u57195
+\f0 \uc0\u55356 \u57195
\f1 \\ud83c\\udf6b chocolate bar\
-\f0 \uc0\u55356 \u57196
+\f0 \uc0\u55356 \u57196
\f1 \\ud83c\\udf6c candy\
-\f0 \uc0\u55356 \u57197
+\f0 \uc0\u55356 \u57197
\f1 \\ud83c\\udf6d lollipop\
-\f0 \uc0\u55356 \u57198
+\f0 \uc0\u55356 \u57198
\f1 \\ud83c\\udf6e custard\
-\f0 \uc0\u55356 \u57199
+\f0 \uc0\u55356 \u57199
\f1 \\ud83c\\udf6f honey pot\
-\f0 \uc0\u55356 \u57200
+\f0 \uc0\u55356 \u57200
\f1 \\ud83c\\udf70 shortcake\
-\f0 \uc0\u55356 \u57201
+\f0 \uc0\u55356 \u57201
\f1 \\ud83c\\udf71 bento box\
-\f0 \uc0\u55356 \u57202
+\f0 \uc0\u55356 \u57202
\f1 \\ud83c\\udf72 pot of food\
-\f0 \uc0\u55356 \u57203
+\f0 \uc0\u55356 \u57203
\f1 \\ud83c\\udf73 cooking\
-\f0 \uc0\u55356 \u57204
+\f0 \uc0\u55356 \u57204
\f1 \\ud83c\\udf74 fork and knife\
-\f0 \uc0\u55356 \u57205
+\f0 \uc0\u55356 \u57205
\f1 \\ud83c\\udf75 teacup without handle\
-\f0 \uc0\u55356 \u57206
+\f0 \uc0\u55356 \u57206
\f1 \\ud83c\\udf76 sake bottle and cup\
-\f0 \uc0\u55356 \u57207
+\f0 \uc0\u55356 \u57207
\f1 \\ud83c\\udf77 wine glass\
-\f0 \uc0\u55356 \u57208
+\f0 \uc0\u55356 \u57208
\f1 \\ud83c\\udf78 cocktail glass\
-\f0 \uc0\u55356 \u57209
+\f0 \uc0\u55356 \u57209
\f1 \\ud83c\\udf79 tropical drink\
-\f0 \uc0\u55356 \u57210
+\f0 \uc0\u55356 \u57210
\f1 \\ud83c\\udf7a beer mug\
-\f0 \uc0\u55356 \u57211
+\f0 \uc0\u55356 \u57211
\f1 \\ud83c\\udf7b clinking beer mugs\
-\f0 \uc0\u55356 \u57216
+\f0 \uc0\u55356 \u57216
\f1 \\ud83c\\udf80 ribbon\
-\f0 \uc0\u55356 \u57217
+\f0 \uc0\u55356 \u57217
\f1 \\ud83c\\udf81 wrapped present\
-\f0 \uc0\u55356 \u57218
+\f0 \uc0\u55356 \u57218
\f1 \\ud83c\\udf82 birthday cake\
-\f0 \uc0\u55356 \u57219
+\f0 \uc0\u55356 \u57219
\f1 \\ud83c\\udf83 jack-o-lantern\
-\f0 \uc0\u55356 \u57220
+\f0 \uc0\u55356 \u57220
\f1 \\ud83c\\udf84 christmas tree\
-\f0 \uc0\u55356 \u57221
+\f0 \uc0\u55356 \u57221
\f1 \\ud83c\\udf85 father christmas\
-\f0 \uc0\u55356 \u57222
+\f0 \uc0\u55356 \u57222
\f1 \\ud83c\\udf86 fireworks\
-\f0 \uc0\u55356 \u57223
+\f0 \uc0\u55356 \u57223
\f1 \\ud83c\\udf87 firework sparkler\
-\f0 \uc0\u55356 \u57224
+\f0 \uc0\u55356 \u57224
\f1 \\ud83c\\udf88 balloon\
-\f0 \uc0\u55356 \u57225
+\f0 \uc0\u55356 \u57225
\f1 \\ud83c\\udf89 party popper\
-\f0 \uc0\u55356 \u57226
+\f0 \uc0\u55356 \u57226
\f1 \\ud83c\\udf8a confetti ball\
-\f0 \uc0\u55356 \u57227
+\f0 \uc0\u55356 \u57227
\f1 \\ud83c\\udf8b tanabata tree\
-\f0 \uc0\u55356 \u57228
+\f0 \uc0\u55356 \u57228
\f1 \\ud83c\\udf8c crossed flags\
-\f0 \uc0\u55356 \u57229
+\f0 \uc0\u55356 \u57229
\f1 \\ud83c\\udf8d pine decoration\
-\f0 \uc0\u55356 \u57230
+\f0 \uc0\u55356 \u57230
\f1 \\ud83c\\udf8e japanese dolls\
-\f0 \uc0\u55356 \u57231
+\f0 \uc0\u55356 \u57231
\f1 \\ud83c\\udf8f carp streamer\
-\f0 \uc0\u55356 \u57232
+\f0 \uc0\u55356 \u57232
\f1 \\ud83c\\udf90 wind chime\
-\f0 \uc0\u55356 \u57233
+\f0 \uc0\u55356 \u57233
\f1 \\ud83c\\udf91 moon viewing ceremony\
-\f0 \uc0\u55356 \u57234
+\f0 \uc0\u55356 \u57234
\f1 \\ud83c\\udf92 school satchel\
-\f0 \uc0\u55356 \u57235
+\f0 \uc0\u55356 \u57235
\f1 \\ud83c\\udf93 graduation cap\
-\f0 \uc0\u55356 \u57248
+\f0 \uc0\u55356 \u57248
\f1 \\ud83c\\udfa0 carousel horse\
-\f0 \uc0\u55356 \u57249
+\f0 \uc0\u55356 \u57249
\f1 \\ud83c\\udfa1 ferris wheel\
-\f0 \uc0\u55356 \u57250
+\f0 \uc0\u55356 \u57250
\f1 \\ud83c\\udfa2 roller coaster\
-\f0 \uc0\u55356 \u57251
+\f0 \uc0\u55356 \u57251
\f1 \\ud83c\\udfa3 fishing pole and fish\
-\f0 \uc0\u55356 \u57252
+\f0 \uc0\u55356 \u57252
\f1 \\ud83c\\udfa4 microphone\
-\f0 \uc0\u55356 \u57253
+\f0 \uc0\u55356 \u57253
\f1 \\ud83c\\udfa5 movie camera\
-\f0 \uc0\u55356 \u57254
+\f0 \uc0\u55356 \u57254
\f1 \\ud83c\\udfa6 cinema\
-\f0 \uc0\u55356 \u57255
+\f0 \uc0\u55356 \u57255
\f1 \\ud83c\\udfa7 headphone\
-\f0 \uc0\u55356 \u57256
+\f0 \uc0\u55356 \u57256
\f1 \\ud83c\\udfa8 artist palette\
-\f0 \uc0\u55356 \u57257
+\f0 \uc0\u55356 \u57257
\f1 \\ud83c\\udfa9 top hat\
-\f0 \uc0\u55356 \u57258
+\f0 \uc0\u55356 \u57258
\f1 \\ud83c\\udfaa circus tent\
-\f0 \uc0\u55356 \u57259
+\f0 \uc0\u55356 \u57259
\f1 \\ud83c\\udfab ticket\
-\f0 \uc0\u55356 \u57260
+\f0 \uc0\u55356 \u57260
\f1 \\ud83c\\udfac clapper board\
-\f0 \uc0\u55356 \u57261
+\f0 \uc0\u55356 \u57261
\f1 \\ud83c\\udfad performing arts\
-\f0 \uc0\u55356 \u57262
+\f0 \uc0\u55356 \u57262
\f1 \\ud83c\\udfae video game\
-\f0 \uc0\u55356 \u57263
+\f0 \uc0\u55356 \u57263
\f1 \\ud83c\\udfaf direct hit\
-\f0 \uc0\u55356 \u57264
+\f0 \uc0\u55356 \u57264
\f1 \\ud83c\\udfb0 slot machine\
-\f0 \uc0\u55356 \u57265
+\f0 \uc0\u55356 \u57265
\f1 \\ud83c\\udfb1 billiards\
-\f0 \uc0\u55356 \u57266
+\f0 \uc0\u55356 \u57266
\f1 \\ud83c\\udfb2 game die\
-\f0 \uc0\u55356 \u57267
+\f0 \uc0\u55356 \u57267
\f1 \\ud83c\\udfb3 bowling\
-\f0 \uc0\u55356 \u57268
+\f0 \uc0\u55356 \u57268
\f1 \\ud83c\\udfb4 flower playing cards\
-\f0 \uc0\u55356 \u57269
+\f0 \uc0\u55356 \u57269
\f1 \\ud83c\\udfb5 musical note\
-\f0 \uc0\u55356 \u57270
+\f0 \uc0\u55356 \u57270
\f1 \\ud83c\\udfb6 multiple musical notes\
-\f0 \uc0\u55356 \u57271
+\f0 \uc0\u55356 \u57271
\f1 \\ud83c\\udfb7 saxophone\
-\f0 \uc0\u55356 \u57272
+\f0 \uc0\u55356 \u57272
\f1 \\ud83c\\udfb8 guitar\
-\f0 \uc0\u55356 \u57273
+\f0 \uc0\u55356 \u57273
\f1 \\ud83c\\udfb9 musical keyboard\
-\f0 \uc0\u55356 \u57274
+\f0 \uc0\u55356 \u57274
\f1 \\ud83c\\udfba trumpet\
-\f0 \uc0\u55356 \u57275
+\f0 \uc0\u55356 \u57275
\f1 \\ud83c\\udfbb violin\
-\f0 \uc0\u55356 \u57276
+\f0 \uc0\u55356 \u57276
\f1 \\ud83c\\udfbc musical score\
-\f0 \uc0\u55356 \u57277
+\f0 \uc0\u55356 \u57277
\f1 \\ud83c\\udfbd running shirt with sash\
-\f0 \uc0\u55356 \u57278
+\f0 \uc0\u55356 \u57278
\f1 \\ud83c\\udfbe tennis racquet and ball\
-\f0 \uc0\u55356 \u57279
+\f0 \uc0\u55356 \u57279
\f1 \\ud83c\\udfbf ski and ski boot\
-\f0 \uc0\u55356 \u57280
+\f0 \uc0\u55356 \u57280
\f1 \\ud83c\\udfc0 basketball and hoop\
-\f0 \uc0\u55356 \u57281
+\f0 \uc0\u55356 \u57281
\f1 \\ud83c\\udfc1 chequered flag\
-\f0 \uc0\u55356 \u57282
+\f0 \uc0\u55356 \u57282
\f1 \\ud83c\\udfc2 snowboarder\
-\f0 \uc0\u55356 \u57283
+\f0 \uc0\u55356 \u57283
\f1 \\ud83c\\udfc3 runner\
-\f0 \uc0\u55356 \u57284
+\f0 \uc0\u55356 \u57284
\f1 \\ud83c\\udfc4 surfer\
-\f0 \uc0\u55356 \u57286
+\f0 \uc0\u55356 \u57286
\f1 \\ud83c\\udfc6 trophy\
-\f0 \uc0\u55356 \u57288
+\f0 \uc0\u55356 \u57288
\f1 \\ud83c\\udfc8 american football\
-\f0 \uc0\u55356 \u57290
+\f0 \uc0\u55356 \u57290
\f1 \\ud83c\\udfca swimmer\
-\f0 \uc0\u55356 \u57312
+\f0 \uc0\u55356 \u57312
\f1 \\ud83c\\udfe0 house building\
-\f0 \uc0\u55356 \u57313
+\f0 \uc0\u55356 \u57313
\f1 \\ud83c\\udfe1 house with garden\
-\f0 \uc0\u55356 \u57314
+\f0 \uc0\u55356 \u57314
\f1 \\ud83c\\udfe2 office building\
-\f0 \uc0\u55356 \u57315
+\f0 \uc0\u55356 \u57315
\f1 \\ud83c\\udfe3 japanese post office\
-\f0 \uc0\u55356 \u57317
+\f0 \uc0\u55356 \u57317
\f1 \\ud83c\\udfe5 hospital\
-\f0 \uc0\u55356 \u57318
+\f0 \uc0\u55356 \u57318
\f1 \\ud83c\\udfe6 bank\
-\f0 \uc0\u55356 \u57319
+\f0 \uc0\u55356 \u57319
\f1 \\ud83c\\udfe7 automated teller machine\
-\f0 \uc0\u55356 \u57320
+\f0 \uc0\u55356 \u57320
\f1 \\ud83c\\udfe8 hotel\
-\f0 \uc0\u55356 \u57321
+\f0 \uc0\u55356 \u57321
\f1 \\ud83c\\udfe9 love hotel\
-\f0 \uc0\u55356 \u57322
+\f0 \uc0\u55356 \u57322
\f1 \\ud83c\\udfea convenience store\
-\f0 \uc0\u55356 \u57323
+\f0 \uc0\u55356 \u57323
\f1 \\ud83c\\udfeb school\
-\f0 \uc0\u55356 \u57324
+\f0 \uc0\u55356 \u57324
\f1 \\ud83c\\udfec department store\
-\f0 \uc0\u55356 \u57325
+\f0 \uc0\u55356 \u57325
\f1 \\ud83c\\udfed factory\
-\f0 \uc0\u55356 \u57326
+\f0 \uc0\u55356 \u57326
\f1 \\ud83c\\udfee izakaya lantern\
-\f0 \uc0\u55356 \u57327
+\f0 \uc0\u55356 \u57327
\f1 \\ud83c\\udfef japanese castle\
-\f0 \uc0\u55356 \u57328
+\f0 \uc0\u55356 \u57328
\f1 \\ud83c\\udff0 european castle\
-\f0 \uc0\u55357 \u56332
+\f0 \uc0\u55357 \u56332
\f1 \\ud83d\\udc0c snail\
-\f0 \uc0\u55357 \u56333
+\f0 \uc0\u55357 \u56333
\f1 \\ud83d\\udc0d snake\
-\f0 \uc0\u55357 \u56334
+\f0 \uc0\u55357 \u56334
\f1 \\ud83d\\udc0e horse\
-\f0 \uc0\u55357 \u56337
+\f0 \uc0\u55357 \u56337
\f1 \\ud83d\\udc11 sheep\
-\f0 \uc0\u55357 \u56338
+\f0 \uc0\u55357 \u56338
\f1 \\ud83d\\udc12 monkey\
-\f0 \uc0\u55357 \u56340
+\f0 \uc0\u55357 \u56340
\f1 \\ud83d\\udc14 chicken\
-\f0 \uc0\u55357 \u56343
+\f0 \uc0\u55357 \u56343
\f1 \\ud83d\\udc17 boar\
-\f0 \uc0\u55357 \u56344
+\f0 \uc0\u55357 \u56344
\f1 \\ud83d\\udc18 elephant\
-\f0 \uc0\u55357 \u56345
+\f0 \uc0\u55357 \u56345
\f1 \\ud83d\\udc19 octopus\
-\f0 \uc0\u55357 \u56346
+\f0 \uc0\u55357 \u56346
\f1 \\ud83d\\udc1a spiral shell\
-\f0 \uc0\u55357 \u56347
+\f0 \uc0\u55357 \u56347
\f1 \\ud83d\\udc1b bug\
-\f0 \uc0\u55357 \u56348
+\f0 \uc0\u55357 \u56348
\f1 \\ud83d\\udc1c ant\
-\f0 \uc0\u55357 \u56349
+\f0 \uc0\u55357 \u56349
\f1 \\ud83d\\udc1d honeybee\
-\f0 \uc0\u55357 \u56350
+\f0 \uc0\u55357 \u56350
\f1 \\ud83d\\udc1e lady beetle\
-\f0 \uc0\u55357 \u56351
+\f0 \uc0\u55357 \u56351
\f1 \\ud83d\\udc1f fish\
-\f0 \uc0\u55357 \u56352
+\f0 \uc0\u55357 \u56352
\f1 \\ud83d\\udc20 tropical fish\
-\f0 \uc0\u55357 \u56353
+\f0 \uc0\u55357 \u56353
\f1 \\ud83d\\udc21 blowfish\
-\f0 \uc0\u55357 \u56354
+\f0 \uc0\u55357 \u56354
\f1 \\ud83d\\udc22 turtle\
-\f0 \uc0\u55357 \u56355
+\f0 \uc0\u55357 \u56355
\f1 \\ud83d\\udc23 hatching chick\
-\f0 \uc0\u55357 \u56356
+\f0 \uc0\u55357 \u56356
\f1 \\ud83d\\udc24 baby chick\
-\f0 \uc0\u55357 \u56357
+\f0 \uc0\u55357 \u56357
\f1 \\ud83d\\udc25 front-facing baby chick\
-\f0 \uc0\u55357 \u56358
+\f0 \uc0\u55357 \u56358
\f1 \\ud83d\\udc26 bird\
-\f0 \uc0\u55357 \u56359
+\f0 \uc0\u55357 \u56359
\f1 \\ud83d\\udc27 penguin\
-\f0 \uc0\u55357 \u56360
+\f0 \uc0\u55357 \u56360
\f1 \\ud83d\\udc28 koala\
-\f0 \uc0\u55357 \u56361
+\f0 \uc0\u55357 \u56361
\f1 \\ud83d\\udc29 poodle\
-\f0 \uc0\u55357 \u56363
+\f0 \uc0\u55357 \u56363
\f1 \\ud83d\\udc2b bactrian camel\
-\f0 \uc0\u55357 \u56364
+\f0 \uc0\u55357 \u56364
\f1 \\ud83d\\udc2c dolphin\
-\f0 \uc0\u55357 \u56365
+\f0 \uc0\u55357 \u56365
\f1 \\ud83d\\udc2d mouse face\
-\f0 \uc0\u55357 \u56366
+\f0 \uc0\u55357 \u56366
\f1 \\ud83d\\udc2e cow face\
-\f0 \uc0\u55357 \u56367
+\f0 \uc0\u55357 \u56367
\f1 \\ud83d\\udc2f tiger face\
-\f0 \uc0\u55357 \u56368
+\f0 \uc0\u55357 \u56368
\f1 \\ud83d\\udc30 rabbit face\
-\f0 \uc0\u55357 \u56369
+\f0 \uc0\u55357 \u56369
\f1 \\ud83d\\udc31 cat face\
-\f0 \uc0\u55357 \u56370
+\f0 \uc0\u55357 \u56370
\f1 \\ud83d\\udc32 dragon face\
-\f0 \uc0\u55357 \u56371
+\f0 \uc0\u55357 \u56371
\f1 \\ud83d\\udc33 spouting whale\
-\f0 \uc0\u55357 \u56372
+\f0 \uc0\u55357 \u56372
\f1 \\ud83d\\udc34 horse face\
-\f0 \uc0\u55357 \u56373
+\f0 \uc0\u55357 \u56373
\f1 \\ud83d\\udc35 monkey face\
-\f0 \uc0\u55357 \u56374
+\f0 \uc0\u55357 \u56374
\f1 \\ud83d\\udc36 dog face\
-\f0 \uc0\u55357 \u56375
+\f0 \uc0\u55357 \u56375
\f1 \\ud83d\\udc37 pig face\
-\f0 \uc0\u55357 \u56376
+\f0 \uc0\u55357 \u56376
\f1 \\ud83d\\udc38 frog face\
-\f0 \uc0\u55357 \u56377
+\f0 \uc0\u55357 \u56377
\f1 \\ud83d\\udc39 hamster face\
-\f0 \uc0\u55357 \u56378
+\f0 \uc0\u55357 \u56378
\f1 \\ud83d\\udc3a wolf face\
-\f0 \uc0\u55357 \u56379
+\f0 \uc0\u55357 \u56379
\f1 \\ud83d\\udc3b bear face\
-\f0 \uc0\u55357 \u56380
+\f0 \uc0\u55357 \u56380
\f1 \\ud83d\\udc3c panda face\
-\f0 \uc0\u55357 \u56381
+\f0 \uc0\u55357 \u56381
\f1 \\ud83d\\udc3d pig nose\
-\f0 \uc0\u55357 \u56382
+\f0 \uc0\u55357 \u56382
\f1 \\ud83d\\udc3e paw prints\
-\f0 \uc0\u55357 \u56384
+\f0 \uc0\u55357 \u56384
\f1 \\ud83d\\udc40 eyes\
-\f0 \uc0\u55357 \u56386
+\f0 \uc0\u55357 \u56386
\f1 \\ud83d\\udc42 ear\
-\f0 \uc0\u55357 \u56387
+\f0 \uc0\u55357 \u56387
\f1 \\ud83d\\udc43 nose\
-\f0 \uc0\u55357 \u56388
+\f0 \uc0\u55357 \u56388
\f1 \\ud83d\\udc44 mouth\
-\f0 \uc0\u55357 \u56389
+\f0 \uc0\u55357 \u56389
\f1 \\ud83d\\udc45 tongue\
-\f0 \uc0\u55357 \u56390
+\f0 \uc0\u55357 \u56390
\f1 \\ud83d\\udc46 white up pointing backhand index\
-\f0 \uc0\u55357 \u56391
+\f0 \uc0\u55357 \u56391
\f1 \\ud83d\\udc47 white down pointing backhand index\
-\f0 \uc0\u55357 \u56392
+\f0 \uc0\u55357 \u56392
\f1 \\ud83d\\udc48 white left pointing backhand index\
-\f0 \uc0\u55357 \u56393
+\f0 \uc0\u55357 \u56393
\f1 \\ud83d\\udc49 white right pointing backhand index\
-\f0 \uc0\u55357 \u56394
+\f0 \uc0\u55357 \u56394
\f1 \\ud83d\\udc4a fisted hand sign\
-\f0 \uc0\u55357 \u56395
+\f0 \uc0\u55357 \u56395
\f1 \\ud83d\\udc4b waving hand sign\
-\f0 \uc0\u55357 \u56396
+\f0 \uc0\u55357 \u56396
\f1 \\ud83d\\udc4c ok hand sign\
-\f0 \uc0\u55357 \u56397
+\f0 \uc0\u55357 \u56397
\f1 \\ud83d\\udc4d thumbs up sign\
-\f0 \uc0\u55357 \u56398
+\f0 \uc0\u55357 \u56398
\f1 \\ud83d\\udc4e thumbs down sign\
-\f0 \uc0\u55357 \u56399
+\f0 \uc0\u55357 \u56399
\f1 \\ud83d\\udc4f clapping hands sign\
-\f0 \uc0\u55357 \u56400
+\f0 \uc0\u55357 \u56400
\f1 \\ud83d\\udc50 open hands sign\
-\f0 \uc0\u55357 \u56401
+\f0 \uc0\u55357 \u56401
\f1 \\ud83d\\udc51 crown\
-\f0 \uc0\u55357 \u56402
+\f0 \uc0\u55357 \u56402
\f1 \\ud83d\\udc52 womans hat\
-\f0 \uc0\u55357 \u56403
+\f0 \uc0\u55357 \u56403
\f1 \\ud83d\\udc53 eyeglasses\
-\f0 \uc0\u55357 \u56404
+\f0 \uc0\u55357 \u56404
\f1 \\ud83d\\udc54 necktie\
-\f0 \uc0\u55357 \u56405
+\f0 \uc0\u55357 \u56405
\f1 \\ud83d\\udc55 t-shirt\
-\f0 \uc0\u55357 \u56406
+\f0 \uc0\u55357 \u56406
\f1 \\ud83d\\udc56 jeans\
-\f0 \uc0\u55357 \u56407
+\f0 \uc0\u55357 \u56407
\f1 \\ud83d\\udc57 dress\
-\f0 \uc0\u55357 \u56408
+\f0 \uc0\u55357 \u56408
\f1 \\ud83d\\udc58 kimono\
-\f0 \uc0\u55357 \u56409
+\f0 \uc0\u55357 \u56409
\f1 \\ud83d\\udc59 bikini\
-\f0 \uc0\u55357 \u56410
+\f0 \uc0\u55357 \u56410
\f1 \\ud83d\\udc5a womans clothes\
-\f0 \uc0\u55357 \u56411
+\f0 \uc0\u55357 \u56411
\f1 \\ud83d\\udc5b purse\
-\f0 \uc0\u55357 \u56412
+\f0 \uc0\u55357 \u56412
\f1 \\ud83d\\udc5c handbag\
-\f0 \uc0\u55357 \u56413
+\f0 \uc0\u55357 \u56413
\f1 \\ud83d\\udc5d pouch\
-\f0 \uc0\u55357 \u56414
+\f0 \uc0\u55357 \u56414
\f1 \\ud83d\\udc5e mans shoe\
-\f0 \uc0\u55357 \u56415
+\f0 \uc0\u55357 \u56415
\f1 \\ud83d\\udc5f athletic shoe\
-\f0 \uc0\u55357 \u56416
+\f0 \uc0\u55357 \u56416
\f1 \\ud83d\\udc60 high-heeled shoe\
-\f0 \uc0\u55357 \u56417
+\f0 \uc0\u55357 \u56417
\f1 \\ud83d\\udc61 womans sandal\
-\f0 \uc0\u55357 \u56418
+\f0 \uc0\u55357 \u56418
\f1 \\ud83d\\udc62 womans boots\
-\f0 \uc0\u55357 \u56419
+\f0 \uc0\u55357 \u56419
\f1 \\ud83d\\udc63 footprints\
-\f0 \uc0\u55357 \u56420
+\f0 \uc0\u55357 \u56420
\f1 \\ud83d\\udc64 bust in silhouette\
-\f0 \uc0\u55357 \u56422
+\f0 \uc0\u55357 \u56422
\f1 \\ud83d\\udc66 boy\
-\f0 \uc0\u55357 \u56423
+\f0 \uc0\u55357 \u56423
\f1 \\ud83d\\udc67 girl\
-\f0 \uc0\u55357 \u56424
+\f0 \uc0\u55357 \u56424
\f1 \\ud83d\\udc68 man\
-\f0 \uc0\u55357 \u56425
+\f0 \uc0\u55357 \u56425
\f1 \\ud83d\\udc69 woman\
-\f0 \uc0\u55357 \u56426
+\f0 \uc0\u55357 \u56426
\f1 \\ud83d\\udc6a family\
-\f0 \uc0\u55357 \u56427
+\f0 \uc0\u55357 \u56427
\f1 \\ud83d\\udc6b man and woman holding hands\
-\f0 \uc0\u55357 \u56430
+\f0 \uc0\u55357 \u56430
\f1 \\ud83d\\udc6e police officer\
-\f0 \uc0\u55357 \u56431
+\f0 \uc0\u55357 \u56431
\f1 \\ud83d\\udc6f woman with bunny ears\
-\f0 \uc0\u55357 \u56432
+\f0 \uc0\u55357 \u56432
\f1 \\ud83d\\udc70 bride with veil\
-\f0 \uc0\u55357 \u56433
+\f0 \uc0\u55357 \u56433
\f1 \\ud83d\\udc71 person with blond hair\
-\f0 \uc0\u55357 \u56434
+\f0 \uc0\u55357 \u56434
\f1 \\ud83d\\udc72 man with gua pi mao\
-\f0 \uc0\u55357 \u56435
+\f0 \uc0\u55357 \u56435
\f1 \\ud83d\\udc73 man with turban\
-\f0 \uc0\u55357 \u56436
+\f0 \uc0\u55357 \u56436
\f1 \\ud83d\\udc74 older man\
-\f0 \uc0\u55357 \u56437
+\f0 \uc0\u55357 \u56437
\f1 \\ud83d\\udc75 older woman\
-\f0 \uc0\u55357 \u56438
+\f0 \uc0\u55357 \u56438
\f1 \\ud83d\\udc76 baby\
-\f0 \uc0\u55357 \u56439
+\f0 \uc0\u55357 \u56439
\f1 \\ud83d\\udc77 construction worker\
-\f0 \uc0\u55357 \u56440
+\f0 \uc0\u55357 \u56440
\f1 \\ud83d\\udc78 princess\
-\f0 \uc0\u55357 \u56441
+\f0 \uc0\u55357 \u56441
\f1 \\ud83d\\udc79 japanese ogre\
-\f0 \uc0\u55357 \u56442
+\f0 \uc0\u55357 \u56442
\f1 \\ud83d\\udc7a japanese goblin\
-\f0 \uc0\u55357 \u56443
+\f0 \uc0\u55357 \u56443
\f1 \\ud83d\\udc7b ghost\
-\f0 \uc0\u55357 \u56444
+\f0 \uc0\u55357 \u56444
\f1 \\ud83d\\udc7c baby angel\
-\f0 \uc0\u55357 \u56445
+\f0 \uc0\u55357 \u56445
\f1 \\ud83d\\udc7d extraterrestrial alien\
-\f0 \uc0\u55357 \u56446
+\f0 \uc0\u55357 \u56446
\f1 \\ud83d\\udc7e alien monster\
-\f0 \uc0\u55357 \u56447
+\f0 \uc0\u55357 \u56447
\f1 \\ud83d\\udc7f imp\
-\f0 \uc0\u55357 \u56448
+\f0 \uc0\u55357 \u56448
\f1 \\ud83d\\udc80 skull\
-\f0 \uc0\u55357 \u56449
+\f0 \uc0\u55357 \u56449
\f1 \\ud83d\\udc81 information desk person\
-\f0 \uc0\u55357 \u56450
+\f0 \uc0\u55357 \u56450
\f1 \\ud83d\\udc82 guardsman\
-\f0 \uc0\u55357 \u56451
+\f0 \uc0\u55357 \u56451
\f1 \\ud83d\\udc83 dancer\
-\f0 \uc0\u55357 \u56452
+\f0 \uc0\u55357 \u56452
\f1 \\ud83d\\udc84 lipstick\
-\f0 \uc0\u55357 \u56453
+\f0 \uc0\u55357 \u56453
\f1 \\ud83d\\udc85 nail polish\
-\f0 \uc0\u55357 \u56454
+\f0 \uc0\u55357 \u56454
\f1 \\ud83d\\udc86 face massage\
-\f0 \uc0\u55357 \u56455
+\f0 \uc0\u55357 \u56455
\f1 \\ud83d\\udc87 haircut\
-\f0 \uc0\u55357 \u56456
+\f0 \uc0\u55357 \u56456
\f1 \\ud83d\\udc88 barber pole\
-\f0 \uc0\u55357 \u56457
+\f0 \uc0\u55357 \u56457
\f1 \\ud83d\\udc89 syringe\
-\f0 \uc0\u55357 \u56458
+\f0 \uc0\u55357 \u56458
\f1 \\ud83d\\udc8a pill\
-\f0 \uc0\u55357 \u56459
+\f0 \uc0\u55357 \u56459
\f1 \\ud83d\\udc8b kiss mark\
-\f0 \uc0\u55357 \u56460
+\f0 \uc0\u55357 \u56460
\f1 \\ud83d\\udc8c love letter\
-\f0 \uc0\u55357 \u56461
+\f0 \uc0\u55357 \u56461
\f1 \\ud83d\\udc8d ring\
-\f0 \uc0\u55357 \u56462
+\f0 \uc0\u55357 \u56462
\f1 \\ud83d\\udc8e gem stone\
-\f0 \uc0\u55357 \u56463
+\f0 \uc0\u55357 \u56463
\f1 \\ud83d\\udc8f kiss\
-\f0 \uc0\u55357 \u56464
+\f0 \uc0\u55357 \u56464
\f1 \\ud83d\\udc90 bouquet\
-\f0 \uc0\u55357 \u56465
+\f0 \uc0\u55357 \u56465
\f1 \\ud83d\\udc91 couple with heart\
-\f0 \uc0\u55357 \u56466
+\f0 \uc0\u55357 \u56466
\f1 \\ud83d\\udc92 wedding\
-\f0 \uc0\u55357 \u56467
+\f0 \uc0\u55357 \u56467
\f1 \\ud83d\\udc93 beating heart\
-\f0 \uc0\u55357 \u56468
+\f0 \uc0\u55357 \u56468
\f1 \\ud83d\\udc94 broken heart\
-\f0 \uc0\u55357 \u56469
+\f0 \uc0\u55357 \u56469
\f1 \\ud83d\\udc95 two hearts\
-\f0 \uc0\u55357 \u56470
+\f0 \uc0\u55357 \u56470
\f1 \\ud83d\\udc96 sparkling heart\
-\f0 \uc0\u55357 \u56471
+\f0 \uc0\u55357 \u56471
\f1 \\ud83d\\udc97 growing heart\
-\f0 \uc0\u55357 \u56472
+\f0 \uc0\u55357 \u56472
\f1 \\ud83d\\udc98 heart with arrow\
-\f0 \uc0\u55357 \u56473
+\f0 \uc0\u55357 \u56473
\f1 \\ud83d\\udc99 blue heart\
-\f0 \uc0\u55357 \u56474
+\f0 \uc0\u55357 \u56474
\f1 \\ud83d\\udc9a green heart\
-\f0 \uc0\u55357 \u56475
+\f0 \uc0\u55357 \u56475
\f1 \\ud83d\\udc9b yellow heart\
-\f0 \uc0\u55357 \u56476
+\f0 \uc0\u55357 \u56476
\f1 \\ud83d\\udc9c purple heart\
-\f0 \uc0\u55357 \u56477
+\f0 \uc0\u55357 \u56477
\f1 \\ud83d\\udc9d heart with ribbon\
-\f0 \uc0\u55357 \u56478
+\f0 \uc0\u55357 \u56478
\f1 \\ud83d\\udc9e revolving hearts\
-\f0 \uc0\u55357 \u56479
+\f0 \uc0\u55357 \u56479
\f1 \\ud83d\\udc9f heart decoration\
-\f0 \uc0\u55357 \u56480
+\f0 \uc0\u55357 \u56480
\f1 \\ud83d\\udca0 diamond shape with a dot inside\
-\f0 \uc0\u55357 \u56481
+\f0 \uc0\u55357 \u56481
\f1 \\ud83d\\udca1 electric light bulb\
-\f0 \uc0\u55357 \u56482
+\f0 \uc0\u55357 \u56482
\f1 \\ud83d\\udca2 anger symbol\
-\f0 \uc0\u55357 \u56483
+\f0 \uc0\u55357 \u56483
\f1 \\ud83d\\udca3 bomb\
-\f0 \uc0\u55357 \u56484
+\f0 \uc0\u55357 \u56484
\f1 \\ud83d\\udca4 sleeping symbol\
-\f0 \uc0\u55357 \u56485
+\f0 \uc0\u55357 \u56485
\f1 \\ud83d\\udca5 collision symbol\
-\f0 \uc0\u55357 \u56486
+\f0 \uc0\u55357 \u56486
\f1 \\ud83d\\udca6 splashing sweat symbol\
-\f0 \uc0\u55357 \u56487
+\f0 \uc0\u55357 \u56487
\f1 \\ud83d\\udca7 droplet\
-\f0 \uc0\u55357 \u56488
+\f0 \uc0\u55357 \u56488
\f1 \\ud83d\\udca8 dash symbol\
-\f0 \uc0\u55357 \u56489
+\f0 \uc0\u55357 \u56489
\f1 \\ud83d\\udca9 pile of poo\
-\f0 \uc0\u55357 \u56490
+\f0 \uc0\u55357 \u56490
\f1 \\ud83d\\udcaa flexed biceps\
-\f0 \uc0\u55357 \u56491
+\f0 \uc0\u55357 \u56491
\f1 \\ud83d\\udcab dizzy symbol\
-\f0 \uc0\u55357 \u56492
+\f0 \uc0\u55357 \u56492
\f1 \\ud83d\\udcac speech balloon\
-\f0 \uc0\u55357 \u56494
+\f0 \uc0\u55357 \u56494
\f1 \\ud83d\\udcae white flower\
-\f0 \uc0\u55357 \u56495
+\f0 \uc0\u55357 \u56495
\f1 \\ud83d\\udcaf hundred points symbol\
-\f0 \uc0\u55357 \u56496
+\f0 \uc0\u55357 \u56496
\f1 \\ud83d\\udcb0 money bag\
-\f0 \uc0\u55357 \u56497
+\f0 \uc0\u55357 \u56497
\f1 \\ud83d\\udcb1 currency exchange\
-\f0 \uc0\u55357 \u56498
+\f0 \uc0\u55357 \u56498
\f1 \\ud83d\\udcb2 heavy dollar sign\
-\f0 \uc0\u55357 \u56499
+\f0 \uc0\u55357 \u56499
\f1 \\ud83d\\udcb3 credit card\
-\f0 \uc0\u55357 \u56500
+\f0 \uc0\u55357 \u56500
\f1 \\ud83d\\udcb4 banknote with yen sign\
-\f0 \uc0\u55357 \u56501
+\f0 \uc0\u55357 \u56501
\f1 \\ud83d\\udcb5 banknote with dollar sign\
-\f0 \uc0\u55357 \u56504
+\f0 \uc0\u55357 \u56504
\f1 \\ud83d\\udcb8 money with wings\
-\f0 \uc0\u55357 \u56505
+\f0 \uc0\u55357 \u56505
\f1 \\ud83d\\udcb9 chart with upwards trend and yen sign\
-\f0 \uc0\u55357 \u56506
+\f0 \uc0\u55357 \u56506
\f1 \\ud83d\\udcba seat\
-\f0 \uc0\u55357 \u56507
+\f0 \uc0\u55357 \u56507
\f1 \\ud83d\\udcbb personal computer\
-\f0 \uc0\u55357 \u56508
+\f0 \uc0\u55357 \u56508
\f1 \\ud83d\\udcbc briefcase\
-\f0 \uc0\u55357 \u56509
+\f0 \uc0\u55357 \u56509
\f1 \\ud83d\\udcbd minidisc\
-\f0 \uc0\u55357 \u56510
+\f0 \uc0\u55357 \u56510
\f1 \\ud83d\\udcbe floppy disk\
-\f0 \uc0\u55357 \u56511
+\f0 \uc0\u55357 \u56511
\f1 \\ud83d\\udcbf optical disc\
-\f0 \uc0\u55357 \u56512
+\f0 \uc0\u55357 \u56512
\f1 \\ud83d\\udcc0 dvd\
-\f0 \uc0\u55357 \u56513
+\f0 \uc0\u55357 \u56513
\f1 \\ud83d\\udcc1 file folder\
-\f0 \uc0\u55357 \u56514
+\f0 \uc0\u55357 \u56514
\f1 \\ud83d\\udcc2 open file folder\
-\f0 \uc0\u55357 \u56515
+\f0 \uc0\u55357 \u56515
\f1 \\ud83d\\udcc3 page with curl\
-\f0 \uc0\u55357 \u56516
+\f0 \uc0\u55357 \u56516
\f1 \\ud83d\\udcc4 page facing up\
-\f0 \uc0\u55357 \u56517
+\f0 \uc0\u55357 \u56517
\f1 \\ud83d\\udcc5 calendar\
-\f0 \uc0\u55357 \u56518
+\f0 \uc0\u55357 \u56518
\f1 \\ud83d\\udcc6 tear-off calendar\
-\f0 \uc0\u55357 \u56519
+\f0 \uc0\u55357 \u56519
\f1 \\ud83d\\udcc7 card index\
-\f0 \uc0\u55357 \u56520
+\f0 \uc0\u55357 \u56520
\f1 \\ud83d\\udcc8 chart with upwards trend\
-\f0 \uc0\u55357 \u56521
+\f0 \uc0\u55357 \u56521
\f1 \\ud83d\\udcc9 chart with downwards trend\
-\f0 \uc0\u55357 \u56522
+\f0 \uc0\u55357 \u56522
\f1 \\ud83d\\udcca bar chart\
-\f0 \uc0\u55357 \u56523
+\f0 \uc0\u55357 \u56523
\f1 \\ud83d\\udccb clipboard\
-\f0 \uc0\u55357 \u56524
+\f0 \uc0\u55357 \u56524
\f1 \\ud83d\\udccc pushpin\
-\f0 \uc0\u55357 \u56525
+\f0 \uc0\u55357 \u56525
\f1 \\ud83d\\udccd round pushpin\
-\f0 \uc0\u55357 \u56526
+\f0 \uc0\u55357 \u56526
\f1 \\ud83d\\udcce paperclip\
-\f0 \uc0\u55357 \u56527
+\f0 \uc0\u55357 \u56527
\f1 \\ud83d\\udccf straight ruler\
-\f0 \uc0\u55357 \u56528
+\f0 \uc0\u55357 \u56528
\f1 \\ud83d\\udcd0 triangular ruler\
-\f0 \uc0\u55357 \u56529
+\f0 \uc0\u55357 \u56529
\f1 \\ud83d\\udcd1 bookmark tabs\
-\f0 \uc0\u55357 \u56530
+\f0 \uc0\u55357 \u56530
\f1 \\ud83d\\udcd2 ledger\
-\f0 \uc0\u55357 \u56531
+\f0 \uc0\u55357 \u56531
\f1 \\ud83d\\udcd3 notebook\
-\f0 \uc0\u55357 \u56532
+\f0 \uc0\u55357 \u56532
\f1 \\ud83d\\udcd4 notebook with decorative cover\
-\f0 \uc0\u55357 \u56533
+\f0 \uc0\u55357 \u56533
\f1 \\ud83d\\udcd5 closed book\
-\f0 \uc0\u55357 \u56534
+\f0 \uc0\u55357 \u56534
\f1 \\ud83d\\udcd6 open book\
-\f0 \uc0\u55357 \u56535
+\f0 \uc0\u55357 \u56535
\f1 \\ud83d\\udcd7 green book\
-\f0 \uc0\u55357 \u56536
+\f0 \uc0\u55357 \u56536
\f1 \\ud83d\\udcd8 blue book\
-\f0 \uc0\u55357 \u56537
+\f0 \uc0\u55357 \u56537
\f1 \\ud83d\\udcd9 orange book\
-\f0 \uc0\u55357 \u56538
+\f0 \uc0\u55357 \u56538
\f1 \\ud83d\\udcda books\
-\f0 \uc0\u55357 \u56539
+\f0 \uc0\u55357 \u56539
\f1 \\ud83d\\udcdb name badge\
-\f0 \uc0\u55357 \u56540
+\f0 \uc0\u55357 \u56540
\f1 \\ud83d\\udcdc scroll\
-\f0 \uc0\u55357 \u56541
+\f0 \uc0\u55357 \u56541
\f1 \\ud83d\\udcdd memo\
-\f0 \uc0\u55357 \u56542
+\f0 \uc0\u55357 \u56542
\f1 \\ud83d\\udcde telephone receiver\
-\f0 \uc0\u55357 \u56543
+\f0 \uc0\u55357 \u56543
\f1 \\ud83d\\udcdf pager\
-\f0 \uc0\u55357 \u56544
+\f0 \uc0\u55357 \u56544
\f1 \\ud83d\\udce0 fax machine\
-\f0 \uc0\u55357 \u56545
+\f0 \uc0\u55357 \u56545
\f1 \\ud83d\\udce1 satellite antenna\
-\f0 \uc0\u55357 \u56546
+\f0 \uc0\u55357 \u56546
\f1 \\ud83d\\udce2 public address loudspeaker\
-\f0 \uc0\u55357 \u56547
+\f0 \uc0\u55357 \u56547
\f1 \\ud83d\\udce3 cheering megaphone\
-\f0 \uc0\u55357 \u56548
+\f0 \uc0\u55357 \u56548
\f1 \\ud83d\\udce4 outbox tray\
-\f0 \uc0\u55357 \u56549
+\f0 \uc0\u55357 \u56549
\f1 \\ud83d\\udce5 inbox tray\
-\f0 \uc0\u55357 \u56550
+\f0 \uc0\u55357 \u56550
\f1 \\ud83d\\udce6 package\
-\f0 \uc0\u55357 \u56551
+\f0 \uc0\u55357 \u56551
\f1 \\ud83d\\udce7 e-mail symbol\
-\f0 \uc0\u55357 \u56552
+\f0 \uc0\u55357 \u56552
\f1 \\ud83d\\udce8 incoming envelope\
-\f0 \uc0\u55357 \u56553
+\f0 \uc0\u55357 \u56553
\f1 \\ud83d\\udce9 envelope with downwards arrow above\
-\f0 \uc0\u55357 \u56554
+\f0 \uc0\u55357 \u56554
\f1 \\ud83d\\udcea closed mailbox with lowered flag\
-\f0 \uc0\u55357 \u56555
+\f0 \uc0\u55357 \u56555
\f1 \\ud83d\\udceb closed mailbox with raised flag\
-\f0 \uc0\u55357 \u56558
+\f0 \uc0\u55357 \u56558
\f1 \\ud83d\\udcee postbox\
-\f0 \uc0\u55357 \u56560
+\f0 \uc0\u55357 \u56560
\f1 \\ud83d\\udcf0 newspaper\
-\f0 \uc0\u55357 \u56561
+\f0 \uc0\u55357 \u56561
\f1 \\ud83d\\udcf1 mobile phone\
-\f0 \uc0\u55357 \u56562
+\f0 \uc0\u55357 \u56562
\f1 \\ud83d\\udcf2 mobile phone with rightwards arrow at left\
-\f0 \uc0\u55357 \u56563
+\f0 \uc0\u55357 \u56563
\f1 \\ud83d\\udcf3 vibration mode\
-\f0 \uc0\u55357 \u56564
+\f0 \uc0\u55357 \u56564
\f1 \\ud83d\\udcf4 mobile phone off\
-\f0 \uc0\u55357 \u56566
+\f0 \uc0\u55357 \u56566
\f1 \\ud83d\\udcf6 antenna with bars\
-\f0 \uc0\u55357 \u56567
+\f0 \uc0\u55357 \u56567
\f1 \\ud83d\\udcf7 camera\
-\f0 \uc0\u55357 \u56569
+\f0 \uc0\u55357 \u56569
\f1 \\ud83d\\udcf9 video camera\
-\f0 \uc0\u55357 \u56570
+\f0 \uc0\u55357 \u56570
\f1 \\ud83d\\udcfa television\
-\f0 \uc0\u55357 \u56571
+\f0 \uc0\u55357 \u56571
\f1 \\ud83d\\udcfb radio\
-\f0 \uc0\u55357 \u56572
+\f0 \uc0\u55357 \u56572
\f1 \\ud83d\\udcfc videocassette\
-\f0 \uc0\u55357 \u56579
+\f0 \uc0\u55357 \u56579
\f1 \\ud83d\\udd03 clockwise downwards and upwards open circle arrows\
-\f0 \uc0\u55357 \u56586
+\f0 \uc0\u55357 \u56586
\f1 \\ud83d\\udd0a speaker with three sound waves\
-\f0 \uc0\u55357 \u56587
+\f0 \uc0\u55357 \u56587
\f1 \\ud83d\\udd0b battery\
-\f0 \uc0\u55357 \u56588
+\f0 \uc0\u55357 \u56588
\f1 \\ud83d\\udd0c electric plug\
-\f0 \uc0\u55357 \u56589
+\f0 \uc0\u55357 \u56589
\f1 \\ud83d\\udd0d left-pointing magnifying glass\
-\f0 \uc0\u55357 \u56590
+\f0 \uc0\u55357 \u56590
\f1 \\ud83d\\udd0e right-pointing magnifying glass\
-\f0 \uc0\u55357 \u56591
+\f0 \uc0\u55357 \u56591
\f1 \\ud83d\\udd0f lock with ink pen\
-\f0 \uc0\u55357 \u56592
+\f0 \uc0\u55357 \u56592
\f1 \\ud83d\\udd10 closed lock with key\
-\f0 \uc0\u55357 \u56593
+\f0 \uc0\u55357 \u56593
\f1 \\ud83d\\udd11 key\
-\f0 \uc0\u55357 \u56594
+\f0 \uc0\u55357 \u56594
\f1 \\ud83d\\udd12 lock\
-\f0 \uc0\u55357 \u56595
+\f0 \uc0\u55357 \u56595
\f1 \\ud83d\\udd13 open lock\
-\f0 \uc0\u55357 \u56596
+\f0 \uc0\u55357 \u56596
\f1 \\ud83d\\udd14 bell\
-\f0 \uc0\u55357 \u56598
+\f0 \uc0\u55357 \u56598
\f1 \\ud83d\\udd16 bookmark\
-\f0 \uc0\u55357 \u56599
+\f0 \uc0\u55357 \u56599
\f1 \\ud83d\\udd17 link symbol\
-\f0 \uc0\u55357 \u56600
+\f0 \uc0\u55357 \u56600
\f1 \\ud83d\\udd18 radio button\
-\f0 \uc0\u55357 \u56601
+\f0 \uc0\u55357 \u56601
\f1 \\ud83d\\udd19 back with leftwards arrow above\
-\f0 \uc0\u55357 \u56602
+\f0 \uc0\u55357 \u56602
\f1 \\ud83d\\udd1a end with leftwards arrow above\
-\f0 \uc0\u55357 \u56603
+\f0 \uc0\u55357 \u56603
\f1 \\ud83d\\udd1b on with exclamation mark with left right arrow above\
-\f0 \uc0\u55357 \u56604
+\f0 \uc0\u55357 \u56604
\f1 \\ud83d\\udd1c soon with rightwards arrow above\
-\f0 \uc0\u55357 \u56605
+\f0 \uc0\u55357 \u56605
\f1 \\ud83d\\udd1d top with upwards arrow above\
-\f0 \uc0\u55357 \u56606
+\f0 \uc0\u55357 \u56606
\f1 \\ud83d\\udd1e no one under eighteen symbol\
-\f0 \uc0\u55357 \u56607
+\f0 \uc0\u55357 \u56607
\f1 \\ud83d\\udd1f keycap ten\
-\f0 \uc0\u55357 \u56608
+\f0 \uc0\u55357 \u56608
\f1 \\ud83d\\udd20 input symbol for latin capital letters\
-\f0 \uc0\u55357 \u56609
+\f0 \uc0\u55357 \u56609
\f1 \\ud83d\\udd21 input symbol for latin small letters\
-\f0 \uc0\u55357 \u56610
+\f0 \uc0\u55357 \u56610
\f1 \\ud83d\\udd22 input symbol for numbers\
-\f0 \uc0\u55357 \u56611
+\f0 \uc0\u55357 \u56611
\f1 \\ud83d\\udd23 input symbol for symbols\
-\f0 \uc0\u55357 \u56612
+\f0 \uc0\u55357 \u56612
\f1 \\ud83d\\udd24 input symbol for latin letters\
-\f0 \uc0\u55357 \u56613
+\f0 \uc0\u55357 \u56613
\f1 \\ud83d\\udd25 fire\
-\f0 \uc0\u55357 \u56614
+\f0 \uc0\u55357 \u56614
\f1 \\ud83d\\udd26 electric torch\
-\f0 \uc0\u55357 \u56615
+\f0 \uc0\u55357 \u56615
\f1 \\ud83d\\udd27 wrench\
-\f0 \uc0\u55357 \u56616
+\f0 \uc0\u55357 \u56616
\f1 \\ud83d\\udd28 hammer\
-\f0 \uc0\u55357 \u56617
+\f0 \uc0\u55357 \u56617
\f1 \\ud83d\\udd29 nut and bolt\
-\f0 \uc0\u55357 \u56618
+\f0 \uc0\u55357 \u56618
\f1 \\ud83d\\udd2a hocho\
-\f0 \uc0\u55357 \u56619
+\f0 \uc0\u55357 \u56619
\f1 \\ud83d\\udd2b pistol\
-\f0 \uc0\u55357 \u56622
+\f0 \uc0\u55357 \u56622
\f1 \\ud83d\\udd2e crystal ball\
-\f0 \uc0\u55357 \u56623
+\f0 \uc0\u55357 \u56623
\f1 \\ud83d\\udd2f six pointed star with middle dot\
-\f0 \uc0\u55357 \u56624
+\f0 \uc0\u55357 \u56624
\f1 \\ud83d\\udd30 japanese symbol for beginner\
-\f0 \uc0\u55357 \u56625
+\f0 \uc0\u55357 \u56625
\f1 \\ud83d\\udd31 trident emblem\
-\f0 \uc0\u55357 \u56626
+\f0 \uc0\u55357 \u56626
\f1 \\ud83d\\udd32 black square button\
-\f0 \uc0\u55357 \u56627
+\f0 \uc0\u55357 \u56627
\f1 \\ud83d\\udd33 white square button\
-\f0 \uc0\u55357 \u56628
+\f0 \uc0\u55357 \u56628
\f1 \\ud83d\\udd34 large red circle\
-\f0 \uc0\u55357 \u56629
+\f0 \uc0\u55357 \u56629
\f1 \\ud83d\\udd35 large blue circle\
-\f0 \uc0\u55357 \u56630
+\f0 \uc0\u55357 \u56630
\f1 \\ud83d\\udd36 large orange diamond\
-\f0 \uc0\u55357 \u56631
+\f0 \uc0\u55357 \u56631
\f1 \\ud83d\\udd37 large blue diamond\
-\f0 \uc0\u55357 \u56632
+\f0 \uc0\u55357 \u56632
\f1 \\ud83d\\udd38 small orange diamond\
-\f0 \uc0\u55357 \u56633
+\f0 \uc0\u55357 \u56633
\f1 \\ud83d\\udd39 small blue diamond\
-\f0 \uc0\u55357 \u56634
+\f0 \uc0\u55357 \u56634
\f1 \\ud83d\\udd3a up-pointing red triangle\
-\f0 \uc0\u55357 \u56635
+\f0 \uc0\u55357 \u56635
\f1 \\ud83d\\udd3b down-pointing red triangle\
-\f0 \uc0\u55357 \u56636
+\f0 \uc0\u55357 \u56636
\f1 \\ud83d\\udd3c up-pointing small red triangle\
-\f0 \uc0\u55357 \u56637
+\f0 \uc0\u55357 \u56637
\f1 \\ud83d\\udd3d down-pointing small red triangle\
-\f0 \uc0\u55357 \u56656
+\f0 \uc0\u55357 \u56656
\f1 \\ud83d\\udd50 clock face one oclock\
-\f0 \uc0\u55357 \u56657
+\f0 \uc0\u55357 \u56657
\f1 \\ud83d\\udd51 clock face two oclock\
-\f0 \uc0\u55357 \u56658
+\f0 \uc0\u55357 \u56658
\f1 \\ud83d\\udd52 clock face three oclock\
-\f0 \uc0\u55357 \u56659
+\f0 \uc0\u55357 \u56659
\f1 \\ud83d\\udd53 clock face four oclock\
-\f0 \uc0\u55357 \u56660
+\f0 \uc0\u55357 \u56660
\f1 \\ud83d\\udd54 clock face five oclock\
-\f0 \uc0\u55357 \u56661
+\f0 \uc0\u55357 \u56661
\f1 \\ud83d\\udd55 clock face six oclock\
-\f0 \uc0\u55357 \u56662
+\f0 \uc0\u55357 \u56662
\f1 \\ud83d\\udd56 clock face seven oclock\
-\f0 \uc0\u55357 \u56663
+\f0 \uc0\u55357 \u56663
\f1 \\ud83d\\udd57 clock face eight oclock\
-\f0 \uc0\u55357 \u56664
+\f0 \uc0\u55357 \u56664
\f1 \\ud83d\\udd58 clock face nine oclock\
-\f0 \uc0\u55357 \u56665
+\f0 \uc0\u55357 \u56665
\f1 \\ud83d\\udd59 clock face ten oclock\
-\f0 \uc0\u55357 \u56666
+\f0 \uc0\u55357 \u56666
\f1 \\ud83d\\udd5a clock face eleven oclock\
-\f0 \uc0\u55357 \u56667
+\f0 \uc0\u55357 \u56667
\f1 \\ud83d\\udd5b clock face twelve oclock\
-\f0 \uc0\u55357 \u56827
+\f0 \uc0\u55357 \u56827
\f1 \\ud83d\\uddfb mount fuji\
-\f0 \uc0\u55357 \u56828
+\f0 \uc0\u55357 \u56828
\f1 \\ud83d\\uddfc tokyo tower\
-\f0 \uc0\u55357 \u56829
+\f0 \uc0\u55357 \u56829
\f1 \\ud83d\\uddfd statue of liberty\
-\f0 \uc0\u55357 \u56830
+\f0 \uc0\u55357 \u56830
\f1 \\ud83d\\uddfe silhouette of japan\
-\f0 \uc0\u55357 \u56831
+\f0 \uc0\u55357 \u56831
\f1 \\ud83d\\uddff moyai\
-\f0 \uc0\u55357 \u56832
+\f0 \uc0\u55357 \u56832
\f1 \\ud83d\\ude00 grinning face\
-\f0 \uc0\u55357 \u56839
+\f0 \uc0\u55357 \u56839
\f1 \\ud83d\\ude07 smiling face with halo\
-\f0 \uc0\u55357 \u56840
+\f0 \uc0\u55357 \u56840
\f1 \\ud83d\\ude08 smiling face with horns\
-\f0 \uc0\u55357 \u56846
+\f0 \uc0\u55357 \u56846
\f1 \\ud83d\\ude0e smiling face with sunglasses\
-\f0 \uc0\u55357 \u56848
+\f0 \uc0\u55357 \u56848
\f1 \\ud83d\\ude10 neutral face\
-\f0 \uc0\u55357 \u56849
+\f0 \uc0\u55357 \u56849
\f1 \\ud83d\\ude11 expressionless face\
-\f0 \uc0\u55357 \u56853
+\f0 \uc0\u55357 \u56853
\f1 \\ud83d\\ude15 confused face\
-\f0 \uc0\u55357 \u56855
+\f0 \uc0\u55357 \u56855
\f1 \\ud83d\\ude17 kissing face\
-\f0 \uc0\u55357 \u56857
+\f0 \uc0\u55357 \u56857
\f1 \\ud83d\\ude19 kissing face with smiling eyes\
-\f0 \uc0\u55357 \u56859
+\f0 \uc0\u55357 \u56859
\f1 \\ud83d\\ude1b face with stuck-out tongue\
-\f0 \uc0\u55357 \u56863
+\f0 \uc0\u55357 \u56863
\f1 \\ud83d\\ude1f worried face\
-\f0 \uc0\u55357 \u56870
+\f0 \uc0\u55357 \u56870
\f1 \\ud83d\\ude26 frowning face with open mouth\
-\f0 \uc0\u55357 \u56871
+\f0 \uc0\u55357 \u56871
\f1 \\ud83d\\ude27 anguished face\
-\f0 \uc0\u55357 \u56876
+\f0 \uc0\u55357 \u56876
\f1 \\ud83d\\ude2c grimacing face\
-\f0 \uc0\u55357 \u56878
+\f0 \uc0\u55357 \u56878
\f1 \\ud83d\\ude2e face with open mouth\
-\f0 \uc0\u55357 \u56879
+\f0 \uc0\u55357 \u56879
\f1 \\ud83d\\ude2f hushed face\
-\f0 \uc0\u55357 \u56884
+\f0 \uc0\u55357 \u56884
\f1 \\ud83d\\ude34 sleeping face\
-\f0 \uc0\u55357 \u56886
+\f0 \uc0\u55357 \u56886
\f1 \\ud83d\\ude36 face without mouth\
-\f0 \uc0\u55357 \u56961
+\f0 \uc0\u55357 \u56961
\f1 \\ud83d\\ude81 helicopter\
-\f0 \uc0\u55357 \u56962
+\f0 \uc0\u55357 \u56962
\f1 \\ud83d\\ude82 steam locomotive\
-\f0 \uc0\u55357 \u56966
+\f0 \uc0\u55357 \u56966
\f1 \\ud83d\\ude86 train\
-\f0 \uc0\u55357 \u56968
+\f0 \uc0\u55357 \u56968
\f1 \\ud83d\\ude88 light rail\
-\f0 \uc0\u55357 \u56970
+\f0 \uc0\u55357 \u56970
\f1 \\ud83d\\ude8a tram\
-\f0 \uc0\u55357 \u56973
+\f0 \uc0\u55357 \u56973
\f1 \\ud83d\\ude8d oncoming bus\
-\f0 \uc0\u55357 \u56974
+\f0 \uc0\u55357 \u56974
\f1 \\ud83d\\ude8e trolleybus\
-\f0 \uc0\u55357 \u56976
+\f0 \uc0\u55357 \u56976
\f1 \\ud83d\\ude90 minibus\
-\f0 \uc0\u55357 \u56980
+\f0 \uc0\u55357 \u56980
\f1 \\ud83d\\ude94 oncoming police car\
-\f0 \uc0\u55357 \u56982
+\f0 \uc0\u55357 \u56982
\f1 \\ud83d\\ude96 oncoming taxi\
-\f0 \uc0\u55357 \u56984
+\f0 \uc0\u55357 \u56984
\f1 \\ud83d\\ude98 oncoming automobile\
-\f0 \uc0\u55357 \u56987
+\f0 \uc0\u55357 \u56987
\f1 \\ud83d\\ude9b articulated lorry\
-\f0 \uc0\u55357 \u56988
+\f0 \uc0\u55357 \u56988
\f1 \\ud83d\\ude9c tractor\
-\f0 \uc0\u55357 \u56989
+\f0 \uc0\u55357 \u56989
\f1 \\ud83d\\ude9d monorail\
-\f0 \uc0\u55357 \u56990
+\f0 \uc0\u55357 \u56990
\f1 \\ud83d\\ude9e mountain railway\
-\f0 \uc0\u55357 \u56991
+\f0 \uc0\u55357 \u56991
\f1 \\ud83d\\ude9f suspension railway\
-\f0 \uc0\u55357 \u56992
+\f0 \uc0\u55357 \u56992
\f1 \\ud83d\\udea0 mountain cableway\
-\f0 \uc0\u55357 \u56993
+\f0 \uc0\u55357 \u56993
\f1 \\ud83d\\udea1 aerial tramway\
-\f0 \uc0\u55357 \u56995
+\f0 \uc0\u55357 \u56995
\f1 \\ud83d\\udea3 rowboat\
-\f0 \uc0\u55357 \u56998
+\f0 \uc0\u55357 \u56998
\f1 \\ud83d\\udea6 vertical traffic light\
-\f0 \uc0\u55357 \u57006
+\f0 \uc0\u55357 \u57006
\f1 \\ud83d\\udeae put litter in its place symbol\
-\f0 \uc0\u55357 \u57007
+\f0 \uc0\u55357 \u57007
\f1 \\ud83d\\udeaf do not litter symbol\
-\f0 \uc0\u55357 \u57008
+\f0 \uc0\u55357 \u57008
\f1 \\ud83d\\udeb0 potable water symbol\
-\f0 \uc0\u55357 \u57009
+\f0 \uc0\u55357 \u57009
\f1 \\ud83d\\udeb1 non-potable water symbol\
-\f0 \uc0\u55357 \u57011
+\f0 \uc0\u55357 \u57011
\f1 \\ud83d\\udeb3 no bicycles\
-\f0 \uc0\u55357 \u57012
+\f0 \uc0\u55357 \u57012
\f1 \\ud83d\\udeb4 bicyclist\
-\f0 \uc0\u55357 \u57013
+\f0 \uc0\u55357 \u57013
\f1 \\ud83d\\udeb5 mountain bicyclist\
-\f0 \uc0\u55357 \u57015
+\f0 \uc0\u55357 \u57015
\f1 \\ud83d\\udeb7 no pedestrians\
-\f0 \uc0\u55357 \u57016
+\f0 \uc0\u55357 \u57016
\f1 \\ud83d\\udeb8 children crossing\
-\f0 \uc0\u55357 \u57023
+\f0 \uc0\u55357 \u57023
\f1 \\ud83d\\udebf shower\
-\f0 \uc0\u55357 \u57025
+\f0 \uc0\u55357 \u57025
\f1 \\ud83d\\udec1 bathtub\
-\f0 \uc0\u55357 \u57026
+\f0 \uc0\u55357 \u57026
\f1 \\ud83d\\udec2 passport control\
-\f0 \uc0\u55357 \u57027
+\f0 \uc0\u55357 \u57027
\f1 \\ud83d\\udec3 customs\
-\f0 \uc0\u55357 \u57028
+\f0 \uc0\u55357 \u57028
\f1 \\ud83d\\udec4 baggage claim\
-\f0 \uc0\u55357 \u57029
+\f0 \uc0\u55357 \u57029
\f1 \\ud83d\\udec5 left luggage\
-\f0 \uc0\u55356 \u57101
+\f0 \uc0\u55356 \u57101
\f1 \\ud83c\\udf0d earth globe europe-africa\
-\f0 \uc0\u55356 \u57102
+\f0 \uc0\u55356 \u57102
\f1 \\ud83c\\udf0e earth globe americas\
-\f0 \uc0\u55356 \u57104
+\f0 \uc0\u55356 \u57104
\f1 \\ud83c\\udf10 globe with meridians\
-\f0 \uc0\u55356 \u57106
+\f0 \uc0\u55356 \u57106
\f1 \\ud83c\\udf12 waxing crescent moon symbol\
-\f0 \uc0\u55356 \u57110
+\f0 \uc0\u55356 \u57110
\f1 \\ud83c\\udf16 waning gibbous moon symbol\
-\f0 \uc0\u55356 \u57111
+\f0 \uc0\u55356 \u57111
\f1 \\ud83c\\udf17 last quarter moon symbol\
-\f0 \uc0\u55356 \u57112
+\f0 \uc0\u55356 \u57112
\f1 \\ud83c\\udf18 waning crescent moon symbol\
-\f0 \uc0\u55356 \u57114
+\f0 \uc0\u55356 \u57114
\f1 \\ud83c\\udf1a new moon with face\
-\f0 \uc0\u55356 \u57116
+\f0 \uc0\u55356 \u57116
\f1 \\ud83c\\udf1c last quarter moon with face\
-\f0 \uc0\u55356 \u57117
+\f0 \uc0\u55356 \u57117
\f1 \\ud83c\\udf1d full moon with face\
-\f0 \uc0\u55356 \u57118
+\f0 \uc0\u55356 \u57118
\f1 \\ud83c\\udf1e sun with face\
-\f0 \uc0\u55356 \u57138
+\f0 \uc0\u55356 \u57138
\f1 \\ud83c\\udf32 evergreen tree\
-\f0 \uc0\u55356 \u57139
+\f0 \uc0\u55356 \u57139
\f1 \\ud83c\\udf33 deciduous tree\
-\f0 \uc0\u55356 \u57163
+\f0 \uc0\u55356 \u57163
\f1 \\ud83c\\udf4b lemon\
-\f0 \uc0\u55356 \u57168
+\f0 \uc0\u55356 \u57168
\f1 \\ud83c\\udf50 pear\
-\f0 \uc0\u55356 \u57212
+\f0 \uc0\u55356 \u57212
\f1 \\ud83c\\udf7c baby bottle\
-\f0 \uc0\u55356 \u57287
+\f0 \uc0\u55356 \u57287
\f1 \\ud83c\\udfc7 horse racing\
-\f0 \uc0\u55356 \u57289
+\f0 \uc0\u55356 \u57289
\f1 \\ud83c\\udfc9 rugby football\
-\f0 \uc0\u55356 \u57316
+\f0 \uc0\u55356 \u57316
\f1 \\ud83c\\udfe4 european post office\
-\f0 \uc0\u55357 \u56320
+\f0 \uc0\u55357 \u56320
\f1 \\ud83d\\udc00 rat\
-\f0 \uc0\u55357 \u56321
+\f0 \uc0\u55357 \u56321
\f1 \\ud83d\\udc01 mouse\
-\f0 \uc0\u55357 \u56322
+\f0 \uc0\u55357 \u56322
\f1 \\ud83d\\udc02 ox\
-\f0 \uc0\u55357 \u56323
+\f0 \uc0\u55357 \u56323
\f1 \\ud83d\\udc03 water buffalo\
-\f0 \uc0\u55357 \u56324
+\f0 \uc0\u55357 \u56324
\f1 \\ud83d\\udc04 cow\
-\f0 \uc0\u55357 \u56325
+\f0 \uc0\u55357 \u56325
\f1 \\ud83d\\udc05 tiger\
-\f0 \uc0\u55357 \u56326
+\f0 \uc0\u55357 \u56326
\f1 \\ud83d\\udc06 leopard\
-\f0 \uc0\u55357 \u56327
+\f0 \uc0\u55357 \u56327
\f1 \\ud83d\\udc07 rabbit\
-\f0 \uc0\u55357 \u56328
+\f0 \uc0\u55357 \u56328
\f1 \\ud83d\\udc08 cat\
-\f0 \uc0\u55357 \u56329
+\f0 \uc0\u55357 \u56329
\f1 \\ud83d\\udc09 dragon\
-\f0 \uc0\u55357 \u56330
+\f0 \uc0\u55357 \u56330
\f1 \\ud83d\\udc0a crocodile\
-\f0 \uc0\u55357 \u56331
+\f0 \uc0\u55357 \u56331
\f1 \\ud83d\\udc0b whale\
-\f0 \uc0\u55357 \u56335
+\f0 \uc0\u55357 \u56335
\f1 \\ud83d\\udc0f ram\
-\f0 \uc0\u55357 \u56336
+\f0 \uc0\u55357 \u56336
\f1 \\ud83d\\udc10 goat\
-\f0 \uc0\u55357 \u56339
+\f0 \uc0\u55357 \u56339
\f1 \\ud83d\\udc13 rooster\
-\f0 \uc0\u55357 \u56341
+\f0 \uc0\u55357 \u56341
\f1 \\ud83d\\udc15 dog\
-\f0 \uc0\u55357 \u56342
+\f0 \uc0\u55357 \u56342
\f1 \\ud83d\\udc16 pig\
-\f0 \uc0\u55357 \u56362
+\f0 \uc0\u55357 \u56362
\f1 \\ud83d\\udc2a dromedary camel\
-\f0 \uc0\u55357 \u56421
+\f0 \uc0\u55357 \u56421
\f1 \\ud83d\\udc65 busts in silhouette\
-\f0 \uc0\u55357 \u56428
+\f0 \uc0\u55357 \u56428
\f1 \\ud83d\\udc6c two men holding hands\
-\f0 \uc0\u55357 \u56429
+\f0 \uc0\u55357 \u56429
\f1 \\ud83d\\udc6d two women holding hands\
-\f0 \uc0\u55357 \u56493
+\f0 \uc0\u55357 \u56493
\f1 \\ud83d\\udcad thought balloon\
-\f0 \uc0\u55357 \u56502
+\f0 \uc0\u55357 \u56502
\f1 \\ud83d\\udcb6 banknote with euro sign\
-\f0 \uc0\u55357 \u56503
+\f0 \uc0\u55357 \u56503
\f1 \\ud83d\\udcb7 banknote with pound sign\
-\f0 \uc0\u55357 \u56556
+\f0 \uc0\u55357 \u56556
\f1 \\ud83d\\udcec open mailbox with raised flag\
-\f0 \uc0\u55357 \u56557
+\f0 \uc0\u55357 \u56557
\f1 \\ud83d\\udced open mailbox with lowered flag\
-\f0 \uc0\u55357 \u56559
+\f0 \uc0\u55357 \u56559
\f1 \\ud83d\\udcef postal horn\
-\f0 \uc0\u55357 \u56565
+\f0 \uc0\u55357 \u56565
\f1 \\ud83d\\udcf5 no mobile phones\
-\f0 \uc0\u55357 \u56576
+\f0 \uc0\u55357 \u56576
\f1 \\ud83d\\udd00 twisted rightwards arrows\
-\f0 \uc0\u55357 \u56577
+\f0 \uc0\u55357 \u56577
\f1 \\ud83d\\udd01 clockwise rightwards and leftwards open circle arrows\
-\f0 \uc0\u55357 \u56578
+\f0 \uc0\u55357 \u56578
\f1 \\ud83d\\udd02 clockwise rightwards and leftwards open circle arrows with circled one overlay\
-\f0 \uc0\u55357 \u56580
+\f0 \uc0\u55357 \u56580
\f1 \\ud83d\\udd04 anticlockwise downwards and upwards open circle arrows\
-\f0 \uc0\u55357 \u56581
+\f0 \uc0\u55357 \u56581
\f1 \\ud83d\\udd05 low brightness symbol\
-\f0 \uc0\u55357 \u56582
+\f0 \uc0\u55357 \u56582
\f1 \\ud83d\\udd06 high brightness symbol\
-\f0 \uc0\u55357 \u56583
+\f0 \uc0\u55357 \u56583
\f1 \\ud83d\\udd07 speaker with cancellation stroke\
-\f0 \uc0\u55357 \u56585
+\f0 \uc0\u55357 \u56585
\f1 \\ud83d\\udd09 speaker with one sound wave\
-\f0 \uc0\u55357 \u56597
+\f0 \uc0\u55357 \u56597
\f1 \\ud83d\\udd15 bell with cancellation stroke\
-\f0 \uc0\u55357 \u56620
+\f0 \uc0\u55357 \u56620
\f1 \\ud83d\\udd2c microscope\
-\f0 \uc0\u55357 \u56621
+\f0 \uc0\u55357 \u56621
\f1 \\ud83d\\udd2d telescope\
-\f0 \uc0\u55357 \u56668
+\f0 \uc0\u55357 \u56668
\f1 \\ud83d\\udd5c clock face one-thirty\
-\f0 \uc0\u55357 \u56669
+\f0 \uc0\u55357 \u56669
\f1 \\ud83d\\udd5d clock face two-thirty\
-\f0 \uc0\u55357 \u56670
+\f0 \uc0\u55357 \u56670
\f1 \\ud83d\\udd5e clock face three-thirty\
-\f0 \uc0\u55357 \u56671
+\f0 \uc0\u55357 \u56671
\f1 \\ud83d\\udd5f clock face four-thirty\
-\f0 \uc0\u55357 \u56672
+\f0 \uc0\u55357 \u56672
\f1 \\ud83d\\udd60 clock face five-thirty\
-\f0 \uc0\u55357 \u56673
+\f0 \uc0\u55357 \u56673
\f1 \\ud83d\\udd61 clock face six-thirty\
-\f0 \uc0\u55357 \u56674
+\f0 \uc0\u55357 \u56674
\f1 \\ud83d\\udd62 clock face seven-thirty\
-\f0 \uc0\u55357 \u56675
+\f0 \uc0\u55357 \u56675
\f1 \\ud83d\\udd63 clock face eight-thirty\
-\f0 \uc0\u55357 \u56676
+\f0 \uc0\u55357 \u56676
\f1 \\ud83d\\udd64 clock face nine-thirty\
-\f0 \uc0\u55357 \u56677
+\f0 \uc0\u55357 \u56677
\f1 \\ud83d\\udd65 clock face ten-thirty\
-\f0 \uc0\u55357 \u56678
+\f0 \uc0\u55357 \u56678
\f1 \\ud83d\\udd66 clock face eleven-thirty\
-\f0 \uc0\u55357 \u56679
+\f0 \uc0\u55357 \u56679
\f1 \\ud83d\\udd67 clock face twelve-thirty}
\ No newline at end of file
diff --git a/src/js/commands/index.js b/src/js/commands/index.js
index 851d70d9..995f1ea0 100644
--- a/src/js/commands/index.js
+++ b/src/js/commands/index.js
@@ -37,7 +37,7 @@ var commands = {
// copy command, and then set opts
commandObj.setOptionsMap(delConfig.options || {});
commandObj.setGeneralArgs(delConfig.args || []);
-
+
commandConfigs[delConfig.vcs][delConfig.name].execute.call(this, engine, commandObj);
}, this);
} else {
diff --git a/src/js/intl/index.js b/src/js/intl/index.js
index bab78fe5..8247429a 100644
--- a/src/js/intl/index.js
+++ b/src/js/intl/index.js
@@ -107,7 +107,7 @@ exports.getStartDialog = function(level) {
}
};
var startCopy = Object.assign(
- {},
+ {},
level.startDialog[getDefaultLocale()] || level.startDialog
);
startCopy.childViews.unshift(errorAlert);
diff --git a/src/js/mercurial/commands.js b/src/js/mercurial/commands.js
index acf14fcc..cc9140a6 100644
--- a/src/js/mercurial/commands.js
+++ b/src/js/mercurial/commands.js
@@ -206,7 +206,7 @@ var commandConfig = {
};
}
},
-
+
backout: {
regex: /^hg +backout($|\s+)/,
options: [
diff --git a/src/js/models/commandModel.js b/src/js/models/commandModel.js
index 138f9024..df837412 100644
--- a/src/js/models/commandModel.js
+++ b/src/js/models/commandModel.js
@@ -76,7 +76,7 @@ var Command = Backbone.Model.extend({
mapDotToHead: function() {
var generalArgs = this.getGeneralArgs();
var options = this.getOptionsMap();
-
+
generalArgs = generalArgs.map(function(arg) {
return this.replaceDotWithHead(arg);
}, this);
diff --git a/src/js/react_views/LevelToolbarView.jsx b/src/js/react_views/LevelToolbarView.jsx
index 48dd56dd..4c91b899 100644
--- a/src/js/react_views/LevelToolbarView.jsx
+++ b/src/js/react_views/LevelToolbarView.jsx
@@ -60,7 +60,7 @@ var LevelToolbarView = React.createClass({
+$Zig+QVm1`@<;%4
z04Gad*J83t`@tzM?%O!F*DJ0djFJlW!qY?|H*+UGe*zRQc7;{Ft`NvGAe3vP
zvrZKZQv_2Z{;FuqH~wBy8eDdyT1K4U_i?Cm!c?DSuQ;AoeBNAX#IPe`Tt?&=d+6@n
z@oSTxC==9il|?CJ+lCCo0<`arH{I{llSZgK!mBA`@(5kp@kNg10Ym7_ChvhpUq*kI
z%zO*%l`IJV^+0l(EXX4%%uA{HDPOCIx;{Q|L%0QMipl2itBQ1b8BlAm8jAzBlM;JM
zyN+pGMiqHvVNnzO-M%)$@LU=h`UI)1Sj=R%y8
zl|t$Pk1%bc^*&sgCljHlmb}}rA4DSy($tpCrC=vs&^5D>eV}jZC`~H@y6nIcPhQ(Q|u>gS2&~GWQ
zXd>yyd{S+pN4vuX0X}?&=j4=}W7%;Blkn!<@V(d3Gi=h+x1Ouidc8zPNGI2^`%H|p%#*!wbAazh72
zW#Zf7c?DDgPv6{ZOE{0iZr#^?{B}O=p~becKWid?O$%Vlu%T&RR2n>tSvvurk!#XA
zROEL|B`jx18w⪻`aroLxXrfDRzq
zhV_e7MvqXo#~mr?T@XwFTvgp@7UstXEPm>k;UI?USeV6`<4E*Nf@A###Qk=_3KuvS
z!Ch_j{kvctO{!I{k6Q!Z
zzu8hbXO2^e-nS$SiTgbhQ-U;fv8AmdD(X4qp(iD<zPfM
z6u9)j;4c_q-kN}hAU}TKWIG5hK@4-HB7(WzkK2JK+szr^a1&-|wqLetSS$rl<|ep6
zaN|r6Po&hUp_+hhWY-vq(L-9*Z~@#VMXx>fGO7S3ptR2;l2KJ;=)Sj&KE|>b=`3%e
zjmW_QEJosf_yA}-9HS1prFBpPRD;5-LB*0aCJlD!lWDJYWKp^1GR>ImPx0h1-=g5X
zuf)IH7pCC1+CjfvPQmXk+lkdweSAdaG(Mz69}Vv|(Z_+Rl;}F-mozQ`o9IIB&vlgK
z_&6^Be@2|DQHfRXnTIs%5LaLmL~6j^UTjVN-~0yJ~f0BsG6N8FlCMcvm%T>0HF81Uh?&HOIxPp~0r
zgQ=
zXc(!sS8%ku1pWz}{)LHj6~_adCifY7)2X+dW&5C}4#;d|=G*tpNH|)%9oZhrM&Q
zB`jnoCR=rz)S{ITRPT4bbc<3iAq+(#=)8M99}1}Isfu2+ltbOuq
zS7#0_z)r?BRKg`}!psgJP-yQ*I#LKRjR6S0azdq#hr*!!Gvk7wbCc;z3wfMR4nO8B
z5;*$90q|Tw%G*01VHDMXdO;f&P{L*kQ>RTmAz}VU
zm{1XZqC4GOzjwjA#+I{<;Gp-w$}bK#Nyf}2(vpr~ipbjggJo(k@aR%G&>mIm%Ubz$
zF?c3}lBjKjxf$Td=@wS$T=u8oLOlo{!^e$)c@9=vtx-v)lgIQ0?N;&rxYxxnXGeu6
zBwfEbQ&74*=@bokbVZ)`quP34_XGF3LM92UfUHFN2ckaz`{ZhA--@T|`jpTm+VfAn
zJS;V1fKi!G9L{0<6TKyZYL$)1mcar#=yhnqanD`S&L^Hb(4Ws;a%Y?d4^DxPjB$+h
zGi~G2%^37XBxC&)vBVpAZi@ENbgNh&!>S!Tvf9Gzc6f@!0R@phbWmGF%K^r_%c_Q@
zO^#M5y>2c|;=33uGLNuG02?zh+zsKSgJKi)Ks*)b!Wt^2xA;nifemRlCj3l`4>#m|
z=!+N46YpO^EaG9W!tDI7X?T9~{lIBw#I{LRN;@lhUDNw7}4TlLNNL#$!;iE_J@P=MnT5tjQr2xG13
z0}AKTU@w;o1-k~8JXK&ZK
z&y`&m1?yJb+$MT$Q-UYgFhY9IhFTEKa&EJ_tRD-Cx
zKv_WVGoycQL*x6(Yn3zoJy~o8dM_c0o~`Rz;lRc@-(Kpy{51J%b>#bh-+B%2nXHl;
z-q`&u-5{u<{G^b_(Bkqu3Yl{}kZGR3E_>~#MuEawV3u7NO#~poE_#1wLaO3BtEOu^
z>`aJrk_@rG$-pCLw0Sk+<1~3=YEay72S4Ln5C#^VG+^56M)A{`bZe`TBk!AjZi6s-
z@xTRcI_9l+zj|Z=k>KQq&RdgzgVvrA)z5&>nV^%43Ara43E+(|gXti65OHXg`+X_b
zML<+Wod&S+%{?P`lK?s{an*jd3cL9+;|s^2AIlq0B+NRfsgU@Dbn5$Xc}A
z8+5x9DIjF#q7vu*#Cc7_491y8XNvxm=7?80$#llqKZ-EU*S?@kj+?LP0R@1c5nKN*
zpf0=CwEoTr3lWSdwcwhH+dl-t8_2)a!lIhz>u3B&?c2-5i+oAPh{E}73%t4~6%4H6
zU@}dCHNrjv;+^M*Ul;k&4@CowQJ5VP0+^yUlJ!9%efEi`#xux3fi;I+p
zA|#o=WUAu}%9yh4>;O&BK8t^&QOo?#%>vx;b-$_#nr4H5gK4m#(Ec%r$Y-Lmc{Ruwj53
z^Y6Q0)8X%>mnnT1ATN;1(kyp?fo*UAGf)%Dv<-%1hVEOwww`+*}
z9q&~Ws#d|s9iI4?$~@KS-!L^#3y=_acxeAFTQP5q^CKnj`|%N8YEsHt(wkK$Gxjt^
z$?oPY8$AMTwy?c1ZW|D}4WYoGsQn6JFIA=jwkneWi+x-zPVABIVgULvKr_xjjl~lV
zft-D>q}OiNAhq+}veDo$wS*jl^Rub=<=+)2YK
zY?jZPrPERA_CxvIcc$m~H2wjXhZFyB1H5A(n^xBjozp)Vr0LHH8i&{XrZq&$xkuBFZ)z9rnJUGrd4(aE{0*sjbA!2YvA^OL^#|M~A)LEvL;9+{VTij|Ob?sm
z`{|LG(W~eM!uRa!K{xrepTmOJvQbc<+Q=KyNyTaYsunkffq{QT8+Gec_B4FOh958n
zba59Ew%OqI3UpHJ;Ae?r3Lf(J1325MXl}+UE6NrcOR{Rbf89#ZxMyyHK4w9esK>=^
zC_jTKv<5H*yZNVH=9+!{^aWCGDC`>KXJ3S(wtd?bQ+!cUvWW4Vuz_Z68|+<*;;*f
z*84zeW*wgYmr^`)9;BZ57
z1p|w~daYECGc;_XZul?D>~8$!BY_fBuLW?1OqEJ$0+rWf+V15yNdOI)3phureyzXO
zWqWxx_4uo7`cEB>;7B`Yx%TMs9lc-qyRknMnBCe>Mw@a1o)dQNS}T2ujI
z2`XP^i7AY_Tb8lgYjZvCKi}&kz0(di*s%CFtZ5piz~w&nR9U6{=v;D=R91Gx(0vMR
zn%%)Lk-aCg$P3p<&D5U}DZm&FFrxW{s?V&M5Fe`v{h5dHAZ4Y^n@%0{ZbqPhk1gg`
z_Yeh-v(M?cX03!13i+7n3>3L`$Ws)&d=tyxp`L;f$4|-JQ(~az`$7`2Wrq!mywfsr
zsiCY|?7E>t#V6J|O2+(Q(KbOdy5vF{O_A`2_^roDp+B+>20<9cUxvYg&ACmuJ
zwN>*Cn@}CXOzX?6aEjaG`#J1wM11#Pq4lW;28!W-e%<{f6d**X`-{Z>CF(dBRzCfw
z;#eKaEVS|G$pS^`h38zl|Z9DOYqhQa=w%?)=#~{o*0Pk~4
ztY3CP|JbGPweKdTz@g>45bE6lJDz^*n2*kg->3ay_*hSG*VUMT7>u=1NVS)F$xws`
zWBAA-wFOVV-0{#DG7pLqM!qX!VkCw^fg7}rvy=U3Fd2p9AYSmjAZHUh!*|1oB)ZaB
zD{dQmjq!s1ev6D@R3{Fz(%<@dBGmq_?ls@udxDQ=e(A8?=@W`bFZtKvFpCAWwd$GR
zoQ-)d8*XO=t55_dpNs)flMu|}?sRUg1Uo2nmh8}E?MVAy7XB^S);>!^jBrZd8CDVY
zsE}IVQoD~xKO%)8+?-Y1R+lFbm+!gmhkA4}`44Z~^B)u!Rv*kh;NZ-R6z|+QtiHo2
zRhJREX+2m8!s&mza!OBB)_xF)#Z$2T9ChH49%$?@zfM^$s2sEIrwFbSqj)mRlPbbR
zQ{}C`VxdbKwYrM##H#hRPhwBjfvw}6^dTNeFxPN-YDEi$9CBLw
z2gdMLwoGA_0=W5KrG3p(%q1~u5}`r>{ZougKDHlSZ$LFnEWF^ikQl3b7ia8BJOwWI
zRLS_RtPcvuZ|>A6uzlxw4(feDj*lgAIDy2}ZIRbB|E@EDI>ic5Rn$`WDrXV#e{Da~
A6aWAK
literal 0
HcmV?d00001
From 6e39a45adf55d58979c506f04878ae385e3f2f24 Mon Sep 17 00:00:00 2001
From: Lucian Condrea
Date: Sun, 9 Jun 2019 11:55:08 +0200
Subject: [PATCH 113/359] add link with icon in head
---
src/template.index.html | 1 +
1 file changed, 1 insertion(+)
diff --git a/src/template.index.html b/src/template.index.html
index da7fa6bc..a709829a 100644
--- a/src/template.index.html
+++ b/src/template.index.html
@@ -17,6 +17,7 @@
+
From d06fa0185d50526776bd8ba54b3f2b708e82016b Mon Sep 17 00:00:00 2001
From: hisbvdis
Date: Tue, 11 Jun 2019 10:06:35 +0300
Subject: [PATCH 114/359] rampup relativeRefs translate corrections
---
src/levels/rampup/relativeRefs.js | 6 +++---
1 file changed, 3 insertions(+), 3 deletions(-)
diff --git a/src/levels/rampup/relativeRefs.js b/src/levels/rampup/relativeRefs.js
index b008011b..8f55dcd5 100644
--- a/src/levels/rampup/relativeRefs.js
+++ b/src/levels/rampup/relativeRefs.js
@@ -743,11 +743,11 @@ exports.level = {
"beforeMarkdowns": [
"Для начала рассмотрим оператор каретки (^). Когда мы добавляем его к имени ссылки, Git воспринимает это как указание найти родителя указанного коммита.",
"",
- "Так что `master^` означает \"первый предок ветки `master`\".",
+ "Так что `master^` означает \"первый родитель ветки `master`\".",
"",
- "`master^^` означает предок предка ветки `master`",
+ "`master^^` означает роид ветки `master`",
"",
- "Получим предка ветки `master` на практике"
+ "Давайте переключимся на коммит Выше `master`"
],
"afterMarkdowns": [
"Опачки! Готово. Сильно проще, чем поиск и указание хеша."
From 89ebecf5ceb855e1075562f89e36abd352f7fbe1 Mon Sep 17 00:00:00 2001
From: hisbvdis
Date: Tue, 11 Jun 2019 22:03:15 +0300
Subject: [PATCH 115/359] Small mistake in previous commit
---
src/levels/rampup/relativeRefs.js | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/src/levels/rampup/relativeRefs.js b/src/levels/rampup/relativeRefs.js
index 8f55dcd5..0a8b3da8 100644
--- a/src/levels/rampup/relativeRefs.js
+++ b/src/levels/rampup/relativeRefs.js
@@ -745,7 +745,7 @@ exports.level = {
"",
"Так что `master^` означает \"первый родитель ветки `master`\".",
"",
- "`master^^` означает роид ветки `master`",
+ "`master^^` означает прародитель (родитель родителя) `master`",
"",
"Давайте переключимся на коммит Выше `master`"
],
From b25095c2f62fe6fe4addc702cc1252417e67e77f Mon Sep 17 00:00:00 2001
From: wuzh07
Date: Tue, 27 Aug 2019 21:53:02 +0800
Subject: [PATCH 116/359] fixed a typo of fetchRebase.js
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
"工们"->"我们"
---
src/levels/remote/fetchRebase.js | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/src/levels/remote/fetchRebase.js b/src/levels/remote/fetchRebase.js
index f44b2aab..f1d6fdde 100644
--- a/src/levels/remote/fetchRebase.js
+++ b/src/levels/remote/fetchRebase.js
@@ -947,7 +947,7 @@ exports.level = {
"如果我们在 push 之前做 rebase 呢?"
],
"afterMarkdowns": [
- "我们用 `git fetch` 更新了本地仓库中的远程分支,然后用 rebase 将工们的工作移动到最新的提交记录下,最后再用 `git push` 推送到远程仓库。"
+ "我们用 `git fetch` 更新了本地仓库中的远程分支,然后用 rebase 将我们的工作移动到最新的提交记录下,最后再用 `git push` 推送到远程仓库。"
],
"command": "git fetch; git rebase o/master; git push",
"beforeCommand": "git clone; git fakeTeamwork; git commit"
From b281d1d76cbd504e0ea07ee5684a667b82b335a1 Mon Sep 17 00:00:00 2001
From: Lukas Schmid
Date: Wed, 4 Sep 2019 16:47:24 +0200
Subject: [PATCH 117/359] Added support for git tag -d and fixed a bug
where a duplicate tag name wouldn't show in the error-msg
---
src/js/git/commands.js | 33 +++++++++++++++++++++++++++++++++
src/js/git/index.js | 2 +-
src/js/visuals/index.js | 19 +++++++++++++++++++
3 files changed, 53 insertions(+), 1 deletion(-)
diff --git a/src/js/git/commands.js b/src/js/git/commands.js
index 50e93d5a..9861f763 100644
--- a/src/js/git/commands.js
+++ b/src/js/git/commands.js
@@ -811,8 +811,41 @@ var commandConfig = {
tag: {
regex: /^git +tag($|\s)/,
+ options: [
+ '-d'
+ ],
execute: function(engine, command) {
var generalArgs = command.getGeneralArgs();
+ var commandOptions = command.getOptionsMap();
+
+ if (commandOptions['-d']) {
+ var tagID = commandOptions['-d'];
+ var tagToRemove;
+
+ assertIsRef(engine, tagID);
+
+ command.oneArgImpliedHead(tagID);
+ engine.tagCollection.each(function(tag) {
+ if(tag.get('id') == tagID){
+ tagToRemove = tag;
+ }
+ }, true);
+
+ if(tagToRemove == undefined){
+ throw new GitError({
+ msg: intl.todo(
+ 'No tag found, nothing to remove'
+ )
+ });
+ }
+
+ engine.tagCollection.remove(tagToRemove);
+ delete engine.refs[tagID];
+
+ engine.gitVisuals.refreshTree();
+ return;
+ }
+
if (generalArgs.length === 0) {
var tags = engine.getTags();
engine.printTags(tags);
diff --git a/src/js/git/index.js b/src/js/git/index.js
index 036f9db4..ff7d4f88 100644
--- a/src/js/git/index.js
+++ b/src/js/git/index.js
@@ -686,7 +686,7 @@ GitEngine.prototype.validateAndMakeTag = function(id, target) {
throw new GitError({
msg: intl.str(
'bad-tag-name',
- { tag: name }
+ { tag: id }
)
});
}
diff --git a/src/js/visuals/index.js b/src/js/visuals/index.js
index 31afd596..668ce91a 100644
--- a/src/js/visuals/index.js
+++ b/src/js/visuals/index.js
@@ -701,6 +701,25 @@ GitVisuals.prototype.addTagFromEvent = function(tag, collection, index) {
}
};
+GitVisuals.prototype.removeTag = function(tag, collection, index) {
+ var action = function() {
+ var tagToRemove;
+ this.visTagCollection.each(function(visTag) {
+ if(visTag.get('tag') == tag){
+ tagToRemove = visTag;
+ }
+ }, true);
+ tagToRemove.remove();
+ this.removeVisTag(tagToRemove);
+ }.bind(this);
+
+ if (!this.gitEngine || !this.gitReady) {
+ this.defer(action);
+ } else {
+ action();
+ }
+};
+
GitVisuals.prototype.addTag = function(tag) {
var visTag = new VisTag({
tag: tag,
From 496579b717261dfebb37d370eedb6c7b86024091 Mon Sep 17 00:00:00 2001
From: Peter Cottle
Date: Wed, 4 Sep 2019 22:02:20 -0700
Subject: [PATCH 118/359] Test coverage for deleting tags, PR #599
---
__tests__/git.spec.js | 7 +++++++
1 file changed, 7 insertions(+)
diff --git a/__tests__/git.spec.js b/__tests__/git.spec.js
index e098ce07..1f9a8a09 100644
--- a/__tests__/git.spec.js
+++ b/__tests__/git.spec.js
@@ -220,6 +220,13 @@ describe('Git', function() {
);
});
+ it('makes a tag and removes a tag', function() {
+ expectTreeAsync(
+ 'git tag v1; git tag -d v1',
+ '{"branches":{"master":{"target":"C1","id":"master","remoteTrackingBranchID":null}},"commits":{"C0":{"parents":[],"id":"C0","rootCommit":true},"C1":{"parents":["C0"],"id":"C1"}},"tags":{},"HEAD":{"target":"master","id":"HEAD"}}'
+ );
+ });
+
it('makes a tag on another ref', function() {
expectTreeAsync(
'git tag v1 C0',
From 8dbc56c42a13a36a9a2aee228d05c1d5a06c2980 Mon Sep 17 00:00:00 2001
From: Peter Cottle
Date: Thu, 12 Sep 2019 10:17:30 -0700
Subject: [PATCH 119/359] remove random file
---
assets/emoji_table.rtf | 2523 ----------------------------------------
1 file changed, 2523 deletions(-)
delete mode 100644 assets/emoji_table.rtf
diff --git a/assets/emoji_table.rtf b/assets/emoji_table.rtf
deleted file mode 100644
index 14ccbdc8..00000000
--- a/assets/emoji_table.rtf
+++ /dev/null
@@ -1,2523 +0,0 @@
-{\rtf1\ansi\ansicpg1252\cocoartf1265\cocoasubrtf210
-{\fonttbl\f0\fnil\fcharset0 AppleColorEmoji;\f1\fnil\fcharset0 Monaco;\f2\fnil\fcharset77 ZapfDingbatsITC;
-\f3\fnil\fcharset128 HiraKakuProN-W3;\f4\fnil\fcharset0 LucidaGrande;\f5\fnil\fcharset0 AppleSymbols;
-\f6\fnil\fcharset134 STHeitiSC-Light;\f7\fnil\fcharset129 AppleSDGothicNeo-Regular;}
-{\colortbl;\red255\green255\blue255;}
-\margl1440\margr1440\vieww18700\viewh19820\viewkind0
-\pard\tx720\tx1440\tx2160\tx2880\tx3600\tx4320\tx5040\tx5760\tx6480\tx7200\tx7920\tx8640\pardirnatural
-
-\f0\fs24 \cf0 \uc0\u55357 \u56833
-\f1 \\ud83d\\ude01 grinning face with smiling eyes\
-
-\f0 \uc0\u55357 \u56834
-\f1 \\ud83d\\ude02 face with tears of joy\
-
-\f0 \uc0\u55357 \u56835
-\f1 \\ud83d\\ude03 smiling face with open mouth\
-
-\f0 \uc0\u55357 \u56836
-\f1 \\ud83d\\ude04 smiling face with open mouth and smiling eyes\
-
-\f0 \uc0\u55357 \u56837
-\f1 \\ud83d\\ude05 smiling face with open mouth and cold sweat\
-
-\f0 \uc0\u55357 \u56838
-\f1 \\ud83d\\ude06 smiling face with open mouth and tightly-closed eyes\
-
-\f0 \uc0\u55357 \u56841
-\f1 \\ud83d\\ude09 winking face\
-
-\f0 \uc0\u55357 \u56842
-\f1 \\ud83d\\ude0a smiling face with smiling eyes\
-
-\f0 \uc0\u55357 \u56843
-\f1 \\ud83d\\ude0b face savouring delicious food\
-
-\f0 \uc0\u55357 \u56844
-\f1 \\ud83d\\ude0c relieved face\
-
-\f0 \uc0\u55357 \u56845
-\f1 \\ud83d\\ude0d smiling face with heart-shaped eyes\
-
-\f0 \uc0\u55357 \u56847
-\f1 \\ud83d\\ude0f smirking face\
-
-\f0 \uc0\u55357 \u56850
-\f1 \\ud83d\\ude12 unamused face\
-
-\f0 \uc0\u55357 \u56851
-\f1 \\ud83d\\ude13 face with cold sweat\
-
-\f0 \uc0\u55357 \u56852
-\f1 \\ud83d\\ude14 pensive face\
-
-\f0 \uc0\u55357 \u56854
-\f1 \\ud83d\\ude16 confounded face\
-
-\f0 \uc0\u55357 \u56856
-\f1 \\ud83d\\ude18 face throwing a kiss\
-
-\f0 \uc0\u55357 \u56858
-\f1 \\ud83d\\ude1a kissing face with closed eyes\
-
-\f0 \uc0\u55357 \u56860
-\f1 \\ud83d\\ude1c face with stuck-out tongue and winking eye\
-
-\f0 \uc0\u55357 \u56861
-\f1 \\ud83d\\ude1d face with stuck-out tongue and tightly-closed eyes\
-
-\f0 \uc0\u55357 \u56862
-\f1 \\ud83d\\ude1e disappointed face\
-
-\f0 \uc0\u55357 \u56864
-\f1 \\ud83d\\ude20 angry face\
-
-\f0 \uc0\u55357 \u56865
-\f1 \\ud83d\\ude21 pouting face\
-
-\f0 \uc0\u55357 \u56866
-\f1 \\ud83d\\ude22 crying face\
-
-\f0 \uc0\u55357 \u56867
-\f1 \\ud83d\\ude23 persevering face\
-
-\f0 \uc0\u55357 \u56868
-\f1 \\ud83d\\ude24 face with look of triumph\
-
-\f0 \uc0\u55357 \u56869
-\f1 \\ud83d\\ude25 disappointed but relieved face\
-
-\f0 \uc0\u55357 \u56872
-\f1 \\ud83d\\ude28 fearful face\
-
-\f0 \uc0\u55357 \u56873
-\f1 \\ud83d\\ude29 weary face\
-
-\f0 \uc0\u55357 \u56874
-\f1 \\ud83d\\ude2a sleepy face\
-
-\f0 \uc0\u55357 \u56875
-\f1 \\ud83d\\ude2b tired face\
-
-\f0 \uc0\u55357 \u56877
-\f1 \\ud83d\\ude2d loudly crying face\
-
-\f0 \uc0\u55357 \u56880
-\f1 \\ud83d\\ude30 face with open mouth and cold sweat\
-
-\f0 \uc0\u55357 \u56881
-\f1 \\ud83d\\ude31 face screaming in fear\
-
-\f0 \uc0\u55357 \u56882
-\f1 \\ud83d\\ude32 astonished face\
-
-\f0 \uc0\u55357 \u56883
-\f1 \\ud83d\\ude33 flushed face\
-
-\f0 \uc0\u55357 \u56885
-\f1 \\ud83d\\ude35 dizzy face\
-
-\f0 \uc0\u55357 \u56887
-\f1 \\ud83d\\ude37 face with medical mask\
-
-\f0 \uc0\u55357 \u56888
-\f1 \\ud83d\\ude38 grinning cat face with smiling eyes\
-
-\f0 \uc0\u55357 \u56889
-\f1 \\ud83d\\ude39 cat face with tears of joy\
-
-\f0 \uc0\u55357 \u56890
-\f1 \\ud83d\\ude3a smiling cat face with open mouth\
-
-\f0 \uc0\u55357 \u56891
-\f1 \\ud83d\\ude3b smiling cat face with heart-shaped eyes\
-
-\f0 \uc0\u55357 \u56892
-\f1 \\ud83d\\ude3c cat face with wry smile\
-
-\f0 \uc0\u55357 \u56893
-\f1 \\ud83d\\ude3d kissing cat face with closed eyes\
-
-\f0 \uc0\u55357 \u56894
-\f1 \\ud83d\\ude3e pouting cat face\
-
-\f0 \uc0\u55357 \u56895
-\f1 \\ud83d\\ude3f crying cat face\
-
-\f0 \uc0\u55357 \u56896
-\f1 \\ud83d\\ude40 weary cat face\
-
-\f0 \uc0\u55357 \u56901
-\f1 \\ud83d\\ude45 face with no good gesture\
-
-\f0 \uc0\u55357 \u56902
-\f1 \\ud83d\\ude46 face with ok gesture\
-
-\f0 \uc0\u55357 \u56903
-\f1 \\ud83d\\ude47 person bowing deeply\
-
-\f0 \uc0\u55357 \u56904
-\f1 \\ud83d\\ude48 see-no-evil monkey\
-
-\f0 \uc0\u55357 \u56905
-\f1 \\ud83d\\ude49 hear-no-evil monkey\
-
-\f0 \uc0\u55357 \u56906
-\f1 \\ud83d\\ude4a speak-no-evil monkey\
-
-\f0 \uc0\u55357 \u56907
-\f1 \\ud83d\\ude4b happy person raising one hand\
-
-\f0 \uc0\u55357 \u56908
-\f1 \\ud83d\\ude4c person raising both hands in celebration\
-
-\f0 \uc0\u55357 \u56909
-\f1 \\ud83d\\ude4d person frowning\
-
-\f0 \uc0\u55357 \u56910
-\f1 \\ud83d\\ude4e person with pouting face\
-
-\f0 \uc0\u55357 \u56911
-\f1 \\ud83d\\ude4f person with folded hands\
-
-\f2 \uc0\u9986
-\f1 \\u2702 black scissors\
-
-\f0 \uc0\u9989
-\f1 \\u2705 white heavy check mark\
-
-\f2 \uc0\u9992
-\f1 \\u2708 airplane\
-
-\f2 \uc0\u9993
-\f1 \\u2709 envelope\
-
-\f0 \uc0\u9994
-\f1 \\u270a raised fist\
-
-\f0 \uc0\u9995
-\f1 \\u270b raised hand\
-
-\f2 \uc0\u9996
-\f1 \\u270c victory hand\
-
-\f2 \uc0\u9999
-\f1 \\u270f pencil\
-
-\f2 \uc0\u10002
-\f1 \\u2712 black nib\
-
-\f2 \uc0\u10004
-\f1 \\u2714 heavy check mark\
-
-\f2 \uc0\u10006
-\f1 \\u2716 heavy multiplication x\
-
-\f0 \uc0\u10024
-\f1 \\u2728 sparkles\
-
-\f2 \uc0\u10035
-\f1 \\u2733 eight spoked asterisk\
-
-\f2 \uc0\u10036
-\f1 \\u2734 eight pointed black star\
-
-\f2 \uc0\u10052
-\f1 \\u2744 snowflake\
-
-\f2 \uc0\u10055
-\f1 \\u2747 sparkle\
-
-\f0 \uc0\u10060
-\f1 \\u274c cross mark\
-
-\f0 \uc0\u10062
-\f1 \\u274e negative squared cross mark\
-
-\f0 \uc0\u10067
-\f1 \\u2753 black question mark ornament\
-
-\f0 \uc0\u10068
-\f1 \\u2754 white question mark ornament\
-
-\f0 \uc0\u10069
-\f1 \\u2755 white exclamation mark ornament\
-
-\f0 \uc0\u10071
-\f1 \\u2757 heavy exclamation mark symbol\
-
-\f2 \uc0\u10084
-\f1 \\u2764 heavy black heart\
-
-\f0 \uc0\u10133
-\f1 \\u2795 heavy plus sign\
-
-\f0 \uc0\u10134
-\f1 \\u2796 heavy minus sign\
-
-\f0 \uc0\u10135
-\f1 \\u2797 heavy division sign\
-
-\f2 \uc0\u10145
-\f1 \\u27a1 black rightwards arrow\
-
-\f0 \uc0\u10160
-\f1 \\u27b0 curly loop\
-
-\f0 \uc0\u55357 \u56960
-\f1 \\ud83d\\ude80 rocket\
-
-\f0 \uc0\u55357 \u56963
-\f1 \\ud83d\\ude83 railway car\
-
-\f0 \uc0\u55357 \u56964
-\f1 \\ud83d\\ude84 high-speed train\
-
-\f0 \uc0\u55357 \u56965
-\f1 \\ud83d\\ude85 high-speed train with bullet nose\
-
-\f0 \uc0\u55357 \u56967
-\f1 \\ud83d\\ude87 metro\
-
-\f0 \uc0\u55357 \u56969
-\f1 \\ud83d\\ude89 station\
-
-\f0 \uc0\u55357 \u56972
-\f1 \\ud83d\\ude8c bus\
-
-\f0 \uc0\u55357 \u56975
-\f1 \\ud83d\\ude8f bus stop\
-
-\f0 \uc0\u55357 \u56977
-\f1 \\ud83d\\ude91 ambulance\
-
-\f0 \uc0\u55357 \u56978
-\f1 \\ud83d\\ude92 fire engine\
-
-\f0 \uc0\u55357 \u56979
-\f1 \\ud83d\\ude93 police car\
-
-\f0 \uc0\u55357 \u56981
-\f1 \\ud83d\\ude95 taxi\
-
-\f0 \uc0\u55357 \u56983
-\f1 \\ud83d\\ude97 automobile\
-
-\f0 \uc0\u55357 \u56985
-\f1 \\ud83d\\ude99 recreational vehicle\
-
-\f0 \uc0\u55357 \u56986
-\f1 \\ud83d\\ude9a delivery truck\
-
-\f0 \uc0\u55357 \u56994
-\f1 \\ud83d\\udea2 ship\
-
-\f0 \uc0\u55357 \u56996
-\f1 \\ud83d\\udea4 speedboat\
-
-\f0 \uc0\u55357 \u56997
-\f1 \\ud83d\\udea5 horizontal traffic light\
-
-\f0 \uc0\u55357 \u56999
-\f1 \\ud83d\\udea7 construction sign\
-
-\f0 \uc0\u55357 \u57000
-\f1 \\ud83d\\udea8 police cars revolving light\
-
-\f0 \uc0\u55357 \u57001
-\f1 \\ud83d\\udea9 triangular flag on post\
-
-\f0 \uc0\u55357 \u57002
-\f1 \\ud83d\\udeaa door\
-
-\f0 \uc0\u55357 \u57003
-\f1 \\ud83d\\udeab no entry sign\
-
-\f0 \uc0\u55357 \u57004
-\f1 \\ud83d\\udeac smoking symbol\
-
-\f0 \uc0\u55357 \u57005
-\f1 \\ud83d\\udead no smoking symbol\
-
-\f0 \uc0\u55357 \u57010
-\f1 \\ud83d\\udeb2 bicycle\
-
-\f0 \uc0\u55357 \u57014
-\f1 \\ud83d\\udeb6 pedestrian\
-
-\f0 \uc0\u55357 \u57017
-\f1 \\ud83d\\udeb9 mens symbol\
-
-\f0 \uc0\u55357 \u57018
-\f1 \\ud83d\\udeba womens symbol\
-
-\f0 \uc0\u55357 \u57019
-\f1 \\ud83d\\udebb restroom\
-
-\f0 \uc0\u55357 \u57020
-\f1 \\ud83d\\udebc baby symbol\
-
-\f0 \uc0\u55357 \u57021
-\f1 \\ud83d\\udebd toilet\
-
-\f0 \uc0\u55357 \u57022
-\f1 \\ud83d\\udebe water closet\
-
-\f0 \uc0\u55357 \u57024
-\f1 \\ud83d\\udec0 bath\
-
-\f3 \uc0\u9410
-\f1 \\u24c2 circled latin capital letter m\
-
-\f3 \uc0\u55356 \u56688
-\f1 \\ud83c\\udd70 negative squared latin capital letter a\
-
-\f3 \uc0\u55356 \u56689
-\f1 \\ud83c\\udd71 negative squared latin capital letter b\
-
-\f3 \uc0\u55356 \u56702
-\f1 \\ud83c\\udd7e negative squared latin capital letter o\
-
-\f3 \uc0\u55356 \u56703
-\f1 \\ud83c\\udd7f negative squared latin capital letter p\
-
-\f0 \uc0\u55356 \u56718
-\f1 \\ud83c\\udd8e negative squared ab\
-
-\f0 \uc0\u55356 \u56721
-\f1 \\ud83c\\udd91 squared cl\
-
-\f0 \uc0\u55356 \u56722
-\f1 \\ud83c\\udd92 squared cool\
-
-\f0 \uc0\u55356 \u56723
-\f1 \\ud83c\\udd93 squared free\
-
-\f0 \uc0\u55356 \u56724
-\f1 \\ud83c\\udd94 squared id\
-
-\f0 \uc0\u55356 \u56725
-\f1 \\ud83c\\udd95 squared new\
-
-\f0 \uc0\u55356 \u56726
-\f1 \\ud83c\\udd96 squared ng\
-
-\f0 \uc0\u55356 \u56727
-\f1 \\ud83c\\udd97 squared ok\
-
-\f0 \uc0\u55356 \u56728
-\f1 \\ud83c\\udd98 squared sos\
-
-\f0 \uc0\u55356 \u56729
-\f1 \\ud83c\\udd99 squared up with exclamation mark\
-
-\f0 \uc0\u55356 \u56730
-\f1 \\ud83c\\udd9a squared vs\
-
-\f0 \uc0\u55356 \u56809 \u55356 \u56810
-\f1 \\ud83c\\udde9\\ud83c\\uddea regional indicator symbol letter d + regional indicator symbol letter e\
-
-\f0 \uc0\u55356 \u56812 \u55356 \u56807
-\f1 \\ud83c\\uddec\\ud83c\\udde7 regional indicator symbol letter g + regional indicator symbol letter b\
-
-\f0 \uc0\u55356 \u56808 \u55356 \u56819
-\f1 \\ud83c\\udde8\\ud83c\\uddf3 regional indicator symbol letter c + regional indicator symbol letter n\
-
-\f0 \uc0\u55356 \u56815 \u55356 \u56821
-\f1 \\ud83c\\uddef\\ud83c\\uddf5 regional indicator symbol letter j + regional indicator symbol letter p\
-
-\f0 \uc0\u55356 \u56816 \u55356 \u56823
-\f1 \\ud83c\\uddf0\\ud83c\\uddf7 regional indicator symbol letter k + regional indicator symbol letter r\
-
-\f0 \uc0\u55356 \u56811 \u55356 \u56823
-\f1 \\ud83c\\uddeb\\ud83c\\uddf7 regional indicator symbol letter f + regional indicator symbol letter r\
-
-\f0 \uc0\u55356 \u56810 \u55356 \u56824
-\f1 \\ud83c\\uddea\\ud83c\\uddf8 regional indicator symbol letter e + regional indicator symbol letter s\
-
-\f0 \uc0\u55356 \u56814 \u55356 \u56825
-\f1 \\ud83c\\uddee\\ud83c\\uddf9 regional indicator symbol letter i + regional indicator symbol letter t\
-
-\f0 \uc0\u55356 \u56826 \u55356 \u56824
-\f1 \\ud83c\\uddfa\\ud83c\\uddf8 regional indicator symbol letter u + regional indicator symbol letter s\
-
-\f0 \uc0\u55356 \u56823 \u55356 \u56826
-\f1 \\ud83c\\uddf7\\ud83c\\uddfa regional indicator symbol letter r + regional indicator symbol letter u\
-
-\f0 \uc0\u55356 \u56833
-\f1 \\ud83c\\ude01 squared katakana koko\
-
-\f3 \uc0\u55356 \u56834
-\f1 \\ud83c\\ude02 squared katakana sa\
-
-\f0 \uc0\u55356 \u56858
-\f1 \\ud83c\\ude1a squared cjk unified ideograph-7121\
-
-\f0 \uc0\u55356 \u56879
-\f1 \\ud83c\\ude2f squared cjk unified ideograph-6307\
-
-\f0 \uc0\u55356 \u56882
-\f1 \\ud83c\\ude32 squared cjk unified ideograph-7981\
-
-\f0 \uc0\u55356 \u56883
-\f1 \\ud83c\\ude33 squared cjk unified ideograph-7a7a\
-
-\f0 \uc0\u55356 \u56884
-\f1 \\ud83c\\ude34 squared cjk unified ideograph-5408\
-
-\f0 \uc0\u55356 \u56885
-\f1 \\ud83c\\ude35 squared cjk unified ideograph-6e80\
-
-\f0 \uc0\u55356 \u56886
-\f1 \\ud83c\\ude36 squared cjk unified ideograph-6709\
-
-\f3 \uc0\u55356 \u56887
-\f1 \\ud83c\\ude37 squared cjk unified ideograph-6708\
-
-\f0 \uc0\u55356 \u56888
-\f1 \\ud83c\\ude38 squared cjk unified ideograph-7533\
-
-\f0 \uc0\u55356 \u56889
-\f1 \\ud83c\\ude39 squared cjk unified ideograph-5272\
-
-\f0 \uc0\u55356 \u56890
-\f1 \\ud83c\\ude3a squared cjk unified ideograph-55b6\
-
-\f0 \uc0\u55356 \u56912
-\f1 \\ud83c\\ude50 circled ideograph advantage\
-
-\f0 \uc0\u55356 \u56913
-\f1 \\ud83c\\ude51 circled ideograph accept\
-\'a9 \\ua9 copyright sign\
-\'ae \\uae registered sign\
-\uc0\u8252 \\u203c double exclamation mark\
-\uc0\u8265 \\u2049 exclamation question mark\
-
-\f4 8\uc0\u8419
-\f1 \\u38\\u20e3 digit eight + combining enclosing keycap\
-
-\f4 9\uc0\u8419
-\f1 \\u39\\u20e3 digit nine + combining enclosing keycap\
-
-\f4 7\uc0\u8419
-\f1 \\u37\\u20e3 digit seven + combining enclosing keycap\
-
-\f4 6\uc0\u8419
-\f1 \\u36\\u20e3 digit six + combining enclosing keycap\
-
-\f4 1\uc0\u8419
-\f1 \\u31\\u20e3 digit one + combining enclosing keycap\
-
-\f4 0\uc0\u8419
-\f1 \\u30\\u20e3 digit zero + combining enclosing keycap\
-
-\f4 2\uc0\u8419
-\f1 \\u32\\u20e3 digit two + combining enclosing keycap\
-
-\f4 3\uc0\u8419
-\f1 \\u33\\u20e3 digit three + combining enclosing keycap\
-
-\f4 5\uc0\u8419
-\f1 \\u35\\u20e3 digit five + combining enclosing keycap\
-
-\f4 4\uc0\u8419
-\f1 \\u34\\u20e3 digit four + combining enclosing keycap\
-
-\f4 #\uc0\u8419
-\f1 \\u23\\u20e3 number sign + combining enclosing keycap\
-\'99 \\u2122 trade mark sign\
-
-\f5 \uc0\u8505
-\f1 \\u2139 information source\
-
-\f3 \uc0\u8596
-\f1 \\u2194 left right arrow\
-
-\f6 \uc0\u8597
-\f1 \\u2195 up down arrow\
-
-\f4 \uc0\u8598
-\f1 \\u2196 north west arrow\
-
-\f3 \uc0\u8599
-\f1 \\u2197 north east arrow\
-
-\f4 \uc0\u8600
-\f1 \\u2198 south east arrow\
-
-\f3 \uc0\u8601
-\f1 \\u2199 south west arrow\
-
-\f4 \uc0\u8617
-\f1 \\u21a9 leftwards arrow with hook\
-
-\f4 \uc0\u8618
-\f1 \\u21aa rightwards arrow with hook\
-
-\f0 \uc0\u8986
-\f1 \\u231a watch\
-
-\f0 \uc0\u8987
-\f1 \\u231b hourglass\
-
-\f0 \uc0\u9193
-\f1 \\u23e9 black right-pointing double triangle\
-
-\f0 \uc0\u9194
-\f1 \\u23ea black left-pointing double triangle\
-
-\f0 \uc0\u9195
-\f1 \\u23eb black up-pointing double triangle\
-
-\f0 \uc0\u9196
-\f1 \\u23ec black down-pointing double triangle\
-
-\f0 \uc0\u9200
-\f1 \\u23f0 alarm clock\
-
-\f0 \uc0\u9203
-\f1 \\u23f3 hourglass with flowing sand\
-
-\f4 \uc0\u9642
-\f1 \\u25aa black small square\
-
-\f4 \uc0\u9643
-\f1 \\u25ab white small square\
-
-\f4 \uc0\u9654
-\f1 \\u25b6 black right-pointing triangle\
-
-\f3 \uc0\u9664
-\f1 \\u25c0 black left-pointing triangle\
-
-\f7 \uc0\u9723
-\f1 \\u25fb white medium square\
-
-\f7 \uc0\u9724
-\f1 \\u25fc black medium square\
-
-\f0 \uc0\u9725
-\f1 \\u25fd white medium small square\
-
-\f0 \uc0\u9726
-\f1 \\u25fe black medium small square\
-
-\f3 \uc0\u9728
-\f1 \\u2600 black sun with rays\
-
-\f3 \uc0\u9729
-\f1 \\u2601 cloud\
-
-\f3 \uc0\u9742
-\f1 \\u260e black telephone\
-
-\f5 \uc0\u9745
-\f1 \\u2611 ballot box with check\
-
-\f0 \uc0\u9748
-\f1 \\u2614 umbrella with rain drops\
-
-\f0 \uc0\u9749
-\f1 \\u2615 hot beverage\
-
-\f3 \uc0\u9757
-\f1 \\u261d white up pointing index\
-
-\f6 \uc0\u9786
-\f1 \\u263a white smiling face\
-
-\f0 \uc0\u9800
-\f1 \\u2648 aries\
-
-\f0 \uc0\u9801
-\f1 \\u2649 taurus\
-
-\f0 \uc0\u9802
-\f1 \\u264a gemini\
-
-\f0 \uc0\u9803
-\f1 \\u264b cancer\
-
-\f0 \uc0\u9804
-\f1 \\u264c leo\
-
-\f0 \uc0\u9805
-\f1 \\u264d virgo\
-
-\f0 \uc0\u9806
-\f1 \\u264e libra\
-
-\f0 \uc0\u9807
-\f1 \\u264f scorpius\
-
-\f0 \uc0\u9808
-\f1 \\u2650 sagittarius\
-
-\f0 \uc0\u9809
-\f1 \\u2651 capricorn\
-
-\f0 \uc0\u9810
-\f1 \\u2652 aquarius\
-
-\f0 \uc0\u9811
-\f1 \\u2653 pisces\
-
-\f3 \uc0\u9824
-\f1 \\u2660 black spade suit\
-
-\f3 \uc0\u9827
-\f1 \\u2663 black club suit\
-
-\f3 \uc0\u9829
-\f1 \\u2665 black heart suit\
-
-\f3 \uc0\u9830
-\f1 \\u2666 black diamond suit\
-
-\f3 \uc0\u9832
-\f1 \\u2668 hot springs\
-
-\f3 \uc0\u9851
-\f1 \\u267b black universal recycling symbol\
-
-\f0 \uc0\u9855
-\f1 \\u267f wheelchair symbol\
-
-\f0 \uc0\u9875
-\f1 \\u2693 anchor\
-
-\f3 \uc0\u9888
-\f1 \\u26a0 warning sign\
-
-\f0 \uc0\u9889
-\f1 \\u26a1 high voltage sign\
-
-\f0 \uc0\u9898
-\f1 \\u26aa medium white circle\
-
-\f0 \uc0\u9899
-\f1 \\u26ab medium black circle\
-
-\f0 \uc0\u9917
-\f1 \\u26bd soccer ball\
-
-\f3 \uc0\u9918
-\f1 \\u26be baseball\
-
-\f0 \uc0\u9924
-\f1 \\u26c4 snowman without snow\
-
-\f0 \uc0\u9925
-\f1 \\u26c5 sun behind cloud\
-
-\f0 \uc0\u9934
-\f1 \\u26ce ophiuchus\
-
-\f0 \uc0\u9940
-\f1 \\u26d4 no entry\
-
-\f0 \uc0\u9962
-\f1 \\u26ea church\
-
-\f0 \uc0\u9970
-\f1 \\u26f2 fountain\
-
-\f0 \uc0\u9971
-\f1 \\u26f3 flag in hole\
-
-\f0 \uc0\u9973
-\f1 \\u26f5 sailboat\
-
-\f0 \uc0\u9978
-\f1 \\u26fa tent\
-
-\f0 \uc0\u9981
-\f1 \\u26fd fuel pump\
-
-\f3 \uc0\u10548
-\f1 \\u2934 arrow pointing rightwards then curving upwards\
-
-\f3 \uc0\u10549
-\f1 \\u2935 arrow pointing rightwards then curving downwards\
-
-\f3 \uc0\u11013
-\f1 \\u2b05 leftwards black arrow\
-
-\f3 \uc0\u11014
-\f1 \\u2b06 upwards black arrow\
-
-\f3 \uc0\u11015
-\f1 \\u2b07 downwards black arrow\
-
-\f0 \uc0\u11035
-\f1 \\u2b1b black large square\
-
-\f0 \uc0\u11036
-\f1 \\u2b1c white large square\
-
-\f0 \uc0\u11088
-\f1 \\u2b50 white medium star\
-
-\f0 \uc0\u11093
-\f1 \\u2b55 heavy large circle\
-
-\f3 \uc0\u12336
-\f1 \\u3030 wavy dash\
-
-\f3 \uc0\u12349
-\f1 \\u303d part alternation mark\
-
-\f3 \uc0\u12951
-\f1 \\u3297 circled ideograph congratulation\
-
-\f3 \uc0\u12953
-\f1 \\u3299 circled ideograph secret\
-
-\f0 \uc0\u55356 \u56324
-\f1 \\ud83c\\udc04 mahjong tile red dragon\
-
-\f0 \uc0\u55356 \u56527
-\f1 \\ud83c\\udccf playing card black joker\
-
-\f0 \uc0\u55356 \u57088
-\f1 \\ud83c\\udf00 cyclone\
-
-\f0 \uc0\u55356 \u57089
-\f1 \\ud83c\\udf01 foggy\
-
-\f0 \uc0\u55356 \u57090
-\f1 \\ud83c\\udf02 closed umbrella\
-
-\f0 \uc0\u55356 \u57091
-\f1 \\ud83c\\udf03 night with stars\
-
-\f0 \uc0\u55356 \u57092
-\f1 \\ud83c\\udf04 sunrise over mountains\
-
-\f0 \uc0\u55356 \u57093
-\f1 \\ud83c\\udf05 sunrise\
-
-\f0 \uc0\u55356 \u57094
-\f1 \\ud83c\\udf06 cityscape at dusk\
-
-\f0 \uc0\u55356 \u57095
-\f1 \\ud83c\\udf07 sunset over buildings\
-
-\f0 \uc0\u55356 \u57096
-\f1 \\ud83c\\udf08 rainbow\
-
-\f0 \uc0\u55356 \u57097
-\f1 \\ud83c\\udf09 bridge at night\
-
-\f0 \uc0\u55356 \u57098
-\f1 \\ud83c\\udf0a water wave\
-
-\f0 \uc0\u55356 \u57099
-\f1 \\ud83c\\udf0b volcano\
-
-\f0 \uc0\u55356 \u57100
-\f1 \\ud83c\\udf0c milky way\
-
-\f0 \uc0\u55356 \u57103
-\f1 \\ud83c\\udf0f earth globe asia-australia\
-
-\f0 \uc0\u55356 \u57105
-\f1 \\ud83c\\udf11 new moon symbol\
-
-\f0 \uc0\u55356 \u57107
-\f1 \\ud83c\\udf13 first quarter moon symbol\
-
-\f0 \uc0\u55356 \u57108
-\f1 \\ud83c\\udf14 waxing gibbous moon symbol\
-
-\f0 \uc0\u55356 \u57109
-\f1 \\ud83c\\udf15 full moon symbol\
-
-\f0 \uc0\u55356 \u57113
-\f1 \\ud83c\\udf19 crescent moon\
-
-\f0 \uc0\u55356 \u57115
-\f1 \\ud83c\\udf1b first quarter moon with face\
-
-\f0 \uc0\u55356 \u57119
-\f1 \\ud83c\\udf1f glowing star\
-
-\f0 \uc0\u55356 \u57120
-\f1 \\ud83c\\udf20 shooting star\
-
-\f0 \uc0\u55356 \u57136
-\f1 \\ud83c\\udf30 chestnut\
-
-\f0 \uc0\u55356 \u57137
-\f1 \\ud83c\\udf31 seedling\
-
-\f0 \uc0\u55356 \u57140
-\f1 \\ud83c\\udf34 palm tree\
-
-\f0 \uc0\u55356 \u57141
-\f1 \\ud83c\\udf35 cactus\
-
-\f0 \uc0\u55356 \u57143
-\f1 \\ud83c\\udf37 tulip\
-
-\f0 \uc0\u55356 \u57144
-\f1 \\ud83c\\udf38 cherry blossom\
-
-\f0 \uc0\u55356 \u57145
-\f1 \\ud83c\\udf39 rose\
-
-\f0 \uc0\u55356 \u57146
-\f1 \\ud83c\\udf3a hibiscus\
-
-\f0 \uc0\u55356 \u57147
-\f1 \\ud83c\\udf3b sunflower\
-
-\f0 \uc0\u55356 \u57148
-\f1 \\ud83c\\udf3c blossom\
-
-\f0 \uc0\u55356 \u57149
-\f1 \\ud83c\\udf3d ear of maize\
-
-\f0 \uc0\u55356 \u57150
-\f1 \\ud83c\\udf3e ear of rice\
-
-\f0 \uc0\u55356 \u57151
-\f1 \\ud83c\\udf3f herb\
-
-\f0 \uc0\u55356 \u57152
-\f1 \\ud83c\\udf40 four leaf clover\
-
-\f0 \uc0\u55356 \u57153
-\f1 \\ud83c\\udf41 maple leaf\
-
-\f0 \uc0\u55356 \u57154
-\f1 \\ud83c\\udf42 fallen leaf\
-
-\f0 \uc0\u55356 \u57155
-\f1 \\ud83c\\udf43 leaf fluttering in wind\
-
-\f0 \uc0\u55356 \u57156
-\f1 \\ud83c\\udf44 mushroom\
-
-\f0 \uc0\u55356 \u57157
-\f1 \\ud83c\\udf45 tomato\
-
-\f0 \uc0\u55356 \u57158
-\f1 \\ud83c\\udf46 aubergine\
-
-\f0 \uc0\u55356 \u57159
-\f1 \\ud83c\\udf47 grapes\
-
-\f0 \uc0\u55356 \u57160
-\f1 \\ud83c\\udf48 melon\
-
-\f0 \uc0\u55356 \u57161
-\f1 \\ud83c\\udf49 watermelon\
-
-\f0 \uc0\u55356 \u57162
-\f1 \\ud83c\\udf4a tangerine\
-
-\f0 \uc0\u55356 \u57164
-\f1 \\ud83c\\udf4c banana\
-
-\f0 \uc0\u55356 \u57165
-\f1 \\ud83c\\udf4d pineapple\
-
-\f0 \uc0\u55356 \u57166
-\f1 \\ud83c\\udf4e red apple\
-
-\f0 \uc0\u55356 \u57167
-\f1 \\ud83c\\udf4f green apple\
-
-\f0 \uc0\u55356 \u57169
-\f1 \\ud83c\\udf51 peach\
-
-\f0 \uc0\u55356 \u57170
-\f1 \\ud83c\\udf52 cherries\
-
-\f0 \uc0\u55356 \u57171
-\f1 \\ud83c\\udf53 strawberry\
-
-\f0 \uc0\u55356 \u57172
-\f1 \\ud83c\\udf54 hamburger\
-
-\f0 \uc0\u55356 \u57173
-\f1 \\ud83c\\udf55 slice of pizza\
-
-\f0 \uc0\u55356 \u57174
-\f1 \\ud83c\\udf56 meat on bone\
-
-\f0 \uc0\u55356 \u57175
-\f1 \\ud83c\\udf57 poultry leg\
-
-\f0 \uc0\u55356 \u57176
-\f1 \\ud83c\\udf58 rice cracker\
-
-\f0 \uc0\u55356 \u57177
-\f1 \\ud83c\\udf59 rice ball\
-
-\f0 \uc0\u55356 \u57178
-\f1 \\ud83c\\udf5a cooked rice\
-
-\f0 \uc0\u55356 \u57179
-\f1 \\ud83c\\udf5b curry and rice\
-
-\f0 \uc0\u55356 \u57180
-\f1 \\ud83c\\udf5c steaming bowl\
-
-\f0 \uc0\u55356 \u57181
-\f1 \\ud83c\\udf5d spaghetti\
-
-\f0 \uc0\u55356 \u57182
-\f1 \\ud83c\\udf5e bread\
-
-\f0 \uc0\u55356 \u57183
-\f1 \\ud83c\\udf5f french fries\
-
-\f0 \uc0\u55356 \u57184
-\f1 \\ud83c\\udf60 roasted sweet potato\
-
-\f0 \uc0\u55356 \u57185
-\f1 \\ud83c\\udf61 dango\
-
-\f0 \uc0\u55356 \u57186
-\f1 \\ud83c\\udf62 oden\
-
-\f0 \uc0\u55356 \u57187
-\f1 \\ud83c\\udf63 sushi\
-
-\f0 \uc0\u55356 \u57188
-\f1 \\ud83c\\udf64 fried shrimp\
-
-\f0 \uc0\u55356 \u57189
-\f1 \\ud83c\\udf65 fish cake with swirl design\
-
-\f0 \uc0\u55356 \u57190
-\f1 \\ud83c\\udf66 soft ice cream\
-
-\f0 \uc0\u55356 \u57191
-\f1 \\ud83c\\udf67 shaved ice\
-
-\f0 \uc0\u55356 \u57192
-\f1 \\ud83c\\udf68 ice cream\
-
-\f0 \uc0\u55356 \u57193
-\f1 \\ud83c\\udf69 doughnut\
-
-\f0 \uc0\u55356 \u57194
-\f1 \\ud83c\\udf6a cookie\
-
-\f0 \uc0\u55356 \u57195
-\f1 \\ud83c\\udf6b chocolate bar\
-
-\f0 \uc0\u55356 \u57196
-\f1 \\ud83c\\udf6c candy\
-
-\f0 \uc0\u55356 \u57197
-\f1 \\ud83c\\udf6d lollipop\
-
-\f0 \uc0\u55356 \u57198
-\f1 \\ud83c\\udf6e custard\
-
-\f0 \uc0\u55356 \u57199
-\f1 \\ud83c\\udf6f honey pot\
-
-\f0 \uc0\u55356 \u57200
-\f1 \\ud83c\\udf70 shortcake\
-
-\f0 \uc0\u55356 \u57201
-\f1 \\ud83c\\udf71 bento box\
-
-\f0 \uc0\u55356 \u57202
-\f1 \\ud83c\\udf72 pot of food\
-
-\f0 \uc0\u55356 \u57203
-\f1 \\ud83c\\udf73 cooking\
-
-\f0 \uc0\u55356 \u57204
-\f1 \\ud83c\\udf74 fork and knife\
-
-\f0 \uc0\u55356 \u57205
-\f1 \\ud83c\\udf75 teacup without handle\
-
-\f0 \uc0\u55356 \u57206
-\f1 \\ud83c\\udf76 sake bottle and cup\
-
-\f0 \uc0\u55356 \u57207
-\f1 \\ud83c\\udf77 wine glass\
-
-\f0 \uc0\u55356 \u57208
-\f1 \\ud83c\\udf78 cocktail glass\
-
-\f0 \uc0\u55356 \u57209
-\f1 \\ud83c\\udf79 tropical drink\
-
-\f0 \uc0\u55356 \u57210
-\f1 \\ud83c\\udf7a beer mug\
-
-\f0 \uc0\u55356 \u57211
-\f1 \\ud83c\\udf7b clinking beer mugs\
-
-\f0 \uc0\u55356 \u57216
-\f1 \\ud83c\\udf80 ribbon\
-
-\f0 \uc0\u55356 \u57217
-\f1 \\ud83c\\udf81 wrapped present\
-
-\f0 \uc0\u55356 \u57218
-\f1 \\ud83c\\udf82 birthday cake\
-
-\f0 \uc0\u55356 \u57219
-\f1 \\ud83c\\udf83 jack-o-lantern\
-
-\f0 \uc0\u55356 \u57220
-\f1 \\ud83c\\udf84 christmas tree\
-
-\f0 \uc0\u55356 \u57221
-\f1 \\ud83c\\udf85 father christmas\
-
-\f0 \uc0\u55356 \u57222
-\f1 \\ud83c\\udf86 fireworks\
-
-\f0 \uc0\u55356 \u57223
-\f1 \\ud83c\\udf87 firework sparkler\
-
-\f0 \uc0\u55356 \u57224
-\f1 \\ud83c\\udf88 balloon\
-
-\f0 \uc0\u55356 \u57225
-\f1 \\ud83c\\udf89 party popper\
-
-\f0 \uc0\u55356 \u57226
-\f1 \\ud83c\\udf8a confetti ball\
-
-\f0 \uc0\u55356 \u57227
-\f1 \\ud83c\\udf8b tanabata tree\
-
-\f0 \uc0\u55356 \u57228
-\f1 \\ud83c\\udf8c crossed flags\
-
-\f0 \uc0\u55356 \u57229
-\f1 \\ud83c\\udf8d pine decoration\
-
-\f0 \uc0\u55356 \u57230
-\f1 \\ud83c\\udf8e japanese dolls\
-
-\f0 \uc0\u55356 \u57231
-\f1 \\ud83c\\udf8f carp streamer\
-
-\f0 \uc0\u55356 \u57232
-\f1 \\ud83c\\udf90 wind chime\
-
-\f0 \uc0\u55356 \u57233
-\f1 \\ud83c\\udf91 moon viewing ceremony\
-
-\f0 \uc0\u55356 \u57234
-\f1 \\ud83c\\udf92 school satchel\
-
-\f0 \uc0\u55356 \u57235
-\f1 \\ud83c\\udf93 graduation cap\
-
-\f0 \uc0\u55356 \u57248
-\f1 \\ud83c\\udfa0 carousel horse\
-
-\f0 \uc0\u55356 \u57249
-\f1 \\ud83c\\udfa1 ferris wheel\
-
-\f0 \uc0\u55356 \u57250
-\f1 \\ud83c\\udfa2 roller coaster\
-
-\f0 \uc0\u55356 \u57251
-\f1 \\ud83c\\udfa3 fishing pole and fish\
-
-\f0 \uc0\u55356 \u57252
-\f1 \\ud83c\\udfa4 microphone\
-
-\f0 \uc0\u55356 \u57253
-\f1 \\ud83c\\udfa5 movie camera\
-
-\f0 \uc0\u55356 \u57254
-\f1 \\ud83c\\udfa6 cinema\
-
-\f0 \uc0\u55356 \u57255
-\f1 \\ud83c\\udfa7 headphone\
-
-\f0 \uc0\u55356 \u57256
-\f1 \\ud83c\\udfa8 artist palette\
-
-\f0 \uc0\u55356 \u57257
-\f1 \\ud83c\\udfa9 top hat\
-
-\f0 \uc0\u55356 \u57258
-\f1 \\ud83c\\udfaa circus tent\
-
-\f0 \uc0\u55356 \u57259
-\f1 \\ud83c\\udfab ticket\
-
-\f0 \uc0\u55356 \u57260
-\f1 \\ud83c\\udfac clapper board\
-
-\f0 \uc0\u55356 \u57261
-\f1 \\ud83c\\udfad performing arts\
-
-\f0 \uc0\u55356 \u57262
-\f1 \\ud83c\\udfae video game\
-
-\f0 \uc0\u55356 \u57263
-\f1 \\ud83c\\udfaf direct hit\
-
-\f0 \uc0\u55356 \u57264
-\f1 \\ud83c\\udfb0 slot machine\
-
-\f0 \uc0\u55356 \u57265
-\f1 \\ud83c\\udfb1 billiards\
-
-\f0 \uc0\u55356 \u57266
-\f1 \\ud83c\\udfb2 game die\
-
-\f0 \uc0\u55356 \u57267
-\f1 \\ud83c\\udfb3 bowling\
-
-\f0 \uc0\u55356 \u57268
-\f1 \\ud83c\\udfb4 flower playing cards\
-
-\f0 \uc0\u55356 \u57269
-\f1 \\ud83c\\udfb5 musical note\
-
-\f0 \uc0\u55356 \u57270
-\f1 \\ud83c\\udfb6 multiple musical notes\
-
-\f0 \uc0\u55356 \u57271
-\f1 \\ud83c\\udfb7 saxophone\
-
-\f0 \uc0\u55356 \u57272
-\f1 \\ud83c\\udfb8 guitar\
-
-\f0 \uc0\u55356 \u57273
-\f1 \\ud83c\\udfb9 musical keyboard\
-
-\f0 \uc0\u55356 \u57274
-\f1 \\ud83c\\udfba trumpet\
-
-\f0 \uc0\u55356 \u57275
-\f1 \\ud83c\\udfbb violin\
-
-\f0 \uc0\u55356 \u57276
-\f1 \\ud83c\\udfbc musical score\
-
-\f0 \uc0\u55356 \u57277
-\f1 \\ud83c\\udfbd running shirt with sash\
-
-\f0 \uc0\u55356 \u57278
-\f1 \\ud83c\\udfbe tennis racquet and ball\
-
-\f0 \uc0\u55356 \u57279
-\f1 \\ud83c\\udfbf ski and ski boot\
-
-\f0 \uc0\u55356 \u57280
-\f1 \\ud83c\\udfc0 basketball and hoop\
-
-\f0 \uc0\u55356 \u57281
-\f1 \\ud83c\\udfc1 chequered flag\
-
-\f0 \uc0\u55356 \u57282
-\f1 \\ud83c\\udfc2 snowboarder\
-
-\f0 \uc0\u55356 \u57283
-\f1 \\ud83c\\udfc3 runner\
-
-\f0 \uc0\u55356 \u57284
-\f1 \\ud83c\\udfc4 surfer\
-
-\f0 \uc0\u55356 \u57286
-\f1 \\ud83c\\udfc6 trophy\
-
-\f0 \uc0\u55356 \u57288
-\f1 \\ud83c\\udfc8 american football\
-
-\f0 \uc0\u55356 \u57290
-\f1 \\ud83c\\udfca swimmer\
-
-\f0 \uc0\u55356 \u57312
-\f1 \\ud83c\\udfe0 house building\
-
-\f0 \uc0\u55356 \u57313
-\f1 \\ud83c\\udfe1 house with garden\
-
-\f0 \uc0\u55356 \u57314
-\f1 \\ud83c\\udfe2 office building\
-
-\f0 \uc0\u55356 \u57315
-\f1 \\ud83c\\udfe3 japanese post office\
-
-\f0 \uc0\u55356 \u57317
-\f1 \\ud83c\\udfe5 hospital\
-
-\f0 \uc0\u55356 \u57318
-\f1 \\ud83c\\udfe6 bank\
-
-\f0 \uc0\u55356 \u57319
-\f1 \\ud83c\\udfe7 automated teller machine\
-
-\f0 \uc0\u55356 \u57320
-\f1 \\ud83c\\udfe8 hotel\
-
-\f0 \uc0\u55356 \u57321
-\f1 \\ud83c\\udfe9 love hotel\
-
-\f0 \uc0\u55356 \u57322
-\f1 \\ud83c\\udfea convenience store\
-
-\f0 \uc0\u55356 \u57323
-\f1 \\ud83c\\udfeb school\
-
-\f0 \uc0\u55356 \u57324
-\f1 \\ud83c\\udfec department store\
-
-\f0 \uc0\u55356 \u57325
-\f1 \\ud83c\\udfed factory\
-
-\f0 \uc0\u55356 \u57326
-\f1 \\ud83c\\udfee izakaya lantern\
-
-\f0 \uc0\u55356 \u57327
-\f1 \\ud83c\\udfef japanese castle\
-
-\f0 \uc0\u55356 \u57328
-\f1 \\ud83c\\udff0 european castle\
-
-\f0 \uc0\u55357 \u56332
-\f1 \\ud83d\\udc0c snail\
-
-\f0 \uc0\u55357 \u56333
-\f1 \\ud83d\\udc0d snake\
-
-\f0 \uc0\u55357 \u56334
-\f1 \\ud83d\\udc0e horse\
-
-\f0 \uc0\u55357 \u56337
-\f1 \\ud83d\\udc11 sheep\
-
-\f0 \uc0\u55357 \u56338
-\f1 \\ud83d\\udc12 monkey\
-
-\f0 \uc0\u55357 \u56340
-\f1 \\ud83d\\udc14 chicken\
-
-\f0 \uc0\u55357 \u56343
-\f1 \\ud83d\\udc17 boar\
-
-\f0 \uc0\u55357 \u56344
-\f1 \\ud83d\\udc18 elephant\
-
-\f0 \uc0\u55357 \u56345
-\f1 \\ud83d\\udc19 octopus\
-
-\f0 \uc0\u55357 \u56346
-\f1 \\ud83d\\udc1a spiral shell\
-
-\f0 \uc0\u55357 \u56347
-\f1 \\ud83d\\udc1b bug\
-
-\f0 \uc0\u55357 \u56348
-\f1 \\ud83d\\udc1c ant\
-
-\f0 \uc0\u55357 \u56349
-\f1 \\ud83d\\udc1d honeybee\
-
-\f0 \uc0\u55357 \u56350
-\f1 \\ud83d\\udc1e lady beetle\
-
-\f0 \uc0\u55357 \u56351
-\f1 \\ud83d\\udc1f fish\
-
-\f0 \uc0\u55357 \u56352
-\f1 \\ud83d\\udc20 tropical fish\
-
-\f0 \uc0\u55357 \u56353
-\f1 \\ud83d\\udc21 blowfish\
-
-\f0 \uc0\u55357 \u56354
-\f1 \\ud83d\\udc22 turtle\
-
-\f0 \uc0\u55357 \u56355
-\f1 \\ud83d\\udc23 hatching chick\
-
-\f0 \uc0\u55357 \u56356
-\f1 \\ud83d\\udc24 baby chick\
-
-\f0 \uc0\u55357 \u56357
-\f1 \\ud83d\\udc25 front-facing baby chick\
-
-\f0 \uc0\u55357 \u56358
-\f1 \\ud83d\\udc26 bird\
-
-\f0 \uc0\u55357 \u56359
-\f1 \\ud83d\\udc27 penguin\
-
-\f0 \uc0\u55357 \u56360
-\f1 \\ud83d\\udc28 koala\
-
-\f0 \uc0\u55357 \u56361
-\f1 \\ud83d\\udc29 poodle\
-
-\f0 \uc0\u55357 \u56363
-\f1 \\ud83d\\udc2b bactrian camel\
-
-\f0 \uc0\u55357 \u56364
-\f1 \\ud83d\\udc2c dolphin\
-
-\f0 \uc0\u55357 \u56365
-\f1 \\ud83d\\udc2d mouse face\
-
-\f0 \uc0\u55357 \u56366
-\f1 \\ud83d\\udc2e cow face\
-
-\f0 \uc0\u55357 \u56367
-\f1 \\ud83d\\udc2f tiger face\
-
-\f0 \uc0\u55357 \u56368
-\f1 \\ud83d\\udc30 rabbit face\
-
-\f0 \uc0\u55357 \u56369
-\f1 \\ud83d\\udc31 cat face\
-
-\f0 \uc0\u55357 \u56370
-\f1 \\ud83d\\udc32 dragon face\
-
-\f0 \uc0\u55357 \u56371
-\f1 \\ud83d\\udc33 spouting whale\
-
-\f0 \uc0\u55357 \u56372
-\f1 \\ud83d\\udc34 horse face\
-
-\f0 \uc0\u55357 \u56373
-\f1 \\ud83d\\udc35 monkey face\
-
-\f0 \uc0\u55357 \u56374
-\f1 \\ud83d\\udc36 dog face\
-
-\f0 \uc0\u55357 \u56375
-\f1 \\ud83d\\udc37 pig face\
-
-\f0 \uc0\u55357 \u56376
-\f1 \\ud83d\\udc38 frog face\
-
-\f0 \uc0\u55357 \u56377
-\f1 \\ud83d\\udc39 hamster face\
-
-\f0 \uc0\u55357 \u56378
-\f1 \\ud83d\\udc3a wolf face\
-
-\f0 \uc0\u55357 \u56379
-\f1 \\ud83d\\udc3b bear face\
-
-\f0 \uc0\u55357 \u56380
-\f1 \\ud83d\\udc3c panda face\
-
-\f0 \uc0\u55357 \u56381
-\f1 \\ud83d\\udc3d pig nose\
-
-\f0 \uc0\u55357 \u56382
-\f1 \\ud83d\\udc3e paw prints\
-
-\f0 \uc0\u55357 \u56384
-\f1 \\ud83d\\udc40 eyes\
-
-\f0 \uc0\u55357 \u56386
-\f1 \\ud83d\\udc42 ear\
-
-\f0 \uc0\u55357 \u56387
-\f1 \\ud83d\\udc43 nose\
-
-\f0 \uc0\u55357 \u56388
-\f1 \\ud83d\\udc44 mouth\
-
-\f0 \uc0\u55357 \u56389
-\f1 \\ud83d\\udc45 tongue\
-
-\f0 \uc0\u55357 \u56390
-\f1 \\ud83d\\udc46 white up pointing backhand index\
-
-\f0 \uc0\u55357 \u56391
-\f1 \\ud83d\\udc47 white down pointing backhand index\
-
-\f0 \uc0\u55357 \u56392
-\f1 \\ud83d\\udc48 white left pointing backhand index\
-
-\f0 \uc0\u55357 \u56393
-\f1 \\ud83d\\udc49 white right pointing backhand index\
-
-\f0 \uc0\u55357 \u56394
-\f1 \\ud83d\\udc4a fisted hand sign\
-
-\f0 \uc0\u55357 \u56395
-\f1 \\ud83d\\udc4b waving hand sign\
-
-\f0 \uc0\u55357 \u56396
-\f1 \\ud83d\\udc4c ok hand sign\
-
-\f0 \uc0\u55357 \u56397
-\f1 \\ud83d\\udc4d thumbs up sign\
-
-\f0 \uc0\u55357 \u56398
-\f1 \\ud83d\\udc4e thumbs down sign\
-
-\f0 \uc0\u55357 \u56399
-\f1 \\ud83d\\udc4f clapping hands sign\
-
-\f0 \uc0\u55357 \u56400
-\f1 \\ud83d\\udc50 open hands sign\
-
-\f0 \uc0\u55357 \u56401
-\f1 \\ud83d\\udc51 crown\
-
-\f0 \uc0\u55357 \u56402
-\f1 \\ud83d\\udc52 womans hat\
-
-\f0 \uc0\u55357 \u56403
-\f1 \\ud83d\\udc53 eyeglasses\
-
-\f0 \uc0\u55357 \u56404
-\f1 \\ud83d\\udc54 necktie\
-
-\f0 \uc0\u55357 \u56405
-\f1 \\ud83d\\udc55 t-shirt\
-
-\f0 \uc0\u55357 \u56406
-\f1 \\ud83d\\udc56 jeans\
-
-\f0 \uc0\u55357 \u56407
-\f1 \\ud83d\\udc57 dress\
-
-\f0 \uc0\u55357 \u56408
-\f1 \\ud83d\\udc58 kimono\
-
-\f0 \uc0\u55357 \u56409
-\f1 \\ud83d\\udc59 bikini\
-
-\f0 \uc0\u55357 \u56410
-\f1 \\ud83d\\udc5a womans clothes\
-
-\f0 \uc0\u55357 \u56411
-\f1 \\ud83d\\udc5b purse\
-
-\f0 \uc0\u55357 \u56412
-\f1 \\ud83d\\udc5c handbag\
-
-\f0 \uc0\u55357 \u56413
-\f1 \\ud83d\\udc5d pouch\
-
-\f0 \uc0\u55357 \u56414
-\f1 \\ud83d\\udc5e mans shoe\
-
-\f0 \uc0\u55357 \u56415
-\f1 \\ud83d\\udc5f athletic shoe\
-
-\f0 \uc0\u55357 \u56416
-\f1 \\ud83d\\udc60 high-heeled shoe\
-
-\f0 \uc0\u55357 \u56417
-\f1 \\ud83d\\udc61 womans sandal\
-
-\f0 \uc0\u55357 \u56418
-\f1 \\ud83d\\udc62 womans boots\
-
-\f0 \uc0\u55357 \u56419
-\f1 \\ud83d\\udc63 footprints\
-
-\f0 \uc0\u55357 \u56420
-\f1 \\ud83d\\udc64 bust in silhouette\
-
-\f0 \uc0\u55357 \u56422
-\f1 \\ud83d\\udc66 boy\
-
-\f0 \uc0\u55357 \u56423
-\f1 \\ud83d\\udc67 girl\
-
-\f0 \uc0\u55357 \u56424
-\f1 \\ud83d\\udc68 man\
-
-\f0 \uc0\u55357 \u56425
-\f1 \\ud83d\\udc69 woman\
-
-\f0 \uc0\u55357 \u56426
-\f1 \\ud83d\\udc6a family\
-
-\f0 \uc0\u55357 \u56427
-\f1 \\ud83d\\udc6b man and woman holding hands\
-
-\f0 \uc0\u55357 \u56430
-\f1 \\ud83d\\udc6e police officer\
-
-\f0 \uc0\u55357 \u56431
-\f1 \\ud83d\\udc6f woman with bunny ears\
-
-\f0 \uc0\u55357 \u56432
-\f1 \\ud83d\\udc70 bride with veil\
-
-\f0 \uc0\u55357 \u56433
-\f1 \\ud83d\\udc71 person with blond hair\
-
-\f0 \uc0\u55357 \u56434
-\f1 \\ud83d\\udc72 man with gua pi mao\
-
-\f0 \uc0\u55357 \u56435
-\f1 \\ud83d\\udc73 man with turban\
-
-\f0 \uc0\u55357 \u56436
-\f1 \\ud83d\\udc74 older man\
-
-\f0 \uc0\u55357 \u56437
-\f1 \\ud83d\\udc75 older woman\
-
-\f0 \uc0\u55357 \u56438
-\f1 \\ud83d\\udc76 baby\
-
-\f0 \uc0\u55357 \u56439
-\f1 \\ud83d\\udc77 construction worker\
-
-\f0 \uc0\u55357 \u56440
-\f1 \\ud83d\\udc78 princess\
-
-\f0 \uc0\u55357 \u56441
-\f1 \\ud83d\\udc79 japanese ogre\
-
-\f0 \uc0\u55357 \u56442
-\f1 \\ud83d\\udc7a japanese goblin\
-
-\f0 \uc0\u55357 \u56443
-\f1 \\ud83d\\udc7b ghost\
-
-\f0 \uc0\u55357 \u56444
-\f1 \\ud83d\\udc7c baby angel\
-
-\f0 \uc0\u55357 \u56445
-\f1 \\ud83d\\udc7d extraterrestrial alien\
-
-\f0 \uc0\u55357 \u56446
-\f1 \\ud83d\\udc7e alien monster\
-
-\f0 \uc0\u55357 \u56447
-\f1 \\ud83d\\udc7f imp\
-
-\f0 \uc0\u55357 \u56448
-\f1 \\ud83d\\udc80 skull\
-
-\f0 \uc0\u55357 \u56449
-\f1 \\ud83d\\udc81 information desk person\
-
-\f0 \uc0\u55357 \u56450
-\f1 \\ud83d\\udc82 guardsman\
-
-\f0 \uc0\u55357 \u56451
-\f1 \\ud83d\\udc83 dancer\
-
-\f0 \uc0\u55357 \u56452
-\f1 \\ud83d\\udc84 lipstick\
-
-\f0 \uc0\u55357 \u56453
-\f1 \\ud83d\\udc85 nail polish\
-
-\f0 \uc0\u55357 \u56454
-\f1 \\ud83d\\udc86 face massage\
-
-\f0 \uc0\u55357 \u56455
-\f1 \\ud83d\\udc87 haircut\
-
-\f0 \uc0\u55357 \u56456
-\f1 \\ud83d\\udc88 barber pole\
-
-\f0 \uc0\u55357 \u56457
-\f1 \\ud83d\\udc89 syringe\
-
-\f0 \uc0\u55357 \u56458
-\f1 \\ud83d\\udc8a pill\
-
-\f0 \uc0\u55357 \u56459
-\f1 \\ud83d\\udc8b kiss mark\
-
-\f0 \uc0\u55357 \u56460
-\f1 \\ud83d\\udc8c love letter\
-
-\f0 \uc0\u55357 \u56461
-\f1 \\ud83d\\udc8d ring\
-
-\f0 \uc0\u55357 \u56462
-\f1 \\ud83d\\udc8e gem stone\
-
-\f0 \uc0\u55357 \u56463
-\f1 \\ud83d\\udc8f kiss\
-
-\f0 \uc0\u55357 \u56464
-\f1 \\ud83d\\udc90 bouquet\
-
-\f0 \uc0\u55357 \u56465
-\f1 \\ud83d\\udc91 couple with heart\
-
-\f0 \uc0\u55357 \u56466
-\f1 \\ud83d\\udc92 wedding\
-
-\f0 \uc0\u55357 \u56467
-\f1 \\ud83d\\udc93 beating heart\
-
-\f0 \uc0\u55357 \u56468
-\f1 \\ud83d\\udc94 broken heart\
-
-\f0 \uc0\u55357 \u56469
-\f1 \\ud83d\\udc95 two hearts\
-
-\f0 \uc0\u55357 \u56470
-\f1 \\ud83d\\udc96 sparkling heart\
-
-\f0 \uc0\u55357 \u56471
-\f1 \\ud83d\\udc97 growing heart\
-
-\f0 \uc0\u55357 \u56472
-\f1 \\ud83d\\udc98 heart with arrow\
-
-\f0 \uc0\u55357 \u56473
-\f1 \\ud83d\\udc99 blue heart\
-
-\f0 \uc0\u55357 \u56474
-\f1 \\ud83d\\udc9a green heart\
-
-\f0 \uc0\u55357 \u56475
-\f1 \\ud83d\\udc9b yellow heart\
-
-\f0 \uc0\u55357 \u56476
-\f1 \\ud83d\\udc9c purple heart\
-
-\f0 \uc0\u55357 \u56477
-\f1 \\ud83d\\udc9d heart with ribbon\
-
-\f0 \uc0\u55357 \u56478
-\f1 \\ud83d\\udc9e revolving hearts\
-
-\f0 \uc0\u55357 \u56479
-\f1 \\ud83d\\udc9f heart decoration\
-
-\f0 \uc0\u55357 \u56480
-\f1 \\ud83d\\udca0 diamond shape with a dot inside\
-
-\f0 \uc0\u55357 \u56481
-\f1 \\ud83d\\udca1 electric light bulb\
-
-\f0 \uc0\u55357 \u56482
-\f1 \\ud83d\\udca2 anger symbol\
-
-\f0 \uc0\u55357 \u56483
-\f1 \\ud83d\\udca3 bomb\
-
-\f0 \uc0\u55357 \u56484
-\f1 \\ud83d\\udca4 sleeping symbol\
-
-\f0 \uc0\u55357 \u56485
-\f1 \\ud83d\\udca5 collision symbol\
-
-\f0 \uc0\u55357 \u56486
-\f1 \\ud83d\\udca6 splashing sweat symbol\
-
-\f0 \uc0\u55357 \u56487
-\f1 \\ud83d\\udca7 droplet\
-
-\f0 \uc0\u55357 \u56488
-\f1 \\ud83d\\udca8 dash symbol\
-
-\f0 \uc0\u55357 \u56489
-\f1 \\ud83d\\udca9 pile of poo\
-
-\f0 \uc0\u55357 \u56490
-\f1 \\ud83d\\udcaa flexed biceps\
-
-\f0 \uc0\u55357 \u56491
-\f1 \\ud83d\\udcab dizzy symbol\
-
-\f0 \uc0\u55357 \u56492
-\f1 \\ud83d\\udcac speech balloon\
-
-\f0 \uc0\u55357 \u56494
-\f1 \\ud83d\\udcae white flower\
-
-\f0 \uc0\u55357 \u56495
-\f1 \\ud83d\\udcaf hundred points symbol\
-
-\f0 \uc0\u55357 \u56496
-\f1 \\ud83d\\udcb0 money bag\
-
-\f0 \uc0\u55357 \u56497
-\f1 \\ud83d\\udcb1 currency exchange\
-
-\f0 \uc0\u55357 \u56498
-\f1 \\ud83d\\udcb2 heavy dollar sign\
-
-\f0 \uc0\u55357 \u56499
-\f1 \\ud83d\\udcb3 credit card\
-
-\f0 \uc0\u55357 \u56500
-\f1 \\ud83d\\udcb4 banknote with yen sign\
-
-\f0 \uc0\u55357 \u56501
-\f1 \\ud83d\\udcb5 banknote with dollar sign\
-
-\f0 \uc0\u55357 \u56504
-\f1 \\ud83d\\udcb8 money with wings\
-
-\f0 \uc0\u55357 \u56505
-\f1 \\ud83d\\udcb9 chart with upwards trend and yen sign\
-
-\f0 \uc0\u55357 \u56506
-\f1 \\ud83d\\udcba seat\
-
-\f0 \uc0\u55357 \u56507
-\f1 \\ud83d\\udcbb personal computer\
-
-\f0 \uc0\u55357 \u56508
-\f1 \\ud83d\\udcbc briefcase\
-
-\f0 \uc0\u55357 \u56509
-\f1 \\ud83d\\udcbd minidisc\
-
-\f0 \uc0\u55357 \u56510
-\f1 \\ud83d\\udcbe floppy disk\
-
-\f0 \uc0\u55357 \u56511
-\f1 \\ud83d\\udcbf optical disc\
-
-\f0 \uc0\u55357 \u56512
-\f1 \\ud83d\\udcc0 dvd\
-
-\f0 \uc0\u55357 \u56513
-\f1 \\ud83d\\udcc1 file folder\
-
-\f0 \uc0\u55357 \u56514
-\f1 \\ud83d\\udcc2 open file folder\
-
-\f0 \uc0\u55357 \u56515
-\f1 \\ud83d\\udcc3 page with curl\
-
-\f0 \uc0\u55357 \u56516
-\f1 \\ud83d\\udcc4 page facing up\
-
-\f0 \uc0\u55357 \u56517
-\f1 \\ud83d\\udcc5 calendar\
-
-\f0 \uc0\u55357 \u56518
-\f1 \\ud83d\\udcc6 tear-off calendar\
-
-\f0 \uc0\u55357 \u56519
-\f1 \\ud83d\\udcc7 card index\
-
-\f0 \uc0\u55357 \u56520
-\f1 \\ud83d\\udcc8 chart with upwards trend\
-
-\f0 \uc0\u55357 \u56521
-\f1 \\ud83d\\udcc9 chart with downwards trend\
-
-\f0 \uc0\u55357 \u56522
-\f1 \\ud83d\\udcca bar chart\
-
-\f0 \uc0\u55357 \u56523
-\f1 \\ud83d\\udccb clipboard\
-
-\f0 \uc0\u55357 \u56524
-\f1 \\ud83d\\udccc pushpin\
-
-\f0 \uc0\u55357 \u56525
-\f1 \\ud83d\\udccd round pushpin\
-
-\f0 \uc0\u55357 \u56526
-\f1 \\ud83d\\udcce paperclip\
-
-\f0 \uc0\u55357 \u56527
-\f1 \\ud83d\\udccf straight ruler\
-
-\f0 \uc0\u55357 \u56528
-\f1 \\ud83d\\udcd0 triangular ruler\
-
-\f0 \uc0\u55357 \u56529
-\f1 \\ud83d\\udcd1 bookmark tabs\
-
-\f0 \uc0\u55357 \u56530
-\f1 \\ud83d\\udcd2 ledger\
-
-\f0 \uc0\u55357 \u56531
-\f1 \\ud83d\\udcd3 notebook\
-
-\f0 \uc0\u55357 \u56532
-\f1 \\ud83d\\udcd4 notebook with decorative cover\
-
-\f0 \uc0\u55357 \u56533
-\f1 \\ud83d\\udcd5 closed book\
-
-\f0 \uc0\u55357 \u56534
-\f1 \\ud83d\\udcd6 open book\
-
-\f0 \uc0\u55357 \u56535
-\f1 \\ud83d\\udcd7 green book\
-
-\f0 \uc0\u55357 \u56536
-\f1 \\ud83d\\udcd8 blue book\
-
-\f0 \uc0\u55357 \u56537
-\f1 \\ud83d\\udcd9 orange book\
-
-\f0 \uc0\u55357 \u56538
-\f1 \\ud83d\\udcda books\
-
-\f0 \uc0\u55357 \u56539
-\f1 \\ud83d\\udcdb name badge\
-
-\f0 \uc0\u55357 \u56540
-\f1 \\ud83d\\udcdc scroll\
-
-\f0 \uc0\u55357 \u56541
-\f1 \\ud83d\\udcdd memo\
-
-\f0 \uc0\u55357 \u56542
-\f1 \\ud83d\\udcde telephone receiver\
-
-\f0 \uc0\u55357 \u56543
-\f1 \\ud83d\\udcdf pager\
-
-\f0 \uc0\u55357 \u56544
-\f1 \\ud83d\\udce0 fax machine\
-
-\f0 \uc0\u55357 \u56545
-\f1 \\ud83d\\udce1 satellite antenna\
-
-\f0 \uc0\u55357 \u56546
-\f1 \\ud83d\\udce2 public address loudspeaker\
-
-\f0 \uc0\u55357 \u56547
-\f1 \\ud83d\\udce3 cheering megaphone\
-
-\f0 \uc0\u55357 \u56548
-\f1 \\ud83d\\udce4 outbox tray\
-
-\f0 \uc0\u55357 \u56549
-\f1 \\ud83d\\udce5 inbox tray\
-
-\f0 \uc0\u55357 \u56550
-\f1 \\ud83d\\udce6 package\
-
-\f0 \uc0\u55357 \u56551
-\f1 \\ud83d\\udce7 e-mail symbol\
-
-\f0 \uc0\u55357 \u56552
-\f1 \\ud83d\\udce8 incoming envelope\
-
-\f0 \uc0\u55357 \u56553
-\f1 \\ud83d\\udce9 envelope with downwards arrow above\
-
-\f0 \uc0\u55357 \u56554
-\f1 \\ud83d\\udcea closed mailbox with lowered flag\
-
-\f0 \uc0\u55357 \u56555
-\f1 \\ud83d\\udceb closed mailbox with raised flag\
-
-\f0 \uc0\u55357 \u56558
-\f1 \\ud83d\\udcee postbox\
-
-\f0 \uc0\u55357 \u56560
-\f1 \\ud83d\\udcf0 newspaper\
-
-\f0 \uc0\u55357 \u56561
-\f1 \\ud83d\\udcf1 mobile phone\
-
-\f0 \uc0\u55357 \u56562
-\f1 \\ud83d\\udcf2 mobile phone with rightwards arrow at left\
-
-\f0 \uc0\u55357 \u56563
-\f1 \\ud83d\\udcf3 vibration mode\
-
-\f0 \uc0\u55357 \u56564
-\f1 \\ud83d\\udcf4 mobile phone off\
-
-\f0 \uc0\u55357 \u56566
-\f1 \\ud83d\\udcf6 antenna with bars\
-
-\f0 \uc0\u55357 \u56567
-\f1 \\ud83d\\udcf7 camera\
-
-\f0 \uc0\u55357 \u56569
-\f1 \\ud83d\\udcf9 video camera\
-
-\f0 \uc0\u55357 \u56570
-\f1 \\ud83d\\udcfa television\
-
-\f0 \uc0\u55357 \u56571
-\f1 \\ud83d\\udcfb radio\
-
-\f0 \uc0\u55357 \u56572
-\f1 \\ud83d\\udcfc videocassette\
-
-\f0 \uc0\u55357 \u56579
-\f1 \\ud83d\\udd03 clockwise downwards and upwards open circle arrows\
-
-\f0 \uc0\u55357 \u56586
-\f1 \\ud83d\\udd0a speaker with three sound waves\
-
-\f0 \uc0\u55357 \u56587
-\f1 \\ud83d\\udd0b battery\
-
-\f0 \uc0\u55357 \u56588
-\f1 \\ud83d\\udd0c electric plug\
-
-\f0 \uc0\u55357 \u56589
-\f1 \\ud83d\\udd0d left-pointing magnifying glass\
-
-\f0 \uc0\u55357 \u56590
-\f1 \\ud83d\\udd0e right-pointing magnifying glass\
-
-\f0 \uc0\u55357 \u56591
-\f1 \\ud83d\\udd0f lock with ink pen\
-
-\f0 \uc0\u55357 \u56592
-\f1 \\ud83d\\udd10 closed lock with key\
-
-\f0 \uc0\u55357 \u56593
-\f1 \\ud83d\\udd11 key\
-
-\f0 \uc0\u55357 \u56594
-\f1 \\ud83d\\udd12 lock\
-
-\f0 \uc0\u55357 \u56595
-\f1 \\ud83d\\udd13 open lock\
-
-\f0 \uc0\u55357 \u56596
-\f1 \\ud83d\\udd14 bell\
-
-\f0 \uc0\u55357 \u56598
-\f1 \\ud83d\\udd16 bookmark\
-
-\f0 \uc0\u55357 \u56599
-\f1 \\ud83d\\udd17 link symbol\
-
-\f0 \uc0\u55357 \u56600
-\f1 \\ud83d\\udd18 radio button\
-
-\f0 \uc0\u55357 \u56601
-\f1 \\ud83d\\udd19 back with leftwards arrow above\
-
-\f0 \uc0\u55357 \u56602
-\f1 \\ud83d\\udd1a end with leftwards arrow above\
-
-\f0 \uc0\u55357 \u56603
-\f1 \\ud83d\\udd1b on with exclamation mark with left right arrow above\
-
-\f0 \uc0\u55357 \u56604
-\f1 \\ud83d\\udd1c soon with rightwards arrow above\
-
-\f0 \uc0\u55357 \u56605
-\f1 \\ud83d\\udd1d top with upwards arrow above\
-
-\f0 \uc0\u55357 \u56606
-\f1 \\ud83d\\udd1e no one under eighteen symbol\
-
-\f0 \uc0\u55357 \u56607
-\f1 \\ud83d\\udd1f keycap ten\
-
-\f0 \uc0\u55357 \u56608
-\f1 \\ud83d\\udd20 input symbol for latin capital letters\
-
-\f0 \uc0\u55357 \u56609
-\f1 \\ud83d\\udd21 input symbol for latin small letters\
-
-\f0 \uc0\u55357 \u56610
-\f1 \\ud83d\\udd22 input symbol for numbers\
-
-\f0 \uc0\u55357 \u56611
-\f1 \\ud83d\\udd23 input symbol for symbols\
-
-\f0 \uc0\u55357 \u56612
-\f1 \\ud83d\\udd24 input symbol for latin letters\
-
-\f0 \uc0\u55357 \u56613
-\f1 \\ud83d\\udd25 fire\
-
-\f0 \uc0\u55357 \u56614
-\f1 \\ud83d\\udd26 electric torch\
-
-\f0 \uc0\u55357 \u56615
-\f1 \\ud83d\\udd27 wrench\
-
-\f0 \uc0\u55357 \u56616
-\f1 \\ud83d\\udd28 hammer\
-
-\f0 \uc0\u55357 \u56617
-\f1 \\ud83d\\udd29 nut and bolt\
-
-\f0 \uc0\u55357 \u56618
-\f1 \\ud83d\\udd2a hocho\
-
-\f0 \uc0\u55357 \u56619
-\f1 \\ud83d\\udd2b pistol\
-
-\f0 \uc0\u55357 \u56622
-\f1 \\ud83d\\udd2e crystal ball\
-
-\f0 \uc0\u55357 \u56623
-\f1 \\ud83d\\udd2f six pointed star with middle dot\
-
-\f0 \uc0\u55357 \u56624
-\f1 \\ud83d\\udd30 japanese symbol for beginner\
-
-\f0 \uc0\u55357 \u56625
-\f1 \\ud83d\\udd31 trident emblem\
-
-\f0 \uc0\u55357 \u56626
-\f1 \\ud83d\\udd32 black square button\
-
-\f0 \uc0\u55357 \u56627
-\f1 \\ud83d\\udd33 white square button\
-
-\f0 \uc0\u55357 \u56628
-\f1 \\ud83d\\udd34 large red circle\
-
-\f0 \uc0\u55357 \u56629
-\f1 \\ud83d\\udd35 large blue circle\
-
-\f0 \uc0\u55357 \u56630
-\f1 \\ud83d\\udd36 large orange diamond\
-
-\f0 \uc0\u55357 \u56631
-\f1 \\ud83d\\udd37 large blue diamond\
-
-\f0 \uc0\u55357 \u56632
-\f1 \\ud83d\\udd38 small orange diamond\
-
-\f0 \uc0\u55357 \u56633
-\f1 \\ud83d\\udd39 small blue diamond\
-
-\f0 \uc0\u55357 \u56634
-\f1 \\ud83d\\udd3a up-pointing red triangle\
-
-\f0 \uc0\u55357 \u56635
-\f1 \\ud83d\\udd3b down-pointing red triangle\
-
-\f0 \uc0\u55357 \u56636
-\f1 \\ud83d\\udd3c up-pointing small red triangle\
-
-\f0 \uc0\u55357 \u56637
-\f1 \\ud83d\\udd3d down-pointing small red triangle\
-
-\f0 \uc0\u55357 \u56656
-\f1 \\ud83d\\udd50 clock face one oclock\
-
-\f0 \uc0\u55357 \u56657
-\f1 \\ud83d\\udd51 clock face two oclock\
-
-\f0 \uc0\u55357 \u56658
-\f1 \\ud83d\\udd52 clock face three oclock\
-
-\f0 \uc0\u55357 \u56659
-\f1 \\ud83d\\udd53 clock face four oclock\
-
-\f0 \uc0\u55357 \u56660
-\f1 \\ud83d\\udd54 clock face five oclock\
-
-\f0 \uc0\u55357 \u56661
-\f1 \\ud83d\\udd55 clock face six oclock\
-
-\f0 \uc0\u55357 \u56662
-\f1 \\ud83d\\udd56 clock face seven oclock\
-
-\f0 \uc0\u55357 \u56663
-\f1 \\ud83d\\udd57 clock face eight oclock\
-
-\f0 \uc0\u55357 \u56664
-\f1 \\ud83d\\udd58 clock face nine oclock\
-
-\f0 \uc0\u55357 \u56665
-\f1 \\ud83d\\udd59 clock face ten oclock\
-
-\f0 \uc0\u55357 \u56666
-\f1 \\ud83d\\udd5a clock face eleven oclock\
-
-\f0 \uc0\u55357 \u56667
-\f1 \\ud83d\\udd5b clock face twelve oclock\
-
-\f0 \uc0\u55357 \u56827
-\f1 \\ud83d\\uddfb mount fuji\
-
-\f0 \uc0\u55357 \u56828
-\f1 \\ud83d\\uddfc tokyo tower\
-
-\f0 \uc0\u55357 \u56829
-\f1 \\ud83d\\uddfd statue of liberty\
-
-\f0 \uc0\u55357 \u56830
-\f1 \\ud83d\\uddfe silhouette of japan\
-
-\f0 \uc0\u55357 \u56831
-\f1 \\ud83d\\uddff moyai\
-
-\f0 \uc0\u55357 \u56832
-\f1 \\ud83d\\ude00 grinning face\
-
-\f0 \uc0\u55357 \u56839
-\f1 \\ud83d\\ude07 smiling face with halo\
-
-\f0 \uc0\u55357 \u56840
-\f1 \\ud83d\\ude08 smiling face with horns\
-
-\f0 \uc0\u55357 \u56846
-\f1 \\ud83d\\ude0e smiling face with sunglasses\
-
-\f0 \uc0\u55357 \u56848
-\f1 \\ud83d\\ude10 neutral face\
-
-\f0 \uc0\u55357 \u56849
-\f1 \\ud83d\\ude11 expressionless face\
-
-\f0 \uc0\u55357 \u56853
-\f1 \\ud83d\\ude15 confused face\
-
-\f0 \uc0\u55357 \u56855
-\f1 \\ud83d\\ude17 kissing face\
-
-\f0 \uc0\u55357 \u56857
-\f1 \\ud83d\\ude19 kissing face with smiling eyes\
-
-\f0 \uc0\u55357 \u56859
-\f1 \\ud83d\\ude1b face with stuck-out tongue\
-
-\f0 \uc0\u55357 \u56863
-\f1 \\ud83d\\ude1f worried face\
-
-\f0 \uc0\u55357 \u56870
-\f1 \\ud83d\\ude26 frowning face with open mouth\
-
-\f0 \uc0\u55357 \u56871
-\f1 \\ud83d\\ude27 anguished face\
-
-\f0 \uc0\u55357 \u56876
-\f1 \\ud83d\\ude2c grimacing face\
-
-\f0 \uc0\u55357 \u56878
-\f1 \\ud83d\\ude2e face with open mouth\
-
-\f0 \uc0\u55357 \u56879
-\f1 \\ud83d\\ude2f hushed face\
-
-\f0 \uc0\u55357 \u56884
-\f1 \\ud83d\\ude34 sleeping face\
-
-\f0 \uc0\u55357 \u56886
-\f1 \\ud83d\\ude36 face without mouth\
-
-\f0 \uc0\u55357 \u56961
-\f1 \\ud83d\\ude81 helicopter\
-
-\f0 \uc0\u55357 \u56962
-\f1 \\ud83d\\ude82 steam locomotive\
-
-\f0 \uc0\u55357 \u56966
-\f1 \\ud83d\\ude86 train\
-
-\f0 \uc0\u55357 \u56968
-\f1 \\ud83d\\ude88 light rail\
-
-\f0 \uc0\u55357 \u56970
-\f1 \\ud83d\\ude8a tram\
-
-\f0 \uc0\u55357 \u56973
-\f1 \\ud83d\\ude8d oncoming bus\
-
-\f0 \uc0\u55357 \u56974
-\f1 \\ud83d\\ude8e trolleybus\
-
-\f0 \uc0\u55357 \u56976
-\f1 \\ud83d\\ude90 minibus\
-
-\f0 \uc0\u55357 \u56980
-\f1 \\ud83d\\ude94 oncoming police car\
-
-\f0 \uc0\u55357 \u56982
-\f1 \\ud83d\\ude96 oncoming taxi\
-
-\f0 \uc0\u55357 \u56984
-\f1 \\ud83d\\ude98 oncoming automobile\
-
-\f0 \uc0\u55357 \u56987
-\f1 \\ud83d\\ude9b articulated lorry\
-
-\f0 \uc0\u55357 \u56988
-\f1 \\ud83d\\ude9c tractor\
-
-\f0 \uc0\u55357 \u56989
-\f1 \\ud83d\\ude9d monorail\
-
-\f0 \uc0\u55357 \u56990
-\f1 \\ud83d\\ude9e mountain railway\
-
-\f0 \uc0\u55357 \u56991
-\f1 \\ud83d\\ude9f suspension railway\
-
-\f0 \uc0\u55357 \u56992
-\f1 \\ud83d\\udea0 mountain cableway\
-
-\f0 \uc0\u55357 \u56993
-\f1 \\ud83d\\udea1 aerial tramway\
-
-\f0 \uc0\u55357 \u56995
-\f1 \\ud83d\\udea3 rowboat\
-
-\f0 \uc0\u55357 \u56998
-\f1 \\ud83d\\udea6 vertical traffic light\
-
-\f0 \uc0\u55357 \u57006
-\f1 \\ud83d\\udeae put litter in its place symbol\
-
-\f0 \uc0\u55357 \u57007
-\f1 \\ud83d\\udeaf do not litter symbol\
-
-\f0 \uc0\u55357 \u57008
-\f1 \\ud83d\\udeb0 potable water symbol\
-
-\f0 \uc0\u55357 \u57009
-\f1 \\ud83d\\udeb1 non-potable water symbol\
-
-\f0 \uc0\u55357 \u57011
-\f1 \\ud83d\\udeb3 no bicycles\
-
-\f0 \uc0\u55357 \u57012
-\f1 \\ud83d\\udeb4 bicyclist\
-
-\f0 \uc0\u55357 \u57013
-\f1 \\ud83d\\udeb5 mountain bicyclist\
-
-\f0 \uc0\u55357 \u57015
-\f1 \\ud83d\\udeb7 no pedestrians\
-
-\f0 \uc0\u55357 \u57016
-\f1 \\ud83d\\udeb8 children crossing\
-
-\f0 \uc0\u55357 \u57023
-\f1 \\ud83d\\udebf shower\
-
-\f0 \uc0\u55357 \u57025
-\f1 \\ud83d\\udec1 bathtub\
-
-\f0 \uc0\u55357 \u57026
-\f1 \\ud83d\\udec2 passport control\
-
-\f0 \uc0\u55357 \u57027
-\f1 \\ud83d\\udec3 customs\
-
-\f0 \uc0\u55357 \u57028
-\f1 \\ud83d\\udec4 baggage claim\
-
-\f0 \uc0\u55357 \u57029
-\f1 \\ud83d\\udec5 left luggage\
-
-\f0 \uc0\u55356 \u57101
-\f1 \\ud83c\\udf0d earth globe europe-africa\
-
-\f0 \uc0\u55356 \u57102
-\f1 \\ud83c\\udf0e earth globe americas\
-
-\f0 \uc0\u55356 \u57104
-\f1 \\ud83c\\udf10 globe with meridians\
-
-\f0 \uc0\u55356 \u57106
-\f1 \\ud83c\\udf12 waxing crescent moon symbol\
-
-\f0 \uc0\u55356 \u57110
-\f1 \\ud83c\\udf16 waning gibbous moon symbol\
-
-\f0 \uc0\u55356 \u57111
-\f1 \\ud83c\\udf17 last quarter moon symbol\
-
-\f0 \uc0\u55356 \u57112
-\f1 \\ud83c\\udf18 waning crescent moon symbol\
-
-\f0 \uc0\u55356 \u57114
-\f1 \\ud83c\\udf1a new moon with face\
-
-\f0 \uc0\u55356 \u57116
-\f1 \\ud83c\\udf1c last quarter moon with face\
-
-\f0 \uc0\u55356 \u57117
-\f1 \\ud83c\\udf1d full moon with face\
-
-\f0 \uc0\u55356 \u57118
-\f1 \\ud83c\\udf1e sun with face\
-
-\f0 \uc0\u55356 \u57138
-\f1 \\ud83c\\udf32 evergreen tree\
-
-\f0 \uc0\u55356 \u57139
-\f1 \\ud83c\\udf33 deciduous tree\
-
-\f0 \uc0\u55356 \u57163
-\f1 \\ud83c\\udf4b lemon\
-
-\f0 \uc0\u55356 \u57168
-\f1 \\ud83c\\udf50 pear\
-
-\f0 \uc0\u55356 \u57212
-\f1 \\ud83c\\udf7c baby bottle\
-
-\f0 \uc0\u55356 \u57287
-\f1 \\ud83c\\udfc7 horse racing\
-
-\f0 \uc0\u55356 \u57289
-\f1 \\ud83c\\udfc9 rugby football\
-
-\f0 \uc0\u55356 \u57316
-\f1 \\ud83c\\udfe4 european post office\
-
-\f0 \uc0\u55357 \u56320
-\f1 \\ud83d\\udc00 rat\
-
-\f0 \uc0\u55357 \u56321
-\f1 \\ud83d\\udc01 mouse\
-
-\f0 \uc0\u55357 \u56322
-\f1 \\ud83d\\udc02 ox\
-
-\f0 \uc0\u55357 \u56323
-\f1 \\ud83d\\udc03 water buffalo\
-
-\f0 \uc0\u55357 \u56324
-\f1 \\ud83d\\udc04 cow\
-
-\f0 \uc0\u55357 \u56325
-\f1 \\ud83d\\udc05 tiger\
-
-\f0 \uc0\u55357 \u56326
-\f1 \\ud83d\\udc06 leopard\
-
-\f0 \uc0\u55357 \u56327
-\f1 \\ud83d\\udc07 rabbit\
-
-\f0 \uc0\u55357 \u56328
-\f1 \\ud83d\\udc08 cat\
-
-\f0 \uc0\u55357 \u56329
-\f1 \\ud83d\\udc09 dragon\
-
-\f0 \uc0\u55357 \u56330
-\f1 \\ud83d\\udc0a crocodile\
-
-\f0 \uc0\u55357 \u56331
-\f1 \\ud83d\\udc0b whale\
-
-\f0 \uc0\u55357 \u56335
-\f1 \\ud83d\\udc0f ram\
-
-\f0 \uc0\u55357 \u56336
-\f1 \\ud83d\\udc10 goat\
-
-\f0 \uc0\u55357 \u56339
-\f1 \\ud83d\\udc13 rooster\
-
-\f0 \uc0\u55357 \u56341
-\f1 \\ud83d\\udc15 dog\
-
-\f0 \uc0\u55357 \u56342
-\f1 \\ud83d\\udc16 pig\
-
-\f0 \uc0\u55357 \u56362
-\f1 \\ud83d\\udc2a dromedary camel\
-
-\f0 \uc0\u55357 \u56421
-\f1 \\ud83d\\udc65 busts in silhouette\
-
-\f0 \uc0\u55357 \u56428
-\f1 \\ud83d\\udc6c two men holding hands\
-
-\f0 \uc0\u55357 \u56429
-\f1 \\ud83d\\udc6d two women holding hands\
-
-\f0 \uc0\u55357 \u56493
-\f1 \\ud83d\\udcad thought balloon\
-
-\f0 \uc0\u55357 \u56502
-\f1 \\ud83d\\udcb6 banknote with euro sign\
-
-\f0 \uc0\u55357 \u56503
-\f1 \\ud83d\\udcb7 banknote with pound sign\
-
-\f0 \uc0\u55357 \u56556
-\f1 \\ud83d\\udcec open mailbox with raised flag\
-
-\f0 \uc0\u55357 \u56557
-\f1 \\ud83d\\udced open mailbox with lowered flag\
-
-\f0 \uc0\u55357 \u56559
-\f1 \\ud83d\\udcef postal horn\
-
-\f0 \uc0\u55357 \u56565
-\f1 \\ud83d\\udcf5 no mobile phones\
-
-\f0 \uc0\u55357 \u56576
-\f1 \\ud83d\\udd00 twisted rightwards arrows\
-
-\f0 \uc0\u55357 \u56577
-\f1 \\ud83d\\udd01 clockwise rightwards and leftwards open circle arrows\
-
-\f0 \uc0\u55357 \u56578
-\f1 \\ud83d\\udd02 clockwise rightwards and leftwards open circle arrows with circled one overlay\
-
-\f0 \uc0\u55357 \u56580
-\f1 \\ud83d\\udd04 anticlockwise downwards and upwards open circle arrows\
-
-\f0 \uc0\u55357 \u56581
-\f1 \\ud83d\\udd05 low brightness symbol\
-
-\f0 \uc0\u55357 \u56582
-\f1 \\ud83d\\udd06 high brightness symbol\
-
-\f0 \uc0\u55357 \u56583
-\f1 \\ud83d\\udd07 speaker with cancellation stroke\
-
-\f0 \uc0\u55357 \u56585
-\f1 \\ud83d\\udd09 speaker with one sound wave\
-
-\f0 \uc0\u55357 \u56597
-\f1 \\ud83d\\udd15 bell with cancellation stroke\
-
-\f0 \uc0\u55357 \u56620
-\f1 \\ud83d\\udd2c microscope\
-
-\f0 \uc0\u55357 \u56621
-\f1 \\ud83d\\udd2d telescope\
-
-\f0 \uc0\u55357 \u56668
-\f1 \\ud83d\\udd5c clock face one-thirty\
-
-\f0 \uc0\u55357 \u56669
-\f1 \\ud83d\\udd5d clock face two-thirty\
-
-\f0 \uc0\u55357 \u56670
-\f1 \\ud83d\\udd5e clock face three-thirty\
-
-\f0 \uc0\u55357 \u56671
-\f1 \\ud83d\\udd5f clock face four-thirty\
-
-\f0 \uc0\u55357 \u56672
-\f1 \\ud83d\\udd60 clock face five-thirty\
-
-\f0 \uc0\u55357 \u56673
-\f1 \\ud83d\\udd61 clock face six-thirty\
-
-\f0 \uc0\u55357 \u56674
-\f1 \\ud83d\\udd62 clock face seven-thirty\
-
-\f0 \uc0\u55357 \u56675
-\f1 \\ud83d\\udd63 clock face eight-thirty\
-
-\f0 \uc0\u55357 \u56676
-\f1 \\ud83d\\udd64 clock face nine-thirty\
-
-\f0 \uc0\u55357 \u56677
-\f1 \\ud83d\\udd65 clock face ten-thirty\
-
-\f0 \uc0\u55357 \u56678
-\f1 \\ud83d\\udd66 clock face eleven-thirty\
-
-\f0 \uc0\u55357 \u56679
-\f1 \\ud83d\\udd67 clock face twelve-thirty}
\ No newline at end of file
From 512264119d8d695fe8e2844520f06ec7f525dd90 Mon Sep 17 00:00:00 2001
From: Samuel H Leclerc
Date: Sun, 15 Sep 2019 15:27:38 +0000
Subject: [PATCH 120/359] Fixed typo in error message displayed
---
src/js/git/commands.js | 8 ++++----
1 file changed, 4 insertions(+), 4 deletions(-)
diff --git a/src/js/git/commands.js b/src/js/git/commands.js
index 9861f763..008fc48b 100644
--- a/src/js/git/commands.js
+++ b/src/js/git/commands.js
@@ -83,7 +83,7 @@ var assertOriginSpecified = function(generalArgs) {
if (generalArgs[0] !== 'origin') {
throw new GitError({
msg: intl.todo(
- generalArgs[0] + ' is not a remote in your repository! try adding origin that argument'
+ generalArgs[0] + ' is not a remote in your repository! try adding origin to that argument'
)
});
}
@@ -823,14 +823,14 @@ var commandConfig = {
var tagToRemove;
assertIsRef(engine, tagID);
-
+
command.oneArgImpliedHead(tagID);
engine.tagCollection.each(function(tag) {
if(tag.get('id') == tagID){
tagToRemove = tag;
}
}, true);
-
+
if(tagToRemove == undefined){
throw new GitError({
msg: intl.todo(
@@ -841,7 +841,7 @@ var commandConfig = {
engine.tagCollection.remove(tagToRemove);
delete engine.refs[tagID];
-
+
engine.gitVisuals.refreshTree();
return;
}
From 9e4e79323a16745430d26ceff3c96cf012b3da69 Mon Sep 17 00:00:00 2001
From: unknown
Date: Mon, 16 Sep 2019 21:35:18 +0200
Subject: [PATCH 121/359] Change upper value in 'git-error-args-few' string to
lower
---
src/js/intl/strings.js | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/src/js/intl/strings.js b/src/js/intl/strings.js
index b7c2c416..2b27a9ca 100755
--- a/src/js/intl/strings.js
+++ b/src/js/intl/strings.js
@@ -592,7 +592,7 @@ exports.strings = {
'es_ES': 'Espero al menos {lower} parámetros para {what}.',
'pt_BR': 'Espero pelo menos {lower} parâmetros para {what}',
'gl' : 'Agardo polo menos {lower} parámetros para {what}',
- 'fr_FR': 'J\'attends au moins {upper} argument(s) pour {what}',
+ 'fr_FR': 'J\'attends au moins {lower} argument(s) pour {what}',
'ru_RU': 'Ожидается как минимум {lower} аргументов для {what}',
'uk': 'Я очікую як мінімум {lower} аргумент(ів) для {what}',
'ko': '{what}을 위해 최소 {lower}개의 인자를 받습니다.'
From ec1690fdcdaee34696ad645ab6f2f3ed1fec42ab Mon Sep 17 00:00:00 2001
From: Daniel Zabari
Date: Thu, 19 Sep 2019 14:10:35 -0400
Subject: [PATCH 122/359] Update index.js
this is a HUGE missed opportunity for a pun, and I think the pun fits better with the tone of the site generally
---
src/levels/index.js | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/src/levels/index.js b/src/levels/index.js
index 957193c7..922bfabf 100644
--- a/src/levels/index.js
+++ b/src/levels/index.js
@@ -190,7 +190,7 @@ var sequenceInfo = exports.sequenceInfo = {
'uk' : 'Переміщуємо роботу туди-сюди'
},
about: {
- 'en_US': 'Get comfortable with modifying the source tree',
+ 'en_US': 'Git comfortable with modifying the source tree',
'de_DE': 'Gewöhn dich daran, den Git-Baum zu verändern',
'fr_FR': 'Soyez à l\'aise pour modifier l\'arbre Git',
'es_AR': 'Ponete cómodo con modificar el directorio fuente',
From 25bc2350d2f951053c39e2752c0c883db35f71b4 Mon Sep 17 00:00:00 2001
From: Daniel Zabari
Date: Fri, 20 Sep 2019 17:30:09 -0400
Subject: [PATCH 123/359] Update index.js
made it clear that this is not a typo :P
---
src/levels/index.js | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/src/levels/index.js b/src/levels/index.js
index 922bfabf..5d343e2a 100644
--- a/src/levels/index.js
+++ b/src/levels/index.js
@@ -190,7 +190,7 @@ var sequenceInfo = exports.sequenceInfo = {
'uk' : 'Переміщуємо роботу туди-сюди'
},
about: {
- 'en_US': 'Git comfortable with modifying the source tree',
+ 'en_US': '"Git" comfortable with modifying the source tree :P',
'de_DE': 'Gewöhn dich daran, den Git-Baum zu verändern',
'fr_FR': 'Soyez à l\'aise pour modifier l\'arbre Git',
'es_AR': 'Ponete cómodo con modificar el directorio fuente',
From f245c97a1b10cf5a87663e71c3edee3b4da308c7 Mon Sep 17 00:00:00 2001
From: hongarc
Date: Sun, 22 Sep 2019 09:19:15 +0700
Subject: [PATCH 124/359] Update contributor
- top 30 contributor
---
README.md | 4 ++--
1 file changed, 2 insertions(+), 2 deletions(-)
diff --git a/README.md b/README.md
index d70e865f..efb33dc3 100644
--- a/README.md
+++ b/README.md
@@ -115,12 +115,14 @@ Alternatively, you can also build and run the app in a pre-configured online wor
+
+
@@ -131,8 +133,6 @@ Alternatively, you can also build and run the app in a pre-configured online wor
-
-
[//]: contributor-faces
From fa5638f3b89f3f73cffc82232d926c445d6b5cb8 Mon Sep 17 00:00:00 2001
From: Peter Cottle
Date: Wed, 25 Sep 2019 10:40:43 +0800
Subject: [PATCH 125/359] Resolves #608 -- enforce word boundary
---
src/js/sandbox/commands.js | 4 ++--
1 file changed, 2 insertions(+), 2 deletions(-)
diff --git a/src/js/sandbox/commands.js b/src/js/sandbox/commands.js
index 7f4e359d..1a4c1365 100644
--- a/src/js/sandbox/commands.js
+++ b/src/js/sandbox/commands.js
@@ -15,12 +15,12 @@ var Warning = Errors.Warning;
var CommandResult = Errors.CommandResult;
var instantCommands = [
- [/^ls/, function() {
+ [/^ls\b/, function() {
throw new CommandResult({
msg: intl.str('ls-command')
});
}],
- [/^cd/, function() {
+ [/^cd\b/, function() {
throw new CommandResult({
msg: intl.str('cd-command')
});
From d8ea1dbb5c50b0143e7044e7be5b04ef1d848491 Mon Sep 17 00:00:00 2001
From: hongarc
Date: Tue, 24 Sep 2019 23:43:18 +0700
Subject: [PATCH 126/359] fix: get `ls` and `cd` with right way
---
src/js/sandbox/commands.js | 4 ++--
1 file changed, 2 insertions(+), 2 deletions(-)
diff --git a/src/js/sandbox/commands.js b/src/js/sandbox/commands.js
index 7f4e359d..953d4084 100644
--- a/src/js/sandbox/commands.js
+++ b/src/js/sandbox/commands.js
@@ -15,12 +15,12 @@ var Warning = Errors.Warning;
var CommandResult = Errors.CommandResult;
var instantCommands = [
- [/^ls/, function() {
+ [/^ls( |$)/, function() {
throw new CommandResult({
msg: intl.str('ls-command')
});
}],
- [/^cd/, function() {
+ [/^cd( |$)/, function() {
throw new CommandResult({
msg: intl.str('cd-command')
});
From ca846c9d0c32e1b55a9ad625ce3a950d33afbe97 Mon Sep 17 00:00:00 2001
From: Philip Enchin
Date: Thu, 3 Oct 2019 12:47:56 -0400
Subject: [PATCH 127/359] Disable "git fakeTeamwork" in push level (remote6)
---
src/levels/remote/push.js | 3 +++
1 file changed, 3 insertions(+)
diff --git a/src/levels/remote/push.js b/src/levels/remote/push.js
index 9377579e..92a3f681 100644
--- a/src/levels/remote/push.js
+++ b/src/levels/remote/push.js
@@ -1,4 +1,7 @@
exports.level = {
+ "disabledMap": {
+ "git fakeTeamwork": true,
+ },
"goalTreeString": "{\"branches\":{\"master\":{\"target\":\"C3\",\"id\":\"master\",\"remoteTrackingBranchID\":\"o/master\",\"localBranchesThatTrackThis\":null},\"o/master\":{\"target\":\"C3\",\"id\":\"o/master\",\"remoteTrackingBranchID\":null,\"localBranchesThatTrackThis\":[\"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\"},\"originTree\":{\"branches\":{\"master\":{\"target\":\"C3\",\"id\":\"master\",\"remoteTrackingBranchID\":null,\"localBranchesThatTrackThis\":null}},\"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;git push",
"startTree": "{\"branches\":{\"master\":{\"target\":\"C1\",\"id\":\"master\",\"remoteTrackingBranchID\":\"o/master\"},\"o/master\":{\"target\":\"C1\",\"id\":\"o/master\",\"remoteTrackingBranchID\":null}},\"commits\":{\"C0\":{\"parents\":[],\"id\":\"C0\",\"rootCommit\":true},\"C1\":{\"parents\":[\"C0\"],\"id\":\"C1\"}},\"tags\":{},\"HEAD\":{\"target\":\"master\",\"id\":\"HEAD\"},\"originTree\":{\"branches\":{\"master\":{\"target\":\"C1\",\"id\":\"master\",\"remoteTrackingBranchID\":null}},\"commits\":{\"C0\":{\"parents\":[],\"id\":\"C0\",\"rootCommit\":true},\"C1\":{\"parents\":[\"C0\"],\"id\":\"C1\"}},\"tags\":{},\"HEAD\":{\"target\":\"master\",\"id\":\"HEAD\"}}}",
From 2f938ffd50b8dc439b4a8bbe859f9aa55ffea113 Mon Sep 17 00:00:00 2001
From: Philip Enchin
Date: Thu, 3 Oct 2019 14:28:30 -0400
Subject: [PATCH 128/359] Disable "git branch" and "git checkout" in source
nothing level (remoteAdvanced7)
---
src/levels/remote/sourceNothing.js | 4 ++++
1 file changed, 4 insertions(+)
diff --git a/src/levels/remote/sourceNothing.js b/src/levels/remote/sourceNothing.js
index d94359be..7b7e58c0 100644
--- a/src/levels/remote/sourceNothing.js
+++ b/src/levels/remote/sourceNothing.js
@@ -1,4 +1,8 @@
exports.level = {
+ "disabledMap": {
+ "git branch": true,
+ "git checkout": true
+ },
"goalTreeString": "{\"branches\":{\"master\":{\"target\":\"C1\",\"id\":\"master\",\"remoteTrackingBranchID\":\"o/master\"},\"o/master\":{\"target\":\"C1\",\"id\":\"o/master\",\"remoteTrackingBranchID\":null},\"bar\":{\"target\":\"C1\",\"id\":\"bar\",\"remoteTrackingBranchID\":null}},\"commits\":{\"C0\":{\"parents\":[],\"id\":\"C0\",\"rootCommit\":true},\"C1\":{\"parents\":[\"C0\"],\"id\":\"C1\"}},\"HEAD\":{\"target\":\"master\",\"id\":\"HEAD\"},\"originTree\":{\"branches\":{\"master\":{\"target\":\"C1\",\"id\":\"master\",\"remoteTrackingBranchID\":null}},\"commits\":{\"C0\":{\"parents\":[],\"id\":\"C0\",\"rootCommit\":true},\"C1\":{\"parents\":[\"C0\"],\"id\":\"C1\"}},\"HEAD\":{\"target\":\"master\",\"id\":\"HEAD\"}}}",
"solutionCommand": "git push origin :foo;git fetch origin :bar",
"startTree": "{\"branches\":{\"master\":{\"target\":\"C1\",\"id\":\"master\",\"remoteTrackingBranchID\":\"o/master\"},\"o/master\":{\"target\":\"C1\",\"id\":\"o/master\",\"remoteTrackingBranchID\":null},\"o/foo\":{\"target\":\"C1\",\"id\":\"o/foo\",\"remoteTrackingBranchID\":null}},\"commits\":{\"C0\":{\"parents\":[],\"id\":\"C0\",\"rootCommit\":true},\"C1\":{\"parents\":[\"C0\"],\"id\":\"C1\"}},\"HEAD\":{\"target\":\"master\",\"id\":\"HEAD\"},\"originTree\":{\"branches\":{\"master\":{\"target\":\"C1\",\"id\":\"master\",\"remoteTrackingBranchID\":null},\"foo\":{\"target\":\"C1\",\"id\":\"foo\",\"remoteTrackingBranchID\":null}},\"commits\":{\"C0\":{\"parents\":[],\"id\":\"C0\",\"rootCommit\":true},\"C1\":{\"parents\":[\"C0\"],\"id\":\"C1\"}},\"HEAD\":{\"target\":\"master\",\"id\":\"HEAD\"}}}",
From 8fdcdb544448a772c6641fc22352e67df4ce01c0 Mon Sep 17 00:00:00 2001
From: "Andreas Neumann (e007186)"
Date: Wed, 16 Oct 2019 18:30:36 +0200
Subject: [PATCH 129/359] german text corrected
---
src/levels/remote/pushArgs.js | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/src/levels/remote/pushArgs.js b/src/levels/remote/pushArgs.js
index c7d72ea9..f1810aec 100644
--- a/src/levels/remote/pushArgs.js
+++ b/src/levels/remote/pushArgs.js
@@ -610,7 +610,7 @@ exports.level = {
"type": "ModalAlert",
"options": {
"markdowns": [
- "Ok, in diesem Level lass und sowohl `foo` als auch `master` auf dem Remote aktualisieren. Um's spannender zu machen, ist `git checkout` in diesem Level deaktiviert."
+ "Ok, in diesem Level lass uns sowohl `foo` als auch `master` auf dem Remote aktualisieren. Um's spannender zu machen, ist `git checkout` in diesem Level deaktiviert."
]
}
}
From bd98c4a6b28be713dfdb4c8c9d5f6b4542e13371 Mon Sep 17 00:00:00 2001
From: "Andreas Neumann (e007186)"
Date: Wed, 16 Oct 2019 18:35:57 +0200
Subject: [PATCH 130/359] increase readability of german text
---
src/levels/remote/fetchArgs.js | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/src/levels/remote/fetchArgs.js b/src/levels/remote/fetchArgs.js
index da9882a1..ee0bccd9 100644
--- a/src/levels/remote/fetchArgs.js
+++ b/src/levels/remote/fetchArgs.js
@@ -954,7 +954,7 @@ exports.level = {
"markdowns": [
"Wenn das so ist, was passiert dann wenn ich explizit Quelle und Ziel im Ort angebe?",
"",
- "Wenn du Commits wirklich per `fetch` *direkt* auf einen lokalen Branch holen willst, dann, ja, kannst du das mit einer Ref-Spezifikation erreichen. Das funktioniert nicht mit deinem gerade ausgecheckten Branch, aber davon abgesehen lässt Git es zu.",
+ "Wenn du Commits wirklich per `fetch` *direkt* auf einen lokalen Branch holen willst, dann kannst du das mit einer Ref-Spezifikation erreichen. Das funktioniert nicht mit deinem gerade ausgecheckten Branch, aber davon abgesehen lässt Git es zu.",
"",
"Nur ein Haken -- `` bezeichnet jetzt einen Ort auf dem *entfernten* Server und `` ist ein *lokaler* Ort, wo die Commits hin sollen. Es ist genau umgekehrt wie bei `git push` und das ist logisch, denn wir übertragen die Daten ja auch in die umgekehrte Richtung!",
"",
From e512510e66b6a91ad1ae2880b41f79aa351f1aca Mon Sep 17 00:00:00 2001
From: David Zampino
Date: Tue, 22 Oct 2019 16:59:27 -0500
Subject: [PATCH 131/359] Change where HEAD points to match objective
---
src/levels/rampup/detachedHead.js | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/src/levels/rampup/detachedHead.js b/src/levels/rampup/detachedHead.js
index 498c55bd..14c30287 100644
--- a/src/levels/rampup/detachedHead.js
+++ b/src/levels/rampup/detachedHead.js
@@ -1,7 +1,7 @@
exports.level = {
"goalTreeString": "{\"branches\":{\"master\":{\"target\":\"C2\",\"id\":\"master\"},\"bugFix\":{\"target\":\"C4\",\"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\":[\"C3\"],\"id\":\"C4\"}},\"HEAD\":{\"target\":\"C4\",\"id\":\"HEAD\"}}",
"solutionCommand": "git checkout C4",
- "startTree": "{\"branches\":{\"master\":{\"target\":\"C2\",\"id\":\"master\"},\"bugFix\":{\"target\":\"C4\",\"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\":[\"C3\"],\"id\":\"C4\"}},\"HEAD\":{\"target\":\"master\",\"id\":\"HEAD\"}}",
+ "startTree": "{\"branches\":{\"master\":{\"target\":\"C2\",\"id\":\"master\"},\"bugFix\":{\"target\":\"C4\",\"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\":[\"C3\"],\"id\":\"C4\"}},\"HEAD\":{\"target\":\"bugFix\",\"id\":\"HEAD\"}}",
"name": {
"en_US": "Detach yo' HEAD",
"es_AR": "Desatacheá tu HEAD",
From 1aa75a27bf4e2ecaa6b78f71d389cc92fe173122 Mon Sep 17 00:00:00 2001
From: Peter Cottle
Date: Sun, 3 Nov 2019 21:21:01 -0800
Subject: [PATCH 132/359] Resolves #618 -- remove todo
---
todo.txt | 201 -------------------------------------------------------
1 file changed, 201 deletions(-)
delete mode 100644 todo.txt
diff --git a/todo.txt b/todo.txt
deleted file mode 100644
index d586514b..00000000
--- a/todo.txt
+++ /dev/null
@@ -1,201 +0,0 @@
-Big Things
-~~~~~~~~~~~~~~~~~~~~~~~~~
-[ ] compare settings for a level!!! integrated into builder...
-[ ] casperjs for visuals regression testing? it works with canvas so
- it could be a nice way to move super fast with visuals refactoring
-
-Medium things:
-~~~~~~~~~~~~~~~~~~~~~~~~~~~
-[ ] figure out what to do with instant commands (and parse waterfall and the like)
-[ ] disable git commands on hg levels (and vice versa)
-[ ] capture unexpected exceptions and print
-
-Small things to implement:
-~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
-
-Minor Bugs to fix:
-~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
-
-Big Bugs to fix:
-~~~~~~~~~~~~~~~~~~~~~~~~~~~~
-
-Ideas for cleaning
-~~~~~~~~~~~~~
-
-Done things:
-(I only started this on Dec 17th 2012 to get a better sense of what was done)
-~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
-[x] flip trees upside down from command (look at refresh tree as a way to do this)
-[x] make show solution easier
-[x] make helper bar clickable with goal vis floating
-[x] huge update to level you wrote. that you said is true for
- git fetch and git push (basically) but pull is not the same. basically
- its going to ignore where you are during the fetch
-[x] IDEA!!! just talk about arguments for each command one at a time. build
- concept of place first and then expand on it!
-[x] FIX the level you came up with
-[x] aka fetch + merge,
- just like expected. ill probably still update o/master just for sanity
- master is the source on the remote and HEAD is the source on local
- (place to merge). o/master gets updated regardless
-[x] ok say I have branch banana and its one commit ahead of master. if I git
- pull origin master while checked out on banana, it fetches those commits
- (doesn't update origin/master) and then merges them into banana.
-[x] and then "git pull origin banana:origin/banana" works because it goes into
- the remote branch and then merges the fetch HEAD with current location
-[x] oh boy heres another data point. git fetch banana:banana will actually
- fast-forward banana to what remote has, but not update o/banana. weirdly it
- doesn't let you do this if you are checked out on banana
-[x] furthermore, if banana has commits and its not a FF, it will reject the command. wth??
-[x] test is failing because we create banana when we should only really be creating o/banana
-[x] work on TABBED levels layout
-[x] EASY -- make colors the same between remote branches and their remote counterparts
-[x] fix undo not syncing the remote tracking
-[x] get clone as a before command working in demonstration views (related to test infra as well)
-[x] importTreeNow fails if origin isn't updated
-[x] set checkout -b branch __remoteBranch to track the remote branch
-[x] test coverage for hg!!! (in progress)
-[x] tree pruning
-[x] TONS of hg stuff
-[x] finally work on an upload / download animation
-[x] factor out golf thing too
-[x] factor regexes and instant commands into one module
-[x] big command refactor to get everything in one place
-[x] get demonstration view to show origin / remote -- z index ugliness
-[x] get goal visualization to show origin / remote.... hrm :O
-[x] MASSIVE EFFIN REFACTOR of all command options outside of git engine and into separate module
-[x] facebook page link :D
-[x] tree comparison with origin.... done! not too bad
-[x] green refactor tree compare to have map
-[x] increase test coverage over everything
- - unit and integration, but mostly for git operations
-[x] figure out gh-pages force
-[x] add visuals and text to show compare method
-[x] green refactor tree compare to have map
-[x] fix tests by stubbing out animation factory to resolve promises
-[x] better git clone and fake teamwork anywhere
-[x] git pull animation
-[x] use the graph difference algorithm to then implement git push
-[x] work on git pull --rebase animation, send down the deferred and it should work?
-[x] why is rebase -i broken? don't emulate touch events
-[x] tree compare test coverage
-[x] remote branch it is tracking (points to a remote branch model)
-[x] fix branch -a and branch -r to: show remote branches or all branches
-[x] fix branch -f to not allow moving remote branches?
-[x] fix checkout to: if you go to __remoteBranch, it just goes to the commit since its read-only.
-[x] is remote (custom getter)
-[x] hash agnotisc comparison with asserts for amends
-[x] level builder intl aware
-[x] rest of views/index translation
-[x] git/index.js translation -- rest of the strings
-[x] next level confirm translation
-[x] fix clickthrough when goal is shown
-[x] hash agnostic comparison
-[x] get automated SHA hash appending in the html source :OOOOO... template? or what?t
-[x] import random level JSON
-[x] export / import tree from JSON
-[x] rebase bug... ugh
-[x] bug with weird tree string:
-[x] optimistic parsing of level and level builder commands, man that was toughwith circular imports
-[x] edit dialog
-[x] level builder dialog builder
-[x] level builder dialog tester
-[x] turn off button clicking for demonstration view :O
-[x] text grabber for commands
-[x] way to close testing view
-[x] allow demonstration view to have git commands beforehand
-[x] demonstration builder progress
-[x] markdowngrabber
-[x] sandbox and level command refresh
-[x] level builder finish
-[x] level builder? :OOO
- * basically just an extension of level (or sandbox), that has commands like
- ```save tree beginning``` or ```save tree goal``` and then a final
- dialog typing area thingy
-[x] vis branch z index reflow bug
-[x] fix terminal input field in general
-[x] warning for window size
-[x] esc on multiview quits absolutely
-[x] cross browser support... firefox only LULZ. should be just css right? WRONG
-[x] keyboard navigation for level selector
-[x] optional multiview on start
-[x] local storage for solved map
-[x] what if they just type "levels" ?
-[x] hookup for when solving happens
-[x] levels dropdown selection?
-[x] git demonstration view -- shouldn't be too bad. LOL WHAT A FUCKING JOKE like 4 hours
-[x] gotoSandbox command
-[x] "next level?" dialog after beating level
-[x] keyboard input for confirm / cancel
-[x] level arbiter (has everything by ID)
-[x] flip branches on the sides!! i wonder how to determine...
-[x] click handlers on goal visualization for the actual canvas elements
-[x] sandbox can launch and takedown levels
-[x] TWO epic bugs squashed:
- * Raphael process.nextTick needed
- * _.debounce on prototype
-[x] window zoom alert thing -- this just needs to be timeouted one more time
-[x] level teardown
-[x] great die for levels
-[x] show which level you are in! with a little thing on the top
-[x] allow command history to clear finished ones
-[x] put in some > into the rules for CSS
-[x] fix bug for multiview, i think its from the die() on everyone
-[x] fixed bug in command queue
-[x] better compare in levels
-[x] show solution
-[x] show goal
-[x] reset for sandbox command
-[x] do an after-paper-initialize type thing so we can insert git shim once
- git engine is done.
-[x] promise-based levels
-[x] fixed that to-do entry with the toggle Z thing. now its much more consistent
-[x] sandbox a real view now
-[x] awesome before and after shims with event baton stealing and passing back
-[x] sip from buffer with post-command hooks. ideally the git engine
- knows nothing about the level being played
-[x] fix tests
-[x] transition to deferreds / promises for command callbacks
-[x] awesome ability to have dialogs and such handle command processing and block
-[x] figure out why multiview baton passing doesn't work...
-[x] multiple things can process!!!
-[x] move command creation outside of the command view so multiple things
- can be responsible for specifying the waterfall associated with a command!
-[x] awesome zoom level polling and sweet event baton stealing :DDDDDDDDDDDDDD
-[x] then refactor keyboard input and UI.listen() to that event system
-[x] make some kind of "single listener" event system... will make keyboard stuff easy
- because then you just steal and release for modals and such
-[x] text input from the commandPromptView must flow down into
- filters. no hacky stuff anymore where it's part of the option parser,
- wtf
-[x] ok fuckit here is the deal. Command model has minimal logic -- it calls
- to a parse waterfall that expands any shortcuts needed, handles any instant
- commands, and then finally will handle the dispatching. I think this will be
- really nice :D
-[x] disabled map for levels
-[x] better click events on branches and commits
-[x] change to returning a promise for multiview
-[x] multiViews with multiple terminals...
-[x] debounce the forward and back methods
-[x] multiview makes all these arrow views which fire events
-[x] markdown parsing yay!!
-[x] check animation for command entry fading nicely wtf
-[x] no more CSS ids in views
-[x] promise-based confirm cancel
-[x] rebase buttons view & styling
-[x] rebase entries styling
-[x] view for anything above the fold (modal view)
-[x] rebase styling (get it better. even cuter -- make it like a command window)
-[x] fix multiple rebases
-[x] z index reflow update
-[x] level finish animation
-[x] refactor visualization
-[x] aliases replace when put into commands
-[x] headless Git for testing (send it commands and expected trees)
-[x] few tests
-[x] Great git test coverage
-[x] gitEngine loads from tree immediately, not the weird thing we have now!
-[x] nice opacity fade in
-[x] clean up require
-[x] promise based callback for interactive rebase WITH FAIL awesome
-
From 3a74fb345d2ebcc5a640a39f16d51cb81b82a0f4 Mon Sep 17 00:00:00 2001
From: edward
Date: Thu, 5 Dec 2019 08:26:36 +0700
Subject: [PATCH 133/359] Add Vietnamese language switcher to helperbar.
---
src/js/react_views/IntlHelperBarView.jsx | 6 ++++++
1 file changed, 6 insertions(+)
diff --git a/src/js/react_views/IntlHelperBarView.jsx b/src/js/react_views/IntlHelperBarView.jsx
index 411019a8..ee7d0917 100644
--- a/src/js/react_views/IntlHelperBarView.jsx
+++ b/src/js/react_views/IntlHelperBarView.jsx
@@ -96,6 +96,12 @@ class IntlHelperBarView extends React.Component{
onClick: function() {
this.fireCommand('locale uk; levels');
}.bind(this)
+ }, {
+ text: 'Tiếng Việt',
+ testID: 'vietnamese',
+ onClick: function() {
+ this.fireCommand('locale vi; levels');
+ }.bind(this)
}, {
text: 'Galego',
testID: 'galician',
From 7ffb80e1ce2b9229e06b64d28bc52f0aac8f2378 Mon Sep 17 00:00:00 2001
From: edward
Date: Thu, 5 Dec 2019 08:27:22 +0700
Subject: [PATCH 134/359] Add translation of index page.
---
src/levels/index.js | 42 ++++++++++++++++++++++++++++--------------
1 file changed, 28 insertions(+), 14 deletions(-)
diff --git a/src/levels/index.js b/src/levels/index.js
index 5d343e2a..6a42de27 100644
--- a/src/levels/index.js
+++ b/src/levels/index.js
@@ -65,7 +65,8 @@ var sequenceInfo = exports.sequenceInfo = {
'zh_TW': '基礎篇',
'ko' : 'git 기본',
'ru_RU': 'Введение',
- 'uk' : 'Вступ'
+ 'uk' : 'Вступ',
+ 'vi' : 'Giới thiệu chuỗi luyện tập'
},
about: {
'en_US': 'A nicely paced introduction to the majority of git commands',
@@ -79,7 +80,8 @@ var sequenceInfo = exports.sequenceInfo = {
'zh_TW': '循序漸進地介紹 git 主要命令',
'ko' : 'git의 주요 명령어를 깔끔하게 알려드립니다',
'ru_RU': 'Хорошо подобранное введение в основные команды git',
- 'uk' : 'Гарно підібране введення в основні команди git'
+ 'uk' : 'Гарно підібране введення в основні команди git',
+ 'vi' : 'Bước làm quen độc đáo tới phần lớn lệnh điều khiển git'
}
},
rampup: {
@@ -95,7 +97,8 @@ var sequenceInfo = exports.sequenceInfo = {
'zh_TW': '進階篇',
'ru_RU': 'Едем дальше',
'uk' : 'Їдемо далі',
- 'ko' : '다음 단계로'
+ 'ko' : '다음 단계로',
+ 'vi' : 'Vượt chướng ngại vật'
},
about: {
'en_US': 'The next serving of 100% git awesomes-ness. Hope you\'re hungry',
@@ -109,7 +112,8 @@ var sequenceInfo = exports.sequenceInfo = {
'zh_TW': '接下來是 git 非常厲害的地方!相信你已經迫不及待了吧!',
'ru_RU': 'Следующая порция абсолютной git-крутотенюшки. Проголодались?',
'uk' : 'Наступна порція абсолютної git-дивини. Сподіваюсь, ви зголодніли',
- 'ko' : 'git은 아주 멋져요. 왜 멋진지 알려드립니다'
+ 'ko' : 'git은 아주 멋져요. 왜 멋진지 알려드립니다',
+ 'vi' : 'Những món tuyệt đỉnh tiếp theo. Hi vọng bạn còn đói.'
}
},
remote: {
@@ -126,7 +130,8 @@ var sequenceInfo = exports.sequenceInfo = {
'zh_TW': 'Push & Pull -- Git Remotes!',
'ru_RU': 'Push & Pull - удалённые репозитории в Git!',
'uk' : 'Push & Pull -- віддалені репозиторії в Git!',
- 'ko' : 'Push & Pull -- Git 원격 저장소!'
+ 'ko' : 'Push & Pull -- Git 원격 저장소!',
+ 'vi' : 'Push & Pull -- Các git remote!'
},
about: {
'en_US': 'Time to share your 1\'s and 0\'s kids; coding just got social',
@@ -140,7 +145,8 @@ var sequenceInfo = exports.sequenceInfo = {
'zh_TW': '是時候分享你的程式碼了',
'ru_RU': 'Настало время поделиться своими единичками и нулями. Время коллективного программирования',
'uk' : 'Настав час поділитися своїми нулями та одиничками; соціальне програмування',
- 'ko' : '내 코드를 공개할 때가 되었습니다. 코드를 공개해봅시다!'
+ 'ko' : '내 코드를 공개할 때가 되었습니다. 코드를 공개해봅시다!',
+ 'vi' : 'Chia sẻ đứa con tinh thần 0 và 1 của bạn; mã tới với cộng đồng'
}
},
remoteAdvanced: {
@@ -157,7 +163,8 @@ var sequenceInfo = exports.sequenceInfo = {
'zh_TW': '關於 origin 和其它 repo,git remote 的進階指令',
'ru_RU': 'Через origin – к звёздам. Продвинутое использование Git Remotes',
'uk' : 'Через origin – до зірок. Прогресивне використання Git Remotes',
- 'ko' : '"origin"그 너머로 -- 고급 Git 원격 저장소'
+ 'ko' : '"origin"그 너머로 -- 고급 Git 원격 저장소',
+ 'vi' : 'Gửi quê hương và các xứ xa -- nâng cao về các git remote'
},
about: {
'en_US': 'And you thought being a benevolent dictator would be fun...',
@@ -171,7 +178,8 @@ var sequenceInfo = exports.sequenceInfo = {
'de_DE': 'Git Remotes für Fortgeschrittene',
'ru_RU': 'Весело было быть всесильным мудрым правителем...',
'uk' : 'А ти думав, що бути всесильним диктатором весело...',
- 'ko' : '자비로운 독재자가 되는게 재밌을 줄 알았겠지만...'
+ 'ko' : '자비로운 독재자가 되는게 재밌을 줄 알았겠지만...',
+ 'vi' : 'Làm một tay độc tài toàn năng bác ái cũng vui lắm...'
}
},
move: {
@@ -187,7 +195,8 @@ var sequenceInfo = exports.sequenceInfo = {
'zh_CN': '移动提交记录',
'zh_TW': '調整提交順序',
'ru_RU': 'Перемещаем труды туда-сюда',
- 'uk' : 'Переміщуємо роботу туди-сюди'
+ 'uk' : 'Переміщуємо роботу туди-сюди',
+ 'vi' : 'Bốc bốc xếp xếp'
},
about: {
'en_US': '"Git" comfortable with modifying the source tree :P',
@@ -201,7 +210,8 @@ var sequenceInfo = exports.sequenceInfo = {
'zh_CN': '自由修改提交树',
'zh_TW': '自由修改提交樹',
'ru_RU': 'Не стесняйтесь менять историю',
- 'uk' : 'Не соромимось змінювати історію'
+ 'uk' : 'Не соромимось змінювати історію',
+ 'vi' : 'Chỉnh sửa cây lịch sử Git không hề khó'
}
},
mixed: {
@@ -217,7 +227,8 @@ var sequenceInfo = exports.sequenceInfo = {
'zh_CN': '杂项',
'zh_TW': '活用 git 的指令',
'ru_RU': 'Сборная солянка',
- 'uk' : 'Всяке'
+ 'uk' : 'Всяке',
+ 'vi' : 'Những trò mèo đáng đồng tiền bát gạo'
},
about: {
'en_US': 'A mixed bag of Git techniques, tricks, and tips',
@@ -231,7 +242,8 @@ var sequenceInfo = exports.sequenceInfo = {
'zh_CN': 'Git 技术、技巧与贴士大集合',
'zh_TW': 'git 的技術,招數與技巧',
'ru_RU': 'Ассорти из приёмов работы с Git, хитростей и советов',
- 'uk' : 'Різні прийоми роботи з Git, хитрощі та поради'
+ 'uk' : 'Різні прийоми роботи з Git, хитрощі та поради',
+ 'vi' : 'Các kỹ thuật, bí quyết, và mẹo vặt hữu ích'
}
},
advanced: {
@@ -247,7 +259,8 @@ var sequenceInfo = exports.sequenceInfo = {
'zh_TW': '進階主題',
'ru_RU': 'Продвинутый уровень',
'uk' : 'Досвідчений рівень',
- 'ko' : '고급 문제'
+ 'ko' : '고급 문제',
+ 'vi' : 'Các chủ đề nâng cao'
},
about: {
'en_US': 'For the truly brave!',
@@ -261,7 +274,8 @@ var sequenceInfo = exports.sequenceInfo = {
'zh_TW': '來成為真正的強者吧!',
'ru_RU': 'Если ты смелый, ловкий, умелый – потренируйся тут',
'uk' : 'Для хоробрих',
- 'ko' : '용기있는 도전자를 위해 준비한 문제입니다'
+ 'ko' : '용기있는 도전자를 위해 준비한 문제입니다',
+ 'vi' : 'Mạnh mẽ lên!'
}
}
};
From 886170f6271548c0c806f520b216d43c5e4aabb1 Mon Sep 17 00:00:00 2001
From: duongtiendat1990 <48908567+duongtiendat1990@users.noreply.github.com>
Date: Wed, 11 Dec 2019 17:28:29 +0700
Subject: [PATCH 135/359] translate commits.js
---
src/levels/intro/commits.js | 48 +++++++++++++++++++++++++++++++++++--
1 file changed, 46 insertions(+), 2 deletions(-)
diff --git a/src/levels/intro/commits.js b/src/levels/intro/commits.js
index 9f74fc72..b86b0228 100644
--- a/src/levels/intro/commits.js
+++ b/src/levels/intro/commits.js
@@ -11,7 +11,8 @@ exports.level = {
'zh_CN': 'Git Commit',
'zh_TW': '介紹 git commit ',
'ru_RU': 'Знакомство с Git Commit ',
- 'uk': 'Знайомство з комітами в Git'
+ 'uk': 'Знайомство з комітами в Git',
+ 'vi': 'Giới thiệu về Git Commit'
},
"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",
@@ -28,7 +29,8 @@ exports.level = {
"ja" : "'git commit'コマンドを2回打てば完成!",
"ko": "'git commit'이라고 두 번 치세요!",
"ru_RU": "Попробуй дважды выполнить команду 'git commit' ;)",
- "uk": "Спробуй двічі виконати команду 'git commit' ;)"
+ "uk": "Спробуй двічі виконати команду 'git commit' ;)",
+ 'vi': "Đơn giản là cứ gõ 'git commit' 2 lần"
},
"disabledMap": {
"git revert": true
@@ -547,6 +549,48 @@ exports.level = {
}
}
]
+ },
+ "vi": {
+ "childViews": [
+ {
+ "type": "ModalAlert",
+ "options": {
+ "markdowns": [
+ "## Git Commits",
+ "Một commit trong một git repository(kho chứa) lưu trữ một ảnh chụp của tất cả các file trong thư mục của bạn. Như kiểu copy và paste cõ bự, thậm chí còn tốt hơn thế!",
+ "",
+ "Thế nhưng Git muốn giữ cho các commit nhẹ hết mức có thể, cho nên git không copy tất cả thư mục một cách mù quáng mỗi khi bạn commit. Nó có thể(khi khả dĩ) nén commit như một tập hợp các thay đổi, hay là một \"bản so sánh\", giũa một phiên bản kho chứa git với phiên bản tiếp theo.",
+ "",
+ "Đồng thời Git cũng lưu trữ lịch sử commit nào được tạo ra lúc nào. Đó là tại sao hầu hết các commit có commit tổ tiên phía trên nó -- chúng tôi đã hình tượng hóa mối quan hệ này bằng các mũi tên. Trong cộng tác nhóm thì việc gìn giữ lịch sử là rất có ích!",
+ "",
+ "Có vẻ là hơi nhiều lý thuyết rồi, bây giờ bạn chỉ cần hiều các commit là các lát cắt của dự án. Các commit rất nhẹ nên việc chuyển qua lại giữa chúng thì nhanh vô cùng!"
+ ]
+ }
+ },
+ {
+ "type": "GitDemonstrationView",
+ "options": {
+ "beforeMarkdowns": [
+ "Thử thực hành chút nào. Ở bên phải chúng ta có mô tả một kho git (nhỏ). Hiện tại đang có 2 commit, một là commit khởi nguyên `C0`, và một commit sau đó `C1` có thể đã có một vài thay đổi.",
+ "",
+ "Bấm nút bên dưới để tạo một commit mới"
+ ],
+ "afterMarkdowns": [
+ "Đúng rồi! Tuyệt vời. Bạn vừa tạo thay đổi cho kho chứa và lưu vào commit. Cái commit bạn vừa tạo nó có cha, là `C1` đấy, là commit mà nó được tạo ra từ đó."
+ ],
+ "command": "git commit",
+ "beforeCommand": ""
+ }
+ },
+ {
+ "type": "ModalAlert",
+ "options": {
+ "markdowns": [
+ "Nào bây giờ thì thử tự làm bài tập nào! Sau khi đóng cửa sổ này, tạo ra 2 commit để hoàn thành cấp độ"
+ ]
+ }
+ }
+ ]
}
}
};
From cbed632b74e6171b8846a3444477954b4c0f9acd Mon Sep 17 00:00:00 2001
From: flyingbot91
Date: Wed, 11 Dec 2019 23:31:52 +0100
Subject: [PATCH 136/359] Translated 'intro' levels to Spanish 'es_ES'
---
src/levels/intro/branching.js | 80 +++++++++++++++++++++++++++++++++++
src/levels/intro/commits.js | 44 +++++++++++++++++++
src/levels/intro/merging.js | 71 +++++++++++++++++++++++++++++++
src/levels/intro/rebasing.js | 69 ++++++++++++++++++++++++++++++
4 files changed, 264 insertions(+)
diff --git a/src/levels/intro/branching.js b/src/levels/intro/branching.js
index 7ecdc005..7294e7d7 100644
--- a/src/levels/intro/branching.js
+++ b/src/levels/intro/branching.js
@@ -7,6 +7,7 @@ exports.level = {
"ja" : "Gitのブランチ",
"ko": "Git에서 브랜치 쓰기",
"es_AR": "Brancheando en Git",
+ "es_ES": "Creando ramas en Git",
"pt_BR": "Ramos no Git",
"gl" : "Ramas en Git",
"fr_FR": "Gérer les branches avec Git",
@@ -20,6 +21,7 @@ exports.level = {
"de_DE": 'Lege mit "git branch " einen neuen Branch an und checke ihn mit "git checkout aus',
"ja" : "ブランチの作成(\"git branch [ブランチ名]\")と、チェックアウト(\"git checkout [ブランチ名]\")",
"es_AR": "Hacé una nueva rama con \"git branch [nombre]\" y cambiá a ella con \"git checkout [nombre]\"",
+ "es_ES": "Crea una nueva rama con \"git branch [nombre]\" y sitúate en ella con \"git checkout [nombre]\"",
"pt_BR": "Crie um novo ramo com \"git branch [nome]\" e mude para ele com \"git checkout [nome]\"",
"gl" : "Crea unha nova rama con \"git branch [nome]\" e cambiate a ela facendo \"git checkout [nome]\"",
"fr_FR": "Faites une nouvelle branche avec \"git branch [nom]\" positionnez-vous dans celle-ci avec \"git checkout [nom]\"",
@@ -344,6 +346,84 @@ exports.level = {
}
]
},
+ "es_ES": {
+ "childViews": [
+ {
+ "type": "ModalAlert",
+ "options": {
+ "markdowns": [
+ "## Ramas en Git",
+ "",
+ "Las ramas (branches) en Git son increíblemente livianas. Son sólo referencias a un commit específico - nada más. Por esto es que tantos entusiastas de Git siguen el mantra:",
+ "",
+ "```",
+ "crea ramas al principio y hazlo también de manera frecuente",
+ "```",
+ "",
+ "Como no hay consumo extra de almacenamiento ni memoria al crear varias ramas, lógicamente es más fácil dividir tu trabajo que trabajar solamente con un par de ramas grandes.",
+ "",
+ "Cuando empecemos a mezclar ramas y commits, vamos a ver cómo se combinan estas dos herramientas. Por ahora, en cambio, simplemente recuerda que una rama esencialmente dice \"Quiero incluir el trabajo de este commit y todos su ancestros\"."
+ ]
+ }
+ },
+ {
+ "type": "GitDemonstrationView",
+ "options": {
+ "beforeMarkdowns": [
+ "Veamos cómo son las ramas en la práctica.",
+ "",
+ "Ahora vamos a crear una rama nueva llamada `newImage`"
+ ],
+ "afterMarkdowns": [
+ "Ahí está, ¡eso es todo lo que hay que hacer para crear una rama! La rama `newImage` ahora referencia al commit `C1`"
+ ],
+ "command": "git branch newImage",
+ "beforeCommand": ""
+ }
+ },
+ {
+ "type": "GitDemonstrationView",
+ "options": {
+ "beforeMarkdowns": [
+ "Pongamos algo de trabajo en esta nueva rama. Aprieta el botón de aquí abajo"
+ ],
+ "afterMarkdowns": [
+ "¡Vaya! ¡La rama `master` avanzó, pero `newImage` no! Eso es porque no estábamos \"en\" la rama nueva, y por eso el asterisco (*) estaba en `master`"
+ ],
+ "command": "git commit",
+ "beforeCommand": "git branch newImage"
+ }
+ },
+ {
+ "type": "GitDemonstrationView",
+ "options": {
+ "beforeMarkdowns": [
+ "Digámosle a git que queremos hacer checkout a esa rama con",
+ "",
+ "```",
+ "git checkout [name]",
+ "```",
+ "",
+ "Esto va a situarnos en esa rama antes de hacer un commit con nuestros cambios"
+ ],
+ "afterMarkdowns": [
+ "¡Ahí estamos! Nuestros cambios se registraron en nuestra nueva rama"
+ ],
+ "command": "git checkout newImage; git commit",
+ "beforeCommand": "git branch newImage"
+ }
+ },
+ {
+ "type": "ModalAlert",
+ "options": {
+ "markdowns": [
+ "¡Perfecto! Ya estás listo para trabajar con ramas. Cuando se cierre esta ventana,",
+ "crea una nueva rama llamada `bugFix` y cámbiate a ella"
+ ]
+ }
+ }
+ ]
+ },
"pt_BR": {
"childViews": [
{
diff --git a/src/levels/intro/commits.js b/src/levels/intro/commits.js
index 9f74fc72..dd04cb69 100644
--- a/src/levels/intro/commits.js
+++ b/src/levels/intro/commits.js
@@ -3,6 +3,7 @@ exports.level = {
"en_US": "Introduction to Git Commits",
"de_DE": "Einführung in Git Commits",
"es_AR": "Introducción a los commits de Git",
+ "es_ES": "Introducción a los commits de Git",
"pt_BR": "Introdução aos commits no Git",
"gl" : "Introducción ós commits de Git",
"fr_FR": "Introduction aux commits avec Git",
@@ -20,6 +21,7 @@ exports.level = {
"en_US": "Just type in 'git commit' twice to finish!",
"de_DE": "Gib einfach zweimal 'git commit' ein um den Level abzuschließen",
"es_AR": "¡Simplemente tipeá 'git commit' dos veces para terminar!",
+ "es_ES": "¡Simplemente escribe 'git commit' dos veces para terminar!",
"pt_BR": "Simplesmente digite 'git commit' duas vezes para concluir!",
"gl" : "Simplemente escribe 'git commit' dúas veces para terminar.",
"fr_FR": "Il suffit de saisir 'git commit' deux fois pour réussir !",
@@ -206,6 +208,48 @@ exports.level = {
}
]
},
+ "es_ES": {
+ "childViews": [
+ {
+ "type": "ModalAlert",
+ "options": {
+ "markdowns": [
+ "## Commits de Git",
+ "Un commit en un repositorio git registra un snapshot de todos los archivos en tu directorio. Es como un _gran_ copy&paste, ¡pero incluso mejor!",
+ "",
+ "Git pretende mantener los commits tan livianos como sea posible, por lo que no copia ciegamente el directorio completo cada vez que haces un commit. Puede (cuando es posible) comprimir un commit como un conjunto de cambios (o un _\"delta\"_) entre una versión de tu repositorio y la siguiente.",
+ "",
+ "Git mantiene, también, un historial de qué commits se hicieron y cuándo. Es por eso que la mayoría de los commits tienen commits ancestros encima -- designamos esto con flechas en nuestra visualización. ¡Mantener el historial es genial para todos los que trabajan en el proyecto!",
+ "",
+ "Hay un montón en lo que ahondar, pero por ahora puedes pensar en los commits como snapshots de tu proyecto. Los commits son muy livianos, y ¡cambiar de uno a otro es terriblemente rápido!"
+ ]
+ }
+ },
+ {
+ "type": "GitDemonstrationView",
+ "options": {
+ "beforeMarkdowns": [
+ "Veamos cómo se ve esto en la práctica. A la derecha tenemos una visualización de un (pequeño) repositorio git. Hay dos commits: el commit inicial, `C0`, y un commit que lo sigue, `C1`, que podría tener algunos cambios interesantes.",
+ "",
+ "Dale al botón de abajo para crear un nuevo commit"
+ ],
+ "afterMarkdowns": [
+ "¡Allá va! Increíble. Acabamos de hacer cambios al repositorio y los guardamos como un commit. El commit que acabamos de crear tiene un padre, `C1`, que referencia al commit en el que se basó este."
+ ],
+ "command": "git commit",
+ "beforeCommand": ""
+ }
+ },
+ {
+ "type": "ModalAlert",
+ "options": {
+ "markdowns": [
+ "¡Venga, inténtalo ahora! Cuando se cierre esta ventana, crea dos commits para completar el nivel."
+ ]
+ }
+ }
+ ]
+ },
"pt_BR": {
"childViews": [
{
diff --git a/src/levels/intro/merging.js b/src/levels/intro/merging.js
index 894501ff..6ee5e46e 100644
--- a/src/levels/intro/merging.js
+++ b/src/levels/intro/merging.js
@@ -5,6 +5,7 @@ exports.level = {
"en_US": "Merging in Git",
"de_DE": "Mergen in git",
"es_AR": "Mergeando en Git",
+ "es_ES": "Haciendo merge en Git",
"pt_BR": "Merge no Git",
"gl" : "Merge en Git",
"fr_FR": "Faire des 'merge' (fusions de branches) avec Git",
@@ -20,6 +21,7 @@ exports.level = {
"de_DE": "Denk dran in der angegebenen Reihenfolge zu committen (erst bugFix, dann master)",
"ja" : "指示された順番でコミットすること(masterの前にbugFixで)",
"es_AR": "Acordate de commitear en el orden especificado (bugFix antes de master)",
+ "es_ES": "Acuérdate de hacer commit en el orden especificado (bugFix antes de master)",
"pt_BR": "Lembre-se de commitar na ordem especificada (bugFix antes de master)",
"gl" : "Lembrate de facer commit na orde específica (bugFix antes de master)",
"fr_FR": "Pensez à faire des commits dans l'ordre indiqué (bugFix avant master)",
@@ -309,6 +311,75 @@ exports.level = {
}
]
},
+ "es_ES": {
+ "childViews": [
+ {
+ "type": "ModalAlert",
+ "options": {
+ "markdowns": [
+ "## Haciendo merge en ramas",
+ "",
+ "¡Genial! Ya sabemos cómo crear un commit y cómo crear ramas. Ahora tenemos que aprender algún modo de unificar el trabajo de dos ramas diferentes. Esto nos va a permitir abrir una nueva rama de desarrollo, implementar alguna nueva funcionalidad, y después unirla de nuevo con el trabajo principal.",
+ "",
+ "El primer método para combinarlas que vamos a explorar es `git merge`. Hacer merge en Git crea un commit especial que tiene dos padres diferentes. Un commit con dos padres escencialmente significa \"Quiero incluir todo el trabajo de estos dos padres , *y* del conjunto de todos sus ancestros\"",
+ "",
+ "Es más simple visualizarlo, veámoslo a continuación"
+ ]
+ }
+ },
+ {
+ "type": "GitDemonstrationView",
+ "options": {
+ "beforeMarkdowns": [
+ "Aquí tenemos dos ramas, y cada una tiene un commit que le es único. Esto significa que ninguna de las ramas incluye \"todo el trabajo\" que hay en nuestro repositorio. Hagamos un merge para solucionar eso.",
+ "",
+ "Vamos a `merge`ar la rama `bugFix` a `master`"
+ ],
+ "afterMarkdowns": [
+ "¡Caramba! ¿Viste eso? Antes de nada, `master` ahora apunta a un commit que tiene dos padres. Si sigues las flechas por el árbol de commits empezando desde `master` vas a cruzarte con cada commit del repositorio hasta llegar a la raíz. Esto significa que `master` ahora contiene todo el trabajo que hay en el repositorio.",
+ "",
+ "Además, ¿viste cómo cambiaron los colores de los commits? Para ayudar al aprendizaje, he incluido algunas convenciones de colores. Cada rama tiene un color propio. Cada commmit se vuelve del color resultante de mezclar los colores de todas las ramas que lo contienen.",
+ "",
+ "Así que aquí vemos que el color de la rama `master` participa en la mezcla de todos los commits, pero que el de `bugFix` no. Arreglemos eso..."
+ ],
+ "command": "git merge bugFix",
+ "beforeCommand": "git checkout -b bugFix; git commit; git checkout master; git commit"
+ }
+ },
+ {
+ "type": "GitDemonstrationView",
+ "options": {
+ "beforeMarkdowns": [
+ "Hagamos merge de `master` a `bugFix`:"
+ ],
+ "afterMarkdowns": [
+ "Como `bugFix` era un ancestro de `master`, git no tuvo que hacer ningún trabajo; simplemente movió `bugFix` al mismo commit al que estaba anexado `master`.",
+ "",
+ "Ahora todos los commits son del mismo color, lo que significa que cada rama contiene todo el trabajo que hay en el repositorio. ¡Genial!"
+ ],
+ "command": "git checkout bugFix; git merge master",
+ "beforeCommand": "git checkout -b bugFix; git commit; git checkout master; git commit; git merge bugFix"
+ }
+ },
+ {
+ "type": "ModalAlert",
+ "options": {
+ "markdowns": [
+ "Para completar este nivel, sigue estos pasos:",
+ "",
+ "* Crea una nueva rama, llamada `bugFix`",
+ "* Haz checkout de la rama `bugFix` usando `git checkout bugFix`",
+ "* Crea un commit",
+ "* Vuelve a `master` con `git checkout`",
+ "* Crea otro commit",
+ "* Haz merge de la rama `bugFix` a `master` usando `git merge`",
+ "",
+ "*Recuerda: siempre puedes volver a ver este mensaje escribiendo \"objective\"!*"
+ ]
+ }
+ }
+ ]
+ },
"pt_BR": {
"childViews": [
{
diff --git a/src/levels/intro/rebasing.js b/src/levels/intro/rebasing.js
index 29a46107..ebcfcbda 100644
--- a/src/levels/intro/rebasing.js
+++ b/src/levels/intro/rebasing.js
@@ -6,6 +6,7 @@ exports.level = {
"de_DE": "Einführung in Rebase",
"ja" : "Rebaseの解説",
"es_AR": "Introducción a rebase",
+ "es_ES": "Introducción a rebase",
"pt_BR": "Introdução ao rebase",
"gl" : "Introducción a rebase",
"fr_FR": "Introduction à rebase",
@@ -21,6 +22,7 @@ exports.level = {
"ja" : "初めにbugFixを指した状態でコミットする",
"fr_FR": "Assurez-vous de bien faire votre commit sur bugFix en premier",
"es_AR": "Asegurate de commitear desde bugFix primero",
+ "es_ES": "Asegúrate de hacer commit desde bugFix primero",
"pt_BR": "O bugFix precisa ser commitado primeiro",
"gl" : "Asegurate de facer o commit dende bugFix primeiro",
"ko": "bugFix 브랜치에서 먼저 커밋하세요",
@@ -301,6 +303,73 @@ exports.level = {
}
]
},
+ "es_ES": {
+ "childViews": [
+ {
+ "type": "ModalAlert",
+ "options": {
+ "markdowns": [
+ "## Git Rebase",
+ "",
+ "El segundo modo de combinar el trabajo de distintas ramas es el *rebase*. Hacer rebase escencialmente selecciona un conjunto de commits, los \"copia\", y los aplica en algún otro lado.",
+ "",
+ "Aunque esto pueda sonar confuso, la ventaja de hacer rebase es que puede usarse para conseguir una secuencia de commits lineal, más bonita. El historial / log de commits del repositorio va a estar mucho más claro si sólo usas rebase.",
+ "",
+ "Veámoslo en acción..."
+ ]
+ }
+ },
+ {
+ "type": "GitDemonstrationView",
+ "options": {
+ "beforeMarkdowns": [
+ "Aquí tenemos dos ramas otra vez. Observa que la rama bugFix está actualmente seleccionada (tiene un asterisco)",
+ "",
+ "Nos gustaría mover nuestro trabajo de bugFix directamente sobre el trabajo de master. De ese modo, parecería que esas dos tareas se desarrollaron secuencialmente, cuando en realidad se hicieron en paralelo.",
+ "",
+ "Hagámoslo usando el comando `git rebase`"
+ ],
+ "afterMarkdowns": [
+ "¡Genial! Ahora el trabajo de nuestra rama bugFix está justo encima del de master, y tenemos una secuencia lineal de commits.",
+ "",
+ "Nota que el commit C3 sigue existiendo en algún lado (aparece medio desvanecido en el árbol), y C3' es la \"copia\" que rebaseamos sobre master.",
+ "",
+ "El único problema es que master todavía no se actualizó, resolvámoslo ahora..."
+ ],
+ "command": "git rebase master",
+ "beforeCommand": "git commit; git checkout -b bugFix C1; git commit"
+ }
+ },
+ {
+ "type": "GitDemonstrationView",
+ "options": {
+ "beforeMarkdowns": [
+ "Ahora estamos parados sobre la rama `master`. Avancemos y hagamos rebase sobre `bugFix`..."
+ ],
+ "afterMarkdowns": [
+ "¡Ahí está! Como `master` era un ancestro de `bugFix`, git simplemente movió la referencia de `master` hacia adelante en la historia."
+ ],
+ "command": "git rebase bugFix",
+ "beforeCommand": "git commit; git checkout -b bugFix C1; git commit; git rebase master; git checkout master"
+ }
+ },
+ {
+ "type": "ModalAlert",
+ "options": {
+ "markdowns": [
+ "Para completar este nivel, haz lo siguiente:",
+ "",
+ "* Haz checkout de una nueva rama llamada `bugFix`",
+ "* Crea un commit",
+ "* Vuelve a la rama master y crea otro commit",
+ "* Haz checkout en bugFix otra vez y haz rebase sobre master",
+ "",
+ "¡Misión cumplida!"
+ ]
+ }
+ }
+ ]
+ },
"pt_BR": {
"childViews": [
{
From 64bd768db4f380ad0bbbc96313be5328261cb69d Mon Sep 17 00:00:00 2001
From: flyingbot91
Date: Wed, 11 Dec 2019 23:32:24 +0100
Subject: [PATCH 137/359] Translated 'advanced' levels to Spanish 'es_ES'
---
src/levels/advanced/multipleParents.js | 89 ++++++++++++++++++++++++++
1 file changed, 89 insertions(+)
diff --git a/src/levels/advanced/multipleParents.js b/src/levels/advanced/multipleParents.js
index 7b40b4dc..dd822ad0 100644
--- a/src/levels/advanced/multipleParents.js
+++ b/src/levels/advanced/multipleParents.js
@@ -9,6 +9,7 @@ exports.level = {
"de_DE": "Mehrere Vorgänger",
"ja" : "複数の親",
"es_AR": "Múltiples padres",
+ "es_ES": "Múltiples padres",
"pt_BR": "Múltiplos pais",
"gl" : "Múltiples pais",
"zh_TW": "多個 parent commit",
@@ -23,6 +24,7 @@ exports.level = {
'fr_FR': 'Utilisez "git branch bugWork" avec un commit pour créer une référence manquante',
"zh_CN": "使用 `git branch bugWork` 加上一个目标提交记录来创建消失的引用。",
"es_AR": "Usá `git branch bugWork` sobre algún commit para crear la referencia faltante",
+ "es_ES": "Usa `git branch bugWork` sobre algún commit para crear la referencia que falta",
"pt_BR": "Use `git branch bugWork` com um commit alvo para criar a referência que falta",
"gl" : "Usa `git branch bugWork` sobre calquera commit para crear a referencia que falta",
"zh_TW": "在一個指定的 commit 上面使用 `git branch bugWork`。",
@@ -466,6 +468,93 @@ exports.level = {
}
]
},
+ "es_ES": {
+ "childViews": [
+ {
+ "type": "ModalAlert",
+ "options": {
+ "markdowns": [
+ "### Especificando los padres",
+ "",
+ "Como el modificador de `~`, `^` también acepta un número opcional después de él.",
+ "",
+ "En lugar de especificar cuántas generaciones hacia atrás ir (como `~`), el modificador de `^` especifica por cuál de las referencias padres seguir en un commit de merge. Recuerda que un commit de merge tiene múltiples padres, por lo que el camino a seguir es ambiguo.",
+ "",
+ "Git normalmente sigue el \"primer\" padre de un commit de merge, pero especificando un número junto con `^` cambia este comportamiento predefinido.",
+ "",
+ "Demasiada charla, veámoslo en acción.",
+ ""
+ ]
+ }
+ },
+ {
+ "type": "GitDemonstrationView",
+ "options": {
+ "beforeMarkdowns": [
+ "Aquí tenemos un commit de merge. Si hacemos checkout de `master^`, sin modificadores, vamos a seguir al primer padre después del commit de merge. ",
+ "",
+ "(*En nuestras visualizaciones, el primer padre se ubica directamente arriba del commit de merge.*)"
+ ],
+ "afterMarkdowns": [
+ "Fácil -- esto es a lo que estamos acostumbrados."
+ ],
+ "command": "git checkout master^",
+ "beforeCommand": "git checkout HEAD^; git commit; git checkout master; git merge C2"
+ }
+ },
+ {
+ "type": "GitDemonstrationView",
+ "options": {
+ "beforeMarkdowns": [
+ "Ahora tratemos de especificar el segundo padre, en cambio..."
+ ],
+ "afterMarkdowns": [
+ "¿Ves? Seguimos al otro padre hacia arriba."
+ ],
+ "command": "git checkout master^2",
+ "beforeCommand": "git checkout HEAD^; git commit; git checkout master; git merge C2"
+ }
+ },
+ {
+ "type": "GitDemonstrationView",
+ "options": {
+ "beforeMarkdowns": [
+ "Los modificadores de `^` y `~` son muy poderosos a la hora de movernos en un árbol:"
+ ],
+ "afterMarkdowns": [
+ "¡Rapidísimo!"
+ ],
+ "command": "git checkout HEAD~; git checkout HEAD^2; git checkout HEAD~2",
+ "beforeCommand": "git commit; git checkout C0; git commit; git commit; git commit; git checkout master; git merge C5; git commit"
+ }
+ },
+ {
+ "type": "GitDemonstrationView",
+ "options": {
+ "beforeMarkdowns": [
+ "Más loco aún, ¡estos modificadores pueden encadenarse entre sí! Mira esto:"
+ ],
+ "afterMarkdowns": [
+ "El mismo movimiento que antes, pero todo en uno."
+ ],
+ "command": "git checkout HEAD~^2~2",
+ "beforeCommand": "git commit; git checkout C0; git commit; git commit; git commit; git checkout master; git merge C5; git commit"
+ }
+ },
+ {
+ "type": "ModalAlert",
+ "options": {
+ "markdowns": [
+ "### Ponlo en práctica",
+ "",
+ "Para completar este nivel, crea una nueva rama en la ubicación indicada.",
+ "",
+ "Obviamente sería muy fácil especificar el commit directamente (algo como `C6`), pero te reto a usar los modificadores de los que estuvimos hablando, mejor"
+ ]
+ }
+ }
+ ]
+ },
"pt_BR": {
"childViews": [
{
From 0d02559fe4ee024ff6a2252ba8dd26d166fb6980 Mon Sep 17 00:00:00 2001
From: flyingbot91
Date: Wed, 11 Dec 2019 23:37:28 +0100
Subject: [PATCH 138/359] Writing typos
---
src/levels/intro/branching.js | 4 ++--
src/levels/intro/commits.js | 2 +-
2 files changed, 3 insertions(+), 3 deletions(-)
diff --git a/src/levels/intro/branching.js b/src/levels/intro/branching.js
index 7ecdc005..85f69dc3 100644
--- a/src/levels/intro/branching.js
+++ b/src/levels/intro/branching.js
@@ -280,9 +280,9 @@ exports.level = {
"brancheá temprano, y brancheá seguido",
"```",
"",
- "Como no hay consumo extra de alamcenamiento ni memoria al hacer varias ramas, es más fácil dividir lógicamente tu trabajo que tener un par de ramas grandes.",
+ "Como no hay consumo extra de almacenamiento ni memoria al hacer varias ramas, es más fácil dividir lógicamente tu trabajo que tener un par de ramas grandes.",
"",
- "Cuando empecemos a mezclar ramas y commits, vamos a ver cómo se combinan estas dos herramientas. Por ahora, en cambio, simplemente recordá que una rama escencialmente dice \"Quiero incluir el trabajo de este commit y todos su ancestros\"."
+ "Cuando empecemos a mezclar ramas y commits, vamos a ver cómo se combinan estas dos herramientas. Por ahora, en cambio, simplemente recordá que una rama esencialmente dice \"Quiero incluir el trabajo de este commit y todos su ancestros\"."
]
}
},
diff --git a/src/levels/intro/commits.js b/src/levels/intro/commits.js
index 9f74fc72..133f5f2c 100644
--- a/src/levels/intro/commits.js
+++ b/src/levels/intro/commits.js
@@ -173,7 +173,7 @@ exports.level = {
"## Commits de Git",
"Un commit en un repositorio git registra un snapshot de todos los archivos en tu directorio. Es como un _gran_ copy&paste, ¡pero incluso mejor!",
"",
- "Git pretende mantener los commits tan livianos como sea posible, por lo que no copia ciegamente el directorio completo cada vez que commiteás. Puede (cuando es posible) comprimir un commit como un conjunto de cambios (o un _\"delta\"_) entre una versión de tu repositorio y la siguiente.",
+ "Git pretende mantener los commits tan livianos como sea posible, por lo que no copia ciegamente el directorio completo cada vez que commiteás. Puede (cuando sea posible) comprimir un commit como un conjunto de cambios (o un _\"delta\"_) entre una versión de tu repositorio y la siguiente.",
"",
"Git mantiene, también, un historial de qué commits se hicieron cuándo. Es por eso que la mayoría de los commits tienen commits ancestros arriba suyo -- designamos esto con flechas en nuestra visualización. ¡Mantener el historial es genial para todos los que trabajan en el proyecto!",
"",
From a4e13ba14e889d1070689b8e68df0e9c3eaea984 Mon Sep 17 00:00:00 2001
From: flyingbot91
Date: Thu, 12 Dec 2019 22:21:19 +0100
Subject: [PATCH 139/359] Translated 'mixed' levels to Spanish 'es_ES'
---
src/levels/mixed/describe.js | 65 +++++++++++++++++++++++++++
src/levels/mixed/grabbingOneCommit.js | 41 +++++++++++++++++
src/levels/mixed/jugglingCommits.js | 37 +++++++++++++++
src/levels/mixed/jugglingCommits2.js | 45 +++++++++++++++++++
src/levels/mixed/tags.js | 54 ++++++++++++++++++++++
5 files changed, 242 insertions(+)
diff --git a/src/levels/mixed/describe.js b/src/levels/mixed/describe.js
index 0bef2010..24df2e35 100644
--- a/src/levels/mixed/describe.js
+++ b/src/levels/mixed/describe.js
@@ -8,6 +8,7 @@ exports.level = {
"de_DE": "Git Describe",
"ja" : "Git Describe",
"es_AR": "Git Describe",
+ "es_ES": "Git Describe",
"pt_BR": "Git Describe",
"gl" : "Git Describe",
"zh_TW": "git describe",
@@ -22,6 +23,7 @@ exports.level = {
"de_DE": "Committe nur einmal auf bugFix, wenn du soweit bist",
"ja" : "次に進む準備が整ったなら、bugFixに対して一回commitしてください",
"es_AR": "Simplemente commiteá una vez en bugFix cuando estés listo para seguir",
+ "es_ES": "Simplemente crea un commit en la rama bugFix cuando estés listo para seguir",
"pt_BR": "Simplesmente commite uma vez em bugFix quando quiser parar de experimentar",
"gl" : "Simplemente fai commit en bugFix cando estés listo para continuar.",
"zh_TW": "當你要移動的時候,只要在 bugFix 上面 commit 就好了",
@@ -348,6 +350,69 @@ exports.level = {
}
]
},
+ "es_ES": {
+ "childViews": [
+ {
+ "type": "ModalAlert",
+ "options": {
+ "markdowns": [
+ "### Git Describe",
+ "",
+ "Como los tags sirven tanto para marcar \"hitos\" en el código, git tiene un comando para *describir* (_describe_) dónde estás relativo al \"hito\" más cercano (digamos, \"tag\"). Y ese comamndo se llama ¡`git describe`!",
+ "",
+ "Git describe puede ayudarte a saber dónde estás después de que te hayas movido varios commits hacia adelante o atrás en la historia. Esto puede pasarte después de que termines un git bisect (una búsqueda que te ayuda a debuggear problemas) o cuando te sientas delante de la computadora de un compañero de trabajo que acaba de volver de unas vacaciones."
+ ]
+ }
+ },
+ {
+ "type": "ModalAlert",
+ "options": {
+ "markdowns": [
+ "Git describe tiene la siguiente forma:",
+ "",
+ "`git describe `",
+ "",
+ "Donde `` es cualquier cosa que git puede resolver a un commit. Si no especificas ninguna referencia, git simplemente usa el commit en el que estás parado ahora (`HEAD`).",
+ "",
+ "La salida de ese comando se ve así:",
+ "",
+ "`__g`",
+ "",
+ "Donde `tag` es el tag más cercano en la historia, `numCommits` dice a cuántos commits de ese tag estás, y `` es el hash del commit que estás describiendo."
+ ]
+ }
+ },
+ {
+ "type": "GitDemonstrationView",
+ "options": {
+ "beforeMarkdowns": [
+ "Veamos un ejemplo breve. Para este árbol de commits:"
+ ],
+ "afterMarkdowns": [
+ "El comando `git describe master` mostraría:",
+ "",
+ "`v1_2_gC2`",
+ "",
+ "Mientras que `git describe side` debería mostrar:",
+ "",
+ "`v2_1_gC4`"
+ ],
+ "command": "git tag v2 C3",
+ "beforeCommand": "git commit; go -b side HEAD~1; gc; gc; git tag v1 C0"
+ }
+ },
+ {
+ "type": "ModalAlert",
+ "options": {
+ "markdowns": [
+ "¡Eso es prácticamente todo lo que hay sobre git describe! Prueba con algunas referencias en este nivel para familiarizarte con el comando.",
+ "",
+ "Cuando estés listo, crea un commit para terminar el nivel. Te estamos dando una gratis :P"
+ ]
+ }
+ }
+ ]
+ },
"pt_BR": {
"childViews": [
{
diff --git a/src/levels/mixed/grabbingOneCommit.js b/src/levels/mixed/grabbingOneCommit.js
index 42e748d3..86400368 100644
--- a/src/levels/mixed/grabbingOneCommit.js
+++ b/src/levels/mixed/grabbingOneCommit.js
@@ -19,6 +19,7 @@ exports.level = {
"fr_FR": "Choisir seulement 1 commit",
"de_DE": "Einen Commit pflücken",
"es_AR": "Tomando un único commit",
+ "es_ES": "Tomando un único commit",
"pt_BR": "Pegando um único commit",
"gl" : "Escollendo un único commit",
"ja": "一つのコミットのみを取得",
@@ -32,6 +33,7 @@ exports.level = {
"de_DE": "Vergiss nicht: hier kommst du mit interaktivem Rebase oder Cherry-Picking weiter",
"fr_FR": "Souvenez-vous, les rebases interactifs ou cherry-pick sont vos amis ici.",
"es_AR": "Acordate, el rebase interactivo o cherry-pick son tus amigos acá",
+ "es_ES": "Recuerda, el rebase interactivo y el cherry-pick son tus amigos",
"pt_BR": "Lembre-se, o rebase interativo ou o cherry-pick são seus amigos aqui",
"gl" : "Recorda, o rebase interativo ou cherry-pick é un dos teus colegas aquí",
"ja": "このレベルではインタラクティブモードのrebaseやcherry-pickがクリアのカギです",
@@ -157,6 +159,45 @@ exports.level = {
}
]
},
+ "es_ES": {
+ "childViews": [
+ {
+ "type": "ModalAlert",
+ "options": {
+ "markdowns": [
+ "## Commits localmente stackeados",
+ "",
+ "Esta es una escena que suele pasar cuando uno desarrolla: estoy tratando de encontrar un bug bastante escurridizo. Para ayudar en mi tarea de detective, agrego un par de comandos de debug, y algunas sentencias para imprimir el estado de mi sistema.",
+ "",
+ "Todas estas cosas de imprimir y debuggear estan en su propia rama. Finalmente encuentro el problema, lo soluciono, ¡y disfruto!",
+ "",
+ "El único problema es que ahora necesito llevar mi `bugFix` a la rama `master`. Si simplemente fast-forwardeo `master`, entonces `master` va a tener todos mis agregados de debugging, lo cual no es deseable. Tiene que haber otro modo..."
+ ]
+ }
+ },
+ {
+ "type": "ModalAlert",
+ "options": {
+ "markdowns": [
+ "Necesitamos decirle a git que sólo copie uno de los commits. Esto es tal como los niveles anteriores de mover commits por ahí -- podemos usar los mismos comandos:",
+ "",
+ "* `git rebase -i`",
+ "* `git cherry-pick`",
+ "",
+ "Para conseguir este resultado."
+ ]
+ }
+ },
+ {
+ "type": "ModalAlert",
+ "options": {
+ "markdowns": [
+ "Este es un nivel más avanzado, así que debes decidir cuál de los dos comandos quieres usar, pero para completar el nivel asegurate de que `master` recibe el commit que `bugFix` referencia."
+ ]
+ }
+ }
+ ]
+ },
"pt_BR": {
"childViews": [
{
diff --git a/src/levels/mixed/jugglingCommits.js b/src/levels/mixed/jugglingCommits.js
index 747a518e..f4b254c8 100644
--- a/src/levels/mixed/jugglingCommits.js
+++ b/src/levels/mixed/jugglingCommits.js
@@ -23,6 +23,7 @@ exports.level = {
"de_DE": "Jonglieren mit Commits",
"fr_FR": "Jongler avec les commits",
"es_AR": "Haciendo malabares con los commits",
+ "es_ES": "Haciendo malabares con los commits",
"pt_BR": "Malabarismo com commits",
"gl" : "Argallando cos commits",
"ja": "コミットをやりくりする",
@@ -36,6 +37,7 @@ exports.level = {
"de_DE": "Der erste Befehl ist git rebase -i HEAD~2",
"fr_FR": "La première commande est git rebase -i HEAD~2",
"es_AR": "El primer comando es git rebase -i HEAD~2",
+ "es_ES": "El primer comando es git rebase -i HEAD~2",
"pt_BR": "O primeiro comando é git rebase -i HEAD~2",
"gl" : "O primeiro comando é git rebase -i HEAD~2",
"ja": "最初に打つコマンドはgit rebase -i HEAD~2",
@@ -150,6 +152,41 @@ exports.level = {
},
]
},
+ "es_ES": {
+ "childViews": [
+ {
+ "type": "ModalAlert",
+ "options": {
+ "markdowns": [
+ "## Haciendo malabares con los commits",
+ "",
+ "Esta es otra situación algo común. Tienes algunos cambios (`newImage`) y otro conjunto de cambios (`caption`) que están relacionados, entonces están apilados en tu repositorio uno encima del otro (es decir, uno después del otro).",
+ "",
+ "El tema es que a veces tienes que hacer una pequeña modificación a un commit previo. En este caso, la gente de diseño requiere que cambiemos ligeramente las dimensiones de `newImage`, ¡incluso aunque ese commit ya se encuentre atrás en nuestra historia!"
+ ]
+ }
+ },
+ {
+ "type": "ModalAlert",
+ "options": {
+ "markdowns": [
+ "Superaremos esta dificultad haciendo lo siguiente:",
+ "",
+ "* Vamos a reordenar los commits para que el que queremos cambiar quede arriba de los demás con `git rebase -i`",
+ "* Vamos a hacer `commit --amend` para aplicar la ligera modificación",
+ "* Después vamos a reordenar los commits a como estaban con `git rebase -i`",
+ "* Finalmente, vamos a mover master a esta parte actualizada de nuestro árbol de commits para terminar el nivel (usando el método que prefieras)",
+ "",
+ "Hay varias maneras de lograr este objetivo en general (ya te veo haciéndole ojitos al cherry-pick), y veremos algunos más después, pero por ahora concentrémonos en esta técnica.",
+ "",
+ "Por último, presta atención al estado final -- como movemos los commits dos veces, ambos quedan con un apóstrofe. El commit que corregimos tiene un apóstrofe extra, y así nos queda nuestro árbol final",
+ "",
+ "Habiendo dicho eso, puedo comparar los niveles basándome ahora en la estructura y las diferencias relativas de apóstrofes. Mientras que tu rama `master` tenga la misma estructura y diferencias relativas de apóstrofes, te voy a dar el puntaje completo"
+ ]
+ }
+ },
+ ]
+ },
"pt_BR": {
"childViews": [
{
diff --git a/src/levels/mixed/jugglingCommits2.js b/src/levels/mixed/jugglingCommits2.js
index 29a97a31..bfac0c16 100644
--- a/src/levels/mixed/jugglingCommits2.js
+++ b/src/levels/mixed/jugglingCommits2.js
@@ -21,6 +21,7 @@ exports.level = {
"en_US": "Juggling Commits #2",
"fr_FR": "Jongler avec les commits #2",
"es_AR": "Haciendo malabares con los commits #2",
+ "es_ES": "Haciendo malabares con los commits #2",
"pt_BR": "Malabarismo com commits #2",
"gl" : "Argallando cos commits #2",
"de_DE": "Jonglieren mit Commits Teil 2",
@@ -34,6 +35,7 @@ exports.level = {
"en_US": "Don't forget to forward master to the updated changes!",
"fr_FR": "N'oubliez pas d'appliquer les changements depuis la branche master",
"es_AR": "¡No te olvides de avanzar master a los cambios actualizados!",
+ "es_ES": "¡No te olvides de avanzar master a los cambios actualizados!",
"pt_BR": "Não se esqueça de avançar a referência do master para as mudanças efetuadas!",
"gl" : "¡Non te esquezas de avanzar master ós cambios actualizados!",
"de_DE": "Vergiss nicht den master auf die aktuelle Version vorzuspulen",
@@ -174,6 +176,49 @@ exports.level = {
}
]
},
+ "es_ES": {
+ "childViews": [
+ {
+ "type": "ModalAlert",
+ "options": {
+ "markdowns": [
+ "## Haciendo malabares con los commits #2",
+ "",
+ "*Si no completaste Haciendo malabares con los commits #1 (el nivel anterior), hazlo antes de continuar*",
+ "",
+ "Como viste en el último nivel, usamos `rebase -i` para reordenar los commits. Una vez que el commit que queríamos cambiar se encontraba arriba de todo, pudimos `--amend`earlo fácilmente y reordenarlo a como queríamos.",
+ "",
+ "El único problema con esto es que hay mucho reordenamiento, que puede generar conflictos al rebasear. Veamos otro método usando `git cherry-pick`"
+ ]
+ }
+ },
+ {
+ "type": "GitDemonstrationView",
+ "options": {
+ "beforeMarkdowns": [
+ "Recuerda que git cherry-pick va a traer un commit de cualquier parte del árbol sobre HEAD (siempre que ese otro commit no sea un ancestro de HEAD).",
+ "",
+ "Una pequeña demo para refrescar la idea:"
+ ],
+ "afterMarkdowns": [
+ "¡Bien! Sigamos..."
+ ],
+ "command": "git cherry-pick C2",
+ "beforeCommand": "git checkout -b bugFix; git commit; git checkout master; git commit"
+ }
+ },
+ {
+ "type": "ModalAlert",
+ "options": {
+ "markdowns": [
+ "Entonces, en este nivel vamos a lograr el mismo objetivo de corregir `C2`, pero sin usar `rebase -i`. Te dejo a ti el darte cuenta cómo :D",
+ "",
+ "Recuerda, la cantidad exacta de apóstrofes (') en el commit no es importante, sólo la diferencia relativa. Por ejemplo, le voy a dar una puntuación a un árbol que coincida con el objetivo pero cuyos commits tengan todos un apóstrofe extra"
+ ]
+ }
+ }
+ ]
+ },
"pt_BR": {
"childViews": [
{
diff --git a/src/levels/mixed/tags.js b/src/levels/mixed/tags.js
index 511d62f0..860ddcfb 100644
--- a/src/levels/mixed/tags.js
+++ b/src/levels/mixed/tags.js
@@ -7,6 +7,7 @@ exports.level = {
"de_DE": "Git Tags",
"ja" : "Gitのタグ",
"es_AR": "Tags en git",
+ "es_ES": "Tags en git",
"pt_BR": "Tags no Git",
"gl" : "Etiquetas en git",
"fr_FR": "Git Tags",
@@ -22,6 +23,7 @@ exports.level = {
"de_DE": "Du kannst den Checkout entweder direkt auf den Commit oder das Tag machen.",
"ja" : "コミットを直接チェックアウトできますが、簡単にタグでチェックアウトすることも可能!",
"es_AR": "Podés checkoutear directamente el commit, ¡o simplemente el tag!",
+ "es_ES": "Puedes hacer checkout directamente el commit, ¡o simplemente el tag!",
"pt_BR": "Você pode fazer checkout diretamente no commit ou na tag correspondente!",
"gl" : "Podes saltar directamente ó commit, ¡ou a etiqueta, que é máis doado!",
"zh_TW": "你可以直接 checkout 到 commit 上,或是簡單的 checkout 到 tag 上",
@@ -291,6 +293,58 @@ exports.level = {
}
]
},
+ "es_ES": {
+ "childViews": [
+ {
+ "type": "ModalAlert",
+ "options": {
+ "markdowns": [
+ "## Tags en git",
+ "",
+ "Como aprendiste en lecciones anteriores, las ramas pueden moverse fácilmente, y en general van referenciando distintos commits a medida que el trabajo se va completando en ellas. Las ramas cambian fácilmente, suelen ser temporales, y siempre cambiantes.",
+ "",
+ "Si ese es el caso, te podrías estar preguntando si hay una manera de marcar *permanentemente* puntos en la historia de tu proyecto. Para cosas como releases mayores o grandes merges, ¿hay algún modo de marcar esos commits con algo más permanente que un branch?",
+ ""
+ ]
+ }
+ },
+ {
+ "type": "ModalAlert",
+ "options": {
+ "markdowns": [
+ "¡Seguro que hay! Los tags de git soportan exactamente este caso de uso -- marcan (bastante) permanentemente determinados commits como \"hitos\" que puedes referenciar como a un branch.",
+ "",
+ "Aún más importante, los tags no avanzan cuando se crean nuevos commits. No puedes hacer checkout a un tag y completar el trabajo en ese tag - los tags son marcas fijas en el árbol de commits que designan ciertos puntos.",
+ "",
+ "Veamos cómo se ven los tags en práctica..."
+ ]
+ }
+ },
+ {
+ "type": "GitDemonstrationView",
+ "options": {
+ "beforeMarkdowns": [
+ "Creemos un tag en `C1`, que es nuestro prototipo de la versión 1"
+ ],
+ "afterMarkdowns": [
+ "¡Ahí está! Bastante simple. Nombramos al tag `v1` y referenciamos explícitamente al commit `C1`. Si no especificas el commit, git va a usar al apuntado por `HEAD`"
+ ],
+ "command": "git tag v1 C1",
+ "beforeCommand": "git commit"
+ }
+ },
+ {
+ "type": "ModalAlert",
+ "options": {
+ "markdowns": [
+ "Para este nivel, simplemente crea los tags en la visualización final y después haz checkout con `v1`. Observa cómo entras en el estado detached -- esto es porque no puedes hacer commit directamente sobre el tag `v1`.",
+ "",
+ "En el próximo nivel vamos a examinar un caso de uso más interesante para los tags."
+ ]
+ }
+ }
+ ]
+ },
"pt_BR": {
"childViews": [
{
From 257bb1c0c2a19dee22216c14139fb55803972446 Mon Sep 17 00:00:00 2001
From: flyingbot91
Date: Thu, 12 Dec 2019 22:30:05 +0100
Subject: [PATCH 140/359] Translated index.js to Spanish 'es_ES'
---
src/levels/index.js | 14 ++++++++++++++
1 file changed, 14 insertions(+)
diff --git a/src/levels/index.js b/src/levels/index.js
index 5d343e2a..af4eebe1 100644
--- a/src/levels/index.js
+++ b/src/levels/index.js
@@ -59,6 +59,7 @@ var sequenceInfo = exports.sequenceInfo = {
'ja' : 'まずはここから',
'fr_FR': 'Séquence d\'introduction',
'es_AR': 'Secuencia introductoria',
+ 'es_ES': 'Secuencia introductoria',
'pt_BR': 'Sequência introdutória',
'gl' : 'Secuencia introductoria',
'zh_CN': '基础篇',
@@ -73,6 +74,7 @@ var sequenceInfo = exports.sequenceInfo = {
'ja' : 'gitの基本的なコマンド群をほどよいペースで学ぶ',
'fr_FR': 'Une introduction en douceur à la majorité des commandes git',
'es_AR': 'Una breve introducción a la mayoría de los comandos de git',
+ 'es_ES': 'Una breve introducción a la mayoría de los comandos de git',
'pt_BR': 'Uma breve introdução à maioria dos comandos do git',
'gl' : 'Unha breve introducción á maioría dos comandos de git',
'zh_CN': '循序渐进地介绍 Git 主要命令',
@@ -89,6 +91,7 @@ var sequenceInfo = exports.sequenceInfo = {
'ja' : '次のレベルに進もう',
'fr_FR': 'Montée en puissance',
'es_AR': 'Acelerando',
+ 'es_ES': 'Acelerando',
'pt_BR': 'Acelerando',
'gl' : 'Alixeirando',
'zh_CN': '高级篇',
@@ -103,6 +106,7 @@ var sequenceInfo = exports.sequenceInfo = {
'ja' : '更にgitの素晴らしさを堪能しよう',
'fr_FR': 'Le prochain excellent plat de pur git. J\'espère que vous êtes affamés',
'es_AR': 'La próxima porción de 100% maravillas git. Espero que estés hambriento',
+ 'es_ES': 'La próxima ración de git. Espero que estés hambriento',
'pt_BR': 'A próxima porção de maravilhas do git. Faminto?',
'gl' : 'A próxima porción das marabillas de git. Agardo que estés esfameado',
'zh_CN': '要开始介绍 Git 的超棒特性了,快来吧!',
@@ -120,6 +124,7 @@ var sequenceInfo = exports.sequenceInfo = {
'ja' : 'Push及びPullコマンド -- Gitリモート',
'fr_FR': 'Push & Pull -- dépôts gits distants !',
'es_AR': 'Push & Pull -- Git Remotes!',
+ 'es_ES': 'Push y Pull -- Git Remotes!',
'pt_BR': 'Push & Pull -- repositórios remotos no Git!',
'gl' : 'Push & Pull -- Repositorios remotos no Git!',
'zh_CN': 'Push & Pull —— Git 远程仓库!',
@@ -134,6 +139,7 @@ var sequenceInfo = exports.sequenceInfo = {
'ja' : '自分のコードをより広く公開しましょう',
'de_DE': 'Zeit Eure 1en und 0en zu teilen; Coding mit sozialer Komponente',
'es_AR': 'Hora de compartir sus 1\'s y 0\'s, chicos; programar se volvió social!',
+ 'es_ES': 'Hora de compartir vuestros 1\'s y 0\'s, chicos; programar se volvió social!',
'pt_BR': 'Hora de compartilhar seus 1\'s e 0\'s, crianças; programar agora é social!',
'gl' : 'Hora de compartilos seus 1\' e 0\'s, rapaces; programar agora é social!',
'zh_CN': '是时候分享你的代码了,让编码变得社交化吧',
@@ -151,6 +157,7 @@ var sequenceInfo = exports.sequenceInfo = {
'ja' : '"origin"とその先へ -- Gitリモート上級編',
'fr_FR': 'Vers l\'infini et au-delà -- dépôts distants version avancée',
'es_AR': 'Hasta el origin y más allá -- Git Remotes avanzado!',
+ 'es_ES': 'Hasta el origen y más allá -- Git Remotes avanzado!',
'pt_BR': 'Até a origin e além -- repositórios remotos avançados!',
'gl' : 'Ata á orixe e máis aló -- repositorios remotos avanzados!',
'zh_CN': '关于 origin 和它的周边 —— Git 远程仓库高级操作',
@@ -164,6 +171,7 @@ var sequenceInfo = exports.sequenceInfo = {
'fr_FR': 'Et vous pensiez qu\'être un dictateur bienfaisant serait amusant...',
'ja' : '絶えず上級者の仕事は存在する。。。',
'es_AR': 'Y pensabas que ser un dictador benévolo sería divertido...',
+ 'es_ES': 'Y pensabas que ser un dictador benévolo sería divertido...',
'pt_BR': 'E você achava que ser um déspota esclarecido seria mais divertido...',
'gl' : 'E pensabas que ser un dictador benévolo sería divertido...',
'zh_CN': '做一名仁慈的独裁者一定会很有趣……',
@@ -180,6 +188,7 @@ var sequenceInfo = exports.sequenceInfo = {
'de_DE': 'Code Umherschieben',
'fr_FR': 'Déplacer le travail',
'es_AR': 'Moviendo el trabajo por ahí',
+ 'es_ES': 'Moviendo el trabajo por ahí',
'pt_BR': 'Movendo trabalho por aí',
'gl' : 'Movendo o traballo por ahí',
'ja' : 'コードの移動',
@@ -194,6 +203,7 @@ var sequenceInfo = exports.sequenceInfo = {
'de_DE': 'Gewöhn dich daran, den Git-Baum zu verändern',
'fr_FR': 'Soyez à l\'aise pour modifier l\'arbre Git',
'es_AR': 'Ponete cómodo con modificar el directorio fuente',
+ 'es_ES': 'Ponte cómodo cuando modifiques el directorio fuente',
'pt_BR': 'Fique confortável em modificar a árvore de códigos',
'gl' : 'Ponte cómodo modificando a árbore de git',
'ko' : '작업 트리를 수정하는건 식은죽 먹기지요 이제',
@@ -211,6 +221,7 @@ var sequenceInfo = exports.sequenceInfo = {
'ja' : '様々なtips',
'fr_FR': 'Un assortiment',
'es_AR': 'Bolsa de gatos',
+ 'es_ES': 'Un poco de todo',
'pt_BR': 'Sortidos',
'gl' : 'Todo mesturado',
'ko' : '종합선물세트',
@@ -225,6 +236,7 @@ var sequenceInfo = exports.sequenceInfo = {
'ja' : 'gitを使う上での様々なtipsやテクニックなど',
'fr_FR': 'Un assortiment de techniques et astuces pour utiliser Git',
'es_AR': 'Un rejunte de técnicas, trucos y tips sobre Git',
+ 'es_ES': 'Un batiburrillo de técnicas, trucos y sugerencias sobre Git',
'pt_BR': 'Técnicas, truques e dicas sortidas sobre Git',
'gl' : 'Mestura de técnicas, trucos e consellos',
'ko' : 'Git을 다루는 다양한 팁과 테크닉을 다양하게 알아봅니다',
@@ -241,6 +253,7 @@ var sequenceInfo = exports.sequenceInfo = {
'ja' : '上級トピック',
'fr_FR': 'Sujets avancés',
'es_AR': 'Temas avanzados',
+ 'es_ES': 'Temas avanzados',
'pt_BR': 'Temas avançados',
'gl' : 'Temas avanzados',
'zh_CN': '高级话题',
@@ -255,6 +268,7 @@ var sequenceInfo = exports.sequenceInfo = {
'ja' : '勇気ある人のみ!',
'fr_FR': 'Pour les plus courageux !',
'es_AR': '¡Para los verdaderos valientes!',
+ 'es_ES': '¡Para los verdaderos valientes!',
'pt_BR': 'Para os verdadeiros valentes!',
'gl' : '¡Para os verdadeiros valerosos!',
'zh_CN': '只为真正的勇士!',
From 2dab4adf69e8234a85c95747c28d8c83a82c87cf Mon Sep 17 00:00:00 2001
From: flyingbot91
Date: Thu, 12 Dec 2019 22:50:38 +0100
Subject: [PATCH 141/359] Translated 'rampup' levels to Spanish 'es_ES'
---
src/levels/rampup/cherryPick.js | 59 +++++++++++++++++++
src/levels/rampup/detachedHead.js | 80 ++++++++++++++++++++++++++
src/levels/rampup/interactiveRebase.js | 67 +++++++++++++++++++++
src/levels/rampup/relativeRefs.js | 77 +++++++++++++++++++++++++
src/levels/rampup/relativeRefs2.js | 71 +++++++++++++++++++++++
src/levels/rampup/reversingChanges.js | 65 +++++++++++++++++++++
6 files changed, 419 insertions(+)
diff --git a/src/levels/rampup/cherryPick.js b/src/levels/rampup/cherryPick.js
index 41f1bad7..c146eb73 100644
--- a/src/levels/rampup/cherryPick.js
+++ b/src/levels/rampup/cherryPick.js
@@ -12,6 +12,7 @@ exports.level = {
"de_DE": "Einführung Cherry-picking",
"ja" : "cherry-pick入門",
"es_AR": "Introducción a cherry-pick",
+ "es_ES": "Introducción a cherry-pick",
"pt_BR": "Introdução ao cherry-pick",
"gl" : "Introuducción a cherry-pick",
"zh_CN": "Git Cherry-pick",
@@ -26,6 +27,7 @@ exports.level = {
"de_DE": "git cherry-pick gefolgt von Commit-Namen.",
"ja" : "git cherry-pickの後にコミット名を追加",
"es_AR": "git cherry-pick seguido de los nombres de los commits",
+ "es_ES": "git cherry-pick seguido de los nombres de los commits",
"pt_BR": "git cherry-pick seguido dos nomes dos commits",
"gl" : "git cherry-pick seguido das referencias a commits",
"zh_CN": "git cherry-pick 后面要跟提交的名字",
@@ -206,6 +208,63 @@ exports.level = {
}
]
},
+ "es_ES": {
+ "childViews": [
+ {
+ "type": "ModalAlert",
+ "options": {
+ "markdowns": [
+ "## Moviendo el trabajo por ahí",
+ "",
+ "Hasta ahora cubrimos lo básico de git -- hacer commits, crear ramas, y movernos por el árbol de commits. Estos conceptos alcanzan para aprovechar el 90% del poder de los repositorios de git y cubrir las necesidades principales de los desarrolladores.",
+ "",
+ "El 10% restante, sin embargo, puede ser bastante útil en flujos de trabajo complejos (o cuando te metiste en algún problema complicado). El próximo concepto que vamos a cubrir es el de \"mover el trabajo por ahí\" -- en otras palabras, una forma que tienen los desarrolladores de decir \"Quiero este trabajo aquí y este otro allí\" de una manera precisa, elocuente y flexible.",
+ "",
+ "Puede parecer un montón, pero es un concepto bastante simple."
+ ]
+ }
+ },
+ {
+ "type": "ModalAlert",
+ "options": {
+ "markdowns": [
+ "## Git Cherry-pick",
+ "",
+ "El primer comando en esta serie se llama `git cherry-pick`. Tiene la siguiente forma:",
+ "",
+ " `git cherry-pick <...>`",
+ "",
+ "Es una manera bastante directa de decir que quieres copiar una serie de commits sobre tu ubicación actual (`HEAD`). Personalmente amo `cherry-pick` porque hay muy poca magia involucrada y es bastante simple de entender.",
+ "",
+ "¡Veamos una demo!",
+ ""
+ ]
+ }
+ },
+ {
+ "type": "GitDemonstrationView",
+ "options": {
+ "beforeMarkdowns": [
+ "A continuación tenemos un repositorio con algo de trabajo en la rama `side` que queremos copiar a `master`. Podríamos lograrlo con un rebase (y ya aprendimos cómo), pero veamos cómo se comporta cherry-pick."
+ ],
+ "afterMarkdowns": [
+ "¡Eso es todo! Queríamos los commits `C2` y `C4` y git los aplicó justo donde estábamos. ¡Tan simple como eso!"
+ ],
+ "command": "git cherry-pick C2 C4",
+ "beforeCommand": "git checkout -b side; git commit; git commit; git commit; git checkout master; git commit;"
+ }
+ },
+ {
+ "type": "ModalAlert",
+ "options": {
+ "markdowns": [
+ "Para completar este nivel, simplemente copia algo de trabajo desde otras tres ramas a master. Puedes ver qué commits queremos en la visualización del objetivo.",
+ ""
+ ]
+ }
+ }
+ ]
+ },
"pt_BR": {
"childViews": [
{
diff --git a/src/levels/rampup/detachedHead.js b/src/levels/rampup/detachedHead.js
index 14c30287..9e372678 100644
--- a/src/levels/rampup/detachedHead.js
+++ b/src/levels/rampup/detachedHead.js
@@ -5,6 +5,7 @@ exports.level = {
"name": {
"en_US": "Detach yo' HEAD",
"es_AR": "Desatacheá tu HEAD",
+ "es_ES": "Desatachea tu HEAD",
"pt_BR": "Solte a sua cabeça",
"gl" : "Abandona o teu HEAD",
"fr_FR": "Détacher votre HEAD",
@@ -19,6 +20,7 @@ exports.level = {
"hint": {
"en_US": "Use the label (hash) on the commit for help!",
"es_AR": "¡Usá la etiqueta (hash) sobre el commit para ayudarte!",
+ "es_ES": "¡Usa la etiqueta (hash) sobre el commit para ayudarte!",
"pt_BR": "Use o identificador (hash) sobre o commit para te ajudar!",
"gl" : "¡Usa a etiqueta (hash) sobre o commit para axudarte!",
"de_DE": "Benutze den Bezeichner (den Hash) des Commits.",
@@ -187,6 +189,84 @@ exports.level = {
}
]
},
+ "es_ES": {
+ "childViews": [
+ {
+ "type": "ModalAlert",
+ "options": {
+ "markdowns": [
+ "## Moviéndote por ahí con Git",
+ "",
+ "Antes de meternos en algunas de las funcionalidades más avanzadas de git, es importante entender las distintas maneras de moverse por el árbol de commits que representa tu proyecto.",
+ "",
+ "Una vez que estés cómodo moviendote por ahí, tus poderes con los otros comandos de git ¡van a amplificarse!",
+ "",
+ "",
+ "",
+ "",
+ ""
+ ]
+ }
+ },
+ {
+ "type": "ModalAlert",
+ "options": {
+ "markdowns": [
+ "## HEAD",
+ "",
+ "Primero tenemos que hablar de \"HEAD\". HEAD es el nombre simbólico del commit sobre el que hemos hecho checkout -- es, básicamente, el commit sobre el que estás trabajando.",
+ "",
+ "HEAD siempre apunta al commit más reciente, reflejado en el árbol de commits. La mayoría de los comandos de git que hacen cambios al árbol de commits empiezan modificando HEAD.",
+ "",
+ "Normalmente HEAD apunta al nombre de una rama (como bugFix). Cuando creas un commit, el estado de bugFix se altera y este cambio es visible a través de HEAD."
+ ]
+ }
+ },
+ {
+ "type": "GitDemonstrationView",
+ "options": {
+ "beforeMarkdowns": [
+ "Veámoslo en acción. A continuación vamos a ver a HEAD antes y después de un commit."
+ ],
+ "afterMarkdowns": [
+ "¡Ves! HEAD estuvo oculta bajo nuestra rama `master` todo este tiempo."
+ ],
+ "command": "git checkout C1; git checkout master; git commit; git checkout C2",
+ "beforeCommand": ""
+ }
+ },
+ {
+ "type": "GitDemonstrationView",
+ "options": {
+ "beforeMarkdowns": [
+ "### Detacheando HEAD",
+ "",
+ "Detachear (_des-adjuntar_) HEAD simplemente significa adjuntarla a un commit en lugar de a un branch. Así es como se ve de antemano:",
+ "",
+ "HEAD -> master -> C1",
+ ""
+ ],
+ "afterMarkdowns": [
+ "Y así queda ahora:",
+ "",
+ "HEAD -> C1"
+ ],
+ "command": "git checkout C1",
+ "beforeCommand": ""
+ }
+ },
+ {
+ "type": "ModalAlert",
+ "options": {
+ "markdowns": [
+ "Para completar este nivel, detaheemos HEAD de `bugFix` y atacheemosla al commit, en cambio.",
+ "",
+ "Especifica este commit por su hash. El hash de cada commit se muestra en el círculo que lo representa."
+ ]
+ }
+ }
+ ]
+ },
"pt_BR": {
"childViews": [
{
diff --git a/src/levels/rampup/interactiveRebase.js b/src/levels/rampup/interactiveRebase.js
index 39ceeeb8..74ba4a17 100644
--- a/src/levels/rampup/interactiveRebase.js
+++ b/src/levels/rampup/interactiveRebase.js
@@ -9,6 +9,7 @@ exports.level = {
"hint": {
"en_US": "you can use either branches or relative refs (HEAD~) to specify the rebase target",
"es_AR": "podés usar tanto ramas como referencias relativas (HEAD~) para especificar el objetivo del rebase",
+ "es_ES": "puedes usar tanto ramas como referencias relativas (HEAD~) para especificar el objetivo del rebase",
"pt_BR": "Você pode usar ou ramos ou referências relativas (HEAD~) para especificar o alvo do rebase",
"gl" : "Podes usar ramas ou referencias relativas (HEAD~) para especificar o obxectivo do rebase",
"de_DE": "Du kannst entweder Branches oder relative Ref-Angaben (z.B. HEAD~) benutzen, um das Ziel des Rebase anzugeben.",
@@ -23,6 +24,7 @@ exports.level = {
"name": {
"en_US": "Interactive Rebase Intro",
"es_AR": "Introducción al rebase interactivo",
+ "es_ES": "Introducción al rebase interactivo",
"pt_BR": "Introdução ao rebase interativo",
"gl" : "Introducción ó rebase interativo",
"de_DE": "Einführung Interactive Rebase",
@@ -360,6 +362,71 @@ exports.level = {
}
]
},
+ "es_ES": {
+ "childViews": [
+ {
+ "type": "ModalAlert",
+ "options": {
+ "markdowns": [
+ "## git rebase interactivo",
+ "",
+ "git cherry-pick es genial cuando sabes qué commits quieres (_y_ sabes sus hashes) -- es dificil superar la simpleza que provee.",
+ "",
+ "Pero ¿qué pasa cuando no sabes qué commits quieres? Por suerte ¡git te cubre en esta situación, también! Podemos usar el rebase interactivo para esto -- es la mejor manera de revisar una serie de commits que estás a punto de rebasear.",
+ "",
+ "Entremos en los detalles..."
+ ]
+ }
+ },
+ {
+ "type": "ModalAlert",
+ "options": {
+ "markdowns": [
+ "Todo rebase interactivo significa usar el comando `rebase` con la opción `-i`.",
+ "",
+ "Si incluyes esta opción, git abrirá una UI para mostrarte qué commits están a punto de ser copiados sobre el objetivo del rebase. También muestra sus hashes y mensajes, que ayuda mucho para saber qué es cada commit.",
+ "",
+ "Para el git \"de verdad\", la UI signfica abrir un archivo en un editor de textos como `vim`. Para nuestro propósito, hice una pequeña interfaz que se comporta de ese mismo modo."
+ ]
+ }
+ },
+ {
+ "type": "ModalAlert",
+ "options": {
+ "markdowns": [
+ "Cuando el diálogo de rebase interactivo se abre, tienes la capacidad de hacer 3 cosas:",
+ "",
+ "* Puedes reordenar los commits con solamente cambiar su orden en la UI (en nuestra ventana, eso significa hacer drag & drop con el mouse).",
+ "* Puedes elegir ignorar completamente algunos commits. Esto se designa con `pick` -- no hacerle `pick` a algún commit significa que quieres ignorarlo.",
+ "* Finalmente, puedes _squashear_ commits. Desafortunadamente, nuestros niveles no soportan esto por cuestiones logísticas, por lo que voy a ahorrarte los detalles. Resumiendo, te permite combinar varios commits en uno solo.",
+ "",
+ "¡Genial! Veamos un ejemplo."
+ ]
+ }
+ },
+ {
+ "type": "GitDemonstrationView",
+ "options": {
+ "beforeMarkdowns": [
+ "Cuando aprietes el botón, va a aparecer una ventana de rebase interactivo. Reordena los commits (siéntete libre de ignorar alguno, también) ¡y observa el resultado!"
+ ],
+ "afterMarkdowns": [
+ "¡Zas! Git copió los commits exactamente de la misma manera que lo especificaste en la UI"
+ ],
+ "command": "git rebase -i HEAD~4 --aboveAll",
+ "beforeCommand": "git commit; git commit; git commit; git commit"
+ }
+ },
+ {
+ "type": "ModalAlert",
+ "options": {
+ "markdowns": [
+ "Para completar el nivel, haz un rebase interactivo y alcanza el orden que se muestra en la visualización objetivo. Recuerda que siempre puedes hacer `undo` y `reset` para arreglar errores :D"
+ ]
+ }
+ }
+ ]
+ },
"pt_BR": {
"childViews": [
{
diff --git a/src/levels/rampup/relativeRefs.js b/src/levels/rampup/relativeRefs.js
index 0a8b3da8..f075f70e 100644
--- a/src/levels/rampup/relativeRefs.js
+++ b/src/levels/rampup/relativeRefs.js
@@ -9,6 +9,7 @@ exports.level = {
"zh_CN": "相对引用(^)",
"zh_TW": "相對引用(^)",
"es_AR": "Referencias relativas (^)",
+ "es_ES": "Referencias relativas (^)",
"pt_BR": "Referências relativas (^)",
"gl" : "Referencias relativas (^)",
"de_DE": "Relative Referenzen (^)",
@@ -22,6 +23,7 @@ exports.level = {
"ja" : "相対リファレンス(^)を思い出して!",
"de_DE": "Denk an den Dach-Operator (^)!",
"es_AR": "¡No te olvides del operador ^!",
+ "es_ES": "¡No te olvides del operador ^!",
"pt_BR": "Não se esqueça do operador circunflexo (^)",
"gl" : "Non se esqueza do operador circunflexo (^)",
"zh_CN": "记住操作符(^)!",
@@ -331,6 +333,81 @@ exports.level = {
}
]
},
+ "es_ES": {
+ "childViews": [
+ {
+ "type": "ModalAlert",
+ "options": {
+ "markdowns": [
+ "## Referencias relativas",
+ "",
+ "Moverse por git usando los hashes de los commits puede volverse un tanto tedioso. En el mundo real no vas a tener una visualización de commits tan linda en la terminal, así que vas a tener que usar `git log` para ver los hashes.",
+ "",
+ "Peor aún, los hashes en general son mucho más largos en el git real, también. Por ejemplo, el hash del commit que introduje en el nivel anterior es `fed2da64c0efc5293610bdd892f82a58e8cbc5d8`. No es algo particularmente fácil de nombrar...",
+ "",
+ "Lo interesante es que git es bastante astuto con los hashes. Sólo requiere que especifiques una cantidad de caracteres suficientes para identificar unívocamente al commit. Entonces, yo podría simplemente tipear `fed2` en lugar de esa cadena larga de arriba."
+ ]
+ }
+ },
+ {
+ "type": "ModalAlert",
+ "options": {
+ "markdowns": [
+ "Como ya dije, especificar los commits por su hash no es la manera más conveniente, y por eso git tiene referencias relativas. ¡Son geniales!",
+ "",
+ "Con las referencias relativas puedes arrancar de algún lugar recordable (como la rama `bugFix`, o `HEAD`) y trabajar desde ahí.",
+ "",
+ "Los commits relativos son poderosos, pero ahora vamos a presentar sólo dos formas simples:",
+ "",
+ "* Moverse un commit hacia atrás con `^`",
+ "* Moverse una cantidad de commits hacia atrás con `~`"
+ ]
+ }
+ },
+ {
+ "type": "GitDemonstrationView",
+ "options": {
+ "beforeMarkdowns": [
+ "Veamos el operador ^ primero. Cada vez que le agregas eso al nombre de una referencia, le estás diciendo a git que use el padre del commit especificado.",
+ "",
+ "Entonces, decir `master^` es equivalente a \"el primer padre de `master`\".",
+ "",
+ "`master^^` es el _abuelo_ (segunda generación de ancestros) de `master`",
+ "",
+ "Veamos el commit que está antes de master aquí"
+ ],
+ "afterMarkdowns": [
+ "¡Zas! Ahí está. Mucho más simple que escribir el hash de ese commit"
+ ],
+ "command": "git checkout master^",
+ "beforeCommand": "git commit"
+ }
+ },
+ {
+ "type": "GitDemonstrationView",
+ "options": {
+ "beforeMarkdowns": [
+ "También puedes referenciar a `HEAD` como una referencia relativa. Usémoslo un par de veces para movernos hacia atrás en nuestro árbol"
+ ],
+ "afterMarkdowns": [
+ "¡Fácil! Podemos volver en el tiempo con `HEAD^`"
+ ],
+ "command": "git checkout C3; git checkout HEAD^; git checkout HEAD^; git checkout HEAD^",
+ "beforeCommand": "git commit; git commit"
+ }
+ },
+ {
+ "type": "ModalAlert",
+ "options": {
+ "markdowns": [
+ "Para completar este nivel, haz checkout sobre el padre del commit de `bugFix`. Esto va a detachear a `HEAD`.",
+ "",
+ "Puedes especificar el hash si quieres, pero mejor ¡trata de usar la referencia relativa!"
+ ]
+ }
+ }
+ ]
+ },
"pt_BR": {
"childViews": [
{
diff --git a/src/levels/rampup/relativeRefs2.js b/src/levels/rampup/relativeRefs2.js
index 4d269a8c..96396bfe 100644
--- a/src/levels/rampup/relativeRefs2.js
+++ b/src/levels/rampup/relativeRefs2.js
@@ -8,6 +8,7 @@ exports.level = {
"zh_CN": "这一关至少要用到一次直接引用 (即哈希值)",
"zh_TW": "這一關至少要用到一次直接參考(hash)",
"es_AR": "Vas a necesitar usar al menos una referencia directa (hash) para completar este nivel",
+ "es_ES": "Vas a necesitar usar al menos una referencia directa (hash) para completar este nivel",
"pt_BR": "Você precisará usar pelo menos uma referência direta (hash) para completar este nível",
"gl" : "Precisarás usar polo menos unha referencia directa (hash) para completar este nivel",
"de_DE": "Du musst mindestens einen Hash benutzen, um dieses Level zu schaffen",
@@ -21,6 +22,7 @@ exports.level = {
"de_DE": "Relative Referenzen #2 (~)",
"ja" : "相対リファレンス その2 (~)",
"es_AR": "Referencias relativas #2 (~)",
+ "es_ES": "Referencias relativas #2 (~)",
"pt_BR": "Referências relativas #2 (~)",
"gl" : "Referencias relativas #2 (~)",
"fr_FR": "Références relatives #2 (~)",
@@ -169,6 +171,75 @@ exports.level = {
}
]
},
+ "es_ES": {
+ "childViews": [
+ {
+ "type": "ModalAlert",
+ "options": {
+ "markdowns": [
+ "### El operador \"~\"",
+ "",
+ "Digamos que quieres moverte un montón de niveles atrás en tu árbol de commits. Podría ser tedioso escribir `^` muchas veces, por lo que git tiene el operador ~.",
+ "",
+ "",
+ "El operador ~ (opcionalmente) toma una cantidad que especifica la cantidad de padres que quieres volver hacia atrás. Veámoslo en acción"
+ ]
+ }
+ },
+ {
+ "type": "GitDemonstrationView",
+ "options": {
+ "beforeMarkdowns": [
+ "Especifiquemos una cantidad de commits hacia atrás con `~`."
+ ],
+ "afterMarkdowns": [
+ "¡Zas! Bien conciso -- las referencias relativas la rompen."
+ ],
+ "command": "git checkout HEAD~4",
+ "beforeCommand": "git commit; git commit; git commit"
+ }
+ },
+ {
+ "type": "ModalAlert",
+ "options": {
+ "markdowns": [
+ "### Forzando las ramas",
+ "",
+ "Ahora que eres un experto en las referencias relativas, *usémoslas* para algo.",
+ "",
+ "Una de las formas más comunes en que uso las referencias relativas es para mover las ramas. Puedes reasignar directamente una rama a un commit usando la opción `-f`. Algo así como:",
+ "",
+ "`git branch -f master HEAD~3`",
+ "",
+ "Mueve (forzadamente) la rama master tres padres por detrás de HEAD."
+ ]
+ }
+ },
+ {
+ "type": "GitDemonstrationView",
+ "options": {
+ "beforeMarkdowns": [
+ "Veamos ese comando previo en acción"
+ ],
+ "afterMarkdowns": [
+ "¡Allá vamos! Las referencias relativas nos proporcionaron una manera concisa de referenciar a `C1`, y forzar la rama (`-f`) nos dio una manera rápida de mover la rama a esa ubicación"
+ ],
+ "command": "git branch -f master HEAD~3",
+ "beforeCommand": "git commit; git commit; git commit; git checkout -b bugFix"
+ }
+ },
+ {
+ "type": "ModalAlert",
+ "options": {
+ "markdowns": [
+ "Ahora que viste las referencias relativas y el forzar ramas combinados, usémoslos para resolver el siguiente nivel.",
+ "",
+ "Para completar este nivel, mueve `HEAD`, `master` y `bugFix` a sus destinos finales."
+ ]
+ }
+ }
+ ]
+ },
"pt_BR": {
"childViews": [
{
diff --git a/src/levels/rampup/reversingChanges.js b/src/levels/rampup/reversingChanges.js
index b1c8f926..0cedd55b 100644
--- a/src/levels/rampup/reversingChanges.js
+++ b/src/levels/rampup/reversingChanges.js
@@ -9,6 +9,7 @@ exports.level = {
"ja" : "変更を元に戻す",
"fr_FR": "Annuler des changements avec Git",
"es_AR": "Revirtiendo cambios en git",
+ "es_ES": "Revirtiendo cambios en git",
"pt_BR": "Revertendo mudanças no Git",
"gl" : "Revertindo cambios en git",
"ko" : "Git에서 작업 되돌리기",
@@ -22,6 +23,7 @@ exports.level = {
"de_DE": "Beachte, dass revert und reset unterschiedliche Argumente benötigen",
"fr_FR": "Notez que `revert` et `reset` n'ont pas les mêmes arguments.",
"es_AR": "Notá que revert y reset toman parámetros distintos",
+ "es_ES": "Observa que revert y reset utilizan parámetros distintos",
"pt_BR": "Lembre que revert e reset recebem parâmetros diferentes",
"gl" : "Lembra que revert e reset usan parámetros distintos",
"zh_CN": "注意 revert 和 reset 使用的参数不同。",
@@ -158,6 +160,69 @@ exports.level = {
}
]
},
+ "es_ES": {
+ "childViews": [
+ {
+ "type": "ModalAlert",
+ "options": {
+ "markdowns": [
+ "## Revirtiendo cambios en git",
+ "",
+ "Hay varias maneras de revertir cambios en git. Y, tal como al commitear, revertir cambios en git tiene tanto un componente de bajo nivel (indexar archivos o fragmentos individualmente) como un componente de alto nivel (cómo son efectivamente revertidos los cambios). Nuestra aplicación se va a concentrar en esto último.",
+ "",
+ "Hay dos formas principales de deshacer cambios en git -- uno es usando `git reset` y el otro es usando `git revert`. Vamos a ver cada uno de ellos a continuación",
+ ""
+ ]
+ }
+ },
+ {
+ "type": "GitDemonstrationView",
+ "options": {
+ "beforeMarkdowns": [
+ "## Git Reset",
+ "",
+ "`git reset` deshace los cambios moviendo la referencia de una rama hacia atrás en el tiempo a un commit anterior. En este sentido puedes imaginarlo como \"reescribir la historia\". `git reset` va a mover la rama hacia atrás, como si el commit nunca se hubiera hecho.",
+ "",
+ "Veamos cómo es eso:"
+ ],
+ "afterMarkdowns": [
+ "¡Genial! git simplemente movió la referencia de la rama master atrás hacia `C1`. Ahora tu repositorio local está en un estado como si `C2` nunca hubiera ocurrido"
+ ],
+ "command": "git reset HEAD~1",
+ "beforeCommand": "git commit"
+ }
+ },
+ {
+ "type": "GitDemonstrationView",
+ "options": {
+ "beforeMarkdowns": [
+ "## Git Revert",
+ "",
+ "Mientras que resetear los cambios funciona estupendamente para ramas locales en tu máquina, su método de \"reescribir la historia\" no funciona para ramas remotas que otros están usando.",
+ "",
+ "Para revertir cambios y *compartir* esa _revertida_ con otros, necesitamos usar `git revert`. Veámoslo en acción"
+ ],
+ "afterMarkdowns": [
+ "Extraño. Hay un nuevo commit aplicado sobre el que queríamos revertir. Eso es porque este nuevo commit `C2'` introduce *cambios* - sólo que esos cambios son exactamente los necesarios para revertir los que introdujo `C2`.",
+ "",
+ "Cuando utilices revert, puedes hacer push sobre ese cambio para compartirlo con otros."
+ ],
+ "command": "git revert HEAD",
+ "beforeCommand": "git commit"
+ }
+ },
+ {
+ "type": "ModalAlert",
+ "options": {
+ "markdowns": [
+ "Para completar este nivel, deshaz los dos commits más recientes, tanto en `local` como en `pushed`.",
+ "",
+ "Ten en cuenta que `pushed` es una rama remota y `local` es una rama local -- eso debería ayudarte a elegir qué métodos usar."
+ ]
+ }
+ }
+ ]
+ },
"pt_BR": {
"childViews": [
{
From 159cf8dce2017a9c36e8dddfc512e144e63760b9 Mon Sep 17 00:00:00 2001
From: flyingbot91
Date: Thu, 12 Dec 2019 22:58:06 +0100
Subject: [PATCH 142/359] Translated 'rebase' levels to Spanish 'es_ES'
---
src/levels/rebase/manyRebases.js | 20 ++++++++++++++++++++
src/levels/rebase/selectiveRebase.js | 22 ++++++++++++++++++++++
2 files changed, 42 insertions(+)
diff --git a/src/levels/rebase/manyRebases.js b/src/levels/rebase/manyRebases.js
index 6da53c7b..e3c6d939 100644
--- a/src/levels/rebase/manyRebases.js
+++ b/src/levels/rebase/manyRebases.js
@@ -11,6 +11,7 @@ exports.level = {
"en_US": "Rebasing over 9000 times",
"de_DE": "10000 Rebases unter dem `HEAD`",
"es_AR": "Rebaseando más de 9000 veces",
+ "es_ES": "Rebaseando más de 9000 veces",
"pt_BR": "Fazendo mais de 9000 rebases",
"gl" : "Facendo máis de 9000 rebases",
"fr_FR": "Rebaser plus de 1000 fois",
@@ -25,6 +26,7 @@ exports.level = {
"en_US": "Remember, the most efficient way might be to only update master at the end...",
"de_DE": "Nicht vergessen: die effizienteste Möglichkeit könnte sein, schließlich einfach nur den master zu aktualisieren ...",
"es_AR": "Acordate, la manera más eficiente podría ser actualizar master sólo al final...",
+ "es_ES": "Recuerda, la manera más eficiente podría ser actualizar master sólo al final...",
"pt_BR": "Lembre-se, a forma mais eficiente pode ser atualizar o master por último...",
"gl" : "Lembra, a forma máis eficiente pode ser actualizar a rama master ó final...",
"fr_FR": "Rappelez-vous, la façon la plus efficace peut être de mettre à jour master seulement à la fin ...",
@@ -72,6 +74,24 @@ exports.level = {
}
]
},
+ "es_ES": {
+ "childViews": [
+ {
+ "type": "ModalAlert",
+ "options": {
+ "markdowns": [
+ "### Rebaseando múltiples ramas",
+ "",
+ "Fíjate, ¡hay un montón de ramas aquí! Rebaseemos todo el trabajo de esas ramas sobre master.",
+ "",
+ "La gente de administración nos está haciendo las cosas un poco complicadas, igual -- quieren que nuestros commits estén todos en orden secuencial. Esto significa que nuestro árbol final tendría que tener `C7` al final, `C6` antes de ese, y así siguiendo, todos en orden.",
+ "",
+ "Si te haces un lío durante el proceso, siéntete libre de usar `reset` para empezar de nuevo. ¡Asegúrate de verificar tu solución y ver si puedes realizarla en un número inferior de commandos!"
+ ]
+ }
+ }
+ ]
+ },
"pt_BR": {
"childViews": [
{
diff --git a/src/levels/rebase/selectiveRebase.js b/src/levels/rebase/selectiveRebase.js
index b38d3ddf..9fb87eed 100644
--- a/src/levels/rebase/selectiveRebase.js
+++ b/src/levels/rebase/selectiveRebase.js
@@ -12,6 +12,7 @@ exports.level = {
"fr_FR": "Branche spaghetti",
"de_DE": "Branch-Spaghetti",
"es_AR": "Enslada de branches",
+ "es_ES": "Ensalada de ramas",
"pt_BR": "Espaguete de ramos",
"gl" : "Espaguete de ramas",
"ja": "ブランチスパゲッティ",
@@ -25,6 +26,7 @@ exports.level = {
"fr_FR": "Faites attention à tout faire dans le bon ordre ! La branche one d'abord, puis la seconde, puis la troisième",
"de_DE": "Stelle sicher, dass du alles in der richtigen Reihenfolge machst! Branche erst one, dann two, dann three.",
"es_AR": "¡Asegurate de hacer las cosas en el orden correcto! Brancheá `one` primero, después `two`, y después `three`.",
+ "es_ES": "¡Asegúrate de hacer las cosas en el orden correcto! Crea primero la rama `one`, después `two`, y después `three`.",
"pt_BR": "Certifique-se de fazer tudo na ordem correta! Crie o ramo `one` primeiro, depois `two`, depois `three`.",
"gl" : "¡Afiánzate de facer as cousas no orde correcto! Crea ramas `one` de primeiras, e logo `two` e `three`.",
"ja": "全て正しい順番で処理すること!oneが最初で、次がtwo、最後にthreeを片付ける。",
@@ -95,6 +97,26 @@ exports.level = {
}
]
},
+ "es_ES": {
+ "childViews": [
+ {
+ "type": "ModalAlert",
+ "options": {
+ "markdowns": [
+ "## Ensalada de ramas",
+ "",
+ "¡Vaya, vaya! Tenemos un _pequeño_ objetivo al que llegar en este nivel.",
+ "",
+ "La rama `master` se encuentra algunos commits por delante de `one`, `two` y `three`. Por alguna razón, necesitamos actualizar esas tres ramas con versiones modificadas de los últimos commits de master.",
+ "",
+ "La rama `one` necesita reordenarse, y eliminar `C5`. `two` necesita sólo reordenamiento, y `three` ¡sólo necesita un commit!",
+ "",
+ "Vamos a dejar que intentes resolver este -- asegúrate de mirar la solución, después, usando `show solution`. "
+ ]
+ }
+ }
+ ]
+ },
"pt_BR": {
"childViews": [
{
From 85caa4a0a1501b8bfd37c6c8c110cf65f5aa7a2c Mon Sep 17 00:00:00 2001
From: flyingbot91
Date: Thu, 12 Dec 2019 23:02:32 +0100
Subject: [PATCH 143/359] es_AR Typos fixed
---
src/levels/index.js | 4 ++--
src/levels/mixed/jugglingCommits.js | 4 ++--
src/levels/rampup/detachedHead.js | 4 ++--
src/levels/rebase/selectiveRebase.js | 2 +-
4 files changed, 7 insertions(+), 7 deletions(-)
diff --git a/src/levels/index.js b/src/levels/index.js
index 5d343e2a..0fd3247e 100644
--- a/src/levels/index.js
+++ b/src/levels/index.js
@@ -119,7 +119,7 @@ var sequenceInfo = exports.sequenceInfo = {
'de_DE': 'Push & Pull -- entfernte Repositorys',
'ja' : 'Push及びPullコマンド -- Gitリモート',
'fr_FR': 'Push & Pull -- dépôts gits distants !',
- 'es_AR': 'Push & Pull -- Git Remotes!',
+ 'es_AR': 'Push y Pull -- Git Remotes!',
'pt_BR': 'Push & Pull -- repositórios remotos no Git!',
'gl' : 'Push & Pull -- Repositorios remotos no Git!',
'zh_CN': 'Push & Pull —— Git 远程仓库!',
@@ -150,7 +150,7 @@ var sequenceInfo = exports.sequenceInfo = {
'de_DE': 'Bis zum origin und noch weiter',
'ja' : '"origin"とその先へ -- Gitリモート上級編',
'fr_FR': 'Vers l\'infini et au-delà -- dépôts distants version avancée',
- 'es_AR': 'Hasta el origin y más allá -- Git Remotes avanzado!',
+ 'es_AR': 'Hasta el origen y más allá -- Git Remotes avanzado!',
'pt_BR': 'Até a origin e além -- repositórios remotos avançados!',
'gl' : 'Ata á orixe e máis aló -- repositorios remotos avanzados!',
'zh_CN': '关于 origin 和它的周边 —— Git 远程仓库高级操作',
diff --git a/src/levels/mixed/jugglingCommits.js b/src/levels/mixed/jugglingCommits.js
index 747a518e..0ecc69f7 100644
--- a/src/levels/mixed/jugglingCommits.js
+++ b/src/levels/mixed/jugglingCommits.js
@@ -123,7 +123,7 @@ exports.level = {
"markdowns": [
"## Haciendo malabares con los commits",
"",
- "Estaes otra situación algo común. Tenés algunos cambios (`newImage`) y otro conjunto de cambios (`caption`) que están relacionados, entonces están apilados en tu repositorio uno encima del otro (es decir, uno después del otro).",
+ "Esta es otra situación algo común. Tenés algunos cambios (`newImage`) y otro conjunto de cambios (`caption`) que están relacionados, entonces están apilados en tu repositorio uno encima del otro (es decir, uno después del otro).",
"",
"El tema es que a veces tenés que hacer una pequeña modificación a un commit previo. En este caso, la gente de diseño requiere que cambiemos ligeramente las dimensiones de `newImage`, ¡incluso aunque ese commit ya esté atrás en nuestra historia!"
]
@@ -138,7 +138,7 @@ exports.level = {
"* Vamos a reordenar los commits para que el que queremos cambiar quede arriba de todo con `git rebase -i`",
"* Vamos a hacer `commit --amend` para aplicar la ligera modificación",
"* Después vamos a reordenar los commits a como estaban con `git rebase -i`",
- "* Finalmente, vamos a mover master a esta parte actualizada de nuestor árbol de commits para terminar el nivel (usando el método que prefieras)",
+ "* Finalmente, vamos a mover master a esta parte actualizada de nuestro árbol de commits para terminar el nivel (usando el método que prefieras)",
"",
"Hay varias maneras de lograr este objetivo en general (ya te veo haciéndole ojitos al cherry-pick), y veremos algunos más después, pero por ahora concentrémonos en esta técnica.",
"",
diff --git a/src/levels/rampup/detachedHead.js b/src/levels/rampup/detachedHead.js
index 14c30287..7459ea1c 100644
--- a/src/levels/rampup/detachedHead.js
+++ b/src/levels/rampup/detachedHead.js
@@ -146,7 +146,7 @@ exports.level = {
"type": "GitDemonstrationView",
"options": {
"beforeMarkdowns": [
- "Veamoslo en acción. Acá vamos a ver a HEAD antes y después de un commit."
+ "Veámoslo en acción. Acá vamos a ver a HEAD antes y después de un commit."
],
"afterMarkdowns": [
"¡Ves! HEAD estuvo oculta bajo nuestra rama `master` todo este tiempo."
@@ -179,7 +179,7 @@ exports.level = {
"type": "ModalAlert",
"options": {
"markdowns": [
- "Para completar este nivel, detacheemos HEAD de `bugFix` y ataccheemosla al commit, en cambio.",
+ "Para completar este nivel, detacheemos HEAD de `bugFix` y atacheemosla al commit, en cambio.",
"",
"Especificá este commit por su hash. El hash de cada commit se muestra en el círculo que lo representa."
]
diff --git a/src/levels/rebase/selectiveRebase.js b/src/levels/rebase/selectiveRebase.js
index b38d3ddf..34375f38 100644
--- a/src/levels/rebase/selectiveRebase.js
+++ b/src/levels/rebase/selectiveRebase.js
@@ -11,7 +11,7 @@ exports.level = {
"en_US": "Branch Spaghetti",
"fr_FR": "Branche spaghetti",
"de_DE": "Branch-Spaghetti",
- "es_AR": "Enslada de branches",
+ "es_AR": "Ensalada de branches",
"pt_BR": "Espaguete de ramos",
"gl" : "Espaguete de ramas",
"ja": "ブランチスパゲッティ",
From 5eb9de500a815460ca1995d33262bb4d7ebf2cdd Mon Sep 17 00:00:00 2001
From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com>
Date: Sat, 14 Dec 2019 02:37:44 +0000
Subject: [PATCH 144/359] Bump mixin-deep from 1.3.1 to 1.3.2
Bumps [mixin-deep](https://github.com/jonschlinkert/mixin-deep) from 1.3.1 to 1.3.2.
- [Release notes](https://github.com/jonschlinkert/mixin-deep/releases)
- [Commits](https://github.com/jonschlinkert/mixin-deep/compare/1.3.1...1.3.2)
Signed-off-by: dependabot[bot]
---
yarn.lock | 6 +++---
1 file changed, 3 insertions(+), 3 deletions(-)
diff --git a/yarn.lock b/yarn.lock
index e0639cbb..5f477b4b 100644
--- a/yarn.lock
+++ b/yarn.lock
@@ -2873,9 +2873,9 @@ minizlib@^1.1.1:
minipass "^2.2.1"
mixin-deep@^1.2.0:
- version "1.3.1"
- resolved "https://registry.yarnpkg.com/mixin-deep/-/mixin-deep-1.3.1.tgz#a49e7268dce1a0d9698e45326c5626df3543d0fe"
- integrity sha512-8ZItLHeEgaqEvd5lYBXfm4EZSFCX29Jb9K+lAHhDKzReKBQKj3R+7NOF6tjqYi9t4oI8VUfaWITJQm86wnXGNQ==
+ version "1.3.2"
+ resolved "https://registry.yarnpkg.com/mixin-deep/-/mixin-deep-1.3.2.tgz#1120b43dc359a785dce65b55b82e257ccf479566"
+ integrity sha512-WRoDn//mXBiJ1H40rqa3vH0toePwSsGb45iInWlTySa+Uu4k3tYUSxa2v1KqAiLtvlrSzaExqS1gtk96A9zvEA==
dependencies:
for-in "^1.0.2"
is-extendable "^1.0.1"
From 4631475b3912717a01f895b1fae58b4c711f832d Mon Sep 17 00:00:00 2001
From: flyingbot91
Date: Wed, 18 Dec 2019 22:41:08 +0100
Subject: [PATCH 145/359] Translated 'remote' levels to Spanish 'es_ES'
---
src/levels/remote/clone.js | 59 ++++++++++
src/levels/remote/fakeTeamwork.js | 56 ++++++++++
src/levels/remote/fetch.js | 75 +++++++++++++
src/levels/remote/fetchArgs.js | 125 +++++++++++++++++++++
src/levels/remote/fetchRebase.js | 145 +++++++++++++++++++++++++
src/levels/remote/mergeManyFeatures.js | 47 ++++++++
src/levels/remote/pull.js | 61 +++++++++++
src/levels/remote/pullArgs.js | 76 +++++++++++++
src/levels/remote/push.js | 43 ++++++++
src/levels/remote/pushArgs.js | 74 +++++++++++++
src/levels/remote/pushArgs2.js | 72 ++++++++++++
src/levels/remote/pushManyFeatures.js | 55 ++++++++++
src/levels/remote/remoteBranches.js | 63 +++++++++++
src/levels/remote/sourceNothing.js | 55 ++++++++++
src/levels/remote/tracking.js | 122 +++++++++++++++++++++
15 files changed, 1128 insertions(+)
diff --git a/src/levels/remote/clone.js b/src/levels/remote/clone.js
index 5ef9ff65..65d8d850 100644
--- a/src/levels/remote/clone.js
+++ b/src/levels/remote/clone.js
@@ -7,6 +7,7 @@ exports.level = {
"de_DE": "Clone Einführung",
"ja" : "Clone入門",
"es_AR": "Introducción a clone",
+ "es_ES": "Introducción a clone",
"pt_BR": "Introdução à clonagem",
"gl" : "Introducción a clone",
"zh_CN": "Git Clone",
@@ -22,6 +23,7 @@ exports.level = {
"ja" : "単にgit clone!",
"zh_CN": "只要 git clone 就可以了!",
"es_AR": "Simplemente hacé git clone!",
+ "es_ES": "¡Simplemente escribe `git clone`!",
"pt_BR": "Basta fazer um git clone!",
"gl" : "¡Chega con facer git clone!",
"zh_TW": "只要 git clone 就好了",
@@ -201,6 +203,63 @@ exports.level = {
}
]
},
+ "es_ES": {
+ "childViews": [
+ {
+ "type": "ModalAlert",
+ "options": {
+ "markdowns": [
+ "## Git Remotes",
+ "",
+ "Los repositorios remotos no son _tan_ complicados. En el mundo actual de la computación en la nube es bastante facil pensar que hay un montón de magia detrás de los remotes de git, pero en realidad sólo son copias de tu repositorio en otra computadora. Típicamente vas a hablar con esta otra computadora a través de Internet, lo que permite transferir commits de un lado a otro.",
+ "",
+ "Habiendo dicho eso, los repositorios remotos tienen un par de propiedades interesantes:",
+ "",
+ "- Primero y principal, los remotos ¡son un backup genial! Los repositorios locales de git tienen la habilidad de restaurar archivos a un estado previo (como ya sabes), pero toda esa información se encuentra almacenada localmente. Al tener copias de tu repositorio git en otras computadoras, puedes perder todos tus datos locales y aún así retomar el trabajo en el punto donde lo habías dejado.",
+ "",
+ "- Más importante, ¡los remotos sociabilizan la programación! Ahora que hay una copia de tu proyecto hosteada en otro lugar, tus amigos pueden contribuir a tu proyecto (o bajarse los últimos cambios) de un modo muy sencillo.",
+ "",
+ "Se volvió bastante popular el uso de sitios web que muestran la actividad de los repositorios (como [Github](https://github.com/) or [Phabricator](http://phabricator.org/)), pero esos repositorios remotos _siempre_ sirven como la base subyacente de esas herramientas. Así que ¡es importante entenderlos!"
+ ]
+ }
+ },
+ {
+ "type": "ModalAlert",
+ "options": {
+ "markdowns": [
+ "## Nuestro comando para crear remotos",
+ "",
+ "Hasta este punto, Learn Git Branching se centró en enseñar las bases del trabajo _local_ con repositorios (crear ramas, mergear, rebasear, etc). Sin embargo, ahora que queremos aprender sobre el trabajo con repositorios remotos, necesitamos un comando para inicializar nuestro entorno para esas lecciones. Ese comando será `git clone`",
+ "",
+ "Técnicamente, `git clone` en el mundo real es el comando que usarías para crear copias _locales_ de un repositorio remoto (uno de GitHub, por ejemplo). Aquí usamos este comando de un modo un tanto distinto, en cambio -- `git clone` va a crear un repositorio remoto a partir del tuyo local. Estamos de acuerdo en que es el significado técnicamente opuesto al del comando real, pero ayuda bastante a entender la conexión entre el clonado y el trabajo en un repositorio remoto, así que vamos a vivir con ello por ahora.",
+ ""
+ ]
+ }
+ },
+ {
+ "type": "GitDemonstrationView",
+ "options": {
+ "beforeMarkdowns": [
+ "Comencemos despacio y simplemente veamos cómo se ve un repositorio remoto en nuestra visualización.",
+ ""
+ ],
+ "afterMarkdowns": [
+ "¡Ahí está! Ahora tenemos un repositorio remoto de nuestro proyecto. Parece bastante similar, salvando algunos cambios visuales para hacer evidente la distinción -- en niveles posteriores vas a ver cómo compartir trabajo entre estos repositorios."
+ ],
+ "command": "git clone",
+ "beforeCommand": ""
+ }
+ },
+ {
+ "type": "ModalAlert",
+ "options": {
+ "markdowns": [
+ "Para completar este nivel, simplemente ejecuta `git clone` en tu repositorio existente. El verdadero aprendizaje viene en las próximas lecciones."
+ ]
+ }
+ }
+ ]
+ },
"pt_BR": {
"childViews": [
{
diff --git a/src/levels/remote/fakeTeamwork.js b/src/levels/remote/fakeTeamwork.js
index ca08387f..44795ede 100644
--- a/src/levels/remote/fakeTeamwork.js
+++ b/src/levels/remote/fakeTeamwork.js
@@ -8,6 +8,7 @@ exports.level = {
"de_DE": "Teamarbeit simulieren",
"ja" : "擬似的なチーム作業",
"es_AR": "Simulando el trabajo en equipo",
+ "es_ES": "Simulando el trabajo en equipo",
"pt_BR": "Simulando trabalho em equipe",
"gl" : "Simulando o traballo no repositorio",
"zh_CN": "模拟团队合作",
@@ -22,6 +23,7 @@ exports.level = {
"de_DE": "Nicht vergessen, du kannst angeben wieviele Commits simuliert werden sollen.",
"ja" : "擬似的に作成するコミット数を指定できるのをお忘れなく",
"es_AR": "Acordate que podés especificar cuántos commits simular",
+ "es_ES": "Recuerda que puedes especificar cuántos commits simular",
"pt_BR": "Lembre-se que você pode especificar quantos commits quer simular",
"gl" : "Lembra que podes especifar cantos commits queres simular",
"zh_CN": "记住你可以指定仿真提交的个数",
@@ -193,6 +195,60 @@ exports.level = {
}
]
},
+ "es_ES": {
+ "childViews": [
+ {
+ "type": "ModalAlert",
+ "options": {
+ "markdowns": [
+ "## Simulando la colaboración",
+ "",
+ "Entonces, hay algo un poco tramposo -- para algunas de las lecciones siguientes, necesitamos explicarte cómo descargar cambios introducidos en el repositorio remoto.",
+ "",
+ "Eso significa que escencialmente tenemos que \"tener en cuenta\" que el repositorio remoto fue actualizado por algún colega, amigo o colaborador tuyo, incluso a veces en alguna rama específica o una cantidad determinada de commits.",
+ "",
+ "Para lograr esto, introdujimos el bien llamado comando ¡`git fakeTeamwork`! Es bastante autoexplicativo: simula trabajo de nuestros colegas. Veamos una demo..."
+ ]
+ }
+ },
+ {
+ "type": "GitDemonstrationView",
+ "options": {
+ "beforeMarkdowns": [
+ "El comportamiento por default de `fakeTeamwork` es simplemente crear un commit en master"
+ ],
+ "afterMarkdowns": [
+ "Ahí está: el remoto se actualizó con un nuevo commit, y todavía no nos bajamos ese commit porque aún no hicimos `git fetch`."
+ ],
+ "command": "git fakeTeamwork",
+ "beforeCommand": "git clone"
+ }
+ },
+ {
+ "type": "GitDemonstrationView",
+ "options": {
+ "beforeMarkdowns": [
+ "También puedes especificar la cantidad de commits o la ramma agregándolos al comando"
+ ],
+ "afterMarkdowns": [
+ "Con un único comando simulamos que un compañero de equipo pusheó tres commits a la rama `foo` de nuestro remoto"
+ ],
+ "command": "git fakeTeamwork foo 3",
+ "beforeCommand": "git branch foo; git clone"
+ }
+ },
+ {
+ "type": "ModalAlert",
+ "options": {
+ "markdowns": [
+ "Los niveles siguientes van a ser algo difíciles, así que vamos a exigirte un poco más en este nivel.",
+ "",
+ "Anímate y crea un remoto (con `git clone`), simula algunos cambios en ese remoto, haz commit en tu repo local, y luego haz pull de esos cambios. ¡Es como si fueran varias lecciones en una!"
+ ]
+ }
+ }
+ ]
+ },
"pt_BR": {
"childViews": [
{
diff --git a/src/levels/remote/fetch.js b/src/levels/remote/fetch.js
index 29c94e80..9d1b645c 100644
--- a/src/levels/remote/fetch.js
+++ b/src/levels/remote/fetch.js
@@ -8,6 +8,7 @@ exports.level = {
"de_DE": "Git Fetch",
"ja" : "Git Fetch",
"es_AR": "git fetch",
+ "es_ES": "git fetch",
"pt_BR": "Git Fetch",
"gl" : "Git Fetch",
"zh_CN": "Git Fetch",
@@ -22,6 +23,7 @@ exports.level = {
"de_DE": "Einfach git fetch ausführen!",
"ja" : "単にgit fetchを実行!",
"es_AR": "Simplemente ¡hacé git fetch!",
+ "es_ES": "Simplemente ¡escribe git fetch!",
"pt_BR": "Simplesmente chame git fetch!",
"gl" : "¡Sinxelamente fai git fetch!",
"zh_CN": "只需要运行 git fetch 命令!",
@@ -250,6 +252,79 @@ exports.level = {
}
]
},
+ "es_ES": {
+ "childViews": [
+ {
+ "type": "ModalAlert",
+ "options": {
+ "markdowns": [
+ "## Git Fetch",
+ "",
+ "Trabajar con remotos en git en realidad se reduce a transferir datos _de_ y _hacia_ otros repositorios. Mientras podamos mandar commits de un lado al otro, podemos compartir cualquier tipo de actualización registrada por git (y, por ende, compartir trabajo, archivos nuevos, ideas nuevas, cartas de amor, etc).",
+ "",
+ "En esta lección aprenderemos cómo traer (hacer `fetch`) datos _desde_ un repositorio remoto - el comando para esto se llama, convenientemente, `git fetch`).",
+ "",
+ "Vas a notar que a medida que actualicemos nuestra representación de nuestro repositorio remoto, nuestras ramas _remotas_ van a actualizarse para reflejar esa nueva representación. Esto está ligado a la lección anterior sobre ramas remotas"
+ ]
+ }
+ },
+ {
+ "type": "GitDemonstrationView",
+ "options": {
+ "beforeMarkdowns": [
+ "Antes de entrar en los detalles de `git fetch`, veámoslo en acción. Aquí tenemos un repositorio remoto que contiene dos commits que nuestro repositorio local no tiene."
+ ],
+ "afterMarkdowns": [
+ "¡Allá vamos! Bajamos los commits `C2` y `C3` a nuestro repositorio local, y nuestra rama remota `o/master` fue actualizada para reflejar este cambio."
+ ],
+ "command": "git fetch",
+ "beforeCommand": "git clone; git fakeTeamwork 2"
+ }
+ },
+ {
+ "type": "ModalAlert",
+ "options": {
+ "markdowns": [
+ "### ¿Qué hace fetch?",
+ "",
+ "`git fetch` hace dos simples pasos, y sólo dos simples pasos:",
+ "",
+ "* baja los commits que el remoto tiene pero no están en nuestro repositorio local, y...",
+ "* actualiza a dónde apuntan nuestras ramas remotas (por ejemplo, `o/master`)",
+ "",
+ "`git fetch` escencialmente sincroniza nuestra representación _local_ del repositorio remoto con el _verdadero_ estado del repositorio remoto (en este momento).",
+ "",
+ "Si recuerdas la lección anterior, dijimos que las ramas remotas reflejan el estado de los repositorios remotos _desde_ la última vez que hablaste con ellos. ¡`git fetch` es la manera en la que hablas con esos remotos! Espero que ahora esté clara la conexión entre las ramas remotas y `git fetch`.",
+ "",
+ "Usualmente, `git fetch` habla con el repositorio a través de internet (usando un protocolo como `http://` o `git://`).",
+ ""
+ ]
+ }
+ },
+ {
+ "type": "ModalAlert",
+ "options": {
+ "markdowns": [
+ "### ¿Qué *no* hace fetch?",
+ "",
+ "Sin embargo, `git fetch` no modifica en absoluto _tu_ estado local. No va a actualizar tu rama `master` ni va a cambiar nada sobre cómo se ve tu sistema de archivos en este momento.",
+ "",
+ "Es importante entender esto, porque un montón de desarrolladores piensan que correr `git fetch` hará que su estado local refleje el estado del remoto. `git fetch` puede descargar los datos necesarios para hacerlo, pero *no* cambia ninguno de tus archivos locales. Vamos a aprender otros comandos para hacer eso más adelante :D",
+ "",
+ "Entonces, después de todo, puedes pensar sobre `git fetch` como un proceso de descarga."
+ ]
+ }
+ },
+ {
+ "type": "ModalAlert",
+ "options": {
+ "markdowns": [
+ "Para completar este nivel, simplemente ejecuta `git fetch` y bájate todos los commits"
+ ]
+ }
+ }
+ ]
+ },
"pt_BR": {
"childViews": [
{
diff --git a/src/levels/remote/fetchArgs.js b/src/levels/remote/fetchArgs.js
index ee0bccd9..05919a88 100644
--- a/src/levels/remote/fetchArgs.js
+++ b/src/levels/remote/fetchArgs.js
@@ -8,6 +8,7 @@ exports.level = {
"zh_CN": "Git fetch 的参数",
"zh_TW": "fetch 的參數",
"es_AR": "Parámetros de fetch",
+ "es_ES": "Parámetros de fetch",
"pt_BR": "Parâmetros do fetch",
"gl" : "Parámetros de fetch",
"de_DE": "Optionen für Fetch",
@@ -22,6 +23,7 @@ exports.level = {
"zh_CN": "注意下提交对象的 id 是如何交换的! 你可以通过 `help level` 重新阅读本关卡的所有对话框!",
"zh_TW": "注意 commit 的 id 是怎麼被交換的!你可以透過 `help level` 來閱讀對話視窗!",
"es_AR": "¡Prestá atención a cómo podrían haberse invertido los ids de los commits! Podés volver a leer toda la lección usando \"help level\"",
+ "es_ES": "¡Presta atención a cómo podrían haberse invertido los ids de los commits! Puedes volver a leer toda la lección usando \"help level\"",
"pt_BR": "Preste atenção em como os identificadores dos commits podem ter trocado! Você pode ler os slides novamente com \"help level\"",
"gl" : "Preste atención en como poderían invertirse os ids dos commits! Podes volver ler toda a lección usando \"help level\"",
"de_DE": "Beachte wie die Commit IDs getauscht wurden! Du kannst den Einführungsdialog mit \"help level\" erneut anzeigen",
@@ -400,6 +402,129 @@ exports.level = {
}
]
},
+ "es_ES": {
+ "childViews": [
+ {
+ "type": "ModalAlert",
+ "options": {
+ "markdowns": [
+ "## Parámetros de git fetch",
+ "",
+ "Acabamos de aprender todo sobre los parámetros de push, como el parámetro ``, e incluso las referencias separadas por dos puntos (`:`). ¿Podremos usar todo ese conocimiento para `git fetch`, también?",
+ "",
+ "¡Dalo por hecho! Los parámetros para `git fetch` son realmente *muy, muy* similares a los de `git push`. Es el mismo tipo de conceptos, pero aplicados en la dirección opuesta (dado que ahora estás bajando commits en lugar de subirlos).",
+ "",
+ "Veamos los conceptos de a uno en uno..."
+ ]
+ }
+ },
+ {
+ "type": "ModalAlert",
+ "options": {
+ "markdowns": [
+ "### El parámetro ``",
+ "",
+ "Si especificas un lugar con git fetch como en el comando siguiente:",
+ "",
+ "`git fetch origin foo`",
+ "",
+ "Git va a ir a la rama `foo` en el remoto, va a traer todos los commits que no estén presentes localmente, y luego los aplicará sobre la rama `o/foo` localmente.",
+ "",
+ "Veámoslo en acción (refresquemos el concepto)."
+ ]
+ }
+ },
+ {
+ "type": "GitDemonstrationView",
+ "options": {
+ "beforeMarkdowns": [
+ "Especificando un lugar..."
+ ],
+ "afterMarkdowns": [
+ "Sólo bajamos los commits de `foo` y los ubicamos en `o/foo`"
+ ],
+ "command": "git fetch origin foo",
+ "beforeCommand": "git branch foo; git clone; git fakeTeamwork foo 2"
+ }
+ },
+ {
+ "type": "ModalAlert",
+ "options": {
+ "markdowns": [
+ "Te podrás estar preguntando \"¿Por qué git aplicó esos commits sobre la rama `origin/foo` en lugar de aplicarlos sobre la rama `foo` local? Pensé que el parámetro `` era un lugar que existía tanto local como remotamente\"",
+ "",
+ "Bueno, git hace una excepción especial en este caso, porque podrías tener trabajo en la rama `foo` que no quieras mezclar. Esto hace referencia a la lección anterior sobre `git fetch` - no actualiza tus ramas locales no-remotas, sólo descarga los commits (para que pueadas verlos o mergearlos después).",
+ ""
+ ]
+ }
+ },
+ {
+ "type": "ModalAlert",
+ "options": {
+ "markdowns": [
+ "\"Bueno, y, en ese caso, ¿qué pasa si explícitamente defino el origen y destino con `:`?\"",
+ "",
+ "Si te sientes lo suficientemente seguro como para traer commits *directamente* a una rama local, entonces, sí, puedes especificarlo usando una referencia con dos puntos. No puedes traer commits a una rama que sobre la que hayas hecho checkout, pero en cualquier otro caso git te lo va a permitir.",
+ "",
+ "Este es el único problema, igual: `` es ahora un lugar en el *remoto*, y `` es un lugar *local* en donde poner esos commits. Es exactamente lo opuesto a git push, y eso tiene sentido dado que ¡estamos transfiriendo los datos en la dirección opuesta!",
+ "",
+ "Habiendo dicho esto, difícilmente alguien use esto en la práctica. Lo estoy presentando principalmente como un modo de conceptualizar que `fetch` y `push` son bastante similares, sólo que en direcciones opuestas."
+ ]
+ }
+ },
+ {
+ "type": "GitDemonstrationView",
+ "options": {
+ "beforeMarkdowns": [
+ "Veamos esta locura en acción:"
+ ],
+ "afterMarkdowns": [
+ "¡Caramba! Mira: git resolvió `foo~1` como un lugar en el origin y bajó esos commits a `bar` (que era una rama local). Observa como `foo` y `o/foo` no fueron actualizados, dado que especificamos un destino."
+ ],
+ "command": "git fetch origin foo~1:bar",
+ "beforeCommand": "git branch foo; git clone; git branch bar; git fakeTeamwork foo 2"
+ }
+ },
+ {
+ "type": "GitDemonstrationView",
+ "options": {
+ "beforeMarkdowns": [
+ "¿Qué pasa si el destino no existe antes de ejecutar este comando? Veamos el último ejemplo pero sin que `bar` exista de antemano."
+ ],
+ "afterMarkdowns": [
+ "Mira: es IGUAL que git push. Git creó el destino localmente antes de hacer el fetch, tal como git creará el destino en el remoto antes de hacer push (si no existiera)."
+ ],
+ "command": "git fetch origin foo~1:bar",
+ "beforeCommand": "git branch foo; git clone; git fakeTeamwork foo 2"
+ }
+ },
+ {
+ "type": "GitDemonstrationView",
+ "options": {
+ "beforeMarkdowns": [
+ "¿Sin argumentos?",
+ "",
+ "Si `git fetch` no recibe ningún argumento, simplemente descarga todos los commits del remoto a todas las ramas remotas..."
+ ],
+ "afterMarkdowns": [
+ "Bastante simple, pero merece la pena verlo al menos una vez."
+ ],
+ "command": "git fetch",
+ "beforeCommand": "git branch foo; git clone; git fakeTeamwork foo; git fakeTeamwork master"
+ }
+ },
+ {
+ "type": "ModalAlert",
+ "options": {
+ "markdowns": [
+ "Bueno, demasiada charla. Para completar este nivel, haz fetch sólo de los commits especificados en la visualización del objetivo. ¡Familiarízate con esos comandos!",
+ "",
+ "Vas a tener que especificar el origen y el destino para ambos comandos fetch. Presta atención al objetivo dado que ¡los IDs pueden estar invertidos!"
+ ]
+ }
+ }
+ ]
+ },
"pt_BR": {
"childViews": [
{
diff --git a/src/levels/remote/fetchRebase.js b/src/levels/remote/fetchRebase.js
index f1d6fdde..e54280a3 100644
--- a/src/levels/remote/fetchRebase.js
+++ b/src/levels/remote/fetchRebase.js
@@ -7,6 +7,7 @@ exports.level = {
"zh_CN": "偏离的提交历史",
"zh_TW": "diverged history",
"es_AR": "Historia divergente",
+ "es_ES": "Historia divergente",
"pt_BR": "Histórico divergente",
"gl" : "Histórico diverxente",
"de_DE": "Abweichende History",
@@ -21,6 +22,7 @@ exports.level = {
"zh_CN": "按照目标中的提交树的顺序进行检出",
"zh_TW": "確認視覺化的目標中的順序",
"es_AR": "Prestá atención al orden del objetivo",
+ "es_ES": "Presta atención al orden del objetivo",
"pt_BR": "Preste atenção na ordem da visualização do objetivo",
"gl" : "Presta atención ó orixe do obxectivo",
"de_DE": "Beachte die Reihenfolge in der Zieldarstellung",
@@ -460,6 +462,149 @@ exports.level = {
}
]
},
+ "es_ES": {
+ "childViews": [
+ {
+ "type": "ModalAlert",
+ "options": {
+ "markdowns": [
+ "## Trabajo divergente",
+ "",
+ "Hasta ahora hemos visto cómo hacer pull a commits de otros y cómo hacer push a los nuestros. Parece bastante simple, así que ¿cómo puede confundirse tanto la gente?",
+ "",
+ "La dificultad viene cuando la historia de los repositorios *diverge*. Antes de entrar en detalles, veamos un ejemplo...",
+ ""
+ ]
+ }
+ },
+ {
+ "type": "ModalAlert",
+ "options": {
+ "markdowns": [
+ "Imagínate que clonas un repositorio el lunes y empiezas a desarrollar algo. Para el viernes ya estás listo para publicar tu trabajo, pero, ¡vaya! Tus colegas también han estado escribiendo código durante la semana, haciendo que tu trabajo quede desactualizado (y obsoleto). Además, ellos publicaron esos commits en el repositorio remoto, así que ahora *tu* trabajo está basado en una versión *vieja* del proyecto, que ya no le interesa a nadie.",
+ "",
+ "En este caso, el comando `git push` es ambiguo. Si ejecutas `git push`, ¿git debería cambiar el repositorio a como estaba el lunes? ¿Debería tratar de agregar tu código sin eliminar el código nuevo? ¿O debería ignorar completamente tus cambios porque están desactualizados?",
+ "",
+ "Como hay tanta ambiguedad en esta situación (en la que la historia divirgió), git no te permite hacer push de tus cambios. En cambio, te fuerza a integrar el último estado del repositorio remoto antes de poder compartir tu trabajo."
+ ]
+ }
+ },
+ {
+ "type": "GitDemonstrationView",
+ "options": {
+ "beforeMarkdowns": [
+ "¡Demasiada charla, veámoslo en acción!"
+ ],
+ "afterMarkdowns": [
+ "¿Ves? No pasó nada, porque el comando falla. `git push` falla porque `C3`, tu commit más reciente, está basado en el remoto sobre `C1`. El remoto fue actualizado a `C2` desde entonces, por lo que git rechaza tu push"
+ ],
+ "command": "git push",
+ "beforeCommand": "git clone; git fakeTeamwork; git commit"
+ }
+ },
+ {
+ "type": "ModalAlert",
+ "options": {
+ "markdowns": [
+ "¿Cómo puedes resolver esta situación? Es fácil, todo lo que tienes que hacer es basar tu trabajo en la versión más reciente de la rama remota.",
+ "",
+ "Hay un par de maneras de hacer esto, pero la más simple es mover tu trabajo haciendo un rebase. Probémoslo a ver cómo se ve."
+ ]
+ }
+ },
+ {
+ "type": "GitDemonstrationView",
+ "options": {
+ "beforeMarkdowns": [
+ "Ahora, si hacemos rebase antes de hacer push..."
+ ],
+ "afterMarkdowns": [
+ "¡Zas! Actualizamos nuestra representación local del remoto con `git fetch`, hacemos rebase de nuestro trabajo para reflejar los nuevos cambios del remoto, y después los subimos con `git push`"
+ ],
+ "command": "git fetch; git rebase o/master; git push",
+ "beforeCommand": "git clone; git fakeTeamwork; git commit"
+ }
+ },
+ {
+ "type": "ModalAlert",
+ "options": {
+ "markdowns": [
+ "¿Hay otra manera de actualizar mi trabajo si actualizaron el repositorio remoto? ¡Claro que sí! Veamos cómo hacer lo mismo pero usando `merge`.",
+ "",
+ "Por más que `git merge` no mueva tu trabajo (sólo crea un commit de merge), es un modo de decirle a git que integraste todos los cambios del remoto. Esto es porque ahora una rama remota pasó a ser un *ancestro* de tu propia rama, lo que significa que tu commit refleja los cambios de todos los commits de la rama remota.",
+ "",
+ "Veamos una muestra..."
+ ]
+ }
+ },
+ {
+ "type": "GitDemonstrationView",
+ "options": {
+ "beforeMarkdowns": [
+ "Si en lugar de hacer rebase hacemos un merge..."
+ ],
+ "afterMarkdowns": [
+ "¡Zas! Actualizamos nuestra representación local del remoto usando `git fetch`, *mergeamos* el nuevo trabajo junto con el nuestro (para reflejar los nuevos cambios en el remoto), y después los subimos usando `git push`"
+ ],
+ "command": "git fetch; git merge o/master; git push",
+ "beforeCommand": "git clone; git fakeTeamwork; git commit"
+ }
+ },
+ {
+ "type": "ModalAlert",
+ "options": {
+ "markdowns": [
+ "¡Asombroso! ¿Hay forma de hacer esto sin escribir tantos comandos?",
+ "",
+ "¡Claro que sí! Ya sabes que `git pull` es simplemente un atajo para hacer fetch y merge. Convenientemente, ¡`git pull --rebase` es un atajo para hacer fetch y rebase!",
+ "",
+ "Veamos estos atajos funcionando."
+ ]
+ }
+ },
+ {
+ "type": "GitDemonstrationView",
+ "options": {
+ "beforeMarkdowns": [
+ "Primero con `--rebase`..."
+ ],
+ "afterMarkdowns": [
+ "¡Igual que antes! Sólo que bastante más corto."
+ ],
+ "command": "git pull --rebase; git push",
+ "beforeCommand": "git clone; git fakeTeamwork; git commit"
+ }
+ },
+ {
+ "type": "GitDemonstrationView",
+ "options": {
+ "beforeMarkdowns": [
+ "Y ahora un `pull` común"
+ ],
+ "afterMarkdowns": [
+ "Otra vez, ¡exactamente lo mismo que antes!"
+ ],
+ "command": "git pull; git push",
+ "beforeCommand": "git clone; git fakeTeamwork; git commit"
+ }
+ },
+ {
+ "type": "ModalAlert",
+ "options": {
+ "markdowns": [
+ "Toda este tinglado de hacer fetch, rebase/merge y push es bastante común. En lecciones futuras vamos a ver formas más complejas de estos flujos de trabajo, pero por ahora vamos a probar esto que acabamos de ver.",
+ "",
+ "Para resolver este nivel, haz lo siguiente:",
+ "",
+ "* Clona tu repositorio",
+ "* Simula algo de trabajo de un colega (1 commit)",
+ "* Haz commit de algún cambio tuyo (1 commit)",
+ "* Publica tu trabajo *rebaseando*"
+ ]
+ }
+ }
+ ]
+ },
"pt_BR": {
"childViews": [
{
diff --git a/src/levels/remote/mergeManyFeatures.js b/src/levels/remote/mergeManyFeatures.js
index 136a202c..7c22e2e1 100644
--- a/src/levels/remote/mergeManyFeatures.js
+++ b/src/levels/remote/mergeManyFeatures.js
@@ -7,6 +7,7 @@ exports.level = {
"zh_CN": "合并远程仓库",
"zh_TW": "merge with remotes",
"es_AR": "Mergeando con los remotos",
+ "es_ES": "Haciendo merge con los remotos",
"pt_BR": "Merge com remotos",
"gl" : "Merge cos repos remotos",
"de_DE": "Änderungen vom Remote zusammenführen",
@@ -21,6 +22,7 @@ exports.level = {
"zh_CN": "注意目标树!",
"zh_TW": "注意最後要完成的目標!",
"es_AR": "¡Prestá atención al árbol final!",
+ "es_ES": "¡Presta atención al árbol final!",
"pt_BR": "Preste atenção na árvore do objetivo!",
"gl" : "Presta atención á arbore final!",
"de_DE": "Beachte den Ziel-Baum!",
@@ -167,6 +169,51 @@ exports.level = {
}
]
},
+ "es_ES": {
+ "childViews": [
+ {
+ "type": "ModalAlert",
+ "options": {
+ "markdowns": [
+ "## ¿Por qué no hacer merge?",
+ "",
+ "Para hacer push con tus novedades al remoto, todo lo que tienes que hacer es *integrar* los últimos cambios del remoto con los tuyos. Eso significa que puedes hacer tanto rebase como merge con la rama remota (por ejemplo, `o/master`).",
+ "",
+ "Así que si puedes hacer cualquiera de las dos, ¿por qué las lecciones sólo se han centrado en rebasear hasta ahora? ¿Por qué no dedicarle algo de amor al `merge` cuando trabajamos con remotos?",
+ ""
+ ]
+ }
+ },
+ {
+ "type": "ModalAlert",
+ "options": {
+ "markdowns": [
+ "Hay mucho debate entre los desarrolladores sobre los pros y contras de mergear vs rebasear. Aquí te mostraré los pros y contras de rebasear:",
+ "",
+ "Pros:",
+ "",
+ "* Rebasear hace que tu árbol de commits se vea bastante limpio, porque todos los commits siguen una única línea",
+ "",
+ "Contras:",
+ "",
+ "* Rebasear modifica la historia (aparente) de tu árbol de commits.",
+ "",
+ "Por ejemplo, el commit `C1` puede rebasearse para que aparezca *después* de `C3`. Entonces, parece que el trabajo de `C1'` se hizo después de `C3`, cuando en realizad se había hecho antes.",
+ "",
+ "Algunos desarrolladores prefieren preservar la historia, por lo que deciden mergear. Otros (como yo) preferimos tener un árbol de commits limpios, y preferimos rebasear. Todo es una cuestión de preferencias :D"
+ ]
+ }
+ },
+ {
+ "type": "ModalAlert",
+ "options": {
+ "markdowns": [
+ "Para este nivel, tratemos de resolver el nivel anterior, pero *mergeando*. Puede volverse un poco cuesta arriba, pero ilustra la idea bastante bien."
+ ]
+ }
+ }
+ ]
+ },
"pt_BR": {
"childViews": [
{
diff --git a/src/levels/remote/pull.js b/src/levels/remote/pull.js
index a19a0f80..5ae8701e 100644
--- a/src/levels/remote/pull.js
+++ b/src/levels/remote/pull.js
@@ -7,6 +7,7 @@ exports.level = {
"zh_CN": "Git Pull",
"zh_TW": "git pull",
"es_AR": "git pull",
+ "es_ES": "git pull",
"pt_BR": "Git Pull",
"gl" : "Git Pull",
"de_DE": "Git Pull",
@@ -21,6 +22,7 @@ exports.level = {
"zh_CN": "运行 git pull 命令就可以了!",
"zh_TW": "只要下 git pull 這個指令即可",
"es_AR": "Simplemente ¡hacé git pull!",
+ "es_ES": "Simplemente ¡ejecuta git pull!",
"pt_BR": "Basta executar git pull!",
"gl" : "Sinxelamente fai git pull!",
"de_DE": "Führe einfach git pull aus.",
@@ -208,6 +210,65 @@ exports.level = {
}
]
},
+ "es_ES": {
+ "childViews": [
+ {
+ "type": "ModalAlert",
+ "options": {
+ "markdowns": [
+ "## Git Pull",
+ "",
+ "Ahora que vimos cómo traer datos de un repositorio remoto con `git fetch`, ¡actualicemos nuestro trabajo local para reflejar esos cambios!",
+ "",
+ "Realmente hay varias formas de hacer esto: una vez que tienes los commits disponibles localmente, puedes integrarlos como si fueran commits comunes de otras ramas. Esto significa que podrías ejecutar comandos como:",
+ "",
+ "* `git cherry-pick o/master`",
+ "* `git rebase o/master`",
+ "* `git merge o/master`",
+ "* etc., etc.",
+ "",
+ "De hecho, el flujo de trabajo de *fetchear* cambios remotos y después *mergearlos* es tan común que git incluye un comando que hace ambas cosas de una: ¡`git pull`!"
+ ]
+ }
+ },
+ {
+ "type": "GitDemonstrationView",
+ "options": {
+ "beforeMarkdowns": [
+ "Veamos primero un `fetch` y un `merge` ejecutados secuencialmente"
+ ],
+ "afterMarkdowns": [
+ "Zas: descargamos `C3` con un `fetch` y luego lo mergeamos con `git merge o/master`. Ahora nuestra rama `master` refleja el nuevo trabajo del remoto (en este caso, llamado `origin`)"
+ ],
+ "command": "git fetch; git merge o/master",
+ "beforeCommand": "git clone; git commit; git fakeTeamwork"
+ }
+ },
+ {
+ "type": "GitDemonstrationView",
+ "options": {
+ "beforeMarkdowns": [
+ "¿Qué pasaría si en cambio utilizásemos `git pull`?"
+ ],
+ "afterMarkdowns": [
+ "¡Lo mismo! Eso debería dejar bien claro que `git pull` es básicamente un atajo para hacer `git fetch` seguido por un merge con la rama que hayamos descargado."
+ ],
+ "command": "git pull",
+ "beforeCommand": "git clone; git commit; git fakeTeamwork"
+ }
+ },
+ {
+ "type": "ModalAlert",
+ "options": {
+ "markdowns": [
+ "Exploraremos los detalles de `git pull` después (incluyendo sus opciones y parámetros), pero por ahora probémoslo en este nivel.",
+ "",
+ "Recuerda: puedes ejecutar este comando simplemente con `fetch` y `merge`, pero eso te costaría un comando extra :P"
+ ]
+ }
+ }
+ ]
+ },
"pt_BR": {
"childViews": [
{
diff --git a/src/levels/remote/pullArgs.js b/src/levels/remote/pullArgs.js
index c719162a..e9e1cbb4 100644
--- a/src/levels/remote/pullArgs.js
+++ b/src/levels/remote/pullArgs.js
@@ -7,6 +7,7 @@ exports.level = {
"zh_CN": "Git pull 的参数",
"zh_TW": "pull 的參數",
"es_AR": "Parámetros de pull",
+ "es_ES": "Parámetros de pull",
"pt_BR": "Parâmetros do pull",
"gl" : "Parámetros de pull",
"de_DE": "Optionen für Pull",
@@ -21,6 +22,7 @@ exports.level = {
"zh_CN": "记住, 你可以通过 fetch/pull 创建本地分支",
"zh_TW": "記住,你可以透過 fetch 以及 pull 來建立一個新的 local 的 branch",
"es_AR": "Acordate de que podés crear nuevas ramas locales usando los parámetros de fetch/pull",
+ "es_ES": "Recuerda que puedes crear nuevas ramas locales usando los parámetros de fetch/pull",
"pt_BR": "Lembre-se que você pode criar novos ramos locais com parâmetros de fetch/pull",
"gl" : "Lémbrate que podes crear novas ramas locais con parámetros de fetch/pull",
"de_DE": "Du kannst neue lokale Branches mittels fetch / pull erstellen",
@@ -253,6 +255,80 @@ exports.level = {
}
]
},
+ "es_ES": {
+ "childViews": [
+ {
+ "type": "ModalAlert",
+ "options": {
+ "markdowns": [
+ "## Parámetros de git pull",
+ "",
+ "Ahora que sabes prácticamente *todo* lo que hay que saber sobre los parámetros de `git fetch` y `git push`, casi no queda nada por cubrir del comando git pull :)",
+ "",
+ "Eso es porque git pull es simplemente un atajo para hacer un fetch seguido de un merge. Puedes imaginártelo como ejecutar git fetch con los *mismos* parámetros, y después hacer merge de ello hacia donde esos commits hayan ido a parar.",
+ "",
+ "Esto aplica incluso cuando utilizas parámetros rebuscados en exceso. Veamos algunos ejemplos:"
+ ]
+ }
+ },
+ {
+ "type": "ModalAlert",
+ "options": {
+ "markdowns": [
+ "Estos son algunos comandos equivalentes de git:",
+ "",
+ "`git pull origin foo` equivale a:",
+ "",
+ "`git fetch origin foo; git merge o/foo`",
+ "",
+ "Y...",
+ "",
+ "`git pull origin bar~1:bugFix` equivale a:",
+ "",
+ "`git fetch origin bar~1:bugFix; git merge bugFix`",
+ "",
+ "¿Ves? git pull es simplemente un atajo para un fetch + merge, y todo lo que le importa a git pull es dónde terminaron esos commits (el parámetro `destino` que determina durante el fetch).",
+ "",
+ "Veamos una demostración:"
+ ]
+ }
+ },
+ {
+ "type": "GitDemonstrationView",
+ "options": {
+ "beforeMarkdowns": [
+ "Si especificamos el lugar desde donde hacer fetch, todo ocurre como antes, pero sólo mergeamos lo que se fetcheó"
+ ],
+ "afterMarkdowns": [
+ "¡Ves! Especificando `master` descargamos los commits a `o/master` como siempre. Después mergeamos `o/master` a nuestra rama actual, *sin importar* qué había en nuestra copia de trabajo."
+ ],
+ "command": "git pull origin master",
+ "beforeCommand": "git clone; go -b bar; git commit; git fakeTeamwork"
+ }
+ },
+ {
+ "type": "GitDemonstrationView",
+ "options": {
+ "beforeMarkdowns": [
+ "¿Esto funciona con origen y destino, también? ¡Más vale! Veámoslo:"
+ ],
+ "afterMarkdowns": [
+ "Caramba, eso es una BARBARIDAD en un único comando. Creamos una nueva rama local llamada `foo`, descargamos los commits del master del remoto a esta rama `foo`, y después mezclamos esa rama a nuestra rama actual `bar`. ¡¡¡Supera los 9000!!!"
+ ],
+ "command": "git pull origin master:foo",
+ "beforeCommand": "git clone; git fakeTeamwork; go -b bar; git commit"
+ }
+ },
+ {
+ "type": "ModalAlert",
+ "options": {
+ "markdowns": [
+ "OK: para terminar, intenta alcanzar el estado del objetivo. Vas a necesitar descargar algunos commits, crear algunas ramas nuevas, y mergear esas ramas junto con otras, pero no debería llevar demasiados comandos :P"
+ ]
+ }
+ }
+ ]
+ },
"pt_BR": {
"childViews": [
{
diff --git a/src/levels/remote/push.js b/src/levels/remote/push.js
index 92a3f681..bdd0cc64 100644
--- a/src/levels/remote/push.js
+++ b/src/levels/remote/push.js
@@ -10,6 +10,7 @@ exports.level = {
"zh_CN": "Git Push",
"zh_TW": "git push",
"es_AR": "git push",
+ "es_ES": "git push",
"pt_BR": "Git Push",
"gl" : "Git Push",
"de_DE": "Git Push",
@@ -24,6 +25,7 @@ exports.level = {
"zh_CN": "推送之前需要先克隆",
"zh_TW": "push 之前你需要先 clone",
"es_AR": "¡Acordate que tenés que clonar antes de pushear!",
+ "es_ES": "¡Recuerda que tienes que clonar antes de hacer push!",
"pt_BR": "Lembre-se de clonar antes de fazer o push!",
"de_DE": "Denk dran, dass du einen Clone brauchst bevor du Pushen kannst!",
"ja" : "Pushができるようになるには、まずリポジトリをcloneする必要があるのをお忘れなく",
@@ -160,6 +162,47 @@ exports.level = {
}
]
},
+ "es_ES": {
+ "childViews": [
+ {
+ "type": "ModalAlert",
+ "options": {
+ "markdowns": [
+ "## git push",
+ "",
+ "Entendido, entonces ya descargué los cambios de un repositorio remoto y los integré en mi trabajo localmente. Esto suena muy bien... pero ¿cómo comparto _mis_ cambios con el resto?",
+ "",
+ "Bueno, la forma de subir el trabajo compartido es la opuesta a cómo descargar trabajo. Y ¿qué es lo opuesto a `git pull`? ¡`git push`!",
+ "",
+ "`git push` es el responsable de subir _tus_ cambios a un remoto específico y de actualizar ese remoto para incluir tus nuevos commits. Cuando `git push` termina, todos tus amigos pueden descargar tu trabajo del remoto.",
+ "",
+ "Puedes imaginarte `git push` como un comando para \"publicar\" tu trabajo. Tiene un par de sutilezas con las que vamos a meternos pronto, pero empecemos poco a poco."
+ ]
+ }
+ },
+ {
+ "type": "GitDemonstrationView",
+ "options": {
+ "beforeMarkdowns": [
+ "Aquí tenemos algunos cambios que nuestro remoto no tiene. ¡Subámoslos!"
+ ],
+ "afterMarkdowns": [
+ "Ahí está: el remoto recibió el commit `C2`, la rama `master` de ese remoto se actualizó para apuntar a `C2`, y nuestro *propio* reflejo del remoto (`o/master`) también fue actualizado. ¡Todo está en sincronía!"
+ ],
+ "command": "git push",
+ "beforeCommand": "git clone; git commit"
+ }
+ },
+ {
+ "type": "ModalAlert",
+ "options": {
+ "markdowns": [
+ "Para completar este nivel, simplemente comparte dos nuevos commits con el remoto. Igualmente, no te confíes, ¡las lecciones van a empezar a complicarse!"
+ ]
+ }
+ }
+ ]
+ },
"pt_BR": {
"childViews": [
{
diff --git a/src/levels/remote/pushArgs.js b/src/levels/remote/pushArgs.js
index f1810aec..8570a624 100644
--- a/src/levels/remote/pushArgs.js
+++ b/src/levels/remote/pushArgs.js
@@ -10,6 +10,7 @@ exports.level = {
"zh_CN": "Git push 的参数",
"zh_TW": "git push 的參數",
"es_AR": "Parámetros de git push",
+ "es_ES": "Parámetros de git push",
"pt_BR": "Parâmetros do git push",
"gl" : "Parámetros de git push",
"de_DE": "Optionen für Git Push",
@@ -24,6 +25,7 @@ exports.level = {
"zh_CN": "你可以利用“objective”来阅读对话窗口的最后一页",
"zh_TW": "你可以利用 \"objective\" 來閱讀對話視窗的最後一頁",
"es_AR": "Siempre podés ver el último mensaje tipeando \"objective\"",
+ "es_ES": "Siempre puedes ver el último mensaje escribiendo \"objective\"",
"pt_BR": "Você sempre pode rever o último slide com o comando \"objective\"",
"gl" : "Ti sempre podes desfacer último mensaxe escribindo \"objective\"",
"de_DE": "Du kannst dir die Zielsetzung des Levels immer wieder mit \"objective\" anzeigen lassen",
@@ -253,6 +255,78 @@ exports.level = {
}
]
},
+ "es_ES": {
+ "childViews": [
+ {
+ "type": "ModalAlert",
+ "options": {
+ "markdowns": [
+ "## Parámetros de push",
+ "",
+ "¡Genial! Ahora que has aprendido sobre las ramas que trackean remotos podemos empezar a desvelar algo del misterio detrás de git push, fetch y pull. Vamos a atacar un comando cada vez, pero los conceptos entre ellos son muy similares.",
+ "",
+ "Veamos primero `git push`. Ya aprendiste en la lección sobre ramas remotas que git determinó el remoto *y* la rama a la que pushear mirando las propiedades de la rama actual (el remoto al que \"trackea\"). Este es el comportamiento por defecto para cuando no se especifican parámetros, pero git push toma, opcionalmente, parámetros de la forma:",
+ "",
+ "`git push `",
+ "",
+ ""
+ ]
+ }
+ },
+ {
+ "type": "ModalAlert",
+ "options": {
+ "markdowns": [
+ "¿Qué será este parámetro ``, te preguntarás? Vamos a entrar en detalle, pero primero un ejemplo. Ejecutar el comando:",
+ "",
+ "`git push origin master`",
+ "",
+ "se traduce así al español:",
+ "",
+ "*Vete a la rama llamada \"master\" en mi repositorio, coge todos los commits, y después vete a la rama \"master\" del remoto llamado \"origin\". Copia ahí todos los commits que falten, y avísame cuando termines.*",
+ "",
+ "Especificando `master` como el parámetro \"lugar\", le dijimos a git de dónde traer los commits, y a dónde mandarlos. Es, básicamente, el \"lugar\" o \"ubicación\" que sincronizar entre ambos repositorios.",
+ "",
+ "Ten en cuenta que, como le dijimos a git todo lo que necesitaba saber (especificando ambos parámetros), ¡ignora totalmente dónde estamos parados en este momento¡"
+ ]
+ }
+ },
+ {
+ "type": "GitDemonstrationView",
+ "options": {
+ "beforeMarkdowns": [
+ "Veamos un ejemplo especificando los parámetros. Date cuenta dónde estamos parados en este ejemplo."
+ ],
+ "afterMarkdowns": [
+ "¡Ahí está! Se actualizó `master` en el remoto, porque especificamos esos parámetros."
+ ],
+ "command": "git checkout C0; git push origin master",
+ "beforeCommand": "git clone; git commit"
+ }
+ },
+ {
+ "type": "GitDemonstrationView",
+ "options": {
+ "beforeMarkdowns": [
+ "¿Y si no especificabamos los parámetros? ¿Qué hubiera pasado?"
+ ],
+ "afterMarkdowns": [
+ "El comando falla (como puedes ver), porque `HEAD` no está sobre ninguna rama que apunte a algún remoto."
+ ],
+ "command": "git checkout C0; git push",
+ "beforeCommand": "git clone; git commit"
+ }
+ },
+ {
+ "type": "ModalAlert",
+ "options": {
+ "markdowns": [
+ "Perfecto. Para este nivel, actualicemos tanto `foo` como `master` en el remoto. El tema está en que ¡tenemos deshabilitado `git checkout` en este nivel!"
+ ]
+ }
+ }
+ ]
+ },
"pt_BR": {
"childViews": [
{
diff --git a/src/levels/remote/pushArgs2.js b/src/levels/remote/pushArgs2.js
index 80a104bb..bfe68313 100644
--- a/src/levels/remote/pushArgs2.js
+++ b/src/levels/remote/pushArgs2.js
@@ -7,6 +7,7 @@ exports.level = {
"zh_CN": "Git push 参数 2",
"zh_TW": "git push 的參數,延伸討論!",
"es_AR": "¡Más! Parámetros de git push",
+ "es_ES": "¡Más! Parámetros de git push",
"pt_BR": "Parâmetros do git push -- expandido",
"gl" : "Parámetros de git push -- ampliado",
"de_DE": "Optionen für Git Push -- noch mehr!",
@@ -21,6 +22,7 @@ exports.level = {
"zh_CN": "如果你认输的话,可以通过“show solution”查看解决方案 :P",
"zh_TW": "如果你失敗了,可以利用 \"show solution\" 來找到解答:P",
"es_AR": "Recordá que podés admitir tu derrota y tipear \"show solution\" para ver la solución :P",
+ "es_ES": "Recuerda que puedes admitir tu derrota y escribir \"show solution\" para ver la solución :P",
"pt_BR": "Lembre-se que você pode admitir que foi derrotado e digitar \"show solution\" :P",
"gl" : "Lembrate que podes admitir que fuches derrotado e escribir \"show solution\" para amosala solución :P",
"de_DE": "Vergiss nicht dass du aufgeben kannst, indem du \"show solution\" eingibst :P",
@@ -241,6 +243,76 @@ exports.level = {
}
]
},
+ "es_ES": {
+ "childViews": [
+ {
+ "type": "ModalAlert",
+ "options": {
+ "markdowns": [
+ "## Detalles sobre el parámetro ``",
+ "",
+ "Recuerda de la lección anterior que cuando especificamos `master` como el parámetro lugar de git push, especificamos tanto el *origen* del que sacar los commits como el *destino* al que enviarlos.",
+ "",
+ "Podrías estar preguntándote ¿Y si quisiéramos que el origen y el destino fuesen distintos? ¿Si quisieras hacer push de los commits de la rama local `foo` a la rama `bar` del remote?",
+ "",
+ "Bueno, lamentablemente eso no se puede hacer en git... ¡zasca! Claro que se puede :)... git es extremadamente flexible (casi casi que demasiado).",
+ "",
+ "Veamos cómo hacerlo a continuación..."
+ ]
+ }
+ },
+ {
+ "type": "ModalAlert",
+ "options": {
+ "markdowns": [
+ "Para especificar tanto el origen como el destino de ``, simplemente únelos usando el signo `dos puntos`:",
+ "",
+ "`git push origin :`",
+ "",
+ "A esto se le suele llamar refspec con dos puntos. Refspec es simplemente un nombre genial para una ubicación que git puede entender (como la rama `foo`, o incluso `HEAD~1`)",
+ "",
+ "Una vez que especificas tanto el origen como el destino independientemente, puedes ponerte bastante cómodo y preciso con los comandos remotos. ¡Veamos una demo!"
+ ]
+ }
+ },
+ {
+ "type": "GitDemonstrationView",
+ "options": {
+ "beforeMarkdowns": [
+ "Recuerda: `origen` es cualquier ubicación que git pueda entender:"
+ ],
+ "afterMarkdowns": [
+ "¡Vaya! Ese commando es bastante rompedor, pero tiene sentido: git resolvió `foo^` a una ubicación, subió cualquier commit de ahí que aún no estuviera en el remoto, y luego actualizó el destino."
+ ],
+ "command": "git push origin foo^:master",
+ "beforeCommand": "git clone; go -b foo; git commit; git commit"
+ }
+ },
+ {
+ "type": "GitDemonstrationView",
+ "options": {
+ "beforeMarkdowns": [
+ "¿Y qué ocurre si el destino al que quieres hacer push no existe? ¡Sin problema! Simplemente dale un nombre a la rama y git se va a encargar de creártelo en el remoto."
+ ],
+ "afterMarkdowns": [
+ "Genial, simplemente fluye :D"
+ ],
+ "command": "git push origin master:newBranch",
+ "beforeCommand": "git clone; git commit"
+ }
+ },
+ {
+ "type": "ModalAlert",
+ "options": {
+ "markdowns": [
+ "Para este nivel, trata de llegar al objetivo final, y recuerda el formato:",
+ "",
+ "`:`"
+ ]
+ }
+ }
+ ]
+ },
"pt_BR": {
"childViews": [
{
diff --git a/src/levels/remote/pushManyFeatures.js b/src/levels/remote/pushManyFeatures.js
index 3069169a..ed696d46 100644
--- a/src/levels/remote/pushManyFeatures.js
+++ b/src/levels/remote/pushManyFeatures.js
@@ -7,6 +7,7 @@ exports.level = {
"zh_CN": "你随时都可以使用 undo 或 reset 命令。",
"zh_TW": "你隨時都可以使用 undo 或 reset 指令。",
"es_AR": "Acordate que siempre podés usar los comandos reset y undo",
+ "es_ES": "Recuerda que siempre puedes usar los comandos reset y undo",
"pt_BR": "Lembre-se que você sempre pode usar undo ou reset",
"gl" : "Lembra que sempre podes usar undo ou reset",
"de_DE": "Denk dran, du kannst immer undo oder reset benutzen, um deine Befehle zurück zu nehmen.",
@@ -21,6 +22,7 @@ exports.level = {
"zh_CN": "推送主分支",
"zh_TW": "push master!",
"es_AR": "¡Push Master!",
+ "es_ES": "¡Push Master!",
"pt_BR": "Push Master!",
"gl" : "Empurra ó Master!",
"de_DE": "Push Master!",
@@ -191,6 +193,59 @@ exports.level = {
}
]
},
+ "es_ES": {
+ "childViews": [
+ {
+ "type": "ModalAlert",
+ "options": {
+ "markdowns": [
+ "## Haciendo merge con ramas de trabajo",
+ "",
+ "Ahora que estás cómodo fetcheando, pulleando y pusheando, pongamos a prueba estas habilidades con un nuevo flujo de trabajo.",
+ "",
+ "Es bastante común que los desarrolladores en los grandes proyectos trabajen sobre ramas específicas para cada tarea (feature branches o ramas de trabajo) basadas en `master`, y que las integren sólo cuando estén listas. Esto es similar a la lección anterior, en la que hicimos push de las ramas periféricas al remoto, pero aquí tenemos un paso más.",
+ "",
+ "Algunos desarrolladores sólo pushean y pullean cuando están en `master`: de ese modo, `master` siempre se mantiene actualizado con el remoto (`o/master`).",
+ "",
+ "Entonces, en este flujo de trabajo combinamos dos cosas:",
+ "",
+ "* integramos el trabajo de las ramas específicas a `master`, y",
+ "* pusheamos y pulleamos del remoto"
+ ]
+ }
+ },
+ {
+ "type": "GitDemonstrationView",
+ "options": {
+ "beforeMarkdowns": [
+ "Refresquemos un poco cómo actualizar `master` y pushear nuestro trabajo."
+ ],
+ "afterMarkdowns": [
+ "Ahora ejecutamos dos comandos que:",
+ "",
+ "* rebasearon nuestro trabajo sobre los nuevos commits del remoto, y",
+ "* publicamos nuestro trabajo en ese remoto"
+ ],
+ "command": "git pull --rebase; git push",
+ "beforeCommand": "git clone; git commit; git fakeTeamwork"
+ }
+ },
+ {
+ "type": "ModalAlert",
+ "options": {
+ "markdowns": [
+ "Este nivel es bastante pesado. Aquí tienes algunas ideas para resolverlo:",
+ "",
+ "* Tenemos tres ramas específicas -- `side1` `side2` and `side3`",
+ "* Queremos hacer push de cada una de esas ramas, en orden, al remoto",
+ "* El remoto fue actualizado, así que vamos a tener que integrar esos cambios también",
+ "",
+ ":O ¡Genial! ¡Éxito! Completar este nivel representa un gran avance."
+ ]
+ }
+ }
+ ]
+ },
"pt_BR": {
"childViews": [
{
diff --git a/src/levels/remote/remoteBranches.js b/src/levels/remote/remoteBranches.js
index 82f630cf..813dd4dd 100644
--- a/src/levels/remote/remoteBranches.js
+++ b/src/levels/remote/remoteBranches.js
@@ -7,6 +7,7 @@ exports.level = {
"zh_CN": "远程分支",
"zh_TW": "remote branch (遠端分支)",
"es_AR": "Ramas remotas",
+ "es_ES": "Ramas remotas",
"pt_BR": "Ramos remotos",
"gl" : "Ramas remotas",
"de_DE": "Branches auf entfernten Servern",
@@ -21,6 +22,7 @@ exports.level = {
"zh_CN": "注意顺序 —— 先在 master 分支上提交!",
"zh_TW": "注意順序的問題喔!先在 master branch 上面送 commit",
"es_AR": "Prestá atención al orden: ¡commiteá sobre master primero!",
+ "es_ES": "Presta atención al orden: ¡haz commit sobre master primero!",
"pt_BR": "Preste atenção na ordem: commite no master primeiro!",
"gl" : "Preta atención á orde: fai commit no master primeiro",
"de_DE": "Beachte die Sortierung -- committe zuerst auf dem master!",
@@ -214,6 +216,67 @@ exports.level = {
}
]
},
+ "es_ES": {
+ "childViews": [
+ {
+ "type": "ModalAlert",
+ "options": {
+ "markdowns": [
+ "## Ramas remotas de git",
+ "",
+ "Ahora que viste `git clone` en acción, ahondemos en lo que realmente cambió.",
+ "",
+ "Lo primero que habrás notado es que apareció una nueva rama en tu repositorio local llamada `o/master`. A este tipo de ramas se las llama ramas _remotas_. Las ramas remotas tienen propiedades especiales porque sirven un propósito específico.",
+ "",
+ "Las ramas remotas reflejan el _estado_ de los repositorios remotos (cómo estaban la última vez que hablaste con ellos). Te ayudan a entender las diferencias entre tu trabajo local y el trabajo que ya está publicado - un paso crítico antes de compartir tu trabajo con los demás.",
+ "",
+ "Las ramas remotas tienen la propiedad especial de que cuando haces checkout sobre ellas, pasas al modo detached `HEAD`. Git lo hace a propósito porque no puedes trabajar en esas ramas directamente: tienes que trabajar en algún otro lado y después compartir tu trabajo con el remoto (tras lo que tus ramas remotas se actualizarán)."
+ ]
+ }
+ },
+ {
+ "type": "ModalAlert",
+ "options": {
+ "markdowns": [
+ "### ¿Qué es `o/`?",
+ "",
+ "Podrías estar preguntándote qué significa ese `o/` al principio de las ramas remotas. Bueno, las ramas remotas también tienen una convención de nombres obligatoria -- se muestran con el formato:",
+ "",
+ "* `/`",
+ "",
+ "Entonces, si observas una rama llamada `o/master`, el nombre de la rama es `master`, y el nombre del remoto es `o`.",
+ "",
+ "La mayoría de los desarrolladores llaman `origin` a su remoto en lugar de `o`. Esto es tan común que git efectivamente crea tu remoto llamándolo `origin` cuando haces `git clone` de un repositorio.",
+ "",
+ "Desafortunadamente el nombre `origin` completo no entra en nuestra UI (interfaz de usuario), así que usamos `o` para abreviar :(Simplemente recuerda que cuando uses el git real, tu remoto ¡probablemente se llame `origin`!",
+ "",
+ "Queda mucho por aprender, así que veámoslo en acción."
+ ]
+ }
+ },
+ {
+ "type": "GitDemonstrationView",
+ "options": {
+ "beforeMarkdowns": [
+ "Hagamos checkout sobre una rama remota a ver qué pasa"
+ ],
+ "afterMarkdowns": [
+ "Como ves, git nos puso en el modo detached `HEAD` y no actualizó `o/master` cuando creamos un nuevo commit. Esto ocurre porque `o/master` sólo va a actualizarse cuando el remoto se actualice."
+ ],
+ "command": "git checkout o/master; git commit",
+ "beforeCommand": "git clone"
+ }
+ },
+ {
+ "type": "ModalAlert",
+ "options": {
+ "markdowns": [
+ "Para completar este nivel, haz commit una vez sobre `master` y otra vez después de checkoutear `o/master`. Esto te va a ayudar a aprender cómo las ramas remotas funcionan distinto, y que sólo se actualizan para reflejar el estado del remoto."
+ ]
+ }
+ }
+ ]
+ },
"pt_BR": {
"childViews": [
{
diff --git a/src/levels/remote/sourceNothing.js b/src/levels/remote/sourceNothing.js
index 7b7e58c0..13688b3d 100644
--- a/src/levels/remote/sourceNothing.js
+++ b/src/levels/remote/sourceNothing.js
@@ -11,6 +11,7 @@ exports.level = {
"zh_CN": "没有 source 的 source",
"zh_TW": "沒有 source",
"es_AR": "Origen de nada",
+ "es_ES": "Origen de nada",
"pt_BR": "Origem vazia",
"gl" : "Orixen de nada",
"de_DE": "Die Quelle des Nichts",
@@ -25,6 +26,7 @@ exports.level = {
"zh_CN": "本关的 branch 命令被禁用了,你只能用 fetch!",
"zh_TW": "在本關卡中,不允許使用 branch 指令,因此你只能使用 fetch!",
"es_AR": "El comando branch está deshabilitado para este nivel, así que ¡vas a tener que usar fetch!",
+ "es_ES": "El comando branch está deshabilitado para este nivel, así que ¡vas a tener que usar fetch!",
"pt_BR": "O comando branch está desabilitado para este nível, então você terá de usar o fetch!",
"gl" : "O comando branch está deshabilitado para este nivel, entón terás que empregar o comando fetch!",
"de_DE": "Der branch Befehl ist für diesen Level inaktiv, du musst also fetch benutzen",
@@ -194,6 +196,59 @@ exports.level = {
}
]
},
+ "es_ES": {
+ "childViews": [
+ {
+ "type": "ModalAlert",
+ "options": {
+ "markdowns": [
+ "### Rarezas de ``",
+ "",
+ "Git abusa del parámetro `` de dos extrañas maneras. Estos dos abusos vienen del hecho de que técnicamente puedes especificar \"la nada\" como un `origen` válido tanto para git push como para git fetch. El modo de especificar la nada es a través de un parámetro vacío:",
+ "",
+ "* `git push origin :side`",
+ "* `git fetch origin :bugFix`",
+ "",
+ "Veamos qué hacen estos..."
+ ]
+ }
+ },
+ {
+ "type": "GitDemonstrationView",
+ "options": {
+ "beforeMarkdowns": [
+ "¿Qué hace el hacer push de \"nada\" a una rama remota? ¡La elimina!"
+ ],
+ "afterMarkdowns": [
+ "Ahí está, eliminamos la rama `foo` exitosamente del remoto haciendo push con \"nada\". Tiene algo de sentido..."
+ ],
+ "command": "git push origin :foo",
+ "beforeCommand": "git clone; git push origin master:foo"
+ }
+ },
+ {
+ "type": "GitDemonstrationView",
+ "options": {
+ "beforeMarkdowns": [
+ "Finalmente, hacer fetch de \"nada\" a un lugar local en realidad crea una nueva rama"
+ ],
+ "afterMarkdowns": [
+ "Bastante extraño, pero bueno, da igual. Así es git."
+ ],
+ "command": "git fetch origin :bar",
+ "beforeCommand": "git clone"
+ }
+ },
+ {
+ "type": "ModalAlert",
+ "options": {
+ "markdowns": [
+ "Este es un nivel breve: simplemente elimina una rama remota y crea una nueva usando `git fetch` para completarlo."
+ ]
+ }
+ }
+ ]
+ },
"pt_BR": {
"childViews": [
{
diff --git a/src/levels/remote/tracking.js b/src/levels/remote/tracking.js
index 27393e13..6fc6f59f 100644
--- a/src/levels/remote/tracking.js
+++ b/src/levels/remote/tracking.js
@@ -7,6 +7,7 @@ exports.level = {
"zh_CN": "远程追踪",
"zh_TW": "remote tracking",
"es_AR": "Trackeando remotos",
+ "es_ES": "Trackeando remotos",
"pt_BR": "Seguindo remotos",
"gl" : "Traceando os remotos",
"de_DE": "Remote Tracking",
@@ -21,6 +22,7 @@ exports.level = {
"zh_CN": "记住,有两种设置 remote tracking 的方法!",
"zh_TW": "記住喔,有兩個方式可以去設定 remote tracking",
"es_AR": "¡Acordate de que hay dos formas de trackear un remoto!",
+ "es_ES": "¡Recuerda que hay dos formas de trackear un remoto!",
"pt_BR": "Lembre-se que há duas formas de seguir um ramo remoto!",
"gl" : "¡Lembrate de que hai dúas formas de seguir unha rama remota!",
"de_DE": "Nicht vergessen, es gibt zwei Arten Remote Tracking einzurichten!",
@@ -387,6 +389,126 @@ exports.level = {
}
]
},
+ "es_ES": {
+ "childViews": [
+ {
+ "type": "ModalAlert",
+ "options": {
+ "markdowns": [
+ "### Ramas que trackean remotos",
+ "",
+ "Una de las cosas que te pueden haber parecido \"mágicas\" de las últimas lecciones es que git sabía que la rama `master` estaba relacionada con `o/master`. Obviamente, estas ramas tienen nombres parecidos, y podría parecer lógico conectar la rama `master` del remoto con la rama `master` local, pero esta conexión es bien evidente en dos escenarios:",
+ "",
+ "* Durante una operación de pull, los commits se descargan a `o/master` y después se *mergean* a la rama `master`. El objetivo implícito del merge se determina con esta conexión.",
+ "* Durante un push, el trabajo de la rama `master` se sube a la rama `master` del remoto (que estaba representada localmente por `o/master`). El *destino* del push se determina con esta conexión entre `master` y `o/master`.",
+ ""
+ ]
+ }
+ },
+ {
+ "type": "ModalAlert",
+ "options": {
+ "markdowns": [
+ "## Trackeando remotos",
+ "",
+ "Resumiendo, esta conexión entre `master` y `o/master` se explica simplemente por la propiedad de \"trackear (seguir) remotos\" de las ramas. La rama `master` está configurada para trackear `o/master` -- osea, que hay un objetivo implícito para el merge y un destino implícito para de la rama `master`.",
+ "",
+ "Podrías estar pensando cómo esa propiedad apareció en tu rama `master` si no ejecutaste ningún comando para especificarlo. Bueno, cuando clonas un repositorio con git, esta propiedad es asignada por ti automáticamente.",
+ "",
+ "Durante un clone, git crea una rama remota por cada rama en el remoto (por ejemplo, ramas como `o/master`). Pero después crea una rama local que trackea la rama activa del remote, que suele ser `master`.",
+ "",
+ "Una vez completado el git clone, sólo tienes una única rama local (para que no te asustes) pero puedes ver todas las ramas del remoto (si fueses curioso). ¡Es lo mejor de ambos mundos!",
+ "",
+ "Esto también explica por qué podrías ver un mensaje como este durante la clonación:",
+ "",
+ " local branch \"master\" set to track remote branch \"o/master\"",
+ "",
+ " rama local \"master\" establecida para trackear la rama remota \"o/master\""
+ ]
+ }
+ },
+ {
+ "type": "ModalAlert",
+ "options": {
+ "markdowns": [
+ "### ¿Puedo especificarlo yo?",
+ "",
+ "¡Claro que sí! Puedes hacer que cualquier rama que quieras trackee `o/master`, y si lo hicieras, esa rama va a tener el mismo destino implícito de push y objetivo implícito de merge que `master`. Eso significa que puedes ejecutar `git push` en una rama llamada `absolutamenteNoEsMaster` y ¡que tu trabajo se pushee a la rama `master` del remoto!",
+ "",
+ "Hay dos formas de establecer esta propiedad. La primera es hacer checkout sobre una nueva rama usando una rama remota como la referencia especificada. Ejecutar",
+ "",
+ "`git checkout -b absolutamenteNoEsMaster o/master`",
+ "",
+ "Crea una nueva rama llamada `absolutamenteNoEsMaster` y la hace trackear a `o/master`."
+ ]
+ }
+ },
+ {
+ "type": "GitDemonstrationView",
+ "options": {
+ "beforeMarkdowns": [
+ "Basta de charla, ¡veamos un ejemplo! Vamos a hacer checkout de una nueva rama llamada `foo` y hacer que trackee a `master` en el remoto."
+ ],
+ "afterMarkdowns": [
+ "Como puedes ver, usamos el objetivo implícito de merge `o/master` para actualizar la rama `foo`. ¡Observa cómo `master` no fue actualizada!"
+ ],
+ "command": "git checkout -b foo o/master; git pull",
+ "beforeCommand": "git clone; git fakeTeamwork"
+ }
+ },
+ {
+ "type": "GitDemonstrationView",
+ "options": {
+ "beforeMarkdowns": [
+ "Lo mismo aplica para git push"
+ ],
+ "afterMarkdowns": [
+ "Zas. Hacemos push de nuestro trabajo a la rama `master` del remoto incluso cuando nuestra rama se llamaba totalmente distinto"
+ ],
+ "command": "git checkout -b foo o/master; git commit; git push",
+ "beforeCommand": "git clone"
+ }
+ },
+ {
+ "type": "ModalAlert",
+ "options": {
+ "markdowns": [
+ "### Forma número 2",
+ "",
+ "Otra forma de especificar la rama a trackear es usar la opción `git branch -u`. Ejecutando",
+ "",
+ "`git branch -u o/master foo`",
+ "",
+ "establecemos que la rama `foo` trackee a `o/master`. Si encima estás parado en `foo`, incluso puedes obviarlo:",
+ "",
+ "`git branch -u o/master`",
+ ""
+ ]
+ }
+ },
+ {
+ "type": "GitDemonstrationView",
+ "options": {
+ "beforeMarkdowns": [
+ "Veamos rápidamente esta otra forma de especificar la rama a trackear..."
+ ],
+ "afterMarkdowns": [
+ "Lo mismo que antes, sólo que con un comando bastante más explícito. ¡Muy útil!"
+ ],
+ "command": "git branch -u o/master foo; git commit; git push",
+ "beforeCommand": "git clone; git checkout -b foo"
+ }
+ },
+ {
+ "type": "ModalAlert",
+ "options": {
+ "markdowns": [
+ "¡Perfecto! Para este nivel, haz push de tu trabajo a la rama `master` del remoto *sin* estar parado sobre `master` localmente. Te dejo que te des cuenta del resto solo, que para algo este es el curso avanzado :P"
+ ]
+ }
+ }
+ ]
+ },
"pt_BR": {
"childViews": [
{
From 8aab2437019e80b79e39b373ee20375923ee5bc8 Mon Sep 17 00:00:00 2001
From: flyingbot91
Date: Wed, 18 Dec 2019 23:01:38 +0100
Subject: [PATCH 146/359] Added es_ES translation to levelBuilder.js
---
src/js/dialogs/levelBuilder.js | 19 +++++++++++++++++++
1 file changed, 19 insertions(+)
diff --git a/src/js/dialogs/levelBuilder.js b/src/js/dialogs/levelBuilder.js
index 411a88ae..84bfc59c 100644
--- a/src/js/dialogs/levelBuilder.js
+++ b/src/js/dialogs/levelBuilder.js
@@ -94,6 +94,25 @@ exports.dialog = {
]
}
}],
+ 'es_ES': [{
+ type: 'ModalAlert',
+ options: {
+ markdowns: [
+ '## ¡Bienvenido al constructor de niveles!',
+ '',
+ 'Estos son los pasos principales:',
+ '',
+ ' * Prepara el entorno inicial usando comandos de Git',
+ ' * Define el árbol inicial con ```define start```',
+ ' * Introduce la serie de comandos de git que representan la solución óptima',
+ ' * Crea el árbol objetivo con ```define goal```. El objetivo también determina la solución',
+ ' * Opcionalmente, crea pistas con ```define hint```',
+ ' * Dale un nombre con ```define name```',
+ ' * Opcionalmente, crea un mensaje inicial con ```edit dialog```',
+ ' * ¡Introduce el comando ```finish``` para obtener tu nivel en formato JSON!'
+ ]
+ }
+ }],
'pt_BR': [{
type: 'ModalAlert',
options: {
From a14da63e36b60111a042d1765b6528d0aec94bd4 Mon Sep 17 00:00:00 2001
From: flyingbot91
Date: Wed, 18 Dec 2019 23:03:08 +0100
Subject: [PATCH 147/359] es_ES translation typos
---
src/js/intl/strings.js | 12 ++++++------
1 file changed, 6 insertions(+), 6 deletions(-)
diff --git a/src/js/intl/strings.js b/src/js/intl/strings.js
index 2b27a9ca..e7b982d8 100755
--- a/src/js/intl/strings.js
+++ b/src/js/intl/strings.js
@@ -25,7 +25,7 @@ exports.strings = {
'zh_CN': '要不要试试下一关 *“{nextLevel}”*?',
'zh_TW': '下一關是*「{nextLevel}」*,您要繼續闖關嗎?',
'es_AR': '¿Querés seguir con *"{nextLevel}"*, el próximo nivel?',
- 'es_ES': '¿Quieres seguir al nivel *"{nextLevel}"*, el próximo nivel?',
+ 'es_ES': '¿Quieres pasar al nivel *"{nextLevel}"*, el próximo nivel?',
'pt_BR': 'Você gostaria de ir para o próximo nível: *"{nextLevel}"*?',
'gl' : '¿Gustaríache ir o seguinte nivel: *"{nextLevel}"*?',
'fr_FR': 'Voulez-vous passer à *"{nextLevel}"*, le prochain niveau ?',
@@ -74,7 +74,7 @@ exports.strings = {
'zh_CN': '注意! Mercurial 会进行主动垃圾回收,需要将你的提交树縮小。',
'zh_TW': '注意! Mercurial 會積極地做垃圾收集,而且會因此把你的 tree 給縮小。',
'es_AR': '¡Cuidado! Mercurial hace garbage collection agresivamente y necesita eliminar tu árbol',
- 'es_ES': '¡Cuidado! Mercurial hace la colección de basura agresivamente (para administrar memoria) y necesita podar tu árbol.',
+ 'es_ES': '¡Cuidado! Mercurial hace la recolección de basura agresivamente (para administrar memoria) y necesita podar tu árbol.',
'pt_BR': 'Cuidado! O Mercurial faz coleção de lixo agressiva e precisa prunar sua árvore',
'gl' : '¡Coidado! Mercurial fai que recolección de lixo agresivamente (para limpar memoria) e precisa podar a túa árbore.',
'fr_FR': 'Attention, Mercurial supprime de façon agressive et nécessite un prune du repository',
@@ -106,7 +106,7 @@ exports.strings = {
'zh_CN': '本 App 没有 status 命令哦,因为根本没有 stage 缓存文件。可以用 hg summary 代替哦',
'zh_TW': '本 App 没有 status 命令哦,因为根本没有 stage 缓存文件。可以用 hg summary 代替哦',
'es_AR': 'No hay un comando status para esta aplicación, dado que no hay archivos que indexar. Probá hg summary, en cambio',
- 'es_ES': 'No hay un comando status para esta aplicación, porque que no hay archivos que indexar. Prueba el comando hg summary, en cambio',
+ 'es_ES': 'No hay un comando status para esta aplicación, porque no hay archivos que indexar. Prueba el comando hg summary',
'pt_BR': 'Não existe um comando status para este aplicativo, já que não há staging de arquivos. Tente hg summary',
'gl' : 'Non hai un comando status para esta aplicación, xa que non hai ficheiros que indexar. Proba hg summary',
'fr_FR': 'Il n\'y a pas de commande status pour cette application, car il n\'y a pas de fichier stagé. Essayez hg summary à la place.',
@@ -234,7 +234,7 @@ exports.strings = {
'zh_TW': '你的 origin 分支已經失去了與 remote 遠端分支的同步,所以無法執行 fetch 命令',
'de_DE': 'Dein origin Branch ist nicht auf dem Stand des Remote Branch und fetch kann nicht ausgeführt werden',
'es_AR': 'Tu rama origin está desincronizada con la rama remota, por lo que no se puede hacer el fetch',
- 'es_ES': 'Tu rama origin no está sicronizada con la rama remota, así que un fetch no se puede realizar.',
+ 'es_ES': 'Tu rama origin no está sicronizada con la rama remota, así que el fetch no se puede realizar.',
'pt_BR': 'O fetch não pode ser realizado pois o ramo de origem está fora de sincronia com o ramo remoto',
'gl' : 'O fetch non pode ser realizado xa que a rama de orixe non está sincronizada ca rama remota',
'fr_FR': 'Votre branche origin n\'est plus synchronisée avec la branche distante et fetch ne peut pas être appliqué. Essayez avec l\'option --force',
@@ -249,7 +249,7 @@ exports.strings = {
'zh_TW': '遠端倉庫與你的本地倉庫產生了分歧,故此上傳操作無法通過簡單地快進實現(因此你的 push 被拒絕了)。請 pull 下來遠端裡最新的更改,與本地合併之後再試一次。你可以通過 git pull 或 git pull --rebase 實現。',
'de_DE': 'Das entfernte Repository weicht von deinem lokalen Repository ab, daher können deine Änderungen nicht mit einem einfachen fast forward hochgeladen werden (und daher ist dein push abgelehnt worden). Bitte pull erst die neuen Änderungen in das lokale Repository, integriere sie in den Branch und versuch es nochmal. Das kannst du mit git pull oder git pull --rebase machen',
'es_AR': 'El repositorio remoto divergió de tu repositorio local, por lo que subir tus cambios no es un simple fast forward (y por eso se rechazó tu push). Por favor, hacé pull de los nuevos cambios en el repositorio remoto, incorporalos a esta rama y probá de nuevo. Podés hacerlo con git pull o git pull --rebase',
- 'es_ES': 'El depósito remoto se ha desviado del depósito local. Subir cambios no es un avance rápido sencillo (por eso fue rechazado tu push). Por favor haz pull para descaragar los cambios en el depósito remoto para que los incorpores en la rama actual. Los cambios se pueden hacer pull con el comando "git pull" o "git pull --rebase"',
+ 'es_ES': 'El repositorio remoto se ha desviado del repositorio local. Subir cambios no es un avance en cámara rápida (por eso fue rechazado tu push). Por favor haz pull para descargar los cambios en el repositorio remoto para que los incorpores en la rama actual. Los cambios se pueden hacer pull con el comando "git pull" o "git pull --rebase"',
'pt_BR': 'O repositório remoto divergiu do repositório local, então enviar suas mudanças não é um simples fast forward (e por isso seu push foi rejeitado). Por favor, faça pull das novas mudanças do repositório remoto, incorpore-os a este ramo, e tente novamente. Você pode fazê-lo com git pull ou git pull --rebase',
'gl' : 'O repositorio remoto diverxe do teu repositorio local. Subir os cambios non é un fast-forward (avance rápido) e por iso foi rechazado o teu push. Por favor, fai un pull dos novos cambios do repositorio remoto e inclúeos na túa rama actual. Os cambios pódense facer co comando "git pull" ou "git pull --rebase"',
'fr_FR': 'Le dépôt distant a divergé de votre référentiel local, donc l\'envoi de vos modifications n\'est pas en simple avance rapide (et donc votre envoi a été rejeté). Veuillez récupérer les nouveaux changements depuis le dépôt distant, les intégrer dans cette branche, et essayez à nouveau. Vous pouvez le faire avec git pull ou git pull --rebase',
@@ -696,7 +696,7 @@ exports.strings = {
'zh_CN': '抱歉,为了显示的需要,我们需要一个短些的分支名称。您使用的名称将被截断到9个字符,即 "{branch}"',
'zh_TW': '抱歉,為了顯示的需要,我們需要一個短一點的 branch 名稱。您使用的將會被截斷到剩下9個字元,即"{branch}"',
'es_AR': 'Perdón, necesitamos mantener los nombres de los branches cortos para visualizarlos. El nombre de tu rama se truncó a 9 caracteres, resultando en "{branch}"',
- 'es_ES': 'Perdón, necesitamos mantener los nombres de los branches cortos para visualizarlos. El nombre de tu rama se truncó a 9 caracteres, resultando en "{branch}"',
+ 'es_ES': 'Perdón, necesitamos mantener los nombres de las ramas cortos para visualizarlos. El nombre de tu rama se truncó a 9 caracteres, resultando en "{branch}"',
'pt_BR': 'Desculpe, precisamos manter os nomes dos ramos curtos para visualizá-los. O nome do seu ramo foi truncado para 9 caracteres, resultando em "{branch}"',
'gl' : 'Desculpe, precisamos manter os nomes das ramas curtas para poder velas. O nome da súa rama foi truncada a 9 letras, resultado en "{branch}"',
'fr_FR': 'Désolé, nous devons garder les noms de branches courts pour la visualisation. Votre nom de branche a été tronqué à 9 caractères, devenant "{branch}"',
From 892830add462c333d435de52264b6845e31d970e Mon Sep 17 00:00:00 2001
From: flyingbot91
Date: Wed, 18 Dec 2019 23:09:43 +0100
Subject: [PATCH 148/359] Translated src/js/dialogs to Spanish 'es_ES'
---
src/js/dialogs/confirmShowSolution.js | 10 +++++
src/js/dialogs/nextLevel.js | 11 ++++++
src/js/dialogs/sandbox.js | 56 +++++++++++++++++++++++++++
3 files changed, 77 insertions(+)
diff --git a/src/js/dialogs/confirmShowSolution.js b/src/js/dialogs/confirmShowSolution.js
index 966b993e..08a0df83 100644
--- a/src/js/dialogs/confirmShowSolution.js
+++ b/src/js/dialogs/confirmShowSolution.js
@@ -49,6 +49,16 @@ exports.dialog = {
]
}
}],
+ 'es_ES': [{
+ type: 'ModalAlert',
+ options: {
+ markdowns: [
+ '## ¿Estás seguro de que quieres ver la solución?',
+ '',
+ '¡Creo en ti! ¡Ánimo!'
+ ]
+ }
+ }],
'pt_BR': [{
type: 'ModalAlert',
options: {
diff --git a/src/js/dialogs/nextLevel.js b/src/js/dialogs/nextLevel.js
index 69d0c9ad..8cbbdd04 100644
--- a/src/js/dialogs/nextLevel.js
+++ b/src/js/dialogs/nextLevel.js
@@ -67,6 +67,17 @@ exports.dialog = {
]
}
}],
+ 'es_ES': [{
+ type: 'ModalAlert',
+ options: {
+ markdowns: [
+ '## ¡Buen trabajo!',
+ '',
+ 'Resolviste el nivel en *{numCommands}* comandos; ',
+ 'nuestra mejor solución usa {best}.'
+ ]
+ }
+ }],
'pt_BR': [{
type: 'ModalAlert',
options: {
diff --git a/src/js/dialogs/sandbox.js b/src/js/dialogs/sandbox.js
index 84c69806..f6ddea3b 100644
--- a/src/js/dialogs/sandbox.js
+++ b/src/js/dialogs/sandbox.js
@@ -78,6 +78,62 @@ exports.dialog = {
]
}
}],
+ 'es_ES': [{
+ type: 'ModalAlert',
+ options: {
+ markdowns: [
+ '## ¡Bienvenid@ a Learn Git Branching!',
+ '',
+ 'Esta aplicación está diseñada para ayudar a los principantes ',
+ 'a manejar los poderosos conceptos que hay detrás del trabajo ',
+ 'con ramas (branches) en Git. Esperamos que disfrutes la aplicación ',
+ 'y tal vez incluso ¡que aprendas algo! ',
+ '',
+ '# ¡Demo!',
+ '',
+ 'Si no viste la demo, mírala en esta dirección:',
+ '',
+ '[https://pcottle.github.io/learnGitBranching/?demo](https://pcottle.github.io/learnGitBranching/?demo)',
+ '',
+ '¿Harto de este mensaje? Agrégale `?NODEMO` a la URL para dejar de verlo, como en este link:',
+ '',
+ '[https://pcottle.github.io/learnGitBranching/?NODEMO](?NODEMO)'
+ ]
+ }
+ }, {
+ type: 'ModalAlert',
+ options: {
+ markdowns: [
+ '## Comandos de Git',
+ '',
+ 'Tienes una gran variedad de comandos de git en este sandbox. Estos incluyen: ',
+ '',
+ ' * commit',
+ ' * branch',
+ ' * checkout',
+ ' * cherry-pick',
+ ' * reset',
+ ' * revert',
+ ' * rebase',
+ ' * merge'
+ ]
+ }
+ }, {
+ type: 'ModalAlert',
+ options: {
+ markdowns: [
+ '## ¡Compartí!',
+ '',
+ 'Comparte tus árboles con tus amigos usando `export tree` e `import tree`',
+ '',
+ '¿Tienes una buena lección que compartir? Prueba construyendo un nivel con `build level` o prueba el nivel de un amigo con `import level`',
+ '',
+ 'Para ver todos los comandos disponibles, escribe `show commands`. Hay algunas joyitas como `undo` y `reset`',
+ '',
+ 'Por ahora, arranquemos con los `levels`...'
+ ]
+ }
+ }],
'pt_BR': [{
type: 'ModalAlert',
options: {
From b2fbf6b0092357f0050d04d160bf8d03196364fa Mon Sep 17 00:00:00 2001
From: flyingbot91
Date: Wed, 18 Dec 2019 23:26:14 +0100
Subject: [PATCH 149/359] 'es_ES' translation typos
---
src/js/dialogs/sandbox.js | 4 ++--
1 file changed, 2 insertions(+), 2 deletions(-)
diff --git a/src/js/dialogs/sandbox.js b/src/js/dialogs/sandbox.js
index f6ddea3b..4f048ca0 100644
--- a/src/js/dialogs/sandbox.js
+++ b/src/js/dialogs/sandbox.js
@@ -122,7 +122,7 @@ exports.dialog = {
type: 'ModalAlert',
options: {
markdowns: [
- '## ¡Compartí!',
+ '## ¡Comparte!',
'',
'Comparte tus árboles con tus amigos usando `export tree` e `import tree`',
'',
@@ -130,7 +130,7 @@ exports.dialog = {
'',
'Para ver todos los comandos disponibles, escribe `show commands`. Hay algunas joyitas como `undo` y `reset`',
'',
- 'Por ahora, arranquemos con los `levels`...'
+ 'Por ahora, empecemos con los `levels`...'
]
}
}],
From d5fd75239ff9041bdc927796a9c9808913fc9da8 Mon Sep 17 00:00:00 2001
From: flyingbot91
Date: Wed, 18 Dec 2019 23:52:06 +0100
Subject: [PATCH 150/359] Various 'es_AR' translation typos
---
src/levels/intro/merging.js | 2 +-
src/levels/intro/rebasing.js | 2 +-
src/levels/rampup/interactiveRebase.js | 2 +-
src/levels/remote/clone.js | 4 ++--
src/levels/remote/fakeTeamwork.js | 2 +-
src/levels/remote/fetch.js | 2 +-
src/levels/remote/fetchArgs.js | 2 +-
src/levels/remote/pushArgs.js | 2 +-
src/levels/remote/pushArgs2.js | 8 ++++----
src/levels/remote/remoteBranches.js | 2 +-
src/levels/remote/sourceNothing.js | 2 +-
src/levels/remote/tracking.js | 2 +-
12 files changed, 16 insertions(+), 16 deletions(-)
diff --git a/src/levels/intro/merging.js b/src/levels/intro/merging.js
index 894501ff..c84c6c67 100644
--- a/src/levels/intro/merging.js
+++ b/src/levels/intro/merging.js
@@ -250,7 +250,7 @@ exports.level = {
"",
"¡Genial! Ya sabemos cómo commitear y cómo crear ramas. Ahora tenemos que aprender algún modo de unificar el trabajo de dos ramas diferentes. Esto nos va a permitir abrir una nueva rama de desarrollo, implementar alguna nueva funcionalidad, y después unirla de nuevo con el trabajo principal.",
"",
- "El primer método para combinarlas que vamos a explorar es `git merge`. Mergear en Git crea un commit especial que tiene dos padres diferentes. Un commit con dos padres escencialmente significa \"Quiero incluir todo el trabajo de este padre de acá y este otro padre de acá, *y* del conjunto de todos sus ancestros\"",
+ "El primer método para combinarlas que vamos a explorar es `git merge`. Mergear en Git crea un commit especial que tiene dos padres diferentes. Un commit con dos padres esencialmente significa \"Quiero incluir todo el trabajo de este padre de acá y este otro padre de acá, *y* del conjunto de todos sus ancestros\"",
"",
"Es más simple visualizarlo, veámoslo a continuación"
]
diff --git a/src/levels/intro/rebasing.js b/src/levels/intro/rebasing.js
index 29a46107..609043fe 100644
--- a/src/levels/intro/rebasing.js
+++ b/src/levels/intro/rebasing.js
@@ -242,7 +242,7 @@ exports.level = {
"markdowns": [
"## Git Rebase",
"",
- "El segundo modo de combinar el trabajo de distintas ramas es el *rebase*. Rebasear escencialmente agarra un conjunto de commits, los \"copia\", y los aplica sobre algún otro lado.",
+ "El segundo modo de combinar el trabajo de distintas ramas es el *rebase*. Rebasear esencialmente agarra un conjunto de commits, los \"copia\", y los aplica sobre algún otro lado.",
"",
"Aunque esto pueda sonar confuso, la ventaja de rebasear es que puede usarse para conseguir una secuencia de commits lineal, más bonita. El historial / log de commits del repositorio va a estar mucho más claro si sólo usás rebase.",
"",
diff --git a/src/levels/rampup/interactiveRebase.js b/src/levels/rampup/interactiveRebase.js
index 39ceeeb8..ff66a280 100644
--- a/src/levels/rampup/interactiveRebase.js
+++ b/src/levels/rampup/interactiveRebase.js
@@ -319,7 +319,7 @@ exports.level = {
"",
"Si incluís esta opción, git abrirá una UI para mostrarte qué commits están a punto de ser copiados sobre el objetivo del rebase. También muestra sus hashes y mensajes, que ayuda mucho para saber qué es cada commit.",
"",
- "Para el git \"de verdad\", la UI signfica abrir un archivo en un editor de textos como `vim`. Para nuestro propósito, hice una pequeña interfaz que se comporta de ese mismo modo."
+ "Para el git \"de verdad\", la UI significa abrir un archivo en un editor de textos como `vim`. Para nuestro propósito, hice una pequeña interfaz que se comporta de ese mismo modo."
]
}
},
diff --git a/src/levels/remote/clone.js b/src/levels/remote/clone.js
index 5ef9ff65..90ed2382 100644
--- a/src/levels/remote/clone.js
+++ b/src/levels/remote/clone.js
@@ -160,7 +160,7 @@ exports.level = {
"",
"- Más importante, ¡los remotos sociabilizan la programación! Ahora que hay una copia de tu proyecto hosteada en otro lugar, tus amigos pueden contribuir a tu proyecto (o bajarse los últimos cambios) de un modo muy sencillo.",
"",
- "Se volvió bastante popular el uso de sitios web que muestran la actividad de los repositorios (como [Github](https://github.com/) or [Phabricator](http://phabricator.org/)), pero esos repositorios remotos _siempre_ sirven como el la base subyacente de esas herramientas. Así que ¡es importante entenderlos!"
+ "Se volvió bastante popular el uso de sitios web que muestran la actividad de los repositorios (como [Github](https://github.com/) or [Phabricator](http://phabricator.org/)), pero esos repositorios remotos _siempre_ sirven como la base subyacente de esas herramientas. Así que ¡es importante entenderlos!"
]
}
},
@@ -170,7 +170,7 @@ exports.level = {
"markdowns": [
"## Nuestro comando para crear remotos",
"",
- "Hasta este punto, Learn Git Branching se centró en eseñar las bases del trabajo _local_ con repositorios (branchear, mergear, rebasear, etc). Sin embargo, ahora que queremos aprender sobre el trabajo con repositorios remotos, necesitamos un comando para inicializar nuestro entorno para esas lecciones. Ese comando será `git clone`",
+ "Hasta este punto, Learn Git Branching se centró en enseñar las bases del trabajo _local_ con repositorios (branchear, mergear, rebasear, etc). Sin embargo, ahora que queremos aprender sobre el trabajo con repositorios remotos, necesitamos un comando para inicializar nuestro entorno para esas lecciones. Ese comando será `git clone`",
"",
"Técnicamente, `git clone` en el mundo real es el comando que usarías para crear copias _locales_ de un repositorio remoto (uno de GitHub, por ejemplo). Acá usamos este comando de un modo un tanto distinto, en cambio -- `git clone` va a crear un repositorio remoto a partir del tuyo local. Estamos de acuerdo en que es el significado técnicamente opuesto al del comando real, pero ayuda bastante a entender la conexión entre el clonado y el trabajo en un repositorio remoto, así que vamos a vivir con ello por ahora.",
""
diff --git a/src/levels/remote/fakeTeamwork.js b/src/levels/remote/fakeTeamwork.js
index ca08387f..ce278497 100644
--- a/src/levels/remote/fakeTeamwork.js
+++ b/src/levels/remote/fakeTeamwork.js
@@ -149,7 +149,7 @@ exports.level = {
"",
"Entonces, hay algo medio tramposo acá -- para algunas de las lecciones siguientes, necesitamos explicarte cómo bajar cambios introducidos en el repositorio remoto.",
"",
- "Eso significa que escencialmente tenemos que \"hacer de cuenta\" que el repositorio remoto fue actualizado por alguún colega, amigo o colaborador tuyo, incluso a veces en alguna rama específica o una cantidad determinada de commits.",
+ "Eso significa que esencialmente tenemos que \"hacer de cuenta\" que el repositorio remoto fue actualizado por algún colega, amigo o colaborador tuyo, incluso a veces en alguna rama específica o una cantidad determinada de commits.",
"",
"Para lograr esto, introdujimos el bien llamado comando ¡`git fakeTeamwork`! Es bastante auto-explicativo: simula trabajo de nuestros colegas. Veamos una demo..."
]
diff --git a/src/levels/remote/fetch.js b/src/levels/remote/fetch.js
index 29c94e80..c50a3c2a 100644
--- a/src/levels/remote/fetch.js
+++ b/src/levels/remote/fetch.js
@@ -217,7 +217,7 @@ exports.level = {
"* baja los commits que el remoto tiene pero no están en nuestro repositorio local, y...",
"* actualiza a dónde apuntan nuestras ramas remotas (por ejemplo, `o/master`)",
"",
- "`git fetch` escencialmente sincroniza nuestra representación _local_ del repositorio remoto con el _verdadero_ estado del repositorio remoto (en este momento).",
+ "`git fetch` esencialmente sincroniza nuestra representación _local_ del repositorio remoto con el _verdadero_ estado del repositorio remoto (en este momento).",
"",
"Si recordás la lección anterior, dijimos que las ramas remotas reflejan el estado de los repositorios remotos _desde_ la última vez que hablaste con ellos. ¡`git fetch` es la manera en que hablás con esos remotos! Espero que ahora esté clara la conexión entre las ramas remotas y `git fetch`.",
"",
diff --git a/src/levels/remote/fetchArgs.js b/src/levels/remote/fetchArgs.js
index ee0bccd9..64538117 100644
--- a/src/levels/remote/fetchArgs.js
+++ b/src/levels/remote/fetchArgs.js
@@ -343,7 +343,7 @@ exports.level = {
"",
"Este es el único problemita, igual: `` es ahora un lugar en el *remoto*, y `` es un lugar *local* en donde poner esos commits. Es exactamente lo opuesto a git push, y eso tiene sentido dado que ¡estamos transfiriendo los datos en la dirección opuesta!",
"",
- "Habiendo dicho esto, dificilmente alguien use esto en la práctica. Lo estoy presentando principalmente como un modo de conceptualizar que `fetch` y `push` son bastante similares, sólo que en direcciones opuestas."
+ "Habiendo dicho esto, difícilmente alguien use esto en la práctica. Lo estoy presentando principalmente como un modo de conceptualizar que `fetch` y `push` son bastante similares, sólo que en direcciones opuestas."
]
}
},
diff --git a/src/levels/remote/pushArgs.js b/src/levels/remote/pushArgs.js
index f1810aec..681b991a 100644
--- a/src/levels/remote/pushArgs.js
+++ b/src/levels/remote/pushArgs.js
@@ -189,7 +189,7 @@ exports.level = {
"markdowns": [
"## Parámetros de push",
"",
- "¡Genial! Ahora que sabés acerca de las ramas que trackean remotos podemos empezar a develar algo del misterio detrás de git push, fetch y pull. Vamos a atacar de a un comando a la vez, pero los conceptos entre ellos son muy similares.",
+ "¡Genial! Ahora que sabés acerca de las ramas que trackean remotos podemos empezar a desvelar algo del misterio detrás de git push, fetch y pull. Vamos a atacar de a un comando a la vez, pero los conceptos entre ellos son muy similares.",
"",
"Veamos primero `git push`. Ya aprendiste en la lección sobre ramas remotas que git determinó el remoto *y* la rama a la que pushear mirando las propiedades de la rama actual (el remoto al que \"trackea\"). Este es el comportamiento default para cuando no se especifican parámetros, pero git push toma, opcionalmente, parámetros de la forma:",
"",
diff --git a/src/levels/remote/pushArgs2.js b/src/levels/remote/pushArgs2.js
index 80a104bb..1aa603e0 100644
--- a/src/levels/remote/pushArgs2.js
+++ b/src/levels/remote/pushArgs2.js
@@ -181,9 +181,9 @@ exports.level = {
"",
"Acordate de la lección anterior que cuando especificamos `master` como el parámetro lugar de git push, especificamos tanto el *origen* del que sacar los commits como el *destino* al que enviarlos.",
"",
- "Podrías estár preguntándote ¿Y si quisieramos que el origen y el destino sean distintos? ¿Si quisieras pushear los commits de la rama local `foo` a la rama `bar` del remote?",
+ "Podrías estar preguntándote ¿Y si quisiéramos que el origen y el destino sean distintos? ¿Si quisieras pushear los commits de la rama local `foo` a la rama `bar` del remote?",
"",
- "Bueno, lamentablemente eso no se puede hacer en git... ¡Bazinga! Claro que se puede :)... git es extremadísimamente flexible (casi casi que demsiado).",
+ "Bueno, lamentablemente eso no se puede hacer en git... ¡Bazinga! Claro que se puede :)... git es extremadísimamente flexible (casi casi que demasiado).",
"",
"Veamos cómo hacerlo a continuación..."
]
@@ -199,7 +199,7 @@ exports.level = {
"",
"Esto se lo suele llamar refspec con dos puntos. Refspec es simplemente un nombre cool para una ubicación que git puede entender (como la rama `foo`, o incluso `HEAD~1`)",
"",
- "Una vez que especificás tanto el origen como el destino independientemente, podés ponerte bastante cómodo y preciso con los comandos remotos. ¡Veámos una demo!"
+ "Una vez que especificás tanto el origen como el destino independientemente, podés ponerte bastante cómodo y preciso con los comandos remotos. ¡Veamos una demo!"
]
}
},
@@ -220,7 +220,7 @@ exports.level = {
"type": "GitDemonstrationView",
"options": {
"beforeMarkdowns": [
- "¿Y qué hay si el destino que al querés pushear no existe? ¡No hay drama! Simplemente dale un nombre al branch y git se va a encargar de creártelo en el remoto."
+ "¿Y qué hay si el destino al que querés pushear no existe? ¡No hay drama! Simplemente dale un nombre al branch y git se va a encargar de creártelo en el remoto."
],
"afterMarkdowns": [
"Genial, simplemente fluye :D"
diff --git a/src/levels/remote/remoteBranches.js b/src/levels/remote/remoteBranches.js
index 82f630cf..f65d313a 100644
--- a/src/levels/remote/remoteBranches.js
+++ b/src/levels/remote/remoteBranches.js
@@ -165,7 +165,7 @@ exports.level = {
"",
"Lo primero que habrás notado es que apareció una nueva rama en tu repositorio local llamada `o/master`. A este tipo de ramas se las llama ramas _remotas_. Las ramas remotas tienen propiedades especiales porque sirven un propósito específico.",
"",
- "Las ramas remotas reflejan el _estado_ de los repositorios remotos (como estaban la última vez que hablaste con ellos). Te ayudan a entender las diferencias entre tu trabajo local y el trabajo que ya está publicado - un paso crítico antes de compartir tu trabajo con los demás.",
+ "Las ramas remotas reflejan el _estado_ de los repositorios remotos (cómo estaban la última vez que hablaste con ellos). Te ayudan a entender las diferencias entre tu trabajo local y el trabajo que ya está publicado - un paso crítico antes de compartir tu trabajo con los demás.",
"",
"Las ramas remotas tienen la propiedad especial de que cuando las checkouteás, pasás al modo detached `HEAD`. Git lo hace a propósito porque no podés trabajar en esas ramas directamente: tenés que trabajar en algún otro lado y después compartir tu trabajo con el remoto (tras lo que tus ramas remotas se actualizarán)."
]
diff --git a/src/levels/remote/sourceNothing.js b/src/levels/remote/sourceNothing.js
index 7b7e58c0..d28a5330 100644
--- a/src/levels/remote/sourceNothing.js
+++ b/src/levels/remote/sourceNothing.js
@@ -149,7 +149,7 @@ exports.level = {
"markdowns": [
"### Rarezas de ``",
"",
- "Git abusa del parámetro `` de dos extrañas maneras. Estos dos abusos vienen del hecho de que tecnicamente podés especificar \"la nada\" como un `origen` válido tanto para git push como para git fetch. El modo de especificar la nada es a través de un parámetro vacío:",
+ "Git abusa del parámetro `` de dos extrañas maneras. Estos dos abusos vienen del hecho de que técnicamente podés especificar \"la nada\" como un `origen` válido tanto para git push como para git fetch. El modo de especificar la nada es a través de un parámetro vacío:",
"",
"* `git push origin :side`",
"* `git fetch origin :bugFix`",
diff --git a/src/levels/remote/tracking.js b/src/levels/remote/tracking.js
index 27393e13..fc0d1966 100644
--- a/src/levels/remote/tracking.js
+++ b/src/levels/remote/tracking.js
@@ -311,7 +311,7 @@ exports.level = {
"markdowns": [
"### ¿Puedo especificarlo yo?",
"",
- "¡Claro que sí! Podés hacer que cualquier rama que quieras trackee `o/master`, y si lo hicieras, esa rama va a tener el mismo destino implícito de push y objetivo implícito de merge que `master`. Eso signfica que podés correr `git push` en una rama llamada `absolutamenteNoEsMaster` y ¡que tu trabajo se pushee a la rama `master` del remoto!",
+ "¡Claro que sí! Podés hacer que cualquier rama que quieras trackee `o/master`, y si lo hicieras, esa rama va a tener el mismo destino implícito de push y objetivo implícito de merge que `master`. Eso significa que podés correr `git push` en una rama llamada `absolutamenteNoEsMaster` y ¡que tu trabajo se pushee a la rama `master` del remoto!",
"",
"Hay dos formas de establecer esta propiedad. La primera es checkoutear una nueva rama usando una rama remota como la referencia especificada. Ejecutar",
"",
From 645862e64eb8be7a9a8034ba0a8ce039b2c41d7e Mon Sep 17 00:00:00 2001
From: flyingbot91
Date: Fri, 20 Dec 2019 00:07:47 +0100
Subject: [PATCH 151/359] Update src/levels/remote/clone.js
Co-Authored-By: Matias Garcia Isaia
---
src/levels/remote/clone.js | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/src/levels/remote/clone.js b/src/levels/remote/clone.js
index 90ed2382..391b8cf1 100644
--- a/src/levels/remote/clone.js
+++ b/src/levels/remote/clone.js
@@ -160,7 +160,7 @@ exports.level = {
"",
"- Más importante, ¡los remotos sociabilizan la programación! Ahora que hay una copia de tu proyecto hosteada en otro lugar, tus amigos pueden contribuir a tu proyecto (o bajarse los últimos cambios) de un modo muy sencillo.",
"",
- "Se volvió bastante popular el uso de sitios web que muestran la actividad de los repositorios (como [Github](https://github.com/) or [Phabricator](http://phabricator.org/)), pero esos repositorios remotos _siempre_ sirven como la base subyacente de esas herramientas. Así que ¡es importante entenderlos!"
+ "Se volvió bastante popular el uso de sitios web que muestran la actividad de los repositorios (como [Github](https://github.com/) o [Phabricator](http://phabricator.org/)), pero esos repositorios remotos _siempre_ sirven como la base subyacente de esas herramientas. Así que ¡es importante entenderlos!"
]
}
},
From f6d0ab7e7590db96ee084901812c1b260203148d Mon Sep 17 00:00:00 2001
From: Peter Cottle
Date: Thu, 2 Jan 2020 15:01:53 -0800
Subject: [PATCH 152/359] Other version of PR #624 -- map header directly from
browser
---
src/js/stores/LocaleStore.js | 3 ++-
1 file changed, 2 insertions(+), 1 deletion(-)
diff --git a/src/js/stores/LocaleStore.js b/src/js/stores/LocaleStore.js
index 2be9c38b..32110784 100644
--- a/src/js/stores/LocaleStore.js
+++ b/src/js/stores/LocaleStore.js
@@ -25,7 +25,8 @@ var langLocaleMap = {
var headerLocaleMap = {
'zh-CN': 'zh_CN',
'zh-TW': 'zh_TW',
- 'pt-BR': 'pt_BR'
+ 'pt-BR': 'pt_BR',
+ 'es-ES': 'es_ES'
};
var supportedLocalesList = Object.values(langLocaleMap)
From 5e703a0489766df346702896998ad51e2f94c273 Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?=E8=AF=BA=E5=A2=A8?=
Date: Tue, 14 Jan 2020 15:32:59 +0800
Subject: [PATCH 153/359] fix(typo): fix a typo in Chinese
---
src/levels/mixed/jugglingCommits2.js | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/src/levels/mixed/jugglingCommits2.js b/src/levels/mixed/jugglingCommits2.js
index bfac0c16..ca42978b 100644
--- a/src/levels/mixed/jugglingCommits2.js
+++ b/src/levels/mixed/jugglingCommits2.js
@@ -397,7 +397,7 @@ exports.level = {
"markdowns": [
"## 提交的技巧 #2",
"",
- "*如果你还没有完成“提交的技巧 #1”(前一关)的话,请选通过以后再来!*",
+ "*如果你还没有完成“提交的技巧 #1”(前一关)的话,请先通过以后再来!*",
"",
"正如你在上一关所见到的,我们可以使用 `rebase -i` 对提交记录进行重新排序。只要把我们想要的提交记录挪到最前端,我们就可以很轻松的用 `--amend` 修改它,然后把它们重新排成我们想要的顺序。",
"",
From 977150ad7f2ea1ce05ad37417f7cf18905a20fa0 Mon Sep 17 00:00:00 2001
From: Damotorie
Date: Fri, 17 Jan 2020 15:01:23 +0900
Subject: [PATCH 154/359] Update pullArgs.js
Fix Korean typo
---
src/levels/remote/pullArgs.js | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/src/levels/remote/pullArgs.js b/src/levels/remote/pullArgs.js
index e9e1cbb4..07270049 100644
--- a/src/levels/remote/pullArgs.js
+++ b/src/levels/remote/pullArgs.js
@@ -805,7 +805,7 @@ exports.level = {
"",
"`git fetch origin bar~1:bugFix; git merge bugFix`",
"",
- "보이죠? git pull은 그저 fetch + merge의 축양형일 뿐이에요, 그리고 git pull은 커밋들이 도착하는곳을 신경씁니다(fetch를 하며 지정된 `destination`인자의 위치로 merge가 수행됩니다).",
+ "보이죠? git pull은 그저 fetch + merge의 축약형일 뿐이에요, 그리고 git pull은 커밋들이 도착하는곳을 신경씁니다(fetch를 하며 지정된 `destination`인자의 위치로 merge가 수행됩니다).",
"",
"직접 확인해봅시다:"
]
From 2622c3eb7a2ae3f8aaa3427127ac31dafe46b29b Mon Sep 17 00:00:00 2001
From: duongtiendat1990 <48908567+duongtiendat1990@users.noreply.github.com>
Date: Sat, 25 Jan 2020 17:51:46 +0700
Subject: [PATCH 155/359] complete translate to Vietnamese
---
src/js/dialogs/confirmShowSolution.js | 10 +
src/js/dialogs/levelBuilder.js | 19 +
src/js/dialogs/nextLevel.js | 11 +
src/js/dialogs/sandbox.js | 22 +
src/js/intl/strings.js | 275 +++--
src/js/stores/LocaleStore.js | 3 +-
src/levels/advanced/multipleParents.js | 93 +-
src/levels/index.js | 16 +-
src/levels/intro/branching.js | 90 +-
src/levels/intro/merging.js | 75 +-
src/levels/intro/rebasing.js | 73 +-
src/levels/mixed/describe.js | 1189 ++++++++++----------
src/levels/mixed/grabbingOneCommit.js | 45 +-
src/levels/mixed/jugglingCommits.js | 40 +-
src/levels/mixed/jugglingCommits2.js | 49 +-
src/levels/mixed/tags.js | 58 +-
src/levels/rampup/cherryPick.js | 63 +-
src/levels/rampup/detachedHead.js | 1428 +++++++++++++-----------
src/levels/rampup/interactiveRebase.js | 73 +-
src/levels/rampup/relativeRefs.js | 81 +-
src/levels/rampup/relativeRefs2.js | 76 +-
src/levels/rampup/reversingChanges.js | 70 +-
src/levels/rebase/manyRebases.js | 24 +-
src/levels/rebase/selectiveRebase.js | 26 +-
src/levels/remote/clone.js | 63 +-
src/levels/remote/fakeTeamwork.js | 60 +-
src/levels/remote/fetch.js | 79 +-
src/levels/remote/fetchArgs.js | 129 ++-
src/levels/remote/fetchRebase.js | 149 ++-
src/levels/remote/mergeManyFeatures.js | 51 +-
src/levels/remote/pull.js | 65 +-
src/levels/remote/pullArgs.js | 80 +-
src/levels/remote/push.js | 49 +-
src/levels/remote/pushArgs.js | 81 +-
src/levels/remote/pushArgs2.js | 76 +-
src/levels/remote/pushManyFeatures.js | 59 +-
src/levels/remote/remoteBranches.js | 67 +-
src/levels/remote/sourceNothing.js | 57 +-
src/levels/remote/tracking.js | 124 +-
39 files changed, 3701 insertions(+), 1397 deletions(-)
diff --git a/src/js/dialogs/confirmShowSolution.js b/src/js/dialogs/confirmShowSolution.js
index 966b993e..4b50e1f2 100644
--- a/src/js/dialogs/confirmShowSolution.js
+++ b/src/js/dialogs/confirmShowSolution.js
@@ -114,6 +114,16 @@ exports.dialog = {
'Я вірю в тебе! Ти впораєшся!'
]
}
+ }],
+ 'vi': [{
+ type: 'ModalAlert',
+ options: {
+ markdowns: [
+ '## Bạn chắc là muốn xem đáp án chứ?',
+ '',
+ 'Tôi tin ở bạn! Bạn có thể làm được!'
+ ]
+ }
}]
};
diff --git a/src/js/dialogs/levelBuilder.js b/src/js/dialogs/levelBuilder.js
index 411a88ae..4442c09b 100644
--- a/src/js/dialogs/levelBuilder.js
+++ b/src/js/dialogs/levelBuilder.js
@@ -229,4 +229,23 @@ exports.dialog = {
]
}
}],
+ 'vi': [{
+ type: 'ModalAlert',
+ options: {
+ markdowns: [
+ '## Chào mừng đến trình tạo cấp độ!',
+ '',
+ 'Có những bước chính sau:',
+ '',
+ ' * Khởi tạo môi trường với các lệnh git',
+ ' * Định nghĩa cây để bắt đầu với ```define start```',
+ ' * Nhập chuỗi lệnh git để tạo đáp án (tốt nhất) của bạn',
+ ' * Định nghĩa cây mục tiêu với ```define goal```. Định nghĩa mục tiêu đồng thời cũng xác định đáp án',
+ ' * Có thể định nghĩa gợi ý với ```define hint```',
+ ' * Chỉnh sửa tên với ```define name```',
+ ' * Có thể định nghĩa hội thoại bắt đầu với ```edit dialog```',
+ ' * Nhập lệnh ```finish``` xuất cấp độ của bạn dưới dạng JSON!'
+ ]
+ }
+ }]
};
diff --git a/src/js/dialogs/nextLevel.js b/src/js/dialogs/nextLevel.js
index 69d0c9ad..ce4de5c5 100644
--- a/src/js/dialogs/nextLevel.js
+++ b/src/js/dialogs/nextLevel.js
@@ -133,4 +133,15 @@ exports.dialog = {
]
}
}],
+ 'vi': [{
+ type: 'ModalAlert',
+ options: {
+ markdowns: [
+ '## Làm tốt lắm!!',
+ '',
+ 'Bạn hoàn thành cấp độ này với *{numCommands}* câu lệnh.; ',
+ 'Đáp án của chúng tôi sử dụng {best}.'
+ ]
+ }
+ }]
};
diff --git a/src/js/dialogs/sandbox.js b/src/js/dialogs/sandbox.js
index 84c69806..96512c66 100644
--- a/src/js/dialogs/sandbox.js
+++ b/src/js/dialogs/sandbox.js
@@ -557,5 +557,27 @@ exports.dialog = {
'[це спеціальне посилання.](https://pcottle.github.io/learnGitBranching/?NODEMO)'
]
}
+ }],
+ 'vi': [{
+ type: 'ModalAlert',
+ options: {
+ markdowns: [
+ '## Chào mừng đến với Học Nhánh Git',
+ '',
+ 'Bạn có hứng thú học Git? Bạn đến đúng nơi rồi đấy! ',
+ '"Học Nhánh Git" là cách trực quan và hiệu quả nhất để học Git trên web; ',
+ 'thông qua một loạt các thử thách cấp độ thú vị, bạn sẽ từng bước tìm hiểu sức mạnh của git',
+ '',
+ 'Sau khi hội thoại này đóng lại, bạn sẽ thấy nhiều cấp độ mà chúng tôi cung cấp. ',
+ 'Nếu bạn là người mới thì hãy bắt đầu từ bài đầu tiên. Nếu bạn đã có hiểu biết cơ bản về git, ',
+ 'hãy thử những bài mang tính thách thức hơn phía sau.',
+ '',
+ 'Bạn có thể dùng lệnh `show commands` để xem tất cả các lệnh hiện hữu.',
+ '',
+ 'Ghi chú: Nếu muốn trực tiếp vào hộp cát ở lần sau?',
+ 'Hãy dùng',
+ '[đường link đặc biệt này của chúng tôi](https://pcottle.github.io/learnGitBranching/?NODEMO)'
+ ]
+ }
}]
};
diff --git a/src/js/intl/strings.js b/src/js/intl/strings.js
index 2b27a9ca..7d66ede6 100755
--- a/src/js/intl/strings.js
+++ b/src/js/intl/strings.js
@@ -14,7 +14,8 @@ exports.strings = {
'fr_FR': 'Félicitations, vous avez réussi le dernier niveau !',
'ru_RU': 'Вау! Вы прошли последний уровень, отлично!',
'uk': 'Вау! Ти пройшов останній рівень, круто!',
- 'ko': '와우! 마지막 레벨까지 마쳤습니다. 멋지네요!'
+ 'ko': '와우! 마지막 레벨까지 마쳤습니다. 멋지네요!',
+ 'vi': 'Wao! Bạn đã phá đảo, quá tuyệt!'
},
///////////////////////////////////////////////////////////////////////////
'finish-dialog-next': {
@@ -31,7 +32,8 @@ exports.strings = {
'fr_FR': 'Voulez-vous passer à *"{nextLevel}"*, le prochain niveau ?',
'ru_RU': 'Хотите перейти на следующий уровень: *"{nextLevel}"*?',
'uk': 'Хочеш перейти на наступний рівень -- *"{nextLevel}"*?',
- 'ko': '다음 레벨로 넘어갈까요? 레벨 *"{nextLevel}"*'
+ 'ko': '다음 레벨로 넘어갈까요? 레벨 *"{nextLevel}"*',
+ 'vi': 'Bạn có muốn chuyển sang cấp độ tiếp: *"{nextLevel}"* không?'
},
///////////////////////////////////////////////////////////////////////////
'finish-dialog-win': {
@@ -48,7 +50,8 @@ exports.strings = {
'fr_FR': 'Fabuleux ! Votre solution a égalé ou surpassé notre solution.',
'ru_RU': 'Отлично! Ваше решение соответствует или превосходит наше.',
'uk': 'Чудово! Твій розв’язок на рівні або кращий від нашого.',
- 'ko': '멋져요! 우리의 해답과 일치하거나 우리보다 좀 더 나은 해답입니다.'
+ 'ko': '멋져요! 우리의 해답과 일치하거나 우리보다 좀 더 나은 해답입니다.',
+ 'vi': 'Tuyệt vời! Đáp án của bạn đạt chuẩn thâm chí có thể tốt hơn.'
},
///////////////////////////////////////////////////////////////////////////
'finish-dialog-lose': {
@@ -65,7 +68,8 @@ exports.strings = {
'fr_FR': 'Voyons si vous pouvez descendre à {best} :D',
'ru_RU': 'Попробуйте, может вы сможете уложиться в {best} : D',
'uk': 'Спробуй, можливо ти зможеш вкластися в {best} кроків :D',
- 'ko': '{best}회로 줄일 수 있다면 해보세요. :D'
+ 'ko': '{best}회로 줄일 수 있다면 해보세요. :D',
+ 'vi': 'Thử xem bạn có thể giảm xuống {best} không? :D'
},
///////////////////////////////////////////////////////////////////////////
'hg-prune-tree': {
@@ -81,7 +85,8 @@ exports.strings = {
'de_DE': 'Achtung! Mercurial macht aggressive Garbage Collection und muss daher deinen Baum reduzieren',
'ru_RU': 'Внимание! Mercurial использует агрессивный сборщик мусора и обрезает ваше дерево',
'uk': 'Увага! Mercurial агресивно збирає сміття й може обрізати твоє дерево ',
- 'ko': '주의! Mercurial은 공격적으로 가비지 컬렉션을 수행하므로 트리를 정리할 필요가 있습니다.'
+ 'ko': '주의! Mercurial은 공격적으로 가비지 컬렉션을 수행하므로 트리를 정리할 필요가 있습니다.',
+ 'vi': 'Cảnh báo! Mercurial cần thực hiện thu gom rác và thu nhỏ cây lịch sử của bạn.'
},
///////////////////////////////////////////////////////////////////////////
'hg-a-option': {
@@ -97,7 +102,8 @@ exports.strings = {
'fr_FR': 'L\'option -A n\'est pas nécessaire pour cette application, simplement commiter',
'ru_RU': 'Опция -A не требуется для этого приложения, просто сделайте коммит.',
'uk': 'Опція -A не потрібна для цього застосунку, можна просто комітити!',
- 'ko': '이 앱에선 -A 옵션은 필요 없습니다. 그냥 커밋하세요!'
+ 'ko': '이 앱에선 -A 옵션은 필요 없습니다. 그냥 커밋하세요!',
+ 'vi': 'Không cần thiết phải dùng tùy chọn -A trên ứng dụng này, cứ commit là được!'
},
///////////////////////////////////////////////////////////////////////////
'hg-error-no-status': {
@@ -113,7 +119,8 @@ exports.strings = {
'de_DE': 'Es gibt keinen Befehl status in dieser Anwendung, da es kein Staging von Dateien gibt. Probier stattdessen hg summary',
'ru_RU': 'Команда status не поддерживается в этом приложении, так как здесь нет файлов. Попробуйте выполнить hg summary',
'uk': 'Команда status не підтримується в цьому застосунку, так як немає стейджингу(staging) файлів. Натомість спробуй hg summary ',
- 'ko': '이 앱을 위한 상태 명령어는 없습니다. 왜냐하면 파일들의 스테이징이 없기 때문입니다. 대신 hg summary를 시도해보세요.'
+ 'ko': '이 앱을 위한 상태 명령어는 없습니다. 왜냐하면 파일들의 스테이징이 없기 때문입니다. 대신 hg summary를 시도해보세요.',
+ 'vi': 'Ứng dụng này không hỗ trợ lệnh `status` vì không có tệp nhớ đệm, thay vì đó hãy dùng lệnh `hg summary`'
},
///////////////////////////////////////////////////////////////////////////
'hg-error-need-option': {
@@ -129,7 +136,8 @@ exports.strings = {
'de_DE': 'Ich benötige die Option {option} für diesen Befehl!',
'ru_RU': 'Для этой команды требуется опция {option}',
'uk': 'Для цієї команди потрібна опція {option}',
- 'ko': '나는 그 명령어를 위한 {option} 옵션이 필요합니다.'
+ 'ko': '나는 그 명령어를 위한 {option} 옵션이 필요합니다.',
+ 'vi': 'Câu lệnh đó cần tùy chọn {option}!'
},
///////////////////////////////////////////////////////////////////////////
'hg-error-log-no-follow': {
@@ -145,7 +153,8 @@ exports.strings = {
'de_DE': 'hg log ohne -f wird aktuell nicht unterstützt, benutze bitte -f',
'ru_RU': 'hg log без опции -f в настоящий момент не поддерживается, используйте -f',
'uk': 'hg log без опції -f в данний момент не підтримується, використовуй -f',
- 'ko': '-f가 없는 hg log는 현재 지원되지 않습니다. -f를 사용하세요.'
+ 'ko': '-f가 없는 hg log는 현재 지원되지 않습니다. -f를 사용하세요.',
+ 'vi': 'Hiện tại thì `hg log` mà không có tùy chọn -f chưa được hỗ trợ, hãy viết thêm -f.'
},
///////////////////////////////////////////////////////////////////////////
'git-status-detached': {
@@ -161,7 +170,8 @@ exports.strings = {
'fr_FR': 'head détaché !',
'ru_RU': 'Отделенный HEAD',
'uk': 'Відокремлений HEAD',
- 'ko': '분리된 HEAD!'
+ 'ko': '분리된 HEAD!',
+ 'vi': 'HEAD bị tách biệt!'
},
///////////////////////////////////////////////////////////////////////////
'git-status-onbranch': {
@@ -177,7 +187,8 @@ exports.strings = {
'fr_FR': 'Sur la branche {branch}',
'ru_RU': 'В ветке {branch}',
'uk': 'В гілці {branch}',
- 'ko': '분기 지점 {branch}에서'
+ 'ko': '분기 지점 {branch}에서',
+ 'vi': 'Đang trên nhánh {branch}'
},
///////////////////////////////////////////////////////////////////////////
'git-status-readytocommit': {
@@ -193,7 +204,8 @@ exports.strings = {
'fr_FR': 'Prêt à commit ! (comme toujours dans cette démo)',
'ru_RU': 'Готово к коммиту! (как и всегда в этом демо)',
'uk': 'Готово до коміту! (як завжди в цьому демо)',
- 'ko': '커밋을 준비하세요! (이 데모에서는 항상)'
+ 'ko': '커밋을 준비하세요! (이 데모에서는 항상)',
+ 'vi': 'Sẵn sàng để commit! (khi demo thì luôn có thể commit)'
},
///////////////////////////////////////////////////////////////////////////
'git-dummy-msg': {
@@ -210,7 +222,8 @@ exports.strings = {
'fr_FR': 'Commit rapide. NoMaN Sux!',
'ru_RU': 'Быстрый коммит. А надо!',
'uk': 'Швидкий коміт. Динамо!',
- 'ko': '빨리 커밋하세요!'
+ 'ko': '빨리 커밋하세요!',
+ 'vi': 'Commit luôn đi cho nóng!'
},
'git-error-origin-fetch-uptodate': {
'__desc__': 'One of the error messages for git',
@@ -225,7 +238,8 @@ exports.strings = {
'zh_CN': '已经是最新的了',
'ru_RU': 'Уже обновлено!',
'uk': 'Вже оновлено!',
- 'ko': '이미 최신 상태입니다!'
+ 'ko': '이미 최신 상태입니다!',
+ 'vi': 'Cập nhật mới nhất rồi!'
},
'git-error-origin-fetch-no-ff': {
'__desc__': 'One of the error messages for git',
@@ -240,7 +254,8 @@ exports.strings = {
'fr_FR': 'Votre branche origin n\'est plus synchronisée avec la branche distante et fetch ne peut pas être appliqué. Essayez avec l\'option --force',
'ru_RU': 'Ваша origin ветка не синхронизирована с удаленной веткой, невозможно выполнить fetch',
'uk': 'Твоя гілка origin не синхронізована з віддаленою гілкою, неможливо виконати fetch',
- 'ko': '당신의 오리진 브랜치가 원격 브랜치와 동기화되지 않았고, 패치를 실행할 수 없습니다.'
+ 'ko': '당신의 오리진 브랜치가 원격 브랜치와 동기화되지 않았고, 패치를 실행할 수 없습니다.',
+ 'vi': 'Nhánh của bạn không đồng bộ với nhánh remote nên lệnh fetch không thực thi được.'
},
'git-error-origin-push-no-ff': {
'__desc__': 'One of the error messages for git',
@@ -255,7 +270,8 @@ exports.strings = {
'fr_FR': 'Le dépôt distant a divergé de votre référentiel local, donc l\'envoi de vos modifications n\'est pas en simple avance rapide (et donc votre envoi a été rejeté). Veuillez récupérer les nouveaux changements depuis le dépôt distant, les intégrer dans cette branche, et essayez à nouveau. Vous pouvez le faire avec git pull ou git pull --rebase',
'ru_RU': 'Удаленный репозиторий разошелся с вашим локальным репозиторием, поэтому выгрузка ваших изменений не может быть в режиме fast forward (и следовательно ваш push будет отклонён). Пожалуйста, удалите изменения в удаленном репозитории которые, объедините их в эту ветку и попробуйте еще раз. Вы можете сделать это с помощью git pull или git pull --rebase',
'uk': 'Віддалений репозиторій розбігся з твоїм локальним репозиторієм, тому відвантаження твоїх змін не є простим fast forward (і тому твій push був відхилений). Будь-ласка, витягни зміни з віддаленого репозиторію, включи їх в цю гілку, й спробуй ще. Ти можеш зробити це за допомогою git pull чи git pull --rebase',
- 'ko': '원격 레포지토리가 당신의 로컬 레포지토리에서 분기하므로, 변경 사항을 업데이트 하는것은 간단한 fast forward가 아닙니다(따라서 push가 거절될 것입니다.). 원격 레포지토리에서의 변경 사항을 내려 받아 이 브랜치에 합쳐라. 그리고 이걸 반복하라. 당신은 git pull 또는 git pull --rebase를 사용해 이를 수행할 수 있다.'
+ 'ko': '원격 레포지토리가 당신의 로컬 레포지토리에서 분기하므로, 변경 사항을 업데이트 하는것은 간단한 fast forward가 아닙니다(따라서 push가 거절될 것입니다.). 원격 레포지토리에서의 변경 사항을 내려 받아 이 브랜치에 합쳐라. 그리고 이걸 반복하라. 당신은 git pull 또는 git pull --rebase를 사용해 이를 수행할 수 있다.',
+ 'vi': 'Kho chứa từ xa có sự khác biệt với kho chứa cục bộ của bạn, nên không thể tự động (fast forward) cập nhật thay đổi của bạn (và vì thế hoạt động push của bạn bị từ chối). Vui lòng kéo về thay đổi từ kho chứa từ xa, kết nạp vào nhánh hiện tại, và thử lại lần nữa. Bạn có thể dùng lệnh `git pull` hoặc `git pull --rebase`'
},
'git-error-remote-branch': {
'__desc__': 'One of the error messages for git',
@@ -270,7 +286,8 @@ exports.strings = {
'fr_FR': 'Vous ne pouvez exécuter cette commande sur une branche distante',
'ru_RU': 'Вы не можете выполнить эту команду на удаленной ветке',
'uk': 'Ти не можеш виконати цю команду на віддаленій гілці',
- 'ko': '당신은 원격 브랜치에서 그 명령어를 실행시킬 수 없다.'
+ 'ko': '당신은 원격 브랜치에서 그 명령어를 실행시킬 수 없다.',
+ 'vi': 'Bạn không thể thực thi lệnh đó lên nhánh từ xa.'
},
'git-error-origin-required': {
'__desc__': 'One of the error messages for git',
@@ -285,7 +302,8 @@ exports.strings = {
'fr_FR': 'Une origine est requise pour cette commande',
'ru_RU': 'Origin требуется для этой команды',
'uk': 'Для цієї команди потрібний origin',
- 'ko': '그 명령어를 위한 오리진이 필요하다.'
+ 'ko': '그 명령어를 위한 오리진이 필요하다.',
+ 'vi': 'Lệnh đó yêu cầu có origin.'
},
'git-error-origin-exists': {
'__desc__': 'One of the error messages for git',
@@ -300,7 +318,8 @@ exports.strings = {
'fr_FR': 'Une origine existe déjà ! Vous ne pouvez pas en créer une nouvelle',
'ru_RU': 'Origin уже существует! Невозможно создать еще один',
'uk': 'Origin вже існує! Неможливо створити ще один',
- 'ko': '오리진이 이미 존재합니다! 당신은 새로 만들 수 없습니다.'
+ 'ko': '오리진이 이미 존재합니다! 당신은 새로 만들 수 없습니다.',
+ 'vi': 'Nguyên bản (origin) đã tồn tại. Bạn không thể tạo thêm 1 cái mới'
},
///////////////////////////////////////////////////////////////////////////
'git-error-branch': {
@@ -317,7 +336,8 @@ exports.strings = {
'fr_FR': 'Vous ne pouvez supprimer la branche master, la branche sur laquelle vous êtes, ou ce qui n\'est pas une branche',
'ru_RU' : 'Невозможно удалить ветку master, ветку на которой вы сейчас и то что не является веткой',
'uk': 'Неможливо видалити гілку master, гілку на якій ти зараз знаходишся чи штуки які не є гілкою',
- 'ko': '당신은 마스터 브랜치, 당신이 현재 사용중인 브랜치, 또는 브랜치가 아닌 것들을 삭제할 수 없습니다.'
+ 'ko': '당신은 마스터 브랜치, 당신이 현재 사용중인 브랜치, 또는 브랜치가 아닌 것들을 삭제할 수 없습니다.',
+ 'vi': 'Bạn không thể xóa nhánh master, nhánh mà bạn đang tham chiếu tới, hoặc những gì không phải nhánh.'
},
///////////////////////////////////////////////////////////////////////////
'git-merge-msg': {
@@ -333,7 +353,8 @@ exports.strings = {
'fr_FR': 'Merge de {target} dans {current}',
'ru_RU': 'Слияние {target} в {current}',
'uk': 'Злиття {target} в {current}',
- 'ko': '{target}을 {current}에 병합하세요.'
+ 'ko': '{target}을 {current}에 병합하세요.',
+ 'vi': 'Gộp {target} vào {current}.'
},
///////////////////////////////////////////////////////////////////////////
'git-error-rebase-none': {
@@ -349,7 +370,8 @@ exports.strings = {
'fr_FR': 'Aucun commit à rebaser ! C\'est soit un commit de merge, soit des modifications déjà appliquées',
'ru_RU': 'Нет коммитов для rebase! Все в коммите слияния или изменения уже применены',
'uk': 'Нема комітів для rebase! Все в коміті злиття (merge commit) чи зміни вже застосовані',
- 'ko': 'rebase를 하기 위한 커밋이 없습니다! 모든 커밋과 변경 사항들의 병합은 이미 적용되었습니다.'
+ 'ko': 'rebase를 하기 위한 커밋이 없습니다! 모든 커밋과 변경 사항들의 병합은 이미 적용되었습니다.',
+ 'vi': 'Không có commit nào để rebase. Mọi thứ là merge commit hoặc thay đổi đã được áp dụng.'
},
///////////////////////////////////////////////////////////////////////////
'git-result-nothing': {
@@ -365,7 +387,8 @@ exports.strings = {
'fr_FR': 'Rien à effectuer…',
'ru_RU': 'Нечего выполнять...',
'uk': 'Нічого виконувати...',
- 'ko': '할게 없습니다 ...'
+ 'ko': '할게 없습니다 ...',
+ 'vi': 'Không có gì để làm ...'
},
///////////////////////////////////////////////////////////////////////////
'git-result-fastforward': {
@@ -381,7 +404,8 @@ exports.strings = {
'fr_FR': 'En avance rapide…',
'ru_RU': 'Выполняю Fast forward...',
'uk': 'Виконую Fast forward',
- 'ko': 'Fast forward 중입니다...'
+ 'ko': 'Fast forward 중입니다...',
+ 'vi': 'Đang fast forward...'
},
///////////////////////////////////////////////////////////////////////////
'git-result-uptodate': {
@@ -397,7 +421,8 @@ exports.strings = {
'fr_FR': 'Branche déjà à jour',
'ru_RU': 'Ветка уже обновлена',
'uk': 'Гілку вже оновлено',
- 'ko': '브랜치가 이미 최신 상태입니다.'
+ 'ko': '브랜치가 이미 최신 상태입니다.',
+ 'vi': 'Nhánh đã được cập nhật mới nhất.'
},
///////////////////////////////////////////////////////////////////////////
'git-error-exist': {
@@ -413,7 +438,8 @@ exports.strings = {
'fr_FR': 'La référence {ref} n\'existe pas ou est inconnue',
'ru_RU': 'Ссылка {ref} не существует или неизвестна',
'uk': 'Посилання {ref} не існує чи невідоме',
- 'ko': '{ref} 참조가 존재하지 않거나 알 수 없습니다.'
+ 'ko': '{ref} 참조가 존재하지 않거나 알 수 없습니다.',
+ 'vi': 'Tham chiếu {ref} không tồn tại hoặc không thể tìm thấy.'
},
///////////////////////////////////////////////////////////////////////////
'git-error-relative-ref': {
@@ -429,7 +455,8 @@ exports.strings = {
'fr_FR': 'Le commit {commit} n\'a pas de correspondance {match}',
'ru_RU': 'Коммит {commit} не содержит {match}',
'uk': 'Коміт {commit} не містить {match}',
- 'ko': '커밋 {commit}은 {match}를 가지고 있지 않습니다.'
+ 'ko': '커밋 {commit}은 {match}를 가지고 있지 않습니다.',
+ 'vi': 'Commit {commit} mà không có {match}.'
},
///////////////////////////////////////////////////////////////////////////
'git-warning-detached': {
@@ -445,7 +472,8 @@ exports.strings = {
'fr_FR': 'Attention ! HEAD est détaché',
'ru_RU': 'Внимание! Репозиторий в состоянии detached HEAD, то есть не находится ни на какой ветке!',
'uk': 'Увага! Репозиторій в стані detached HEAD, тобто не знаходиться в жодній гілці!',
- 'ko': '주의! 분리된 HEAD 상태'
+ 'ko': '주의! 분리된 HEAD 상태',
+ 'vi': 'Cảnh báo! HEAD bị tách rời'
},
///////////////////////////////////////////////////////////////////////////
'git-warning-add': {
@@ -461,7 +489,8 @@ exports.strings = {
'fr_FR': 'Aucun besoin d\'ajouter des fichiers dans cette démo',
'ru_RU': 'Это демо не оперирует файлами',
'uk': 'Не потрібно додавати файли для цього демо',
- 'ko': '이 데모에서는 파일을 추가할 필요가 없습니다.'
+ 'ko': '이 데모에서는 파일을 추가할 필요가 없습니다.',
+ 'vi': 'Không cần thêm tập tin trong bản giới thiệu này.'
},
///////////////////////////////////////////////////////////////////////////
'git-error-options': {
@@ -477,7 +506,8 @@ exports.strings = {
'fr_FR': 'Les options que vous avez spécifiées sont incompatibles ou incorrectes',
'ru_RU': 'Неправильные опции',
'uk': 'Опції, які ти ввів, або некорректні або не підтримуються',
- 'ko': '당신이 지정한 그 옵션들은 호환되지 않거나 올바르지 않습니다.'
+ 'ko': '당신이 지정한 그 옵션들은 호환되지 않거나 올바르지 않습니다.',
+ 'vi': 'Các tham số bạn chỉ định không tương thích hoặc không chính xác.'
},
///////////////////////////////////////////////////////////////////////////
'git-error-already-exists': {
@@ -493,7 +523,8 @@ exports.strings = {
'fr_FR': 'Le commit {commit} existe déjà dans votre ensemble de modifications, opération avortée !',
'ru_RU': 'Коммит {commit} существует, отменяю!',
'uk': 'Коміт {commit} вже існує в твоєму change set, відміна!',
- 'ko': '커밋 {commit}은 이미 당신의 변경 내역에 존재합니다. 중단!'
+ 'ko': '커밋 {commit}은 이미 당신의 변경 내역에 존재합니다. 중단!',
+ 'vi': 'Commit {commit} đã tồn tại trong những thay đổi của bạn. Đang hủy!'
},
///////////////////////////////////////////////////////////////////////////
'git-error-reset-detached': {
@@ -509,7 +540,8 @@ exports.strings = {
'fr_FR': 'On ne peut pas effectuer un reset quand HEAD est détaché. Utilisez checkout pour déplacer',
'ru_RU': 'Это невозможно в режиме detached HEAD! Используйте checkout!',
'uk': 'Неможливо зробити reset в стані detached head! Використовуй checkout якщо хочеш змінити розташування',
- 'ko': '분리된 HEAD에서 reset할 수 없습니다. 만약 이동시키기를 원한다면 checkout을 사용하세요.'
+ 'ko': '분리된 HEAD에서 reset할 수 없습니다. 만약 이동시키기를 원한다면 checkout을 사용하세요.',
+ 'vi': 'Trong trạng thái tách rời `HEAD` thì không thể `reset`. Dùng `checkout` nếu bạn muốn di chuyển.'
},
///////////////////////////////////////////////////////////////////////////
'git-warning-hard': {
@@ -530,7 +562,10 @@ exports.strings = {
'uk': 'На LearnGitBranching reset по замовчуванню використовує --hard, тому цю опцію ' +
'можна пропустити, якщо ти втомився її набирати щоразу. Тільки запам’ятай, що по замовчуванню ' +
'звичайний git reset використовує --mixed',
- 'ko': 'LearnGitBranching에서 reset의 기본 설정은 옵션은 --hard입니다. 우리 레슨에서는 이 옵션을 생략해도 됩니다. 다만 실제 Git의 기본 설정 옵션은 --mixed라는것만 기억하세요.'
+ 'ko': 'LearnGitBranching에서 reset의 기본 설정은 옵션은 --hard입니다. 우리 레슨에서는 이 옵션을 생략해도 됩니다. 다만 실제 Git의 기본 설정 옵션은 --mixed라는것만 기억하세요.',
+ 'vi': 'Trạng thái mặc định cho lệnh `reset` của \"Học nhánh Git\" là `--hard`.' +
+ ' Nên khi làm bài nếu bạn thấy gõ tham số này hơi tốn công thì cứ bỏ qua.' +
+ ' Nhưng mà hãy nhớ rằng thực tế thì `--mixed` mới là trạng thái mặc định của `reset`.'
},
///////////////////////////////////////////////////////////////////////////
'git-error-staging': {
@@ -547,7 +582,8 @@ exports.strings = {
'fr_FR': 'Il n\'y a pas le concept d\'ajouter / mettre en staging, donc cette option ou commande est invalide',
'ru_RU': 'Это демо не работает с файлами, так что git add не нужен!',
'uk': 'В цьому демо немає можливості додати файл до робочої копії чи до стейджингу, тому ця опція чи команда некоректна чи не підтримується',
- 'ko': '여기엔 파일을 추가하거나 스테이징한다는 개념이 없습니다. 따라서 그 옵션 또는 명령어는 유효하지 않습니다.'
+ 'ko': '여기엔 파일을 추가하거나 스테이징한다는 개념이 없습니다. 따라서 그 옵션 또는 명령어는 유효하지 않습니다.',
+ 'vi': 'Không có khái nệm thêm tập tin đệm(staging file), nên tùy chọn đó là bất hợp lệ.'
},
///////////////////////////////////////////////////////////////////////////
'git-revert-msg': {
@@ -563,7 +599,8 @@ exports.strings = {
'fr_FR': 'Revert {oldCommit}: {oldMsg}',
'ru_RU': 'Откатываю {oldCommit}: {oldMsg}',
'uk': 'Повертаю {oldCommit}: {oldMsg}',
- 'ko': '{oldCommit}:{oldMsg}를 복구중입니다.'
+ 'ko': '{oldCommit}:{oldMsg}를 복구중입니다.',
+ 'vi': 'Hoàn tác {oldCommit}:{oldMsg}.'
},
///////////////////////////////////////////////////////////////////////////
'git-error-args-many': {
@@ -579,7 +616,8 @@ exports.strings = {
'fr_FR': 'J\'attends au plus {upper} argument(s) pour {what}',
'ru_RU': 'Ожидается максимум {upper} аргумент(ов) для {what}',
'uk': 'Я очікую максимум {upper} аргумент(ів) для {what}',
- 'ko': '{what}을 위해 최대 {upper}개의 인자를 받습니다.'
+ 'ko': '{what}을 위해 최대 {upper}개의 인자를 받습니다.',
+ 'vi': 'Có thể có nhiều nhất {upper} tham số cho {what}.'
},
///////////////////////////////////////////////////////////////////////////
'git-error-args-few': {
@@ -595,7 +633,8 @@ exports.strings = {
'fr_FR': 'J\'attends au moins {lower} argument(s) pour {what}',
'ru_RU': 'Ожидается как минимум {lower} аргументов для {what}',
'uk': 'Я очікую як мінімум {lower} аргумент(ів) для {what}',
- 'ko': '{what}을 위해 최소 {lower}개의 인자를 받습니다.'
+ 'ko': '{what}을 위해 최소 {lower}개의 인자를 받습니다.',
+ 'vi': 'Cần ít nhất {lower} tham số cho {what}.'
},
///////////////////////////////////////////////////////////////////////////
'git-error-no-general-args': {
@@ -611,7 +650,8 @@ exports.strings = {
'fr_FR': 'Cette commande n\'accepte aucun argument général',
'ru_RU': 'Это команда без аргументов',
'uk': 'Ця команда не приймає загальних аргументів',
- 'ko': '그 명령어는 일반적으로 인자를 받지 않습니다.'
+ 'ko': '그 명령어는 일반적으로 인자를 받지 않습니다.',
+ 'vi': 'Lệnh đó không chấp nhận các tham số chung.'
},
///////////////////////////////////////////////////////////////////////////
'copy-tree-string': {
@@ -627,7 +667,8 @@ exports.strings = {
'fr_FR': 'Copiez la chaîne d\'arbre ci-dessous',
'ru_RU': 'Скопируй текст ниже',
'uk': 'Скопіюй рядок дерева нижче',
- 'ko': '다음 트리 문자열을 복사하세요.'
+ 'ko': '다음 트리 문자열을 복사하세요.',
+ 'vi': 'Sao chép chuỗi cây bên dưới.'
},
///////////////////////////////////////////////////////////////////////////
'learn-git-branching': {
@@ -644,7 +685,8 @@ exports.strings = {
'fr_FR': 'Apprenez Git Branching',
'ru_RU': 'Изучаем ветвление в git',
'uk': 'Learn Git Branching',
- 'ko': '깃 브랜칭을 배워봅시다.'
+ 'ko': '깃 브랜칭을 배워봅시다.',
+ 'vi': 'Học nhánh Git.'
},
///////////////////////////////////////////////////////////////////////////
'select-a-level': {
@@ -660,7 +702,8 @@ exports.strings = {
'fr_FR': 'Choisissez un niveau',
'ru_RU': 'Выбери уровень',
'uk': 'Обери рівень',
- 'ko': '레벨을 선택하세요.'
+ 'ko': '레벨을 선택하세요.',
+ 'vi': 'Chọn một cấp độ.'
},
///////////////////////////////////////////////////////////////////////////
'main-levels-tab': {
@@ -673,7 +716,8 @@ exports.strings = {
'gl' : 'Principal',
'ru_RU': 'Основы',
'uk' : 'Основи',
- 'ko': '메인'
+ 'ko': '메인',
+ 'vi': 'Bài học chính'
},
///////////////////////////////////////////////////////////////////////////
'remote-levels-tab': {
@@ -686,7 +730,8 @@ exports.strings = {
'gl' : 'Remota',
'ru_RU': 'Удаленные репозитории',
'uk' : 'Віддалені репозиторії',
- 'ko' : '원격'
+ 'ko' : '원격',
+ 'vi' : 'Bài học về thao tác từ xa'
},
///////////////////////////////////////////////////////////////////////////
'branch-name-short': {
@@ -702,7 +747,8 @@ exports.strings = {
'fr_FR': 'Désolé, nous devons garder les noms de branches courts pour la visualisation. Votre nom de branche a été tronqué à 9 caractères, devenant "{branch}"',
'ru_RU': 'Для наглядности нам нужно сохранять имена веток короткими. Твоё название сокращено до 9 символов и теперь это "{branch}"',
'uk': 'Вибач, нам потрібно щоб ім’я гілок було як можна коротше для наглядності. Твоє ім’я гілки було скорочене до 9 літер й тепер це "{branch}"',
- 'ko': '미안하지만, 우리는 시각적으로 더 좋게 보기위해 짧은 브랜치명이 필요합니다. 당신의 브랜치명은 9자리로 잘라 "{branch}"로 만들었습니다.'
+ 'ko': '미안하지만, 우리는 시각적으로 더 좋게 보기위해 짧은 브랜치명이 필요합니다. 당신의 브랜치명은 9자리로 잘라 "{branch}"로 만들었습니다.',
+ 'vi': 'Xin lỗi, chúng tôi cần giữ tên nhánh ngắn để tiện minh họa. Tên nhánh của bạn đã bị cắt xuống 9 ký tự là "{branch}".'
},
///////////////////////////////////////////////////////////////////////////
'bad-branch-name': {
@@ -718,7 +764,8 @@ exports.strings = {
'fr_FR': 'Ce nom de branche "{branch}" n\'est pas autorisé',
'ru_RU': 'Название для ветки "{branch}" недопустимо!',
'uk': 'Назва гілки "{branch}" є недопустимою',
- 'ko': '"{branch}"라는 브랜치명은 사용할 수 없습니다.'
+ 'ko': '"{branch}"라는 브랜치명은 사용할 수 없습니다.',
+ 'vi': 'Tên nhánh "{branch}" không được chấp nhận.'
},
///////////////////////////////////////////////////////////////////////////
'bad-tag-name': {
@@ -734,7 +781,8 @@ exports.strings = {
'fr_FR': 'Le nom de tag "{tag}" n\'est pas autorisé',
'ru_RU': 'Название для тега "{tag}" недопустимо!',
'uk': 'Назва тегу "{tag}" є недопустимою',
- 'ko': '"{tag}"라는 태그명은 사용할 수 없습니다.'
+ 'ko': '"{tag}"라는 태그명은 사용할 수 없습니다.',
+ 'vi': 'Tên thẻ "{tag}" không được chấp nhận.'
},
///////////////////////////////////////////////////////////////////////////
'option-not-supported': {
@@ -750,7 +798,8 @@ exports.strings = {
'fr_FR': 'L\'option "{option}" n\'est pas supportée',
'ru_RU': 'Опция "{option}" недопустима!',
'uk': 'Опція "{option}" не підтримується!',
- 'ko': '"{option}"(이)라는 옵션은 지원하지 않습니다.'
+ 'ko': '"{option}"(이)라는 옵션은 지원하지 않습니다.',
+ 'vi': 'Tùy chọn "{option}" không được hỗ trợ.'
},
///////////////////////////////////////////////////////////////////////////
'git-usage-command': {
@@ -766,7 +815,8 @@ exports.strings = {
'fr_FR': 'git []',
'ru_RU': 'git <команда> [<аргументы>]',
'uk': 'git <команда> [<аргументи>]',
- 'ko': 'git <명령어> [<인자들>]'
+ 'ko': 'git <명령어> [<인자들>]',
+ 'vi': 'git []'
},
///////////////////////////////////////////////////////////////////////////
'git-supported-commands': {
@@ -782,7 +832,8 @@ exports.strings = {
'fr_FR': 'Commandes supportées',
'ru_RU': 'Поддерживаемые команды',
'uk': 'Допустимі команди',
- 'ko': '지원되는 명령어들:'
+ 'ko': '지원되는 명령어들:',
+ 'vi': 'Các lệnh được hỗ trợ:'
},
///////////////////////////////////////////////////////////////////////////
'git-usage': {
@@ -798,7 +849,8 @@ exports.strings = {
'fr_FR': 'Utilisation :',
'ru_RU': 'Использование:',
'uk': 'Використання:',
- 'ko': '사용법'
+ 'ko': '사용법',
+ 'vi': 'Cách dùng:'
},
///////////////////////////////////////////////////////////////////////////
'git-version': {
@@ -814,7 +866,8 @@ exports.strings = {
'fr_FR': 'Git version PCOTTLE.1.0',
'ru_RU': 'Версия git PCOTTLE.1.0',
'uk': 'Версія git PCOTTLE.1.0',
- 'ko': 'Git Version PCOTILE.1.0'
+ 'ko': 'Git Version PCOTILE.1.0',
+ 'vi': 'Phiên bản Git TTC-Solutions.1.0'
},
///////////////////////////////////////////////////////////////////////////
'flip-tree-command': {
@@ -829,7 +882,8 @@ exports.strings = {
'fr_FR': 'Inversion de l\'arbre...',
'ru_RU': 'Переворачиваю дерево...',
'uk': 'Перевертаю дерево...',
- 'ko': '트리 뒤집는중...'
+ 'ko': '트리 뒤집는중...',
+ 'vi': 'Cây lật...'
},
///////////////////////////////////////////////////////////////////////////
'refresh-tree-command': {
@@ -845,7 +899,8 @@ exports.strings = {
'fr_FR': 'Actualisation de l\'arbre…',
'ru_RU': 'Обновляю дерево...',
'uk': 'Оновлюю дерево...',
- 'ko': '트리 다시 불러오는중...'
+ 'ko': '트리 다시 불러오는중...',
+ 'vi': 'Làm mới cây...'
},
///////////////////////////////////////////////////////////////////////////
'locale-command': {
@@ -861,7 +916,8 @@ exports.strings = {
'fr_FR': 'Langue changée à {locale}',
'ru_RU': 'Локаль теперь равна {locale}',
'uk': 'Локаль тепер дорівнює {locale}',
- 'ko': '로케일이 {locale}로 설정되었습니다.'
+ 'ko': '로케일이 {locale}로 설정되었습니다.',
+ 'vi': 'Ngôn ngữ được thay đổi thành {locale}.'
},
///////////////////////////////////////////////////////////////////////////
'locale-reset-command': {
@@ -877,7 +933,8 @@ exports.strings = {
'fr_FR': 'Langue remise par défaut, qui est {locale}',
'ru_RU': 'Локаль сброшена. Теперь она равна {locale}',
'uk': 'Локаль скинута. Тепер вона дорівнює {locale}',
- 'ko': '로케일이 {locale}로 초기화 되었습니다.'
+ 'ko': '로케일이 {locale}로 초기화 되었습니다.',
+ 'vi': 'Ngôn ngữ được đổi thành mặc định: {locale}.'
},
///////////////////////////////////////////////////////////////////////////
'show-command': {
@@ -893,7 +950,8 @@ exports.strings = {
'fr_FR': 'Merci d\'utiliser une des commandes suivantes pour obtenir plus d\'informations',
'ru_RU': 'Для получения большей информации используй следующие команды:',
'uk': 'Щоб отримати більше інформації використовуй наступні команди:',
- 'ko': '더 많은 정보를 위해 다음 명령어들중 하나를 사용하세요.'
+ 'ko': '더 많은 정보를 위해 다음 명령어들중 하나를 사용하세요.',
+ 'vi': 'Vui lòng dùng một trong các lệnh sau để có thêm thông tin:.'
},
///////////////////////////////////////////////////////////////////////////
'show-all-commands': {
@@ -909,7 +967,8 @@ exports.strings = {
'fr_FR': 'Ci-dessous est la liste de toutes les commandes disponibles :',
'ru_RU': 'Вот все поддерживаемуе команды:',
'uk': 'Ось список всіх можливих команд:',
- 'ko': '여기에 사용 가능한 모든 명령어들의 리스트가 있습니다.'
+ 'ko': '여기에 사용 가능한 모든 명령어들의 리스트가 있습니다.',
+ 'vi': 'Dưới đây là danh sách tất cả các lệnh hiện hành:.'
},
///////////////////////////////////////////////////////////////////////////
'cd-command': {
@@ -925,7 +984,8 @@ exports.strings = {
'fr_FR': 'Répertoire changé à "/directories/dont/matter/in/this/demo" (les répertoires ne servent à rien dans cette démo)',
'ru_RU': 'Директория изменена на "/директории/не/важны/в/этом/демо"',
'uk': 'Директорія змінена на "/директорії/не/мають/значення/в/цьому/демо"',
- 'ko': '디렉토리가 "/directories/dont/matter/in/this/demo"로 변경되었습니다.'
+ 'ko': '디렉토리가 "/directories/dont/matter/in/this/demo"로 변경되었습니다.',
+ 'vi': 'Thay đổi thư mục thành "/directories/dont/matter/in/this/demo".'
},
///////////////////////////////////////////////////////////////////////////
'ls-command': {
@@ -941,7 +1001,8 @@ exports.strings = {
'fr_FR': 'DontWorryAboutFilesInThisDemo.txt (ne vous préoccupez pas des noms de fichier dans cette démo)',
'ru_RU': 'НеНадоЗаботитьсяОФайлахВЭтомДемо.txt',
'uk': 'ЗабийНаФайлиВЦьомуДемо.txt',
- 'ko': 'DontWorryAboutFilesInThisDemo.txt (이_데모에서_파일에_대한_걱정은_하지마세요.txt)'
+ 'ko': 'DontWorryAboutFilesInThisDemo.txt (이_데모에서_파일에_대한_걱정은_하지마세요.txt)',
+ 'vi': 'DontWorryAboutFilesInThisDemo.txt (ĐừngLoLắngVềTậpTinTrongBảnGiớiThiệuNày.txt)'
},
'mobile-alert': {
'__desc__': 'When someone comes to the site on a mobile device, they can not input commands so this is a nasty alert to tell them',
@@ -956,7 +1017,8 @@ exports.strings = {
'fr_FR': 'Impossible de faire apparaître le clavier sur mobile / tablette :( Essayez de passer sur un ordinateur de bureau :D',
'ru_RU': 'Мобильные не поддерживаются, зайди с компьютера!',
'uk': 'LGB не підтримує ввід тексту з мобільного, зайди з компьютера! Це цього варте!',
- 'ko': 'LGB는 모바일에서 입력을 받을 수 없습니다. 데스크톱으로 접속하세요! 이것은 가치가 있습니다. :D'
+ 'ko': 'LGB는 모바일에서 입력을 받을 수 없습니다. 데스크톱으로 접속하세요! 이것은 가치가 있습니다. :D',
+ 'vi': 'Đáng tiếc là ứng dụng không thể nhận thông tin từ điện thoại hay máy tính bảng, hãy sử dụng máy tính cá nhân, đáng để bỏ công mà :D'
},
///////////////////////////////////////////////////////////////////////////
'share-tree': {
@@ -972,7 +1034,8 @@ exports.strings = {
'fr_FR': 'Partagez cet arbre avec vos amis ! Ils peuvent le charger avec "import tree"',
'ru_RU': 'Поделись деревом с друзьями! Они могут загрузить его при помощи "import tree"',
'uk': 'Поділись цим деревом з друзями! Вони зможуть його завантажити за допомогою "import tree"',
- 'ko': '친구들과 이 트리를 공유하세요! 그들은 "import tree"를 사용해 이를 로드할 수 있습니다.'
+ 'ko': '친구들과 이 트리를 공유하세요! 그들은 "import tree"를 사용해 이를 로드할 수 있습니다.',
+ 'vi': 'Hãy chia sẻ cây này với bạn của mình! Họ có thể dùng "import tree" để tải.'
},
///////////////////////////////////////////////////////////////////////////
'paste-json': {
@@ -988,7 +1051,8 @@ exports.strings = {
'fr_FR': 'Collez un blob JSON ci-dessous !',
'ru_RU': 'Вставь JSON ниже!',
'uk': 'Встав JSON нижче!',
- 'ko': '아래에 JSON blob을 붙여넣으세요.'
+ 'ko': '아래에 JSON blob을 붙여넣으세요.',
+ 'vi': 'Dán một chuỗi JSON xuống bên dưới.'
},
///////////////////////////////////////////////////////////////////////////
'solved-map-reset': {
@@ -1004,7 +1068,8 @@ exports.strings = {
'fr_FR': 'La carte des niveaux résolus a été effacée, vous repartez de zéro !',
'ru_RU': 'Всё сброшено! Можно начать с чистого листа!',
'uk': 'Все скинуте! Можна починати з чистого аркушу!',
- 'ko': '해결된 지도가 초기화 되었습니다. 당신은 깨끗한 상태에서 시작합니다.'
+ 'ko': '해결된 지도가 초기화 되었습니다. 당신은 깨끗한 상태에서 시작합니다.',
+ 'vi': 'Tất cả đáp án đã được xóa, bạn có thể bắt đầu lại từ đầu.'
},
///////////////////////////////////////////////////////////////////////////
'level-cant-exit': {
@@ -1020,7 +1085,8 @@ exports.strings = {
'fr_FR': 'Vous n\'êtes pas dans un niveau ! Vous êtes dans le mode bac à sable, commencez un niveau avec "levels"',
'ru_RU': 'Ты не проходишь уровень! Ты в песочнице! Чтобы начать уровень, используй команду "levels"!',
'uk': 'Ти не в рівні! Ти в пісочниці! Почни рівень з "levels"',
- 'ko': '당신은 샌드박스에 있습니다. "levels"를 사용하여 레벨을 시작하세요.'
+ 'ko': '당신은 샌드박스에 있습니다. "levels"를 사용하여 레벨을 시작하세요.',
+ 'vi': 'Bạn hiện không ở cấp độ nào cả! Hãy bắt đầu một cấp độ với "levels".'
},
///////////////////////////////////////////////////////////////////////////
'level-no-id': {
@@ -1036,7 +1102,8 @@ exports.strings = {
'fr_FR': 'Le niveau dont l\'identifiant est {id} n\'a pas été trouvé ! Ouverture de la vue de sélection des niveaux',
'ru_RU': 'Уровень с id "{id}" не найден! Открываю выбор уровней',
'uk': 'Рівень з id "{id}" не знайдений! Відкриваю вибір рівней',
- 'ko': 'id "{id}"에 대한 레벨이 존재하지 않습니다. 레벨 선택 화면을 열어보세요.'
+ 'ko': 'id "{id}"에 대한 레벨이 존재하지 않습니다. 레벨 선택 화면을 열어보세요.',
+ 'vi': 'Không tìm thấy cấp độ cho định danh "{id}". Mở cửa sổ chọn cấp độ.'
},
///////////////////////////////////////////////////////////////////////////
'undo-stack-empty': {
@@ -1052,7 +1119,8 @@ exports.strings = {
'fr_FR': 'La pile d\'annulation est vide !',
'ru_RU': 'Некуда откатывать!',
'uk': 'Нема куди відкатуватися',
- 'ko': '되돌리기 스택이 비었습니다!'
+ 'ko': '되돌리기 스택이 비었습니다!',
+ 'vi': 'Không có gì để hoàn tác!'
},
///////////////////////////////////////////////////////////////////////////
'already-solved': {
@@ -1068,7 +1136,8 @@ exports.strings = {
'fr_FR': 'Vous avez déjà résolu ce niveau, essayez d\'autres niveaux avec "levels" ou revenez au bac à sable avec "sandbox"',
'ru_RU': 'Ты уже прошел этот уровень, попробуй пройти другие при помощи команды "levels" или иди в песочницу "sandbox"',
'uk': 'Ти вже пройшов цей рівень, спробуй інші рівні з "levels" чи повернись в пісочницю з "sandbox"',
- 'ko': '당신은 이미 이 레벨을 해결했습니다. "levels"를 사용하여 다른 레벨에 도전하거나 "sandbox"를 사용하여 샌드박스로 돌아가세요.'
+ 'ko': '당신은 이미 이 레벨을 해결했습니다. "levels"를 사용하여 다른 레벨에 도전하거나 "sandbox"를 사용하여 샌드박스로 돌아가세요.',
+ 'vi': 'Bạn đã vượt qua cấp độ này. Thử cấp độ khác với "levels" hoặc dùng "sandbox" để trở lại hộp cát.'
},
///////////////////////////////////////////////////////////////////////////
'solved-level': {
@@ -1081,7 +1150,8 @@ exports.strings = {
'gl' : '¡Resolto!',
'ru_RU': 'Решено!!\n:D',
'uk' : 'Вирішено!!\n:D',
- 'ko' : '해결 완료!!\n:D'
+ 'ko' : '해결 완료!!\n:D',
+ 'vi' : 'ĐÃ XONG!!\n:D'
},
///////////////////////////////////////////////////////////////////////////
'command-disabled': {
@@ -1097,7 +1167,8 @@ exports.strings = {
'fr_FR': 'Cette commande git est désactivée pour ce niveau !',
'ru_RU': 'На этом уровне нельзя использовать эту команду!',
'uk': 'На цьому рівні не можна використовувати цю команду!',
- 'ko': '그 Git 명령어는 이 레벨에서 사용할 수 없습니다.'
+ 'ko': '그 Git 명령어는 이 레벨에서 사용할 수 없습니다.',
+ 'vi': 'Ở cấp độ này thì lệnh git đó bị vô hiệu hóa.'
},
///////////////////////////////////////////////////////////////////////////
'share-json': {
@@ -1113,7 +1184,8 @@ exports.strings = {
'fr_FR': 'Voici le JSON pour ce niveau ! Partagez-le avec quelqu\'un ou envoyez-le moi sur Github',
'ru_RU': 'Вот JSON для этого уровня! Поделись им с кем-нибудь или отправь его нам на GitHub',
'uk': 'Ось JSON для цього рівня! Поділись з кимось чи відправ мені його на Github',
- 'ko': '이 레벨을 위한 JSON 데이터가 있습니다! 이를 다른 사람들과 공유하거나 Github에서 제게 보내보세요.'
+ 'ko': '이 레벨을 위한 JSON 데이터가 있습니다! 이를 다른 사람들과 공유하거나 Github에서 제게 보내보세요.',
+ 'vi': 'Đây là chuỗi JSON cho cấp độ này! Hãy chia sẻ với người khắc hoặc với tôi qua Github.'
},
///////////////////////////////////////////////////////////////////////////
'want-start-dialog': {
@@ -1129,7 +1201,8 @@ exports.strings = {
'fr_FR': 'Vous n\'avez pas spécifié de dialogue de départ, voulez-vous en ajouter un ?',
'ru_RU': 'Не указано стартово сообщение! Точно продолжаем?',
'uk': 'Не вказано стартовий діалог, хочеш додати стартовий діалог?',
- 'ko': '당신은 시작 대화창을 지정하지 않았습니다. 추가 하시겠습니까?'
+ 'ko': '당신은 시작 대화창을 지정하지 않았습니다. 추가 하시겠습니까?',
+ 'vi': 'Không có cửa sổ hội thoại được chỉ định, thêm một cái chứ?'
},
///////////////////////////////////////////////////////////////////////////
'want-hint': {
@@ -1145,7 +1218,8 @@ exports.strings = {
'fr_FR': 'Vous n\'avez pas spécifié d\'indice, voulez-vous en ajouter un ?',
'ru_RU': 'Не указана подсказка для уровня! Пренебречь? Вальсируем?',
'uk': 'Не вказана підказка, хочеш додати підказку?',
- 'ko': '당신은 힌트를 지정하지 않았습니다. 추가 하시겠습니까?'
+ 'ko': '당신은 힌트를 지정하지 않았습니다. 추가 하시겠습니까?',
+ 'vi': 'Bạn chưa chỉ định một gợi ý, thêm một cái chứ?'
},
///////////////////////////////////////////////////////////////////////////
'prompt-hint': {
@@ -1161,7 +1235,8 @@ exports.strings = {
'fr_FR': 'Entrez l\'indice pour ce niveau, ou laissez-le vide pour ne pas l\'inclure',
'ru_RU': 'Введи подсказку для уровня, если хочешь.',
'uk': 'Додай підказку для рівня, якщо хочеш',
- 'ko': '이 레벨을 위한 힌트를 입력하거나 만약 이를 포함시키고 싶지 않을 경우엔 비워두세요.'
+ 'ko': '이 레벨을 위한 힌트를 입력하거나 만약 이를 포함시키고 싶지 않을 경우엔 비워두세요.',
+ 'vi': 'Thêm một gợi ý cho cấp độ này, hoặc cứ để trống nếu bạn không muốn thêm.'
},
///////////////////////////////////////////////////////////////////////////
'prompt-name': {
@@ -1177,7 +1252,8 @@ exports.strings = {
'fr_FR': 'Entrez le nom pour ce niveau',
'ru_RU': 'Введи название уровня',
'uk': 'Введи назву рівня',
- 'ko': '레벨 이름을 입력하세요.'
+ 'ko': '레벨 이름을 입력하세요.',
+ 'vi': 'Nhập tên cho cấp độ này.'
},
///////////////////////////////////////////////////////////////////////////
'solution-empty': {
@@ -1193,7 +1269,8 @@ exports.strings = {
'fr_FR': 'Votre solution est vide !! Quelque chose ne tourne pas rond',
'ru_RU': 'Решение не указано! Так не годится!',
'uk': 'Розв’язок порожній!! Щось не так',
- 'ko': '해답이 비어있습니다. 무언가 잘못되었습니다.'
+ 'ko': '해답이 비어있습니다. 무언가 잘못되었습니다.',
+ 'vi': 'Đáp án bị bỏ trống!! Có gì thiếu rồi.'
},
///////////////////////////////////////////////////////////////////////////
'define-start-warning': {
@@ -1209,7 +1286,8 @@ exports.strings = {
'fr_FR': 'Redéfinition du point de départ… la solution et la cible seront écrasés s\'ils ont déjà été définis',
'ru_RU': 'Устанавливаю стартовую точку... Решение и итоговое состояние будут стёрты, если они указаны ранее',
'uk': 'Встановлюю стартову точку... розв’язок та ціль будуть переписані якщо вони були задані раніше',
- 'ko': '시작 지점을 정의하세요... 만약 그것이 먼저 정의된다면 해답과 목표가 덮어씌워질 것입니다.'
+ 'ko': '시작 지점을 정의하세요... 만약 그것이 먼저 정의된다면 해답과 목표가 덮어씌워질 것입니다.',
+ 'vi': 'Xác định điểm bắt đầu ... Các giải pháp và mục tiêu sẽ được thay thế nếu đã được chỉ định từ trước.'
},
///////////////////////////////////////////////////////////////////////////
'help-vague-level': {
@@ -1225,7 +1303,8 @@ exports.strings = {
'fr_FR': 'Vous êtes dans un niveau, donc plusieurs formes d\'aide sont disponibles. Merci de sélectionner soit "help level" pour en apprendre plus sur cette leçon, "help general" pour l\'utilisation de Learn GitBranching, ou "objective" pour apprendre comment résoudre le niveau',
'ru_RU': 'При прохождении уровня доступны несколько видов помощи. Определить что нужно: "help level" чтобы получить информацию об этом уровне, "help general" для того, чтобы узнать о игре в целом или "objective" чтобы узнать что надо сделать в этом уровне.',
'uk': 'При проходженні рівня доступні декілька різновидів допомоги. Виберіть або "help level" щоб взнати більше про цей рівень, чи "help general" щоб взнати більше про Learn Git Branching, чи "objective" щоб дізнатись більше про проходження цього рівня',
- 'ko': '당신은 한 레벨에 들어가 있고, 여러가지 도움 양식들을 사용할 수 있습니다. 레슨에 대해 더 알고싶을 땐 "help level", LearnGitBranching을 사용하고 싶을 땐 "help general", 또는 레벨을 어떻게 해결해야할지 알고싶을 땐 "objective"를 선택하세요.'
+ 'ko': '당신은 한 레벨에 들어가 있고, 여러가지 도움 양식들을 사용할 수 있습니다. 레슨에 대해 더 알고싶을 땐 "help level", LearnGitBranching을 사용하고 싶을 땐 "help general", 또는 레벨을 어떻게 해결해야할지 알고싶을 땐 "objective"를 선택하세요.',
+ 'vi': 'Bạn đang ở trong một cấp độ, nên sẽ có nhiều hỗ trợ. Vui lòng dùng "help level" để biết thêm về bài học này, "help general" để sử dụng HọcNhánhGit, hoặc "objective" để biết cách giải quyết bài tập.'
},
///////////////////////////////////////////////////////////////////////////
'help-vague-builder': {
@@ -1241,7 +1320,8 @@ exports.strings = {
'fr_FR': 'Vous êtes dans l\'éditeur de niveaux, donc plusieurs formes d\'aide sont disponibles. Merci de sélectionner soit "help general" soit "help builder"',
'ru_RU': 'При создании уровней доступны несколько видов помощи. Выбери между "help general" и "help builder"',
'uk': 'При створенні рівня доступні декілька різновидів допомоги. Виберіть або "help general", чи "help builder"',
- 'ko': '당신은 한 레벨 생성기에 들어가 있고, 여러가지 도움 양식들을 사용할 수 있습니다. "help general" 또는 "help builder"를 선택해주세요.'
+ 'ko': '당신은 한 레벨 생성기에 들어가 있고, 여러가지 도움 양식들을 사용할 수 있습니다. "help general" 또는 "help builder"를 선택해주세요.',
+ 'vi': 'Bạn đang tạo một cấp độ, nên sẽ có nhiều trợ giúp có sẵn. Vui lòng chọn "help general" hoặc "help builder".'
},
///////////////////////////////////////////////////////////////////////////
'show-goal-button': {
@@ -1258,7 +1338,8 @@ exports.strings = {
'ja' : 'ゴールを表示',
'ru_RU': 'Цель уровня',
'uk': 'Ціль рівня',
- 'ko': '목표 보기'
+ 'ko': '목표 보기',
+ 'vi': 'Hiển thị mục tiêu'
},
///////////////////////////////////////////////////////////////////////////
'hide-goal-button': {
@@ -1275,7 +1356,8 @@ exports.strings = {
'ja' : 'ゴールを隠す',
'ru_RU': 'Спрятать цель',
'uk': 'Сховати ціль',
- 'ko': '목표 숨기기'
+ 'ko': '목표 숨기기',
+ 'vi': 'Ẩn mục tiêu'
},
///////////////////////////////////////////////////////////////////////////
'objective-button': {
@@ -1288,7 +1370,8 @@ exports.strings = {
'gl' : 'Obxectivo',
'ru_RU': 'Задача',
'uk': 'Задача',
- 'ko': '목적'
+ 'ko': '목적',
+ 'vi': 'Chỉ dẫn'
},
///////////////////////////////////////////////////////////////////////////
'git-demonstration-title': {
@@ -1301,7 +1384,8 @@ exports.strings = {
'gl' : 'Demostración de Git',
'ru_RU': 'Git демо',
'uk' : 'Git демо',
- 'ko' : 'Git 데모'
+ 'ko' : 'Git 데모',
+ 'vi' : 'Trình diễn Git'
},
///////////////////////////////////////////////////////////////////////////
'goal-to-reach': {
@@ -1318,7 +1402,8 @@ exports.strings = {
'ja' : '到達目標',
'ru_RU': 'Цель уровня',
'uk': 'Ціль рівня',
- 'ko': '목표'
+ 'ko': '목표',
+ 'vi': 'Mục tiêu cần đạt'
},
///////////////////////////////////////////////////////////////////////////
'goal-only-master': {
@@ -1335,7 +1420,8 @@ exports.strings = {
'ja': 'Note: masterブランチだけをこのlevelではチェックします。その他のブランチ(以下では、破線で示されています)に関しては、参照のためにあります。また、いつでもこのウィンドウは"hide goal"と打つかクリックで閉じれます',
'ru_RU': 'Важно: В этом уровне проверяется только ветка master. Остальные ветки просто для наглядности. Как обычно, можно скрыть это сообщение при помощи "hide goal"',
'uk': 'Важливо: В цьому рівні буде перевірятися тільки гілка master. Решта гілок тільки для наглядності (показані пунктиром нижче). Як завжди, можна сховати цей діалог за допомогою "hide goal"',
- 'ko': 'Note: 이 레벨에선 오직 마스터 브랜치만이 검사될 것입니다.. 다른 브랜치들은 단순히 참고용입니다. (아래에 대시 라벨로 보여집니다.). "hide goal"을 사용하여 언제든지 창을 숨킬 수 있습니다.'
+ 'ko': 'Note: 이 레벨에선 오직 마스터 브랜치만이 검사될 것입니다.. 다른 브랜치들은 단순히 참고용입니다. (아래에 대시 라벨로 보여집니다.). "hide goal"을 사용하여 언제든지 창을 숨킬 수 있습니다.',
+ 'vi': 'Chú ý: Ở cấp độ này chỉ nhánh master bị kiểm tra. Các nhánh khác chỉ dùng để tham chiếu(có dấu - ở nhãn). Như thường lệ, bạn có thể ẩn mục tiêu bằng "hide goal".'
},
///////////////////////////////////////////////////////////////////////////
'hide-goal': {
@@ -1352,7 +1438,8 @@ exports.strings = {
'ja' : 'このウィンドウは"hide goal"と打つかクリックで閉じれます',
'ru_RU': 'Можно скрыть это окно при помощи "hide goal"',
'uk': 'Можна сховати це вікно за допомогою "hide goal"',
- 'ko': '"hide goal"을 사용하여 이 창을 숨길 수 있습니다.'
+ 'ko': '"hide goal"을 사용하여 이 창을 숨길 수 있습니다.',
+ 'vi': 'Bạn có thể ẩn cửa sổ này với "hide goal".'
},
///////////////////////////////////////////////////////////////////////////
'hide-start': {
@@ -1369,7 +1456,8 @@ exports.strings = {
'ja' : 'このウィンドウは"hide start"かクリックで閉じれます',
'ru_RU': 'Можно скрыть это окно при помощи "hide start"',
'uk': 'Можна сховати це вікно за допомогою "hide start"',
- 'ko': '"hide start"를 사용하여 이 창을 숨길 수 있습니다.'
+ 'ko': '"hide start"를 사용하여 이 창을 숨길 수 있습니다.',
+ 'vi': 'Bạn có thể ẩn cửa sổ này với "hide start".'
},
///////////////////////////////////////////////////////////////////////////
'level-builder': {
@@ -1386,7 +1474,8 @@ exports.strings = {
'ja' : 'Levelエディタ',
'ru_RU': 'Редактор уровней',
'uk': 'Редактор рівнів',
- 'ko': '레벨 생성기'
+ 'ko': '레벨 생성기',
+ 'vi': 'Trình tạo câp độ'
},
///////////////////////////////////////////////////////////////////////////
'no-start-dialog': {
@@ -1403,7 +1492,8 @@ exports.strings = {
'ja' : 'このLevelにはスタートダイアログが存在しません',
'ru_RU': 'Нет стартового сообщение для уровня!',
'uk': 'Немає початкового діалогу для цього рівня!',
- 'ko': '이 레벨을 위한 시작 대화창이 없습니다.'
+ 'ko': '이 레벨을 위한 시작 대화창이 없습니다.',
+ 'vi': 'Cấp độ này không được giới thiệu.'
},
///////////////////////////////////////////////////////////////////////////
'no-hint': {
@@ -1420,7 +1510,8 @@ exports.strings = {
'ja' : 'あらら、このLevelでは、残念ながらヒントが存在しません :-/',
'ru_RU': "Милый мой, хороший, догадайся сам :-/ Подсказка не создана...",
'uk': 'Хм, схоже для цього рівня немає підказки :-/',
- 'ko': '흠, 이 레벨을 위한 힌트가 없어보이는군요.'
+ 'ko': '흠, 이 레벨을 위한 힌트가 없어보이는군요.',
+ 'vi': 'Hmmm, có vẻ cấp độ này không có gợi ý rồi. :-/'
},
///////////////////////////////////////////////////////////////////////////
'error-untranslated-key': {
@@ -1437,7 +1528,8 @@ exports.strings = {
'ja' : '{key}の翻訳がまだ存在しません :( GitHubでの、翻訳の協力をお願いします m(_)m',
'ru_RU': 'Перевода для {key} не создано :( Пожалуйста, предложи перевод на GitHub',
'uk': 'Немає перекладу для {key} :( Будь-ласка, запропонуй переклад на Github',
- 'ko': '{key}를 위한 번역은 아직 존재하지 않습니다 :( 번역에 참여해주세요!'
+ 'ko': '{key}를 위한 번역은 아직 존재하지 않습니다 :( 번역에 참여해주세요!',
+ 'vi': 'Bản dịch cho {key} không có rồi :( Nếu có thể thì hãy lên dự án của chúng tôi ở Github để cung cấp bản dịch!'
},
///////////////////////////////////////////////////////////////////////////
'error-untranslated': {
@@ -1454,6 +1546,7 @@ exports.strings = {
'ja' : 'このダイアログ、またはテキストの翻訳がまだ存在しません :( GitHubでの、翻訳の協力をお願いします m(_)m',
'ru_RU': 'Для этого сообщения нет перевода :( Пожалуйста, предложи перевод на GitHub',
'uk': 'Для цього повідомлення ще немає перекладу :( Будь-ласка, запропонуй переклад на Github',
- 'ko': '이 대화창이나 텍스트는 아직 번역되지 않았습니다. :( 번역에 참여해주세요!'
+ 'ko': '이 대화창이나 텍스트는 아직 번역되지 않았습니다. :( 번역에 참여해주세요!',
+ 'vi': 'Hội thoại hoặc văn bản này chưa được dịch ra ngôn ngữ của bạn rồi. :( Hãy lên Github để cung cấp bản dịch!'
}
};
diff --git a/src/js/stores/LocaleStore.js b/src/js/stores/LocaleStore.js
index 2be9c38b..7daec1a1 100644
--- a/src/js/stores/LocaleStore.js
+++ b/src/js/stores/LocaleStore.js
@@ -19,7 +19,8 @@ var langLocaleMap = {
de: 'de_DE',
pt: 'pt_BR',
ru: 'ru_RU',
- uk: 'uk'
+ uk: 'uk',
+ vi: 'vi'
};
var headerLocaleMap = {
diff --git a/src/levels/advanced/multipleParents.js b/src/levels/advanced/multipleParents.js
index 7b40b4dc..be68aaf9 100644
--- a/src/levels/advanced/multipleParents.js
+++ b/src/levels/advanced/multipleParents.js
@@ -14,7 +14,8 @@ exports.level = {
"zh_TW": "多個 parent commit",
"ru_RU": "Здоровая семья, или несколько родителей",
"ko" : "다수의 부모",
- 'uk': 'Декілька батьків'
+ 'uk': 'Декілька батьків',
+ 'vi': 'Nhiều cha lắm mẹ'
},
"hint": {
"en_US": "Use `git branch bugWork` with a target commit to create the missing reference.",
@@ -28,7 +29,8 @@ exports.level = {
"zh_TW": "在一個指定的 commit 上面使用 `git branch bugWork`。",
"ru_RU": "`git branch bugWork` на нужном коммите поможет создать нужную ссылку.",
"ko" : "`git branch bugWork`를 대상 커밋과 함께 사용해서 부족한 참조를 만드세요",
- 'uk': 'Використай "git branch bugWork" на потрібному коміті щоб створити потрібне посилання'
+ 'uk': 'Використай "git branch bugWork" на потрібному коміті щоб створити потрібне посилання',
+ 'vi': 'Dùng lệnh `git branch bugWork` để tạo nhánh tại vị trí chỉ định'
},
"startDialog": {
"en_US": {
@@ -1075,6 +1077,93 @@ exports.level = {
}
}
]
+ },
+ "vi": {
+ "childViews": [
+ {
+ "type": "ModalAlert",
+ "options": {
+ "markdowns": [
+ "### Tìm về cội nguồn",
+ "",
+ "Cũng giống ký hiệu `~`, ta cũng có thể thêm số theo sau ký hiệu `^`.",
+ "",
+ "Nhưng mà không giống như (`~`) con số theo sau là số lượng thế hệ commit, con số theo sau `^` chỉ định commit cha từ commit merge. Hãy nhớ rằng commit merge có nhiều cha, cho nên chọn cha nào cũng khá là mơ hồ.",
+ "",
+ "Thông thường thì sẽ chọn cha \"đầu tiên\" từ commit merge, nhưng nếu sau dấu `^` có một con số thì cách hành xử sẽ khác đi.",
+ "",
+ "Không nói dông dài nữa, làm thử một ví dụ nào",
+ ""
+ ]
+ }
+ },
+ {
+ "type": "GitDemonstrationView",
+ "options": {
+ "beforeMarkdowns": [
+ "Ở đây ta có 1 commit merge. Nếu ta dùng lệnh `master^` mà không bổ nghĩa cho nó, ta sẽ đi ngược lên commit cha đầu tiên của merge commit. ",
+ "",
+ "(*Trong hình minh họa bên trái thì commit cha đầu tiên được xếp hẳng hàng ngay phía trên của commit merge.*)"
+ ],
+ "afterMarkdowns": [
+ "Dễ dàng -- đó là cách mà ta thường làm."
+ ],
+ "command": "git checkout master^",
+ "beforeCommand": "git checkout HEAD^; git commit; git checkout master; git merge C2"
+ }
+ },
+ {
+ "type": "GitDemonstrationView",
+ "options": {
+ "beforeMarkdowns": [
+ "Nào bây giờ hãy chỉ định commit cha thứ hai thử..."
+ ],
+ "afterMarkdowns": [
+ "Thấy chứ? Ta đã leo lên commit cha khác lúc trước."
+ ],
+ "command": "git checkout master^2",
+ "beforeCommand": "git checkout HEAD^; git commit; git checkout master; git merge C2"
+ }
+ },
+ {
+ "type": "GitDemonstrationView",
+ "options": {
+ "beforeMarkdowns": [
+ "Dùng bổ ngữ `^` và `~` cho ta khả năng di chuyển trên cây lịch sử:"
+ ],
+ "afterMarkdowns": [
+ "Nhanh như chớp!"
+ ],
+ "command": "git checkout HEAD~; git checkout HEAD^2; git checkout HEAD~2",
+ "beforeCommand": "git commit; git checkout C0; git commit; git commit; git commit; git checkout master; git merge C5; git commit"
+ }
+ },
+ {
+ "type": "GitDemonstrationView",
+ "options": {
+ "beforeMarkdowns": [
+ "Thâm chí còn ghê gớm hơn khi ta kết hợp chúng với nhau! Hãy xem thử:"
+ ],
+ "afterMarkdowns": [
+ "Cùng con đường như lúc trước, nhưng chỉ cần 1 dòng lệnh."
+ ],
+ "command": "git checkout HEAD~^2~2",
+ "beforeCommand": "git commit; git checkout C0; git commit; git commit; git commit; git checkout master; git merge C5; git commit"
+ }
+ },
+ {
+ "type": "ModalAlert",
+ "options": {
+ "markdowns": [
+ "### Áp dụng thực hành nào",
+ "",
+ "Để hoàn thành cấp độ này, hãy tạo ra một nhánh mới ở vị trí chỉ định.",
+ "",
+ "Dùng cách chỉ định trực tiếp commit (như là dùng `C6` chẳng hạn) thì dễ quá, nhưng thử thách ở đây là dùng các bổ ngữ đã học ở trên!"
+ ]
+ }
+ }
+ ]
}
}
};
diff --git a/src/levels/index.js b/src/levels/index.js
index 6a42de27..69c23590 100644
--- a/src/levels/index.js
+++ b/src/levels/index.js
@@ -81,7 +81,7 @@ var sequenceInfo = exports.sequenceInfo = {
'ko' : 'git의 주요 명령어를 깔끔하게 알려드립니다',
'ru_RU': 'Хорошо подобранное введение в основные команды git',
'uk' : 'Гарно підібране введення в основні команди git',
- 'vi' : 'Bước làm quen độc đáo tới phần lớn lệnh điều khiển git'
+ 'vi' : 'Từng bước làm quen với phần lớn lệnh điều khiển git'
}
},
rampup: {
@@ -98,7 +98,7 @@ var sequenceInfo = exports.sequenceInfo = {
'ru_RU': 'Едем дальше',
'uk' : 'Їдемо далі',
'ko' : '다음 단계로',
- 'vi' : 'Vượt chướng ngại vật'
+ 'vi' : 'Tăng tốc'
},
about: {
'en_US': 'The next serving of 100% git awesomes-ness. Hope you\'re hungry',
@@ -113,7 +113,7 @@ var sequenceInfo = exports.sequenceInfo = {
'ru_RU': 'Следующая порция абсолютной git-крутотенюшки. Проголодались?',
'uk' : 'Наступна порція абсолютної git-дивини. Сподіваюсь, ви зголодніли',
'ko' : 'git은 아주 멋져요. 왜 멋진지 알려드립니다',
- 'vi' : 'Những món tuyệt đỉnh tiếp theo. Hi vọng bạn còn đói.'
+ 'vi' : 'Tận hưởng khẩu phần tuyệt hảo của git. Hi vọng bạn còn đói.'
}
},
remote: {
@@ -131,7 +131,7 @@ var sequenceInfo = exports.sequenceInfo = {
'ru_RU': 'Push & Pull - удалённые репозитории в Git!',
'uk' : 'Push & Pull -- віддалені репозиторії в Git!',
'ko' : 'Push & Pull -- Git 원격 저장소!',
- 'vi' : 'Push & Pull -- Các git remote!'
+ 'vi' : 'Push & Pull -- Tác động git từ xa!'
},
about: {
'en_US': 'Time to share your 1\'s and 0\'s kids; coding just got social',
@@ -146,7 +146,7 @@ var sequenceInfo = exports.sequenceInfo = {
'ru_RU': 'Настало время поделиться своими единичками и нулями. Время коллективного программирования',
'uk' : 'Настав час поділитися своїми нулями та одиничками; соціальне програмування',
'ko' : '내 코드를 공개할 때가 되었습니다. 코드를 공개해봅시다!',
- 'vi' : 'Chia sẻ đứa con tinh thần 0 và 1 của bạn; mã tới với cộng đồng'
+ 'vi' : 'Chia sẻ đứa con tinh thần \'0\' và \'1\' của bạn; mã đã đến với cộng đồng'
}
},
remoteAdvanced: {
@@ -164,7 +164,7 @@ var sequenceInfo = exports.sequenceInfo = {
'ru_RU': 'Через origin – к звёздам. Продвинутое использование Git Remotes',
'uk' : 'Через origin – до зірок. Прогресивне використання Git Remotes',
'ko' : '"origin"그 너머로 -- 고급 Git 원격 저장소',
- 'vi' : 'Gửi quê hương và các xứ xa -- nâng cao về các git remote'
+ 'vi' : 'Về với cội nguồn và vươn xa hơn -- nâng cao về các git remote'
},
about: {
'en_US': 'And you thought being a benevolent dictator would be fun...',
@@ -179,7 +179,7 @@ var sequenceInfo = exports.sequenceInfo = {
'ru_RU': 'Весело было быть всесильным мудрым правителем...',
'uk' : 'А ти думав, що бути всесильним диктатором весело...',
'ko' : '자비로운 독재자가 되는게 재밌을 줄 알았겠지만...',
- 'vi' : 'Làm một tay độc tài toàn năng bác ái cũng vui lắm...'
+ 'vi' : 'Và bạn nghĩ làm một kẻ độc tài nhân từ thì sẽ vui ...'
}
},
move: {
@@ -196,7 +196,7 @@ var sequenceInfo = exports.sequenceInfo = {
'zh_TW': '調整提交順序',
'ru_RU': 'Перемещаем труды туда-сюда',
'uk' : 'Переміщуємо роботу туди-сюди',
- 'vi' : 'Bốc bốc xếp xếp'
+ 'vi' : 'Điều chỉnh vị trí'
},
about: {
'en_US': '"Git" comfortable with modifying the source tree :P',
diff --git a/src/levels/intro/branching.js b/src/levels/intro/branching.js
index 7ecdc005..1b22ce64 100644
--- a/src/levels/intro/branching.js
+++ b/src/levels/intro/branching.js
@@ -13,7 +13,8 @@ exports.level = {
"zh_CN": "Git Branch",
"zh_TW": "建立 git branch",
"ru_RU": "Ветвление в Git",
- "uk": "Розгалуження в Git"
+ "uk": "Розгалуження в Git",
+ "vi": "Rẽ nhánh với Git"
},
"hint": {
"en_US": "Make a new branch with \"git branch \" and check it out with \"git checkout \"",
@@ -27,7 +28,8 @@ exports.level = {
"zh_TW": "用 'git branch [ branch 名稱]' 來建立 branch,用 'git checkout [ branch 名稱]' 切換到該 branch",
"ko": "\"git branch [브랜치명]\"으로 새 브랜치를 만들고, \"git checkout [브랜치명]\"로 그 브랜치로 이동하세요",
"ru_RU": "Создай новую ветку при помощи \"git branch [name]\" и перейди на неё при помощи \"git checkout [name]\"",
- "uk": "Створи нову гілку за допомогою \"git branch [ім’я]\" й перейди на неї за допомогою \"git checkout [ім’я]\""
+ "uk": "Створи нову гілку за допомогою \"git branch [ім’я]\" й перейди на неї за допомогою \"git checkout [ім’я]\"",
+ "vi": "Tạo một nhánh mới với lệnh \"git branch \" và chuyển sang đó với lệnh \"git checkout \"",
},
"disabledMap": {
"git revert": true
@@ -973,6 +975,88 @@ exports.level = {
}
}
]
- }
+ },
+ "vi": {
+ "childViews": [
+ {
+ "type": "ModalAlert",
+ "options": {
+ "markdowns": [
+ "## Nhánh Git",
+ "",
+ "Nhánh trong Git cũng nhẹ đến không ngờ. Chúng chỉ đơn giản là các con trỏ đến commit -- không hơn. Đó là lý do các con chiên Git hay niệm chú:",
+ "",
+ "```",
+ "rẽ nhánh sớm, rẽ nhánh thường xuyên",
+ "```",
+ "",
+ "Bởi vì chẳng tốn bao nhiêu bộ nhớ cho việc rẽ nhánh cả, và nó dễ dàng phân chia công việc hơn là có một cái nhánh to tổ chảng.",
+ "",
+ "Khi bạn trộn lẫn commit và nhánh, bạn sẽ thấy chúng kết hợp với nhau thế nào. Còn bây giờ, đơn giản hãy nhớ nhánh cơ bản muốn nói \"Tôi muốn thành quả trong commit này và tất cả cha ông của nó\""
+ ]
+ }
+ },
+ {
+ "type": "GitDemonstrationView",
+ "options": {
+ "beforeMarkdowns": [
+ "Nào hãy xem nhánh trong Git hoạt động thế nào.",
+ "",
+ "Giờ chúng ta tạo một nhánh mới tên là `newImage`"
+ ],
+ "afterMarkdowns": [
+ "Đó, rẽ nhánh là thế đó! Nhánh `newImage` giờ đã tham chiếu đến commit `C1`"
+ ],
+ "command": "git branch newImage",
+ "beforeCommand": ""
+ }
+ },
+ {
+ "type": "GitDemonstrationView",
+ "options": {
+ "beforeMarkdowns": [
+ "Nào cùng thử thêm nội dung vào nhánh mới này nào. Hãy bấm nút bên dưới"
+ ],
+ "afterMarkdowns": [
+ "Ồ không! Nhánh `master` đã di chuyển nhưng nhánh `newImage` thì không! Đó là do ta không \"nằm trên\" nhánh mới, đó là tại sao dấu hoa thị (*) nằm trên nhánh `master`"
+ ],
+ "command": "git commit",
+ "beforeCommand": "git branch newImage"
+ }
+ },
+ {
+ "type": "GitDemonstrationView",
+ "options": {
+ "beforeMarkdowns": [
+ "Nào cùng bảo Git chuyển ta sang nhánh khác với lệnh",
+ "",
+ "```",
+ "git checkout ",
+ "```",
+ "",
+ "Lệnh này sẽ chuyển ta sang nhánh mới trước khi commit"
+ ],
+ "afterMarkdowns": [
+ "Đó! Thay đổi của ta đã được lưu sang nhánh mới"
+ ],
+ "command": "git checkout newImage; git commit",
+ "beforeCommand": "git branch newImage"
+ }
+ },
+ {
+ "type": "ModalAlert",
+ "options": {
+ "markdowns": [
+ "Được rồi! Bạn đã sẵn sàng để tập rẽ nhánh rồi. Khi cửa sổ này đóng lại,",
+ "tạo một nhánh mới tên là `bugFix` và chuyển sang nhánh đó.",
+ "",
+ "Tiện thể, có đường tắt đấy: nếu bạn muốn tạo nhánh mới ",
+ "VÀ đồng thời chuyển sang luôn, bạn chỉ cần ",
+ "gõ `git checkout -b [yourbranchname]`."
+ ]
+ }
+ }
+ ]
+ },
}
};
diff --git a/src/levels/intro/merging.js b/src/levels/intro/merging.js
index 894501ff..b8cc1855 100644
--- a/src/levels/intro/merging.js
+++ b/src/levels/intro/merging.js
@@ -13,7 +13,8 @@ exports.level = {
"zh_CN": "Git Merge",
"zh_TW": "git 中的 merge",
"ru_RU": "Слияния веток в Git",
- "uk": "Злиття гілок в Git"
+ "uk": "Злиття гілок в Git",
+ "vi": "Gộp nhánh trong Git"
},
"hint": {
"en_US": "Remember to commit in the order specified (bugFix before master)",
@@ -27,7 +28,8 @@ exports.level = {
"zh_TW": "記住按指定的順序 commit(bugFix 比 master 優先)",
"ko": "말씀드린 순서대로 커밋해주세요 (bugFix에 먼저 커밋하고 master에 커밋)",
"ru_RU": "Не забудь делать коммиты в правильном порядке (сначала bugFix, потом master)",
- "uk": "Не забудь робити коміти в правильному порядку (спочатку bugFix, а вже потім master)"
+ "uk": "Не забудь робити коміти в правильному порядку (спочатку bugFix, а вже потім master)",
+ "vi": "Nhớ là commit theo đúng thứ tự(bugFix trước master)"
},
"disabledMap": {
"git revert": true
@@ -860,6 +862,75 @@ exports.level = {
}
}
]
+ },
+ "vi": {
+ "childViews": [
+ {
+ "type": "ModalAlert",
+ "options": {
+ "markdowns": [
+ "## Nhánh và gộp nhánh",
+ "",
+ "Tuyệt! Ta đã biết làm sao để commit và tạo nhánh. Giờ ta cần học cách để tập hợp thành quả của 2 nhánh khác biệt lại với nhau. Đây sẽ là cách để ta phân tách để phát triển chức năng, rồi sau đó hợp nhất nó trở lại.",
+ "",
+ "Cách đầu tiên để hợp nhất thành quả cần xem xét đến là lệnh `git merge`. Merge trong Git là tạo ra một commit đặc biệt mà có 2 người cha độc nhất. Một commit mà có 2 cha căn bản nghĩa là \"Tôi muốn có thành quả của ông này và ông kia nữa, *và* tất cả ông cha của họ.\"",
+ "",
+ "Trực quan thì dễ hiểu hơn, sang trang tiếp theo nào"
+ ]
+ }
+ },
+ {
+ "type": "GitDemonstrationView",
+ "options": {
+ "beforeMarkdowns": [
+ "Ở đây ta có 2 nhánh; mỗi nhánh có 1 commit độc nhất. Có nghĩa là chẳng nhánh nào có đủ \"thành quả\" trong kho chứa của ta cả. Sửa nó bằng merge nào.",
+ "",
+ "Ta sẽ `merge` nhánh `bugFix` vào `master`"
+ ],
+ "afterMarkdowns": [
+ "Wao! Thấy chứ? Trước tiên, `master` giờ đã trỏ đến commit có 2 cha. Nếu bạn lần theo mũi tên lên trên từ `master`, bạn sẽ gặp tất cả các commit lên đến commit gốc. Có nghĩa là `master` giờ đã chứa tất cả thành quả trong kho.",
+ "",
+ "Đồng thời, bạn thấy màu commit thay đổi chứ? Để bạn dễ học hơn, tôi đã phối hợp một số bảng màu. Mỗi nhánh có một màu duy nhất. Mỗi commit mang màu pha trộn của tất cả nhánh chứa nó.",
+ "",
+ "Vì vậy, ở đây chúng ta thấy rằng màu nhánh `master` được pha trộn vào tất cả các commit, nhưng màu` bugFix` thì không. Hãy sửa nó nào ..."
+ ],
+ "command": "git merge bugFix",
+ "beforeCommand": "git checkout -b bugFix; git commit; git checkout master; git commit"
+ }
+ },
+ {
+ "type": "GitDemonstrationView",
+ "options": {
+ "beforeMarkdowns": [
+ "Hãy gộp nhánh `master` vào `bugFix` nào:"
+ ],
+ "afterMarkdowns": [
+ "Vì `bugFix` là bậc cha ông của `master`, git chẳng phải làm gì cả; nó đơn giản chỉ chuyển `bugFix` vào commit mà `master` đang trỏ tới.",
+ "",
+ "Giờ thì tất cả commit đã có cùng màu, nghĩa là mỗi nhánh đã chứa tất cả thành quả trong kho! Ồ hố!"
+ ],
+ "command": "git checkout bugFix; git merge master",
+ "beforeCommand": "git checkout -b bugFix; git commit; git checkout master; git commit; git merge bugFix"
+ }
+ },
+ {
+ "type": "ModalAlert",
+ "options": {
+ "markdowns": [
+ "Để hoàn thành cấp độ này, hãy làm theo các bước bên dưới:",
+ "",
+ "* Tạo một nhánh mới tên là `bugFix`",
+ "* Chuyển sang nhánh `bugFix` với `git checkout bugFix`",
+ "* Commit một lần",
+ "* Trở về `master` với `git checkout`",
+ "* Commit một lần nữa",
+ "* Gộp nhánh `bugFix` vào `master` với `git merge`",
+ "",
+ "*Nhớ rằng, bạn luôn luôn có thể bật lại hội thoại này với lệnh \"objective\"!*"
+ ]
+ }
+ }
+ ]
}
}
};
diff --git a/src/levels/intro/rebasing.js b/src/levels/intro/rebasing.js
index 29a46107..b16786a5 100644
--- a/src/levels/intro/rebasing.js
+++ b/src/levels/intro/rebasing.js
@@ -13,7 +13,8 @@ exports.level = {
"zh_CN": "Git Rebase",
"zh_TW": "介紹 rebase",
"ru_RU": "Введение в rebase",
- "uk": "Знайомство з rebase"
+ "uk": "Знайомство з rebase",
+ "vi": "Giới thiệu về rebase"
},
"hint": {
"en_US": "Make sure you commit from bugFix first",
@@ -27,7 +28,8 @@ exports.level = {
"zh_CN": "先在 bugFix 分支上进行提交",
"zh_TW": "你要先在 bugFix branch 進行 commit",
"ru_RU": "Убедись, что сделал коммит в ветке bugFix",
- "uk": "Впевнись, що зробив коміт в гілці bugFix"
+ "uk": "Впевнись, що зробив коміт в гілці bugFix",
+ "vi": "Hãy chắc chắn rằng bạn commit từ bugFix trước"
},
"disabledMap": {
"git revert": true
@@ -834,6 +836,73 @@ exports.level = {
}
}
]
+ },
+ "vi": {
+ "childViews": [
+ {
+ "type": "ModalAlert",
+ "options": {
+ "markdowns": [
+ "## Git Rebase",
+ "",
+ "Cách thứ 2 để kết hợp thành của của 2 nhánh là *rebase.* Rebase về căn bản là chọn một loạt các commit, \"sao chép\" chúng, và ném chúng sang chỗ khác.",
+ "",
+ "Nghe có vẻ phức tạp, lợi thế của rebase là có thể tạo ra cây lịch sử thẳng tuột. Ljch sử commit nhìn sẽ gọn gàng hơn nhiều.",
+ "",
+ "Xem nó hoạt động thế nào nào..."
+ ]
+ }
+ },
+ {
+ "type": "GitDemonstrationView",
+ "options": {
+ "beforeMarkdowns": [
+ "Giờ ta lại có 2 nhánh; để ý rằng nhánh bugFix đang được chọn (thấy dấu hoa thị chứ?)",
+ "",
+ "Ta muốn chuyển bugFix trực tiếp sang master. Theo cách đó thì các chức năng nhìn có vẻ được phát triển tuần tự, trong khi thực tế chúng được phát triển song song.",
+ "",
+ "Dùng lệnh `git rebase` để thử nào"
+ ],
+ "afterMarkdowns": [
+ "Tuyệt vời! Giờ thành quả của nhánh bugFix nằm ngay trên master và ta có các commit nằm thẳng tuột.",
+ "",
+ "Để ý rằng commit C3 vẫn nằm đâu đó (đã được làm mờ), và commit C3' là bản \"sao chép\" mà ta dán lên nhánh master.",
+ "",
+ "Vấn đề duy nhất bây giờ là nhánh master vẫn chưa được cập nhật, làm luôn cho nóng nào..."
+ ],
+ "command": "git rebase master",
+ "beforeCommand": "git commit; git checkout -b bugFix C1; git commit"
+ }
+ },
+ {
+ "type": "GitDemonstrationView",
+ "options": {
+ "beforeMarkdowns": [
+ "Giờ thì ta đã chuyển sang nhánh `master`. Tiếp tục dán nó vào `bugFix` nào..."
+ ],
+ "afterMarkdowns": [
+ "Đó! Bởi vì `master` là cha ông của `bugFix`, git đơn giản chuyển tham chiếu của nhánh `master` tiến lên."
+ ],
+ "command": "git rebase bugFix",
+ "beforeCommand": "git commit; git checkout -b bugFix C1; git commit; git rebase master; git checkout master"
+ }
+ },
+ {
+ "type": "ModalAlert",
+ "options": {
+ "markdowns": [
+ "Để hoàn thành cấp độ này, làm theo hướng dẫn sau",
+ "",
+ "* Chuyển sang nhánh mới tên là `bugFix`",
+ "* Commit một lần",
+ "* Quay về master và commit lần nữa",
+ "* Quay trở lại bugFix và rebase sang master",
+ "",
+ "Chúc may mắn!"
+ ]
+ }
+ }
+ ]
}
}
};
diff --git a/src/levels/mixed/describe.js b/src/levels/mixed/describe.js
index 0bef2010..d4b24bc7 100644
--- a/src/levels/mixed/describe.js
+++ b/src/levels/mixed/describe.js
@@ -1,791 +1,856 @@
exports.level = {
- "goalTreeString": "{\"branches\":{\"master\":{\"target\":\"C2\",\"id\":\"master\",\"remoteTrackingBranchID\":null},\"side\":{\"target\":\"C4\",\"id\":\"side\",\"remoteTrackingBranchID\":null},\"bugFix\":{\"target\":\"C7\",\"id\":\"bugFix\",\"remoteTrackingBranchID\":null}},\"commits\":{\"C0\":{\"parents\":[],\"id\":\"C0\",\"rootCommit\":true},\"C1\":{\"parents\":[\"C0\"],\"id\":\"C1\"},\"C2\":{\"parents\":[\"C1\"],\"id\":\"C2\"},\"C3\":{\"parents\":[\"C1\"],\"id\":\"C3\"},\"C4\":{\"parents\":[\"C3\"],\"id\":\"C4\"},\"C5\":{\"parents\":[\"C3\"],\"id\":\"C5\"},\"C6\":{\"parents\":[\"C5\"],\"id\":\"C6\"},\"C7\":{\"parents\":[\"C6\"],\"id\":\"C7\"}},\"tags\":{\"v0\":{\"target\":\"C0\",\"id\":\"v0\",\"type\":\"tag\"},\"v1\":{\"target\":\"C3\",\"id\":\"v1\",\"type\":\"tag\"}},\"HEAD\":{\"target\":\"bugFix\",\"id\":\"HEAD\"}}",
- "solutionCommand": "git commit ",
- "startTree": "{\"branches\":{\"master\":{\"target\":\"C2\",\"id\":\"master\",\"remoteTrackingBranchID\":null},\"side\":{\"target\":\"C4\",\"id\":\"side\",\"remoteTrackingBranchID\":null},\"bugFix\":{\"target\":\"C6\",\"id\":\"bugFix\",\"remoteTrackingBranchID\":null}},\"commits\":{\"C0\":{\"parents\":[],\"id\":\"C0\",\"rootCommit\":true},\"C1\":{\"parents\":[\"C0\"],\"id\":\"C1\"},\"C2\":{\"parents\":[\"C1\"],\"id\":\"C2\"},\"C3\":{\"parents\":[\"C1\"],\"id\":\"C3\"},\"C4\":{\"parents\":[\"C3\"],\"id\":\"C4\"},\"C5\":{\"parents\":[\"C3\"],\"id\":\"C5\"},\"C6\":{\"parents\":[\"C5\"],\"id\":\"C6\"}},\"tags\":{\"v0\":{\"target\":\"C0\",\"id\":\"v0\",\"type\":\"tag\"},\"v1\":{\"target\":\"C3\",\"id\":\"v1\",\"type\":\"tag\"}},\"HEAD\":{\"target\":\"bugFix\",\"id\":\"HEAD\"}}",
- "name": {
- "en_US": "Git Describe",
- "fr_FR": "Git describe",
- "de_DE": "Git Describe",
- "ja" : "Git Describe",
- "es_AR": "Git Describe",
- "pt_BR": "Git Describe",
- "gl" : "Git Describe",
- "zh_TW": "git describe",
- "zh_CN": "Git Describe",
- "ru_RU": "Git describe",
- "ko" : "Git describe(묘사)",
- "uk" : "Git Describe"
+ 'goalTreeString': '{"branches":{"master":{"target":"C2","id":"master","remoteTrackingBranchID":null},"side":{"target":"C4","id":"side","remoteTrackingBranchID":null},"bugFix":{"target":"C7","id":"bugFix","remoteTrackingBranchID":null}},"commits":{"C0":{"parents":[],"id":"C0","rootCommit":true},"C1":{"parents":["C0"],"id":"C1"},"C2":{"parents":["C1"],"id":"C2"},"C3":{"parents":["C1"],"id":"C3"},"C4":{"parents":["C3"],"id":"C4"},"C5":{"parents":["C3"],"id":"C5"},"C6":{"parents":["C5"],"id":"C6"},"C7":{"parents":["C6"],"id":"C7"}},"tags":{"v0":{"target":"C0","id":"v0","type":"tag"},"v1":{"target":"C3","id":"v1","type":"tag"}},"HEAD":{"target":"bugFix","id":"HEAD"}}',
+ 'solutionCommand': 'git commit ',
+ 'startTree': '{"branches":{"master":{"target":"C2","id":"master","remoteTrackingBranchID":null},"side":{"target":"C4","id":"side","remoteTrackingBranchID":null},"bugFix":{"target":"C6","id":"bugFix","remoteTrackingBranchID":null}},"commits":{"C0":{"parents":[],"id":"C0","rootCommit":true},"C1":{"parents":["C0"],"id":"C1"},"C2":{"parents":["C1"],"id":"C2"},"C3":{"parents":["C1"],"id":"C3"},"C4":{"parents":["C3"],"id":"C4"},"C5":{"parents":["C3"],"id":"C5"},"C6":{"parents":["C5"],"id":"C6"}},"tags":{"v0":{"target":"C0","id":"v0","type":"tag"},"v1":{"target":"C3","id":"v1","type":"tag"}},"HEAD":{"target":"bugFix","id":"HEAD"}}',
+ 'name': {
+ 'en_US': 'Git Describe',
+ 'fr_FR': 'Git describe',
+ 'de_DE': 'Git Describe',
+ 'ja': 'Git Describe',
+ 'es_AR': 'Git Describe',
+ 'pt_BR': 'Git Describe',
+ 'gl': 'Git Describe',
+ 'zh_TW': 'git describe',
+ 'zh_CN': 'Git Describe',
+ 'ru_RU': 'Git describe',
+ 'ko': 'Git describe(묘사)',
+ 'uk': 'Git Describe',
+ 'vi': 'Git Describe(mô tả)'
},
- "hint": {
- "en_US": "Just commit once on bugFix when you're ready to move on",
- "fr_FR": "Faites un commit sur bugFix quand vous êtes prêt",
- "de_DE": "Committe nur einmal auf bugFix, wenn du soweit bist",
- "ja" : "次に進む準備が整ったなら、bugFixに対して一回commitしてください",
- "es_AR": "Simplemente commiteá una vez en bugFix cuando estés listo para seguir",
- "pt_BR": "Simplesmente commite uma vez em bugFix quando quiser parar de experimentar",
- "gl" : "Simplemente fai commit en bugFix cando estés listo para continuar.",
- "zh_TW": "當你要移動的時候,只要在 bugFix 上面 commit 就好了",
- "zh_CN": "当你准备好时,在 bugFix 分支上面提交一次就可以了",
- "ru_RU": "Когда закончишь, просто сделай commit",
- "ko" : "다음으로 넘어가고 싶으면 bugFix를 한번 커밋하면 됩니다.",
- "uk" : "Просто зроби один коміт в bugFix коли ти будеш готовий іти далі"
+ 'hint': {
+ 'en_US': 'Just commit once on bugFix when you\'re ready to move on',
+ 'fr_FR': 'Faites un commit sur bugFix quand vous êtes prêt',
+ 'de_DE': 'Committe nur einmal auf bugFix, wenn du soweit bist',
+ 'ja': '次に進む準備が整ったなら、bugFixに対して一回commitしてください',
+ 'es_AR': 'Simplemente commiteá una vez en bugFix cuando estés listo para seguir',
+ 'pt_BR': 'Simplesmente commite uma vez em bugFix quando quiser parar de experimentar',
+ 'gl': 'Simplemente fai commit en bugFix cando estés listo para continuar.',
+ 'zh_TW': '當你要移動的時候,只要在 bugFix 上面 commit 就好了',
+ 'zh_CN': '当你准备好时,在 bugFix 分支上面提交一次就可以了',
+ 'ru_RU': 'Когда закончишь, просто сделай commit',
+ 'ko': '다음으로 넘어가고 싶으면 bugFix를 한번 커밋하면 됩니다.',
+ 'uk': 'Просто зроби один коміт в bugFix коли ти будеш готовий іти далі',
+ 'vi': 'Đơn giản là hãy commit một lẩn ở bugFix là xong rồi'
},
- "startDialog": {
- "en_US": {
- "childViews": [
+ 'startDialog': {
+ 'en_US': {
+ 'childViews': [
{
- "type": "ModalAlert",
- "options": {
- "markdowns": [
- "### Git Describe",
- "",
- "Because tags serve as such great \"anchors\" in the codebase, git has a command to *describe* where you are relative to the closest \"anchor\" (aka tag). And that command is called `git describe`!",
- "",
- "Git describe can help you get your bearings after you've moved many commits backwards or forwards in history; this can happen after you've completed a git bisect (a debugging search) or when sitting down at a coworkers computer who just got back from vacation."
+ 'type': 'ModalAlert',
+ 'options': {
+ 'markdowns': [
+ '### Git Describe',
+ '',
+ 'Because tags serve as such great "anchors" in the codebase, git has a command to *describe* where you are relative to the closest "anchor" (aka tag). And that command is called `git describe`!',
+ '',
+ 'Git describe can help you get your bearings after you\'ve moved many commits backwards or forwards in history; this can happen after you\'ve completed a git bisect (a debugging search) or when sitting down at a coworkers computer who just got back from vacation.'
]
}
},
{
- "type": "ModalAlert",
- "options": {
- "markdowns": [
- "Git describe takes the form of:",
- "",
- "`git describe `",
- "",
- "Where `` is anything git can resolve into a commit. If you don't specify a ref, git just uses where you're checked out right now (`HEAD`).",
- "",
- "The output of the command looks like:",
- "",
- "`__g`",
- "",
- "Where `tag` is the closest ancestor tag in history, `numCommits` is how many commits away that tag is, and `` is the hash of the commit being described."
+ 'type': 'ModalAlert',
+ 'options': {
+ 'markdowns': [
+ 'Git describe takes the form of:',
+ '',
+ '`git describe `',
+ '',
+ 'Where `` is anything git can resolve into a commit. If you don\'t specify a ref, git just uses where you\'re checked out right now (`HEAD`).',
+ '',
+ 'The output of the command looks like:',
+ '',
+ '`__g`',
+ '',
+ 'Where `tag` is the closest ancestor tag in history, `numCommits` is how many commits away that tag is, and `` is the hash of the commit being described.'
]
}
},
{
- "type": "GitDemonstrationView",
- "options": {
- "beforeMarkdowns": [
- "Let's look at a quick example. For this tree below:"
+ 'type': 'GitDemonstrationView',
+ 'options': {
+ 'beforeMarkdowns': [
+ 'Let\'s look at a quick example. For this tree below:'
],
- "afterMarkdowns": [
- "The command `git describe master` would output:",
- "",
- "`v1_2_gC2`",
- "",
- "Whereas `git describe side` would output:",
- "",
- "`v2_1_gC4`"
+ 'afterMarkdowns': [
+ 'The command `git describe master` would output:',
+ '',
+ '`v1_2_gC2`',
+ '',
+ 'Whereas `git describe side` would output:',
+ '',
+ '`v2_1_gC4`'
],
- "command": "git tag v2 C3",
- "beforeCommand": "git commit; go -b side HEAD~1; gc; gc; git tag v1 C0"
+ 'command': 'git tag v2 C3',
+ 'beforeCommand': 'git commit; go -b side HEAD~1; gc; gc; git tag v1 C0'
}
},
{
- "type": "ModalAlert",
- "options": {
- "markdowns": [
- "That's pretty much all there is to git describe! Try describing a few of the locations in this level to get a feel for the command.",
- "",
- "Once you're ready, just go ahead and commit once to finish the level. We're giving you a freebie :P"
+ 'type': 'ModalAlert',
+ 'options': {
+ 'markdowns': [
+ 'That\'s pretty much all there is to git describe! Try describing a few of the locations in this level to get a feel for the command.',
+ '',
+ 'Once you\'re ready, just go ahead and commit once to finish the level. We\'re giving you a freebie :P'
]
}
}
]
},
- "fr_FR": {
- "childViews": [
+ 'fr_FR': {
+ 'childViews': [
{
- "type": "ModalAlert",
- "options": {
- "markdowns": [
- "### Git describe",
- "",
- "Parce ce que les tags sont de très bonnes références dans le code, git à une commande pour *décrire* (describe) la différence entre le commit et le tag le plus récent. Cette commande s'appelle `git describe` !",
- "",
- "Git describe peut vous aider lorsque vous vous êtes beaucoup déplacé; cela peut arriver après un git bisect (chercher l'apparition d'un bug) ou lorsque vous revenez de vacances après 3 semaines sur l'ordinateur d'un collègue."
+ 'type': 'ModalAlert',
+ 'options': {
+ 'markdowns': [
+ '### Git describe',
+ '',
+ 'Parce ce que les tags sont de très bonnes références dans le code, git à une commande pour *décrire* (describe) la différence entre le commit et le tag le plus récent. Cette commande s\'appelle `git describe` !',
+ '',
+ 'Git describe peut vous aider lorsque vous vous êtes beaucoup déplacé; cela peut arriver après un git bisect (chercher l\'apparition d\'un bug) ou lorsque vous revenez de vacances après 3 semaines sur l\'ordinateur d\'un collègue.'
]
}
},
{
- "type": "ModalAlert",
- "options": {
- "markdowns": [
- "Git describe s'écrit comme suit :",
- "",
- "`git describe `",
- "",
- "où `` est un n'importe quelle chose que git peut résoudre en un commit. Si vous ne spécifiez pas de ref, `HEAD` est pris par défaut.",
- "",
- "Le résultat de la commande ressemble à :",
- "",
- "`__g`",
- "",
- "où `tag` est le tag le plus proche dans l'historique, `numCommits` le nombre de commits avec le tag, et `` le hash/identifiant du commit décrit."
+ 'type': 'ModalAlert',
+ 'options': {
+ 'markdowns': [
+ 'Git describe s\'écrit comme suit :',
+ '',
+ '`git describe `',
+ '',
+ 'où `` est un n\'importe quelle chose que git peut résoudre en un commit. Si vous ne spécifiez pas de ref, `HEAD` est pris par défaut.',
+ '',
+ 'Le résultat de la commande ressemble à :',
+ '',
+ '`__g`',
+ '',
+ 'où `tag` est le tag le plus proche dans l\'historique, `numCommits` le nombre de commits avec le tag, et `` le hash/identifiant du commit décrit.'
]
}
},
{
- "type": "GitDemonstrationView",
- "options": {
- "beforeMarkdowns": [
- "Regardons un petit exemple. Prenons cet arbre :"
+ 'type': 'GitDemonstrationView',
+ 'options': {
+ 'beforeMarkdowns': [
+ 'Regardons un petit exemple. Prenons cet arbre :'
],
- "afterMarkdowns": [
- "La commande`git describe master` donne le résultat :",
- "",
- "`v1_2_gC2`",
- "",
- "alors que `git describe side` donne :",
- "",
- "`v2_1_gC4`"
+ 'afterMarkdowns': [
+ 'La commande`git describe master` donne le résultat :',
+ '',
+ '`v1_2_gC2`',
+ '',
+ 'alors que `git describe side` donne :',
+ '',
+ '`v2_1_gC4`'
],
- "command": "git tag v2 C3",
- "beforeCommand": "git commit; go -b side HEAD~1; gc; gc; git tag v1 C0"
+ 'command': 'git tag v2 C3',
+ 'beforeCommand': 'git commit; go -b side HEAD~1; gc; gc; git tag v1 C0'
}
},
{
- "type": "ModalAlert",
- "options": {
- "markdowns": [
- "Ceci résume bien git describe ! Amusez-vous à utiliser cette commande avec d'autres endroits dans ce niveau pour bien comprendre describe.",
- "",
- "Lorsque vous serez prêt, faites simplement un commit pour finir le niveau. Un petit niveau bonus :P"
+ 'type': 'ModalAlert',
+ 'options': {
+ 'markdowns': [
+ 'Ceci résume bien git describe ! Amusez-vous à utiliser cette commande avec d\'autres endroits dans ce niveau pour bien comprendre describe.',
+ '',
+ 'Lorsque vous serez prêt, faites simplement un commit pour finir le niveau. Un petit niveau bonus :P'
]
}
}
]
},
- "zh_TW": {
- "childViews": [
+ 'zh_TW': {
+ 'childViews': [
{
- "type": "ModalAlert",
- "options": {
- "markdowns": [
- "### git describe",
- "",
- "因為 tag 在 commit tree 上表示的是一個錨點,git 有一個指令可以用來*顯示*離你最近的錨點(也就是 tag),而且這個指令叫做 `git describe`!",
- "",
- "當你已經完成了一個 `git bisect`(一個找尋有 bug 的 commit 的指令),或者是當你使用的是你跑去度假的同事的電腦時, `git describe` 可以幫助你了解你離最近的 tag 差了多少個 commit。"
+ 'type': 'ModalAlert',
+ 'options': {
+ 'markdowns': [
+ '### git describe',
+ '',
+ '因為 tag 在 commit tree 上表示的是一個錨點,git 有一個指令可以用來*顯示*離你最近的錨點(也就是 tag),而且這個指令叫做 `git describe`!',
+ '',
+ '當你已經完成了一個 `git bisect`(一個找尋有 bug 的 commit 的指令),或者是當你使用的是你跑去度假的同事的電腦時, `git describe` 可以幫助你了解你離最近的 tag 差了多少個 commit。'
]
}
},
{
- "type": "ModalAlert",
- "options": {
- "markdowns": [
- "`git describe` 的使用方式:",
- "",
- "`git describe `",
- "",
- "`` 是任何一個可以被 git 解讀成 commit 的位置,如果你沒有指定的話,git 會以你目前所在的位置為準(`HEAD`)。",
- "",
- "指令的輸出就像這樣:",
- "",
- "`__g`",
- "",
- "`` 表示的是離 `` 最近的 tag, `numCommits` 是表示這個 tag 離 `` 有多少個 commit, `` 表示的是你所給定的 `` 所表示的 commit 的前七個 id。"
+ 'type': 'ModalAlert',
+ 'options': {
+ 'markdowns': [
+ '`git describe` 的使用方式:',
+ '',
+ '`git describe `',
+ '',
+ '`` 是任何一個可以被 git 解讀成 commit 的位置,如果你沒有指定的話,git 會以你目前所在的位置為準(`HEAD`)。',
+ '',
+ '指令的輸出就像這樣:',
+ '',
+ '`__g`',
+ '',
+ '`` 表示的是離 `` 最近的 tag, `numCommits` 是表示這個 tag 離 `` 有多少個 commit, `` 表示的是你所給定的 `` 所表示的 commit 的前七個 id。'
]
}
},
{
- "type": "GitDemonstrationView",
- "options": {
- "beforeMarkdowns": [
- "讓我們來看一個例子,對於下面的 tree:"
+ 'type': 'GitDemonstrationView',
+ 'options': {
+ 'beforeMarkdowns': [
+ '讓我們來看一個例子,對於下面的 tree:'
],
- "afterMarkdowns": [
- "`git describe master` 會輸出:",
- "",
- "`v1_2_gC2`",
- "",
- "`git describe side` 會輸出:",
- "",
- "`v2_1_gC4`"
+ 'afterMarkdowns': [
+ '`git describe master` 會輸出:',
+ '',
+ '`v1_2_gC2`',
+ '',
+ '`git describe side` 會輸出:',
+ '',
+ '`v2_1_gC4`'
],
- "command": "git tag v2 C3",
- "beforeCommand": "git commit; go -b side HEAD~1; gc; gc; git tag v1 C0"
+ 'command': 'git tag v2 C3',
+ 'beforeCommand': 'git commit; go -b side HEAD~1; gc; gc; git tag v1 C0'
}
},
{
- "type": "ModalAlert",
- "options": {
- "markdowns": [
- "`git describe` 就是這樣了!試著在這個關卡指定幾個位置來感受一下這個指令吧!",
- "",
- "當你完成的時候,只要一個 commit 就可以結束這個關卡,我們會給你一個免費贈品:P"
+ 'type': 'ModalAlert',
+ 'options': {
+ 'markdowns': [
+ '`git describe` 就是這樣了!試著在這個關卡指定幾個位置來感受一下這個指令吧!',
+ '',
+ '當你完成的時候,只要一個 commit 就可以結束這個關卡,我們會給你一個免費贈品:P'
]
}
}
]
},
- "zh_CN": {
- "childViews": [
+ 'zh_CN': {
+ 'childViews': [
{
- "type": "ModalAlert",
- "options": {
- "markdowns": [
- "### Git Describe",
- "",
- "由于标签在代码库中起着“锚点”的作用,Git 还为此专门设计了一个命令用来**描述**离你最近的锚点(也就是标签),它就是 `git describe`!",
- "",
- "Git Describe 能帮你在提交历史中移动了多次以后找到方向;当你用 `git bisect`(一个查找产生 Bug 的提交记录的指令)找到某个提交记录时,或者是当你坐在你那刚刚度假回来的同事的电脑前时, 可能会用到这个命令。"
+ 'type': 'ModalAlert',
+ 'options': {
+ 'markdowns': [
+ '### Git Describe',
+ '',
+ '由于标签在代码库中起着“锚点”的作用,Git 还为此专门设计了一个命令用来**描述**离你最近的锚点(也就是标签),它就是 `git describe`!',
+ '',
+ 'Git Describe 能帮你在提交历史中移动了多次以后找到方向;当你用 `git bisect`(一个查找产生 Bug 的提交记录的指令)找到某个提交记录时,或者是当你坐在你那刚刚度假回来的同事的电脑前时, 可能会用到这个命令。'
]
}
},
{
- "type": "ModalAlert",
- "options": {
- "markdowns": [
- "`git describe` 的语法是:",
- "",
- "`git describe `",
- "",
- "`` 可以是任何能被 Git 识别成提交记录的引用,如果你没有指定的话,Git 会以你目前所检出的位置(`HEAD`)。",
- "",
- "它输出的结果是这样的:",
- "",
- "`__g`",
- "",
- "`tag` 表示的是离 `ref` 最近的标签, `numCommits` 是表示这个 `ref` 与 `tag` 相差有多少个提交记录, `hash` 表示的是你所给定的 `ref` 所表示的提交记录哈希值的前几位。",
- "",
- "当 `ref` 提交记录上有某个标签时,则只输出标签名称"
+ 'type': 'ModalAlert',
+ 'options': {
+ 'markdowns': [
+ '`git describe` 的语法是:',
+ '',
+ '`git describe `',
+ '',
+ '`` 可以是任何能被 Git 识别成提交记录的引用,如果你没有指定的话,Git 会以你目前所检出的位置(`HEAD`)。',
+ '',
+ '它输出的结果是这样的:',
+ '',
+ '`__g`',
+ '',
+ '`tag` 表示的是离 `ref` 最近的标签, `numCommits` 是表示这个 `ref` 与 `tag` 相差有多少个提交记录, `hash` 表示的是你所给定的 `ref` 所表示的提交记录哈希值的前几位。',
+ '',
+ '当 `ref` 提交记录上有某个标签时,则只输出标签名称'
]
}
},
{
- "type": "GitDemonstrationView",
- "options": {
- "beforeMarkdowns": [
- "让我们来看一个例子,对于下面的提交树:"
+ 'type': 'GitDemonstrationView',
+ 'options': {
+ 'beforeMarkdowns': [
+ '让我们来看一个例子,对于下面的提交树:'
],
- "afterMarkdowns": [
- "`git describe master` 会输出:",
- "",
- "`v1_2_gC2`",
- "",
- "`git describe side` 会输出:",
- "",
- "`v2_1_gC4`"
+ 'afterMarkdowns': [
+ '`git describe master` 会输出:',
+ '',
+ '`v1_2_gC2`',
+ '',
+ '`git describe side` 会输出:',
+ '',
+ '`v2_1_gC4`'
],
- "command": "git tag v2 C3",
- "beforeCommand": "git commit; go -b side HEAD~1; gc; gc; git tag v1 C0"
+ 'command': 'git tag v2 C3',
+ 'beforeCommand': 'git commit; go -b side HEAD~1; gc; gc; git tag v1 C0'
}
},
{
- "type": "ModalAlert",
- "options": {
- "markdowns": [
- "`git describe` 就是这样了!试着在这个关卡指定几个位置来感受一下这个命令吧!",
- "",
- "当你准备进行下一关时,只要提交一次就可以通过这个关卡。算是我们送你的一个小礼物吧 :P"
+ 'type': 'ModalAlert',
+ 'options': {
+ 'markdowns': [
+ '`git describe` 就是这样了!试着在这个关卡指定几个位置来感受一下这个命令吧!',
+ '',
+ '当你准备进行下一关时,只要提交一次就可以通过这个关卡。算是我们送你的一个小礼物吧 :P'
]
}
}
]
},
- "es_AR": {
- "childViews": [
+ 'es_AR': {
+ 'childViews': [
{
- "type": "ModalAlert",
- "options": {
- "markdowns": [
- "### Git Describe",
- "",
- "Como los tags sirven tanto para marcar \"hitos\" en el código, git tiene un comando para *describir* (_describe_) dónde estás relativo al \"hito\" más cercano (digamos, \"tag\"). Y ese comamndo se llama ¡`git describe`!",
- "",
- "Git describe puede ayudarte a saber dónde estás después de que te hayas movido varios commits hacia adelante o atrás en la historia. Esto puede pasarte después de que termines un git bisect (una búsqueda que te ayuda a debuggear problemas) o cuando te sentás en la computadora de un compañero de trabajo que recién vuelve de unas vacaciones."
+ 'type': 'ModalAlert',
+ 'options': {
+ 'markdowns': [
+ '### Git Describe',
+ '',
+ 'Como los tags sirven tanto para marcar "hitos" en el código, git tiene un comando para *describir* (_describe_) dónde estás relativo al "hito" más cercano (digamos, "tag"). Y ese comamndo se llama ¡`git describe`!',
+ '',
+ 'Git describe puede ayudarte a saber dónde estás después de que te hayas movido varios commits hacia adelante o atrás en la historia. Esto puede pasarte después de que termines un git bisect (una búsqueda que te ayuda a debuggear problemas) o cuando te sentás en la computadora de un compañero de trabajo que recién vuelve de unas vacaciones.'
]
}
},
{
- "type": "ModalAlert",
- "options": {
- "markdowns": [
- "Git describe tiene la siguiente forma:",
- "",
- "`git describe `",
- "",
- "Donde `` es cualquier cosa que git puede resolver a un commit. Si no especificás ninguna referencia, git simplemente usa el commit en que estás parado ahora (`HEAD`).",
- "",
- "La salida de ese comando se ve así:",
- "",
- "`__g`",
- "",
- "Donde `tag` es el tag más cercano en la historia, `numCommits` dice a cuántos commits de ese tag estás, y `` es el hash del commit que estás describiendo."
+ 'type': 'ModalAlert',
+ 'options': {
+ 'markdowns': [
+ 'Git describe tiene la siguiente forma:',
+ '',
+ '`git describe `',
+ '',
+ 'Donde `` es cualquier cosa que git puede resolver a un commit. Si no especificás ninguna referencia, git simplemente usa el commit en que estás parado ahora (`HEAD`).',
+ '',
+ 'La salida de ese comando se ve así:',
+ '',
+ '`__g`',
+ '',
+ 'Donde `tag` es el tag más cercano en la historia, `numCommits` dice a cuántos commits de ese tag estás, y `` es el hash del commit que estás describiendo.'
]
}
},
{
- "type": "GitDemonstrationView",
- "options": {
- "beforeMarkdowns": [
- "Veamos un ejemplo breve. Para este árbol de commits:"
+ 'type': 'GitDemonstrationView',
+ 'options': {
+ 'beforeMarkdowns': [
+ 'Veamos un ejemplo breve. Para este árbol de commits:'
],
- "afterMarkdowns": [
- "El comando `git describe master` mostraría:",
- "",
- "`v1_2_gC2`",
- "",
- "Mientras que `git describe side` debería mostrar:",
- "",
- "`v2_1_gC4`"
+ 'afterMarkdowns': [
+ 'El comando `git describe master` mostraría:',
+ '',
+ '`v1_2_gC2`',
+ '',
+ 'Mientras que `git describe side` debería mostrar:',
+ '',
+ '`v2_1_gC4`'
],
- "command": "git tag v2 C3",
- "beforeCommand": "git commit; go -b side HEAD~1; gc; gc; git tag v1 C0"
+ 'command': 'git tag v2 C3',
+ 'beforeCommand': 'git commit; go -b side HEAD~1; gc; gc; git tag v1 C0'
}
},
{
- "type": "ModalAlert",
- "options": {
- "markdowns": [
- "¡Eso es prácticamente todo lo que hay sobre git describe! Probá describiendo algunas referencias en este nivel para amigarte con el comando.",
- "",
- "Cuando estés listo, hacé un commit para terminar el nivel. Te estamos dando una gratis :P"
+ 'type': 'ModalAlert',
+ 'options': {
+ 'markdowns': [
+ '¡Eso es prácticamente todo lo que hay sobre git describe! Probá describiendo algunas referencias en este nivel para amigarte con el comando.',
+ '',
+ 'Cuando estés listo, hacé un commit para terminar el nivel. Te estamos dando una gratis :P'
]
}
}
]
},
- "pt_BR": {
- "childViews": [
+ 'pt_BR': {
+ 'childViews': [
{
- "type": "ModalAlert",
- "options": {
- "markdowns": [
- "### Git Describe",
- "",
- "Devido ao fato de as tags servirem como \"âncoras\" tão boas no código, o Git tem um comando para *descrever* onde você está com relação à \"âncora\" (tag) mais próxima. Esse comando é chamado `git describe`!",
- "",
- "O git describe pode ajudar a recuperar a sua orientação depois de você ter se movido muitos commits para trás ou para frente no histórico; isso pode acontecer depois de você completar um git bisect (uma busca para debug) ou quando se sentar no computador de um colega que acabou de voltar de férias."
+ 'type': 'ModalAlert',
+ 'options': {
+ 'markdowns': [
+ '### Git Describe',
+ '',
+ 'Devido ao fato de as tags servirem como "âncoras" tão boas no código, o Git tem um comando para *descrever* onde você está com relação à "âncora" (tag) mais próxima. Esse comando é chamado `git describe`!',
+ '',
+ 'O git describe pode ajudar a recuperar a sua orientação depois de você ter se movido muitos commits para trás ou para frente no histórico; isso pode acontecer depois de você completar um git bisect (uma busca para debug) ou quando se sentar no computador de um colega que acabou de voltar de férias.'
]
}
},
{
- "type": "ModalAlert",
- "options": {
- "markdowns": [
- "O git describe é chamado da seguinte forma:",
- "",
- "`git describe `",
- "",
- "Onde `` é qualquer coisa que o git possa resolver como uma referência a um commit. Se você não especificar o ref, o Git usa simplesmente o commit atual (`HEAD`).",
- "",
- "A saída do comando é mais ou menos assim:",
- "",
- "`