diff --git a/Gemfile b/Gemfile index e456d6f..40cd3dd 100644 --- a/Gemfile +++ b/Gemfile @@ -2,8 +2,6 @@ source 'https://rubygems.org' -gem "bootstrap", "~> 5.2" - gem 'jekyll', '~> 4' gem 'faraday-retry', '~> 2.2' @@ -16,10 +14,6 @@ group :jekyll_plugins do gem 'just-the-docs' end -source 'https://rubygems.org' -gem 'github-pages', group: :jekyll_plugins - - group :development, :test do gem 'axe-core-capybara' gem 'axe-core-rspec' diff --git a/Gemfile.lock b/Gemfile.lock index 39cac66..8d6ed00 100644 --- a/Gemfile.lock +++ b/Gemfile.lock @@ -54,16 +54,12 @@ GEM faraday-retry (2.2.1) faraday (~> 2.0) ffi (1.17.0-arm64-darwin) - ffi (1.17.0-x64-mingw-ucrt) ffi (1.17.0-x86_64-darwin) ffi (1.17.0-x86_64-linux-gnu) forwardable-extended (2.6.0) google-protobuf (4.27.3-arm64-darwin) bigdecimal rake (>= 13) - google-protobuf (4.27.3-x64-mingw-ucrt) - bigdecimal - rake (>= 13) google-protobuf (4.27.3-x86_64-darwin) bigdecimal rake (>= 13) @@ -129,8 +125,6 @@ GEM uri nokogiri (1.16.7-arm64-darwin) racc (~> 1.4) - nokogiri (1.16.7-x64-mingw-ucrt) - racc (~> 1.4) nokogiri (1.16.7-x86_64-darwin) racc (~> 1.4) nokogiri (1.16.7-x86_64-linux) @@ -196,8 +190,6 @@ GEM safe_yaml (1.0.5) sass-embedded (1.77.8-arm64-darwin) google-protobuf (~> 4.26) - sass-embedded (1.77.8-x64-mingw-ucrt) - google-protobuf (~> 4.26) sass-embedded (1.77.8-x86_64-darwin) google-protobuf (~> 4.26) sass-embedded (1.77.8-x86_64-linux-gnu) @@ -228,7 +220,6 @@ GEM PLATFORMS arm64-darwin-23 - x64-mingw-ucrt x86_64-darwin-23 x86_64-linux diff --git a/_config.yml b/_config.yml index 6c6d45d..eb89c28 100644 --- a/_config.yml +++ b/_config.yml @@ -1,28 +1,43 @@ -title: CS10 Summer 2024 -tagline: The Beauty and Joy of Computing -description: A gentle but thorough introduction to computer science. -author: Victoria Phelps -baseurl: fa24 # the subpath of your site, e.g. /blog -url: https://cs10.org/ -exclude: ["Gemfile", "Gemfile.lock", "LICENSE", "README.md"] -remote_theme: pmarsceill/just-the-docs@v0.3.3 - - -logo: "./assets/images/bjc.png" - -sass: - load_paths: - - _sass - - C:/Ruby31-x64/lib/ruby/gems/3.1.0/gems/bootstrap-5.2.3 +# Welcome to Jekyll! +# +# This config file is meant for settings that affect your whole site, values +# which you are expected to set up once and rarely edit after that. If you find +# yourself editing these this file very often, consider using Jekyll's data files +# feature for the data you need to update frequently. +# +# For technical reasons, this file is *NOT* reloaded automatically when you use +# 'jekyll serve'. If you change this file, please restart the server process. + +# Site settings +# These are used to personalize your new site. If you look in the HTML files, +# you will see them accessed via {{ site.title }}, {{ site.github_repo }}, and so on. +# You can create any custom variable you would like, and they will be accessible +# in the templates via {{ site.myvariable }}. + +# TODO(setup): Typically the course number, "DEPT XXX". it appears on nearly every page. Keep it short. :) +title: Berkeley Class Site +# TODO:(setup): This should be the extended title of your course. e.g. "Introduction to Data Science" +tagline: A Jekyll template for course websites +description: A modern, highly customizable, responsive Jekyll template for course websites +# TODO(template): this should be built from the staff list... +author: Various Bears +# You should use either light or dark as the theme. +color_scheme: light -# Class settings +# TODO(setup): Set this to the semester, e.g. /sp24, (faXX / spXX / suXX / wiXX ) +baseurl: '/berkeley-class-site' # the subpath of your site, which should just be the semester. +# TODO(setup): Set this to your course's domain +url: 'https://berkeley-eecs.github.io' # the hostname & protocol for your site, e.g. http://example.com +# Course variables +# Course variables can appear in various places around the website, if something isn't used leave it blank. +# TODO(setup): Set all of these course variables course: SAMPLE 101 -course_email: cs10@berkeley.edu +course_email: COURSE_EMAIL@berkeley.edu gradescope_course_id: 123456 # you can find this in the Gradescope URL after /courses bcourses_course_id: 123456 # Same as above, but for bCourses. Leave blank if not in use... ed_course_id: 123456 # Again, same as above. -sememster: fa24 +sememster: spYY | suYY | faYY # set for the current seemester # This should be one of eecs, dsus, stat # (Future) This will control some footer text, and later custom styling. course_department: dsus @@ -31,26 +46,16 @@ course_department: dsus # If you have no archive page, comment this line out or leave blank. class_archive_path: / -# Theme settings +# TODO(setup): Set these auxiliary links as you wish - they show up on the top right +aux_links: + # TODO(template): Move this to be built-in. + Ed: + - 'https://edstem.org' + OH Queue: + - 'https://oh.c88c.org' + Berkeley Class Site on GitHub: + - 'https://github.com/berkeley-eecs/berkeley-class-site' -color_scheme: light -search_enabled: true -heading_anchors: true -permalink: pretty -aux_links_new_tab: true -ga_tracking: UA-47210910-1 -external_navigation: - - title: iClicker - url: https://student.iclicker.com/#/login - - title: Lecture Recordings - url: https://drive.google.com/drive/folders/1euBGG5sG6TnWGIE0qYiY5IbvvpW7Rh_X?usp=sharing - - title: Ed Discussion - url: https://edstem.org/us/courses/59710/discussion/ - - title: Gradescope - url: https://www.gradescope.com/courses/782967 - - title: Snap! - url: https://snap.berkeley.edu/run -footer_content: # Collections for website data collections: @@ -133,7 +138,7 @@ plugins: - jekyll-include-cache # Theme settings - +theme: just-the-docs search_enabled: true heading_anchors: true permalink: pretty diff --git a/_includes/nav.html b/_includes/nav.html deleted file mode 100644 index 18a388f..0000000 --- a/_includes/nav.html +++ /dev/null @@ -1,109 +0,0 @@ - - -
- diff --git a/_includes/youtube.html b/_includes/youtube.html deleted file mode 100644 index 72d4376..0000000 --- a/_includes/youtube.html +++ /dev/null @@ -1,18 +0,0 @@ -
- -
- - - \ No newline at end of file diff --git a/_layouts/minimal.html b/_layouts/minimal.html deleted file mode 100644 index 5c70640..0000000 --- a/_layouts/minimal.html +++ /dev/null @@ -1,124 +0,0 @@ ---- -layout: table_wrappers ---- - - - - -{% include head.html %} - - - - Link - - - - - - - {% capture nav %} - {% if site.just_the_docs.collections %} - {% assign collections_size = site.just_the_docs.collections | size %} - {% for collection_entry in site.just_the_docs.collections %} - {% assign collection_key = collection_entry[0] %} - {% assign collection_value = collection_entry[1] %} - {% assign collection = site[collection_key] %} - {% if collection_value.nav_exclude != true %} - {% include nav.html pages=collection %} - {% endif %} - {% endfor %} - {% else %} - {% include nav.html pages=site.html_pages %} - {% endif %} - {% endcapture %} - -
- {% unless page.url == "/" %} - {% if page.parent %} - {%- for node in pages_list -%} - {%- if node.parent == nil -%} - {%- if page.parent == node.title or page.grand_parent == node.title -%} - {%- assign first_level_url = node.url | absolute_url -%} - {%- endif -%} - {%- if node.has_children -%} - {%- assign children_list = pages_list | where: "parent", node.title -%} - {%- for child in children_list -%} - {%- if page.url == child.url or page.parent == child.title -%} - {%- assign second_level_url = child.url | absolute_url -%} - {%- endif -%} - {%- endfor -%} - {%- endif -%} - {%- endif -%} - {%- endfor -%} - - {% endif %} - {% endunless %} -
- {% if site.heading_anchors != false %} - {% include vendor/anchor_headings.html html=content beforeHeading="true" anchorBody="" anchorClass="anchor-heading" %} - {% else %} - {{ content }} - {% endif %} - - {% if page.has_children == true and page.has_toc != false %} -
-

Table of contents

- - {% endif %} - - {% capture footer_custom %} - {%- include footer_custom.html -%} - {% endcapture %} - {% if footer_custom != "" or site.last_edit_timestamp or site.gh_edit_link %} -
- - {% endif %} - -
-
- - diff --git a/assets/.DS_Store b/assets/.DS_Store deleted file mode 100644 index e0e8539..0000000 Binary files a/assets/.DS_Store and /dev/null differ diff --git a/assets/cities.csv b/assets/cities.csv deleted file mode 100644 index abd4a19..0000000 --- a/assets/cities.csv +++ /dev/null @@ -1,629 +0,0 @@ -Name,Chinese? -Hong Kong,1 -Macau,1 -Beijing,1 -Chongqing,1 -Shanghai,1 -Tianjin,1 -Anqing,1 -Bengbu,1 -Bozhou,1 -Chaohu,1 -Chizhou,1 -Chuzhou,1 -Fuyang,1 -Hefei,1 -Huaibei,1 -Huainan,1 -Huangshan,1 -Jieshou,1 -Lu'an,1 -Ma'anshan,1 -Mingguang,1 -Ningguo,1 -Qianshan,1 -Suzhou,1 -Tianchang,1 -Tongcheng,1 -Tongling,1 -Wuhu,1 -Xuancheng,1 -Fu'an,1 -Fuding,1 -Fuqing,1 -Fuzhou,1 -Jian'ou,1 -Jinjiang,1 -Longhai,1 -Longyan,1 -Nan'an,1 -Nanping,1 -Ningde,1 -Putian,1 -Quanzhou,1 -Sanming,1 -Shaowu,1 -Shishi,1 -Wuyishan,1 -Xiamen,1 -Yong'an,1 -Zhangping,1 -Zhangzhou,1 -Baiyin,1 -Dingxi,1 -Dunhuang,1 -Hezuo,1 -Huating,1 -Jiayuguan,1 -Jinchang,1 -Jiuquan,1 -Lanzhou,1 -Linxia,1 -Longnan,1 -Pingliang,1 -Qingyang,1 -Tianshui,1 -Wuwei,1 -Yumen,1 -Zhangye,1 -Chaozhou,1 -Dongguan,1 -Enping,1 -Foshan,1 -Gaozhou,1 -Guangzhou,1 -Heshan,1 -Heyuan,1 -Huazhou,1 -Huizhou,1 -Jiangmen,1 -Jieyang,1 -Kaiping,1 -Lechang,1 -Leizhou,1 -Lianjiang,1 -Lianzhou,1 -Lufeng,1 -Luoding,1 -Maoming,1 -Meizhou,1 -Nanxiong,1 -Puning,1 -Qingyuan,1 -Shantou,1 -Shanwei,1 -Shaoguan,1 -Shenzhen,1 -Sihui,1 -Taishan,1 -Wuchuan,1 -Xingning,1 -Xinyi,1 -Yangchun,1 -Yangjiang,1 -Yingde,1 -Yunfu,1 -Zhanjiang,1 -Zhaoqing,1 -Zhongshan,1 -Zhuhai,1 -Baise,1 -Beihai,1 -Beiliu,1 -Cenxi,1 -Chongzuo,1 -Dongxing,1 -Fangchenggang,1 -Guigang,1 -Guilin,1 -Guiping,1 -Hechi,1 -Heshan,1 -Hezhou,1 -Jingxi,1 -Laibin,1 -Lipu,1 -Liuzhou,1 -Nanning,1 -Pingxiang,1 -Qinzhou,1 -Wuzhou,1 -Yulin,1 -Anshun,1 -Bijie,1 -Chishui,1 -Duyun,1 -Fuquan,1 -Guiyang,1 -Kaili,1 -Liupanshui,1 -Panzhou,1 -Qingzhen,1 -Renhuai,1 -Tongren,1 -Xingren,1 -Xingyi,1 -Zunyi,1 -Danzhou,1 -Dongfang,1 -Haikou,1 -Qionghai,1 -Sansha,1 -Sanya,1 -Wanning,1 -Wenchang,1 -Wuzhishan,1 -Anguo,1 -Baoding,1 -Bazhou,1 -Botou,1 -Cangzhou,1 -Chengde,1 -Dingzhou,1 -Gaobeidian,1 -Handan,1 -Hengshui,1 -Hejian,1 -Huanghua,1 -Jinzhou,1 -Langfang,1 -Luanzhou,1 -Nangong,1 -Pingquan,1 -Qian'an,1 -Qinhuangdao,1 -Renqiu,1 -Sanhe,1 -Shahe,1 -Shenzhou,1 -Shijiazhuang,1 -Tangshan,1 -Xinji,1 -Wu'an,1 -Xingtai,1 -Xinle,1 -Zhangjiakou,1 -Zhuozhou,1 -Zunhua,1 -Anda,1 -Bei'an,1 -Daqing,1 -Dongning,1 -Fujin,1 -Fuyuan,1 -Hailin,1 -Hailun,1 -Harbin,1 -Hegang,1 -Heihe,1 -Hulin,1 -Jiamusi,1 -Jixi,1 -Mishan,1 -Mohe,1 -Mudanjiang,1 -Muling,1 -Nehe,1 -Ning'an,1 -Qiqihar,1 -Qitaihe,1 -Shangzhi,1 -Shuangyashan,1 -Suifenhe,1 -Suihua,1 -Tieli,1 -Tongjiang,1 -Wuchang,1 -Wudalianchi,1 -Yichun,1 -Zhaodong,1 -Anyang,1 -Changge,1 -Dengfeng,1 -Dengzhou,1 -Gongyi,1 -Hebi,1 -Huixian,1 -Jiaozuo,1 -Jiyuan,1 -Kaifeng,1 -Lingbao,1 -Linzhou,1 -Luohe,1 -Luoyang,1 -Mengzhou,1 -Nanyang,1 -Pingdingshan,1 -Puyang,1 -Qinyang,1 -Ruzhou,1 -Sanmenxia,1 -Shangqiu,1 -Weihui,1 -Wugang,1 -Xiangcheng,1 -Xingyang,1 -Xinmi,1 -Xinxiang,1 -Xinyang,1 -Xinzheng,1 -Xuchang,1 -Yanshi,1 -Yima,1 -Yongcheng,1 -Yuzhou,1 -Zhengzhou,1 -Zhoukou,1 -Zhumadian,1 -Anlu,1 -Chibi,1 -Dangyang,1 -Danjiangkou,1 -Daye,1 -Enshi,1 -Ezhou,1 -Guangshui,1 -Hanchuan,1 -Honghu,1 -Huanggang,1 -Huangshi,1 -Jingmen,1 -Jingshan,1 -Jingzhou,1 -Laohekou,1 -Lichuan,1 -Macheng,1 -Qianjiang,1 -Shishou,1 -Shiyan,1 -Suizhou,1 -Songzi,1 -Tianmen,1 -Wuhan,1 -Wuxue,1 -Xiangyang,1 -Xianning,1 -Xiantao,1 -Xiaogan,1 -Yichang,1 -Yicheng,1 -Yidu,1 -Yingcheng,1 -Zaoyang,1 -Zhijiang,1 -Zhongxiang,1 -Changde,1 -Changning,1 -Changsha,1 -Chenzhou,1 -Hengyang,1 -Hongjiang,1 -Huaihua,1 -Jinshi,1 -Jishou,1 -Leiyang,1 -Lengshuijiang,1 -Lianyuan,1 -Liling,1 -Linxiang,1 -Liuyang,1 -Loudi,1 -Miluo,1 -Ningxiang,1 -Shaoshan,1 -Shaoyang,1 -Wugang,1 -New York,0 -Los Angeles,0 -Chicago,0 -Houston,0 -Phoenix,0 -Philadelphia,0 -San Antonio,0 -San Diego,0 -Dallas,0 -San Jose,0 -Austin,0 -Jacksonville,0 -Fort Worth,0 -Columbus,0 -San Francisco,0 -Charlotte,0 -Indianapolis,0 -Seattle,0 -Denver,0 -Washington,0 -Boston,0 -El Paso,0 -Detroit,0 -Nashville,0 -Portland,0 -Memphis,0 -Oklahoma City,0 -Las Vegas,0 -Louisville,0 -Baltimore,0 -Milwaukee,0 -Albuquerque,0 -Tucson,0 -Fresno,0 -Mesa,0 -Sacramento,0 -Atlanta,0 -Kansas City,0 -Colorado Springs,0 -Miami,0 -Raleigh,0 -Omaha,0 -Long Beach,0 -Virginia Beach,0 -Oakland,0 -Minneapolis,0 -Tulsa,0 -Arlington,0 -Tampa,0 -New Orleans,0 -Wichita,0 -Cleveland,0 -Bakersfield,0 -Aurora,0 -Anaheim,0 -Honolulu,0 -Santa Ana,0 -Riverside,0 -Corpus Christi,0 -Lexington,0 -Stockton,0 -Henderson,0 -Saint Paul,0 -St. Louis,0 -Cincinnati,0 -Pittsburgh,0 -Greensboro,0 -Anchorage,0 -Plano,0 -Lincoln,0 -Orlando,0 -Irvine,0 -Newark,0 -Toledo,0 -Durham,0 -Chula Vista,0 -Fort Wayne,0 -Jersey City,0 -St. Petersburg,0 -Laredo,0 -Madison,0 -Chandler,0 -Buffalo,0 -Lubbock,0 -Scottsdale,0 -Reno,0 -Glendale,0 -Gilbert,0 -Winston–Salem,0 -North Las Vegas,0 -Norfolk,0 -Chesapeake,0 -Garland,0 -Irving,0 -Hialeah,0 -Fremont,0 -Boise,0 -Richmond,0 -Baton Rouge,0 -Spokane,0 -Des Moines,0 -Tacoma,0 -San Bernardino,0 -Modesto,0 -Fontana,0 -Santa Clarita,0 -Birmingham,0 -Oxnard,0 -Fayetteville,0 -Moreno Valley,0 -Rochester,0 -Glendale,0 -Huntington Beach,0 -Salt Lake City,0 -Grand Rapids,0 -Amarillo,0 -Yonkers,0 -Aurora,0 -Montgomery,0 -Akron,0 -Little Rock,0 -Huntsville,0 -Augusta,0 -Port St. Lucie,0 -Grand Prairie,0 -Columbus,0 -Tallahassee,0 -Overland Park,0 -Tempe,0 -McKinney,0 -Mobile,0 -Cape Coral,0 -Shreveport,0 -Frisco,0 -Knoxville,0 -Worcester,0 -Brownsville,0 -Vancouver,0 -Fort Lauderdale,0 -Sioux Falls,0 -Ontario,0 -Chattanooga,0 -Providence,0 -Newport News,0 -Rancho Cucamonga,0 -Santa Rosa,0 -Oceanside,0 -Salem,0 -Elk Grove,0 -Garden Grove,0 -Pembroke Pines,0 -Peoria,0 -Eugene,0 -Corona,0 -Cary,0 -Springfield,0 -Fort Collins,0 -Jackson,0 -Alexandria,0 -Hayward,0 -Lancaster,0 -Lakewood,0 -Clarksville,0 -Palmdale,0 -Salinas,0 -Springfield,0 -Hollywood,0 -Pasadena,0 -Sunnyvale,0 -Macon,0 -Kansas City,0 -Pomona,0 -Escondido,0 -Killeen,0 -Naperville,0 -Joliet,0 -Bellevue,0 -Rockford,0 -Savannah,0 -Paterson,0 -Torrance,0 -Bridgeport,0 -McAllen,0 -Mesquite,0 -Syracuse,0 -Midland,0 -Pasadena,0 -Murfreesboro,0 -Miramar,0 -Dayton,0 -Fullerton,0 -Olathe,0 -Orange,0 -Thornton,0 -Roseville,0 -Denton,0 -Waco,0 -Surprise,0 -Carrollton,0 -West Valley City,0 -Charleston,0 -Warren,0 -Hampton,0 -Gainesville,0 -Visalia,0 -Coral Springs,0 -Columbia,0 -Cedar Rapids,0 -Sterling Heights,0 -New Haven,0 -Stamford,0 -Concord,0 -Kent,0 -Santa Clara,0 -Elizabeth,0 -Round Rock,0 -Thousand Oaks,0 -Lafayette,0 -Athens,0 -Topeka,0 -Simi Valley,0 -Fargo,0 -Norman,0 -Columbia,0 -Abilene,0 -Wilmington,0 -Hartford,0 -Victorville,0 -Pearland,0 -Vallejo,0 -Ann Arbor,0 -Berkeley,0 -Allentown,0 -Richardson,0 -Odessa,0 -Arvada,0 -Cambridge,0 -Sugar Land,0 -Beaumont,0 -Lansing,0 -Evansville,0 -Rochester,0 -Independence,0 -Fairfield,0 -Provo,0 -Clearwater,0 -College Station,0 -West Jordan,0 -Carlsbad,0 -El Monte,0 -Murrieta,0 -Temecula,0 -Springfield,0 -Palm Bay,0 -Costa Mesa,0 -Westminster,0 -North Charleston,0 -Miami Gardens,0 -Manchester,0 -High Point,0 -Downey,0 -Clovis,0 -Pompano Beach,0 -Pueblo,0 -Elgin,0 -Lowell,0 -Antioch,0 -West Palm Beach,0 -Peoria,0 -Everett,0 -Ventura,0 -Centennial,0 -Lakeland,0 -Gresham,0 -Richmond,0 -Billings,0 -Inglewood,0 -Broken Arrow,0 -Sandy Springs,0 -Jurupa Valley,0 -Hillsboro,0 -Waterbury,0 -Santa Maria,0 -Boulder,0 -Greeley,0 -Daly City,0 -Meridian,0 -Lewisville,0 -Davie,0 -West Covina,0 -League City,0 -Tyler,0 -Norwalk,0 -San Mateo,0 -Green Bay,0 -Wichita Falls,0 -Sparks,0 -Lakewood,0 -Burbank,0 -Rialto,0 -Allen,0 -El Cajon,0 -Las Cruces,0 -Renton,0 -Davenport,0 -South Bend,0 -Vista,0 -Tuscaloosa,0 -Clinton,0 -Edison,0 -Woodbridge,0 -San Angelo,0 -Kenosha,0 -Vacaville,0 \ No newline at end of file diff --git a/assets/css/styles.scss b/assets/css/styles.scss deleted file mode 100644 index 65bf29f..0000000 --- a/assets/css/styles.scss +++ /dev/null @@ -1,14 +0,0 @@ -.youtube-wrapper { - position: relative; - width: 100%; - height: 0; - padding-bottom: 56.25%; - padding-top: 25px; -} -.youtube-wrapper iframe { - position: absolute; - top: 0; - left: 0; - width: 100%; - height: 100%; -} \ No newline at end of file diff --git a/assets/dayjs.min.js b/assets/dayjs.min.js deleted file mode 100644 index ac8df8c..0000000 --- a/assets/dayjs.min.js +++ /dev/null @@ -1 +0,0 @@ -!function(t,n){"object"==typeof exports&&"undefined"!=typeof module?module.exports=n():"function"==typeof define&&define.amd?define(n):t.dayjs=n()}(this,function(){"use strict";var t="millisecond",n="second",e="minute",r="hour",i="day",s="week",u="month",o="quarter",a="year",h=/^(\d{4})-?(\d{1,2})-?(\d{0,2})[^0-9]*(\d{1,2})?:?(\d{1,2})?:?(\d{1,2})?.?(\d{1,3})?$/,f=/\[([^\]]+)]|Y{2,4}|M{1,4}|D{1,2}|d{1,4}|H{1,2}|h{1,2}|a|A|m{1,2}|s{1,2}|Z{1,2}|SSS/g,c=function(t,n,e){var r=String(t);return!r||r.length>=n?t:""+Array(n+1-r.length).join(e)+t},d={s:c,z:function(t){var n=-t.utcOffset(),e=Math.abs(n),r=Math.floor(e/60),i=e%60;return(n<=0?"+":"-")+c(r,2,"0")+":"+c(i,2,"0")},m:function(t,n){var e=12*(n.year()-t.year())+(n.month()-t.month()),r=t.clone().add(e,u),i=n-r<0,s=t.clone().add(e+(i?-1:1),u);return Number(-(e+(n-r)/(i?r-s:s-r))||0)},a:function(t){return t<0?Math.ceil(t)||0:Math.floor(t)},p:function(h){return{M:u,y:a,w:s,d:i,D:"date",h:r,m:e,s:n,ms:t,Q:o}[h]||String(h||"").toLowerCase().replace(/s$/,"")},u:function(t){return void 0===t}},$={name:"en",weekdays:"Sunday_Monday_Tuesday_Wednesday_Thursday_Friday_Saturday".split("_"),months:"January_February_March_April_May_June_July_August_September_October_November_December".split("_")},l="en",m={};m[l]=$;var y=function(t){return t instanceof v},M=function(t,n,e){var r;if(!t)return l;if("string"==typeof t)m[t]&&(r=t),n&&(m[t]=n,r=t);else{var i=t.name;m[i]=t,r=i}return e||(l=r),r},g=function(t,n,e){if(y(t))return t.clone();var r=n?"string"==typeof n?{format:n,pl:e}:n:{};return r.date=t,new v(r)},D=d;D.l=M,D.i=y,D.w=function(t,n){return g(t,{locale:n.$L,utc:n.$u,$offset:n.$offset})};var v=function(){function c(t){this.$L=this.$L||M(t.locale,null,!0),this.parse(t)}var d=c.prototype;return d.parse=function(t){this.$d=function(t){var n=t.date,e=t.utc;if(null===n)return new Date(NaN);if(D.u(n))return new Date;if(n instanceof Date)return new Date(n);if("string"==typeof n&&!/Z$/i.test(n)){var r=n.match(h);if(r)return e?new Date(Date.UTC(r[1],r[2]-1,r[3]||1,r[4]||0,r[5]||0,r[6]||0,r[7]||0)):new Date(r[1],r[2]-1,r[3]||1,r[4]||0,r[5]||0,r[6]||0,r[7]||0)}return new Date(n)}(t),this.init()},d.init=function(){var t=this.$d;this.$y=t.getFullYear(),this.$M=t.getMonth(),this.$D=t.getDate(),this.$W=t.getDay(),this.$H=t.getHours(),this.$m=t.getMinutes(),this.$s=t.getSeconds(),this.$ms=t.getMilliseconds()},d.$utils=function(){return D},d.isValid=function(){return!("Invalid Date"===this.$d.toString())},d.isSame=function(t,n){var e=g(t);return this.startOf(n)<=e&&e<=this.endOf(n)},d.isAfter=function(t,n){return g(t)+~]|"+M+")"+M+"*"),U=new RegExp(M+"|>"),X=new RegExp(F),V=new RegExp("^"+I+"$"),G={ID:new RegExp("^#("+I+")"),CLASS:new RegExp("^\\.("+I+")"),TAG:new RegExp("^("+I+"|[*])"),ATTR:new RegExp("^"+W),PSEUDO:new RegExp("^"+F),CHILD:new RegExp("^:(only|first|last|nth|nth-last)-(child|of-type)(?:\\("+M+"*(even|odd|(([+-]|)(\\d*)n|)"+M+"*(?:([+-]|)"+M+"*(\\d+)|))"+M+"*\\)|)","i"),bool:new RegExp("^(?:"+R+")$","i"),needsContext:new RegExp("^"+M+"*[>+~]|:(even|odd|eq|gt|lt|nth|first|last)(?:\\("+M+"*((?:-\\d)?\\d*)"+M+"*\\)|)(?=[^-]|$)","i")},Y=/HTML$/i,Q=/^(?:input|select|textarea|button)$/i,J=/^h\d$/i,K=/^[^{]+\{\s*\[native \w/,Z=/^(?:#([\w-]+)|(\w+)|\.([\w-]+))$/,ee=/[+~]/,te=new RegExp("\\\\[\\da-fA-F]{1,6}"+M+"?|\\\\([^\\r\\n\\f])","g"),ne=function(e,t){var n="0x"+e.slice(1)-65536;return t||(n<0?String.fromCharCode(n+65536):String.fromCharCode(n>>10|55296,1023&n|56320))},re=/([\0-\x1f\x7f]|^-?\d)|^-$|[^\0-\x1f\x7f-\uFFFF\w-]/g,ie=function(e,t){return t?"\0"===e?"\ufffd":e.slice(0,-1)+"\\"+e.charCodeAt(e.length-1).toString(16)+" ":"\\"+e},oe=function(){T()},ae=be(function(e){return!0===e.disabled&&"fieldset"===e.nodeName.toLowerCase()},{dir:"parentNode",next:"legend"});try{H.apply(t=O.call(p.childNodes),p.childNodes),t[p.childNodes.length].nodeType}catch(e){H={apply:t.length?function(e,t){L.apply(e,O.call(t))}:function(e,t){var n=e.length,r=0;while(e[n++]=t[r++]);e.length=n-1}}}function se(t,e,n,r){var i,o,a,s,u,l,c,f=e&&e.ownerDocument,p=e?e.nodeType:9;if(n=n||[],"string"!=typeof t||!t||1!==p&&9!==p&&11!==p)return n;if(!r&&(T(e),e=e||C,E)){if(11!==p&&(u=Z.exec(t)))if(i=u[1]){if(9===p){if(!(a=e.getElementById(i)))return n;if(a.id===i)return n.push(a),n}else if(f&&(a=f.getElementById(i))&&y(e,a)&&a.id===i)return n.push(a),n}else{if(u[2])return H.apply(n,e.getElementsByTagName(t)),n;if((i=u[3])&&d.getElementsByClassName&&e.getElementsByClassName)return H.apply(n,e.getElementsByClassName(i)),n}if(d.qsa&&!N[t+" "]&&(!v||!v.test(t))&&(1!==p||"object"!==e.nodeName.toLowerCase())){if(c=t,f=e,1===p&&(U.test(t)||z.test(t))){(f=ee.test(t)&&ye(e.parentNode)||e)===e&&d.scope||((s=e.getAttribute("id"))?s=s.replace(re,ie):e.setAttribute("id",s=S)),o=(l=h(t)).length;while(o--)l[o]=(s?"#"+s:":scope")+" "+xe(l[o]);c=l.join(",")}try{return H.apply(n,f.querySelectorAll(c)),n}catch(e){N(t,!0)}finally{s===S&&e.removeAttribute("id")}}}return g(t.replace($,"$1"),e,n,r)}function ue(){var r=[];return function e(t,n){return r.push(t+" ")>b.cacheLength&&delete e[r.shift()],e[t+" "]=n}}function le(e){return e[S]=!0,e}function ce(e){var t=C.createElement("fieldset");try{return!!e(t)}catch(e){return!1}finally{t.parentNode&&t.parentNode.removeChild(t),t=null}}function fe(e,t){var n=e.split("|"),r=n.length;while(r--)b.attrHandle[n[r]]=t}function pe(e,t){var n=t&&e,r=n&&1===e.nodeType&&1===t.nodeType&&e.sourceIndex-t.sourceIndex;if(r)return r;if(n)while(n=n.nextSibling)if(n===t)return-1;return e?1:-1}function de(t){return function(e){return"input"===e.nodeName.toLowerCase()&&e.type===t}}function he(n){return function(e){var t=e.nodeName.toLowerCase();return("input"===t||"button"===t)&&e.type===n}}function ge(t){return function(e){return"form"in e?e.parentNode&&!1===e.disabled?"label"in e?"label"in e.parentNode?e.parentNode.disabled===t:e.disabled===t:e.isDisabled===t||e.isDisabled!==!t&&ae(e)===t:e.disabled===t:"label"in e&&e.disabled===t}}function ve(a){return le(function(o){return o=+o,le(function(e,t){var n,r=a([],e.length,o),i=r.length;while(i--)e[n=r[i]]&&(e[n]=!(t[n]=e[n]))})})}function ye(e){return e&&"undefined"!=typeof e.getElementsByTagName&&e}for(e in d=se.support={},i=se.isXML=function(e){var t=e&&e.namespaceURI,n=e&&(e.ownerDocument||e).documentElement;return!Y.test(t||n&&n.nodeName||"HTML")},T=se.setDocument=function(e){var t,n,r=e?e.ownerDocument||e:p;return r!=C&&9===r.nodeType&&r.documentElement&&(a=(C=r).documentElement,E=!i(C),p!=C&&(n=C.defaultView)&&n.top!==n&&(n.addEventListener?n.addEventListener("unload",oe,!1):n.attachEvent&&n.attachEvent("onunload",oe)),d.scope=ce(function(e){return a.appendChild(e).appendChild(C.createElement("div")),"undefined"!=typeof e.querySelectorAll&&!e.querySelectorAll(":scope fieldset div").length}),d.attributes=ce(function(e){return e.className="i",!e.getAttribute("className")}),d.getElementsByTagName=ce(function(e){return e.appendChild(C.createComment("")),!e.getElementsByTagName("*").length}),d.getElementsByClassName=K.test(C.getElementsByClassName),d.getById=ce(function(e){return a.appendChild(e).id=S,!C.getElementsByName||!C.getElementsByName(S).length}),d.getById?(b.filter.ID=function(e){var t=e.replace(te,ne);return function(e){return e.getAttribute("id")===t}},b.find.ID=function(e,t){if("undefined"!=typeof t.getElementById&&E){var n=t.getElementById(e);return n?[n]:[]}}):(b.filter.ID=function(e){var n=e.replace(te,ne);return function(e){var t="undefined"!=typeof e.getAttributeNode&&e.getAttributeNode("id");return t&&t.value===n}},b.find.ID=function(e,t){if("undefined"!=typeof t.getElementById&&E){var n,r,i,o=t.getElementById(e);if(o){if((n=o.getAttributeNode("id"))&&n.value===e)return[o];i=t.getElementsByName(e),r=0;while(o=i[r++])if((n=o.getAttributeNode("id"))&&n.value===e)return[o]}return[]}}),b.find.TAG=d.getElementsByTagName?function(e,t){return"undefined"!=typeof t.getElementsByTagName?t.getElementsByTagName(e):d.qsa?t.querySelectorAll(e):void 0}:function(e,t){var n,r=[],i=0,o=t.getElementsByTagName(e);if("*"===e){while(n=o[i++])1===n.nodeType&&r.push(n);return r}return o},b.find.CLASS=d.getElementsByClassName&&function(e,t){if("undefined"!=typeof t.getElementsByClassName&&E)return t.getElementsByClassName(e)},s=[],v=[],(d.qsa=K.test(C.querySelectorAll))&&(ce(function(e){var t;a.appendChild(e).innerHTML="",e.querySelectorAll("[msallowcapture^='']").length&&v.push("[*^$]="+M+"*(?:''|\"\")"),e.querySelectorAll("[selected]").length||v.push("\\["+M+"*(?:value|"+R+")"),e.querySelectorAll("[id~="+S+"-]").length||v.push("~="),(t=C.createElement("input")).setAttribute("name",""),e.appendChild(t),e.querySelectorAll("[name='']").length||v.push("\\["+M+"*name"+M+"*="+M+"*(?:''|\"\")"),e.querySelectorAll(":checked").length||v.push(":checked"),e.querySelectorAll("a#"+S+"+*").length||v.push(".#.+[+~]"),e.querySelectorAll("\\\f"),v.push("[\\r\\n\\f]")}),ce(function(e){e.innerHTML="";var t=C.createElement("input");t.setAttribute("type","hidden"),e.appendChild(t).setAttribute("name","D"),e.querySelectorAll("[name=d]").length&&v.push("name"+M+"*[*^$|!~]?="),2!==e.querySelectorAll(":enabled").length&&v.push(":enabled",":disabled"),a.appendChild(e).disabled=!0,2!==e.querySelectorAll(":disabled").length&&v.push(":enabled",":disabled"),e.querySelectorAll("*,:x"),v.push(",.*:")})),(d.matchesSelector=K.test(c=a.matches||a.webkitMatchesSelector||a.mozMatchesSelector||a.oMatchesSelector||a.msMatchesSelector))&&ce(function(e){d.disconnectedMatch=c.call(e,"*"),c.call(e,"[s!='']:x"),s.push("!=",F)}),v=v.length&&new RegExp(v.join("|")),s=s.length&&new RegExp(s.join("|")),t=K.test(a.compareDocumentPosition),y=t||K.test(a.contains)?function(e,t){var n=9===e.nodeType?e.documentElement:e,r=t&&t.parentNode;return e===r||!(!r||1!==r.nodeType||!(n.contains?n.contains(r):e.compareDocumentPosition&&16&e.compareDocumentPosition(r)))}:function(e,t){if(t)while(t=t.parentNode)if(t===e)return!0;return!1},j=t?function(e,t){if(e===t)return l=!0,0;var n=!e.compareDocumentPosition-!t.compareDocumentPosition;return n||(1&(n=(e.ownerDocument||e)==(t.ownerDocument||t)?e.compareDocumentPosition(t):1)||!d.sortDetached&&t.compareDocumentPosition(e)===n?e==C||e.ownerDocument==p&&y(p,e)?-1:t==C||t.ownerDocument==p&&y(p,t)?1:u?P(u,e)-P(u,t):0:4&n?-1:1)}:function(e,t){if(e===t)return l=!0,0;var n,r=0,i=e.parentNode,o=t.parentNode,a=[e],s=[t];if(!i||!o)return e==C?-1:t==C?1:i?-1:o?1:u?P(u,e)-P(u,t):0;if(i===o)return pe(e,t);n=e;while(n=n.parentNode)a.unshift(n);n=t;while(n=n.parentNode)s.unshift(n);while(a[r]===s[r])r++;return r?pe(a[r],s[r]):a[r]==p?-1:s[r]==p?1:0}),C},se.matches=function(e,t){return se(e,null,null,t)},se.matchesSelector=function(e,t){if(T(e),d.matchesSelector&&E&&!N[t+" "]&&(!s||!s.test(t))&&(!v||!v.test(t)))try{var n=c.call(e,t);if(n||d.disconnectedMatch||e.document&&11!==e.document.nodeType)return n}catch(e){N(t,!0)}return 0":{dir:"parentNode",first:!0}," ":{dir:"parentNode"},"+":{dir:"previousSibling",first:!0},"~":{dir:"previousSibling"}},preFilter:{ATTR:function(e){return e[1]=e[1].replace(te,ne),e[3]=(e[3]||e[4]||e[5]||"").replace(te,ne),"~="===e[2]&&(e[3]=" "+e[3]+" "),e.slice(0,4)},CHILD:function(e){return e[1]=e[1].toLowerCase(),"nth"===e[1].slice(0,3)?(e[3]||se.error(e[0]),e[4]=+(e[4]?e[5]+(e[6]||1):2*("even"===e[3]||"odd"===e[3])),e[5]=+(e[7]+e[8]||"odd"===e[3])):e[3]&&se.error(e[0]),e},PSEUDO:function(e){var t,n=!e[6]&&e[2];return G.CHILD.test(e[0])?null:(e[3]?e[2]=e[4]||e[5]||"":n&&X.test(n)&&(t=h(n,!0))&&(t=n.indexOf(")",n.length-t)-n.length)&&(e[0]=e[0].slice(0,t),e[2]=n.slice(0,t)),e.slice(0,3))}},filter:{TAG:function(e){var t=e.replace(te,ne).toLowerCase();return"*"===e?function(){return!0}:function(e){return e.nodeName&&e.nodeName.toLowerCase()===t}},CLASS:function(e){var t=m[e+" "];return t||(t=new RegExp("(^|"+M+")"+e+"("+M+"|$)"))&&m(e,function(e){return t.test("string"==typeof e.className&&e.className||"undefined"!=typeof e.getAttribute&&e.getAttribute("class")||"")})},ATTR:function(n,r,i){return function(e){var t=se.attr(e,n);return null==t?"!="===r:!r||(t+="","="===r?t===i:"!="===r?t!==i:"^="===r?i&&0===t.indexOf(i):"*="===r?i&&-1:\x20\t\r\n\f]*)[\x20\t\r\n\f]*\/?>(?:<\/\1>|)$/i;function j(e,n,r){return m(n)?S.grep(e,function(e,t){return!!n.call(e,t,e)!==r}):n.nodeType?S.grep(e,function(e){return e===n!==r}):"string"!=typeof n?S.grep(e,function(e){return-1)[^>]*|#([\w-]+))$/;(S.fn.init=function(e,t,n){var r,i;if(!e)return this;if(n=n||D,"string"==typeof e){if(!(r="<"===e[0]&&">"===e[e.length-1]&&3<=e.length?[null,e,null]:q.exec(e))||!r[1]&&t)return!t||t.jquery?(t||n).find(e):this.constructor(t).find(e);if(r[1]){if(t=t instanceof S?t[0]:t,S.merge(this,S.parseHTML(r[1],t&&t.nodeType?t.ownerDocument||t:E,!0)),N.test(r[1])&&S.isPlainObject(t))for(r in t)m(this[r])?this[r](t[r]):this.attr(r,t[r]);return this}return(i=E.getElementById(r[2]))&&(this[0]=i,this.length=1),this}return e.nodeType?(this[0]=e,this.length=1,this):m(e)?void 0!==n.ready?n.ready(e):e(S):S.makeArray(e,this)}).prototype=S.fn,D=S(E);var L=/^(?:parents|prev(?:Until|All))/,H={children:!0,contents:!0,next:!0,prev:!0};function O(e,t){while((e=e[t])&&1!==e.nodeType);return e}S.fn.extend({has:function(e){var t=S(e,this),n=t.length;return this.filter(function(){for(var e=0;e\x20\t\r\n\f]*)/i,he=/^$|^module$|\/(?:java|ecma)script/i;ce=E.createDocumentFragment().appendChild(E.createElement("div")),(fe=E.createElement("input")).setAttribute("type","radio"),fe.setAttribute("checked","checked"),fe.setAttribute("name","t"),ce.appendChild(fe),y.checkClone=ce.cloneNode(!0).cloneNode(!0).lastChild.checked,ce.innerHTML="",y.noCloneChecked=!!ce.cloneNode(!0).lastChild.defaultValue,ce.innerHTML="",y.option=!!ce.lastChild;var ge={thead:[1,"","
"],col:[2,"","
"],tr:[2,"","
"],td:[3,"","
"],_default:[0,"",""]};function ve(e,t){var n;return n="undefined"!=typeof e.getElementsByTagName?e.getElementsByTagName(t||"*"):"undefined"!=typeof e.querySelectorAll?e.querySelectorAll(t||"*"):[],void 0===t||t&&A(e,t)?S.merge([e],n):n}function ye(e,t){for(var n=0,r=e.length;n",""]);var me=/<|&#?\w+;/;function xe(e,t,n,r,i){for(var o,a,s,u,l,c,f=t.createDocumentFragment(),p=[],d=0,h=e.length;d\s*$/g;function je(e,t){return A(e,"table")&&A(11!==t.nodeType?t:t.firstChild,"tr")&&S(e).children("tbody")[0]||e}function De(e){return e.type=(null!==e.getAttribute("type"))+"/"+e.type,e}function qe(e){return"true/"===(e.type||"").slice(0,5)?e.type=e.type.slice(5):e.removeAttribute("type"),e}function Le(e,t){var n,r,i,o,a,s;if(1===t.nodeType){if(Y.hasData(e)&&(s=Y.get(e).events))for(i in Y.remove(t,"handle events"),s)for(n=0,r=s[i].length;n").attr(n.scriptAttrs||{}).prop({charset:n.scriptCharset,src:n.url}).on("load error",i=function(e){r.remove(),i=null,e&&t("error"===e.type?404:200,e.type)}),E.head.appendChild(r[0])},abort:function(){i&&i()}}});var _t,zt=[],Ut=/(=)\?(?=&|$)|\?\?/;S.ajaxSetup({jsonp:"callback",jsonpCallback:function(){var e=zt.pop()||S.expando+"_"+wt.guid++;return this[e]=!0,e}}),S.ajaxPrefilter("json jsonp",function(e,t,n){var r,i,o,a=!1!==e.jsonp&&(Ut.test(e.url)?"url":"string"==typeof e.data&&0===(e.contentType||"").indexOf("application/x-www-form-urlencoded")&&Ut.test(e.data)&&"data");if(a||"jsonp"===e.dataTypes[0])return r=e.jsonpCallback=m(e.jsonpCallback)?e.jsonpCallback():e.jsonpCallback,a?e[a]=e[a].replace(Ut,"$1"+r):!1!==e.jsonp&&(e.url+=(Tt.test(e.url)?"&":"?")+e.jsonp+"="+r),e.converters["script json"]=function(){return o||S.error(r+" was not called"),o[0]},e.dataTypes[0]="json",i=C[r],C[r]=function(){o=arguments},n.always(function(){void 0===i?S(C).removeProp(r):C[r]=i,e[r]&&(e.jsonpCallback=t.jsonpCallback,zt.push(r)),o&&m(i)&&i(o[0]),o=i=void 0}),"script"}),y.createHTMLDocument=((_t=E.implementation.createHTMLDocument("").body).innerHTML="
",2===_t.childNodes.length),S.parseHTML=function(e,t,n){return"string"!=typeof e?[]:("boolean"==typeof t&&(n=t,t=!1),t||(y.createHTMLDocument?((r=(t=E.implementation.createHTMLDocument("")).createElement("base")).href=E.location.href,t.head.appendChild(r)):t=E),o=!n&&[],(i=N.exec(e))?[t.createElement(i[1])]:(i=xe([e],t,o),o&&o.length&&S(o).remove(),S.merge([],i.childNodes)));var r,i,o},S.fn.load=function(e,t,n){var r,i,o,a=this,s=e.indexOf(" ");return-1").append(S.parseHTML(e)).find(r):e)}).always(n&&function(e,t){a.each(function(){n.apply(this,o||[e.responseText,t,e])})}),this},S.expr.pseudos.animated=function(t){return S.grep(S.timers,function(e){return t===e.elem}).length},S.offset={setOffset:function(e,t,n){var r,i,o,a,s,u,l=S.css(e,"position"),c=S(e),f={};"static"===l&&(e.style.position="relative"),s=c.offset(),o=S.css(e,"top"),u=S.css(e,"left"),("absolute"===l||"fixed"===l)&&-1<(o+u).indexOf("auto")?(a=(r=c.position()).top,i=r.left):(a=parseFloat(o)||0,i=parseFloat(u)||0),m(t)&&(t=t.call(e,n,S.extend({},s))),null!=t.top&&(f.top=t.top-s.top+a),null!=t.left&&(f.left=t.left-s.left+i),"using"in t?t.using.call(e,f):c.css(f)}},S.fn.extend({offset:function(t){if(arguments.length)return void 0===t?this:this.each(function(e){S.offset.setOffset(this,t,e)});var e,n,r=this[0];return r?r.getClientRects().length?(e=r.getBoundingClientRect(),n=r.ownerDocument.defaultView,{top:e.top+n.pageYOffset,left:e.left+n.pageXOffset}):{top:0,left:0}:void 0},position:function(){if(this[0]){var e,t,n,r=this[0],i={top:0,left:0};if("fixed"===S.css(r,"position"))t=r.getBoundingClientRect();else{t=this.offset(),n=r.ownerDocument,e=r.offsetParent||n.documentElement;while(e&&(e===n.body||e===n.documentElement)&&"static"===S.css(e,"position"))e=e.parentNode;e&&e!==r&&1===e.nodeType&&((i=S(e).offset()).top+=S.css(e,"borderTopWidth",!0),i.left+=S.css(e,"borderLeftWidth",!0))}return{top:t.top-i.top-S.css(r,"marginTop",!0),left:t.left-i.left-S.css(r,"marginLeft",!0)}}},offsetParent:function(){return this.map(function(){var e=this.offsetParent;while(e&&"static"===S.css(e,"position"))e=e.offsetParent;return e||re})}}),S.each({scrollLeft:"pageXOffset",scrollTop:"pageYOffset"},function(t,i){var o="pageYOffset"===i;S.fn[t]=function(e){return $(this,function(e,t,n){var r;if(x(e)?r=e:9===e.nodeType&&(r=e.defaultView),void 0===n)return r?r[i]:e[t];r?r.scrollTo(o?r.pageXOffset:n,o?n:r.pageYOffset):e[t]=n},t,e,arguments.length)}}),S.each(["top","left"],function(e,n){S.cssHooks[n]=Fe(y.pixelPosition,function(e,t){if(t)return t=We(e,n),Pe.test(t)?S(e).position()[n]+"px":t})}),S.each({Height:"height",Width:"width"},function(a,s){S.each({padding:"inner"+a,content:s,"":"outer"+a},function(r,o){S.fn[o]=function(e,t){var n=arguments.length&&(r||"boolean"!=typeof e),i=r||(!0===e||!0===t?"margin":"border");return $(this,function(e,t,n){var r;return x(e)?0===o.indexOf("outer")?e["inner"+a]:e.document.documentElement["client"+a]:9===e.nodeType?(r=e.documentElement,Math.max(e.body["scroll"+a],r["scroll"+a],e.body["offset"+a],r["offset"+a],r["client"+a])):void 0===n?S.css(e,t,i):S.style(e,t,n,i)},s,n?e:void 0,n)}})}),S.each(["ajaxStart","ajaxStop","ajaxComplete","ajaxError","ajaxSuccess","ajaxSend"],function(e,t){S.fn[t]=function(e){return this.on(t,e)}}),S.fn.extend({bind:function(e,t,n){return this.on(e,null,t,n)},unbind:function(e,t){return this.off(e,null,t)},delegate:function(e,t,n,r){return this.on(t,e,n,r)},undelegate:function(e,t,n){return 1===arguments.length?this.off(e,"**"):this.off(t,e||"**",n)},hover:function(e,t){return this.mouseenter(e).mouseleave(t||e)}}),S.each("blur focus focusin focusout resize scroll click dblclick mousedown mouseup mousemove mouseover mouseout mouseenter mouseleave change select submit keydown keypress keyup contextmenu".split(" "),function(e,n){S.fn[n]=function(e,t){return 0 `assign.html?//docs.google.com/document/d/${id}/pub` -const gs = id => `https://www.gradescope.com/courses/354801/assignments/${id}`; -const slides = id => `https://docs.google.com/a/berkeley.edu/presentation/d/${id}`; -const labURL = topic => `https://cs10.org/bjc-r/topic/topic.html?topic=${topic}&course=cs10_fa21.html`; - -// Monday of the first week of classes -const SKIPPED_ITEM = { title: 'SKIP' }; -const COUNTER = { - lecture: 1, - homework: 0, - discussion: 1, - lab: 1, -} - -let FIRST_DAY = dayjs('2022-01-16'); -let LAST_DAY = dayjs('2022-05-14'); - -// TODO: Model out the schedule object for 1 day. -// TODO: Readings() should be 1 obj with multiple links. -// TODO: What about `options` stuff? 2 Due dates in 1 day? - -function createSchedule(startDate, endDate) { - if (startDate.day() !== 0) { - throw new Error('Start Date must start on a Sunday'); - } - let schedule = {}; - let index = startDate; - let stop = endDate.add(1, 'day'); - while (index.isBefore(stop)) { - // Skip weekends - if (index.day() > 0 && index.day() < 6) { - schedule[index.format('YYYY-MM-DD')] = { - date: index, - lecture: {}, - lab: {}, - reading: {}, - discussion: {}, - assignment: {} - }; - } - index = index.add(1, 'day'); - } - return schedule; -} - - -function addToSchedule(date, item, type) { - let key = date.format('YYYY-MM-DD'); - let column = item.type || type; - if (!CS10_SCHEDULE[key]) { - console.log('ERROR, what? Missing date...') - CS10_SCHEDULE[key] = {}; - } - CS10_SCHEDULE[key][column] = item; -} - -function Lecture(title, release_date, {url, gradescope, recording, options}={}) { - if (title.slice(0, 3) === 'No ') { - addToSchedule(release_date, { type: 'lecture', title: 'No Class', date: release_date, classes: 'no-class'}); - // TYPE_ORDER.filter(key => key !== 'lecture').forEach(type => {}); - } - let links = { - 'Slides': slides(url), - 'Self-Check': gs(gradescope), - 'Recording': recording - } - - if (options && options.links) { - links = Object.assign(links, options.links); - } - - let lecture = { - title: `${COUNTER.lecture}. ${title}`, - date: release_date, url, links, options, type: 'lecture' - } - COUNTER.lecture += 1; - addToSchedule(release_date, lecture); - return lecture; -} - -function Assignment(title, release_date, {spec_url, due_date, submission_url, type, options}={}) { - let days = due_date.diff(release_date, 'day'); - let assignment = { - title: `${COUNTER.homework}: ${title}`, - type: 'assignment', - classes: [type], - date: release_date, url: spec_url, - due_date, options, days, submission_url - } - COUNTER.homework += 1; - addToSchedule(release_date, assignment); - return assignment; -} - -function Homework(title, release_date, {url, due_date, submission_url, options}={}) { - return Assignment(title, release_date, {url, due_date, submission_url, type: 'homework', options}); -} - -function Project(title, {release_date, url, due_date, submission_url, options}={}) { - return Assignment(title, release_date, url, due_date, submission_url, 'project', options); -} - -// TODO: Add link to check off questions -// TODO: Add link to bCourses? -function Lab(title, release_date, {topic, due_date, options}={}) { - if (title == 'No Lab') { - return { type: 'lab', title: 'No Lab', date: release_date, classes: 'no-class'}; - } - if (!due_date) { - due_date = release_date.add(7, 'days'); - } - let days = due_date.diff(release_date, 'day'); - let lab = { - title: `${COUNTER.lab}. ${title}`, - date: release_date, url: labURL(topic), due_date, options, days, type: 'lab' - } - COUNTER.lab += 1; - addToSchedule(release_date, lab); - return lab; -} - -function Reading(readings, release_date, {options}={}) { - readings.forEach(reading => { - if (!reading.status) { - reading.status = 'required'; - } - }) - function renderReadings(readings) { - return `
    -
  • ${readings.map(renderReading).join('
  • ')}
  • -
`; - } - function renderReading({ title, url, status }) { - return `${title}`; - } - let reading = { - content: renderReadings(readings), date: release_date, options, type: 'reading' - } - addToSchedule(release_date, reading); - return reading; -} - -function Discussion(title, release_date, {url, options}={}) { - let discussion = { - title: `${COUNTER.discussion}: ${title}`, - url, release_date, options, type: 'discussion' - } - addToSchedule(release_date, discussion); - return discussion; -} - -function GenerateDateIncrementor(start_date, skip_days) { - // Return a function that returns the next date after start_date - // incremented by skip_days, where skip_days is an array. - // at the end of the array, the days cycle. - // e.g. a Monday-Wednesdy schedule has skip_days = [2, 5] - // Returns start_date the first time the function is called. - let skip_days_index = 0; - let next_date = start_date; - return function() { - let current_date = next_date; - next_date = current_date.add(skip_days[skip_days_index], 'day'); - skip_days_index = (skip_days_index + 1) % skip_days.length; - return current_date; - } -} - -function weekNumber(date, startDate) { - // Return the number of weeks of firstWeek - date of the course in range [1, 17] else -1 - return Math.abs(startDate.week() - date.week()) + 1; -} - -function render(item) { - console.log('Render Indiv.', item); - let content = ''; - if (!item || !item.title) { return ''; } - if (item.content) { - return item.content; - } - - if (!item.url) { - content += `${item.title}`; - } else { - contet += `${item.title}"`; - } - if (item.due_date) { - content += `
Due: `; - } - if (item.submision_url) { - content += `(Submit)` - } - if (item.links) { - content += renderLinks(item.links) - } - if (item.options) { - content += options; - } - return content; -} - -// Turn a {link-text: URL} map into a nice series of links. -function renderLinks(links) { - return Object.entries(links).filter(link => link[0] && link[1]).map(link => `(${link[0]})`).join(' | '); -} - -const MONDAY = 1; -const SUNDAY = 0; -const SATURDAY = 6; -const TYPE_ORDER = [ - 'lecture', - 'reading', - 'lab', - 'discussion', - 'assignment' -]; - -function renderSchedule(schedule, target) { - let scheduleTable = $(target); - let currentDate = FIRST_DAY; - let now = dayjs(); - let row; - console.log('RENDER SCHEDULE: ', schedule) - while (currentDate.isBefore(LAST_DAY)) { - let dayOfWeek = currentDate.day(); - if (dayOfWeek == SATURDAY || dayOfWeek == SUNDAY) { - currentDate = currentDate.add(1, 'day'); - continue; - } - // TODO: Getting a value by date object needs to be easier. - let current = schedule[currentDate.format('YYYY-MM-DD')]; - let week = weekNumber(currentDate, FIRST_DAY); - let rowClasses = week % 2 == 0 ? 'even' : 'odd'; - let colspan = 1; - let rowspan = 1; - if (currentDate.isSame(now, 'day')) { - rowClasses += ' today' - } - row = $(``); - console.log(row); - if (dayOfWeek == MONDAY) { - row.append(`${week}`); - } - row.append(`${currentDate.format('dd M/D')}`); - TYPE_ORDER.forEach(type => { - let event = current[type]; - if (event === SKIPPED_ITEM) { - return; - } - row.append(` - ${render(event || {})} - `); - }); - scheduleTable.append(row); - currentDate = currentDate.add(1, 'day'); - } -} - -////////////////////////////////////////////////// -// FIRST_DAY == Sunday -let firstLecture = FIRST_DAY.add(1, 'day'); -let firstLab = FIRST_DAY.add(4, 'days'); -let firstDiscussion = FIRST_DAY.add(5, 'days'); -let firstReading = firstLab; - -let nextLecture = GenerateDateIncrementor(firstLecture, [2, 7]); -let nextLab = GenerateDateIncrementor(firstLab, [2, 7]); -let nextDiscussion = GenerateDateIncrementor(firstDiscussion, [7]); -let nextReading = GenerateDateIncrementor(firstReading, [7]); - -let CS10_SCHEDULE = createSchedule(FIRST_DAY, LAST_DAY); - -// Monday 1/17 -Lecture('No Class', nextLecture()); -// Tues 1/18 -Lab('No Lab', nextLab()); -// Weds 1/19 -Lecture('Welcome to CS10!', nextLecture(), { - slides: '1R2-4v31x8TF1N4owleDSKJR1AqXKtVxLUXfA8gJZO5E', - recording: 'https://youtu.be/HDtns_jV-Y8', -}); -// Thurs 1/20 -Lab('Intro to Snap!', nextLab(), { - topic: 'berkeley_bjc/intro_pair/1-introduction.topic' -}); -// Fri 1/21 -Discussion('Welcome to CS10', nextDiscussion()); -Homework('Introduce Yourself', dayjs('2022-01-19'), { - url: gs(1770006), - due_date: dayjs('2022-01-22') -}); - -// Week 2: - -// Week 3: - -// Week 4: - -// Week 5: - - -window.addEventListener('load', () => { - dayjs.extend(dayjs_plugin_weekOfYear); - renderSchedule(CS10_SCHEDULE, '.schedule-table'); -}); diff --git a/assets/test.html b/assets/test.html deleted file mode 100644 index 8af9af5..0000000 --- a/assets/test.html +++ /dev/null @@ -1,65 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
WeekDateLectureReadingsLabDiscussionAssignment
1 Mon 1/17 No Class No Class No Class No Class No Class
Tue 1/18 No Class No Class No Class No Class No Class
Wed 1/19 Welcome to CS10!
Thur 1/20 Welcome to Snap!
Fri 1/21 Welcome to CS10! HW0
- - diff --git a/home.md b/home.md index c1b3949..a5b6013 100644 --- a/home.md +++ b/home.md @@ -1,32 +1,39 @@ --- -layout: home -title: Home -nav_exclude: false -nav_order: 1 +layout: page +title: Welcome! +nav_exclude: true permalink: / seo: type: Course - name: CS10 - The Beauty and Joy of Computing + name: Berkeley Class Site --- -# **CS 10: The Beauty and Joy of Computing** -{: .mb-2 } -UC Berkeley, Fall 2023 -{: .mb-2 .fs-6 .text-grey-dk-100 } +# UC Berkeley Class Site Template -{{ site.description }} -{: .mb-2 .fs-5 } +Just the Class is a GitHub Pages template developed for the purpose of quickly deploying course websites. In addition to serving plain web pages and files, it provides a boilerplate for: -**Instructor:** Teaching Professor Dan Garcia
-**Instructor's OH:** Friday 1-2PM in Soda-777
-**Lectures:** Monday, Wednesday 1-2PM in Evans-10
-**OH Queue:** oh.cs10.org -{: .fs-4 } +- [announcements](announcements.md), +- a [course calendar](calendar.md), +- a [staff](staff.md) page, +- and a weekly [schedule](schedule.md). +Just the Class is a template that extends the popular [Just the Docs](https://github.com/just-the-docs/just-the-docs) theme, which provides a robust and thoroughly-tested foundation for your website. Just the Docs include features such as: -{% include youtube.html id='oG1OItm4JyU' %} +- automatic [navigation structure](https://just-the-docs.github.io/just-the-docs/docs/navigation-structure/), +- instant, full-text [search](https://just-the-docs.github.io/just-the-docs/docs/search/) and page indexing, +- and a set of [UI components](https://just-the-docs.github.io/just-the-docs/docs/ui-components) and authoring [utilities](https://just-the-docs.github.io/just-the-docs/docs/utilities). +## Getting Started -## CS10 Calendar +Getting started with Just the Class is simple. -{% include_relative calendar.md %} +1. Create a [new repository based on Just the Class](https://github.com/kevinlin1/just-the-class/generate). +1. Update `_config.yml` and `README.md` with your course information. [Be sure to update the url and baseurl](https://mademistakes.com/mastering-jekyll/site-url-baseurl/). +1. Configure a [publishing source for GitHub Pages](https://help.github.com/en/articles/configuring-a-publishing-source-for-github-pages). Your course website is now live! +1. Edit and create `.md` [Markdown files](https://guides.github.com/features/mastering-markdown/) to add more content pages. + +Just the Class has been used by instructors at Stanford University ([CS 161](https://stanford-cs161.github.io/winter2021/)), UC Berkeley ([Data 100](https://ds100.org/fa21/)), UC Santa Barbara ([CSW8](https://ucsb-csw8.github.io/s22/)), Northeastern University ([CS4530/5500](https://neu-se.github.io/CS4530-CS5500-Spring-2021/)), and Carnegie Mellon University ([17-450/17-950](https://cmu-crafting-software.github.io/)). Share your course website and find more examples in the [show and tell discussion](https://github.com/kevinlin1/just-the-class/discussions/categories/show-and-tell)! + +### Local development environment + +Just the Class requires no special Jekyll plugins and can run on GitHub Pages' standard Jekyll compiler. To setup a local development environment, clone your template repository and follow the GitHub Docs on [Testing your GitHub Pages site locally with Jekyll](https://docs.github.com/en/pages/setting-up-a-github-pages-site-with-jekyll/testing-your-github-pages-site-locally-with-jekyll).