Mark the close tab commands as "advanced"

--- background_scripts/commands.coffee
+++ background_scripts/commands.coffee
@@ -112,7 +112,8 @@
     "scrollToLeft", "scrollToRight", "moveTabToNewWindow",
     "goUp", "goToRoot", "focusInput", "LinkHints.activateModeWithQueue",
     "LinkHints.activateModeToOpenIncognito", "goNext", "goPrevious", "Marks.activateCreateMode",
-    "Marks.activateGotoMode", "moveTabLeft", "moveTabRight"]
+    "Marks.activateGotoMode", "moveTabLeft", "moveTabRight",
+    "closeTabsToLeft","closeTabsToRight", "closeOtherTabs"]

 defaultKeyMappings =
   "?": "showHelp"
@@ -256,7 +257,7 @@

   closeTabsToLeft: ["Close tabs to the left", {background: true, noRepeat: true}]
   closeTabsToRight: ["Close tabs to the right", {background: true, noRepeat: true}]
-  closeOtherTabs: ["Close other tabs", {background: true, noRepeat: true}]
+  closeOtherTabs: ["Close all other tabs", {background: true, noRepeat: true}]

   moveTabLeft: ["Move tab to the left", { background: true, passCountToFunction: true }]
   moveTabRight: ["Move tab to the right", { background: true, passCountToFunction: true  }]


Include the process type in Papertrail logging

remote: Support for password authentication was removed on August 13, 2021.
remote: Please see https://docs.github.com/en/get-started/getting-started-with-git/about-remote-repositories#cloning-with-https-urls for information on currently recommended modes of authentication.
fatal: Authentication failed for 'https://github.com/Arm1stice/prosu.git/'


Create Main.coffee

Create Main.coffee

https://paiza.jp/poh/hatsukoi/share/75e97439

error: pathspec 'POH8/PonyTail/Main.coffee' did not match any file(s) known to git

--- POH8/PonyTail/Main.coffee
+++ POH8/PonyTail/Main.coffee
@@ -0,0 +1,32 @@
+# Try POH
+# author: Leonardone @ NEETSDKASU
+# ===================================================
+
+solve = (mr) ->
+    ok = 0
+    for _ in [1..5]
+        [d, e] = mr.gss()
+        ok++ if d == e
+    console.log if ok > 2 then 'OK' else 'NG'
+
+# ===================================================
+(() ->
+    buf = ''
+    process.stdin.resume()
+    process.stdin.setEncoding 'utf8'
+    process.stdin.on 'data', (chunk) -> buf += chunk.toString()
+    process.stdin.on 'end', () ->
+        lines = buf.split '\n'
+        cur = 0
+        gs = -> lines[cur++]
+        gi = -> parseInt gs()
+        gss = -> gs().split ' '
+        gis = -> gss().map (x) -> parseInt x
+        ngt = (n, f) -> f() for _ in [1..n]
+        ngs = (n) -> ngt n, gs
+        ngi = (n) -> ngt n, gi
+        ngss = (n) -> ngt n, gss
+        ngis = (n) -> ngt n, gis
+        solve "gs": gs, "gi": gi, "gss": gss, "gis": gis, "ngs": ngs, "ngi": ngi, "ngss": ngss, "ngis": ngis
+    )()
+# ===================================================


silence foundation errors.

silence foundation errors.

* https://github.com/zurb/foundation-sites/issues/5661#issuecomment-57068242

remote: Support for password authentication was removed on August 13, 2021.
remote: Please see https://docs.github.com/en/get-started/getting-started-with-git/about-remote-repositories#cloning-with-https-urls for information on currently recommended modes of authentication.
fatal: Authentication failed for 'https://github.com/mokhan/surface.git/'


Issue#2993: Fix problem when upload a 0-bytes file

--- app/coffee/modules/resources/attachments.coffee
+++ app/coffee/modules/resources/attachments.coffee
@@ -48,6 +48,8 @@
             defered.reject(response)
             return defered.promise

+        xhr = new XMLHttpRequest()
+
         uploadProgress = (evt) =>
             $rootScope.$apply =>
                 file.status = "in-progress"
@@ -64,7 +66,14 @@
                     data = {}

                 model =  $model.make_model(urlName, data)
-                defered.resolve(model)
+                if xhr.status >= 200 and xhr.status < 400
+                    defered.resolve(model)
+                else
+                    response = {
+                        status: xhr.status,
+                        data: {_error_message: JSON.parse(xhr.response)['attached_file']?[0]}
+                    }
+                    defered.reject(response)

         uploadFailed = (evt) =>
             $rootScope.$apply ->
@@ -76,7 +85,6 @@
         data.append("object_id", objectId)
         data.append("attached_file", file)

-        xhr = new XMLHttpRequest()
         xhr.upload.addEventListener("progress", uploadProgress, false)
         xhr.addEventListener("load", uploadComplete, false)
         xhr.addEventListener("error", uploadFailed, false)


add logs + explain when isolating a PCI

add logs + explain when isolating a PCI

--- library/membrane/duplex.coffee
+++ library/membrane/duplex.coffee
@@ -189,16 +189,21 @@
         assert _.isObject constructor = this or 0
         assert m = @provider.apply this, arguments
         isolation = (fn) -> m.isolation = fn; return m
+        assert surrogate = "uis_%s_" # prefix template
         return isolation (socket, binder, session) ->
             return pci if _.isObject pci = socket.shadow
+            assert identify = try @constructor.identify()
+            assert prefix = _.sprintf surrogate, identify
             assert this isnt constructor, "scoping error"
             assert _.isObject shadow = Object.create this
             assert isolating = "Isolated provider call in %s"
-            logger.debug isolating.grey, try socket.id?.bold
+            logger.debug isolating.grey, sid = socket.id.bold
+            _.extend shadow, __uis: uis = _.uniqueId(prefix)
             _.extend shadow, __isolated: yes, __origin: this
             _.extend shadow, session: session, binder: binder
             _.extend shadow, socket: weak(socket) or socket
             _.extend shadow, request: try socket.handshake
+            logger.debug "Set PCI %s of %s", uis.bold, sid
             assert shadow.socket; socket.shadow = shadow

     # An important method that pertains to the details of internal


[bugfix] mistake in last change

[bugfix] mistake in last change

--- server/imap/connection.coffee
+++ server/imap/connection.coffee
@@ -183,9 +183,9 @@
 # @TODO follow node-imap#437
 Imap::setFlagsSafe = (uid, oldflags, newflags, callback) ->
     if newflags.length is 0
-        imap.delFlags uid, oldflags, callback
+        @delFlags uid, oldflags, callback
     else
-        imap.setFlags uid, newflags, callback
+        @setFlags uid, newflags, callback

 module.exports = Imap


added coffee

added coffee

error: pathspec 'coffee/ebeats.coffee' did not match any file(s) known to git

--- coffee/ebeats.coffee
+++ coffee/ebeats.coffee
@@ -0,0 +1,14 @@
+beatsPerHour = 1000.0 / 24.0
+beatsPerMinute = 1000.0 / (24.0 * 60.0)
+beatsPerSecond = 1000.0 / (24.0 * 60.0 * 60.0)
+
+dateToBeats = (date) ->
+  [year, month, day, hours, minutes, seconds] = [
+    date.getUTCFullYear(), date.getUTCMonth() + 1, date.getUTCDate(),
+    date.getUTCHours(), date.getUTCMinutes(), date.getUTCSeconds(),
+  ]
+  beats = (hours * beatsPerHour) +
+          (minutes * beatsPerMinute) +
+          (seconds * beatsPerSecond)
+  [year, month, day, beats]
+


:art: s/N1/Nylas Mail/ in window hang/crash dialogs

--- src/browser/nylas-window.coffee
+++ src/browser/nylas-window.coffee
@@ -190,7 +190,7 @@
       chosen = dialog.showMessageBox @browserWindow,
         type: 'warning'
         buttons: ['Close', 'Keep Waiting']
-        message: 'N1 is not responding'
+        message: 'Nylas Mail is not responding'
         detail: 'Would you like to force close it or keep waiting?'
       @browserWindow.destroy() if chosen is 0

@@ -209,7 +209,7 @@
         chosen = dialog.showMessageBox @browserWindow,
           type: 'warning'
           buttons: ['Close Window', 'Reload', 'Keep It Open']
-          message: 'N1 has crashed'
+          message: 'Nylas Mail has crashed'
           detail: 'Please report this issue to us at support@nylas.com.'
         switch chosen
           when 0 then @browserWindow.destroy()


TinyMCE RTL in course bulk email

TinyMCE RTL in course bulk email

remote: Support for password authentication was removed on August 13, 2021.
remote: Please see https://docs.github.com/en/get-started/getting-started-with-git/about-remote-repositories#cloning-with-https-urls for information on currently recommended modes of authentication.
fatal: Authentication failed for 'https://github.com/bmedx/modulestore.git/'


expand parent node

expand parent node

remote: Support for password authentication was removed on August 13, 2021.
remote: Please see https://docs.github.com/en/get-started/getting-started-with-git/about-remote-repositories#cloning-with-https-urls for information on currently recommended modes of authentication.
fatal: Authentication failed for 'https://github.com/showell/CoffeeCoffee.git/'


attempt to fix default state export bug

attempt to fix default state export bug

remote: Support for password authentication was removed on August 13, 2021.
remote: Please see https://docs.github.com/en/get-started/getting-started-with-git/about-remote-repositories#cloning-with-https-urls for information on currently recommended modes of authentication.
fatal: Authentication failed for 'https://github.com/kristenhazard/epm-catalog.git/'


added array_with_lines helper that shows an array separated by <br />

usage: `{{array_with_lines array}}`

error: pathspec 'app/assets/javascripts/helpers/array_with_lines.js.coffee' did not match any file(s) known to git

--- app/assets/javascripts/helpers/array_with_lines.js.coffee
+++ app/assets/javascripts/helpers/array_with_lines.js.coffee
@@ -0,0 +1,2 @@
+Ember.Handlebars.helper "array_with_lines", (value, options) ->
+  new Handlebars.SafeString(value.join("<br />"))


upd: benchmark

upd: benchmark

--- benchmark/template.coffee
+++ benchmark/template.coffee
@@ -1,5 +1,5 @@
 kit = require 'nokit'
-cs = kit.require 'colors/safe'
+cs = kit.require 'brush'

 ###*
  * The test will run 10 ^ 5 promises.


fix for the fix

fix for the fix

remote: Support for password authentication was removed on August 13, 2021.
remote: Please see https://docs.github.com/en/get-started/getting-started-with-git/about-remote-repositories#cloning-with-https-urls for information on currently recommended modes of authentication.
fatal: Authentication failed for 'https://github.com/Mikuia/Mikuia.git/'


added caching of health checks so we can hit them heaviy from multiple places without potential concurency problems

--- app.coffee
+++ app.coffee
@@ -41,7 +41,18 @@
 app.get "/status", (req, res, next) ->
 	res.send "CLSI is alive\n"

-app.get "/health_check", smokeTest.run(require.resolve(__dirname + "/test/smoke/js/SmokeTests.js"))
+resCacher =
+	contentType:(@setContentType)->
+	send:(@code, @body)->
+
+do runSmokeTest = ->
+	logger.log("running smoke tests")
+	smokeTest.run(require.resolve(__dirname + "/test/smoke/js/SmokeTests.js"))({}, resCacher)
+	setTimeout(runSmokeTest, 20 * 1000)
+
+app.get "/health_check", (req, res)->
+	res.contentType(resCacher.setContentType)
+	res.send resCacher.code, resCacher.body

 app.use (error, req, res, next) ->
 	logger.error err: error, "server error"


We purposefully trained him wrong... as a joke (ಠ‿ಠ)

error: pathspec 'roles/hubot/files/scripts/training.coffee' did not match any file(s) known to git

--- roles/hubot/files/scripts/training.coffee
+++ roles/hubot/files/scripts/training.coffee
@@ -0,0 +1,28 @@
+# Description:
+#   Display motivational training related imagery
+#
+# Dependencies:
+#   None
+#
+# Configuration:
+#   None
+#
+# Commands:
+#   hubot training
+#
+# Notes:
+#   Ell Oh Ell
+#
+# Author:
+#   Brian Shumate <brian@couchbase.com>
+
+trainingMsg = 'http://i.imgur.com/sQWCCGz.png'
+
+module.exports = (robot) ->
+  robot.hear /.*(training).*/i, (msg) ->
+    r = Math.random()
+    if r <= 0.10
+      msg.send trainingMsg
+
+  robot.respond /training/i, (msg) ->
+    msg.send trainingMsg


undo_upvote action in prop entity

undo_upvote action in prop entity

--- app/assets/javascripts/backbone/entities/prop.coffee
+++ app/assets/javascripts/backbone/entities/prop.coffee
@@ -13,6 +13,12 @@
     upvote: ->
       $.post "/api/v1/props/#{@get('id')}/upvotes", (data) =>
         @set data
+
+    undo_upvote: ->
+      $.ajax
+        url: "/api/v1/props/#{@get('id')}/undo_upvotes",
+        type: 'DELETE',
+        success: (data) => @set data

   class Entities.Props extends Entities.Collection
     model: Entities.Prop


Allow specs results to be scrolled

Allow specs results to be scrolled

I added overflow hidden on the html and body tags in a previous commit to prevent rubber banding when scrolling the editor. But it broke the ability to scroll specs. This fixes that.

--- spec/spec-helper.coffee
+++ spec/spec-helper.coffee
@@ -35,6 +35,7 @@

 window.keymap.bindKeys '*', 'meta-w': 'close'
 $(document).on 'close', -> window.close()
+$('html,body').css('overflow', 'auto')

 # Don't load user configuration in specs, because it's variable
 RootView.prototype.loadUserConfiguration = ->


Initial autocomplete for event checks in scripts tab

--- app/views/editor/level/scripts/ScriptsTabView.coffee
+++ app/views/editor/level/scripts/ScriptsTabView.coffee
@@ -124,7 +124,13 @@
     joined = '(unset)' if not joined.length
     @buildValueForDisplaySimply valEl, joined

-  buildValueForEditing: (valEl) -> @buildValueForEditingSimply(valEl, @arrayToString())
+  buildValueForEditing: (valEl) ->
+    super(valEl)
+    channel = @getRoot().data.channel
+    channelSchema = Backbone.Mediator.channelSchemas[channel]
+    autocompleteValues = ({label: val?.title or key, value: key} for key, val of channelSchema?.properties)
+    valEl.find('input').autocomplete(source: autocompleteValues, minLength: 0, delay: 0, autoFocus: true)
+    valEl

   saveChanges: (valEl) ->
     @data = (s for s in $('input', valEl).val().split('.') when s.length)


Change the call method of shell

Change the call method of shell

remote: Support for password authentication was removed on August 13, 2021.
remote: Please see https://docs.github.com/en/get-started/getting-started-with-git/about-remote-repositories#cloning-with-https-urls for information on currently recommended modes of authentication.
fatal: Authentication failed for 'https://github.com/Hiroto-K/MP3-Downloader.git/'


Hot reload pages and config

Hot reload pages and config

remote: Support for password authentication was removed on August 13, 2021.
remote: Please see https://docs.github.com/en/get-started/getting-started-with-git/about-remote-repositories#cloning-with-https-urls for information on currently recommended modes of authentication.
fatal: Authentication failed for 'https://github.com/ilcm96/ilcm96.github.io.git/'


basic cb

basic cb

remote: Support for password authentication was removed on August 13, 2021.
remote: Please see https://docs.github.com/en/get-started/getting-started-with-git/about-remote-repositories#cloning-with-https-urls for information on currently recommended modes of authentication.
fatal: Authentication failed for 'https://github.com/zzzev/insta.git/'


fix email sending

fix email sending

remote: Support for password authentication was removed on August 13, 2021.
remote: Please see https://docs.github.com/en/get-started/getting-started-with-git/about-remote-repositories#cloning-with-https-urls for information on currently recommended modes of authentication.
fatal: Authentication failed for 'https://github.com/clochix/cozy-home.git/'


openDoor FE slave fix

openDoor FE slave fix

remote: Support for password authentication was removed on August 13, 2021.
remote: Please see https://docs.github.com/en/get-started/getting-started-with-git/about-remote-repositories#cloning-with-https-urls for information on currently recommended modes of authentication.
fatal: Authentication failed for 'https://github.com/drsdrs/dooropener.git/'


Update Comment

Update Comment

--- src/fairy.coffee
+++ src/fairy.coffee
@@ -79,9 +79,9 @@

   # ### Keys

-  # Keys used by class `Fairy` include:
-  #
-  #   + `QUEUES`, a Redis set, containing names of all registered queues.
+  # Keys used by objects of class `Fairy` include:
+  #
+  #   + `QUEUES`, Redis set, containing names of all registered queues.
   key: (key) -> "#{prefix}:#{key}"

   # ### Get a Named Queue
@@ -115,8 +115,8 @@
   #
   # **Usage:**
   #
-  #     fairy.statistics (statistics) ->
-  #       console.log "Statistics of #{statistics.length} queues: ", statistics
+  #     fairy.statistics (stats) ->
+  #       console.log "Stats of #{stats.length} queues: ", stats

   # `statistics` is an asynchronous method. The only arg of the callback
   # function is an array containing statistics of all queues.


First pass at working session scraping.

First pass at working session scraping.

error: pathspec 'jobs/scrape-sessions.coffee' did not match any file(s) known to git

--- jobs/scrape-sessions.coffee
+++ jobs/scrape-sessions.coffee
@@ -0,0 +1,112 @@
+#   Copyright 2013 Matt Farmer
+#
+#   Licensed under the Apache License, Version 2.0 (the "License");
+#   you may not use this file except in compliance with the License.
+#   You may obtain a copy of the License at
+#
+#     http://www.apache.org/licenses/LICENSE-2.0
+#
+#   Unless required by applicable law or agreed to in writing, software
+#   distributed under the License is distributed on an "AS IS" BASIS,
+#   WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+#   See the License for the specific language governing permissions and
+#   limitations under the License.
+Apricot = require('apricot').Apricot
+MongoClient = require('mongodb').MongoClient
+mongoUrl = "mongodb://127.0.0.1:27017/galegis-api-dev"
+
+sessionCollectionName = "sessions"
+sessionScrapeUri = "http://www.legis.ga.gov/Legislation/en-US/VoteList.aspx"
+
+persistNewSession = (db, assemblyId, name, callback) ->
+  db.collection(sessionCollectionName).insert
+    assemblyId: assemblyId,
+    name: name,
+    current: false
+  ,
+    safe: true
+  , (err, doc) ->
+    if err
+      console.err err
+      callback(err)
+      return
+
+    console.log "Created session " + doc[0].name + " under ID " + doc[0]._id
+    callback()
+
+clearActiveSessions = (db, callback) ->
+  db.collection("sessions").update
+    current: true
+  ,
+    "$set":
+      "current": false
+  ,
+    safe: true
+  , callback
+
+markActiveSession = (db, callback) ->
+  db.collection("sessions").find({}, "sort": [['assemblyId','desc']]).toArray (err, docs) ->
+    if err
+      console.error(err)
+      callback(err)
+      return
+
+    if docs[0]
+      db.collection("sessions").update
+        "_id": docs[0]._id
+      ,
+        "$set":
+          "current": true
+      ,
+        "safe": true
+      , callback
+    else
+      callback()
+
+module.exports = (jobs) ->
+  jobs.process 'scrape sessions', (job, done) ->
+    Apricot.open sessionScrapeUri, (err, doc) ->
+      if err
+        console.error(err)
+        done(err)
+        return
+
+      doc.find("select[name=ctl00$SPWebPartManager1$g_f97fdca8_f858_400b_9279_a6a8f76ec618$Session] > *").each (elem) ->
+        sessionId = Number(elem.value)
+        sessionName = elem.innerHTML.trim()
+
+        MongoClient.connect mongoUrl, (err, db) ->
+          if err
+            console.log(err)
+            done(err)
+            return
+
+          db.collection("sessions").count {assemblyId: sessionId}, (err, count) ->
+            if err
+              console.log(err)
+              done(err)
+              return
+
+            if count == 0
+              console.log("Creating session " + sessionName + " " + sessionId)
+              persistNewSession db, sessionId, sessionName, (err) ->
+                if err
+                  console.log(err)
+                  done(err)
+                  db.close()
+                  return
+
+                clearActiveSessions db, (err) ->
+                  if err
+                    done(err)
+                    db.close()
+                    return
+
+                  markActiveSession db, (err) ->
+                    if err
+                      done(err)
+                      db.close()
+                      return
+
+                    done()
+                    db.close()


Changed method of attaching to window in browser to deal with browserify

remote: Support for password authentication was removed on August 13, 2021.
remote: Please see https://docs.github.com/en/get-started/getting-started-with-git/about-remote-repositories#cloning-with-https-urls for information on currently recommended modes of authentication.
fatal: Authentication failed for 'https://github.com/thestartcup/jsonc.git/'


Support Windows

Support Windows

Support the softlink for javascript folder in Windows

remote: Support for password authentication was removed on August 13, 2021.
remote: Please see https://docs.github.com/en/get-started/getting-started-with-git/about-remote-repositories#cloning-with-https-urls for information on currently recommended modes of authentication.
fatal: Authentication failed for 'https://github.com/davask/Popup-my-Bookmarks.git/'


Set a 5 min timeout to delta requests

Set a 5 min timeout to delta requests

--- src/docker-utils.coffee
+++ src/docker-utils.coffee
@@ -48,8 +48,8 @@
 	findSimilarImage(imgDest)
 	.spread (imgSrc) ->
 		rsyncDiff = new Promise (resolve, reject) ->
-			console.log("#{config.deltaHost}/api/v1/delta?src=#{imgSrc}&dest=#{imgDest}", timeout: 0)
-			progress request.get("#{config.deltaHost}/api/v1/delta?src=#{imgSrc}&dest=#{imgDest}", timeout: 0)
+			console.log("#{config.deltaHost}/api/v1/delta?src=#{imgSrc}&dest=#{imgDest}", timeout: 5 * 60 * 1000)
+			progress request.get("#{config.deltaHost}/api/v1/delta?src=#{imgSrc}&dest=#{imgDest}", timeout: 5 * 60 * 1000)
 			.on 'progress', onProgress
 			.on 'end', ->
 				onProgress(percent: 100)


Super important bugfix.

Super important bugfix.

remote: Support for password authentication was removed on August 13, 2021.
remote: Please see https://docs.github.com/en/get-started/getting-started-with-git/about-remote-repositories#cloning-with-https-urls for information on currently recommended modes of authentication.
fatal: Authentication failed for 'https://github.com/bezi/docker-talk.git/'


Was able to send out some emails.

Was able to send out some emails.

--- server/routes/mail.coffee
+++ server/routes/mail.coffee
@@ -17,31 +17,31 @@
   app.get '/mail/cron/ladder-update', handleLadderUpdate

 handleLadderUpdate = (req, res) ->
+  res.send('Great work, Captain Cron! I can take it from here.')
+  res.end()
   emailDays = [1, 2, 4, 7, 30]
   now = new Date()
   getTimeFromDaysAgo = (daysAgo) ->
     # 2 hours before the date
     t = now - (86400 * daysAgo + 2 * 3600) * 1000
   for daysAgo in emailDays
+    # Get every session that was submitted in a 5-minute window after the time.
     startTime = getTimeFromDaysAgo daysAgo
     endTime = startTime + 5 * 60 * 1000
-    # Get every session that was submitted in a 5-minute window after the time.
-    findParameters = {submitted: true, submitDate: {$gt: startTime, $lte: endTime}}
+    #endTime = startTime + 1 * 60 * 60 * 1000
+    findParameters = {submitted: true, submitDate: {$gt: new Date(startTime), $lte: new Date(endTime)}}
     # TODO: think about putting screenshots in the email
-    selectString = "creator team levelID totalScore matches"
+    selectString = "creator team levelName levelID totalScore matches submitted submitDate numberOfWinsAndTies numberOfLosses"
     query = LevelSession.find(findParameters)
       .select(selectString)
       .lean()
     mongoose = require 'mongoose'
-    mongoose.set 'debug', true
-    query.exec (err, results) ->
-      log.info "Yooooo got results: #{results.length}"
-      if err
-        log.error "Couldn't fetch ladder updates for", findParameters, "\nError: ", err
-        return errors.serverError res, "Ladder update email query failed: #{JSON.stringify(err)}"
-      sendLadderUpdateEmail result, daysAgo for result in results
-      res.send('')
-      res.end()
+    do (daysAgo) ->
+      query.exec (err, results) ->
+        if err
+          log.error "Couldn't fetch ladder updates for", findParameters, "\nError: ", err
+          return errors.serverError res, "Ladder update email query failed: #{JSON.stringify(err)}"
+        sendLadderUpdateEmail result, daysAgo for result in results

 sendLadderUpdateEmail = (session, daysAgo) ->
   User.findOne({_id: session.creator}).select("name email firstName lastName emailSubscriptions preferredLanguage").lean().exec (err, user) ->
@@ -56,28 +56,32 @@
       # TODO: do something with the preferredLanguage?
       context =
         email_id: sendwithus.templates.ladder_update_email
-        #recipient:
-        #  address: user.email
         recipient:
-           address: 'nick@codecombat.com'
-        days_ago: daysAgo
-        name: name
-        wins: session.numberOfWinsAndTies
-        losses: session.numberOfLosses
-        total_score: session.totalScore
-        team: session.team
-        level: id
-        defeat: defeatContext
-        victory: victoryContext
+          #address: user.email
+          address: 'nick@codecombat.com'
+          name: name
+        email_data:
+          name: name
+          days_ago: daysAgo
+          wins: session.numberOfWinsAndTies
+          losses: session.numberOfLosses
+          total_score: Math.round(session.totalScore * 100)
+          team: session.team
+          level_name: session.levelName
+          ladder_url: "http://codecombat.com/play/ladder/#{session.levelID}#my-matches"
+          defeat: defeatContext
+          victory: victoryContext
       sendwithus.api.send context, (err, result) ->
-        log.error "Error sending ladder update email:", err, 'result', result
+        log.error "Error sending ladder update email:", err, 'result', result if err

+    # Fetch the most recent defeat and victory, if there are any.
+    # (We could look at strongest/weakest, but we'd have to fetch everyone, or denormalize more.)
     defeats = _.filter session.matches, (match) -> match.metrics.rank is 1 and match.opponents[0].metrics.rank is 0
     victories = _.filter session.matches, (match) -> match.metrics.rank is 0
-    defeat = _.sample defeats
-    victory = _.sample victories
+    defeat = _.last defeats
+    victory = _.last victories
     urlForMatch = (match) ->
-      "http://codecombat.com/play/ladder/#{session.levelID}?team=#{session.team}&session=#{session._id}&opponent=#{match.opponents[0].sessionID}"
+      "http://codecombat.com/play/level/#{session.levelID}?team=#{session.team}&session=#{session._id}&opponent=#{match.opponents[0].sessionID}"

     onFetchedDefeatedOpponent = (err, defeatedOpponent) ->
       if err


Triggering show shows it when the editor is ready

remote: Support for password authentication was removed on August 13, 2021.
remote: Please see https://docs.github.com/en/get-started/getting-started-with-git/about-remote-repositories#cloning-with-https-urls for information on currently recommended modes of authentication.
fatal: Authentication failed for 'https://github.com/aki77/atomatigit.git/'


Added camera target game object

Added camera target game object

error: pathspec 'source/camera_target.coffee' did not match any file(s) known to git

--- source/camera_target.coffee
+++ source/camera_target.coffee
@@ -0,0 +1,20 @@
+CameraTarget = (I={}) ->
+  Object.reverseMerge I,
+    target: "Player.controller=0"
+    lead: 1.25
+
+  self = GameObject(I).extend
+    draw: -> # NOP
+
+  self.on "update", (canvas) ->
+    if target = engine.first(I.target)
+      targetPosition = target.position()
+      targetVelocity = target.velocity()
+
+      # Camera should lead target's position by a multiple of the targets velocity
+      position = targetPosition.add(targetVelocity.scale(I.lead))
+
+      I.x = position.x
+      I.y = position.y
+
+  return self


Add type conversions to parsed attributes.

remote: Support for password authentication was removed on August 13, 2021.
remote: Please see https://docs.github.com/en/get-started/getting-started-with-git/about-remote-repositories#cloning-with-https-urls for information on currently recommended modes of authentication.
fatal: Authentication failed for 'https://github.com/JoshuaToenyes/stout-client.git/'


Mockup for an elt-group definition recipe

error: pathspec 'src/bin/recipes/elt-group.cson' did not match any file(s) known to git

--- src/bin/recipes/elt-group.cson
+++ src/bin/recipes/elt-group.cson
@@ -0,0 +1,6 @@
+this_is_a_task:
+  this_child_task_runs_first_with_the_scripts_in_order: ['script_name','script_name']
+  this_child_task_runs_second_with_the_scripts_in_order: ['script_name','script_name']
+  this_child_task_runs_third:
+    this_grandchild_task_runs_first: ['script_name']
+    this_grandchild_task_runs_second: ['script_name','script_name']


The drop marker should disappear when drag is done.

Previously we make drop marker disappear when drop is done, it would
case the marker to live forever if the drop is not done in Atom.

--- src/packages/tabs/lib/tab-bar-view.coffee
+++ src/packages/tabs/lib/tab-bar-view.coffee
@@ -98,6 +98,8 @@

   onDragEnd: (event) =>
     @find(".is-dragging").removeClass 'is-dragging'
+    @children('.is-drop-target').removeClass 'is-drop-target'
+    @children('.drop-target-is-after').removeClass 'drop-target-is-after'

   onDragOver: (event) =>
     unless event.originalEvent.dataTransfer.getData('atom-event') is 'true'
@@ -125,8 +127,6 @@
       return

     event.stopPropagation()
-    @children('.is-drop-target').removeClass 'is-drop-target'
-    @children('.drop-target-is-after').removeClass 'drop-target-is-after'

     dataTransfer  = event.originalEvent.dataTransfer
     fromIndex     = parseInt(dataTransfer.getData('sortable-index'))


Starcraft

Starcraft

error: pathspec 'scripts/starcraft.coffee' did not match any file(s) known to git

--- scripts/starcraft.coffee
+++ scripts/starcraft.coffee
@@ -0,0 +1,9 @@
+module.exports = (robot) ->
+  robot.hear /.*wat.*/i, (msg) ->
+    msg.send "http://img24.imageshack.us/img24/4287/snapshot20080215123519.png"
+
+  robot.hear /.*win.*/i, (msg) ->
+    msg.send "http://1.bp.blogspot.com/-0KhRbSdEkuE/TymtgxJtcRI/AAAAAAAAArY/zGVzZt5dQ1w/s379/so-much-win-starcraft-reaction.gif"
+
+  robot.hear /.*(single point of failure|spof|artosis pylon).*/i, (msg) ->
+    msg.send "http://i.imgur.com/JeSct.jpg"


Register "insert" event and fix "insert:request" firing.

remote: Support for password authentication was removed on August 13, 2021.
remote: Please see https://docs.github.com/en/get-started/getting-started-with-git/about-remote-repositories#cloning-with-https-urls for information on currently recommended modes of authentication.
fatal: Authentication failed for 'https://github.com/JoshuaToenyes/stout-core.git/'


transform caps in property names

transform caps in property names

--- ccss.coffee
+++ ccss.coffee
@@ -9,6 +9,8 @@
       if typeof value is 'object'
         children["#{selector} #{key}"] = value
       else
+        #borderRadius -> border-radius
+        key = key.replace /[A-Z]/g, (s) -> '-' + s.toLowerCase()
         text += "  #{key}: #{value};\n"

     if text


Ignore specs that take less than 1ms

Ignore specs that take less than 1ms

--- spec/time-reporter.coffee
+++ spec/time-reporter.coffee
@@ -13,6 +13,8 @@
     window.logLongestSuites = (number) => @logLongestSuites(number)

   logLongestSuites: (number=10, log) ->
+    return unless window.timedSuites.length > 0
+
     log ?= (line) -> console.log(line)
     log "Longest running suites:"
     suites = _.map(window.timedSuites, (key, value) -> [value, key])
@@ -22,6 +24,8 @@
     undefined

   logLongestSpecs: (number=10, log) ->
+    return unless window.timedSpecs.length > 0
+
     log ?= (line) -> console.log(line)
     log "Longest running specs:"
     for spec in _.sortBy(window.timedSpecs, (spec) -> -spec.time)[0...number]
@@ -43,22 +47,23 @@
       else
         "#{memo}\n#{_.multiplyString('  ', index)}#{description}"
     @description = _.reduce(stack, reducer, '')
-    @time = new Date().getTime()
+    @time = Date.now()

   reportSpecResults: (spec) ->
     return unless @time? and @description?

-    duration = new Date().getTime() - @time
+    duration = Date.now() - @time

-    window.timedSpecs.push
-      description: @description
-      time: duration
-      fullName: spec.getFullName()
+    if duration > 0
+      window.timedSpecs.push
+        description: @description
+        time: duration
+        fullName: spec.getFullName()

-    if timedSuites[@suite]
-      window.timedSuites[@suite] += duration
-    else
-      window.timedSuites[@suite] = duration
+      if timedSuites[@suite]
+        window.timedSuites[@suite] += duration
+      else
+        window.timedSuites[@suite] = duration

     @time = null
     @description = null


Implement mkpath (mkdir -p)

Implement mkpath (mkdir -p)

error: pathspec 'src/tools/mkpath.coffee' did not match any file(s) known to git

--- src/tools/mkpath.coffee
+++ src/tools/mkpath.coffee
@@ -0,0 +1,10 @@
+fs = require '../sys/fs'
+
+module.exports = (path)->
+  q = []
+  while !fs.FolderExists path
+    q.push path
+    path = fs.GetParentFolderName path
+  fs.CreateFolder path while path = q.pop()
+  path
+


Fix identation in coffee template for crud controller mongoose

remote: Support for password authentication was removed on August 13, 2021.
remote: Please see https://docs.github.com/en/get-started/getting-started-with-git/about-remote-repositories#cloning-with-https-urls for information on currently recommended modes of authentication.
fatal: Authentication failed for 'https://github.com/weber/compound-ex4.git/'


Log <> log; What was I thinking?

Log <> log; What was I thinking?

remote: Support for password authentication was removed on August 13, 2021.
remote: Please see https://docs.github.com/en/get-started/getting-started-with-git/about-remote-repositories#cloning-with-https-urls for information on currently recommended modes of authentication.
fatal: Authentication failed for 'https://github.com/smurp/email-login.git/'


add enforceModality parameter. fixes #31

remote: Support for password authentication was removed on August 13, 2021.
remote: Please see https://docs.github.com/en/get-started/getting-started-with-git/about-remote-repositories#cloning-with-https-urls for information on currently recommended modes of authentication.
fatal: Authentication failed for 'https://github.com/artsyca/emberui.git/'


trying to change SFX volume

trying to change SFX volume

--- app/views/play/level/LevelPlaybackView.coffee
+++ app/views/play/level/LevelPlaybackView.coffee
@@ -339,7 +339,7 @@
         @slideCount = 0
         @wasPlaying = @playing
         Backbone.Mediator.publish 'level:set-playing', {playing: false}
-        Backbone.Mediator.publish 'audio-player:play-sound', trigger: 'playback-scrub-start', volume: 1
+        Backbone.Mediator.publish 'audio-player:play-sound', trigger: 'playback-scrub-start', volume: .01

       stop: (event, ui) =>
         return if @shouldIgnore()
@@ -351,7 +351,7 @@
           Backbone.Mediator.publish 'level:set-playing', {playing: false}
           @$el.find('.scrubber-handle').effect('bounce', {times: 2})
         else
-          Backbone.Mediator.publish 'audio-player:play-sound', trigger: 'playback-scrub-end', volume: 1
+          Backbone.Mediator.publish 'audio-player:play-sound', trigger: 'playback-scrub-end', volume: .01
     )

   getScrubRatio: ->


app/util: add util to get specific token from markdown

remote: Support for password authentication was removed on August 13, 2021.
remote: Please see https://docs.github.com/en/get-started/getting-started-with-git/about-remote-repositories#cloning-with-https-urls for information on currently recommended modes of authentication.
fatal: Authentication failed for 'https://github.com/andrewjcasal/koding.git/'


hubotに話しかけてコマンド実行するやつのテストコード

hubotに話しかけてコマンド実行するやつのテストコード

error: pathspec 'cmd.coffee' did not match any file(s) known to git

--- cmd.coffee
+++ cmd.coffee
@@ -0,0 +1,78 @@
+# Description
+#   ""
+#
+# Dependencies:
+#   "querystring": "0.1.0"
+#
+# Configuration:
+#   None
+#
+# Commands:
+#   None
+#
+#
+# Sample:
+#
+#
+# Author:
+#   Taiyu Fujii
+
+path        = "cmd"
+SendMessage = require './send_message'
+prefix      = '[cmd]'
+debug       = process.env.CMD_DEBUG
+configFile  = process.env.CMD_CONFIG
+
+
+
+send_message = (room, msg) ->
+  # console.log "room: #{room}"
+  # console.log "msg: #{message}"
+  unless room
+    console.log "#{prefix}: There is no room to say."
+
+  if ircType == "slack"
+    @sm.send ["#{room}"], "", @sm.slack_attachments("", msg)
+  else
+    @sm.send ["#{room}"], msg
+  # res.writeHead 200, {'Content-Type': 'text/plain'}
+  # res.end 'OK'
+
+exec_command = (cmd) ->
+  @exec = require('child_process').exec
+  @exec cmd, (error, stdout, stderr) ->
+    msg.send error
+    msg.send stdout
+    msg.send stderr
+
+help = () ->
+  return "cmd WORD1 WORD2"
+
+module.exports = (robot) ->
+
+  @sm = new SendMessage(robot)
+  conf = @sm.readJson configFile, prefix
+  console.log "conf: %j", conf if debug?
+
+  robot.hear /cmd (\w+) (\w+)/i, (msg) ->
+
+    console.log "1: #{msg.match[1]}, 2: #{msg.match[2]}" if debug?
+
+    for key,val of conf
+      console.log "key: #{key}"
+      switch msg.match[1]
+        when key
+          console.log "match: #{key}"
+          for key2,val2 of val
+            console.log "key2: #{key2}"
+            switch msg.match[2]
+              when key2
+                console.log "match: #{key2}"
+                msg.send val2['message']
+                exec_command val2['command']
+              else
+                msg.send help()
+
+        else
+          msg.send help()
+


Adding tests for CoffeeScript.eval

Adding tests for CoffeeScript.eval

error: pathspec 'test/eval.coffee' did not match any file(s) known to git

--- test/eval.coffee
+++ test/eval.coffee
@@ -0,0 +1,29 @@
+{Script} = require 'vm'
+
+test "CoffeeScript.eval runs in the global context by default", ->
+  global.punctuation = '!'
+  code = '''
+  global.fhqwhgads = "global superpower#{global.punctuation}"
+  '''
+  result = CoffeeScript.eval code
+  eq result, 'global superpower!'
+  eq fhqwhgads, 'global superpower!'
+
+test "CoffeeScript.eval can run in, and modify, a Script context sandbox", ->
+  sandbox = Script.createContext()
+  sandbox.foo = 'bar'
+  code = '''
+  global.foo = 'not bar!'
+  '''
+  result = CoffeeScript.eval code, {sandbox}
+  eq result, 'not bar!'
+  eq sandbox.foo, 'not bar!'
+
+test "CoffeeScript.eval can run in, but cannot modify, an ordinary object sandbox", ->
+  sandbox = {foo: 'bar'}
+  code = '''
+  global.foo = 'not bar!'
+  '''
+  result = CoffeeScript.eval code, {sandbox}
+  eq result, 'not bar!'
+  eq sandbox.foo, 'bar'


add gulp task placeholder

add gulp task placeholder

error: pathspec 'gulp/tasks/db.coffee' did not match any file(s) known to git

--- gulp/tasks/db.coffee
+++ gulp/tasks/db.coffee
@@ -0,0 +1,6 @@
+# db tasks
+
+gulp = require 'gulp'
+
+gulp.task 'db-seed', ->
+  console.log 'db seed'


Bugfix #20: Minimized preview support

Bugfix #20: Minimized preview support

remote: Support for password authentication was removed on August 13, 2021.
remote: Please see https://docs.github.com/en/get-started/getting-started-with-git/about-remote-repositories#cloning-with-https-urls for information on currently recommended modes of authentication.
fatal: Authentication failed for 'https://github.com/will-hart/marp.git/'


Removed Unnecessary Comments

Removed Unnecessary Comments

remote: Support for password authentication was removed on August 13, 2021.
remote: Please see https://docs.github.com/en/get-started/getting-started-with-git/about-remote-repositories#cloning-with-https-urls for information on currently recommended modes of authentication.
fatal: Authentication failed for 'https://github.com/iShafayet/metae.git/'


measure export search results

measure export search results

remote: Support for password authentication was removed on August 13, 2021.
remote: Please see https://docs.github.com/en/get-started/getting-started-with-git/about-remote-repositories#cloning-with-https-urls for information on currently recommended modes of authentication.
fatal: Authentication failed for 'https://github.com/kristenhazard/epm-catalog.git/'


Add example

Add example

error: pathspec 'examples/example01.coffee' did not match any file(s) known to git

--- examples/example01.coffee
+++ examples/example01.coffee
@@ -0,0 +1,68 @@
+ok = require 'assert'
+
+x :: Number = 3
+y :: String = "hello"
+z :: Boolean = false
+# k :: String = 4 #=> Error
+# # y = x #=> Error
+a :: Any = 3
+a = 'fadfa'
+b = 'a'
+fn :: Function = ->
+  x = 3
+  n = ->
+    i = ''
+
+f2 :: Function = (a :: Number) ->
+  a + 3
+
+class X
+  f: ->
+    n = 3
+
+obj :: { x :: Number, y :: Number } = { x : 3, y : 5}
+obj2 :: {
+  x :: Number
+  y :: Number
+} = { x : 3, y : 3} # should throw
+# obj2.y = "xxx" # 例外
+obj.x = 5
+# obj.x = ""
+
+f :: Number -> Number = (n :: Number) :: Number ->  n * n
+n :: Number  = f 4
+
+fh :: Function = (n :: Number) :: (Number -> Number) -> (m)-> n * m
+
+struct Point {
+  x :: Number
+  y :: Number
+}
+
+p :: Point = {x: 3, y: 3}
+
+console.log typeof a
+console.log 'finish', f n
+
+(x) -> console.log 'x'
+
+nf :: () -> () = -> setTimeout (->), 100
+nx :: () -> void = ->
+  setTimeout (->), 100
+
+
+
+nested :: Nested = {x: 3, y: {a : 1 , b : 'foo'}}
+
+struct B {
+  num :: Number
+}
+
+struct Point {
+  x :: Number
+  y :: {
+    a :: B
+    b :: String
+  }
+}
+pn :: Point = {x: 3, y: {a : {num: 4} , b : 'foo'}}


code cleanup

code cleanup


b;leeding types factory

b;leeding types factory

error: pathspec 'src/javascripts/factories/bleeding_types.coffee' did not match any file(s) known to git

--- src/javascripts/factories/bleeding_types.coffee
+++ src/javascripts/factories/bleeding_types.coffee
@@ -0,0 +1,2 @@
+angular.module("npr.app").factory "BleedingTypes", ->
+  ["H","M","L","VL","B"]


New background form working

New background form working

error: pathspec 'client/views/backgrounds/newBackground.coffee' did not match any file(s) known to git

--- client/views/backgrounds/newBackground.coffee
+++ client/views/backgrounds/newBackground.coffee
@@ -0,0 +1,9 @@
+Template.newBackground.events
+
+  'click button': (e)->
+    Backgrounds.insert
+      name: $('input[name="name"]').val()
+      description: $('textarea[name="description"]').val()
+      userId: Meteor.userId()
+      username: Meteor.user().username
+      createdAt: new Date()


starting to move over isPureStatement to Coco style jumps()

--- nodes.coffee
+++ nodes.coffee
@@ -48,7 +48,7 @@
   # Statements converted into expressions via closure-wrapping share a scope
   # object with their parent closure, to preserve the expected lexical scope.
   compileClosure: (o) ->
-    if @containsPureStatement()
+    if @jumps()
       throw SyntaxError 'cannot use a pure statement in an expression.'
     o.sharedScope = yes
     Closure.wrap(this).compileNode o
@@ -141,6 +141,7 @@

   isStatement     : NO
   isPureStatement : NO
+  jumps           : NO
   isComplex       : YES
   isChainable     : NO
   isAssignable    : NO
@@ -189,6 +190,10 @@
     for exp in @expressions when exp.isPureStatement() or exp.isStatement o
       return yes
     no
+
+  jumps: (o) ->
+    for exp in @expressions
+      return true if exp.jumps o

   # An Expressions node does not return its entire body, rather it
   # ensures that the final expression is returned.
@@ -288,6 +293,9 @@
   assigns: (name) ->
     name is @value

+  jumps: (o) ->
+    @isPureStatement() and not (o and (o.loop or o.block and (@value isnt 'continue')))
+
   compile: ->
     if @value.reserved then "\"#{@value}\"" else @value

@@ -306,6 +314,7 @@
   isStatement:     YES
   isPureStatement: YES
   makeReturn:      THIS
+  jumps:           YES

   compile: (o, level) ->
     expr = @expression?.makeReturn()
@@ -349,6 +358,7 @@

   isStatement : (o)    -> not @properties.length and @base.isStatement o
   assigns     : (name) -> not @properties.length and @base.assigns name
+  jumps       : (o)    -> not @properties.length and @base.jumps o

   isObject: (onlyGenerated) ->
     return no if @properties.length
@@ -997,6 +1007,8 @@

   isStatement: -> !!@ctor

+  jumps: NO
+
   # Compilation creates a new scope unless explicitly asked to share with the
   # outer scope. Handles splat parameters in the parameter list by peeking at
   # the JavaScript `arguments` objects. If the function is bound with the `=>`
@@ -1134,6 +1146,13 @@
   addBody: (@body) ->
     this

+  jumps: ->
+    {expressions} = @body
+    return no unless expressions.length
+    for node in expressions
+      return yes if node.jumps loop: yes
+    no
+
   containsPureStatement: ->
     {expressions} = @body
     i = expressions.length
@@ -1317,6 +1336,8 @@

   isStatement: YES

+  jumps: (o) -> @attempt.jumps(o) or @recovery?.jumps(o)
+
   makeReturn: ->
     @attempt  = @attempt .makeReturn() if @attempt
     @recovery = @recovery.makeReturn() if @recovery
@@ -1346,6 +1367,7 @@
   children: ['expression']

   isStatement: YES
+  jumps:       NO

   # A **Throw** is already a return, of sorts...
   makeReturn: THIS
@@ -1527,6 +1549,11 @@

   isStatement: YES

+  jumps: (o = {block: yes}) ->
+    for [conds, block] in @cases
+      return yes if block.jumps o
+    @otherwise?.jumps o
+
   makeReturn: ->
     pair[1].makeReturn() for pair in @cases
     @otherwise?.makeReturn()
@@ -1581,6 +1608,8 @@
   isStatement: (o) ->
     o?.level is LEVEL_TOP or
       @bodyNode().isStatement(o) or @elseBodyNode()?.isStatement(o)
+
+  jumps: (o) -> @body.jumps(o) or @elseBody?.jumps(o)

   compileNode: (o) ->
     if @isStatement o then @compileStatement o else @compileExpression o


Code review of Sync().

Code review of Sync().

--- background_scripts/settings.coffee
+++ background_scripts/settings.coffee
@@ -7,14 +7,14 @@
   get: (key) ->
     if (key of localStorage) then JSON.parse(localStorage[key]) else @defaults[key]

-  set: (key, value, doNotSync) ->
+  set: (key, value) ->
     # don't store the value if it is equal to the default, so we can change the defaults in the future
     if (value == @defaults[key])
       @clear(key)
     else
-      jsonified = JSON.stringify value
-      localStorage[key] = jsonified
-      root.Sync.set key, jsonified
+      jsonValue = JSON.stringify value
+      localStorage[key] = jsonValue
+      root.Sync.set key, jsonValue

   clear: (key) ->
     if @has key


bug fix

bug fix

remote: Support for password authentication was removed on August 13, 2021.
remote: Please see https://docs.github.com/en/get-started/getting-started-with-git/about-remote-repositories#cloning-with-https-urls for information on currently recommended modes of authentication.
fatal: Authentication failed for 'https://github.com/bubblegroup/bubblebot.git/'


Put back old file

Put back old file

error: pathspec 'app/javascript/src/legacy/similar-thumbnailing.coffee' did not match any file(s) known to git

--- app/javascript/src/legacy/similar-thumbnailing.coffee
+++ app/javascript/src/legacy/similar-thumbnailing.coffee
@@ -0,0 +1,192 @@
+# This is a shared pool to be used by all instances
+image_pool = null
+
+# file must be a Blob object.  Create and return a thumbnail of the image.
+# Perform an image search using post/similar.
+#
+# On completion, onComplete(result) will be called, where result is an object with
+# these properties:
+#
+# success: true or false.
+#
+# On failure:
+# aborted: true if failure was due to a user abort.
+# chromeFailure: If true, the image loaded but was empty.  Chrome probably ran out
+# of memory, but the selected file may be a valid image.
+#
+# On success:
+# canvas: On success, the canvas containing the thumbnailed image.
+#
+class window.ThumbnailUserImage
+  constructor: (file, onComplete) ->
+    # Create the shared image pool, if we havn't yet.
+    image_pool ?= new ImgPoolHandler
+    @file = file
+    @canvas = create_canvas_2d()
+    @image = image_pool.get()
+    @onComplete = onComplete
+    @url = URL.createObjectURL(@file)
+    @image.on 'load', @image_load_event
+    @image.on 'abort', @image_abort_event
+    @image.on 'error', @image_error_event
+    document.documentElement.addClassName 'progress'
+    @image.src = @url
+    return
+
+  # Cancel any running request.  The onComplete callback will not be called.
+  # The object must not be reused.
+  destroy: ->
+    document.documentElement.removeClassName 'progress'
+    @onComplete = null
+    @image.stopObserving()
+    image_pool.release @image
+    @image = null
+    if @url?
+      URL.revokeObjectURL @url
+      @url = null
+    return
+
+  completed: (result) ->
+    if @onComplete
+      @onComplete result
+    @destroy()
+    return
+
+  # When the image finishes loading after form_submit_event sets it, update the canvas
+  # thumbnail from it.
+  image_load_event: (e) =>
+    # Reduce the image size to thumbnail resolution.
+    width = @image.width
+    height = @image.height
+    max_width = 128
+    max_height = 128
+    ratio = undefined
+    if width > max_width
+      ratio = max_width / width
+      height *= ratio
+      width *= ratio
+    if height > max_height
+      ratio = max_height / height
+      height *= ratio
+      width *= ratio
+    width = Math.round(width)
+    height = Math.round(height)
+
+    # Set the canvas to the image size we want.
+    canvas = @canvas
+    canvas.width = width
+    canvas.height = height
+
+    # Blit the image onto the canvas.
+    ctx = canvas.getContext('2d')
+
+    # Clear the canvas, so check_image_contents can check that the data was correctly loaded.
+    ctx.clearRect 0, 0, canvas.width, canvas.height
+    ctx.drawImage @image, 0, 0, canvas.width, canvas.height
+    if !@check_image_contents()
+      @completed
+        success: false
+        chromeFailure: true
+      return
+    @completed
+      success: true
+      canvas: @canvas
+    return
+
+  # Work around a Chrome bug.  When very large images fail to load, we still get
+  # onload and the image acts like a loaded, completely transparent image, instead
+  # of firing onerror.  This makes it difficult to tell if the image actually loaded
+  # or not.  Check that the image loaded by looking at the results; reject the image
+  # if it's completely transparent.
+  check_image_contents: ->
+    ctx = @canvas.getContext('2d')
+    image = ctx.getImageData(0, 0, @canvas.width, @canvas.height)
+    data = image.data
+
+    # Iterate through the alpha components, and search for any nonzero value.
+    idx = 3
+    max_idx = image.width * image.height * 4
+    while idx < max_idx
+      if data[idx] != 0
+        return true
+      idx += 4
+    false
+
+  image_abort_event: (e) =>
+    @completed
+      success: false
+      aborted: true
+    return
+
+  # This happens on normal errors, usually because the file isn't a supported image.
+  image_error_event: (e) =>
+    @completed success: false
+    return
+
+class window.SimilarWithThumbnailing
+  constructor: (form) ->
+    @similar = null
+    @form = form
+    @force_file = null
+    form.on 'submit', @form_submit_event
+    return
+
+  form_submit_event: (e) =>
+    post_file = @form.down('#file')
+
+    # If the files attribute isn't supported, or we have no file (source upload), use regular
+    # form submission.
+    if !post_file.files? or post_file.files.length == 0
+      return
+
+    # If we failed to load the image last time due to a silent Chrome error, continue with
+    # the submission normally this time.
+    file = post_file.files[0]
+    if @force_file and @force_file == file
+      @force_file = null
+      return
+    e.stop()
+    if @similar
+      @similar.destroy()
+    @similar = new ThumbnailUserImage(file, @complete)
+    return
+
+  # Submit a post/similar request using the image currently in the canvas.
+  complete: (result) =>
+    if result.chromeFailure
+      notice 'The image failed to load; submitting normally...'
+      @force_file = @file
+
+      # Resend the submit event.  Defer it, so the notice can take effect before we
+      # navigate off the page.
+      (->
+        @form.simulate_submit()
+        return
+      ).bind(this).defer()
+      return
+    if !result.success
+      if !result.aborted
+        alert 'The file couldn\'t be loaded.'
+      return
+
+    # Grab a data URL from the canvas; this is what we'll send to the server.
+    data_url = result.canvas.toDataURL()
+
+    # Create the FormData containing the thumbnail image we're sending.
+    form_data = new FormData
+    form_data.append 'url', data_url
+    req = new (Ajax.Request)('/post/similar.json',
+      method: 'post'
+      postBody: form_data
+      contentType: null
+      onComplete: (resp) ->
+        json = resp.responseJSON
+        if !json.success
+          notice json.reason
+          return
+
+        # Redirect to the search results.
+        window.location.href = '/post/similar?search_id=' + json.search_id
+        return
+  )
+    return


pagination class

pagination class

--- public/views/pagination_view.coffee
+++ public/views/pagination_view.coffee
@@ -1,5 +1,5 @@
 class PaginationView extends Backbone.View
-
+  className: "epages-shop-pagination epages-xs"
   events:
     'click a.previous_page' : 'previous'
     'click a.next_page'     : 'next'
@@ -74,4 +74,4 @@
   change_page: ->
     $(".epages-shop-pagination ul li").removeClass("active")
     $(".epages-shop-pagination ul li:contains(#{this.page})").addClass("active")
-    if @page then @trigger "change:page"+    if @page then @trigger "change:page"


Clear rootViewStates after each benchmark

--- benchmark/benchmark-suite.coffee
+++ benchmark/benchmark-suite.coffee
@@ -15,6 +15,7 @@
   afterEach ->
     $(window).off 'beforeunload'
     window.shutdown()
+    delete atom.rootViewStates[$windowNumber]

   describe "empty-file.", ->
     benchmark "insert-delete", ->


Add a reminder script

Add a reminder script

- hubot remind me in 1 minute to open a pull request

error: pathspec 'src/scripts/remind.coffee' did not match any file(s) known to git

--- src/scripts/remind.coffee
+++ src/scripts/remind.coffee
@@ -0,0 +1,70 @@
+# Forgetful? Add reminders.
+#
+# remind me in <time> to <action>    - Set a reminder in <time> to do an <action>
+#                                      <time> is in the format 1 day, 2 hours, 5 minutes etc
+#                                      Time segments are optional, as are commas
+
+class Reminders
+  constructor: ->
+    @cache = []
+    @current_timeout = null
+
+  add: (reminder) ->
+    @cache.push reminder
+    @cache.sort (a, b) -> a.due - b.due
+    @queue()
+
+  queue: ->
+    clearTimeout @current_timeout if @current_timeout
+    if @cache.length > 0
+      now = new Date().getTime()
+      trigger = =>
+        reminder = @cache.shift()
+        reminder.msg.send reminder.msg.message.user.name + ', you asked me to remind you to ' + reminder.action
+        @queue()
+      @current_timeout = setTimeout trigger, @cache[0].due - now
+
+class Reminder
+  constructor: (@msg, @time, @action) ->
+    @time.replace(/^\s+|\s+$/g, '')
+
+    periods =
+      weeks:
+        value: 0
+        regex: "weeks?"
+      days:
+        value: 0
+        regex: "days?"
+      hours:
+        value: 0
+        regex: "hours?|hrs?"
+      minutes:
+        value: 0
+        regex: "minutes?|mins?"
+      seconds:
+        value: 0
+        regex: "seconds?|secs?"
+
+    for period of periods
+      pattern = new RegExp('^.*?([\\d\\.]+)\\s*(?:(?:' + periods[period].regex + ')).*$', 'i')
+      matches = pattern.exec(@time)
+      periods[period].value = parseInt(matches[1]) if matches
+
+    @due = new Date().getTime()
+    @due += ((periods.weeks.value * 604800) + (periods.days.value * 86400) + (periods.hours.value * 3600) + (periods.minutes.value * 60) + periods.seconds.value) * 1000
+
+  dueDate: ->
+    dueDate = new Date @due
+    dueDate.toLocaleString()
+
+module.exports = (robot) ->
+
+  reminders = new Reminders
+
+  robot.respond /remind me in ((?:(?:\d+) (?:weeks?|days?|hours?|hrs?|minutes?|mins?|seconds?|secs?)[ ,]*(?:and)? +)+)to (.*)/i, (msg) ->
+    time = msg.match[1]
+    action = msg.match[2]
+    reminder = new Reminder msg, time, action
+    reminders.add reminder
+    msg.send 'I\'ll remind you to ' + action + ' on ' + reminder.dueDate()
+


Added a pair of integration tests for AWS.EC2.

error: pathspec 'test/integration/ec2.spec.coffee' did not match any file(s) known to git

--- test/integration/ec2.spec.coffee
+++ test/integration/ec2.spec.coffee
@@ -0,0 +1,31 @@
+helpers = require('./helpers'); AWS = helpers.AWS
+
+describe 'AWS.EC2', ->
+
+  service = new AWS.EC2()
+
+  it 'should send a request with parameters', ->
+
+    # limit the list of regions returned with this filter
+    params = { RegionNames: ['us-east-1', 'us-west-1'] }
+
+    helpers.integration (-> service.describeRegions(params)), (resp) ->
+      expect(resp.error).toEqual(null)
+      expect(resp.data.Regions).toEqual([
+        { RegionName: 'us-east-1', Endpoint: 'ec2.us-east-1.amazonaws.com' },
+        { RegionName: 'us-west-1', Endpoint: 'ec2.us-west-1.amazonaws.com' },
+      ])
+
+  it 'should returns client errors', ->
+
+    params = { InstanceIds : ['i-12345678'] }
+
+    helpers.integration (-> service.describeInstances(params)), (resp) ->
+      expect(resp.data).toEqual(null)
+      expect(resp.error).toEqual(
+        code : 'InvalidInstanceID.NotFound',
+        message : "The instance ID 'i-12345678' does not exist",
+        statusCode : 400,
+        retryable : false
+      )
+


HACK: attempt 2nd CoffeeScript.compile when evaluating fails

Temporary workaround for CEF/CoffeeScript timing issue where
compiler generates invalid JavaScript.

--- src/stdlib/require.coffee
+++ src/stdlib/require.coffee
@@ -54,8 +54,31 @@
     code or= __read file
     eval("define(function(require, exports, module) { 'use strict';" + code + "})\n//@ sourceURL=" + file)
     __defines.pop()?.call()
-  coffee: (file) ->
-    exts.js(file, __coffeeCache(file))
+  coffee: (file, retry=true) ->
+    tmpPath = "/tmp/atom-compiled-scripts"
+    cacheFilePath = [tmpPath, $native.md5ForPath(file)].join("/")
+
+    if __exists(cacheFilePath)
+      compiled = __read(cacheFilePath)
+      writeToCache = false
+    else
+      {CoffeeScript} = require 'coffee-script'
+      compiled = CoffeeScript.compile(__read(file), filename: file)
+      writeToCache = true
+
+    try
+      evaluated = exts.js(file, compiled)
+      $native.write(cacheFilePath, compiled) if writeToCache
+      evaluated
+    catch e
+      if retry
+        # Attempt a second compile to work around mysterious CEF/CoffeeScript
+        # timing issue where the CoffeeScript compiler generates invalid
+        # JavaScript such as [object Object].
+        console.warn "Error evaluating #{file}. Trying again...", e.stack
+        exts.coffee(file, false)
+      else
+        throw e

 getPath = (path) ->
   path = resolve(path)
@@ -143,18 +166,6 @@
 __isFile = (path) ->
   $native.isFile path

-__coffeeCache = (filePath) ->
-  {CoffeeScript} = require 'coffee-script'
-  tmpPath = "/tmp/atom-compiled-scripts"
-  cacheFilePath = [tmpPath, $native.md5ForPath(filePath)].join("/")
-
-  if __exists(cacheFilePath)
-    __read(cacheFilePath)
-  else
-    compiled = CoffeeScript.compile(__read(filePath), filename: filePath)
-    $native.write(cacheFilePath, compiled)
-    compiled
-
 __read = (path) ->
   try
     $native.read(path)


empty adapter to handle saving and loading data from localstorage

error: pathspec 'app/adapters/application.coffee' did not match any file(s) known to git

--- app/adapters/application.coffee
+++ app/adapters/application.coffee
@@ -0,0 +1,15 @@
+ApplicationAdapter = DS.Adapter.extend
+    find: (store, type, id) ->
+
+    findAll: (store, type, sinceToken) ->
+
+    findQuery: (store, type, query) ->
+
+    createRecord: (store, type, record) ->
+        debugger
+
+    updateRecord: (store, type, record) ->
+
+    deleteRecord: (store, type, record) ->
+
+`export default ApplicationAdapter`


:new: Add first spec about event order

:new: Add first spec about event order

error: pathspec 'spec/custom-element-spec.coffee' did not match any file(s) known to git

--- spec/custom-element-spec.coffee
+++ spec/custom-element-spec.coffee
@@ -0,0 +1,24 @@
+describe 'Custom Element Base', ->
+  registerCustomElement = require('../base.min.js')
+  {getCustomElement} = require('./helper')
+
+  it 'fires the events in order', ->
+    lastRan = null
+    element = new (registerCustomElement(getCustomElement({
+      name: 'x-custom-element'
+      created: -> lastRan = 'created'
+      initialize: -> lastRan = 'initialize'
+      attached: ->
+        expect(lastRan).toBe('initialize')
+        lastRan = 'attached'
+      detached: -> lastRan = 'detached'
+      attributeChanged: -> lastRan = 'attributeChanged'
+    })))
+    expect(lastRan).toBe('created')
+    element.setAttribute('a-b', 'c')
+    expect(lastRan).toBe('attributeChanged')
+    document.body.appendChild(element)
+    expect(lastRan).toBe('attached')
+    element.remove()
+    expect(lastRan).toBe('detached')
+


Client: Activity: Tests: Created header view tests


Added a test for the projects controller.

Still a work in progress, but it covers initialisation.

error: pathspec 'test/steps/unit/projects-controller-spec.coffee' did not match any file(s) known to git

--- test/steps/unit/projects-controller-spec.coffee
+++ test/steps/unit/projects-controller-spec.coffee
@@ -0,0 +1,98 @@
+define ['angularMocks', 'projects/controllers'], (mocks) ->
+
+  describe 'ProjectCtrl', ->
+
+    mockServices = [{name: 'foo'}, {name: 'bar'}]
+    mockTemplates = []
+    mockLists = []
+    mockProjects = [
+      {
+        id: 1
+        title: 'mock project 1'
+        item_count: 3
+        contents: [{id: 2}, {id: 3}]
+        child_nodes: [
+          {
+            id: 4
+            title: 'mock project 2'
+            item_count: 1
+            contents: [{id: 5}]
+            child_nodes: []
+          }
+        ]
+      }
+      {
+        id: 6
+        title: 'mock project 3'
+        item_count: 0
+        contents: []
+        child_nodes: []
+      }
+    ]
+
+    # We mock this directly to prevent calls to the InterMine
+    # back ends.
+    mockGetEntities = -> then: (f) ->
+      f templates: mockTemplates, lists: mockLists
+
+    test = {}
+
+    beforeEach mocks.module 'steps.projects.controllers'
+
+    beforeEach  mocks.inject ($injector, $controller) ->
+      test.$httpBackend = $injector.get('$httpBackend')
+      test.$controller = $controller
+      test.$httpBackend
+          .when 'GET', '/auth/session'
+          .respond "mock-token"
+      test.$httpBackend
+          .when 'GET', '/api/v1/services'
+          .respond mockServices
+      test.$httpBackend
+          .when 'GET', '/api/v1/projects'
+          .respond mockProjects
+
+    describe 'Initial state', ->
+
+      beforeEach ->
+        test.projects = test.$controller 'ProjectsCtrl',
+          getMineUserEntities: mockGetEntities
+          Mines: {all: -> mockServices}
+        test.$httpBackend.flush()
+
+      it 'has an empty path to here', ->
+        expect(test.projects.pathToHere).toEqual []
+
+      it 'does not want to see the explorer', ->
+        expect(test.projects.showExplorer).toBe false
+
+      it 'should always have a currentProject', ->
+        expect(test.projects.currentProject).not.toBeNull()
+
+      it 'should have loaded the mines', ->
+        expect(test.projects.mines.length).toEqual 2
+        expect(m.name for m in test.projects.mines).toEqual ['foo', 'bar']
+
+      it 'should have created a synthetic crrent project', ->
+        expect(test.projects.currentProject.child_nodes.length).toEqual 2
+
+      it 'should have two projects', ->
+        expect(test.projects.allProjects.length).toEqual 2
+
+    describe 'Initial server load', ->
+
+      beforeEach ->
+        test.projects = test.$controller 'ProjectsCtrl',
+          getMineUserEntities: mockGetEntities
+
+      afterEach ->
+        test.$httpBackend.verifyNoOutstandingExpectation()
+        test.$httpBackend.verifyNoOutstandingRequest()
+
+      it 'should have made a bunch of requests to the server', ->
+        test.$httpBackend.expectGET '/auth/session'
+        test.$httpBackend.expectGET '/api/v1/services',
+          Authorization: 'Token: mock-token'
+          Accept: "application/json, text/plain, */*"
+        test.$httpBackend.flush()
+


remove trailing slash when adding/removing routes

it results in a weird behavior

--- lib/paas.coffee
+++ lib/paas.coffee
@@ -32,7 +32,7 @@
     # Add a new route that matches given app to proxy.
     _addRouteToProxy: (app, result, callback) ->
         data =
-            route: "/apps/#{app.slug}/"
+            route: "/apps/#{app.slug}"
             port: result.drone.port

         @proxyClient.post "routes/add", data, (error, response, body) ->
@@ -49,7 +49,7 @@
     # Send a uninstall request to haibu server ("clean" request).
     uninstallApp: (app, callback) ->

-        console.log "Request haibu for cleaning #{app.name}...."
+        console.log "Request haibu for cleaning #{app.name}..."
         @client.clean app.getHaibuDescriptor(), (err, result) =>
             if err
                 console.log "Error cleaning app: #{app.name}"
@@ -64,7 +64,7 @@
     # Remove from proxy the route that matches given app.
     _removeRouteFromProxy: (app, result, callback) ->
         data =
-            route: "/apps/#{app.slug}/"
+            route: "/apps/#{app.slug}"

         @proxyClient.put "routes/del", data, (error, response, body) ->
             if error


[macros] add : for transforming varargs into blocks.

_do not_ use , with varargs. always always use :.

remote: Support for password authentication was removed on August 13, 2021.
remote: Please see https://docs.github.com/en/get-started/getting-started-with-git/about-remote-repositories#cloning-with-https-urls for information on currently recommended modes of authentication.
fatal: Authentication failed for 'https://github.com/demhydraz/cafe.git/'


Add Github Issue Link Generator

Add Github Issue Link Generator

Signed-off-by: Jordan Clist <51457cc104698da1e72d7c83202e49cfa8c509af@gmail.com>

error: pathspec 'src/scripts/github-issue-link.coffee' did not match any file(s) known to git

--- src/scripts/github-issue-link.coffee
+++ src/scripts/github-issue-link.coffee
@@ -0,0 +1,24 @@
+# Github issue link looks for #nnn and links to that issue for your default repo. Eg. "Hey guys check out #273"
+# Requires vars HUBOT_GITHUB_REPO, and HUBOT_GITHUB_TOKEN to be set.
+#
+# Listens for #nnn and links to the issue for your default repo on github
+
+module.exports = (robot) ->
+  robot.hear /.*(#(\d+)).*/, (msg) ->
+    issue_number = msg.match[1].replace /#/, ""
+    if isNaN(issue_number)
+      return
+
+    bot_github_repo = process.env.HUBOT_GITHUB_REPO
+    oauth_token = process.env.HUBOT_GITHUB_TOKEN
+    issue_title = ""
+    msg.http("https://api.github.com/repos/#{bot_github_repo}/issues/" + issue_number)
+      .headers(Authorization: "token #{oauth_token}", Accept: "application/json")
+      .get() (err, res, body) ->
+
+        if err
+          return
+
+        issue_obj = JSON.parse(body)
+        issue_title = issue_obj.title
+        msg.send "Issue " + issue_number + ": " + issue_title  + "  http://github.com/" + bot_github_repo + '/issues/' + issue_number


chore (test/auth) Add more tests for updating and following ACL changes.

remote: Support for password authentication was removed on August 13, 2021.
remote: Please see https://docs.github.com/en/get-started/getting-started-with-git/about-remote-repositories#cloning-with-https-urls for information on currently recommended modes of authentication.
fatal: Authentication failed for 'https://github.com/AppGyver/supersonic.git/'


Fixed mongo test

Fixed mongo test

remote: Support for password authentication was removed on August 13, 2021.
remote: Please see https://docs.github.com/en/get-started/getting-started-with-git/about-remote-repositories#cloning-with-https-urls for information on currently recommended modes of authentication.
fatal: Authentication failed for 'https://github.com/renanhangai/servitude.git/'


Conserve whitespace in compileDone

Conserve whitespace in compileDone

remote: Support for password authentication was removed on August 13, 2021.
remote: Please see https://docs.github.com/en/get-started/getting-started-with-git/about-remote-repositories#cloning-with-https-urls for information on currently recommended modes of authentication.
fatal: Authentication failed for 'https://github.com/nathan/lemma.git/'


Removes hi test.

Removes hi test.

remote: Support for password authentication was removed on August 13, 2021.
remote: Please see https://docs.github.com/en/get-started/getting-started-with-git/about-remote-repositories#cloning-with-https-urls for information on currently recommended modes of authentication.
fatal: Authentication failed for 'https://github.com/usermindinc/hubot-jira-reporter.git/'


Button has some color and a glyphicon.

Button has some color and a glyphicon.

remote: Support for password authentication was removed on August 13, 2021.
remote: Please see https://docs.github.com/en/get-started/getting-started-with-git/about-remote-repositories#cloning-with-https-urls for information on currently recommended modes of authentication.
fatal: Authentication failed for 'https://github.com/alpire/picoCTF-web.git/'


Much cleaner. Now you can use github logins with user: option.

remote: Support for password authentication was removed on August 13, 2021.
remote: Please see https://docs.github.com/en/get-started/getting-started-with-git/about-remote-repositories#cloning-with-https-urls for information on currently recommended modes of authentication.
fatal: Authentication failed for 'https://github.com/usermindinc/hubot-github-pr-reporter.git/'


Implement custom serverside filter according to the API filters structure

error: pathspec 'lib/appBaseComponents/views/grid/CustomServersideFilter.coffee' did not match any file(s) known to git

--- lib/appBaseComponents/views/grid/CustomServersideFilter.coffee
+++ lib/appBaseComponents/views/grid/CustomServersideFilter.coffee
@@ -0,0 +1,54 @@
+Backbone = require 'backbone'
+Backgrid = require 'backgrid'
+Filter   = require 'backgrid-filter'
+
+
+CustomServerSideFilter = Backgrid.Extension.ServerSideFilter.extend
+
+  showClearButtonMaybe: () ->
+    $clearButton = @clearButton()
+    hasFilter    = @collection.hasQueryFilter @name
+    searchTerms  = this.searchBox().val()
+
+    if hasFilter or searchTerms
+      $clearButton.show()
+    else
+      $clearButton.hide()
+
+
+  search: (e) ->
+    if (e) then e.preventDefault()
+
+    query      = @query()
+    collection = @collection
+
+    collection.removeQueryFilter @name
+
+    if query then collection.addQueryFilter @name, query
+
+    # go back to the first page on search
+    if collection instanceof Backbone.PageableCollection
+      collection.getFirstPage {reset: true, fetch: true}
+    else
+      collection.fetch {reset: true}
+
+
+  clear: (e) ->
+    if (e) then e.preventDefault()
+
+    collection = @collection
+    hasFilter  = collection.hasQueryFilter @name
+
+    @clearSearchBox()
+
+    if hasFilter
+      collection.removeQueryFilter @name
+
+      # go back to the first page on clear
+      if collection instanceof Backbone.PageableCollection
+        collection.getFirstPage {reset: true, fetch: true}
+      else
+        collection.fetch {reset: true}
+
+
+module.exports = CustomServerSideFilter


Adds tests.

Adds tests.

error: pathspec 'src/test/build/ios/plist_test.coffee' did not match any file(s) known to git

--- src/test/build/ios/plist_test.coffee
+++ src/test/build/ios/plist_test.coffee
@@ -0,0 +1,14 @@
+_ = require 'lodash'
+grunt = require 'grunt'
+xmlParser = require 'xml2json'
+
+exports.phonegap =
+  'plist file should contain white status bar configuration': (test) ->
+    test.expect 2
+    appName = grunt.config.get 'phonegap.config.name'
+
+    xml = grunt.file.read "test/phonegap/platforms/ios/#{appName}/#{appName}-Info.plist"
+    plist = xmlParser.toJson xml, object: true
+    test.equal true, _.contains(plist.plist.dict.key, "UIStatusBarStyle"), "contains key UIStatusBarStyle"
+    test.equal true, _.contains(plist.plist.dict.key, "UIViewControllerBasedStatusBarAppearance"), "contains key UIViewControllerBasedStatusBarAppearance"
+    test.done()


Forgot to check this into the previous commit: basic-test-harness is the universal frontend for running all basic (non-optimized, default options) tests.

error: pathspec 'src/main/coffeescript/scxml/test/basic-test-harness.coffee' did not match any file(s) known to git

--- src/main/coffeescript/scxml/test/basic-test-harness.coffee
+++ src/main/coffeescript/scxml/test/basic-test-harness.coffee
@@ -0,0 +1,36 @@
+# Copyright (C) 2011 Jacob Beard
+# Released under GNU LGPL, read the file 'COPYING' for more information
+
+define ["scxml/setup-default-opts","scxml/json2model","scxml/test/harness","scxml/test/report2string","scxml/async-for","tests/loaders/spartan-loader-for-all-tests","logger","env!env/quit","scxml/test/simple-env"],(setupDefaultOpts,json2model,harness,report2string,asyncForEach,testTuples,logger,quit,SimpleEnv)->
+
+	runTests = ->
+
+		opts = setupDefaultOpts()
+
+		jsonTests = for testTuple in testTuples
+			model = json2model testTuple.scxmlJson
+
+
+			{
+				name : testTuple.name
+				group : testTuple.group
+				model : model
+				testScript : testTuple.testScript
+				optimizations : opts
+			}
+
+		finish = (report) ->
+			logger.info report2string report
+
+			quit report.testCount == report.testsPassed
+
+		logger.info "starting harness"
+
+		if typeof setTimeout isnt "function"
+			#we are not in an environment that abstracts out the mainloop
+			env = new SimpleEnv()
+			harness jsonTests,env.setTimeout,env.clearTimeout,finish
+			env.mainLoop()	#give control to the environment
+		else
+			harness jsonTests,this.setTimeout,this.clearTimeout,finish
+


Add javascript string interpolation open bracket

remote: Support for password authentication was removed on August 13, 2021.
remote: Please see https://docs.github.com/en/get-started/getting-started-with-git/about-remote-repositories#cloning-with-https-urls for information on currently recommended modes of authentication.
fatal: Authentication failed for 'https://github.com/jrattray13/swackets.git/'


Added basic Rect class.

Added basic Rect class.

error: pathspec 'src/math/rect.coffee' did not match any file(s) known to git


:bug:Fix null playtime bug in amount of content admin page

--- app/views/admin/AdminClassroomContentView.coffee
+++ app/views/admin/AdminClassroomContentView.coffee
@@ -44,14 +44,16 @@
           [levelPlaytimes, levelSessions] = data
           continue unless levelPlaytimes[0]
           courseID = levelPlaytimes[0].courseID
+          # console.log courseID, 'course sessions returned', levelSessions.length
           courseLevelPlaytimesMap[courseID] ?= levelPlaytimes
           courseLevelTotalPlaytimeMap[courseID] ?= {}
           for levelPlaytime in levelPlaytimes
             courseLevelTotalPlaytimeMap[courseID][levelPlaytime.levelOriginal] ?= {count: 0, total: 0}
             levelPracticeMap[levelPlaytime.levelOriginal] = true if levelPlaytime.practice
           for session in levelSessions
+            continue unless session.playtime?
             courseLevelTotalPlaytimeMap[courseID][session.level.original].count++
-            courseLevelTotalPlaytimeMap[courseID][session.level.original].total += session.playtime
+            courseLevelTotalPlaytimeMap[courseID][session.level.original].total += session.playtime ? 0
         # console.log 'courseLevelTotalPlaytimeMap', courseLevelTotalPlaytimeMap

         for courseID, totalPlaytimes of courseLevelTotalPlaytimeMap when courseID in courseIDs


Open external links in new viewport

Open external links in new viewport

(new window or tab depending on browser settings)

error: pathspec 'assets/javascripts/views/external_link.js.coffee' did not match any file(s) known to git

--- assets/javascripts/views/external_link.js.coffee
+++ assets/javascripts/views/external_link.js.coffee
@@ -0,0 +1,11 @@
+Marbles.Views.ExternalLink = class ExternalLinkView extends TentStatus.View
+  @view_name: 'external_link'
+
+  constructor: (options = {}) ->
+    super
+
+    Marbles.DOM.on @el, 'click', (e) =>
+      e.preventDefault()
+      url = Marbles.DOM.attr(@el, 'href')
+      window.open(url) if url
+


Added norwegian locale

Added norwegian locale

remote: Support for password authentication was removed on August 13, 2021.
remote: Please see https://docs.github.com/en/get-started/getting-started-with-git/about-remote-repositories#cloning-with-https-urls for information on currently recommended modes of authentication.
fatal: Authentication failed for 'https://github.com/prognostikos/uploadcare-widget.git/'


Client: Activity: Tests: Created DateMarker tests. it checks classnames and rendered date strings by given date and classname

remote: Support for password authentication was removed on August 13, 2021.
remote: Please see https://docs.github.com/en/get-started/getting-started-with-git/about-remote-repositories#cloning-with-https-urls for information on currently recommended modes of authentication.
fatal: Authentication failed for 'https://github.com/andrewjcasal/koding.git/'


prevent enter in mailbox field from deleting account

--- client/app/components/account_config_mailboxes.coffee
+++ client/app/components/account_config_mailboxes.coffee
@@ -183,6 +183,8 @@
     onKeyDown: (evt) ->
         switch evt.key
             when "Enter"
+                evt?.preventDefault()
+                evt?.stopPropagation()
                 @addMailbox()


Add pageTitle fields to forms.

Add pageTitle fields to forms.

remote: Support for password authentication was removed on August 13, 2021.
remote: Please see https://docs.github.com/en/get-started/getting-started-with-git/about-remote-repositories#cloning-with-https-urls for information on currently recommended modes of authentication.
fatal: Authentication failed for 'https://github.com/cranndarach/lifetracker.git/'


Update onEntryDeleted for upcoming tree-view changes

remote: Support for password authentication was removed on August 13, 2021.
remote: Please see https://docs.github.com/en/get-started/getting-started-with-git/about-remote-repositories#cloning-with-https-urls for information on currently recommended modes of authentication.
fatal: Authentication failed for 'https://github.com/ArronCoreSoftworks/atom-together.git/'


feat(super): Same super treatment for subgenerators

Actually takes advantage of super for subgenerators too.

remote: Support for password authentication was removed on August 13, 2021.
remote: Please see https://docs.github.com/en/get-started/getting-started-with-git/about-remote-repositories#cloning-with-https-urls for information on currently recommended modes of authentication.
fatal: Authentication failed for 'https://github.com/tuxracer/generator-generatorcs.git/'


fixed windows carriage return for users file

--- lib/auth/base.coffee
+++ lib/auth/base.coffee
@@ -35,7 +35,7 @@

   # Loading files with user details.
   loadUsers: () ->
-    lines = (fs.readFileSync @options.file, 'UTF-8').split "\n"
+    lines = ((fs.readFileSync @options.file, 'UTF-8').replace "\r\n", "\n").split "\n"

     for line in lines
       if line # If line is not empty, process it.


Initial commit

Initial commit

Transcompiles in to JavaScript. | Grunt Task: $ grunt build

error: pathspec 'core/coffee/module/version.coffee' did not match any file(s) known to git

--- core/coffee/module/version.coffee
+++ core/coffee/module/version.coffee
@@ -0,0 +1,26 @@
+###!
+# -------
+# Slappé®
+# -------
+# A smart node module to slap out conventional database system.
+# ___________________________________________________________________________
+#
+# Architecture and Code Handcrafted by Prabhat Kumar.
+# Architectuur en Code handgemaakt door Prabhat Kumar.
+# @author    : Prabhat Kumar [http://prabhatkumar.org/].
+# @copyright : Prabhat Kumar [http://prabhatkumar.org/].
+# @copyright : Sequømics Research [http://research.sequomics.com/].
+# @copyright : Sequømics Corporation [http://sequomics.com/].
+# ___________________________________________________________________________
+#
+# @date      : 21-Dec-2016
+# @license   : MIT
+# @require   : Node.js®
+# @require   : NPM
+# @build     : SEED™ — Skövde
+#              └────── A Sequømics Product — http://seed.sequomics.com/.
+# ___________________________________________________________________________
+#
+# --/The Heart of Data System/-- of "Slappé®".
+# ___________________________________________________________________________
+###


Add pane:close to atom-pane context menu (Linux)

--- menus/linux.cson
+++ menus/linux.cson
@@ -174,6 +174,7 @@
     {label: 'Split Down', command: 'pane:split-down'}
     {label: 'Split Left', command: 'pane:split-left'}
     {label: 'Split Right', command: 'pane:split-right'}
+    {label: 'Close Pane', command: 'pane:close'}
     {type: 'separator'}
   ]
   'atom-pane': [
@@ -182,5 +183,6 @@
     {label: 'Split Down', command: 'pane:split-down'}
     {label: 'Split Left', command: 'pane:split-left'}
     {label: 'Split Right', command: 'pane:split-right'}
+    {label: 'Close Pane', command: 'pane:close'}
     {type: 'separator'}
   ]


Clean log

Clean log

remote: Support for password authentication was removed on August 13, 2021.
remote: Please see https://docs.github.com/en/get-started/getting-started-with-git/about-remote-repositories#cloning-with-https-urls for information on currently recommended modes of authentication.
fatal: Authentication failed for 'https://github.com/GregDesplaces/classe-1914.git/'


Fix display of non-current months

Fix display of non-current months

remote: Support for password authentication was removed on August 13, 2021.
remote: Please see https://docs.github.com/en/get-started/getting-started-with-git/about-remote-repositories#cloning-with-https-urls for information on currently recommended modes of authentication.
fatal: Authentication failed for 'https://github.com/ESWAT/ottawa.git/'


fixing bug with merge

fixing bug with merge

remote: Support for password authentication was removed on August 13, 2021.
remote: Please see https://docs.github.com/en/get-started/getting-started-with-git/about-remote-repositories#cloning-with-https-urls for information on currently recommended modes of authentication.
fatal: Authentication failed for 'https://github.com/bubblegroup/bubblebot.git/'


Creating rds instance

Creating rds instance


install works

install works


Issues/#9 (#26)

Issues/#9 (#26)

* add notification of projects

* fix function name

* 微調整した

* merged

* remove no needed var

fix #9

remote: Support for password authentication was removed on August 13, 2021.
remote: Please see https://docs.github.com/en/get-started/getting-started-with-git/about-remote-repositories#cloning-with-https-urls for information on currently recommended modes of authentication.
fatal: Authentication failed for 'https://github.com/kutsuzawa/gitnotification.git/'


Added some logging and fixed interval usage.

remote: Support for password authentication was removed on August 13, 2021.
remote: Please see https://docs.github.com/en/get-started/getting-started-with-git/about-remote-repositories#cloning-with-https-urls for information on currently recommended modes of authentication.
fatal: Authentication failed for 'https://github.com/starschema/virtdb-error-notifier.git/'


Use some instead find

Use some instead find

remote: Support for password authentication was removed on August 13, 2021.
remote: Please see https://docs.github.com/en/get-started/getting-started-with-git/about-remote-repositories#cloning-with-https-urls for information on currently recommended modes of authentication.
fatal: Authentication failed for 'https://github.com/Morgy93/Rocket.Chat.Cordova.git/'


fix some things

fix some things

--- src/client/request.coffee
+++ src/client/request.coffee
@@ -5,11 +5,10 @@

   load_requests: () ->
     console.log @requests
-    requests = JSON.parse @requests
-    for request in requests or []
+    for request in @requests
       $('#req_list').tmpl(
-        description: request.req_description
-        state: request.req_state
+        description: @requests[request].req_description
+        state: @requests[request].req_state
       ).appendTo ".listReq"


chore (testSpecApp) Update list of hardcoded CORS headers

remote: Support for password authentication was removed on August 13, 2021.
remote: Please see https://docs.github.com/en/get-started/getting-started-with-git/about-remote-repositories#cloning-with-https-urls for information on currently recommended modes of authentication.
fatal: Authentication failed for 'https://github.com/AppGyver/supersonic.git/'


fix widget rendering when moving it to new tab

remote: Support for password authentication was removed on August 13, 2021.
remote: Please see https://docs.github.com/en/get-started/getting-started-with-git/about-remote-repositories#cloning-with-https-urls for information on currently recommended modes of authentication.
fatal: Authentication failed for 'https://github.com/leonidas/qa-dashboard.git/'


rewriting old js logic in coffeescript

rewriting old js logic in coffeescript


Update configuration

Update configuration

remote: Support for password authentication was removed on August 13, 2021.
remote: Please see https://docs.github.com/en/get-started/getting-started-with-git/about-remote-repositories#cloning-with-https-urls for information on currently recommended modes of authentication.
fatal: Authentication failed for 'https://github.com/ehmicky/myos.git/'


New codeland class

New codeland class

error: pathspec 'web/scripts/codeland.coffee' did not match any file(s) known to git

--- web/scripts/codeland.coffee
+++ web/scripts/codeland.coffee
@@ -0,0 +1,126 @@
+"use strict"
+# things assigned to root will be available outside this module
+root = exports ? this.codeland = {}
+
+
+# BACKEND Methods useful for all games
+root.getString = (key) -> localStorage.getItem key
+
+root.setString = (key,value) -> localStorage.setItem key value
+
+root.load = (key) ->
+    val = root.getString key
+    return null unless val?
+    result = jQuery.parseJSON (val)
+    return result if result?
+    throw new Error("Could not parse "+val)
+
+root.store = (key,val) ->
+    throw new Error("Value must exist") unless val ?
+    root.setString(key, jQuery.toJSON(val) )
+
+root.storeGameCompletionData = (key,data) ->
+    throw new Error("Cannot be null") unless val? && data?
+    p = root.getPlayer()
+    p.games[key] = data
+    root.store("PlayerData",p)
+
+root.getPlayer = ->
+    @currentPlayer ?= root.load("CurrentPlayer")
+    @currentPlayer ?= {
+        first : 'Jim'
+        last : 'Jam'
+        avator : 'generic'
+        games : {
+            java1a : {
+                hiscore : 20
+                stars : 1
+                passed : true
+            }
+        }
+    }
+
+
+root.getGameDescriptions = ->
+    @gameDescriptions ?= {
+        java1a : { name : 'Blurp one' , description : 'Blurpy Java1a is great' }
+        java3a : { name : 'Blurp three' , description : 'Blurpy Java3a is cool' , depends : [ 'java2a'] }
+        java2a : { name : 'Blurp two' , description : 'Blurpy Java2a is fantastic' , depends : [ 'java1a'] }
+    }
+
+root.getGameSequence = ->
+    return @gameSequence if @gameSequence
+    @gameSequence = []
+    games = root.getGameDescriptions()
+    addGame = (name) =>
+        return if $.inArray(name, @gameSequence)!=-1
+        doFirst = games[name].depends ?= []
+        addGame g for g in doFirst
+        @gameSequence.push name
+        return
+    addGame(g) for g,ignore of games
+    return @gameSequence
+
+
+root.canPlay = (game) ->
+
+    player = root.getPlayer()
+    #If already completed then no need to check dependencies
+    return true if player?.games[game]?.passed
+
+    depends = root.getGameDescriptions()[game]?.depends
+    return true unless depends
+    passCount = 0
+    # Count number of dependencies that have completed
+    #( (g)-> passCount++ if player?.games[g]?.passed )(g) for g in depends
+
+    passCount++ for g in depends when player?.games[g]?.passed
+    return passCount == depends.length
+
+
+ # FRONTEND UI
+root.drawGameMap = ->
+    mapDiv = $('#mapdiv')
+    gameSequence = root.getGameSequence()
+    player = root.getPlayer()
+    descriptions = root.getGameDescriptions()
+
+    addGameToMap = (game) ->
+        #!! Assumes name,description do not contain html
+        entry=$("
#{descriptions[game].name},#{descriptions[game].description}
")
+        info = player.games[game]
+        if info
+            entry.append(info.hiscore) if  info.hiscore
+            entry.append(" Passed! ") if  info.passed
+            entry.append("Stars = #{info.stars}")  if info.stars
+        entry.click( ->alert("You clicked #{game}") ) if root.canPlay game
+        entry.appendTo(mapDiv)
+
+    mapDiv.empty()
+    addGameToMap game for game in gameSequence
+    #TODO FADE IN
+    return
+
+root.startGame = (game) ->
+    console.log("Starting #{game}")
+    @currentGame.finishGame() if @currentGame
+
+    gamediv = $('#gamediv')
+    gamediv.empty()
+    #Todo FADE IN
+
+    gameconfig = {}
+    env = {
+        key: game
+        description : root.getGameDescriptions()[game]
+        gamediv : gameDiv
+        player : root.getPlayer()
+        codeland : this
+        config : gameconfig
+    }
+
+    managerString  = gameDescription.manager ?= 'GameManager'
+
+    @currentGame = new this[managerString](env)
+
+    @currentGame.startGame()


Fix insertData helper function

Fix insertData helper function

remote: Support for password authentication was removed on August 13, 2021.
remote: Please see https://docs.github.com/en/get-started/getting-started-with-git/about-remote-repositories#cloning-with-https-urls for information on currently recommended modes of authentication.
fatal: Authentication failed for 'https://github.com/Arm1stice/prosu.git/'


[fix] 'number' checking for NaN in settings

remote: Support for password authentication was removed on August 13, 2021.
remote: Please see https://docs.github.com/en/get-started/getting-started-with-git/about-remote-repositories#cloning-with-https-urls for information on currently recommended modes of authentication.
fatal: Authentication failed for 'https://github.com/Mikuia/Mikuia.git/'


Implement milestones controller

Implement milestones controller

error: pathspec 'app/controllers/milestones.coffee' did not match any file(s) known to git

--- app/controllers/milestones.coffee
+++ app/controllers/milestones.coffee
@@ -0,0 +1,72 @@
+module.exports = (app) ->
+  new: (req, res) ->
+    app.models.project
+    .findOneById(req.query.project)
+    .exec (err, project) ->
+      if err || !project
+        next err
+      else
+        res.render 'milestones/new', project: project
+
+  create: (req, res, next) ->
+    app.models.milestone
+    .create
+        name: req.body.name
+        complete: req.body.complete if req.body.complete?
+        number: req.body.number if req.body.number?
+        project: req.body.project
+    .exec (err, milestone) ->
+      if err || !milestone
+        next err
+      else
+        req.flash 'success', "Milestone #{milestone.name} was created"
+        res.redirect "/milestones/#{milestone.id}"
+
+  show: (req, res, next) ->
+    app.models.milestone
+    .findOneById(req.params.id)
+    .populate('project')
+    .populate('notes', sort: 'updatedAt desc')
+    .exec (err, milestone) ->
+      if err || !milestone
+        next err
+      else
+        res.render 'milestones/show', milestone: milestone
+
+  edit: (req, res, next) ->
+    app.models.milestone
+    .findOneById(req.params.id)
+    .populate('project')
+    .exec (err, milestone) ->
+      if err || !milestone
+        next err
+      else
+        res.render 'milestones/edit', milestone: milestone
+
+  update: (req, res, next) ->
+    app.models.milestone
+    .findOneById(req.params.id)
+    .exec (err, milestone) ->
+      if err || !milestone
+        next err
+      else
+        milestone.name = req.body.name if req.body.name?
+        milestone.complete = req.body.complete if req.body.complete?
+        milestone.number = req.body.number if req.body.number?
+
+        milestone.save (err, milestone) ->
+          if err ||!milestone
+            next err
+          else
+            req.flash 'success', "Milestone #{milestone.name} was updated"
+            res.redirect "/milestones/#{milestone.id}"
+
+  destroy: (req, res, next) ->
+    app.models.milestone
+    .destroy(req.params.id)
+    .exec (err, milestones) ->
+      if err || !milestones
+        next err
+      else
+        req.flash 'success', "Milestone #{milestones[0].name} was deleted"
+        res.redirect "/projects/#{milestones[0].project}"


Last commit

Last commit

remote: Support for password authentication was removed on August 13, 2021.
remote: Please see https://docs.github.com/en/get-started/getting-started-with-git/about-remote-repositories#cloning-with-https-urls for information on currently recommended modes of authentication.
fatal: Authentication failed for 'https://github.com/RedStarZOn/hero2D.git/'


Improve JS error tracking

Improve JS error tracking

--- assets/javascripts/app/app.coffee
+++ assets/javascripts/app/app.coffee
@@ -52,7 +52,9 @@
         Raven.config @config.sentry_dsn,
           whitelistUrls: [/devdocs/]
           includePaths: [/devdocs/]
-          ignoreErrors: [/dpQuery/]
+          ignoreErrors: [/dpQuery/, /NPObject/]
+          tags:
+            singleDoc: (!!@DOC).toString()
         .install()
       @previousErrorHandler = onerror
       window.onerror = @onWindowError.bind(@)


failing test case for combineAsArray.delay within dispatch loop

--- spec/BaconSpec.coffee
+++ spec/BaconSpec.coffee
@@ -962,6 +962,15 @@
          Bacon.later(1,'x').takeUntil(Bacon.later(20).onUnsub(->
            expect(sc.now()).to.equal(startTick + 1)))
        ['x'])
+  ### TODO does not pass
+  describe "works with synchronous self-derived sources", ->
+    expectStreamEvents(
+      ->
+        a = Bacon.fromArray [1,2]
+        b = a.filter((x) -> x >= 2)
+        a.takeUntil b
+      [1])
+  ###
   it "toString", ->
     expect(Bacon.later(1, "a").takeUntil(Bacon.later(2, "b")).toString()).to.equal("Bacon.later(1,a).takeUntil(Bacon.later(2,b))")

@@ -1611,9 +1620,49 @@
       result = null
       Bacon.once(1).onValue ->
         a = Bacon.constant("lolbal")
-        result = Bacon.combineAsArray([a, a]).map("right").startWith("wrong");
-        result.onValue((x) -> result = x)
+        s = Bacon.combineAsArray([a, a]).map("right").startWith("wrong");
+        s.onValue((x) -> result = x)
       expect(result).to.equal("right")
+    it "stream.startWith", ->
+      result = null
+      Bacon.once(1).onValue ->
+        s = Bacon.later(1).startWith(0)
+        s.onValue((x) -> result = x)
+      expect(result).to.equal(0)
+    it "combineAsArray.changes.startWith", ->
+      result = null
+      Bacon.once(1).onValue ->
+        a = Bacon.constant("lolbal")
+        s = Bacon.combineAsArray([a, a]).changes().startWith("right")
+        s.onValue((x) -> result = x)
+      expect(result).to.equal("right")
+    it "flatMap", ->
+      result = null
+      Bacon.once(1).onValue ->
+        a = Bacon.constant("lolbal")
+        s = a.flatMap((x) -> Bacon.once(x))
+        s.onValue((x) -> result = x)
+      expect(result).to.equal("lolbal")
+    it "awaiting", ->
+      result = null
+      Bacon.once(1).onValue ->
+        a = Bacon.constant(1)
+        s = a.awaiting(a.map(->))
+        s.onValue((x) -> result = x)
+      expect(result).to.equal(false)
+    it "concat", ->
+      result = []
+      Bacon.once(1).onValue ->
+        s = Bacon.once(1).concat(Bacon.once(2))
+        s.onValue((x) -> result.push(x))
+      expect(result).to.deep.equal([1,2])
+    it "Property.delay", ->
+      result = []
+      Bacon.once(1).onValue ->
+        c = Bacon.constant(1)
+        s = Bacon.combineAsArray([c, c]).delay(1).map(".0")
+        s.onValue((x) -> result.push(x))
+      expect(result).to.deep.equal([1])

 describe "Bacon.combineAsArray", ->
   describe "initial value", ->


coffee for main

coffee for main

error: pathspec 'src/main.coffee' did not match any file(s) known to git

--- src/main.coffee
+++ src/main.coffee
@@ -0,0 +1,76 @@
+# Set the require.js configuration for your application.
+require.config
+
+  # Initialize the application with the main application file
+  deps: ["main"]
+  baseUrl: "assets"
+  defnine:
+    underscore: "lib/underscore"
+
+  paths:
+
+    # Directories
+    tpl: "../templates"
+    lib: "lib/"
+
+    # Location of the text plugin
+    text: "lib/text/text"
+
+    # Libraries
+    jquery: "http://cdnjs.cloudflare.com/ajax/libs/jquery/1.11.0/jquery"
+    underscore: "lib/underscore/underscore.1.6.0.min"
+    backbone: "lib/backbone/backbone"
+    bootstrap: "lib/bootstrap/bootstrap.min"
+    backbonePageable: "lib/backbone/backbone-pageable/lib/backbone-pageable.min" #will be relpaced by backbone-paginator soon
+    backgrid: "lib/backgrid/0.3.5/lib/backgrid.min"
+    backgridPaginator: "lib/backgrid/0.3.5/backgrid-paginator/backgrid-paginator.min"
+    app: "../src/app"
+
+
+  # Sets the configuration for your third party scripts that are not AMD compatible
+  shim:
+    backbone:
+      deps: [
+        "underscore"
+        "jquery"
+      ]
+      exports: "Backbone" #attaches "Backbone" to the window object
+
+    backgrid:
+      deps: [
+        "jquery"
+        "backbone"
+      ]
+      exports: "Backgrid"
+
+    backgridPaginator:
+      deps: [
+        "jquery"
+        "backbone"
+        "backgrid"
+      ]
+      exports: "BackgridPaginator"
+
+    bootstrap: ["jquery"]
+    "jquery.datatables": ["jquery"]
+    "jquery.datatables_bootstrap_3": [
+      "jquery"
+      "bootstrap"
+    ]
+
+# end Shim Configuration
+
+# App
+require ["app"], ->
+
+
+#this loads app.js, and therefore kicks off the whole shebang!
+
+#require([
+#
+#  // Load our app module and pass it to our definition function
+#  'app',
+#], function(App){
+#  // The "app" dependency is passed in as "App"
+#  App.initialize();
+#});


minor beautification

minor beautification

remote: Support for password authentication was removed on August 13, 2021.
remote: Please see https://docs.github.com/en/get-started/getting-started-with-git/about-remote-repositories#cloning-with-https-urls for information on currently recommended modes of authentication.
fatal: Authentication failed for 'https://github.com/szdavid92/angular-collection-json.git/'