Question:
Typo in the challenge description !
i would like to do it :)
i would like to work on it
so would i.. :-)
Would love to work on this

"id": "bad87fee1348bd9aedf08802", "title": "Uncomment HTML", "description": [  "Commenting is a way that you can leave comments for other developers within your code without affecting the resulting output that is displayed the the end user.",   "Commenting is a way that you can leave comments for other developers within your code without affecting the resulting output that is displayed the end user.",  "Commenting is also a convenient way to make code inactive without having to delete it entirely.", "Comments in HTML starts with <!--, and ends with a -->", "
",


Question: <!-- freeCodeCamp Issue Template --<!-- Please provide as much detail as possible for us to fix your issue --<!-- Remove any heading sections you did not fill out --<!-- NOTE: If your issue is CodePen Project / Test Suite related, please open it using the below URL instead --<!-- --<!-- Insert link to challenge below -- <!-- Describe below when the issue happens and how to reproduce it --Typo in Basic CSS: Cascading CSS variables description: When you create a variable, it is becomes available for you to use inside the element in which you create it. It also becomes available within any elements nested within it. This effect is known as cascading. Correction: When you create a variable, it becomes available for you to use inside the element in which you create it. It also becomes available within any elements nested within it. This effect is known as cascading. The typo is in this file: On line: 4557 <!-- Describe your workspace in which you are having issues--Browser Name, Version: Firefox v59 Operating System: win 7 Mobile, Desktop, or Tablet: desktop <!-- If relevant, paste all of your challenge code in here --<!-- Add a screenshot of your issue --

"id": "5a9d7295424fe3d0e10cad14", "title": "Cascading CSS variables", "description": [  "When you create a variable, it is becomes available for you to use inside the element in which you create it. It also becomes available within any elements nested within it. This effect is known as <dfn>cascading</dfn>.",   "When you create a variable, it becomes available for you to use inside the element in which you create it. It also becomes available within any elements nested within it. This effect is known as <dfn>cascading</dfn>.",  "Because of cascading, CSS variables are often defined in the <dfn>:root</dfn> element.", "You can think of the :root element as a container for your entire HTML document, in the same way that an html element is a container for the body element.", "By creating your variables in :root, they will be available throughout the whole web page.",

"translations": {} } ] <del> } </del>  No newline at end of file <ins> } </ins>


Question:
<!-- freeCodeCamp Issue Template --<!-- Please provide as much detail as possible for us to fix your issue --<!-- Remove any heading sections you did not fill out --<!-- NOTE: If your issue is CodePen Project / Test Suite related, please open it using the below URL instead --<!-- --<!-- Insert link to challenge below --Link to external page with anchor elements <!-- Describe below when the issue happens and how to reproduce it --In the translation to Spanish, the instruction is: "Create an element which links to and have the anchor text "fotos de gatos". The validator says: Your a element should have the anchor text of "cat photos". This will be a trouble in all translations when the validator looks for a string given in a specific language. <!-- Describe your workspace in which you are having issues--Browser Name, Version: Operating System: Mobile, Desktop, or Tablet: <!-- If relevant, paste all of your challenge code in here --<!-- Add a screenshot of your issue --!
I can do this!
I guess an overhaul of the challenge JSON structure could go something like: But this would be a big overhaul :D

"He aquí un ejemplo:", "<p>Aquí está un <a href="https://freecodecamp.org"> enlace a freeCodeCamp</a> para que lo sigas.</p>", "
",  "Crea un elemento a que se vincule a http://freecatphotoapp.com y tenga como texto de ancla "fotos de gatos"."   "Crea un elemento a que se vincule a http://freecatphotoapp.com y tenga como texto de ancla "cat photos"."  ] }, "pt-br": {


Question:
Completing projects from the settings page, submitting a url, dose not increment the points a user has. We need to push a new timestamp to the users array.
Hi I can help out with this. Am I correct in thinking that this should be done in the file? If so, I'll look at for some guidance.

function buildCompletedChallengesUpdate(completedChallenges, project) { const key = Object.keys(project)[0]; const solutions = project[key]; <ins> const solutionKeys = Object.keys(solutions); </ins> const currentCompletedChallenges = [ ...completedChallenges ]; const currentCompletedProjects = currentCompletedChallenges <del> .filter(({id}) => Object.keys(solutions).includes(id)); </del> <ins> .filter(({id}) => solutionKeys.includes(id)); </ins> const now = Date.now(); <del> const update = Object.keys(solutions).reduce((update, currentId) => { </del> <ins> const update = solutionKeys.reduce((update, currentId) => { </ins> const indexOfCurrentId = _.findIndex( <del> currentCompletedProjects, </del> <ins> update, </ins> ({id}) => id === currentId ); const isCurrentlyCompleted = indexOfCurrentId !== -1; <del> if ( isCurrentlyCompleted && currentCompletedProjects[ indexOfCurrentId ].solution !== solutions[currentId] ) { </del> <ins> if (isCurrentlyCompleted) { </ins> update[indexOfCurrentId] = { <del> ...update[indexOfCurrentId], </del> <ins> ..._.find(update, ({id}) => id === currentId).__data, </ins> solution: solutions[currentId] }; }

], 'id' ); <del> return updatedExisting; </del> <ins> return { updated: updatedExisting, isNewCompletionCount: updatedExisting.length - completedChallenges.length }; </ins> } function isTheSame(val1, val2) {

}; User.prototype.updateMyProjects = function updateMyProjects(project) { <del> const updateData = {}; </del> <ins> const updateData = { $set: {} }; </ins> return this.getCompletedChallenges$() <del> .flatMap(completedChallenges => { updateData.completedChallenges = buildCompletedChallengesUpdate( completedChallenges, </del> <ins> .flatMap(() => { const { updated, isNewCompletionCount } = buildCompletedChallengesUpdate( this.completedChallenges, </ins> project ); <ins> updateData.$set.completedChallenges = updated; if (isNewCompletionCount) { let points = []; // give points a length of isNewCompletionCount points[isNewCompletionCount - 1] = true; updateData.$push = {}; updateData.$push.progressTimestamps = { $each: points.map(() => Date.now()) }; } </ins> return this.update$(updateData); }) .do(() => Object.assign(this, updateData))

timezone ) { let finalChallenge; <del> const updateData = { $push: {} }; </del> <ins> const updateData = {}; </ins> const { timezone: userTimezone, completedChallenges = [] } = user; const oldChallenge = _.find(

}; } <del> updateData.$push = { ...updateData.$push, completedChallenges: finalChallenge </del> <ins> updateData.$set = { completedChallenges: _.uniqBy( [finalChallenge, ...completedChallenges], 'id' ) </ins> }; if (


Question:
!
I think 'settings ' is better UI, clearer and more obvious for users. Also think 'home' would be better than clicking freeCodeCamp word and icon which doesn't actually look like a button.
I agree. We should have both: a user photo and settings link - both of which will point to the settings. Is this something you'd be interested in helping us implement?
I'd be happy to but I've got a bunch on at the moment so might be a few weeks before I get a chance to look at it. I've it to my to-do list but in the meantime anyone else can pick it up. I'll add a comment if I start working on it.
I would appreciate it if someone told me what I should do and the progress of this issue.
Are you still interested in helping tackle this issue? I think we could add both a "home" button (which would take them to the "welcome page" to the navigation, and a "settings" link to the left of their photo (both the photo and the "settings" link would redirect them to /settings).
see my email - however for this issue I think I saw something being done in another PR which has changed the navs - www, learn and settings are all now different
Yes - we're trying to make the navigation universal across different services. We will add the settings button to the nav when we do so.
Hey there, is this issue still up for grabs? Also, are the requirements still as defined in It seems like it might have changed a bit from reading the conversation above. Thanks!
pointed out to me that we have a number of different navigations. I was wondering if you would be interested in a complete nav redesign to make it more comprehensive and more user friendly?
What is the current of this issue? Can I be of any help?
Thanks for your patience. We want to build a universal navigation component that exists on every page - including the Guide and Learn. Rather than add a ton of buttons up top, we want to add a footer that has links to all the various pages currently linked from The main problem with having a footer is that the curriculum view has 3 independently scrolling elements. Would you be interested in taking a crack at designing this? And We would welcome your help as well if you're interested in collaborating on this.
I made a quick pen at one point that I thought might be a good design to implement or build on... - basically just took all the parts we have on various pages and put them together.
Here's a list of what we might want in a footer.
I suggest finalizing the links that we need to include in the footer and then start working on the footer component. here is a link to bootstrap official sticky footer template: for large number of links, It is the industry standard to group the links for the footer. so we probably need to think of that. here are some examples: khanacademy: <img width="1234" alt="screen shot 2018-12-26 at 7 07 05 pm" src="https://user-"Udacity: <img width="1216" alt="screen shot 2018-12-26 at 7 07 43 pm" src="https://user-"EDX: <img width="1192" alt="screen shot 2018-12-26 at 7 08 12 pm" src="https://user-"Slack: <img width="1304" alt="screen shot 2018-12-26 at 6 59 48 pm" src="https://user-"
Any ideas for resolving the 3 scroller issue Qunicy mentioned? I think if we had only one scroller, the user had to scroll to the bottom of the page anyway to get the footer. Right now, i get a pretty similar behavior. when I have my cursor on a scrolling component and scroll to the end I am able to go where the footer component would be. So I don't think it is a major issue because the behavior is similar.
I like the simplicity of Khan Academy's footer, with it's mission statement and call to action on the side: freeCodeCamp is a donor-supported tax-exempt 501(c)(3) nonprofit organization (United States Federal Tax Identification Number: 82-) Our mission: to help people learn to code for free. We accomplish this by creating thousands of videos, articles, and interactive coding lessons - all freely available to the public. We also have thousands of freeCodeCamp study groups around the world. Donations to freeCodeCamp go toward our education initiatives, and help pay for servers, services, and staff. You can . Columns: Our Nonprofit Our Community Our Learning Resources
Here is a quick pen. any thoughts?
This looks great! Very nice clean design, good use of whitespace, and good responsivity.
I have a working footer, and as Qunicy mentioned it does affect the user experience when placed under three scrolling divs. here are some solutions. the separating the columns separating the three panels so campers have something to grab onto to scroll the whole page rather than individual panels; a an expandable fixed bar at the bottom. a sticky expandable small footer at the bottom. removing the footer on this page. Let me know about your feedback so I could proceed with finalizing the footer. Thanks P.S there are other issues with the UI's grid system and markdown that affects the footer implementation. I addressed them in a separate issue.
There's already a lot going on in this area. More scroll bars seems like clutter and possible confusion... I like the expandable option(s) or... the footer within the lesson panel?
Thanks that is definitely an option. we should see how it would like in action. I also like the small expandable option. so if it does get in the way of the user, at least it is a small distraction. I included a gif of the current state of the footer in different screens. let me know what you think. btw, how does the style and the color look? !
Looks good, I was thinking more of a green background to match the nav, but the gray and green buttons look good... might want to get Quincy's opinion there. And actually, that looks pretty good just putting it at the bottom of the other panels... the scrollbar is hidden until you scroll down - I suppose it might be different on other browsers. It could maybe use some white space or something to separate it from the lesson panels a little. But overall, it looks real good - nice job!
I want to be an active participant in designing the footer but as you know I am presently inactive in the community. Fortunately, I landed here while I was looking at the issues. I want to share some ideas on this. Amazing work there . I am a big fan of GitHub's footer! We should do something similar. We should put the full footer only on the main homepage. Few primary links may be put on the authorized user's welcome page. Some screenshots will clear the design I have in mind. ! ! ! ! And I am totally against putting footer on the platform. Before making any UI change we should ask ourselves "As a camper will it improve my learning experience?". Putting footer on platform will not. Presently, we have a lot of scrollbars and buttons on learn platform and putting footer there will conjust things up more. So, no footer on is the way we should be going :)
thanks for the valuable input. That is the industry standard to implement footers. So ideally the footer component will receive some props depending on the page that the user is visiting and output a custom footer. Let's wait for output to see which direction he would like us to pursue.
Nice design of the footer. I was wondering if for the social media part(FB, twitter, medium, Youtube etc.) we could change it to logos.
That looks solid! Rather than simplify the footer as GitHub has done, I propose we keep it the same everywhere so people don't have to adapt to the fact that the footer changes from page to page. We want to keep our navigation up top the same on every page, too. Regarding having the footer on Learn - we do eventually want to do this, but we need to figure out how. As pointed out, with the current multi-pain scrolling, having a footer would be a pain. Let's worry about that later, and focus instead on creating a common component we can use on all the non-learn pages. Since you've already got a working design of the footer, are you interested in tackling this?

<ins> footer{ position: absolute; background-color: #E0E0E0; color:#555555; background-size: cover; font-size: .9em; width:100%; margin-top: 5px; padding-top: 40px; } footer b { padding-bottom: 5px; } </ins>

 /* eslint-disable max-len*/ import React from 'react'; import './footer.css'; function Footer() { return (

 freeCodeCamp is a donor-supported tax-exempt 501(c)(3) nonprofit organization (United States Federal Tax Identification Number: 82-0779546)

 Our mission: to help people learn to code for free. We accomplish this by creating thousands of videos, articles, and interactive coding lessons - all freely available to the public. We also have thousands of freeCodeCamp study groups around the world.

 Donations to freeCodeCamp go toward our education initiatives, and help pay for servers, services, and staff. You can  make a tax-deductible donation here.

 Our Nonprofit About  Donate Shop Sponsors Contact email

 Our Community Alumni Network  Study Groups  Forum  Gitter  GitHub Support  Code of Conduct  Privacy Policy Terms of Service

 Our Learning Resources Curriculum  Guide  Youtube  Podcast  Twitter  Medium  Instagram

  ); } export default Footer;

import OfflineWarning from '../OfflineWarning'; import Flash from '../Flash'; import Header from '../Header'; <ins> import Footer from '../Footer'; </ins> import './global.css'; import './layout.css';

) : null} {children} </div> <ins> <Footer/> </ins> </Fragment> ); }

.btn-invert { background-color: #fff; color: #006400; <del> } </del>  No newline at end of file <ins> } </ins>

} #learn-app-wrapper { <del> margin: 0 2em; position: absolute; width: 100%; right: -1.4em; padding: 5px 10px 5px 10px; </del> <ins> overflow-x:hidden; </ins> } @media screen, (max-width: 767px) {

} .reflex-layout.reflex-container.vertical { <del> width: 100%; </del> margin: 0 18px; }


Question:
<!-- NOTE: If you're reporting a security issue, don't create a GitHub issue. Instead, email We will look into it immediately. --There is a type in the challenge "Basic CSS - Use CSS Variables to change several elements at once" The tests are asking the user to update the colours for three times, where it should be , and respectively Browser Name: Chrome Browser Version: 66.0.3359.181 Operating System: macOS Sierra 10.12.6 !
I'd be happy to make a pull request, but I don't know where to find the code
Hi I just ran into this issue too. I think you can found the code on . It's from line 4303.
Since it was a typo on the assignment why was it not changed simple penguin class should declare the --penguin-skin variable and assign it to gray. Passed penguin class should declare the --penguin-belly variable and assign it to white. Passed penguin class should declare the --penguin-beak variable and assign it to orange. Instead of all these plenty grammar and drama

"testString": "assert(code.match(/.penguins*?{[sS]*--penguin-skins*?:s*?grays*?;[sS]*}/gi), 'penguin class should declare the --penguin-skin variable and assign it to gray.');" }, {  "text": "penguin class should declare the --penguin-skin variable and assign it to white.", "testString": "assert(code.match(/.penguins*?{[sS]*--penguin-bellys*?:s*?whites*?;[sS]*}/gi), 'penguin class should declare the --penguin-skin variable and assign it to white.');"   "text": "penguin class should declare the --penguin-belly variable and assign it to white.", "testString": "assert(code.match(/.penguins*?{[sS]*--penguin-bellys*?:s*?whites*?;[sS]*}/gi), 'penguin class should declare the --penguin-belly variable and assign it to white.');"  }, {  "text": "penguin class should declare the --penguin-skin variable and assign it to orange.", "testString": "assert(code.match(/.penguins*?{[sS]*--penguin-beaks*?:s*?oranges*?;[sS]*}/gi), 'penguin class should declare the --penguin-skin variable and assign it to orange.');"   "text": "penguin class should declare the --penguin-beak variable and assign it to orange.", "testString": "assert(code.match(/.penguins*?{[sS]*--penguin-beaks*?:s*?oranges*?;[sS]*}/gi), 'penguin class should declare the --penguin-beak variable and assign it to orange.');"  } ], "solutions": [],


Question:
<!-- NOTE: If you're reporting a security issue, don't create a GitHub issue. Instead, email We will look into it immediately. --Extra padding seems to appear at the bottom of the page after finishing a challenge and moving on to the next. The extra padding disappears when the page is refreshed. Occurs and reproducible on some challenges. Used screen resolution is 1366x768. Browser Name: Firefox Nightly Browser Version: 62.0a1 Operating System: Kubuntu 18.04 ! !
Is this still a problem
Yep, still present. Tested on Manjaro, Firefox Nightly 67.0a1 and Firefox 65.0 in safe mode and on different profiles.
Can you checkout our which has many changes which may have resolved this issue. If it is still present, then we can label it as such. Also, just to make it clear, can you maybe highlight or circle where you are seeing this extra padding on a screenshot? Thank you.
can confirm this still happens on Seems like the completion modal causes the text in the description to shift by a pixel or two.
Steps to reproduce: Use Firefox Go to Currently you can scroll to the bottom and see no white padding Click on line 2 of the editor and hit Ctrl-Space to get suggestions and then Ctrl-Enter to run the tests Now scroll to the bottom and see that the padding is visible ! This is caused by the div which should be visually hidden, but is actually sitting at the bottom of the page. I'll submit a PR fixing this shortly.

letter-spacing: 0.02em; } <ins> .monaco-aria-container { top: -999em; } </ins> #challenge-page-tabs .nav-tabs { margin-left: 2px; display: flex;


Question:
<!-- NOTE: If you're reporting a security issue, don't create a GitHub issue. Instead, email We will look into it immediately. --Line breaks are missing in the example code. How to reproduce: Access the URL below Browser Name: Chrome Browser Version: 67.0.3396.79 Operating System: Windows 10 !
to fix this replace all the with on this line
working on fixing this.

"id": "598f48a36c8c40764b4e52b3", "title": "Prevent Object Mutation", "description": [  "As seen in previous challenge, const declaration alone doesn't really protect your data from mutation. To ensure your data doesn't change, JavaScript provides a function Object.freeze to prevent data mutation.", "Once the object is freezed, you can no longer add/update/delete properties from it. Any attempt at changing the object will be rejected without any error.", "
nlet obj = {n  name:"FreeCodeCamp"n  review:"Awesome"n};nObject.freeze(obj);nobj.review = "bad"; //will be ignored. Mutation not allowednobj.newProp = "Test"; // will be ignored. Mutation not allowednconsole.log(obj); n// { name: "FreeCodeCamp", review:"Awesome"}n
",   "As seen in the previous challenge, const declaration alone doesn't really protect your data from mutation. To ensure your data doesn't change, JavaScript provides a function Object.freeze to prevent data mutation.", "Once the object is frozen, you can no longer add, update, or delete properties from it. Any attempt at changing the object will be rejected without an error.", "

let obj = {
  name:"FreeCodeCamp"
  review:"Awesome"
};
Object.freeze(obj);
obj.review = "bad"; //will be ignored. Mutation not allowed
obj.newProp = "Test"; // will be ignored. Mutation not allowed
console.log(obj);
// { name: "FreeCodeCamp", review:"Awesome"}

",  "
",  "In this challenge you are going to use Object.freeze to prevent mathematical constants from changing. You need to freeze MATH_CONSTANTS object so that noone is able alter the value of PI or add any more properties to it."   "In this challenge you are going to use Object.freeze to prevent mathematical constants from changing. You need to freeze the MATH_CONSTANTS object so that no one is able alter the value of PI, add, or delete properties ."  ], "tests": [ {


Question:
I found a subtle bug while doing the “React: Write a Simple Counter” challenge. If you look at the code below you’ll see that I binded this in to the this .decrement method. It should be: The consequence of this error is that clicking the reset button which calls does not reset the counter and decrements it instead. However, when I run the tests, all the tests are passed and the error is not detected! I think we need to add an additional test for that specific scenario. Browser Name: Chrome Browser Version: 67 Operating System: Mac OS X
I run to this same error just now. Accidentally, I entered which is wrong but it passed the test.
I think we need to check this with a RegEx. What are your opinions and ?
Is there any update on this issue? I could work on this bug.
As of yet, we have not come to a conclusion about what to do on this issue. Although, since this is a confirmed issue, please suggest how you'd like to go ahead with this over here
In terms of the buggy code provided in this issue, I think only the last test case is wrong. Left part is the original version. Right part is the new version I made. ! I checked if my changes work on local host. After I made the change, we can see that the last test fails when I provide the wrong solution codes. ! And the last test passes when I provide the correct solution codes. !
This looks pretty good to me. I see you've made a PR, that's great, we'll QA that soon

- text: Clicking the decrement button should decrement the count by 1. testString: 'async () => { const waitForIt = (fn) => new Promise((resolve, reject) => setTimeout(() => resolve(fn()), 250)); const mockedComponent = Enzyme.mount(React.createElement(Counter)); const first = () => { mockedComponent.setState({ count: 0 }); return waitForIt(() => mockedComponent.state(''count'')); }; const second = () => { mockedComponent.find(''.dec'').simulate(''click''); return waitForIt(() => mockedComponent.state(''count'')); }; const firstValue = await first(); const secondValue = await second(); assert(firstValue === 0 && secondValue === -1, ''Clicking the decrement button should decrement the count by 1.''); }; ' - text: Clicking the reset button should reset the count to 0.  testString: 'async () => { const waitForIt = (fn) => new Promise((resolve, reject) => setTimeout(() => resolve(fn()), 250)); const mockedComponent = Enzyme.mount(React.createElement(Counter)); const init = () => { mockedComponent.setState({ count: 0 }); return waitForIt(() => mockedComponent.state(''count'')); }; const increment = () => { mockedComponent.find(''.inc'').simulate(''click''); mockedComponent.find(''.inc'').simulate(''click''); return waitForIt(() => mockedComponent.state(''count'')); }; const decrement = () => { mockedComponent.find(''.dec'').simulate(''click''); return waitForIt(() => mockedComponent.state(''count'')); }; const reset = () => { mockedComponent.find(''.reset'').simulate(''click''); return waitForIt(() => mockedComponent.state(''count'')); }; const firstValue = await init(); const secondValue = await increment(); const thirdValue = await decrement(); const fourthValue = await reset(); assert(firstValue === 0 && secondValue === 2 && thirdValue === 1 && fourthValue === 0, ''Clicking the reset button should reset the count to 0.''); }; '   testString: 'async () => { const waitForIt = (fn) => new Promise((resolve, reject) => setTimeout(() => resolve(fn()), 250)); const mockedComponent = Enzyme.mount(React.createElement(Counter)); const init = () => { mockedComponent.setState({ count: 0 }); return waitForIt(() => mockedComponent.state(''count'')); }; const increment = () => { mockedComponent.find(''.inc'').simulate(''click''); mockedComponent.find(''.inc'').simulate(''click''); mockedComponent.find(''.inc'').simulate(''click''); return waitForIt(() => mockedComponent.state(''count'')); }; const decrement = () => { mockedComponent.find(''.dec'').simulate(''click''); return waitForIt(() => mockedComponent.state(''count'')); }; const reset = () => { mockedComponent.find(''.reset'').simulate(''click''); return waitForIt(() => mockedComponent.state(''count'')); }; const firstValue = await init(); const secondValue = await increment(); const thirdValue = await decrement(); const fourthValue = await reset(); assert(firstValue === 0 && secondValue === 3 && thirdValue === 2 && fourthValue === 0, ''Clicking the reset button should reset the count to 0.''); }; '  ```


Question:
<!-- NOTE: If you're reporting a security issue, don't create a GitHub issue. Instead, email We will look into it immediately. --From CSS variable lesson, I just want to inform that IE doesn't supports as well as it's fallback value. It'd be great if your team will curate those lessons/challenges or add alternate CSS property with that. Started from lesson. Browser Name: Chrome Browser Version: 67+ Operating System: Windows 10
Thanks for raising this. Fallbacks as described in this lesson are not for older browsers that lack CSS variable support, they are for when the variable has not been defined yet, or otherwise not able to be resolved. The technique you mention of using a preceding more broadly supported CSS rule is also referred to as a fallback. Ideally, I think there should be two lessons, one describing each. whats the situation with adding additional lessons?
yes we are open to adding new lessons.
what did you have in mind for additional lessons? How about just a message in the first variable lesson that or something
In my opinion: needs corrected additional lesson should be after the lessons in screenshot below, lesson to show how to use this principle to form resilient css - ie fallback behaviour for css rules not understood by browser !
I'd like to work on this. Should I lump this all into on PR or separate it into two since part one is technically a fix while part two is a feature?
great! Looking forward to seeing what you come up with. I would say it's better to have two separate PRs, one for the fix and another for the new lesson.


Question:
<!-- NOTE: If you're reporting a security issue, don't create a GitHub issue. Instead, email We will look into it immediately. --From CSS variable lesson, I just want to inform that IE doesn't supports as well as it's fallback value. It'd be great if your team will curate those lessons/challenges or add alternate CSS property with that. Started from lesson. Browser Name: Chrome Browser Version: 67+ Operating System: Windows 10
Thanks for raising this. Fallbacks as described in this lesson are not for older browsers that lack CSS variable support, they are for when the variable has not been defined yet, or otherwise not able to be resolved. The technique you mention of using a preceding more broadly supported CSS rule is also referred to as a fallback. Ideally, I think there should be two lessons, one describing each. whats the situation with adding additional lessons?
yes we are open to adding new lessons.
what did you have in mind for additional lessons? How about just a message in the first variable lesson that or something
In my opinion: needs corrected additional lesson should be after the lessons in screenshot below, lesson to show how to use this principle to form resilient css - ie fallback behaviour for css rules not understood by browser !
I'd like to work on this. Should I lump this all into on PR or separate it into two since part one is technically a fix while part two is a feature?
great! Looking forward to seeing what you come up with. I would say it's better to have two separate PRs, one for the fix and another for the new lesson.

"tests": [ "assert.deepEqual(chunk(['a', 'b', 'c', 'd'], 2), [['a', 'b'], ['c', 'd']], 'should return chunked arrays');", "assert.deepEqual(chunk([0, 1, 2, 3, 4, 5], 3), [[0, 1, 2], [3, 4, 5]], 'should return chunked arrays');", <del> "assert.deepEqual(chunk([0, 1, 2, 3, 4, 5], 4), [[0, 1, 2, 3], [4, 5]], 'should return cthe last chunk as remaining elements');" </del> <ins> "assert.deepEqual(chunk([0, 1, 2, 3, 4, 5], 4), [[0, 1, 2, 3], [4, 5]], 'should return the last chunk as remaining elements');" </ins> ] }, {


"testString": "assert(code.match(/.reduce/g), 'Your code should use the reduce method.');" }, {  "text": "The averageRating should equal 8.675.", "testString": "assert(averageRating == 8.675, 'The averageRating should equal 8.675.');"   "text": "The averageRating should equal 8.52.", "testString": "assert(averageRating == 8.52, 'The averageRating should equal 8.52.');"  }, { "text": "Your code should not use a for loop.",

} } ] <del> } </del>  No newline at end of file <ins> } </ins>


Question:
Typo in the description. !
Just to make it clear, you are suggesting to change to . Is there any other typos that you found in this challenge?
Correct. That's the only typo I have found. I know it's minor issue but it will be a good opportunity to fix for beginners.
this is the file with the typo -
I am a little confused about challenge files. What about this file in repo? Where should one correct the mistakes?
im confused at the moment as well - there's some changes in progress regarding where the challenges are so I'm not sure if we should be making PR's involving seed files to the main repo or the curriculum repo - I would guess it will be over there in future but at the moment I'm not sure what's best
For now I am solving all typos in curriculum, so if anyone finds any typo in the challenges please refer me.

"title": "Set a Content Security Policy with helmet.contentSecurityPolicy()", "description": [ "As a reminder, this project is being built upon the following starter project on Glitch, or cloned from GitHub.",  "This challenge highlights one promising new defense that can significantly reduce the risk and impact of many type of attacks in modern browsers. By setting and configuring a Content Security Policy you can prevent the injection of anything unintended into your page. This will protect your app from XSS vulnerabilities, undesired tracking, malicious frames, and much more. CSP works by defining a whitelist of content sources which are trusted. You can configure them for each kind of resource a web page may need (scripts, stylesheets, fonts, frames, media, and so on…). There are multiple directives available, so a website owner can have a granular control. See HTML 5 Rocks, KeyCDN for more details. Unfortunately CSP in unsupported by older browser.",   "This challenge highlights one promising new defense that can significantly reduce the risk and impact of many type of attacks in modern browsers. By setting and configuring a Content Security Policy you can prevent the injection of anything unintended into your page. This will protect your app from XSS vulnerabilities, undesired tracking, malicious frames, and much more. CSP works by defining a whitelist of content sources which are trusted. You can configure them for each kind of resource a web page may need (scripts, stylesheets, fonts, frames, media, and so on…). There are multiple directives available, so a website owner can have a granular control. See HTML 5 Rocks, KeyCDN for more details. Unfortunately CSP is unsupported by older browser.",  "By default, directives are wide open, so it’s important to set the defaultSrc directive as a fallback. Helmet supports both defaultSrc and default-src naming styles. The fallback applies for most of the unspecified directives. In this exercise, use helmet.contentSecurityPolicy(), and configure it setting the defaultSrc directive to ["self"] (the list of allowed sources must be in an array), in order to trust only your website address by default. Set also the scriptSrc directive so that you will allow scripts to be downloaded from your website, and from the domain 'trusted-cdn.com'.", "Hint: in the "'self'" keyword, the single quotes are part of the keyword itself, so it needs to be enclosed in double quotes to be working." ],


Question:
<!-- NOTE: If you're reporting a security issue, don't create a GitHub issue. Instead, email We will look into it immediately. --In this sentence, the emphasized "then" should be "than". Link to file: Link to page:
Yes, it is a grammatical error. Thx for pointing it out. PR done in curriculum module.

} ]); <ins> profileValidation.controller('nonprofitFormController', ['$scope', function($scope) { } ]); </ins> profileValidation.directive('uniqueUsername', function($http) { return { restrict: 'A',

li &#8226 Understand that they will build your project using JavaScript frameworks (as opposed to older or proprietary tools) li &#8226 Keep your expectations high. Our students' goal is to produce work that's up to your standards h3 If you're OK with these terms, great! We'd love to help you! Fill in this form and we'll get right back to you. <del> form.form-horizontal(role='form', action="/nonprofits/", method='POST') </del> <ins> form.form-horizontal(role='form', action="/nonprofits/", method='POST', novalidate='novalidate', name='nonprofitForm') </ins> input(type='hidden', name='_csrf', value=_csrf) .form-group <del> label(class='col-sm-2 control-label', for='name') Your name </del> <ins> label(class='col-sm-2 control-label', for='name') Your name * </ins> .col-sm-8 <del> input.form-control(type='text', name='name', id='name') </del> <ins> input.form-control(type='text', name='name', id='name', autocomplete="off", ng-model='name', required='required') .col-sm-8.col-sm-offset-2(ng-show="nonprofitForm.name.$invalid && nonprofitForm.name.$error.required && !nonprofitForm.name.$pristine") alert(type='danger') span.ion-close-circled(id='#name-error') |  Your name is required. </ins> .form-group <del> label(class='col-sm-2 control-label', for='email') Your email </del> <ins> label(class='col-sm-2 control-label', for='email') Your email * </ins> .col-sm-8 <del> input.form-control(type='text', name='email', id='email') </del> <ins> input.form-control(type='text', name='email', id='email', autocomplete="off", ng-model='email', required='required') .col-sm-8.col-sm-offset-2(ng-show="nonprofitForm.email.$invalid && nonprofitForm.email.$error.required && !nonprofitForm.email.$pristine") alert(type='danger') span.ion-close-circled(id='#email-error'). Your email is required. </ins> .form-group <del> label(class='col-sm-2 control-label', for='message') Briefly describe what problem you need to solve, and for whom. </del> <ins> label(class='col-sm-2 control-label', for='message') Briefly describe what problem you need to solve, and for whom. * </ins> .col-sm-8 <del> textarea.form-control(type='text', name='message', id='message', rows='7') </del> <ins> textarea.form-control(type='text', name='message', id='message', rows='7', autocomplete="off", ng-model='message', required='required') .col-sm-8.col-sm-offset-2(ng-show="nonprofitForm.message.$invalid && nonprofitForm.message.$error.required && !nonprofitForm.message.$pristine") alert(type='danger') span.ion-close-circled(id='#message-error') | Your message is required. </ins> .form-group .col-sm-offset-2.col-sm-8 <del> button.btn.btn-primary(type='submit') </del> <ins> button.btn.btn-primary(type='submit', ng-disabled='nonprofitForm.$invalid') </ins> span.ion-paper-airplane <del> | Submit </del> <ins> | Submit </ins>  No newline at end of file


Question:
<!-- NOTE: If you're reporting a security issue, don't create a GitHub issue. Instead, email We will look into it immediately. --In "" it mentions: I do not see those lessons anywhere. Is there an hidden module somewhere I don't know of? Or is that text that is a legacy of the previous curriculum? Browser Name: Browser Version: Operating System:
Check under Coding Interview Prep (Thousands of hours of challenges)
perhaps the title in there should be renamed to
I think that now with the new curriculum, this is fixed?
The "advanced" section would be those challenge located in the Data Structure Questions in the Coding Interview Prep section. I am thinking the easiest solution this is to rewrite the following sentence from: to something like:
Yes. That should be fine.
I'll take this up.
Go for it. No one else has asked for it.
I had the same question, so I came here, So the answer is Advanced Data Structures located in Coding Interview Prep (Thousands of hours of challenges) Data Structures , am I right ? Why doesn't any admin/mod rewrite as RandellDawson said so no one has this question and come here again ? Thanks
What exactly are you trying to do?
Same as OP, I cannot see the Advanced Data Structures lesson on FCC
They are not called Advanced Data Structures lessons. They are just called Data Structures and they are in the Coding Interview Prep section of the curriculum !
oh man, You didn't get me, I said above : Why doesn't any admin/mod rewrite as RandellDawson said so no one has this question and come here again ? Thanks I read completely this issues and got the answer, just ask why admin/mod doesn't change as you said, so no one will get confused like me or OP again,
We decided to just modify the text of the challenge to the following: Additionally, the Data Structures lessons located in the Coding Interview Prep section of the curriculum also cover the ES6 Map and Set objects, both of which are similar to ordinary objects but provide some additional features. This was done to minimize the need to update several other sections. We feel it does not make any difference if it is renamed or just remain section. We hope to have the changes made deployed to the production site very soon.

## Description <section id='description'> <del> Now you've seen all the basic operations for JavaScript objects. You can add, modify, and remove key-value pairs, check if keys exist, and iterate over all the keys in an object. As you continue learning JavaScript you will see even more versatile applications of objects. Additionally, the optional Advanced Data Structures lessons later in the curriculum also cover the ES6 <dfn>Map</dfn> and <dfn>Set</dfn> objects, both of which are similar to ordinary objects but provide some additional features. Now that you've learned the basics of arrays and objects, you're fully prepared to begin tackling more complex problems using JavaScript! </del> <ins> Now you've seen all the basic operations for JavaScript objects. You can add, modify, and remove key-value pairs, check if keys exist, and iterate over all the keys in an object. As you continue learning JavaScript you will see even more versatile applications of objects. Additionally, the Data Structures lessons located in the Coding Interview Prep section of the curriculum also cover the ES6 <dfn>Map</dfn> and <dfn>Set</dfn> objects, both of which are similar to ordinary objects but provide some additional features. Now that you've learned the basics of arrays and objects, you're fully prepared to begin tackling more complex problems using JavaScript! </ins> </section> ## Instructions


Question:
the first line in the function says - it wont pass testing unless you change it to Browser Name: Firefox Browser Version: 60.0.1 Operating System: High Sierra ! <hr!
You don't have to it, but because of strict mode it does need to be declared with , , or .
so its missing the then?
That's how I would update it.

'*.ionicframework.com', 'https://syndication.twitter.com', '*.youtube.com', <ins> 'cdn.jsdelivr.net/' </ins> ]; app.use(helmet.contentSecurityPolicy({

// (re)initializes the plugin var reset = function() { requests = 0; <del> plugin = new jailed.Plugin(path+'plugin_v0.1.2.js', api); </del> <ins> plugin = new jailed.Plugin(path+'plugin_v0.1.3.js', api); </ins> plugin.whenDisconnected( function() { // give some time to handle the last responce setTimeout( function() {

<del> // executes the given code and handles the result var run = function(code) { var result = { input: code, output: null, error: null, type: null }; try { var codeExec = runHidden(code); result.type = typeof codeExec; result.output = stringify(codeExec); } catch(e) { result.error = e.message; } application.remote.output(result); }; // protects even the worker scope from being accessed var runHidden = function(code) { var indexedDB = null; var location = null; var navigator = null; var onerror = null; var onmessage = null; var performance = null; var self = null; var webkitIndexedDB = null; var postMessage = null; var close = null; var openDatabase = null; var openDatabaseSync = null; var webkitRequestFileSystem = null; var webkitRequestFileSystemSync = null; var webkitResolveLocalFileSystemSyncURL = null; var webkitResolveLocalFileSystemURL = null; var addEventListener = null; var dispatchEvent = null; var removeEventListener = null; var dump = null; var onoffline = null; var ononline = null; var importScripts = null; return eval(code); } // converts the output into a string var stringify = function(output) { var result; if (typeof output == 'undefined') { result = 'undefined'; } else if (output === null) { result = 'null'; } else { result = JSON.stringify(output) || output.toString(); } return result; } application.setInterface({run:run}); </del>

<ins> // executes the given code and handles the result var run = function(code) { var result = { input: code, output: null, error: null, type: null }; try { var codeExec = runHidden(code); result.type = typeof codeExec; result.output = stringify(codeExec); } catch(e) { result.error = e.message; } application.remote.output(result); }; // protects even the worker scope from being accessed var runHidden = function(code) { var importScript = function(url) { var error = null; try { importScripts(url); } catch (e) { error = e; console.log('Unable to load ramda!'); } }; var indexedDB = null; var location = null; var navigator = null; var onerror = null; var onmessage = null; var performance = null; var self = null; var webkitIndexedDB = null; var postMessage = null; var close = null; var openDatabase = null; var openDatabaseSync = null; var webkitRequestFileSystem = null; var webkitRequestFileSystemSync = null; var webkitResolveLocalFileSystemSyncURL = null; var webkitResolveLocalFileSystemURL = null; var addEventListener = null; var dispatchEvent = null; var removeEventListener = null; var dump = null; var onoffline = null; var ononline = null; importScript("https://cdn.jsdelivr.net/ramda/0.10.0/ramda.min.js"); var _ = R; return eval(code); } // converts the output into a string var stringify = function(output) { var result; if (typeof output == 'undefined') { result = 'undefined'; } else if (output === null) { result = 'null'; } else { result = JSON.stringify(output) || output.toString(); } return result; } application.setInterface({run:run}); </ins>

<ins> /** * Created by nathanleniz on 2/21/15. */ var R = require('ramda'); </ins>  No newline at end of file

<ins> //  Ramda v0.10.0 //  https://github.com/ramda/ramda //  (c) 2013-2015 Scott Sauyet and Michael Hurley //  Ramda may be freely distributed under the MIT license. (function(){"use strict";var n={ramda:"placeholder"},t=function(n,t){return n+t},r=function(n,t){for(var r=-1;++r<t.length;)if(!n(t[r]))return!1;return!0},e=function(n,t){for(var r=-1;++r<t.length;)if(n(t[r]))return!0;return!1},u=function(n,t){return function(){return n.call(this,t.apply(this,arguments))}},i=function(n,t){n=n||[],t=t||[];var r,e=n.length,u=t.length,i=new Array(e+u);for(r=-1;++r<e;)i[r]=n[r];for(r=-1;++r<u;)i[e+r]=t[r];return i},o=function(n,t,r){for(var e=-1,u=r.length;++e<u;)if(n(t,r[e]))return!0;return!1},c=function(n){return function(t,r){if(r&&r.length>0){for(var e,u=0,i=r[u],o=t(i);++u<r.length;)e=t(r[u]),n(e,o)&&(o=e,i=r[u]);return i}}},a=function(n,t){for(var r=-1,e=t.length,u=[];++r<e;)n(t[r])&&(u[u.length]=t[r]);return u},f=function(n,t){for(var r=-1,e=t.length,u=[];++r<e;)n(t[r],r,t)&&(u[u.length]=t[r]);return u},l=function(n,t){for(var r=-1,e=t.length;++r<e;)n(t[r]);return t},s=function(n){return function(t){return a(function(n){return"function"==typeof t[n]},n(t))}},h=function(n,t){return n>t},g=function(n,t,r){var e=0,u=n.length;for("number"==typeof r&&(e=0>r?Math.max(0,u+r):r);u>e;){if(n[e]===t)return e;++e}return-1},p=Array.isArray||function(n){return null!=n&&n.length>=0&&"[object Array]"===Object.prototype.toString.call(n)},m=Number.isInteger||function(n){return n<<0===n},y=function(n){return null!=n&&n===Object(n)&&"function"==typeof n.then},v=function(n,t,r){var e=n.length;for("number"==typeof r&&(e=0>r?e+r+1:Math.min(e,r+1));--e>=0;)if(n[e]===t)return e;return-1},d=function(n,t){return t>n},w=function(n,t){for(var r=-1,e=t.length,u=new Array(e);++r<e;)u[r]=n(t[r]);return u},b=function(n,t){return n*t},O=function(){return new TypeError("Function called with no arguments")},j=function(n,t){return 0>n?t[t.length+n]:t[n]},x=function(n){return function(t){return w(function(n){return[n,t[n]]},n(t))}},A=function(n,t){var r,e=-1,u=n.length;if(null!=t){for(r=t;null!=r&&++e<u;)r=r[n[e]];return r}},I=function(n,t){var r={};return l(function(n){r[n]=t[n]},n),r},E=function(n,t){return i([n],t)},k=function(n,t,r){for(var e=-1,u=r.length;++e<u;)t=n(t,r[e]);return t},M=function(n,t,r){if(n===r)return!0;if(null==r)return!1;t.fn=t.fn||[],t.obj=t.obj||[];for(var e,u,i=-1,o=t.fn.length,c=-1,a=t.obj.length;++i<o;){if(e=t.fn[i],u=n[e],!(e in r))return!1;if(!u(r[e],r))return!1}for(;++c<a;)if(e=t.obj[c],n[e]!==r[e])return!1;return!0},P=function qu(n,t,r){switch(arguments.length){case 0:throw O();case 1:return qu(n,0,n.length);case 2:return qu(n,t,n.length);default:for(var e=Math.max(0,r-t),u=new Array(e),i=-1;++i<e;)u[i]=n[t+i];return u}},T=function(n){return function(){return n}},S=function(n,t){switch(n){case 0:return function(){return t.apply(this,arguments)};case 1:return function(n){return t.apply(this,arguments)};case 2:return function(n,r){return t.apply(this,arguments)};case 3:return function(n,r,e){return t.apply(this,arguments)};case 4:return function(n,r,e,u){return t.apply(this,arguments)};case 5:return function(n,r,e,u,i){return t.apply(this,arguments)};case 6:return function(n,r,e,u,i,o){return t.apply(this,arguments)};case 7:return function(n,r,e,u,i,o,c){return t.apply(this,arguments)};case 8:return function(n,r,e,u,i,o,c,a){return t.apply(this,arguments)};case 9:return function(n,r,e,u,i,o,c,a,f){return t.apply(this,arguments)};case 10:return function(n,r,e,u,i,o,c,a,f,l){return t.apply(this,arguments)};default:throw new Error("First argument to arity must be a non-negative integer no greater than ten")}},W=function(n){return n.apply(this,P(arguments,1))},N=function(n){return function(t,r){return n(t,r)?-1:n(r,t)?1:0}},R=function(){var n=arguments;return function(){for(var t=-1;++t<n.length;)if(n[t][0].apply(this,arguments))return n[t][1].apply(this,arguments)}},q=function(n){var t=P(arguments,1);return function(){var r=arguments;return n.apply(this,w(function(n){return n.apply(this,r)},t))}},C=function(n){return function(t,r){switch(arguments.length){case 0:throw O();case 1:return function(r){return n.apply(this,[r,t].concat(P(arguments,1)))};default:return n.apply(this,i([r,t],P(arguments,2)))}}},L=function(n){for(var t=-1,r=n.length,e={};++t<r;)p(n[t])&&n[t].length&&(e[n[t][0]]=n[t][1]);return e},B=function(n,t){switch(arguments.length){case 0:throw O();case 1:return function(t){return t[n].apply(t,P(arguments,1))};default:return t[n].apply(t,P(arguments,2))}},F=function(n){return n},z=function(n){return p(n)?!0:n?"object"!=typeof n?!1:n instanceof String?!1:1===n.nodeType?!!n.length:0===n.length?!0:n.length>0?n.hasOwnProperty(0)&&n.hasOwnProperty(n.length-1):!1:!1},D=function(n){return 0===Object(n).length},U=function(n){return null==n},_=function(n){for(var t=n.length,r=-1;++r<t;)if(g(n,n[r],r+1)>=0)return!1;return!0},$=function(n){var t,r=[];for(t in n)r[r.length]=t;return r},G=function(n,t){switch(n){case 0:return function(){return t.call(this)};case 1:return function(n){return t.call(this,n)};case 2:return function(n,r){return t.call(this,n,r)};case 3:return function(n,r,e){return t.call(this,n,r,e)};case 4:return function(n,r,e,u){return t.call(this,n,r,e,u)};case 5:return function(n,r,e,u,i){return t.call(this,n,r,e,u,i)};case 6:return function(n,r,e,u,i,o){return t.call(this,n,r,e,u,i,o)};case 7:return function(n,r,e,u,i,o,c){return t.call(this,n,r,e,u,i,o,c)};case 8:return function(n,r,e,u,i,o,c,a){return t.call(this,n,r,e,u,i,o,c,a)};case 9:return function(n,r,e,u,i,o,c,a,f){return t.call(this,n,r,e,u,i,o,c,a,f)};case 10:return function(n,r,e,u,i,o,c,a,f,l){return t.call(this,n,r,e,u,i,o,c,a,f,l)};default:throw new Error("First argument to nAry must be a non-negative integer no greater than ten")}},H=function(n){return function(){return!n.apply(this,arguments)}},J=function(n){return function(){return j(n,arguments)}},K=function(n){return[n]},Q=function(n){var t,r=!1;return function(){return r?t:(r=!0,t=n.apply(this,arguments))}},V=C(E),X=function(n,t){switch(arguments.length){case 0:throw O();case 1:return function(t){return t[n]}}return t[n]},Y=C(X),Z=function(n){return P(n).reverse()},nt=x($),tt=function(){var n="	nfr                　u2028u2029",t="",r="function"==typeof String.prototype.trim;return r&&!n.trim()&&t.trim()?function(n){return n.trim()}:function(t){var r=new RegExp("^["+n+"]["+n+"]*"),e=new RegExp("["+n+"]["+n+"]*$");return t.replace(r,"").replace(e,"")}}(),rt=function(n){return null===n?"Null":void 0===n?"Undefined":Object.prototype.toString.call(n).slice(8,-1)},et=function(n){if(0===arguments.length)throw O();return function(){return n(P(arguments))}},ut=function(n){return G(1,n)},it=function(n){var t,r=[];for(t in n)r[r.length]=n[t];return r},ot=T(!1),ct=F,at=T(!0),ft=function(n,t){return i(t,[n])},lt=function Cu(n,t,r){var e=function(e){for(var u=t.length,i=-1;++i<u;)if(n===t[i])return r[i];t[t.length]=n,r[r.length]=e;for(var o in n)e[o]=Cu(n[o],t,r);return e};switch(rt(n)){case"Object":return e({});case"Array":return e([]);case"Date":return new Date(n);default:return n}},st=function(n,t){return function(r,e,u){var i=arguments.length,o=arguments[i-1],c=o&&!p(o)&&"function"==typeof o[n];switch(arguments.length){case 0:return t();case 1:return c?o[n]():t(r);case 2:return c?o[n](r):t(r,e);case 3:return c?o[n](r,e):t(r,e,u)}}},ht=function(n,t){return function(){var r=this,e=t.apply(this,arguments);return y(e)?e.then(function(t){return n.call(r,t)}):n.call(this,e)}},gt=function(n,t){return g(t,n)>=0},pt=function(n){return function(){switch(arguments.length){case 0:throw O();case 1:return arguments[0];default:for(var t=arguments.length-1,r=arguments[t],e=r.length;t--;)r=n(arguments[t],r);return S(e,r)}}},mt=function(n,t){return function(r){if(0===arguments.length)throw O();for(var e,u=-1,i=t;++u<r.length;)e=+r[u],n(e,i)&&(i=e);return i}},yt=function(n){return function(t){var r=P(arguments,1);return S(Math.max(0,t.length-r.length),function(){return t.apply(this,n(r,arguments))})}},vt=function(n){return function(t,r){switch(arguments.length){case 0:throw O();case 1:return function(r){return n(t,r)};default:return n(t,r)}}},dt=function(n){return function(t,r,e){switch(arguments.length){case 0:throw O();case 1:return vt(function(r,e){return n(t,r,e)});case 2:return function(e){return n(t,r,e)};default:return n(t,r,e)}}},wt=function(n,t){return null!=t&&!p(t)&&"function"==typeof t[n]},bt=function(n){return function t(r){for(var e,u,i,o=[],c=-1,a=r.length;++c<a;)if(z(r[c]))for(e=n?t(r[c]):r[c],u=-1,i=e.length;++u<i;)o[o.length]=e[u];else o[o.length]=r[c];return o}},Ot=function(n,t){for(var r,e={},u=$(t),i=u.length,o=-1;++o<i;)r=u[o],n(t[r],r,t)&&(e[r]=t[r]);return e},jt=function(n,t){return w(X(n),t)},xt=vt(t),At=vt(r),It=vt(function(n,t){return function(){return n.apply(this,arguments)&&t.apply(this,arguments)}}),Et=vt(e),kt=vt(ft),Mt=C(ft),Pt=vt(function(n,t){return n.apply(this,t)}),Tt=function(n){return G(2,n)},St=vt(function(n,t){return function(){return n.apply(t,arguments)}}),Wt=function(n){return lt(n,[],[])},Nt=pt(u),Rt=pt(ht),qt=dt(o),Ct=vt(function(n,t){var r={};return r[n]=t,r}),Lt=vt(function(n,t){return function r(e){return S(Math.max(n-(e&&e.length||0),0),function(){if(0===arguments.length)throw O();var u=i(e,arguments);return u.length>=n?t.apply(this,u):r(u)})}([])}),Bt=xt(-1),Ft=vt(function(n,t){return null==t?n:t}),zt=vt(function(n,t){for(var r=[],e=-1,u=n.length;++e<u;)gt(n[e],t)||gt(n[e],r)||(r[r.length]=n[e]);return r}),Dt=dt(function(n,t,r){for(var e=[],u=-1,i=t.length,o=qt(n);++u<i;)o(t[u],r)||o(t[u],e)||(e[e.length]=t[u]);return e}),Ut=vt(function(n,t){return Ot(function(t,r){return r!==n},t)}),_t=vt(st("drop",function(n,t){return n<t.length?P(t,n):[]})),$t=vt(function(n,t){for(var r=-1,e=t.length;++r<e&&n(t[r]););return P(t,r)}),Gt=function(n){return wt("empty",n)?n.empty():[]},Ht=vt(function(n,t){return 0===n?1/n===1/t:n===t||n!==n&&t!==t}),Jt=dt(function(n,t,r){return t[n]===r[n]}),Kt=vt(st("filter",a)),Qt=vt(f),Vt=vt(function(n,t){for(var r=-1,e=t.length;++r<e;)if(n(t[r]))return t[r]}),Xt=vt(function(n,t){for(var r=-1,e=t.length;++r<e;)if(n(t[r]))return r;return-1}),Yt=vt(function(n,t){for(var r=t.length;r--;)if(n(t[r]))return t[r]}),Zt=vt(function(n,t){for(var r=t.length;r--;)if(n(t[r]))return r;return-1}),nr=bt(!0),tr=vt(l),rr=vt(function(n,t){for(var r=-1,e=t.length;++r<e;)n(t[r],r,t);return t}),er=s($),ur=X,ir=vt(function(n,t){return k(function(t,r){var e=n(r);return t[e]=ft(r,t[e]||(t[e]=[])),t},{},t)}),or=vt(function(n,t){return Object.prototype.hasOwnProperty.call(t,n)}),cr=vt(function(n,t){return n in t}),ar=dt(function(n,t,r){return function(){return n.apply(this,arguments)?t.apply(this,arguments):r.apply(this,arguments)}}),fr=xt(1),lr=vt(function(n,t){return g(t,n)}),sr=dt(function(n,t,r){return n=n<r.length&&n>=0?n:r.length,i(ft(t,P(r,0,n)),P(r,n))}),hr=dt(function(n,t,r){return n=n<r.length&&n>=0?n:r.length,i(i(P(r,0,n),t),P(r,n))}),gr=function(n,t){var r=P(arguments,2),e=n-r.length;return Lt(e+1,function(){var n=arguments[e],u=r.concat(P(arguments,0,e));return n[t].apply(n,u)})},pr=vt(function(n,t){return null!=t&&t.constructor===n||t instanceof n}),mr=gr(1,"join"),yr=function(){var n=!{toString:null}.propertyIsEnumerable("toString"),t=["constructor","valueOf","isPrototypeOf","toString","propertyIsEnumerable","hasOwnProperty","toLocaleString"];return function(r){if(Object(r)!==r)return[];if(Object.keys)return Object.keys(r);var e,u,i=[];for(e in r)or(e,r)&&(i[i.length]=e);if(n)for(u=t.length;u--;)e=t[u],or(e,r)&&!gt(e,i)&&(i[i.length]=e);return i}}(),vr=vt(function(n,t){return v(t,n)}),dr=function(n){return null!=n&&pr(Number,n.length)?n.length:0/0},wr=vt(function(n,t){var r=function(t){return n(t)};return r.set=vt(t),r.map=vt(function(r,e){return t(r(n(e)),e)}),r}),br=vt(st("map",w)),Or=dt(function(n,t,r){for(var e=-1,u=r.length,i=new Array(u),o=[t];++e<u;)o=n(o[0],r[e]),i[e]=o[1];return[o[0],i]}),jr=dt(function(n,t,r){for(var e=r.length,u=r.length,i=new Array(u),o=[t];e--;)o=n(o[0],r[e]),i[e]=o[1];return[o[0],i]}),xr=vt(function(n,t){for(var r=-1,e=t.length,u=new Array(e);++r<e;)u[r]=n(t[r],r,t);return u}),Ar=vt(function(n,t){return k(function(r,e){return r[e]=n(t[e]),r},{},yr(t))}),Ir=vt(function(n,t){return k(function(r,e){return r[e]=n(t[e],e,t),r},{},yr(t))}),Er=gr(1,"match"),kr=mt(h,-1/0),Mr=vt(c(h)),Pr=function(){var n=function(n){return n+"::"+Object.prototype.toString.call(n)},t=function(t){return t.length+":{"+w(n,t).join(",")+"}"};return function(n){var r={};return function(){var e=t(arguments);return or(e,r)||(r[e]=n.apply(this,arguments)),r[e]}}}(),Tr=mt(d,1/0),Sr=vt(c(d)),Wr=vt(b),Nr=Wr(-1),Rr=vt(j),qr=vt(function(n,t){return Ot(function(t,r){return!gt(r,n)},t)}),Cr=vt(function(n,t){return function(){return n.apply(this,arguments)||t.apply(this,arguments)}}),Lr=yt(i),Br=yt(C(i)),Fr=vt(function(n,t){return k(function(t,r){return t[n(r)?0:1].push(r),t},[[],[]],t)}),zr=dt(function(n,t,r){return A(n.split("."),r)===t}),Dr=dt(function(n,t,r){return A(t.split(n),r)}),Ur=vt(function(n,t){return Ot(function(t,r){return gt(r,n)},t)}),_r=vt(I),$r=vt(Ot),Gr=function(){return Nt.apply(this,Z(arguments))},Hr=function(){return Rt.apply(this,Z(arguments))},Jr=vt(jt),Kr=vt(E),Qr=dt(function(n,t,r){return r[n]===t}),Vr=dt(function(n,t,r){return or(t,r)?r[t]:n}),Xr=vt(function(n,t){for(var r=n.length,e=new Array(r),u=-1;++u<r;)e[u]=t[n[u]];return e}),Yr=vt(function(n,t){if(n>=t)return[];for(var r=0,e=new Array(Math.floor(t)-Math.ceil(n));t>n;)e[r++]=n++;return e}),Zr=dt(k),ne=dt(function(n,t,r){for(var e=-1,u=r.length;++e<u;)t=n(t,r[e],e,r);return t}),te=dt(function(n,t,r){for(var e=r.length;e--;)t=n(t,r[e]);return t}),re=dt(function(n,t,r){for(var e=r.length;e--;)t=n(t,r[e],e,r);return t}),ee=vt(function(n,t){return Kt(H(n),t)}),ue=vt(function(n,t){return f(H(n),t)}),ie=dt(function(n,t,r){return i(P(r,0,Math.min(n,r.length)),P(r,Math.min(r.length,n+t)))}),oe=dt(function(n,t,r){return r.replace(n,t)}),ce=dt(function(n,t,r){var e=0,u=r.length+1,i=new Array(u);for(i[e]=t;++e<u;)t=n(t,r[e-1]),i[e]=t;return i}),ae=gr(2,"slice"),fe=vt(function(n,t){return Wt(t).sort(n)}),le=vt(function(n,t){return P(t).sort(function(t,r){var e=n(t),u=n(r);return u>e?-1:e>u?1:0})}),se=gr(1,"split"),he=vt(function(n,t){return t.indexOf(n)}),ge=vt(function(n,t){return t.lastIndexOf(n)}),pe=gr(2,"substring"),me=C(pe)(void 0),ye=pe(0),ve=Zr(t,0),de=st("tail",function(n){return P(n,1)}),we=vt(st("take",function(n,t){return P(t,0,Math.min(n,t.length))})),be=vt(st("takeWhile",function(n,t){for(var r=-1,e=t.length;++r<e&&n(t[r]););return P(t,0,r)})),Oe=vt(function(n,t){return n(t),t}),je=vt(function(n,t){for(var r=new Array(Number(t)),e=r.length,u=-1;++u<e;)r[u]=n(u);return r}),xe=gr(0,"toLowerCase"),Ae=x(yr),Ie=gr(0,"toUpperCase"),Ee=vt(function(n,t){for(var r=n(t),e=[];r&&r.length;)e[e.length]=r[0],r=n(r[1]);return e}),ke=function(n){for(var t,r=-1,e=n.length,u=[];++r<e;)t=n[r],gt(t,u)||(u[u.length]=t);return u},Me=vt(function(n,t){for(var r,e=-1,u=t.length,i=[];++e<u;)r=t[e],o(n,r,i)||(i[i.length]=r);return i}),Pe=bt(!1),Te=function(n){for(var t=yr(n),r=t.length,e=new Array(r),u=-1;++u<r;)e[u]=n[t[u]];return e},Se=function(n,t){var r=ir(function(t){return"function"==typeof n[t]?"fn":"obj"},yr(n));switch(arguments.length){case 0:throw O();case 1:return function(t){return M(n,r,t)}}return M(n,r,t)},We=function(n,t){return Lt(n.length,function(){return t.apply(this,i([n],arguments))})},Ne=vt(function(n,t){for(var r,e=-1,u=n.length,i=t.length,o=[];++e<u;)for(r=-1;++r<i;)o[o.length]=[n[e],t[r]];return o}),Re=vt(function(n,t){for(var r=[],e=-1,u=Math.min(n.length,t.length);++e<u;)r[e]=[n[e],t[e]];return r}),qe=vt(function(n,t){for(var r=-1,e=n.length,u={};++r<e;)u[n[r]]=t[r];return u}),Ce=dt(function(n,t,r){for(var e=[],u=-1,i=Math.min(t.length,r.length);++u<i;)e[u]=n(t[u],r[u]);return e}),Le=function(n,t){return wt("ap",n)?n.ap(t):k(function(n,r){return i(n,w(r,t))},[],n)},Be=function Lu(n,t,r,e){var u=rt(n);if(u!==rt(t))return!1;if(Ht(n,t))return!0;if("RegExp"==u)return n.source===t.source&&n.global===t.global&&n.ignoreCase===t.ignoreCase&&n.multiline===t.multiline&&n.sticky===t.sticky&&n.unicode===t.unicode;if(Object(n)===n){if("Date"===u&&n.getTime()!=t.getTime())return!1;var i=yr(n);if(i.length!==yr(t).length)return!1;for(var o=r.length;o--;)if(r[o]===n)return e[o]===t;for(r.push(n),e.push(t),o=i.length;o--;){var c=i[o];if(!or(c,t)||!Lu(t[c],n[c],r,e))return!1}return r.pop(),e.pop(),!0}return!1},Fe=function(n,t){for(var r=yr(t),e=-1,u=r.length;++e<u;)n[r[e]]=t[r[e]];return n},ze=function(n){return function(t){var r=function(){var r=arguments;return n(function(n){return n.apply(null,r)},t)};return arguments.length>1?r.apply(null,P(arguments,1)):S(kr(jt("length",t)),r)}},De=ze(r),Ue=ze(e),_e=vt(Le),$e=dt(function(n,t,r){return Fe(L(w(function(n){return[n,r[n]]},$(r))),Ct(n,t))}),Ge=function(){var n=function(t,r,e){if(1===t.length)return $e(t[0],r,e);var u=e[t[0]];return $e(t[0],n(P(t,1),r,pr(Object,u)?u:{}),e)};return function(t,r,e){var u=arguments.length;if(0===u)throw O();var i=se(".",t),o=vt(function(t,r){return n(i,t,r)});switch(u){case 1:return o;case 2:return o(r);default:return o(r,e)}}}(),He=vt(st("chain",function(n,t){return Pe(w(n,t))})),Je=gr(1,"charAt"),Ke=gr(1,"charCodeAt"),Qe=dt(function(n,t,r){function e(t,r){return Le(w(kt,n(r)),t)}return k(e,t([]),r)}),Ve=vt(function(n,t){for(var r={},e=t.length,u=-1;++u<e;){var i=n(t[u]);r[i]=(or(i,r)?r[i]:0)+1}return r}),Xe=function(n){return Lt(n.length,n)},Ye=vt(function(n,t){return Be(n,t,[],[])}),Ze=vt(function(n,t){return Fe(Fe({},t),Ir(function(n,r){return n(t[r])},n))}),nu=s(yr),tu=Rr(0),ru=ae(0,-1),eu=function(n){return Fe(n,Ru)},uu=vt(function(n,t){return ke(a(C(gt)(n),t))}),iu=dt(function(n,t,r){for(var e=[],u=-1;++u<t.length;)o(n,t[u],r)&&(e[e.length]=t[u]);return Me(n,e)}),ou=function(n){for(var t=yr(n),r=t.length,e=-1,u={};++e<r;){var i=t[e],o=n[i];or(o,u)||(u[o]=[]),u[o].push(i)}return u},cu=function(n){for(var t=yr(n),r=t.length,e=-1,u={};++e<r;){var i=t[e];u[n[i]]=i}return u},au=Rr(-1),fu=vt(function(n,t){var r=Lt(n,t);if(0===arguments.length)throw O();return Lt(n,function(){return k(Le,br(r,arguments[0]),P(arguments,1))})}),lu=function(t){if(2!==t.length)throw new Error("Expected binary function.");return function r(e,u){switch(arguments.length){case 0:throw O();case 1:return e===n?C(r):Lr(t,e);default:return e===n?C(t)(u):t(e,u)}}},su=Dr("."),hu=Zr(b,1),gu=vt(function(n,t){return je(T(n),t)}),pu=lu(function(n,t){return n-t}),mu=vt(Nt(ke,i)),yu=dt(function(n,t,r){return Me(n,i(t,r))}),vu=function(n){var t=P(arguments,1),r=t.length;return Xe(S(r,function(){for(var e=[],u=-1;++u<r;)e[e.length]=t[u](arguments[u]);return n.apply(this,e.concat(P(arguments,r)))}))},du=Qe(br(F)),wu=lu(function(n,t){if(p(t))return i(n,t);if(wt("concat",n))return n.concat(t);throw new TypeError("can't concat "+typeof n)}),bu=vt(function(n,t){if(n>10)throw new Error("Constructor with greater than ten arguments");return 0===n?function(){return new t}:Xe(G(n,function(n,r,e,u,i,o,c,a,f,l){switch(arguments.length){case 1:return new t(n);case 2:return new t(n,r);case 3:return new t(n,r,e);case 4:return new t(n,r,e,u);case 5:return new t(n,r,e,u,i);case 6:return new t(n,r,e,u,i,o);case 7:return new t(n,r,e,u,i,o,c);case 8:return new t(n,r,e,u,i,o,c,a);case 9:return new t(n,r,e,u,i,o,c,a,f);case 10:return new t(n,r,e,u,i,o,c,a,f,l)}}))}),Ou=lu(gt),ju=lu(function(n,t){return n/t}),xu=lu(h),Au=lu(function(n,t){return n>=t}),Iu=function(n){if(0===arguments.length)throw O();return fu(n.length,n)},Eu=lu(d),ku=lu(function(n,t){return t>=n}),Mu=lu(function(n,t){return m(n)?!m(t)||1>t?0/0:(n%t+t)%t:0/0}),Pu=lu(function(n,t){return Fe(Fe({},n),t)}),Tu=Zr(Pu,{}),Su=lu(function(n,t){return n%t}),Wu=vu(w,_r,F),Nu=function(n){return bu(n.length,n)},Ru={F:ot,I:ct,T:at,__:n,add:xt,all:At,allPass:De,always:T,and:It,any:Et,anyPass:Ue,ap:_e,append:kt,appendTo:Mt,apply:Pt,arity:S,assoc:$e,assocPath:Ge,binary:Tt,bind:St,call:W,chain:He,charAt:Je,charCodeAt:Ke,clone:Wt,commute:du,commuteMap:Qe,comparator:N,compose:Nt,composeP:Rt,concat:wu,cond:R,construct:Nu,constructN:bu,contains:Ou,containsWith:qt,converge:q,countBy:Ve,createMapEntry:Ct,curry:Xe,curryN:Lt,dec:Bt,defaultTo:Ft,difference:zt,differenceWith:Dt,dissoc:Ut,divide:ju,drop:_t,dropWhile:$t,empty:Gt,eq:Ht,eqDeep:Ye,eqProps:Jt,evolve:Ze,filter:Kt,filterIndexed:Qt,find:Vt,findIndex:Xt,findLast:Yt,findLastIndex:Zt,flatten:nr,flip:C,forEach:tr,forEachIndexed:rr,fromPairs:L,func:B,functions:nu,functionsIn:er,get:ur,groupBy:ir,gt:xu,gte:Au,has:or,hasIn:cr,head:tu,identity:F,ifElse:ar,inc:fr,indexOf:lr,init:ru,insert:sr,insertAll:hr,installTo:eu,intersection:uu,intersectionWith:iu,invert:ou,invertObj:cu,invoker:gr,is:pr,isArrayLike:z,isEmpty:D,isNil:U,isSet:_,join:mr,keys:yr,keysIn:$,last:au,lastIndexOf:vr,length:dr,lens:wr,lift:Iu,liftN:fu,lt:Eu,lte:ku,map:br,mapAccum:Or,mapAccumRight:jr,mapIndexed:xr,mapObj:Ar,mapObjIndexed:Ir,match:Er,mathMod:Mu,max:kr,maxBy:Mr,memoize:Pr,merge:Pu,mergeAll:Tu,min:Tr,minBy:Sr,modulo:Su,multiply:Wr,nAry:G,negate:Nr,not:H,nth:Rr,nthArg:J,of:K,omit:qr,once:Q,op:lu,or:Cr,partial:Lr,partialRight:Br,partition:Fr,path:su,pathEq:zr,pathOn:Dr,pick:Ur,pickAll:_r,pickBy:$r,pipe:Gr,pipeP:Hr,pluck:Jr,prepend:Kr,prependTo:V,product:hu,project:Wu,prop:X,propEq:Qr,propOf:Y,propOr:Vr,props:Xr,range:Yr,reduce:Zr,reduceIndexed:ne,reduceRight:te,reduceRightIndexed:re,reject:ee,rejectIndexed:ue,remove:ie,repeat:gu,replace:oe,reverse:Z,scan:ce,slice:ae,sort:fe,sortBy:le,split:se,strIndexOf:he,strLastIndexOf:ge,substring:pe,substringFrom:me,substringTo:ye,subtract:pu,sum:ve,tail:de,take:we,takeWhile:be,tap:Oe,times:je,toLower:xe,toPairs:Ae,toPairsIn:nt,toUpper:Ie,trim:tt,type:rt,unapply:et,unary:ut,unfold:Ee,union:mu,unionWith:yu,uniq:ke,uniqWith:Me,unnest:Pe,useWith:vu,values:Te,valuesIn:it,where:Se,wrap:We,xprod:Ne,zip:Re,zipObj:qe,zipWith:Ce};"object"==typeof exports?module.exports=Ru:"function"==typeof define&&define.amd?define(function(){return Ru}):this.R=Ru}).call(this); </ins>  No newline at end of file

script(src='/js/lib/codemirror/mode/javascript/javascript.js') script(src='/js/lib/jailed/jailed.js') script(src='/js/lib/bonfire/bonfireInit.js') <ins> script(src="https://cdn.jsdelivr.net/ramda/0.10.0/ramda.min.js") </ins> .row

var passedBonfireHash = !{JSON.stringify(bonfireHash)}; var challengeName = !{JSON.stringify(name)}; var started = Math.floor(Date.now() / 1000); <ins> var _ = R; </ins> .col-xs-12.col-sm-12.col-md-8 #mainEditorPanel form.code


Question:
<!-- NOTE: If you're reporting a security issue, don't create a GitHub issue. Instead, email We will look into it immediately. --In the challenge CSS Flexbox: Use the flex-wrap Property to Wrap a Row or Column, the value wrap-reverse is defined: wrap-reverse: "wraps items from right-to-left if they are in a row, or bottom-to-top if they are in a column." This definition is not correct. Actually wrap-reverse wrap content changing de cross-axis direction, bottom to top in a row, and left to right in a column. Browser Name: Browser Version: Operating System:
I'd like to take on this issue please
Since the curriculum content is in the repo, I submitted the PR there.
Ok, thanks Simon.

editor.setSize("100%", "auto"); <ins> var attempts = 0; if (attempts) { attempts = 0; } </ins> // Default value for editor if one isn't provided in (i.e. a challenge) var nonChallengeValue = '/*Welcome to Bonfire, Free Code Camp's future CoderByte replacement.n' + 'Please feel free to use Bonfire as an in-browser playground and linting tool.n' +

}); function bonfireExecute() { <ins> attempts++; ga('send', 'event',  'Bonfire', 'ran-code', bonfireName); </ins> userTests= null; $('#codeOutput').empty(); var userJavaScript = myCodeMirror.getValue(); userJavaScript = removeComments(userJavaScript); userJavaScript = scrapeTests(userJavaScript); // simple fix in case the user forgets to invoke their function <del> if (challengeEntryPoint) { </del> <ins> if (challengeEntryPoint && challengeSeed) { </ins> userJavaScript = challengeEntryPoint + ' ' + userJavaScript; } <ins> console.log(userJavaScript); </ins> submit(userJavaScript, function(cls, message) { if (cls) { codeOutput.setValue(message.error);

}; function showCompletion() { <ins> ga('send', 'event',  'Bonfire', 'solved', bonfireName + ', Time: ' + (Math.floor(Date.now() / 1000) - started) +', Attempts: ' + attempts); </ins> $('#complete-bonfire-dialog').modal('show'); }  No newline at end of file

$(document).ready(function() { <ins> if (bonfireName !== undefined) { ga('send', 'event',  'Bonfire', 'load', bonfireName + ':' + Math.floor(Date.now() / 1000)); } </ins> var CSRF_HEADER = 'X-CSRF-Token';

var bonfireSolution = myCodeMirror.getValue(); var thisBonfireHash = passedBonfireHash || null; var didCompleteWith = $('#completed-with').val() || null; completedBonfire(didCompleteWith, bonfireSolution, thisBonfireHash); });

// Bonfire instructions functions $('#more-info').on('click', function() { <ins> ga('send', 'event',  'Bonfire', 'more-info', bonfireName); </ins> $('#brief-instructions').hide(); $('#long-instructions').show().removeClass('hide');

"assert.deepEqual(inventory([], [[2, 'Hair Pin'], [3, 'Half-Eaten Apple'], [67, 'Bowling Ball'], [7, 'Toothpaste']]), [[2, 'Hair Pin'], [3, 'Half-Eaten Apple'], [67, 'Bowling Ball'], [7, 'Toothpaste']]);", "assert.deepEqual(inventory([[0, 'Bowling Ball'], [0, 'Dirty Sock'], [0, 'Hair pin'], [0, 'Microphone']], [[1, 'Hair Pin'], [1, 'Half-Eaten Apple'], [1, 'Bowling Ball'], [1, 'Toothpaste']]), [[1, 'Bowling Ball'], [1, 'Dirty Sock'], [1, 'Hair pin'], [1, 'Half-Eaten Apple'], [1, 'Microphone'], [1, 'Toothpaste']]);" ] <ins> }, { "_id": "a2f1d72d9b908d0bd72bb9f6", "name": "Make a Person", "difficulty": "3.12", "description": [ "Fill in the object constructor with the methods specified in the tests.", "Those methods are getFirstName(), getLastName(), getFullName(), setFirstName(), setLastName(), and setFullName().", "These methods must be the only available means for interacting with the object.", "There will be some linting errors on the tests, you may safely ignore them. You should see undefined in the console output." ], "challengeEntryPoint": "var bob = new Person('Bob Ross');", "challengeSeed": "var Person = function(firstAndLast) {n    return firstAndLast;rn};", "tests": [ "expect(Object.keys(bob).length).to.eql(6);", "expect(bob instanceof Person).to.be.true;", "expect(bob.firstName).to.be.undefined();", "expect(bob.lastName).to.be.undefined();", "expect(bob.getFirstName()).to.eql('Bob');", "expect(bob.getLastName()).to.eql('Ross');", "expect(bob.getFullName()).to.eql('Bob Ross');", "bob.setFirstName('Happy');", "expect(bob.getFirstName()).to.eql('Happy');", "bob.setLastName('Trees');", "expect(bob.getLastName()).to.eql('Trees');", "bob.setFullName('George Carlin');", "expect(bob.getFullName()).to.eql('George Carlin');" ] </ins> } ]

var challengeSeed = !{JSON.stringify(challengeSeed)}; var challengeEntryPoint = !{JSON.stringify(challengeEntryPoint)}; var passedBonfireHash = !{JSON.stringify(bonfireHash)}; <ins> var bonfireName = !{JSON.stringify(name)}; var started = Math.floor(Date.now() / 1000); </ins> .col-xs-12.col-sm-12.col-md-8 #mainEditorPanel form.code


Question:
<!-- NOTE: If you're reporting a security issue, don't create a GitHub issue. Instead, email We will look into it immediately. --1) Add any code into the challenge field (other than a valid solution) that will not result in a syntax error. 2) Run the tests Expected result: The test should fail Actual result: The test passes Browser Name: Firefox Browser Version: 61.0 Operating System: 10.12.6 !
The problem is this test in the : It returns true if returns an object with no keys, or just not-an-object. I assume we should really be using something like to check the expected object and the user's output object are the same.
Working on a fix.

## Instructions
  Use simple fields with object literals to create and return a Person object.   Use simple fields with object literals to create and return a Person object with name, age and gender properties.
 ## Tests

```yml tests: <del> - text: 'the output is <code>{name: "Zodiac Hasbro", age: 56, gender: "male"}</code>.' testString: 'assert(() => {const res={name:"Zodiac Hasbro",age:56,gender:"male"}; const person=createPerson("Zodiac Hasbro", 56, "male"); return Object.keys(person).every(k => person[k] === res[k]);}, ''the output is <code>{name: "Zodiac Hasbro", age: 56, gender: "male"}</code>.'');' - text: No <code>:</code> were used. testString: getUserInput => assert(!getUserInput('index').match(/:/g), 'No <code>:</code> were used.'); </del> <ins> - text: 'The output is <code>{name: "Zodiac Hasbro", age: 56, gender: "male"}</code>.' testString: 'assert((() => {const res={name:"Zodiac Hasbro",age:56,gender:"male"}; const person=createPerson("Zodiac Hasbro", 56, "male"); return Object.keys(person).every(k => person[k] === res[k]);})(), ''The output is <code>{name: "Zodiac Hasbro", age: 56, gender: "male"}</code>.'');' - text: No <code>key:value</code> were used. testString: getUserInput => assert(!getUserInput('index').match(/:/g), 'No <code>key:value</code> were used.'); </ins> ```

```js <del> // solution required </del> <ins> const createPerson = (name, age, gender) => { "use strict"; return { name, age, gender }; }; </ins> ```


Question:
<!-- NOTE: If you're reporting a security issue, don't create a GitHub issue. Instead, email We will look into it immediately. --Test for this lesson may not check the syntax for any constructor syntax, instead looks like it's tested by output. EIther user provide the constructor(correct/expected way) or not, challenge passes. Browser Name: Chrome Browser Version: 67 Operating System: Win7
I'm on it.
following solution works to passs the test: function makeClass() { "use strict"; / Alter code below this line / class Vegetable { constructor(Vegetable) { this. Vegetable = Vegetable; } } / Alter code above this line / return Vegetable; } const Vegetable = makeClass(); const carrot = new Vegetable('carrot'); (); // =should be 'carrot'
Hello, Unfortunately, this solution doesn't work for me. (The same as in the "Hint": ) Error message: // running tests should return carrot. // tests completed
sorry to hear that! Would you mind posting your solution here so we could take a look?
Hello Kristofer, Thank you for your email. (ES6: Use class Syntax to Define a Constructor Function) I have already got help from FreeCodeCamp. I used the solution from "HINT", but it didn't work. class Vegetable { constructor(Vegetable){ this.Vegetable = Vegetable; } } What worked is the code below: class Vegetable { constructor(name) { = name; } } Thank you. Kind regards, Zsolt

exports.preSubmit = function(req, res) { var data = req.query; <del> var cleanData = sanitizeHtml(data.url); </del> <ins> var cleanData = sanitizeHtml(data.url, { allowedTags: [], allowedAttributes: [] }).replace(/";/g, '"'); </ins> if (data.url.replace(/&/g, '&') !== cleanData) { <del> debug('data and cleandata', data, cleanData, data.url === cleanData); </del> req.flash('errors', { msg: 'The data for this post is malformed' });

exports.newStory = function(req, res) { var url = req.body.data.url; <del> var cleanURL = sanitizeHtml(url); </del> <ins> var cleanURL = sanitizeHtml(url, { allowedTags: [], allowedAttributes: [] }).replace(/"/g, '"'); </ins> if (cleanURL !== url) { req.flash('errors', { msg: "The URL you submitted doesn't appear valid"

link = 'http://' + link; } var story = new Story({ <del> headline: sanitizeHtml(data.headline), </del> <ins> headline: sanitizeHtml(data.headline, { allowedTags: [], allowedAttributes: [] }).replace(/"/g, '"'), </ins> timePosted: Date.now(), link: link, <del> description: sanitizeHtml(data.description), </del> <ins> description: sanitizeHtml(data.description, { allowedTags: [], allowedAttributes: [] }).replace(/"/g, '"'), </ins> rank: 1, upVotes: data.upVotes, author: data.author,

{ allowedTags: [], allowedAttributes: [] <del> }); </del> <ins> }).replace(/"/g, '"'); </ins> if (data.body !== sanitizedBody) { req.flash('errors', { msg: 'HTML is not allowed'


Question:
In the challenge "Debugging: Understanding the Differences between the freeCodeCamp and Browser Console" the objective asks the user to whereas in the content, the user has access to two prewritten variables: and , no variable exists. Browser Name: Google Chrome Browser Version: 67.0.3396.99 (64 bits) Operating System: Windows 10 !
I'd like to give it a go.

text-align: center; } <ins> .big-ion-up-arrow  #upvote, #reply-to-main-post { cursor: pointer; } </ins> .story-up-votes { padding-top: 0px; margin-left: -5px;


Question:
<!-- NOTE: If you're reporting a security issue, don't create a GitHub issue. Instead, email We will look into it immediately. --Link in the readme does not link to a valid url. ! Browser Name: Browser Version: Operating System:
This link needs to be updated with the correct & valid URL.

The content of this repository bound by the following licenses: - The computer software is licensed under the [BSD-3-Clause](./LICENSE.md). <ins> - The [curricular content](https://www.npmjs.com/package/@freecodecamp/curriculum) in the [`/seed`](/seed) and subdirectories are licensed under the [CC-BY-SA-4.0](https://github.com/freeCodeCamp/curriculum/blob/master/LICENSE.md). </ins>


Question:
Not really an issue but it threw me off. In the visual design challenge linked below, the second paragraph states that the navigation bar inherits its background from the header. Well I wondered so I set the position of the navigation to relative and the top to 20px (and the header text color black so you can see the white text against the white body) and clearly the background of the nav isn't cyan, it's white. Children have transparent backgrounds. That's why they seem cyan against a parent with a cyan background. Browser Name: Chrome Browser Version: Version 68.0.3440.106 (Official Build) (64-bit) Operating System: MacOS !
Interesting wording. It wouldn't be right to say the children of an element inherit its background color. The initial value of is The simplest solution to this would just be a change of wording
Fixed in
This was fixed in . / / please close it

## Instructions
  The navigation bar on this site currently inherits its background-color from the header element. Starting with that color as a base, add a background-color to the nav element so it uses the same cyan hue, but has 80% saturation and 25% lightness values to change its tone and shade.   All elements have a default background-color of transparent. Our nav element currently appears have a cyan background, because the element behind it has a background-color set to cyan. Add a background-color to the nav element so it uses the same cyan hue, but has 80% saturation and 25% lightness values to change its tone and shade.
 ## Tests


Question:
So, this code passes all tests: While I haven't anything regarding the rendering of the elements, it still passes the 4th test: "The DisplayMessages component should render a div containing an h2 element, a button element, a ul element, and li elements as children." React and Redux: Manage State Locally First
Just +1ing this issue. I experienced the same thing. I passed with an empty tag. I a comment so if I free up some time I might be able to fix it.
This issue has not yet been resolved. I experienced the same issue. I tried to map the messages array but it says that " is not a function". When I "(typeof )" it says it is an object when it should be an array.
an array is an "object" i.e.: let myArray = [1,2,3,4]; (typeof myArray) This outputs 'object'.
, yeah, thats true. But you cant an "object" now, can you?
I think you misinterpreted my helpful tip... I was not trying to patronize you. Have you since been able to correct your issue? Was it perhaps that your object was not setup properly to access the array? ((message, index) ={ return <li key={index}{message}</li})

- text: 'The DisplayMessages component should initialize with a state equal to { input: "", messages: [] }.' testString: 'assert((function() { const mockedComponent = Enzyme.mount(React.createElement(DisplayMessages)); const initialState = mockedComponent.state(); return ( typeof initialState === ''object'' && initialState.input === '''' && initialState.messages.length === 0); })(), ''The DisplayMessages component should initialize with a state equal to { input: "", messages: [] }.'');' - text: The DisplayMessages component should render a div containing an h2 element, a button element, a ul element, and li elements as children.  testString: 'async () => { const mockedComponent = Enzyme.mount(React.createElement(DisplayMessages)); const waitForIt = (fn) => new Promise((resolve, reject) => setTimeout(() => resolve(fn()), 100)); const state = () => { mockedComponent.setState({messages: [''__TEST__MESSAGE'']}); return waitForIt(() => mockedComponent )}; const updated = await state(); assert(updated.find(''div'').length === 1 && updated.find(''h2'').length === 1 && updated.find(''button'').length === 1 && updated.find(''ul'').length === 1, ''The DisplayMessages component should render a div containing an h2 element, a button element, a ul element, and li elements as children.''); }; '   testString: 'async () => { const mockedComponent = Enzyme.mount(React.createElement(DisplayMessages)); const waitForIt = (fn) => new Promise((resolve, reject) => setTimeout(() => resolve(fn()), 100)); const state = () => { mockedComponent.setState({messages: [''__TEST__MESSAGE'']}); return waitForIt(() => mockedComponent )}; const updated = await state(); assert(updated.find(''div'').length === 1 && updated.find(''h2'').length === 1 && updated.find(''button'').length === 1 && updated.find(''ul'').length === 1 && updated.find(''li'').length > 0, ''The DisplayMessages component should render a div containing an h2 element, a button element, a ul element, and li elements as children.''); }; ' - text: .map was used on the messages array. testString: assert(code.match(/this.state.messages.map/g));  - text: The input element should render the value of input in local state. testString: 'async () => { const mockedComponent = Enzyme.mount(React.createElement(DisplayMessages)); const waitForIt = (fn) => new Promise((resolve, reject) => setTimeout(() => resolve(fn()), 100)); const causeChange = (c, v) => c.find(''input'').simulate(''change'', { target: { value: v }}); const testValue = ''__TEST__EVENT__INPUT''; const changed = () => { causeChange(mockedComponent, testValue); return waitForIt(() => mockedComponent )}; const updated = await changed(); assert(updated.find(''input'').props().value === testValue, ''The input element should render the value of input in local state.''); }; ' - text: Calling the method handleChange should update the input value in state to the current input.


Question:
<!-- NOTE: If you're reporting a security issue, don't create a GitHub issue. Instead, email We will look into it immediately. --1) The Full Stack Cert claimed date will only show as the current date and not the date it was claimed on. I claimed mine on the 7th of September and checking back regularly I noticed the claimed on date was always the current date. 2) The Full Stack Cert appears as the Legacy Full Stack Cert on a users profile page, clicking this leads to an error as the legacy cert does not exist. It should be in with the new certificates. That being said, on the settings page the link to view the certificate is linked correctly. ${username-here} /full-stack ${username-here} N.A 1) Just the claimed on date. No screenshot necessary. 2) !
Similar to
I am having the same issue with my Full Stack Certificate
Mine as well. Has this been addressed?
Same here - The issued date shows the current date and not the date on which it was originally issued -
Related
Have the same problem: the date of Full Stack Certificate is always a current date.
If there are no records for a fullstack certificate, a good fallback would be going thought the date of the modern certificates and displaying the date of latest claimed certificate.
optimally, we should add a completion timestamp and an id when campers claim a fullstack certificate with a fallback to the last earned cert if a timestamp is not found.
My full stack certification also updates with the current date not the claimed date.
The date on my full stack certificate is showing the date i claim my Responsive Web design certificate ( the first certificate ). and now if i want to see the certificate it is asking me to claim certificate when i claim it will say is like u have claim the certificate and it will not show me the certificate.
This is an ongoing issue, please use the reactions instead to assert "me too". Potential approach for fixes: and
Also related to the Full Stack cert – the date seems to be the date the first certification was claimed, not the date the full stack certification was claimed:
The fallback is not working properly and I should have caught that. It's not a tricky fix, but I'll make sure it works this time!
Ok thenks On May 5, 2020 11:04, "Oliver Eyton-Williams" <:

import debug from 'debug'; import { isEmail } from 'validator'; import format from 'date-fns/format'; <ins> import { reportError } from '../middlewares/sentry-error-handler.js'; </ins> import { ifNoUser401 } from '../utils/middleware'; import { observeQuery } from '../utils/rx';

Congratulations on behalf of the freeCodeCamp.org team! `; <ins> const failureMessage = name => dedent` Something went wrong with the verification of ${name}, please try again. If you continue to receive this error, you can send a message to support@freeCodeCamp.org to get help. `; </ins> function ifNoSuperBlock404(req, res, next) { const { superBlock } = req.body; if (superBlock && superBlocks.includes(superBlock)) {

[certType]: true }; <del> if (challenge) { const { id, tests, challengeType } = challenge; if ( !user[certType] && !isCertified(tests, user.completedChallenges) ) { return Observable.just(notCertifiedMessage(certName)); } updateData = { ...updateData, completedChallenges: [ ...user.completedChallenges, { id, completedDate: new Date(), challengeType } ] }; </del> <ins> // certificate doesn't exist or // connection error if (!challenge) { reportError(`Error claiming ${certName}`); return Observable.just(failureMessage(certName)); } const { id, tests, challengeType } = challenge; if (!user[certType] && !isCertified(tests, user.completedChallenges)) { return Observable.just(notCertifiedMessage(certName)); </ins> } <ins> updateData = { ...updateData, completedChallenges: [ ...user.completedChallenges, { id, completedDate: new Date(), challengeType } ] }; </ins> if (!user.name) { return Observable.just(noNameMessage);

is2018DataVisCert, isApisMicroservicesCert, isFrontEndLibsCert, <del> is2020QaCert, is2020InfosecCert, </del> <ins> isInfosecQaCert, </ins> isJsAlgoDataStructCert, isRespWebDesignCert } = this.props;

is2018DataVisCert && isApisMicroservicesCert && isFrontEndLibsCert && <del> is2020QaCert && is2020InfosecCert && </del> <ins> isInfosecQaCert && </ins> isJsAlgoDataStructCert && isRespWebDesignCert;

return ( <FullWidthRow key={superBlock}> <Spacer />
Full Stack Certification

Legacy Full Stack Certification

 Once you've earned the following freeCodeCamp certifications, you'll  be able to claim The Full Stack Developer Certification:   be able to claim the Legacy Full Stack Developer Certification:

Responsive Web Design

Front End Libraries

Data Visualization

APIs and Microservices

Quality Assurance

Legacy Information Security and Quality Assurance

<ins> { "name": "Full Stack Certificate", "dashedName": "full-stack-certificate", "order": 5, "time": "", "template": "", "required": [], "superBlock": "certificates", "superOrder": 12, "challengeOrder": [ [ "561add10cb82ac38a17213bd", "Full Stack Certificate" ] ], "isPrivate": true, "fileName": "12-certificates/full-stack-certificate.json" } </ins>

 --- id: 561add10cb82ac38a17213bd title: Full Stack Certificate challengeType: 7 isHidden: false isPrivate: true --- ## Description

 ## Instructions

 ## Tests
 ```yml tests: - id: 561add10cb82ac38a17513bc title: Responsive Web Design Certificate - id: 561abd10cb81ac38a17513bc title: JavaScript Algorithms and Data Structures Certificate - id: 561acd10cb82ac38a17513bc title: Front End Libraries Certificate - id: 5a553ca864b52e1d8bceea14 title: Data Visualization Certificate - id: 561add10cb82ac38a17523bc title: API's and Microservices Certificate - id: 561add10cb82ac38a17213bc title: Legacy Information Security and Quality Assurance Certificate ```
 ## Challenge Seed

 ## Solution
 ```js // solution required ```


Question: I can work on this. A little confused though, since it appears to be there already. Does the mission statement go here? Please provide instructions, thanks.

<ins> const isBrowser = typeof window !== 'undefined'; if (isBrowser) { window.dataLayer = window.dataLayer || []; } function gtag() { if (isBrowser) { window.dataLayer.push(arguments); } } gtag('js', new Date()); gtag('config', 'AW-795617839'); export function gtagReportConversion(url) { var callback = function() { if (typeof url !== 'undefined' && isBrowser) { window.location = url; } }; if (isBrowser) { gtag('event', 'conversion', { /* eslint-disable camelcase */ send_to: 'AW-795617839/AmfiCKHHs4gBEK_UsPsC', event_callback: callback }); } return false; } </ins>

import { hardGoTo } from '../../../redux'; import { apiLocation } from '../../../../config/env.json'; <ins> import { gtagReportConversion } from '../../../analytics/gtag'; </ins> import './login.css'; const mapStateToProps = () => ({});

const createOnClick = navigate => e => { e.preventDefault(); <ins> gtagReportConversion(); </ins> return navigate(`${apiLocation}/signin`); };

import meta from './meta'; import mathjax from './mathjax'; import sassjs from './sassjs'; <ins> import scripts from './scripts'; </ins> const metaAndStyleSheets = meta <del> .concat(favicons, mathjax, sassjs) </del> <ins> .concat(favicons, mathjax, sassjs, scripts) </ins> .map((element, i) => ({ ...element, key: `meta-stylesheet-${i}`,

<ins> import React from 'react'; const scripts = [ <script async='' src='https://www.googletagmanager.com/gtag/js?id=AW-795617839' /> ]; export default scripts; </ins>

margin-left: 20px; margin-right: 20px; } <ins> .underlined-link { text-decoration: underline; } </ins> @media (min-width: 991px) and (max-width: 1199px) { .testimonial-copy { height: 150px;

<Spacer />
As featured in:
 <Image  alt="companies featuring freeCodeCamp"   alt='companies featuring freeCodeCamp'  className='img-center' responsive={true} src='https://s3.amazonaws.com/freecodecamp/as-seen-on.png'

D3.js
 </Col> </Row>
  <Spacer />
 freeCodeCamp is a donor-supported tax-exempt 501(c)(3) nonprofit organization (United States Federal Tax Identification Number: 82-0779546)

 Our mission: to help people learn to code for free. We accomplish this by creating thousands of videos, articles, and interactive coding lessons - all freely available to the public. We also have thousands of freeCodeCamp study groups around the world.

 Donations to freeCodeCamp go toward our education initiatives, and help pay for servers, services, and staff. You can{' '}  make a tax-deductible donation here
 .<Spacer />  <BigCallToAction /> <Spacer /> <Spacer />


Question:
from its english version at from its english version at from its english version at from its english version at from its english version at from its english version at  When you make a PR for this particular issue, do not tag it with instead just reference it with
I can take this one
Awesome! All yours.
should I translate all the files or just one?
I would recommend starting one by one and making a separate PR for each. Also, please note that we rapidly iterating over the english versions at the moment. So, take your time and revisit this issue thread for changes.
I will start working on If anyone else wants to help, feel free to.
Hello! I can also help out translating. I will get started with the !
Hey! I can translate the next file how-to-catch-outgoing-emails-
Hey guys! I can translate the how-to-work-on-coding- one :)
And I can finish up with how-to-work-on-guide-!
There is still work pending on this. When you make a PR for this particular issue, do not tag it with instead just reference it with
I can work on how-to-setup-freecodecamp- Also, there is a substantial difference between PT-PT and PT-BR (Portuguese from Portugal and Portuguese from Brazil). Maybe there should be different translations for each one?
I agree with PT-PT and PT-BR have many differences and it would be nice to have both made separately
There are some differences but it is very easy to understand for both PT-BR and PT-PT speakers, in my opinion. I don't mind reading in PT-BR and I would guess the opposite also happens?
Hi All, Thanks a lot for taking the time to contribute to At the minute we are making the translations available in the PT-BR. We might consider PT-PT in future, but I am afraid we don't have an ETA on that. Thanks.
Is there still missing translations for this issue?
Is there any missing translation? I would like to help
I'll be helping on this one. Just one question, should we translate PT-PT to PT-BR? For example, in PT-PT "corre" means execute, but it has totally different meaning in PT-BR (sprint). In this case, I would substitute it by "executa", the correct translation.
Is the issue completed? I can also help with any Portuguese translations.
I can help as well, if it's still needed.
Hey! I'm gonna start working on how-to-work-on-guide- !
Hello folks, I can assist with PT-BR
Hi! I fixed links on the portuguese and took the chance to also do it on the english version (links did not work).
I'm learning Github and have just figured out how to search through the issues for code commits that might apply and found this. My pull request fixes many of the md links for each of the language documents and adds Portuguese to the top language links bar to all of them, specifically directing to the correct language links README file. No translation, just link fixes ;p
There are 2 docs not listed in the Issue, but with no PT-BR translation. Can I get one of those?
hey what about us divide this one. I could pick the second one: .
Thanks for working on the translations for the "Contributing to freeCodeCamp". Here on we are making contributing to translations for contribution docs ad hoc. You are free to make pull-requests for improving these translations. We are closing the issue as these do not need tracking per se. You can raise a fresh issue if you find something incorrect in the existing docs.

  Read these guidelines in 	  English 	  中文 	  русский 	  عربى 	  Español 	  Português

  # Como obter localmente os emails enviados (para fluxos de emails) > **Nota:** Este passo é **opcional** - Obrigatório apenas quando estiver trabalhando com fluxos de emails