{"action":"created","comment":{"url":"https://api.github.com/repos/UTRS/utrs/pulls/comments/50501043","id":50501043,"diff_hunk":"@@ -29,6 +30,135 @@\n \r\n debug('Destination: ' . $destination . '  Logout: ' . $logout . '</br>');\r\n \r\n+\r\n+/* BEGIN OAUTH */\r\n+\r\n+/**\r\n+ * Set this to the Special:OAuth/authorize URL. \r\n+ * To work around MobileFrontend redirection, use /wiki/ rather than /w/index.php.\r\n+ */\r\n+$mwOAuthAuthorizeUrl = 'https://www.mediawiki.org/wiki/Special:OAuth/authorize';\r\n+\r\n+/**\r\n+ * Set this to the Special:OAuth URL. \r\n+ * Note that /wiki/Special:OAuth fails when checking the signature, while\r\n+ * index.php?title=Special:OAuth works fine.\r\n+ */\r\n+$mwOAuthUrl = 'https://en.wikipedia.org/w/index.php?title=Special:OAuth';\r\n+\r\n+/**\r\n+ * Set this to the interwiki prefix for the OAuth central wiki.\r\n+ */\r\n+$mwOAuthIW = 'mw';\r\n+\r\n+/**\r\n+ * Set this to the API endpoint\r\n+ */\r\n+$apiUrl = 'https://en.wikipedia.org/w/api.php';\r\n+\r\n+/**\r\n+ * This should normally be \"500\". But Tool Labs insists on overriding valid 500\r\n+ * responses with a useless error page.\r\n+ */\r\n+$errorCode = 200;\r\n+\r\n+\r\n+// Setup the session cookie\r\n+session_name( 'utrs_oauth' );\r\n+$params = session_get_cookie_params();\r\n+session_set_cookie_params(\r\n+    $params['lifetime'],\r\n+    dirname( $_SERVER['SCRIPT_NAME'] )\r\n+);\r\n+\r\n+\r\n+$gUserAgent = @$CONFIG['oauth']['agent'];\r\n+$gConsumerKey = @$CONFIG['oauth']['consumerKey'];\r\n+$gConsumerSecret = @$CONFIG['oauth']['consumerSecret'];\r\n+\r\n+// Load the user token (request or access) from the session\r\n+$gTokenKey = '';\r\n+$gTokenSecret = '';\r\n+session_name('UTRSLogin');\r\n+session_start();\r\n+\r\n+if ( isset( $_GET['oauth_verifier'] ) && $_GET['oauth_verifier'] ) {\r\n+    $gTokenKey = $_SESSION['tokenKey'];\r\n+    $gTokenSecret = $_SESSION['tokenSecret'];\r\n+    fetchAccessToken();\r\n+    $payload = doIdentify();\r\n+\r\n+    $is_admin = in_array(\"sysop\", $payload->groups);\r\n+    $is_check = in_array(\"checkuser\", $payload->groups);\r\n+    $username = $payload->username;\r\n+\r\n+    if ($is_admin === TRUE && $payload->confirmed_email === TRUE) {\r\n+        session_name('UTRSLogin');\r\n+        session_start();\r\n+        $_SESSION['user'] = $username;\r\n+        $_SESSION['oauth'] = TRUE;\r\n+\r\n+        $db = connectToDB(true);\r\n+        $query = $db->prepare('\r\n+                SELECT userID FROM user\r\n+                WHERE username = :username');\r\n+\r\n+        $result = $query->execute(array(\r\n+                ':username'\t=> $username));\r\n+\r\n+        if($result === false){\r\n+                $error = var_export($query->errorInfo(), true);\r\n+                debug('ERROR: ' . $error . '<br/>');\r\n+                throw new UTRSDatabaseException($error);\r\n+        }\r\n+        $data = $query->fetch(PDO::FETCH_ASSOC);\r\n+        $query->closeCursor();\r\n+        if ($data['userID'] === NULL) {\r\n+            $user = new User(array(\r\n+                'wikiAccount' => $username,\r\n+                'diff' => \"\",\r\n+                'username' => $username,\r\n+                'email' => $payload->email,\r\n+            ), false, array(\r\n+                'checkuser' => $is_check,\r\n+            ));\r\n+            debug('object created<br/>');\r\n+        } else {\r\n+            $user = User::getUserById($data['userID']);\r\n+            if ($user->isCheckuser() !== $is_check || $user->getEmail() !== $payload->email) {\r\n+                // XXX: Logging?\r\n+                $query = $db->prepare(\"\r\n+                        UPDATE user\r\n+                        SET checkuser = :checkuser,\r\n+                            email = :email\r\n+                        WHERE userID = :userID\");\r\n+                $result = $query->execute(array(\r\n+                        ':checkuser' => (bool)$is_check,\r","path":"public_html/login.php","position":115,"original_position":115,"commit_id":"cc86f1814981a122002bbe3114c771dd4632de2c","original_commit_id":"cc86f1814981a122002bbe3114c771dd4632de2c","user":{"login":"dqwiki","id":676350,"avatar_url":"https://avatars.githubusercontent.com/u/676350?v=3","gravatar_id":"","url":"https://api.github.com/users/dqwiki","html_url":"https://github.com/dqwiki","followers_url":"https://api.github.com/users/dqwiki/followers","following_url":"https://api.github.com/users/dqwiki/following{/other_user}","gists_url":"https://api.github.com/users/dqwiki/gists{/gist_id}","starred_url":"https://api.github.com/users/dqwiki/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/dqwiki/subscriptions","organizations_url":"https://api.github.com/users/dqwiki/orgs","repos_url":"https://api.github.com/users/dqwiki/repos","events_url":"https://api.github.com/users/dqwiki/events{/privacy}","received_events_url":"https://api.github.com/users/dqwiki/received_events","type":"User","site_admin":false},"body":"Just to be safe and consistent please.","created_at":"2016-01-22T04:23:59Z","updated_at":"2016-01-22T04:23:59Z","html_url":"https://github.com/UTRS/utrs/pull/57#discussion_r50501043","pull_request_url":"https://api.github.com/repos/UTRS/utrs/pulls/57","_links":{"self":{"href":"https://api.github.com/repos/UTRS/utrs/pulls/comments/50501043"},"html":{"href":"https://github.com/UTRS/utrs/pull/57#discussion_r50501043"},"pull_request":{"href":"https://api.github.com/repos/UTRS/utrs/pulls/57"}}},"pull_request":{"url":"https://api.github.com/repos/UTRS/utrs/pulls/57","id":51480477,"html_url":"https://github.com/UTRS/utrs/pull/57","diff_url":"https://github.com/UTRS/utrs/pull/57.diff","patch_url":"https://github.com/UTRS/utrs/pull/57.patch","issue_url":"https://api.github.com/repos/UTRS/utrs/issues/57","number":57,"state":"open","locked":false,"title":"Authenticate users via OAuth2","user":{"login":"lfaraone","id":73410,"avatar_url":"https://avatars.githubusercontent.com/u/73410?v=3","gravatar_id":"","url":"https://api.github.com/users/lfaraone","html_url":"https://github.com/lfaraone","followers_url":"https://api.github.com/users/lfaraone/followers","following_url":"https://api.github.com/users/lfaraone/following{/other_user}","gists_url":"https://api.github.com/users/lfaraone/gists{/gist_id}","starred_url":"https://api.github.com/users/lfaraone/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/lfaraone/subscriptions","organizations_url":"https://api.github.com/users/lfaraone/orgs","repos_url":"https://api.github.com/users/lfaraone/repos","events_url":"https://api.github.com/users/lfaraone/events{/privacy}","received_events_url":"https://api.github.com/users/lfaraone/received_events","type":"User","site_admin":false},"body":"This implements OAuth2 sign-in for UTRS, replacing the existing system. Fixes #50.\r\n\r\nUser accounts are automatically provisioned for members of the `sysop` group when they sign in. CheckUser status and email addresses are automatically propagated.\r\n\r\nTo use:\r\n 1. [Register an OAuth consumer](https://meta.wikimedia.org/wiki/Special:OAuthConsumerRegistration/propose) specifying:\r\n    * Grants: \"Authentication only with access to real name and email address via Special:OAuth/identify, no API access.\"\r\n    * OAuth \"callback\" URL: `http://your-webserver/login.php`\r\n    * Applicable project: `en.wikipedia.org`\r\n 2. Put your consumer token, secret token, and user agent into `public_html/src/config.js.php`\r\n 3. Visit `/login.php` in your favourite web browser.\r\n\r\nThings this doesn't do:\r\n - Remove the UI around password and email address configuration.\r\n - Rip out the backend for logging in with a username and password; I don't want to disrupt other developers' workflows, so deferring to y'all whether that should be kept around.\r\n\r\nThings I tested:\r\n - [x] Accounts are auto-created, approved, activated on sign-in. \r\n - [x] Login does not work if the user is not a member of the required group (I changed `sysop` to `staff` below, for testing)\r\n - [x] Already existing users' have their email address and CheckUser status updated on login.\r\n\r\nThings I cannot test:\r\n - Accepting the ToS. The relevant file doesn't appear to be part of the git repo; in any case, the wording will probably have to be tweaked. For testing, I manually frobbed the database after logging in.\r\n - Actually using the app; even before I started working on OAuth2, logging in showed me [a fairly-broken display](https://cloud.githubusercontent.com/assets/73410/11328063/7e96c44c-917a-11e5-9025-0185f8dbdbd8.png)","created_at":"2015-11-23T00:50:31Z","updated_at":"2016-01-22T04:23:59Z","closed_at":null,"merged_at":null,"merge_commit_sha":"5eb32b5dec57fca0707e7e5f34d24abc09d7c17c","assignee":{"login":"dqwiki","id":676350,"avatar_url":"https://avatars.githubusercontent.com/u/676350?v=3","gravatar_id":"","url":"https://api.github.com/users/dqwiki","html_url":"https://github.com/dqwiki","followers_url":"https://api.github.com/users/dqwiki/followers","following_url":"https://api.github.com/users/dqwiki/following{/other_user}","gists_url":"https://api.github.com/users/dqwiki/gists{/gist_id}","starred_url":"https://api.github.com/users/dqwiki/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/dqwiki/subscriptions","organizations_url":"https://api.github.com/users/dqwiki/orgs","repos_url":"https://api.github.com/users/dqwiki/repos","events_url":"https://api.github.com/users/dqwiki/events{/privacy}","received_events_url":"https://api.github.com/users/dqwiki/received_events","type":"User","site_admin":false},"milestone":{"url":"https://api.github.com/repos/UTRS/utrs/milestones/4","html_url":"https://github.com/UTRS/utrs/milestones/Version%201.4","labels_url":"https://api.github.com/repos/UTRS/utrs/milestones/4/labels","id":1102508,"number":4,"title":"Version 1.4","description":"","creator":{"login":"dqwiki","id":676350,"avatar_url":"https://avatars.githubusercontent.com/u/676350?v=3","gravatar_id":"","url":"https://api.github.com/users/dqwiki","html_url":"https://github.com/dqwiki","followers_url":"https://api.github.com/users/dqwiki/followers","following_url":"https://api.github.com/users/dqwiki/following{/other_user}","gists_url":"https://api.github.com/users/dqwiki/gists{/gist_id}","starred_url":"https://api.github.com/users/dqwiki/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/dqwiki/subscriptions","organizations_url":"https://api.github.com/users/dqwiki/orgs","repos_url":"https://api.github.com/users/dqwiki/repos","events_url":"https://api.github.com/users/dqwiki/events{/privacy}","received_events_url":"https://api.github.com/users/dqwiki/received_events","type":"User","site_admin":false},"open_issues":2,"closed_issues":3,"state":"open","created_at":"2015-05-08T20:47:43Z","updated_at":"2015-12-13T10:39:36Z","due_on":"2015-08-15T04:00:00Z","closed_at":null},"commits_url":"https://api.github.com/repos/UTRS/utrs/pulls/57/commits","review_comments_url":"https://api.github.com/repos/UTRS/utrs/pulls/57/comments","review_comment_url":"https://api.github.com/repos/UTRS/utrs/pulls/comments{/number}","comments_url":"https://api.github.com/repos/UTRS/utrs/issues/57/comments","statuses_url":"https://api.github.com/repos/UTRS/utrs/statuses/cc86f1814981a122002bbe3114c771dd4632de2c","head":{"label":"lfaraone:oauth","ref":"oauth","sha":"cc86f1814981a122002bbe3114c771dd4632de2c","user":{"login":"lfaraone","id":73410,"avatar_url":"https://avatars.githubusercontent.com/u/73410?v=3","gravatar_id":"","url":"https://api.github.com/users/lfaraone","html_url":"https://github.com/lfaraone","followers_url":"https://api.github.com/users/lfaraone/followers","following_url":"https://api.github.com/users/lfaraone/following{/other_user}","gists_url":"https://api.github.com/users/lfaraone/gists{/gist_id}","starred_url":"https://api.github.com/users/lfaraone/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/lfaraone/subscriptions","organizations_url":"https://api.github.com/users/lfaraone/orgs","repos_url":"https://api.github.com/users/lfaraone/repos","events_url":"https://api.github.com/users/lfaraone/events{/privacy}","received_events_url":"https://api.github.com/users/lfaraone/received_events","type":"User","site_admin":false},"repo":{"id":46636914,"name":"utrs","full_name":"lfaraone/utrs","owner":{"login":"lfaraone","id":73410,"avatar_url":"https://avatars.githubusercontent.com/u/73410?v=3","gravatar_id":"","url":"https://api.github.com/users/lfaraone","html_url":"https://github.com/lfaraone","followers_url":"https://api.github.com/users/lfaraone/followers","following_url":"https://api.github.com/users/lfaraone/following{/other_user}","gists_url":"https://api.github.com/users/lfaraone/gists{/gist_id}","starred_url":"https://api.github.com/users/lfaraone/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/lfaraone/subscriptions","organizations_url":"https://api.github.com/users/lfaraone/orgs","repos_url":"https://api.github.com/users/lfaraone/repos","events_url":"https://api.github.com/users/lfaraone/events{/privacy}","received_events_url":"https://api.github.com/users/lfaraone/received_events","type":"User","site_admin":false},"private":false,"html_url":"https://github.com/lfaraone/utrs","description":"","fork":true,"url":"https://api.github.com/repos/lfaraone/utrs","forks_url":"https://api.github.com/repos/lfaraone/utrs/forks","keys_url":"https://api.github.com/repos/lfaraone/utrs/keys{/key_id}","collaborators_url":"https://api.github.com/repos/lfaraone/utrs/collaborators{/collaborator}","teams_url":"https://api.github.com/repos/lfaraone/utrs/teams","hooks_url":"https://api.github.com/repos/lfaraone/utrs/hooks","issue_events_url":"https://api.github.com/repos/lfaraone/utrs/issues/events{/number}","events_url":"https://api.github.com/repos/lfaraone/utrs/events","assignees_url":"https://api.github.com/repos/lfaraone/utrs/assignees{/user}","branches_url":"https://api.github.com/repos/lfaraone/utrs/branches{/branch}","tags_url":"https://api.github.com/repos/lfaraone/utrs/tags","blobs_url":"https://api.github.com/repos/lfaraone/utrs/git/blobs{/sha}","git_tags_url":"https://api.github.com/repos/lfaraone/utrs/git/tags{/sha}","git_refs_url":"https://api.github.com/repos/lfaraone/utrs/git/refs{/sha}","trees_url":"https://api.github.com/repos/lfaraone/utrs/git/trees{/sha}","statuses_url":"https://api.github.com/repos/lfaraone/utrs/statuses/{sha}","languages_url":"https://api.github.com/repos/lfaraone/utrs/languages","stargazers_url":"https://api.github.com/repos/lfaraone/utrs/stargazers","contributors_url":"https://api.github.com/repos/lfaraone/utrs/contributors","subscribers_url":"https://api.github.com/repos/lfaraone/utrs/subscribers","subscription_url":"https://api.github.com/repos/lfaraone/utrs/subscription","commits_url":"https://api.github.com/repos/lfaraone/utrs/commits{/sha}","git_commits_url":"https://api.github.com/repos/lfaraone/utrs/git/commits{/sha}","comments_url":"https://api.github.com/repos/lfaraone/utrs/comments{/number}","issue_comment_url":"https://api.github.com/repos/lfaraone/utrs/issues/comments{/number}","contents_url":"https://api.github.com/repos/lfaraone/utrs/contents/{+path}","compare_url":"https://api.github.com/repos/lfaraone/utrs/compare/{base}...{head}","merges_url":"https://api.github.com/repos/lfaraone/utrs/merges","archive_url":"https://api.github.com/repos/lfaraone/utrs/{archive_format}{/ref}","downloads_url":"https://api.github.com/repos/lfaraone/utrs/downloads","issues_url":"https://api.github.com/repos/lfaraone/utrs/issues{/number}","pulls_url":"https://api.github.com/repos/lfaraone/utrs/pulls{/number}","milestones_url":"https://api.github.com/repos/lfaraone/utrs/milestones{/number}","notifications_url":"https://api.github.com/repos/lfaraone/utrs/notifications{?since,all,participating}","labels_url":"https://api.github.com/repos/lfaraone/utrs/labels{/name}","releases_url":"https://api.github.com/repos/lfaraone/utrs/releases{/id}","deployments_url":"https://api.github.com/repos/lfaraone/utrs/deployments","created_at":"2015-11-21T22:38:56Z","updated_at":"2015-11-21T22:38:56Z","pushed_at":"2015-11-23T00:50:08Z","git_url":"git://github.com/lfaraone/utrs.git","ssh_url":"git@github.com:lfaraone/utrs.git","clone_url":"https://github.com/lfaraone/utrs.git","svn_url":"https://github.com/lfaraone/utrs","homepage":"","size":1380,"stargazers_count":0,"watchers_count":0,"language":"PHP","has_issues":false,"has_downloads":true,"has_wiki":true,"has_pages":false,"forks_count":0,"mirror_url":null,"open_issues_count":0,"forks":0,"open_issues":0,"watchers":0,"default_branch":"master"}},"base":{"label":"UTRS:master","ref":"master","sha":"0926a31fa40411c6caf1a4f3b77fe9af118d4b16","user":{"login":"UTRS","id":1622433,"avatar_url":"https://avatars.githubusercontent.com/u/1622433?v=3","gravatar_id":"","url":"https://api.github.com/users/UTRS","html_url":"https://github.com/UTRS","followers_url":"https://api.github.com/users/UTRS/followers","following_url":"https://api.github.com/users/UTRS/following{/other_user}","gists_url":"https://api.github.com/users/UTRS/gists{/gist_id}","starred_url":"https://api.github.com/users/UTRS/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/UTRS/subscriptions","organizations_url":"https://api.github.com/users/UTRS/orgs","repos_url":"https://api.github.com/users/UTRS/repos","events_url":"https://api.github.com/users/UTRS/events{/privacy}","received_events_url":"https://api.github.com/users/UTRS/received_events","type":"Organization","site_admin":false},"repo":{"id":3962278,"name":"utrs","full_name":"UTRS/utrs","owner":{"login":"UTRS","id":1622433,"avatar_url":"https://avatars.githubusercontent.com/u/1622433?v=3","gravatar_id":"","url":"https://api.github.com/users/UTRS","html_url":"https://github.com/UTRS","followers_url":"https://api.github.com/users/UTRS/followers","following_url":"https://api.github.com/users/UTRS/following{/other_user}","gists_url":"https://api.github.com/users/UTRS/gists{/gist_id}","starred_url":"https://api.github.com/users/UTRS/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/UTRS/subscriptions","organizations_url":"https://api.github.com/users/UTRS/orgs","repos_url":"https://api.github.com/users/UTRS/repos","events_url":"https://api.github.com/users/UTRS/events{/privacy}","received_events_url":"https://api.github.com/users/UTRS/received_events","type":"Organization","site_admin":false},"private":false,"html_url":"https://github.com/UTRS/utrs","description":"","fork":false,"url":"https://api.github.com/repos/UTRS/utrs","forks_url":"https://api.github.com/repos/UTRS/utrs/forks","keys_url":"https://api.github.com/repos/UTRS/utrs/keys{/key_id}","collaborators_url":"https://api.github.com/repos/UTRS/utrs/collaborators{/collaborator}","teams_url":"https://api.github.com/repos/UTRS/utrs/teams","hooks_url":"https://api.github.com/repos/UTRS/utrs/hooks","issue_events_url":"https://api.github.com/repos/UTRS/utrs/issues/events{/number}","events_url":"https://api.github.com/repos/UTRS/utrs/events","assignees_url":"https://api.github.com/repos/UTRS/utrs/assignees{/user}","branches_url":"https://api.github.com/repos/UTRS/utrs/branches{/branch}","tags_url":"https://api.github.com/repos/UTRS/utrs/tags","blobs_url":"https://api.github.com/repos/UTRS/utrs/git/blobs{/sha}","git_tags_url":"https://api.github.com/repos/UTRS/utrs/git/tags{/sha}","git_refs_url":"https://api.github.com/repos/UTRS/utrs/git/refs{/sha}","trees_url":"https://api.github.com/repos/UTRS/utrs/git/trees{/sha}","statuses_url":"https://api.github.com/repos/UTRS/utrs/statuses/{sha}","languages_url":"https://api.github.com/repos/UTRS/utrs/languages","stargazers_url":"https://api.github.com/repos/UTRS/utrs/stargazers","contributors_url":"https://api.github.com/repos/UTRS/utrs/contributors","subscribers_url":"https://api.github.com/repos/UTRS/utrs/subscribers","subscription_url":"https://api.github.com/repos/UTRS/utrs/subscription","commits_url":"https://api.github.com/repos/UTRS/utrs/commits{/sha}","git_commits_url":"https://api.github.com/repos/UTRS/utrs/git/commits{/sha}","comments_url":"https://api.github.com/repos/UTRS/utrs/comments{/number}","issue_comment_url":"https://api.github.com/repos/UTRS/utrs/issues/comments{/number}","contents_url":"https://api.github.com/repos/UTRS/utrs/contents/{+path}","compare_url":"https://api.github.com/repos/UTRS/utrs/compare/{base}...{head}","merges_url":"https://api.github.com/repos/UTRS/utrs/merges","archive_url":"https://api.github.com/repos/UTRS/utrs/{archive_format}{/ref}","downloads_url":"https://api.github.com/repos/UTRS/utrs/downloads","issues_url":"https://api.github.com/repos/UTRS/utrs/issues{/number}","pulls_url":"https://api.github.com/repos/UTRS/utrs/pulls{/number}","milestones_url":"https://api.github.com/repos/UTRS/utrs/milestones{/number}","notifications_url":"https://api.github.com/repos/UTRS/utrs/notifications{?since,all,participating}","labels_url":"https://api.github.com/repos/UTRS/utrs/labels{/name}","releases_url":"https://api.github.com/repos/UTRS/utrs/releases{/id}","deployments_url":"https://api.github.com/repos/UTRS/utrs/deployments","created_at":"2012-04-08T04:00:03Z","updated_at":"2015-07-01T12:38:33Z","pushed_at":"2016-01-22T04:05:13Z","git_url":"git://github.com/UTRS/utrs.git","ssh_url":"git@github.com:UTRS/utrs.git","clone_url":"https://github.com/UTRS/utrs.git","svn_url":"https://github.com/UTRS/utrs","homepage":"","size":1392,"stargazers_count":8,"watchers_count":8,"language":"PHP","has_issues":true,"has_downloads":true,"has_wiki":true,"has_pages":false,"forks_count":5,"mirror_url":null,"open_issues_count":17,"forks":5,"open_issues":17,"watchers":8,"default_branch":"master"}},"_links":{"self":{"href":"https://api.github.com/repos/UTRS/utrs/pulls/57"},"html":{"href":"https://github.com/UTRS/utrs/pull/57"},"issue":{"href":"https://api.github.com/repos/UTRS/utrs/issues/57"},"comments":{"href":"https://api.github.com/repos/UTRS/utrs/issues/57/comments"},"review_comments":{"href":"https://api.github.com/repos/UTRS/utrs/pulls/57/comments"},"review_comment":{"href":"https://api.github.com/repos/UTRS/utrs/pulls/comments{/number}"},"commits":{"href":"https://api.github.com/repos/UTRS/utrs/pulls/57/commits"},"statuses":{"href":"https://api.github.com/repos/UTRS/utrs/statuses/cc86f1814981a122002bbe3114c771dd4632de2c"}}}}