Smooth scroll; move doScrollBy to it's own object.

The main reason for doing this is so that we can add the (now)
CoreScroller callbacks to the handler stack earlier, and therefore track
@keyIsDown correctly at startup, while also keeping local state local.

--- content_scripts/scroller.coffee
+++ content_scripts/scroller.coffee
@@ -3,7 +3,6 @@
 # input elements. This mechanism allows us to decide whether to scroll a div or to scroll the whole document.
 #
 activatedElement = null
-settings = null

 scrollProperties =
   x: {
@@ -83,38 +82,37 @@
 #     continues scrolling at least until its corresponding keyup event is received.  We never initiate a new
 #     animator on keyboard repeat.

-# Scroll by a relative amount (a number) in some direction, possibly smoothly.
-doScrollBy = do ->
-  # This is logical time. Time is advanced each time an animator is activated, and on each keyup event.
-  time = 0
-  lastEvent = null
-  keyHandler = null
-  keyIsDown = false
-
-  (element, direction, amount) ->
+CoreScroller =
+  init: (frontendSettings) ->
+    @settings = frontendSettings
+    @time = 0
+    @lastEvent = null
+    @keyIsDown = false
+    handlerStack.push
+      keydown: (event) =>
+        @keyIsDown = true
+        @lastEvent = event
+      keyup: =>
+        @keyIsDown = false
+        @time += 1
+
+  # Scroll element by a relative amount (a number) in some direction.
+  scroll: (element, direction, amount) ->
     return unless amount

-    keyHandler ?= handlerStack.push
-      keydown: ->
-        keyIsDown = true unless event.repeat
-        lastEvent = event
-      keyup: ->
-        keyIsDown = false
-        time += 1
-
-    unless settings.get "smoothScroll"
+    unless @settings.get "smoothScroll"
       # Jump scrolling.
       performScroll element, direction, amount
       checkVisibility element
       return

     # We don't activate new animators on keyboard repeats.
-    return if lastEvent?.repeat
-
-    activationTime = ++time
-
-    isKeyStillDown = ->
-      time == activationTime and keyIsDown
+    return if @lastEvent?.repeat
+
+    activationTime = ++@time
+
+    isMyKeyStillDown = =>
+      @time == activationTime and @keyIsDown

     # Store amount's sign and make amount positive; the logic is clearer when amount is positive.
     sign = Math.sign amount
@@ -149,14 +147,14 @@
       # The constants in the duration calculation, above, are chosen to provide reasonable scroll speeds for
       # scrolls resulting from distinct keypresses.  For continuous scrolls (where the key remains depressed),
       # some scrolls are too slow, and others too fast.  Here, we compensate a bit.
-      if isKeyStillDown() and 50 <= totalElapsed and 0.5 <= calibration <= 1.6
+      if isMyKeyStillDown() and 50 <= totalElapsed and 0.5 <= calibration <= 1.6
         calibration *= 1.05 if 1.05 * calibration * amount <= 150 # Speed up slow scrolls.
         calibration *= 0.95 if 150 <= 0.95 * calibration * amount # Slow down fast scrolls.

       # Calculate the initial delta, rounding up to ensure progress.  Then, adjust delta to account for the
       # current scroll state.
       delta = Math.ceil amount * (elapsed / duration) * calibration
-      delta = if isKeyStillDown() then delta else Math.max 0, Math.min delta, amount - totalDelta
+      delta = if isMyKeyStillDown() then delta else Math.max 0, Math.min delta, amount - totalDelta

       if delta and performScroll element, direction, sign * delta
         totalDelta += delta
@@ -169,8 +167,8 @@

 Scroller =
   init: (frontendSettings) ->
-    settings = frontendSettings
     handlerStack.push DOMActivate: -> activatedElement = event.target
+    CoreScroller.init frontendSettings

   # scroll the active element in :direction by :amount * :factor.
   # :factor is needed because :amount can take on string values, which scrollBy converts to element dimensions.
@@ -188,7 +186,7 @@

     element = findScrollableElement activatedElement, direction, amount, factor
     elementAmount = factor * getDimension element, direction, amount
-    doScrollBy element, direction, elementAmount
+    CoreScroller.scroll element, direction, elementAmount

   scrollTo: (direction, pos) ->
     return unless document.body or activatedElement
@@ -196,7 +194,7 @@

     element = findScrollableElement activatedElement, direction, pos
     amount = getDimension(element,direction,pos) - element[scrollProperties[direction].axisName]
-    doScrollBy element, direction, amount
+    CoreScroller.scroll element, direction, amount

 root = exports ? window
 root.Scroller = Scroller


Call methods through this instead of atom global

--- src/package-manager.coffee
+++ src/package-manager.coffee
@@ -122,8 +122,8 @@

   getAvailablePackageMetadata: ->
     packages = []
-    for packagePath in atom.getAvailablePackagePaths()
+    for packagePath in @getAvailablePackagePaths()
       name = path.basename(packagePath)
-      metadata = atom.getLoadedPackage(name)?.metadata ? Package.loadMetadata(packagePath, true)
+      metadata = @getLoadedPackage(name)?.metadata ? Package.loadMetadata(packagePath, true)
       packages.push(metadata)
     packages


Include analytics proxy spec anyway

Include analytics proxy spec anyway

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

--- components/inquiry_questionnaire/test/analytics.coffee
+++ components/inquiry_questionnaire/test/analytics.coffee
@@ -0,0 +1,47 @@
+rewire = require 'rewire'
+sinon = require 'sinon'
+Backbone = require 'backbone'
+{ fabricate } = require 'antigravity'
+CurrentUser = require '../../../models/current_user'
+Artwork = require '../../../models/artwork'
+ArtworkInquiry = require '../../../models/artwork_inquiry'
+analytics = rewire '../analytics'
+
+describe 'analytics proxy', ->
+  beforeEach ->
+    @hooks = analytics.__get__ 'analyticsHooks'
+    sinon.stub @hooks, 'trigger'
+
+    @modal =
+      view: @view = on: sinon.stub(), off: sinon.stub()
+      subView:
+        user: @user = new CurrentUser fabricate 'user'
+        artwork: @artwork = new Artwork fabricate 'artwork'
+        inquiry: @inquiry = new ArtworkInquiry
+        state: @state = new Backbone.Model
+
+    analytics.attach @modal
+
+  afterEach ->
+    @hooks.trigger.restore()
+    analytics.teardown @modal
+
+  describe '#attach', ->
+    it 'proxies all the events with a namespace', ->
+      @inquiry.trigger 'sync'
+
+      # Proxies the namespaced event over hooks
+      @hooks.trigger.callCount.should.equal 1
+      @hooks.trigger.args[0][0]
+        .should.equal 'inquiry_questionnaire:inquiry:sync'
+
+      # Passes the complete context
+      Object.keys(@hooks.trigger.args[0][1]).should.eql [
+        'modal'
+        'user'
+        'artwork'
+        'inquiry'
+        'collectorProfile'
+        'userInterests'
+        'state'
+      ]


main.coffee: add GitHubApi class

main.coffee: add GitHubApi class

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/rremizov/github-notifier.git/'


Update URLRouter class to correctly handle Route params.

- Add private method to convert params for #registered() and #remove()
  methods so they work correctly when passed a string, regular expression,
  or Route object.
- Fixes route removal problem.

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


added a small example

added a small example

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

--- examples/test.coffee
+++ examples/test.coffee
@@ -0,0 +1,11 @@
+SysAPI = require '../src/sys-api'
+
+api = new SysAPI({})
+
+respond = (req, res, next) ->
+    res.send('hello ' + req.params.name)
+    next()
+
+api.get('/hello/:name', respond)
+
+api.connect(8080)


attempt to alter build running on docker

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


Fix double source maps.

Fix double source maps.

--- src/fs_utils/generate.coffee
+++ src/fs_utils/generate.coffee
@@ -142,12 +142,13 @@
         map = optimized.map
         if map?
           json = params.map.toJSON()
-          json.version = 3
           smConsumer = new SourceMapConsumer json
           newMap = SourceMapGenerator.fromSourceMap new SourceMapConsumer map
           newMap._sources.add path
           newMap._mappings.forEach (mapping) ->
             mapping.source = path
+          newMap._sourcesContents ?= {}
+          newMap._sourcesContents["$#{path}"] = ''  # data
           newMap.applySourceMap smConsumer
         else
           newMap = params.map


fix bin-path

fix bin-path

--- lib/bin-path.coffee
+++ lib/bin-path.coffee
@@ -1,3 +1,5 @@
+path = require 'path'
+
 module.exports =
   standard: path.join __dirname,
     '..',


neo4j: sort overview

neo4j: sort overview

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


support Table node

support Table node

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


test (View) Transition without hooks yields the input stack

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/ag-module-router.git/'


Split State off into own file

Split State off into own file

error: pathspec 'client/lanes/models/State.coffee' did not match any file(s) known to git

--- client/lanes/models/State.coffee
+++ client/lanes/models/State.coffee
@@ -0,0 +1,75 @@
+class State
+    constructor: -> super
+    isState: true
+    dataTypes:
+        function:
+            set: (fn) ->
+                if _.isBlank(fn) or _.isFunction(fn)
+                    { val: fn, type: 'function' }
+                else
+                    throw new TypeError
+        element:
+            set: (el) ->
+                if _.isBlank(el) or _.isElement(el)
+                    { val: el, type: 'element' }
+                else
+                    throw new TypeError
+
+        collection:
+            set: (c) ->
+                if _.isBlank(c) or Lanes.u.isCollection(c) or _.isArray(c)
+                    { val: c, type: 'collection' }
+                else
+                    throw new TypeError
+        code:
+            set: (newVal) ->
+                newVal = '' if !newVal?
+                if _.isString(newVal)
+                    val: newVal.toUpperCase(), type: 'code'
+                else
+                    throw new TypeError('code must be a string')
+            default: -> ''
+        # Big decimal for attributes that need precision math
+        bigdec:
+            set: (newVal) ->
+                val = _.bigDecimal(newVal) unless _.isBlank(newVal)
+                { val, type: 'bigdec' }
+            default: -> new _.bigDecimal(0)
+
+        integer:
+            set: (newVal) ->
+                val = parseInt(newVal, 10) unless _.isBlank(newVal)
+                {val, type: 'integer'}
+
+        moment:
+            get: (val)    -> _.moment(val)
+            default:      -> _.moment()
+            set: (newVal) -> { val: _.moment(newVal), type: 'moment' }
+            compare: (currentVal, newVal) -> currentVal.isSame(newVal)
+
+        # Uses the "moment" lib to parse dates and coerce strings into the date type.
+        date:
+            get: (val) -> new Date(val)
+            default: -> return new Date()
+            set: (newVal) ->
+                if _.isDate(newVal)
+                    type = 'date'
+                    val = new Date(newVal)
+                else if newVal
+                    m = Lanes.Vendor.Moment(Date.parse(newVal))
+                    if m.isValid()
+                        type = 'date'
+                        val = m.toDate()
+                    else
+                        type = typeof newVal;
+                return { type, val }
+
+    # ## listenToAndRun
+    # Shortcut for registering a listener for a model
+    # and also triggering it right away.
+    listenToAndRun: (object, events, handler) ->
+        bound = _.bind(handler, this)
+        this.listenTo(object, events, bound)
+        bound()
+
+Lanes.Models.State = Lanes.lib.MakeBaseClass( Lanes.Vendor.Ampersand.State, State )


Split tunnel proxies as a separate group of proxy workers

Signed-off-by: Sonmez Kartal <d2d15c3d37396a5f2a09f8b42cf5f27d43a3fbde@koding.com>

--- config/workers.coffee
+++ config/workers.coffee
@@ -338,6 +338,13 @@
               'proxy_send_timeout 21600s;'
             ]
           }
+        ]
+
+    tunnelproxies:
+      group             : 'proxy'
+      nginx             :
+        websocket       : yes
+        locations       : [
           {
             location    : "~ ^\\/-\\/prodtunnel\\/(?<tunnel>.+?)\.#{KONFIG.tunnelserver.hostedzone}(?<rest>.*)"
             proxyPass   : "http://$tunnel.#{KONFIG.tunnelserver.hostedzone}$rest"


Couple tweaks.

Couple tweaks.

--- app/views/editor/component/ThangComponentConfigView.coffee
+++ app/views/editor/component/ThangComponentConfigView.coffee
@@ -15,6 +15,7 @@
     @component = options.component
     @config = options.config or {}
     @additionalDefaults = options.additionalDefaults
+    @isDefaultComponent = false
     @world = options.world
     @level = options.level
     @callback = options.callback
@@ -86,9 +87,9 @@

   onConfigEdited: =>
     return if @handlingChange
-    @config = @editThangTreema.data
+    @config = @data()
     @changed = true
-    @trigger 'changed', { component: @component, config: @data() }
+    @trigger 'changed', { component: @component, config: @config }

   data: -> @editThangTreema.data


missing autoprefixer import

missing autoprefixer import

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/avishnyak/generator-turnslift-addon.git/'


adds alerts model

adds alerts model

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

--- models/alerts.coffee
+++ models/alerts.coffee
@@ -0,0 +1,18 @@
+Backbone = require 'backbone'
+sd = require("sharify").data
+_ = require 'underscore'
+
+module.exports = class Alerts extends Backbone.Model
+  url: -> "#{sd.KERNAL_API_URL}/accounts/#{@user_id}/notifications"
+
+  initialize: ({ @user_id }) ->
+    # just destructured assigning
+
+  parse: (data) ->
+    data[0]
+
+  allBlockIds: ->
+    notifications = _.map @get('notifications'), (notification) ->
+      _.map notification.all_rewards, (reward) -> reward.block_id
+    _.uniq _.flatten notifications
+


added task name and version to task document

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


Environments: Show loader while fetching vm state in vm context menu http://take.ms/qWmIw


virtualization controller: setPacks => setContents

--- client/landing/app/MainApp/VirtualizationController.coffee
+++ client/landing/app/MainApp/VirtualizationController.coffee
@@ -373,12 +373,12 @@

       productForm.setCurrentSubscriptions subscriptions

-    productForm.on 'PackOfferingRequested', ->
+    productForm.on 'PackOfferingRequested', (subscription) ->
       options = targetOptions: selector: tags: 'vm'
       KD.getGroup().fetchProducts 'pack', options, (err, packs) ->
         return  if KD.showError err

-        productForm.setPacks packs
+        productForm.setContents packs

     workflow = new PaymentWorkflow
       productForm : productForm


Initial server with express

Initial server with express

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


Fixed bugs with rendering layers.

Fixed bugs with rendering layers.

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/urbanetic/bismuth-schema.git/'


OOPS - missed one file

OOPS - missed one file

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

--- source/BabelBridge/BabelBridge.coffee
+++ source/BabelBridge/BabelBridge.coffee
@@ -0,0 +1,15 @@
+{isClass, log} = require 'art-standard-lib'
+module.exports =
+  babelBridgeRepl: (parser) ->
+    parser = new parser if isClass parser
+    require('repl').start
+      prompt: "#{parser.getClassName()}> "
+      eval: (command, context, filename, callback) ->
+        try
+          parsed = parser.parse command.trim()
+          try
+            callback null, parsed.evaluate?() || "parsed OK"
+          catch e
+            callback e
+        catch e
+          callback parser.parseFailureInfo.replace "<HERE>", "<HERE>".red


Animations

Animations

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

--- app/assets/javascripts/controllers/animations.js.coffee
+++ app/assets/javascripts/controllers/animations.js.coffee
@@ -0,0 +1,32 @@
+window.BaseAnimation = class
+  constructor: (@animator, @callback)->
+
+  onComplete: =>
+    @progress = null
+
+    @callback?()
+
+  positionProgress: (start, end, progress)->
+    (end - start) * progress + start
+
+
+window.PineHitAnimation = class extends BaseAnimation
+  speed: 200
+
+  start: (@sprite)->
+    @progress = 0
+
+    createjs.Tween.get(@).to(progress: 1, @.speed).on('change', @.onChange)
+
+    @.onChange()
+
+  onChange: =>
+    if @progress < 1
+      @sprite.alpha = @progress
+    else
+      @.onComplete()
+
+  onComplete: =>
+    @sprite.alpha = 1
+
+    super


atom: snippets: more

atom: snippets: more

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/suyash-new/dotfiles.git/'


Activate "Save" button on input (non-empty text areas).

--- pages/options.coffee
+++ pages/options.coffee
@@ -58,6 +58,9 @@
   readValueFromElement: -> @element.value.trim()

 class NonEmptyTextOption extends Option
+  constructor: (field,enableSaveButton) ->
+    super(field,enableSaveButton)
+    @element.addEventListener "input", enableSaveButton
   populateElement: (value) -> @element.value = value
   # If the new value is not empty, then return it. Otherwise, restore the default value.
   readValueFromElement: -> if value = @element.value.trim() then value else @restoreToDefault()


Confirm before restoring default settings

--- pages/options.coffee
+++ pages/options.coffee
@@ -79,6 +79,8 @@
   onDataLoaded()

 restoreToDefaults = ->
+  return unless confirm "Are you sure you want to return Vimium's settings to their defaults?"
+
   for field in editableFields
     val = bgSettings.defaults[field] or ""
     setFieldValue $(field), val


Exclusion; tweeks.

Exclusion; tweeks.

--- pages/options.coffee
+++ pages/options.coffee
@@ -1,3 +1,4 @@
+
 $ = (id) -> document.getElementById id
 bgUtils = chrome.extension.getBackgroundPage().Utils
 bgSettings = chrome.extension.getBackgroundPage().Settings
@@ -12,11 +13,9 @@
   # Static. Array of all options.
   @all = []

-  constructor: (field,enableSaveButton) ->
-    @field = field
-    @onUpdated = enableSaveButton
+  constructor: (@field,@onUpdated) ->
     @element = $(@field)
-    @element.addEventListener "change", enableSaveButton
+    @element.addEventListener "change", @onUpdated
     @fetch()
     Option.all.push @

@@ -57,16 +56,16 @@
   readValueFromElement: -> parseFloat @element.value

 class TextOption extends Option
-  constructor: (field,enableSaveButton) ->
-    super(field,enableSaveButton)
-    @element.addEventListener "input", enableSaveButton
+  constructor: (args...) ->
+    super(args...)
+    @element.addEventListener "input", @onUpdated
   populateElement: (value) -> @element.value = value
   readValueFromElement: -> @element.value.trim()

 class NonEmptyTextOption extends Option
-  constructor: (field,enableSaveButton) ->
-    super(field,enableSaveButton)
-    @element.addEventListener "input", enableSaveButton
+  constructor: (args...) ->
+    super(args...)
+    @element.addEventListener "input", @onUpdated

   populateElement: (value) -> @element.value = value
   # If the new value is not empty, then return it. Otherwise, restore the default value.
@@ -77,8 +76,8 @@
   readValueFromElement: -> @element.checked

 class ExclusionRulesOption extends Option
-  constructor: (field, onUpdated) ->
-    super(field, onUpdated)
+  constructor: (args...) ->
+    super(args...)
     $("exclusionAddButton").addEventListener "click", (event) =>
       @addRule()

@@ -138,8 +137,8 @@
 # page popup.  This also differs from ExclusionRulesOption in that, on the page popup, there is always a URL
 # (@url) associated with the current tab.
 class ExclusionRulesOnPopupOption extends ExclusionRulesOption
-  constructor: (field, onUpdated, @url) ->
-    super field, onUpdated
+  constructor: (@url, args...) ->
+    super(args...)

   addRule: ->
     element = super @generateDefaultPattern()
@@ -157,7 +156,7 @@

     haveMatch = false
     for element in elements
-      pattern = element.children[0].firstChild.value.trim()
+      pattern = @getPattern(element).value.trim()
       if 0 <= @url.search bgExclusions.RegexpCache.get pattern
         haveMatch = true
         @getPassKeys(element).focus()
@@ -165,7 +164,7 @@
         element.style.display = 'none'
     @addRule() unless haveMatch

-  # Provide visual feedback when a pattern does not match the current page.
+  # Provide visual feedback (make it red) when a pattern does not match the current tab's URL.
   activatePatternWatcher: (element) ->
     patternElement = element.children[0].firstChild
     patternElement.addEventListener "keyup", =>
@@ -189,7 +188,7 @@
       @url + "*"

 initOptionsPage = ->
-  enableSaveButton = ->
+  onUpdated = ->
     $("saveOptions").removeAttribute "disabled"
     $("saveOptions").innerHTML = "Save Changes"

@@ -264,7 +263,7 @@

   # Populate options. The constructor adds each new object to "Option.all".
   for name, type of options
-    new type(name,enableSaveButton)
+    new type(name,onUpdated)

 initPopupPage = ->
   chrome.tabs.getSelected null, (tab) ->
@@ -302,7 +301,7 @@
         window.close()

     # Populate options. Just one, here.
-    exclusions = new ExclusionRulesOnPopupOption("exclusionRules", onUpdated, tab.url)
+    exclusions = new ExclusionRulesOnPopupOption(tab.url, "exclusionRules", onUpdated)

     updateState()
     document.addEventListener "keyup", updateState


chore (DraweSpec) fix unit tests

chore (DraweSpec) fix unit tests

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


Fix merge errors

Fix merge errors

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/craftedlabs/rubyconfuruguay-mobile.git/'


Right, it's long-sword, not longsword.

Right, it's long-sword, not longsword.

--- app/lib/LevelOptions.coffee
+++ app/lib/LevelOptions.coffee
@@ -235,12 +235,12 @@
     restrictedGear: {}
   'drop-the-flag':
     requiredGear: {'programming-book': 'programmaticon-i', feet: 'leather-boots', flag: 'basic-flags', eyes: 'wooden-glasses', 'right-hand': 'crude-builders-hammer'}
-    restrictedGear: {'right-hand': 'longsword'}
+    restrictedGear: {'right-hand': 'long-sword'}
   'deadly-pursuit':
     requiredGear: {'programming-book': 'programmaticon-i', feet: 'leather-boots', flag: 'basic-flags', eyes: 'wooden-glasses', 'right-hand': 'crude-builders-hammer'}
-    restrictedGear: {'right-hand': 'longsword'}
+    restrictedGear: {'right-hand': 'long-sword'}
   'rich-forager':
-    requiredGear: {'programming-book': 'programmaticon-i', feet: 'leather-boots', flag: 'basic-flags', eyes: 'wooden-glasses', torso: 'leather-tunic', 'right-hand': 'longsword', 'left-hand': 'bronze-shield'}
+    requiredGear: {'programming-book': 'programmaticon-i', feet: 'leather-boots', flag: 'basic-flags', eyes: 'wooden-glasses', torso: 'leather-tunic', 'right-hand': 'long-sword', 'left-hand': 'bronze-shield'}
     restrictedGear: {'right-hand': 'crude-builders-hammer'}
   'multiplayer-treasure-grove':
     requiredGear: {'programming-book': 'programmaticon-i', feet: 'leather-boots', flag: 'basic-flags', eyes: 'wooden-glasses', torso: 'leather-tunic'}


Missed committing part of previous fix.

Missed committing part of previous fix.

--- app/models/CocoModel.coffee
+++ app/models/CocoModel.coffee
@@ -64,7 +64,7 @@
   set: (attributes, options) ->
     delete @attributesWithDefaults
     inFlux = @loading or not @loaded
-    @markToRevert() unless inFlux or @_revertAttributes or @project or options?.silent
+    @markToRevert() unless inFlux or @_revertAttributes or @project or options?.fromMerge
     res = super attributes, options
     @saveBackup() if @saveBackups and (not inFlux) and @hasLocalChanges()
     res


Fix a silly error from changing approach midway.

--- scripts/mcstatus.coffee
+++ scripts/mcstatus.coffee
@@ -18,12 +18,11 @@
 default_port = '10070'

 get_mc_server_status = (msg, url, port) ->
+  request_url = "http://api.syfaro.net/server/status?ip=#{url}&port=#{port}&players=true"
+
   msg.http(request_url)
   .header(Accept: 'application/json')
   .get() (err, res, body) ->
-
-    request_url = "http://api.syfaro.net/server/status?ip=#{url}&port=#{port}&players=true"
-
     if err?
       msg.send "Error: #{err}"
       return


Scoreboard changes.

Scoreboard changes.

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


Update nl.coffee

Update nl.coffee

--- app/locale/nl.coffee
+++ app/locale/nl.coffee
@@ -1,7 +1,7 @@
 module.exports = nativeDescription: "Nederlands", englishDescription: "Dutch", translation:
   new_home:
     slogan: "Het meest uitdagende spel om mee te leren programmeren."
-    classroom_edition: "Klasversie:"
+    classroom_edition: "Klaslokaalversie:"
     learn_to_code: "Leer programmeren:"
     play_now: "Speel"
     im_a_teacher: "Ik ben een leraar"
@@ -10,7 +10,7 @@
     classroom_in_a_box: "Kant-en-klare programmeerlessen."
     codecombat_is: "CodeCombat is een platform waarmee leerlingen leren programmeren door het spelen van een spel." # {change}
     our_courses: "Onze lessen zijn specifiek ontwikkeld voor een klasomgeving, zelfs voor leraren zonder programmeerervaring." # {change}
-#    watch_how: "Watch how CodeCombat is transforming the way people learn computer science."
+    watch_how: "Kijk hoe CodeCombat de manier waarop leerlingen computerwetenschap leren transformeert."
     top_screenshots_hint: "Leerlingen schrijven code en zien direct resultaat."
     designed_with: "Gemaakt voor leraren"
     real_code: "Echte, getypte code"
@@ -49,7 +49,7 @@
     setup_a_class: "Maak een klas aan"
     have_an_account: "Heb je al een account?" # {change}
     logged_in_as: "Je bent ingelogd als"
-    computer_science: "Informatica lessen voor alle leeftijden" # {change}
+    computer_science: "Informaticalessen voor alle leeftijden" # {change}
     show_me_lesson_time: "Geef geschatte lesduur weer:"
     curriculum: "Totaal aantal lesuren:"
     ffa: "Gratis voor alle leerlingen"
@@ -786,8 +786,8 @@

   premium_features:
     get_premium: "Neem
CodeCombat
Premium" # Fit into the banner on the /features page
-    master_coder: "Word een Mesteer Coder door je vandaag te abonneren!"
-#    paypal_redirect: "You will be redirected to PayPal to complete the subscription process."
+    master_coder: "Word een Meesterprogrammeur door je vandaag te abonneren!"
+    paypal_redirect: "Je zult teruggestuurd worden naar Paypal om het inschrijvingsproces af te ronden."
     subscribe_now: "Abonneer nu"
     hero_blurb_1: "Krijg toegang tot __premiumHeroesCount__ supersterke helden, alleen voor abonnees! Gebruik de epische kracht van Okar Stompfoot, de dodelijke precisie van Naria of the Leaf, of roep \"schattige\" skeletten op met Nalfar Cryptor."
     hero_blurb_2: "Premium helden hebben ongelofelijke vecht skills zoals Warcry, Stomp, en Hurl Enemy. Of, speel als Ranger met pijl en boog, werpmessen en vallen! Test je vaardigheden als echte codeermeester en gebruik een arsenaal vam Primordial, Necromantic og Elemental magie!"
@@ -892,7 +892,7 @@
     editor_config_behaviors_description: "Automatisch aanvullen van (gekrulde) haakjes en aanhalingstekens."

   about:
-    main_title: "Als je wil leren programmeren, moet je (heel veel) code schrijven."
+    main_title: "Als je wilt leren programmeren, moet je (heel veel) code schrijven."
     main_description: "Bij CodeCombat, is het ons doel om te zorgen dat je dat doet met een glimlach op je gezicht."
     mission_link: "Missie"
     team_link: "Team"
@@ -902,7 +902,7 @@
     mission_description_1: "Programmeren is magie. Het is het vermogen om dingen te maken vanuit pure fantasie. We zijn CodeCombat begonnen om leerlingen het gevoel the geven van een toverachtige kracht aan hun vingertoppen door het gebruik van getypte code." # {change}
     mission_description_2: "Het blijkt, dat het ze er ook nog in toe staat stelt om sneller te leren. VEEL sneller. Het is zoals een gesprek hebben in plaats van het lezen van een handleiding. We willen dat gesprek brengen naar elke school en naar elke student, omdat iedereen de kans moet krijgen om die magie van programmeren te leren." # {change}
     team_title: "Ontmoet het CodeCombat team"
-    team_values: "We waarderen een open en respectvol dialoog, waar het beste idee wint. Onze keuzes zijn onderbouwd door bezoeker onderzoek en onze werkwijze is gefocust op het leveren van tastbare resultaten voor hun. Iedereen doet mee, van onze CEO tot onze Github bijdragers, omdat we groei en leren waarderen in ons team."
+    team_values: "We waarderen een open en respectvolle dialoog, waar het beste idee wint. Onze keuzes zijn onderbouwd door bezoekersonderzoek en onze werkwijze is gefocust op het leveren van tastbare resultaten. Iedereen doet mee, van onze CEO tot onze Github bijdragers, omdat we groei en leren waarderen in ons team."
     nick_title: "Programmeur" # {change}
     nick_blurb: "Motivatie Goeroe"
     matt_title: "Programmeur" # {change}
@@ -939,8 +939,8 @@
     community_title: "...en onze open-source gemeenschap"
     community_subtitle: "Meer dan 450 bijdragers hebben geholpen bij het bouwen van CodeCombat, met meer die zich er bij voegen elke week!" # {change}
     community_description_3: "CodeCombat is een"
-    community_description_link_2: "gemeenschap project"
-    community_description_1: "CodeCombat is een gemeenschap project, met honderden spelers die vrijwillig levels maken, bijdrage aan onze code om dingen toe te voegen, bugs te maken, speeltesten, en zelfs helpen het spel te vertalen in 50 talen zover. Werknemers, bijdragers en de site krijgen meer door het delen van ideeën en pooling inspanning, zoals de open source gemeenschap in het algemeen doet. De site is gemaakt met meerdere open source projecten, en we zijn open source zodat we wat terug kunnen geven aan de gemeenschap en leveren programmeer geïnteresseerde spelers een vertouwd project om te verkennen en mee te experimenteren. Iedereen kan zich bij de CodeCombat gemeenschap voegen! Bekijk onze" # {change}
+    community_description_link_2: "gemeenschapsproject"
+    community_description_1: "CodeCombat is een gemeenschapsproject, met honderden spelers die vrijwillig levels maken, bijdrage aan onze code om dingen toe te voegen, bugs te maken, speeltesten, en zelfs helpen het spel te vertalen in 50 talen zover. Werknemers, bijdragers en de site krijgen meer door het delen van ideeën en pooling inspanning, zoals de open source gemeenschap in het algemeen doet. De site is gemaakt met meerdere open source projecten, en we zijn open source zodat we wat terug kunnen geven aan de gemeenschap en leveren programmeer geïnteresseerde spelers een vertouwd project om te verkennen en mee te experimenteren. Iedereen kan zich bij de CodeCombat gemeenschap voegen! Bekijk onze" # {change}
     community_description_link: "Draag bij pagina"
     community_description_2: "voor meer info."
     number_contributors: "Meer dan 450 bijdragers hebben hun hulp en tijd verleend aan dit project."
@@ -961,8 +961,8 @@
     jobs_subtitle: "Zie je niets dat bij je past maar wil je toch contact houden? Bekijk onze \"Maak eigen\" vermelding."
     jobs_benefits: "Arbeidsvoorwaarden"
     jobs_benefit_4: "Onbeperkte ziek/persoonlijke dagen" # {change}
-    jobs_benefit_5: "Professionele ontwikkeling en voortgezette onderwijs steun" # {change}
-    jobs_benefit_6: "Medisch/tandarts/oog verzekering" # {change}
+    jobs_benefit_5: "Professionele ontwikkeling en steun in het voortgezet onderwijs" # {change}
+    jobs_benefit_6: "Zorgverzekering" # {change}
     jobs_benefit_7: "Zit-staan bureau's voor iedereen"
     jobs_benefit_9: "10 jaar aanspraak tijd op aandelen"
     jobs_benefit_10: "Moederschapsverlof: 10 weken betaald, volgende 6 met 55% salaris"


Fix indentation in uk.coffee

Fix indentation in uk.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/VilkkuV/codecombat.git/'


fixes #307

fixes #307

error: pathspec 'resource/translators/Better' did not match any file(s) known to git
error: pathspec 'BibLaTeX.coffee' did not match any file(s) known to git


Remove sso_session from alerts.svc #index, and remove @load method

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/xaun/impac-angular.git/'


coffeescript scope

coffeescript 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/RobertsGroza/kakimasu.git/'


Don’t add undefined context menus when activating package resources

Signed-off-by: Max Brunsfeld <78036c9b69b887700d5846f26a788d53b201ffbb@gmail.com>

--- src/package.coffee
+++ src/package.coffee
@@ -192,8 +192,8 @@
   activateResources: ->
     @activationDisposables = new CompositeDisposable
     @activationDisposables.add(atom.keymaps.add(keymapPath, map)) for [keymapPath, map] in @keymaps
-    @activationDisposables.add(atom.contextMenu.add(map['context-menu'])) for [menuPath, map] in @menus
-    @activationDisposables.add(atom.menu.add(map.menu)) for [menuPath, map] in @menus when map.menu
+    @activationDisposables.add(atom.contextMenu.add(map['context-menu'])) for [menuPath, map] in @menus when map['context-menu']?
+    @activationDisposables.add(atom.menu.add(map['menu'])) for [menuPath, map] in @menus when map['menu']?

     unless @grammarsActivated
       grammar.activate() for grammar in @grammars


Add toString tests.

Add toString tests.

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


Normalize file paths in Project::resolve

This ensures the drive case letter is consistent on Windows
when opening file paths from the command line.

--- src/project.coffee
+++ src/project.coffee
@@ -100,9 +100,9 @@
       uri
     else
       if fs.isAbsolute(uri)
-        fs.absolute(uri)
+        path.normalize(fs.absolute(uri))
       else if projectPath = @getPath()
-        fs.absolute(path.join(projectPath, uri))
+        path.normalize(fs.absolute(path.join(projectPath, uri)))
       else
         undefined


update error copy; better nullchecking for ip values; version tweak to help debug

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


Add some missing code

Add some missing code

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


Update closure.cson

Update closure.cson

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/Planeshifter/my-atomic-snippets.git/'


update package name

update package name

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/torx-io/torx-dark-ui.git/'


Updated ecore.coffee

Updated ecore.coffee

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

--- src/coffee/ecore.coffee
+++ src/coffee/ecore.coffee
@@ -0,0 +1,95 @@
+# ecore.js 0.1
+# (c) 2012 Guillaume Hillairet.
+#
+# ecore.js: Consuming ecore models in JavaScript.
+#
+
+# Establish the root object, `window` in the browser, or `global` on the server.
+root = this
+
+ecore = {}
+root['ecore'] = ecore
+
+# Represents a persistent collection.
+class Resource
+    constructor: (@url, @content) ->
+
+# ResourceSet holds a Collection of Resource, and provides methods for loading
+# Resource.
+class ResourceSet
+    @resources = []
+    @indexes = {}
+    load: (url, callback) ->
+        if _.isString(url) and callback and typeof callback is 'function'
+            httpGet url, (result) ->
+                resource = new Resource url, result
+                @resources = [] unless @resources
+                @resources.push resource
+                callback resource
+
+refAttribute = '$ref'
+indexAttribute = '_index'
+indexes = {}
+
+# Return the Index of the current object, based
+# on its parent Index and is current position in
+# the given property.
+getIndex = (parent, property, position) ->
+    index = parent[indexAttribute] + '/@' + property
+    index = index + '.' + position  if position >= 0
+    index
+
+# Traverse the current object tree and assign to
+# each object an Index.
+# The root object has for Index /.
+buildIndexes = (object, func) ->
+    current = false
+    index = false
+    keys = _.without(_.keys(object), refAttribute, indexAttribute)
+    _.each keys, (key) ->
+        if _.isArray(object[key])
+            i = 0
+            l = object[key].length
+            while i < l
+                current = object[key][i]
+                index = func.apply(this, [ object, key, i ])
+                current[indexAttribute] = index
+                indexes[index] = current
+                buildIndexes current, func
+                i++
+        else if typeof (object[key]) is 'object'
+            current = object[key]
+            index = func.apply(this, [ object, key ])
+            current[indexAttribute] = index
+            indexes[index] = current
+            buildIndexes object[key], func
+    true
+
+# Resolves references based on Index assigned to each
+# objects.
+resolveReferences = (object) ->
+    keys = _.without(_.keys(object), indexAttribute)
+    _.each keys, (key) ->
+        unless _.isUndefined(object[key])
+            if _.has(object[key], refAttribute)
+                ref = object[key][refAttribute]
+                object[key] = indexes[ref] unless _.isUndefined(ref)
+        resolveReferences object[key] if typeof (object[key]) is 'object'
+    true
+
+# Load data.
+httpGet = (url, callback) ->
+    if $
+        $.getJSON url, (data) ->
+            root = data
+            if root
+                root[indexAttribute] = '/'
+                indexes['/'] = root
+                buildIndexes root, getIndex
+                resolveReferences root
+                root
+        callback root
+
+ecore.Resource = Resource
+ecore.ResourceSet = ResourceSet
+


NSE: SideView: allow more customization for added views

--- client/new-stack-editor/lib/views/sideview.coffee
+++ client/new-stack-editor/lib/views/sideview.coffee
@@ -30,8 +30,10 @@

       @wrapper.addSubView view

-      view.on Events.LazyLoadStarted,  @lazyBound 'setClass',   'loading'
-      view.on Events.LazyLoadFinished, @lazyBound 'unsetClass', 'loading'
+      view.on Events.LazyLoadStarted,  @lazyBound 'setClass',    'loading'
+      view.on Events.LazyLoadFinished, @lazyBound 'unsetClass',  'loading'
+      view.on Events.ExpandSideView,   @lazyBound 'setClass',   'expanded'
+      view.on Events.CollapseSideView, @lazyBound 'unsetClass', 'expanded'

       for control, generator of controls when controls
         @controls.addSubView generator()
@@ -41,7 +43,7 @@
     @_createLoaderView()

-  show: (viewName) ->
+  show: (viewName, options = {}) ->

     super

@@ -50,7 +52,11 @@
     for _view, item of @getOption 'views'

       if _view is viewName
-        @title.updatePartial item.title
+        if item.title?
+          @title.updatePartial item.title
+          @title.show()
+        else
+          @title.hide()
         @setClass item.cssClass
         item.view.show()

@@ -58,9 +64,31 @@
         @unsetClass item.cssClass
         item.view.hide()

+    { expanded, collapsed = yes } = options
+    if expanded
+      do @expand
+    else if collapsed
+      do @collapse
+

   toggle: (viewName) ->

     if @hasClass 'hidden'
     then @show viewName
     else @hide()
+
+
+  hide: (internal = no) ->
+
+    return  if internal is yes and @hasClass 'pinned'
+
+    super
+
+    kd.singletons.windowController.revertKeyView()
+    @unsetClass 'pinned'
+
+
+  expand: ->
+
+    @emit FlexSplit.EVENT_EXPAND
+    @emit Events.GotFocus


add script

add script

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

--- roles/hubot/files/scripts/nutshell.coffee
+++ roles/hubot/files/scripts/nutshell.coffee
@@ -0,0 +1,18 @@
+# Description:
+# Nutshell
+#
+# Commands:
+# hubot nutshell - display the fictional O'RLY book "Nutshell in a Nutshell"
+# nutshell
+
+nutshellBook = 'http://i.imgur.com/hkFOVvJ.png'
+
+module.exports = (robot) ->
+  robot.hear /.*(nutshell).*/i, (msg) ->
+    r = Math.random()
+    if r <= 0.10
+      msg.send nuthshellBook
+
+  robot.respond /nutshell/i, (msg) ->
+    msg.send nuthshellBook
+


create Gruntfile.coffee template

create Gruntfile.coffee template

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

--- root/Gruntfile.coffee
+++ root/Gruntfile.coffee
@@ -0,0 +1,80 @@
+glob = require('glob')
+
+getJadeFiles = ->
+  ret = {}
+  files = glob.sync("src/**/*.jade").filter((file) ->
+    not file.match(/_layout\.jade$/)
+  ).forEach((file) ->
+    dest = file.replace(/^src/, "dest").replace(/jade$/, "html")
+    ret[dest] = file
+  )
+  ret
+
+getDeplyUploadFiles = ->
+  glob.sync("dest/**/*").map (path) ->
+    src: path
+    dest: path.replace("dest/", "")
+
+#global module:false
+module.exports = (grunt) ->
+
+  # Project configuration.
+  grunt.initConfig
+
+    # Metadata.
+    pkg: grunt.file.readJSON("package.json")
+    config: grunt.file.readJSON("config.json")
+
+    # Task configuration.
+    clean: ["dest"]
+    copy:
+      main:
+        files: [
+          expand: true
+          cwd: 'src/'
+          src: ["favicon.ico", "common/**/*", "img/*", "files/*"]
+          dest: "dest/"
+        ]
+    jade:
+      compile:
+        files: getJadeFiles()
+    connect:
+      server:
+        options:
+          port: process.env["PORT"] or 3000
+          base: "dest"
+    watch:
+      gruntfile:
+        files: "src/**/*"
+        tasks: ["compile"]
+    s3:
+      options:
+        key: "<%= config.aws.key %>"
+        secret: "<%= config.aws.secret %>"
+        bucket: "www.example.com"
+        access: "public-read"
+        endpoint: "s3-ap-northeast-1.amazonaws.com"
+      dev:
+        upload: getDeplyUploadFiles()
+
+  # These plugins provide necessary tasks.
+  grunt.loadNpmTasks "grunt-contrib-clean"
+  grunt.loadNpmTasks "grunt-contrib-connect"
+  grunt.loadNpmTasks "grunt-contrib-copy"
+  grunt.loadNpmTasks "grunt-contrib-jade"
+  grunt.loadNpmTasks "grunt-contrib-watch"
+  grunt.loadNpmTasks "grunt-s3"
+
+  # Compile task.
+  grunt.registerTask "compile", ["copy", "jade"]
+
+  # Default task.
+  grunt.registerTask "default", ["clean", "compile", "connect", "watch"]
+
+  # Deploy task.
+  grunt.registerTask "deploy", ["clean", "compile", "s3"]
+
+
+
+
+


Extends the Spine controller to support controller hierarchies, handle transitions and more.

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

--- controller.coffee
+++ controller.coffee
@@ -0,0 +1,277 @@
+Spine ?= require('spine')
+
+class ControllerHelper
+
+	@activate: (c) ->
+		unless @lineageIsBusy(c)
+			if !c.isActive()
+				return ControllerHelper.activateController(c)
+
+	@deactivate: (c) ->
+		unless @lineageIsBusy(c)
+			if c.isActive()
+				return ControllerHelper.deactivateController(c)
+
+	@toggle: (c) ->
+		if c.isActive()
+			return @deactivate c
+		else
+			return @activate c
+
+	@activateController: (c) ->
+		parent = c.getParent()
+
+		if parent
+			if parent.isActive()
+				siblings = parent.getChildren()
+				#console.log "Siblings: #{siblings}"
+				for sibling in siblings
+					if sibling.isActive()
+						sibling.setOnDeactivatedAction new ControllerAction(c, ControllerAction.TYPE_ACTIVATE)
+						return ControllerHelper.deactivateController(sibling)
+			else
+				parent.setOnActivatedAction new ControllerAction(c, ControllerAction.TYPE_ACTIVATE)
+				return ControllerHelper.activateController parent
+
+		return c.toState Controller.STATE_ACTIVATED
+
+	@deactivateController: (c)->
+		children = c.getChildren()
+		for child in children
+			if child.isActive()
+				child.setOnDeactivatedAction new ControllerAction(c, ControllerAction.TYPE_DEACTIVATE)
+				return ControllerHelper.deactivateController(child)
+
+		return c.toState Controller.STATE_DEACTIVATED
+
+	@lineageIsBusy: (c)->
+		parent = c.getParent()
+
+		if parent
+			return true if parent.isBusy()
+			while parent = parent.getParent()
+				return true if parent.isBusy()
+
+		return false
+
+	@onControllerActivated: (c)->
+		action = c.getOnActivatedAction()
+
+		if action
+			if action.getType() == ControllerAction.TYPE_ACTIVATE
+				ControllerHelper.activateController(action.getController())
+
+	@onControllerDeactivated: (c)->
+		action = c.getOnDeactivatedAction()
+
+		if action
+			if action.getType() == ControllerAction.TYPE_DEACTIVATE
+				ControllerHelper.deactivateController(action.getController())
+			else if action.getType() == ControllerAction.TYPE_ACTIVATE
+				ControllerHelper.activateController(action.getController())
+
+
+class ControllerAction
+	@TYPE_ACTIVATE = "activate"
+	@TYPE_DEACTIVATE = "deactivate"
+
+	constructor: (controller, type) ->
+		@controller = controller
+		@type = type
+
+	getType: ->
+		@type
+
+	getController: ->
+		@controller
+
+
+class StateMachine extends Spine.Module
+	@include Spine.Events
+
+	constructor: ->
+		@states = []
+		@currentState = null
+		@nextState = null
+		@initialState = null
+		@enabled = true
+
+	addState: (state, isInitialState=false)->
+		@states.push state
+		if isInitialState
+			@currentState = @initialState = state
+
+	activate: (state)->
+		if state in @states
+			if @enabled && @nextState == null && state != @currentState
+				@nextState = state
+				@trigger "on_transition", this, @currentState, @nextState
+				return true
+
+		return false
+
+	onTransitionComplete: ->
+		@currentState = @nextState
+		@nextState = null
+
+	getCurrentState: ->
+		@currentState
+
+	getNextState: ->
+		@nextState
+
+	enable: ->
+		@enabled = true
+
+	disable: ->
+		@enabled = false
+
+	reset: ->
+		@nextState = null
+		@currentState = @initialState
+
+
+
+
+class Controller extends Spine.Controller
+
+	@STATE_ACTIVATED = "activated"
+	@STATE_DEACTIVATED = "deactivated"
+
+	#
+	# Options:
+	# defaultChild		Controller
+	#
+
+	constructor: (options) ->
+		@sm = new StateMachine
+
+		@sm.addState Controller.STATE_DEACTIVATED, true
+		@sm.addState Controller.STATE_ACTIVATED
+
+		@sm.bind "on_transition", @transition
+		@children = []
+
+		@onActivatedAction = null
+		@onDeactivatedAction = null
+
+		super options
+
+		@prepare()
+
+	prepare: ->
+
+	addChild: (c, options={}) ->
+		c.setParent(@)
+		if options.default
+			@setDefaultChild(c)
+		@children.push c
+
+	removeChild: (c) ->
+		@children = @children.filter (child) -> child isnt c
+
+	toState: (state)->
+		@sm.activate(state)
+
+	activate: ->
+		ControllerHelper.activate(@)
+
+	deactivate: ->
+		ControllerHelper.deactivate(@)
+
+	reset: ->
+		@sm.reset()
+
+	toggle: ->
+		ControllerHelper.toggle(@)
+
+	doActivate: ->
+		# Override in subclass
+
+	doDeactivate: ->
+		# Override in subclass
+
+	onActivated: ->
+		@sm.onTransitionComplete()
+		ControllerHelper.onControllerActivated(@)
+		@onActivatedAction = null
+		@trigger "onActivated", @
+
+	onDeactivated: ->
+		@sm.onTransitionComplete()
+		ControllerHelper.onControllerDeactivated(@)
+		@onDeactivatedAction = null
+		@trigger "onDeactivated", @
+
+	# TODO: Make sure it's the correct SM
+	transition: (sm, from, to)=>
+		if to == Controller.STATE_ACTIVATED
+			@trigger "activating", @
+			@doActivate()
+		else if to == Controller.STATE_DEACTIVATED
+			@trigger "deactivating", @
+			@doDeactivate()
+
+	isActive: ->
+		@sm.getCurrentState() == Controller.STATE_ACTIVATED && @sm.getNextState() == null
+
+	isTransitioning: ->
+		@sm.getNextState() != null
+
+	isBusy: ->
+		return true if @isTransitioning() or @onActivatedAction or @onDeactivatedAction
+
+		for child in @children
+			return true if child.isBusy()
+
+		return false
+
+	getId: ->
+		@id
+
+	getChildren: ->
+		@children
+
+	getChildById: (id) ->
+		for child in @children
+			return child if child.getId() == id
+
+	getDescendantById: (id) ->
+		child = @getChildById(id)
+		if child
+			return child
+
+		for child in @children
+			descendant = child.getDescendantById(id)
+			if descendant
+				return descendant
+
+	getActiveController: ->
+		for child in @children
+			return child if child.isActive()
+
+	getParent: ->
+		#console.log "Controller.getParent #{@parent}"
+		@parent
+
+	setOnDeactivatedAction: (action) ->
+		@onDeactivatedAction = action
+
+	getOnDeactivatedAction: ->
+		@onDeactivatedAction
+
+	setOnActivatedAction: (action) ->
+		@onActivatedAction = action
+
+	getOnActivatedAction: ->
+		@onActivatedAction
+
+	setDefaultChild: (child) ->
+		@defaultChild = child
+
+	setParent: (parent) ->
+		#console.log "Controller.setParent #{parent}"
+		@parent = parent
+
+
+module.exports = Controller


Fix bug with upsert

Fix bug with upsert

--- server/methods/createDirectMessage.coffee
+++ server/methods/createDirectMessage.coffee
@@ -33,7 +33,7 @@
 		# Make user I have a subcription to this room
 		RocketChat.models.Subscriptions.upsert
 			rid: rid
-			'u._id': me._id
+			$and: [{'u._id': me._id}] # work around to solve problems with upsert and dot
 		,
 			$set:
 				ts: now
@@ -51,7 +51,7 @@
 		# Make user the target user has a subcription to this room
 		RocketChat.models.Subscriptions.upsert
 			rid: rid
-			'u._id': to._id
+			$and: [{'u._id': to._id}] # work around to solve problems with upsert and dot
 		,
 			$setOnInsert:
 				name: me.username


added dgshow script

added dgshow script

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

--- scripts/dgshow.coffee
+++ scripts/dgshow.coffee
@@ -0,0 +1,53 @@
+# Description:
+#   Grab dgshow episode urls
+#
+# Dependencies:
+#   None
+#
+# Configuration:
+#   None
+#
+# Commands:
+#   hubot dgshow ep[num]- Dave and Gunnar Show Episode <num>
+#   hubot dgshow latest - Most recent Dave and Gunnar Show episode
+#
+# Authors of xkcd script:
+#   twe4ked
+#   Hemanth (fixed the max issue)
+#
+# Author of dgshow script:
+#   ghelleks
+
+module.exports = (robot) ->
+  robot.respond /dgshow latest/i, (msg) ->
+    msg.http("http://dgshow.org/wp-json/posts")
+      .get() (err, res, body) ->
+        if res.statusCode == 404
+          msg.send 'Can\'t connect to the API.'
+        else
+          object = JSON.parse(body)[0]
+          msg.send object.title, object.link, object.excerpt
+
+  robot.respond /dgshow ep(\d+)/i, (msg) ->
+    num = "#{msg.match[1]}"
+
+    msg.http("http://dgshow.org/wp-json/posts?filter[s]=%23#{num}")
+      .get() (err, res, body) ->
+        if res.statusCode == 404
+          msg.send 'Episode #{num} not found.'
+        else
+          object = JSON.parse(body)[0]
+          msg.send object.title, object.link, object.excerpt
+
+  robot.respond /xkcd\s+random/i, (msg) ->
+    msg.http("http://xkcd.com/info.0.json")
+          .get() (err,res,body) ->
+            if res.statusCode == 404
+               max = 0
+            else
+               max = JSON.parse(body).num
+               num = Math.floor((Math.random()*max)+1)
+               msg.http("http://xkcd.com/#{num}/info.0.json")
+               .get() (err, res, body) ->
+                 object = JSON.parse(body)
+                 msg.send object.title, object.img, object.alt


Add test script using Dialog

Add test script using Dialog

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

--- scripts/dialog.coffee
+++ scripts/dialog.coffee
@@ -0,0 +1,27 @@
+Path = require "path"
+Dialog = require Path.join __dirname, "..", "src", "dialog"
+
+module.exports = (robot) ->
+
+  # robot.hear /.*/i, (msg) ->
+  #   dialog = Dialog.getDialog msg.envelope.user.name, msg.envelope.room
+  #   console.log dialog
+  #   dialog?.callback.call dialog, msg
+
+  robot.respond /dialog/i, (msg) ->
+    msg.send "listen dialog"
+
+    dialog = new Dialog msg, (msg) ->
+      text = msg.envelope.message.text
+      if /Bye/i.test text
+        @.end()
+        msg.send "Bye"
+        return
+      else if text.match /I'm a (.+)/i
+        @.set "name", RegExp.$1
+
+      name = @.get("name") or "you"
+      msg.send "#{name}: #{msg.envelope.message.text}"
+
+    #Dialog.addDialog dialog
+    Dialog.listen robot


delayed Events

delayed Events

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

--- src/engine_delay.coffee
+++ src/engine_delay.coffee
@@ -0,0 +1,43 @@
+###*
+The Delay module provides methods to trigger events after a number of steps have passed.
+
+@name Delay
+@fieldOf Engine
+@module
+@param {Object} I Instance variables
+@param {Object} self Reference to the engine
+###
+Engine.Delay = (I, self) ->
+  delayedEvents = []
+
+  self.bind 'afterUpdate', ->
+    [delayedEvents, firingEvents] = delayedEvents.partition (event) ->
+      (event.delay -= 1) >= 0
+
+    firingEvents.each (event) ->
+      event.callback()
+
+    return
+
+  ###*
+  Execute a callback after a number of steps have passed.
+
+

+  engine.delay 5, ->
+
+

+
+  @name delay
+  @methodOf Engine#
+  @param {Number} steps The number of steps to wait before executing the callback
+  @param {Function} callback The callback to be executed.
+
+  @returns {Engine} self
+  ###
+  delay: (steps, callback) ->
+    delayedEvents.push
+      delay: steps
+      callback: callback
+
+    return self
+


it wouldnt be #arrakis with out a bot to insult you

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

--- scripts/insult.coffee
+++ scripts/insult.coffee
@@ -0,0 +1,32 @@
+# Description:
+#   Allows Hubot to lambast someone with a random insult
+#
+# Dependencies:
+#   "cheerio: "0.7.0"
+#
+# Configuration:
+#   None
+#
+# Commands:
+#   hubot insult <name> - give <name> the what-for
+#
+# Author:
+#   ajacksified, brandonvalentine
+
+cheerio = require('cheerio')
+
+module.exports = (robot) ->
+  robot.respond /insult (.*)/i, (msg) ->
+    name = msg.match[1].trim()
+    insult(msg, name)
+
+insult = (msg, name) ->
+  msg
+    .http("http://www.randominsults.net")
+    .header("User-Agent: Insultbot for Hubot (+https://github.com/github/hubot-scripts)")
+    .get() (err, res, body) ->
+      msg.send "#{name}: #{getQuote body}"
+
+getQuote = (body) ->
+  $ = cheerio.load(body)
+  $('i').text()


Added contextmenu

Added contextmenu

Added contextmenu

--- app/views/editor/level/thangs_tab_view.coffee
+++ app/views/editor/level/thangs_tab_view.coffee
@@ -21,7 +21,7 @@
   "physics.Physical"          : "524b75ad7fc0f6d519000001"

 class ThangTypeSearchCollection extends CocoCollection
-  url: '/db/thang.type/search?project=true'
+  url: '/db/thang.type/search?project=original,name,version,slug,kind,components'
   model: ThangType

 module.exports = class ThangsTabView extends View
@@ -61,16 +61,16 @@
     super options
     @world = options.world
     @thangTypes = @supermodel.getCollection new ThangTypeSearchCollection()  # should load depended-on Components, too
-    @thangTypes.once 'sync', @onThangTypesLoaded
+    @listenToOnce(@thangTypes, 'sync', @onThangTypesLoaded)
     @thangTypes.fetch()
     $(document).bind 'contextmenu', @preventDefaultContextMenu

     # just loading all Components for now: https://github.com/codecombat/codecombat/issues/405
     @componentCollection = @supermodel.getCollection new ComponentsCollection()
-    @componentCollection.once 'sync', @onComponentsLoaded
+    @listenToOnce(@componentCollection, 'sync', @onComponentsLoaded)
     @componentCollection.fetch()

-  onThangTypesLoaded: =>
+  onThangTypesLoaded: ->
     return if @destroyed
     @supermodel.addCollection @thangTypes
     @supermodel.populateModel model for model in @thangTypes.models
@@ -78,7 +78,7 @@
     @render()  # do it again but without the loading screen
     @onLevelLoaded level: @level if @level and not @startsLoading

-  onComponentsLoaded: =>
+  onComponentsLoaded: ->
     return if @destroyed
     @supermodel.addCollection @componentCollection
     @startsLoading = not @thangTypes.loaded
@@ -188,11 +188,14 @@
   onSpriteMouseDown: (e) ->
     # Sprite clicks happen after stage clicks, but we need to know whether a sprite is being clicked.
     clearTimeout @backgroundAddClickTimeout
+    if e.originalEvent.nativeEvent.button == 2
+      @onSpriteContextMenu e

   onStageMouseDown: (e) ->
     if @addThangSprite
       # If we click on the background, we need to add @addThangSprite, but not if onSpriteMouseDown will fire.
       @backgroundAddClickTimeout = _.defer => @onExtantThangSelected {}
+    $('#contextmenu').hide()

   onSpriteDragged: (e) ->
     return unless @selectedExtantThang and e.thang?.id is @selectedExtantThang?.id
@@ -222,7 +225,7 @@

   # TODO: figure out a good way to have all Surface clicks and Treema clicks just proxy in one direction, so we can maintain only one way of handling selection and deletion
   onExtantThangSelected: (e) ->
-    @selectedExtantSprite?.setNameLabel null unless @selectedExtantSprite is e.sprite
+    @selectedExtantSprite?.setNameLabel? null unless @selectedExtantSprite is e.sprite
     @selectedExtantThang = e.thang
     @selectedExtantSprite = e.sprite
     if e.thang and (key.alt or key.meta)
@@ -239,7 +242,7 @@
         @selectedExtantSprite.setNameLabel @selectedExtantSprite.thangType.get('name') + ': ' + @selectedExtantThang.id
         if not treemaThang.isSelected()
           treemaThang.select()
-          @thangsTreema.$el.scrollTop(@thangsTreema.$el.find('.treema-children .treema-selected')[0].offsetTop)
+          @thangsTreema.$el.scrollTop(@thangsTreema.$el.find('.treema-children .treema-selected')[0].offsetTop)
     else if @addThangSprite
       # We clicked on the background when we had an add Thang selected, so add it
       @addThang @addThangType, @addThangSprite.thang.pos
@@ -421,7 +424,7 @@
     @editThangView = null
     @onThangsChanged()
     @$el.find('.thangs-column').show()
-
+
   preventDefaultContextMenu: (e) ->
     e.preventDefault()

@@ -445,7 +448,6 @@
       e.target = $(".add-thang-palette-icon[data-thang-type='" + thang + "']").get 0
     @selectAddThang e

-
 class ThangsNode extends TreemaNode.nodeMap.array
   valueClass: 'treema-array-replacement'
   getChildren: ->


Main entry point because it feels cleaner.

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

--- src/scripts/main.coffee
+++ src/scripts/main.coffee
@@ -0,0 +1,22 @@
+$( ->
+    audioContext = new (window.AudioContext || window.webkitAudioContext)();
+    syntho = new Syntho(audioContext)
+    ui = new SynthUI(syntho)
+    kbd = new KeyboardInput
+    freqMap = new FrequencyMap
+
+
+    # connect the physical keyboard to the VCOs
+    callback = (message, note) ->
+        if note >= 0
+            syntho.vco1.frequency.setValueAtTime(freqMap.getFrequency(syntho.vco1.octave, note), audioContext.currentTime)
+            syntho.vco2.frequency.setValueAtTime(freqMap.getFrequency(syntho.vco2.octave, note), audioContext.currentTime)
+            syntho.gate.gain.value = 1
+        else
+            syntho.gate.gain.value = 0
+
+
+
+    PubSub.subscribe('Keyboard', callback)
+
+)


Modifications to tracking of home page hub entrypoint experiment (on desktop) (#4825)

Modifications to tracking of home page hub entrypoint experiment (on desktop)

--- src/desktop/apps/home/client/index.coffee
+++ src/desktop/apps/home/client/index.coffee
@@ -28,24 +28,24 @@
     new HomeAuthRouter
     Backbone.history.start pushState: true

-    targetElement = if sd.HOMEPAGE_COLLECTION_HUB_ENTRYPOINTS_TEST is "experiment" then ".home-hubs-entry" else ".home-browse-module"
-
-    # Remove after closing the homepage hubs entry points test
-    $(targetElement).waypoint(() ->
-      # Fire impression event
-      analytics.track("Impression", {
-        context_page: "Home",
-        context_module: "HubEntrypoint",
-        subject: "Featured Categories",
+    if !sd.CURRENT_USER
+      isExperiment = sd.HOMEPAGE_COLLECTION_HUB_ENTRYPOINTS_TEST is "experiment"
+      targetElement = if isExperiment then ".home-hubs-entry" else ".home-browse-module"
+      # Remove after closing the homepage hubs entry points test
+      $(targetElement).waypoint(() ->
+        # Fire impression event
+        analytics.track("Impression", {
+          context_page: "Home",
+          context_module: "HubEntrypoint",
+          subject: if isExperiment then "Featured Categories" else "Browse Works for Sale",
+        })
+        # Fire experiment or control viewed event
+        splitTest("homepage_collection_hub_entrypoints_test").view()
+      ,
+      {
+        triggerOnce: true,
+        offset: 500,
       })
-      # Fire experiment viewed event
-      splitTest("homepage_collection_hub_entrypoints_test").view()
-    ,
-    {
-      triggerOnce: true,
-      offset: 500,
-    }
-    )

     # Render Featured Sections
     @setupHeroUnits()


Every share is now recalculated when new action is entered

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/CO-OPEN/Mangos.git/'


modified

modified

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


Update closure.cson

Update closure.cson


Update atomatigit.coffee

Update atomatigit.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/aki77/atomatigit.git/'


Specs for Stream handling status quo

Specs for Stream handling status quo

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

--- test/stream.test.coffee
+++ test/stream.test.coffee
@@ -0,0 +1,58 @@
+assert = require 'assert'
+http = require 'http'
+Stream = require(__dirname + '/../src/stream')
+
+# Fake Flowdock Streaming API, do whatever you want
+class Mockdock extends process.EventEmitter
+  request: (req, res) =>
+    @emit 'request', req, res
+  constructor: (@port) ->
+    server = http.createServer @request
+    server.listen(@port)
+
+ephemeralPort = ->
+  range = [49152..65535]
+  range[Math.floor(Math.random() * range.length)]
+
+describe 'Stream', ->
+  describe 'response', ->
+    mockdock = new Mockdock(ephemeralPort())
+
+    beforeEach ->
+      process.env.FLOWDOCK_STREAM_URL = "http://localhost:#{mockdock.port}"
+
+    it 'emits error event if response is not successful', (done) ->
+      mockdock.once 'request', (req, res) ->
+        res.writeHead 401
+        res.end()
+
+      stream = Stream.connect('foobar', ['example:main'])
+      stream.on 'error', (status, message) ->
+        assert.equal status, 401
+        done()
+
+    it 'emits end when response ends', (done) ->
+      mockdock.once 'request', (req, res) ->
+        res.writeHead 200
+        res.end()
+
+      stream = Stream.connect('foobar', ['example:main'])
+      stream.on 'end', ->
+        done()
+
+    it 'emits messages', (done) ->
+      mockdock.once 'request', (req, res) ->
+        res.writeHead 200
+        res.write JSON.stringify(
+          id: 1
+          event: 'message'
+          content: 'test'
+          flow: 'example:main'
+        )
+        res.write '\r\n'
+        res.end()
+
+      stream = Stream.connect 'foobar', ['example:main']
+      stream.on 'message', (message) ->
+        assert.equal message.event, 'message'
+        done()


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


bug fixes

bug fixes


Test Docas.io

Test Docas.io

--- src/fairy.coffee
+++ src/fairy.coffee
@@ -110,8 +110,8 @@
 # When `SIGINT` (e.g. `Control-C`), `SIGHUP` or `SIGUSR2` is received,
 # gracefully exit by notifying all workers entering cleanup mode and exit after
 # all cleaned up.
-process.on 'SIGINT',  enter_cleanup_mode
-process.on 'SIGHUP',  enter_cleanup_mode
+process.on 'SIGINT', enter_cleanup_mode
+process.on 'SIGHUP', enter_cleanup_mode
 process.on 'SIGQUIT', enter_cleanup_mode
 process.on 'SIGSTOP', enter_cleanup_mode
 process.on 'SIGUSR1', enter_cleanup_mode


Removed dataupdate event binder

Removed dataupdate event binder

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


added index

added index

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

--- index.coffee
+++ index.coffee
@@ -0,0 +1,12 @@
+fs = require 'fs'
+path = require 'path'
+
+module.exports = (robot, scripts) ->
+  scriptsPath = path.resolve(__dirname, 'src')
+  fs.exists scriptsPath, (exists) ->
+    if exists
+      for script in fs.readdirSync(scriptsPath)
+        if scripts? and '*' not in scripts
+          robot.loadFile(scriptsPath, script) if script in scripts
+        else
+          robot.loadFile(scriptsPath, script)


[driver] also chmod the file with --run

[driver] also chmod the file with --run

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


added index file so the script will, you know, work


Update analytics test with ES config and namespace

--- test/analytics.coffee
+++ test/analytics.coffee
@@ -12,6 +12,8 @@

 # started an hour ago
 start_time = Number(new Date) - 60*60*1000
+
+config = es_uri:"es://localhost:9200/stream-test", finalize_secs:-1

 START =
     type:           "session_start"
@@ -36,7 +38,7 @@

     before (done) ->
         # connect to the db
-        _uri = URL.parse(nconf.get("analytics:es_uri"))
+        _uri = URL.parse(config.es_uri)

         es = new elasticsearch.Client
             host:       "http://#{_uri.hostname}:#{_uri.port||9200}"
@@ -69,7 +71,7 @@
         logger = new Logger {}

         it "starts up using config options", (done) ->
-            analytics = new Analytics config:nconf.get("analytics"), log:logger, (err) ->
+            analytics = new Analytics config:config, log:logger, (err) ->
                 expect(err).to.be.null

                 expect(analytics).to.be.instanceof(Analytics)
@@ -125,7 +127,6 @@

     describe "Session Start", ->
         it "stores a session start", (done) ->
-            console.log "Storing session #{ START.client.session_id }"
             analytics._log START, (err) ->
                 expect(err).to.be.null
                 done()


Add bluebirdjs compatibility module

Add bluebirdjs compatibility module

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

--- src/bbjscompat.coffee
+++ src/bbjscompat.coffee
@@ -0,0 +1,20 @@
+# http://bluebirdjs.com/docs/api/finally.html
+unless Promise::finally
+  Promise::finally = (handler) ->
+    return @then(
+      (value) ->
+        pass = -> Promise.resolve(value)
+        return Promise.resolve().then(->
+          return handler()
+        ).then(pass, pass)
+      (error) ->
+        pass = -> Promise.reject(error)
+        return Promise.resolve().then(->
+          return handler()
+        ).then(pass, pass)
+    )
+
+# http://bluebirdjs.com/docs/api/finally.html
+unless Promise::lastly
+  Promise::lastly = Promise::finally
+


Update node-webkit version

Update node-webkit version

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


Add uptime.coffee

Add uptime.coffee

- hubot uptime

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

--- src/scripts/uptime.coffee
+++ src/scripts/uptime.coffee
@@ -0,0 +1,37 @@
+# Outputs bot uptime
+
+module.exports = (robot) ->
+
+  start = new Date().getTime()
+
+  robot.respond /uptime/i, (msg) ->
+    uptimeMe msg, start, (uptime) ->
+      msg.send uptime
+
+numPlural = (num) ->
+  if num != 1 then 's' else ''
+
+uptimeMe = (msg, start, cb) ->
+  now = new Date().getTime()
+  uptime_seconds = Math.floor((now - start) / 1000)
+  intervals = {}
+  intervals.day = Math.floor(uptime_seconds / 86400)
+  intervals.hour = Math.floor((uptime_seconds % 86400) / 3600)
+  intervals.minute = Math.floor(((uptime_seconds % 86400) % 3600) / 60)
+  intervals.second = ((uptime_seconds % 86400) % 3600) % 60
+
+  elements = []
+  for own interval, value of intervals
+    if value > 0
+      elements.push value + ' ' + interval + numPlural(value)
+
+  last
+  if elements.length > 1
+    last = elements.pop()
+    response = elements.join ', '
+    response += ' and ' + last if last
+  else
+    response = elements.join ', '
+
+  cb 'I\'ve been sentient for ' + response
+


added autoRepeat flag in RepeaterMixin

added autoRepeat flag in RepeaterMixin

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


Fix a bug

Fix a bug

--- views/components/main/parts/task-panel.cjsx
+++ views/components/main/parts/task-panel.cjsx
@@ -67,6 +67,7 @@
     {tasks} = @state
     switch path
       when '/kcsapi/api_get_member/questlist'
+        return unless body.api_list?
         for task in body.api_list
           continue if task is -1 || task.api_state < 2
           # Determine progress


Increase size of autocomplete popup

Increase size of autocomplete popup

--- app/views/play/level/tome/SpellView.coffee
+++ app/views/play/level/tome/SpellView.coffee
@@ -204,6 +204,8 @@
         text: false
       autoLineEndings:
         javascript: ';'
+      popupFontSizePx: 16
+      popupWidthPx: 380

   updateAutocomplete: (@autocomplete) ->
     @zatanna?.set 'snippets', @autocomplete


Properly ended HoC sale price.

Properly ended HoC sale price.

--- app/views/play/modal/SubscribeModal.coffee
+++ app/views/play/modal/SubscribeModal.coffee
@@ -45,7 +45,7 @@
     popoverContent = "
" + $.i18n.t('subscribe.parents_blurb1') + "
"
     popoverContent += "
" + $.i18n.t('subscribe.parents_blurb2') + "
"
     popoverContent += "
" + $.i18n.t('subscribe.parents_blurb3') + "
"
-    popoverContent = popoverContent.replace /9[.,]99/g, '5.99'  # Sale
+    #popoverContent = popoverContent.replace /9[.,]99/g, '5.99'  # Sale
     window.popoverContent = popoverContent
     @$el.find('#parents-info').popover(
       animation: true


Fixed saving new settings for a level.

Fixed saving new settings for a level.

--- app/views/editor/level/settings_tab_view.coffee
+++ app/views/editor/level/settings_tab_view.coffee
@@ -51,5 +51,5 @@
   onSettingsChanged: (e) =>
     $('.level-title').text @settingsTreema.data.name
     for key in @editableSettings
-      continue unless @settingsTreema.data[key] is undefined
+      continue if @settingsTreema.data[key] is undefined
       @level.set key, @settingsTreema.data[key]


Fixed some issues with the thang editor.

--- app/views/editor/thang/ThangTypeEditView.coffee
+++ app/views/editor/thang/ThangTypeEditView.coffee
@@ -122,6 +122,7 @@
     canvas = @$el.find('#canvas')
     @stage = new createjs.Stage(canvas[0])
     @layerAdapter = new LayerAdapter({name:'Default', webGL: true})
+    @listenTo @layerAdapter, 'new-spritesheet', @onNewSpriteSheet
     @stage.addChild(@layerAdapter.container)
     @camera?.destroy()
     @camera = new Camera canvas
@@ -228,15 +229,10 @@
   # animation select

   refreshAnimation: =>
+    @thangType.buildActions()
     return @showRasterImage() if @thangType.get('raster')
     options = @getLankOptions()
     console.log 'refresh animation....'
-#    @thangType.resetSpriteSheetCache()
-#    spriteSheet = @thangType.buildSpriteSheet(options)
-#    $('#spritesheets').empty()
-#    return unless spriteSheet
-#    for image in spriteSheet._images
-#      $('#spritesheets').append(image)
     @showAnimation()
     @updatePortrait()

@@ -245,6 +241,12 @@
     @currentLank?.destroy()
     @currentLank = sprite
     @showSprite(sprite.sprite)
+    @updateScale()
+
+  onNewSpriteSheet: ->
+    $('#spritesheets').empty()
+    for image in @layerAdapter.spriteSheet._images
+      $('#spritesheets').append(image)
     @updateScale()

   showAnimation: (animationName) ->
@@ -334,8 +336,8 @@
     @scale = scaleValue
     @$el.find('.scale-label').text " #{fixed}x "
     if @currentLank
-      @currentLank.scaleFactorX = @currentLank.scaleFactorY = scaleValue
-      @currentLank.updateScale()
+      @currentLank.sprite.scaleX = @currentLank.sprite.baseScaleX * scaleValue
+      @currentLank.sprite.scaleY = @currentLank.sprite.baseScaleY * scaleValue
     else if @currentObject?
       @currentObject.scaleX = @currentObject.scaleY = scaleValue / resValue
     @updateGrid()


Include ImageSizes for featured links

Include ImageSizes for featured links

--- models/featured_link.coffee
+++ models/featured_link.coffee
@@ -4,9 +4,11 @@
 LayoutSyle = require './mixins/layout_style.coffee'
 { Image, Markdown } = require 'artsy-backbone-mixins'
 { SECURE_IMAGES_URL } = require('sharify').data
+ImageSizes = require './mixins/image_sizes.coffee'

 module.exports = class FeaturedLink extends Backbone.Model
   _.extend @prototype, Image(SECURE_IMAGES_URL)
+  _.extend @prototype, ImageSizes
   _.extend @prototype, Markdown
   _.extend @prototype, LayoutSyle

@@ -15,3 +17,6 @@

   hasImageForLayout: (collectionLength) ->
     @hasImage @imageSizeForLayout collectionLength
+
+  imageUrlForMaxSize: ->
+    @get('image_urls')?.large_rectangle


removed production minification

removed production minification

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/NewSpring/norma-markup.git/'


Add Atom initialiser script

Add Atom initialiser script

Although this is an empty script, it's been symlinked from my .atom user
directory (along with my "keymap.cson" and "config.cson" files). Suppose
it's best to remain consistent.

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

--- .config/init.coffee
+++ .config/init.coffee
@@ -0,0 +1,11 @@
+# Your init script
+#
+# Atom will evaluate this file each time a new window is opened. It is run
+# after packages are loaded/activated and after the previous editor state
+# has been restored.
+#
+# An example hack to log to the console when each text editor is saved.
+#
+# atom.workspace.observeTextEditors (editor) ->
+#   editor.onDidSave ->
+#     console.log "Saved! #{editor.getPath()}"


I will have to start adding tests for these

--- chrome/content/zotero-better-bibtex/cayw.coffee
+++ chrome/content/zotero-better-bibtex/cayw.coffee
@@ -66,31 +66,6 @@

   getItems: -> Q.fcall(-> [])

-  scannableCiteLocator: {
-    article: "art."
-    chapter: "ch."
-    subchapter: "subch."
-    column: "col."
-    figure: "fig."
-    line: "l."
-    note: "n."
-    issue: "no."
-    opus: "op."
-    page: "p."
-    paragraph: "para."
-    subparagraph: "subpara."
-    part: "pt."
-    rule: "r."
-    section: "sec."
-    subsection: "subsec."
-    Section: "Sec."
-    'sub verbo': "sv."
-    schedule: "sch."
-    title: "tit."
-    verse: "vrs."
-    volume: "vol."
-  }
-
   accept: (progressCallback) ->
     progressCallback.call(null, 100) if progressCallback
     citation = []
@@ -146,6 +121,31 @@
     return '[' + citation.join(';') + ']'

   'scannable-cite': (citations) ->
+    scannableCiteLocator: {
+      article: "art."
+      chapter: "ch."
+      subchapter: "subch."
+      column: "col."
+      figure: "fig."
+      line: "l."
+      note: "n."
+      issue: "no."
+      opus: "op."
+      page: "p."
+      paragraph: "para."
+      subparagraph: "subpara."
+      part: "pt."
+      rule: "r."
+      section: "sec."
+      subsection: "subsec."
+      Section: "Sec."
+      'sub verbo': "sv."
+      schedule: "sch."
+      title: "tit."
+      verse: "vrs."
+      volume: "vol."
+    }
+
     formatted = []
     for citation in citations
       item = Zotero.Items.get(citation.id)
@@ -155,7 +155,7 @@
         when item.libraryID then "zg:#{item.libraryID}:#{item.key}"
         when Zotero.userID then "zu:#{Zotero.userID}:#{item.key}"
         else "zu:0:#{item.key}"
-      locator = if citation.locator then "#{@scannableCiteLocator[citation.label]} #{citation.locator}" else ''
+      locator = if citation.locator then "#{scannableCiteLocator[citation.label]} #{citation.locator}" else ''
       citation.prefix ?= ''
       citation.suffix ?= ''


activity: add single message route

activity: add single message route

error: pathspec 'client/activity/lib/routes/singlemessage.coffee' did not match any file(s) known to git

--- client/activity/lib/routes/singlemessage.coffee
+++ client/activity/lib/routes/singlemessage.coffee
@@ -0,0 +1,12 @@
+{ message: messageActions } = require('activity/flux').actions
+
+module.exports = class SingleMessageRoute
+
+  constructor: ->
+
+    @path = ':postId'
+
+
+  onEnter: (nextState) -> messageActions.changeSelectedMessage nextState.params.postId
+
+  onLeave: -> messageActions.changeSelectedMessage null


pricing: update developer plan resource quotas

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


destroyPointer fixed

destroyPointer fixed


added deal_codes to basket item getPostData method

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/Bogdan-p/bookingbug-angular.git/'


Correctly detect IE touch

Correctly detect IE touch

--- bokehjs/src/coffee/common/ui_events.coffee
+++ bokehjs/src/coffee/common/ui_events.coffee
@@ -90,7 +90,7 @@
     # This is a hack for laptops with touch screen who may be pinching or scrolling
     # in order to use the wheel zoom tool. If it's a touch screen the WheelZoomTool event
     # will be linked to pinch. But we also want to trigger in the case of a scroll.
-    if 'ontouchstart' of window or navigator.maxTouchPoints
+    if 'ontouchstart' of window or navigator.maxTouchPoints > 0
       if et == 'pinch'
         logger.debug("Registering scroll on touch screen")
         tool_view.listenTo(@, "scroll:#{id}", tool_view["_scroll"])


Create remind.coffee

Create remind.coffee

Added remind script

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

--- scripts/remind.coffee
+++ scripts/remind.coffee
@@ -0,0 +1,99 @@
+# Description:
+#   Forgetful? Add reminders
+#
+# Dependencies:
+#   None
+#
+# Configuration:
+#   None
+#
+# Commands:
+#   hubot remind me in <time> to <action> - Set a reminder in <time> to do an <action> <time> is in the format 1 day, 2 hours, 5 minutes etc. Time segments are optional, as are commas
+#
+# Author:
+#   whitman
+
+class Reminders
+  constructor: (@robot) ->
+    @cache = []
+    @current_timeout = null
+
+    @robot.brain.on 'loaded', =>
+      if @robot.brain.data.reminders
+        @cache = @robot.brain.data.reminders
+        @queue()
+
+  add: (reminder) ->
+    @cache.push reminder
+    @cache.sort (a, b) -> a.due - b.due
+    @robot.brain.data.reminders = @cache
+    @queue()
+
+  removeFirst: ->
+    reminder = @cache.shift()
+    @robot.brain.data.reminders = @cache
+    return reminder
+
+  queue: ->
+    clearTimeout @current_timeout if @current_timeout
+    if @cache.length > 0
+      now = new Date().getTime()
+      @removeFirst() until @cache.length is 0 or @cache[0].due > now
+      if @cache.length > 0
+        trigger = =>
+          reminder = @removeFirst()
+          @robot.reply reminder.msg_envelope, 'you asked me to remind you to ' + reminder.action
+          @queue()
+        # setTimeout uses a 32-bit INT
+        extendTimeout = (timeout, callback) ->
+          if timeout > 0x7FFFFFFF
+            @current_timeout = setTimeout ->
+              extendTimeout (timeout - 0x7FFFFFFF), callback
+            , 0x7FFFFFFF
+          else
+            @current_timeout = setTimeout callback, timeout
+        extendTimeout @cache[0].due - now, trigger
+
+class Reminder
+  constructor: (@msg_envelope, @time, @action) ->
+    @time.replace(/^\s+|\s+$/g, '')
+
+    periods =
+      weeks:
+        value: 0
+        regex: "weeks?"
+      days:
+        value: 0
+        regex: "days?"
+      hours:
+        value: 0
+        regex: "hours?|hrs?"
+      minutes:
+        value: 0
+        regex: "minutes?|mins?"
+      seconds:
+        value: 0
+        regex: "seconds?|secs?"
+
+    for period of periods
+      pattern = new RegExp('^.*?([\\d\\.]+)\\s*(?:(?:' + periods[period].regex + ')).*$', 'i')
+      matches = pattern.exec(@time)
+      periods[period].value = parseInt(matches[1]) if matches
+
+    @due = new Date().getTime()
+    @due += ((periods.weeks.value * 604800) + (periods.days.value * 86400) + (periods.hours.value * 3600) + (periods.minutes.value * 60) + periods.seconds.value) * 1000
+
+  dueDate: ->
+    dueDate = new Date @due
+    dueDate.toLocaleString()
+
+module.exports = (robot) ->
+
+  reminders = new Reminders robot
+
+  robot.respond /remind me in ((?:(?:\d+) (?:weeks?|days?|hours?|hrs?|minutes?|mins?|seconds?|secs?)[ ,]*(?:and)? +)+)to (.*)/i, (msg) ->
+    time = msg.match[1]
+    action = msg.match[2]
+    reminder = new Reminder msg.envelope, time, action
+    reminders.add reminder
+    msg.send 'I\'ll remind you to ' + action + ' on ' + reminder.dueDate()


Javascript widget fixed

Javascript widget fixed

--- app/assets/javascripts/merge_requests.js.coffee
+++ app/assets/javascripts/merge_requests.js.coffee
@@ -27,7 +27,7 @@
     this.$el.find(selector)

   initMergeWidget: ->
-    this.showState( @opts.current_state )
+    this.showState( @opts.current_status )

     if this.$('.automerge_widget').length and @opts.check_enable
       $.get @opts.url_to_automerge_check, (data) =>


fix(table-detail):check column error only when editing

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


Configures watch task

Configures watch task

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

--- grunt/watch.coffee
+++ grunt/watch.coffee
@@ -0,0 +1,5 @@
+module.exports = (grunt) ->
+  grunt.config 'watch',
+    script:
+      files: '{src,test}/**/*.coffee'
+      tasks: 'script'


correct link format

correct link format

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


Add test.

Add test.

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

--- test/bofh_test.coffee
+++ test/bofh_test.coffee
@@ -0,0 +1,16 @@
+chai = require 'chai'
+sinon = require 'sinon'
+chai.use require 'sinon-chai'
+
+expect = chai.expect
+
+describe 'bofh', ->
+  beforeEach ->
+    @robot =
+      respond: sinon.spy()
+      hear: sinon.spy()
+
+    require('../src/bofh')(@robot)
+
+  it 'registers a respond listener', ->
+    expect(@robot.respond).to.have.been.calledWith(/bofh me/)


Add test suite for callbacks

Add test suite for callbacks

* Initially test that `onExit` is called when exiting
* Also ensures it gets called within 500ms so it’s an acceptable
replacement for the removed `exit` test from basic suite.

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

--- test/callbacks.coffee
+++ test/callbacks.coffee
@@ -0,0 +1,53 @@
+vows    = require 'vows'
+assert  = require 'assert'
+phantom = require '../phantom'
+Promise = require 'bluebird'
+
+describe = (name, bat) -> vows.describe(name).addBatch(bat).export(module)
+
+# Make coffeescript not return anything
+# This is needed because vows topics do different things if you have a return value
+t = (fn) ->
+  ->
+    fn.apply this, arguments
+    return
+
+# Inject an `onExit` callback on `create` to resolve this promise.
+exitPromise = new Promise (resolve) ->
+  wrapCreate = (p) ->
+    _cached = p.create
+    wrapped = false
+
+    p.create = (args...) ->
+      for arg, idx in args when typeof arg is 'object'
+        args[idx]['onExit'] = resolve
+        wrapped = true
+        break
+
+      args.push {onExit: resolve} unless wrapped is true
+      _cached.apply phantom, args
+
+  wrapCreate phantom
+
+describe "The phantom module (callbacks)",
+  "Can create an instance":
+    topic: t ->
+      phantom.create {port: 12305}, (ph) =>
+        @callback null, ph
+
+    "which, when you call exit()":
+      topic: t (ph) ->
+        countdown = null
+
+        exitPromise.then =>
+          clearTimeout countdown
+          @callback null, 'success'
+
+        ph.exit()
+
+        countdown = setTimeout =>
+          @callback 'timeout'
+        , 500
+
+      "runs the onExit callback within 500ms": (status) ->
+        assert.equal status, 'success'


lightbox-factory spec

lightbox-factory spec

error: pathspec 'app/modules/services/lightbox-factory.service.spec.coffee' did not match any file(s) known to git

--- app/modules/services/lightbox-factory.service.spec.coffee
+++ app/modules/services/lightbox-factory.service.spec.coffee
@@ -0,0 +1,71 @@
+describe "tgLightboxFactory", ->
+    lightboxFactoryService = provide = null
+    mocks = {}
+
+    _mockRootScope = () ->
+        mocks.rootScope = sinon.stub()
+        provide.value "$rootScope", {$new: mocks.rootScope}
+
+    _mockCompile = () ->
+        mocks.compile = sinon.stub()
+        fn = () -> "
fake
"
+        mocks.compile.returns(fn)
+        provide.value "$compile", mocks.compile
+
+    _inject = (callback) ->
+        inject (_tgLightboxFactory_) ->
+            lightboxFactoryService = _tgLightboxFactory_
+            callback() if callback
+
+    _mocks = () ->
+        module ($provide) ->
+            provide = $provide
+            _mockRootScope()
+            _mockCompile()
+
+            return null
+
+    _setup = ->
+        _mocks()
+
+    beforeEach ->
+        module "taigaCommon"
+        _setup()
+        _inject()
+
+    it "insert directive", () ->
+        lightboxFactoryService.create("fake-directive")
+
+        expect($(document.body).find("#fake")).to.have.length(1)
+
+    it "directive must have the tg-bind-scope directive", () ->
+        lightboxFactoryService.create("fake-directive")
+
+        checkDirective = sinon.match ( (value) ->
+            return value.attr("tg-bind-scope")
+        ), "checkDirective"
+
+        expect(mocks.compile.withArgs(checkDirective)).to.have.been.calledOnce
+
+    it "custom attributes", () ->
+        attrs = {
+            "class": "x1",
+            "id": "x2"
+        }
+
+        lightboxFactoryService.create("fake-directive", attrs)
+
+        checkAttributes = sinon.match ( (value) ->
+            return value.attr("class") == "x1" && value.attr("id") == "x2"
+        ), "checkAttributes"
+
+        expect(mocks.compile.withArgs(checkAttributes)).to.have.been.calledOnce
+
+    it "directive has class remove-on-close", () ->
+        lightboxFactoryService.create("fake-directive")
+
+        checkClass = sinon.match ( (value) ->
+            return value.hasClass("remove-on-close")
+        ), "checkClass"
+
+        expect(mocks.compile.withArgs(checkClass)).to.have.been.calledOnce


LatLngBounds.union()

LatLngBounds.union()

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/michalsanger/globe-geometry.git/'


Throw meaningful error messages for policies bootstrap

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/ronaldcurtis/express-starter-app.git/'