Removed debugging

Removed debugging

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/rwky/rwky.net.git/'


test bin config

test bin config

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

--- test/mm-config.coffee
+++ test/mm-config.coffee
@@ -0,0 +1,4 @@
+module.exports =
+  db:
+    require('./common').config
+  directory: "created-migrations"


Update test

Update 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/freyproject/frey.git/'


Set simulateRemoreResponse to false

Set simulateRemoreResponse to false

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/netguru/review.git/'


Added udefine configuration

Added udefine configuration

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

--- udefine/config.coffee
+++ udefine/config.coffee
@@ -0,0 +1,3 @@
+do (root = @) ->
+  root.udefine.globals['requestanimationframe'] = root.requestAnimationFrame
+  root.udefine.globals['cancelanimationframe'] = root.cancelAnimationFrame


Add ConsoleDrain to default logger created by HasLogger.

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/'


Fixed mongo not closing its connection

Fixed mongo not closing its connection

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/'


Handle not having a secret when posting.

--- scripts/ayp.coffee
+++ scripts/ayp.coffee
@@ -451,6 +451,7 @@
   # Post a strip to the AYP site
   # Invokes the callback as `cb(err, url)`
   post: (cb=(->)) =>
+    return cb(new Error("No AYP_SECRET")) unless AYP_SECRET
     perform = =>
       HTTP.create(AYP_ENDPOINT).
         header('Content-Type', 'application/json').


Added scalr.coffee to interface with Scalr APIs

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

--- src/scripts/scalr.coffee
+++ src/scripts/scalr.coffee
@@ -0,0 +1,74 @@
+# Description:
+#   An interface with the Scalr API's, namely for executing a deploy and a cache flush script
+#
+# Dependencies:
+#   None
+#
+# Configuration:
+#   SCALR_API_KEY = Scalr API key
+#   SCALR_SECRET_KEY = Scalr secret key
+#   SCALR_FARM_NAME = Scalr Farm name
+#   SCALR_ROLE_NAME = Scalr role to execute the scripts on
+#   SCALR_DEPLOY_SCRIPT = Name of the Deploy script.
+#   SCALR_FLUSH_CACHE_SCRIPT = Name of the Cache Flush script.
+#
+# Commands:
+#   hubot deploy - executes the deploy script, defined via ENV Var "SCALR_DEPLOY_SCRIPT"
+#   hubot flush [the ]cache - executes the cache flush script, defined via ENV Var "SCALR_FLUSH_CACHE_SCRIPT"
+#
+# Author:
+#   twitter.com/linc_sanders
+#   github.com/lincsanders
+
+success_message = [
+  'The script train has left the station.',
+  'Script being executed as we speak.',
+  'The eagle has left the nest.',
+  'Hold your breath, scripts are running.',
+  'Victory!',
+]
+
+scalr_script_executer = "https://execute-scalr-script.phpfogapp.com/"
+
+config_check = ->
+  failure = (
+    !process.env.SCALR_API_KEY ||
+    !process.env.SCALR_SECRET_KEY ||
+    !process.env.SCALR_FARM_NAME ||
+    !process.env.SCALR_ROLE_NAME ||
+    !process.env.SCALR_DEPLOY_SCRIPT ||
+    !process.env.SCALR_FLUSH_CACHE_SCRIPT
+  )
+  if failure
+    msg.send "I don't think you have configured your ENV vars right... Sort it out, man."
+  failure
+
+run_script = (script_name, msg) ->
+  msg.http(scalr_script_executer)
+    .query({
+      api_key: process.env.SCALR_API_KEY,
+      secret_key: process.env.SCALR_SECRET_KEY,
+      farm_name: process.env.SCALR_FARM_NAME,
+      role_name: process.env.SCALR_ROLE_NAME,
+      script_name: script_name,
+    })
+    .post() (err, res, body) ->
+      response = JSON.parse(body)
+      msg.send response.result ? msg.random success_message : "I couldn't get a positive response from #{scalr_script_executer}... SOMETHING IS NOT RIGHT ON THAT END."
+
+
+module.exports = (robot) ->
+
+  robot.respond /flush (the |)cache/i, (msg) ->
+    if !config_check
+      return
+
+    msg.send "Cache flush initialized..."
+    run_script process.env.SCALR_FLUSH_CACHE_SCRIPT, msg
+
+  robot.respond /deploy/i, (msg) ->
+    if !config_check
+      return
+
+    msg.send "Deploy initialized..."
+    run_script process.env.SCALR_DEPLOY_SCRIPT, msg


code reduction on asset check

code reduction on asset check

--- lib/assets/javascripts/turbolinks.js.coffee
+++ lib/assets/javascripts/turbolinks.js.coffee
@@ -94,27 +94,19 @@
   window.scrollTo 0, 0

 extractAssetsFrom = (doc) ->
-  headAssets = []
-  for script in document.head.getElementsByTagName 'script'
-    headAssets.push script.src if script.src
-  for link in document.head.getElementsByTagName 'link'
-    headAssets.push link.href if link.href
-  headAssets
+  (node.src || node.href) for node in document.head.childNodes when node.src or node.href

 assetsChanged = (doc)->
-  headAssets = extractAssetsFrom doc
-  if assets.length == headAssets.length
-    for asset in assets
-      unless asset in headAssets
-        document.location.reload()
-        return true
-  false
+  intersection(extractAssetsFrom(doc), assets).length != assets.length
+
+intersection = (a, b) ->
+  [a, b] = [b, a] if a.length > b.length
+  value for value in a when value in b

 triggerEvent = (name) ->
   event = document.createEvent 'Events'
   event.initEvent name, true, true
   document.dispatchEvent event
-

 extractTitleAndBody = (doc) ->
   title = doc.querySelector 'title'
@@ -149,7 +141,6 @@
   unless event.defaultPrevented
     link = extractLink event
     if link.nodeName is 'A' and !ignoreClick(event, link)
-      link = extractLink event
       visit link.href
       event.preventDefault()


Combine two functions to make code less verbose

--- lib/assets/javascripts/turbolinks.js.coffee
+++ lib/assets/javascripts/turbolinks.js.coffee
@@ -221,10 +221,8 @@
 rememberReferer = ->
   referer = document.location.href

-rememberCurrentUrl = ->
+rememberCurrentUrlAndState = ->
   window.history.replaceState { turbolinks: true, url: document.location.href }, '', document.location.href
-
-rememberCurrentState = ->
   currentState = window.history.state

 # Unlike other browsers, Firefox doesn't trigger hashchange after changing the
@@ -592,18 +590,11 @@
       visit event.target.location.href

 initializeTurbolinks = ->
-  rememberCurrentUrl()
-  rememberCurrentState()
-
+  rememberCurrentUrlAndState()
   ProgressBar.enable()

   document.addEventListener 'click', Click.installHandlerLast, true
-
-  window.addEventListener 'hashchange', (event) ->
-    rememberCurrentUrl()
-    rememberCurrentState()
-  , false
-
+  window.addEventListener 'hashchange', rememberCurrentUrlAndState, false
   window.addEventListener 'popstate', onHistoryChange, false

 browserSupportsPushState = window.history and 'pushState' of window.history


Client: Sidebar: Created ActiveLeavingSharedMachineIdStore

error: pathspec 'client/app/lib/flux/environment/stores/activeleavingsharedmachineidstore.coffee' did not match any file(s) known to git

--- client/app/lib/flux/environment/stores/activeleavingsharedmachineidstore.coffee
+++ client/app/lib/flux/environment/stores/activeleavingsharedmachineidstore.coffee
@@ -0,0 +1,22 @@
+KodingFluxStore      = require 'app/flux/base/store'
+toImmutable          = require 'app/util/toImmutable'
+immutable            = require 'immutable'
+actions              = require '../actiontypes'
+
+module.exports = class ActiveLeavingSharedMachineIdStore extends KodingFluxStore
+
+  @getterPath = 'ActiveLeavingSharedMachineIdStore'
+
+  getInitialState: -> null
+
+  initialize: ->
+
+    @on actions.SET_ACTIVE_LEAVING_SHARED_MACHINE_ID, @setMachineId
+
+
+  setMachineId: (activeWidgetId, { id }) ->
+
+    return null  if activeWidgetId is id
+    return id
+
+


Clear highlighted hours when changing months in the calendar

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/evercam/evercam-dashboard.git/'


Cloud recording widget interface (#1457)

* Fixed issues in recording tab interface.

* Removed the extra space and !important.

* Removed extra lines of code.

* Specify code for ios devices

* Added some ios code for fixing the alignment of the recording widget.

* Line indented with 2 space instead of 4

* Set the line length to maximum 80 characters

* Set the Recording snapshot width equals to windows width if below than 480px


More tests

More tests

--- spec/simrou.coffee
+++ spec/simrou.coffee
@@ -54,6 +54,14 @@

         beforeEach ->
             router = new Simrou()
+
+        it 'can also be used to attach a single route', ->
+            route = router.addRoutes('foo')
+            expect(route).toEqual(router.addRoute('foo'))
+
+        it 'can also be used to attach a single case-insensitive route', ->
+            route = router.addRoutes('foo', false)
+            expect(route.caseSensitive).toBeFalsy()

         it 'invokes a function in the context of the router', ->
             spy = jasmine.createSpy('fn').andCallFake ->
@@ -77,17 +85,64 @@
             router.addRoutes(spy, true)
             expect(spy).toHaveBeenCalledWith(true)

+        it 'attaches all routes from a plain object and returns an object containing the Route instances', ->
+            result = router.addRoutes
+                foo: ->
+                bar: ->
+
+            expect($.isPlainObject(result)).toBeTruthy()
+            expect(typeof route).toBe('object') for pattern, route in result
+
+        it 'can attach case-insensitive routes from a plain object', ->
+            routes =
+                foo: ->
+                bar: ->
+            result = router.addRoutes(routes, false)
+
+            expect(result.foo.caseSensitive).toBeFalsy()
+
         it 'attaches all routes from an array and returns an array of Route instances', ->
             result = router.addRoutes(['foo', 'bar'])
             expect(result instanceof Array).toBeTruthy()
             expect(result.length).toBe(2)
             expect(typeof route).toBe('object') for route in result
+
+        it 'allows arrays to again contain arrays', ->
+            arr = ['bar', 'baz']
+            result = router.addRoutes(['foo', arr])

-        it 'can attaches case-insensitive routes from an array', ->
+            expect(result.length).toBe(2)
+            expect(result[1]).toEqual(router.addRoutes(arr))
+
+        it 'allows arrays to contain functions', ->
+            spy = jasmine.createSpy('fn').andReturn('bar')
+            result = router.addRoutes(['foo', spy])
+
+            expect(spy).toHaveBeenCalled()
+
+        it 'allows arrays to contain objects', ->
+            obj =
+                bar: ->
+            result = router.addRoutes(['foo', obj])
+
+            expect(result.length).toBe(2)
+            #expect(result[1]).toEqual(router.addRoutes(obj)) # does not work, seems to be a bug in jasmine
+
+        it 'can attach case-insensitive routes from an array', ->
             result = router.addRoutes(['bar', 'foo'], false)
             expect(route.caseSensitive).toBeFalsy() for route in result

+
+    describe 'resolve()', ->
+        router = null

-        # Array
-        # Object
-        # String+        beforeEach ->
+            router = new Simrou()
+
+        it 'invokes the "any" action handler of a registered route', ->
+            spy = jasmine.createSpy('actionHandler')
+            route = router.addRoute('foo')
+            route.any(spy)
+
+            router.resolve('foo')
+            expect(spy).toHaveBeenCalled()


Missing href

Missing href

--- resources/assets/coffee/react/contest/entry/user-entry.coffee
+++ resources/assets/coffee/react/contest/entry/user-entry.coffee
@@ -44,7 +44,7 @@

   render: ->
     div className: 'contest__user-entry contest__user-entry--ok',
-      a className: 'btn-osu btn-osu--textlike btn-osu--stick-right', 'data-confirm': osu.trans('common.confirmation'), title: osu.trans('common.buttons.delete'), onClick: @nuke,
+      a className: 'btn-osu btn-osu--textlike btn-osu--stick-right', href: '#', 'data-confirm': osu.trans('common.confirmation'), title: osu.trans('common.buttons.delete'), onClick: @nuke,
         i className: 'fa fa-times'
       div className: 'contest__user-entry-filename', @props.entry.filename
       div className: 'contest__user-entry-date', dangerouslySetInnerHTML: {__html: osu.timeago(@props.entry.created_at)}


class-provider - Also replace the slashes when autocompleting use statements, fixes #54.

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/Adirelle/atom-autocomplete-php.git/'


show storage

show storage

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

--- src/hubot/scripts/storage.coffee
+++ src/hubot/scripts/storage.coffee
@@ -0,0 +1,22 @@
+# Inspect the data in redis easily
+#
+# show users - Display all users that hubot knows about
+# show storage - Display the contents that are persisted in redis
+#
+
+Sys = require "sys"
+
+module.exports = (robot) ->
+  robot.respond /show storage$/i, (msg) ->
+    output = Sys.inspect(robot.brain.data, false, 4)
+    msg.send output
+
+  robot.respond /show users$/i, (msg) ->
+    response = ""
+
+    for own key, user of robot.brain.data.users
+      response += "#{user.id} #{user.name}"
+      response += " <#{user.email_address}>" if user.email_address
+      response += "\n"
+
+    msg.send response


Fix PlayGameDevLevelView to run in course mode

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/VilkkuV/codecombat.git/'


Tweak no result copy

Tweak no result copy

--- assets/javascripts/templates/sidebar_tmpl.coffee
+++ assets/javascripts/templates/sidebar_tmpl.coffee
@@ -18,8 +18,8 @@
   """#{$.escape entry.name}"""

 templates.sidebarNoResults = ->
-  info = if app.isSingleDoc() or app.disabledDocs.isEmpty() then '' else """
-    Note: documentations must be enabled before they appear in the search.
+  info = if app.isSingleDoc() or !app.disabledDocs.isEmpty() then '' else """
+    Note: documentations must be enabled to appear in the search.
   """
   """
No results. #{info}
 """


fix reactjs view.key

fix reactjs view.key

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/stevelacy/quare.git/'


Start refactoring the presenter to accommodate LinesYardstick

--- src/text-editor-presenter.coffee
+++ src/text-editor-presenter.coffee
@@ -88,7 +88,7 @@
     @updateHiddenInputState() if @shouldUpdateHiddenInputState
     @updateContentState() if @shouldUpdateContentState
     @updateDecorations() if @shouldUpdateDecorations
-    @updateTilesState() if @shouldUpdateLinesState or @shouldUpdateLineNumbersState
+    @updateVisibleTilesState() if @shouldUpdateLinesState or @shouldUpdateLineNumbersState
     @updateCursorsState() if @shouldUpdateCursorsState
     @updateOverlaysState() if @shouldUpdateOverlaysState
     @updateLineNumberGutterState() if @shouldUpdateLineNumberGutterState
@@ -340,38 +340,50 @@
       @tileForRow(@model.getScreenLineCount()), @tileForRow(@endRow)
     )

-  getTilesCount: ->
-    Math.ceil(
-      (@getEndTileRow() - @getStartTileRow() + 1) / @tileSize
-    )
-
-  updateTilesState: ->
+  updateVisibleTilesState: ->
     return unless @startRow? and @endRow? and @lineHeight?

+    @updateTilesState([@startRow..@endRow])
+
+  updateTilesState: (screenRows) ->
     visibleTiles = {}
-    zIndex = @getTilesCount() - 1
-    for startRow in [@getStartTileRow()..@getEndTileRow()] by @tileSize
-      endRow = Math.min(@model.getScreenLineCount(), startRow + @tileSize)
-
-      tile = @state.content.tiles[startRow] ?= {}
-      tile.top = startRow * @lineHeight - @scrollTop
+
+    startRow = screenRows[0]
+    endRow = screenRows[screenRows.length - 1]
+    screenRowIndex = screenRows.length - 1
+    zIndex = 0
+
+    for tileStartRow in [@tileForRow(endRow)..@tileForRow(startRow)] by -@tileSize
+      tileEndRow = Math.min(@model.getScreenLineCount(), tileStartRow + @tileSize)
+      rowsWithinTile = []
+
+      while screenRowIndex >= 0
+        currentScreenRow = screenRows[screenRowIndex]
+        break if currentScreenRow < tileStartRow
+        rowsWithinTile.push(currentScreenRow)
+        screenRowIndex--
+
+      continue if rowsWithinTile.length is 0
+
+      tile = @state.content.tiles[tileStartRow] ?= {}
+      tile.top = tileStartRow * @lineHeight - @scrollTop
       tile.left = -@scrollLeft
       tile.height = @tileSize * @lineHeight
       tile.display = "block"
       tile.zIndex = zIndex
       tile.highlights ?= {}

-      gutterTile = @lineNumberGutter.tiles[startRow] ?= {}
-      gutterTile.top = startRow * @lineHeight - @scrollTop
+      gutterTile = @lineNumberGutter.tiles[tileStartRow] ?= {}
+      gutterTile.top = tileStartRow * @lineHeight - @scrollTop
       gutterTile.height = @tileSize * @lineHeight
       gutterTile.display = "block"
       gutterTile.zIndex = zIndex

-      @updateLinesState(tile, startRow, endRow) if @shouldUpdateLinesState
-      @updateLineNumbersState(gutterTile, startRow, endRow) if @shouldUpdateLineNumbersState
-
-      visibleTiles[startRow] = true
-      zIndex--
+      @updateLinesState(tile, tileStartRow, tileEndRow) if @shouldUpdateLinesState
+      @updateLineNumbersState(gutterTile, tileStartRow, tileEndRow) if @shouldUpdateLineNumbersState
+
+      visibleTiles[tileStartRow] = true
+      zIndex++

     if @mouseWheelScreenRow? and @model.tokenizedLineForScreenRow(@mouseWheelScreenRow)?
       mouseWheelTile = @tileForRow(@mouseWheelScreenRow)


Remove logs

Remove logs

--- src/text-editor-presenter.coffee
+++ src/text-editor-presenter.coffee
@@ -1477,7 +1477,6 @@

     {screenRange, options} = @pendingScrollLogicalPosition

-    # console.log screenRange.start.toString()
     {top, left} = @pixelRectForScreenRange(new Range(screenRange.start, screenRange.start))
     {top: endTop, left: endLeft, height: endHeight} = @pixelRectForScreenRange(new Range(screenRange.end, screenRange.end))
     bottom = endTop + endHeight
@@ -1487,13 +1486,6 @@
     right += @scrollLeft
     top += @scrollTop
     bottom += @scrollTop
-
-    if global.enableLogs
-      console.log "====== presenter ======"
-      console.log "Client Height: #{@getClientHeight()}"
-      console.log "#{top}/#{bottom}"
-      console.log "#{@getScrollTop()}/#{@getScrollBottom()}"
-      console.log "======================="

     if options?.reversed ? true
       if bottom > @getScrollBottom()


Component for array.slice

Component for array.slice

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

--- src/components/SliceArray.coffee
+++ src/components/SliceArray.coffee
@@ -0,0 +1,38 @@
+noflo = require "noflo"
+
+class SliceArray extends noflo.Component
+    constructor: ->
+        @begin = 0
+        @end = null
+
+        @inPorts =
+            in: new noflo.Port()
+            begin: new noflo.Port()
+            end: new noflo.Port()
+        @outPorts =
+            out: new noflo.Port()
+
+        @inPorts.begin.on "data", (data) =>
+            @begin = data
+        @inPorts.end.on "data", (data) =>
+            @end = data
+
+        @inPorts.in.on "begingroup", (group) =>
+            @outPorts.out.beginGroup group
+        @inPorts.in.on "data", (data) =>
+            @sliceData data
+        @inPorts.in.on "endgroup", =>
+            @outPorts.out.endGroup()
+        @inPorts.in.on "disconnect", =>
+            @outPorts.out.disconnect()
+
+    sliceData: (data) ->
+        throw "Data #{typeof data} cannot be sliced" unless data.slice
+
+        console.error "BEFORE", data
+        sliced = data.slice @begin, @end unless @end is null
+        sliced = data.slice @begin if @end is null
+        console.error "AFTER", sliced
+        @outPorts.out.send sliced
+
+exports.getComponent = -> new SliceArray


開発用のファイルを写した

開発用のファイルを写した

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

--- dev/server.coffee
+++ dev/server.coffee
@@ -0,0 +1,89 @@
+express = require("express")
+fs = require("fs")
+app = express()
+app.use require("connect").bodyParser()
+
+DATA_PATH = "../../../../data/"
+UPLOAD_PATH = "../../../../uploads/"
+PUBLIC_PATH = "../../../../public/"
+
+getFiles = (dataPath) ->
+  files = fs.readdirSync(dataPath)
+  list = []
+  files.forEach (fileName) ->
+    if fileName.match(/.+\.json/)
+      file = fs.readFileSync(dataPath + fileName) + ""
+      if file
+        data = null
+        try
+          data = JSON.parse(file)
+        catch e
+          console.log e
+        list.push data  if data
+  list
+
+isSet = (arg) ->
+  return arg? and arg isnt ""
+
+shorten = (str, length) ->
+  s = str.replace(/\n|\\|\/|\:|\*|\?|\"|\<|\>|\|/g, "")
+  postfix = "..."
+  if s.length > length
+    if length > postfix.length
+      s.slice(0, length - postfix.length) + postfix
+    else
+      s.slice 0, length
+  else
+    s
+
+app.post "/upload", (req, res) ->
+  files = req.files.files
+  if typeof files.forEach isnt 'function'
+    files = [files]
+  saved = []
+  files.forEach (file) ->
+    data = fs.readFileSync file.path
+    if data
+      newPath = __dirname + "/" + UPLOAD_PATH + file.name;
+      fs.writeFileSync newPath, data
+      console.log "saved:"+file.name
+      saved.push(UPLOAD_PATH + file.name)
+
+  res.send JSON.stringify(saved)
+
+app.post "/write", (req, res) ->
+  data = req.body
+  if isSet(data.name) and isSet(data.date) and isSet(data.text)
+    fs.writeFile DATA_PATH + shorten(data.name, 10) + "「" + shorten(data.text, 20) + "」" + ".json", JSON.stringify(data), (err) ->
+      if err
+        res.send "0"
+      else
+        res.send "1"
+
+sortByDate = (a, b) ->
+    unless a
+        return -1;
+    else unless b
+        return 1;
+    ax = (new Date(a.date)).getTime()
+    bx = (new Date(b.date)).getTime()
+    ax ?= 0
+    bx ?= 0
+    ax - bx
+
+app.get "/page/:page/:per", (req, res) ->
+  files = getFiles(DATA_PATH)
+  files.sort(sortByDate)
+  page = parseInt(req.params.page)
+  per = parseInt(req.params.per)
+  start = Math.max(files.length - (page+1)*per, 0)
+  end = Math.max(files.length - page*per,0)
+  sliced = files.slice(start,end)  #新しいやつからとってくる
+  res.send JSON.stringify(sliced)
+
+app.get "/read", (req, res) ->
+  res.send JSON.stringify(getFiles(DATA_PATH))
+
+app.use "/", express.static(__dirname + "/" + PUBLIC_PATH)
+app.use "/uploads", express.static(__dirname + "/" + UPLOAD_PATH)
+app.listen 3141


Fix source map generation

Fix source map generation

Small typo 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/maowug/coffeescript.git/'


AnimatedModalView: Initial commit, base class of HelpModal

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/'


Add spec to re-emit the tokenized event when the grammar is changed

--- spec/tokenized-buffer-spec.coffee
+++ spec/tokenized-buffer-spec.coffee
@@ -414,19 +414,29 @@
         editor.getBuffer().insert([0, 0], "'")
         fullyTokenize(tokenizedBuffer)
         expect(tokenizedHandler).not.toHaveBeenCalled()
-      buffer = null
+
+  describe "when the grammar is updated because a grammar it includes is activated", ->
+    it "re-emits the `tokenized` event", ->
+      editor = null
       tokenizedBuffer = null
       tokenizedHandler = jasmine.createSpy("tokenized handler")

       waitsForPromise ->
-        atom.project.open('sample.js').then (editor) -> buffer = editor.getBuffer()
-
-      runs ->
-        tokenizedBuffer = new TokenizedBuffer({buffer})
+        atom.project.open('coffee.coffee').then (o) -> editor = o
+
+      runs ->
+        tokenizedBuffer = editor.displayBuffer.tokenizedBuffer
         tokenizedBuffer.on 'tokenized', tokenizedHandler
         fullyTokenize(tokenizedBuffer)
+        tokenizedHandler.reset()
+
+      waitsForPromise ->
+        atom.packages.activatePackage('language-coffee-script')
+
+      runs ->
+        fullyTokenize(tokenizedBuffer)
         expect(tokenizedHandler.callCount).toBe(1)
-  describe "when the grammar is updated because a grammar it includes is activated", ->
+
     it "retokenizes the buffer", ->

       waitsForPromise ->


ignore tests. need to be refactored.

ignore tests. need to be refactored.

--- test/SFDCSessionAliveTest.coffee
+++ test/SFDCSessionAliveTest.coffee
@@ -2,7 +2,7 @@
 global.LoggrUtil = require '../src/coffeescripts/LoggrUtil'
 SFDC = require '../src/coffeescripts/SFDC'

-describe 'SFDC', ->
+xdescribe 'SFDCSessionAive', ->

   defaultWait = SFDC._MIN_WAIT_TIME


Fix test with non-string id

Fix test with non-string id

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/ChHeLeJa/SpaceTrader.git/'


relocated jquery.reverseMerge

relocated jquery.reverseMerge

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

--- test/jquery.reverse_merge.coffee
+++ test/jquery.reverse_merge.coffee
@@ -0,0 +1,43 @@
+module "jQuery.reverseMerge"
+
+test "reverse merge", ->
+  o = {
+    exists: "cool"
+  }
+
+  $.reverseMerge o,
+    another: "also cool"
+    exists: "not cool"
+    u: undefined
+
+  equal o.exists, "cool"
+  equal o.another, "also cool"
+  equal o.u, undefined
+  ok "u" of o
+
+test "multiple arguments", ->
+   o = {
+     a: 0
+   }
+
+   $.reverseMerge o, {
+     a: 1
+     b: 1
+   }, {
+     a: 2
+     b: 2
+     c: 2
+   }, {
+     a: 3
+     b: 3
+     c: 3
+     d: 3
+   }
+
+   equal o.a, 0
+   equal o.b, 1
+   equal o.c, 2
+   equal o.d, 3
+
+module()
+


add null earned badge count for generic predictor

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/UM-USElab/gradecraft-development.git/'


markdown

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/davepwsmith/zotero-better-bibtex.git/'


CheckBox class was added

CheckBox class was added

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/NightingaleStudio/exam.js.git/'


Accordion with clickabled header

Accordion with clickabled header

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/keboola/kbc-ui-gooddata-writer.git/'


CredentialSelectorModal: for Stacks v2 requirements


dynamic test, more to come...

dynamic test, more to come...

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

--- src/test/services/dynamic.coffee
+++ src/test/services/dynamic.coffee
@@ -0,0 +1,67 @@
+##
+## dynamic.coffee
+##
+## Created by Frederic DELBOS - fred.delbos@gmail.com on Dec 11 2013.
+## This file is subject to the terms and conditions defined in
+## file 'LICENSE.txt', which is part of this source code package.
+##
+
+describe 'dynamic directive tests', ->
+
+  beforeEach(module('CoolFormServices'))
+
+  form =
+    name: "form"
+    action: "/"
+    dependencies: [
+      type: 'directive'
+      field_type: 'text'
+      name: 'test-text'
+      ]
+    pages: [
+      lines:[
+        fields:[
+          {
+            name: "field"
+            type: "text"
+            label: "field"
+            validation: [
+              validator:"email"
+              options: [
+                message: "not an email"
+                ]
+              ]
+            }
+          ]
+        ]
+      ]
+
+  # directiveLoaded = false
+  # angular.module('TestModule', []).directive('testText', ->
+  #     l = (scope) ->
+  #       handlers =
+  #         change: (nVal) ->
+  #           if scope.value != nVal then scope.value = nVal
+  #       dump "hello"
+  #       directiveLoaded = true
+  #       setValue = scope.service.registerField(scope.field.name, handlers)
+  #       scope.value = if scope.field.value then value else ""
+  #       scope.$watch('value', (v, o) -> setValue(v))
+
+
+  #     return {
+  #       restrict: 'E'
+  #       scope:
+  #         field: '='
+  #         service: '='
+  #       template: """<input type="text" ng-model="value"/>"""
+  #       link: l
+  #     }
+  #   )
+
+  it 'load directive and override default text input', inject((registrationService) ->
+    service = registrationService(form)
+    expect(service.directives.get('text')).toEqual('test-text')
+  )
+
+


Improve tests with parameter checking

Improve tests with parameter checking

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/laterpay/laterpay-client-node.git/'


Fixed next-level popovers appearing in wrong place on world map.

--- app/views/play/WorldMapView.coffee
+++ app/views/play/WorldMapView.coffee
@@ -40,7 +40,7 @@
     @levelStatusMap = {}
     @levelPlayCountMap = {}
     @sessions = @supermodel.loadCollection(new LevelSessionsCollection(), 'your_sessions', null, 0).model
-
+
     # Temporary attempt to make sure all earned rewards are accounted for. Figure out a better solution...
     @earnedAchievements = new CocoCollection([], {url: '/db/earned_achievement', model:EarnedAchievement, project: ['earnedRewards']})
     @listenToOnce @earnedAchievements, 'sync', ->
@@ -56,7 +56,7 @@
               earned[group].push(reward)
               addedSomething = true
     @supermodel.loadCollection(@earnedAchievements, 'achievements')
-
+
     @listenToOnce @sessions, 'sync', @onSessionsLoaded
     @getLevelPlayCounts()
     $(window).on 'resize', @onWindowResize
@@ -136,7 +136,7 @@
       if levelID = @$el.find('.level.next').data('level-id')
         @$levelInfo = @$el.find(".level-info-container[data-level-id=#{levelID}]").show()
         pos = @$el.find('.level.next').offset()
-        @adjustLevelInfoPosition pageX: pos.left, pageY: pos.top + 250
+        @adjustLevelInfoPosition pageX: pos.left, pageY: pos.top
         @manuallyPositionedLevelInfoID = levelID

   afterInsert: ->
@@ -203,6 +203,7 @@
     @$levelInfo = @$el.find(".level-info-container[data-level-id=#{levelID}]").show()
     @adjustLevelInfoPosition e
     @endHighlight()
+    @manuallyPositionedLevelInfoID = false

   onMouseLeaveLevel: (e) ->
     return if application.isIPadApp


Adding missing promise require

Adding missing promise require

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/'


Initals settings for User.case

Initals settings for User.case

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/'


bugfix: normalizeHostname

bugfix: normalizeHostname

 On branch master

	modified:   nodejs_server/lib/apprunner.coffee

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/FireworksProject/platform.y.git/'


Get the commented tabs settings back

Get the commented tabs settings back

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/kitchensink.git/'


Accept item for delete action

Accept item for delete action

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/metidia/dynoga.git/'


Update example.coffee

Update example.coffee

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/askdkc/cb_slackbot.git/'


Added some timing functions.

Added some timing functions.

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

--- lib/timing.coffee
+++ lib/timing.coffee
@@ -0,0 +1,19 @@
+basic = require './basic.js'
+util = require './util.js'
+
+this.timer = (name) ->
+    basic.around (fn) ->
+        t = new Date().getTime()
+        fn()
+        ms = new Date().getTime() - t
+        console.log("Execution of #{name} - #{ms.toString()}ms")
+
+this.logStart = (name) ->
+    basic.before (fn) ->
+        t = new Date().getTime()
+        console.log("Execution of #{name} started at #{t.toString()}")
+
+this.logEnd = (name) ->
+    basic.after (fn) ->
+        t = new Date().getTime()
+        console.log("Execution of #{name} ended at #{t.toString()}")


is Phantom broken?

is Phantom broken?

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

--- scripts/phantom.coffee
+++ scripts/phantom.coffee
@@ -0,0 +1,17 @@
+# Description:
+#   PhantomSPH
+
+module.exports = (robot) ->
+   robot.hear /is phantom broken/i, (msg) ->
+      msg.http('http://users.monash.edu.au/~dprice/phantom/nightly/').get() (error, response, body) ->
+         text = []
+         failcount = (body.match(/FAILED/g) || []).length
+         if failcount > 5
+            text.push "Yep. It's a total disaster! :fearful:"
+         else if failcount > 0
+            text.push "Yep."
+         else
+            text.push "Nope."
+         if failcount > 0
+            text.push "http://users.monash.edu.au/~dprice/phantom/nightly/"
+         msg.send text.join('\n')


Fixed scopes

Fixed scopes

--- generators/app/templates/install-slackapp.coffee
+++ generators/app/templates/install-slackapp.coffee
@@ -26,7 +26,16 @@
         {
           clientId: clientId,
           clientSecret: cs,
-          scopes: ['bot','channels:write', 'channels:history', 'groups:write', 'groups:history'],
+          scopes: ['bot','admin', 'channels:history', 'channels:read',
+            'channels:write', 'chat:write:bot', 'chat:write:user', 'dnd:read',
+            'dnd:write', 'emoji:read', 'files:read', 'files:write:user',
+            'groups:history', 'groups:read', 'groups:write',
+            'im:history', 'im:read', 'im:write', 'mpim:history', 'mpim:read',
+            'mpim:write', 'pins:read', 'pins:write', 'reactions:read',
+            'reactions:write', 'reminders:read', 'reminders:write',
+            'search:read', 'stars:read', 'stars:write', 'team:read',
+            'usergroups:read', 'usergroups:write', 'users.profile:read',
+            'users.profile:write', 'users:read', 'users:write'],
         }
       )
     catch e
@@ -84,11 +93,12 @@
       # console.log(user);
       # console.log(bot.config.incoming_webhook.token, bot.config.token);
       # console.log(bot.config.incoming_webhook.url)
+      set = if /^win/.test(process.platform) then "set" else "export"
       console.log("Slack App is successfully installed")
       console.log("Run hubot with the following environment variables:")
-      console.log("HUBOT_SLACK_TOKEN="+bot.config.bot.token)
-      console.log("SLACK_APP_TOKEN="+user.access_token)
-
+      console.log(set+" HUBOT_SLACK_TOKEN="+bot.config.bot.token)
+      console.log(set+" SLACK_APP_TOKEN="+user.access_token)
+
       # dataStore.save name,{
       #   id: name,
       #   apiToken: user.access_token,


Gave collapsed objects larger strings like arrays have.

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/sightmachine/treema.git/'


Add Coinbase exchange

Add Coinbase exchange

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

--- server/exchanges/Coinbase.coffee
+++ server/exchanges/Coinbase.coffee
@@ -0,0 +1,41 @@
+https = require('https')
+
+
+class Coinbase
+
+  NAME = 'COINBASE'
+  CURRENCY = 'BTC'
+  INTERVAL = 10000
+
+  cb = null
+  lastBid = null
+  lastAsk = null
+
+
+  @start = (callback) ->
+    cb = callback
+    startGrabber 'buy', 'bid'
+    startGrabber 'sell', 'ask'
+
+  startGrabber = (type, property) ->
+    grabPrice type, property
+    setInterval () ->
+      grabPrice type, property
+    , INTERVAL
+
+  grabPrice = (type, property) ->
+    https.get 'https://coinbase.com/api/v1/prices/' + type, (res) ->
+      data = ''
+      res.on 'data', (chunk) ->
+        data += chunk
+      res.on 'end', () ->
+        value = JSON.parse(data).subtotal.amount
+        bid = if property is 'bid' then parseFloat(value) else null
+        ask = if property is 'ask' then parseFloat(value) else null
+        if (bid? and bid isnt lastBid) or (ask? and ask isnt lastAsk)
+          lastBid = bid if bid?
+          lastAsk = ask if ask?
+          cb NAME, {bid: lastBid, ask: lastAsk}
+
+
+module.exports = Coinbase


Test instance AMI list

Test instance AMI list

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/'


Fix scrollToLink, including removing unneeded offset

--- app/views/core/CocoView.coffee
+++ app/views/core/CocoView.coffee
@@ -441,8 +441,8 @@
     slider

   scrollToLink: (link, speed=300) ->
-    scrollTo = $(link).offset().top + $('#page-container')[0].scrollTop
-    $('#page-container').animate({ scrollTop: scrollTo }, speed)
+    scrollTo = $(link).offset().top
+    $('body').animate({ scrollTop: scrollTo }, speed)

   toggleFullscreen: (e) ->
     # https://developer.mozilla.org/en-US/docs/Web/Guide/API/DOM/Using_full_screen_mode?redirectlocale=en-US&redirectslug=Web/Guide/DOM/Using_full_screen_mode


handle missing items in stargazer event 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/UCSFMemoryAndAging/tabcat.git/'


Add scrolling down in output view

Add scrolling down in output view

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/rafalprzywarski/test-status.git/'


StackFlowController: kloud error handling fix

--- client/app/lib/providers/resourcestatemodal/controllers/stackflowcontroller.coffee
+++ client/app/lib/providers/resourcestatemodal/controllers/stackflowcontroller.coffee
@@ -119,7 +119,7 @@

   onKloudError: (response) ->

-    { message } = response
+    message = response.err?.message ? response.message
     @buildStack.showError message


KodingKite: increase queue size

KodingKite: increase queue size

--- client/Main/kite/kodingkite.coffee
+++ client/Main/kite/kodingkite.coffee
@@ -3,7 +3,7 @@
   { @Error } = require 'kite'

   [DISCONNECTED, CONNECTED] = [0, 1]
-  MAX_QUEUE_SIZE = 5
+  MAX_QUEUE_SIZE = 50

   constructor: (options) ->
     super options
@@ -132,7 +132,9 @@

     new Promise (resolve, reject)=>
       return resolve args if @_state is CONNECTED
-      return reject()  if @waitingCalls.length >= MAX_QUEUE_SIZE
+      if @waitingCalls.length >= MAX_QUEUE_SIZE
+        console.log "# CALL REJECTED SINCE WAITING QUEUE IS TOO BIG NOW."
+        return reject()

       cid = (@waitingCalls.push args) - 1


Close socket on window inactive and reconnect on active

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/evercam/evercam-dashboard.git/'


[server] created module to parse country names & fetch population from world bank api

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

--- server/geo.coffee
+++ server/geo.coffee
@@ -0,0 +1,1277 @@
+# Vendor
+_find = require 'lodash-node/modern/collections/find' # to be replaced w/ array.prototype.find w/ node --harmony
+request = require 'request'
+rsvp = require "rsvp"
+
+# ==========
+
+# github.com/lukes/ISO-3166-Countries-with-Regional-Codes
+# slim-3.json
+codeMapping = [
+  {
+    name: "Afghanistan"
+    "alpha-3": "AFG"
+    "country-code": "004"
+  }
+  {
+    name: "Åland Islands"
+    "alpha-3": "ALA"
+    "country-code": "248"
+  }
+  {
+    name: "Albania"
+    "alpha-3": "ALB"
+    "country-code": "008"
+  }
+  {
+    name: "Algeria"
+    "alpha-3": "DZA"
+    "country-code": "012"
+  }
+  {
+    name: "American Samoa"
+    "alpha-3": "ASM"
+    "country-code": "016"
+  }
+  {
+    name: "Andorra"
+    "alpha-3": "AND"
+    "country-code": "020"
+  }
+  {
+    name: "Angola"
+    "alpha-3": "AGO"
+    "country-code": "024"
+  }
+  {
+    name: "Anguilla"
+    "alpha-3": "AIA"
+    "country-code": "660"
+  }
+  {
+    name: "Antarctica"
+    "alpha-3": "ATA"
+    "country-code": "010"
+  }
+  {
+    name: "Antigua and Barbuda"
+    "alpha-3": "ATG"
+    "country-code": "028"
+  }
+  {
+    name: "Argentina"
+    "alpha-3": "ARG"
+    "country-code": "032"
+  }
+  {
+    name: "Armenia"
+    "alpha-3": "ARM"
+    "country-code": "051"
+  }
+  {
+    name: "Aruba"
+    "alpha-3": "ABW"
+    "country-code": "533"
+  }
+  {
+    name: "Australia"
+    "alpha-3": "AUS"
+    "country-code": "036"
+  }
+  {
+    name: "Austria"
+    "alpha-3": "AUT"
+    "country-code": "040"
+  }
+  {
+    name: "Azerbaijan"
+    "alpha-3": "AZE"
+    "country-code": "031"
+  }
+  {
+    name: "Bahamas"
+    "alpha-3": "BHS"
+    "country-code": "044"
+  }
+  {
+    name: "Bahrain"
+    "alpha-3": "BHR"
+    "country-code": "048"
+  }
+  {
+    name: "Bangladesh"
+    "alpha-3": "BGD"
+    "country-code": "050"
+  }
+  {
+    name: "Barbados"
+    "alpha-3": "BRB"
+    "country-code": "052"
+  }
+  {
+    name: "Belarus"
+    "alpha-3": "BLR"
+    "country-code": "112"
+  }
+  {
+    name: "Belgium"
+    "alpha-3": "BEL"
+    "country-code": "056"
+  }
+  {
+    name: "Belize"
+    "alpha-3": "BLZ"
+    "country-code": "084"
+  }
+  {
+    name: "Benin"
+    "alpha-3": "BEN"
+    "country-code": "204"
+  }
+  {
+    name: "Bermuda"
+    "alpha-3": "BMU"
+    "country-code": "060"
+  }
+  {
+    name: "Bhutan"
+    "alpha-3": "BTN"
+    "country-code": "064"
+  }
+  {
+    name: "Bolivia, Plurinational State of"
+    "alpha-3": "BOL"
+    "country-code": "068"
+  }
+  {
+    name: "Bonaire, Sint Eustatius and Saba"
+    "alpha-3": "BES"
+    "country-code": "535"
+  }
+  {
+    name: "Bosnia and Herzegovina"
+    "alpha-3": "BIH"
+    "country-code": "070"
+  }
+  {
+    name: "Botswana"
+    "alpha-3": "BWA"
+    "country-code": "072"
+  }
+  {
+    name: "Bouvet Island"
+    "alpha-3": "BVT"
+    "country-code": "074"
+  }
+  {
+    name: "Brazil"
+    "alpha-3": "BRA"
+    "country-code": "076"
+  }
+  {
+    name: "British Indian Ocean Territory"
+    "alpha-3": "IOT"
+    "country-code": "086"
+  }
+  {
+    name: "Brunei Darussalam"
+    "alpha-3": "BRN"
+    "country-code": "096"
+  }
+  {
+    name: "Bulgaria"
+    "alpha-3": "BGR"
+    "country-code": "100"
+  }
+  {
+    name: "Burkina Faso"
+    "alpha-3": "BFA"
+    "country-code": "854"
+  }
+  {
+    name: "Burundi"
+    "alpha-3": "BDI"
+    "country-code": "108"
+  }
+  {
+    name: "Cambodia"
+    "alpha-3": "KHM"
+    "country-code": "116"
+  }
+  {
+    name: "Cameroon"
+    "alpha-3": "CMR"
+    "country-code": "120"
+  }
+  {
+    name: "Canada"
+    "alpha-3": "CAN"
+    "country-code": "124"
+  }
+  {
+    name: "Cape Verde"
+    "alpha-3": "CPV"
+    "country-code": "132"
+  }
+  {
+    name: "Cayman Islands"
+    "alpha-3": "CYM"
+    "country-code": "136"
+  }
+  {
+    name: "Central African Republic"
+    "alpha-3": "CAF"
+    "country-code": "140"
+  }
+  {
+    name: "Chad"
+    "alpha-3": "TCD"
+    "country-code": "148"
+  }
+  {
+    name: "Chile"
+    "alpha-3": "CHL"
+    "country-code": "152"
+  }
+  {
+    name: "China"
+    "alpha-3": "CHN"
+    "country-code": "156"
+  }
+  {
+    name: "Christmas Island"
+    "alpha-3": "CXR"
+    "country-code": "162"
+  }
+  {
+    name: "Cocos (Keeling) Islands"
+    "alpha-3": "CCK"
+    "country-code": "166"
+  }
+  {
+    name: "Colombia"
+    "alpha-3": "COL"
+    "country-code": "170"
+  }
+  {
+    name: "Comoros"
+    "alpha-3": "COM"
+    "country-code": "174"
+  }
+  {
+    name: "Congo"
+    "alpha-3": "COG"
+    "country-code": "178"
+  }
+  {
+    name: "Congo, the Democratic Republic of the"
+    "alpha-3": "COD"
+    "country-code": "180"
+  }
+  {
+    name: "Cook Islands"
+    "alpha-3": "COK"
+    "country-code": "184"
+  }
+  {
+    name: "Costa Rica"
+    "alpha-3": "CRI"
+    "country-code": "188"
+  }
+  {
+    name: "Côte d'Ivoire"
+    "alpha-3": "CIV"
+    "country-code": "384"
+  }
+  {
+    name: "Croatia"
+    "alpha-3": "HRV"
+    "country-code": "191"
+  }
+  {
+    name: "Cuba"
+    "alpha-3": "CUB"
+    "country-code": "192"
+  }
+  {
+    name: "Curaçao"
+    "alpha-3": "CUW"
+    "country-code": "531"
+  }
+  {
+    name: "Cyprus"
+    "alpha-3": "CYP"
+    "country-code": "196"
+  }
+  {
+    name: "Czech Republic"
+    "alpha-3": "CZE"
+    "country-code": "203"
+  }
+  {
+    name: "Denmark"
+    "alpha-3": "DNK"
+    "country-code": "208"
+  }
+  {
+    name: "Djibouti"
+    "alpha-3": "DJI"
+    "country-code": "262"
+  }
+  {
+    name: "Dominica"
+    "alpha-3": "DMA"
+    "country-code": "212"
+  }
+  {
+    name: "Dominican Republic"
+    "alpha-3": "DOM"
+    "country-code": "214"
+  }
+  {
+    name: "Ecuador"
+    "alpha-3": "ECU"
+    "country-code": "218"
+  }
+  {
+    name: "Egypt"
+    "alpha-3": "EGY"
+    "country-code": "818"
+  }
+  {
+    name: "El Salvador"
+    "alpha-3": "SLV"
+    "country-code": "222"
+  }
+  {
+    name: "Equatorial Guinea"
+    "alpha-3": "GNQ"
+    "country-code": "226"
+  }
+  {
+    name: "Eritrea"
+    "alpha-3": "ERI"
+    "country-code": "232"
+  }
+  {
+    name: "Estonia"
+    "alpha-3": "EST"
+    "country-code": "233"
+  }
+  {
+    name: "Ethiopia"
+    "alpha-3": "ETH"
+    "country-code": "231"
+  }
+  {
+    name: "Falkland Islands (Malvinas)"
+    "alpha-3": "FLK"
+    "country-code": "238"
+  }
+  {
+    name: "Faroe Islands"
+    "alpha-3": "FRO"
+    "country-code": "234"
+  }
+  {
+    name: "Fiji"
+    "alpha-3": "FJI"
+    "country-code": "242"
+  }
+  {
+    name: "Finland"
+    "alpha-3": "FIN"
+    "country-code": "246"
+  }
+  {
+    name: "France"
+    "alpha-3": "FRA"
+    "country-code": "250"
+  }
+  {
+    name: "French Guiana"
+    "alpha-3": "GUF"
+    "country-code": "254"
+  }
+  {
+    name: "French Polynesia"
+    "alpha-3": "PYF"
+    "country-code": "258"
+  }
+  {
+    name: "French Southern Territories"
+    "alpha-3": "ATF"
+    "country-code": "260"
+  }
+  {
+    name: "Gabon"
+    "alpha-3": "GAB"
+    "country-code": "266"
+  }
+  {
+    name: "Gambia"
+    "alpha-3": "GMB"
+    "country-code": "270"
+  }
+  {
+    name: "Georgia"
+    "alpha-3": "GEO"
+    "country-code": "268"
+  }
+  {
+    name: "Germany"
+    "alpha-3": "DEU"
+    "country-code": "276"
+  }
+  {
+    name: "Ghana"
+    "alpha-3": "GHA"
+    "country-code": "288"
+  }
+  {
+    name: "Gibraltar"
+    "alpha-3": "GIB"
+    "country-code": "292"
+  }
+  {
+    name: "Greece"
+    "alpha-3": "GRC"
+    "country-code": "300"
+  }
+  {
+    name: "Greenland"
+    "alpha-3": "GRL"
+    "country-code": "304"
+  }
+  {
+    name: "Grenada"
+    "alpha-3": "GRD"
+    "country-code": "308"
+  }
+  {
+    name: "Guadeloupe"
+    "alpha-3": "GLP"
+    "country-code": "312"
+  }
+  {
+    name: "Guam"
+    "alpha-3": "GUM"
+    "country-code": "316"
+  }
+  {
+    name: "Guatemala"
+    "alpha-3": "GTM"
+    "country-code": "320"
+  }
+  {
+    name: "Guernsey"
+    "alpha-3": "GGY"
+    "country-code": "831"
+  }
+  {
+    name: "Guinea"
+    "alpha-3": "GIN"
+    "country-code": "324"
+  }
+  {
+    name: "Guinea-Bissau"
+    "alpha-3": "GNB"
+    "country-code": "624"
+  }
+  {
+    name: "Guyana"
+    "alpha-3": "GUY"
+    "country-code": "328"
+  }
+  {
+    name: "Haiti"
+    "alpha-3": "HTI"
+    "country-code": "332"
+  }
+  {
+    name: "Heard Island and McDonald Islands"
+    "alpha-3": "HMD"
+    "country-code": "334"
+  }
+  {
+    name: "Holy See (Vatican City State)"
+    "alpha-3": "VAT"
+    "country-code": "336"
+  }
+  {
+    name: "Honduras"
+    "alpha-3": "HND"
+    "country-code": "340"
+  }
+  {
+    name: "Hong Kong"
+    "alpha-3": "HKG"
+    "country-code": "344"
+  }
+  {
+    name: "Hungary"
+    "alpha-3": "HUN"
+    "country-code": "348"
+  }
+  {
+    name: "Iceland"
+    "alpha-3": "ISL"
+    "country-code": "352"
+  }
+  {
+    name: "India"
+    "alpha-3": "IND"
+    "country-code": "356"
+  }
+  {
+    name: "Indonesia"
+    "alpha-3": "IDN"
+    "country-code": "360"
+  }
+  {
+    name: "Iran, Islamic Republic of"
+    "alpha-3": "IRN"
+    "country-code": "364"
+  }
+  {
+    name: "Iraq"
+    "alpha-3": "IRQ"
+    "country-code": "368"
+  }
+  {
+    name: "Ireland"
+    "alpha-3": "IRL"
+    "country-code": "372"
+  }
+  {
+    name: "Isle of Man"
+    "alpha-3": "IMN"
+    "country-code": "833"
+  }
+  {
+    name: "Israel"
+    "alpha-3": "ISR"
+    "country-code": "376"
+  }
+  {
+    name: "Italy"
+    "alpha-3": "ITA"
+    "country-code": "380"
+  }
+  {
+    name: "Jamaica"
+    "alpha-3": "JAM"
+    "country-code": "388"
+  }
+  {
+    name: "Japan"
+    "alpha-3": "JPN"
+    "country-code": "392"
+  }
+  {
+    name: "Jersey"
+    "alpha-3": "JEY"
+    "country-code": "832"
+  }
+  {
+    name: "Jordan"
+    "alpha-3": "JOR"
+    "country-code": "400"
+  }
+  {
+    name: "Kazakhstan"
+    "alpha-3": "KAZ"
+    "country-code": "398"
+  }
+  {
+    name: "Kenya"
+    "alpha-3": "KEN"
+    "country-code": "404"
+  }
+  {
+    name: "Kiribati"
+    "alpha-3": "KIR"
+    "country-code": "296"
+  }
+  {
+    name: "Korea, Democratic People's Republic of"
+    "alpha-3": "PRK"
+    "country-code": "408"
+  }
+  {
+    name: "Korea, Republic of"
+    "alpha-3": "KOR"
+    "country-code": "410"
+  }
+  {
+    name: "Kuwait"
+    "alpha-3": "KWT"
+    "country-code": "414"
+  }
+  {
+    name: "Kyrgyzstan"
+    "alpha-3": "KGZ"
+    "country-code": "417"
+  }
+  {
+    name: "Lao People's Democratic Republic"
+    "alpha-3": "LAO"
+    "country-code": "418"
+  }
+  {
+    name: "Latvia"
+    "alpha-3": "LVA"
+    "country-code": "428"
+  }
+  {
+    name: "Lebanon"
+    "alpha-3": "LBN"
+    "country-code": "422"
+  }
+  {
+    name: "Lesotho"
+    "alpha-3": "LSO"
+    "country-code": "426"
+  }
+  {
+    name: "Liberia"
+    "alpha-3": "LBR"
+    "country-code": "430"
+  }
+  {
+    name: "Libya"
+    "alpha-3": "LBY"
+    "country-code": "434"
+  }
+  {
+    name: "Liechtenstein"
+    "alpha-3": "LIE"
+    "country-code": "438"
+  }
+  {
+    name: "Lithuania"
+    "alpha-3": "LTU"
+    "country-code": "440"
+  }
+  {
+    name: "Luxembourg"
+    "alpha-3": "LUX"
+    "country-code": "442"
+  }
+  {
+    name: "Macao"
+    "alpha-3": "MAC"
+    "country-code": "446"
+  }
+  {
+    name: "Macedonia, the former Yugoslav Republic of"
+    "alpha-3": "MKD"
+    "country-code": "807"
+  }
+  {
+    name: "Madagascar"
+    "alpha-3": "MDG"
+    "country-code": "450"
+  }
+  {
+    name: "Malawi"
+    "alpha-3": "MWI"
+    "country-code": "454"
+  }
+  {
+    name: "Malaysia"
+    "alpha-3": "MYS"
+    "country-code": "458"
+  }
+  {
+    name: "Maldives"
+    "alpha-3": "MDV"
+    "country-code": "462"
+  }
+  {
+    name: "Mali"
+    "alpha-3": "MLI"
+    "country-code": "466"
+  }
+  {
+    name: "Malta"
+    "alpha-3": "MLT"
+    "country-code": "470"
+  }
+  {
+    name: "Marshall Islands"
+    "alpha-3": "MHL"
+    "country-code": "584"
+  }
+  {
+    name: "Martinique"
+    "alpha-3": "MTQ"
+    "country-code": "474"
+  }
+  {
+    name: "Mauritania"
+    "alpha-3": "MRT"
+    "country-code": "478"
+  }
+  {
+    name: "Mauritius"
+    "alpha-3": "MUS"
+    "country-code": "480"
+  }
+  {
+    name: "Mayotte"
+    "alpha-3": "MYT"
+    "country-code": "175"
+  }
+  {
+    name: "Mexico"
+    "alpha-3": "MEX"
+    "country-code": "484"
+  }
+  {
+    name: "Micronesia, Federated States of"
+    "alpha-3": "FSM"
+    "country-code": "583"
+  }
+  {
+    name: "Moldova, Republic of"
+    "alpha-3": "MDA"
+    "country-code": "498"
+  }
+  {
+    name: "Monaco"
+    "alpha-3": "MCO"
+    "country-code": "492"
+  }
+  {
+    name: "Mongolia"
+    "alpha-3": "MNG"
+    "country-code": "496"
+  }
+  {
+    name: "Montenegro"
+    "alpha-3": "MNE"
+    "country-code": "499"
+  }
+  {
+    name: "Montserrat"
+    "alpha-3": "MSR"
+    "country-code": "500"
+  }
+  {
+    name: "Morocco"
+    "alpha-3": "MAR"
+    "country-code": "504"
+  }
+  {
+    name: "Mozambique"
+    "alpha-3": "MOZ"
+    "country-code": "508"
+  }
+  {
+    name: "Myanmar"
+    "alpha-3": "MMR"
+    "country-code": "104"
+  }
+  {
+    name: "Namibia"
+    "alpha-3": "NAM"
+    "country-code": "516"
+  }
+  {
+    name: "Nauru"
+    "alpha-3": "NRU"
+    "country-code": "520"
+  }
+  {
+    name: "Nepal"
+    "alpha-3": "NPL"
+    "country-code": "524"
+  }
+  {
+    name: "Netherlands"
+    "alpha-3": "NLD"
+    "country-code": "528"
+  }
+  {
+    name: "New Caledonia"
+    "alpha-3": "NCL"
+    "country-code": "540"
+  }
+  {
+    name: "New Zealand"
+    "alpha-3": "NZL"
+    "country-code": "554"
+  }
+  {
+    name: "Nicaragua"
+    "alpha-3": "NIC"
+    "country-code": "558"
+  }
+  {
+    name: "Niger"
+    "alpha-3": "NER"
+    "country-code": "562"
+  }
+  {
+    name: "Nigeria"
+    "alpha-3": "NGA"
+    "country-code": "566"
+  }
+  {
+    name: "Niue"
+    "alpha-3": "NIU"
+    "country-code": "570"
+  }
+  {
+    name: "Norfolk Island"
+    "alpha-3": "NFK"
+    "country-code": "574"
+  }
+  {
+    name: "Northern Mariana Islands"
+    "alpha-3": "MNP"
+    "country-code": "580"
+  }
+  {
+    name: "Norway"
+    "alpha-3": "NOR"
+    "country-code": "578"
+  }
+  {
+    name: "Oman"
+    "alpha-3": "OMN"
+    "country-code": "512"
+  }
+  {
+    name: "Pakistan"
+    "alpha-3": "PAK"
+    "country-code": "586"
+  }
+  {
+    name: "Palau"
+    "alpha-3": "PLW"
+    "country-code": "585"
+  }
+  {
+    name: "Palestine, State of"
+    "alpha-3": "PSE"
+    "country-code": "275"
+  }
+  {
+    name: "Panama"
+    "alpha-3": "PAN"
+    "country-code": "591"
+  }
+  {
+    name: "Papua New Guinea"
+    "alpha-3": "PNG"
+    "country-code": "598"
+  }
+  {
+    name: "Paraguay"
+    "alpha-3": "PRY"
+    "country-code": "600"
+  }
+  {
+    name: "Peru"
+    "alpha-3": "PER"
+    "country-code": "604"
+  }
+  {
+    name: "Philippines"
+    "alpha-3": "PHL"
+    "country-code": "608"
+  }
+  {
+    name: "Pitcairn"
+    "alpha-3": "PCN"
+    "country-code": "612"
+  }
+  {
+    name: "Poland"
+    "alpha-3": "POL"
+    "country-code": "616"
+  }
+  {
+    name: "Portugal"
+    "alpha-3": "PRT"
+    "country-code": "620"
+  }
+  {
+    name: "Puerto Rico"
+    "alpha-3": "PRI"
+    "country-code": "630"
+  }
+  {
+    name: "Qatar"
+    "alpha-3": "QAT"
+    "country-code": "634"
+  }
+  {
+    name: "Réunion"
+    "alpha-3": "REU"
+    "country-code": "638"
+  }
+  {
+    name: "Romania"
+    "alpha-3": "ROU"
+    "country-code": "642"
+  }
+  {
+    name: "Russian Federation"
+    "alpha-3": "RUS"
+    "country-code": "643"
+  }
+  {
+    name: "Rwanda"
+    "alpha-3": "RWA"
+    "country-code": "646"
+  }
+  {
+    name: "Saint Barthélemy"
+    "alpha-3": "BLM"
+    "country-code": "652"
+  }
+  {
+    name: "Saint Helena, Ascension and Tristan da Cunha"
+    "alpha-3": "SHN"
+    "country-code": "654"
+  }
+  {
+    name: "Saint Kitts and Nevis"
+    "alpha-3": "KNA"
+    "country-code": "659"
+  }
+  {
+    name: "Saint Lucia"
+    "alpha-3": "LCA"
+    "country-code": "662"
+  }
+  {
+    name: "Saint Martin (French part)"
+    "alpha-3": "MAF"
+    "country-code": "663"
+  }
+  {
+    name: "Saint Pierre and Miquelon"
+    "alpha-3": "SPM"
+    "country-code": "666"
+  }
+  {
+    name: "Saint Vincent and the Grenadines"
+    "alpha-3": "VCT"
+    "country-code": "670"
+  }
+  {
+    name: "Samoa"
+    "alpha-3": "WSM"
+    "country-code": "882"
+  }
+  {
+    name: "San Marino"
+    "alpha-3": "SMR"
+    "country-code": "674"
+  }
+  {
+    name: "Sao Tome and Principe"
+    "alpha-3": "STP"
+    "country-code": "678"
+  }
+  {
+    name: "Saudi Arabia"
+    "alpha-3": "SAU"
+    "country-code": "682"
+  }
+  {
+    name: "Senegal"
+    "alpha-3": "SEN"
+    "country-code": "686"
+  }
+  {
+    name: "Serbia"
+    "alpha-3": "SRB"
+    "country-code": "688"
+  }
+  {
+    name: "Seychelles"
+    "alpha-3": "SYC"
+    "country-code": "690"
+  }
+  {
+    name: "Sierra Leone"
+    "alpha-3": "SLE"
+    "country-code": "694"
+  }
+  {
+    name: "Singapore"
+    "alpha-3": "SGP"
+    "country-code": "702"
+  }
+  {
+    name: "Sint Maarten (Dutch part)"
+    "alpha-3": "SXM"
+    "country-code": "534"
+  }
+  {
+    name: "Slovakia"
+    "alpha-3": "SVK"
+    "country-code": "703"
+  }
+  {
+    name: "Slovenia"
+    "alpha-3": "SVN"
+    "country-code": "705"
+  }
+  {
+    name: "Solomon Islands"
+    "alpha-3": "SLB"
+    "country-code": "090"
+  }
+  {
+    name: "Somalia"
+    "alpha-3": "SOM"
+    "country-code": "706"
+  }
+  {
+    name: "South Africa"
+    "alpha-3": "ZAF"
+    "country-code": "710"
+  }
+  {
+    name: "South Georgia and the South Sandwich Islands"
+    "alpha-3": "SGS"
+    "country-code": "239"
+  }
+  {
+    name: "South Sudan"
+    "alpha-3": "SSD"
+    "country-code": "728"
+  }
+  {
+    name: "Spain"
+    "alpha-3": "ESP"
+    "country-code": "724"
+  }
+  {
+    name: "Sri Lanka"
+    "alpha-3": "LKA"
+    "country-code": "144"
+  }
+  {
+    name: "Sudan"
+    "alpha-3": "SDN"
+    "country-code": "729"
+  }
+  {
+    name: "Suriname"
+    "alpha-3": "SUR"
+    "country-code": "740"
+  }
+  {
+    name: "Svalbard and Jan Mayen"
+    "alpha-3": "SJM"
+    "country-code": "744"
+  }
+  {
+    name: "Swaziland"
+    "alpha-3": "SWZ"
+    "country-code": "748"
+  }
+  {
+    name: "Sweden"
+    "alpha-3": "SWE"
+    "country-code": "752"
+  }
+  {
+    name: "Switzerland"
+    "alpha-3": "CHE"
+    "country-code": "756"
+  }
+  {
+    name: "Syrian Arab Republic"
+    "alpha-3": "SYR"
+    "country-code": "760"
+  }
+  {
+    name: "Taiwan, Province of China"
+    "alpha-3": "TWN"
+    "country-code": "158"
+  }
+  {
+    name: "Tajikistan"
+    "alpha-3": "TJK"
+    "country-code": "762"
+  }
+  {
+    name: "Tanzania, United Republic of"
+    "alpha-3": "TZA"
+    "country-code": "834"
+  }
+  {
+    name: "Thailand"
+    "alpha-3": "THA"
+    "country-code": "764"
+  }
+  {
+    name: "Timor-Leste"
+    "alpha-3": "TLS"
+    "country-code": "626"
+  }
+  {
+    name: "Togo"
+    "alpha-3": "TGO"
+    "country-code": "768"
+  }
+  {
+    name: "Tokelau"
+    "alpha-3": "TKL"
+    "country-code": "772"
+  }
+  {
+    name: "Tonga"
+    "alpha-3": "TON"
+    "country-code": "776"
+  }
+  {
+    name: "Trinidad and Tobago"
+    "alpha-3": "TTO"
+    "country-code": "780"
+  }
+  {
+    name: "Tunisia"
+    "alpha-3": "TUN"
+    "country-code": "788"
+  }
+  {
+    name: "Turkey"
+    "alpha-3": "TUR"
+    "country-code": "792"
+  }
+  {
+    name: "Turkmenistan"
+    "alpha-3": "TKM"
+    "country-code": "795"
+  }
+  {
+    name: "Turks and Caicos Islands"
+    "alpha-3": "TCA"
+    "country-code": "796"
+  }
+  {
+    name: "Tuvalu"
+    "alpha-3": "TUV"
+    "country-code": "798"
+  }
+  {
+    name: "Uganda"
+    "alpha-3": "UGA"
+    "country-code": "800"
+  }
+  {
+    name: "Ukraine"
+    "alpha-3": "UKR"
+    "country-code": "804"
+  }
+  {
+    name: "United Arab Emirates"
+    "alpha-3": "ARE"
+    "country-code": "784"
+  }
+  {
+    name: "United Kingdom"
+    "alpha-3": "GBR"
+    "country-code": "826"
+  }
+  {
+    name: "United States"
+    "alpha-3": "USA"
+    "country-code": "840"
+  }
+  {
+    name: "United States Minor Outlying Islands"
+    "alpha-3": "UMI"
+    "country-code": "581"
+  }
+  {
+    name: "Uruguay"
+    "alpha-3": "URY"
+    "country-code": "858"
+  }
+  {
+    name: "Uzbekistan"
+    "alpha-3": "UZB"
+    "country-code": "860"
+  }
+  {
+    name: "Vanuatu"
+    "alpha-3": "VUT"
+    "country-code": "548"
+  }
+  {
+    name: "Venezuela, Bolivarian Republic of"
+    "alpha-3": "VEN"
+    "country-code": "862"
+  }
+  {
+    name: "Viet Nam"
+    "alpha-3": "VNM"
+    "country-code": "704"
+  }
+  {
+    name: "Virgin Islands, British"
+    "alpha-3": "VGB"
+    "country-code": "092"
+  }
+  {
+    name: "Virgin Islands, U.S."
+    "alpha-3": "VIR"
+    "country-code": "850"
+  }
+  {
+    name: "Wallis and Futuna"
+    "alpha-3": "WLF"
+    "country-code": "876"
+  }
+  {
+    name: "Western Sahara"
+    "alpha-3": "ESH"
+    "country-code": "732"
+  }
+  {
+    name: "Yemen"
+    "alpha-3": "YEM"
+    "country-code": "887"
+  }
+  {
+    name: "Zambia"
+    "alpha-3": "ZMB"
+    "country-code": "894"
+  }
+  {
+    name: "Zimbabwe"
+    "alpha-3": "ZWE"
+    "country-code": "716"
+  }
+]
+
+# get ISO 3166-1 alpha-3 code given full country name
+getCode = (name) ->
+  return _find(codeMapping, (d) -> d.name is name)["alpha-3"]
+
+# async get country population from World Bank API given ISO 3166-1 alpha-3 code
+getPop = (code) ->
+  wbIndicator = "SP.POP.TOTL"
+  wbYr = 2012
+  wbEndpoint = "http://api.worldbank.org/countries/#{ code }/indicators/#{ wbIndicator }?format=json&date=#{ wbYr }"
+  new rsvp.Promise (resolve, reject) ->
+    request wbEndpoint, (err, res, body) ->
+      if err
+        console.error "[ERROR] world bank api error, err = ", err
+        reject err
+      else resolve JSON.parse(body)[1][0].value
+      return
+
+module.exports =
+  getCode: getCode
+  getPop: getPop # async


Add message field to UI decom prompt

Add message field to UI decom prompt

--- SingularityUI/app/models/ServerItem.coffee
+++ SingularityUI/app/models/ServerItem.coffee
@@ -52,10 +52,12 @@
             url: "#{ @url() }/freeze?user=#{ app.getUsername() }"
             type: "POST"

-    decommission: =>
+    decommission: (message) =>
         $.ajax
             url: "#{ @url() }/decommission?user=#{ app.getUsername() }"
             type: "POST"
+            data: JSON.stringify
+                message: message

     reactivate: =>
         $.ajax
@@ -101,8 +103,11 @@

     promptDecommission: (callback) =>
         state = @get 'state'
-        vex.dialog.confirm
+        vex.dialog.open
             message: @decommissionTemplate {@id, @host, @type}
+            input: """
+                <input name="message" type="text" placeholder="Message (optional)" />
+            """
             buttons: [
                 $.extend {}, vex.dialog.buttons.YES,
                     text: 'Decommission',
@@ -110,9 +115,9 @@
                 vex.dialog.buttons.NO
             ]

-            callback: (confirmed) =>
-                return unless confirmed
-                @decommission().done callback
+            callback: (data) =>
+                return unless data
+                @decommission(data.message).done callback

     promptReactivate: (callback) =>


Breaking things

Breaking things

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

--- test/connectors/bahn.de_test.coffee
+++ test/connectors/bahn.de_test.coffee
@@ -0,0 +1,41 @@
+api        = require "../../lib/connectors"
+connectors = api.connectors
+pts        = connectors['deinbus']
+nodeio     = require "node.io"
+
+describe 'connectors', () ->
+
+  describe 'bahn.de via pts', () ->
+
+    it 'should load the connector', (done) ->
+      expect(pts).to.be.ok
+      done()
+
+    it 'should not crash if no rides are found', (done) ->
+      query =
+        orig: 'DE:Berlin:Berlin'
+        dest: 'DE:Berlin:Hamburg'
+      nodeio.start pts.findRides, query, ((err, rides) ->
+        expect(err || rides.length == 0).to.be.true
+        done()
+      ), true
+
+
+    it 'should find rides', (done) ->
+      console.log pts
+      query =
+        orig: 'DE:Berlin:Berlin'
+        dest: 'DE:Berlin:Hamburg'
+      nodeio.start pts.findRides, query, ((err, rides) ->
+        expect(rides).to.be.ok
+        expect(rides.length > 0).to.be.true
+        expect(rides[0].orig).to.equal('Berlin')
+        expect(rides[0].dest).to.equal('Hamburg')
+        for ride in rides
+          expect(ride.arr).to.be.ok
+          expect(ride.arr > 0).to.be.true
+          expect(ride.dep).to.be.ok
+          expect(ride.dep > 0).to.be.true
+        done()
+      ), true
+


Fixed typo in commit.

Fixed typo in 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/AppGyver/supersonic.git/'


handle fair location

handle fair location

--- models/fair_location.coffee
+++ models/fair_location.coffee
@@ -1,8 +1,11 @@
 _        = require 'underscore'
 sd       = require('sharify').data
 Backbone = require 'backbone'
+{ compactObject } = require './mixins/compact_object.coffee'

 module.exports = class FairLocation extends Backbone.Model

   singleLine: ->
     @get 'display'
+
+  toJSONLD: -> @singleLine()


For some reason missing the `.currentTarget`

--- resources/assets/coffee/react/beatmap-discussions/beatmap-list.coffee
+++ resources/assets/coffee/react/beatmap-discussions/beatmap-list.coffee
@@ -78,7 +78,7 @@

   selectBeatmap: (e) ->
-    $.publish 'beatmap:select', id: e.dataset.id
+    $.publish 'beatmap:select', id: e.currentTarget.dataset.id

   toggleSelector: ->


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/'


Change string constant quotes to '

Change string constant quotes to '

--- app/coffeescripts/DemandVisualizer.coffee
+++ app/coffeescripts/DemandVisualizer.coffee
@@ -85,12 +85,12 @@
       attr('width', width + padding).
       attr('height', height + padding)

-    @graph.append("svg:rect").
-      attr("width", width + padding).
-      attr("height", height + padding).
-      attr("fill", 'white')
-
-    @graph.append("svg:rect").
+    @graph.append('svg:rect').
+      attr('width', width + padding).
+      attr('height', height + padding).
+      attr('fill', 'white')
+
+    @graph.append('svg:rect').
       attr('id', 'legend').
       attr('x', 5).
       attr('y', 5).
@@ -120,55 +120,55 @@
       yScale = d3.scale.linear().
         domain([0, yMaxGlobal]).range([0, height])

-      axisGroup = @graph.append("svg:g").
-      	attr("transform", "translate(#{padding}, #{padding})")
+      axisGroup = @graph.append('svg:g').
+      	attr('transform', "translate(#{padding}, #{padding})")

       xAxisSampleInterval = 20
       yAxisSampleInterval = yMaxGlobal/20;

-      axisGroup.selectAll("lines.xAxis").
+      axisGroup.selectAll('lines.xAxis').
       	data(vals[0]).
         enter().
-      	append("svg:line").
-      	attr("x1", (d,i) -> xScale(i)).
-      	attr("x2", (d,i) -> xScale(i)).
-      	attr("y1", 0).
-      	attr("y2", height - labelFontSize - textSizeImprecisionOffset).
-      	attr("stroke", (d,i) ->
-    	    if i % xAxisSampleInterval == 0 then "darkGray" else "lightGray"
+      	append('svg:line').
+      	attr('x1', (d,i) -> xScale(i)).
+      	attr('x2', (d,i) -> xScale(i)).
+      	attr('y1', 0).
+      	attr('y2', height - labelFontSize - textSizeImprecisionOffset).
+      	attr('stroke', (d,i) ->
+    	    if i % xAxisSampleInterval == 0 then 'darkGray' else 'lightGray'
         )

-      axisGroup.selectAll("lines.yAxis").
+      axisGroup.selectAll('lines.yAxis').
         data(d3.range(yAxisSampleInterval,yMaxGlobal + yAxisSampleInterval,yAxisSampleInterval)).
       	enter().
-      	append("svg:line").
-      	attr("x1", 0).
-      	attr("x2", width).
-      	attr("y1", (d) -> yScale(d)).
-      	attr("y2", (d) -> yScale(d)).
-      	attr "stroke", (d,i) ->
-          if(i % 3 == 0) then "darkGray" else "lightGray"
-
-      xAxisText = axisGroup.selectAll("text.xAxis").
+      	append('svg:line').
+      	attr('x1', 0).
+      	attr('x2', width).
+      	attr('y1', (d) -> yScale(d)).
+      	attr('y2', (d) -> yScale(d)).
+      	attr 'stroke', (d,i) ->
+          if(i % 3 == 0) then 'darkGray' else 'lightGray'
+
+      xAxisText = axisGroup.selectAll('text.xAxis').
       	data(every(xAxisSampleInterval,vals[0])).
       	enter().
-      	append("svg:text").
-      	attr("x", (d,i) -> xScale(xAxisSampleInterval*i)).
-      	attr("y", height-2).
-      	attr("text-anchor","middle").
-      	style("font-size", "#{labelFontSize}px").
+      	append('svg:text').
+      	attr('x', (d,i) -> xScale(xAxisSampleInterval*i)).
+      	attr('y', height-2).
+      	attr('text-anchor','middle').
+      	style('font-size', "#{labelFontSize}px").
       	text (d,i) ->
           s = startTime + xAxisSampleInterval * i * dt
           h = s/3600
-          Math.round(h*10)/10 + "h"
-
-      axisGroup.selectAll("text.yAxis").
+          Math.round(h*10)/10 + 'h'
+
+      axisGroup.selectAll('text.yAxis').
       	data(d3.range(yAxisSampleInterval, yMaxGlobal + yAxisSampleInterval, yAxisSampleInterval)).
       	enter().
-      	append("svg:text").
-      	attr("x", -padding + textSizeImprecisionOffset).
-      	attr("y", (d) -> yScale(yMaxGlobal-d) + textSizeImprecisionOffset).
-      	style("font-size", "#{labelFontSize}px").
+      	append('svg:text').
+      	attr('x', -padding + textSizeImprecisionOffset).
+      	attr('y', (d) -> yScale(yMaxGlobal-d) + textSizeImprecisionOffset).
+      	style('font-size', "#{labelFontSize}px").
       	text((d) -> Math.round(d*10)/10)

       wrapSteps = d3.svg.line().
@@ -180,23 +180,23 @@
         vehicleType = @typeOrder.get('vehicle_type')[i].get('name')
         padValueArray(vehicleTypeVals)

-        @graph.append("svg:path").
-          attr("d", wrapSteps(vehicleTypeVals)).
-        	attr("fill", 'none').
+        @graph.append('svg:path').
+          attr('d', wrapSteps(vehicleTypeVals)).
+        	attr('fill', 'none').
           attr('class', "vehicle-graph-#{i}").
-        	attr("stroke", 'black')
-
-        @graph.selectAll("stdDevBoxes").
+        	attr('stroke', 'black')
+
+        @graph.selectAll('stdDevBoxes').
         	data(vehicleTypeVals).
         	enter().
-        	append("svg:rect").
-        	attr("x", (d, idx) -> xScale(idx) + padding).
-        	attr("y", (d) => topYVal(height, yScale, d, @demand) + padding - 2).
-        	attr("width", xScale(1)).
-          attr("fill", vehicleTypeColors[i]).
-        	attr("opacity", "0.4").
+        	append('svg:rect').
+        	attr('x', (d, idx) -> xScale(idx) + padding).
+        	attr('y', (d) => topYVal(height, yScale, d, @demand) + padding - 2).
+        	attr('width', xScale(1)).
+          attr('fill', vehicleTypeColors[i]).
+        	attr('opacity', '0.4').
           attr('class', "vehicle-graph-#{i}").
-          attr "height", (d) =>
+          attr 'height', (d) =>
             maxHeight = yScale(Math.max(2*stdDevAdd, 2*stdDevMult*d))
             topY = topYVal(height, yScale, d, @demand) + padding - 2
             if maxHeight > height - topY + padding - 10
@@ -207,14 +207,14 @@
               Math.max(maxHeight,3)

   initialize: (@demand) ->
-    @profileSet = window.sirius.models.get("demandprofileset")
+    @profileSet = window.sirius.models.get('demandprofileset')
     @typeOrder = @profileSet.get('vehicletypeorder')
     @link = @demand.get('link')
-    @vizWindow = _.template($("#demand-visualizer-window-template").html())
+    @vizWindow = _.template($('#demand-visualizer-window-template').html())
     if @demand.is_constant()
-      @constDemand = _.template($("#constant-demand-template").html())
+      @constDemand = _.template($('#constant-demand-template').html())
     else
-      @dataDisplay = _.template($("#demand-graph-template").html())
+      @dataDisplay = _.template($('#demand-graph-template').html())
       @$el.html @vizWindow(elemId: @link.id, content: @dataDisplay(elemId: @link.id))
     @$el.attr 'title', "Demand - Link #{@link.get('name')}"


MessagePanel created -- almost working

MessagePanel created -- almost working

--- app/coffeescripts/MessagePanelView.coffee
+++ app/coffeescripts/MessagePanelView.coffee
@@ -15,5 +15,6 @@
     self = @
     @$el.addClass "#{type}"
     @$el.html(@template({message: message}))
-    @$el.fadeIn(4000, () -> self.$el.fadeOut(4000))
+    @$el.fadeIn(4000)
+    #@$el.fadeIn(4000, () -> self.$el.fadeOut(4000))


Fixed name thing

Fixed name thing

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/jencka/2001-A-SPACE-SACRIFICE.git/'


Added init.coffee

Added init.coffee


build:make tests pass

build:make tests pass

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/keboola/kbc-ui-ex-db.git/'


add group member collection

add group member collection

error: pathspec '_source/lib/collections/groupMember.coffee' did not match any file(s) known to git

--- _source/lib/collections/groupMember.coffee
+++ _source/lib/collections/groupMember.coffee
@@ -0,0 +1,31 @@
+
+Apollos.groupMembers = new Mongo.Collection "groupMembers"
+
+groupMember = Apollos.generateSchema
+  groupMemberId:
+    type: Number
+    decimal: false
+  guid:
+    type: String
+    optional: true
+    regex: Apollos.regex.guid
+  groupId:
+    type: Number
+    decimal: false
+  personId:
+    type: Number
+    decimal: false
+  groupRoleId:
+    type: Number
+    decimal: false
+    optional: true
+  groupMemberStatus:
+    type: Number
+    decimal: false
+    optional: true
+  guestCount:
+    type: Number
+    decimal: false
+    optional: true
+
+Apollos.groupMembers.attachSchema groupMember


Add test scenario

Add test scenario

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/reviewninja/parse-diff.git/'


Modified res.write to use hostname and port from the request object when using processESI

Modified res.write to use hostname and port from the request object when
using processESI

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/Postmedia/connect-esi.git/'


Remove extra slash

Remove extra slash


Fix #568 - bad password error was displayed

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/'


Add database authentication.

Add database authentication.

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/philbooth/GitHubReminder.git/'


Fix bug in init defaults and remove #port prop.

The port number is no longer part of the http/Server class. Instead,
for HTTP/S servers the port should be accessed directly from the
multiple classes, when only the frontend should be concerned.

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/RobotSnacks/stout-server.git/'


Add draggable splitter

Add draggable splitter

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/'


Declared App scope.

Declared App scope.

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/deamonsoft/salo.git/'


Add Spellbook.scrollTrigger Component

Add Spellbook.scrollTrigger Component

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

--- components/scrollTrigger.coffee
+++ components/scrollTrigger.coffee
@@ -0,0 +1,30 @@
+# *************************************
+#
+#   Scroll Trigger
+#   -> Description
+#
+# *************************************
+#
+# options.element - the element to hit
+# options.scrollPadding - the padding on the element
+# options.activeClass - the class to add to the active element
+#
+# *************************************
+
+@Spellbook.scrollTrigger = (options) ->
+  scrolled = $(window).scrollTop()
+  active = scrolled - options.element.offset().top >= 0 - options.scrollPadding
+
+  if !options.element.hasClass(options.activeClass) and active
+    options.element.addClass(options.activeClass)
+
+# -------------------------------------
+#   Usage
+# -------------------------------------
+#
+# Spellbook.scrollTrigger({
+#   element: $('.js-scrollTrigger-element')
+#   scrollPadding: 400
+#   activeClass: 'is-active'
+# })
+#


:lipstick:

:lipstick:

--- lib/directory-view.coffee
+++ lib/directory-view.coffee
@@ -53,14 +53,18 @@
     @subscriptions.add @directory.onDidAddEntries (addedEntries) =>
       return unless @isExpanded

+      numberOfEntries = @entries.children.length
+
       for entry in addedEntries
         view = @createViewForEntry(entry)

         insertionIndex = entry.indexInParentDirectory
-        if insertionIndex < @entries.children.length
+        if insertionIndex < numberOfEntries
           @entries.insertBefore(view, @entries.children[insertionIndex])
         else
           @entries.appendChild(view)
+
+        numberOfEntries++

       @emitDirectoryModifiedEvent()


added missing unit tests file

added missing unit tests file

error: pathspec 'services/document-updater/test/unit/coffee/ProjectManager/getProjectDocsTests.coffee' did not match any file(s) known to git

--- services/document-updater/test/unit/coffee/ProjectManager/getProjectDocsTests.coffee
+++ services/document-updater/test/unit/coffee/ProjectManager/getProjectDocsTests.coffee
@@ -0,0 +1,101 @@
+sinon = require('sinon')
+chai = require('chai')
+should = chai.should()
+modulePath = "../../../../app/js/ProjectManager.js"
+SandboxedModule = require('sandboxed-module')
+Errors = require "../../../../app/js/Errors.js"
+
+describe "ProjectManager - getProjectDocs", ->
+	beforeEach ->
+		@ProjectManager = SandboxedModule.require modulePath, requires:
+			"./RedisManager": @RedisManager = {}
+			"./DocumentManager": @DocumentManager = {}
+			"logger-sharelatex": @logger = { log: sinon.stub(), error: sinon.stub() }
+			"./Metrics": @Metrics =
+				Timer: class Timer
+					done: sinon.stub()
+		@project_id = "project-id-123"
+		@callback = sinon.stub()
+
+	describe "successfully", ->
+		beforeEach (done) ->
+			@doc_ids = ["doc-id-1", "doc-id-2", "doc-id-3"]
+			@doc_versions = [111, 222, 333]
+			@doc_lines = [["aaa","aaa"],["bbb","bbb"],["ccc","ccc"]]
+			@docs = [
+				{_id: @doc_ids[0], lines: @doc_lines[0], v: @doc_versions[0]}
+				{_id: @doc_ids[1], lines: @doc_lines[1], v: @doc_versions[1]}
+				{_id: @doc_ids[2], lines: @doc_lines[2], v: @doc_versions[2]}
+			]
+			@RedisManager.checkOrSetProjectState = sinon.stub().callsArgWith(2, null)
+			@RedisManager.getDocIdsInProject = sinon.stub().callsArgWith(1, null, @doc_ids)
+			@RedisManager.getDocVersion = sinon.stub()
+			@RedisManager.getDocVersion.withArgs(@doc_ids[0]).callsArgWith(1, null, @doc_versions[0])
+			@RedisManager.getDocVersion.withArgs(@doc_ids[1]).callsArgWith(1, null, @doc_versions[1])
+			@RedisManager.getDocVersion.withArgs(@doc_ids[2]).callsArgWith(1, null, @doc_versions[2])
+			@RedisManager.getDocLines = sinon.stub()
+			@RedisManager.getDocLines.withArgs(@doc_ids[0]).callsArgWith(1, null, @doc_lines[0])
+			@RedisManager.getDocLines.withArgs(@doc_ids[1]).callsArgWith(1, null, @doc_lines[1])
+			@RedisManager.getDocLines.withArgs(@doc_ids[2]).callsArgWith(1, null, @doc_lines[2])
+			@ProjectManager.getProjectDocs @project_id, @projectStateHash, @excludeVersions,  (error, docs) =>
+				@callback(error, docs)
+				done()
+
+		it "should check the project state", ->
+			@RedisManager.checkOrSetProjectState
+				.calledWith(@project_id, @projectStateHash)
+				.should.equal true
+
+		it "should get the doc ids in the project", ->
+			@RedisManager.getDocIdsInProject
+				.calledWith(@project_id)
+				.should.equal true
+
+		it "should call the callback without error", ->
+			@callback.calledWith(null, @docs).should.equal true
+
+		it "should time the execution", ->
+			@Metrics.Timer::done.called.should.equal true
+
+	describe "when the state does not match", ->
+		beforeEach (done) ->
+			@doc_ids = ["doc-id-1", "doc-id-2", "doc-id-3"]
+			@RedisManager.checkOrSetProjectState = sinon.stub().callsArgWith(2, null, true)
+			@ProjectManager.getProjectDocs @project_id, @projectStateHash, @excludeVersions,  (error, docs) =>
+				@callback(error, docs)
+				done()
+
+		it "should check the project state", ->
+			@RedisManager.checkOrSetProjectState
+				.calledWith(@project_id, @projectStateHash)
+				.should.equal true
+
+		it "should call the callback with an error", ->
+			@callback.calledWith(new Errors.ProjectStateChangedError("project state changed")).should.equal true
+
+		it "should time the execution", ->
+			@Metrics.Timer::done.called.should.equal true
+
+	describe "when a doc errors", ->
+		beforeEach (done) ->
+			@doc_ids = ["doc-id-1", "doc-id-2", "doc-id-3"]
+			@RedisManager.checkOrSetProjectState = sinon.stub().callsArgWith(2, null)
+			@RedisManager.getDocIdsInProject = sinon.stub().callsArgWith(1, null, @doc_ids)
+			@RedisManager.getDocVersion = sinon.stub().callsArgWith(1, null)
+			@RedisManager.getDocLines = sinon.stub()
+			@RedisManager.getDocLines.withArgs("doc-id-1").callsArgWith(1, null)
+			@RedisManager.getDocLines.withArgs("doc-id-2").callsArgWith(1, @error = new Error("oops")) # trigger an error
+			@ProjectManager.getProjectDocs @project_id, @projectStateHash, @excludeVersions, (error, docs) =>
+				@callback(error)
+				done()
+
+		it "should record the error", ->
+			@logger.error
+				.calledWith(err: @error, project_id: @project_id, doc_id: "doc-id-2", "error getting project doc lines")
+				.should.equal true
+
+		it "should call the callback with an error", ->
+			@callback.calledWith(new Error("oops")).should.equal true
+
+		it "should time the execution", ->
+			@Metrics.Timer::done.called.should.equal true


adding content lenght to meta

adding content lenght to meta

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/mjpuser/riak-client.git/'


client: support: remove old chatlio implementation

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/'


fix: minor HTTP protocol bug

fix: minor HTTP protocol bug

 On branch master
	modified:   nodejs_server/lib/apprunner.coffee

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/FireworksProject/platform.y.git/'


Fix: weboob needs the password to access the account.

Only a theoritical issue though? I could only trigger it with the standalone
version.

--- server/controllers/accesses.coffee
+++ server/controllers/accesses.coffee
@@ -16,7 +16,6 @@
             h.sendErr res, "bank access not found", 404, "bank access not found"
             return

-        delete access.password
         @access = access
         next()


Add check for existence of name descriptor.

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/'


prevent duplication of tags when name contains special characters +?.|{}^()-[]

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/'


Takes care of overlapping walls for rooms

--- app/views/editor/level/modals/TerrainRandomizeModal.coffee
+++ app/views/editor/level/modals/TerrainRandomizeModal.coffee
@@ -77,6 +77,13 @@
     'borderSize':4
     'floors':'dungeon_floor'
     'decorations': {
+      'Room': {
+        'num': [1,1]
+        'width': [12, 20]
+        'height': [8, 16]
+        'thickness': [2,2]
+        'cluster': 'dungeon_wall'
+      }
       'cave': {
         'num':[1,1]
         'width': 10
@@ -86,13 +93,6 @@
           'stone':[2,4]
         }
       }
-      'Room': {
-        'num': [1,1]
-        'width': [12, 20]
-        'height': [8, 16]
-        'thickness': [2,2]
-        'cluster': 'dungeon_wall'
-      }
     }
   }
   'indoor': {
@@ -102,20 +102,20 @@
     'borderSize':4
     'floors':'indoor_floor'
     'decorations': {
+      'Room': {
+        'num': [1,1]
+        'width': [12, 20]
+        'height': [8, 16]
+        'thickness': [2,2]
+        'cluster': 'indoor_wall'
+      }
       'furniture': {
         'num':[1,2]
         'width': 15
         'height': 15
         'clusters': {
-          'furniture':[2,3]
-        }
-      }
-      'Room': {
-        'num': [1,1]
-        'width': [12, 16]
-        'height': [8, 16]
-        'thickness': [2,2]
-        'cluster': 'indoor_wall'
+          'furniture':[1,3]
+        }
       }
     }
   }
@@ -298,16 +298,16 @@
         'height':sizeFactor * (room.height[0] + preset.borderSize * _.random(0, (room.height[1] - room.height[0])/preset.borderSize))
       }
       roomThickness = _.random(room.thickness[0], room.thickness[1])
-      rect.x = _.random(rect.width/2 + preset.borderSize * (roomThickness+1), presetSize.x - rect.width/2 - preset.borderSize * (roomThickness+1))
-      rect.y = _.random(rect.height/2 + preset.borderSize * (roomThickness+1), presetSize.y - rect.height/2 - preset.borderSize * (roomThickness+1))
+      rect.x = _.random(rect.width/2 + preset.borderSize * (roomThickness+1.5), presetSize.x - rect.width/2 - preset.borderSize * (roomThickness+1.5))
+      rect.y = _.random(rect.height/2 + preset.borderSize * (roomThickness+2.5), presetSize.y - rect.height/2 - preset.borderSize * (roomThickness+2.5))
       # Snap room walls to the wall grid.
       rect.x = Math.round((rect.x - preset.borderSize / 2) / preset.borderSize) * preset.borderSize + preset.borderSize / 2
       rect.y = Math.round((rect.y - preset.borderSize / 2) / preset.borderSize) * preset.borderSize + preset.borderSize / 2
       break if @addRect {
         'x': rect.x
         'y': rect.y
-        'width': rect.width + 2 * roomThickness * preset.borderSize
-        'height': rect.height + 2 * roomThickness * preset.borderSize
+        'width': rect.width + 2.5 * roomThickness * preset.borderSize
+        'height': rect.height + 2.5 * roomThickness * preset.borderSize
       }

     xRange = _.range(rect.x - rect.width/2 + preset.borderSize, rect.x + rect.width/2, preset.borderSize)
@@ -384,7 +384,7 @@
       @falseCount = 0
       return true
     for existingRect in @rects
-      if Math.abs(existingRect.x - rect.x) < rect.width/2 + existingRect.width/2 and Math.abs(existingRect.y - rect.y) < rect.height/2 + existingRect.height/2
+      if Math.abs(existingRect.x - rect.x) <= rect.width/2 + existingRect.width/2 and Math.abs(existingRect.y - rect.y) <= rect.height/2 + existingRect.height/2
         @falseCount++
         return false
     @rects.push rect


Scrolling to revealed active file in the treeview

--- src/packages/tree-view/src/tree-view.coffee
+++ src/packages/tree-view/src/tree-view.coffee
@@ -163,6 +163,7 @@
         entry.expand()
       else
         @selectEntry(entry)
+        @scrollToEntry(entry)

   entryForPath: (path) ->
     fn = (bestMatchEntry, element) ->


New index.coffee

New index.coffee

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

--- index.coffee
+++ index.coffee
@@ -0,0 +1,3 @@
+_ = require 'underscore'
+_.each [1,2,3], (v) ->
+  console.log v


better github caching

better github caching

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/'


Usar fixtures tambem em producao por enquanto.

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/rodrigoeg/front-end.git/'