Showing preview only (7,720K chars total). Download the full file or copy to clipboard to get everything.
Repository: FreeCodeCampChina/freecodecamp.cn
Branch: dev
Commit: b09a3a0dec1f
Files: 501
Total size: 7.3 MB
Directory structure:
gitextract_acp9dswb/
├── .babelrc
├── .bowerrc
├── .editorconfig
├── .eslintignore
├── .eslintrc
├── .gitattributes
├── .github/
│ ├── ISSUE_TEMPLATE.md
│ └── PULL_REQUEST_TEMPLATE.md
├── .gitignore
├── .jshintrc
├── .node-inspectorrc
├── .travis.yml
├── CONTRIBUTING.md
├── LICENSE
├── LICENSE-freeCodeCamp-Curriculum.md
├── LICENSE-freeCodeCamp-Translation.md
├── README.md
├── bower.json
├── client/
│ ├── README.md
│ ├── commonFramework/
│ │ ├── add-loop-protect.js
│ │ ├── bindings.js
│ │ ├── code-storage.js
│ │ ├── code-uri.js
│ │ ├── create-editor.js
│ │ ├── detect-unsafe-code-stream.js
│ │ ├── display-test-results.js
│ │ ├── end.js
│ │ ├── execute-challenge-stream.js
│ │ ├── get-iframe.js
│ │ ├── init.js
│ │ ├── output-display.js
│ │ ├── phone-scroll-lock.js
│ │ ├── report-issue.js
│ │ ├── run-tests-stream.js
│ │ ├── show-completion.js
│ │ ├── step-challenge.js
│ │ └── update-preview.js
│ ├── es6-shims.js
│ ├── iFrameScripts.js
│ ├── index.js
│ ├── less/
│ │ ├── challenge.less
│ │ ├── chat.less
│ │ ├── jobs.less
│ │ ├── lib/
│ │ │ ├── animate.min.less
│ │ │ ├── bootstrap/
│ │ │ │ ├── alerts.less
│ │ │ │ ├── badges.less
│ │ │ │ ├── bootstrap.less
│ │ │ │ ├── breadcrumbs.less
│ │ │ │ ├── button-groups.less
│ │ │ │ ├── buttons.less
│ │ │ │ ├── carousel.less
│ │ │ │ ├── close.less
│ │ │ │ ├── code.less
│ │ │ │ ├── component-animations.less
│ │ │ │ ├── dropdowns.less
│ │ │ │ ├── forms.less
│ │ │ │ ├── glyphicons.less
│ │ │ │ ├── grid.less
│ │ │ │ ├── input-groups.less
│ │ │ │ ├── jumbotron.less
│ │ │ │ ├── labels.less
│ │ │ │ ├── list-group.less
│ │ │ │ ├── media.less
│ │ │ │ ├── mixins/
│ │ │ │ │ ├── alerts.less
│ │ │ │ │ ├── background-variant.less
│ │ │ │ │ ├── border-radius.less
│ │ │ │ │ ├── buttons.less
│ │ │ │ │ ├── center-block.less
│ │ │ │ │ ├── clearfix.less
│ │ │ │ │ ├── forms.less
│ │ │ │ │ ├── gradients.less
│ │ │ │ │ ├── grid-framework.less
│ │ │ │ │ ├── grid.less
│ │ │ │ │ ├── hide-text.less
│ │ │ │ │ ├── image.less
│ │ │ │ │ ├── labels.less
│ │ │ │ │ ├── list-group.less
│ │ │ │ │ ├── nav-divider.less
│ │ │ │ │ ├── nav-vertical-align.less
│ │ │ │ │ ├── opacity.less
│ │ │ │ │ ├── pagination.less
│ │ │ │ │ ├── panels.less
│ │ │ │ │ ├── progress-bar.less
│ │ │ │ │ ├── reset-filter.less
│ │ │ │ │ ├── resize.less
│ │ │ │ │ ├── responsive-visibility.less
│ │ │ │ │ ├── size.less
│ │ │ │ │ ├── tab-focus.less
│ │ │ │ │ ├── table-row.less
│ │ │ │ │ ├── text-emphasis.less
│ │ │ │ │ ├── text-overflow.less
│ │ │ │ │ └── vendor-prefixes.less
│ │ │ │ ├── mixins.less
│ │ │ │ ├── modals.less
│ │ │ │ ├── navbar.less
│ │ │ │ ├── navs.less
│ │ │ │ ├── normalize.less
│ │ │ │ ├── pager.less
│ │ │ │ ├── pagination.less
│ │ │ │ ├── panels.less
│ │ │ │ ├── popovers.less
│ │ │ │ ├── print.less
│ │ │ │ ├── progress-bars.less
│ │ │ │ ├── responsive-embed.less
│ │ │ │ ├── responsive-utilities.less
│ │ │ │ ├── scaffolding.less
│ │ │ │ ├── tables.less
│ │ │ │ ├── theme.less
│ │ │ │ ├── thumbnails.less
│ │ │ │ ├── tooltip.less
│ │ │ │ ├── type.less
│ │ │ │ ├── utilities.less
│ │ │ │ ├── variables.less
│ │ │ │ └── wells.less
│ │ │ ├── bootstrap-social/
│ │ │ │ └── bootstrap-social.less
│ │ │ ├── font-awesome-4.3.0/
│ │ │ │ ├── css/
│ │ │ │ │ └── font-awesome.css
│ │ │ │ ├── fonts/
│ │ │ │ │ └── FontAwesome.otf
│ │ │ │ ├── less/
│ │ │ │ │ ├── animated.less
│ │ │ │ │ ├── bordered-pulled.less
│ │ │ │ │ ├── core.less
│ │ │ │ │ ├── fixed-width.less
│ │ │ │ │ ├── font-awesome.less
│ │ │ │ │ ├── icons.less
│ │ │ │ │ ├── larger.less
│ │ │ │ │ ├── list.less
│ │ │ │ │ ├── mixins.less
│ │ │ │ │ ├── path.less
│ │ │ │ │ ├── rotated-flipped.less
│ │ │ │ │ ├── stacked.less
│ │ │ │ │ └── variables.less
│ │ │ │ └── scss/
│ │ │ │ ├── _animated.scss
│ │ │ │ ├── _bordered-pulled.scss
│ │ │ │ ├── _core.scss
│ │ │ │ ├── _fixed-width.scss
│ │ │ │ ├── _icons.scss
│ │ │ │ ├── _larger.scss
│ │ │ │ ├── _list.scss
│ │ │ │ ├── _mixins.scss
│ │ │ │ ├── _path.scss
│ │ │ │ ├── _rotated-flipped.scss
│ │ │ │ ├── _stacked.scss
│ │ │ │ ├── _variables.scss
│ │ │ │ └── font-awesome.scss
│ │ │ └── ionicons/
│ │ │ ├── _ionicons-animation.less
│ │ │ ├── _ionicons-font.less
│ │ │ ├── _ionicons-icons.less
│ │ │ ├── _ionicons-variables.less
│ │ │ └── ionicons.less
│ │ ├── main.less
│ │ ├── map.less
│ │ ├── signin.less
│ │ ├── toastr.less
│ │ └── wiki.less
│ ├── main.js
│ ├── plugin.js
│ └── sagas/
│ ├── README.md
│ ├── err-saga.js
│ ├── hard-go-to-saga.js
│ ├── index.js
│ ├── local-storage-saga.js
│ └── title-saga.js
├── common/
│ ├── app/
│ │ ├── App.jsx
│ │ ├── components/
│ │ │ ├── Flash/
│ │ │ │ ├── Queue.jsx
│ │ │ │ └── index.jsx
│ │ │ ├── Footer/
│ │ │ │ ├── Footer.jsx
│ │ │ │ ├── README.md
│ │ │ │ ├── index.js
│ │ │ │ └── links.json
│ │ │ ├── Nav/
│ │ │ │ ├── Nav.jsx
│ │ │ │ ├── NavItem.jsx
│ │ │ │ ├── index.js
│ │ │ │ └── links.json
│ │ │ ├── NotFound/
│ │ │ │ └── index.jsx
│ │ │ └── README.md
│ │ ├── create-app.jsx
│ │ ├── create-reducer.js
│ │ ├── index.js
│ │ ├── middlewares.js
│ │ ├── provide-store.js
│ │ ├── redux/
│ │ │ ├── actions.js
│ │ │ ├── fetch-user-saga.js
│ │ │ ├── index.js
│ │ │ ├── oldActions.js
│ │ │ ├── reducer.js
│ │ │ └── types.js
│ │ ├── routes/
│ │ │ ├── Admin/
│ │ │ │ └── README.md
│ │ │ ├── Bonfires/
│ │ │ │ └── README.md
│ │ │ ├── Hikes/
│ │ │ │ ├── components/
│ │ │ │ │ ├── Hike.jsx
│ │ │ │ │ ├── Hikes.jsx
│ │ │ │ │ ├── Lecture.jsx
│ │ │ │ │ ├── Map.jsx
│ │ │ │ │ └── Questions.jsx
│ │ │ │ ├── index.js
│ │ │ │ └── redux/
│ │ │ │ ├── actions.js
│ │ │ │ ├── answer-saga.js
│ │ │ │ ├── fetch-hikes-saga.js
│ │ │ │ ├── index.js
│ │ │ │ ├── oldActions.js
│ │ │ │ ├── reducer.js
│ │ │ │ ├── selectors.js
│ │ │ │ ├── types.js
│ │ │ │ └── utils.js
│ │ │ ├── Jobs/
│ │ │ │ ├── README.md
│ │ │ │ ├── components/
│ │ │ │ │ ├── JobNotFound.jsx
│ │ │ │ │ ├── JobTotal.jsx
│ │ │ │ │ ├── Jobs.jsx
│ │ │ │ │ ├── List.jsx
│ │ │ │ │ ├── NewJob.jsx
│ │ │ │ │ ├── NewJobCompleted.jsx
│ │ │ │ │ ├── Preview.jsx
│ │ │ │ │ ├── Show.jsx
│ │ │ │ │ └── ShowJob.jsx
│ │ │ │ ├── index.js
│ │ │ │ ├── redux/
│ │ │ │ │ ├── actions.js
│ │ │ │ │ ├── apply-promo-saga.js
│ │ │ │ │ ├── fetch-jobs-saga.js
│ │ │ │ │ ├── index.js
│ │ │ │ │ ├── jobs-form-normalizer.js
│ │ │ │ │ ├── oldActions.js
│ │ │ │ │ ├── reducer.js
│ │ │ │ │ ├── save-job-saga.js
│ │ │ │ │ └── types.js
│ │ │ │ └── utils.js
│ │ │ └── index.js
│ │ ├── sagas.js
│ │ ├── shared/
│ │ │ └── README.md
│ │ └── utils/
│ │ ├── Professor-Context.js
│ │ ├── create-types.js
│ │ ├── professor-x.js
│ │ ├── render-to-string.js
│ │ ├── render.js
│ │ └── shallow-equals.js
│ ├── config.global.js
│ ├── models/
│ │ ├── User-Credential.json
│ │ ├── User-Identity.js
│ │ ├── User-Identity.json
│ │ ├── challenge.json
│ │ ├── job.json
│ │ ├── nonprofit.json
│ │ ├── pledge.json
│ │ ├── promo.js
│ │ ├── promo.json
│ │ ├── story.json
│ │ ├── user.js
│ │ └── user.json
│ └── utils/
│ ├── ajax-stream.js
│ ├── constantStrings.json
│ ├── index.js
│ ├── jsonp$.js
│ └── services-creator.js
├── config/
│ └── secrets.js
├── dataAsync.js
├── full-test-data.js
├── gulpfile.js
├── leanTest.js
├── package.json
├── pm2Start.js
├── public/
│ ├── browserconfig.xml
│ ├── code.html
│ ├── css/
│ │ ├── Vimeo.css
│ │ ├── lato.css
│ │ ├── main-69858c7174.css
│ │ ├── main-ec0d2f5228.css
│ │ ├── main-f928abf444.css
│ │ ├── main.css
│ │ ├── themes/
│ │ │ ├── flatly.less
│ │ │ └── modern.less
│ │ └── ubuntu.css
│ ├── favicons/
│ │ ├── android-chrome-manifest.json
│ │ └── browserconfig.xml
│ ├── favicons.html
│ ├── fonts/
│ │ └── FontAwesome.otf
│ ├── grouth-hacker.html
│ ├── js/
│ │ ├── .jshintrc
│ │ ├── angular.js
│ │ ├── calculator.js
│ │ ├── commonFramework-2c9795240d.js
│ │ ├── commonFramework-2f0be7f94b.js
│ │ ├── commonFramework-64e637bbe5.js
│ │ ├── commonFramework-e9a2482e6b.js
│ │ ├── commonFramework.js
│ │ ├── dashboard.js
│ │ ├── echarts-all-3.js
│ │ ├── greensock.js
│ │ ├── join-group.js
│ │ ├── join-race.js
│ │ ├── lib/
│ │ │ ├── jailed/
│ │ │ │ ├── _JailedSite.js
│ │ │ │ ├── _frame.html
│ │ │ │ ├── _frame.js
│ │ │ │ ├── _pluginCore.js
│ │ │ │ ├── _pluginNode.js
│ │ │ │ ├── _pluginWeb.js
│ │ │ │ └── jailed.js
│ │ │ └── loop-protect/
│ │ │ ├── LICENSE.md
│ │ │ └── loop-protect.js
│ │ └── sidecar.v1.js
│ ├── json/
│ │ ├── bootcamps.json
│ │ └── cats.json
│ ├── leader-board.html
│ ├── progress.html
│ └── robots.txt
├── seed/
│ ├── bonfireMDNlinks.js
│ ├── challenges/
│ │ ├── 00-getting-started/
│ │ │ └── getting-started.json
│ │ ├── 01-front-end-development-certification/
│ │ │ ├── advanced-bonfires.json
│ │ │ ├── advanced-ziplines.json
│ │ │ ├── basic-bonfires.json
│ │ │ ├── basic-javascript.json
│ │ │ ├── basic-ziplines.json
│ │ │ ├── bootstrap.json
│ │ │ ├── front-end-development-certificate.json
│ │ │ ├── gear-up-for-success.json
│ │ │ ├── html5-and-css.json
│ │ │ ├── intermediate-bonfires.json
│ │ │ ├── intermediate-ziplines.json
│ │ │ ├── jquery.json
│ │ │ ├── json-apis-and-ajax.json
│ │ │ └── object-oriented-and-functional-programming.json
│ │ ├── 02-data-visualization-certification/
│ │ │ ├── d3.json
│ │ │ ├── data-visualization-certificate.json
│ │ │ ├── data-visualization-projects.json
│ │ │ ├── react-projects.json
│ │ │ ├── react.json
│ │ │ └── sass.json
│ │ ├── 03-back-end-development-certification/
│ │ │ ├── api-projects.json
│ │ │ ├── automated-testing-and-debugging.json
│ │ │ ├── back-end-development-certificate.json
│ │ │ ├── dynamic-web-applications.json
│ │ │ ├── git.json
│ │ │ ├── mongodb.json
│ │ │ └── nodejs-and-expressjs.json
│ │ └── 04-video-challenges/
│ │ ├── accessibility.json
│ │ ├── agile.json
│ │ ├── bigonotation.json
│ │ ├── chromedevtools.json
│ │ ├── computer-basics.json
│ │ ├── computer-science.json
│ │ ├── data-visualization.json
│ │ ├── devops.json
│ │ ├── dom.json
│ │ ├── embedded-and-internet-of-things.json
│ │ ├── game-development.json
│ │ ├── gamification.json
│ │ ├── jslingo.json
│ │ ├── machine-learning.json
│ │ ├── math-for-programmers.json
│ │ ├── mobile-javascript-development.json
│ │ ├── software-engineering-principles.json
│ │ ├── statistics.json
│ │ ├── tools.json
│ │ ├── user-experience-design.json
│ │ └── visual-design.json
│ ├── create-challenge-bundle.js
│ ├── get-challenge-completion.js
│ ├── get-emails.js
│ ├── getChallenges.js
│ ├── index.js
│ ├── loopbackMigration.js
│ └── test-challenges.js
├── server/
│ ├── README.md
│ ├── boot/
│ │ ├── a-extendUser.js
│ │ ├── a-extendUserIdent.js
│ │ ├── a-react.js
│ │ ├── a-services.js
│ │ ├── about.js
│ │ ├── authentication.js
│ │ ├── certificate.js
│ │ ├── challenge.js
│ │ ├── commit.js
│ │ ├── explorer.js
│ │ ├── home.js
│ │ ├── randomAPIs.js
│ │ ├── redirectHttps.js
│ │ ├── redirects.js
│ │ ├── restApi.js
│ │ ├── story.js
│ │ ├── t-wiki.js
│ │ └── user.js
│ ├── config.development.js
│ ├── config.json
│ ├── config.local.js
│ ├── config.production.js
│ ├── datasources.json
│ ├── datasources.local.js
│ ├── debug-entry.js
│ ├── manifests/
│ │ └── README.md
│ ├── middleware.json
│ ├── middlewares/
│ │ ├── add-return-to.js
│ │ ├── constant-headers.js
│ │ ├── cookie-parser.js
│ │ ├── csp.js
│ │ ├── error-handlers.js
│ │ ├── express-rx.js
│ │ ├── global-locals.js
│ │ ├── jade-helpers.js
│ │ ├── keymetrics.js
│ │ ├── migrate-completed-challenges.js
│ │ ├── revision-helpers.js
│ │ ├── sessions.js
│ │ └── validator.js
│ ├── model-config.json
│ ├── passport-providers.js
│ ├── production-start.js
│ ├── resources/
│ │ ├── labs.json
│ │ └── testimonials.json
│ ├── server.js
│ ├── services/
│ │ ├── hikes.js
│ │ ├── job.js
│ │ └── user.js
│ ├── ssl-config.js
│ ├── utils/
│ │ ├── auth.js
│ │ ├── bad-id-map.js
│ │ ├── certTypes.json
│ │ ├── commit-goals.json
│ │ ├── commit.js
│ │ ├── commit.json
│ │ ├── constantStrings.json
│ │ ├── constants.js
│ │ ├── date-utils.js
│ │ ├── getFromDisk$.js
│ │ ├── index.js
│ │ ├── middleware.js
│ │ ├── resources.json
│ │ ├── rx.js
│ │ └── user-stats.js
│ └── views/
│ ├── account/
│ │ ├── email-signin.jade
│ │ ├── email-signup.jade
│ │ ├── forgot.jade
│ │ ├── reset.jade
│ │ ├── settings.jade
│ │ ├── show.jade
│ │ └── signin.jade
│ ├── certificate/
│ │ ├── back-end.jade
│ │ ├── data-vis.jade
│ │ ├── font.jade
│ │ ├── front-end.jade
│ │ ├── full-stack.jade
│ │ ├── index.jade
│ │ └── script.jade
│ ├── challenges/
│ │ ├── showBonfire.jade
│ │ ├── showHTML.jade
│ │ ├── showJS.jade
│ │ ├── showStep.jade
│ │ ├── showVideo.jade
│ │ └── showZiplineOrBasejump.jade
│ ├── commit/
│ │ ├── directory.jade
│ │ ├── index.jade
│ │ └── pledge.jade
│ ├── feed.jade
│ ├── home.jade
│ ├── layout-react.jade
│ ├── layout-wide.jade
│ ├── layout.jade
│ ├── map/
│ │ └── show.jade
│ ├── partials/
│ │ ├── challenge-footer.jade
│ │ ├── challenge-modals.jade
│ │ ├── flash.jade
│ │ ├── footer.jade
│ │ ├── meta.jade
│ │ ├── navbar.jade
│ │ ├── react-stylesheets.jade
│ │ ├── scripts.jade
│ │ └── stylesheets.jade
│ ├── redirect-https.html
│ ├── redirect-https.jade
│ ├── resources/
│ │ ├── about.jade
│ │ ├── academic-honesty.jade
│ │ ├── calculator.jade
│ │ ├── code-of-conduct.jade
│ │ ├── code.jade
│ │ ├── dashboard.jade
│ │ ├── group.jade
│ │ ├── how-nonprofit-projects-work.jade
│ │ ├── labs.jade
│ │ ├── links.jade
│ │ ├── nonprofits-form.jade
│ │ ├── nonprofits.jade
│ │ ├── pmi-acp-agile-project-managers-form.jade
│ │ ├── pmi-acp-agile-project-managers.jade
│ │ ├── privacy.jade
│ │ ├── progress.jade
│ │ ├── shop.jade
│ │ ├── sitemap.jade
│ │ ├── stories.jade
│ │ ├── terms-of-service.jade
│ │ ├── test.css
│ │ ├── the-fastest-web-page-on-the-internet.jade
│ │ └── unsubscribed.jade
│ ├── sponsors/
│ │ ├── sponsors.html
│ │ └── sponsors.jade
│ ├── stories/
│ │ ├── hot-stories.jade
│ │ ├── index.jade
│ │ ├── news-nav.jade
│ │ ├── preliminary-submit.jade
│ │ ├── show.jade
│ │ └── submit-story.jade
│ └── wiki/
│ └── show.jade
├── simple-json.js
├── test/
│ └── server/
│ └── utils/
│ ├── date-utils-test.js
│ └── user-stats-test.js
├── webpack.config.js
└── webpack.config.node.js
================================================
FILE CONTENTS
================================================
================================================
FILE: .babelrc
================================================
{
"presets": ["es2015", "react", "stage-0"],
"plugins": ["babel-plugin-add-module-exports"]
}
================================================
FILE: .bowerrc
================================================
{
"directory" : "public/bower_components"
}
================================================
FILE: .editorconfig
================================================
root = true
[*]
indent_style = space
indent_size = 2
end_of_line = lf
charset = utf-8
trim_trailing_whitespace = true
insert_final_newline = true
[*.md]
trim_trailing_whitespace = false
================================================
FILE: .eslintignore
================================================
public/**/*.js
================================================
FILE: .eslintrc
================================================
{
"parserOption": {
"ecmaVersion": 6,
"ecmaFeatures": {
"jsx": true
}
},
"env": {
"browser": true,
"mocha": true,
"node": true
},
"parser": "babel-eslint",
"plugins": [
"react"
],
"globals": {
"Promise": true,
"window": true,
"$": true,
"ga": true,
"jQuery": true,
"router": true
},
"rules": {
"comma-dangle": 2,
"no-cond-assign": 2,
"no-console": 0,
"no-constant-condition": 2,
"no-control-regex": 2,
"no-debugger": 2,
"no-dupe-keys": 2,
"no-empty": 2,
"no-empty-character-class": 2,
"no-ex-assign": 2,
"no-extra-boolean-cast": 2,
"no-extra-parens": 0,
"no-extra-semi": 2,
"no-func-assign": 2,
"no-inner-declarations": 2,
"no-invalid-regexp": 2,
"no-irregular-whitespace": 2,
"no-negated-in-lhs": 2,
"no-obj-calls": 2,
"no-regex-spaces": 2,
"no-reserved-keys": 0,
"no-sparse-arrays": 2,
"no-unreachable": 2,
"use-isnan": 2,
"valid-jsdoc": 2,
"valid-typeof": 2,
"block-scoped-var": 0,
"complexity": 0,
"curly": 2,
"default-case": 1,
"dot-notation": 0,
"eqeqeq": 1,
"guard-for-in": 1,
"no-alert": 1,
"no-caller": 2,
"no-div-regex": 2,
"no-else-return": 0,
"no-eq-null": 1,
"no-eval": 2,
"no-extend-native": 2,
"no-extra-bind": 2,
"no-fallthrough": 2,
"no-floating-decimal": 2,
"no-implied-eval": 2,
"no-iterator": 2,
"no-labels": 2,
"no-lone-blocks": 2,
"no-loop-func": 1,
"no-multi-spaces": 1,
"no-multi-str": 2,
"no-native-reassign": 2,
"no-new": 2,
"no-new-func": 2,
"no-new-wrappers": 2,
"no-octal": 2,
"no-octal-escape": 2,
"no-process-env": 0,
"no-proto": 2,
"no-redeclare": 1,
"no-return-assign": 2,
"no-script-url": 2,
"no-self-compare": 2,
"no-sequences": 2,
"no-unused-expressions": 2,
"no-void": 1,
"no-warning-comments": [
1,
{
"terms": [
"fixme"
],
"location": "start"
}
],
"no-with": 2,
"radix": 2,
"vars-on-top": 0,
"wrap-iife": [2, "any"],
"yoda": 0,
"strict": 0,
"no-catch-shadow": 2,
"no-delete-var": 2,
"no-label-var": 2,
"no-shadow": 0,
"no-shadow-restricted-names": 2,
"no-undef": 2,
"no-undef-init": 2,
"no-undefined": 1,
"no-unused-vars": [2, { "argsIgnorePattern": "^_" }],
"no-use-before-define": 0,
"handle-callback-err": 2,
"no-mixed-requires": 0,
"no-new-require": 2,
"no-path-concat": 2,
"no-process-exit": 2,
"no-restricted-modules": 0,
"no-sync": 0,
"brace-style": [
2,
"1tbs",
{ "allowSingleLine": true }
],
"camelcase": 1,
"comma-spacing": [
2,
{
"before": false,
"after": true
}
],
"comma-style": [
2, "last"
],
"consistent-this": 0,
"eol-last": 2,
"func-names": 0,
"func-style": 0,
"key-spacing": [
2,
{
"beforeColon": false,
"afterColon": true
}
],
"max-nested-callbacks": 0,
"new-cap": 0,
"new-parens": 2,
"no-array-constructor": 2,
"no-inline-comments": 1,
"no-mixed-spaces-and-tabs": 2,
"no-multiple-empty-lines": [
1,
{ "max": 2 }
],
"no-nested-ternary": 2,
"no-new-object": 2,
"semi-spacing": [2, { "before": false, "after": true }],
"no-spaced-func": 2,
"no-ternary": 0,
"no-trailing-spaces": 1,
"no-underscore-dangle": 0,
"one-var": 0,
"operator-assignment": 0,
"padded-blocks": 0,
"quote-props": 0,
"quotes": [
2,
"single",
"avoid-escape"
],
"semi": [
2,
"always"
],
"sort-vars": 0,
"keyword-spacing": [ 2 ],
"space-before-function-paren": [
2,
"never"
],
"space-before-blocks": [
2,
"always"
],
"space-in-brackets": 0,
"space-in-parens": 0,
"space-infix-ops": 2,
"space-unary-ops": [
1,
{
"words": true,
"nonwords": false
}
],
"spaced-comment": [
2,
"always",
{ "exceptions": ["-"] }
],
"wrap-regex": 1,
"max-depth": 0,
"max-len": [
2,
120,
2
],
"max-params": 0,
"max-statements": 0,
"no-bitwise": 1,
"no-plusplus": 0,
"react/display-name": 1,
"react/jsx-boolean-value": [1, "always"],
"jsx-quotes": [1, "prefer-single"],
"react/jsx-no-undef": 1,
"react/jsx-sort-props": [1, { "ignoreCase": true }],
"react/jsx-uses-react": 1,
"react/jsx-uses-vars": 1,
"react/no-did-mount-set-state": 2,
"react/no-did-update-set-state": 2,
"react/no-multi-comp": [2, { "ignoreStateless": true } ],
"react/prop-types": 2,
"react/react-in-jsx-scope": 1,
"react/self-closing-comp": 1,
"react/wrap-multilines": 1
}
}
================================================
FILE: .gitattributes
================================================
public/js/lib/codemirror/* linguist-vendored
*.jsx linguist-language=JavaScript
================================================
FILE: .github/ISSUE_TEMPLATE.md
================================================
## 注意:这里只处理 FreeCodeCamp.cn 的相关问题,不处理 w3cschool 的任何问题
## 注意:请不要乱开无意义的 Issue,违者直接加黑名单
## 注意:Issue 是用来处理代码库中的 bug,不是用来提问题的。完成挑战过程中遇到的代码问题请在[gitter 讨论组](https://gitter.im/FreeCodeCamp/chinese) 或者 QQ 群 526289580 中讨论 (QQ 群验证答案: ___**freeCodeCamp**___ 注意大小写)
#### FreeCodeCamp.cn Issue 模板
如何使用本模板:
* 尽可能多填些相关信息,方便管理员参考
* 对于无法给出的内容,请删除掉那一行
# 以上内容请在提交 Issue 之前删除
#### 浏览器信息
* 浏览器名称,版本号
* 操作系统
#### 问题描述
* 问题是在什么时候,什么情况下遇到的
* 简要说明如何重现
#### 你的代码
```
如果和代码相关,请在这里粘贴你的全部代码
```
#### 截图(如果有)
================================================
FILE: .github/PULL_REQUEST_TEMPLATE.md
================================================
## FreeCodeCamp Pull Request template
Please, go through these steps before you submit a PR.
1. Make sure that your PR is not a duplicate.
2. If not, then make sure that:
2.1. You have done your changes in a separate branch. Branches MUST have descriptive names that start with either the `fix/` or `feature/` prefixes. Good examples are: `fix/signin-issue` or `feature/issue-templates`.
2.2. You have a descriptive commit message with a short title (first line).
2.3. You have only one commit (if not, [squash](https://github.com/FreeCodeCamp/FreeCodeCamp/wiki/git-rebase#squashing-multiple-commits-into-one) them into one commit).
2.4. `npm test` doesn't throw any error. If it does, fix them first and amend your commit (`git commit --amend`).
3. **After** these steps, you're ready to open a pull request.
3.1. Your pull request MUST NOT target the `master` branch on FreeCodeCamp's repository. You probably want to target `staging` instead.
3.2. Give a descriptive title to your PR.
3.3. Provide a description of your changes.
3.4. Put `closes #XXXX` in your comment to auto-close the issue that your PR fixes (if such).
IMPORTANT: Please review the [CONTRIBUTING.md](../CONTRIBUTING.md) file for detailed contributing guidelines.
**PLEASE REMOVE THIS TEMPLATE BEFORE SUBMITTING**
================================================
FILE: .gitignore
================================================
lib-cov
*.seed
*.log
*.csv
*.dat
*.out
*.pid
*.gz
*.swp
.floo
.flooignore
builtAssets/
pm2.js
*.env
pids
logs
results
tmp
npm-debug.log
node_modules
.idea
*.iml
.git
.DS_Store
Thumbs.db
bower_components
bundle.js
coverage
.remote-sync.json
server/*.bundle.js
public/js/bundle*
*.map
// revision manifest
server/rev-manifest.json
server/manifests/*
!server/manifests/README.md
public/js/main*
// public/js/commonFramework*
public/js/sandbox*
public/js/iFrameScripts*
public/js/plugin*
public/js/vendor*
public/js/faux*
server/rev-manifest.json
================================================
FILE: .jshintrc
================================================
{
"node": true, // Enable globals available when code is running inside of the NodeJS runtime environment.
"browser": true, // Standard browser globals e.g. `window`, `document`.
"esnext": true, // Allow ES.next specific features such as `const` and `let`.
"bitwise": false, // Prohibit bitwise operators (&, |, ^, etc.).
"camelcase": false, // Permit only camelcase for `var` and `object indexes`.
"curly": false, // Require {} for every new block or scope.
"eqeqeq": true, // Require triple equals i.e. `===`.
"immed": true, // Require immediate invocations to be wrapped in parens e.g. `( function(){}() );`
"latedef": true, // Prohibit variable use before definition.
"newcap": true, // Require capitalization of all constructor functions e.g. `new F()`.
"noarg": true, // Prohibit use of `arguments.caller` and `arguments.callee`.
"regexp": true, // Prohibit `.` and `[^...]` in regular expressions.
"undef": true, // Require all non-global variables be declared before they are used.
"unused": false, // Warn unused variables.
"strict": false, // Require `use strict` pragma in every file.
"trailing": true, // Prohibit trailing whitespaces.
"smarttabs": false, // Suppresses warnings about mixed tabs and spaces
"esnext": true, // Allow ES6 maybe :p
"globals": { // Globals variables.
"jasmine": true,
"angular": true,
"ApplicationConfiguration": true
},
"predef": [ // Extra globals.
"define",
"require",
"exports",
"module",
"describe",
"before",
"beforeEach",
"after",
"afterEach",
"it",
"inject",
"expect"
],
"devel": true, // Allow development statements e.g. `console.log();`.
"noempty": true // Prohibit use of empty blocks.
}
================================================
FILE: .node-inspectorrc
================================================
{
"save-live-edit": true
}
================================================
FILE: .travis.yml
================================================
language: node_js
node_js:
- '4.2.1'
sudo: false
================================================
FILE: CONTRIBUTING.md
================================================
# 贡献者指南
## 我想成为代码贡献者!
We welcome pull requests from Free Code Camp campers (our students) and seasoned JavaScript developers alike! Follow these steps to contribute:
我们欢迎每一位 FreeCodeCamp学员 和 有经验的JavaScript开发人员向我们提交PR!请参照下面这些步骤参与进来:
1. Find an issue that needs assistance by searching for the [Help Wanted](https://github.com/FreeCodeCampChina/freecodecamp.cn/labels/help%20wanted) tag.
通过搜索标记[Help Wanted](https://github.com/FreeCodeCampChina/freecodecamp.cn/labels/help%20wanted) 来找到需要帮助的问题。
2. Let us know you are working on it, by posting a comment on the issue.
在问题下面发送一个评论,便于让我们知道你正在着手解决这个问题。
3. Feel free to ask for help in our [Help Contributors](https://gitter.im/FreeCodeCamp/chinese) Gitter room.
你可以自由地在我们的[Help Contributors](https://gitter.im/FreeCodeCamp/chinese)聊天室提问来获得帮助。
If you've found a bug that is not on the board, [follow these steps](#found-a-bug).
## Contribution Guidelines
1. Fork the project: [How To Fork And Maintain a Local Instance of Free Code Camp](https://github.com/FreeCodeCamp/FreeCodeCamp/wiki/How-To-Fork-And-Maintain-a-Local-Instance-of-Free-Code-Camp)
2. Create a branch specific to the issue or feature you are working on. Push your work to that branch. ([Need help with branching?](https://github.com/Kunena/Kunena-Forum/wiki/Create-a-new-branch-with-git-and-manage-branches))
3. Name the branch something like `fix/xxx` or `feature/xxx` where `xxx` is a short description of the changes or feature you are attempting to add. For example `fix/email-login` would be a branch where I fix something specific to email login.
4. [Set up Linting](#linting-setup) to run as you make changes.
5. When you are ready to share your code, run the test suite `npm test` and ensure all tests pass. For Windows contributors, skip the jsonlint pretest run by using `npm run test-challenges`, as jsonlint will always fail on Windows, given the wildcard parameters.
5. Squash your Commits. Ref: [rebasing](https://github.com/FreeCodeCamp/FreeCodeCamp/wiki/git-rebase)
6. Submit a [pull request](https://github.com/FreeCodeCamp/FreeCodeCamp/wiki/Pull-Request-Contribute) from your branch to Free Code Camp's `staging` branch. [Travis CI](https://travis-ci.org/FreeCodeCamp/FreeCodeCamp) will then take your code and run `npm test`. Make sure this passes, then we'll do a quick code review and give you feedback, then iterate from there.
Prerequisites
-------------
- [MongoDB](http://www.mongodb.org/downloads)
- [Node.js](http://nodejs.org)
Getting Started
---------------
Note: If this is your first time working with a node-gyp dependent module, please follow the [node-gyp installation guide](https://github.com/nodejs/node-gyp#installation) to ensure a working npm build.
The easiest way to get started is to clone the repository:
```bash
# Get the latest snapshot
git clone --depth=1 https://github.com/freecodecampchina/freecodecamp.cn.git freecodecamp
# Change directory
cd freecodecamp
# Install NPM dependencies
npm install
# Install Gulp globally
npm install -g gulp
# Install Bower globally
npm install -g bower
# Install Bower dependencies
bower install
```
*Private Environment Variables (API Keys)*
```bash
# Create a copy of the "sample.env" and name it as ".env".
# Populate it with the necessary API keys and secrets:
cp sample.env .env
```
Edit your `.env` file and modify the API keys only for services that you will use.
Note : Not all keys are required, to run the app locally, however `MONGOHQ_URL` is the most important one.
If you only use email login, in addition to `MONGOHQ_URL`, `SESSION_SECRET`, add the `MANDRILL_USER` and `MANDRILL_PASSWORD` API Keys. Not setting these keys will throw an exception when you sign up which you can ignore, you will still be able to login, however you may get these keys [here](https://www.mandrill.com/signup/). Sign up and create a new pair of keys.
You can leave the other keys as they are. Keep in mind if you want to use more services you'll have to get your own API keys for those services and edit those entries accordingly in the `.env` file.
```bash
# Start the mongo server in a separate terminal
mongod
# Initialize Free Code Camp
# This will seed the database for the first time.
# This command should only be run once.
npm run only-once
# start the application
gulp
```
Now navigate to your browser and open http://localhost:3001
If the app loads, congratulations - you're all set. Otherwise, let us know by opening a GitHub issue and with your error.
## Linting Setup
You should have [ESLint running in your editor](http://eslint.org/docs/user-guide/integrations.html), and it will highlight anything doesn't conform to [Free Code Camp's JavaScript Style Guide](https://github.com/FreeCodeCamp/FreeCodeCamp/wiki/Free-Code-Camp-JavaScript-Style-Guide) (you can find a summary of those rules [here](https://github.com/FreeCodeCamp/FreeCodeCamp/blob/staging/.eslintrc). Please do not ignore any linting errors, as they are meant to **help** you and to ensure a clean and simple code base. Make sure none of your JavaScript is longer than 80 characters per line. The reason we enforce this is because one of our dependent NPM modules, [jsonlint](https://github.com/zaach/jsonlint), does not fully support wildcard paths in Windows.
## Found a bug?
Do not file an issue until you have followed these steps:
1. Read [Help I've Found a Bug](https://github.com/FreeCodeCamp/FreeCodeCamp/wiki/Help-I've-Found-a-Bug) wiki page and follow the instructions there.
2. Asked for confirmation in the appropriate [Help Room](https://github.com/FreeCodeCamp/FreeCodeCamp/wiki/Help-Rooms)
3. Please *do not* open an issue without a 3rd party confirmation of your problem.
## Creating Pull Requests
**What is a Pull Request?**
A pull request (PR) is a method of submitting proposed changes to the Free Code Camp Repo (or any Repo, for that matter). You will make changes to copies of the files which make up Free Code Camp in a personal fork, then apply to have them accepted by Free Code Camp proper.
**Need Help?**
Free Code Camp Issue Mods and staff are on hand to assist with Pull Request related issues on our Help Contributors Chat Room
**Methods**
There are two methods of creating a Pull for Free Code Camp:
- Editing files via the GitHub Interface
- Editing files on a local clone
**Important: ALWAYS EDIT ON A BRANCH**
Take away only one thing from this document, it should be this: Never, **EVER** make edits to the `staging` branch. ALWAYS make a new branch BEFORE you edit files. This is critical, because if your PR is not accepted, your copy of staging will be forever sullied and the only way to fix it is to delete your fork and re-fork.
_**Method 1: Editing via your Local Fork (Recommended)**_
This is the recommended method. Read about How to Setup and Maintain a Local Instance of Free Code Camp.
1. Perform the maintenance step of rebasing `staging`.
2. Ensure you are on the `staging` branch using `git status`:
```bash
$ git status
On branch staging
Your branch is up-to-date with 'origin/staging'.
nothing to commit, working directory clean
```
3. If you are not on staging or your working directory is not clean, resolve any outstanding files/commits and checkout staging `git checkout staging`
4. Create a branch off of `staging` with git: `git checkout -B branch/name-here`
**Note:** Branch naming is important. Use a name like `fix/short-fix-description` or `feature/short-feature-description`. Review the [Contribution Guidelines](#contribution-guidelines) for more detail.
5. Edit your file(s) locally with the editor of your choice
6. Check your `git status` to see unstaged files.
7. Add your edited files: `git add path/to/filename.ext` You can also do: `git add .` to add all unstaged files. Take care, though, because you can accidentally add files you don't want added. Review your `git status` first.
8. Commit your edits: `git commit -m "Brief Description of Commit"`
9. Squash your commits, if there are more than one.
10. Push your commits to your GitHub Fork: `git push -u origin branch/name-here`
11. Go to [Common Steps](#common-steps)
_**Method 2: Editing via the GitHub Interface**_
Note: Editing via the GitHub Interface is not recommended, since it is not possible to update your fork via GitHub's interface without deleting and recreating your fork.
Read the [Wiki article](https://github.com/FreeCodeCamp/FreeCodeCamp/wiki/How-To-Create-A-Pull-Request-for-Free-Code-Camp#editing-via-the-github-interface) for further information
## Common Steps
1. Once the edits have been committed, you will be prompted to create a pull request on your fork's Github Page.
2. By default, all pull requests should be against the FCC main repo, `staging` branch.
3. Submit a [pull request](https://github.com/FreeCodeCamp/FreeCodeCamp/wiki/Pull-Request-Contribute) from your branch to Free Code Camp's `staging` branch.
3. The title (also called the subject) of your PR should be descriptive of your changes and succinctly indicates what is being fixed.
- **Do not add the issue number in the PR title**.
- Examples: `Add Test Cases to Bonfire Drop It` `Correct typo in Waypoint Size Your Images`
4. In the body of your PR include a more detailed summary of the changes you made and why.
- If the PR is meant to fix an existing bug/issue, then, at the end of your PR's commit message, append the keyword `closes` and #xxxx (where xxxx is the issue number). Example: `closes #1337`.
This tells GitHub to close the existing issue, if the PR is merged.
5. Indicate if you have tested on a local copy of the site or not.
## Next Steps
**If your PR is accepted**
Once your PR is accepted, you may delete the branch you created to submit it. This keeps your working fork clean.
You can do this with a press of a button on the GitHub PR interface. You can delete the local copy of the branch with: `git branch -D branch/to-delete-name`
**If your PR is rejected**
Don't despair! You should receive solid feedback from the Issue Moderators as to why it was rejected and what changes are needed.
Many Pull Requests, especially first Pull Requests, require correction or updating. If you have used the GitHub interface to create your PR, you will need to close your PR, create a new branch, and re-submit. This is because you cannot squash your commits via the GitHub interface.
If you have a local copy of the repo, you can make the requested changes and amend your commit with: `git commit --amend` This will update your existing commit. When you push it to your fork you will need to do a force push to overwrite your old commit: `git push --force`
Be sure to post in the PR conversation that you have made the requested changes.
##Other resources
- [Searching for Your Issue on Github](https://github.com/FreeCodeCamp/FreeCodeCamp/wiki/Searching-for-Your-Issue-on-Github)
- [Creating a New Github Issue](https://github.com/FreeCodeCamp/FreeCodeCamp/wiki/Creating-a-New-Github-Issue)
- [Select Issues for Contributing Using Labels](https://github.com/FreeCodeCamp/FreeCodeCamp/wiki/Select-Issues-for-Contributing-Using-Labels)
- [How to clone the FreeCodeCamp website on a Windows pc](https://github.com/FreeCodeCamp/FreeCodeCamp/wiki/How-to-clone-the-FreeCodeCamp-website-on-a-Windows-pc)
- [How to log in to your local FCC site - using GitHub](https://github.com/FreeCodeCamp/FreeCodeCamp/wiki/How-To-Log-In-To-Your-Local-FCC-Site)
- [Contributions Guide - With a demo on fixing a typo](https://github.com/FreeCodeCamp/FreeCodeCamp/wiki/Contributions-Guide---with-Typo-Demo)
- [Writing great git commit message](https://github.com/FreeCodeCamp/FreeCodeCamp/wiki/Writing-great-git-commit-message)
- [Contributor Chat Support - For the FCC Repositories, and running a local instance] (https://gitter.im/FreeCodeCamp/chinese)
================================================
FILE: LICENSE
================================================
BSD 3-Clause License
Copyright (c) 2017, FreeCodeCamp 中国
All rights reserved.
Redistribution and use in source and binary forms, with or without
modification, are permitted provided that the following conditions are met:
* Redistributions of source code must retain the above copyright notice, this
list of conditions and the following disclaimer.
* 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.
* Neither the name of the copyright holder nor the names of its
contributors may be used to endorse or promote products derived from
this software without specific prior written permission.
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 HOLDER 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.
================================================
FILE: LICENSE-freeCodeCamp-Curriculum.md
================================================
Attribution-ShareAlike 4.0 International
=======================================================================
Creative Commons Corporation ("Creative Commons") is not a law firm and
does not provide legal services or legal advice. Distribution of
Creative Commons public licenses does not create a lawyer-client or
other relationship. Creative Commons makes its licenses and related
information available on an "as-is" basis. Creative Commons gives no
warranties regarding its licenses, any material licensed under their
terms and conditions, or any related information. Creative Commons
disclaims all liability for damages resulting from their use to the
fullest extent possible.
Using Creative Commons Public Licenses
Creative Commons public licenses provide a standard set of terms and
conditions that creators and other rights holders may use to share
original works of authorship and other material subject to copyright
and certain other rights specified in the public license below. The
following considerations are for informational purposes only, are not
exhaustive, and do not form part of our licenses.
Considerations for licensors: Our public licenses are
intended for use by those authorized to give the public
permission to use material in ways otherwise restricted by
copyright and certain other rights. Our licenses are
irrevocable. Licensors should read and understand the terms
and conditions of the license they choose before applying it.
Licensors should also secure all rights necessary before
applying our licenses so that the public can reuse the
material as expected. Licensors should clearly mark any
material not subject to the license. This includes other CC-
licensed material, or material used under an exception or
limitation to copyright. More considerations for licensors:
wiki.creativecommons.org/Considerations_for_licensors
Considerations for the public: By using one of our public
licenses, a licensor grants the public permission to use the
licensed material under specified terms and conditions. If
the licensor's permission is not necessary for any reason--for
example, because of any applicable exception or limitation to
copyright--then that use is not regulated by the license. Our
licenses grant only permissions under copyright and certain
other rights that a licensor has authority to grant. Use of
the licensed material may still be restricted for other
reasons, including because others have copyright or other
rights in the material. A licensor may make special requests,
such as asking that all changes be marked or described.
Although not required by our licenses, you are encouraged to
respect those requests where reasonable. More_considerations
for the public:
wiki.creativecommons.org/Considerations_for_licensees
=======================================================================
Creative Commons Attribution-ShareAlike 4.0 International Public
License
By exercising the Licensed Rights (defined below), You accept and agree
to be bound by the terms and conditions of this Creative Commons
Attribution-ShareAlike 4.0 International Public License ("Public
License"). To the extent this Public License may be interpreted as a
contract, You are granted the Licensed Rights in consideration of Your
acceptance of these terms and conditions, and the Licensor grants You
such rights in consideration of benefits the Licensor receives from
making the Licensed Material available under these terms and
conditions.
Section 1 -- Definitions.
a. Adapted Material means material subject to Copyright and Similar
Rights that is derived from or based upon the Licensed Material
and in which the Licensed Material is translated, altered,
arranged, transformed, or otherwise modified in a manner requiring
permission under the Copyright and Similar Rights held by the
Licensor. For purposes of this Public License, where the Licensed
Material is a musical work, performance, or sound recording,
Adapted Material is always produced where the Licensed Material is
synched in timed relation with a moving image.
b. Adapter's License means the license You apply to Your Copyright
and Similar Rights in Your contributions to Adapted Material in
accordance with the terms and conditions of this Public License.
c. BY-SA Compatible License means a license listed at
creativecommons.org/compatiblelicenses, approved by Creative
Commons as essentially the equivalent of this Public License.
d. Copyright and Similar Rights means copyright and/or similar rights
closely related to copyright including, without limitation,
performance, broadcast, sound recording, and Sui Generis Database
Rights, without regard to how the rights are labeled or
categorized. For purposes of this Public License, the rights
specified in Section 2(b)(1)-(2) are not Copyright and Similar
Rights.
e. Effective Technological Measures means those measures that, in the
absence of proper authority, may not be circumvented under laws
fulfilling obligations under Article 11 of the WIPO Copyright
Treaty adopted on December 20, 1996, and/or similar international
agreements.
f. Exceptions and Limitations means fair use, fair dealing, and/or
any other exception or limitation to Copyright and Similar Rights
that applies to Your use of the Licensed Material.
g. License Elements means the license attributes listed in the name
of a Creative Commons Public License. The License Elements of this
Public License are Attribution and ShareAlike.
h. Licensed Material means the artistic or literary work, database,
or other material to which the Licensor applied this Public
License.
i. Licensed Rights means the rights granted to You subject to the
terms and conditions of this Public License, which are limited to
all Copyright and Similar Rights that apply to Your use of the
Licensed Material and that the Licensor has authority to license.
j. Licensor means the individual(s) or entity(ies) granting rights
under this Public License.
k. Share means to provide material to the public by any means or
process that requires permission under the Licensed Rights, such
as reproduction, public display, public performance, distribution,
dissemination, communication, or importation, and to make material
available to the public including in ways that members of the
public may access the material from a place and at a time
individually chosen by them.
l. Sui Generis Database Rights means rights other than copyright
resulting from Directive 96/9/EC of the European Parliament and of
the Council of 11 March 1996 on the legal protection of databases,
as amended and/or succeeded, as well as other essentially
equivalent rights anywhere in the world.
m. You means the individual or entity exercising the Licensed Rights
under this Public License. Your has a corresponding meaning.
Section 2 -- Scope.
a. License grant.
1. Subject to the terms and conditions of this Public License,
the Licensor hereby grants You a worldwide, royalty-free,
non-sublicensable, non-exclusive, irrevocable license to
exercise the Licensed Rights in the Licensed Material to:
a. reproduce and Share the Licensed Material, in whole or
in part; and
b. produce, reproduce, and Share Adapted Material.
2. Exceptions and Limitations. For the avoidance of doubt, where
Exceptions and Limitations apply to Your use, this Public
License does not apply, and You do not need to comply with
its terms and conditions.
3. Term. The term of this Public License is specified in Section
6(a).
4. Media and formats; technical modifications allowed. The
Licensor authorizes You to exercise the Licensed Rights in
all media and formats whether now known or hereafter created,
and to make technical modifications necessary to do so. The
Licensor waives and/or agrees not to assert any right or
authority to forbid You from making technical modifications
necessary to exercise the Licensed Rights, including
technical modifications necessary to circumvent Effective
Technological Measures. For purposes of this Public License,
simply making modifications authorized by this Section 2(a)
(4) never produces Adapted Material.
5. Downstream recipients.
a. Offer from the Licensor -- Licensed Material. Every
recipient of the Licensed Material automatically
receives an offer from the Licensor to exercise the
Licensed Rights under the terms and conditions of this
Public License.
b. Additional offer from the Licensor -- Adapted Material.
Every recipient of Adapted Material from You
automatically receives an offer from the Licensor to
exercise the Licensed Rights in the Adapted Material
under the conditions of the Adapter's License You apply.
c. No downstream restrictions. You may not offer or impose
any additional or different terms or conditions on, or
apply any Effective Technological Measures to, the
Licensed Material if doing so restricts exercise of the
Licensed Rights by any recipient of the Licensed
Material.
6. No endorsement. Nothing in this Public License constitutes or
may be construed as permission to assert or imply that You
are, or that Your use of the Licensed Material is, connected
with, or sponsored, endorsed, or granted official status by,
the Licensor or others designated to receive attribution as
provided in Section 3(a)(1)(A)(i).
b. Other rights.
1. Moral rights, such as the right of integrity, are not
licensed under this Public License, nor are publicity,
privacy, and/or other similar personality rights; however, to
the extent possible, the Licensor waives and/or agrees not to
assert any such rights held by the Licensor to the limited
extent necessary to allow You to exercise the Licensed
Rights, but not otherwise.
2. Patent and trademark rights are not licensed under this
Public License.
3. To the extent possible, the Licensor waives any right to
collect royalties from You for the exercise of the Licensed
Rights, whether directly or through a collecting society
under any voluntary or waivable statutory or compulsory
licensing scheme. In all other cases the Licensor expressly
reserves any right to collect such royalties.
Section 3 -- License Conditions.
Your exercise of the Licensed Rights is expressly made subject to the
following conditions.
a. Attribution.
1. If You Share the Licensed Material (including in modified
form), You must:
a. retain the following if it is supplied by the Licensor
with the Licensed Material:
i. identification of the creator(s) of the Licensed
Material and any others designated to receive
attribution, in any reasonable manner requested by
the Licensor (including by pseudonym if
designated);
ii. a copyright notice;
iii. a notice that refers to this Public License;
iv. a notice that refers to the disclaimer of
warranties;
v. a URI or hyperlink to the Licensed Material to the
extent reasonably practicable;
b. indicate if You modified the Licensed Material and
retain an indication of any previous modifications; and
c. indicate the Licensed Material is licensed under this
Public License, and include the text of, or the URI or
hyperlink to, this Public License.
2. You may satisfy the conditions in Section 3(a)(1) in any
reasonable manner based on the medium, means, and context in
which You Share the Licensed Material. For example, it may be
reasonable to satisfy the conditions by providing a URI or
hyperlink to a resource that includes the required
information.
3. If requested by the Licensor, You must remove any of the
information required by Section 3(a)(1)(A) to the extent
reasonably practicable.
b. ShareAlike.
In addition to the conditions in Section 3(a), if You Share
Adapted Material You produce, the following conditions also apply.
1. The Adapter's License You apply must be a Creative Commons
license with the same License Elements, this version or
later, or a BY-SA Compatible License.
2. You must include the text of, or the URI or hyperlink to, the
Adapter's License You apply. You may satisfy this condition
in any reasonable manner based on the medium, means, and
context in which You Share Adapted Material.
3. You may not offer or impose any additional or different terms
or conditions on, or apply any Effective Technological
Measures to, Adapted Material that restrict exercise of the
rights granted under the Adapter's License You apply.
Section 4 -- Sui Generis Database Rights.
Where the Licensed Rights include Sui Generis Database Rights that
apply to Your use of the Licensed Material:
a. for the avoidance of doubt, Section 2(a)(1) grants You the right
to extract, reuse, reproduce, and Share all or a substantial
portion of the contents of the database;
b. if You include all or a substantial portion of the database
contents in a database in which You have Sui Generis Database
Rights, then the database in which You have Sui Generis Database
Rights (but not its individual contents) is Adapted Material,
including for purposes of Section 3(b); and
c. You must comply with the conditions in Section 3(a) if You Share
all or a substantial portion of the contents of the database.
For the avoidance of doubt, this Section 4 supplements and does not
replace Your obligations under this Public License where the Licensed
Rights include other Copyright and Similar Rights.
Section 5 -- Disclaimer of Warranties and Limitation of Liability.
a. UNLESS OTHERWISE SEPARATELY UNDERTAKEN BY THE LICENSOR, TO THE
EXTENT POSSIBLE, THE LICENSOR OFFERS THE LICENSED MATERIAL AS-IS
AND AS-AVAILABLE, AND MAKES NO REPRESENTATIONS OR WARRANTIES OF
ANY KIND CONCERNING THE LICENSED MATERIAL, WHETHER EXPRESS,
IMPLIED, STATUTORY, OR OTHER. THIS INCLUDES, WITHOUT LIMITATION,
WARRANTIES OF TITLE, MERCHANTABILITY, FITNESS FOR A PARTICULAR
PURPOSE, NON-INFRINGEMENT, ABSENCE OF LATENT OR OTHER DEFECTS,
ACCURACY, OR THE PRESENCE OR ABSENCE OF ERRORS, WHETHER OR NOT
KNOWN OR DISCOVERABLE. WHERE DISCLAIMERS OF WARRANTIES ARE NOT
ALLOWED IN FULL OR IN PART, THIS DISCLAIMER MAY NOT APPLY TO YOU.
b. TO THE EXTENT POSSIBLE, IN NO EVENT WILL THE LICENSOR BE LIABLE
TO YOU ON ANY LEGAL THEORY (INCLUDING, WITHOUT LIMITATION,
NEGLIGENCE) OR OTHERWISE FOR ANY DIRECT, SPECIAL, INDIRECT,
INCIDENTAL, CONSEQUENTIAL, PUNITIVE, EXEMPLARY, OR OTHER LOSSES,
COSTS, EXPENSES, OR DAMAGES ARISING OUT OF THIS PUBLIC LICENSE OR
USE OF THE LICENSED MATERIAL, EVEN IF THE LICENSOR HAS BEEN
ADVISED OF THE POSSIBILITY OF SUCH LOSSES, COSTS, EXPENSES, OR
DAMAGES. WHERE A LIMITATION OF LIABILITY IS NOT ALLOWED IN FULL OR
IN PART, THIS LIMITATION MAY NOT APPLY TO YOU.
c. The disclaimer of warranties and limitation of liability provided
above shall be interpreted in a manner that, to the extent
possible, most closely approximates an absolute disclaimer and
waiver of all liability.
Section 6 -- Term and Termination.
a. This Public License applies for the term of the Copyright and
Similar Rights licensed here. However, if You fail to comply with
this Public License, then Your rights under this Public License
terminate automatically.
b. Where Your right to use the Licensed Material has terminated under
Section 6(a), it reinstates:
1. automatically as of the date the violation is cured, provided
it is cured within 30 days of Your discovery of the
violation; or
2. upon express reinstatement by the Licensor.
For the avoidance of doubt, this Section 6(b) does not affect any
right the Licensor may have to seek remedies for Your violations
of this Public License.
c. For the avoidance of doubt, the Licensor may also offer the
Licensed Material under separate terms or conditions or stop
distributing the Licensed Material at any time; however, doing so
will not terminate this Public License.
d. Sections 1, 5, 6, 7, and 8 survive termination of this Public
License.
Section 7 -- Other Terms and Conditions.
a. The Licensor shall not be bound by any additional or different
terms or conditions communicated by You unless expressly agreed.
b. Any arrangements, understandings, or agreements regarding the
Licensed Material not stated herein are separate from and
independent of the terms and conditions of this Public License.
Section 8 -- Interpretation.
a. For the avoidance of doubt, this Public License does not, and
shall not be interpreted to, reduce, limit, restrict, or impose
conditions on any use of the Licensed Material that could lawfully
be made without permission under this Public License.
b. To the extent possible, if any provision of this Public License is
deemed unenforceable, it shall be automatically reformed to the
minimum extent necessary to make it enforceable. If the provision
cannot be reformed, it shall be severed from this Public License
without affecting the enforceability of the remaining terms and
conditions.
c. No term or condition of this Public License will be waived and no
failure to comply consented to unless expressly agreed to by the
Licensor.
d. Nothing in this Public License constitutes or may be interpreted
as a limitation upon, or waiver of, any privileges and immunities
that apply to the Licensor or You, including from the legal
processes of any jurisdiction or authority.
=======================================================================
Creative Commons is not a party to its public
licenses. Notwithstanding, Creative Commons may elect to apply one of
its public licenses to material it publishes and in those instances
will be considered the “Licensor.” The text of the Creative Commons
public licenses is dedicated to the public domain under the CC0 Public
Domain Dedication. Except for the limited purpose of indicating that
material is shared under a Creative Commons public license or as
otherwise permitted by the Creative Commons policies published at
creativecommons.org/policies, Creative Commons does not authorize the
use of the trademark "Creative Commons" or any other trademark or logo
of Creative Commons without its prior written consent including,
without limitation, in connection with any unauthorized modifications
to any of its public licenses or any other arrangements,
understandings, or agreements concerning use of licensed material. For
the avoidance of doubt, this paragraph does not form part of the
public licenses.
Creative Commons may be contacted at creativecommons.org.
================================================
FILE: LICENSE-freeCodeCamp-Translation.md
================================================
## creative commons
# Attribution-NonCommercial 4.0 International
Creative Commons Corporation (“Creative Commons”) is not a law firm and does not provide legal services or legal advice. Distribution of Creative Commons public licenses does not create a lawyer-client or other relationship. Creative Commons makes its licenses and related information available on an “as-is” basis. Creative Commons gives no warranties regarding its licenses, any material licensed under their terms and conditions, or any related information. Creative Commons disclaims all liability for damages resulting from their use to the fullest extent possible.
### Using Creative Commons Public Licenses
Creative Commons public licenses provide a standard set of terms and conditions that creators and other rights holders may use to share original works of authorship and other material subject to copyright and certain other rights specified in the public license below. The following considerations are for informational purposes only, are not exhaustive, and do not form part of our licenses.
* __Considerations for licensors:__ Our public licenses are intended for use by those authorized to give the public permission to use material in ways otherwise restricted by copyright and certain other rights. Our licenses are irrevocable. Licensors should read and understand the terms and conditions of the license they choose before applying it. Licensors should also secure all rights necessary before applying our licenses so that the public can reuse the material as expected. Licensors should clearly mark any material not subject to the license. This includes other CC-licensed material, or material used under an exception or limitation to copyright. [More considerations for licensors](http://wiki.creativecommons.org/Considerations_for_licensors_and_licensees#Considerations_for_licensors).
* __Considerations for the public:__ By using one of our public licenses, a licensor grants the public permission to use the licensed material under specified terms and conditions. If the licensor’s permission is not necessary for any reason–for example, because of any applicable exception or limitation to copyright–then that use is not regulated by the license. Our licenses grant only permissions under copyright and certain other rights that a licensor has authority to grant. Use of the licensed material may still be restricted for other reasons, including because others have copyright or other rights in the material. A licensor may make special requests, such as asking that all changes be marked or described. Although not required by our licenses, you are encouraged to respect those requests where reasonable. [More considerations for the public](http://wiki.creativecommons.org/Considerations_for_licensors_and_licensees#Considerations_for_licensees).
## Creative Commons Attribution-NonCommercial 4.0 International Public License
By exercising the Licensed Rights (defined below), You accept and agree to be bound by the terms and conditions of this Creative Commons Attribution-NonCommercial 4.0 International Public License ("Public License"). To the extent this Public License may be interpreted as a contract, You are granted the Licensed Rights in consideration of Your acceptance of these terms and conditions, and the Licensor grants You such rights in consideration of benefits the Licensor receives from making the Licensed Material available under these terms and conditions.
### Section 1 – Definitions.
a. __Adapted Material__ means material subject to Copyright and Similar Rights that is derived from or based upon the Licensed Material and in which the Licensed Material is translated, altered, arranged, transformed, or otherwise modified in a manner requiring permission under the Copyright and Similar Rights held by the Licensor. For purposes of this Public License, where the Licensed Material is a musical work, performance, or sound recording, Adapted Material is always produced where the Licensed Material is synched in timed relation with a moving image.
b. __Adapter's License__ means the license You apply to Your Copyright and Similar Rights in Your contributions to Adapted Material in accordance with the terms and conditions of this Public License.
c. __Copyright and Similar Rights__ means copyright and/or similar rights closely related to copyright including, without limitation, performance, broadcast, sound recording, and Sui Generis Database Rights, without regard to how the rights are labeled or categorized. For purposes of this Public License, the rights specified in Section 2(b)(1)-(2) are not Copyright and Similar Rights.
d. __Effective Technological Measures__ means those measures that, in the absence of proper authority, may not be circumvented under laws fulfilling obligations under Article 11 of the WIPO Copyright Treaty adopted on December 20, 1996, and/or similar international agreements.
e. __Exceptions and Limitations__ means fair use, fair dealing, and/or any other exception or limitation to Copyright and Similar Rights that applies to Your use of the Licensed Material.
f. __Licensed Material__ means the artistic or literary work, database, or other material to which the Licensor applied this Public License.
g. __Licensed Rights__ means the rights granted to You subject to the terms and conditions of this Public License, which are limited to all Copyright and Similar Rights that apply to Your use of the Licensed Material and that the Licensor has authority to license.
h. __Licensor__ means the individual(s) or entity(ies) granting rights under this Public License.
i. __NonCommercial__ means not primarily intended for or directed towards commercial advantage or monetary compensation. For purposes of this Public License, the exchange of the Licensed Material for other material subject to Copyright and Similar Rights by digital file-sharing or similar means is NonCommercial provided there is no payment of monetary compensation in connection with the exchange.
j. __Share__ means to provide material to the public by any means or process that requires permission under the Licensed Rights, such as reproduction, public display, public performance, distribution, dissemination, communication, or importation, and to make material available to the public including in ways that members of the public may access the material from a place and at a time individually chosen by them.
k. __Sui Generis Database Rights__ means rights other than copyright resulting from Directive 96/9/EC of the European Parliament and of the Council of 11 March 1996 on the legal protection of databases, as amended and/or succeeded, as well as other essentially equivalent rights anywhere in the world.
l. __You__ means the individual or entity exercising the Licensed Rights under this Public License. Your has a corresponding meaning.
### Section 2 – Scope.
a. ___License grant.___
1. Subject to the terms and conditions of this Public License, the Licensor hereby grants You a worldwide, royalty-free, non-sublicensable, non-exclusive, irrevocable license to exercise the Licensed Rights in the Licensed Material to:
A. reproduce and Share the Licensed Material, in whole or in part, for NonCommercial purposes only; and
B. produce, reproduce, and Share Adapted Material for NonCommercial purposes only.
2. __Exceptions and Limitations.__ For the avoidance of doubt, where Exceptions and Limitations apply to Your use, this Public License does not apply, and You do not need to comply with its terms and conditions.
3. __Term.__ The term of this Public License is specified in Section 6(a).
4. __Media and formats; technical modifications allowed.__ The Licensor authorizes You to exercise the Licensed Rights in all media and formats whether now known or hereafter created, and to make technical modifications necessary to do so. The Licensor waives and/or agrees not to assert any right or authority to forbid You from making technical modifications necessary to exercise the Licensed Rights, including technical modifications necessary to circumvent Effective Technological Measures. For purposes of this Public License, simply making modifications authorized by this Section 2(a)(4) never produces Adapted Material.
5. __Downstream recipients.__
A. __Offer from the Licensor – Licensed Material.__ Every recipient of the Licensed Material automatically receives an offer from the Licensor to exercise the Licensed Rights under the terms and conditions of this Public License.
B. __No downstream restrictions.__ You may not offer or impose any additional or different terms or conditions on, or apply any Effective Technological Measures to, the Licensed Material if doing so restricts exercise of the Licensed Rights by any recipient of the Licensed Material.
6. __No endorsement.__ Nothing in this Public License constitutes or may be construed as permission to assert or imply that You are, or that Your use of the Licensed Material is, connected with, or sponsored, endorsed, or granted official status by, the Licensor or others designated to receive attribution as provided in Section 3(a)(1)(A)(i).
b. ___Other rights.___
1. Moral rights, such as the right of integrity, are not licensed under this Public License, nor are publicity, privacy, and/or other similar personality rights; however, to the extent possible, the Licensor waives and/or agrees not to assert any such rights held by the Licensor to the limited extent necessary to allow You to exercise the Licensed Rights, but not otherwise.
2. Patent and trademark rights are not licensed under this Public License.
3. To the extent possible, the Licensor waives any right to collect royalties from You for the exercise of the Licensed Rights, whether directly or through a collecting society under any voluntary or waivable statutory or compulsory licensing scheme. In all other cases the Licensor expressly reserves any right to collect such royalties, including when the Licensed Material is used other than for NonCommercial purposes.
### Section 3 – License Conditions.
Your exercise of the Licensed Rights is expressly made subject to the following conditions.
a. ___Attribution.___
1. If You Share the Licensed Material (including in modified form), You must:
A. retain the following if it is supplied by the Licensor with the Licensed Material:
i. identification of the creator(s) of the Licensed Material and any others designated to receive attribution, in any reasonable manner requested by the Licensor (including by pseudonym if designated);
ii. a copyright notice;
iii. a notice that refers to this Public License;
iv. a notice that refers to the disclaimer of warranties;
v. a URI or hyperlink to the Licensed Material to the extent reasonably practicable;
B. indicate if You modified the Licensed Material and retain an indication of any previous modifications; and
C. indicate the Licensed Material is licensed under this Public License, and include the text of, or the URI or hyperlink to, this Public License.
2. You may satisfy the conditions in Section 3(a)(1) in any reasonable manner based on the medium, means, and context in which You Share the Licensed Material. For example, it may be reasonable to satisfy the conditions by providing a URI or hyperlink to a resource that includes the required information.
3. If requested by the Licensor, You must remove any of the information required by Section 3(a)(1)(A) to the extent reasonably practicable.
4. If You Share Adapted Material You produce, the Adapter's License You apply must not prevent recipients of the Adapted Material from complying with this Public License.
### Section 4 – Sui Generis Database Rights.
Where the Licensed Rights include Sui Generis Database Rights that apply to Your use of the Licensed Material:
a. for the avoidance of doubt, Section 2(a)(1) grants You the right to extract, reuse, reproduce, and Share all or a substantial portion of the contents of the database for NonCommercial purposes only;
b. if You include all or a substantial portion of the database contents in a database in which You have Sui Generis Database Rights, then the database in which You have Sui Generis Database Rights (but not its individual contents) is Adapted Material; and
c. You must comply with the conditions in Section 3(a) if You Share all or a substantial portion of the contents of the database.
For the avoidance of doubt, this Section 4 supplements and does not replace Your obligations under this Public License where the Licensed Rights include other Copyright and Similar Rights.
### Section 5 – Disclaimer of Warranties and Limitation of Liability.
a. __Unless otherwise separately undertaken by the Licensor, to the extent possible, the Licensor offers the Licensed Material as-is and as-available, and makes no representations or warranties of any kind concerning the Licensed Material, whether express, implied, statutory, or other. This includes, without limitation, warranties of title, merchantability, fitness for a particular purpose, non-infringement, absence of latent or other defects, accuracy, or the presence or absence of errors, whether or not known or discoverable. Where disclaimers of warranties are not allowed in full or in part, this disclaimer may not apply to You.__
b. __To the extent possible, in no event will the Licensor be liable to You on any legal theory (including, without limitation, negligence) or otherwise for any direct, special, indirect, incidental, consequential, punitive, exemplary, or other losses, costs, expenses, or damages arising out of this Public License or use of the Licensed Material, even if the Licensor has been advised of the possibility of such losses, costs, expenses, or damages. Where a limitation of liability is not allowed in full or in part, this limitation may not apply to You.__
c. The disclaimer of warranties and limitation of liability provided above shall be interpreted in a manner that, to the extent possible, most closely approximates an absolute disclaimer and waiver of all liability.
### Section 6 – Term and Termination.
a. This Public License applies for the term of the Copyright and Similar Rights licensed here. However, if You fail to comply with this Public License, then Your rights under this Public License terminate automatically.
b. Where Your right to use the Licensed Material has terminated under Section 6(a), it reinstates:
1. automatically as of the date the violation is cured, provided it is cured within 30 days of Your discovery of the violation; or
2. upon express reinstatement by the Licensor.
For the avoidance of doubt, this Section 6(b) does not affect any right the Licensor may have to seek remedies for Your violations of this Public License.
c. For the avoidance of doubt, the Licensor may also offer the Licensed Material under separate terms or conditions or stop distributing the Licensed Material at any time; however, doing so will not terminate this Public License.
d. Sections 1, 5, 6, 7, and 8 survive termination of this Public License.
### Section 7 – Other Terms and Conditions.
a. The Licensor shall not be bound by any additional or different terms or conditions communicated by You unless expressly agreed.
b. Any arrangements, understandings, or agreements regarding the Licensed Material not stated herein are separate from and independent of the terms and conditions of this Public License.
### Section 8 – Interpretation.
a. For the avoidance of doubt, this Public License does not, and shall not be interpreted to, reduce, limit, restrict, or impose conditions on any use of the Licensed Material that could lawfully be made without permission under this Public License.
b. To the extent possible, if any provision of this Public License is deemed unenforceable, it shall be automatically reformed to the minimum extent necessary to make it enforceable. If the provision cannot be reformed, it shall be severed from this Public License without affecting the enforceability of the remaining terms and conditions.
c. No term or condition of this Public License will be waived and no failure to comply consented to unless expressly agreed to by the Licensor.
d. Nothing in this Public License constitutes or may be interpreted as a limitation upon, or waiver of, any privileges and immunities that apply to the Licensor or You, including from the legal processes of any jurisdiction or authority.
> Creative Commons is not a party to its public licenses. Notwithstanding, Creative Commons may elect to apply one of its public licenses to material it publishes and in those instances will be considered the “Licensor.” Except for the limited purpose of indicating that material is shared under a Creative Commons public license or as otherwise permitted by the Creative Commons policies published at [creativecommons.org/policies](http://creativecommons.org/policies), Creative Commons does not authorize the use of the trademark “Creative Commons” or any other trademark or logo of Creative Commons without its prior written consent including, without limitation, in connection with any unauthorized modifications to any of its public licenses or any other arrangements, understandings, or agreements concerning use of licensed material. For the avoidance of doubt, this paragraph does not form part of the public licenses.
>
> Creative Commons may be contacted at creativecommons.org
================================================
FILE: README.md
================================================

扫码加入 FCC-China 社群
### FreeCodeCampChina's open source codebase and curriculum
freeCodeCamp is a friendly open source community where you learn to code and help nonprofits.
**We help our campers build job-worthy portfolios of real apps used by real people, while helping nonprofits.**
You start by working through our self-paced, browser-based full stack JavaScript curriculum.
### By working through our curriculum, you can earn four certifications:
##### 1. Front End Certification
The first section will teach you the basics of how webpages work and also introduce you to JavaScript programming.
Skills you'll practice include `HTML`, `CSS`, `JavaScript`, `jQuery` and `Bootstrap`.
To earn this certification, you'll build **10 front-end projects** and implement many **JavaScript algorithms**.
##### 2. Data Visualization Certification
The second section builds upon the first and introduces you to more advanced topics such as `Sass`, `React` and `D3`.
To earn this certification, you'll build **5 React-apps** and **5 Data visualization apps** using `D3.js`.
##### 3. Back End Certification
The third section introduces you to back end development using `Node.js`, `Express,` and `MongoDB`. It also teaches you about the important concept of source control using `Git`.
To earn this certification, you'll build **5 APIs** and **5 full stack apps**.
We will accept solutions implemented in _any_ programming language, as long as both a live demo and the source code are publicly accessible.
##### 4. Full Stack Certification
The fourth section is where you'll get **real-world experience** by working on projects for **nonprofits**.
We'll pair you with another camper, an agile project manager, and a stakeholder from a nonprofit organization. Together, you'll plan, build and maintain apps that help that nonprofit carry out its mission more effectively.
For this certification, you'll work on **two projects from scratch** and then **maintain/upgrade two existing projects**.
---
This code is running live at [freeCodeCamp.cn](https://freecodecamp.cn). We also have [Gitter chat rooms](https://gitter.im/FreeCodeCamp/chinese), a [Medium publication](https://medium.freecodecamp.org), an [interactive forum](https://forum.freecodecamp.org), a [wiki knowledgebase](https://forum.freecodecamp.org/c/wiki), and even a [YouTube channel](https://youtube.com/freecodecamp).
### [Join our community here](https://freecodecamp.cn/signin).
Found a bug?
------------
Do not file an issue until you have followed these steps:
1. Read the [Help I've Found a Bug](https://forum.freecodecamp.org/t/how-to-report-a-bug/19543) article and follow its instructions.
2. Ask for confirmation in the appropriate [Help Room](https://forum.freecodecamp.org/t/free-code-camp-official-chat-rooms/19390/2).
3. Please *do not* open an issue without a 3rd party confirmation of your problem.
Contributing
------------
We welcome pull requests from freeCodeCamp campers (our students) and seasoned JavaScript developers alike! Please follow [these steps](CONTRIBUTING.md) to contribute.
License
-------
Copyright (c) 2017 freeCodeCamp.
The content of this repository bound by the following LICENSE(S)
- The computer software is licensed under the [BSD-3-Clause](./LICENSE.md).
- The curricular content as in the `./seed/challenges` or subdirectories and our wiki are licensed under the [CC-BY-SA-4.0](./LICENSE-freeCodeCamp-Curriculum.md)
- The translation of this website follows the license of [CC-BY-NC-4.0](./LICENSE-freeCodeCamp-Translation.md),Do not use (it) for commercial/business purpose. <a rel="license" href="https://creativecommons.org/licenses/by-nc/4.0/deed.zh"><img alt="知识共享许可协议" style="border-width:0" src="https://i.creativecommons.org/l/by-nc/4.0/80x15.png" /></a>
================================================
FILE: bower.json
================================================
{
"name": "freecodecamp",
"version": "0.0.0",
"homepage": "http://freecodecamp.cn",
"private": true,
"ignore": [
"**/.*",
"node_modules",
"bower_components",
"public/bower_components",
"test",
"tests"
],
"dependencies": {
"d3": "~3.5.5",
"jquery": "~2.1.4",
"cal-heatmap": "~3.5.2",
"bootstrap": "~3.3.4",
"font-awesome": "~4.5.0",
"moment": "~2.10.2",
"moment-timezone": "~0.5.0",
"jshint": "~2.9.0",
"lightbox2": "~2.8.1",
"rxjs": "~4.0.6",
"CodeMirror": "~5.8.0",
"chai": "~3.4.1",
"clipboard": "~1.5.5",
"mousetrap": "~1.5.3"
}
}
================================================
FILE: client/README.md
================================================
This is the entry point for the client code.
Code that should run only on the client should be put here.
NOTE(berks): For react specific stuff this should be the entry point
================================================
FILE: client/commonFramework/add-loop-protect.js
================================================
window.common = (function(global) {
const {
loopProtect,
common = { init: [] }
} = global;
loopProtect.hit = function hit(line) {
var err = 'Error: Exiting potential infinite loop at line ' +
line +
'. To disable loop protection, write: \n\\/\\/ noprotect\nas the first' +
'line. Beware that if you do have an infinite loop in your code' +
'this will crash your browser.';
console.error(err);
};
common.addLoopProtect = function addLoopProtect(code = '') {
return loopProtect(code);
};
return common;
})(window);
================================================
FILE: client/commonFramework/bindings.js
================================================
window.common = (function(global) {
const {
$,
Rx: { Observable },
common = { init: [] }
} = global;
common.ctrlEnterClickHandler = function ctrlEnterClickHandler(e) {
// ctrl + enter or cmd + enter
if (
e.keyCode === 13 &&
(e.metaKey || e.ctrlKey)
) {
$('#complete-courseware-dialog').off('keydown', ctrlEnterClickHandler);
if ($('#submit-challenge').length > 0) {
$('#submit-challenge').click();
} else {
window.location = '/challenges/next-challenge?id=' + common.challengeId;
}
}
};
common.init.push(function($) {
var $marginFix = $('.innerMarginFix');
$marginFix.css('min-height', $marginFix.height());
common.submitBtn$ = Observable.fromEvent($('#submitButton'), 'click');
common.resetBtn$ = Observable.fromEvent($('#reset-button'), 'click');
// init modal keybindings on open
$('#complete-courseware-dialog').on('shown.bs.modal', function() {
$('#complete-courseware-dialog').keydown(common.ctrlEnterClickHandler);
});
// remove modal keybinds on close
$('#complete-courseware-dialog').on('hidden.bs.modal', function() {
$('#complete-courseware-dialog').off(
'keydown',
common.ctrlEnterClickHandler
);
});
// video checklist binding
$('.challenge-list-checkbox').on('change', function() {
var checkboxId = $(this).parent().parent().attr('id');
if ($(this).is(':checked')) {
$(this).parent().siblings().children().addClass('faded');
if (!localStorage || !localStorage[checkboxId]) {
localStorage[checkboxId] = true;
}
}
if (!$(this).is(':checked')) {
$(this).parent().siblings().children().removeClass('faded');
if (localStorage[checkboxId]) {
localStorage.removeItem(checkboxId);
}
}
});
$('.checklist-element').each(function() {
var checklistElementId = $(this).attr('id');
if (localStorage[checklistElementId]) {
$(this).children().children('li').addClass('faded');
$(this).children().children('input').trigger('click');
}
});
// video challenge submit
$('#next-courseware-button').on('click', function() {
$('#next-courseware-button').unbind('click');
if ($('.signup-btn-nav').length < 1) {
var data;
var solution = $('#public-url').val() || null;
var githubLink = $('#github-url').val() || null;
switch (common.challengeType) {
case common.challengeTypes.VIDEO:
data = {
id: common.challengeId,
name: common.challengeName,
challengeType: +common.challengeType
};
$.ajax({
url: '/completed-challenge/',
type: 'POST',
data: JSON.stringify(data),
contentType: 'application/json',
dataType: 'json'
})
.success(function(res) {
if (!res) {
return;
}
window.location.href = '/challenges/next-challenge?id=' +
common.challengeId;
})
.fail(function() {
window.location.replace(window.location.href);
});
break;
case common.challengeTypes.BASEJUMP:
case common.challengeTypes.ZIPLINE:
data = {
id: common.challengeId,
name: common.challengeName,
challengeType: +common.challengeType,
solution,
githubLink
};
$.ajax({
url: '/completed-zipline-or-basejump/',
type: 'POST',
data: JSON.stringify(data),
contentType: 'application/json',
dataType: 'json'
})
.success(function() {
window.location.href = '/challenges/next-challenge?id=' +
common.challengeId;
})
.fail(function() {
window.location.replace(window.location.href);
});
break;
case common.challengeTypes.BONFIRE:
window.location.href = '/challenges/next-challenge?id=' +
common.challengeId;
break;
default:
console.log('Happy Coding!');
break;
}
}
});
if (common.challengeName) {
window.ga('send', 'event', 'Challenge', 'load', common.gaName);
}
$('#complete-courseware-dialog').on('hidden.bs.modal', function() {
if (common.editor.focus) {
common.editor.focus();
}
});
$('#trigger-issue-modal').on('click', function() {
$('#issue-modal').modal('show');
});
$('#trigger-help-modal').on('click', function() {
$('#help-modal').modal('show');
});
$('#trigger-reset-modal').on('click', function() {
$('#reset-modal').modal('show');
});
$('#trigger-pair-modal').on('click', function() {
$('#pair-modal').modal('show');
});
$('#completed-courseware').on('click', function() {
$('#complete-courseware-dialog').modal('show');
});
$('#help-ive-found-a-bug-wiki-article').on('click', function() {
window.open(
'https://github.com/freecodecampchina/freecodecamp.cn/wiki/' +
"Help-I've-Found-a-Bug",
'_blank'
);
});
$('#search-issue').on('click', function() {
var queryIssue = window.location.href
.toString()
.split('?')[0]
.replace(/(#*)$/, '');
window.open(
'https://github.com/freecodecampchina/freecodecamp.cn/issues?q=' +
'is:issue is:all ' +
(common.challengeName) +
' OR ' +
queryIssue
.substr(queryIssue.lastIndexOf('challenges/') + 11)
.replace('/', ''), '_blank');
});
});
return common;
}(window));
================================================
FILE: client/commonFramework/code-storage.js
================================================
// depends on: codeUri
window.common = (function(global) {
const {
localStorage,
common = { init: [] }
} = global;
var challengePrefix = [
'Bonfire: ',
'Waypoint: ',
'Zipline: ',
'Basejump: ',
'Checkpoint: '],
item;
var codeStorage = {
getStoredValue(key) {
if (
!localStorage ||
typeof localStorage.getItem !== 'function' ||
!key ||
typeof key !== 'string'
) {
console.log('unable to read from storage');
return '';
}
if (localStorage.getItem(key + 'Val')) {
return '' + localStorage.getItem(key + 'Val');
} else {
for (var i = 0; i <= challengePrefix.length; i++) {
item = localStorage.getItem(challengePrefix[i] + key + 'Val');
if (item) {
return '' + item;
}
}
}
return null;
},
isAlive: function(key) {
var val = this.getStoredValue(key);
return val !== 'null' &&
val !== 'undefined' &&
(val && val.length > 0);
},
updateStorage(key, code) {
if (
!localStorage ||
typeof localStorage.setItem !== 'function' ||
!key ||
typeof key !== 'string'
) {
console.log('unable to save to storage');
return code;
}
localStorage.setItem(key + 'Val', code);
return code;
}
};
common.codeStorage = codeStorage;
return common;
}(window, window.common));
================================================
FILE: client/commonFramework/code-uri.js
================================================
// store code in the URL
window.common = (function(global) {
const {
encodeURIComponent: encode,
decodeURIComponent: decode,
location,
history,
common = { init: [] }
} = global;
const {
replaceScriptTags,
replaceSafeTags,
replaceFormActionAttr,
replaceFccfaaAttr
} = common;
const queryRegex = /^(\?|#\?)/;
function encodeFcc(val) {
return replaceScriptTags(replaceFormActionAttr(val));
}
function decodeFcc(val) {
return replaceSafeTags(replaceFccfaaAttr(val));
}
var codeUri = {
encode: function(code) {
return encode(code);
},
decode: function(code) {
try {
return decode(code);
} catch (ignore) {
return null;
}
},
isInQuery: function(query) {
var decoded = codeUri.decode(query);
if (!decoded || typeof decoded.split !== 'function') {
return false;
}
return decoded
.replace(queryRegex, '')
.split('&')
.reduce(function(found, param) {
var key = param.split('=')[0];
if (key === 'solution') {
return true;
}
return found;
}, false);
},
isAlive: function() {
return codeUri.enabled &&
codeUri.isInQuery(location.search) ||
codeUri.isInQuery(location.hash);
},
getKeyInQuery(query, keyToFind = '') {
return query
.split('&')
.reduce(function(oldValue, param) {
var key = param.split('=')[0];
var value = param
.split('=')
.slice(1)
.join('=');
if (key === keyToFind) {
return value;
}
return oldValue;
}, null);
},
getSolutionFromQuery(query = '') {
return decodeFcc(
codeUri.decode(codeUri.getKeyInQuery(query, 'solution'))
);
},
parse: function() {
if (!codeUri.enabled) {
return null;
}
var query;
if (location.search && codeUri.isInQuery(location.search)) {
query = location.search.replace(/^\?/, '');
if (history && typeof history.replaceState === 'function') {
history.replaceState(
history.state,
null,
location.href.split('?')[0]
);
location.hash = '#?' + encodeFcc(query);
}
} else {
query = location.hash.replace(/^\#\?/, '');
}
if (!query) {
return null;
}
return this.getSolutionFromQuery(query);
},
querify: function(solution) {
if (!codeUri.enabled) {
return null;
}
if (history && typeof history.replaceState === 'function') {
// grab the url up to the query
// destroy any hash symbols still clinging to life
const url = (location.href.split('?')[0]).replace(/(#*)$/, '');
history.replaceState(
history.state,
null,
url +
'#?' +
(codeUri.shouldRun() ? '' : 'run=disabled&') +
'solution=' +
codeUri.encode(encodeFcc(solution))
);
} else {
location.hash = '?solution=' +
codeUri.encode(encodeFcc(solution));
}
return solution;
},
enabled: true,
shouldRun() {
return !this.getKeyInQuery(
(location.search || location.hash).replace(queryRegex, ''),
'run'
);
}
};
common.init.push(function() {
codeUri.parse();
});
common.codeUri = codeUri;
common.shouldRun = () => codeUri.shouldRun();
return common;
}(window));
================================================
FILE: client/commonFramework/create-editor.js
================================================
window.common = (function(global) {
const {
Rx: { Subject, Observable },
CodeMirror,
emmetCodeMirror,
common = { init: [] }
} = global;
const { challengeType = '0', challengeTypes } = common;
if (
!CodeMirror ||
challengeType === challengeTypes.BASEJUMP ||
challengeType === challengeTypes.ZIPLINE ||
challengeType === challengeTypes.VIDEO ||
challengeType === challengeTypes.STEP ||
challengeType === challengeTypes.HIKES
) {
common.editor = {};
return common;
}
var editor = CodeMirror.fromTextArea(
document.getElementById('codeEditor'),
{
lint: true,
lineNumbers: true,
mode: 'javascript',
theme: 'monokai',
runnable: true,
matchBrackets: true,
autoCloseBrackets: true,
scrollbarStyle: 'null',
lineWrapping: true,
gutters: ['CodeMirror-lint-markers']
}
);
editor.setSize('100%', 'auto');
common.editorExecute$ = new Subject();
common.editorKeyUp$ = Observable.fromEventPattern(
(handler) => editor.on('keyup', handler),
(handler) => editor.off('keyup', handler)
);
editor.setOption('extraKeys', {
Tab: function(cm) {
if (cm.somethingSelected()) {
cm.indentSelection('add');
} else {
var spaces = Array(cm.getOption('indentUnit') + 1).join(' ');
cm.replaceSelection(spaces);
}
},
'Shift-Tab': function(cm) {
if (cm.somethingSelected()) {
cm.indentSelection('subtract');
} else {
var spaces = Array(cm.getOption('indentUnit') + 1).join(' ');
cm.replaceSelection(spaces);
}
},
'Ctrl-Enter': function() {
common.editorExecute$.onNext();
return false;
},
'Cmd-Enter': function() {
common.editorExecute$.onNext();
return false;
}
});
var info = editor.getScrollInfo();
var after = editor.charCoords({
line: editor.getCursor().line + 1,
ch: 0
}, 'local').top;
if (info.top + info.clientHeight < after) {
editor.scrollTo(null, after - info.clientHeight + 3);
}
if (emmetCodeMirror) {
emmetCodeMirror(
editor,
{
'Cmd-E': 'emmet.expand_abbreviation',
Tab: 'emmet.expand_abbreviation_with_tab',
Enter: 'emmet.insert_formatted_line_break_only'
}
);
}
common.init.push(function() {
let editorValue;
if (common.codeUri.isAlive()) {
editorValue = common.codeUri.parse();
} else {
editorValue = common.codeStorage.isAlive(common.challengeName) ?
common.codeStorage.getStoredValue(common.challengeName) :
common.seed;
}
editor.setValue(common.replaceSafeTags(editorValue));
editor.refresh();
});
common.editor = editor;
return common;
}(window));
================================================
FILE: client/commonFramework/detect-unsafe-code-stream.js
================================================
window.common = (function(global) {
const {
Rx: { Observable },
common = { init: [] }
} = global;
const detectFunctionCall = /function\s*?\(|function\s+\w+\s*?\(/gi;
const detectUnsafeJQ = /\$\s*?\(\s*?\$\s*?\)/gi;
const detectUnsafeConsoleCall = /if\s\(null\)\sconsole\.log\(1\);/gi;
common.detectUnsafeCode$ = function detectUnsafeCode$(code) {
const openingComments = code.match(/\/\*/gi);
const closingComments = code.match(/\*\//gi);
// checks if the number of opening comments(/*) matches the number of
// closing comments(*/)
if (
openingComments &&
(
!closingComments ||
openingComments.length > closingComments.length
)
) {
return Observable.throw(
new Error('SyntaxError: Unfinished multi-line comment')
);
}
if (code.match(detectUnsafeJQ)) {
return Observable.throw(
new Error('Unsafe $($)')
);
}
if (
code.match(/function/g) &&
!code.match(detectFunctionCall)
) {
return Observable.throw(
new Error('SyntaxError: Unsafe or unfinished function declaration')
);
}
if (code.match(detectUnsafeConsoleCall)) {
return Observable.throw(
new Error('Invalid if (null) console.log(1); detected')
);
}
return Observable.just(code);
};
return common;
}(window));
================================================
FILE: client/commonFramework/display-test-results.js
================================================
window.common = (function({ $, common = { init: [] }}) {
common.displayTestResults = function displayTestResults(data = []) {
$('#testSuite').children().remove();
data.forEach(({ err = false, text = '' }) => {
var iconClass = err ?
'"ion-close-circled big-error-icon"' :
'"ion-checkmark-circled big-success-icon"';
$('<div></div>').html(`
<div class='row'>
<div class='col-xs-2 text-center'>
<i class=${iconClass}></i>
</div>
<div class='col-xs-10 test-output'>
${text.split('message: ').pop().replace(/\'\);/g, '')}
</div>
<div class='ten-pixel-break'/>
</div>
`)
.appendTo($('#testSuite'));
});
return data;
};
return common;
}(window));
================================================
FILE: client/commonFramework/end.js
================================================
$(document).ready(function() {
const common = window.common;
const { Observable } = window.Rx;
const {
addLoopProtect,
challengeName,
challengeType,
challengeTypes
} = common;
common.init.forEach(function(init) {
init($);
});
// only run if editor present
if (common.editor.getValue) {
const code$ = common.editorKeyUp$
.debounce(750)
.map(() => common.editor.getValue())
.distinctUntilChanged()
.shareReplay();
// update storage
code$.subscribe(
code => {
common.codeStorage.updateStorage(common.challengeName, code);
common.codeUri.querify(code);
},
err => console.error(err)
);
code$
// only run for HTML
.filter(() => common.challengeType === challengeTypes.HTML)
.flatMap(code => {
return common.detectUnsafeCode$(code)
.map(() => {
const combinedCode = common.head + code + common.tail;
return addLoopProtect(combinedCode);
})
.flatMap(code => common.updatePreview$(code))
.flatMap(() => common.checkPreview$({ code }))
.catch(err => Observable.just({ err }));
})
.subscribe(
({ err }) => {
if (err) {
console.error(err);
return common.updatePreview$(`
<h1>${err}</h1>
`).subscribe(() => {});
}
return null;
},
err => console.error(err)
);
}
common.resetBtn$
.doOnNext(() => {
common.editor.setValue(common.replaceSafeTags(common.seed));
})
.flatMap(() => {
return common.executeChallenge$()
.catch(err => Observable.just({ err }));
})
.subscribe(
({ err, output, originalCode }) => {
if (err) {
console.error(err);
return common.updateOutputDisplay('' + err);
}
common.codeStorage.updateStorage(challengeName, originalCode);
common.codeUri.querify(originalCode);
common.updateOutputDisplay(output);
return null;
},
(err) => {
if (err) {
console.error(err);
}
common.updateOutputDisplay('' + err);
}
);
Observable.merge(
common.editorExecute$,
common.submitBtn$
)
.flatMap(() => {
common.appendToOutputDisplay('\n// testing challenge...');
return common.executeChallenge$()
.map(({ tests, ...rest }) => {
const solved = tests.every(test => !test.err);
return { ...rest, tests, solved };
})
.catch(err => Observable.just({ err }));
})
.subscribe(
({ err, solved, output, tests }) => {
if (err) {
console.error(err);
if (common.challengeType === common.challengeTypes.HTML) {
return common.updatePreview$(`
<h1>${err}</h1>
`).first().subscribe(() => {});
}
return common.updateOutputDisplay('' + err);
}
common.updateOutputDisplay(output);
common.displayTestResults(tests);
if (solved) {
common.showCompletion();
}
return null;
},
({ err }) => {
console.error(err);
common.updateOutputDisplay('' + err);
}
);
// initial challenge run to populate tests
if (challengeType === challengeTypes.HTML) {
var $preview = $('#preview');
return Observable.fromCallback($preview.ready, $preview)()
.delay(500)
.flatMap(() => common.executeChallenge$())
.catch(err => Observable.just({ err }))
.subscribe(
({ err, tests }) => {
if (err) {
console.error(err);
if (common.challengeType === common.challengeTypes.HTML) {
return common.updatePreview$(`
<h1>${err}</h1>
`).subscribe(() => {});
}
return common.updateOutputDisplay('' + err);
}
common.displayTestResults(tests);
return null;
},
({ err }) => {
console.error(err);
}
);
}
if (
challengeType === challengeTypes.BONFIRE ||
challengeType === challengeTypes.JS
) {
return Observable.just({})
.delay(500)
.flatMap(() => common.executeChallenge$())
.catch(err => Observable.just({ err }))
.subscribe(
({ err, originalCode, tests }) => {
if (err) {
console.error(err);
return common.updateOutputDisplay('' + err);
}
common.codeStorage.updateStorage(challengeName, originalCode);
common.displayTestResults(tests);
return null;
},
(err) => {
console.error(err);
common.updateOutputDisplay('' + err);
}
);
}
return null;
});
================================================
FILE: client/commonFramework/execute-challenge-stream.js
================================================
window.common = (function(global) {
const {
ga,
common = { init: [] }
} = global;
const {
addLoopProtect,
getJsFromHtml,
detectUnsafeCode$,
updatePreview$,
challengeType,
challengeTypes
} = common;
common.executeChallenge$ = function executeChallenge$() {
const code = common.editor.getValue();
const originalCode = code;
const head = common.arrayToNewLineString(common.head);
const tail = common.arrayToNewLineString(common.tail);
const combinedCode = head + code + tail;
ga('send', 'event', 'Challenge', 'ran-code', common.gaName);
// run checks for unsafe code
return detectUnsafeCode$(code)
// add head and tail and detect loops
.map(() => {
if (challengeType !== challengeTypes.HTML) {
return `<script>;${addLoopProtect(combinedCode)}/**/</script>`;
}
return addLoopProtect(combinedCode);
})
.flatMap(code => updatePreview$(code))
.flatMap(code => {
let output;
if (
challengeType === challengeTypes.HTML &&
common.hasJs(code)
) {
output = common.getJsOutput(getJsFromHtml(code));
} else if (challengeType !== challengeTypes.HTML) {
output = common.getJsOutput(addLoopProtect(combinedCode));
}
return common.runPreviewTests$({
tests: common.tests.slice(),
originalCode,
output
});
});
};
return common;
}(window));
================================================
FILE: client/commonFramework/get-iframe.js
================================================
window.common = (function(global) {
const {
common = { init: [] },
document: doc
} = global;
common.getIframe = function getIframe(id = 'preview') {
let previewFrame = doc.getElementById(id);
// create and append a hidden preview frame
if (!previewFrame) {
previewFrame = doc.createElement('iframe');
previewFrame.id = id;
previewFrame.setAttribute('style', 'display: none');
doc.body.appendChild(previewFrame);
}
return previewFrame.contentDocument ||
previewFrame.contentWindow.document;
};
return common;
})(window);
================================================
FILE: client/commonFramework/init.js
================================================
window.common = (function(global) {
// common namespace
// all classes should be stored here
// called at the beginning of dom ready
const {
Rx: { Disposable, Observable, config },
common = { init: [] }
} = global;
config.longStackSupport = true;
common.head = common.head || [];
common.tail = common.tail || [];
common.salt = Math.random();
common.challengeTypes = {
HTML: '0',
JS: '1',
VIDEO: '2',
ZIPLINE: '3',
BASEJUMP: '4',
BONFIRE: '5',
HIKES: '6',
STEP: '7'
};
common.arrayToNewLineString = function arrayToNewLineString(seedData) {
seedData = Array.isArray(seedData) ? seedData : [seedData];
return seedData.reduce(function(seed, line) {
return '' + seed + line + '\n';
}, '');
};
common.seed = common.arrayToNewLineString(common.challengeSeed);
common.replaceScriptTags = function replaceScriptTags(value) {
return value
.replace(/<script>/gi, 'fccss')
.replace(/<\/script>/gi, 'fcces');
};
common.replaceSafeTags = function replaceSafeTags(value) {
return value
.replace(/fccss/gi, '<script>')
.replace(/fcces/gi, '</script>');
};
common.replaceFormActionAttr = function replaceFormAction(value) {
return value.replace(/<form[^>]*>/, function(val) {
return val.replace(/action(\s*?)=/, 'fccfaa$1=');
});
};
common.replaceFccfaaAttr = function replaceFccfaaAttr(value) {
return value.replace(/<form[^>]*>/, function(val) {
return val.replace(/fccfaa(\s*?)=/, 'action$1=');
});
};
common.scopejQuery = function scopejQuery(str) {
return str
.replace(/\$/gi, 'j$')
.replace(/document/gi, 'jdocument')
.replace(/jQuery/gi, 'jjQuery');
};
common.unScopeJQuery = function unScopeJQuery(str) {
return str
.replace(/j\$/gi, '$')
.replace(/jdocument/gi, 'document')
.replace(/jjQuery/gi, 'jQuery');
};
const commentRegex = /(\/\*[^(\*\/)]*\*\/)|([ \n]\/\/[^\n]*)/g;
common.removeComments = function removeComments(str) {
return str.replace(commentRegex, '');
};
const logRegex = /(console\.[\w]+\s*\(.*\;)/g;
common.removeLogs = function removeLogs(str) {
return str.replace(logRegex, '');
};
common.reassembleTest = function reassembleTest(code = '', { line, text }) {
var regexp = new RegExp('//' + line + common.salt);
return code.replace(regexp, text);
};
common.getScriptContent$ = function getScriptContent$(script) {
return Observable.create(function(observer) {
const jqXHR = $.get(script, null, null, 'text')
.success(data => {
observer.onNext(data);
observer.onCompleted();
})
.fail(e => observer.onError(e))
.always(() => observer.onCompleted());
return new Disposable(() => {
jqXHR.abort();
});
});
};
const openScript = /\<\s?script\s?\>/gi;
const closingScript = /\<\s?\/\s?script\s?\>/gi;
// detects if there is JavaScript in the first script tag
common.hasJs = function hasJs(code) {
return !!common.getJsFromHtml(code);
};
// grabs the content from the first script tag in the code
common.getJsFromHtml = function getJsFromHtml(code) {
// grab user javaScript
return (code.split(openScript)[1] || '').split(closingScript)[0] || '';
};
return common;
})(window);
================================================
FILE: client/commonFramework/output-display.js
================================================
window.common = (function(global) {
const {
CodeMirror,
document: doc,
common = { init: [] }
} = global;
const { challengeTypes, challengeType = '0' } = common;
if (
!CodeMirror ||
challengeType !== challengeTypes.JS &&
challengeType !== challengeTypes.BONFIRE
) {
common.updateOutputDisplay = () => {};
common.appendToOutputDisplay = () => {};
return common;
}
var codeOutput = CodeMirror.fromTextArea(
doc.getElementById('codeOutput'),
{
lineNumbers: false,
mode: 'text',
theme: 'monokai',
readOnly: 'nocursor',
lineWrapping: true
}
);
codeOutput.setValue(`/**
* Your output will go here.
* Any console.log() -type
* statements will appear in
* your browser\'s DevTools
* JavaScript console.
*/`);
codeOutput.setSize('100%', '100%');
common.updateOutputDisplay = function updateOutputDisplay(str = '') {
if (typeof str !== 'string') {
str = JSON.stringify(str);
}
codeOutput.setValue(str);
return str;
};
common.appendToOutputDisplay = function appendToOutputDisplay(str = '') {
codeOutput.setValue(codeOutput.getValue() + str);
return str;
};
return common;
}(window));
================================================
FILE: client/commonFramework/phone-scroll-lock.js
================================================
window.common = (function({ common = { init: [] }}) {
common.lockTop = function lockTop() {
var magiVal;
if ($(window).width() >= 990) {
if ($('.editorScrollDiv').html()) {
magiVal = $(window).height() - $('.navbar').height();
if (magiVal < 0) {
magiVal = 0;
}
$('.editorScrollDiv').css('height', magiVal - 50 + 'px');
}
magiVal = $(window).height() - $('.navbar').height();
if (magiVal < 0) {
magiVal = 0;
}
$('.scroll-locker')
.css('min-height', $('.editorScrollDiv').height())
.css('height', magiVal - 50);
} else {
$('.editorScrollDiv').css('max-height', 500 + 'px');
$('.scroll-locker')
.css('position', 'inherit')
.css('top', 'inherit')
.css('width', '100%')
.css('max-height', '100%');
}
};
common.init.push(function($) {
// fakeiphone positioning hotfix
if (
$('.iphone-position').html() ||
$('.iphone').html()
) {
var startIphonePosition = parseInt(
$('.iphone-position')
.css('top')
.replace('px', ''),
10
);
var startIphone = parseInt(
$('.iphone')
.css('top')
.replace('px', ''),
10
);
$(window).on('scroll', function() {
var courseHeight = $('.courseware-height').height();
var courseTop = $('.courseware-height').offset().top;
var windowScrollTop = $(window).scrollTop();
var phoneHeight = $('.iphone-position').height();
if (courseHeight + courseTop - windowScrollTop - phoneHeight <= 0) {
$('.iphone-position').css(
'top',
startIphonePosition +
courseHeight +
courseTop -
windowScrollTop -
phoneHeight
);
$('.iphone').css(
'top',
startIphonePosition +
courseHeight +
courseTop -
windowScrollTop -
phoneHeight +
120
);
} else {
$('.iphone-position').css('top', startIphonePosition);
$('.iphone').css('top', startIphone);
}
});
}
if ($('.scroll-locker').html()) {
if ($('.scroll-locker').html()) {
common.lockTop();
$(window).on('resize', function() {
common.lockTop();
});
$(window).on('scroll', function() {
common.lockTop();
});
}
var execInProgress = false;
// why is this not $???
document
.getElementById('scroll-locker')
.addEventListener(
'previewUpdateSpy',
function(e) {
if (execInProgress) {
return null;
}
execInProgress = true;
return setTimeout(function() {
if (
$($('.scroll-locker').children()[0]).height() - 800 > e.detail
) {
$('.scroll-locker').scrollTop(e.detail);
} else {
var scrollTop = $($('.scroll-locker').children()[0]).height();
$('.scroll-locker').animate({ scrollTop: scrollTop }, 175);
}
execInProgress = false;
}, 750);
},
false
);
}
});
return common;
}(window));
================================================
FILE: client/commonFramework/report-issue.js
================================================
window.common = (function({ common = { init: [] } }) {
common.init.push(function($) {
$('#report-issue').on('click', function() {
var textMessage = [
'Challenge [',
(common.challengeName || window.location.pathname),
'](',
window.location.href,
') has an issue.\n',
'User Agent is: <code>',
navigator.userAgent,
'</code>.\n',
'Please describe how to reproduce this issue, and include ',
'links to screenshots if possible.\n\n'
].join('');
if (
common.editor &&
typeof common.editor.getValue === 'function' &&
common.editor.getValue().trim()
) {
var type;
switch (common.challengeType) {
case common.challengeTypes.HTML:
type = 'html';
break;
case common.challengeTypes.JS:
case common.challengeTypes.BONFIRE:
type = 'javascript';
break;
default:
type = '';
}
textMessage += [
'My code:\n```',
type,
'\n',
common.editor.getValue(),
'\n```\n\n'
].join('');
}
textMessage = encodeURIComponent(textMessage);
$('#issue-modal').modal('hide');
window.open(
'https://github.com/freecodecampchina/freecodecamp.cn/issues/new?&body=' +
textMessage,
'_blank'
);
});
});
return common;
}(window));
================================================
FILE: client/commonFramework/run-tests-stream.js
================================================
window.common = (function(global) {
const {
Rx: { Observable },
chai,
common = { init: [] }
} = global;
common.runTests$ = function runTests$({
code,
originalCode,
userTests,
...rest
}) {
return Observable.from(userTests)
.map(function(test) {
/* eslint-disable no-unused-vars */
const assert = chai.assert;
const editor = { getValue() { return originalCode; }};
/* eslint-enable no-unused-vars */
try {
if (test) {
/* eslint-disable no-eval */
eval(common.reassembleTest(code, test));
/* eslint-enable no-eval */
}
} catch (e) {
test.err = e.message;
}
return test;
})
.toArray()
.map(tests => ({ ...rest, tests }));
};
return common;
}(window));
================================================
FILE: client/commonFramework/show-completion.js
================================================
window.common = (function(global) {
const {
$,
moment,
ga = (() => {}),
common = { init: [] }
} = global;
function submitChallengeHandler(e) {
e.preventDefault();
var solution = common.editor.getValue();
$('#submit-challenge')
.attr('disabled', 'true')
.removeClass('btn-primary')
.addClass('btn-warning disabled');
var $checkmarkContainer = $('#checkmark-container');
$checkmarkContainer.css({ height: $checkmarkContainer.innerHeight() });
$('#challenge-checkmark')
.addClass('zoomOutUp')
// .removeClass('zoomInDown')
.delay(1000)
.queue(function(next) {
$(this).replaceWith(
'<div id="challenge-spinner" ' +
'class="animated zoomInUp inner-circles-loader">' +
'submitting...</div>'
);
next();
});
let timezone = 'UTC';
try {
timezone = moment.tz.guess();
} catch (err) {
err.message = `
known bug, see: https://github.com/moment/moment-timezone/issues/294:
${err.message}
`;
console.error(err);
}
const data = JSON.stringify({
id: common.challengeId,
name: common.challengeName,
challengeType: +common.challengeType,
solution,
timezone
});
$.ajax({
url: '/completed-challenge/',
type: 'POST',
data,
contentType: 'application/json',
dataType: 'json'
})
.success(function(res) {
if (res) {
window.location =
'/challenges/next-challenge?id=' + common.challengeId;
}
})
.fail(function() {
window.location.replace(window.location.href);
});
}
common.showCompletion = function showCompletion() {
ga(
'send',
'event',
'Challenge',
'solved',
common.gaName,
true
);
$('#complete-courseware-dialog').modal('show');
$('#complete-courseware-dialog .modal-header').click();
$('#submit-challenge').off('click');
$('#submit-challenge').on('click', submitChallengeHandler);
};
return common;
}(window));
================================================
FILE: client/commonFramework/step-challenge.js
================================================
window.common = (function({ $, common = { init: [] }}) {
const stepClass = '.challenge-step';
const prevBtnClass = '.challenge-step-btn-prev';
const nextBtnClass = '.challenge-step-btn-next';
const actionBtnClass = '.challenge-step-btn-action';
const finishBtnClass = '.challenge-step-btn-finish';
const submitBtnId = '#challenge-step-btn-submit';
const submitModalId = '#challenge-step-modal';
function getPreviousStep($challengeSteps) {
var $prevStep = false;
var prevStepIndex = 0;
$challengeSteps.each(function(index) {
var $step = $(this);
if (!$step.hasClass('hidden')) {
prevStepIndex = index - 1;
}
});
$prevStep = $challengeSteps[prevStepIndex];
return $prevStep;
}
function getNextStep($challengeSteps) {
var length = $challengeSteps.length;
var $nextStep = false;
var nextStepIndex = 0;
$challengeSteps.each(function(index) {
var $step = $(this);
if (
!$step.hasClass('hidden') &&
index + 1 !== length
) {
nextStepIndex = index + 1;
}
});
$nextStep = $challengeSteps[nextStepIndex];
return $nextStep;
}
function handlePrevStepClick(e) {
e.preventDefault();
var prevStep = getPreviousStep($(stepClass));
$(this)
.parent()
.parent()
.removeClass('slideInLeft slideInRight')
.addClass('animated fadeOutRight fast-animation')
.delay(250)
.queue(function(prev) {
$(this).addClass('hidden');
if (prevStep) {
$(prevStep)
.removeClass('hidden')
.removeClass('fadeOutLeft fadeOutRight')
.addClass('animated slideInLeft fast-animation')
.delay(500)
.queue(function(prev) {
prev();
});
}
prev();
});
}
function handleNextStepClick(e) {
e.preventDefault();
var nextStep = getNextStep($(stepClass));
$(this)
.parent()
.parent()
.removeClass('slideInRight slideInLeft')
.addClass('animated fadeOutLeft fast-animation')
.delay(250)
.queue(function(next) {
$(this).addClass('hidden');
if (nextStep) {
$(nextStep)
.removeClass('hidden')
.removeClass('fadeOutRight fadeOutLeft')
.addClass('animated slideInRight fast-animation')
.delay(500)
.queue(function(next) {
next();
});
}
next();
});
}
function handleActionClick(e) {
var props = common.challengeSeed[0] || { stepIndex: [] };
var $el = $(this);
var index = +$el.attr('id');
var propIndex = props.stepIndex.indexOf(index);
if (propIndex === -1) {
return $el.parent()
.find('.disabled')
.removeClass('disabled');
}
// an API action
// prevent link from opening
e.preventDefault();
var prop = props.properties[propIndex];
var api = props.apis[propIndex];
if (common[prop]) {
return $el.parent()
.find('.disabled')
.removeClass('disabled');
}
return $.post(api)
.done(function(data) {
// assume a boolean indicates passing
if (typeof data === 'boolean') {
return $el.parent()
.find('.disabled')
.removeClass('disabled');
}
// assume api returns string when fails
return $el.parent()
.find('.disabled')
.replaceWith('<p>' + data + '</p>');
})
.fail(function() {
console.log('failed');
});
}
function handleFinishClick(e) {
e.preventDefault();
$(submitModalId).modal('show');
$(submitModalId + '.modal-header').click();
$(submitBtnId).click(handleSubmitClick);
}
function handleSubmitClick(e) {
e.preventDefault();
$('#submit-challenge')
.attr('disabled', 'true')
.removeClass('btn-primary')
.addClass('btn-warning disabled');
var $checkmarkContainer = $('#checkmark-container');
$checkmarkContainer.css({ height: $checkmarkContainer.innerHeight() });
$('#challenge-checkmark')
.addClass('zoomOutUp')
.delay(1000)
.queue(function(next) {
$(this).replaceWith(
'<div id="challenge-spinner" ' +
'class="animated zoomInUp inner-circles-loader">' +
'submitting...</div>'
);
next();
});
$.ajax({
url: '/completed-challenge/',
type: 'POST',
data: JSON.stringify({
id: common.challengeId,
name: common.challengeName,
challengeType: +common.challengeType
}),
contentType: 'application/json',
dataType: 'json'
})
.success(function(res) {
if (res) {
window.location =
'/challenges/next-challenge?id=' + common.challengeId;
}
})
.fail(function() {
window.location.replace(window.location.href);
});
}
common.init.push(function($) {
if (common.challengeType !== '7') {
return null;
}
$(prevBtnClass).click(handlePrevStepClick);
$(nextBtnClass).click(handleNextStepClick);
$(actionBtnClass).click(handleActionClick);
$(finishBtnClass).click(handleFinishClick);
return null;
});
return common;
}(window));
================================================
FILE: client/commonFramework/update-preview.js
================================================
window.common = (function(global) {
const {
Rx: { BehaviorSubject, Observable },
common = { init: [] }
} = global;
// the first script tag here is to proxy jQuery
// We use the same jQuery on the main window but we change the
// context to that of the iframe.
var libraryIncludes = `
<script>
window.loopProtect = parent.loopProtect;
window.__err = null;
window.loopProtect.hit = function(line) {
window.__err = new Error(
'Potential infinite loop at line ' +
line +
'. To disable loop protection, write:' +
' \\n\\/\\/ noprotect\\nas the first' +
' line. Beware that if you do have an infinite loop in your code' +
' this will crash your browser.'
);
};
</script>
<link
rel='stylesheet'
href='//cdn.bootcss.com/animate.css/3.2.0/animate.min.css'
/>
<link
rel='stylesheet'
href='//cdn.bootcss.com/bootstrap/3.3.1/css/bootstrap.min.css'
/>
<link
rel='stylesheet'
href='//cdn.bootcss.com/font-awesome/4.2.0/css/font-awesome.min.css'
/>
<style>
body { padding: 0px 3px 0px 3px; }
</style>
`;
const codeDisabledError = `
<script>
window.__err = new Error('code has been disabled');
</script>
`;
const iFrameScript$ =
common.getScriptContent$('/js/iFrameScripts.js').shareReplay();
const jQueryScript$ = common.getScriptContent$(
'/bower_components/jquery/dist/jquery.js'
).shareReplay();
// behavior subject allways remembers the last value
// we use this to determine if runPreviewTest$ is defined
// and prime it with false
common.previewReady$ = new BehaviorSubject(false);
// These should be set up in the preview window
// if this error is seen it is because the function tried to run
// before the iframe has completely loaded
common.runPreviewTests$ =
common.checkPreview$ =
() => Observable.throw(new Error('Preview not fully loaded'));
common.updatePreview$ = function updatePreview$(code = '') {
const preview = common.getIframe('preview');
return Observable.combineLatest(
iFrameScript$,
jQueryScript$,
(iframe, jQuery) => ({
iframeScript: `<script>${iframe}</script>`,
jQuery: `<script>${jQuery}</script>`
})
)
.first()
.flatMap(({ iframeScript, jQuery }) => {
// we make sure to override the last value in the
// subject to false here.
common.previewReady$.onNext(false);
preview.open();
preview.write(
libraryIncludes +
jQuery +
(common.shouldRun() ? code : codeDisabledError) +
'<!-- -->' +
iframeScript
);
preview.close();
// now we filter false values and wait for the first true
return common.previewReady$
.filter(ready => ready)
.first()
// the delay here is to give code within the iframe
// control to run
.delay(400);
})
.map(() => code);
};
return common;
}(window));
================================================
FILE: client/es6-shims.js
================================================
require('object.assign').shim();
require('es6-map/implement');
================================================
FILE: client/iFrameScripts.js
================================================
/* eslint-disable no-undef, no-unused-vars, no-native-reassign */
// the $ on the iframe window object is the same
// as the one used on the main site, but
// uses the iframe document as the context
window.$(document).ready(function() {
var _ = parent._;
var Rx = parent.Rx;
var chai = parent.chai;
var assert = chai.assert;
var tests = parent.tests;
var common = parent.common;
common.getJsOutput = function evalJs(code = '') {
if (window.__err || !common.shouldRun()) {
return window.__err || 'code disabled';
}
let output;
try {
/* eslint-disable no-eval */
output = eval(code);
/* eslint-enable no-eval */
} catch (e) {
window.__err = e;
}
return output;
};
common.runPreviewTests$ =
function runPreviewTests$({
tests = [],
originalCode,
...rest
}) {
const code = originalCode;
const editor = { getValue() { return originalCode; } };
if (window.__err) {
return Rx.Observable.throw(window.__err);
}
// Iterate throught the test one at a time
// on new stacks
return Rx.Observable.from(tests, null, null, Rx.Scheduler.default)
// add delay here for firefox to catch up
.delay(100)
.map(test => {
const userTest = {};
try {
/* eslint-disable no-eval */
eval(test);
/* eslint-enable no-eval */
} catch (e) {
userTest.err = e.message.split(':').shift();
} finally {
if (!test.match(/message: /g)) {
// assumes test does not contain arrays
// This is a patch until all test fall into this pattern
userTest.text = test
.split(',')
.pop();
userTest.text = 'message: ' + userTest.text + '\');';
} else {
userTest.text = test;
}
}
return userTest;
})
// gather tests back into an array
.toArray()
.map(tests => ({ ...rest, tests, originalCode }));
};
// used when updating preview without running tests
common.checkPreview$ = function checkPreview$(args) {
if (window.__err) {
return Rx.Observable.throw(window.__err);
}
return Rx.Observable.just(args);
};
// now that the runPreviewTest$ is defined
// we set the subject to true
// this will let the updatePreview
// script now that we are ready.
common.previewReady$.onNext(true);
});
================================================
FILE: client/index.js
================================================
import './es6-shims';
import Rx from 'rx';
import React from 'react';
import debug from 'debug';
import { Router } from 'react-router';
import { routeReducer as routing, syncHistory } from 'react-router-redux';
import { createHistory } from 'history';
import app$ from '../common/app';
import provideStore from '../common/app/provide-store';
// client specific sagas
import sagas from './sagas';
// render to observable
import render from '../common/app/utils/render';
const log = debug('fcc:client');
const DOMContainer = document.getElementById('fcc');
const initialState = window.__fcc__.data;
const serviceOptions = { xhrPath: '/services' };
Rx.config.longStackSupport = !!debug.enabled;
const history = createHistory();
const appLocation = history.createLocation(
location.pathname + location.search
);
const routingMiddleware = syncHistory(history);
const devTools = window.devToolsExtension ? window.devToolsExtension() : f => f;
const shouldRouterListenForReplays = !!window.devToolsExtension;
const clientSagaOptions = { doc: document };
// returns an observable
app$({
location: appLocation,
history,
serviceOptions,
initialState,
middlewares: [
routingMiddleware,
...sagas.map(saga => saga(clientSagaOptions))
],
reducers: { routing },
enhancers: [ devTools ]
})
.flatMap(({ props, store }) => {
// because of weirdness in react-routers match function
// we replace the wrapped returned in props with the first one
// we passed in. This might be fixed in react-router 2.0
props.history = history;
if (shouldRouterListenForReplays && store) {
log('routing middleware listening for replays');
routingMiddleware.listenForReplays(store);
}
log('rendering');
return render(
provideStore(React.createElement(Router, props), store),
DOMContainer
);
})
.subscribe(
() => debug('react rendered'),
err => { throw err; },
() => debug('react closed subscription')
);
================================================
FILE: client/less/challenge.less
================================================
.challenge-step-description {
font-size: 1.5em;
}
.challenge-step-counter {
font-size: 20px;
line-height: 44px;
}
.challenge-instructions-title {
margin-top: 0;
i {
margin-left: 5px;
line-height: 20px;
}
}
.challenge-instructions {
margin-bottom: 5px;
h4 {
margin-bottom: 0;
}
blockquote {
font-size: 90%;
font-family: @font-family-monospace;
color: @code-color;
background-color: #fffbe5;
border-radius: @border-radius-base;
border: 1px solid @pre-border-color;
white-space: pre;
padding: 5px 10px;
margin-bottom: 10px;
margin-top: -10px;
overflow: auto;
}
dfn {
font-family: @font-family-monospace;
color: @code-color;
background-color: @code-bg;
border-radius: @border-radius-base;
}
& a, #MDN-links a {
color: #31708f;
}
& a::after, #MDN-links a::after {
font-size: 70%;
font-family: FontAwesome;
content: " \f08e";
}
ol {
font-size: 16px;
}
}
#testSuite {
margin-top: 10px;
> div >.row {
margin: 0!important;
}
}
.test-output {
font-size: 15px;
font-family: "Ubuntu Mono";
margin-top: 8px;
line-height:20px;
}
.grayed-out-test-output {
color: @gray-light;
}
.big-error-icon {
font-size: 30px;
color: @brand-danger;
top:50%;
}
.big-success-icon {
font-size: 30px;
color: @brand-primary;
}
iframe.iphone {
border: none;
@media(min-width: 992px) {
width: 280px;
height: 500px;
position: absolute;
top: 70px;
right: 35px;
overflow-y: scroll;
}
@media(max-width: 991px) {
width: 100%;
border-radius: 5px;
overflow-y: visible;
height: 500px;
}
@media (min-width: 1200px) and (max-width: 1250px){
right: 22px;
}
}
// To adjust right margin, negative values bring the image closer to the edge of the screen
.iphone-position {
position: absolute;
top: -50px;
z-index: -1;
right: -195px;
@media (min-width: 1200px) and (max-width: 1250px){
right: -207px;
}
}
================================================
FILE: client/less/chat.less
================================================
.chat-embed-main-title {
display: flex;
flex-grow: 1;
padding-left: 31px;
padding-top: 7px;
}
.gitter-chat-embed {
z-index: 100;
position: fixed;
top: 0;
left: 60%;
bottom: 0;
right: 0;
display: flex;
flex-direction: row;
transition: transform 0.3s cubic-bezier(0.16, 0.22, 0.22, 1.7);
}
.gitter-chat-embed.is-collapsed:not(.is-loading) {
transform: translateX(110%);
}
================================================
FILE: client/less/jobs.less
================================================
.jobs-list-highlight {
background-color: #ffc
}
a.jobs-list-highlight:hover {
background-color: #ffc
}
.jobs-list {
cursor: pointer;
cursor: hand;
}
.jobs-checkbox-spacer input[type="checkbox"] {
margin-left: -23px
}
================================================
FILE: client/less/lib/animate.min.less
================================================
@charset "UTF-8";/*!
Animate.css - http://daneden.me/animate
Licensed under the MIT license - http://opensource.org/licenses/MIT
Copyright (c) 2014 Daniel Eden
*/.animated{-webkit-animation-duration:1s;animation-duration:1s;-webkit-animation-fill-mode:both;animation-fill-mode:both}.animated.infinite{-webkit-animation-iteration-count:infinite;animation-iteration-count:infinite}.animated.hinge{-webkit-animation-duration:2s;animation-duration:2s}@-webkit-keyframes bounce{0%,100%,20%,53%,80%{-webkit-transition-timing-function:cubic-bezier(0.215,.61,.355,1);transition-timing-function:cubic-bezier(0.215,.61,.355,1);-webkit-transform:translate3d(0,0,0);transform:translate3d(0,0,0)}40%,43%{-webkit-transition-timing-function:cubic-bezier(0.755,.050,.855,.060);transition-timing-function:cubic-bezier(0.755,.050,.855,.060);-webkit-transform:translate3d(0,-30px,0);transform:translate3d(0,-30px,0)}70%{-webkit-transition-timing-function:cubic-bezier(0.755,.050,.855,.060);transition-timing-function:cubic-bezier(0.755,.050,.855,.060);-webkit-transform:translate3d(0,-15px,0);transform:translate3d(0,-15px,0)}90%{-webkit-transform:translate3d(0,-4px,0);transform:translate3d(0,-4px,0)}}@keyframes bounce{0%,100%,20%,53%,80%{-webkit-transition-timing-function:cubic-bezier(0.215,.61,.355,1);transition-timing-function:cubic-bezier(0.215,.61,.355,1);-webkit-transform:translate3d(0,0,0);transform:translate3d(0,0,0)}40%,43%{-webkit-transition-timing-function:cubic-bezier(0.755,.050,.855,.060);transition-timing-function:cubic-bezier(0.755,.050,.855,.060);-webkit-transform:translate3d(0,-30px,0);transform:translate3d(0,-30px,0)}70%{-webkit-transition-timing-function:cubic-bezier(0.755,.050,.855,.060);transition-timing-function:cubic-bezier(0.755,.050,.855,.060);-webkit-transform:translate3d(0,-15px,0);transform:translate3d(0,-15px,0)}90%{-webkit-transform:translate3d(0,-4px,0);transform:translate3d(0,-4px,0)}}.bounce{-webkit-animation-name:bounce;animation-name:bounce;-webkit-transform-origin:center bottom;-ms-transform-origin:center bottom;transform-origin:center bottom}@-webkit-keyframes flash{0%,100%,50%{opacity:1}25%,75%{opacity:0}}@keyframes flash{0%,100%,50%{opacity:1}25%,75%{opacity:0}}.flash{-webkit-animation-name:flash;animation-name:flash}@-webkit-keyframes pulse{0%{-webkit-transform:scale3d(1,1,1);transform:scale3d(1,1,1)}50%{-webkit-transform:scale3d(1.05,1.05,1.05);transform:scale3d(1.05,1.05,1.05)}100%{-webkit-transform:scale3d(1,1,1);transform:scale3d(1,1,1)}}@keyframes pulse{0%{-webkit-transform:scale3d(1,1,1);transform:scale3d(1,1,1)}50%{-webkit-transform:scale3d(1.05,1.05,1.05);transform:scale3d(1.05,1.05,1.05)}100%{-webkit-transform:scale3d(1,1,1);transform:scale3d(1,1,1)}}.pulse{-webkit-animation-name:pulse;animation-name:pulse}@-webkit-keyframes rubberBand{0%{-webkit-transform:scale3d(1,1,1);transform:scale3d(1,1,1)}30%{-webkit-transform:scale3d(1.25,.75,1);transform:scale3d(1.25,.75,1)}40%{-webkit-transform:scale3d(0.75,1.25,1);transform:scale3d(0.75,1.25,1)}50%{-webkit-transform:scale3d(1.15,.85,1);transform:scale3d(1.15,.85,1)}65%{-webkit-transform:scale3d(.95,1.05,1);transform:scale3d(.95,1.05,1)}75%{-webkit-transform:scale3d(1.05,.95,1);transform:scale3d(1.05,.95,1)}100%{-webkit-transform:scale3d(1,1,1);transform:scale3d(1,1,1)}}@keyframes rubberBand{0%{-webkit-transform:scale3d(1,1,1);transform:scale3d(1,1,1)}30%{-webkit-transform:scale3d(1.25,.75,1);transform:scale3d(1.25,.75,1)}40%{-webkit-transform:scale3d(0.75,1.25,1);transform:scale3d(0.75,1.25,1)}50%{-webkit-transform:scale3d(1.15,.85,1);transform:scale3d(1.15,.85,1)}65%{-webkit-transform:scale3d(.95,1.05,1);transform:scale3d(.95,1.05,1)}75%{-webkit-transform:scale3d(1.05,.95,1);transform:scale3d(1.05,.95,1)}100%{-webkit-transform:scale3d(1,1,1);transform:scale3d(1,1,1)}}.rubberBand{-webkit-animation-name:rubberBand;animation-name:rubberBand}@-webkit-keyframes shake{0%,100%{-webkit-transform:translate3d(0,0,0);transform:translate3d(0,0,0)}10%,30%,50%,70%,90%{-webkit-transform:translate3d(-10px,0,0);transform:translate3d(-10px,0,0)}20%,40%,60%,80%{-webkit-transform:translate3d(10px,0,0);transform:translate3d(10px,0,0)}}@keyframes shake{0%,100%{-webkit-transform:translate3d(0,0,0);transform:translate3d(0,0,0)}10%,30%,50%,70%,90%{-webkit-transform:translate3d(-10px,0,0);transform:translate3d(-10px,0,0)}20%,40%,60%,80%{-webkit-transform:translate3d(10px,0,0);transform:translate3d(10px,0,0)}}.shake{-webkit-animation-name:shake;animation-name:shake}@-webkit-keyframes swing{20%{-webkit-transform:rotate3d(0,0,1,15deg);transform:rotate3d(0,0,1,15deg)}40%{-webkit-transform:rotate3d(0,0,1,-10deg);transform:rotate3d(0,0,1,-10deg)}60%{-webkit-transform:rotate3d(0,0,1,5deg);transform:rotate3d(0,0,1,5deg)}80%{-webkit-transform:rotate3d(0,0,1,-5deg);transform:rotate3d(0,0,1,-5deg)}100%{-webkit-transform:rotate3d(0,0,1,0deg);transform:rotate3d(0,0,1,0deg)}}@keyframes swing{20%{-webkit-transform:rotate3d(0,0,1,15deg);transform:rotate3d(0,0,1,15deg)}40%{-webkit-transform:rotate3d(0,0,1,-10deg);transform:rotate3d(0,0,1,-10deg)}60%{-webkit-transform:rotate3d(0,0,1,5deg);transform:rotate3d(0,0,1,5deg)}80%{-webkit-transform:rotate3d(0,0,1,-5deg);transform:rotate3d(0,0,1,-5deg)}100%{-webkit-transform:rotate3d(0,0,1,0deg);transform:rotate3d(0,0,1,0deg)}}.swing{-webkit-transform-origin:top center;-ms-transform-origin:top center;transform-origin:top center;-webkit-animation-name:swing;animation-name:swing}@-webkit-keyframes tada{0%{-webkit-transform:scale3d(1,1,1);transform:scale3d(1,1,1)}10%,20%{-webkit-transform:scale3d(.9,.9,.9) rotate3d(0,0,1,-3deg);transform:scale3d(.9,.9,.9) rotate3d(0,0,1,-3deg)}30%,50%,70%,90%{-webkit-transform:scale3d(1.1,1.1,1.1) rotate3d(0,0,1,3deg);transform:scale3d(1.1,1.1,1.1) rotate3d(0,0,1,3deg)}40%,60%,80%{-webkit-transform:scale3d(1.1,1.1,1.1) rotate3d(0,0,1,-3deg);transform:scale3d(1.1,1.1,1.1) rotate3d(0,0,1,-3deg)}100%{-webkit-transform:scale3d(1,1,1);transform:scale3d(1,1,1)}}@keyframes tada{0%{-webkit-transform:scale3d(1,1,1);transform:scale3d(1,1,1)}10%,20%{-webkit-transform:scale3d(.9,.9,.9) rotate3d(0,0,1,-3deg);transform:scale3d(.9,.9,.9) rotate3d(0,0,1,-3deg)}30%,50%,70%,90%{-webkit-transform:scale3d(1.1,1.1,1.1) rotate3d(0,0,1,3deg);transform:scale3d(1.1,1.1,1.1) rotate3d(0,0,1,3deg)}40%,60%,80%{-webkit-transform:scale3d(1.1,1.1,1.1) rotate3d(0,0,1,-3deg);transform:scale3d(1.1,1.1,1.1) rotate3d(0,0,1,-3deg)}100%{-webkit-transform:scale3d(1,1,1);transform:scale3d(1,1,1)}}.tada{-webkit-animation-name:tada;animation-name:tada}@-webkit-keyframes wobble{0%{-webkit-transform:none;transform:none}15%{-webkit-transform:translate3d(-25%,0,0) rotate3d(0,0,1,-5deg);transform:translate3d(-25%,0,0) rotate3d(0,0,1,-5deg)}30%{-webkit-transform:translate3d(20%,0,0) rotate3d(0,0,1,3deg);transform:translate3d(20%,0,0) rotate3d(0,0,1,3deg)}45%{-webkit-transform:translate3d(-15%,0,0) rotate3d(0,0,1,-3deg);transform:translate3d(-15%,0,0) rotate3d(0,0,1,-3deg)}60%{-webkit-transform:translate3d(10%,0,0) rotate3d(0,0,1,2deg);transform:translate3d(10%,0,0) rotate3d(0,0,1,2deg)}75%{-webkit-transform:translate3d(-5%,0,0) rotate3d(0,0,1,-1deg);transform:translate3d(-5%,0,0) rotate3d(0,0,1,-1deg)}100%{-webkit-transform:none;transform:none}}@keyframes wobble{0%{-webkit-transform:none;transform:none}15%{-webkit-transform:translate3d(-25%,0,0) rotate3d(0,0,1,-5deg);transform:translate3d(-25%,0,0) rotate3d(0,0,1,-5deg)}30%{-webkit-transform:translate3d(20%,0,0) rotate3d(0,0,1,3deg);transform:translate3d(20%,0,0) rotate3d(0,0,1,3deg)}45%{-webkit-transform:translate3d(-15%,0,0) rotate3d(0,0,1,-3deg);transform:translate3d(-15%,0,0) rotate3d(0,0,1,-3deg)}60%{-webkit-transform:translate3d(10%,0,0) rotate3d(0,0,1,2deg);transform:translate3d(10%,0,0) rotate3d(0,0,1,2deg)}75%{-webkit-transform:translate3d(-5%,0,0) rotate3d(0,0,1,-1deg);transform:translate3d(-5%,0,0) rotate3d(0,0,1,-1deg)}100%{-webkit-transform:none;transform:none}}.wobble{-webkit-animation-name:wobble;animation-name:wobble}@-webkit-keyframes bounceIn{0%,100%,20%,40%,60%,80%{-webkit-transition-timing-function:cubic-bezier(0.215,.61,.355,1);transition-timing-function:cubic-bezier(0.215,.61,.355,1)}0%{opacity:0;-webkit-transform:scale3d(.3,.3,.3);transform:scale3d(.3,.3,.3)}20%{-webkit-transform:scale3d(1.1,1.1,1.1);transform:scale3d(1.1,1.1,1.1)}40%{-webkit-transform:scale3d(.9,.9,.9);transform:scale3d(.9,.9,.9)}60%{opacity:1;-webkit-transform:scale3d(1.03,1.03,1.03);transform:scale3d(1.03,1.03,1.03)}80%{-webkit-transform:scale3d(.97,.97,.97);transform:scale3d(.97,.97,.97)}100%{opacity:1;-webkit-transform:scale3d(1,1,1);transform:scale3d(1,1,1)}}@keyframes bounceIn{0%,100%,20%,40%,60%,80%{-webkit-transition-timing-function:cubic-bezier(0.215,.61,.355,1);transition-timing-function:cubic-bezier(0.215,.61,.355,1)}0%{opacity:0;-webkit-transform:scale3d(.3,.3,.3);transform:scale3d(.3,.3,.3)}20%{-webkit-transform:scale3d(1.1,1.1,1.1);transform:scale3d(1.1,1.1,1.1)}40%{-webkit-transform:scale3d(.9,.9,.9);transform:scale3d(.9,.9,.9)}60%{opacity:1;-webkit-transform:scale3d(1.03,1.03,1.03);transform:scale3d(1.03,1.03,1.03)}80%{-webkit-transform:scale3d(.97,.97,.97);transform:scale3d(.97,.97,.97)}100%{opacity:1;-webkit-transform:scale3d(1,1,1);transform:scale3d(1,1,1)}}.bounceIn{-webkit-animation-name:bounceIn;animation-name:bounceIn;-webkit-animation-duration:.75s;animation-duration:.75s}@-webkit-keyframes bounceInDown{0%,100%,60%,75%,90%{-webkit-transition-timing-function:cubic-bezier(0.215,.61,.355,1);transition-timing-function:cubic-bezier(0.215,.61,.355,1)}0%{opacity:0;-webkit-transform:translate3d(0,-3000px,0);transform:translate3d(0,-3000px,0)}60%{opacity:1;-webkit-transform:translate3d(0,25px,0);transform:translate3d(0,25px,0)}75%{-webkit-transform:translate3d(0,-10px,0);transform:translate3d(0,-10px,0)}90%{-webkit-transform:translate3d(0,5px,0);transform:translate3d(0,5px,0)}100%{-webkit-transform:none;transform:none}}@keyframes bounceInDown{0%,100%,60%,75%,90%{-webkit-transition-timing-function:cubic-bezier(0.215,.61,.355,1);transition-timing-function:cubic-bezier(0.215,.61,.355,1)}0%{opacity:0;-webkit-transform:translate3d(0,-3000px,0);transform:translate3d(0,-3000px,0)}60%{opacity:1;-webkit-transform:translate3d(0,25px,0);transform:translate3d(0,25px,0)}75%{-webkit-transform:translate3d(0,-10px,0);transform:translate3d(0,-10px,0)}90%{-webkit-transform:translate3d(0,5px,0);transform:translate3d(0,5px,0)}100%{-webkit-transform:none;transform:none}}.bounceInDown{-webkit-animation-name:bounceInDown;animation-name:bounceInDown}@-webkit-keyframes bounceInLeft{0%,100%,60%,75%,90%{-webkit-transition-timing-function:cubic-bezier(0.215,.61,.355,1);transition-timing-function:cubic-bezier(0.215,.61,.355,1)}0%{opacity:0;-webkit-transform:translate3d(-3000px,0,0);transform:translate3d(-3000px,0,0)}60%{opacity:1;-webkit-transform:translate3d(25px,0,0);transform:translate3d(25px,0,0)}75%{-webkit-transform:translate3d(-10px,0,0);transform:translate3d(-10px,0,0)}90%{-webkit-transform:translate3d(5px,0,0);transform:translate3d(5px,0,0)}100%{-webkit-transform:none;transform:none}}@keyframes bounceInLeft{0%,100%,60%,75%,90%{-webkit-transition-timing-function:cubic-bezier(0.215,.61,.355,1);transition-timing-function:cubic-bezier(0.215,.61,.355,1)}0%{opacity:0;-webkit-transform:translate3d(-3000px,0,0);transform:translate3d(-3000px,0,0)}60%{opacity:1;-webkit-transform:translate3d(25px,0,0);transform:translate3d(25px,0,0)}75%{-webkit-transform:translate3d(-10px,0,0);transform:translate3d(-10px,0,0)}90%{-webkit-transform:translate3d(5px,0,0);transform:translate3d(5px,0,0)}100%{-webkit-transform:none;transform:none}}.bounceInLeft{-webkit-animation-name:bounceInLeft;animation-name:bounceInLeft}@-webkit-keyframes bounceInRight{0%,100%,60%,75%,90%{-webkit-transition-timing-function:cubic-bezier(0.215,.61,.355,1);transition-timing-function:cubic-bezier(0.215,.61,.355,1)}0%{opacity:0;-webkit-transform:translate3d(3000px,0,0);transform:translate3d(3000px,0,0)}60%{opacity:1;-webkit-transform:translate3d(-25px,0,0);transform:translate3d(-25px,0,0)}75%{-webkit-transform:translate3d(10px,0,0);transform:translate3d(10px,0,0)}90%{-webkit-transform:translate3d(-5px,0,0);transform:translate3d(-5px,0,0)}100%{-webkit-transform:none;transform:none}}@keyframes bounceInRight{0%,100%,60%,75%,90%{-webkit-transition-timing-function:cubic-bezier(0.215,.61,.355,1);transition-timing-function:cubic-bezier(0.215,.61,.355,1)}0%{opacity:0;-webkit-transform:translate3d(3000px,0,0);transform:translate3d(3000px,0,0)}60%{opacity:1;-webkit-transform:translate3d(-25px,0,0);transform:translate3d(-25px,0,0)}75%{-webkit-transform:translate3d(10px,0,0);transform:translate3d(10px,0,0)}90%{-webkit-transform:translate3d(-5px,0,0);transform:translate3d(-5px,0,0)}100%{-webkit-transform:none;transform:none}}.bounceInRight{-webkit-animation-name:bounceInRight;animation-name:bounceInRight}@-webkit-keyframes bounceInUp{0%,100%,60%,75%,90%{-webkit-transition-timing-function:cubic-bezier(0.215,.61,.355,1);transition-timing-function:cubic-bezier(0.215,.61,.355,1)}0%{opacity:0;-webkit-transform:translate3d(0,3000px,0);transform:translate3d(0,3000px,0)}60%{opacity:1;-webkit-transform:translate3d(0,-20px,0);transform:translate3d(0,-20px,0)}75%{-webkit-transform:translate3d(0,10px,0);transform:translate3d(0,10px,0)}90%{-webkit-transform:translate3d(0,-5px,0);transform:translate3d(0,-5px,0)}100%{-webkit-transform:translate3d(0,0,0);transform:translate3d(0,0,0)}}@keyframes bounceInUp{0%,100%,60%,75%,90%{-webkit-transition-timing-function:cubic-bezier(0.215,.61,.355,1);transition-timing-function:cubic-bezier(0.215,.61,.355,1)}0%{opacity:0;-webkit-transform:translate3d(0,3000px,0);transform:translate3d(0,3000px,0)}60%{opacity:1;-webkit-transform:translate3d(0,-20px,0);transform:translate3d(0,-20px,0)}75%{-webkit-transform:translate3d(0,10px,0);transform:translate3d(0,10px,0)}90%{-webkit-transform:translate3d(0,-5px,0);transform:translate3d(0,-5px,0)}100%{-webkit-transform:translate3d(0,0,0);transform:translate3d(0,0,0)}}.bounceInUp{-webkit-animation-name:bounceInUp;animation-name:bounceInUp}@-webkit-keyframes bounceOut{20%{-webkit-transform:scale3d(.9,.9,.9);transform:scale3d(.9,.9,.9)}50%,55%{opacity:1;-webkit-transform:scale3d(1.1,1.1,1.1);transform:scale3d(1.1,1.1,1.1)}100%{opacity:0;-webkit-transform:scale3d(.3,.3,.3);transform:scale3d(.3,.3,.3)}}@keyframes bounceOut{20%{-webkit-transform:scale3d(.9,.9,.9);transform:scale3d(.9,.9,.9)}50%,55%{opacity:1;-webkit-transform:scale3d(1.1,1.1,1.1);transform:scale3d(1.1,1.1,1.1)}100%{opacity:0;-webkit-transform:scale3d(.3,.3,.3);transform:scale3d(.3,.3,.3)}}.bounceOut{-webkit-animation-name:bounceOut;animation-name:bounceOut;-webkit-animation-duration:.75s;animation-duration:.75s}@-webkit-keyframes bounceOutDown{20%{-webkit-transform:translate3d(0,10px,0);transform:translate3d(0,10px,0)}40%,45%{opacity:1;-webkit-transform:translate3d(0,-20px,0);transform:translate3d(0,-20px,0)}100%{opacity:0;-webkit-transform:translate3d(0,2000px,0);transform:translate3d(0,2000px,0)}}@keyframes bounceOutDown{20%{-webkit-transform:translate3d(0,10px,0);transform:translate3d(0,10px,0)}40%,45%{opacity:1;-webkit-transform:translate3d(0,-20px,0);transform:translate3d(0,-20px,0)}100%{opacity:0;-webkit-transform:translate3d(0,2000px,0);transform:translate3d(0,2000px,0)}}.bounceOutDown{-webkit-animation-name:bounceOutDown;animation-name:bounceOutDown}@-webkit-keyframes bounceOutLeft{20%{opacity:1;-webkit-transform:translate3d(20px,0,0);transform:translate3d(20px,0,0)}100%{opacity:0;-webkit-transform:translate3d(-2000px,0,0);transform:translate3d(-2000px,0,0)}}@keyframes bounceOutLeft{20%{opacity:1;-webkit-transform:translate3d(20px,0,0);transform:translate3d(20px,0,0)}100%{opacity:0;-webkit-transform:translate3d(-2000px,0,0);transform:translate3d(-2000px,0,0)}}.bounceOutLeft{-webkit-animation-name:bounceOutLeft;animation-name:bounceOutLeft}@-webkit-keyframes bounceOutRight{20%{opacity:1;-webkit-transform:translate3d(-20px,0,0);transform:translate3d(-20px,0,0)}100%{opacity:0;-webkit-transform:translate3d(2000px,0,0);transform:translate3d(2000px,0,0)}}@keyframes bounceOutRight{20%{opacity:1;-webkit-transform:translate3d(-20px,0,0);transform:translate3d(-20px,0,0)}100%{opacity:0;-webkit-transform:translate3d(2000px,0,0);transform:translate3d(2000px,0,0)}}.bounceOutRight{-webkit-animation-name:bounceOutRight;animation-name:bounceOutRight}@-webkit-keyframes bounceOutUp{20%{-webkit-transform:translate3d(0,-10px,0);transform:translate3d(0,-10px,0)}40%,45%{opacity:1;-webkit-transform:translate3d(0,20px,0);transform:translate3d(0,20px,0)}100%{opacity:0;-webkit-transform:translate3d(0,-2000px,0);transform:translate3d(0,-2000px,0)}}@keyframes bounceOutUp{20%{-webkit-transform:translate3d(0,-10px,0);transform:translate3d(0,-10px,0)}40%,45%{opacity:1;-webkit-transform:translate3d(0,20px,0);transform:translate3d(0,20px,0)}100%{opacity:0;-webkit-transform:translate3d(0,-2000px,0);transform:translate3d(0,-2000px,0)}}.bounceOutUp{-webkit-animation-name:bounceOutUp;animation-name:bounceOutUp}@-webkit-keyframes fadeIn{0%{opacity:0}100%{opacity:1}}@keyframes fadeIn{0%{opacity:0}100%{opacity:1}}.fadeIn{-webkit-animation-name:fadeIn;animation-name:fadeIn}@-webkit-keyframes fadeInDown{0%{opacity:0;-webkit-transform:translate3d(0,-100%,0);transform:translate3d(0,-100%,0)}100%{opacity:1;-webkit-transform:none;transform:none}}@keyframes fadeInDown{0%{opacity:0;-webkit-transform:translate3d(0,-100%,0);transform:translate3d(0,-100%,0)}100%{opacity:1;-webkit-transform:none;transform:none}}.fadeInDown{-webkit-animation-name:fadeInDown;animation-name:fadeInDown}@-webkit-keyframes fadeInDownBig{0%{opacity:0;-webkit-transform:translate3d(0,-2000px,0);transform:translate3d(0,-2000px,0)}100%{opacity:1;-webkit-transform:none;transform:none}}@keyframes fadeInDownBig{0%{opacity:0;-webkit-transform:translate3d(0,-2000px,0);transform:translate3d(0,-2000px,0)}100%{opacity:1;-webkit-transform:none;transform:none}}.fadeInDownBig{-webkit-animation-name:fadeInDownBig;animation-name:fadeInDownBig}@-webkit-keyframes fadeInLeft{0%{opacity:0;-webkit-transform:translate3d(-100%,0,0);transform:translate3d(-100%,0,0)}100%{opacity:1;-webkit-transform:none;transform:none}}@keyframes fadeInLeft{0%{opacity:0;-webkit-transform:translate3d(-100%,0,0);transform:translate3d(-100%,0,0)}100%{opacity:1;-webkit-transform:none;transform:none}}.fadeInLeft{-webkit-animation-name:fadeInLeft;animation-name:fadeInLeft}@-webkit-keyframes fadeInLeftBig{0%{opacity:0;-webkit-transform:translate3d(-2000px,0,0);transform:translate3d(-2000px,0,0)}100%{opacity:1;-webkit-transform:none;transform:none}}@keyframes fadeInLeftBig{0%{opacity:0;-webkit-transform:translate3d(-2000px,0,0);transform:translate3d(-2000px,0,0)}100%{opacity:1;-webkit-transform:none;transform:none}}.fadeInLeftBig{-webkit-animation-name:fadeInLeftBig;animation-name:fadeInLeftBig}@-webkit-keyframes fadeInRight{0%{opacity:0;-webkit-transform:translate3d(100%,0,0);transform:translate3d(100%,0,0)}100%{opacity:1;-webkit-transform:none;transform:none}}@keyframes fadeInRight{0%{opacity:0;-webkit-transform:translate3d(100%,0,0);transform:translate3d(100%,0,0)}100%{opacity:1;-webkit-transform:none;transform:none}}.fadeInRight{-webkit-animation-name:fadeInRight;animation-name:fadeInRight}@-webkit-keyframes fadeInRightBig{0%{opacity:0;-webkit-transform:translate3d(2000px,0,0);transform:translate3d(2000px,0,0)}100%{opacity:1;-webkit-transform:none;transform:none}}@keyframes fadeInRightBig{0%{opacity:0;-webkit-transform:translate3d(2000px,0,0);transform:translate3d(2000px,0,0)}100%{opacity:1;-webkit-transform:none;transform:none}}.fadeInRightBig{-webkit-animation-name:fadeInRightBig;animation-name:fadeInRightBig}@-webkit-keyframes fadeInUp{0%{opacity:0;-webkit-transform:translate3d(0,100%,0);transform:translate3d(0,100%,0)}100%{opacity:1;-webkit-transform:none;transform:none}}@keyframes fadeInUp{0%{opacity:0;-webkit-transform:translate3d(0,100%,0);transform:translate3d(0,100%,0)}100%{opacity:1;-webkit-transform:none;transform:none}}.fadeInUp{-webkit-animation-name:fadeInUp;animation-name:fadeInUp}@-webkit-keyframes fadeInUpBig{0%{opacity:0;-webkit-transform:translate3d(0,2000px,0);transform:translate3d(0,2000px,0)}100%{opacity:1;-webkit-transform:none;transform:none}}@keyframes fadeInUpBig{0%{opacity:0;-webkit-transform:translate3d(0,2000px,0);transform:translate3d(0,2000px,0)}100%{opacity:1;-webkit-transform:none;transform:none}}.fadeInUpBig{-webkit-animation-name:fadeInUpBig;animation-name:fadeInUpBig}@-webkit-keyframes fadeOut{0%{opacity:1}100%{opacity:0}}@keyframes fadeOut{0%{opacity:1}100%{opacity:0}}.fadeOut{-webkit-animation-name:fadeOut;animation-name:fadeOut}@-webkit-keyframes fadeOutDown{0%{opacity:1}100%{opacity:0;-webkit-transform:translate3d(0,100%,0);transform:translate3d(0,100%,0)}}@keyframes fadeOutDown{0%{opacity:1}100%{opacity:0;-webkit-transform:translate3d(0,100%,0);transform:translate3d(0,100%,0)}}.fadeOutDown{-webkit-animation-name:fadeOutDown;animation-name:fadeOutDown}@-webkit-keyframes fadeOutDownBig{0%{opacity:1}100%{opacity:0;-webkit-transform:translate3d(0,2000px,0);transform:translate3d(0,2000px,0)}}@keyframes fadeOutDownBig{0%{opacity:1}100%{opacity:0;-webkit-transform:translate3d(0,2000px,0);transform:translate3d(0,2000px,0)}}.fadeOutDownBig{-webkit-animation-name:fadeOutDownBig;animation-name:fadeOutDownBig}@-webkit-keyframes fadeOutLeft{0%{opacity:1}100%{opacity:0;-webkit-transform:translate3d(-100%,0,0);transform:translate3d(-100%,0,0)}}@keyframes fadeOutLeft{0%{opacity:1}100%{opacity:0;-webkit-transform:translate3d(-100%,0,0);transform:translate3d(-100%,0,0)}}.fadeOutLeft{-webkit-animation-name:fadeOutLeft;animation-name:fadeOutLeft}@-webkit-keyframes fadeOutLeftBig{0%{opacity:1}100%{opacity:0;-webkit-transform:translate3d(-2000px,0,0);transform:translate3d(-2000px,0,0)}}@keyframes fadeOutLeftBig{0%{opacity:1}100%{opacity:0;-webkit-transform:translate3d(-2000px,0,0);transform:translate3d(-2000px,0,0)}}.fadeOutLeftBig{-webkit-animation-name:fadeOutLeftBig;animation-name:fadeOutLeftBig}@-webkit-keyframes fadeOutRight{0%{opacity:1}100%{opacity:0;-webkit-transform:translate3d(100%,0,0);transform:translate3d(100%,0,0)}}@keyframes fadeOutRight{0%{opacity:1}100%{opacity:0;-webkit-transform:translate3d(100%,0,0);transform:translate3d(100%,0,0)}}.fadeOutRight{-webkit-animation-name:fadeOutRight;animation-name:fadeOutRight}@-webkit-keyframes fadeOutRightBig{0%{opacity:1}100%{opacity:0;-webkit-transform:translate3d(2000px,0,0);transform:translate3d(2000px,0,0)}}@keyframes fadeOutRightBig{0%{opacity:1}100%{opacity:0;-webkit-transform:translate3d(2000px,0,0);transform:translate3d(2000px,0,0)}}.fadeOutRightBig{-webkit-animation-name:fadeOutRightBig;animation-name:fadeOutRightBig}@-webkit-keyframes fadeOutUp{0%{opacity:1}100%{opacity:0;-webkit-transform:translate3d(0,-100%,0);transform:translate3d(0,-100%,0)}}@keyframes fadeOutUp{0%{opacity:1}100%{opacity:0;-webkit-transform:translate3d(0,-100%,0);transform:translate3d(0,-100%,0)}}.fadeOutUp{-webkit-animation-name:fadeOutUp;animation-name:fadeOutUp}@-webkit-keyframes fadeOutUpBig{0%{opacity:1}100%{opacity:0;-webkit-transform:translate3d(0,-2000px,0);transform:translate3d(0,-2000px,0)}}@keyframes fadeOutUpBig{0%{opacity:1}100%{opacity:0;-webkit-transform:translate3d(0,-2000px,0);transform:translate3d(0,-2000px,0)}}.fadeOutUpBig{-webkit-animation-name:fadeOutUpBig;animation-name:fadeOutUpBig}@-webkit-keyframes flip{0%{-webkit-transform:perspective(400px) rotate3d(0,1,0,-360deg);transform:perspective(400px) rotate3d(0,1,0,-360deg);-webkit-animation-timing-function:ease-out;animation-timing-function:ease-out}40%{-webkit-transform:perspective(400px) translate3d(0,0,150px) rotate3d(0,1,0,-190deg);transform:perspective(400px) translate3d(0,0,150px) rotate3d(0,1,0,-190deg);-webkit-animation-timing-function:ease-out;animation-timing-function:ease-out}50%{-webkit-transform:perspective(400px) translate3d(0,0,150px) rotate3d(0,1,0,-170deg);transform:perspective(400px) translate3d(0,0,150px) rotate3d(0,1,0,-170deg);-webkit-animation-timing-function:ease-in;animation-timing-function:ease-in}80%{-webkit-transform:perspective(400px) scale3d(.95,.95,.95);transform:perspective(400px) scale3d(.95,.95,.95);-webkit-animation-timing-function:ease-in;animation-timing-function:ease-in}100%{-webkit-transform:perspective(400px);transform:perspective(400px);-webkit-animation-timing-function:ease-in;animation-timing-function:ease-in}}@keyframes flip{0%{-webkit-transform:perspective(400px) rotate3d(0,1,0,-360deg);transform:perspective(400px) rotate3d(0,1,0,-360deg);-webkit-animation-timing-function:ease-out;animation-timing-function:ease-out}40%{-webkit-transform:perspective(400px) translate3d(0,0,150px) rotate3d(0,1,0,-190deg);transform:perspective(400px) translate3d(0,0,150px) rotate3d(0,1,0,-190deg);-webkit-animation-timing-function:ease-out;animation-timing-function:ease-out}50%{-webkit-transform:perspective(400px) translate3d(0,0,150px) rotate3d(0,1,0,-170deg);transform:perspective(400px) translate3d(0,0,150px) rotate3d(0,1,0,-170deg);-webkit-animation-timing-function:ease-in;animation-timing-function:ease-in}80%{-webkit-transform:perspective(400px) scale3d(.95,.95,.95);transform:perspective(400px) scale3d(.95,.95,.95);-webkit-animation-timing-function:ease-in;animation-timing-function:ease-in}100%{-webkit-transform:perspective(400px);transform:perspective(400px);-webkit-animation-timing-function:ease-in;animation-timing-function:ease-in}}.animated.flip{-webkit-backface-visibility:visible;backface-visibility:visible;-webkit-animation-name:flip;animation-name:flip}@-webkit-keyframes flipInX{0%{-webkit-transform:perspective(400px) rotate3d(1,0,0,90deg);transform:perspective(400px) rotate3d(1,0,0,90deg);-webkit-transition-timing-function:ease-in;transition-timing-function:ease-in;opacity:0}40%{-webkit-transform:perspective(400px) rotate3d(1,0,0,-20deg);transform:perspective(400px) rotate3d(1,0,0,-20deg);-webkit-transition-timing-function:ease-in;transition-timing-function:ease-in}60%{-webkit-transform:perspective(400px) rotate3d(1,0,0,10deg);transform:perspective(400px) rotate3d(1,0,0,10deg);opacity:1}80%{-webkit-transform:perspective(400px) rotate3d(1,0,0,-5deg);transform:perspective(400px) rotate3d(1,0,0,-5deg)}100%{-webkit-transform:perspective(400px);transform:perspective(400px)}}@keyframes flipInX{0%{-webkit-transform:perspective(400px) rotate3d(1,0,0,90deg);transform:perspective(400px) rotate3d(1,0,0,90deg);-webkit-transition-timing-function:ease-in;transition-timing-function:ease-in;opacity:0}40%{-webkit-transform:perspective(400px) rotate3d(1,0,0,-20deg);transform:perspective(400px) rotate3d(1,0,0,-20deg);-webkit-transition-timing-function:ease-in;transition-timing-function:ease-in}60%{-webkit-transform:perspective(400px) rotate3d(1,0,0,10deg);transform:perspective(400px) rotate3d(1,0,0,10deg);opacity:1}80%{-webkit-transform:perspective(400px) rotate3d(1,0,0,-5deg);transform:perspective(400px) rotate3d(1,0,0,-5deg)}100%{-webkit-transform:perspective(400px);transform:perspective(400px)}}.flipInX{-webkit-backface-visibility:visible!important;backface-visibility:visible!important;-webkit-animation-name:flipInX;animation-name:flipInX}@-webkit-keyframes flipInY{0%{-webkit-transform:perspective(400px) rotate3d(0,1,0,90deg);transform:perspective(400px) rotate3d(0,1,0,90deg);-webkit-transition-timing-function:ease-in;transition-timing-function:ease-in;opacity:0}40%{-webkit-transform:perspective(400px) rotate3d(0,1,0,-20deg);transform:perspective(400px) rotate3d(0,1,0,-20deg);-webkit-transition-timing-function:ease-in;transition-timing-function:ease-in}60%{-webkit-transform:perspective(400px) rotate3d(0,1,0,10deg);transform:perspective(400px) rotate3d(0,1,0,10deg);opacity:1}80%{-webkit-transform:perspective(400px) rotate3d(0,1,0,-5deg);transform:perspective(400px) rotate3d(0,1,0,-5deg)}100%{-webkit-transform:perspective(400px);transform:perspective(400px)}}@keyframes flipInY{0%{-webkit-transform:perspective(400px) rotate3d(0,1,0,90deg);transform:perspective(400px) rotate3d(0,1,0,90deg);-webkit-transition-timing-function:ease-in;transition-timing-function:ease-in;opacity:0}40%{-webkit-transform:perspective(400px) rotate3d(0,1,0,-20deg);transform:perspective(400px) rotate3d(0,1,0,-20deg);-webkit-transition-timing-function:ease-in;transition-timing-function:ease-in}60%{-webkit-transform:perspective(400px) rotate3d(0,1,0,10deg);transform:perspective(400px) rotate3d(0,1,0,10deg);opacity:1}80%{-webkit-transform:perspective(400px) rotate3d(0,1,0,-5deg);transform:perspective(400px) rotate3d(0,1,0,-5deg)}100%{-webkit-transform:perspective(400px);transform:perspective(400px)}}.flipInY{-webkit-backface-visibility:visible!important;backface-visibility:visible!important;-webkit-animation-name:flipInY;animation-name:flipInY}@-webkit-keyframes flipOutX{0%{-webkit-transform:perspective(400px);transform:perspective(400px)}30%{-webkit-transform:perspective(400px) rotate3d(1,0,0,-20deg);transform:perspective(400px) rotate3d(1,0,0,-20deg);opacity:1}100%{-webkit-transform:perspective(400px) rotate3d(1,0,0,90deg);transform:perspective(400px) rotate3d(1,0,0,90deg);opacity:0}}@keyframes flipOutX{0%{-webkit-transform:perspective(400px);transform:perspective(400px)}30%{-webkit-transform:perspective(400px) rotate3d(1,0,0,-20deg);transform:perspective(400px) rotate3d(1,0,0,-20deg);opacity:1}100%{-webkit-transform:perspective(400px) rotate3d(1,0,0,90deg);transform:perspective(400px) rotate3d(1,0,0,90deg);opacity:0}}.flipOutX{-webkit-animation-name:flipOutX;animation-name:flipOutX;-webkit-animation-duration:.75s;animation-duration:.75s;-webkit-backface-visibility:visible!important;backface-visibility:visible!important}@-webkit-keyframes flipOutY{0%{-webkit-transform:perspective(400px);transform:perspective(400px)}30%{-webkit-transform:perspective(400px) rotate3d(0,1,0,-15deg);transform:perspective(400px) rotate3d(0,1,0,-15deg);opacity:1}100%{-webkit-transform:perspective(400px) rotate3d(0,1,0,90deg);transform:perspective(400px) rotate3d(0,1,0,90deg);opacity:0}}@keyframes flipOutY{0%{-webkit-transform:perspective(400px);transform:perspective(400px)}30%{-webkit-transform:perspective(400px) rotate3d(0,1,0,-15deg);transform:perspective(400px) rotate3d(0,1,0,-15deg);opacity:1}100%{-webkit-transform:perspective(400px) rotate3d(0,1,0,90deg);transform:perspective(400px) rotate3d(0,1,0,90deg);opacity:0}}.flipOutY{-webkit-backface-visibility:visible!important;backface-visibility:visible!important;-webkit-animation-name:flipOutY;animation-name:flipOutY;-webkit-animation-duration:.75s;animation-duration:.75s}@-webkit-keyframes lightSpeedIn{0%{-webkit-transform:translate3d(100%,0,0) skewX(-30deg);transform:translate3d(100%,0,0) skewX(-30deg);opacity:0}60%{-webkit-transform:skewX(20deg);transform:skewX(20deg);opacity:1}80%{-webkit-transform:skewX(-5deg);transform:skewX(-5deg);opacity:1}100%{-webkit-transform:none;transform:none;opacity:1}}@keyframes lightSpeedIn{0%{-webkit-transform:translate3d(100%,0,0) skewX(-30deg);transform:translate3d(100%,0,0) skewX(-30deg);opacity:0}60%{-webkit-transform:skewX(20deg);transform:skewX(20deg);opacity:1}80%{-webkit-transform:skewX(-5deg);transform:skewX(-5deg);opacity:1}100%{-webkit-transform:none;transform:none;opacity:1}}.lightSpeedIn{-webkit-animation-name:lightSpeedIn;animation-name:lightSpeedIn;-webkit-animation-timing-function:ease-out;animation-timing-function:ease-out}@-webkit-keyframes lightSpeedOut{0%{opacity:1}100%{-webkit-transform:translate3d(100%,0,0) skewX(30deg);transform:translate3d(100%,0,0) skewX(30deg);opacity:0}}@keyframes lightSpeedOut{0%{opacity:1}100%{-webkit-transform:translate3d(100%,0,0) skewX(30deg);transform:translate3d(100%,0,0) skewX(30deg);opacity:0}}.lightSpeedOut{-webkit-animation-name:lightSpeedOut;animation-name:lightSpeedOut;-webkit-animation-timing-function:ease-in;animation-timing-function:ease-in}@-webkit-keyframes rotateIn{0%{-webkit-transform-origin:center;transform-origin:center;-webkit-transform:rotate3d(0,0,1,-200deg);transform:rotate3d(0,0,1,-200deg);opacity:0}100%{-webkit-transform-origin:center;transform-origin:center;-webkit-transform:none;transform:none;opacity:1}}@keyframes rotateIn{0%{-webkit-transform-origin:center;transform-origin:center;-webkit-transform:rotate3d(0,0,1,-200deg);transform:rotate3d(0,0,1,-200deg);opacity:0}100%{-webkit-transform-origin:center;transform-origin:center;-webkit-transform:none;transform:none;opacity:1}}.rotateIn{-webkit-animation-name:rotateIn;animation-name:rotateIn}@-webkit-keyframes rotateInDownLeft{0%{-webkit-transform-origin:left bottom;transform-origin:left bottom;-webkit-transform:rotate3d(0,0,1,-45deg);transform:rotate3d(0,0,1,-45deg);opacity:0}100%{-webkit-transform-origin:left bottom;transform-origin:left bottom;-webkit-transform:none;transform:none;opacity:1}}@keyframes rotateInDownLeft{0%{-webkit-transform-origin:left bottom;transform-origin:left bottom;-webkit-transform:rotate3d(0,0,1,-45deg);transform:rotate3d(0,0,1,-45deg);opacity:0}100%{-webkit-transform-origin:left bottom;transform-origin:left bottom;-webkit-transform:none;transform:none;opacity:1}}.rotateInDownLeft{-webkit-animation-name:rotateInDownLeft;animation-name:rotateInDownLeft}@-webkit-keyframes rotateInDownRight{0%{-webkit-transform-origin:right bottom;transform-origin:right bottom;-webkit-transform:rotate3d(0,0,1,45deg);transform:rotate3d(0,0,1,45deg);opacity:0}100%{-webkit-transform-origin:right bottom;transform-origin:right bottom;-webkit-transform:none;transform:none;opacity:1}}@keyframes rotateInDownRight{0%{-webkit-transform-origin:right bottom;transform-origin:right bottom;-webkit-transform:rotate3d(0,0,1,45deg);transform:rotate3d(0,0,1,45deg);opacity:0}100%{-webkit-transform-origin:right bottom;transform-origin:right bottom;-webkit-transform:none;transform:none;opacity:1}}.rotateInDownRight{-webkit-animation-name:rotateInDownRight;animation-name:rotateInDownRight}@-webkit-keyframes rotateInUpLeft{0%{-webkit-transform-origin:left bottom;transform-origin:left bottom;-webkit-transform:rotate3d(0,0,1,45deg);transform:rotate3d(0,0,1,45deg);opacity:0}100%{-webkit-transform-origin:left bottom;transform-origin:left bottom;-webkit-transform:none;transform:none;opacity:1}}@keyframes rotateInUpLeft{0%{-webkit-transform-origin:left bottom;transform-origin:left bottom;-webkit-transform:rotate3d(0,0,1,45deg);transform:rotate3d(0,0,1,45deg);opacity:0}100%{-webkit-transform-origin:left bottom;transform-origin:left bottom;-webkit-transform:none;transform:none;opacity:1}}.rotateInUpLeft{-webkit-animation-name:rotateInUpLeft;animation-name:rotateInUpLeft}@-webkit-keyframes rotateInUpRight{0%{-webkit-transform-origin:right bottom;transform-origin:right bottom;-webkit-transform:rotate3d(0,0,1,-90deg);transform:rotate3d(0,0,1,-90deg);opacity:0}100%{-webkit-transform-origin:right bottom;transform-origin:right bottom;-webkit-transform:none;transform:none;opacity:1}}@keyframes rotateInUpRight{0%{-webkit-transform-origin:right bottom;transform-origin:right bottom;-webkit-transform:rotate3d(0,0,1,-90deg);transform:rotate3d(0,0,1,-90deg);opacity:0}100%{-webkit-transform-origin:right bottom;transform-origin:right bottom;-webkit-transform:none;transform:none;opacity:1}}.rotateInUpRight{-webkit-animation-name:rotateInUpRight;animation-name:rotateInUpRight}@-webkit-keyframes rotateOut{0%{-webkit-transform-origin:center;transform-origin:center;opacity:1}100%{-webkit-transform-origin:center;transform-origin:center;-webkit-transform:rotate3d(0,0,1,200deg);transform:rotate3d(0,0,1,200deg);opacity:0}}@keyframes rotateOut{0%{-webkit-transform-origin:center;transform-origin:center;opacity:1}100%{-webkit-transform-origin:center;transform-origin:center;-webkit-transform:rotate3d(0,0,1,200deg);transform:rotate3d(0,0,1,200deg);opacity:0}}.rotateOut{-webkit-animation-name:rotateOut;animation-name:rotateOut}@-webkit-keyframes rotateOutDownLeft{0%{-webkit-transform-origin:left bottom;transform-origin:left bottom;opacity:1}100%{-webkit-transform-origin:left bottom;transform-origin:left bottom;-webkit-transform:rotate3d(0,0,1,45deg);transform:rotate3d(0,0,1,45deg);opacity:0}}@keyframes rotateOutDownLeft{0%{-webkit-transform-origin:left bottom;transform-origin:left bottom;opacity:1}100%{-webkit-transform-origin:left bottom;transform-origin:left bottom;-webkit-transform:rotate3d(0,0,1,45deg);transform:rotate3d(0,0,1,45deg);opacity:0}}.rotateOutDownLeft{-webkit-animation-name:rotateOutDownLeft;animation-name:rotateOutDownLeft}@-webkit-keyframes rotateOutDownRight{0%{-webkit-transform-origin:right bottom;transform-origin:right bottom;opacity:1}100%{-webkit-transform-origin:right bottom;transform-origin:right bottom;-webkit-transform:rotate3d(0,0,1,-45deg);transform:rotate3d(0,0,1,-45deg);opacity:0}}@keyframes rotateOutDownRight{0%{-webkit-transform-origin:right bottom;transform-origin:right bottom;opacity:1}100%{-webkit-transform-origin:right bottom;transform-origin:right bottom;-webkit-transform:rotate3d(0,0,1,-45deg);transform:rotate3d(0,0,1,-45deg);opacity:0}}.rotateOutDownRight{-webkit-animation-name:rotateOutDownRight;animation-name:rotateOutDownRight}@-webkit-keyframes rotateOutUpLeft{0%{-webkit-transform-origin:left bottom;transform-origin:left bottom;opacity:1}100%{-webkit-transform-origin:left bottom;transform-origin:left bottom;-webkit-transform:rotate3d(0,0,1,-45deg);transform:rotate3d(0,0,1,-45deg);opacity:0}}@keyframes rotateOutUpLeft{0%{-webkit-transform-origin:left bottom;transform-origin:left bottom;opacity:1}100%{-webkit-transform-origin:left bottom;transform-origin:left bottom;-webkit-transform:rotate3d(0,0,1,-45deg);transform:rotate3d(0,0,1,-45deg);opacity:0}}.rotateOutUpLeft{-webkit-animation-name:rotateOutUpLeft;animation-name:rotateOutUpLeft}@-webkit-keyframes rotateOutUpRight{0%{-webkit-transform-origin:right bottom;transform-origin:right bottom;opacity:1}100%{-webkit-transform-origin:right bottom;transform-origin:right bottom;-webkit-transform:rotate3d(0,0,1,90deg);transform:rotate3d(0,0,1,90deg);opacity:0}}@keyframes rotateOutUpRight{0%{-webkit-transform-origin:right bottom;transform-origin:right bottom;opacity:1}100%{-webkit-transform-origin:right bottom;transform-origin:right bottom;-webkit-transform:rotate3d(0,0,1,90deg);transform:rotate3d(0,0,1,90deg);opacity:0}}.rotateOutUpRight{-webkit-animation-name:rotateOutUpRight;animation-name:rotateOutUpRight}@-webkit-keyframes hinge{0%{-webkit-transform-origin:top left;transform-origin:top left;-webkit-animation-timing-function:ease-in-out;animation-timing-function:ease-in-out}20%,60%{-webkit-transform:rotate3d(0,0,1,80deg);transform:rotate3d(0,0,1,80deg);-webkit-transform-origin:top left;transform-origin:top left;-webkit-animation-timing-function:ease-in-out;animation-timing-function:ease-in-out}40%,80%{-webkit-transform:rotate3d(0,0,1,60deg);transform:rotate3d(0,0,1,60deg);-webkit-transform-origin:top left;transform-origin:top left;-webkit-animation-timing-function:ease-in-out;animation-timing-function:ease-in-out;opacity:1}100%{-webkit-transform:translate3d(0,700px,0);transform:translate3d(0,700px,0);opacity:0}}@keyframes hinge{0%{-webkit-transform-origin:top left;transform-origin:top left;-webkit-animation-timing-function:ease-in-out;animation-timing-function:ease-in-out}20%,60%{-webkit-transform:rotate3d(0,0,1,80deg);transform:rotate3d(0,0,1,80deg);-webkit-transform-origin:top left;transform-origin:top left;-webkit-animation-timing-function:ease-in-out;animation-timing-function:ease-in-out}40%,80%{-webkit-transform:rotate3d(0,0,1,60deg);transform:rotate3d(0,0,1,60deg);-webkit-transform-origin:top left;transform-origin:top left;-webkit-animation-timing-function:ease-in-out;animation-timing-function:ease-in-out;opacity:1}100%{-webkit-transform:translate3d(0,700px,0);transform:translate3d(0,700px,0);opacity:0}}.hinge{-webkit-animation-name:hinge;animation-name:hinge}@-webkit-keyframes rollIn{0%{opacity:0;-webkit-transform:translate3d(-100%,0,0) rotate3d(0,0,1,-120deg);transform:translate3d(-100%,0,0) rotate3d(0,0,1,-120deg)}100%{opacity:1;-webkit-transform:none;transform:none}}@keyframes rollIn{0%{opacity:0;-webkit-transform:translate3d(-100%,0,0) rotate3d(0,0,1,-120deg);transform:translate3d(-100%,0,0) rotate3d(0,0,1,-120deg)}100%{opacity:1;-webkit-transform:none;transform:none}}.rollIn{-webkit-animation-name:rollIn;animation-name:rollIn}@-webkit-keyframes rollOut{0%{opacity:1}100%{opacity:0;-webkit-transform:translate3d(100%,0,0) rotate3d(0,0,1,120deg);transform:translate3d(100%,0,0) rotate3d(0,0,1,120deg)}}@keyframes rollOut{0%{opacity:1}100%{opacity:0;-webkit-transform:translate3d(100%,0,0) rotate3d(0,0,1,120deg);transform:translate3d(100%,0,0) rotate3d(0,0,1,120deg)}}.rollOut{-webkit-animation-name:rollOut;animation-name:rollOut}@-webkit-keyframes zoomIn{0%{opacity:0;-webkit-transform:scale3d(.3,.3,.3);transform:scale3d(.3,.3,.3)}50%{opacity:1}}@keyframes zoomIn{0%{opacity:0;-webkit-transform:scale3d(.3,.3,.3);transform:scale3d(.3,.3,.3)}50%{opacity:1}}.zoomIn{-webkit-animation-name:zoomIn;animation-name:zoomIn}@-webkit-keyframes zoomInDown{0%{opacity:0;-webkit-transform:scale3d(.1,.1,.1) translate3d(0,-1000px,0);transform:scale3d(.1,.1,.1) translate3d(0,-1000px,0);-webkit-animation-timing-function:cubic-bezier(0.55,.055,.675,.19);animation-timing-function:cubic-bezier(0.55,.055,.675,.19)}60%{opacity:1;-webkit-transform:scale3d(.475,.475,.475) translate3d(0,60px,0);transform:scale3d(.475,.475,.475) translate3d(0,60px,0);-webkit-animation-timing-function:cubic-bezier(0.175,.885,.32,1);animation-timing-function:cubic-bezier(0.175,.885,.32,1)}}@keyframes zoomInDown{0%{opacity:0;-webkit-transform:scale3d(.1,.1,.1) translate3d(0,-1000px,0);transform:scale3d(.1,.1,.1) translate3d(0,-1000px,0);-webkit-animation-timing-function:cubic-bezier(0.55,.055,.675,.19);animation-timing-function:cubic-bezier(0.55,.055,.675,.19)}60%{opacity:1;-webkit-transform:scale3d(.475,.475,.475) translate3d(0,60px,0);transform:scale3d(.475,.475,.475) translate3d(0,60px,0);-webkit-animation-timing-function:cubic-bezier(0.175,.885,.32,1);animation-timing-function:cubic-bezier(0.175,.885,.32,1)}}.zoomInDown{-webkit-animation-name:zoomInDown;animation-name:zoomInDown}@-webkit-keyframes zoomInLeft{0%{opacity:0;-webkit-transform:scale3d(.1,.1,.1) translate3d(-1000px,0,0);transform:scale3d(.1,.1,.1) translate3d(-1000px,0,0);-webkit-animation-timing-function:cubic-bezier(0.55,.055,.675,.19);animation-timing-function:cubic-bezier(0.55,.055,.675,.19)}60%{opacity:1;-webkit-transform:scale3d(.475,.475,.475) translate3d(10px,0,0);transform:scale3d(.475,.475,.475) translate3d(10px,0,0);-webkit-animation-timing-function:cubic-bezier(0.175,.885,.32,1);animation-timing-function:cubic-bezier(0.175,.885,.32,1)}}@keyframes zoomInLeft{0%{opacity:0;-webkit-transform:scale3d(.1,.1,.1) translate3d(-1000px,0,0);transform:scale3d(.1,.1,.1) translate3d(-1000px,0,0);-webkit-animation-timing-function:cubic-bezier(0.55,.055,.675,.19);animation-timing-function:cubic-bezier(0.55,.055,.675,.19)}60%{opacity:1;-webkit-transform:scale3d(.475,.475,.475) translate3d(10px,0,0);transform:scale3d(.475,.475,.475) translate3d(10px,0,0);-webkit-animation-timing-function:cubic-bezier(0.175,.885,.32,1);animation-timing-function:cubic-bezier(0.175,.885,.32,1)}}.zoomInLeft{-webkit-animation-name:zoomInLeft;animation-name:zoomInLeft}@-webkit-keyframes zoomInRight{0%{opacity:0;-webkit-transform:scale3d(.1,.1,.1) translate3d(1000px,0,0);transform:scale3d(.1,.1,.1) translate3d(1000px,0,0);-webkit-animation-timing-function:cubic-bezier(0.55,.055,.675,.19);animation-timing-function:cubic-bezier(0.55,.055,.675,.19)}60%{opacity:1;-webkit-transform:scale3d(.475,.475,.475) translate3d(-10px,0,0);transform:scale3d(.475,.475,.475) translate3d(-10px,0,0);-webkit-animation-timing-function:cubic-bezier(0.175,.885,.32,1);animation-timing-function:cubic-bezier(0.175,.885,.32,1)}}@keyframes zoomInRight{0%{opacity:0;-webkit-transform:scale3d(.1,.1,.1) translate3d(1000px,0,0);transform:scale3d(.1,.1,.1) translate3d(1000px,0,0);-webkit-animation-timing-function:cubic-bezier(0.55,.055,.675,.19);animation-timing-function:cubic-bezier(0.55,.055,.675,.19)}60%{opacity:1;-webkit-transform:scale3d(.475,.475,.475) translate3d(-10px,0,0);transform:scale3d(.475,.475,.475) translate3d(-10px,0,0);-webkit-animation-timing-function:cubic-bezier(0.175,.885,.32,1);animation-timing-function:cubic-bezier(0.175,.885,.32,1)}}.zoomInRight{-webkit-animation-name:zoomInRight;animation-name:zoomInRight}@-webkit-keyframes zoomInUp{0%{opacity:0;-webkit-transform:scale3d(.1,.1,.1) translate3d(0,1000px,0);transform:scale3d(.1,.1,.1) translate3d(0,1000px,0);-webkit-animation-timing-function:cubic-bezier(0.55,.055,.675,.19);animation-timing-function:cubic-bezier(0.55,.055,.675,.19)}60%{opacity:1;-webkit-transform:scale3d(.475,.475,.475) translate3d(0,-60px,0);transform:scale3d(.475,.475,.475) translate3d(0,-60px,0);-webkit-animation-timing-function:cubic-bezier(0.175,.885,.32,1);animation-timing-function:cubic-bezier(0.175,.885,.32,1)}}@keyframes zoomInUp{0%{opacity:0;-webkit-transform:scale3d(.1,.1,.1) translate3d(0,1000px,0);transform:scale3d(.1,.1,.1) translate3d(0,1000px,0);-webkit-animation-timing-function:cubic-bezier(0.55,.055,.675,.19);animation-timing-function:cubic-bezier(0.55,.055,.675,.19)}60%{opacity:1;-webkit-transform:scale3d(.475,.475,.475) translate3d(0,-60px,0);transform:scale3d(.475,.475,.475) translate3d(0,-60px,0);-webkit-animation-timing-function:cubic-bezier(0.175,.885,.32,1);animation-timing-function:cubic-bezier(0.175,.885,.32,1)}}.zoomInUp{-webkit-animation-name:zoomInUp;animation-name:zoomInUp}@-webkit-keyframes zoomOut{0%{opacity:1}50%{opacity:0;-webkit-transform:scale3d(.3,.3,.3);transform:scale3d(.3,.3,.3)}100%{opacity:0}}@keyframes zoomOut{0%{opacity:1}50%{opacity:0;-webkit-transform:scale3d(.3,.3,.3);transform:scale3d(.3,.3,.3)}100%{opacity:0}}.zoomOut{-webkit-animation-name:zoomOut;animation-name:zoomOut}@-webkit-keyframes zoomOutDown{40%{opacity:1;-webkit-transform:scale3d(.475,.475,.475) translate3d(0,-60px,0);transform:scale3d(.475,.475,.475) translate3d(0,-60px,0);-webkit-animation-timing-function:cubic-bezier(0.55,.055,.675,.19);animation-timing-function:cubic-bezier(0.55,.055,.675,.19)}100%{opacity:0;-webkit-transform:scale3d(.1,.1,.1) translate3d(0,2000px,0);transform:scale3d(.1,.1,.1) translate3d(0,2000px,0);-webkit-transform-origin:center bottom;transform-origin:center bottom;-webkit-animation-timing-function:cubic-bezier(0.175,.885,.32,1);animation-timing-function:cubic-bezier(0.175,.885,.32,1)}}@keyframes zoomOutDown{40%{opacity:1;-webkit-transform:scale3d(.475,.475,.475) translate3d(0,-60px,0);transform:scale3d(.475,.475,.475) translate3d(0,-60px,0);-webkit-animation-timing-function:cubic-bezier(0.55,.055,.675,.19);animation-timing-function:cubic-bezier(0.55,.055,.675,.19)}100%{opacity:0;-webkit-transform:scale3d(.1,.1,.1) translate3d(0,2000px,0);transform:scale3d(.1,.1,.1) translate3d(0,2000px,0);-webkit-transform-origin:center bottom;transform-origin:center bottom;-webkit-animation-timing-function:cubic-bezier(0.175,.885,.32,1);animation-timing-function:cubic-bezier(0.175,.885,.32,1)}}.zoomOutDown{-webkit-animation-name:zoomOutDown;animation-name:zoomOutDown}@-webkit-keyframes zoomOutLeft{40%{opacity:1;-webkit-transform:scale3d(.475,.475,.475) translate3d(42px,0,0);transform:scale3d(.475,.475,.475) translate3d(42px,0,0)}100%{opacity:0;-webkit-transform:scale(.1) translate3d(-2000px,0,0);transform:scale(.1) translate3d(-2000px,0,0);-webkit-transform-origin:left center;transform-origin:left center}}@keyframes zoomOutLeft{40%{opacity:1;-webkit-transform:scale3d(.475,.475,.475) translate3d(42px,0,0);transform:scale3d(.475,.475,.475) translate3d(42px,0,0)}100%{opacity:0;-webkit-transform:scale(.1) translate3d(-2000px,0,0);transform:scale(.1) translate3d(-2000px,0,0);-webkit-transform-origin:left center;transform-origin:left center}}.zoomOutLeft{-webkit-animation-name:zoomOutLeft;animation-name:zoomOutLeft}@-webkit-keyframes zoomOutRight{40%{opacity:1;-webkit-transform:scale3d(.475,.475,.475) translate3d(-42px,0,0);transform:scale3d(.475,.475,.475) translate3d(-42px,0,0)}100%{opacity:0;-webkit-transform:scale(.1) translate3d(2000px,0,0);transform:scale(.1) translate3d(2000px,0,0);-webkit-transform-origin:right center;transform-origin:right center}}@keyframes zoomOutRight{40%{opacity:1;-webkit-transform:scale3d(.475,.475,.475) translate3d(-42px,0,0);transform:scale3d(.475,.475,.475) translate3d(-42px,0,0)}100%{opacity:0;-webkit-transform:scale(.1) translate3d(2000px,0,0);transform:scale(.1) translate3d(2000px,0,0);-webkit-transform-origin:right center;transform-origin:right center}}.zoomOutRight{-webkit-animation-name:zoomOutRight;animation-name:zoomOutRight}@-webkit-keyframes zoomOutUp{40%{opacity:1;-webkit-transform:scale3d(.475,.475,.475) translate3d(0,60px,0);transform:scale3d(.475,.475,.475) translate3d(0,60px,0);-webkit-animation-timing-function:cubic-bezier(0.55,.055,.675,.19);animation-timing-function:cubic-bezier(0.55,.055,.675,.19)}100%{opacity:0;-webkit-transform:scale3d(.1,.1,.1) translate3d(0,-2000px,0);transform:scale3d(.1,.1,.1) translate3d(0,-2000px,0);-webkit-transform-origin:center bottom;transform-origin:center bottom;-webkit-animation-timing-function:cubic-bezier(0.175,.885,.32,1);animation-timing-function:cubic-bezier(0.175,.885,.32,1)}}@keyframes zoomOutUp{40%{opacity:1;-webkit-transform:scale3d(.475,.475,.475) translate3d(0,60px,0);transform:scale3d(.475,.475,.475) translate3d(0,60px,0);-webkit-animation-timing-function:cubic-bezier(0.55,.055,.675,.19);animation-timing-function:cubic-bezier(0.55,.055,.675,.19)}100%{opacity:0;-webkit-transform:scale3d(.1,.1,.1) translate3d(0,-2000px,0);transform:scale3d(.1,.1,.1) translate3d(0,-2000px,0);-webkit-transform-origin:center bottom;transform-origin:center bottom;-webkit-animation-timing-function:cubic-bezier(0.175,.885,.32,1);animation-timing-function:cubic-bezier(0.175,.885,.32,1)}}.zoomOutUp{-webkit-animation-name:zoomOutUp;animation-name:zoomOutUp}@-webkit-keyframes slideInDown{0%{-webkit-transform:translateY(-100%);transform:translateY(-100%);visibility:visible}100%{-webkit-transform:translateY(0);transform:translateY(0)}}@keyframes slideInDown{0%{-webkit-transform:translateY(-100%);transform:translateY(-100%);visibility:visible}100%{-webkit-transform:translateY(0);transform:translateY(0)}}.slideInDown{-webkit-animation-name:slideInDown;animation-name:slideInDown}@-webkit-keyframes slideInLeft{0%{-webkit-transform:translateX(-100%);transform:translateX(-100%);visibility:visible}100%{-webkit-transform:translateX(0);transform:translateX(0)}}@keyframes slideInLeft{0%{-webkit-transform:translateX(-100%);transform:translateX(-100%);visibility:visible}100%{-webkit-transform:translateX(0);transform:translateX(0)}}.slideInLeft{-webkit-animation-name:slideInLeft;animation-name:slideInLeft}@-webkit-keyframes slideInRight{0%{-webkit-transform:translateX(100%);transform:translateX(100%);visibility:visible}100%{-webkit-transform:translateX(0);transform:translateX(0)}}@keyframes slideInRight{0%{-webkit-transform:translateX(100%);transform:translateX(100%);visibility:visible}100%{-webkit-transform:translateX(0);transform:translateX(0)}}.slideInRight{-webkit-animation-name:slideInRight;animation-name:slideInRight}@-webkit-keyframes slideInUp{0%{-webkit-transform:translateY(100%);transform:translateY(100%);visibility:visible}100%{-webkit-transform:translateY(0);transform:translateY(0)}}@keyframes slideInUp{0%{-webkit-transform:translateY(100%);transform:translateY(100%);visibility:visible}100%{-webkit-transform:translateY(0);transform:translateY(0)}}.slideInUp{-webkit-animation-name:slideInUp;animation-name:slideInUp}@-webkit-keyframes slideOutDown{0%{-webkit-transform:translateY(0);transform:translateY(0)}100%{visibility:hidden;-webkit-transform:translateY(100%);transform:translateY(100%)}}@keyframes slideOutDown{0%{-webkit-transform:translateY(0);transform:translateY(0)}100%{visibility:hidden;-webkit-transform:translateY(100%);transform:translateY(100%)}}.slideOutDown{-webkit-animation-name:slideOutDown;animation-name:slideOutDown}@-webkit-keyframes slideOutLeft{0%{-webkit-transform:translateX(0);transform:translateX(0)}100%{visibility:hidden;-webkit-transform:translateX(-100%);transform:translateX(-100%)}}@keyframes slideOutLeft{0%{-webkit-transform:translateX(0);transform:translateX(0)}100%{visibility:hidden;-webkit-transform:translateX(-100%);transform:translateX(-100%)}}.slideOutLeft{-webkit-animation-name:slideOutLeft;animation-name:slideOutLeft}@-webkit-keyframes slideOutRight{0%{-webkit-transform:translateX(0);transform:translateX(0)}100%{visibility:hidden;-webkit-transform:translateX(100%);transform:translateX(100%)}}@keyframes slideOutRight{0%{-webkit-transform:translateX(0);transform:translateX(0)}100%{visibility:hidden;-webkit-transform:translateX(100%);transform:translateX(100%)}}.slideOutRight{-webkit-animation-name:slideOutRight;animation-name:slideOutRight}@-webkit-keyframes slideOutUp{0%{-webkit-transform:translateY(0);transform:translateY(0)}100%{visibility:hidden;-webkit-transform:translateY(-100%);transform:translateY(-100%)}}@keyframes slideOutUp{0%{-webkit-transform:translateY(0);transform:translateY(0)}100%{visibility:hidden;-webkit-transform:translateY(-100%);transform:translateY(-100%)}}.slideOutUp{-webkit-animation-name:slideOutUp;animation-name:slideOutUp}
================================================
FILE: client/less/lib/bootstrap/alerts.less
================================================
//
// Alerts
// --------------------------------------------------
// Base styles
// -------------------------
.alert {
padding: @alert-padding;
margin-bottom: @line-height-computed;
border: 1px solid transparent;
border-radius: @alert-border-radius;
// Headings for larger alerts
h4 {
margin-top: 0;
// Specified for the h4 to prevent conflicts of changing @headings-color
color: inherit;
}
// Provide class for links that match alerts
.alert-link {
font-weight: @alert-link-font-weight;
}
// Improve alignment and spacing of inner content
> p,
> ul {
margin-bottom: 0;
}
> p + p {
margin-top: 5px;
}
}
// Dismissible alerts
//
// Expand the right padding and account for the close button's positioning.
.alert-dismissable, // The misspelled .alert-dismissable was deprecated in 3.2.0.
.alert-dismissible {
padding-right: (@alert-padding + 20);
// Adjust close link position
.close {
position: relative;
top: -2px;
right: -21px;
color: inherit;
}
}
// Alternate styles
//
// Generate contextual modifier classes for colorizing the alert.
.alert-success {
.alert-variant(@alert-success-bg; @alert-success-border; @alert-success-text);
}
.alert-info {
.alert-variant(@alert-info-bg; @alert-info-border; @alert-info-text);
}
.alert-warning {
.alert-variant(@alert-warning-bg; @alert-warning-border; @alert-warning-text);
}
.alert-danger {
.alert-variant(@alert-danger-bg; @alert-danger-border; @alert-danger-text);
}
================================================
FILE: client/less/lib/bootstrap/badges.less
================================================
//
// Badges
// --------------------------------------------------
// Base class
.badge {
display: inline-block;
min-width: 10px;
padding: 3px 7px;
font-size: @font-size-small;
font-weight: @badge-font-weight;
color: @badge-color;
line-height: @badge-line-height;
vertical-align: baseline;
white-space: nowrap;
text-align: center;
background-color: @badge-bg;
border-radius: @badge-border-radius;
// Empty badges collapse automatically (not available in IE8)
&:empty {
display: none;
}
// Quick fix for badges in buttons
.btn & {
position: relative;
top: -1px;
}
.btn-xs & {
top: 0;
padding: 1px 5px;
}
// Hover state, but only for links
a& {
&:hover,
&:focus {
color: @badge-link-hover-color;
text-decoration: none;
cursor: pointer;
}
}
// Account for badges in navs
a.list-group-item.active > &,
.nav-pills > .active > a > & {
color: @badge-active-color;
background-color: @badge-active-bg;
}
.nav-pills > li > a > & {
margin-left: 3px;
}
}
================================================
FILE: client/less/lib/bootstrap/bootstrap.less
================================================
// Core variables and mixins
@import "variables.less";
@import "mixins.less";
// Reset and dependencies
@import "normalize.less";
@import "print.less";
@import "glyphicons.less";
// Core CSS
@import "scaffolding.less";
@import "type.less";
@import "code.less";
@import "grid.less";
@import "tables.less";
@import "forms.less";
@import "buttons.less";
// Components
@import "component-animations.less";
@import "dropdowns.less";
@import "button-groups.less";
@import "input-groups.less";
@import "navs.less";
@import "navbar.less";
@import "breadcrumbs.less";
@import "pagination.less";
@import "pager.less";
@import "labels.less";
@import "badges.less";
@import "jumbotron.less";
@import "thumbnails.less";
@import "alerts.less";
@import "progress-bars.less";
@import "media.less";
@import "list-group.less";
@import "panels.less";
@import "responsive-embed.less";
@import "wells.less";
@import "close.less";
// Components w/ JavaScript
@import "modals.less";
@import "tooltip.less";
@import "popovers.less";
@import "carousel.less";
// Utility classes
@import "utilities.less";
@import "responsive-utilities.less";
================================================
FILE: client/less/lib/bootstrap/breadcrumbs.less
================================================
//
// Breadcrumbs
// --------------------------------------------------
.breadcrumb {
padding: @breadcrumb-padding-vertical @breadcrumb-padding-horizontal;
margin-bottom: @line-height-computed;
list-style: none;
background-color: @breadcrumb-bg;
border-radius: @border-radius-base;
> li {
display: inline-block;
+ li:before {
content: "@{breadcrumb-separator}\00a0"; // Unicode space added since inline-block means non-collapsing white-space
padding: 0 5px;
color: @breadcrumb-color;
}
}
> .active {
color: @breadcrumb-active-color;
}
}
================================================
FILE: client/less/lib/bootstrap/button-groups.less
================================================
//
// Button groups
// --------------------------------------------------
// Make the div behave like a button
.btn-group,
.btn-group-vertical {
position: relative;
display: inline-block;
vertical-align: middle; // match .btn alignment given font-size hack above
> .btn {
position: relative;
float: left;
// Bring the "active" button to the front
&:hover,
&:focus,
&:active,
&.active {
z-index: 2;
}
&:focus {
// Remove focus outline when dropdown JS adds it after closing the menu
outline: 0;
}
}
}
// Prevent double borders when buttons are next to each other
.btn-group {
.btn + .btn,
.btn + .btn-group,
.btn-group + .btn,
.btn-group + .btn-group {
margin-left: -1px;
}
}
// Optional: Group multiple button groups together for a toolbar
.btn-toolbar {
margin-left: -5px; // Offset the first child's margin
&:extend(.clearfix all);
.btn-group,
.input-group {
float: left;
}
> .btn,
> .btn-group,
> .input-group {
margin-left: 5px;
}
}
.btn-group > .btn:not(:first-child):not(:last-child):not(.dropdown-toggle) {
border-radius: 0;
}
// Set corners individual because sometimes a single button can be in a .btn-group and we need :first-child and :last-child to both match
.btn-group > .btn:first-child {
margin-left: 0;
&:not(:last-child):not(.dropdown-toggle) {
.border-right-radius(0);
}
}
// Need .dropdown-toggle since :last-child doesn't apply given a .dropdown-menu immediately after it
.btn-group > .btn:last-child:not(:first-child),
.btn-group > .dropdown-toggle:not(:first-child) {
.border-left-radius(0);
}
// Custom edits for including btn-groups within btn-groups (useful for including dropdown buttons within a btn-group)
.btn-group > .btn-group {
float: left;
}
.btn-group > .btn-group:not(:first-child):not(:last-child) > .btn {
border-radius: 0;
}
.btn-group > .btn-group:first-child {
> .btn:last-child,
> .dropdown-toggle {
.border-right-radius(0);
}
}
.btn-group > .btn-group:last-child > .btn:first-child {
.border-left-radius(0);
}
// On active and open, don't show outline
.btn-group .dropdown-toggle:active,
.btn-group.open .dropdown-toggle {
outline: 0;
}
// Sizing
//
// Remix the default button sizing classes into new ones for easier manipulation.
.btn-group-xs > .btn { &:extend(.btn-xs); }
.btn-group-sm > .btn { &:extend(.btn-sm); }
.btn-group-lg > .btn { &:extend(.btn-lg); }
// Split button dropdowns
// ----------------------
// Give the line between buttons some depth
.btn-group > .btn + .dropdown-toggle {
padding-left: 8px;
padding-right: 8px;
}
.btn-group > .btn-lg + .dropdown-toggle {
padding-left: 12px;
padding-right: 12px;
}
// The clickable button for toggling the menu
// Remove the gradient and set the same inset shadow as the :active state
.btn-group.open .dropdown-toggle {
.box-shadow(inset 0 3px 5px rgba(0,0,0,.125));
// Show no shadow for `.btn-link` since it has no other button styles.
&.btn-link {
.box-shadow(none);
}
}
// Reposition the caret
.btn .caret {
margin-left: 0;
}
// Carets in other button sizes
.btn-lg .caret {
border-width: @caret-width-large @caret-width-large 0;
border-bottom-width: 0;
}
// Upside down carets for .dropup
.dropup .btn-lg .caret {
border-width: 0 @caret-width-large @caret-width-large;
}
// Vertical button groups
// ----------------------
.btn-group-vertical {
> .btn,
> .btn-group,
> .btn-group > .btn {
display: block;
float: none;
width: 100%;
max-width: 100%;
}
// Clear floats so dropdown menus can be properly placed
> .btn-group {
&:extend(.clearfix all);
> .btn {
float: none;
}
}
> .btn + .btn,
> .btn + .btn-group,
> .btn-group + .btn,
> .btn-group + .btn-group {
margin-top: -1px;
margin-left: 0;
}
}
.btn-group-vertical > .btn {
&:not(:first-child):not(:last-child) {
border-radius: 0;
}
&:first-child:not(:last-child) {
border-top-right-radius: @border-radius-base;
.border-bottom-radius(0);
}
&:last-child:not(:first-child) {
border-bottom-left-radius: @border-radius-base;
.border-top-radius(0);
}
}
.btn-group-vertical > .btn-group:not(:first-child):not(:last-child) > .btn {
border-radius: 0;
}
.btn-group-vertical > .btn-group:first-child:not(:last-child) {
> .btn:last-child,
> .dropdown-toggle {
.border-bottom-radius(0);
}
}
.btn-group-vertical > .btn-group:last-child:not(:first-child) > .btn:first-child {
.border-top-radius(0);
}
// Justified button groups
// ----------------------
.btn-group-justified {
display: table;
width: 100%;
table-layout: fixed;
border-collapse: separate;
> .btn,
> .btn-group {
float: none;
display: table-cell;
width: 1%;
}
> .btn-group .btn {
width: 100%;
}
> .btn-group .dropdown-menu {
left: auto;
}
}
// Checkbox and radio options
//
// In order to support the browser's form validation feedback, powered by the
// `required` attribute, we have to "hide" the inputs via `clip`. We cannot use
// `display: none;` or `visibility: hidden;` as that also hides the popover.
// Simply visually hiding the inputs via `opacity` would leave them clickable in
// certain cases which is prevented by using `clip` and `pointer-events`.
// This way, we ensure a DOM element is visible to position the popover from.
//
// See https://github.com/twbs/bootstrap/pull/12794 and
// https://github.com/twbs/bootstrap/pull/14559 for more information.
[data-toggle="buttons"] {
> .btn,
> .btn-group > .btn {
input[type="radio"],
input[type="checkbox"] {
position: absolute;
clip: rect(0,0,0,0);
pointer-events: none;
}
}
}
================================================
FILE: client/less/lib/bootstrap/buttons.less
================================================
//
// Buttons
// --------------------------------------------------
// Base styles
// --------------------------------------------------
.btn {
display: inline-block;
margin-bottom: 0; // For input.btn
font-weight: @btn-font-weight;
text-align: center;
vertical-align: middle;
touch-action: manipulation;
cursor: pointer;
background-image: none; // Reset unusual Firefox-on-Android default style; see https://github.com/necolas/normalize.css/issues/214
border: 1px solid transparent;
white-space: nowrap;
.button-size(@padding-base-vertical; @padding-base-horizontal; @font-size-base; @line-height-base; @border-radius-base);
.user-select(none);
&,
&:active,
&.active {
&:focus,
&.focus {
.tab-focus();
}
}
&:hover,
&:focus,
&.focus {
color: @gray-lighter;
text-decoration: none;
}
&:active,
&.active {
outline: 0;
background-image: none;
.box-shadow(inset 0 3px 5px rgba(0,0,0,.125));
}
&.disabled,
&[disabled],
fieldset[disabled] & {
cursor: @cursor-disabled;
pointer-events: none; // Future-proof disabling of clicks
.opacity(.65);
.box-shadow(none);
}
}
// Alternate buttons
// --------------------------------------------------
.btn-default {
.button-variant(@btn-default-color; @btn-default-bg; @btn-default-border);
}
.btn-primary {
.button-variant(@btn-primary-color; @btn-primary-bg; @btn-primary-border);
}
// Success appears as green
.btn-success {
.button-variant(@btn-success-color; @btn-success-bg; @btn-success-border);
}
// Info appears as blue-green
.btn-info {
.button-variant(@btn-info-color; @btn-info-bg; @btn-info-border);
}
// Warning appears as orange
.btn-warning {
.button-variant(@btn-warning-color; @btn-warning-bg; @btn-warning-border);
}
// Danger and error appear as red
.btn-danger {
.button-variant(@btn-danger-color; @btn-danger-bg; @btn-danger-border);
}
// Link buttons
// -------------------------
// Make a button look and behave like a link
.btn-link {
color: @link-color;
font-weight: normal;
border-radius: 0;
&,
&:active,
&.active,
&[disabled],
fieldset[disabled] & {
background-color: transparent;
.box-shadow(none);
}
&,
&:hover,
&:focus,
&:active {
border-color: transparent;
}
&:hover,
&:focus {
color: @link-hover-color;
text-decoration: underline;
background-color: transparent;
}
&[disabled],
fieldset[disabled] & {
&:hover,
&:focus {
color: @btn-link-disabled-color;
text-decoration: none;
}
}
}
// Button Sizes
// --------------------------------------------------
.btn-lg {
// line-height: ensure even-numbered height of button next to large input
.button-size(@padding-large-vertical; @padding-large-horizontal; @font-size-large; @line-height-large; @border-radius-large);
}
.btn-sm {
// line-height: ensure proper height of button next to small input
.button-size(@padding-small-vertical; @padding-small-horizontal; @font-size-small; @line-height-small; @border-radius-small);
}
.btn-xs {
.button-size(@padding-xs-vertical; @padding-xs-horizontal; @font-size-small; @line-height-small; @border-radius-small);
}
// Block button
// --------------------------------------------------
.btn-block {
display: block;
width: 100%;
}
// Vertically space out multiple block buttons
.btn-block + .btn-block {
margin-top: 5px;
}
// Specificity overrides
input[type="submit"],
input[type="reset"],
input[type="button"] {
&.btn-block {
width: 100%;
}
}
================================================
FILE: client/less/lib/bootstrap/carousel.less
================================================
//
// Carousel
// --------------------------------------------------
// Wrapper for the slide container and indicators
.carousel {
position: relative;
}
.carousel-inner {
position: relative;
overflow: hidden;
width: 100%;
> .item {
display: none;
position: relative;
.transition(.6s ease-in-out left);
// Account for jankitude on images
> img,
> a > img {
&:extend(.img-responsive);
line-height: 1;
}
// WebKit CSS3 transforms for supported devices
@media all and (transform-3d), (-webkit-transform-3d) {
transition: transform .6s ease-in-out;
backface-visibility: hidden;
perspective: 1000;
&.next,
&.active.right {
transform: translate3d(100%, 0, 0);
left: 0;
}
&.prev,
&.active.left {
transform: translate3d(-100%, 0, 0);
left: 0;
}
&.next.left,
&.prev.right,
&.active {
transform: translate3d(0, 0, 0);
left: 0;
}
}
}
> .active,
> .next,
> .prev {
display: block;
}
> .active {
left: 0;
}
> .next,
> .prev {
position: absolute;
top: 0;
width: 100%;
}
> .next {
left: 100%;
}
> .prev {
left: -100%;
}
> .next.left,
> .prev.right {
left: 0;
}
> .active.left {
left: -100%;
}
> .active.right {
left: 100%;
}
}
// Left/right controls for nav
// ---------------------------
.carousel-control {
position: absolute;
top: 0;
left: 0;
bottom: 0;
width: @carousel-control-width;
.opacity(@carousel-control-opacity);
font-size: @carousel-control-font-size;
color: @carousel-control-color;
text-align: center;
text-shadow: @carousel-text-shadow;
// We can't have this transition here because WebKit cancels the carousel
// animation if you trip this while in the middle of another animation.
// Set gradients for backgrounds
&.left {
#gradient > .horizontal(@start-color: rgba(0,0,0,.5); @end-color: rgba(0,0,0,.0001));
}
&.right {
left: auto;
right: 0;
#gradient > .horizontal(@start-color: rgba(0,0,0,.0001); @end-color: rgba(0,0,0,.5));
}
// Hover/focus state
&:hover,
&:focus {
outline: 0;
color: @carousel-control-color;
text-decoration: none;
.opacity(.9);
}
// Toggles
.icon-prev,
.icon-next,
.glyphicon-chevron-left,
.glyphicon-chevron-right {
position: absolute;
top: 50%;
z-index: 5;
display: inline-block;
}
.icon-prev,
.glyphicon-chevron-left {
left: 50%;
margin-left: -10px;
}
.icon-next,
.glyphicon-chevron-right {
right: 50%;
margin-right: -10px;
}
.icon-prev,
.icon-next {
width: 20px;
height: 20px;
margin-top: -10px;
font-family: serif;
}
.icon-prev {
&:before {
content: '\2039';// SINGLE LEFT-POINTING ANGLE QUOTATION MARK (U+2039)
}
}
.icon-next {
&:before {
content: '\203a';// SINGLE RIGHT-POINTING ANGLE QUOTATION MARK (U+203A)
}
}
}
// Optional indicator pips
//
// Add an unordered list with the following class and add a list item for each
// slide your carousel holds.
.carousel-indicators {
position: absolute;
bottom: 10px;
left: 50%;
z-index: 15;
width: 60%;
margin-left: -30%;
padding-left: 0;
list-style: none;
text-align: center;
li {
display: inline-block;
width: 10px;
height: 10px;
margin: 1px;
text-indent: -999px;
border: 1px solid @carousel-indicator-border-color;
border-radius: 10px;
cursor: pointer;
// IE8-9 hack for event handling
//
// Internet Explorer 8-9 does not support clicks on elements without a set
// `background-color`. We cannot use `filter` since that's not viewed as a
// background color by the browser. Thus, a hack is needed.
//
// For IE8, we set solid black as it doesn't support `rgba()`. For IE9, we
// set alpha transparency for the best results possible.
background-color: #000 \9; // IE8
background-color: rgba(0,0,0,0); // IE9
}
.active {
margin: 0;
width: 12px;
height: 12px;
background-color: @carousel-indicator-active-bg;
}
}
// Optional captions
// -----------------------------
// Hidden by default for smaller viewports
.carousel-caption {
position: absolute;
left: 15%;
right: 15%;
bottom: 20px;
z-index: 10;
padding-top: 20px;
padding-bottom: 20px;
color: @carousel-caption-color;
text-align: center;
text-shadow: @carousel-text-shadow;
& .btn {
text-shadow: none; // No shadow for button elements in carousel-caption
}
}
// Scale up controls for tablets and up
@media screen and (min-width: @screen-sm-min) {
// Scale up the controls a smidge
.carousel-control {
.glyphicon-chevron-left,
.glyphicon-chevron-right,
.icon-prev,
.icon-next {
width: 30px;
height: 30px;
margin-top: -15px;
font-size: 30px;
}
.glyphicon-chevron-left,
.icon-prev {
margin-left: -15px;
}
.glyphicon-chevron-right,
.icon-next {
margin-right: -15px;
}
}
// Show and left align the captions
.carousel-caption {
left: 20%;
right: 20%;
padding-bottom: 30px;
}
// Move up the indicators
.carousel-indicators {
bottom: 20px;
}
}
================================================
FILE: client/less/lib/bootstrap/close.less
================================================
//
// Close icons
// --------------------------------------------------
.close {
float: right;
font-size: (@font-size-base * 1.5);
font-weight: @close-font-weight;
line-height: 1;
color: @close-color;
text-shadow: @close-text-shadow;
.opacity(.2);
&:hover,
&:focus {
color: @close-color;
text-decoration: none;
cursor: pointer;
.opacity(.5);
}
// Additional properties for button version
// iOS requires the button element instead of an anchor tag.
// If you want the anchor version, it requires `href="#"`.
button& {
padding: 0;
cursor: pointer;
background: transparent;
border: 0;
-webkit-appearance: none;
}
}
================================================
FILE: client/less/lib/bootstrap/code.less
================================================
//
// Code (inline and block)
// --------------------------------------------------
// Inline and block code styles
code,
kbd,
pre,
samp {
font-family: @font-family-monospace;
}
// Inline code
code {
padding: 2px 4px;
font-size: 90%;
color: @code-color;
background-color: @code-bg;
border-radius: @border-radius-base;
}
// User input typically entered via keyboard
kbd {
padding: 2px 4px;
font-size: 90%;
color: @kbd-color;
background-color: @kbd-bg;
border-radius: @border-radius-small;
box-shadow: inset 0 -1px 0 rgba(0,0,0,.25);
kbd {
padding: 0;
font-size: 100%;
font-weight: bold;
box-shadow: none;
}
}
// Blocks of code
pre {
display: block;
padding: ((@line-height-computed - 1) / 2);
margin: 0 0 (@line-height-computed / 2);
font-size: (@font-size-base - 1); // 14px to 13px
line-height: @line-height-base;
word-break: break-all;
word-wrap: break-word;
color: @pre-color;
background-color: @pre-bg;
border: 1px solid @pre-border-color;
border-radius: @border-radius-base;
// Account for some code outputs that place code tags in pre tags
code {
padding: 0;
font-size: inherit;
color: inherit;
white-space: pre-wrap;
background-color: transparent;
border-radius: 0;
}
}
// Enable scrollable blocks of code
.pre-scrollable {
max-height: @pre-scrollable-max-height;
overflow-y: scroll;
}
================================================
FILE: client/less/lib/bootstrap/component-animations.less
================================================
//
// Component animations
// --------------------------------------------------
// Heads up!
//
// We don't use the `.opacity()` mixin here since it causes a bug with text
// fields in IE7-8. Source: https://github.com/twbs/bootstrap/pull/3552.
.fade {
opacity: 0;
.transition(opacity .15s linear);
&.in {
opacity: 1;
}
}
.collapse {
display: none;
visibility: hidden;
&.in { display: block; visibility: visible; }
tr&.in { display: table-row; }
tbody&.in { display: table-row-group; }
}
.collapsing {
position: relative;
height: 0;
overflow: hidden;
.transition-property(~"height, visibility");
.transition-duration(.35s);
.transition-timing-function(ease);
}
================================================
FILE: client/less/lib/bootstrap/dropdowns.less
================================================
//
// Dropdown menus
// --------------------------------------------------
// Dropdown arrow/caret
.caret {
display: inline-block;
width: 0;
height: 0;
margin-left: 2px;
vertical-align: middle;
border-top: @caret-width-base solid;
border-right: @caret-width-base solid transparent;
border-left: @caret-width-base solid transparent;
}
// The dropdown wrapper (div)
.dropdown {
position: relative;
}
// Prevent the focus on the dropdown toggle when closing dropdowns
.d
gitextract_acp9dswb/ ├── .babelrc ├── .bowerrc ├── .editorconfig ├── .eslintignore ├── .eslintrc ├── .gitattributes ├── .github/ │ ├── ISSUE_TEMPLATE.md │ └── PULL_REQUEST_TEMPLATE.md ├── .gitignore ├── .jshintrc ├── .node-inspectorrc ├── .travis.yml ├── CONTRIBUTING.md ├── LICENSE ├── LICENSE-freeCodeCamp-Curriculum.md ├── LICENSE-freeCodeCamp-Translation.md ├── README.md ├── bower.json ├── client/ │ ├── README.md │ ├── commonFramework/ │ │ ├── add-loop-protect.js │ │ ├── bindings.js │ │ ├── code-storage.js │ │ ├── code-uri.js │ │ ├── create-editor.js │ │ ├── detect-unsafe-code-stream.js │ │ ├── display-test-results.js │ │ ├── end.js │ │ ├── execute-challenge-stream.js │ │ ├── get-iframe.js │ │ ├── init.js │ │ ├── output-display.js │ │ ├── phone-scroll-lock.js │ │ ├── report-issue.js │ │ ├── run-tests-stream.js │ │ ├── show-completion.js │ │ ├── step-challenge.js │ │ └── update-preview.js │ ├── es6-shims.js │ ├── iFrameScripts.js │ ├── index.js │ ├── less/ │ │ ├── challenge.less │ │ ├── chat.less │ │ ├── jobs.less │ │ ├── lib/ │ │ │ ├── animate.min.less │ │ │ ├── bootstrap/ │ │ │ │ ├── alerts.less │ │ │ │ ├── badges.less │ │ │ │ ├── bootstrap.less │ │ │ │ ├── breadcrumbs.less │ │ │ │ ├── button-groups.less │ │ │ │ ├── buttons.less │ │ │ │ ├── carousel.less │ │ │ │ ├── close.less │ │ │ │ ├── code.less │ │ │ │ ├── component-animations.less │ │ │ │ ├── dropdowns.less │ │ │ │ ├── forms.less │ │ │ │ ├── glyphicons.less │ │ │ │ ├── grid.less │ │ │ │ ├── input-groups.less │ │ │ │ ├── jumbotron.less │ │ │ │ ├── labels.less │ │ │ │ ├── list-group.less │ │ │ │ ├── media.less │ │ │ │ ├── mixins/ │ │ │ │ │ ├── alerts.less │ │ │ │ │ ├── background-variant.less │ │ │ │ │ ├── border-radius.less │ │ │ │ │ ├── buttons.less │ │ │ │ │ ├── center-block.less │ │ │ │ │ ├── clearfix.less │ │ │ │ │ ├── forms.less │ │ │ │ │ ├── gradients.less │ │ │ │ │ ├── grid-framework.less │ │ │ │ │ ├── grid.less │ │ │ │ │ ├── hide-text.less │ │ │ │ │ ├── image.less │ │ │ │ │ ├── labels.less │ │ │ │ │ ├── list-group.less │ │ │ │ │ ├── nav-divider.less │ │ │ │ │ ├── nav-vertical-align.less │ │ │ │ │ ├── opacity.less │ │ │ │ │ ├── pagination.less │ │ │ │ │ ├── panels.less │ │ │ │ │ ├── progress-bar.less │ │ │ │ │ ├── reset-filter.less │ │ │ │ │ ├── resize.less │ │ │ │ │ ├── responsive-visibility.less │ │ │ │ │ ├── size.less │ │ │ │ │ ├── tab-focus.less │ │ │ │ │ ├── table-row.less │ │ │ │ │ ├── text-emphasis.less │ │ │ │ │ ├── text-overflow.less │ │ │ │ │ └── vendor-prefixes.less │ │ │ │ ├── mixins.less │ │ │ │ ├── modals.less │ │ │ │ ├── navbar.less │ │ │ │ ├── navs.less │ │ │ │ ├── normalize.less │ │ │ │ ├── pager.less │ │ │ │ ├── pagination.less │ │ │ │ ├── panels.less │ │ │ │ ├── popovers.less │ │ │ │ ├── print.less │ │ │ │ ├── progress-bars.less │ │ │ │ ├── responsive-embed.less │ │ │ │ ├── responsive-utilities.less │ │ │ │ ├── scaffolding.less │ │ │ │ ├── tables.less │ │ │ │ ├── theme.less │ │ │ │ ├── thumbnails.less │ │ │ │ ├── tooltip.less │ │ │ │ ├── type.less │ │ │ │ ├── utilities.less │ │ │ │ ├── variables.less │ │ │ │ └── wells.less │ │ │ ├── bootstrap-social/ │ │ │ │ └── bootstrap-social.less │ │ │ ├── font-awesome-4.3.0/ │ │ │ │ ├── css/ │ │ │ │ │ └── font-awesome.css │ │ │ │ ├── fonts/ │ │ │ │ │ └── FontAwesome.otf │ │ │ │ ├── less/ │ │ │ │ │ ├── animated.less │ │ │ │ │ ├── bordered-pulled.less │ │ │ │ │ ├── core.less │ │ │ │ │ ├── fixed-width.less │ │ │ │ │ ├── font-awesome.less │ │ │ │ │ ├── icons.less │ │ │ │ │ ├── larger.less │ │ │ │ │ ├── list.less │ │ │ │ │ ├── mixins.less │ │ │ │ │ ├── path.less │ │ │ │ │ ├── rotated-flipped.less │ │ │ │ │ ├── stacked.less │ │ │ │ │ └── variables.less │ │ │ │ └── scss/ │ │ │ │ ├── _animated.scss │ │ │ │ ├── _bordered-pulled.scss │ │ │ │ ├── _core.scss │ │ │ │ ├── _fixed-width.scss │ │ │ │ ├── _icons.scss │ │ │ │ ├── _larger.scss │ │ │ │ ├── _list.scss │ │ │ │ ├── _mixins.scss │ │ │ │ ├── _path.scss │ │ │ │ ├── _rotated-flipped.scss │ │ │ │ ├── _stacked.scss │ │ │ │ ├── _variables.scss │ │ │ │ └── font-awesome.scss │ │ │ └── ionicons/ │ │ │ ├── _ionicons-animation.less │ │ │ ├── _ionicons-font.less │ │ │ ├── _ionicons-icons.less │ │ │ ├── _ionicons-variables.less │ │ │ └── ionicons.less │ │ ├── main.less │ │ ├── map.less │ │ ├── signin.less │ │ ├── toastr.less │ │ └── wiki.less │ ├── main.js │ ├── plugin.js │ └── sagas/ │ ├── README.md │ ├── err-saga.js │ ├── hard-go-to-saga.js │ ├── index.js │ ├── local-storage-saga.js │ └── title-saga.js ├── common/ │ ├── app/ │ │ ├── App.jsx │ │ ├── components/ │ │ │ ├── Flash/ │ │ │ │ ├── Queue.jsx │ │ │ │ └── index.jsx │ │ │ ├── Footer/ │ │ │ │ ├── Footer.jsx │ │ │ │ ├── README.md │ │ │ │ ├── index.js │ │ │ │ └── links.json │ │ │ ├── Nav/ │ │ │ │ ├── Nav.jsx │ │ │ │ ├── NavItem.jsx │ │ │ │ ├── index.js │ │ │ │ └── links.json │ │ │ ├── NotFound/ │ │ │ │ └── index.jsx │ │ │ └── README.md │ │ ├── create-app.jsx │ │ ├── create-reducer.js │ │ ├── index.js │ │ ├── middlewares.js │ │ ├── provide-store.js │ │ ├── redux/ │ │ │ ├── actions.js │ │ │ ├── fetch-user-saga.js │ │ │ ├── index.js │ │ │ ├── oldActions.js │ │ │ ├── reducer.js │ │ │ └── types.js │ │ ├── routes/ │ │ │ ├── Admin/ │ │ │ │ └── README.md │ │ │ ├── Bonfires/ │ │ │ │ └── README.md │ │ │ ├── Hikes/ │ │ │ │ ├── components/ │ │ │ │ │ ├── Hike.jsx │ │ │ │ │ ├── Hikes.jsx │ │ │ │ │ ├── Lecture.jsx │ │ │ │ │ ├── Map.jsx │ │ │ │ │ └── Questions.jsx │ │ │ │ ├── index.js │ │ │ │ └── redux/ │ │ │ │ ├── actions.js │ │ │ │ ├── answer-saga.js │ │ │ │ ├── fetch-hikes-saga.js │ │ │ │ ├── index.js │ │ │ │ ├── oldActions.js │ │ │ │ ├── reducer.js │ │ │ │ ├── selectors.js │ │ │ │ ├── types.js │ │ │ │ └── utils.js │ │ │ ├── Jobs/ │ │ │ │ ├── README.md │ │ │ │ ├── components/ │ │ │ │ │ ├── JobNotFound.jsx │ │ │ │ │ ├── JobTotal.jsx │ │ │ │ │ ├── Jobs.jsx │ │ │ │ │ ├── List.jsx │ │ │ │ │ ├── NewJob.jsx │ │ │ │ │ ├── NewJobCompleted.jsx │ │ │ │ │ ├── Preview.jsx │ │ │ │ │ ├── Show.jsx │ │ │ │ │ └── ShowJob.jsx │ │ │ │ ├── index.js │ │ │ │ ├── redux/ │ │ │ │ │ ├── actions.js │ │ │ │ │ ├── apply-promo-saga.js │ │ │ │ │ ├── fetch-jobs-saga.js │ │ │ │ │ ├── index.js │ │ │ │ │ ├── jobs-form-normalizer.js │ │ │ │ │ ├── oldActions.js │ │ │ │ │ ├── reducer.js │ │ │ │ │ ├── save-job-saga.js │ │ │ │ │ └── types.js │ │ │ │ └── utils.js │ │ │ └── index.js │ │ ├── sagas.js │ │ ├── shared/ │ │ │ └── README.md │ │ └── utils/ │ │ ├── Professor-Context.js │ │ ├── create-types.js │ │ ├── professor-x.js │ │ ├── render-to-string.js │ │ ├── render.js │ │ └── shallow-equals.js │ ├── config.global.js │ ├── models/ │ │ ├── User-Credential.json │ │ ├── User-Identity.js │ │ ├── User-Identity.json │ │ ├── challenge.json │ │ ├── job.json │ │ ├── nonprofit.json │ │ ├── pledge.json │ │ ├── promo.js │ │ ├── promo.json │ │ ├── story.json │ │ ├── user.js │ │ └── user.json │ └── utils/ │ ├── ajax-stream.js │ ├── constantStrings.json │ ├── index.js │ ├── jsonp$.js │ └── services-creator.js ├── config/ │ └── secrets.js ├── dataAsync.js ├── full-test-data.js ├── gulpfile.js ├── leanTest.js ├── package.json ├── pm2Start.js ├── public/ │ ├── browserconfig.xml │ ├── code.html │ ├── css/ │ │ ├── Vimeo.css │ │ ├── lato.css │ │ ├── main-69858c7174.css │ │ ├── main-ec0d2f5228.css │ │ ├── main-f928abf444.css │ │ ├── main.css │ │ ├── themes/ │ │ │ ├── flatly.less │ │ │ └── modern.less │ │ └── ubuntu.css │ ├── favicons/ │ │ ├── android-chrome-manifest.json │ │ └── browserconfig.xml │ ├── favicons.html │ ├── fonts/ │ │ └── FontAwesome.otf │ ├── grouth-hacker.html │ ├── js/ │ │ ├── .jshintrc │ │ ├── angular.js │ │ ├── calculator.js │ │ ├── commonFramework-2c9795240d.js │ │ ├── commonFramework-2f0be7f94b.js │ │ ├── commonFramework-64e637bbe5.js │ │ ├── commonFramework-e9a2482e6b.js │ │ ├── commonFramework.js │ │ ├── dashboard.js │ │ ├── echarts-all-3.js │ │ ├── greensock.js │ │ ├── join-group.js │ │ ├── join-race.js │ │ ├── lib/ │ │ │ ├── jailed/ │ │ │ │ ├── _JailedSite.js │ │ │ │ ├── _frame.html │ │ │ │ ├── _frame.js │ │ │ │ ├── _pluginCore.js │ │ │ │ ├── _pluginNode.js │ │ │ │ ├── _pluginWeb.js │ │ │ │ └── jailed.js │ │ │ └── loop-protect/ │ │ │ ├── LICENSE.md │ │ │ └── loop-protect.js │ │ └── sidecar.v1.js │ ├── json/ │ │ ├── bootcamps.json │ │ └── cats.json │ ├── leader-board.html │ ├── progress.html │ └── robots.txt ├── seed/ │ ├── bonfireMDNlinks.js │ ├── challenges/ │ │ ├── 00-getting-started/ │ │ │ └── getting-started.json │ │ ├── 01-front-end-development-certification/ │ │ │ ├── advanced-bonfires.json │ │ │ ├── advanced-ziplines.json │ │ │ ├── basic-bonfires.json │ │ │ ├── basic-javascript.json │ │ │ ├── basic-ziplines.json │ │ │ ├── bootstrap.json │ │ │ ├── front-end-development-certificate.json │ │ │ ├── gear-up-for-success.json │ │ │ ├── html5-and-css.json │ │ │ ├── intermediate-bonfires.json │ │ │ ├── intermediate-ziplines.json │ │ │ ├── jquery.json │ │ │ ├── json-apis-and-ajax.json │ │ │ └── object-oriented-and-functional-programming.json │ │ ├── 02-data-visualization-certification/ │ │ │ ├── d3.json │ │ │ ├── data-visualization-certificate.json │ │ │ ├── data-visualization-projects.json │ │ │ ├── react-projects.json │ │ │ ├── react.json │ │ │ └── sass.json │ │ ├── 03-back-end-development-certification/ │ │ │ ├── api-projects.json │ │ │ ├── automated-testing-and-debugging.json │ │ │ ├── back-end-development-certificate.json │ │ │ ├── dynamic-web-applications.json │ │ │ ├── git.json │ │ │ ├── mongodb.json │ │ │ └── nodejs-and-expressjs.json │ │ └── 04-video-challenges/ │ │ ├── accessibility.json │ │ ├── agile.json │ │ ├── bigonotation.json │ │ ├── chromedevtools.json │ │ ├── computer-basics.json │ │ ├── computer-science.json │ │ ├── data-visualization.json │ │ ├── devops.json │ │ ├── dom.json │ │ ├── embedded-and-internet-of-things.json │ │ ├── game-development.json │ │ ├── gamification.json │ │ ├── jslingo.json │ │ ├── machine-learning.json │ │ ├── math-for-programmers.json │ │ ├── mobile-javascript-development.json │ │ ├── software-engineering-principles.json │ │ ├── statistics.json │ │ ├── tools.json │ │ ├── user-experience-design.json │ │ └── visual-design.json │ ├── create-challenge-bundle.js │ ├── get-challenge-completion.js │ ├── get-emails.js │ ├── getChallenges.js │ ├── index.js │ ├── loopbackMigration.js │ └── test-challenges.js ├── server/ │ ├── README.md │ ├── boot/ │ │ ├── a-extendUser.js │ │ ├── a-extendUserIdent.js │ │ ├── a-react.js │ │ ├── a-services.js │ │ ├── about.js │ │ ├── authentication.js │ │ ├── certificate.js │ │ ├── challenge.js │ │ ├── commit.js │ │ ├── explorer.js │ │ ├── home.js │ │ ├── randomAPIs.js │ │ ├── redirectHttps.js │ │ ├── redirects.js │ │ ├── restApi.js │ │ ├── story.js │ │ ├── t-wiki.js │ │ └── user.js │ ├── config.development.js │ ├── config.json │ ├── config.local.js │ ├── config.production.js │ ├── datasources.json │ ├── datasources.local.js │ ├── debug-entry.js │ ├── manifests/ │ │ └── README.md │ ├── middleware.json │ ├── middlewares/ │ │ ├── add-return-to.js │ │ ├── constant-headers.js │ │ ├── cookie-parser.js │ │ ├── csp.js │ │ ├── error-handlers.js │ │ ├── express-rx.js │ │ ├── global-locals.js │ │ ├── jade-helpers.js │ │ ├── keymetrics.js │ │ ├── migrate-completed-challenges.js │ │ ├── revision-helpers.js │ │ ├── sessions.js │ │ └── validator.js │ ├── model-config.json │ ├── passport-providers.js │ ├── production-start.js │ ├── resources/ │ │ ├── labs.json │ │ └── testimonials.json │ ├── server.js │ ├── services/ │ │ ├── hikes.js │ │ ├── job.js │ │ └── user.js │ ├── ssl-config.js │ ├── utils/ │ │ ├── auth.js │ │ ├── bad-id-map.js │ │ ├── certTypes.json │ │ ├── commit-goals.json │ │ ├── commit.js │ │ ├── commit.json │ │ ├── constantStrings.json │ │ ├── constants.js │ │ ├── date-utils.js │ │ ├── getFromDisk$.js │ │ ├── index.js │ │ ├── middleware.js │ │ ├── resources.json │ │ ├── rx.js │ │ └── user-stats.js │ └── views/ │ ├── account/ │ │ ├── email-signin.jade │ │ ├── email-signup.jade │ │ ├── forgot.jade │ │ ├── reset.jade │ │ ├── settings.jade │ │ ├── show.jade │ │ └── signin.jade │ ├── certificate/ │ │ ├── back-end.jade │ │ ├── data-vis.jade │ │ ├── font.jade │ │ ├── front-end.jade │ │ ├── full-stack.jade │ │ ├── index.jade │ │ └── script.jade │ ├── challenges/ │ │ ├── showBonfire.jade │ │ ├── showHTML.jade │ │ ├── showJS.jade │ │ ├── showStep.jade │ │ ├── showVideo.jade │ │ └── showZiplineOrBasejump.jade │ ├── commit/ │ │ ├── directory.jade │ │ ├── index.jade │ │ └── pledge.jade │ ├── feed.jade │ ├── home.jade │ ├── layout-react.jade │ ├── layout-wide.jade │ ├── layout.jade │ ├── map/ │ │ └── show.jade │ ├── partials/ │ │ ├── challenge-footer.jade │ │ ├── challenge-modals.jade │ │ ├── flash.jade │ │ ├── footer.jade │ │ ├── meta.jade │ │ ├── navbar.jade │ │ ├── react-stylesheets.jade │ │ ├── scripts.jade │ │ └── stylesheets.jade │ ├── redirect-https.html │ ├── redirect-https.jade │ ├── resources/ │ │ ├── about.jade │ │ ├── academic-honesty.jade │ │ ├── calculator.jade │ │ ├── code-of-conduct.jade │ │ ├── code.jade │ │ ├── dashboard.jade │ │ ├── group.jade │ │ ├── how-nonprofit-projects-work.jade │ │ ├── labs.jade │ │ ├── links.jade │ │ ├── nonprofits-form.jade │ │ ├── nonprofits.jade │ │ ├── pmi-acp-agile-project-managers-form.jade │ │ ├── pmi-acp-agile-project-managers.jade │ │ ├── privacy.jade │ │ ├── progress.jade │ │ ├── shop.jade │ │ ├── sitemap.jade │ │ ├── stories.jade │ │ ├── terms-of-service.jade │ │ ├── test.css │ │ ├── the-fastest-web-page-on-the-internet.jade │ │ └── unsubscribed.jade │ ├── sponsors/ │ │ ├── sponsors.html │ │ └── sponsors.jade │ ├── stories/ │ │ ├── hot-stories.jade │ │ ├── index.jade │ │ ├── news-nav.jade │ │ ├── preliminary-submit.jade │ │ ├── show.jade │ │ └── submit-story.jade │ └── wiki/ │ └── show.jade ├── simple-json.js ├── test/ │ └── server/ │ └── utils/ │ ├── date-utils-test.js │ └── user-stats-test.js ├── webpack.config.js └── webpack.config.node.js
SYMBOL INDEX (1486 symbols across 107 files)
FILE: client/commonFramework/code-storage.js
method getStoredValue (line 17) | getStoredValue(key) {
method updateStorage (line 47) | updateStorage(key, code) {
FILE: client/commonFramework/code-uri.js
function encodeFcc (line 19) | function encodeFcc(val) {
function decodeFcc (line 23) | function decodeFcc(val) {
method getKeyInQuery (line 59) | getKeyInQuery(query, keyToFind = '') {
method getSolutionFromQuery (line 75) | getSolutionFromQuery(query = '') {
method shouldRun (line 131) | shouldRun() {
FILE: client/commonFramework/run-tests-stream.js
method getValue (line 20) | getValue() { return originalCode; }
FILE: client/commonFramework/show-completion.js
function submitChallengeHandler (line 9) | function submitChallengeHandler(e) {
FILE: client/commonFramework/step-challenge.js
function getPreviousStep (line 10) | function getPreviousStep($challengeSteps) {
function getNextStep (line 25) | function getNextStep($challengeSteps) {
function handlePrevStepClick (line 44) | function handlePrevStepClick(e) {
function handleNextStepClick (line 69) | function handleNextStepClick(e) {
function handleActionClick (line 94) | function handleActionClick(e) {
function handleFinishClick (line 135) | function handleFinishClick(e) {
function handleSubmitClick (line 142) | function handleSubmitClick(e) {
FILE: client/iFrameScripts.js
method getValue (line 35) | getValue() { return originalCode; }
FILE: client/main.js
function showMainChat (line 102) | function showMainChat() {
function collapseMainChat (line 108) | function collapseMainChat() {
function toggleMainChat (line 113) | function toggleMainChat() {
function upvoteHandler (line 185) | function upvoteHandler(e) {
function expandCaret (line 288) | function expandCaret(item) {
function collapseCaret (line 294) | function collapseCaret(item) {
function expandBlock (line 300) | function expandBlock(item) {
function collapseBlock (line 305) | function collapseBlock(item) {
function showMap (line 357) | function showMap() {
function collapseMap (line 370) | function collapseMap() {
function toggleMap (line 375) | function toggleMap() {
function showWiki (line 388) | function showWiki() {
function collapseWiki (line 404) | function collapseWiki() {
function toggleWiki (line 409) | function toggleWiki() {
function clearMapFilter (line 517) | function clearMapFilter() {
FILE: client/plugin.js
function importScript (line 5) | function importScript(url, error) {
function run (line 14) | function run(code, cb) {
function runHidden (line 37) | function runHidden(code) {
function stringify (line 83) | function stringify(output) {
FILE: common/app/App.jsx
method isPrimed (line 32) | isPrimed({ username }) {
class FreeCodeCamp (line 38) | class FreeCodeCamp extends React.Component {
method componentWillReceiveProps (line 49) | componentWillReceiveProps({ toast: nextToast = {} }) {
method render (line 63) | render() {
FILE: common/app/components/Flash/Queue.jsx
method renderMessages (line 11) | renderMessages(messages) {
method render (line 19) | render() {
FILE: common/app/components/Footer/Footer.jsx
method renderLinks (line 8) | renderLinks(mobile) {
method renderContent (line 22) | renderContent(mobile, content) {
method render (line 33) | render() {
FILE: common/app/components/Nav/Nav.jsx
method renderLinks (line 41) | renderLinks() {
method renderPoints (line 68) | renderPoints(username, points) {
method renderSignin (line 81) | renderSignin(username, picture) {
method render (line 105) | render() {
FILE: common/app/components/Nav/NavItem.jsx
method getDefaultProps (line 22) | getDefaultProps() {
method handleClick (line 28) | handleClick(e) {
method render (line 42) | render() {
FILE: common/app/components/NotFound/index.jsx
function goToServer (line 5) | function goToServer(path) {
method componentWillMount (line 16) | componentWillMount() {
method componentDidMount (line 20) | componentDidMount() {
method render (line 23) | render() {
FILE: common/app/create-app.jsx
function createApp (line 35) | function createApp({
FILE: common/app/create-reducer.js
function createReducer (line 11) | function createReducer(sideReducers = {}) {
FILE: common/app/provide-store.js
function provideStore (line 5) | function provideStore(element, store) {
FILE: common/app/redux/oldActions.js
method setTitle (line 9) | setTitle(title = 'Learn To Code') {
method getUser (line 13) | getUser() {
method toast (line 43) | toast(args) {
method updateLocation (line 58) | updateLocation(location) {
FILE: common/app/routes/Hikes/components/Hike.jsx
class Hike (line 21) | class Hike extends React.Component {
method componentWillUnmount (line 33) | componentWillUnmount() {
method componentWillReceiveProps (line 37) | componentWillReceiveProps({ params: { dashedName } }) {
method renderBody (line 43) | renderBody(showQuestions) {
method render (line 50) | render() {
FILE: common/app/routes/Hikes/components/Hikes.jsx
method shouldContainerFetch (line 34) | shouldContainerFetch(props, nextProps) {
class Hikes (line 39) | class Hikes extends PureComponent {
method componentWillMount (line 49) | componentWillMount() {
method renderMap (line 54) | renderMap(hikes) {
method render (line 60) | render() {
FILE: common/app/routes/Hikes/components/Lecture.jsx
class Lecture (line 30) | class Lecture extends React.Component {
method componentWillMount (line 43) | componentWillMount() {
method shouldComponentUpdate (line 49) | shouldComponentUpdate(nextProps) {
method renderTranscript (line 56) | renderTranscript(transcript, dashedName) {
method render (line 65) | render() {
FILE: common/app/routes/Hikes/components/Map.jsx
method render (line 12) | render() {
FILE: common/app/routes/Hikes/components/Questions.jsx
class Question (line 56) | class Question extends React.Component {
method constructor (line 57) | constructor(...args) {
method componentWillUnmount (line 81) | componentWillUnmount() {
method handleMouseUp (line 85) | handleMouseUp(e, answer, info) {
method handleMouseMove (line 109) | handleMouseMove(isPressed, { delta, moveQuestion }) {
method onAnswer (line 116) | onAnswer(answer, userAnswer, info) {
method renderQuestion (line 136) | renderQuestion(number, question, answer, shouldShakeQuestion, info) {
method render (line 162) | render() {
FILE: common/app/routes/Hikes/redux/answer-saga.js
function handleAnswer (line 12) | function handleAnswer(getState, dispatch, next, action) {
FILE: common/app/routes/Hikes/redux/oldActions.js
function getCurrentHike (line 9) | function getCurrentHike(hikes = [{}], dashedName, currentHike) {
function findNextHike (line 30) | function findNextHike(hikes, id) {
function getMouse (line 40) | function getMouse(e, [dx, dy]) {
method fetchHikes (line 56) | fetchHikes({ isPrimed, dashedName }) {
method toggleQuestions (line 89) | toggleQuestions() {
method grabQuestion (line 102) | grabQuestion(e) {
method releaseQuestion (line 127) | releaseQuestion() {
method moveQuestion (line 142) | moveQuestion({ e, delta }) {
method answer (line 158) | answer({
method resetHike (line 346) | resetHike() {
FILE: common/app/routes/Hikes/redux/utils.js
function getFirstHike (line 6) | function getFirstHike(hikes) {
function findCurrentHike (line 21) | function findCurrentHike(hikes, dashedName) {
function getCurrentHike (line 38) | function getCurrentHike(hikes = {}, dashedName) {
function findNextHikeName (line 49) | function findNextHikeName({ results }, dashedName) {
function getMouse (line 66) | function getMouse(e, [dx, dy]) {
FILE: common/app/routes/Jobs/components/JobNotFound.jsx
method shouldComponentUpdate (line 8) | shouldComponentUpdate() {
method render (line 12) | render() {
FILE: common/app/routes/Jobs/components/JobTotal.jsx
class JobTotal (line 60) | class JobTotal extends PureComponent {
method constructor (line 61) | constructor(...args) {
method componentWillMount (line 79) | componentWillMount() {
method componentWillUnmount (line 87) | componentWillUnmount() {
method renderDiscount (line 91) | renderDiscount(discountAmount) {
method renderHighlightPrice (line 110) | renderHighlightPrice(isHighlighted) {
method renderPromo (line 129) | renderPromo() {
method render (line 194) | render() {
FILE: common/app/routes/Jobs/components/Jobs.jsx
method isPrimed (line 34) | isPrimed({ jobs }) {
class Jobs (line 39) | class Jobs extends PureComponent {
method createJobClickHandler (line 51) | createJobClickHandler() {
method renderList (line 59) | renderList(handleJobClick, jobs) {
method renderChild (line 67) | renderChild(child, jobs) {
method render (line 77) | render() {
FILE: common/app/routes/Jobs/components/List.jsx
class ListJobs (line 7) | class ListJobs extends PureComponent {
method addLocation (line 15) | addLocation(locale) {
method renderJobs (line 26) | renderJobs(handleClick, jobs = []) {
method render (line 74) | render() {
FILE: common/app/routes/Jobs/components/NewJob.jsx
function isValidURL (line 50) | function isValidURL(data) {
function makeOptional (line 80) | function makeOptional(validator) {
function makeRequired (line 83) | function makeRequired(validator) {
function validateForm (line 87) | function validateForm(values) {
function getBsStyle (line 99) | function getBsStyle(field) {
class NewJob (line 109) | class NewJob extends React.Component {
method componentDidMount (line 120) | componentDidMount() {
method handleSubmit (line 124) | handleSubmit(job) {
method handleCertClick (line 129) | handleCertClick(name) {
method render (line 139) | render() {
FILE: common/app/routes/Jobs/components/NewJobCompleted.jsx
method render (line 8) | render() {
FILE: common/app/routes/Jobs/components/Preview.jsx
class JobPreview (line 22) | class JobPreview extends PureComponent {
method constructor (line 23) | constructor(...args) {
method componentWillMount (line 37) | componentWillMount() {
method componentWillUnmount (line 45) | componentWillUnmount() {
method handleJobSubmit (line 49) | handleJobSubmit() {
method render (line 56) | render() {
FILE: common/app/routes/Jobs/components/Show.jsx
function shouldShowApply (line 15) | function shouldShowApply(
function generateMessage (line 29) | function generateMessage(
method getActionArgs (line 79) | getActionArgs({ params: { id } }) {
method isPrimed (line 82) | isPrimed({ params: { id } = {}, job = {} }) {
method shouldRefetch (line 86) | shouldRefetch({ job }, { params: { id } }) {
class Show (line 91) | class Show extends PureComponent {
method componentDidMount (line 101) | componentDidMount() {
method render (line 109) | render() {
FILE: common/app/routes/Jobs/components/ShowJob.jsx
function addATags (line 15) | function addATags(text) {
method renderHeader (line 31) | renderHeader({ company, position }) {
method renderHowToApply (line 44) | renderHowToApply(showApply, preview, message, howToApply) {
method render (line 76) | render() {
FILE: common/app/routes/Jobs/redux/jobs-form-normalizer.js
function ifDefinedNormalize (line 11) | function ifDefinedNormalize(normalizer) {
function formatUrl (line 15) | function formatUrl(url) {
FILE: common/app/routes/Jobs/redux/oldActions.js
method findJob (line 15) | findJob(id) {
method saveJobToDb (line 38) | saveJobToDb({ goTo, job }) {
method getJob (line 61) | getJob(id) {
method getJobs (line 74) | getJobs() {
method openModal (line 87) | openModal() {
method closeModal (line 92) | closeModal() {
method handleForm (line 97) | handleForm(value) {
method getSavedForm (line 113) | getSavedForm() {
method setPromoCode (line 124) | setPromoCode({ target: { value = '' }} = {}) {
method applyCode (line 132) | applyCode({ id, code = '', type = null}) {
method clearPromo (line 171) | clearPromo() {
method init (line 186) | init({ instance: jobActions }) {
FILE: common/app/routes/Jobs/redux/reducer.js
function replace (line 6) | function replace(str) {
FILE: common/app/routes/Jobs/utils.js
function getDefaults (line 14) | function getDefaults(type, value) {
function isJobValid (line 24) | function isJobValid(job) {
FILE: common/app/utils/Professor-Context.js
class ProfessorContext (line 3) | class ProfessorContext extends React.Component {
method constructor (line 4) | constructor(props) {
method getChildContext (line 19) | getChildContext() {
method render (line 23) | render() {
FILE: common/app/utils/create-types.js
function createTypes (line 2) | function createTypes(types = [], prefix = '') {
FILE: common/app/utils/professor-x.js
function getChildContext (line 31) | function getChildContext(childContextTypes, currentContext) {
function contain (line 43) | function contain(options = {}, Component) {
FILE: common/app/utils/render-to-string.js
function fetch (line 9) | function fetch({ fetchContext = [] }) {
function renderToString (line 30) | function renderToString(Component) {
FILE: common/app/utils/render.js
function render (line 5) | function render(Component, DOMContainer) {
FILE: common/app/utils/shallow-equals.js
function shallowEqual (line 4) | function shallowEqual(objA, objB) {
FILE: common/models/User-Identity.js
function createAccessToken (line 15) | function createAccessToken(user, ttl, cb) {
FILE: common/models/promo.js
function promo (line 6) | function promo(Promo) {
FILE: common/models/user.js
constant BROWNIEPOINTS_TIMEOUT (line 11) | const BROWNIEPOINTS_TIMEOUT = [1, 'hour'];
function getAboutProfile (line 13) | function getAboutProfile({
function nextTick (line 27) | function nextTick(fn) {
FILE: common/utils/ajax-stream.js
function getXMLHttpRequest (line 26) | function getXMLHttpRequest() {
function getCORSRequest (line 56) | function getCORSRequest() {
function normalizeAjaxSuccessEvent (line 67) | function normalizeAjaxSuccessEvent(e, xhr, settings) {
function normalizeAjaxErrorEvent (line 79) | function normalizeAjaxErrorEvent(e, xhr, type) {
function ajax$ (line 111) | function ajax$(options) {
function post$ (line 253) | function post$(url, body) {
function postJSON$ (line 263) | function postJSON$(url, body) {
function get$ (line 290) | function get$(url) {
function getJSON$ (line 300) | function getJSON$(url) {
FILE: common/utils/index.js
function nameSpacedTransformer (line 1) | function nameSpacedTransformer(ns, transformer) {
FILE: common/utils/jsonp$.js
function destroy (line 6) | function destroy(element) {
function jsonp$ (line 11) | function jsonp$(options) {
FILE: common/utils/services-creator.js
function callbackObserver (line 5) | function callbackObserver(observer) {
method init (line 18) | init({ args: [ options ] }) {
method readService$ (line 22) | readService$({ service: resource, params, config }) {
method createService$ (line 34) | createService$({ service: resource, params, body, config }) {
FILE: dataAsync.js
function lookUp (line 1979) | function lookUp(value, prop){
FILE: gulpfile.js
function formatCommonFrameworkPaths (line 163) | function formatCommonFrameworkPaths() {
function errorHandler (line 169) | function errorHandler() {
function delRev (line 182) | function delRev(dest, manifestName) {
function getFilesGlob (line 390) | function getFilesGlob(files) {
function collector (line 482) | function collector(file, memo) {
function done (line 486) | function done(manifest) {
function buildManifest (line 490) | function buildManifest() {
FILE: leanTest.js
function lookUp (line 30) | function lookUp(firstName, prop){
FILE: public/js/angular.js
function minErr (line 38) | function minErr(module, ErrorConstructor) {
function isArrayLike (line 250) | function isArrayLike(obj) {
function forEach (line 307) | function forEach(obj, iterator, context) {
function forEachSorted (line 351) | function forEachSorted(obj, iterator, context) {
function reverseParams (line 365) | function reverseParams(iteratorFn) {
function nextUid (line 379) | function nextUid() {
function setHashKey (line 389) | function setHashKey(obj, h) {
function baseExtend (line 398) | function baseExtend(dst, objs, deep) {
function extend (line 450) | function extend(dst) {
function merge (line 473) | function merge(dst) {
function toInt (line 479) | function toInt(str) {
function inherit (line 484) | function inherit(parent, extra) {
function noop (line 504) | function noop() {}
function identity (line 526) | function identity($) {return $;}
function valueFn (line 530) | function valueFn(value) {return function valueRef() {return value;};}
function hasCustomToString (line 532) | function hasCustomToString(obj) {
function isUndefined (line 549) | function isUndefined(value) {return typeof value === 'undefined';}
function isDefined (line 564) | function isDefined(value) {return typeof value !== 'undefined';}
function isObject (line 580) | function isObject(value) {
function isBlankObject (line 591) | function isBlankObject(value) {
function isString (line 608) | function isString(value) {return typeof value === 'string';}
function isNumber (line 629) | function isNumber(value) {return typeof value === 'number';}
function isDate (line 644) | function isDate(value) {
function isFunction (line 675) | function isFunction(value) {return typeof value === 'function';}
function isRegExp (line 685) | function isRegExp(value) {
function isWindow (line 697) | function isWindow(obj) {
function isScope (line 702) | function isScope(obj) {
function isFile (line 707) | function isFile(obj) {
function isFormData (line 712) | function isFormData(obj) {
function isBlob (line 717) | function isBlob(obj) {
function isBoolean (line 722) | function isBoolean(value) {
function isPromiseLike (line 727) | function isPromiseLike(obj) {
function isTypedArray (line 733) | function isTypedArray(value) {
function isArrayBuffer (line 737) | function isArrayBuffer(obj) {
function isElement (line 767) | function isElement(node) {
function makeMap (line 777) | function makeMap(str) {
function nodeName_ (line 786) | function nodeName_(element) {
function includes (line 790) | function includes(array, obj) {
function arrayRemove (line 794) | function arrayRemove(array, value) {
function copy (line 860) | function copy(source, destination) {
function shallowCopy (line 1002) | function shallowCopy(src, dst) {
function equals (line 1087) | function equals(o1, o2) {
function noUnsafeEval (line 1152) | function noUnsafeEval() {
function concat (line 1217) | function concat(array1, array2, index) {
function sliceArgs (line 1221) | function sliceArgs(args, startIndex) {
function bind (line 1245) | function bind(self, fn) {
function toJsonReplacer (line 1266) | function toJsonReplacer(key, value) {
function toJson (line 1298) | function toJson(obj, pretty) {
function fromJson (line 1319) | function fromJson(json) {
function timezoneToOffset (line 1327) | function timezoneToOffset(timezone, fallback) {
function addDateMinutes (line 1335) | function addDateMinutes(date, minutes) {
function convertTimezoneToLocal (line 1342) | function convertTimezoneToLocal(date, timezone, reverse) {
function startingTag (line 1353) | function startingTag(element) {
function tryDecodeURIComponent (line 1383) | function tryDecodeURIComponent(value) {
function parseKeyValue (line 1396) | function parseKeyValue(/**string*/keyValue) {
function toKeyValue (line 1423) | function toKeyValue(obj) {
function encodeUriSegment (line 1451) | function encodeUriSegment(val) {
function encodeUriQuery (line 1470) | function encodeUriQuery(val, pctEncodeSpaces) {
function getNgAttribute (line 1482) | function getNgAttribute(element, ngAttr) {
function angularInit (line 1627) | function angularInit(element, bootstrap) {
function bootstrap (line 1715) | function bootstrap(element, modules, config) {
function reloadWithDebugInfo (line 1793) | function reloadWithDebugInfo() {
function getTestability (line 1806) | function getTestability(rootElement) {
function snake_case (line 1816) | function snake_case(name, separator) {
function bindJQuery (line 1824) | function bindJQuery() {
function assertArg (line 1878) | function assertArg(arg, name, reason) {
function assertArgFn (line 1885) | function assertArgFn(arg, name, acceptArrayAnnotation) {
function assertNotHasOwnProperty (line 1900) | function assertNotHasOwnProperty(name, context) {
function getter (line 1914) | function getter(obj, path, bindFnToScope) {
function getBlockNodes (line 1938) | function getBlockNodes(nodes) {
function createMap (line 1968) | function createMap() {
function setupModuleLoader (line 1988) | function setupModuleLoader(window) {
function serializeObject (line 2343) | function serializeObject(obj) {
function toDebugString (line 2358) | function toDebugString(obj) {
function publishExternalAPI (line 2490) | function publishExternalAPI(angular) {
function jqNextId (line 2769) | function jqNextId() { return ++jqId; }
function camelCase (line 2782) | function camelCase(name) {
function jqLiteIsTextNode (line 2810) | function jqLiteIsTextNode(html) {
function jqLiteAcceptsData (line 2814) | function jqLiteAcceptsData(node) {
function jqLiteHasData (line 2821) | function jqLiteHasData(node) {
function jqLiteCleanData (line 2828) | function jqLiteCleanData(nodes) {
function jqLiteBuildFragment (line 2834) | function jqLiteBuildFragment(html, context) {
function jqLiteParseHTML (line 2871) | function jqLiteParseHTML(html, context) {
function jqLiteWrapNode (line 2886) | function jqLiteWrapNode(node, wrapper) {
function JQLite (line 2905) | function JQLite(element) {
function jqLiteClone (line 2930) | function jqLiteClone(element) {
function jqLiteDealoc (line 2934) | function jqLiteDealoc(element, onlyDescendants) {
function jqLiteOff (line 2945) | function jqLiteOff(element, type, fn, unsupported) {
function jqLiteRemoveData (line 2983) | function jqLiteRemoveData(element, name) {
function jqLiteExpandoStore (line 3005) | function jqLiteExpandoStore(element, createIfNecessary) {
function jqLiteData (line 3018) | function jqLiteData(element, key, value) {
function jqLiteHasClass (line 3044) | function jqLiteHasClass(element, selector) {
function jqLiteRemoveClass (line 3050) | function jqLiteRemoveClass(element, cssClasses) {
function jqLiteAddClass (line 3062) | function jqLiteAddClass(element, cssClasses) {
function jqLiteAddNodes (line 3079) | function jqLiteAddNodes(root, elements) {
function jqLiteController (line 3105) | function jqLiteController(element, name) {
function jqLiteInheritedData (line 3109) | function jqLiteInheritedData(element, name, value) {
function jqLiteEmpty (line 3129) | function jqLiteEmpty(element) {
function jqLiteRemove (line 3136) | function jqLiteRemove(element, keepData) {
function jqLiteDocumentLoaded (line 3143) | function jqLiteDocumentLoaded(action, win) {
function trigger (line 3163) | function trigger() {
function getBooleanAttrName (line 3217) | function getBooleanAttrName(element, name) {
function getAliasedAttrName (line 3225) | function getAliasedAttrName(name) {
function getText (line 3318) | function getText(element, value) {
function createEventHandler (line 3403) | function createEventHandler(element, events) {
function defaultHandlerWrapper (line 3455) | function defaultHandlerWrapper(element, event, handler) {
function specialMouseHandlerWrapper (line 3459) | function specialMouseHandlerWrapper(target, event, handler) {
function $$jqLiteProvider (line 3706) | function $$jqLiteProvider() {
function hashKey (line 3737) | function hashKey(obj, nextUidFn) {
function HashMap (line 3760) | function HashMap(array, isolatedUid) {
function extractArgs (line 3874) | function extractArgs(fn) {
function anonFn (line 3880) | function anonFn(fn) {
function annotate (line 3890) | function annotate(fn, strictDi, name) {
function createInjector (line 4437) | function createInjector(modulesToLoad, strictDi) {
function $AnchorScrollProvider (line 4706) | function $AnchorScrollProvider() {
function mergeClasses (line 4973) | function mergeClasses(a,b) {
function extractElementNode (line 4982) | function extractElementNode(element) {
function splitClasses (line 4991) | function splitClasses(classes) {
function prepareAnimateOptions (line 5016) | function prepareAnimateOptions(options) {
function updateData (line 5061) | function updateData(data, classes, value) {
function handleCSSClassChanges (line 5076) | function handleCSSClassChanges() {
function addRemoveClassesPostDigest (line 5105) | function addRemoveClassesPostDigest(element, add, remove) {
function domInsert (line 5219) | function domInsert(element, parentElement, afterElement) {
function waitForTick (line 5571) | function waitForTick(fn) {
function next (line 5606) | function next() {
function onProgress (line 5630) | function onProgress(response) {
function AnimateRunner (line 5638) | function AnimateRunner(host) {
function run (line 5794) | function run() {
function applyAnimationContents (line 5805) | function applyAnimationContents() {
function Browser (line 5846) | function Browser(window, document, $log, $sniffer) {
function $BrowserProvider (line 6174) | function $BrowserProvider() {
function $CacheFactoryProvider (line 6262) | function $CacheFactoryProvider() {
function $TemplateCacheProvider (line 6577) | function $TemplateCacheProvider() {
function UNINITIALIZED_VALUE (line 7429) | function UNINITIALIZED_VALUE() {}
function $CompileProvider (line 7439) | function $CompileProvider($provide, $$sanitizeUriProvider) {
function SimpleChange (line 9862) | function SimpleChange(previous, current) {
function directiveNormalize (line 9874) | function directiveNormalize(name) {
function nodesetLinkingFn (line 9923) | function nodesetLinkingFn(
function directiveLinkingFn (line 9930) | function directiveLinkingFn(
function tokenDifference (line 9938) | function tokenDifference(str1, str2) {
function removeComments (line 9954) | function removeComments(jqNodes) {
function identifierForController (line 9975) | function identifierForController(controller, ident) {
function $ControllerProvider (line 9994) | function $ControllerProvider() {
function $DocumentProvider (line 10176) | function $DocumentProvider() {
function $ExceptionHandlerProvider (line 10222) | function $ExceptionHandlerProvider() {
function serializeValue (line 10268) | function serializeValue(v) {
function $HttpParamSerializerProvider (line 10276) | function $HttpParamSerializerProvider() {
function $HttpParamSerializerJQLikeProvider (line 10313) | function $HttpParamSerializerJQLikeProvider() {
function defaultHttpResponseTransform (line 10385) | function defaultHttpResponseTransform(data, headers) {
function isJsonLike (line 10401) | function isJsonLike(str) {
function parseHeaders (line 10412) | function parseHeaders(headers) {
function headersGetter (line 10448) | function headersGetter(headers) {
function transformData (line 10478) | function transformData(data, headers, status, fns) {
function isSuccess (line 10491) | function isSuccess(status) {
function $HttpProvider (line 10502) | function $HttpProvider() {
function $xhrFactoryProvider (line 11634) | function $xhrFactoryProvider() {
function $HttpBackendProvider (line 11659) | function $HttpBackendProvider() {
function createHttpBackend (line 11665) | function createHttpBackend($browser, createXhr, $browserDefer, callbacks...
function $InterpolateProvider (line 11875) | function $InterpolateProvider() {
function $IntervalProvider (line 12200) | function $IntervalProvider() {
function encodePath (line 12421) | function encodePath(path) {
function parseAbsoluteUrl (line 12432) | function parseAbsoluteUrl(absoluteUrl, locationObj) {
function parseAppUrl (line 12441) | function parseAppUrl(relativeUrl, locationObj) {
function beginsWith (line 12466) | function beginsWith(begin, whole) {
function stripHash (line 12473) | function stripHash(url) {
function trimEmptyHash (line 12478) | function trimEmptyHash(url) {
function stripFile (line 12483) | function stripFile(url) {
function serverBase (line 12488) | function serverBase(url) {
function LocationHtml5Url (line 12502) | function LocationHtml5Url(appBase, appBaseNoFile, basePrefix) {
function LocationHashbangUrl (line 12581) | function LocationHashbangUrl(appBase, appBaseNoFile, hashPrefix) {
function LocationHashbangInHtml5Url (line 12693) | function LocationHashbangInHtml5Url(appBase, appBaseNoFile, hashPrefix) {
function locationGetter (line 13057) | function locationGetter(property) {
function locationGetterSetter (line 13064) | function locationGetterSetter(property, preprocess) {
function $LocationProvider (line 13110) | function $LocationProvider() {
function $LogProvider (line 13444) | function $LogProvider() {
function ensureSafeMemberName (line 13600) | function ensureSafeMemberName(name, fullExpression) {
function getStringValue (line 13611) | function getStringValue(name) {
function ensureSafeObject (line 13629) | function ensureSafeObject(obj, fullExpression) {
function ensureSafeFunction (line 13660) | function ensureSafeFunction(obj, fullExpression) {
function ensureSafeAssignContext (line 13674) | function ensureSafeAssignContext(obj, fullExpression) {
function ifDefined (line 14225) | function ifDefined(v, d) {
function plusFn (line 14229) | function plusFn(l, r) {
function isStateless (line 14235) | function isStateless($filter, filterName) {
function findConstantAndWatchExpressions (line 14240) | function findConstantAndWatchExpressions(ast, $filter) {
function getInputs (line 14348) | function getInputs(body) {
function isAssignable (line 14356) | function isAssignable(ast) {
function assignableAST (line 14360) | function assignableAST(ast) {
function isLiteral (line 14366) | function isLiteral(ast) {
function isConstant (line 14374) | function isConstant(ast) {
function ASTCompiler (line 14378) | function ASTCompiler(astBuilder, $filter) {
function ASTInterpreter (line 14883) | function ASTInterpreter(astBuilder, $filter) {
function isPossiblyDangerousMemberName (line 15283) | function isPossiblyDangerousMemberName(name) {
function getValueOf (line 15289) | function getValueOf(value) {
function $ParseProvider (line 15344) | function $ParseProvider() {
function $QProvider (line 15865) | function $QProvider() {
function $$QProvider (line 15874) | function $$QProvider() {
function qFactory (line 15890) | function qFactory(nextTick, exceptionHandler) {
function $$RAFProvider (line 16243) | function $$RAFProvider() { //rAF
function $RootScopeProvider (line 16340) | function $RootScopeProvider() {
function $$SanitizeUriProvider (line 17659) | function $$SanitizeUriProvider() {
function adjustMatcher (line 17750) | function adjustMatcher(matcher) {
function adjustMatchers (line 17778) | function adjustMatchers(matchers) {
function $SceDelegateProvider (line 17856) | function $SceDelegateProvider() {
function $SceProvider (line 18393) | function $SceProvider() {
function $SnifferProvider (line 18805) | function $SnifferProvider() {
function $TemplateRequestProvider (line 18893) | function $TemplateRequestProvider() {
function $$TestabilityProvider (line 18991) | function $$TestabilityProvider() {
function $TimeoutProvider (line 19106) | function $TimeoutProvider() {
function urlResolve (line 19257) | function urlResolve(url) {
function urlIsSameOrigin (line 19291) | function urlIsSameOrigin(requestUrl) {
function $WindowProvider (line 19338) | function $WindowProvider() {
function $$CookieReader (line 19351) | function $$CookieReader($document) {
function $$CookieReaderProvider (line 19393) | function $$CookieReaderProvider() {
function $FilterProvider (line 19497) | function $FilterProvider($provide) {
function filterFilter (line 19687) | function filterFilter() {
function createPredicateFn (line 19724) | function createPredicateFn(expression, comparator, matchAgainstAnyProp) {
function deepCompare (line 19761) | function deepCompare(actual, expected, comparator, matchAgainstAnyProp, ...
function getTypeForFilter (line 19811) | function getTypeForFilter(val) {
function currencyFilter (line 19872) | function currencyFilter($locale) {
function numberFilter (line 19946) | function numberFilter($locale) {
function parse (line 19971) | function parse(numStr) {
function roundNumber (line 20026) | function roundNumber(parsedNumber, fractionSize, minFrac, maxFrac) {
function formatNumber (line 20101) | function formatNumber(number, pattern, groupSep, decimalSep, fractionSiz...
function padNumber (line 20167) | function padNumber(num, digits, trim, negWrap) {
function dateGetter (line 20186) | function dateGetter(name, size, offset, trim, negWrap) {
function dateStrGetter (line 20198) | function dateStrGetter(name, shortForm, standAlone) {
function timeZoneGetter (line 20208) | function timeZoneGetter(date, formats, offset) {
function getFirstThursdayOfYear (line 20218) | function getFirstThursdayOfYear(year) {
function getThursdayThisWeek (line 20226) | function getThursdayThisWeek(datetime) {
function weekGetter (line 20232) | function weekGetter(size) {
function ampmGetter (line 20244) | function ampmGetter(date, formats) {
function eraGetter (line 20248) | function eraGetter(date, formats) {
function longEraGetter (line 20252) | function longEraGetter(date, formats) {
function dateFilter (line 20388) | function dateFilter($locale) {
function jsonFilter (line 20495) | function jsonFilter() {
function limitToFilter (line 20624) | function limitToFilter() {
function orderByFilter (line 20846) | function orderByFilter($parse) {
function ngDirective (line 20967) | function ngDirective(directive) {
function defaultLinkFn (line 21346) | function defaultLinkFn(scope, element, attr) {
function nullFormRenameControl (line 21448) | function nullFormRenameControl(control, name) {
function FormController (line 21496) | function FormController(element, attrs, $scope, $animate, $interpolate) {
function getSetter (line 21970) | function getSetter(expression) {
function stringBasedInputType (line 23077) | function stringBasedInputType(ctrl) {
function textInputType (line 23083) | function textInputType(scope, element, attr, ctrl, $sniffer, $browser) {
function baseInputType (line 23088) | function baseInputType(scope, element, attr, ctrl, $sniffer, $browser) {
function weekParser (line 23198) | function weekParser(isoWeek, existingDate) {
function createDateParser (line 23230) | function createDateParser(regexp, mapping) {
function createDateInputType (line 23280) | function createDateInputType(type, regexp, parseDate, format) {
function badInputChecker (line 23352) | function badInputChecker(scope, element, attr, ctrl) {
function numberInputType (line 23363) | function numberInputType(scope, element, attr, ctrl, $sniffer, $browser) {
function urlInputType (line 23417) | function urlInputType(scope, element, attr, ctrl, $sniffer, $browser) {
function emailInputType (line 23430) | function emailInputType(scope, element, attr, ctrl, $sniffer, $browser) {
function radioInputType (line 23443) | function radioInputType(scope, element, attr, ctrl) {
function parseConstantExpr (line 23465) | function parseConstantExpr($parse, context, name, expression, fallback) {
function checkboxInputType (line 23478) | function checkboxInputType(scope, element, attr, ctrl, $sniffer, $browse...
function classDirective (line 24061) | function classDirective(name, selector) {
function processParseErrors (line 26665) | function processParseErrors() {
function processSyncValidators (line 26685) | function processSyncValidators() {
function processAsyncValidators (line 26701) | function processAsyncValidators() {
function setValidity (line 26727) | function setValidity(name, isValid) {
function validationDone (line 26733) | function validationDone(allValid) {
function writeToModelIfNeeded (line 26813) | function writeToModelIfNeeded() {
function addSetValidityMethod (line 27389) | function addSetValidityMethod(context) {
function isObjectEmpty (line 27483) | function isObjectEmpty(obj) {
function parseOptionsExpression (line 27775) | function parseOptionsExpression(optionsExp, selectElement, scope) {
function ngOptionsPostLink (line 27937) | function ngOptionsPostLink(scope, selectElement, attr, ctrls) {
function updateElementText (line 28469) | function updateElementText(newText) {
function ngTranscludeCloneAttachFn (line 29795) | function ngTranscludeCloneAttachFn(clone) {
function chromeHack (line 29867) | function chromeHack(optionElement) {
function selectPreLink (line 30229) | function selectPreLink(scope, element, attr, ctrls) {
function selectPostLink (line 30293) | function selectPostLink(scope, element, attrs, ctrls) {
function getDecimals (line 30721) | function getDecimals(n) {
function getVF (line 30727) | function getVF(n, opt_precision) {
FILE: public/js/calculator.js
function change (line 161) | function change() {
function transitionGrouped (line 171) | function transitionGrouped() {
function transitionStacked (line 189) | function transitionStacked() {
function removePopovers (line 227) | function removePopovers() {
function showPopover (line 233) | function showPopover(d) {
FILE: public/js/commonFramework-2c9795240d.js
function _objectWithoutProperties (line 2) | function _objectWithoutProperties(e, n) {
function _objectWithoutProperties (line 8) | function _objectWithoutProperties(e, n) {
function n (line 266) | function n(e) {
function t (line 269) | function t(e) {
function n (line 757) | function n(e) {
function n (line 815) | function n(e) {
function t (line 824) | function t(e) {
function o (line 834) | function o(e) {
function r (line 845) | function r(e) {
function i (line 856) | function i(e) {
function a (line 874) | function a(e) {
function l (line 880) | function l(e) {
FILE: public/js/commonFramework-2f0be7f94b.js
function _objectWithoutProperties (line 1) | function _objectWithoutProperties(e,n){var t={};for(var o in e)n.indexOf...
function _objectWithoutProperties (line 1) | function _objectWithoutProperties(e,n){var t={};for(var o in e)n.indexOf...
function n (line 1) | function n(e){return s(d(e))}
function t (line 1) | function t(e){return u(p(e))}
function n (line 1) | function n(e){e.preventDefault();var n=l.editor.getValue();t("#submit-ch...
function n (line 1) | function n(e){var n=!1,t=0;return e.each(function(e){var n=c(this);n.has...
function t (line 1) | function t(e){var n=e.length,t=!1,o=0;return e.each(function(e){var t=c(...
function o (line 1) | function o(e){e.preventDefault();var t=n(c(d));c(this).parent().parent()...
function r (line 1) | function r(e){e.preventDefault();var n=t(c(d));c(this).parent().parent()...
function i (line 1) | function i(e){var n=u.challengeSeed[0]||{stepIndex:[]},t=c(this),o=+t.at...
function a (line 1) | function a(e){e.preventDefault(),c(w).modal("show"),c(w+".modal-header")...
function l (line 1) | function l(e){e.preventDefault(),c("#submit-challenge").attr("disabled",...
FILE: public/js/commonFramework-64e637bbe5.js
function encodeFcc (line 361) | function encodeFcc(val) {
function decodeFcc (line 365) | function decodeFcc(val) {
function _objectWithoutProperties (line 989) | function _objectWithoutProperties(obj, keys) { var target = {}; for (var...
function submitChallengeHandler (line 1044) | function submitChallengeHandler(e) {
function getPreviousStep (line 1119) | function getPreviousStep($challengeSteps) {
function getNextStep (line 1134) | function getNextStep($challengeSteps) {
function handlePrevStepClick (line 1150) | function handlePrevStepClick(e) {
function handleNextStepClick (line 1164) | function handleNextStepClick(e) {
function handleActionClick (line 1178) | function handleActionClick(e) {
function handleFinishClick (line 1209) | function handleFinishClick(e) {
function handleSubmitClick (line 1216) | function handleSubmitClick(e) {
function _objectWithoutProperties (line 1266) | function _objectWithoutProperties(obj, keys) { var target = {}; for (var...
FILE: public/js/commonFramework-e9a2482e6b.js
function encodeFcc (line 361) | function encodeFcc(val) {
function decodeFcc (line 365) | function decodeFcc(val) {
function _objectWithoutProperties (line 989) | function _objectWithoutProperties(obj, keys) { var target = {}; for (var...
function submitChallengeHandler (line 1045) | function submitChallengeHandler(e) {
function getPreviousStep (line 1120) | function getPreviousStep($challengeSteps) {
function getNextStep (line 1135) | function getNextStep($challengeSteps) {
function handlePrevStepClick (line 1151) | function handlePrevStepClick(e) {
function handleNextStepClick (line 1165) | function handleNextStepClick(e) {
function handleActionClick (line 1179) | function handleActionClick(e) {
function handleFinishClick (line 1210) | function handleFinishClick(e) {
function handleSubmitClick (line 1217) | function handleSubmitClick(e) {
function _objectWithoutProperties (line 1267) | function _objectWithoutProperties(obj, keys) { var target = {}; for (var...
FILE: public/js/commonFramework.js
function encodeFcc (line 361) | function encodeFcc(val) {
function decodeFcc (line 365) | function decodeFcc(val) {
function _objectWithoutProperties (line 989) | function _objectWithoutProperties(obj, keys) { var target = {}; for (var...
function submitChallengeHandler (line 1044) | function submitChallengeHandler(e) {
function getPreviousStep (line 1119) | function getPreviousStep($challengeSteps) {
function getNextStep (line 1134) | function getNextStep($challengeSteps) {
function handlePrevStepClick (line 1150) | function handlePrevStepClick(e) {
function handleNextStepClick (line 1164) | function handleNextStepClick(e) {
function handleActionClick (line 1178) | function handleActionClick(e) {
function handleFinishClick (line 1209) | function handleFinishClick(e) {
function handleSubmitClick (line 1216) | function handleSubmitClick(e) {
function _objectWithoutProperties (line 1266) | function _objectWithoutProperties(obj, keys) { var target = {}; for (var...
FILE: public/js/echarts-all-3.js
function e (line 1) | function e(n){if(i[n])return i[n].exports;var r=i[n]={exports:{},id:n,lo...
function i (line 1) | function i(t){if("object"==typeof t&&null!==t){var e=t;if(t instanceof A...
function n (line 1) | function n(t,e,r){if(!S(e)||!S(t))return r?i(e):t;for(var o in e)if(e.ha...
function r (line 1) | function r(t,e){for(var i=t[0],r=1,o=t.length;o>r;r++)i=n(i,t[r],e);retu...
function o (line 1) | function o(t,e){for(var i in e)e.hasOwnProperty(i)&&(t[i]=e[i]);return t}
function a (line 1) | function a(t,e,i){for(var n in e)e.hasOwnProperty(n)&&(i?null!=e[n]:null...
function s (line 1) | function s(){return document.createElement("canvas")}
function l (line 1) | function l(){return C||(C=V.createCanvas().getContext("2d")),C}
function u (line 1) | function u(t,e){if(t){if(t.indexOf)return t.indexOf(e);for(var i=0,n=t.l...
function h (line 1) | function h(t,e){function i(){}var n=t.prototype;i.prototype=e.prototype,...
function c (line 1) | function c(t,e,i){t="prototype"in t?t.prototype:t,e="prototype"in e?e.pr...
function d (line 1) | function d(t){return t?"string"==typeof t?!1:"number"==typeof t.length:v...
function f (line 1) | function f(t,e,i){if(t&&e)if(t.forEach&&t.forEach===z)t.forEach(e,i);els...
function p (line 1) | function p(t,e,i){if(t&&e){if(t.map&&t.map===R)return t.map(e,i);for(var...
function g (line 1) | function g(t,e,i,n){if(t&&e){if(t.reduce&&t.reduce===N)return t.reduce(e...
function v (line 1) | function v(t,e,i){if(t&&e){if(t.filter&&t.filter===O)return t.filter(e,i...
function m (line 1) | function m(t,e,i){if(t&&e)for(var n=0,r=t.length;r>n;n++)if(e.call(i,t[n...
function y (line 1) | function y(t,e){var i=E.call(arguments,2);return function(){return t.app...
function x (line 1) | function x(t){var e=E.call(arguments,1);return function(){return t.apply...
function _ (line 1) | function _(t){return"[object Array]"===P.call(t)}
function b (line 1) | function b(t){return"function"==typeof t}
function w (line 1) | function w(t){return"[object String]"===P.call(t)}
function S (line 1) | function S(t){var e=typeof t;return"function"===e||!!t&&"object"==e}
function M (line 1) | function M(t){return!!D[P.call(t)]}
function T (line 1) | function T(t){return t&&1===t.nodeType&&"string"==typeof t.nodeName}
function A (line 1) | function A(t){for(var e=0,i=arguments.length;i>e;e++)if(null!=arguments[...
function I (line 1) | function I(){return Function.call.apply(E,arguments)}
function L (line 1) | function L(t,e){if(!t)throw new Error(e)}
function n (line 1) | function n(t){return function(e,i,n){e=e&&e.toLowerCase(),P.prototype[t]...
function r (line 1) | function r(){P.call(this)}
function o (line 1) | function o(t,e,i){function n(t,e){return t.prio-e.prio}i=i||{},"string"=...
function a (line 1) | function a(t,e){var i=this._model;i&&i.eachComponent({mainType:"series",...
function s (line 1) | function s(t,e,i){var n=this._api;z(this._componentsViews,function(r){va...
function l (line 1) | function l(t,e){for(var i="component"===t,n=i?this._componentsViews:this...
function u (line 1) | function u(t,e){z(Y,function(i){i.func(t,e)})}
function h (line 1) | function h(t){var e={};t.eachSeries(function(t){var i=t.get("stack"),n=t...
function c (line 1) | function c(t,e){var i=this._api;z(Q,function(n){n.isLayout&&n.func(t,i,e...
function d (line 1) | function d(t,e){var i=this._api;t.clearColorPalette(),t.eachSeries(funct...
function f (line 1) | function f(t,e){var i=this._api;z(this._componentsViews,function(n){var ...
function p (line 1) | function p(t,e){var i=t.storage,n=0;i.traverse(function(t){t.isGroup||n+...
function g (line 1) | function g(t,e){var i=0;e.group.traverse(function(t){"group"===t.type||t...
function v (line 1) | function v(t,e){var i=t.get("z"),n=t.get("zlevel");e.group.traverse(func...
function m (line 1) | function m(t){function e(t,e){for(var i=0;i<t.length;i++){var n=t[i];n[o...
function n (line 10) | function n(t){return null!=t&&"none"!=t}
function r (line 10) | function r(t){return"string"==typeof t?_.lift(t,-.1):t}
function o (line 10) | function o(t){if(t.__hoverStlDirty){var e=t.style.stroke,i=t.style.fill,...
function a (line 10) | function a(t){t.__isHover||(o(t),t.useHoverLayer?t.__zr&&t.__zr.addHover...
function s (line 10) | function s(t){if(t.__isHover){var e=t.__normalStl;t.useHoverLayer?t.__zr...
function l (line 10) | function l(t){"group"===t.type?t.traverse(function(t){"group"!==t.type&&...
function u (line 10) | function u(t){"group"===t.type?t.traverse(function(t){"group"!==t.type&&...
function h (line 10) | function h(t,e){t.__hoverStl=t.hoverStyle||e||{},t.__hoverStlDirty=!0,t....
function c (line 10) | function c(){!this.__isEmphasis&&l(this)}
function d (line 10) | function d(){!this.__isEmphasis&&u(this)}
function f (line 10) | function f(){this.__isEmphasis=!0,l(this)}
function p (line 10) | function p(){this.__isEmphasis=!1,u(this)}
function g (line 10) | function g(t,e,i,n,r,o){"function"==typeof r&&(o=r,r=null);var a=n&&(n.i...
function r (line 10) | function r(t){var e={};return t.traverse(function(t){!t.isGroup&&t.anid&...
function o (line 10) | function o(t){var e={position:w.clone(t.position),rotation:t.rotation};r...
function i (line 10) | function i(t){return t.replace(/^\s+/,"").replace(/\s+$/,"")}
function n (line 10) | function n(t){r.call(this,t),this.path=new a}
function n (line 10) | function n(t,e,i,n){this.x=t,this.y=e,this.width=i,this.height=n}
function n (line 10) | function n(t,e,i){this.parentModel=e,this.ecModel=i,this.option=t}
function n (line 10) | function n(t){var e=[];return o.each(h.getClassesByMainType(t),function(...
function i (line 10) | function i(t,e,i){for(var n=0,r=t.length;r>n;n++)for(var o=t[n].seriesId...
function n (line 10) | function n(t,e){var i=[];for(var r in t)if(t.hasOwnProperty(r)&&null!=t[...
function i (line 10) | function i(t){var e={},i={},n=t.match(/Firefox\/([\d.]+)/),r=t.match(/MS...
function n (line 10) | function n(t,e,i,n,r){var o=0,a=0;null==n&&(n=1/0),null==r&&(r=1/0);var ...
function n (line 10) | function n(n){var r={},s=0,l={},h=0,c=i.ignoreSize?1:2;if(u(n,function(e...
function o (line 10) | function o(t,e){return t.hasOwnProperty(e)}
function a (line 10) | function a(t,e){return null!=t[e]&&"auto"!==t[e]}
function s (line 10) | function s(t,e,i){u(t,function(t){e[t]=i[t]})}
function n (line 10) | function n(t){return d.isArray(t)||(t=[t]),t}
function r (line 10) | function r(t,e){var i=t.dimensions,n=new m(d.map(i,t.getDimensionInfo,t)...
function o (line 11) | function o(t){return n.map(t,function(t,i){var n=a.getDimensionInfo(i),o...
function n (line 11) | function n(t,e){var i=t+":"+e;if(l[i])return l[i];for(var n=(t+"").split...
function r (line 11) | function r(t,e,i,r){var o=((t||"")+"").split("\n").length,a=n(t,e),s=n("...
function o (line 11) | function o(t,e,i,n){var r=e.x,o=e.y,a=e.height,s=e.width,l=i.height,u=a/...
function a (line 11) | function a(t,e,i,r,o){if(!e)return"";o=o||{},r=f(r,"...");for(var a=f(o....
function s (line 11) | function s(t,e,i,n){for(var r=0,o=0,a=t.length;a>o&&e>r;o++){var s=t.cha...
function n (line 11) | function n(t){return t>-w&&w>t}
function r (line 11) | function r(t){return t>w||-w>t}
function o (line 11) | function o(t,e,i,n,r){var o=1-r;return o*o*(o*t+3*r*e)+r*r*(r*n+3*o*i)}
function a (line 11) | function a(t,e,i,n,r){var o=1-r;return 3*(((e-t)*o+2*(i-e)*r)*o+(n-i)*r*r)}
function s (line 11) | function s(t,e,i,r,o,a){var s=r+3*(e-i)-t,l=3*(i-2*e+t),u=3*(e-t),h=t-o,...
function l (line 11) | function l(t,e,i,o,a){var s=6*i-12*e+6*t,l=9*e+3*o-3*t-9*i,u=3*e-3*t,h=0...
function u (line 11) | function u(t,e,i,n,r,o){var a=(e-t)*r+t,s=(i-e)*r+e,l=(n-i)*r+i,u=(s-a)*...
function h (line 11) | function h(t,e,i,n,r,a,s,l,u,h,c){var d,f,p,g,v,m=.005,y=1/0;A[0]=u,A[1]...
function c (line 11) | function c(t,e,i,n){var r=1-n;return r*(r*t+2*n*e)+n*n*i}
function d (line 11) | function d(t,e,i,n){return 2*((1-n)*(e-t)+n*(i-e))}
function f (line 11) | function f(t,e,i,o,a){var s=t-2*e+i,l=2*(e-t),u=t-o,h=0;if(n(s)){if(r(l)...
function p (line 11) | function p(t,e,i){var n=t+i-2*e;return 0===n?.5:(t-e)/n}
function g (line 11) | function g(t,e,i,n,r){var o=(e-t)*n+t,a=(i-e)*n+e,s=(a-o)*n+o;r[0]=t,r[1...
function v (line 11) | function v(t,e,i,n,r,o,a,s,l){var u,h=.005,d=1/0;A[0]=a,A[1]=s;for(var f...
function i (line 11) | function i(t){return t=Math.round(t),0>t?0:t>255?255:t}
function n (line 11) | function n(t){return t=Math.round(t),0>t?0:t>360?360:t}
function r (line 11) | function r(t){return 0>t?0:t>1?1:t}
function o (line 11) | function o(t){return i(t.length&&"%"===t.charAt(t.length-1)?parseFloat(t...
function a (line 11) | function a(t){return r(t.length&&"%"===t.charAt(t.length-1)?parseFloat(t...
function s (line 11) | function s(t,e,i){return 0>i?i+=1:i>1&&(i-=1),1>6*i?t+(e-t)*i*6:1>2*i?e:...
function l (line 11) | function l(t,e,i){return t+(e-t)*i}
function u (line 11) | function u(t){if(t){t+="";var e=t.replace(/ /g,"").toLowerCase();if(e in...
function h (line 11) | function h(t){var e=(parseFloat(t[0])%360+360)%360/360,n=a(t[1]),r=a(t[2...
function c (line 11) | function c(t){if(t){var e,i,n=t[0]/255,r=t[1]/255,o=t[2]/255,a=Math.min(...
function d (line 11) | function d(t,e){var i=u(t);if(i){for(var n=0;3>n;n++)0>e?i[n]=i[n]*(1-e)...
function f (line 11) | function f(t,e){var i=u(t);return i?((1<<24)+(i[0]<<16)+(i[1]<<8)+ +i[2]...
function p (line 11) | function p(t,e,n){if(e&&e.length&&t>=0&&1>=t){n=n||[0,0,0,0];var r=t*(e....
function g (line 11) | function g(t,e,n){if(e&&e.length&&t>=0&&1>=t){var o=t*(e.length-1),a=Mat...
function v (line 11) | function v(t,e,i,r){return t=u(t),t?(t=c(t),null!=e&&(t[0]=n(e)),null!=i...
function m (line 11) | function m(t,e){return t=u(t),t&&null!=e?(t[3]=r(e),y(t,"rgba")):void 0}
function y (line 11) | function y(t,e){var i=t[0]+","+t[1]+","+t[2];return"rgba"!==e&&"hsva"!==...
function n (line 11) | function n(t,e){var i=o.slice(arguments,2);return this.superClass.protot...
function r (line 11) | function r(t,e,i){return this.superClass.prototype[e].apply(t,i)}
function i (line 11) | function i(t){var e=n[t.main];return e&&e[l]||(e=n[t.main]={},e[l]=!0),e}
function i (line 11) | function i(){this._coordinateSystems=[]}
function n (line 11) | function n(t){return t.getBoundingClientRect?t.getBoundingClientRect():{...
function r (line 11) | function r(t,e,i){var r=n(t);return i=i||{},i.zrX=e.clientX-r.left,i.zrY...
function o (line 11) | function o(t,e){if(e=e||window.event,null!=e.zrX)return e;var i=e.type,n...
function a (line 11) | function a(t,e,i){u?t.addEventListener(e,i):t.attachEvent("on"+e,i)}
function s (line 11) | function s(t,e,i){u?t.removeEventListener(e,i):t.detachEvent("on"+e,i)}
function n (line 11) | function n(){this.group=new a,this.uid=s.getUID("viewChart")}
function r (line 11) | function r(t,e){if(t&&(t.trigger(e),"group"===t.type))for(var i=0;i<t.ch...
function o (line 11) | function o(t,e,i){var n=e&&e.dataIndex,o=e&&e.name;if(null!=n)for(var a=...
function n (line 12) | function n(t,e,i,n){if(!e)return t;var s=r(e[0]),l=o.isArray(s)&&s.lengt...
function r (line 12) | function r(t){return o.isArray(t)?t:o.isObject(t)?t.value:t}
function n (line 12) | function n(){this._extent=[1/0,-(1/0)],this._interval=0,this.init&&this....
function n (line 12) | function n(t){for(var e=0;e<t.length&&null==t[e];)e++;return t[e]}
function r (line 12) | function r(t){var e=n(t);return null!=e&&!c.isArray(p(e))}
function o (line 12) | function o(t,e,i){t=t||[];var n=e.get("coordinateSystem"),o=v[n],a=f.get...
function a (line 12) | function a(t){return"category"!==t&&"time"!==t}
function s (line 12) | function s(t){return"category"===t?"ordinal":"time"===t?"time":"float"}
function l (line 12) | function l(t,e){var i,n=[],r=t&&t.dimensions[t.categoryIndex];if(r&&(i=t...
function n (line 12) | function n(t){t=t||{},a.call(this,t);for(var e in t)t.hasOwnProperty(e)&...
function n (line 12) | function n(t){this.group=new o.Group,this._symbolCtor=t||a}
function r (line 12) | function r(t,e,i){var n=t.getItemLayout(e);return n&&!isNaN(n[0])&&!isNa...
function n (line 12) | function n(t){var e={};return c(["start","end","startValue","endValue","...
function r (line 12) | function r(t,e,i,n){null!=i[e]&&null==i[t]&&(n[t]=null)}
function t (line 12) | function t(t,e,i,n){for(var r,o=0;o<i.length;o++)if(i[o].model===t){r=i[...
function n (line 12) | function n(t,e){var i=t[1]-t[0],n=e,r=i/n/2;t[0]+=r,t[1]-=r}
function i (line 12) | function i(t){var i={},a=[];return n.each(t,function(s){var l=r(i,s),u=l...
function r (line 12) | function r(t,e){return t[e]||(t[e]={predecessor:[],successor:[]}),t[e]}
function o (line 12) | function o(t,e){var i=[];return n.each(t,function(t){n.indexOf(e,t)>=0&&...
function a (line 12) | function a(t){u[t].entryCount--,0===u[t].entryCount&&h.push(t)}
function s (line 12) | function s(t){c[t]=!0,a(t)}
function i (line 12) | function i(t){for(var e=0;t>=h;)e|=1&t,t>>=1;return t+e}
function n (line 12) | function n(t,e,i,n){var o=e+1;if(o===i)return 1;if(n(t[o++],t[e])<0){for...
function r (line 12) | function r(t,e,i){for(i--;i>e;){var n=t[e];t[e++]=t[i],t[i--]=n}}
function o (line 12) | function o(t,e,i,n,r){for(n===e&&n++;i>n;n++){for(var o,a=t[n],s=e,l=n;l...
function a (line 12) | function a(t,e,i,n,r,o){var a=0,s=0,l=1;if(o(t,e[i+r])>0){for(s=n-r;s>l&...
function s (line 12) | function s(t,e,i,n,r,o){var a=0,s=0,l=1;if(o(t,e[i+r])<0){for(s=r+1;s>l&...
function l (line 12) | function l(t,e){function i(t,e){h[y]=t,f[y]=e,y+=1}function n(){for(;y>1...
function u (line 12) | function u(t,e,r,a){r||(r=0),a||(a=t.length);var s=a-r;if(!(2>s)){var u=...
function i (line 12) | function i(t){return t}
function n (line 12) | function n(t,e,n,r){this._old=t,this._new=e,this._oldKeyGetter=n||i,this...
function r (line 12) | function r(t,e,i,n){for(var r=0;r<t.length;r++){var o=n(t[r],r),a=e[o];n...
function n (line 12) | function n(t){r.call(this,t)}
function n (line 12) | function n(t){return t instanceof Array||(t=[+t,+t]),t}
function r (line 12) | function r(t,e,i){l.Group.call(this),this.updateData(t,e,i)}
function o (line 12) | function o(t,e){this.parent.drift(t,e)}
function n (line 13) | function n(t){var e={componentType:t.mainType};return e[t.mainType+"Inde...
function r (line 13) | function r(t,e,i){var n,r,o=d(e-t.rotation);return f(o)?(r=i>0?"top":"bo...
function o (line 13) | function o(t,e,i,n){var r,o,a=d(i-t.rotation),s=n[0]>n[1],l="start"===e&...
function a (line 13) | function a(t){var e=t.get("tooltip");return t.get("silent")||!(t.get("tr...
function t (line 13) | function t(t,e){var i=t&&t.getBoundingRect().clone(),n=e&&e.getBoundingR...
function n (line 13) | function n(t){return a.isObject(t)&&null!=t.value?t.value:t}
function r (line 13) | function r(){return"category"===this.get("type")&&a.map(this.get("data")...
function o (line 13) | function o(){return s.getFormattedLabels(this.axis,this.get("axisLabel.f...
function n (line 13) | function n(t,e){return e.type||(e.data?"category":"value")}
function n (line 13) | function n(t,e,i){return t.findGridModel()===e}
function r (line 13) | function r(t){var e,i=t.model,n=i.getFormattedLabels(),r=1,o=n.length;o>...
function o (line 13) | function o(t,e,i){this._coordsMap={},this._coordsList=[],this._axesMap={...
function a (line 13) | function a(t,e){var i=t.getExtent(),n=i[0]+i[1];t.toGlobalCoord="x"===t....
function s (line 13) | function s(t,e){return c.map(y,function(i){var n=e.queryComponents({main...
function l (line 13) | function l(t){return"cartesian2d"===t.get("coordinateSystem")}
function i (line 13) | function i(t){var e=n[t];for(var i in e){var r=e[i];if(r&&("category"===...
function i (line 13) | function i(){p(o,function(t){var e=t.isHorizontal(),i=e?[0,n.width]:[0,n...
function r (line 13) | function r(i){return function(r,l){if(n(r,t,e)){var u=r.get("position");...
function i (line 13) | function i(t,e,i){p(i.coordDimToDataDim(e.dim),function(i){e.scale.union...
function n (line 13) | function n(t,e){return t[e]}
function r (line 13) | function r(t,e,i){t[e]=i}
function o (line 13) | function o(t,e,i){return(e-t)*i+t}
function a (line 13) | function a(t,e,i){return i>.5?e:t}
function s (line 13) | function s(t,e,i,n,r){var a=t.length;if(1==r)for(var s=0;a>s;s++)n[s]=o(...
function l (line 13) | function l(t,e,i){var n=t.length,r=e.length;if(n!==r){var o=n>r;if(o)t.l...
function u (line 13) | function u(t,e,i){if(t===e)return!0;var n=t.length;if(n!==e.length)retur...
function h (line 13) | function h(t,e,i,n,r,o,a,s,l){var u=t.length;if(1==l)for(var h=0;u>h;h++...
function c (line 13) | function c(t,e,i,n,r,o,a){var s=.5*(i-t),l=.5*(n-e);return(2*(e-i)+s+l)*...
function d (line 13) | function d(t){if(y(t)){var e=t.length;if(y(t[0])){for(var i=[],n=0;e>n;n...
function f (line 13) | function f(t){return t[0]=Math.floor(t[0]),t[1]=Math.floor(t[1]),t[2]=Ma...
function p (line 13) | function p(t,e,i,n,r){var d=t._getter,p=t._setter,m="spline"===e,x=n.len...
function i (line 13) | function i(t,e,i){var n=e.x,r=e.x2,o=e.y,a=e.y2;e.global||(n=n*i.width+i...
function n (line 13) | function n(t,e,i){var n=i.width,r=i.height,o=Math.min(n,r),a=e.x,s=e.y,l...
function n (line 13) | function n(t){r.defaultEmphasis(t.label,r.LABEL_OPTIONS)}
function n (line 13) | function n(t){return!(isNaN(parseFloat(t.x))&&isNaN(parseFloat(t.y)))}
function r (line 13) | function r(t){return!isNaN(parseFloat(t.x))&&!isNaN(parseFloat(t.y))}
function o (line 13) | function o(t,e,i){var n=-1;do n=Math.max(l.getPrecision(t.get(e,i)),n),t...
function a (line 13) | function a(t,e,i,n,r,a){var s=[],l=v(e,n,t),u=e.indexOfNearest(n,l,!0);s...
function n (line 13) | function n(t){var e=t.pieceList;t.hasSpecialVisual=!1,p.each(e,function(...
function r (line 13) | function r(t){var e=t.categories,i=t.visual,n=t.categoryMap={};if(m(e,fu...
function o (line 13) | function o(t,e){var i=t.visual,n=[];p.isObject(i)?m(i,function(t){n.push...
function a (line 13) | function a(t){return{applyVisual:function(e,i,n){e=this.mapValueToVisual...
function s (line 13) | function s(t,e){var i=this.option.visual;return i[Math.round(v(e,[0,1],[...
function l (line 13) | function l(t){return function(e,i,n){n(t,this.mapValueToVisual(e))}}
function u (line 13) | function u(t){var e=this.option.visual;return e[this.option.loop&&t!==x?...
function h (line 13) | function h(){return this.option.visual[0]}
function c (line 13) | function c(t){return{linear:function(e){return v(e,t,this.option.visual,...
function d (line 13) | function d(t){var e=this.option,i=e.pieceList;if(e.hasSpecialVisual){var...
function f (line 13) | function f(t,e,i){return t?i>=e:i>e}
function n (line 14) | function n(e,i){var n=Math.abs(e-t);o>n&&(o=n,r=i)}
function n (line 14) | function n(t,e){return"string"==typeof t?t.lastIndexOf("%")>=0?parseFloa...
function n (line 14) | function n(t){delete d[t]}
function n (line 23) | function n(t){if(!t.target||!t.target.draggable){var e=t.offsetX,i=t.off...
function r (line 23) | function r(t){if(this._dragging&&(d.stop(t.event),"pinch"!==t.gestureEve...
function o (line 23) | function o(t){this._dragging=!1}
function a (line 23) | function a(t){var e=t.wheelDelta>0?1.1:1/1.1;l.call(this,t,e,t.offsetX,t...
function s (line 23) | function s(t){if(!f.isTaken(this._zr,"globalPan")){var e=t.pinchScale>1?...
function l (line 23) | function l(t,e,i,n){var r=this.rectProvider&&this.rectProvider();if(r&&r...
function u (line 23) | function u(t,e,i){this.target=e,this.rectProvider=i,this.zoomLimit,this....
function o (line 23) | function o(t,e,i){var n=e.length?e.slice():[e,e];return e[0]>e[1]&&n.rev...
function n (line 23) | function n(){u=(new Date).getTime(),h=null,t.apply(a,s||[])}
function n (line 23) | function n(t){return t>s||-s>t}
function n (line 23) | function n(t){r.each(o,function(e){this[e]=r.bind(t[e],t)},this)}
function n (line 23) | function n(t,e){var i=t.width>0?1:-1,n=t.height>0?1:-1;e=Math.min(e,Math...
function a (line 23) | function a(e,i){var a=l.getItemLayout(e),s=l.getItemModel(e).get(p)||0;n...
function n (line 23) | function n(t,e,i,n,r){o.setText(t,e,i),t.text=n,"outside"===t.textPositi...
function n (line 23) | function n(t){return"_"+t+"Type"}
function r (line 23) | function r(t,e,i){var n=e.getItemVisual(i,"color"),r=e.getItemVisual(i,t...
function o (line 23) | function o(t){var e=new c({name:"line"});return a(e.shape,t),e}
function a (line 23) | function a(t,e){var i=e[0],n=e[1],r=e[2];t.x1=i[0],t.y1=i[1],t.x2=n[0],t...
function s (line 23) | function s(){var t=this,e=t.childOfName("fromSymbol"),i=t.childOfName("t...
function l (line 23) | function l(t,e,i){d.Group.call(this),this._createLine(t,e,i)}
function n (line 23) | function n(t){return isNaN(t[0])||isNaN(t[1])}
function r (line 23) | function r(t){return!n(t[0])&&!n(t[1])}
function o (line 23) | function o(t){this._ctor=t||s,this.group=new a.Group}
function n (line 23) | function n(t,e){if(t.length===e.length){for(var i=0;i<t.length;i++){var ...
function r (line 23) | function r(t){return"number"==typeof t?t:t?.3:0}
function o (line 23) | function o(t){var e=t.getGlobalExtent();if(t.onBand){var i=t.getBandWidt...
function a (line 23) | function a(t){return t>=0?1:-1}
function s (line 23) | function s(t,e){var i=t.getBaseAxis(),n=t.getOtherAxis(i),r=i.onZero?0:n...
function l (line 23) | function l(t,e){return null!=e.dataIndex?e.dataIndex:null!=e.name?t.inde...
function u (line 23) | function u(t,e,i){var n=o(t.getAxis("x")),r=o(t.getAxis("y")),a=t.getBas...
function h (line 23) | function h(t,e,i){var n=t.getAngleAxis(),r=t.getRadiusAxis(),o=r.getExte...
function c (line 23) | function c(t,e,i){return"polar"===t.type?h(t,e,i):u(t,e,i)}
function d (line 23) | function d(t,e,i){for(var n=e.getBaseAxis(),r="x"===n.dim||"radius"===n....
function f (line 23) | function f(t,e){return Math.max(Math.min(t,e[1]),e[0])}
function p (line 23) | function p(t,e){var i=t.getVisual("visualMeta");if(i&&i.length){for(var ...
function i (line 23) | function i(t){return t>=0?1:-1}
function n (line 23) | function n(t,e,n){for(var r,o=t.getBaseAxis(),a=t.getOtherAxis(o),s=o.on...
function r (line 23) | function r(t,e){var i=[];return e.diff(t).add(function(t){i.push({cmd:"+...
function n (line 23) | function n(t){return isNaN(t[0])||isNaN(t[1])}
function r (line 23) | function r(t,e,i,r,o,a,g,v,m,y,x){for(var _=0,b=i,w=0;r>w;w++){var S=e[b...
function o (line 23) | function o(t,e){var i=[1/0,1/0],n=[-(1/0),-(1/0)];if(e)for(var r=0;r<t.l...
function n (line 23) | function n(t,e,i,n){var o=e.getData(),a=this.dataIndex,s=o.getName(a),l=...
function r (line 23) | function r(t,e,i,n,r){var o=(e.startAngle+e.endAngle)/2,a=Math.cos(o),s=...
function o (line 23) | function o(t,e){function i(){o.ignore=o.hoverIgnore,a.ignore=a.hoverIgnore;
function a (line 24) | function a(t,e,i,n,r){var o=n.getModel("textStyle"),a="inside"===r||"inn...
function n (line 24) | function n(){a.stopAnimation(!0),a.animateTo({shape:{r:c.r+10}},300,"ela...
function o (line 24) | function o(){a.stopAnimation(!0),a.animateTo({shape:{r:c.r}},300,"elasti...
function n (line 24) | function n(t,e,i,n,r,o,a){function s(e,i,n,r){for(var o=e;i>o;o++)if(t[o...
function r (line 24) | function r(t,e,i,r,o,a){for(var s=[],l=[],u=0;u<t.length;u++)t[u].x<e?s....
function n (line 24) | function n(t,e){function i(t,e){var i=n.getAxis(t);return i.toGlobalCoor...
function n (line 24) | function n(t,e,i){i.getAxisProxy(t.name,e).reset(i)}
function r (line 24) | function r(t,e,i){i.getAxisProxy(t.name,e).filterData(i)}
function n (line 24) | function n(t,e){return r.indexOf(e.nodes,t)>=0}
function o (line 24) | function o(t,n){var o=!1;return e(function(e){r.each(i(t,e)||[],function...
function a (line 24) | function a(t,n){n.nodes.push(t),e(function(e){r.each(i(t,e)||[],function...
function r (line 24) | function r(t){!n(t,s)&&o(t,s)&&(a(t,s),l=!0)}
function n (line 24) | function n(t){var e=t[a];return e||(e=t[a]=[{}]),e}
function n (line 24) | function n(t){N.call(this),this._zr=t,this.group=new B.Group,this._brush...
function r (line 24) | function r(t,e){var i=t._zr;t._enableGlobalPan||G.take(i,Q,t._uid),W(t._...
function o (line 24) | function o(t){var e=t._zr;G.release(e,Q,t._uid),W(t._handlers,function(t...
function a (line 24) | function a(t,e){var i=nt[e.brushType].createCover(t,e);return u(i),i.__b...
function s (line 24) | function s(t,e){var i=c(e);return i.endCreating&&(i.endCreating(t,e),u(e...
function l (line 24) | function l(t,e){var i=e.__brushOption;c(e).updateCoverShape(t,e,i.range,i)}
function u (line 24) | function u(t){t.traverse(function(t){t.z=X,t.z2=X})}
function h (line 24) | function h(t,e){c(e).updateCommon(t,e),l(t,e)}
function c (line 24) | function c(t){return nt[t.__brushOption.brushType]}
function d (line 24) | function d(t,e,i){var n=t._panels;if(!n)return!0;var r;return W(n,functi...
function f (line 24) | function f(t,e){var i=t._panels;if(!i)return!0;var n=e.__brushOption.pan...
function p (line 24) | function p(t){var e=t._covers,i=e.length;return W(e,function(e){t.group....
function g (line 24) | function g(t,e){var i=Z(t._covers,function(t){var e=t.__brushOption,i=V....
function v (line 24) | function v(t){var e=t._track;if(!e.length)return!1;var i=e[e.length-1],n...
function m (line 24) | function m(t){var e=t.length-1;return 0>e&&(e=0),[t[0],t[e]]}
function y (line 24) | function y(t,e,i,n){var r=new B.Group;return r.add(new B.Rect({name:"mai...
function x (line 24) | function x(t,e,i,n){var r=n.brushStyle.lineWidth||0,o=j(r,$),a=i[0][0],s...
function _ (line 24) | function _(t,e){var i=e.__brushOption,n=i.transformable,r=e.childAt(0);r...
function b (line 24) | function b(t,e,i,n,r,o,a){var s=e.childOfName(i);s&&s.setShape(D(C(t,e,[...
function w (line 24) | function w(t){return V.defaults({strokeNoScale:!0},t.brushStyle)}
function S (line 24) | function S(t,e,i,n){var r=[q(t,i),q(e,n)],o=[j(t,i),j(e,n)];return[[r[0]...
function M (line 24) | function M(t){return B.getTransform(t.group)}
function T (line 24) | function T(t,e){if(e.length>1){e=e.split("");var i=[T(t,e[0]),T(t,e[1])]...
function A (line 24) | function A(t,e,i,n,r,o,a,s){var l=n.__brushOption,u=t(l.range),c=L(i,o,a...
function I (line 24) | function I(t,e,i,n,r){var o=e.__brushOption.range,a=L(t,i,n);W(o,functio...
function L (line 24) | function L(t,e,i){var n=t.group,r=n.transformCoordToLocal(e,i),o=n.trans...
function C (line 24) | function C(t,e,i){var n=f(t,e);if(n===!0)return V.clone(i);var r=n.getBo...
function D (line 24) | function D(t){var e=q(t[0][0],t[1][0]),i=q(t[0][1],t[1][1]),n=j(t[0][0],...
function P (line 24) | function P(t,e){var i=e.offsetX,n=e.offsetY,r=t._zr;if(t._brushType){for...
function k (line 24) | function k(t){var e=t.event;e.preventDefault&&e.preventDefault()}
function z (line 24) | function z(t,e,i){return t.childOfName("main").contain(e,i)}
function O (line 24) | function O(t,e,i){var n,r=e.offsetX,o=e.offsetY,u=t._creatingCover,h=t._...
function E (line 24) | function E(t){if(this._dragging){k(t);var e=O(this,t,!0);this._dragging=...
function R (line 24) | function R(t){return{createCover:function(e,i){return y(H(A,function(e){...
function e (line 24) | function e(t,e){return(null!=t.id?t.id:o+e)+"-"+t.brushType}
function i (line 24) | function i(t,i){return e(t.__brushOption,i)}
function n (line 24) | function n(e,i){var n=t[e];if(null!=i&&l[i]===d)u[e]=l[i];else{var r=u[e...
function r (line 24) | function r(t){l[t]!==d&&c.group.remove(l[t])}
function n (line 24) | function n(t){return t[0]>t[1]&&t.reverse(),t}
function r (line 24) | function r(t,e){for(var i=!0,n=0;n<h.length;n++){var r=h[n]+"Index";if(t...
function o (line 24) | function o(t,e,i,r){var o=i.coordSys.getAxis(t);return n(a.map([0,1],fun...
function n (line 24) | function n(t){return t[r]||(t[r]={})}
function n (line 24) | function n(t,e,i){r.positionGroup(t,e.getBoxLayoutParams(),{width:i.getW...
function n (line 24) | function n(t){return this._axes[t]}
function n (line 24) | function n(t){o.call(this,t)}
function n (line 24) | function n(t){return t.get("stack")||"__ec_stack_"+t.seriesIndex}
function r (line 24) | function r(t){return t.dim+t.index}
function o (line 24) | function o(t,e){var i={};s.each(t,function(t,e){var o=t.getData(),a=t.co...
function a (line 24) | function a(t,e,i){var a=o(s.filter(e.getSeriesByType(t),function(t){retu...
function n (line 24) | function n(t,e){for(var i in e)_.hasClass(i)||("object"==typeof e[i]?t[i...
function r (line 24) | function r(t){t=t,this.option={},this.option[w]=1,this._componentsMap={}...
function o (line 24) | function o(t,e){c.isArray(e)||(e=e?[e]:[]);var i={};return p(e,function(...
function a (line 24) | function a(t,e){var i={};p(e,function(t,e){var n=t.exist;n&&(i[n.id]=t)}...
function s (line 24) | function s(t,e,i){var n=e.type?e.type:i?i.subType:_.determineSubType(t,e...
function l (line 24) | function l(t){return v(t,function(t){return t.componentIndex})||[]}
function u (line 24) | function u(t,e){return e.hasOwnProperty("subType")?g(t,function(t){retur...
function h (line 24) | function h(t){}
function e (line 24) | function e(e,r){var s=d.normalizeToArray(t[e]),u=d.mappingToExists(n[e],...
function e (line 25) | function e(t){var e=r+"Index",i=r+"Id",n=r+"Name";return t&&(t.hasOwnPro...
function i (line 25) | function i(e){return t.filter?g(e,t.filter):e}
function n (line 25) | function n(t){this._api=t,this._timelineOptions=[],this._mediaList=[],th...
function r (line 25) | function r(t,e,i){var n,r,o=[],a=[],s=t.timeline;if(t.baseOption&&(r=t.b...
function o (line 25) | function o(t,e,i){var n={width:e,height:i,aspectratio:e/i},r=!0;return u...
function a (line 25) | function a(t,e,i){return"min"===i?t>=e:"max"===i?e>=t:t===e}
function s (line 25) | function s(t,e){return t.join(",")===e.join(",")}
function l (line 25) | function l(t,e){e=e||{},d(e,function(e,i){if(null!=e){var n=t[i];if(c.ha...
function n (line 25) | function n(t,e){return t&&t.getShallow(e)}
function n (line 25) | function n(t,e){e=e.split(",");for(var i=t,n=0;n<e.length&&(i=i&&i[e[n]]...
function r (line 25) | function r(t,e,i,n){e=e.split(",");for(var r,o=t,a=0;a<e.length-1;a++)r=...
function o (line 25) | function o(t){c(l,function(e){e[0]in t&&!(e[1]in t)&&(t[e[1]]=t[e[0]])})}
function n (line 25) | function n(t){var e=t&&t.itemStyle;e&&r.each(o,function(i){var n=e.norma...
function e (line 25) | function e(e){var i=(e.visualColorAccessPath||"itemStyle.normal.color")....
function n (line 25) | function n(t,e,i){return{type:t,event:i,target:e,cancelBubble:!1,offsetX...
function r (line 25) | function r(){}
function o (line 25) | function o(t,e,i){if(t[t.rectHover?"rectContain":"contain"](e,i)){for(va...
function n (line 25) | function n(){return!1}
function r (line 25) | function r(t,e,i,n){var r=document.createElement(e),o=i.getWidth(),a=i.g...
function n (line 25) | function n(t){return parseInt(t,10)}
function r (line 25) | function r(t){return t?t.isBuildin?!0:"function"==typeof t.resize&&"func...
function o (line 25) | function o(t){t.__unusedCount++}
function a (line 25) | function a(t){1==t.__unusedCount&&t.clear()}
function s (line 25) | function s(t,e,i){return x.copy(t.getBoundingRect()),t.transform&&x.appl...
function l (line 25) | function l(t,e){if(t==e)return!1;if(!t||!e||t.length!==e.length)return!0...
function u (line 25) | function u(t,e){for(var i=0;i<t.length;i++){var n=t[i],r=n.path;n.setTra...
function h (line 25) | function h(t,e){var i=document.createElement("div"),n=i.style;return n.p...
function t (line 25) | function t(){i===e._progressiveToken&&e.storage&&(e._doPaintList(e.stora...
function i (line 25) | function i(t){var e=o.dpr||1;o.save(),o.globalAlpha=1,o.shadowBlur=0,n._...
function n (line 25) | function n(t,e){return t.zlevel===e.zlevel?t.z===e.z?t.z2-e.z2:t.z-e.z:t...
function t (line 25) | function t(){e._running&&(o(t),!e._paused&&e._update())}
function n (line 25) | function n(t){this._target=t.target,this._life=t.life||1e3,this._delay=t...
function n (line 26) | function n(t,e){return Math.abs(t-e)<x}
function r (line 26) | function r(){var t=b[0];b[0]=b[1],b[1]=t}
function o (line 26) | function o(t,e,i,n,o,a,s,l,u,h){if(h>e&&h>n&&h>a&&h>l||e>h&&n>h&&a>h&&l>...
function a (line 26) | function a(t,e,i,n,r,o,a,s){if(s>e&&s>n&&s>o||e>s&&n>s&&o>s)return 0;var...
function s (line 26) | function s(t,e,i,n,r,o,a,s){if(s-=e,s>i||-i>s)return 0;var l=Math.sqrt(i...
function l (line 26) | function l(t,e,i,r,l){for(var h=0,p=0,g=0,y=0,x=0,_=0;_<t.length;){var b...
function n (line 26) | function n(t){var e=t[1][0]-t[0][0],i=t[1][1]-t[0][1];return Math.sqrt(e...
function r (line 26) | function r(t){return[(t[0][0]+t[1][0])/2,(t[0][1]+t[1][1])/2]}
function n (line 26) | function n(t){return"mousewheel"===t&&d.browser.firefox?"DOMMouseScroll":t}
function r (line 26) | function r(t,e,i){var n=t._gestureMgr;"start"===i&&n.clear();var r=n.rec...
function o (line 26) | function o(t){t._touching=!0,clearTimeout(t._touchTimer),t._touchTimer=s...
function a (line 26) | function a(){return d.touchEventsSupported}
function s (line 26) | function s(t){function e(t,e){return function(){return e._touching?void ...
function l (line 26) | function l(t){function e(e,i){h.each(e,function(e){p(t,n(e),i._handlers[...
function n (line 26) | function n(t,e,i,n,r,o,a){var s=.5*(i-t),l=.5*(n-e);return(2*(e-i)+s+l)*...
function n (line 26) | function n(t,e,i){var n=t.cpx2,r=t.cpy2;return null===n||null===r?[(i?c:...
function s (line 26) | function s(){u--,u||r&&r()}
function i (line 26) | function i(){this.on("mousedown",this._dragStart,this),this.on("mousemov...
function n (line 26) | function n(t,e,i,n,r,o,a,s,l,u,h){var g=l*(p/180),y=f(g)*(t-i)/2+d(g)*(e...
function r (line 26) | function r(t){if(!t)return[];var e,i=t.replace(/-/g," -").replace(/ /g,...
function o (line 26) | function o(t,e){var i,n=r(t);return e=e||{},e.buildPath=function(t){t.se...
function n (line 26) | function n(t,e){var i,n,o,h,c,d,f=t.data,p=r.M,g=r.C,v=r.L,m=r.R,y=r.A,x...
function n (line 26) | function n(t){return null==t.value?t:t.value}
function n (line 26) | function n(t,e){var i,n=this.getBoundingRect(),r=t.get("layoutCenter"),o...
function r (line 26) | function r(t,e){s.each(e.get("geoCoord"),function(e,i){t.addGeoCoord(i,e...
function n (line 26) | function n(t){if(t)for(var e in t)if(t.hasOwnProperty(e))return!0}
function n (line 26) | function n(){var t=function(){};t.prototype.__hidden=t.prototype;var e=n...
function l (line 26) | function l(t){return i.getItemVisual(d,t)}
function u (line 26) | function u(t,e){i.setItemVisual(d,t,e)}
function h (line 26) | function h(t,i){d=null==s?t:i;for(var r=n.call(a,t),o=e[r],h=c[r],f=0,p=...
function n (line 26) | function n(){this.group=new r.Group,this._symbolEl=new a({})}
function n (line 26) | function n(t){return isNaN(+t.cpx1)||isNaN(+t.cpy1)}
function n (line 26) | function n(t,e){var i=[1/0,-(1/0)];return u(e,function(e){var n=e.getDat...
function r (line 26) | function r(t,e,i){var n=i.getAxisModel(),r=n.axis.scale,a=[0,100],s=[t.s...
function o (line 26) | function o(t,e,i){return u(["min","max"],function(n,r){var o=e.get(n,!0)...
function a (line 27) | function a(t,e){var i=t.getAxisModel(),n=t._percentWindow,r=t._valueWind...
function e (line 27) | function e(t){return t>=o[0]&&t<=o[1]}
function n (line 27) | function n(t,e,i,n){e=e.slice();var r=n.axisModels[0];if(r){var a=o(t,r,...
function r (line 27) | function r(t,e,i,n,r,s){i=i.slice();var l=r.axisModels[0];if(l){var u=o(...
function o (line 27) | function o(t,e,i){var n=e.axis,r=i.rectProvider(),o={};return"x"===n.dim...
function a (line 27) | function a(t){var e=[0,100];return!(t[0]<=e[1])&&(t[0]=e[1]),!(t[1]<=e[1...
function n (line 27) | function n(t){return"x"===t?"y":"x"}
function t (line 27) | function t(t){var e=o.getTransform(i.handles[t].parent,this.group),s=o.t...
function n (line 27) | function n(t){var e=t.getZr();return e[p]||(e[p]={})}
function r (line 27) | function r(t,e,i){var n=new c(t.getZr());return n.enable(),n.on("pan",f(...
function o (line 27) | function o(t){h.each(t,function(e,i){e.count||(e.controller.off("pan").o...
function a (line 27) | function a(t,e,i){l(t,function(n){return n.panGetRange(t.controller,e,i)})}
function s (line 27) | function s(t,e,i,n){l(t,function(r){return r.zoomGetRange(t.controller,e...
function l (line 27) | function l(t,e){var i=[];h.each(t.dataZoomInfos,function(t){var n=e(t);n...
function u (line 27) | function u(t,e){t.dispatchAction({type:"dataZoom",batch:e})}
function n (line 27) | function n(t,e){e.dispatchAction({type:"legendToggleSelect",name:t})}
function r (line 27) | function r(t,e,i){var n=i.getZr().storage.getDisplayList()[0];n&&n.useHo...
function o (line 27) | function o(t,e,i){var n=i.getZr().storage.getDisplayList()[0];n&&n.useHo...
function n (line 27) | function n(t,e,i){var n,r={},a="toggleSelected"===t;return i.eachCompone...
function n (line 27) | function n(t){return!isNaN(t)&&!isFinite(t)}
function r (line 27) | function r(t,e,i,r){var o=1-t;return n(e[o])&&n(i[o])}
function o (line 27) | function o(t,e){var i=e.coord[0],n=e.coord[1];return"cartesian2d"===t.ty...
function a (line 27) | function a(t,e,i,r,o){var a,s=r.coordinateSystem,l=t.getItemModel(e),u=h...
function s (line 27) | function s(t,e,i){var n,r,a=["x0","y0","x1","y1"];t?(n=l.map(t&&t.dimens...
function n (line 27) | function n(t){return!isNaN(t)&&!isFinite(t)}
function r (line 27) | function r(t,e,i,r){var o=1-t,a=r.dimensions[t];return n(e[o])&&n(i[o])&...
function o (line 27) | function o(t,e){if("cartesian2d"===t.type){var i=e[0].coord,n=e[1].coord...
function a (line 27) | function a(t,e,i,r,o){var a,s=r.coordinateSystem,l=t.getItemModel(e),u=h...
function s (line 27) | function s(t,e,i){var n;n=t?l.map(t&&t.dimensions,function(t){var i=e.ge...
function r (line 27) | function r(e,i,r){var o=e.getItemModel(i);a(e,i,r,t,n),e.setItemVisual(i...
function n (line 27) | function n(t,e,i){var n=e.coordinateSystem;t.each(function(r){var o,a=t....
function r (line 27) | function r(t,e,i){var n;n=t?a.map(t&&t.dimensions,function(t){var i=e.ge...
function n (line 27) | function n(t){return 0===t.indexOf("my")}
function d (line 28) | function d(o,a){var l,u=y[o],h=y[a],d=v[u],p=new s(d,t,t.ecModel);if(u&&...
function f (line 28) | function f(n,r,s){var l=n.getModel("iconStyle"),u=r.getIcons?r.getIcons(...
function n (line 28) | function n(t){var e={},i=[],n=[];return t.eachRawSeries(function(t){var ...
function r (line 28) | function r(t){var e=[];return p.each(t,function(t,i){var n=t.categoryAxi...
function o (line 28) | function o(t){return p.map(t,function(t){var e=t.getRawData(),i=[t.name]...
function a (line 28) | function a(t){var e=n(t);return{value:p.filter([r(e.seriesGroupByCategor...
function s (line 28) | function s(t){return t.replace(/^\s\s*/,"").replace(/\s\s*$/,"")}
function l (line 28) | function l(t){var e=t.slice(0,t.indexOf("\n"));return e.indexOf(m)>=0?!0...
function u (line 28) | function u(t){for(var e=t.split(/\n+/g),i=s(e.shift()).split(y),n=[],r=p...
function h (line 28) | function h(t){for(var e=t.split(/\n+/g),i=s(e.shift()),n=[],r=0;r<e.leng...
function c (line 28) | function c(t,e){var i=t.split(new RegExp("\n*"+v+"\n*","g")),n={series:[...
function d (line 28) | function d(t){this._dom=null,this.model=t}
function f (line 28) | function f(t,e){return p.map(t,function(t,i){var n=e&&e[i];return p.isOb...
function i (line 28) | function i(){n.removeChild(o),M._dom=null}
function n (line 28) | function n(t,e,i){(this._brushController=new l(i.getZr())).on("brush",s....
function r (line 28) | function r(t){var e={};return s.each(["xAxisIndex","yAxisIndex"],functio...
function o (line 28) | function o(t,e){t.setIconStatus("back",h.count(e)>1?"emphasis":"normal")}
function a (line 28) | function a(t,e,i,n){var o=i._isZoomActive;n&&"takeGlobalCursor"===n.type...
function i (line 28) | function i(t,e,i){var r=n(t,i[t],a);r&&(o[r.id]={dataZoomId:r.id,startVa...
function n (line 28) | function n(t,e,i){var n;return i.eachComponent({mainType:"dataZoom",subT...
function e (line 28) | function e(t,e){if(e){var r=t+"Index",o=e[r];null==o||"all"==o||s.isArra...
function i (line 28) | function i(e,i){var n=t[e];s.isArray(n)||(n=n?[n]:[]),c(n,i)}
function n (line 28) | function n(t){this.model=t}
function n (line 28) | function n(t){this.model=t}
function n (line 28) | function n(t){this.model=t}
function n (line 28) | function n(t){var e="cubic-bezier(0.23, 1, 0.32, 1)",i="left "+t+"s "+e+...
function r (line 28) | function r(t){var e=[],i=t.get("fontSize"),n=t.getTextColor();return n&&...
function o (line 28) | function o(t){t=t;var e=[],i=t.get("transitionDuration"),o=t.get("backgr...
function a (line 28) | function a(t,e){var i=document.createElement("div"),n=e.getZr();this.el=...
function s (line 28) | function s(t,e){function i(t){n(t.target)&&t.preventDefault()}function n...
function n (line 28) | function n(t,e){if(!t||!e)return!1;var i=g.round;return i(t[0])===i(e[0]...
function r (line 28) | function r(t,e,i,n){return{x1:t,y1:e,x2:i,y2:n}}
function o (line 28) | function o(t,e,i,n){return{x:t,y:e,width:i,height:n}}
function a (line 28) | function a(t,e,i,n,r,o){return{cx:t,cy:e,r0:i,r:n,startAngle:r,endAngle:...
function s (line 28) | function s(t,e,i,n,r){var o=i.clientWidth,a=i.clientHeight,s=20;return t...
function l (line 28) | function l(t,e,i){var n=i.clientWidth,r=i.clientHeight,o=5,a=0,s=0,l=e.w...
function u (line 28) | function u(t,e,i,n,r,o,a){var u=a.getWidth(),h=a.getHeight(),c=o&&o.getB...
function h (line 28) | function h(t){var e=t.coordinateSystem,i=t.get("tooltip.trigger",!0);ret...
function a (line 28) | function a(i,n,o){var a="x"===i?r(n[0],o[0],n[0],o[1]):r(o[0],n[1],o[1],...
function s (line 28) | function s(i,n,r){var a=e.getAxis(i),s=a.getBandWidth(),u=r[1]-r[0],h="x...
function o (line 28) | function o(i,n,o){var s=e.getAxis(),u=s.orient,h="horizontal"===u?r(n[0]...
function o (line 28) | function o(i,n,o){var a,s=e.pointToCoord(n);if("angle"===i){var u=e.coor...
function s (line 28) | function s(i,n,r){var o,s=e.getAxis(i),u=s.getBandWidth(),h=e.pointToCoo...
function n (line 28) | function n(t,e){var i=t.get("center"),n=t.get("radius"),r=e.getWidth(),o...
function r (line 28) | function r(t,e){var i=this,n=i.getAngleAxis(),r=i.getRadiusAxis();if(n.s...
function o (line 28) | function o(t,e){if(t.type=e.get("type"),t.scale=l.createScaleByModel(e),...
function i (line 29) | function i(){c&&u&&(c=!1,u.length?h=u.concat(h):d=-1,h.length&&n())}
function n (line 29) | function n(){if(!c){var t=a(i);c=!0;for(var e=h.length;e;){for(u=h,h=[];...
function r (line 29) | function r(t,e){this.fun=t,this.array=e}
function o (line 29) | function o(){}
function n (line 29) | function n(t){return parseInt(t,10)}
function r (line 29) | function r(t,e){s.initVML(),this.root=t,this.storage=e;var i=document.cr...
function o (line 29) | function o(t){return function(){a('In IE8.0 VML mode painter not support...
function n (line 29) | function n(t,e,i){r.Group.call(this),this.add(this.createLine(t,e,i)),th...
function n (line 29) | function n(t,e,i){r.Group.call(this),this._createPolyline(t,e,i)}
function n (line 29) | function n(t,e){var i=t.getItemStyle(),n=t.get("areaColor");return n&&(i...
function r (line 29) | function r(t,e,i,n){e.off("click"),t.get("selectedMode")&&e.on("click",f...
function o (line 29) | function o(t,e){e.eachChild(function(e){e.__region&&e.trigger(t.isSelect...
function a (line 29) | function a(t,e){var i=new l.Group;this._controller=new s(t.getZr(),e?i:n...
function n (line 29) | function n(){var e={type:"geoRoam",componentType:a};return e[a+"Id"]=t.i...
function n (line 29) | function n(t){return t===u[0]?"min":t===u[1]?"max":(+t).toFixed(l)}
function t (line 29) | function t(t){f(n.color)&&!t.inRange&&(t.inRange={color:n.color.slice()....
function e (line 29) | function e(t,e,i){var n=t[e],r=t[i];n&&!r&&(r=t[i]={},p(n,function(t,e){...
function i (line 29) | function i(t){var e=(t.inRange||{}).symbol||(t.outOfRange||{}).symbol,i=...
function r (line 29) | function r(t){return u[t]}
function o (line 29) | function o(t,e){u[t]=e}
function n (line 29) | function n(t,e){return t&&t.hasOwnProperty&&t.hasOwnProperty(e)}
function n (line 29) | function n(t,e){t.eachTargetSeries(function(e){var i=e.getData();s.apply...
function r (line 29) | function r(t){t.eachSeries(function(e){var i=e.getData(),n=[];t.eachComp...
function o (line 29) | function o(t,e,i){function n(t){return s[t]}function r(t,e){s[t]=e}for(v...
function n (line 29) | function n(){s.call(this)}
function r (line 29) | function r(t){this.name=t,this.zoomLimit,s.call(this),this._roamTransfor...
function n (line 30) | function n(t,e,i){if(this.name=t,this.contours=e,i)i=[i[0],i[1]];else{va...
function n (line 30) | function n(t,e){var i=[];return t.eachComponent("parallel",function(n,o)...
function n (line 30) | function n(t){var e=t.mainData,i=t.datas;i||(i={main:e},t.datasAttr={mai...
function r (line 30) | function r(t,e){if(l(this)){var i=c.extend({},this[f]);i[this.dataType]=...
function o (line 30) | function o(t,e){return t.struct&&t.struct.update(this),e}
function a (line 30) | function a(t,e){return d(e[f],function(i,n){i!==e&&h(i.cloneShallow(),n,...
function s (line 30) | function s(t){var e=this[p];return null==t||null==e?e:e[f][t]}
function l (line 30) | function l(t){return t[p]===t}
function u (line 30) | function u(t,e,i){t[f]={},d(e,function(e,n){h(e,n,t,i)})}
function h (line 30) | function h(t,e,i,n){i[f][e]=t,t[p]=i,t.dataType=e,n.struct&&(t[n.structA...
function n (line 30) | function n(t,e){return Math.abs(t-e)<a}
function r (line 30) | function r(t,e,i){var r=0,a=t[0];if(!a)return!1;for(var s=1;s<t.length;s...
function n (line 30) | function n(t,e,i){var n=e.getItemModel(i),r=n.getModel(u),o=e.getItemVis...
function n (line 30) | function n(t){var e=[],i=[];return t.eachSeriesByType("boxplot",function...
function r (line 30) | function r(t){var e,i,n=t.axis,r=t.seriesModels,o=r.length,s=t.boxWidthL...
function o (line 30) | function o(t,e,i){var n=t.coordinateSystem,r=t.getData(),o=t.dimensions,...
function n (line 30) | function n(t,e,i){var n=e.getItemModel(i),r=n.getModel(u),o=e.getItemVis...
function i (line 30) | function i(t,e){var i,a=t.getBaseAxis(),s="category"===a.type?a.getBandW...
function t (line 30) | function t(t){var i=[];return i[d]=h,i[f]=t,isNaN(h)||isNaN(t)?[NaN,NaN]...
function i (line 30) | function i(t,e){var i=t.slice(),n=t.slice();i[d]+=a/2,n[d]-=a/2,e?T.push...
function s (line 30) | function s(){var e=t(Math.min(p,g,v,m)),i=t(Math.max(p,g,v,m));return e[...
function n (line 30) | function n(t,e){function i(){a.ignore=a.hoverIgnore,s.ignore=s.hoverIgno...
function r (line 30) | function r(t,e,i,n){var r=n.getModel("textStyle"),o=n.get("position"),s=...
function n (line 30) | function n(t,e){return a.getLayoutRect(t.getBoxLayoutParams(),{width:e.g...
function r (line 30) | function r(t,e){for(var i=t.mapArray("value",function(t){return t}),n=[]...
function o (line 30) | function o(t){t.each(function(e){var i,n,r,o,a=t.getItemModel(e),s=a.get...
function n (line 30) | function n(t,e){var i=t.get("center"),n=e.getWidth(),r=e.getHeight(),o=M...
function r (line 30) | function r(t,e){return e&&("string"==typeof e?t=e.replace("{value}",t):"...
function i (line 30) | function i(t,e){t.wrapMethod("getItemModel",function(t){var e=o._categor...
function n (line 30) | function n(t,e){return t.getVisual("opacity")||t.getModel().get(e)}
function e (line 30) | function e(t,e){var i=n(t,e),r=t.getGraphicEl();null==i&&(i=1),r.travers...
function i (line 30) | function i(t,e){var i=n(t,e),r=t.getGraphicEl();r.traverse(function(t){t...
function n (line 30) | function n(t,e,i){for(var n,r=t[0],o=t[1],d=t[2],f=1/0,p=i*i,g=.1,v=.1;....
function i (line 30) | function i(t){var e=t.getVisual("symbolSize");return e instanceof Array&...
function n (line 30) | function n(t,e,i){var n=t.getBoxLayoutParams();return n.aspect=i,o.getLa...
function i (line 31) | function i(t){return t instanceof Array||(t=[t,t]),t}
function n (line 31) | function n(){var t=o.createCanvas();this.canvas=t,this.blurSize=30,this....
function n (line 31) | function n(t,e,i){var n=t[1]-t[0];e=l.map(e,function(e){return{interval:...
function r (line 31) | function r(t,e){var i=t[1]-t[0];return e=[(e[0]-t[0])/i,(e[1]-t[0])/i],f...
function o (line 31) | function o(t){var e=t.dimensions;return"lng"===e[0]&&"lat"===e[1]}
function n (line 31) | function n(t,e,i){a.call(this,t,e,i),this._lastFrame=0,this._lastFramePe...
function n (line 31) | function n(t){return a.isArray(t)||(t=[+t,+t]),t}
function r (line 31) | function r(t,e){t.eachChild(function(t){t.attr({z:e.z,zlevel:e.zlevel,st...
function o (line 31) | function o(t,e){c.call(this);var i=new h(t,e),n=new c;this.add(i),this.a...
function n (line 31) | function n(){this.group=new r.Group,this._lineEl=new s}
function n (line 31) | function n(t,e,i,n){l.Group.call(this),this.bodyIndex,this.whiskerIndex,...
function r (line 31) | function r(t,e,i){return s.map(t,function(t){return t=t.slice(),t[e]=i.i...
function o (line 31) | function o(t){var e={};return s.each(t,function(t,i){e["ends"+i]=t}),e}
function a (line 31) | function a(t){this.group=new l.Group,this.styleUpdater=t}
function n (line 31) | function n(t){var e=t.data;e&&e[0]&&e[0][0]&&e[0][0].coord&&(t.data=a.ma...
function n (line 31) | function n(t,e){for(var i={},n=["value"],r=0;r<t.length;r++)t[r].each(n,...
function n (line 31) | function n(t,e,i){var n=t.get("data"),o=r(e);n&&n.length&&s.each(i,funct...
function r (line 31) | function r(t){return+t.replace("dim","")}
function o (line 31) | function o(t,e){var i=0;s.each(t,function(t){var e=r(t);e>i&&(i=e)});var...
function n (line 31) | function n(t,e,i){var n=t.model,r=t.getRect(),o=new l.Rect({shape:{x:r.x...
function r (line 31) | function r(t,e,i,n){for(var r=[],o=0;o<i.length;o++){var a=i[o],l=t.get(...
function o (line 31) | function o(t,e,i,n,o){var a=r(t,i,n,o),s=new l.Polyline({shape:{points:a...
function a (line 31) | function a(t,e){var i=t.hostModel.getModel("lineStyle.normal"),n=i.getLi...
function s (line 31) | function s(t,e){return"category"===e?null==t:null==t||isNaN(t)}
function e (line 31) | function e(t){o(c,u,t,p,f,null,v)}
function i (line 31) | function i(e,i){var n=d.getItemGraphicEl(i),o=r(c,e,p,f);c.setItemGraphi...
function s (line 31) | function s(t){var e=d.getItemGraphicEl(t);u.remove(e)}
function n (line 31) | function n(t){return o.isArray(t)||(t=[+t,+t]),t}
function s (line 31) | function s(t,e){var i=t.getItemVisual(e,"symbol")||"circle",r=t.getItemV...
function l (line 31) | function l(e,i,n,o,a,l){n.removeAll();for(var u=0;u<i.length-1;u++){var ...
function u (line 31) | function u(t){return o.map(t,function(t){return[h.cx,h.cy]})}
function n (line 31) | function n(){u.attr("ignore",m)}
function a (line 31) | function a(){u.attr("ignore",v)}
function e (line 32) | function e(t,e){n[e]=n[e]||[],n[e][o]=r.dataToPoint(t,o)}
function n (line 32) | function n(t,e,i){var n=new r.Rect({shape:{x:t.x-10,y:t.y-10,width:0,hei...
function n (line 32) | function n(t,e){return M.getLayoutRect(t.getBoxLayoutParams(),{width:e.g...
function r (line 32) | function r(t,e,i,n,r,o,s){a(t,i,r),u(t,e,o,n,s),v(t)}
function o (line 32) | function o(t){A.each(t,function(t){var e=x(t.outEdges,S),i=x(t.inEdges,S...
function a (line 32) | function a(t,e,i){for(var n=t,r=null,o=0,a=0;n.length;){r=[];for(var u=0...
function s (line 32) | function s(t,e){A.each(t,function(t){t.outEdges.length||t.setLayout({x:e...
function l (line 32) | function l(t,e){A.each(t,function(t){var i=t.getLayout().x*e;t.setLayout...
function u (line 32) | function u(t,e,i,n,r){var o=T().key(function(t){return t.getLayout().x})...
function h (line 32) | function h(t,e,i,n,r){var o=[];A.each(e,function(t){var e=t.length,i=0;A...
function c (line 32) | function c(t,e,i){A.each(t,function(t){var n,r,o,a=0,s=t.length;for(t.so...
function d (line 32) | function d(t,e){A.each(t.slice().reverse(),function(t){A.each(t,function...
function f (line 32) | function f(t){return _(t.node2)*t.getValue()}
function p (line 32) | function p(t,e){A.each(t,function(t){A.each(t,function(t){if(t.inEdges.l...
function g (line 32) | function g(t){return _(t.node1)*t.getValue()}
function v (line 32) | function v(t){A.each(t,function(t){t.outEdges.sort(m),t.inEdges.sort(y)}...
function m (line 32) | function m(t,e){return t.node2.getLayout().y-e.node2.getLayout().y}
function y (line 32) | function y(t,e){return t.node1.getLayout().y-e.node1.getLayout().y}
function x (line 32) | function x(t,e){for(var i=0,n=t.length,r=-1;++r<n;){var o=+e.call(t,t[r]...
function _ (line 32) | function _(t){return t.getLayout().y+t.getLayout().dy/2}
function b (line 32) | function b(t,e){return t.getLayout().y-e.getLayout().y}
function w (line 32) | function w(t,e){return e>t?-1:t>e?1:t===e?0:NaN}
function S (line 32) | function S(t){return t.getValue()}
function n (line 32) | function n(t,e){this.group=new o.Group,t.add(this.group),this._onSelect=...
function r (line 32) | function r(t,e,i,n,r,o){var a=[[r?t:t-h,e],[t+i,e],[t+i,e+n],[r?t:t-h,e+...
function n (line 32) | function n(t,e){var i=0;s.each(t.children,function(t){n(t,e);var r=t.val...
function r (line 32) | function r(t,e){var i=e.get("color");if(i){t=t||[];var n;if(s.each(t,fun...
function n (line 32) | function n(){return{nodeGroup:[],background:[],content:[]}}
function r (line 32) | function r(t,e,i,n,r,l,u,h,c,d){function f(e){E.dataIndex=u.dataIndex,E....
function o (line 32) | function o(t,e){var i=t*w+e;return(i-1)/i}
function o (line 32) | function o(t,e,i,n,r){function s(t){return t.getId()}function u(a,s){var...
function s (line 32) | function s(t){var e=n();return t&&y(t,function(t,i){var n=e[i];y(t,funct...
function u (line 32) | function u(){y(m,function(t){y(t,function(t){t.parent&&t.parent.remove(t...
function e (line 32) | function e(t){var e=this.seriesModel.get("nodeClick",!0);if(e){var i=thi...
function n (line 32) | function n(e){"animating"!==this._state&&(u.aboveViewRoot(t.getViewRoot(...
function i (line 32) | function i(e,i){var n=r.retrieveTargetInfo(t,e);if(n){var o=e.getViewRoo...
function n (line 32) | function n(t,e,i){var n={mainType:"series",subType:"treemap",query:i};t....
function r (line 32) | function r(t,e,i,n){var a,s;if(!t.isRemoved()){var l=t.getLayout();a=l.w...
function o (line 32) | function o(t,e,i,n,r,o){var u=t.children||[],h=n.sort;"asc"!==h&&"desc"!...
function a (line 32) | function a(t,e,i,n,r){if(!n)return i;for(var o=t.get("visibleMin"),a=r.l...
function s (line 32) | function s(t,e){return e&&t.sort(function(t,i){return"asc"===e?t.getValu...
function l (line 32) | function l(t,e,i){for(var n=0,r=0,o=e.length;o>r;r++)n+=e[r].getValue();...
function u (line 32) | function u(t,e,i){for(var n,r=0,o=1/0,a=0,s=t.length;s>a;a++)n=t[a].getL...
function h (line 32) | function h(t,e,i,n,r){var o=e===i.width?0:1,a=1-o,s=["x","y"],l=["width"...
function c (line 32) | function c(t,e,i,n,r){var o=(e||{}).node,a=[n,r];if(!o||o===i)return a;f...
function d (line 32) | function d(t,e,i){if(e)return{x:e.x,y:e.y};var n={x:0,y:0};if(!i)return ...
function f (line 32) | function f(t,e,i,n,r){var o=t.getLayout(),a=i[r],s=a&&a===t;if(!(a&&!s||...
function n (line 32) | function n(t,e,i,s,u,c){var d=t.getModel(),p=t.getLayout();if(p&&!p.invi...
function r (line 32) | function r(t,e,i,n){var r=f.extend({},e);return f.each(["color","colorAl...
function o (line 32) | function o(t){var e=s(t,"color");if(e){var i=s(t,"colorAlpha"),n=s(t,"co...
function a (line 32) | function a(t,e){return null!=e?d.modifyHSL(e,null,null,t):null}
function s (line 32) | function s(t,e){var i=t[e];return null!=i&&"none"!==i?i:void 0}
function l (line 32) | function l(t,e,i,n,r,o){if(o&&o.length){var a=u(e,"color")||null!=r.colo...
function u (line 32) | function u(t,e){var i=t.get(e);return p(i)&&i.length?{name:e,range:i}:null}
function h (line 32) | function h(t,e,i,n,r,o){var a=f.extend({},e);if(r){var s=r.type,l="color...
function n (line 32) | function n(t,e,i,n){var r=t.coordToPoint([e,n]),o=t.coordToPoint([i,n]);...
function n (line 32) | function n(t,e,i){return i&&"axisAreaSelect"===i.type&&e.findComponents(...
function n (line 32) | function n(t,e,i){return{position:[t.cx,t.cy],rotation:i/180*Math.PI,lab...
function n (line 33) | function n(t){var e=t.coordinateSystem,i=t.axis,n={},r=i.position,o=i.or...
function n (line 33) | function n(t,e,i,n){(!n||n.$from!==t.id)&&this._brushController.setPanel...
function n (line 33) | function n(t){var e={};r.each(t,function(t){e[t]=1}),t.length=0,r.each(e...
function n (line 33) | function n(t){var e=["x","y"],i=["width","height"];return{point:function...
function r (line 33) | function r(t,e){return e[0]<=t&&t<=e[1]}
function o (line 33) | function o(t,e,i,n,r){for(var o=0,s=r[r.length-1];o<r.length;o++){var l=...
function a (line 33) | function a(t,e,i,n,r,o,a,u){var h=l(i-t,r-a,n-e,o-u);if(s(h))return!1;va...
function s (line 33) | function s(t){return 1e-6>=t&&t>=-1e-6}
function l (line 33) | function l(t,e,i,n){return t*n-e*i}
function u (line 33) | function u(t){var e=t.x,i=t.y,n=t.width,r=t.height;return 0>n&&(e+=n,n=-...
function n (line 33) | function n(t,e,i,n,o){if(o){var a=t.getZr();if(!a[x]){a[y]||(a[y]=r);var...
function r (line 33) | function r(t,e){if(!t.isDisposed()){var i=t.getZr();i[x]=!0,t.dispatchAc...
function o (line 33) | function o(t,e,i,n){for(var r=i.getItemLayout(n),o=0,a=e.length;a>o;o++)...
function a (line 33) | function a(t){var e=t.brushSelector;if(d.isString(e)){var i=[];return d....
function s (line 33) | function s(t,e){var i=t.option.seriesIndex;return null!=i&&"all"!==i&&(d...
function l (line 33) | function l(t){var e=t.selectors={};return d.each(p[t.brushType],function...
function u (line 33) | function u(t){return new f(t[0][0],t[1][0],t[0][1]-t[0][0],t[1][1]-t[1][...
function n (line 33) | function n(t){return"all"===_||w[t]}
function f (line 33) | function f(t){return!!t.length}
function p (line 33) | function p(t,e){var i=t.coordinateSystem;T|=i.hasAxisbrushed(),n(e)&&i.e...
function g (line 33) | function g(t,i,r){var l=a(t);if(l&&!s(e,i)&&(d.each(A,function(i){l[i.br...
function n (line 33) | function n(t,e){e.update="updateView",r.registerAction(e,function(e,i){v...
function e (line 33) | function e(t,e,i){var n=i%e.length;return t[n]=t[n]||[],n}
function n (line 33) | function n(t,e){return u.getLayoutRect(t.getBoxLayoutParams(),{width:e.g...
function r (line 33) | function r(t,e,i,n){var r=l.makePath(t.get(e).replace(/^path:\/\//,""),s...
function o (line 33) | function o(t,e,i,n,r,o){var a=t.get("symbol"),l=e.get("color"),u=t.get("...
function a (line 33) | function a(t,e,i,n,r){if(!t.dragging){var o=n.getModel("checkpointStyle"...
function i (line 33) | function i(t){var e=t.position;t.origin=[c[0][0]-e[0],c[1][0]-e[1]]}
function n (line 33) | function n(t){return[[t.x,t.x+t.width],[t.y,t.y+t.height]]}
function r (line 33) | function r(t,e,i,n,r){t[n]+=i[n][r]-e[n][r]}
function o (line 33) | function o(t,i,o,d){if(t){var f={position:t,origin:[a/2,0],rotation:d?-s...
function t (line 33) | function t(){var t=this.model;this._changeTimeline(t.getCurrentIndex()+(...
function n (line 33) | function n(t){var e=t.type,i={number:"value",time:"time"};if(i[e]&&(t.ax...
function r (line 33) | function r(t){var e=t.itemStyle||(t.itemStyle={}),i=e.emphasis||(e.empha...
function o (line 33) | function o(t,e){return t.hasOwnProperty(e)}
function n (line 33) | function n(t,e,i){this.model=t,this.ecModel=e,this.api=i,this._brushType...
function n (line 33) | function n(t,e,i){var n=t.targetVisuals[e].color;if(!n)return i.slice();...
function r (line 33) | function r(t,e,i,r){var o=n(t,e,i);a.each(o,function(t){for(var i={value...
function n (line 34) | function n(t,e,i,n){return new u.Polygon({shape:{points:t},draggable:!!i...
function r (line 34) | function r(t,e){return 0===t?[[0,0],[e,0],[e,-e]]:[[0,0],[e,0],[e,e]]}
function o (line 34) | function o(t,e,i,n){return t?[[0,-y(e,x(i,0))],[b,0],[0,y(e,x(n-i,0))]]:...
function a (line 34) | function a(t,e,i){var n=_/2,r=t.get("hoverLinkDataSize");return r&&(n=v(...
function s (line 34) | function s(t){return!t.get("realtime")&&t.get("hoverLinkOnHandle")}
function n (line 34) | function n(t,e){var i=t.inverse;("vertical"===t.orient?!i:i)&&e.reverse()}
function r (line 34) | function r(t){function e(t,i,n){return n=n||0,t.interval[n]<i.interval[n...
function i (line 34) | function i(t){n.push(t),t.color=e(r,r.getRepresentValue(t),t.valueState)}
function t (line 34) | function t(t){var a=t.piece,s=new o.Group;s.onclick=r.bind(this._onItemC...
function i (line 34) | function i(t){var i=this.visualMapModel;i.option.hoverLink&&this.api.dis...
function n (line 34) | function n(t,e,i,n,r){s.call(this,t),this.map=e,this._nameCoordMap={},th...
function n (line 34) | function n(t){if(!t.UTF8Encoding)return t;for(var e=t.features,i=0;i<e.l...
function r (line 34) | function r(t,e){for(var i=[],n=e[0],r=e[1],o=0;o<t.length;o+=2){var a=t....
function o (line 34) | function o(t){for(var e=[],i=0;i<t.length;i++)for(var n=0;n<t[i].length;...
function n (line 34) | function n(t,e){return e.type||(e.data?"category":"value")}
function n (line 34) | function n(t,e,i){this._axesMap={},this._axesLayout={},this.dimensions=t...
function n (line 34) | function n(t){if(!t.parallel){var e=!1;o.each(t.series,function(t){t&&"p...
function r (line 34) | function r(t){var e=a.normalizeToArray(t.parallelAxis);o.each(e,function...
function n (line 34) | function n(t,e){e=e||[0,360],o.call(this,"angle",t,e),this.type="category"}
function n (line 34) | function n(t,e){return e.type||(e.data?"category":"value")}
function n (line 34) | function n(t,e){o.call(this,"radius",t,e),this.type="category"}
function n (line 34) | function n(t,e,i){o.call(this,t,e,i),this.type="value",this.angle=0,this...
function n (line 34) | function n(t,e,i){this._model=t,this.dimensions=[],this._indicatorAxes=r...
function i (line 34) | function i(t){var e=Math.pow(10,Math.floor(Math.log(t)/Math.LN10)),i=t/e...
function n (line 35) | function n(t,e){return s.defaults({show:e},t)}
function n (line 35) | function n(t,e){return e.type||(e.data?"category":"value")}
function n (line 35) | function n(t,e,i){this.dimension="x",this.dimensions=["x"],this._axis=nu...
function n (line 35) | function n(t,e){var i=[];return t.eachComponent("singleAxis",function(n,...
function n (line 35) | function n(t,e){this.id=null==t?"":t,this.inEdges=[],this.outEdges=[],th...
function r (line 35) | function r(t,e,i){this.node1=t,this.node2=e,this.dataIndex=null==i?-1:i}
function n (line 35) | function n(t,e){this.root,this.data,this._nodes=[],this.hostModel=t,this...
function r (line 35) | function r(t,e){var i=e.children;t.parentNode!==e&&(i.push(t),t.parentNo...
function o (line 35) | function o(t,e){c.push(t);var i=new h(t.name,a);e?r(i,e):a.root=i,a._nod...
function n (line 35) | function n(){var t,e=[],i={};return{add:function(t,n,o,a,s){return r.isS...
function n (line 35) | function n(){function t(e,n){if(n>=i.length)return e;for(var o=-1,a=e.le...
FILE: public/js/greensock.js
function a (line 1272) | function a() {
function l (line 1329) | function l() {
function h (line 1335) | function h(t) {
function u (line 1347) | function u() {
function _ (line 1353) | function _() {
function c (line 1359) | function c() {
function f (line 1385) | function f(t) {
function p (line 1395) | function p(t) {
function d (line 1406) | function d(t, e, i) {
function m (line 1422) | function m(t, e) {
FILE: public/js/join-group.js
function validator (line 22) | function validator(){
FILE: public/js/join-race.js
function validator (line 54) | function validator(){
FILE: public/js/lib/loop-protect/loop-protect.js
function inMultilineComment (line 42) | function inMultilineComment(lineNum, lines) {
function inCommentOrString (line 80) | function inCommentOrString(index, line) {
function directlyBeforeLoop (line 102) | function directlyBeforeLoop(index, lineNum, lines) {
function rewriteLoops (line 125) | function rewriteLoops(code, offset) {
FILE: public/js/sidecar.v1.js
function e (line 5) | function e(n){if(r[n])return r[n].exports;var o=r[n]={exports:{},id:n,lo...
function n (line 5) | function n(t){return t&&t.__esModule?t:{"default":t}}
function r (line 5) | function r(t){if(null===t||void 0===t)throw new TypeError("Object.assign...
function n (line 5) | function n(){try{if(!Object.assign)return!1;var t=new String("abc");if(t...
function r (line 6) | function r(t,e){var r=e.bubbles,n=void 0===r?!1:r,o=e.cancelable,i=void ...
function r (line 6) | function r(t){if("function"==typeof Symbol)return Symbol(t);var e=Math.r...
function n (line 6) | function n(t){if(t&&t.__esModule)return t;var e={};if(null!=t)for(var r ...
function o (line 6) | function o(t){return t&&t.__esModule?t:{"default":t}}
function i (line 6) | function i(t,e){if(!(t instanceof e))throw new TypeError("Cannot call a ...
function t (line 6) | function t(t,e){for(var r=0;r<e.length;r++){var n=e[r];n.enumerable=n.en...
function t (line 6) | function t(){var e=arguments.length<=0||void 0===arguments[0]?{}:argumen...
function r (line 6) | function r(t){if(Array.isArray(t)){for(var e=0,r=Array(t.length);e<t.len...
function n (line 6) | function n(t,e){return c(t).forEach(function(){e&&e.apply(void 0,argumen...
function o (line 6) | function o(t,e,r){return e.split(/\s/).forEach(function(e){n(t,function(...
function i (line 6) | function i(t,e,r){return e.split(/\s/).forEach(function(e){n(t,function(...
function a (line 6) | function a(t,e){var r=(e.children||[])[0];r?e.insertBefore(t,r):e.append...
function u (line 6) | function u(t,e,r){return void 0!==r?r?t.classList.add(e):t.classList.rem...
function n (line 6) | function n(t){return t&&t.__esModule?t:{"default":t}}
function o (line 6) | function o(t,e){if(!(t instanceof e))throw new TypeError("Cannot call a ...
function t (line 6) | function t(t,e){for(var r=0;r<e.length;r++){var n=e[r];n.enumerable=n.en...
function t (line 6) | function t(){o(this,t),this.elements=[]}
function r (line 6) | function r(t){var e={};return Object.keys(t).forEach(function(r){Object....
function a (line 13) | function a(t){return"function"==typeof t||"object"==typeof t&&null!==t}
function u (line 13) | function u(t){return"function"==typeof t}
function c (line 13) | function c(t){W=t}
function s (line 13) | function s(t){tt=t}
function l (line 13) | function l(){return function(){t.nextTick(d)}}
function f (line 13) | function f(){return function(){V(d)}}
function b (line 13) | function b(){var t=0,e=new nt(d),r=document.createTextNode("");return e....
function y (line 13) | function y(){var t=new MessageChannel;return t.port1.onmessage=d,functio...
function p (line 13) | function p(){return function(){setTimeout(d,1)}}
function d (line 13) | function d(){for(var t=0;J>t;t+=2){var e=at[t],r=at[t+1];e(r),at[t]=void...
function M (line 13) | function M(){try{var t=r(39);return V=t.runOnLoop||t.runOnContext,f()}ca...
function g (line 13) | function g(t,e){var r=this,n=new this.constructor(m);void 0===n[st]&&Y(n...
function h (line 13) | function h(t){var e=this;if(t&&"object"==typeof t&&t.constructor===e)ret...
function m (line 13) | function m(){}
function N (line 13) | function N(){return new TypeError("You cannot resolve a promise with its...
function j (line 13) | function j(){return new TypeError("A promises callback cannot return tha...
function w (line 13) | function w(t){try{return t.then}catch(e){return yt.error=e,yt}}
function x (line 13) | function x(t,e,r,n){try{t.call(e,r,n)}catch(o){return o}}
function L (line 13) | function L(t,e,r){tt(function(t){var n=!1,o=x(r,e,function(r){n||(n=!0,e...
function T (line 13) | function T(t,e){e._state===ft?S(t,e._result):e._state===bt?z(t,e._result...
function v (line 13) | function v(t,e,r){e.constructor===t.constructor&&r===ut&&constructor.res...
function E (line 13) | function E(t,e){t===e?z(t,N()):a(e)?v(t,e,w(e)):S(t,e)}
function D (line 13) | function D(t){t._onerror&&t._onerror(t._result),A(t)}
function S (line 13) | function S(t,e){t._state===lt&&(t._result=e,t._state=ft,0!==t._subscribe...
function z (line 13) | function z(t,e){t._state===lt&&(t._state=bt,t._result=e,tt(D,t))}
function O (line 13) | function O(t,e,r,n){var o=t._subscribers,i=o.length;t._onerror=null,o[i]...
function A (line 13) | function A(t){var e=t._subscribers,r=t._state;if(0!==e.length){for(var n...
function I (line 13) | function I(){this.error=null}
function C (line 13) | function C(t,e){try{return t(e)}catch(r){return pt.error=r,pt}}
function k (line 13) | function k(t,e,r,n){var o,i,a,c,s=u(r);if(s){if(o=C(r,n),o===pt?(c=!0,i=...
function U (line 13) | function U(t,e){try{e(function(e){E(t,e)},function(e){z(t,e)})}catch(r){...
function _ (line 13) | function _(){return dt++}
function Y (line 13) | function Y(t){t[st]=dt++,t._state=void 0,t._result=void 0,t._subscribers...
function Q (line 13) | function Q(t){return new Nt(this,t).promise}
function P (line 13) | function P(t){var e=this;return new e(K(t)?function(r,n){for(var o=t.len...
function B (line 13) | function B(t){var e=this,r=new e(m);return z(r,t),r}
function H (line 13) | function H(){throw new TypeError("You must pass a resolver function as t...
function F (line 13) | function F(){throw new TypeError("Failed to construct 'Promise': Please ...
function R (line 13) | function R(t){this[st]=_(),this._result=this._state=void 0,this._subscri...
function G (line 13) | function G(t,e){this._instanceConstructor=t,this.promise=new t(m),this.p...
function Z (line 13) | function Z(){return new Error("Array Methods must be provided an Array")}
function X (line 13) | function X(){var t;if("undefined"!=typeof o)t=o;else if("undefined"!=typ...
function r (line 13) | function r(){s&&a&&(s=!1,a.length?c=a.concat(c):l=-1,c.length&&n())}
function n (line 13) | function n(){if(!s){var t=setTimeout(r);s=!0;for(var e=c.length;e;){for(...
function o (line 13) | function o(t,e){this.fun=t,this.array=e}
function i (line 13) | function i(){}
FILE: seed/getChallenges.js
function getFilesFor (line 5) | function getFilesFor(dir) {
function getSupOrder (line 30) | function getSupOrder(filePath) {
function getSupName (line 39) | function getSupName(filePath) {
FILE: seed/loopbackMigration.js
function debug (line 22) | function debug() {
function createConnection (line 29) | function createConnection(URI) {
function createQuery (line 43) | function createQuery(db, collection, options, batchSize) {
function getUserCount (line 68) | function getUserCount(db) {
function insertMany (line 85) | function insertMany(db, collection, users, options) {
FILE: seed/test-challenges.js
function createIsAssert (line 8) | function createIsAssert(t, isThing) {
function fillAssert (line 17) | function fillAssert(t) {
function createTest (line 54) | function createTest({
FILE: server/boot/a-extendUser.js
function destroyAllRelated (line 6) | function destroyAllRelated(id, Model) {
FILE: server/boot/a-react.js
function reactSubRouter (line 23) | function reactSubRouter(app) {
FILE: server/boot/a-services.js
function bootServices (line 6) | function bootServices(app) {
FILE: server/boot/about.js
function numberWithCommas (line 6) | function numberWithCommas(x) {
function about (line 10) | function about(app) {
FILE: server/boot/certificate.js
function isCertified (line 30) | function isCertified(ids, challengeMap = {}) {
function getIdsForCert$ (line 34) | function getIdsForCert$(id, Challenge) {
function certificate (line 49) | function certificate(app) {
FILE: server/boot/challenge.js
function isChallengeCompleted (line 41) | function isChallengeCompleted(user, challengeId) {
function buildUserUpdate (line 54) | function buildUserUpdate(
function shouldShowNew (line 110) | function shouldShowNew(element, block) {
function shouldNotFilterComingSoon (line 132) | function shouldNotFilterComingSoon({ isComingSoon, isBeta: challengeIsBe...
function getRenderData$ (line 138) | function getRenderData$(user, challenge$, origChallengeName, solution) {
function getSuperBlocks$ (line 216) | function getSuperBlocks$(challenge$, challengeMap) {
function getChallengeById$ (line 271) | function getChallengeById$(challenge$, challengeId) {
function getNextChallenge$ (line 290) | function getNextChallenge$(challenge$, blocks$, challengeId) {
function redirectToCurrentChallenge (line 429) | function redirectToCurrentChallenge(req, res, next) {
function redirectToNextChallenge (line 455) | function redirectToNextChallenge(req, res, next) {
function showChallenge (line 503) | function showChallenge(req, res, next) {
function completedChallenge (line 531) | function completedChallenge(req, res, next) {
function completedZiplineOrBasejump (line 596) | function completedZiplineOrBasejump(req, res, next) {
function showMap (line 662) | function showMap(showAside, { user = {} }, res, next) {
FILE: server/boot/commit.js
function findNonprofit (line 39) | function findNonprofit(name) {
function commit (line 51) | function commit(app) {
FILE: server/boot/home.js
function addDefaultImage (line 12) | function addDefaultImage(req, res, next) {
function index (line 23) | function index(req, res) {
FILE: server/boot/randomAPIs.js
function sitemap (line 88) | function sitemap(req, res, next) {
function chat (line 200) | function chat(req, res) {
function home (line 203) | function home(req, res) {
function showLabs (line 207) | function showLabs(req, res) {
function terms (line 214) | function terms(req, res) {
function privacy (line 220) | function privacy(req, res) {
function howNonprofitProjectsWork (line 226) | function howNonprofitProjectsWork(req, res) {
function codeOfConduct (line 232) | function codeOfConduct(req, res) {
function academicHonesty (line 238) | function academicHonesty(req, res) {
function theFastestWebPageOnTheInternet (line 244) | function theFastestWebPageOnTheInternet(req, res) {
function showTestimonials (line 250) | function showTestimonials(req, res) {
function showAllTestimonials (line 259) | function showAllTestimonials(req, res) {
function showShop (line 268) | function showShop(req, res) {
function confirmStickers (line 275) | function confirmStickers(req, res) {
function cancelStickers (line 283) | function cancelStickers(req, res) {
function submitCatPhoto (line 290) | function submitCatPhoto(req, res) {
function bootcampCalculator (line 294) | function bootcampCalculator(req, res) {
function nonprofits (line 300) | function nonprofits(req, res) {
function nonprofitsForm (line 306) | function nonprofitsForm(req, res) {
function agileProjectManagers (line 312) | function agileProjectManagers(req, res) {
function agileProjectManagersForm (line 318) | function agileProjectManagersForm(req, res) {
function twitch (line 324) | function twitch(req, res) {
function leaderBoard (line 327) | function leaderBoard(req, res, next) {
function getUserIdentity (line 355) | function getUserIdentity(req, res, next) {
function dashboard (line 370) | function dashboard(req, res, next) {
function updateProfile (line 391) | function updateProfile(req, res, next) {
function master (line 412) | function master(req, res, next) {
function newer (line 435) | function newer(req, res, next) {
function women (line 458) | function women(req, res, next) {
function hasUsername (line 481) | function hasUsername(req, res, next) {
function hasJoin (line 496) | function hasJoin(req, res, next) {
function addTelphone (line 510) | function addTelphone(req, res, next) {
function unsubscribeMonthly (line 527) | function unsubscribeMonthly(req, res, next) {
function unsubscribeNotifications (line 541) | function unsubscribeNotifications(req, res, next) {
function unsubscribeQuincy (line 555) | function unsubscribeQuincy(req, res, next) {
function unsubscribed (line 569) | function unsubscribed(req, res) {
function getStarted (line 575) | function getStarted(req, res) {
function githubCalls (line 581) | function githubCalls(req, res, next) {
function trelloCalls (line 627) | function trelloCalls(req, res, next) {
function bloggerCalls (line 641) | function bloggerCalls(req, res, next) {
FILE: server/boot/story.js
function hotRank (line 25) | function hotRank(timeValue, rank) {
function sortByRank (line 37) | function sortByRank(a, b) {
function cleanData (line 42) | function cleanData(data, opts) {
function redirectToNews (line 89) | function redirectToNews(req, res) {
function hotJSON (line 94) | function hotJSON(req, res, next) {
function RSSFeed (line 109) | function RSSFeed(req, res, next) {
function hot (line 130) | function hot(req, res) {
function submitNew (line 137) | function submitNew(req, res) {
function preSubmit (line 152) | function preSubmit(req, res) {
function returnIndividualStory (line 182) | function returnIndividualStory(req, res, next) {
function userStories (line 229) | function userStories({ body: { search = '' } = {} }, res, next) {
function getStories (line 250) | function getStories({ body: { search = '' } = {} }, res, next) {
function upvote (line 300) | function upvote(req, res, next) {
function newStory (line 337) | function newStory(req, res, next) {
function storySubmission (line 401) | function storySubmission(req, res, next) {
FILE: server/boot/t-wiki.js
function showWiki (line 8) | function showWiki(req, res) {
FILE: server/boot/user.js
function replaceScriptTags (line 46) | function replaceScriptTags(value) {
function replaceFormAction (line 52) | function replaceFormAction(value) {
function encodeFcc (line 58) | function encodeFcc(value = '') {
function isAlgorithm (line 62) | function isAlgorithm(challenge) {
function isProject (line 70) | function isProject(challenge) {
function getChallengeGroup (line 75) | function getChallengeGroup(challenge) {
function buildDisplayChallenges (line 89) | function buildDisplayChallenges(challengeMap = {}, timezone) {
function findUserByUsername$ (line 126) | function findUserByUsername$(username, fields) {
function getSignin (line 215) | function getSignin(req, res) {
function signout (line 224) | function signout(req, res) {
function getEmailSignin (line 229) | function getEmailSignin(req, res) {
function getAccount (line 249) | function getAccount(req, res) {
function getSettings (line 254) | function getSettings(req, res) {
function returnUser (line 260) | function returnUser(req, res, next) {
function showCert (line 338) | function showCert(certType, req, res, next) {
function toggleLockdownMode (line 423) | function toggleLockdownMode(req, res, next) {
function toggleReceivesAnnouncementEmails (line 436) | function toggleReceivesAnnouncementEmails(req, res, next) {
function toggleReceivesQuincyEmails (line 452) | function toggleReceivesQuincyEmails(req, res, next) {
function toggleReceivesNotificationEmails (line 467) | function toggleReceivesNotificationEmails(req, res, next) {
function postDeleteAccount (line 483) | function postDeleteAccount(req, res, next) {
function getReset (line 492) | function getReset(req, res) {
function postReset (line 503) | function postReset(req, res, next) {
function getForgot (line 524) | function getForgot(req, res) {
function postForgot (line 533) | function postForgot(req, res) {
function vote1 (line 559) | function vote1(req, res, next) {
function vote2 (line 574) | function vote2(req, res, next) {
FILE: server/middlewares/add-return-to.js
function addReturnToUrl (line 26) | function addReturnToUrl() {
FILE: server/middlewares/constant-headers.js
function constantHeaders (line 1) | function constantHeaders() {
FILE: server/middlewares/csp.js
function csp (line 11) | function csp() {
FILE: server/middlewares/error-handlers.js
function prodErrorHandler (line 4) | function prodErrorHandler() {
FILE: server/middlewares/express-rx.js
function expressRx (line 4) | function expressRx() {
FILE: server/middlewares/global-locals.js
function globalLocals (line 1) | function globalLocals() {
FILE: server/middlewares/jade-helpers.js
function jadeHelpers (line 3) | function jadeHelpers() {
FILE: server/middlewares/keymetrics.js
function keymetrics (line 3) | function keymetrics() {
FILE: server/middlewares/migrate-completed-challenges.js
function updateName (line 24) | function updateName(challenge) {
function updateId (line 52) | function updateId(challenge) {
function buildChallengeMap (line 65) | function buildChallengeMap(userId, completedChallenges = [], User) {
function migrateCompletedChallenges (line 101) | function migrateCompletedChallenges() {
FILE: server/middlewares/revision-helpers.js
function rev (line 8) | function rev(manifest, scopedPrepend, asset) {
FILE: server/middlewares/sessions.js
function sessionsMiddleware (line 7) | function sessionsMiddleware() {
FILE: server/middlewares/validator.js
method matchRegex (line 6) | matchRegex(param, regex) {
method isString (line 9) | isString(value) {
method isNumber (line 12) | isNumber(value) {
FILE: server/services/hikes.js
function hikesService (line 6) | function hikesService(app) {
FILE: server/services/job.js
function getJobServices (line 10) | function getJobServices(app) {
FILE: server/services/user.js
function userServices (line 12) | function userServices() {
FILE: server/utils/auth.js
method linkedin (line 6) | linkedin({ _json }) {
function getUsernameFromProvider (line 12) | function getUsernameFromProvider(provider, profile) {
function setProfileFromGithub (line 19) | function setProfileFromGithub(
function getFirstImageFromProfile (line 53) | function getFirstImageFromProfile(profile) {
function getSocialProvider (line 59) | function getSocialProvider(provider) {
FILE: server/utils/commit.js
function completeCommitment$ (line 10) | function completeCommitment$(user) {
FILE: server/utils/date-utils.js
function dayCount (line 4) | function dayCount([head, tail], timezone = 'UTC') {
FILE: server/utils/getFromDisk$.js
function getFromDisk$ (line 7) | function getFromDisk$(challenge) {
FILE: server/utils/middleware.js
function ifNoUserRedirectTo (line 1) | function ifNoUserRedirectTo(url, message, type = 'errors') {
function ifNoUserSend (line 16) | function ifNoUserSend(sendThis) {
function ifNoUser401 (line 25) | function ifNoUser401(req, res, next) {
FILE: server/utils/rx.js
function saveInstance (line 6) | function saveInstance(instance) {
function observeQuery (line 27) | function observeQuery(Model, method, query) {
function observeMethod (line 31) | function observeMethod(context, methodName) {
FILE: server/utils/user-stats.js
function prepUniqueDays (line 7) | function prepUniqueDays(cals, tz = 'UTC') {
function calcCurrentStreak (line 16) | function calcCurrentStreak(cals, tz = 'UTC') {
function calcLongestStreak (line 38) | function calcLongestStreak(cals, tz = 'UTC') {
FILE: test/server/utils/date-utils-test.js
constant PST (line 6) | const PST = 'America/Los_Angeles';
FILE: test/server/utils/user-stats-test.js
constant PST (line 12) | const PST = 'America/Los_Angeles';
Condensed preview — 501 files, each showing path, character count, and a content snippet. Download the .json file or copy for the full structured content (7,956K chars).
[
{
"path": ".babelrc",
"chars": 102,
"preview": "{\n \"presets\": [\"es2015\", \"react\", \"stage-0\"],\n \"plugins\": [\"babel-plugin-add-module-exports\"]\n}\n"
},
{
"path": ".bowerrc",
"chars": 46,
"preview": "{\n \"directory\" : \"public/bower_components\"\n}\n"
},
{
"path": ".editorconfig",
"chars": 188,
"preview": "root = true\n\n[*]\nindent_style = space\nindent_size = 2\nend_of_line = lf\ncharset = utf-8\ntrim_trailing_whitespace = true\ni"
},
{
"path": ".eslintignore",
"chars": 15,
"preview": "public/**/*.js\n"
},
{
"path": ".eslintrc",
"chars": 4954,
"preview": "{\n \"parserOption\": {\n \"ecmaVersion\": 6,\n \"ecmaFeatures\": {\n \"jsx\": true\n }\n },\n \"env\": {\n \"browser"
},
{
"path": ".gitattributes",
"chars": 80,
"preview": "public/js/lib/codemirror/* linguist-vendored\n*.jsx linguist-language=JavaScript\n"
},
{
"path": ".github/ISSUE_TEMPLATE.md",
"chars": 485,
"preview": "## 注意:这里只处理 FreeCodeCamp.cn 的相关问题,不处理 w3cschool 的任何问题\n## 注意:请不要乱开无意义的 Issue,违者直接加黑名单\n## 注意:Issue 是用来处理代码库中的 bug,不是用来提问题的"
},
{
"path": ".github/PULL_REQUEST_TEMPLATE.md",
"chars": 1314,
"preview": "## FreeCodeCamp Pull Request template\nPlease, go through these steps before you submit a PR.\n\n1. Make sure that your PR "
},
{
"path": ".gitignore",
"chars": 550,
"preview": "lib-cov\n*.seed\n*.log\n*.csv\n*.dat\n*.out\n*.pid\n*.gz\n*.swp\n.floo\n.flooignore\nbuiltAssets/\npm2.js\n*.env\npids\nlogs\nresults\ntm"
},
{
"path": ".jshintrc",
"chars": 1857,
"preview": "{\n \"node\": true, // Enable globals available when code is running inside of the NodeJS runtime environment.\n \"brow"
},
{
"path": ".node-inspectorrc",
"chars": 30,
"preview": "{\n \"save-live-edit\": true\n}"
},
{
"path": ".travis.yml",
"chars": 53,
"preview": "language: node_js\n\nnode_js:\n - '4.2.1'\n\nsudo: false\n"
},
{
"path": "CONTRIBUTING.md",
"chars": 11847,
"preview": "# 贡献者指南\n\n## 我想成为代码贡献者!\nWe welcome pull requests from Free Code Camp campers (our students) and seasoned JavaScript devel"
},
{
"path": "LICENSE",
"chars": 1515,
"preview": "BSD 3-Clause License\n\nCopyright (c) 2017, FreeCodeCamp 中国\nAll rights reserved.\n\nRedistribution and use in source and bin"
},
{
"path": "LICENSE-freeCodeCamp-Curriculum.md",
"chars": 20127,
"preview": "Attribution-ShareAlike 4.0 International\n\n=======================================================================\n\nCreat"
},
{
"path": "LICENSE-freeCodeCamp-Translation.md",
"chars": 17656,
"preview": "## creative commons\n\n# Attribution-NonCommercial 4.0 International\n\nCreative Commons Corporation (“Creative Commons”) is"
},
{
"path": "README.md",
"chars": 3832,
"preview": "\n扫码加入 FCC-China 社群\n\n\n### FreeCodeCampChina's open source codebase and curriculu"
},
{
"path": "bower.json",
"chars": 630,
"preview": "{\n \"name\": \"freecodecamp\",\n \"version\": \"0.0.0\",\n \"homepage\": \"http://freecodecamp.cn\",\n \"private\": true,\n \"ignore\":"
},
{
"path": "client/README.md",
"chars": 175,
"preview": "This is the entry point for the client code.\nCode that should run only on the client should be put here.\n\nNOTE(berks): F"
},
{
"path": "client/commonFramework/add-loop-protect.js",
"chars": 571,
"preview": "window.common = (function(global) {\n const {\n loopProtect,\n common = { init: [] }\n } = global;\n\n loopProtect.hi"
},
{
"path": "client/commonFramework/bindings.js",
"chars": 5982,
"preview": "window.common = (function(global) {\n const {\n $,\n Rx: { Observable },\n common = { init: [] }\n } = global;\n\n "
},
{
"path": "client/commonFramework/code-storage.js",
"chars": 1479,
"preview": "// depends on: codeUri\nwindow.common = (function(global) {\n const {\n localStorage,\n common = { init: [] }\n } = g"
},
{
"path": "client/commonFramework/code-uri.js",
"chars": 3598,
"preview": "// store code in the URL\nwindow.common = (function(global) {\n const {\n encodeURIComponent: encode,\n decodeURIComp"
},
{
"path": "client/commonFramework/create-editor.js",
"chars": 2780,
"preview": "window.common = (function(global) {\n const {\n Rx: { Subject, Observable },\n CodeMirror,\n emmetCodeMirror,\n "
},
{
"path": "client/commonFramework/detect-unsafe-code-stream.js",
"chars": 1382,
"preview": "window.common = (function(global) {\n const {\n Rx: { Observable },\n common = { init: [] }\n } = global;\n\n const d"
},
{
"path": "client/commonFramework/display-test-results.js",
"chars": 798,
"preview": "window.common = (function({ $, common = { init: [] }}) {\n\n common.displayTestResults = function displayTestResults(data"
},
{
"path": "client/commonFramework/end.js",
"chars": 4857,
"preview": "$(document).ready(function() {\n const common = window.common;\n const { Observable } = window.Rx;\n const {\n addLoop"
},
{
"path": "client/commonFramework/execute-challenge-stream.js",
"chars": 1502,
"preview": "window.common = (function(global) {\n const {\n ga,\n common = { init: [] }\n } = global;\n\n const {\n addLoopProt"
},
{
"path": "client/commonFramework/get-iframe.js",
"chars": 592,
"preview": "window.common = (function(global) {\n const {\n common = { init: [] },\n document: doc\n } = global;\n\n common.getIf"
},
{
"path": "client/commonFramework/init.js",
"chars": 3366,
"preview": "window.common = (function(global) {\n // common namespace\n // all classes should be stored here\n // called at the begi"
},
{
"path": "client/commonFramework/output-display.js",
"chars": 1231,
"preview": "window.common = (function(global) {\n const {\n CodeMirror,\n document: doc,\n common = { init: [] }\n } = global;"
},
{
"path": "client/commonFramework/phone-scroll-lock.js",
"chars": 3398,
"preview": "window.common = (function({ common = { init: [] }}) {\n\n common.lockTop = function lockTop() {\n var magiVal;\n\n if "
},
{
"path": "client/commonFramework/report-issue.js",
"chars": 1478,
"preview": "window.common = (function({ common = { init: [] } }) {\n common.init.push(function($) {\n $('#report-issue').on('click"
},
{
"path": "client/commonFramework/run-tests-stream.js",
"chars": 853,
"preview": "window.common = (function(global) {\n const {\n Rx: { Observable },\n chai,\n common = { init: [] }\n } = global;\n"
},
{
"path": "client/commonFramework/show-completion.js",
"chars": 2139,
"preview": "window.common = (function(global) {\n const {\n $,\n moment,\n ga = (() => {}),\n common = { init: [] }\n } = gl"
},
{
"path": "client/commonFramework/step-challenge.js",
"chars": 5224,
"preview": "window.common = (function({ $, common = { init: [] }}) {\n const stepClass = '.challenge-step';\n const prevBtnClass = '"
},
{
"path": "client/commonFramework/update-preview.js",
"chars": 3001,
"preview": "window.common = (function(global) {\n const {\n Rx: { BehaviorSubject, Observable },\n common = { init: [] }\n } = g"
},
{
"path": "client/es6-shims.js",
"chars": 63,
"preview": "require('object.assign').shim();\nrequire('es6-map/implement');\n"
},
{
"path": "client/iFrameScripts.js",
"chars": 2520,
"preview": "/* eslint-disable no-undef, no-unused-vars, no-native-reassign */\n// the $ on the iframe window object is the same\n// as"
},
{
"path": "client/index.js",
"chars": 1984,
"preview": "import './es6-shims';\nimport Rx from 'rx';\nimport React from 'react';\nimport debug from 'debug';\nimport { Router } from "
},
{
"path": "client/less/challenge.less",
"chars": 2009,
"preview": ".challenge-step-description {\n font-size: 1.5em;\n}\n.challenge-step-counter {\n font-size: 20px;\n line-height: 44px;\n}\n"
},
{
"path": "client/less/chat.less",
"chars": 402,
"preview": ".chat-embed-main-title {\n display: flex;\n flex-grow: 1;\n padding-left: 31px;\n padding-top: 7px;\n}\n\n.gitter-chat-embe"
},
{
"path": "client/less/jobs.less",
"chars": 230,
"preview": ".jobs-list-highlight {\n background-color: #ffc\n}\n\na.jobs-list-highlight:hover {\n background-color: #ffc\n}\n\n.jobs-list "
},
{
"path": "client/less/lib/animate.min.less",
"chars": 53431,
"preview": "@charset \"UTF-8\";/*!\nAnimate.css - http://daneden.me/animate\nLicensed under the MIT license - http://opensource.org/lice"
},
{
"path": "client/less/lib/bootstrap/alerts.less",
"chars": 1513,
"preview": "//\n// Alerts\n// --------------------------------------------------\n\n\n// Base styles\n// -------------------------\n\n.alert"
},
{
"path": "client/less/lib/bootstrap/badges.less",
"chars": 1069,
"preview": "//\n// Badges\n// --------------------------------------------------\n\n\n// Base class\n.badge {\n display: inline-block;\n m"
},
{
"path": "client/less/lib/bootstrap/bootstrap.less",
"chars": 1121,
"preview": "// Core variables and mixins\n@import \"variables.less\";\n@import \"mixins.less\";\n\n// Reset and dependencies\n@import \"normal"
},
{
"path": "client/less/lib/bootstrap/breadcrumbs.less",
"chars": 594,
"preview": "//\n// Breadcrumbs\n// --------------------------------------------------\n\n\n.breadcrumb {\n padding: @breadcrumb-padding-v"
},
{
"path": "client/less/lib/bootstrap/button-groups.less",
"chars": 5740,
"preview": "//\n// Button groups\n// --------------------------------------------------\n\n// Make the div behave like a button\n.btn-gro"
},
{
"path": "client/less/lib/bootstrap/buttons.less",
"chars": 3547,
"preview": "//\n// Buttons\n// --------------------------------------------------\n\n\n// Base styles\n// --------------------------------"
},
{
"path": "client/less/lib/bootstrap/carousel.less",
"chars": 5318,
"preview": "//\n// Carousel\n// --------------------------------------------------\n\n\n// Wrapper for the slide container and indicators"
},
{
"path": "client/less/lib/bootstrap/close.less",
"chars": 683,
"preview": "//\n// Close icons\n// --------------------------------------------------\n\n\n.close {\n float: right;\n font-size: (@font-s"
},
{
"path": "client/less/lib/bootstrap/code.less",
"chars": 1401,
"preview": "//\n// Code (inline and block)\n// --------------------------------------------------\n\n\n// Inline and block code styles\nco"
},
{
"path": "client/less/lib/bootstrap/component-animations.less",
"chars": 709,
"preview": "//\n// Component animations\n// --------------------------------------------------\n\n// Heads up!\n//\n// We don't use the `."
},
{
"path": "client/less/lib/bootstrap/dropdowns.less",
"chars": 4754,
"preview": "//\n// Dropdown menus\n// --------------------------------------------------\n\n\n// Dropdown arrow/caret\n.caret {\n display:"
},
{
"path": "client/less/lib/bootstrap/forms.less",
"chars": 14215,
"preview": "//\n// Forms\n// --------------------------------------------------\n\n\n// Normalize non-controls\n//\n// Restyle and baseline"
},
{
"path": "client/less/lib/bootstrap/glyphicons.less",
"chars": 14879,
"preview": "//\n// Glyphicons for Bootstrap\n//\n// Since icons are fonts, they can be placed anywhere text is placed and are\n// thus a"
},
{
"path": "client/less/lib/bootstrap/grid.less",
"chars": 1387,
"preview": "//\n// Grid system\n// --------------------------------------------------\n\n\n// Container widths\n//\n// Set the container wi"
},
{
"path": "client/less/lib/bootstrap/input-groups.less",
"chars": 4215,
"preview": "//\n// Input groups\n// --------------------------------------------------\n\n// Base styles\n// -------------------------\n.i"
},
{
"path": "client/less/lib/bootstrap/jumbotron.less",
"chars": 959,
"preview": "//\n// Jumbotron\n// --------------------------------------------------\n\n\n.jumbotron {\n padding: @jumbotron-padding (@jum"
},
{
"path": "client/less/lib/bootstrap/labels.less",
"chars": 1079,
"preview": "//\n// Labels\n// --------------------------------------------------\n\n.label {\n display: inline;\n padding: .2em .6em .3e"
},
{
"path": "client/less/lib/bootstrap/list-group.less",
"chars": 3143,
"preview": "//\n// List groups\n// --------------------------------------------------\n\n\n// Base class\n//\n// Easily usable on <ul>, <ol"
},
{
"path": "client/less/lib/bootstrap/media.less",
"chars": 652,
"preview": ".media {\n // Proper spacing between instances of .media\n margin-top: 15px;\n\n &:first-child {\n margin-top: 0;\n }\n}"
},
{
"path": "client/less/lib/bootstrap/mixins/alerts.less",
"chars": 257,
"preview": "// Alerts\n\n.alert-variant(@background; @border; @text-color) {\n background-color: @background;\n border-color: @border;"
},
{
"path": "client/less/lib/bootstrap/mixins/background-variant.less",
"chars": 139,
"preview": "// Contextual backgrounds\n\n.bg-variant(@color) {\n background-color: @color;\n a&:hover {\n background-color: darken(@"
},
{
"path": "client/less/lib/bootstrap/mixins/border-radius.less",
"chars": 468,
"preview": "// Single side border-radius\n\n.border-top-radius(@radius) {\n border-top-right-radius: @radius;\n border-top-left-radiu"
},
{
"path": "client/less/lib/bootstrap/mixins/buttons.less",
"chars": 1074,
"preview": "// Button variants\n//\n// Easily pump out default styles, as well as :hover, :focus, :active,\n// and disabled options for"
},
{
"path": "client/less/lib/bootstrap/mixins/center-block.less",
"chars": 120,
"preview": "// Center-align a block level element\n\n.center-block() {\n display: block;\n margin-left: auto;\n margin-right: auto;\n}\n"
},
{
"path": "client/less/lib/bootstrap/mixins/clearfix.less",
"chars": 605,
"preview": "// Clearfix\n//\n// For modern browsers\n// 1. The space content is one way to avoid an Opera bug when the\n// contentedi"
},
{
"path": "client/less/lib/bootstrap/mixins/forms.less",
"chars": 2641,
"preview": "// Form validation states\n//\n// Used in forms.less to generate the form validation CSS for warnings, errors,\n// and succ"
},
{
"path": "client/less/lib/bootstrap/mixins/gradients.less",
"chars": 4388,
"preview": "// Gradients\n\n#gradient {\n\n // Horizontal gradient, from left to right\n //\n // Creates two color stops, start and end"
},
{
"path": "client/less/lib/bootstrap/mixins/grid-framework.less",
"chars": 2820,
"preview": "// Framework grid generation\n//\n// Used only by Bootstrap to generate the correct number of grid classes given\n// any va"
},
{
"path": "client/less/lib/bootstrap/mixins/grid.less",
"chars": 3094,
"preview": "// Grid system\n//\n// Generate semantic grid columns with these mixins.\n\n// Centered container element\n.container-fixed(@"
},
{
"path": "client/less/lib/bootstrap/mixins/hide-text.less",
"chars": 579,
"preview": "// CSS image replacement\n//\n// Heads up! v3 launched with with only `.hide-text()`, but per our pattern for\n// mixins be"
},
{
"path": "client/less/lib/bootstrap/mixins/image.less",
"chars": 1062,
"preview": "// Image Mixins\n// - Responsive image\n// - Retina image\n\n\n// Responsive image\n//\n// Keep images from scaling beyond the "
},
{
"path": "client/less/lib/bootstrap/mixins/labels.less",
"chars": 161,
"preview": "// Labels\n\n.label-variant(@color) {\n background-color: @color;\n\n &[href] {\n &:hover,\n &:focus {\n background"
},
{
"path": "client/less/lib/bootstrap/mixins/list-group.less",
"chars": 533,
"preview": "// List Groups\n\n.list-group-item-variant(@state; @background; @color) {\n .list-group-item-@{state} {\n color: @color;"
},
{
"path": "client/less/lib/bootstrap/mixins/nav-divider.less",
"chars": 232,
"preview": "// Horizontal dividers\n//\n// Dividers (basically an hr) within dropdowns and nav lists\n\n.nav-divider(@color: #e5e5e5) {\n"
},
{
"path": "client/less/lib/bootstrap/mixins/nav-vertical-align.less",
"chars": 364,
"preview": "// Navbar vertical align\n//\n// Vertically center elements in the navbar.\n// Example: an element has a height of 30px, so"
},
{
"path": "client/less/lib/bootstrap/mixins/opacity.less",
"chars": 148,
"preview": "// Opacity\n\n.opacity(@opacity) {\n opacity: @opacity;\n // IE8 filter\n @opacity-ie: (@opacity * 100);\n filter: ~\"alpha"
},
{
"path": "client/less/lib/bootstrap/mixins/pagination.less",
"chars": 438,
"preview": "// Pagination\n\n.pagination-size(@padding-vertical; @padding-horizontal; @font-size; @border-radius) {\n > li {\n > a,\n"
},
{
"path": "client/less/lib/bootstrap/mixins/panels.less",
"chars": 537,
"preview": "// Panels\n\n.panel-variant(@border; @heading-text-color; @heading-bg-color; @heading-border) {\n border-color: @border;\n\n"
},
{
"path": "client/less/lib/bootstrap/mixins/progress-bar.less",
"chars": 191,
"preview": "// Progress bars\n\n.progress-bar-variant(@color) {\n background-color: @color;\n\n // Deprecated parent class requirement "
},
{
"path": "client/less/lib/bootstrap/mixins/reset-filter.less",
"chars": 248,
"preview": "// Reset filters for IE\n//\n// When you need to remove a gradient background, do not forget to use this to reset\n// the I"
},
{
"path": "client/less/lib/bootstrap/mixins/resize.less",
"chars": 196,
"preview": "// Resize anything\n\n.resizable(@direction) {\n resize: @direction; // Options: horizontal, vertical, both\n overflow: au"
},
{
"path": "client/less/lib/bootstrap/mixins/responsive-visibility.less",
"chars": 343,
"preview": "// Responsive utilities\n\n//\n// More easily include all the states for responsive-utilities.less.\n.responsive-visibility("
},
{
"path": "client/less/lib/bootstrap/mixins/size.less",
"chars": 127,
"preview": "// Sizing shortcuts\n\n.size(@width; @height) {\n width: @width;\n height: @height;\n}\n\n.square(@size) {\n .size(@size; @si"
},
{
"path": "client/less/lib/bootstrap/mixins/tab-focus.less",
"chars": 159,
"preview": "// WebKit-style focus\n\n.tab-focus() {\n // Default\n outline: thin dotted;\n // WebKit\n outline: 5px auto -webkit-focus"
},
{
"path": "client/less/lib/bootstrap/mixins/table-row.less",
"chars": 700,
"preview": "// Tables\n\n.table-row-variant(@state; @background) {\n // Exact selectors below required to override `.table-striped` an"
},
{
"path": "client/less/lib/bootstrap/mixins/text-emphasis.less",
"chars": 116,
"preview": "// Typography\n\n.text-emphasis-variant(@color) {\n color: @color;\n a&:hover {\n color: darken(@color, 10%);\n }\n}\n"
},
{
"path": "client/less/lib/bootstrap/mixins/text-overflow.less",
"chars": 162,
"preview": "// Text overflow\n// Requires inline-block or block for proper styling\n\n.text-overflow() {\n overflow: hidden;\n text-ove"
},
{
"path": "client/less/lib/bootstrap/mixins/vendor-prefixes.less",
"chars": 6606,
"preview": "// Vendor Prefixes\n//\n// All vendor mixins are deprecated as of v3.2.0 due to the introduction of\n// Autoprefixer in our"
},
{
"path": "client/less/lib/bootstrap/mixins.less",
"chars": 1102,
"preview": "// Mixins\n// --------------------------------------------------\n\n// Utilities\n@import \"mixins/hide-text.less\";\n@import \""
},
{
"path": "client/less/lib/bootstrap/modals.less",
"chars": 3528,
"preview": "//\n// Modals\n// --------------------------------------------------\n\n// .modal-open - body class for killing the scr"
},
{
"path": "client/less/lib/bootstrap/navbar.less",
"chars": 14585,
"preview": "//\n// Navbars\n// --------------------------------------------------\n\n\n// Wrapper and base class\n//\n// Provide a static n"
},
{
"path": "client/less/lib/bootstrap/navs.less",
"chars": 4979,
"preview": "//\n// Navs\n// --------------------------------------------------\n\n\n// Base class\n// ------------------------------------"
},
{
"path": "client/less/lib/bootstrap/normalize.less",
"chars": 7650,
"preview": "/*! normalize.css v3.0.2 | MIT License | git.io/normalize */\n\n//\n// 1. Set default font family to sans-serif.\n// 2. Prev"
},
{
"path": "client/less/lib/bootstrap/pager.less",
"chars": 861,
"preview": "//\n// Pager pagination\n// --------------------------------------------------\n\n\n.pager {\n padding-left: 0;\n margin: @li"
},
{
"path": "client/less/lib/bootstrap/pagination.less",
"chars": 2001,
"preview": "//\n// Pagination (multiple pages)\n// --------------------------------------------------\n.pagination {\n display: inline-"
},
{
"path": "client/less/lib/bootstrap/panels.less",
"chars": 6097,
"preview": "//\n// Panels\n// --------------------------------------------------\n\n\n// Base class\n.panel {\n margin-bottom: @line-heigh"
},
{
"path": "client/less/lib/bootstrap/popovers.less",
"chars": 3474,
"preview": "//\n// Popovers\n// --------------------------------------------------\n\n\n.popover {\n position: absolute;\n top: 0;\n left"
},
{
"path": "client/less/lib/bootstrap/print.less",
"chars": 2133,
"preview": "/*! Source: https://github.com/h5bp/html5-boilerplate/blob/master/src/css/main.css */\n\n// =============================="
},
{
"path": "client/less/lib/bootstrap/progress-bars.less",
"chars": 1925,
"preview": "//\n// Progress bars\n// --------------------------------------------------\n\n\n// Bar animations\n// -----------------------"
},
{
"path": "client/less/lib/bootstrap/responsive-embed.less",
"chars": 564,
"preview": "// Embeds responsive\n//\n// Credit: Nicolas Gallagher and SUIT CSS.\n\n.embed-responsive {\n position: relative;\n display:"
},
{
"path": "client/less/lib/bootstrap/responsive-utilities.less",
"chars": 4262,
"preview": "//\n// Responsive: Utility classes\n// --------------------------------------------------\n\n\n// IE10 in Windows (Phone) 8\n/"
},
{
"path": "client/less/lib/bootstrap/scaffolding.less",
"chars": 2656,
"preview": "//\n// Scaffolding\n// --------------------------------------------------\n\n\n// Reset the box-sizing\n//\n// Heads up! This r"
},
{
"path": "client/less/lib/bootstrap/tables.less",
"chars": 4610,
"preview": "//\n// Tables\n// --------------------------------------------------\n\n\ntable {\n background-color: @table-bg;\n}\ncaption {\n"
},
{
"path": "client/less/lib/bootstrap/theme.less",
"chars": 7345,
"preview": "\n//\n// Load core variables and mixins\n// --------------------------------------------------\n\n@import \"variables.less\";\n@"
},
{
"path": "client/less/lib/bootstrap/thumbnails.less",
"chars": 753,
"preview": "//\n// Thumbnails\n// --------------------------------------------------\n\n\n// Mixin and adjust the regular image class\n.th"
},
{
"path": "client/less/lib/bootstrap/tooltip.less",
"chars": 2590,
"preview": "//\n// Tooltips\n// --------------------------------------------------\n\n\n// Base class\n.tooltip {\n position: absolute;\n "
},
{
"path": "client/less/lib/bootstrap/type.less",
"chars": 5959,
"preview": "//\n// Typography\n// --------------------------------------------------\n\n\n// Headings\n// -------------------------\n\nh1, h"
},
{
"path": "client/less/lib/bootstrap/utilities.less",
"chars": 780,
"preview": "//\n// Utility classes\n// --------------------------------------------------\n\n\n// Floats\n// -------------------------\n\n.c"
},
{
"path": "client/less/lib/bootstrap/variables.less",
"chars": 27209,
"preview": "//\n// Variables\n// --------------------------------------------------\n\n\n//== Colors\n//\n//## Gray and brand colors for us"
},
{
"path": "client/less/lib/bootstrap/wells.less",
"chars": 527,
"preview": "//\n// Wells\n// --------------------------------------------------\n\n\n// Base class\n.well {\n min-height: 20px;\n padding:"
},
{
"path": "client/less/lib/bootstrap-social/bootstrap-social.less",
"chars": 3116,
"preview": "/*\n * Social Buttons for Bootstrap\n *\n * Copyright 2013-2014 Panayiotis Lipiridis\n * Licensed under the MIT License\n *\n "
},
{
"path": "client/less/lib/font-awesome-4.3.0/css/font-awesome.css",
"chars": 28747,
"preview": "/*!\n * Font Awesome 4.3.0 by @davegandy - http://fontawesome.io - @fontawesome\n * License - http://fontawesome.io/lice"
},
{
"path": "client/less/lib/font-awesome-4.3.0/less/animated.less",
"chars": 713,
"preview": "// Animated Icons\n// --------------------------\n\n.@{fa-css-prefix}-spin {\n -webkit-animation: fa-spin 2s infinite linea"
},
{
"path": "client/less/lib/font-awesome-4.3.0/less/bordered-pulled.less",
"chars": 330,
"preview": "// Bordered & Pulled\n// -------------------------\n\n.@{fa-css-prefix}-border {\n padding: .2em .25em .15em;\n border: sol"
},
{
"path": "client/less/lib/font-awesome-4.3.0/less/core.less",
"chars": 509,
"preview": "// Base Class Definition\n// -------------------------\n\n.@{fa-css-prefix} {\n display: inline-block;\n font: normal norma"
},
{
"path": "client/less/lib/font-awesome-4.3.0/less/fixed-width.less",
"chars": 119,
"preview": "// Fixed Width Icons\n// -------------------------\n.@{fa-css-prefix}-fw {\n width: (18em / 14);\n text-align: center;\n}\n"
},
{
"path": "client/less/lib/font-awesome-4.3.0/less/font-awesome.less",
"chars": 465,
"preview": "/*!\n * Font Awesome 4.3.0 by @davegandy - http://fontawesome.io - @fontawesome\n * License - http://fontawesome.io/lice"
},
{
"path": "client/less/lib/font-awesome-4.3.0/less/icons.less",
"chars": 37290,
"preview": "/* Font Awesome uses the Unicode Private Use Area (PUA) to ensure screen\n readers do not read off random characters th"
},
{
"path": "client/less/lib/font-awesome-4.3.0/less/larger.less",
"chars": 370,
"preview": "// Icon Sizes\n// -------------------------\n\n/* makes the font 33% larger relative to the icon container */\n.@{fa-css-pre"
},
{
"path": "client/less/lib/font-awesome-4.3.0/less/list.less",
"chars": 377,
"preview": "// List Icons\n// -------------------------\n\n.@{fa-css-prefix}-ul {\n padding-left: 0;\n margin-left: @fa-li-width;\n lis"
},
{
"path": "client/less/lib/font-awesome-4.3.0/less/mixins.less",
"chars": 983,
"preview": "// Mixins\n// --------------------------\n\n.fa-icon() {\n display: inline-block;\n font: normal normal normal @fa-font-siz"
},
{
"path": "client/less/lib/font-awesome-4.3.0/less/path.less",
"chars": 770,
"preview": "/* FONT PATH\n * -------------------------- */\n\n@font-face {\n font-family: 'FontAwesome';\n src: url('@{fa-font-path}/fo"
},
{
"path": "client/less/lib/font-awesome-4.3.0/less/rotated-flipped.less",
"chars": 622,
"preview": "// Rotated & Flipped Icons\n// -------------------------\n\n.@{fa-css-prefix}-rotate-90 { .fa-icon-rotate(90deg, 1); }\n.@"
},
{
"path": "client/less/lib/font-awesome-4.3.0/less/stacked.less",
"chars": 476,
"preview": "// Stacked Icons\n// -------------------------\n\n.@{fa-css-prefix}-stack {\n position: relative;\n display: inline-block;\n"
},
{
"path": "client/less/lib/font-awesome-4.3.0/less/variables.less",
"chars": 16792,
"preview": "// Variables\n// --------------------------\n\n@fa-font-path: \"../fonts\";\n@fa-font-size-base: 14px;\n//@fa-font-pat"
},
{
"path": "client/less/lib/font-awesome-4.3.0/scss/_animated.scss",
"chars": 715,
"preview": "// Spinning Icons\n// --------------------------\n\n.#{$fa-css-prefix}-spin {\n -webkit-animation: fa-spin 2s infinite line"
},
{
"path": "client/less/lib/font-awesome-4.3.0/scss/_bordered-pulled.scss",
"chars": 332,
"preview": "// Bordered & Pulled\n// -------------------------\n\n.#{$fa-css-prefix}-border {\n padding: .2em .25em .15em;\n border: so"
},
{
"path": "client/less/lib/font-awesome-4.3.0/scss/_core.scss",
"chars": 513,
"preview": "// Base Class Definition\n// -------------------------\n\n.#{$fa-css-prefix} {\n display: inline-block;\n font: normal norm"
},
{
"path": "client/less/lib/font-awesome-4.3.0/scss/_fixed-width.scss",
"chars": 120,
"preview": "// Fixed Width Icons\n// -------------------------\n.#{$fa-css-prefix}-fw {\n width: (18em / 14);\n text-align: center;\n}\n"
},
{
"path": "client/less/lib/font-awesome-4.3.0/scss/_icons.scss",
"chars": 37883,
"preview": "/* Font Awesome uses the Unicode Private Use Area (PUA) to ensure screen\n readers do not read off random characters th"
},
{
"path": "client/less/lib/font-awesome-4.3.0/scss/_larger.scss",
"chars": 375,
"preview": "// Icon Sizes\n// -------------------------\n\n/* makes the font 33% larger relative to the icon container */\n.#{$fa-css-pr"
},
{
"path": "client/less/lib/font-awesome-4.3.0/scss/_list.scss",
"chars": 378,
"preview": "// List Icons\n// -------------------------\n\n.#{$fa-css-prefix}-ul {\n padding-left: 0;\n margin-left: $fa-li-width;\n li"
},
{
"path": "client/less/lib/font-awesome-4.3.0/scss/_mixins.scss",
"chars": 1000,
"preview": "// Mixins\n// --------------------------\n\n@mixin fa-icon() {\n display: inline-block;\n font: normal normal normal #{$fa-"
},
{
"path": "client/less/lib/font-awesome-4.3.0/scss/_path.scss",
"chars": 783,
"preview": "/* FONT PATH\n * -------------------------- */\n\n@font-face {\n font-family: 'FontAwesome';\n src: url('#{$fa-font-path}/f"
},
{
"path": "client/less/lib/font-awesome-4.3.0/scss/_rotated-flipped.scss",
"chars": 672,
"preview": "// Rotated & Flipped Icons\n// -------------------------\n\n.#{$fa-css-prefix}-rotate-90 { @include fa-icon-rotate(90deg, "
},
{
"path": "client/less/lib/font-awesome-4.3.0/scss/_stacked.scss",
"chars": 482,
"preview": "// Stacked Icons\n// -------------------------\n\n.#{$fa-css-prefix}-stack {\n position: relative;\n display: inline-block;"
},
{
"path": "client/less/lib/font-awesome-4.3.0/scss/_variables.scss",
"chars": 16864,
"preview": "// Variables\n// --------------------------\n\n$fa-font-path: \"../fonts\" !default;\n$fa-font-size-base: 14px !defau"
},
{
"path": "client/less/lib/font-awesome-4.3.0/scss/font-awesome.scss",
"chars": 405,
"preview": "/*!\n * Font Awesome 4.3.0 by @davegandy - http://fontawesome.io - @fontawesome\n * License - http://fontawesome.io/lice"
},
{
"path": "client/less/lib/ionicons/_ionicons-animation.less",
"chars": 2049,
"preview": "// Animation Icons\n// --------------------------\n\n.spin() {\n -webkit-animation: spin 1s infinite linear;\n -moz-animati"
},
{
"path": "client/less/lib/ionicons/_ionicons-font.less",
"chars": 885,
"preview": "// Ionicons Font Path\n// --------------------------\n\n@font-face {\n font-family: @ionicons-font-family;\n src:url(\"@{ion"
},
{
"path": "client/less/lib/ionicons/_ionicons-icons.less",
"chars": 90037,
"preview": "// Ionicons Icons\n// --------------------------\n\n.ionicons,\n.@{ionicons-prefix}alert:before,\n.@{ionicons-prefix}alert-ci"
},
{
"path": "client/less/lib/ionicons/_ionicons-variables.less",
"chars": 27680,
"preview": "/*!\nIonicons, v2.0.0\nCreated by Ben Sperry for the Ionic Framework, http://ionicons.com/\nhttps://twitter.com/benjsperry "
},
{
"path": "client/less/lib/ionicons/ionicons.less",
"chars": 114,
"preview": "@import \"_ionicons-variables\";\n@import \"_ionicons-font\";\n@import \"_ionicons-animation\";\n@import \"_ionicons-icons\";"
},
{
"path": "client/less/main.less",
"chars": 18731,
"preview": "@import \"lib/bootstrap/bootstrap\";\n@import \"lib/bootstrap-social/bootstrap-social\";\n@import \"lib/ionicons/ionicons\";\n@im"
},
{
"path": "client/less/map.less",
"chars": 9283,
"preview": "/*\n * based off of https://github.com/gitterHQ/sidecar\n * license: MIT\n */\n.map-aside {\n width:500px;\n\n z-index: 2"
},
{
"path": "client/less/signin.less",
"chars": 177,
"preview": ".github-login {\n\tposition: relative;\n\twidth: 300px;\n\tmargin-left: auto;\n\tmargin-right: auto;\n\t.first {\n\tposition: relati"
},
{
"path": "client/less/toastr.less",
"chars": 7603,
"preview": "// sourced from https://github.com/CodeSeven/toastr\n// MIT license\n// Mix-ins\n.borderRadius(@radius) {\n -moz-border-r"
},
{
"path": "client/less/wiki.less",
"chars": 6925,
"preview": "/*\n * based off of https://github.com/gitterHQ/sidecar\n * license: MIT\n */\n\n#wikiFrame {\n width: 100%;\n height: 10"
},
{
"path": "client/main.js",
"chars": 14819,
"preview": "var main = window.main || {};\n\nmain.mapShareKey = 'map-shares';\n\nmain.ga = window.ga || function() {};\n\nmain = (function"
},
{
"path": "client/plugin.js",
"chars": 1934,
"preview": "/* eslint-disable no-eval */\n/* global importScripts, application */\n// executes the given code and handles the result\n\n"
},
{
"path": "client/sagas/README.md",
"chars": 0,
"preview": ""
},
{
"path": "client/sagas/err-saga.js",
"chars": 547,
"preview": "// () =>\n// (store: Store) =>\n// (next: (action: Action) => Object) =>\n// errSaga(action: Action) => Objec"
},
{
"path": "client/sagas/hard-go-to-saga.js",
"chars": 525,
"preview": "import { hardGoTo } from '../../common/app/redux/types';\n\nconst loc = typeof window !== 'undefined' ?\n window.location "
},
{
"path": "client/sagas/index.js",
"chars": 243,
"preview": "import errSaga from './err-saga';\nimport titleSaga from './title-saga';\nimport localStorageSaga from './local-storage-sa"
},
{
"path": "client/sagas/local-storage-saga.js",
"chars": 1518,
"preview": "import {\n saveForm,\n clearForm,\n loadSavedForm\n} from '../../common/app/routes/Jobs/redux/types';\n\nimport {\n saveCom"
},
{
"path": "client/sagas/title-saga.js",
"chars": 470,
"preview": "// (doc: Object) =>\n// () =>\n// (next: (action: Action) => Object) =>\n// titleSage(action: Action) => Obje"
},
{
"path": "common/app/App.jsx",
"chars": 2035,
"preview": "import React, { PropTypes } from 'react';\nimport { Row } from 'react-bootstrap';\nimport { ToastMessage, ToastContainer }"
},
{
"path": "common/app/components/Flash/Queue.jsx",
"chars": 467,
"preview": "import React, { PropTypes } from 'react';\nimport { Alert } from 'react-bootstrap';\n\nexport default React.createClass({\n "
},
{
"path": "common/app/components/Flash/index.jsx",
"chars": 0,
"preview": ""
},
{
"path": "common/app/components/Footer/Footer.jsx",
"chars": 1066,
"preview": "import React from 'react';\nimport { Col, Row, Grid } from 'react-bootstrap';\n\nimport links from './links.json';\n\nexport "
},
{
"path": "common/app/components/Footer/README.md",
"chars": 19,
"preview": "Currently not used\n"
},
{
"path": "common/app/components/Footer/index.js",
"chars": 36,
"preview": "export default from './Footer.jsx';\n"
},
{
"path": "common/app/components/Footer/links.json",
"chars": 988,
"preview": "[\n {\n \"className\": \"ion-speakerphone\",\n \"content\": \" Blog \",\n \"href\": \"http://medium.freecodecamp.com\",\n \""
},
{
"path": "common/app/components/Nav/Nav.jsx",
"chars": 2804,
"preview": "import React, { PropTypes } from 'react';\nimport { LinkContainer } from 'react-router-bootstrap';\nimport {\n Col,\n Nav,"
},
{
"path": "common/app/components/Nav/NavItem.jsx",
"chars": 1873,
"preview": "import React from 'react';\nimport classNames from 'classnames';\n\nexport default React.createClass({\n displayName: 'FCCN"
},
{
"path": "common/app/components/Nav/index.js",
"chars": 33,
"preview": "export default from './Nav.jsx';\n"
},
{
"path": "common/app/components/Nav/links.json",
"chars": 311,
"preview": "[{\n \"content\": \"Map\",\n \"link\": \"/map\"\n}, {\n \"content\": \"Chat\",\n \"link\": \"//gitter.im/FreeCodeCamp/chinese\",\n \"targe"
},
{
"path": "common/app/components/NotFound/index.jsx",
"chars": 447,
"preview": "import React, { PropTypes } from 'react';\n\nconst win = typeof window !== 'undefined' ? window : {};\n\nfunction goToServer"
},
{
"path": "common/app/components/README.md",
"chars": 38,
"preview": "things like NavBar and Footer go here\n"
},
{
"path": "common/app/create-app.jsx",
"chars": 2086,
"preview": "import { Observable } from 'rx';\nimport { match } from 'react-router';\nimport { compose, createStore, applyMiddleware } "
},
{
"path": "common/app/create-reducer.js",
"chars": 493,
"preview": "import { combineReducers } from 'redux';\nimport { reducer as formReducer } from 'redux-form';\n\nimport { reducer as app }"
},
{
"path": "common/app/index.js",
"chars": 40,
"preview": "export default from './create-app.jsx';\n"
},
{
"path": "common/app/middlewares.js",
"chars": 0,
"preview": ""
},
{
"path": "common/app/provide-store.js",
"chars": 241,
"preview": "/* eslint-disable react/display-name */\nimport React from 'react';\nimport { Provider } from 'react-redux';\n\nexport defau"
},
{
"path": "common/app/redux/actions.js",
"chars": 847,
"preview": "import { createAction } from 'redux-actions';\nimport types from './types';\n\n// updateTitle(title: String) => Action\nexpo"
},
{
"path": "common/app/redux/fetch-user-saga.js",
"chars": 911,
"preview": "import { Observable } from 'rx';\nimport { handleError, setUser, fetchUser } from './types';\n\nexport default ({ services "
},
{
"path": "common/app/redux/index.js",
"chars": 228,
"preview": "export { default as reducer } from './reducer';\nexport { default as actions } from './actions';\nexport { default as type"
},
{
"path": "common/app/redux/oldActions.js",
"chars": 1356,
"preview": "import { Actions } from 'thundercats';\nimport { Observable } from 'rx';\n\n\nexport default Actions({\n shouldBindMethods: "
},
{
"path": "common/app/redux/reducer.js",
"chars": 763,
"preview": "import { handleActions } from 'redux-actions';\nimport types from './types';\n\nexport default handleActions(\n {\n [type"
},
{
"path": "common/app/redux/types.js",
"chars": 228,
"preview": "import createTypes from '../utils/create-types';\n\nexport default createTypes([\n 'updateTitle',\n\n 'fetchUser',\n 'setUs"
},
{
"path": "common/app/routes/Admin/README.md",
"chars": 36,
"preview": "in case we ever want an admin panel\n"
},
{
"path": "common/app/routes/Bonfires/README.md",
"chars": 62,
"preview": "This folder contains things relative to the bonfires' screens\n"
},
{
"path": "common/app/routes/Hikes/components/Hike.jsx",
"chars": 1787,
"preview": "import React, { PropTypes } from 'react';\nimport { connect } from 'react-redux';\nimport { Col, Row } from 'react-bootstr"
},
{
"path": "common/app/routes/Hikes/components/Hikes.jsx",
"chars": 2070,
"preview": "import React, { PropTypes } from 'react';\nimport { compose } from 'redux';\nimport { connect } from 'react-redux';\nimport"
},
{
"path": "common/app/routes/Hikes/components/Lecture.jsx",
"chars": 2241,
"preview": "import React, { PropTypes } from 'react';\nimport { connect } from 'react-redux';\nimport { Button, Col, Row } from 'react"
},
{
"path": "common/app/routes/Hikes/components/Map.jsx",
"chars": 802,
"preview": "import React, { PropTypes } from 'react';\nimport { Link } from 'react-router';\nimport { ListGroup, ListGroupItem } from "
},
{
"path": "common/app/routes/Hikes/components/Questions.jsx",
"chars": 5039,
"preview": "import React, { PropTypes } from 'react';\nimport { spring, Motion } from 'react-motion';\nimport { connect } from 'react-"
},
{
"path": "common/app/routes/Hikes/index.js",
"chars": 213,
"preview": "import Hikes from './components/Hikes.jsx';\nimport Hike from './components/Hike.jsx';\n\nexport default {\n path: 'videos'"
},
{
"path": "common/app/routes/Hikes/redux/actions.js",
"chars": 1671,
"preview": "import { createAction } from 'redux-actions';\n\nimport types from './types';\nimport { getMouse } from './utils';\n\n\n// fet"
},
{
"path": "common/app/routes/Hikes/redux/answer-saga.js",
"chars": 3660,
"preview": "import { Observable } from 'rx';\nimport { push } from 'react-router-redux';\n\nimport types from './types';\nimport { getMo"
},
{
"path": "common/app/routes/Hikes/redux/fetch-hikes-saga.js",
"chars": 1205,
"preview": "import { Observable } from 'rx';\nimport { normalize, Schema, arrayOf } from 'normalizr';\n// import debug from 'debug';\n\n"
},
{
"path": "common/app/routes/Hikes/redux/index.js",
"chars": 239,
"preview": "export actions from './actions';\nexport reducer from './reducer';\nexport types from './types';\n\nimport answerSaga from '"
},
{
"path": "common/app/routes/Hikes/redux/oldActions.js",
"chars": 8514,
"preview": "import _ from 'lodash';\nimport { Observable } from 'rx';\nimport { Actions } from 'thundercats';\nimport debugFactory from"
},
{
"path": "common/app/routes/Hikes/redux/reducer.js",
"chars": 2287,
"preview": "import { handleActions } from 'redux-actions';\nimport types from './types';\nimport { findNextHikeName } from './utils';\n"
},
{
"path": "common/app/routes/Hikes/redux/selectors.js",
"chars": 291,
"preview": "// use this file for common selectors\nimport { createSelector } from 'reselect';\n\nexport const getCurrentHike = createSe"
},
{
"path": "common/app/routes/Hikes/redux/types.js",
"chars": 392,
"preview": "import createTypes from '../../../utils/create-types';\n\nexport default createTypes([\n 'fetchHikes',\n 'fetchHikesComple"
}
]
// ... and 301 more files (download for full content)
About this extraction
This page contains the full source code of the FreeCodeCampChina/freecodecamp.cn GitHub repository, extracted and formatted as plain text for AI agents and large language models (LLMs). The extraction includes 501 files (7.3 MB), approximately 1.9M tokens, and a symbol index with 1486 extracted functions, classes, methods, constants, and types. Use this with OpenClaw, Claude, ChatGPT, Cursor, Windsurf, or any other AI tool that accepts text input. You can copy the full output to your clipboard or download it as a .txt file.
Extracted by GitExtract — free GitHub repo to text converter for AI. Built by Nikandr Surkov.