Update zh-HANT.coffee

Update zh-HANT.coffee

--- app/locale/zh-HANT.coffee
+++ app/locale/zh-HANT.coffee
@@ -42,7 +42,7 @@
   diplomat_suggestion:
     title: "幫我們翻譯CodeCombat" # This shows up when a player switches to a non-English language using the language selector.
     sub_heading: "我們需要您的語言技能"
-    pitch_body: "我們開發了CodeCombat的英文版，但是現在我們的玩家遍佈全球。很多人想玩中文版的，卻不會說英文，所以如果你中英文都會，請考慮一下參加我們的翻譯工作，幫忙把 CodeCombat 網站還有所有的關卡翻譯成中文（繁体）。"
+    pitch_body: "我們開發了CodeCombat的英文版，但是現在我們的玩家遍佈全球。很多人想玩中文版的，卻不會說英文，所以如果您中英文都會，請考慮一下參加我們的翻譯工作，幫忙把 CodeCombat 網站還有所有的關卡翻譯成中文（繁体）。"
     missing_translations: "直至所有正體中文的翻譯完畢，當無法提供正體中文時還會以英文顯示。"
     learn_more: "關於成為外交官"
     subscribe_as_diplomat: "註冊成為外交官"
@@ -80,15 +80,15 @@
     awaiting_levels_adventurer_suffix: "成為第一個挑戰新關卡的冒險家吧!"
     adjust_volume: "調整音量"
     choose_your_level: "選取關卡" # The rest of this section is the old play view at /play-old and isn't very important.
-    adventurer_prefix: "你可以選擇以下任意關卡，或者討論以上的關卡 "
+    adventurer_prefix: "您可以選擇以下任意關卡，或者討論以上的關卡 "
     adventurer_forum: "冒險家論壇"
     adventurer_suffix: "."
     campaign_old_beginner: "舊的新手關卡"
     campaign_old_beginner_description: "...在這裡可以學到基礎程式技巧。"
     campaign_dev: "隨機關卡"
-    campaign_dev_description: "...在這裡你可以學到做一些較複雜的程式技巧。"
+    campaign_dev_description: "...在這裡您可以學到做一些較複雜的程式技巧。"
     campaign_multiplayer: "多人競技場"
-    campaign_multiplayer_description: "...在這裡你可以和其他玩家進行對戰。"
+    campaign_multiplayer_description: "...在這裡您可以和其他玩家進行對戰。"
     campaign_player_created: "玩家建立的關卡"
     campaign_player_created_description: "...挑戰同伴的創意 技術指導."
     campaign_classic_algorithms: "經典演算法"
@@ -254,14 +254,14 @@
     victory_title_prefix: ""
     victory_title_suffix: " 完成"
     victory_sign_up: "保存進度"
-    victory_sign_up_poke: "想保存你的程式碼？建立一個免費帳號吧！"
+    victory_sign_up_poke: "想保存您的程式碼？建立一個免費帳號吧！"
     victory_rate_the_level: "評估關卡: " # Only in old-style levels.
     victory_return_to_ladder: "返回天梯模式"
     victory_play_continue: "繼續"
     victory_saving_progress: "儲存進度"
     victory_go_home: "返回首頁" # Only in old-style levels.
     victory_review: "給我們回饋！" # Only in old-style levels.
-    victory_hour_of_code_done: "你完成了嗎？"
+    victory_hour_of_code_done: "您完成了嗎？"
     victory_hour_of_code_done_yes: "是的，我完成了我的程式碼！"
     victory_experience_gained: "取得經驗值"
     victory_gems_gained: "取得寶石"
@@ -304,29 +304,29 @@
     tip_theory_practice: "理論上, 理論和實作之間是沒有區別. 但是實作上, 這兩者是有區別的. - Yogi Berra"
     tip_error_free: "有兩種方式可以寫出沒有錯誤的程式; 但只有第三種可以達到預期效果. - Alan Perlis"
     tip_debugging_program: "如果除錯是一種清除錯誤的過程, 那麼編寫程式就是一種放置錯誤的過程. - Edsger W. Dijkstra"
-    tip_forums: "前往論壇並且告訴我們你所思考的!"
+    tip_forums: "前往論壇並且告訴我們您所思考的!"
     tip_baby_coders: "在未來, 就算小孩也能成為大法師."
     tip_morale_improves: "直到士氣提升之前，載入的動作將持續."
     tip_all_species: "我們相信所有民族都有平等的機會學習編寫程式"
     tip_reticulating: "網格狀鋸齒(指卡頓現象)"
     tip_harry: "巫師, "
     tip_great_responsibility: "隨著擁有強大的編程技巧，除錯的責任將越大."
-    tip_munchkin: "如果你不吃掉你的蔬菜，那小矮人將在你沈睡時找到你."
+    tip_munchkin: "如果您不吃掉您的蔬菜，那小矮人將在您沈睡時找到您."
     tip_binary: "只有2種人在這世上: 那些懂2進位的，和哪些不懂得."
     tip_commitment_yoda: "一個程序員必須擁有強烈的責任感和一顆認真的心. ~ Yoda"
     tip_no_try: "做，或者不做。這邊不存在嘗試的選項. - Yoda"
-    tip_patience: "年輕的學徒，你必須擁有耐心. - Yoda"
+    tip_patience: "年輕的學徒，您必須擁有耐心. - Yoda"
     tip_documented_bug: "一個寫在文件裡的錯誤不是錯誤;它是功能."
     tip_impossible: "事情總是看起來不可能直到它成真那刻. - Nelson Mandela"
-    tip_talk_is_cheap: "多說無益，公開你的代碼. - Linus Torvalds"
-    tip_first_language: "你經歷的第一門程式語言是最慘痛的事情. - Alan Kay"
+    tip_talk_is_cheap: "多說無益，公開您的代碼. - Linus Torvalds"
+    tip_first_language: "您經歷的第一門程式語言是最慘痛的事情. - Alan Kay"
     tip_hardware_problem: "Q: 換一顆燈泡需要多少位程序員?  A: 一位也不用, 它是個硬體問題."
-    tip_hofstadters_law: "Hofstadter定律: 完成一件複雜的事花費的時間總是超乎預期, 甚至你早已知道這個現象(Hofstadter定律)."
+    tip_hofstadters_law: "Hofstadter定律: 完成一件複雜的事花費的時間總是超乎預期, 甚至您早已知道這個現象(Hofstadter定律)."
     tip_premature_optimization: "過早的優化是萬惡之源. - Donald Knuth"
-    tip_brute_force: "當你游移不定時, 就是用暴力解. - Ken Thompson"
+    tip_brute_force: "當您游移不定時, 就是用暴力解. - Ken Thompson"
     tip_extrapolation: "只有2種人在這世上: 一種人是能夠根據不完整資訊而推斷..."
     tip_superpower: "編程讓我們最接近擁有超能力."
-    tip_control_destiny: "在真正的開源, 你有權利控制自己的命運. - Linus Torvalds"
+    tip_control_destiny: "在真正的開源, 您有權利控制自己的命運. - Linus Torvalds"
     tip_no_code: "在速度上，沒有任何代碼可以超過無代碼"
     tip_code_never_lies: "代碼從不說謊, 但註釋偶爾會. — Ron Jeffries"
     tip_reusable_software: "在軟體被重複使用前，它必須能用."
@@ -334,8 +334,8 @@
     tip_lines_of_code: "使用代碼行數來管理開發進度就好像使用秤重器來管理建造飛機. — Bill Gates"
     tip_source_code: "我想改變世界但他們不給我源代碼"
     tip_javascript_java: "Java和JavaScript的關係就好比馬和馬雲. - Chris Heilmann"
-    tip_move_forward: "不論你做啥, 持續前進. - Martin Luther King Jr."
-    tip_google: "擁有一個你不能解決的問題? Google它!"
+    tip_move_forward: "不論您做啥, 持續前進. - Martin Luther King Jr."
+    tip_google: "擁有一個您不能解決的問題? Google它!"
     tip_adding_evil: "增加一個邪惡之捏."
     tip_miss_lunch: "任何當使用電腦時就對時間無感之人, 傾向擁有夢想, 渴望夢想成真並且容易忘記吃飯. - Tim Berners-Lee"
     tip_hate_computers: "關於自我覺得恨透電腦的那群人. 其實他們真正應該恨的事情是糟糕的程序員. - Larry Niven"
@@ -389,7 +389,7 @@
     pile_gems: "一堆寶石"
     chest_gems: "一箱寶石"
     purchasing: "購買中..."
-    declined: "你的信用卡被拒絕"
+    declined: "您的信用卡被拒絕"
     retrying: "伺服器錯誤, 正在重試."
     prompt_title: "寶石不足"
     prompt_body: "想要取得更多?"
@@ -398,7 +398,7 @@
     or_subscribe: "或者3500顆寶石一個月, 如果您..."

   subscribe:
-    comparison_blurb: "訂閱CodeCombat來磨練你的技巧!"
+    comparison_blurb: "訂閱CodeCombat來磨練您的技巧!"
     feature1: "60個以上的基本關卡散佈在4張地圖中"
     feature2: "7個強壯的新英雄並每隻都有不同技巧!"
     feature3: "30個以上的額外關卡"
@@ -410,7 +410,7 @@
     subscribe_title: "訂閱"
     unsubscribe: "取消訂閱"
     confirm_unsubscribe: "確認訂閱"
-    never_mind: "沒關係，我仍然愛你"
+    never_mind: "沒關係，我仍然愛您"
     thank_you_months_prefix: "感謝您這幾個"
     thank_you_months_suffix: "月來的支持"
     thank_you: "感謝您支持CodeCombat."
@@ -430,13 +430,13 @@
     parents_blurb2: "每月支付$9.99美金, 他們每週獲得新挑戰以及使用信件取得專業程式員的幫助."
     parents_blurb3: "沒有風險: 保證100%退費, 一步取消訂閱."
     stripe_description: "每月訂閱"
-    subscription_required_to_play: "你將需要訂閱來開啟這關."
+    subscription_required_to_play: "您將需要訂閱來開啟這關."
     unlock_help_videos: "訂閱來解開所有鎖住得教學影片."

   choose_hero:
-    choose_hero: "選擇你的英雄"
+    choose_hero: "選擇您的英雄"
     programming_language: "程式語言"
-    programming_language_description: "你要使用哪個程式語言？"
+    programming_language_description: "您要使用哪個程式語言？"
     default: "預設"
     experimental: "測試中"
     python_blurb: "簡單且強大，適合新手跟專家。"
@@ -511,13 +511,13 @@

   about:
     why_codecombat: "為什麼使用CodeCombat?"
-    why_paragraph_1: "想學程式嗎? 你不需要課程。你需要的只是大量的時間去\"玩\"程式。"
+    why_paragraph_1: "想學程式嗎? 您不需要課程。您需要的只是大量的時間去\"玩\"程式。"
     why_paragraph_2_prefix: "寫程式應該是有趣的。當然不是"
     why_paragraph_2_italic: "「耶！拿到獎章了。」"
     why_paragraph_2_center: "的有趣, 而是"
     why_paragraph_2_italic_caps: "「媽我不要出去玩，我要寫完這段！」"
-    why_paragraph_2_suffix: "般引人入勝。這是為甚麼CodeCombat被設計成多人對戰「遊戲」，而不是遊戲化「課程」。在你對這遊戲無法自拔之前，我們是不會放棄的─幫然，這個遊戲，將是有益於你的。"
-    why_paragraph_3: "如果你要沉迷遊戲的話，就來沉迷CodeCombat，成為科技時代的魔法師吧！"
+    why_paragraph_2_suffix: "般引人入勝。這是為甚麼CodeCombat被設計成多人對戰「遊戲」，而不是遊戲化「課程」。在您對這遊戲無法自拔之前，我們是不會放棄的─幫然，這個遊戲，將是有益於您的。"
+    why_paragraph_3: "如果您要沉迷遊戲的話，就來沉迷CodeCombat，成為科技時代的魔法師吧！"
     press_title: "部落格/新聞稿"
     press_paragraph_1_prefix: "想要撰寫有關我們的文章？請自由取用或下載我們的"
     press_paragraph_1_link: "新聞稿懶人包"
@@ -539,11 +539,11 @@
     preparation_title: "準備"
     preparation_1: "學生可以免費玩CodeCombat的核心關卡並且不需要登入. 我們鼓勵教師透過"
     preparation_play_campaign: "玩過每道關卡"
-    preparation_2: "去體驗它所傳達的, 你唯一需要準備的事情是確保學生可以接觸可上網的電腦."
+    preparation_2: "去體驗它所傳達的, 您唯一需要準備的事情是確保學生可以接觸可上網的電腦."
     preparation_3: "教師是不需要具備電腦科學的知識去讓學生有樂趣的經由CodeCombat學習."
     violent_title: "這暴力嗎?"
     violent_1: "因為我們的命名導致我們受到許多質疑. 儘管CodeCombat確實包含卡通暴力, 但我們在視覺和語言上是絕不包含的."
-    violent_2: "如果您覺得Angry Birds(憤怒鳥)適合學生玩, 你將覺得CodeCombat也是適合的."
+    violent_2: "如果您覺得Angry Birds(憤怒鳥)適合學生玩, 您將覺得CodeCombat也是適合的."
     for_girls_title: "這適合女生嗎?"
     for_girls_1: "在CodeCombat裡存在三種遊戲模式: 建造, 謎題和戰鬥. 我們已刻意調整設計去迎合男性和女性並且特別思考讓'建造'和'謎題'的關卡不被女性玩家厭惡."
     what_cover_title: "我們涵蓋哪些?"
@@ -578,28 +578,28 @@
     save_version_title: "保存新版本"
     new_major_version: "新的重要版本"
     submitting_patch: "正在提交修補..."
-    cla_prefix: "想保存修改, 你必須先保存我們的"
+    cla_prefix: "想保存修改, 您必須先保存我們的"
     cla_url: "貢獻者許可協議"
     cla_suffix: "。"
     cla_agree: "我同意"

   contact:
     contact_us: "聯繫我們"
-    welcome: "很高興收到你的信！用這個表格給我們發電郵。 "
+    welcome: "很高興收到您的信！用這個表格給我們發電郵。 "
     forum_prefix: "如果有任何問題, 請至"
     forum_page: "論壇"
     forum_suffix: "討論。"
     faq_prefix: "這裡還有一個"
     faq: "FAQ"
-    subscribe_prefix: "如果你需要幫助來解決關卡, 請"
+    subscribe_prefix: "如果您需要幫助來解決關卡, 請"
     subscribe: "訂閱CodeCombat"
     subscribe_suffix: "並且我們樂意提供代碼相關的協助."
-    subscriber_support: "你已經是個CodeCombat訂閱者, 我們將提供優先的協助."
+    subscriber_support: "您已經是個CodeCombat訂閱者, 我們將提供優先的協助."
     screenshot_included: "包含螢幕截圖."
     where_reply: "我們回覆到?"
     send: "意見反饋"
     contact_candidate: "聯繫候選人員" # Deprecated
-    recruitment_reminder: "使用這張表格來聯繫你有興趣的求職者. 記得CodeCombat將收取員工第一年薪水的15%當作佣金. 佣金須在僱用時就必須付清並且之後的90天內如果員工離職則可退款. 兼職, 遠端工作, 契約員工和實習生都可免除費用." # Deprecated
+    recruitment_reminder: "使用這張表格來聯繫您有興趣的求職者. 記得CodeCombat將收取員工第一年薪水的15%當作佣金. 佣金須在僱用時就必須付清並且之後的90天內如果員工離職則可退款. 兼職, 遠端工作, 契約員工和實習生都可免除費用." # Deprecated

   account_settings:
     title: "帳號設定"
@@ -618,12 +618,12 @@
     email_announcements: "通知"
     email_announcements_description: "接收關於CodeCombat的新聞和開發消息。"
     email_notifications: "通知"
-    email_notifications_summary: "你在CodeCombat的活動，會透過Email自動通知，你可選擇開啟或關閉。"
+    email_notifications_summary: "您在CodeCombat的活動，會透過Email自動通知，您可選擇開啟或關閉。"
     email_any_notes: "任何通知"
-    email_any_notes_description: "停用後你將不會收到來自CodeCombat的任何通知。"
+    email_any_notes_description: "停用後您將不會收到來自CodeCombat的任何通知。"
     email_news: "新聞"
     email_recruit_notes: "工作機會"
-    email_recruit_notes_description: "如果你玩得不錯，我們或許會考慮給你一份工作。"
+    email_recruit_notes_description: "如果您玩得不錯，我們或許會考慮給您一份工作。"
     contributor_emails: "貢獻者電郵"
     contribute_prefix: "我們在尋找志同道合的人！請到 "
     contribute_page: "貢獻頁面"
@@ -632,12 +632,12 @@
     error_saving: "保存時發生錯誤"
     saved: "修改已儲存"
     password_mismatch: "密碼不正確。"
-    password_repeat: "請重複輸入你的密碼。"
+    password_repeat: "請重複輸入您的密碼。"
     job_profile: "工作經歷" # Rest of this section (the job profile stuff and wizard stuff) is deprecated
-    job_profile_approved: "你的工作經歷已被CodeCombat驗證. 僱主將可以隨意瀏覽直到你設定為不啟動狀態或者已經四周沒有改變"
-    job_profile_explanation: "Hi! 請填寫下列資訊, 我們將使用它幫你媒合一份開發工作."
+    job_profile_approved: "您的工作經歷已被CodeCombat驗證. 僱主將可以隨意瀏覽直到您設定為不啟動狀態或者已經四周沒有改變"
+    job_profile_explanation: "Hi! 請填寫下列資訊, 我們將使用它幫您媒合一份開發工作."
     sample_profile: "觀看範例基本資料"
-    view_profile: "瀏覽你的基本資料"
+    view_profile: "瀏覽您的基本資料"

   keyboard_shortcuts:
     keyboard_shortcuts: "鍵盤快捷鍵"
@@ -656,14 +656,14 @@
     toggle_debug: "顯示/關閉除錯訊息"
     toggle_grid: "顯示/關閉網格提示"
     toggle_pathfinding: "顯示/關閉路徑尋找提示"
-    beautify: "利用標準格式來美化你的代碼"
+    beautify: "利用標準格式來美化您的代碼"
     maximize_editor: "最大化/最小化代碼編輯器"

   community:
     main_title: "CodeCombat社群"
-    introduction: "查看你可能可以參與的項目以及選擇最吸引你的項目. 我們期待與您一起工作!"
+    introduction: "查看您可能可以參與的項目以及選擇最吸引您的項目. 我們期待與您一起工作!"
     level_editor_prefix: "使用CodeCombat"
-    level_editor_suffix: "來創造和編輯關卡. 許多人已經創造關卡用在課堂或黑客松，或者給予朋友或兄弟姐妹. 如果您覺得創建一個全新的關卡非常困難，你可以先從現成的開始做起!"
+    level_editor_suffix: "來創造和編輯關卡. 許多人已經創造關卡用在課堂或黑客松，或者給予朋友或兄弟姐妹. 如果您覺得創建一個全新的關卡非常困難，您可以先從現成的開始做起!"
     thang_editor_prefix: "我們稱呼遊戲中的單位叫'thangs'. 使用"
     thang_editor_suffix: "來修改CodeCombat的原材料. 讓遊戲中的東西可以扔砲彈, 修改遊戲動畫的方向, 調整單位的生命值, 或者上傳自製的素材."
     article_editor_prefix: "看到有錯誤在我們的文件中嗎? 想要自己設計指令嗎? 查看我們的"
@@ -680,7 +680,7 @@
   classes:
     archmage_title: "大法師"
     archmage_title_description: "(Coder)"
-    archmage_summary: "如果你是個在coding教育遊戲有興趣的開發者, 成為大法師來幫助我們建立CodeCombat!"
+    archmage_summary: "如果您是個在coding教育遊戲有興趣的開發者, 成為大法師來幫助我們建立CodeCombat!"
     artisan_title: "工匠"
     artisan_title_description: "(Level Builder)"
     artisan_summary: "建造遊戲關卡並且分享給您的朋友們. 成為工匠來幫助其他人學習編程."
@@ -767,7 +767,7 @@
     thang_search_title: "在這搜尋物體類型"
     level_search_title: "在這搜尋關卡"
     achievement_search_title: "搜尋成就"
-    read_only_warning2: "注意: 你不能在這儲存任何編輯, 因為你尚未登入."
+    read_only_warning2: "注意: 您不能在這儲存任何編輯, 因為您尚未登入."
     no_achievements: "尚未有任何成就加入到這關卡中."
     achievement_query_misc: "關閉成就欄的雜項"
     achievement_query_goals: "關閉成就欄的關卡目標"
@@ -783,30 +783,30 @@
     page_title: "貢獻"
     intro_blurb: "CodeCombat是100%開源! 上百位專注的玩家已經幫助我們建造到今天的程度. 加入我們並完成下一章CodeCombat的冒險給全世界參與!"
     alert_account_message_intro: "您好!"
-    alert_account_message: "為了訂閱課程信件, 你將必須先登入."
-    archmage_introduction: "在建造遊戲中，其中一個最美好的事情是需要整合許多不同東西. 圖像, 聲音, 及時網路, 社群網路。以及許多不同層面的編程, 從底層數據庫管理, 到用戶界面的設計和實現. 這裡有許多事情需要完成, 如果你是個有經驗的程序員並且熱衷于深入處理CodeCombat的本質, 那麼這職業就是為你打造的. 我們將很高興擁有你的幫助來打造有史以來最優質的編程遊戲."
+    alert_account_message: "為了訂閱課程信件, 您將必須先登入."
+    archmage_introduction: "在建造遊戲中，其中一個最美好的事情是需要整合許多不同東西. 圖像, 聲音, 及時網路, 社群網路。以及許多不同層面的編程, 從底層數據庫管理, 到用戶界面的設計和實現. 這裡有許多事情需要完成, 如果您是個有經驗的程序員並且熱衷于深入處理CodeCombat的本質, 那麼這職業就是為您打造的. 我們將很高興擁有您的幫助來打造有史以來最優質的編程遊戲."
     class_attributes: "職業說明"
     archmage_attribute_1_pref: "熟悉于"
-    archmage_attribute_1_suf: ", 或者渴望去學習. 我們大部份的程式以這個語言寫成. 如果你是個Ruby或Python粉絲, 你將感覺到歸屬感. 它是個JavaScript, 但是擁有更佳的文法."
-    archmage_attribute_2: "一些程式經驗和個人的衝勁. 我們將幫助你找到方向, 但是我們不會花費太多時間訓練你."
+    archmage_attribute_1_suf: ", 或者渴望去學習. 我們大部份的程式以這個語言寫成. 如果您是個Ruby或Python粉絲, 您將感覺到歸屬感. 它是個JavaScript, 但是擁有更佳的文法."
+    archmage_attribute_2: "一些程式經驗和個人的衝勁. 我們將幫助您找到方向, 但是我們不會花費太多時間訓練您."
     how_to_join: "如何加入"
     join_desc_1: "任何人都可加入我們! 只需確認我們的"
-    join_desc_2: "來開始, 並且勾選底下的條件來宣告你成為勇敢的大法師和借由郵件獲得我們最新的消息. 想要討論可做的事或者更加深入地參與? "
+    join_desc_2: "來開始, 並且勾選底下的條件來宣告您成為勇敢的大法師和借由郵件獲得我們最新的消息. 想要討論可做的事或者更加深入地參與? "
     join_desc_3: ", 或者找到我們在"
     join_desc_4: "讓我們從這開始!"
     join_url_email: "發信給我們"
     join_url_hipchat: "公共的HipChat房間"
     archmage_subscribe_desc: "取得郵件關於新的編程機會和公告."
-    artisan_introduction_pref: "我們必須建造更多的關卡! 大家為了更多的內容在高聲吶喊, 但只靠我們只能建造這麼多. 現在你的工作場所就是一關; 我們的關卡編輯器是勉強可用的, 所以請小心. 只要你有新的靈感，不論從簡單的for-loops到"
-    artisan_introduction_suf: ", 那個這職業會適合你."
+    artisan_introduction_pref: "我們必須建造更多的關卡! 大家為了更多的內容在高聲吶喊, 但只靠我們只能建造這麼多. 現在您的工作場所就是一關; 我們的關卡編輯器是勉強可用的, 所以請小心. 只要您有新的靈感，不論從簡單的for-loops到"
+    artisan_introduction_suf: ", 那個這職業會適合您."
     artisan_attribute_1: "任何的創建內容經驗都是加分的, 例如使用過Blizzard的關卡編輯器. 但不是必須的!"
-    artisan_attribute_2: "渴望去完成許多測試和迭代. 為了製作好關卡, 你需要把它交給別人去玩並且觀察他們如何玩, 之後準備找到一堆東西去修改."
+    artisan_attribute_2: "渴望去完成許多測試和迭代. 為了製作好關卡, 您需要把它交給別人去玩並且觀察他們如何玩, 之後準備找到一堆東西去修改."
     artisan_attribute_3: "暫且擁有探險者般的忍耐力. 我們的關卡編輯器非常的陽春，有些地方非常不易使用. 我們已經提前告知囉!"
     artisan_join_desc: "按照以下步驟使用關卡編輯器:"
     artisan_join_step1: "閱讀文擋."
     artisan_join_step2: "創建新的關卡並且探索已存在的關卡."
     artisan_join_step3: "在公共的HipChat房間裡找到我們尋求幫助."
-    artisan_join_step4: "公佈你的關卡到論壇中尋求回饋."
+    artisan_join_step4: "公佈您的關卡到論壇中尋求回饋."
     artisan_subscribe_desc: "取得郵件關於關卡編輯器更新和公告."
     adventurer_introduction: "讓我們清楚的定義您的角色: 您是部坦克. 您將遭受許多傷害. 我們需要玩家來嘗試我們全新的關卡並且幫助我們找出如何讓事情變得更好. 那痛苦將是巨大的; 製作優秀的遊戲是個長遠的過程並且沒有人可以第一次就把事情做對. 如果您可以忍受並且抵抗力高, 那麼這職業也許適合您."
     adventurer_attribute_1: "渴望學習. 您想要學習如何編程並且我們想要教導您如何編程. 儘管您將可能在這情況中獨自完成大部分教學."
@@ -818,7 +818,7 @@
     scribe_introduction_pref: "CodeCombat不只是將擁有一堆關卡. 它將也包含知識資源, 一種充滿編程概念的wiki並且每道關卡都將蘊含著這樣的概念. 在這概念下, 不只每位工匠必須描述針對每個細節提出講解, 他們製作的關卡還可以簡單地和wiki中的編程概念產生連結. 某些東西已經在"
     scribe_introduction_url_mozilla: "Mozilla 開發者社群"
     scribe_introduction_suf: "完成. 如果您的有趣意見是可以在Markdown形式下闡述編程概念, 那麼這職業也許適合您."
-    scribe_attribute_1: "文字的技巧幾乎是你全部所需要的. 不只是文法和拼字, 但還需傳達複雜概念給閱讀的人."
+    scribe_attribute_1: "文字的技巧幾乎是您全部所需要的. 不只是文法和拼字, 但還需傳達複雜概念給閱讀的人."
     contact_us_url: "聯繫我們"
     scribe_join_description: "告訴我們更多關於您的資訊, 您的編程經驗和一些您喜歡寫下的東西. 我們將從這些地方開始!"
     scribe_subscribe_desc: "取得公告關於寫作文章的郵件."
@@ -953,7 +953,7 @@
     cost: "花費"
     next_payment: "下次付款"
     card: "信用卡"
-    status_unsubscribed_active: "您尚未訂閱並且將不會收到賬單，但是你的帳號現在仍然是有效的."
+    status_unsubscribed_active: "您尚未訂閱並且將不會收到賬單，但是您的帳號現在仍然是有效的."
     status_unsubscribed: "借由訂閱CodeCombat，取得存取新關卡，新英雄，新物品和額外寶石的資格!"

   loading_error:
@@ -1062,9 +1062,9 @@
 #    copyrights_title: "Copyrights and Licenses"
 #    contributor_title: "Contributor License Agreement"
 #    contributor_description_prefix: "All contributions, both on the site and on our GitHub repository, are subject to our"
-#    cla_url: "CLA"
+    cla_url: "貢獻者許可協議"
 #    contributor_description_suffix: "to which you should agree before contributing."
-#    code_title: "Code - MIT"
+    code_title: "Code - MIT"
 #    code_description_prefix: "All code owned by CodeCombat or hosted on codecombat.com, both in the GitHub repository or in the codecombat.com database, is licensed under the"
 #    mit_license_url: "MIT license"
 #    code_description_suffix: "This includes all code in Systems and Components that are made available by CodeCombat for the purpose of creating levels."
@@ -1120,107 +1120,107 @@
     done_editing: "完成編輯"
     profile_for_prefix: "關於"
     profile_for_suffix: "的基本資料"
-#    featured: "Featured"
-#    not_featured: "Not Featured"
-#    looking_for: "Looking for:"
+    featured: "被推薦"
+    not_featured: "未獲選"
+    looking_for: "尋找:"
     last_updated: "最後更新:"
-#    contact: "Contact"
-#    active: "Looking for interview offers now"
-#    inactive: "Not looking for offers right now"
-#    complete: "complete"
-#    next: "Next"
-#    next_city: "city?"
-#    next_country: "pick your country."
-#    next_name: "name?"
-#    next_short_description: "write a short description."
-#    next_long_description: "describe your desired position."
-#    next_skills: "list at least five skills."
-#    next_work: "chronicle your work history."
-#    next_education: "recount your educational ordeals."
-#    next_projects: "show off up to three projects you've worked on."
-#    next_links: "add any personal or social links."
-#    next_photo: "add an optional professional photo."
-#    next_active: "mark yourself open to offers to show up in searches."
-#    example_blog: "Blog"
-#    example_personal_site: "Personal Site"
-#    links_header: "Personal Links"
-#    links_blurb: "Link any other sites or profiles you want to highlight, like your GitHub, your LinkedIn, or your blog."
-#    links_name: "Link Name"
-#    links_name_help: "What are you linking to?"
-#    links_link_blurb: "Link URL"
-#    basics_header: "Update basic info"
-#    basics_active: "Open to Offers"
-#    basics_active_help: "Want interview offers right now?"
-#    basics_job_title: "Desired Job Title"
-#    basics_job_title_help: "What role are you looking for?"
-#    basics_city: "City"
-#    basics_city_help: "City you want to work in (or live in now)."
-#    basics_country: "Country"
-#    basics_country_help: "Country you want to work in (or live in now)."
-#    basics_visa: "US Work Status"
-#    basics_visa_help: "Are you authorized to work in the US, or do you need visa sponsorship? (If you live in Canada or Australia, mark authorized.)"
-#    basics_looking_for: "Looking For"
-#    basics_looking_for_full_time: "Full-time"
-#    basics_looking_for_part_time: "Part-time"
-#    basics_looking_for_remote: "Remote"
-#    basics_looking_for_contracting: "Contracting"
-#    basics_looking_for_internship: "Internship"
-#    basics_looking_for_help: "What kind of developer position do you want?"
-#    name_header: "Fill in your name"
-#    name_anonymous: "Anonymous Developer"
-#    name_help: "Name you want employers to see, like 'Nick Winter'."
-#    short_description_header: "Write a short description of yourself"
-#    short_description_blurb: "Add a tagline to help an employer quickly learn more about you."
-#    short_description: "Tagline"
-#    short_description_help: "Who are you, and what are you looking for? 140 characters max."
-#    skills_header: "Skills"
-#    skills_help: "Tag relevant developer skills in order of proficiency."
-#    long_description_header: "Describe your desired position"
-#    long_description_blurb: "Tell employers how awesome you are and what role you want."
-#    long_description: "Self Description"
-#    long_description_help: "Describe yourself to potential employers. Keep it short and to the point. We recommend outlining the position that would most interest you. Tasteful markdown okay; 600 characters max."
-#    work_experience: "Work Experience"
-#    work_header: "Chronicle your work history"
-#    work_years: "Years of Experience"
-#    work_years_help: "How many years of professional experience (getting paid) developing software do you have?"
-#    work_blurb: "List your relevant work experience, most recent first."
-#    work_employer: "Employer"
-#    work_employer_help: "Name of your employer."
-#    work_role: "Job Title"
-#    work_role_help: "What was your job title or role?"
-#    work_duration: "Duration"
-#    work_duration_help: "When did you hold this gig?"
-#    work_description: "Description"
-#    work_description_help: "What did you do there? (140 chars; optional)"
-#    education: "Education"
-#    education_header: "Recount your academic ordeals"
-#    education_blurb: "List your academic ordeals."
-#    education_school: "School"
-#    education_school_help: "Name of your school."
-#    education_degree: "Degree"
-#    education_degree_help: "What was your degree and field of study?"
-#    education_duration: "Dates"
-#    education_duration_help: "When?"
-#    education_description: "Description"
-#    education_description_help: "Highlight anything about this educational experience. (140 chars; optional)"
-#    our_notes: "CodeCombat's Notes"
-#    remarks: "Remarks"
-#    projects: "Projects"
-#    projects_header: "Add 3 projects"
-#    projects_header_2: "Projects (Top 3)"
-#    projects_blurb: "Highlight your projects to amaze employers."
-#    project_name: "Project Name"
-#    project_name_help: "What was the project called?"
-#    project_description: "Description"
-#    project_description_help: "Briefly describe the project."
-#    project_picture: "Picture"
-#    project_picture_help: "Upload a 230x115px or larger image showing off the project."
-#    project_link: "Link"
-#    project_link_help: "Link to the project."
-#    player_code: "Player Code"
-
-#  employers:
-#    deprecation_warning_title: "Sorry, CodeCombat is not recruiting right now."
+    contact: "聯繫"
+    active: "目前尋找面試機會"
+    inactive: "目前沒有在尋找面試機會"
+    complete: "完成"
+    next: "下一步"
+    next_city: "城市?"
+    next_country: "選擇您所居住的國家."
+    next_name: "姓名?"
+    next_short_description: "簡短的敘述您自己."
+    next_long_description: "描述您所需要的位置."
+    next_skills: "列出至少五項技能."
+    next_work: "您的過往經歷."
+    next_education: "教育經歷."
+    next_projects: "至少展示三項您所參與的專案."
+    next_links: "增加任何個人或社群的聯結."
+    next_photo: "增加一張專業的照片(可選)."
+    next_active: "將自己標記正在尋求工作機會以使自己的名字出現在搜索中."
+    example_blog: "部落格"
+    example_personal_site: "個人網站"
+    links_header: "個人聯結"
+    links_blurb: "聯結任何您想凸顯的網站或介紹, 例如：聯結您的GitHub, 您的LinkedIn, 您的部落格."
+    links_name: "聯結名稱"
+    links_name_help: "您想聯結到?"
+    links_link_blurb: "聯結網址"
+    basics_header: "更新基本的資訊"
+    basics_active: "接受工作邀請"
+    basics_active_help: "目前想要獲得面試機會?"
+    basics_job_title: "期望職位"
+    basics_job_title_help: "您正在尋找怎樣的職位?"
+    basics_city: "城市"
+    basics_city_help: "您想工作的城市(或者現在居住地)."
+    basics_country: "國家"
+    basics_country_help: "您想工作的國家(或者現在居住地)."
+    basics_visa: "美國工作簽證狀態"
+    basics_visa_help: "您是否在美國可以合法工作, 或者您需要公司資助簽證? (如果您住在Canada或Australia, 標注可以合法工作.)"
+    basics_looking_for: "尋找"
+    basics_looking_for_full_time: "全職"
+    basics_looking_for_part_time: "兼職"
+    basics_looking_for_remote: "遠端工作"
+    basics_looking_for_contracting: "約娉工作"
+    basics_looking_for_internship: "實習"
+    basics_looking_for_help: "您想要哪種的開發者職位?"
+    name_header: "填寫您的姓名"
+    name_anonymous: "匿名開發者"
+    name_help: "您希望僱主看到的姓名, 例如:'Nick Winter'."
+    short_description_header: "簡短的敘述您自己"
+    short_description_blurb: "增加一則簡短介紹來幫助僱主快速的認識您."
+    short_description: "簡短介紹"
+    short_description_help: "您是誰, 您正在尋找啥? 最多140字."
+    skills_header: "技能"
+    skills_help: "按照熟練程度列出您所擁有的相關開發技能."
+    long_description_header: "描述您所希望的位置"
+    long_description_blurb: "告訴僱主您有多棒和您所希望扮演的角色."
+    long_description: "自我描述"
+    long_description_help: "向潛在僱主描述您自己. 保持簡短並且直指核心. 我們建議您列出最有興趣的職位; 最多600字."
+    work_experience: "工作經歷"
+    work_header: "按時間順序列出經歷"
+    work_years: "工作時間(年)"
+    work_years_help: "您擁有多少年的專業開發軟體的經驗(被支薪)?"
+    work_blurb: "列出您的相關工作經驗, 最近的優先."
+    work_employer: "僱主"
+    work_employer_help: "您僱主的姓名."
+    work_role: "職稱"
+    work_role_help: "您的職稱或者角色是?"
+    work_duration: "起止時間"
+    work_duration_help: "您的在職時間是?"
+    work_description: "描述"
+    work_description_help: "您在那是在做啥? (140字; 可選)"
+    education: "教育"
+    education_header: "列出您的教育經歷"
+    education_blurb: "列出您在學校的經歷."
+    education_school: "學校"
+    education_school_help: "學校名稱."
+    education_degree: "學位"
+    education_degree_help: "您的學位以及專業是?"
+    education_duration: "日期"
+    education_duration_help: "何時?"
+    education_description: "描述"
+    education_description_help: "凸顯任何有關這個教育經歷的地方. (140字; 可選)"
+    our_notes: "CodeCombat的筆記"
+    remarks: "標記"
+    projects: "專案"
+    projects_header: "增加3個專案"
+    projects_header_2: "專案(前3個)"
+    projects_blurb: "凸顯您的專案以求驚豔僱主."
+    project_name: "專案名稱"
+    project_name_help: "專案被稱為?"
+    project_description: "描述"
+    project_description_help: "簡短描述專案."
+    project_picture: "照片"
+    project_picture_help: "上傳一張230x115px或更大的照片凸顯那份專案."
+    project_link: "聯結"
+    project_link_help: "專案的聯結."
+    player_code: "玩家代碼"
+
+  employers:
+    deprecation_warning_title: "抱歉, CodeCombat現在並沒有在徵才."
 #    deprecation_warning: "We are focusing on beginner levels instead of finding expert developers for the time being."
 #    hire_developers_not_credentials: "Hire developers, not credentials." # We are not actively recruiting right now, so there's no need to add new translations for the rest of this section.
 #    get_started: "Get Started"
@@ -1249,21 +1249,21 @@
 #    pass_screen: "They will pass your technical screen."
 #    pass_screen_blurb: "Review each candidate's code before reaching out. One employer found that 5x as many of our devs passed their technical screen than hiring from Hacker News."
 #    make_hiring_easier: "Make my hiring easier, please."
-#    what: "What is CodeCombat?"
+    what: "CodeCombat是啥?"
 #    what_blurb: "CodeCombat is a multiplayer browser programming game. Players write code to control their forces in battle against other developers. Our players have experience with all major tech stacks."
-#    cost: "How much do we charge?"
+    cost: "我們收取多少費用?"
 #    cost_blurb: "We charge 15% of first year's salary and offer a 100% money back guarantee for 90 days. We don't charge for candidates who are already actively being interviewed at your company."
-#    candidate_name: "Name"
-#    candidate_location: "Location"
-#    candidate_looking_for: "Looking For"
-#    candidate_role: "Role"
-#    candidate_top_skills: "Top Skills"
-#    candidate_years_experience: "Yrs Exp"
-#    candidate_last_updated: "Last Updated"
-#    candidate_who: "Who"
-#    featured_developers: "Featured Developers"
-#    other_developers: "Other Developers"
-#    inactive_developers: "Inactive Developers"
+    candidate_name: "姓名"
+    candidate_location: "地點"
+    candidate_looking_for: "尋找"
+    candidate_role: "角色"
+    candidate_top_skills: "高級技能"
+    candidate_years_experience: "多年工作經驗"
+    candidate_last_updated: "最後一次更新"
+    candidate_who: "誰"
+    featured_developers: "主要開發者"
+    other_developers: "其他開發者"
+    inactive_developers: "不活躍的開發者"

   admin:
 #    av_espionage: "Espionage" # Really not important to translate /admin controls.


fix(run): use config param instead of account

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


Use guest user name if already registered

--- packages/rocketchat-livechat/app/client/methods/sendMessageExternal.coffee
+++ packages/rocketchat-livechat/app/client/methods/sendMessageExternal.coffee
@@ -9,7 +9,7 @@

 			message.u =
 				_id: Meteor.userId()
-				username: 'visitor'
+				username: Meteor.user()?.username || 'visitor'

 			message.temp = true


removed comment

removed comment

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


correct sku feeding for admin users open designer

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


Add js for dataTable of last assignments table

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


No idea what this is, but it's annoying in my git status

error: pathspec 'dotfiles/.atom/github.cson' did not match any file(s) known to git

--- dotfiles/.atom/github.cson
+++ dotfiles/.atom/github.cson
@@ -0,0 +1 @@
+# Store non-visible GitHub package state.


app: add toImmutable util

app: add toImmutable util

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


Added html5-parser (Copied from cohtml-parser)

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

--- src/html5-parser.coffee
+++ src/html5-parser.coffee
@@ -0,0 +1,83 @@
+
+{ GenericParser } = require './generic-parser'
+
+{ Html5Node, Html5TextNode, Html5CommentNode, nonClosingHtml5TagList, selfClosingHtml5TagList } = require './html5-definition'
+
+class HtmlParser extends GenericParser
+
+  constructor: (inputString, optionMap = {})->
+    super inputString
+    { indentCharacter } = optionMap
+    @indentCharacter = indentCharacter or '  '
+    @charset =
+      tag: [].concat ['!'], HtmlParser.CommonTokens.urlSafeBase64
+      attribute: [].concat ['$', '?'], HtmlParser.CommonTokens.urlSafeBase64
+      equal: '='
+      dquote: '"'
+      newline: HtmlParser.CommonTokens.newline
+      whitespaceAndNewline: [].concat HtmlParser.CommonTokens.newline, HtmlParser.CommonTokens.whitespace
+      angularBraceStart: '<'
+      angularBraceEnd: '>'
+
+  ###
+    Error Management
+  ###
+
+  throwError: (message)->
+    ex = new Error message
+    ex.name = 'HtmlParserError'
+
+    inputString = (@inputArray.join '')
+
+    location = (@inputArray[0...@head]).join ''
+
+    lineNumber = 1 + @countNewlines location
+
+    offset = location.lastIndexOf '\n'
+    index = inputString.indexOf '\n', (offset+1)
+    line = (@inputArray[offset+1...index]).join ''
+    # line = line.replace /\s/g, '~'
+
+    charNumber = @head - offset - 1
+
+    nearPointer = (if charNumber is 0 then '' else ((' ' for _ in [0...charNumber-1]).join '')) + '^'
+
+    text = """
+           HtmlParserError: #{message}
+           head: #{@head} (#{@current()})
+           line: #{lineNumber}
+           char: #{charNumber}
+           near: |#{line}|
+                  #{nearPointer}
+           """
+    ex.stack = text
+    throw ex
+
+  takeOrThrowError: (stringArray, message)->
+    if (char = @take stringArray)
+      return char
+    else
+      return @throwError message
+
+  ###
+    Utilities
+  ###
+
+  countNewlines: (string)->
+    lineCount = 0
+    offset = 0
+    while (index = string.indexOf '\n', offset) > -1
+      offset += index + 1
+      lineCount += 1
+    return lineCount
+
+  ignoreWhitespaceAndNewline: ->
+    @ignore @charset['whitespaceAndNewline']
+
+  ###
+    Extraction
+  ###
+
+
+
+@CohtmlParser = CohtmlParser


Automate API docs with build-api-doc.coffee!

error: pathspec 'bin/build-api-doc.coffee' did not match any file(s) known to git

--- bin/build-api-doc.coffee
+++ bin/build-api-doc.coffee
@@ -0,0 +1,87 @@
+#! /usr/bin/env coffee
+
+async         = require 'async'
+child_process = require 'child_process'
+fs            = require 'fs'
+path          = require 'path'
+{exec}        = child_process
+
+# The pattern of commands to match in our API template.
+CMD_PATTERN = /(curl (?:.+[\s\S])+[\s\S])/g
+
+# The main script.
+main = ->
+  templateFile = path.join __dirname, '../doc/templates/api.template.md'
+  outFile      = path.join __dirname, '../doc/README.API.markdown'
+
+  console.log "Creating API doc: '#{outFile}'."
+
+  createDoc templateFile, outFile, (err) ->
+    if err
+    then console.log "Error creating API docs: ", err
+    else console.log "Done!"
+    process.exit()
+
+# Creates the API document, given template and output filenames.
+createDoc = (templateFile, outFile, callback) ->
+  template = readTemplate templateFile
+  commands = loadCommands template
+
+  startApp (err, app) ->
+    return callback err if err
+
+    runCommands commands, (err, results) ->
+      return callback err if err
+
+      resultsByCmd = {}
+      for i, c of commands
+        unless resultsByCmd[c]?
+          resultsByCmd[c] = results[i]
+
+      doc = template.replace CMD_PATTERN, (match, p1, offset, string) ->
+        command = match
+        result = resultsByCmd[command]
+          .replace(/\r\n/g        , '\n')
+          .replace(/^(HTTP.*)$/m  , '$1\n')
+          .replace(/^/gm          , '    ')
+          .replace(/$/            , '\n\n')
+          .replace(/^ +$/gm       , '')
+        example = command + result
+        return example
+
+      outputDoc outFile, doc
+      return callback null
+
+# Reads the API template.
+readTemplate = (filename) ->
+  template = fs.readFileSync(filename, 'utf8').toString('utf8')
+  return template
+
+# Loads commands from template text.
+loadCommands = (template) ->
+  commands = template.match CMD_PATTERN
+  return commands
+
+# Starts the Argumenta app asynchronously.
+startApp = (callback) ->
+  process.env.NODE_ENV = 'testing'
+  module = path.join __dirname, '../app'
+  app = require module
+  app.argumenta.storage.clearAll null, (err) ->
+    return callback err, app
+
+# Runs commands in series, and returns results by callback.
+runCommands = (commands, callback) ->
+  runCmd = (c, cb) ->
+    exec c, (err, stdout, stderr) ->
+      cb err, stdout
+
+  async.mapSeries commands, runCmd, (err, results) ->
+    return callback err, results
+
+# Writes the document text to the named file.
+outputDoc = (filename, text) ->
+  fs.writeFileSync filename, text, 'utf8'
+
+# Let's do this!
+main()


switched to new setter api

switched to new setter api

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/Meteor-Reaction/meteor-reactive-schema.git/'


Jokes on me, mouse events are also being passed.

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


Add class depending on is_optional and custom class.

--- core/htdocs_source/src/pods/oxifield-main/component.coffee
+++ core/htdocs_source/src/pods/oxifield-main/component.coffee
@@ -1,6 +1,11 @@
 `import Em from "vendor/ember"`

 Component = Em.Component.extend
+    classNameBindings: [
+        "content.is_optional:optional:required"
+        "content.class"
+    ]
+
     isBool: Em.computed.equal "content.type", "bool"
     isCertIdentifier: Em.computed.equal "content.type", "cert_identifier"
     isCheckbox: Em.computed.equal "content.type", "checkbox"


add german locale

add german locale

error: pathspec 'client/app/locales/de.coffee' did not match any file(s) known to git

--- client/app/locales/de.coffee
+++ client/app/locales/de.coffee
@@ -0,0 +1,126 @@
+module.exports =
+
+    "or": "oder"
+    "Back" : "Zurück"
+    "Create a new album" : "Neues Album erstellen"
+    "Delete" : "Löschen"
+    "Download" : "Herunterladen"
+    "Edit" : "Bearbeiten"
+    "Stop editing" : "Änderungen speichern"
+    "It will appear on your homepage." : "Es wird auf dem Album Seite angezeigt."
+    "Make it Hidden" : "Verborgen"
+    "Make it Private" : "Privat"
+    "Make it Public" : "Öffentlich"
+    "New" : "New"
+    "private" : "Privat"
+    "public" : "Öffentlich"
+    "hidden" : "Verborgen"
+    "There is no photos in this album" : "Es ist kein Foto in diesem Album. Klicken Sie Bearbeiten um neue hinzuzufügen."
+    "There is no public albums." : "Es existiert kein Album."
+    "This album is private" : "Dieses Album ist privat"
+    "This album is hidden" : "Dieses Album ist verborgen"
+    "This album is public" : "Dieses Album is öffentlich"
+    "title placeholder" : "Vergeben Sie einen Tittel für dieses Album…"
+    "View" : "Ansicht"
+    "description placeholder" : "Schreiben Sie eine Beschreibung…"
+    "is too big (max 10Mo)":"ist zu groß (max. 10Mo)"
+    "is not an image": "ist kein Bild"
+    "Share album by mail": "Album via E-Mail teilen"
+    "Upload your contacts...": "Ihre Kontakte hochladen…"
+    "Share album": "Album teilen"
+    "Add contact": "Kontact hinzufügen"
+    "Send mail": "E-Mail senden"
+    "Select your friends": "Ihre Freunde auswählen"
+    "Add": "Hinzufügen"
+    "Cancel": "Abbrechen"
+    "photo successfully set as cover": """
+        Diese Bild ist erfolgreich als Album Cover vergeben"""
+    "problem occured while setting cover": """
+        Ein Problem ist aufgetreten während der Vergabe dieses Bild als Album Cover"""
+
+
+    "pick from computer":"""
+        Klicken Sie hier oder ziehen Sie Ihre Bilder um Sie zu diesem Album hinzu zufügen.
+    """
+    "pick from files":"""
+        Klicken Sie hier um Bilder von der Files app zu übernehmen.
+    """
+
+    "hidden-description": """
+      It will not appear on your homepage.
+      But you can share it with the following url:
+    """
+
+    "It cannot be accessed from the public side" : """
+      Es is keine öffentlich Ressource."
+    """
+    "rebuild thumbnails": "Neuaufbau Thumbnails"
+
+    "01": "Januar"
+    "02": "Februar"
+    "03": "März"
+    "04": "April"
+    "05": "Mai"
+    "06": "Juni"
+    "07": "Juli"
+    "08": "August"
+    "09": "September"
+    "10": "Oktober"
+    "11": "November"
+    "12": "Dezember"
+    # clearance modal
+    "cancel" : "Abbrechen"
+    "copy paste link" : "Um Ihrem Kontakt Zugriff zu gewähren senden Sie Ihr/Ihm den Linnk unten:"
+    "details" : "Details"
+    "inherited from" : "geerbt von"
+    "modal question album shareable" : "Wählen Sie Teilen Modus für diese Album"
+    "modal shared album custom msg" : "E-Mail Adresse eingeben und Enter drücken"
+    "modal shared album link msg" : "Senden Sie diesen Link um Leuten Zugriff zu diesem Album zu gewähren"
+    "modal shared public link msg"    : "Senden Sie diesen Link um Leuten Zugriff zu diesm Ordner zu gewähren:"
+    "modal shared with people msg"    : """
+        Eine Auswahl von Kontakten für Zugriff einladen. E-Mail
+         in das Feld eintragen und Enter drücken (Eine E-Mail wird zu Ihnen versand):"""
+    "modal send mails" : "Eine Mitteilung versenden"
+    "modal next": "Nächste"
+    "modal prev": "Vorherige"
+    "modal ok": "Ok"
+    "modal cancel": "Abbrechen"
+    "modal error": "Fehler"
+    "only you can see" : "Nur Sie und die aufgelsiteten Leutehaben Zugriff auf diese Ressource"
+    "public" : "Öffentlich"
+    "private" : "Privat"
+    "shared" : "Geteilt"
+    "share" : "Teilen"
+    "save" : "Speichern"
+    "see link" : "Siehe Link"
+    "send mails question" : "Eine Mitteilungs E-Mail versenden an:"
+    "sharing" : "Teilen"
+    "revoke" : "Absagen"
+    "confirm" : "Bestätigen"
+    "share forgot add" : """
+        Scheint so als ob Sie vergessen haben die Schaltfläche Hinzufügen zu drücken"""
+    "share confirm save" : """
+        Die Änderungen die Sie an den Rechten vorgenommen haben, werden nicht gespeichert. Möchten Sie fortfahren?"""
+    "yes forgot" : "Zurück"
+    "no forgot" : "es ist ok"
+    "perm" : "can "
+    "perm r album" : "Diese Album durchblättern"
+    "perm rw album" : "Fotos durchblättern und hochladen"
+    "mail not send"        : "E-Mail nicht gesendet"
+    "server error occured" : "Fehler auf Server Seite aufgetreten, bitte später noch einmal probieren"
+
+    "change notif" : """
+        Diesen Kasten anwählen um benachrichtigt zu werden, wenn eine Kontakt
+        ein Bild zu diesem Album hinzufügt."""
+    "send email hint": "Mitteilungs E-Mails werden einmalig beim Speichern gesendet"
+    "yes" : "Ja"
+    "no" : "Nein"
+    "picture": "Bild |||| Bilder"
+    "delete empty album": "Dieses Album ist leer, möchten Sie es löschen?"
+    "are you sure you want to delete this album": "Sind Sie sicher diese Album zu löschen?"
+    "photos search"   : "Laden ..."
+    "no photos found" : "Keine Bilder gefunden"
+    "thumb creation"  : "Applikation erstellt Thumbs für Dateien."
+    "progress"        : "Fortschritt"
+    "Navigate before upload" : "Hochladen noch aktiv, möchten Sie wirklich diese Seite verlassen?"
+    "application title": "Cozy - photos"


un-indenting so the next commit's diff makes sense

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


Schedule in minutes

Schedule in minutes

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/ICTU/self-healer.git/'


Fix path to redis module

Fix path to redis module

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


Update Subscriptions.coffee

Update Subscriptions.coffee

--- packages/rocketchat-lib/server/models/Subscriptions.coffee
+++ packages/rocketchat-lib/server/models/Subscriptions.coffee
@@ -26,6 +26,7 @@
 	findOneByRoomIdAndUserId: (roomId, userId) ->
 		if this.useCache
 			return this.cache.findByIndex('rid,u._id', [roomId, userId]).fetch()
+
 		query =
 			rid: roomId
 			"u._id": userId


Added Queue for managaging URLS for the crawler.

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

--- src/queue.coffee
+++ src/queue.coffee
@@ -0,0 +1,21 @@
+class exports.Queue
+  queue = []
+
+  # Add item to end
+  enqueue: (items) ->
+    if Array.isArray(items)
+      queue.push item for item in items
+    else
+      queue.push items
+
+  # Remove item from the begining
+  dequeue: () ->
+    queue.shift()
+
+  # Read the first item
+  peek: () ->
+    queue[0]
+
+  # Get the queue length
+  length: () ->
+    queue.length


Added a log for figuring out what session is causing NaNs.

--- app/lib/simulator/Simulator.coffee
+++ app/lib/simulator/Simulator.coffee
@@ -205,6 +205,7 @@

 class SimulationTask
   constructor: (@rawData) ->
+    console.log 'Simulating sessions', (session.id for session in @getSessions())

   getLevelName: ->
     levelName =  @rawData.sessions?[0]?.levelID


allow overriding endpoint

allow overriding endpoint

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


Fixed minor mistake (router was not defined)

--- spec/simrou.coffee
+++ spec/simrou.coffee
@@ -11,4 +11,5 @@
         expect(router instanceof Simrou).toBeTruthy()

     it 'reports correctly that the testing environment supports the onHashChange event', ->
+        router = new Simrou()
         expect(router.eventSupported).toBeTruthy()


adds a sudo command, to make sure hubot does what you want

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

--- src/scripts/sudo.coffee
+++ src/scripts/sudo.coffee
@@ -0,0 +1,7 @@
+# Forces hubot to do what you want, even if he doesn't know how
+#
+# hubot sudo <anything you want> - Force hubot to do what you want
+module.exports = (robot) ->
+  robot.respond /(sudo) (.*)/i, (msg) ->
+    msg.send "Alright. I'll #{msg.match[2]}"
+


bug fix

bug fix


formatting

formatting

--- src/spine.coffee
+++ src/spine.coffee
@@ -359,7 +359,8 @@
   delay: (func, timeout) ->
     setTimeout(@proxy(func), timeout || 0)

-  html: (element) -> @el.html(element.el or element)
+  html: (element) ->
+    @el.html(element.el or element)

   append: (elements...) ->
     elements = (e.el or e for e in elements)


Ace: setEnableEmmet: on load only call this if it’s enabled

--- client/ace/lib/ace.coffee
+++ client/ace/lib/ace.coffee
@@ -163,7 +163,7 @@
       @setScrollPastEnd       @appStorage.getValue('scrollPastEnd')       ? yes       , no
       @setEnableAutocomplete  @appStorage.getValue('enableAutocomplete')  ? yes       , no
       @setEnableSnippets      @appStorage.getValue('enableSnippets')      ? yes       , no
-      @setEnableEmmet         @appStorage.getValue('enableEmmet')         ? no        , no
+      @setEnableEmmet         yes, no  if @appStorage.getValue 'enableEmmet'

       @isTrimWhiteSpacesEnabled = !!@appStorage.getValue('trimTrailingWhitespaces')


Fix: entry sign in bug

Fix: entry sign in bug

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

--- client/shared/deps.coffee
+++ client/shared/deps.coffee
@@ -0,0 +1,15 @@
+Deps.autorun ->
+	if Session.get 'language'
+		Session.set 'Language', Languages[Session.get 'language']
+	else
+		Session.set 'Language', null
+
+	if Meteor.user()
+		Session.set 'learning', Meteor.user().learning
+
+	if Session.get 'learning'
+		Session.set 'Learning', _.map Session.get('learning'), (string)->
+			Languages[string]
+
+	if Meteor.userId() and not _.isNull(Router.current()) and Router.current().route.name == 'entrySignIn'
+		Router.go 'dashboard'


Add missing semicolon

Add missing semicolon

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


Rewrite App to use update stout-core App 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/JoshuaToenyes/stout-client.git/'


Add package menu registry

Add package menu registry

error: pathspec 'menus/chinese-translator.cson' did not match any file(s) known to git

--- menus/chinese-translator.cson
+++ menus/chinese-translator.cson
@@ -0,0 +1,50 @@
+'menu': [
+  {
+    'label': 'Edit'
+    'submenu': [
+      'label': 'Chinese Translator'
+      'submenu': [
+        {
+          'label': 'Translates Traditional Chinese to Simplified Chinese'
+          'command': 'chinese-translator:traditional-chinese-to-simplified-chinese'
+        }
+        {
+          'label': 'Translates Traditional Chinese to Taiwan Standard'
+          'command': 'chinese-translator:traditional-chinese-to-taiwan-standard'
+        }
+        {
+          'label': 'Translates Traditional Chinese to Hong Kong Standard'
+          'command': 'chinese-translator:traditional-chinese-to-hong-kong-standard'
+        }
+        {
+          'label': 'Translates Simplified Chinese to Traditional Chinese'
+          'command': 'chinese-translator:simplified-chinese-to-traditional-chinese'
+        }
+        {
+          'label': 'Translates Simplified Chinese to Taiwan Standard'
+          'command': 'chinese-translator:simplified-chinese-to-taiwan-standard'
+        }
+        {
+          'label': 'Translates Simplified Chinese to Taiwan Standard with Taiwanese phrases'
+          'command': 'chinese-translator:simplified-chinese-to-taiwan-standard-with-phrases'
+        }
+        {
+          'label': 'Translates Simplified Chinese to Hong Kong Standard'
+          'command': 'chinese-translator:simplified-chinese-to-hong-kong-standard'
+        }
+        {
+          'label': 'Translates Taiwan Standard to Simplified Chinese'
+          'command': 'chinese-translator:taiwan-standard-to-simplified-chinese'
+        }
+        {
+          'label': 'Translates Taiwan Standard to Simplified Chinese with Chinese phrases'
+          'command': 'chinese-translator:taiwan-standard-to-simplified-chinese-with-phrases'
+        }
+        {
+          'label': 'Translates Hong Kong Standard to Simplified Chinese'
+          'command': 'chinese-translator:hong-kong-standard-to-simplified-chinese'
+        }
+      ]
+    ]
+  }
+]


Use Atom linter-eslint for TypeScript

Use Atom linter-eslint for TypeScript

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


Delete config.cson

Delete config.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/sixertoy/dotfiles.git/'


correct color on old items when dynamic mode off

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


Remove grammars from TextEditorElement.initialize

--- src/text-editor-element.coffee
+++ src/text-editor-element.coffee
@@ -27,7 +27,6 @@
     @assert = atom.assert
     @views = atom.views
     @styles = atom.styles
-    @grammars = atom.grammars

     @emitter = new Emitter
     @subscriptions = new CompositeDisposable
@@ -81,13 +80,12 @@
     @subscriptions.add @component.onDidChangeScrollLeft =>
       @emitter.emit("did-change-scroll-left", arguments...)

-  initialize: (model, {@views, @themes, @workspace, @assert, @styles, @grammars}, @autoHeight = true, @scrollPastEnd = true) ->
+  initialize: (model, {@views, @themes, @workspace, @assert, @styles}, @autoHeight = true, @scrollPastEnd = true) ->
     throw new Error("Must pass a views parameter when initializing TextEditorElements") unless @views?
     throw new Error("Must pass a themes parameter when initializing TextEditorElements") unless @themes?
     throw new Error("Must pass a workspace parameter when initializing TextEditorElements") unless @workspace?
     throw new Error("Must pass an assert parameter when initializing TextEditorElements") unless @assert?
     throw new Error("Must pass a styles parameter when initializing TextEditorElements") unless @styles?
-    throw new Error("Must pass a grammars parameter when initializing TextEditorElements") unless @grammars?

     @setModel(model)
     this
@@ -134,7 +132,6 @@
       themes: @themes
       workspace: @workspace
       assert: @assert
-      grammars: @grammars
       scrollPastEnd: @scrollPastEnd
     )
     @rootElement.appendChild(@component.getDomNode())


Firewall: Update rule item view when rule is updated.

--- client/Environments/views/scene/environmentruleitem.coffee
+++ client/Environments/views/scene/environmentruleitem.coffee
@@ -28,7 +28,8 @@
     return items

   cmedit: ->
-    new AddFirewallRuleModal {}, @getData()
+    modal = new AddFirewallRuleModal {}, @getData()
+    modal.once "RuleUpdated", => @template.update()

   confirmDestroy: ->
     data           = @getData()


Add corrections to usage output

Add corrections to usage output

--- src/TestRunner.coffee
+++ src/TestRunner.coffee
@@ -88,10 +88,10 @@

   printUsage : ->
     process.stdout.write("Usage: mctr <command>\n\n
-    --app_path [directory]     Send the Meteor app root directory.\n
-    --root_url [address]       Send the root url for Meteor\n
-    --settings_path [json]     Use this json settings file\n
-    --timeout [milliseconds]   Send a timeout for the tests\n
-    --packages [directory]     The package to test, \n")
+    --app_path [directory]     The Meteor app root directory.\n
+    --root_url [address]       The Meteor ROOT_URL (Optional)\n
+    --settings_path [json]     The Meteor settings file (Optional)\n
+    --timeout [milliseconds]   Total timeout for all tests (Optional)\n
+    --packages [directory]     The meteor packages to test (glob style wildcards can be specified)\n")

 module.exports = new TestRunner()


Added comments to git.coffee

Added comments to git.coffee

--- src/git.coffee
+++ src/git.coffee
@@ -3,32 +3,48 @@
 # cli colors
 colors = require 'colors'

+# callback to be used once git it good to go
 readyCallback = null

+# export so we can... `require '../git'`
 git = module.exports =
     runner: ''
     branch: ''
     config:
         runner: 'concrete.runner'
         branch: 'concrete.branch'
-
+
+    # init at target directory
     init: (target, callback) ->
+        # save callback for after git is ready to go
         readyCallback = callback
+
+        # we're using node's path to
+        # run directory level operations
         path = require 'path'
+
+        # get the full path to the target and change
+        # the process to that directory
         if target.toString().charAt(0) isnt '/'
             target = process.cwd()+'/'+target
         process.chdir target
+
+        # set up git paths for concrete's post-build executions
         git.target = path.normalize target+'/.git/'
         git.failure = path.normalize target+'/.git/hooks/build-failed'
         git.success = path.normalize target+'/.git/hooks/build-worked'
+
+        # make sure the path exists and is a valid repo
         path.exists git.target, (exists)->
             if exists is no
                 console.log "'#{target}' is not a valid Git repo".red
                 process.exit 1
             getBranch()
             getRunner()
-
+
+    # pull from the git repo
     pull: (next)->
+        # get the job list so we can queue jobs
         jobs = require './jobs'
         out = "Pulling '#{git.branch}' branch"
         jobs.updateLog jobs.current, out, ->
@@ -44,6 +60,8 @@
                         console.log out.grey
                         next()

+# get the current working branch
+# fallback to master if git.config.branch isn't set
 getBranch = ->
     exec 'git config --get ' + git.config.branch, (error, stdout, stderr)=>
         if error?
@@ -54,6 +72,7 @@
             git.branch = 'master' if git.branch is ''
             gitContinue()

+# get the concrete runner file
 getRunner = ->
     exec 'git config --get ' + git.config.runner, (error, stdout, stderr)=>
         if error?
@@ -63,7 +82,9 @@
             git.runner = stdout.toString().replace /[\s\r\n]+$/, ''
             git.runner = 'none' if git.runner is ''
             gitContinue()
-
+
+# notify the user of any issue prior
+# to continuing the concrete operation
 gitContinue = ->
     if git.branch is 'none'
         git.branch = 'master'


change report type

change report type

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/carlosmarte/console-app.git/'


Read basic configurations from YAML

Read basic configurations from YAML

--- Gruntfile.coffee
+++ Gruntfile.coffee
@@ -7,10 +7,11 @@

   # Configurable paths
   coreConfig =
-    app: "_source"
-    assets: "_source/css"
-    dist: "_site"
+    cfg: grunt.file.readYAML("_config.yml")
     pkg: grunt.file.readJSON("package.json")
+    app: "<%= core.cfg.source %>"
+    assets: "<%= core.cfg.source %>/css"
+    dist: "<%= core.cfg.destination %>"
     banner: do ->
       banner = "/*!\n"
       banner += " * (c) <%= core.pkg.author %>.\n *\n"


Build - don't run build on upload release

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


check os during test

check os during test


Remove commas

Remove commas

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


Add back image patterns for cacheBust.

Add back image patterns for cacheBust.

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/hjiang/1byte.io.git/'


fix a white space error

fix a white space error

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


Social: add requests wrappers for  social api

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


Have set management dismiss cookie expire in a year instead of after the session

--- components/favorites2/client/onboarding_modal.coffee
+++ components/favorites2/client/onboarding_modal.coffee
@@ -10,11 +10,11 @@
   close: ->
     count = parseInt Cookies.get 'favorites_onboarding_dismiss_count'
     count ||= 0
-    Cookies.set 'favorites_onboarding_dismiss_count', count + 1
+    Cookies.set 'favorites_onboarding_dismiss_count', (count + 1), expires: 31536000
     super

   events: -> _.extend super,
     'click a[href*=favorites]': 'clickedThrough'

   clickedThrough: ->
-    Cookies.set 'favorites_onboarding_dismiss_count', 2+    Cookies.set 'favorites_onboarding_dismiss_count', 2, expires: 31536000


modify res_time to resp_time

modify res_time to resp_time

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


Update zh-HANT.coffee

Update zh-HANT.coffee

--- app/locale/zh-HANT.coffee
+++ app/locale/zh-HANT.coffee
@@ -258,17 +258,17 @@
     tome_read_only_spells: "唯讀的咒語" # Only in old-style levels.
     tome_other_units: "其他單位" # Only in old-style levels.
     tome_cast_button_run: "運作"
-    tome_cast_button_running: "正在運作"
-#    tome_cast_button_ran: "Ran"
-#    tome_submit_button: "Submit"
-#    tome_reload_method: "Reload original code for this method" # Title text for individual method reload button.
-#    tome_select_method: "Select a Method"
-#    tome_see_all_methods: "See all methods you can edit" # Title text for method list selector (shown when there are multiple programmable methdos).
+    tome_cast_button_running: "運作中"
+    tome_cast_button_ran: "已運作"
+    tome_submit_button: "送出"
+    tome_reload_method: "重新載入該方法的原代碼" # Title text for individual method reload button.
+    tome_select_method: "選擇一個方法"
+    tome_see_all_methods: "查看所有可編輯的方法" # Title text for method list selector (shown when there are multiple programmable methdos).
     tome_select_a_thang: "選擇一個人物來施放"
     tome_available_spells: "可用的法術"
     tome_your_skills: "您的技能"
     tome_help: "幫助"
-#    tome_current_method: "Current Method"
+    tome_current_method: "現在的方法"
     hud_continue_short: "繼續"
     code_saved: "程式碼已保存"
     skip_tutorial: "跳過 (esc)"
@@ -276,7 +276,7 @@
     loading_ready: "準備！"
     loading_start: "開始戰役"
     problem_alert_title: "修正您的程式碼"
-#    problem_alert_help: "Help"
+    problem_alert_help: "幫助"
     time_current: "現在:"
     time_total: "最大值:"
     time_goto: "前往:"
@@ -285,7 +285,7 @@
     infinite_loop_comment_out: "在我的程式碼中加入注解"
     tip_toggle_play: "使用 Ctrl+P 切換 播放/暫停."
     tip_scrub_shortcut: "Ctrl+[ 快退; Ctrl+] 快進."
-#    tip_guide_exists: "Click the guide, inside game menu (at the top of the page), for useful info."
+    tip_guide_exists: "點擊頁面上方的指南，可獲得更多有用的訊息."
     tip_open_source: "「程式之戰」100% 開源!"
     tip_beta_launch: "「程式之戰」在2013年10月進入BETA測試。"
 #    tip_think_solution: "Think of the solution, not the problem."
@@ -357,7 +357,7 @@
   inventory:
     choose_inventory: "裝備物品"
     equipped_item: "已裝備"
-#    required_purchase_title: "Required"
+    required_purchase_title: "需要的"
     available_item: "可使用"
     restricted_title: "已限制"
     should_equip: "連點物品兩下可裝備"
@@ -377,16 +377,16 @@
     prompt_title: "寶石不足"
     prompt_body: "想要取得更多?"
     prompt_button: "進入商店"
-#    recovered: "Previous gems purchase recovered. Please refresh the page."
-
-#  subscribe:
-#    subscribe_title: "Subscribe"
-#    unsubscribe: "Unsubscribe"
-#    confirm_unsubscribe: "Confirm Unsubscribe"
-#    never_mind: "Never Mind, I Still Love You"
-#    thank_you_months_prefix: "Thank you for supporting us these last"
-#    thank_you_months_suffix: "months."
-#    thank_you: "Thank you for supporting CodeCombat."
+    recovered: "先前購買的寶石已回復. 請重新載入頁面."
+
+  subscribe:
+    subscribe_title: "訂閱"
+    unsubscribe: "取消訂閱"
+    confirm_unsubscribe: "確認訂閱"
+    never_mind: "沒關係，我仍然愛你"
+    thank_you_months_prefix: "感謝您這幾個"
+    thank_you_months_suffix: "月來的支持"
+    thank_you: "感謝您支持CodeCombat."
 #    sorry_to_see_you_go: "Sorry to see you go! Please let us know what we could have done better."
 #    unsubscribe_feedback_placeholder: "O, what have we done?"
 #    levels: "Get more practice with bonus levels!"
@@ -398,7 +398,7 @@
 #    parents_blurb1: "With CodeCombat, your child learns by writing real code. They start by learning simple commands, and progress to more advanced topics."
 #    parents_blurb2: "For $9.99 USD/mo, they get new challenges every week and personal email support from professional programmers."
 #    parents_blurb3: "No Risk: 100% money back guarantee, easy 1-click unsubscribe."
-#    subscribe_button: "Subscribe Now"
+    subscribe_button: "現在訂閱"
 #    stripe_description: "Monthly Subscription"
 #    subscription_required_to_play: "You'll need a subscription to play this level."
 #    unlock_help_videos: "Subscribe to unlock all video tutorials."


Improve documentation for Transmission script

--- src/scripts/transmission.coffee
+++ src/scripts/transmission.coffee
@@ -1,16 +1,26 @@
 #
+# Description:
+#   Gets a list of active torrents from  Transmission, a BitTorrent client.
+#
 # Dependencies:
 #   None
 #
 # Configuration:
 #   HUBOT_TRANSMISSION_USER - Transmission HTTP username
 #   HUBOT_TRANSMISSION_PASSWORD - Transmission HTTP password
-#   HUBOT_TRANSMISSION_URL - Where Transmission lives
+#   HUBOT_TRANSMISSION_URL - The URL used to access Transmission remotely
 #
 # Commands:
-#   torrents - Get a list of open torrents
-#   where is transmission? - Reply with the URL Hubot is using to talk to Transmission
+#   hubot torrents - Get a list of open torrents
+#   hubot where is transmission? - Reply with the URL Hubot is using to talk to Transmission
 #
+# Notes:
+#   This script uses Transmission's HTTP interface to get the information for its
+#   responses. To enable remote access to Transmission and get the values for the
+#   settings, you can follow the Transmission documentation at
+#   https://trac.transmissionbt.com/wiki/UserDocumentation
+#   There should be a section about remote access under the section for your chosen OS.
+#
 # Author:
 #   lucaswilric


[misc] test/acceptance: add tests for the draining of connections

error: pathspec 'services/real-time/test/acceptance/coffee/DrainManagerTests.coffee' did not match any file(s) known to git

--- services/real-time/test/acceptance/coffee/DrainManagerTests.coffee
+++ services/real-time/test/acceptance/coffee/DrainManagerTests.coffee
@@ -0,0 +1,72 @@
+RealTimeClient = require "./helpers/RealTimeClient"
+FixturesManager = require "./helpers/FixturesManager"
+
+expect = require("chai").expect
+
+async = require "async"
+request = require "request"
+
+Settings = require "settings-sharelatex"
+
+drain = (rate, callback) ->
+	request.post {
+		url: "http://localhost:3026/drain?rate=#{rate}"
+		auth: {
+			user: Settings.internal.realTime.user,
+			pass: Settings.internal.realTime.pass
+		}
+	}, (error, response, data) ->
+		callback error, data
+	return null
+
+describe "DrainManagerTests", ->
+	before (done) ->
+		FixturesManager.setUpProject {
+			privilegeLevel: "owner"
+			project: {
+				name: "Test Project"
+			}
+		}, (e, {@project_id, @user_id}) => done()
+		return null
+
+	describe "with two clients in the project", ->
+		beforeEach (done) ->
+			async.series [
+				(cb) =>
+					@clientA = RealTimeClient.connect()
+					@clientA.on "connectionAccepted", cb
+
+				(cb) =>
+					@clientB = RealTimeClient.connect()
+					@clientB.on "connectionAccepted", cb
+
+				(cb) =>
+					@clientA.emit "joinProject", project_id: @project_id, cb
+
+				(cb) =>
+					@clientB.emit "joinProject", project_id: @project_id, cb
+			], done
+
+		describe "starting to drain", () ->
+			# there is an internal delay of 1000ms, shift accordingly
+			@timeout(5000)
+			beforeEach (done) ->
+				async.parallel [
+					(cb) =>
+						@clientA.on "reconnectGracefully", cb
+					(cb) =>
+						@clientB.on "reconnectGracefully", cb
+
+					(cb) -> drain(2, cb)
+				], done
+
+			afterEach (done) ->
+				# reset drain
+				drain(0, done)
+
+			it "should not timeout", ->
+				expect(true).to.equal(true)
+
+			it "should not have disconnected", ->
+				expect(@clientA.socket.connected).to.equal true
+				expect(@clientB.socket.connected).to.equal true


close #42

close #42

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


always have something on port 80

always have something on port 80

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


cornerstone-source -> cornerstone

cornerstone-source -> cornerstone

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

--- source/cornerstone.coffee
+++ source/cornerstone.coffee
@@ -0,0 +1,3 @@
+#=require object_extensions
+
+#= require_tree .


MachineSettingsAdvancedView: Added class.


remove unnecessary fat arrow [#106431366]

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


added menu service test

added menu service test

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

--- test/unit/service/menu-service-spec.coffee
+++ test/unit/service/menu-service-spec.coffee
@@ -0,0 +1,40 @@
+define [
+  'config'
+  'angular'
+  'factory/menu-factory'
+  'service/menu-service'
+], (cfg, A) ->
+  describe 'Menu service', () ->
+    $httpBackend = null
+    factory = null
+    service = null
+
+    beforeEach module cfg.ngApp
+
+    beforeEach inject ($injector) ->
+      $httpBackend = $injector.get '$httpBackend'
+      factory = $injector.get 'menuFactory'
+      service = $injector.get 'menuService'
+
+    it 'should get the menu and populate the factory', () ->
+      data = [
+        title: '1'
+        href: '/'
+      ,
+        title: '2'
+        href: '/2'
+      ,
+        title: '3'
+        href: '/3'
+      ,
+        title: '4'
+        href: '/4'
+      ]
+
+      $httpBackend.expect 'GET', '/data/menu.json', JSON.stringify data
+
+      service.get().then () ->
+        expect(factory.get().length).toBe(data.length)
+
+        $httpBackend.verifyNoOutstandingExpectation()
+        $httpBackend.verifyNoOutstandingRequest()


Fixed a problem with the image creation in latest Chrome versions.

#changelog closes #226

--- src/dropzone.coffee
+++ src/dropzone.coffee
@@ -805,7 +805,9 @@
     fileReader = new FileReader

     fileReader.onload = =>
-      img = new Image
+      # Not using `new Image` here because of a bug in latest Chrome versions.
+      # See https://github.com/enyo/dropzone/pull/226
+      img = document.createElement "img"

       img.onload = =>
         file.width = img.width


adding AllowMajorVersionUpgrade

adding AllowMajorVersionUpgrade


add hsv color space

add hsv color space

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


improvement to monitoring

improvement to monitoring


check in the google fonts implementation

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

--- library/exposure/fonts.coffee
+++ library/exposure/fonts.coffee
@@ -0,0 +1,110 @@
+###
+Copyright (c) 2013, Alexander Cherniuk <ts33kr@gmail.com>
+All rights reserved.
+
+Redistribution and use in source and binary forms, with or without
+modification, are permitted provided that the following conditions are met:
+
+1. Redistributions of source code must retain the above copyright notice, this
+   list of conditions and the following disclaimer.
+2. Redistributions in binary form must reproduce the above copyright notice,
+   this list of conditions and the following disclaimer in the documentation
+   and/or other materials provided with the distribution.
+
+THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND
+ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
+WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
+DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR
+ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
+(INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
+LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
+ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
+SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+###
+
+_ = require "lodash"
+assert = require "assert"
+asciify = require "asciify"
+connect = require "connect"
+request = require "request"
+logger = require "winston"
+colors = require "colors"
+async = require "async"
+nconf = require "nconf"
+https = require "https"
+http = require "http"
+util = require "util"
+
+{format} = require "util"
+
+{external} = require "../membrane/remote"
+{Barebones} = require "../membrane/skeleton"
+{Preflight} = require "../membrane/preflight"
+
+# This abstract compound provides the internal service API for the
+# automatic generation of necessary links and then inclusion of the
+# required tags to use the confgured fonts provided by the Google
+# Fonts service that generates the CSS stylesheets with settings.
+# Please refer to the Google docs to get info on the fonts format.
+module.exports.GoogleFonts = class GoogleFonts extends Preflight
+
+    # This is a marker that indicates to some internal subsystems
+    # that this class has to be considered abstract and therefore
+    # can not be treated as a complete class implementation. This
+    # mainly is used to exclude or account for abstract classes.
+    # Once inherited from, the inheritee is not abstract anymore.
+    @abstract yes
+
+    # This is the composition hook that gets invoked when compound
+    # is being composed into other services and components. Merges
+    # together added jscripts found in both hierarchies, the current
+    # one and the foreign (the one that is beign merged in). Exists
+    # for backing up the consistent behavior when using composition.
+    @composition: (destination) ->
+        assert currents = this.googlefonts or Array()
+        previous = destination.googlefonts or Array()
+        return unless destination.derives GoogleFonts
+        assert previous? and try _.isArray previous
+        assert merged = previous.concat currents
+        assert merged = _.toArray _.unique merged
+        assert try destination.googlefonts = merged
+        try super catch error finally return this
+
+    # Add the described font to the font request that is going to be
+    # compiled and emited when the context is assembled. Description
+    # of a font is formed of a font family name and a vector of the
+    # typographic descriptions, such as sizes and styles. Values in
+    # the vector can be strings or any others - all are stringified.
+    @googlefont: (family, typographs...) ->
+        string = (val) -> return val.toString()
+        isntEmpty = -> not _.isEmpty arguments...
+        assert previous = @googlefonts or Array()
+        empty = "got an empty font typograph handler"
+        assert _.isString(family), "no valid family"
+        assert _.isArray(typographs), "no typographs"
+        assert typographs = _.map typographs, string
+        assert _.all(typographs, isntEmpty), empty
+        @googlefonts = previous.concat new Object
+            typographs: _.toArray typographs
+            family: family.replace /\s/, "+"
+
+    # This server side method is called on the context prior to the
+    # context being compiled and flushed down to the client site. The
+    # method is wired in an asynchronous way for greater functionality.
+    # This is the place where you would be importing the dependencies.
+    # Pay attention that most implementations side effect the context.
+    prelude: (symbol, context, request, next) ->
+        googlefonts = @constructor.googlefonts or []
+        assert _.isArray(googlefonts), "invalid fonts"
+        assert googlefonts = try googlefonts.reverse()
+        j = (strc) -> return strc.typographs.join ","
+        t = "http://fonts.googleapis.com/css?family=%s"
+        infusor = (fx) -> "#{fx.family}:#{fx.joined}"
+        compare = (xa, xb) -> xa.family is xb.family
+        foldtyp = (x) -> family: x.family, joined: j(x)
+        googlefonts = _.unique googlefonts, compare
+        assert prepped = _.map googlefonts, foldtyp
+        assert infused = try _.map prepped, infusor
+        assert not _.isEmpty blob = infused.join "|"
+        context.sheets.push format t, blob; next()


Fixed up the level loader to include session objects as world necessities.

--- app/lib/LevelLoader.coffee
+++ app/lib/LevelLoader.coffee
@@ -63,12 +63,14 @@
       url += "?team=#{@team}" if @team

     session = new LevelSession().setURL url
-    @session = @supermodel.loadModel(session, 'level_session', {cache:false}).model
+    @sessionResource = @supermodel.loadModel(session, 'level_session', {cache:false})
+    @session = @sessionResource.model
     @session.once 'sync', -> @url = -> '/db/level.session/' + @id

     if @opponentSessionID
       opponentSession = new LevelSession().setURL "/db/level_session/#{@opponentSessionID}"
-      @opponentSession = @supermodel.loadModel(opponentSession, 'opponent_session').model
+      @opponentSessionResource = @supermodel.loadModel(opponentSession, 'opponent_session')
+      @opponentSession = @opponentSessionResource.model

   # Supermodel (Level) Loading

@@ -111,6 +113,8 @@
     @thangIDs = _.uniq thangIDs
     @thangNames = new ThangNamesCollection(@thangIDs)
     worldNecessities.push @supermodel.loadCollection(@thangNames, 'thang_names')
+    worldNecessities.push @sessionResource if @sessionResource?.isLoading
+    worldNecessities.push @opponentSessionResource if @opponentSessionResource?.isLoading

     for obj in objUniq componentVersions
       url = "/db/level.component/#{obj.original}/version/#{obj.majorVersion}"


fix clock mixin teset

fix clock mixin teset

--- test/models/mixins/clock.coffee
+++ test/models/mixins/clock.coffee
@@ -3,24 +3,26 @@
 Backbone        = require 'backbone'
 moment          = require 'moment'
 { fabricate }   = require 'antigravity'
-{ Image }       = require 'artsy-backbone-mixins'
-imageSizesMixin = require '../../../models/mixins/image_sizes'
+ClockMixin      = require '../../../models/mixins/clock'
 sd              = require('sharify').data

 class Model extends Backbone.Model
-  _.extend @prototype, Image()
-  _.extend @prototype, imageSizesMixin
+  _.extend @prototype, ClockMixin

 describe 'Image Sizes Mixin', ->
   beforeEach ->
+    sinon.stub Backbone, 'sync'
     @model = new Model fabricate 'sale'
+
+  afterEach ->
+    Backbone.sync.restore()

   describe '#calculateOffsetTimes', ->
     describe 'client time preview', ->

       beforeEach ->
         @clock = sinon.useFakeTimers()
-        @sale.set
+        @model.set
           is_auction: true
           start_at: moment().add('minutes', 1).format("YYYY-MM-DD HH:mm:ss ZZ")
           end_at: moment().add('minutes', 3).format("YYYY-MM-DD HH:mm:ss ZZ")
@@ -29,31 +31,31 @@
         @clock.restore()

       it 'reflects server preview state', ->
-        @sale.calculateOffsetTimes()
+        @model.calculateOffsetTimes()
         Backbone.sync.args[0][2].success { time: moment().format("YYYY-MM-DD HH:mm:ss ZZ") }
-        @sale.get('offsetStartAtMoment').should.eql moment(@sale.get('start_at'))
-        @sale.get('offsetEndAtMoment').should.eql moment(@sale.get('end_at'))
-        @sale.get('auctionState').should.equal 'preview'
+        @model.get('offsetStartAtMoment').should.eql moment(@model.get('start_at'))
+        @model.get('offsetEndAtMoment').should.eql moment(@model.get('end_at'))
+        @model.get('auctionState').should.equal 'preview'

       it 'reflects server open state', ->
-        @sale.calculateOffsetTimes()
+        @model.calculateOffsetTimes()
         Backbone.sync.args[0][2].success { time: moment().add('minutes', 2).format("YYYY-MM-DD HH:mm:ss ZZ") }
-        @sale.get('offsetStartAtMoment').should.eql moment(@sale.get('start_at')).subtract('minutes', 2)
-        @sale.get('offsetEndAtMoment').should.eql moment(@sale.get('end_at')).subtract('minutes', 2)
-        @sale.get('auctionState').should.equal 'open'
+        @model.get('offsetStartAtMoment').should.eql moment(@model.get('start_at')).subtract('minutes', 2)
+        @model.get('offsetEndAtMoment').should.eql moment(@model.get('end_at')).subtract('minutes', 2)
+        @model.get('auctionState').should.equal 'open'

       it 'reflects server closed state', ->
-        @sale.calculateOffsetTimes()
+        @model.calculateOffsetTimes()
         Backbone.sync.args[0][2].success { time: moment().add('minutes', 4).format("YYYY-MM-DD HH:mm:ss ZZ") }
-        @sale.get('offsetStartAtMoment').should.eql moment(@sale.get('start_at')).subtract('minutes', 4)
-        @sale.get('offsetEndAtMoment').should.eql moment(@sale.get('end_at')).subtract('minutes', 4)
-        @sale.get('auctionState').should.equal 'closed'
+        @model.get('offsetStartAtMoment').should.eql moment(@model.get('start_at')).subtract('minutes', 4)
+        @model.get('offsetEndAtMoment').should.eql moment(@model.get('end_at')).subtract('minutes', 4)
+        @model.get('auctionState').should.equal 'closed'

     describe 'client time open', ->

       beforeEach ->
         @clock = sinon.useFakeTimers()
-        @sale.set
+        @model.set
           is_auction: true
           start_at: moment().add('minutes', 1).format("YYYY-MM-DD HH:mm:ss ZZ")
           end_at: moment().add('minutes', 3).format("YYYY-MM-DD HH:mm:ss ZZ")
@@ -63,31 +65,31 @@
         @clock.restore()

       it 'reflects server preview state', ->
-        @sale.calculateOffsetTimes()
+        @model.calculateOffsetTimes()
         Backbone.sync.args[0][2].success { time: moment().subtract('minutes', 2).format("YYYY-MM-DD HH:mm:ss ZZ") }
-        @sale.get('offsetStartAtMoment').should.eql moment(@sale.get('start_at')).add('minutes', 2)
-        @sale.get('offsetEndAtMoment').should.eql moment(@sale.get('end_at')).add('minutes', 2)
-        @sale.get('auctionState').should.equal 'preview'
+        @model.get('offsetStartAtMoment').should.eql moment(@model.get('start_at')).add('minutes', 2)
+        @model.get('offsetEndAtMoment').should.eql moment(@model.get('end_at')).add('minutes', 2)
+        @model.get('auctionState').should.equal 'preview'

       it 'reflects server open state', ->
-        @sale.calculateOffsetTimes()
+        @model.calculateOffsetTimes()
         Backbone.sync.args[0][2].success { time: moment().format("YYYY-MM-DD HH:mm:ss ZZ") }
-        @sale.get('auctionState').should.equal 'open'
-        @sale.get('offsetStartAtMoment').should.eql moment(@sale.get('start_at'))
-        @sale.get('offsetEndAtMoment').should.eql moment(@sale.get('end_at'))
+        @model.get('auctionState').should.equal 'open'
+        @model.get('offsetStartAtMoment').should.eql moment(@model.get('start_at'))
+        @model.get('offsetEndAtMoment').should.eql moment(@model.get('end_at'))

       it 'reflects server closed state', ->
-        @sale.calculateOffsetTimes()
+        @model.calculateOffsetTimes()
         Backbone.sync.args[0][2].success { time: moment().add('minutes', 2).format("YYYY-MM-DD HH:mm:ss ZZ") }
-        @sale.get('offsetStartAtMoment').should.eql moment(@sale.get('start_at')).subtract('minutes', 2)
-        @sale.get('offsetEndAtMoment').should.eql moment(@sale.get('end_at')).subtract('minutes', 2)
-        @sale.get('auctionState').should.equal 'closed'
+        @model.get('offsetStartAtMoment').should.eql moment(@model.get('start_at')).subtract('minutes', 2)
+        @model.get('offsetEndAtMoment').should.eql moment(@model.get('end_at')).subtract('minutes', 2)
+        @model.get('auctionState').should.equal 'closed'

     describe 'client time closed', ->

       beforeEach ->
         @clock = sinon.useFakeTimers()
-        @sale.set
+        @model.set
           is_auction: true
           start_at: moment().add('minutes', 1).format("YYYY-MM-DD HH:mm:ss ZZ")
           end_at: moment().add('minutes', 3).format("YYYY-MM-DD HH:mm:ss ZZ")
@@ -97,22 +99,22 @@
         @clock.restore()

       it 'reflects server preview state', ->
-        @sale.calculateOffsetTimes()
+        @model.calculateOffsetTimes()
         Backbone.sync.args[0][2].success { time: moment().subtract('minutes', 4).format("YYYY-MM-DD HH:mm:ss ZZ") }
-        @sale.get('offsetStartAtMoment').should.eql moment(@sale.get('start_at')).add('minutes', 4)
-        @sale.get('offsetEndAtMoment').should.eql moment(@sale.get('end_at')).add('minutes', 4)
-        @sale.get('auctionState').should.equal 'preview'
+        @model.get('offsetStartAtMoment').should.eql moment(@model.get('start_at')).add('minutes', 4)
+        @model.get('offsetEndAtMoment').should.eql moment(@model.get('end_at')).add('minutes', 4)
+        @model.get('auctionState').should.equal 'preview'

       it 'reflects server open state', ->
-        @sale.calculateOffsetTimes()
+        @model.calculateOffsetTimes()
         Backbone.sync.args[0][2].success { time: moment().subtract('minutes', 2).format("YYYY-MM-DD HH:mm:ss ZZ") }
-        @sale.get('offsetStartAtMoment').should.eql moment(@sale.get('start_at')).add('minutes', 2)
-        @sale.get('offsetEndAtMoment').should.eql moment(@sale.get('end_at')).add('minutes', 2)
-        @sale.get('auctionState').should.equal 'open'
+        @model.get('offsetStartAtMoment').should.eql moment(@model.get('start_at')).add('minutes', 2)
+        @model.get('offsetEndAtMoment').should.eql moment(@model.get('end_at')).add('minutes', 2)
+        @model.get('auctionState').should.equal 'open'

       it 'reflects server closed state', ->
-        @sale.calculateOffsetTimes()
+        @model.calculateOffsetTimes()
         Backbone.sync.args[0][2].success { time: moment().format("YYYY-MM-DD HH:mm:ss ZZ") }
-        @sale.get('auctionState').should.equal 'closed'
-        @sale.get('offsetStartAtMoment').should.eql moment(@sale.get('start_at'))
-        @sale.get('offsetEndAtMoment').should.eql moment(@sale.get('end_at'))
+        @model.get('auctionState').should.equal 'closed'
+        @model.get('offsetStartAtMoment').should.eql moment(@model.get('start_at'))
+        @model.get('offsetEndAtMoment').should.eql moment(@model.get('end_at'))


macro tests

macro tests

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

--- test/macros.coffee
+++ test/macros.coffee
@@ -0,0 +1,14 @@
+suite 'Macros', ->
+
+  test '__LINE__', ->
+    eq 4, __LINE__
+
+  test '__DATE__', ->
+    eq (new Date).toDateString()[4..], __DATE__
+
+  test '__TIME__', ->
+    ok /^(\d\d:){2}\d\d$/.test __TIME__
+
+  test '__DATETIMEMS__', ->
+    ok (-6e4 < (__DATETIMEMS__ - new Date) < 6e4)
+    ok 1e12 < __DATETIMEMS__ < 1e13


Keep multiple servers logged

Keep multiple servers logged

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


Start with lazyLoader in Activity

Start with lazyLoader in Activity

--- client/app/Applications/Activity.kdapplication/AppController.coffee
+++ client/app/Applications/Activity.kdapplication/AppController.coffee
@@ -249,6 +249,7 @@
     controller.removeAllItems()
     @loadSomeTeasers ->
       controller.isLoading = no
+      controller.propagateEvent KDEventType : 'LazyLoadComplete'
       callback?()

   createContentDisplay:(activity)->
@@ -291,6 +292,7 @@
     viewOptions.comments      or= yes
     viewOptions.subItemClass  or= options.subItemClass
     options.view              or= new KDListView viewOptions, data
+    options.startWithLazyLoader = yes
     super

     @_state = 'public'


Add Atom GitHub settings file

Add Atom GitHub settings file

error: pathspec 'topics/atom.symlink/github.cson' did not match any file(s) known to git

--- topics/atom.symlink/github.cson
+++ topics/atom.symlink/github.cson
@@ -0,0 +1 @@
+# Store non-visible GitHub package state.


Add test for nist 521

Add test for nist 521

error: pathspec 'test/files/p521.iced' did not match any file(s) known to git


Ace: Pass no option to avoid appStorage write call.

--- client/ace/lib/ace.coffee
+++ client/ace/lib/ace.coffee
@@ -162,7 +162,7 @@
     @setShortcuts yes

     @appStorage.fetchStorage (storage) =>
-      @setTheme()
+      @setTheme null, no
       @setUseSoftTabs         @appStorage.getValue('useSoftTabs')         ? yes       , no
       @setShowGutter          @appStorage.getValue('showGutter')          ? yes       , no
       @setUseWordWrap         @appStorage.getValue('useWordWrap')         ? no        , no
@@ -171,8 +171,8 @@
       @setShowInvisibles      @appStorage.getValue('showInvisibles')      ? no        , no
       @setFontSize            @appStorage.getValue('fontSize')            ? 12        , no
       @setTabSize             @appStorage.getValue('tabSize')             ? 4         , no
-      @setKeyboardHandler     @appStorage.getValue('keyboardHandler')     ? 'default'
-      @setScrollPastEnd       @appStorage.getValue('scrollPastEnd')       ? yes
+      @setKeyboardHandler     @appStorage.getValue('keyboardHandler')     ? 'default' , no
+      @setScrollPastEnd       @appStorage.getValue('scrollPastEnd')       ? yes       , no
       @setEnableAutocomplete  @appStorage.getValue('enableAutocomplete')  ? yes       , no
       @setEnableSnippets      @appStorage.getValue('enableSnippets')      ? yes       , no
       @setEnableEmmet         @appStorage.getValue('enableEmmet')         ? no        , no
@@ -528,17 +528,17 @@
     @appStorage.setValue 'showInvisibles', value

-  setKeyboardHandler: (name = 'default') ->
-
-    @appStorage.setValue 'keyboardHandler', name
+  setKeyboardHandler: (name = 'default', save = yes) ->
+
     handler = if name isnt 'default' then "ace/keyboard/#{name}" else null
     @editor.setKeyboardHandler handler
-
-
-  setScrollPastEnd: (value = yes) ->
+    @appStorage.setValue 'keyboardHandler', name  if save
+
+
+  setScrollPastEnd: (value = yes, save = yes) ->

     @editor.setOption 'scrollPastEnd', value
-    @appStorage.setValue 'scrollPastEnd', value
+    @appStorage.setValue 'scrollPastEnd', value  if save

   setFontSize: (value, save = yes) ->


base file sharing

base file sharing

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

--- kites/sharedHosting/fileSharing.coffee
+++ kites/sharedHosting/fileSharing.coffee
@@ -0,0 +1,64 @@
+log4js = require 'log4js'
+log    = log4js.getLogger('[SharedHostingApi]')
+fs     = require 'fs'
+{exec} = require 'child_process'
+path   = require 'path'
+
+
+config =
+  baseSharedDir : '/Shared'
+  setfacl : '/usr/bin/setfacl'
+
+
+execFacl = (username, sharedDir) ->
+  setfacl   = "#{config.setfacl} -m d:u:#{username}:rwx #{sharedDir} && #{config.setfacl} -m u:#{username}:rwx #{sharedDir}"
+  exec setfacl, (err,stdout,stderr) ->
+    if err?
+      log.error err = "[ERROR] Can't execute #{setfacl}: #{stderr}"
+      return false
+    else
+      log.info "[OK] acl on #{sharedDir} changed with #{setfacl}"
+      return true
+
+
+
+
+setOwnerAcl = (username, callback) ->
+  if not username?
+    log.error err = "[ERROR] username should be defined"
+    callback err
+  else
+    sharedDir = path.join config.baseSharedDir, username
+    if not execFacl(username, sharedDir)
+      callback "[ERROR] can't share dir #{sharedDir}"
+
+createSharedDir = (username, callback) ->
+  sharedDir = path.join config.baseSharedDir, username
+  fs.mkdir sharedDir, 0720, (err, stat) ->
+    if err?
+      log.error err
+      callback err
+    else
+      setOwnerAcl username,(err)->
+        if err?
+          callback err
+        else
+          log.info "[OK] shared dir #{sharedDir} for user #{username} successfully created "
+          callback null
+
+shareWithUser = (owner, user, callback)->
+
+  sharedDir = path.join config.baseSharedDir, owner
+  setfacl   = "#{config.setfacl} -m d:u:#{user}:rwx #{sharedDir} && #{config.setfacl} -R -m u:#{user}:rwx #{sharedDir}"
+
+  exec setfacl, (err, stdout, stderr) ->
+    if err?
+      log.error err = "[ERROR] Can't execute #{setfacl}: #{stderr}"
+      callback err
+    else
+      log.info "[OK] acl on #{sharedDir} changed with #{setfacl}"
+      callback null
+
+
+
+


dix conjugaison

dix conjugaison

--- app/locale/fr.coffee
+++ app/locale/fr.coffee
@@ -288,7 +288,7 @@
     who_description_prefix: "ont lancé CodeCombat ensemble en 2013. Nous avons aussi créé "
     who_description_suffix: "en 2008, l'améliorant jusqu'au rang de première application web et iOS pour apprendre à écrire les caractères chinois et japonais."
     who_description_ending: "Maintenant nous apprenons aux gens à coder."
-    why_paragraph_1: "En développant Skritter, George ne savait pas programmer et été frustré de ne pas pouvoir implémenter ses idées. Ensuite, il essaya d'apprendre, mais les cours n'étaient pas assez rapides. Son colocataire, voulant se requalifier et arrêter d'apprendre, essaya Codecademy, mais \"s'ennuya.\" Chaque semaine un nouvel ami commença Codecademy, puis abandonna. Nous nous sommes rendus compte que nous avions résolu le même problème avec Skritter: les gens apprennant grâce à des cours lents et intensifs quand nous avons besoin d'expérience rapide et intensive. Nous savons comment remédier à ça."
+    why_paragraph_1: "En développant Skritter, George ne savait pas programmer et était frustré de ne pas pouvoir implémenter ses idées. Ensuite, il essaya d'apprendre, mais les cours n'étaient pas assez rapides. Son colocataire, voulant se requalifier et arrêter d'apprendre, essaya Codecademy, mais \"s'ennuya.\" Chaque semaine un nouvel ami commença Codecademy, puis abandonna. Nous nous sommes rendus compte que nous avions résolu le même problème avec Skritter: les gens apprennant grâce à des cours lents et intensifs quand nous avons besoin d'expérience rapide et intensive. Nous savons comment remédier à ça."
     why_paragraph_2: "Besoin d'apprendre à développer? Vous n'avez pas besoin de cours. Vous avez besoin d'écrire beaucoup de code et de vous amuser en le faisant."
     why_paragraph_3_prefix: "C'est ce dont il s'agit en programmation. Ca doit être amusant. Pas amusant comme"
     why_paragraph_3_italic: "génial un badge"