{"action":"created","comment":{"url":"https://api.github.com/repos/mitodl/mitx-grading-library/pulls/comments/200435348","pull_request_review_id":134752777,"id":200435348,"node_id":"MDI0OlB1bGxSZXF1ZXN0UmV2aWV3Q29tbWVudDIwMDQzNTM0OA==","diff_hunk":"@@ -447,99 +324,121 @@ def parse_algebra(self):\n         #       Of form \"_{(-)<alaphnumeric>}\"\n         #   upper_indices (optional):\n         #       Of form \"^{(-)<alaphnumeric>}\"\n-        #   tail:\n+        #   tail (optional):\n         #       any number of primes\n-        front = Word(alphas, alphanums)\n-        subscripts = Word(alphanums + '_') + ~FollowedBy('{')\n-        lower_indices = Literal(\"_{\") + Optional(\"-\") + Word(alphanums) + Literal(\"}\")\n-        upper_indices = Literal(\"^{\") + Optional(\"-\") + Word(alphanums) + Literal(\"}\")\n-        tail = ZeroOrMore(\"'\")\n-        inner_varname = Combine(\n-            front +\n-            Optional(\n-                subscripts |\n-                (Optional(lower_indices) + Optional(upper_indices))\n-                ) +\n-            tail # optional already by ZeroOrMore\n-            )\n-        varname = Group(inner_varname)(\"variable\")\n-        varname.setParseAction(self.variable_parse_action)\n+        name = Combine(front +\n+                       Optional(subscripts |\n+                                (Optional(lower_indices) + Optional(upper_indices))\n+                                ) +\n+                       ZeroOrMore(\"'\"))\n+        # Define a variable as a pyparsing result that contains one object name\n+        variable = Group(name)(\"variable\")\n+        variable.setParseAction(self.variable_parse_action)\n+\n+        # Predefine recursive variable expr\n+        expr = Forward()\n \n-        # Same thing for functions\n-        # Allow primes (apostrophes) at the end of function names, useful for\n-        # indicating derivatives. Eg, f'(x), g''(x)\n-        function = Group(inner_varname + Suppress(\"(\") + expr + Suppress(\")\"))(\"function\")\n+        # Construct functions as consisting of funcname and arguments as\n+        # funcname(arguments)\n+        # where arguments is a comma-separated list of arguments, returned as a list\n+        # Must have at least 1 argument\n+        function = Group(name +\n+                         Suppress(\"(\") +\n+                         Group(delimitedList(expr))(\"arguments\") +\n+                         Suppress(\")\")\n+                         )(\"function\")\n         function.setParseAction(self.function_parse_action)\n \n-        atom = number | function | varname | \"(\" + expr + \")\"\n-        atom = Group(atom)(\"atom\")\n+        # Define parentheses\n+        parentheses = Group(Suppress(\"(\") +\n+                            expr +\n+                            Suppress(\")\"))(\"parentheses\")\n+\n+        # Define an atomic unit as an expression that evaluates directly to a number\n+        # without the use of binary operations (assuming all children have been evaluated).\n+        atom = Group(number | function | variable | parentheses)(\"atom\")\n+\n+        # The following are in order of operational precedence\n+        # Define exponentiation, possibly including negative powers\n+        power = Group(atom + ZeroOrMore(Suppress(\"^\") + ZeroOrMore(minus) + atom))(\"power\")\n \n-        # Do the following in the correct order to preserve order of operation.\n-        pow_term = atom + ZeroOrMore(\"^\" + atom)\n-        pow_term = Group(pow_term)(\"power\")\n+        # Define negation (eg, in 5*-3 --> we need to evaluate the -3 first)\n+        # Negation in powers is handled separately\n+        # This has been arbitrarily assigned a higher precedence than parallel\n+        negation = Group(ZeroOrMore(minus) + power)(\"negation\")\n \n-        par_term = pow_term + ZeroOrMore('||' + pow_term)  # 5k || 4k\n-        par_term = Group(par_term)(\"parallel\")\n+        # Define the parallel operator 1 || 5 == 1/(1/1 + 1/5)\n+        pipes = Literal('|') + Literal('|')\n+        parallel = Group(negation +\n+                         ZeroOrMore(Suppress(pipes) + negation))(\"parallel\")\n \n-        prod_term = par_term + ZeroOrMore((Literal('*') | Literal('/')) + par_term)  # 7 * 5 / 4\n-        prod_term = Group(prod_term)(\"product\")\n+        # Define multiplication and division\n+        product = Group(parallel +\n+                        ZeroOrMore((Literal('*') | Literal('/')) + parallel))(\"product\")\n \n-        sum_term = Optional(plus_minus) + prod_term + ZeroOrMore(plus_minus + prod_term)  # -5 + 4 - 3\n-        sum_term = Group(sum_term)(\"sum\")\n+        # Define sums and differences\n+        # Note that leading - signs are treated by negation\n+        sumdiff = Group(Optional(plus) + product +","path":"mitxgraders/helpers/calc.py","position":null,"original_position":505,"commit_id":"fcd152ae5d760b5ccd328a983263813591e9960c","original_commit_id":"df39775a7e51e7d9c79ac31d1f71d5e84743a1e6","user":{"login":"jolyonb","id":6232546,"node_id":"MDQ6VXNlcjYyMzI1NDY=","avatar_url":"https://avatars0.githubusercontent.com/u/6232546?v=4","gravatar_id":"","url":"https://api.github.com/users/jolyonb","html_url":"https://github.com/jolyonb","followers_url":"https://api.github.com/users/jolyonb/followers","following_url":"https://api.github.com/users/jolyonb/following{/other_user}","gists_url":"https://api.github.com/users/jolyonb/gists{/gist_id}","starred_url":"https://api.github.com/users/jolyonb/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/jolyonb/subscriptions","organizations_url":"https://api.github.com/users/jolyonb/orgs","repos_url":"https://api.github.com/users/jolyonb/repos","events_url":"https://api.github.com/users/jolyonb/events{/privacy}","received_events_url":"https://api.github.com/users/jolyonb/received_events","type":"User","site_admin":false},"body":"So, I deliberately treated + and - differently here, basing things on how google parses math input. I don't want to accept + as part of a number, like `1-+2` would require. It's ok for - to be part of a number, which is why `1-------2` works - you just keep on adding brackets around the 2 with an ever-increasing number of minus signs. \r\n\r\nI always thought it was strange that the old parser allowed for two pluses in a row, but not three, also. The reason is that it allowed for a single plus to be a part of a number, and then a second plus to be a part of a sum. \r\n\r\nI think we should discourage inputs like your D. I also don't like C, E and G for the same reason. I'm happy with B, and I'm willing to tolerate F.\r\n\r\nNote that like 382 contains `ZeroOrMore(plus_minus + product)`, so you must have an expression after a +/- sign.","created_at":"2018-07-05T17:46:44Z","updated_at":"2018-07-05T17:46:44Z","html_url":"https://github.com/mitodl/mitx-grading-library/pull/59#discussion_r200435348","pull_request_url":"https://api.github.com/repos/mitodl/mitx-grading-library/pulls/59","author_association":"COLLABORATOR","_links":{"self":{"href":"https://api.github.com/repos/mitodl/mitx-grading-library/pulls/comments/200435348"},"html":{"href":"https://github.com/mitodl/mitx-grading-library/pull/59#discussion_r200435348"},"pull_request":{"href":"https://api.github.com/repos/mitodl/mitx-grading-library/pulls/59"}},"in_reply_to_id":200416087},"pull_request":{"url":"https://api.github.com/repos/mitodl/mitx-grading-library/pulls/59","id":199400078,"node_id":"MDExOlB1bGxSZXF1ZXN0MTk5NDAwMDc4","html_url":"https://github.com/mitodl/mitx-grading-library/pull/59","diff_url":"https://github.com/mitodl/mitx-grading-library/pull/59.diff","patch_url":"https://github.com/mitodl/mitx-grading-library/pull/59.patch","issue_url":"https://api.github.com/repos/mitodl/mitx-grading-library/issues/59","number":59,"state":"open","locked":false,"title":"Implementing multi-argument functions and fixing exponentiation issue","user":{"login":"jolyonb","id":6232546,"node_id":"MDQ6VXNlcjYyMzI1NDY=","avatar_url":"https://avatars0.githubusercontent.com/u/6232546?v=4","gravatar_id":"","url":"https://api.github.com/users/jolyonb","html_url":"https://github.com/jolyonb","followers_url":"https://api.github.com/users/jolyonb/followers","following_url":"https://api.github.com/users/jolyonb/following{/other_user}","gists_url":"https://api.github.com/users/jolyonb/gists{/gist_id}","starred_url":"https://api.github.com/users/jolyonb/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/jolyonb/subscriptions","organizations_url":"https://api.github.com/users/jolyonb/orgs","repos_url":"https://api.github.com/users/jolyonb/repos","events_url":"https://api.github.com/users/jolyonb/events{/privacy}","received_events_url":"https://api.github.com/users/jolyonb/received_events","type":"User","site_admin":false},"body":"Addresses issues #42 and #43 by rewriting calc.py to fix exponentiation problem (introduced \"negation\" operation) and allow multi-argument functions (introduced \"arguments\" operation). Also did general tidying of pyparsing script and some refactoring of calc.py, along with a little linting. Large changes to your `get_number_of_args` function were necessary to pull this off.","created_at":"2018-07-05T08:51:52Z","updated_at":"2018-07-05T17:46:44Z","closed_at":null,"merged_at":null,"merge_commit_sha":"67dc53f640dbc37df5f9206289e93bb90886e8c9","assignee":null,"assignees":[],"requested_reviewers":[],"requested_teams":[],"labels":[],"milestone":null,"commits_url":"https://api.github.com/repos/mitodl/mitx-grading-library/pulls/59/commits","review_comments_url":"https://api.github.com/repos/mitodl/mitx-grading-library/pulls/59/comments","review_comment_url":"https://api.github.com/repos/mitodl/mitx-grading-library/pulls/comments{/number}","comments_url":"https://api.github.com/repos/mitodl/mitx-grading-library/issues/59/comments","statuses_url":"https://api.github.com/repos/mitodl/mitx-grading-library/statuses/fcd152ae5d760b5ccd328a983263813591e9960c","head":{"label":"mitodl:multivar","ref":"multivar","sha":"fcd152ae5d760b5ccd328a983263813591e9960c","user":{"login":"mitodl","id":7918516,"node_id":"MDEyOk9yZ2FuaXphdGlvbjc5MTg1MTY=","avatar_url":"https://avatars2.githubusercontent.com/u/7918516?v=4","gravatar_id":"","url":"https://api.github.com/users/mitodl","html_url":"https://github.com/mitodl","followers_url":"https://api.github.com/users/mitodl/followers","following_url":"https://api.github.com/users/mitodl/following{/other_user}","gists_url":"https://api.github.com/users/mitodl/gists{/gist_id}","starred_url":"https://api.github.com/users/mitodl/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/mitodl/subscriptions","organizations_url":"https://api.github.com/users/mitodl/orgs","repos_url":"https://api.github.com/users/mitodl/repos","events_url":"https://api.github.com/users/mitodl/events{/privacy}","received_events_url":"https://api.github.com/users/mitodl/received_events","type":"Organization","site_admin":false},"repo":{"id":108290345,"node_id":"MDEwOlJlcG9zaXRvcnkxMDgyOTAzNDU=","name":"mitx-grading-library","full_name":"mitodl/mitx-grading-library","owner":{"login":"mitodl","id":7918516,"node_id":"MDEyOk9yZ2FuaXphdGlvbjc5MTg1MTY=","avatar_url":"https://avatars2.githubusercontent.com/u/7918516?v=4","gravatar_id":"","url":"https://api.github.com/users/mitodl","html_url":"https://github.com/mitodl","followers_url":"https://api.github.com/users/mitodl/followers","following_url":"https://api.github.com/users/mitodl/following{/other_user}","gists_url":"https://api.github.com/users/mitodl/gists{/gist_id}","starred_url":"https://api.github.com/users/mitodl/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/mitodl/subscriptions","organizations_url":"https://api.github.com/users/mitodl/orgs","repos_url":"https://api.github.com/users/mitodl/repos","events_url":"https://api.github.com/users/mitodl/events{/privacy}","received_events_url":"https://api.github.com/users/mitodl/received_events","type":"Organization","site_admin":false},"private":false,"html_url":"https://github.com/mitodl/mitx-grading-library","description":"The MITx Grading Library, a python grading library for edX","fork":false,"url":"https://api.github.com/repos/mitodl/mitx-grading-library","forks_url":"https://api.github.com/repos/mitodl/mitx-grading-library/forks","keys_url":"https://api.github.com/repos/mitodl/mitx-grading-library/keys{/key_id}","collaborators_url":"https://api.github.com/repos/mitodl/mitx-grading-library/collaborators{/collaborator}","teams_url":"https://api.github.com/repos/mitodl/mitx-grading-library/teams","hooks_url":"https://api.github.com/repos/mitodl/mitx-grading-library/hooks","issue_events_url":"https://api.github.com/repos/mitodl/mitx-grading-library/issues/events{/number}","events_url":"https://api.github.com/repos/mitodl/mitx-grading-library/events","assignees_url":"https://api.github.com/repos/mitodl/mitx-grading-library/assignees{/user}","branches_url":"https://api.github.com/repos/mitodl/mitx-grading-library/branches{/branch}","tags_url":"https://api.github.com/repos/mitodl/mitx-grading-library/tags","blobs_url":"https://api.github.com/repos/mitodl/mitx-grading-library/git/blobs{/sha}","git_tags_url":"https://api.github.com/repos/mitodl/mitx-grading-library/git/tags{/sha}","git_refs_url":"https://api.github.com/repos/mitodl/mitx-grading-library/git/refs{/sha}","trees_url":"https://api.github.com/repos/mitodl/mitx-grading-library/git/trees{/sha}","statuses_url":"https://api.github.com/repos/mitodl/mitx-grading-library/statuses/{sha}","languages_url":"https://api.github.com/repos/mitodl/mitx-grading-library/languages","stargazers_url":"https://api.github.com/repos/mitodl/mitx-grading-library/stargazers","contributors_url":"https://api.github.com/repos/mitodl/mitx-grading-library/contributors","subscribers_url":"https://api.github.com/repos/mitodl/mitx-grading-library/subscribers","subscription_url":"https://api.github.com/repos/mitodl/mitx-grading-library/subscription","commits_url":"https://api.github.com/repos/mitodl/mitx-grading-library/commits{/sha}","git_commits_url":"https://api.github.com/repos/mitodl/mitx-grading-library/git/commits{/sha}","comments_url":"https://api.github.com/repos/mitodl/mitx-grading-library/comments{/number}","issue_comment_url":"https://api.github.com/repos/mitodl/mitx-grading-library/issues/comments{/number}","contents_url":"https://api.github.com/repos/mitodl/mitx-grading-library/contents/{+path}","compare_url":"https://api.github.com/repos/mitodl/mitx-grading-library/compare/{base}...{head}","merges_url":"https://api.github.com/repos/mitodl/mitx-grading-library/merges","archive_url":"https://api.github.com/repos/mitodl/mitx-grading-library/{archive_format}{/ref}","downloads_url":"https://api.github.com/repos/mitodl/mitx-grading-library/downloads","issues_url":"https://api.github.com/repos/mitodl/mitx-grading-library/issues{/number}","pulls_url":"https://api.github.com/repos/mitodl/mitx-grading-library/pulls{/number}","milestones_url":"https://api.github.com/repos/mitodl/mitx-grading-library/milestones{/number}","notifications_url":"https://api.github.com/repos/mitodl/mitx-grading-library/notifications{?since,all,participating}","labels_url":"https://api.github.com/repos/mitodl/mitx-grading-library/labels{/name}","releases_url":"https://api.github.com/repos/mitodl/mitx-grading-library/releases{/id}","deployments_url":"https://api.github.com/repos/mitodl/mitx-grading-library/deployments","created_at":"2017-10-25T15:37:57Z","updated_at":"2018-07-04T20:51:58Z","pushed_at":"2018-07-05T17:38:18Z","git_url":"git://github.com/mitodl/mitx-grading-library.git","ssh_url":"git@github.com:mitodl/mitx-grading-library.git","clone_url":"https://github.com/mitodl/mitx-grading-library.git","svn_url":"https://github.com/mitodl/mitx-grading-library","homepage":"https://edge.edx.org/courses/course-v1:MITx+grading-library+examples/","size":2293,"stargazers_count":2,"watchers_count":2,"language":"Python","has_issues":true,"has_projects":true,"has_downloads":true,"has_wiki":true,"has_pages":false,"forks_count":2,"mirror_url":null,"archived":false,"open_issues_count":10,"license":{"key":"other","name":"Other","spdx_id":null,"url":null,"node_id":"MDc6TGljZW5zZTA="},"forks":2,"open_issues":10,"watchers":2,"default_branch":"master"}},"base":{"label":"mitodl:master","ref":"master","sha":"adaab0c9173f49b26ab404fc404279b13a16d290","user":{"login":"mitodl","id":7918516,"node_id":"MDEyOk9yZ2FuaXphdGlvbjc5MTg1MTY=","avatar_url":"https://avatars2.githubusercontent.com/u/7918516?v=4","gravatar_id":"","url":"https://api.github.com/users/mitodl","html_url":"https://github.com/mitodl","followers_url":"https://api.github.com/users/mitodl/followers","following_url":"https://api.github.com/users/mitodl/following{/other_user}","gists_url":"https://api.github.com/users/mitodl/gists{/gist_id}","starred_url":"https://api.github.com/users/mitodl/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/mitodl/subscriptions","organizations_url":"https://api.github.com/users/mitodl/orgs","repos_url":"https://api.github.com/users/mitodl/repos","events_url":"https://api.github.com/users/mitodl/events{/privacy}","received_events_url":"https://api.github.com/users/mitodl/received_events","type":"Organization","site_admin":false},"repo":{"id":108290345,"node_id":"MDEwOlJlcG9zaXRvcnkxMDgyOTAzNDU=","name":"mitx-grading-library","full_name":"mitodl/mitx-grading-library","owner":{"login":"mitodl","id":7918516,"node_id":"MDEyOk9yZ2FuaXphdGlvbjc5MTg1MTY=","avatar_url":"https://avatars2.githubusercontent.com/u/7918516?v=4","gravatar_id":"","url":"https://api.github.com/users/mitodl","html_url":"https://github.com/mitodl","followers_url":"https://api.github.com/users/mitodl/followers","following_url":"https://api.github.com/users/mitodl/following{/other_user}","gists_url":"https://api.github.com/users/mitodl/gists{/gist_id}","starred_url":"https://api.github.com/users/mitodl/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/mitodl/subscriptions","organizations_url":"https://api.github.com/users/mitodl/orgs","repos_url":"https://api.github.com/users/mitodl/repos","events_url":"https://api.github.com/users/mitodl/events{/privacy}","received_events_url":"https://api.github.com/users/mitodl/received_events","type":"Organization","site_admin":false},"private":false,"html_url":"https://github.com/mitodl/mitx-grading-library","description":"The MITx Grading Library, a python grading library for edX","fork":false,"url":"https://api.github.com/repos/mitodl/mitx-grading-library","forks_url":"https://api.github.com/repos/mitodl/mitx-grading-library/forks","keys_url":"https://api.github.com/repos/mitodl/mitx-grading-library/keys{/key_id}","collaborators_url":"https://api.github.com/repos/mitodl/mitx-grading-library/collaborators{/collaborator}","teams_url":"https://api.github.com/repos/mitodl/mitx-grading-library/teams","hooks_url":"https://api.github.com/repos/mitodl/mitx-grading-library/hooks","issue_events_url":"https://api.github.com/repos/mitodl/mitx-grading-library/issues/events{/number}","events_url":"https://api.github.com/repos/mitodl/mitx-grading-library/events","assignees_url":"https://api.github.com/repos/mitodl/mitx-grading-library/assignees{/user}","branches_url":"https://api.github.com/repos/mitodl/mitx-grading-library/branches{/branch}","tags_url":"https://api.github.com/repos/mitodl/mitx-grading-library/tags","blobs_url":"https://api.github.com/repos/mitodl/mitx-grading-library/git/blobs{/sha}","git_tags_url":"https://api.github.com/repos/mitodl/mitx-grading-library/git/tags{/sha}","git_refs_url":"https://api.github.com/repos/mitodl/mitx-grading-library/git/refs{/sha}","trees_url":"https://api.github.com/repos/mitodl/mitx-grading-library/git/trees{/sha}","statuses_url":"https://api.github.com/repos/mitodl/mitx-grading-library/statuses/{sha}","languages_url":"https://api.github.com/repos/mitodl/mitx-grading-library/languages","stargazers_url":"https://api.github.com/repos/mitodl/mitx-grading-library/stargazers","contributors_url":"https://api.github.com/repos/mitodl/mitx-grading-library/contributors","subscribers_url":"https://api.github.com/repos/mitodl/mitx-grading-library/subscribers","subscription_url":"https://api.github.com/repos/mitodl/mitx-grading-library/subscription","commits_url":"https://api.github.com/repos/mitodl/mitx-grading-library/commits{/sha}","git_commits_url":"https://api.github.com/repos/mitodl/mitx-grading-library/git/commits{/sha}","comments_url":"https://api.github.com/repos/mitodl/mitx-grading-library/comments{/number}","issue_comment_url":"https://api.github.com/repos/mitodl/mitx-grading-library/issues/comments{/number}","contents_url":"https://api.github.com/repos/mitodl/mitx-grading-library/contents/{+path}","compare_url":"https://api.github.com/repos/mitodl/mitx-grading-library/compare/{base}...{head}","merges_url":"https://api.github.com/repos/mitodl/mitx-grading-library/merges","archive_url":"https://api.github.com/repos/mitodl/mitx-grading-library/{archive_format}{/ref}","downloads_url":"https://api.github.com/repos/mitodl/mitx-grading-library/downloads","issues_url":"https://api.github.com/repos/mitodl/mitx-grading-library/issues{/number}","pulls_url":"https://api.github.com/repos/mitodl/mitx-grading-library/pulls{/number}","milestones_url":"https://api.github.com/repos/mitodl/mitx-grading-library/milestones{/number}","notifications_url":"https://api.github.com/repos/mitodl/mitx-grading-library/notifications{?since,all,participating}","labels_url":"https://api.github.com/repos/mitodl/mitx-grading-library/labels{/name}","releases_url":"https://api.github.com/repos/mitodl/mitx-grading-library/releases{/id}","deployments_url":"https://api.github.com/repos/mitodl/mitx-grading-library/deployments","created_at":"2017-10-25T15:37:57Z","updated_at":"2018-07-04T20:51:58Z","pushed_at":"2018-07-05T17:38:18Z","git_url":"git://github.com/mitodl/mitx-grading-library.git","ssh_url":"git@github.com:mitodl/mitx-grading-library.git","clone_url":"https://github.com/mitodl/mitx-grading-library.git","svn_url":"https://github.com/mitodl/mitx-grading-library","homepage":"https://edge.edx.org/courses/course-v1:MITx+grading-library+examples/","size":2293,"stargazers_count":2,"watchers_count":2,"language":"Python","has_issues":true,"has_projects":true,"has_downloads":true,"has_wiki":true,"has_pages":false,"forks_count":2,"mirror_url":null,"archived":false,"open_issues_count":10,"license":{"key":"other","name":"Other","spdx_id":null,"url":null,"node_id":"MDc6TGljZW5zZTA="},"forks":2,"open_issues":10,"watchers":2,"default_branch":"master"}},"_links":{"self":{"href":"https://api.github.com/repos/mitodl/mitx-grading-library/pulls/59"},"html":{"href":"https://github.com/mitodl/mitx-grading-library/pull/59"},"issue":{"href":"https://api.github.com/repos/mitodl/mitx-grading-library/issues/59"},"comments":{"href":"https://api.github.com/repos/mitodl/mitx-grading-library/issues/59/comments"},"review_comments":{"href":"https://api.github.com/repos/mitodl/mitx-grading-library/pulls/59/comments"},"review_comment":{"href":"https://api.github.com/repos/mitodl/mitx-grading-library/pulls/comments{/number}"},"commits":{"href":"https://api.github.com/repos/mitodl/mitx-grading-library/pulls/59/commits"},"statuses":{"href":"https://api.github.com/repos/mitodl/mitx-grading-library/statuses/fcd152ae5d760b5ccd328a983263813591e9960c"}},"author_association":"COLLABORATOR"}}
{"actor":{"display_login":"jolyonb"}}