{"action":"created","comment":{"url":"https://api.github.com/repos/ow2-proactive/scheduling/pulls/comments/219793987","pull_request_review_id":158049782,"id":219793987,"node_id":"MDI0OlB1bGxSZXF1ZXN0UmV2aWV3Q29tbWVudDIxOTc5Mzk4Nw==","diff_hunk":"@@ -0,0 +1,214 @@\n+/*\n+ * ProActive Parallel Suite(TM):\n+ * The Open Source library for parallel and distributed\n+ * Workflows & Scheduling, Orchestration, Cloud Automation\n+ * and Big Data Analysis on Enterprise Grids & Clouds.\n+ *\n+ * Copyright (c) 2007 - 2017 ActiveEon\n+ * Contact: contact@activeeon.com\n+ *\n+ * This library is free software: you can redistribute it and/or\n+ * modify it under the terms of the GNU Affero General Public License\n+ * as published by the Free Software Foundation: version 3 of\n+ * the License.\n+ *\n+ * This program is distributed in the hope that it will be useful,\n+ * but WITHOUT ANY WARRANTY; without even the implied warranty of\n+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\n+ * GNU Affero General Public License for more details.\n+ *\n+ * You should have received a copy of the GNU Affero General Public License\n+ * along with this program. If not, see <http://www.gnu.org/licenses/>.\n+ *\n+ * If needed, contact us to obtain a release under GPL Version 2 or 3\n+ * or a different license than the AGPL.\n+ */\n+package org.ow2.proactive.scheduler.examples;\n+\n+import java.io.File;\n+import java.io.IOException;\n+import java.io.Serializable;\n+import java.nio.channels.AsynchronousFileChannel;\n+import java.nio.file.Paths;\n+import java.nio.file.StandardOpenOption;\n+import java.util.Arrays;\n+import java.util.Map;\n+import java.util.Optional;\n+\n+import org.ow2.proactive.scheduler.common.task.TaskResult;\n+import org.ow2.proactive.scheduler.common.task.executable.JavaExecutable;\n+\n+import com.microsoft.azure.storage.blob.BlobRange;\n+import com.microsoft.azure.storage.blob.BlockBlobURL;\n+import com.microsoft.azure.storage.blob.ContainerURL;\n+import com.microsoft.azure.storage.blob.ListBlobsOptions;\n+import com.microsoft.azure.storage.blob.models.BlobItem;\n+import com.microsoft.azure.storage.blob.models.ContainerListBlobFlatSegmentResponse;\n+import com.microsoft.rest.v2.util.FlowableUtil;\n+\n+import io.reactivex.Single;\n+\n+\n+/**\n+ * @author ActiveEon Team\n+ * @since 13/09/2018\n+ */\n+public class AzureBlobDownloader extends JavaExecutable {\n+\n+    private String outputPath;\n+\n+    private String containerName;\n+\n+    Optional<String> optionalBlobName;\n+\n+    private String accountName;\n+\n+    private String accountKey;\n+\n+    private static final String OUTPUT_PATH = \"outputPath\";\n+\n+    private static final String CONTAINER_NAME = \"containerName\";\n+\n+    private static final String BLOB_NAME = \"optionalBlobName\";\n+\n+    private ContainerURL containerURL;\n+\n+    @Override\n+    public void init(Map<String, Serializable> args) throws Exception {\n+\n+        containerName = (String) Optional.ofNullable(args.get(CONTAINER_NAME)).filter(container -> ! container.toString().isEmpty()).orElseThrow( () -> new IllegalArgumentException(\"You have to specify a container name. Empty value is not allowed.\"));\n+\n+\n+        optionalBlobName = Optional.ofNullable(args.get(BLOB_NAME).toString()).filter(blob -> blob.isEmpty());\n+\n+        //Default value is getLocalSpace() because it will always be writable and moreover can be used to transfer files to another data space (global, user)\n+        outputPath = (String) Optional.ofNullable(args.get(OUTPUT_PATH)).filter(output -> ! output.toString().isEmpty()).orElse(getLocalSpace());\n+\n+        // Retrieve the credentials\n+        accountName = getThirdPartyCredential(\"ACCOUNT_NAME\");\n+        accountKey = getThirdPartyCredential(\"ACCOUNT_KEY\");\n+        if (accountName == null || accountKey == null) {\n+            throw new IllegalArgumentException(\"You first need to add your account name and account key (ACCOUNT_NAME, ACCOUNT_KEY) to the third party credentials.\");\n+        }\n+    }\n+\n+    /**\n+     * @see JavaExecutable#execute(TaskResult[])\n+     */\n+    @Override\n+    public Serializable execute(TaskResult... results) throws IOException {\n+\n+        File file = new File(outputPath);\n+        containerURL = AzureStorageConnectorUtils.createContainerURL(accountName, accountKey, containerName);\n+        //download a single blob\n+        if (optionalBlobName.isPresent()) {\n+            //check weather or not the outputPath is a folder path or a file path\n+            if (outputPath.lastIndexOf('/') == outputPath.length() - 1) {\n+                createDirIfNotExists(file);\n+                String azureBlobLocalRelativePath = Paths.get(outputPath, Paths.get(optionalBlobName.get()).getFileName().toString())","path":"scheduler/scheduler-examples/src/main/java/org/ow2/proactive/scheduler/examples/AzureBlobDownloader.java","position":108,"original_position":108,"commit_id":"6ba3071326a3d0d9461e466186f58eb049aee628","original_commit_id":"6ba3071326a3d0d9461e466186f58eb049aee628","user":{"login":"sonarqube-activeeon","id":14940028,"node_id":"MDQ6VXNlcjE0OTQwMDI4","avatar_url":"https://avatars1.githubusercontent.com/u/14940028?v=4","gravatar_id":"","url":"https://api.github.com/users/sonarqube-activeeon","html_url":"https://github.com/sonarqube-activeeon","followers_url":"https://api.github.com/users/sonarqube-activeeon/followers","following_url":"https://api.github.com/users/sonarqube-activeeon/following{/other_user}","gists_url":"https://api.github.com/users/sonarqube-activeeon/gists{/gist_id}","starred_url":"https://api.github.com/users/sonarqube-activeeon/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/sonarqube-activeeon/subscriptions","organizations_url":"https://api.github.com/users/sonarqube-activeeon/orgs","repos_url":"https://api.github.com/users/sonarqube-activeeon/repos","events_url":"https://api.github.com/users/sonarqube-activeeon/events{/privacy}","received_events_url":"https://api.github.com/users/sonarqube-activeeon/received_events","type":"User","site_admin":false},"body":"![MAJOR](https://sonarsource.github.io/sonar-github/severity-major.png 'Severity: MAJOR') Call \"optionalBlobName.isPresent()\" before accessing the value. [![rule](https://sonarsource.github.io/sonar-github/rule.png)](https://sonarcloud.io/coding_rules#rule_key=squid%3AS3655)\n","created_at":"2018-09-24T10:45:28Z","updated_at":"2018-09-24T10:45:28Z","html_url":"https://github.com/ow2-proactive/scheduling/pull/3338#discussion_r219793987","pull_request_url":"https://api.github.com/repos/ow2-proactive/scheduling/pulls/3338","author_association":"NONE","_links":{"self":{"href":"https://api.github.com/repos/ow2-proactive/scheduling/pulls/comments/219793987"},"html":{"href":"https://github.com/ow2-proactive/scheduling/pull/3338#discussion_r219793987"},"pull_request":{"href":"https://api.github.com/repos/ow2-proactive/scheduling/pulls/3338"}}},"pull_request":{"url":"https://api.github.com/repos/ow2-proactive/scheduling/pulls/3338","id":217326430,"node_id":"MDExOlB1bGxSZXF1ZXN0MjE3MzI2NDMw","html_url":"https://github.com/ow2-proactive/scheduling/pull/3338","diff_url":"https://github.com/ow2-proactive/scheduling/pull/3338.diff","patch_url":"https://github.com/ow2-proactive/scheduling/pull/3338.patch","issue_url":"https://api.github.com/repos/ow2-proactive/scheduling/issues/3338","number":3338,"state":"open","locked":false,"title":"Add the first version of azure blob data connector","user":{"login":"Aminelouati","id":29118247,"node_id":"MDQ6VXNlcjI5MTE4MjQ3","avatar_url":"https://avatars1.githubusercontent.com/u/29118247?v=4","gravatar_id":"","url":"https://api.github.com/users/Aminelouati","html_url":"https://github.com/Aminelouati","followers_url":"https://api.github.com/users/Aminelouati/followers","following_url":"https://api.github.com/users/Aminelouati/following{/other_user}","gists_url":"https://api.github.com/users/Aminelouati/gists{/gist_id}","starred_url":"https://api.github.com/users/Aminelouati/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/Aminelouati/subscriptions","organizations_url":"https://api.github.com/users/Aminelouati/orgs","repos_url":"https://api.github.com/users/Aminelouati/repos","events_url":"https://api.github.com/users/Aminelouati/events{/privacy}","received_events_url":"https://api.github.com/users/Aminelouati/received_events","type":"User","site_admin":false},"body":"In this PR, we add the azure blob data connector with its tow modes import and export. ","created_at":"2018-09-21T15:46:46Z","updated_at":"2018-09-24T10:45:28Z","closed_at":null,"merged_at":null,"merge_commit_sha":"5c93eeb3a5736cfbf8cba47a76127055b98edab4","assignee":null,"assignees":[],"requested_reviewers":[],"requested_teams":[],"labels":[],"milestone":null,"commits_url":"https://api.github.com/repos/ow2-proactive/scheduling/pulls/3338/commits","review_comments_url":"https://api.github.com/repos/ow2-proactive/scheduling/pulls/3338/comments","review_comment_url":"https://api.github.com/repos/ow2-proactive/scheduling/pulls/comments{/number}","comments_url":"https://api.github.com/repos/ow2-proactive/scheduling/issues/3338/comments","statuses_url":"https://api.github.com/repos/ow2-proactive/scheduling/statuses/6ba3071326a3d0d9461e466186f58eb049aee628","head":{"label":"Aminelouati:azure-blob","ref":"azure-blob","sha":"6ba3071326a3d0d9461e466186f58eb049aee628","user":{"login":"Aminelouati","id":29118247,"node_id":"MDQ6VXNlcjI5MTE4MjQ3","avatar_url":"https://avatars1.githubusercontent.com/u/29118247?v=4","gravatar_id":"","url":"https://api.github.com/users/Aminelouati","html_url":"https://github.com/Aminelouati","followers_url":"https://api.github.com/users/Aminelouati/followers","following_url":"https://api.github.com/users/Aminelouati/following{/other_user}","gists_url":"https://api.github.com/users/Aminelouati/gists{/gist_id}","starred_url":"https://api.github.com/users/Aminelouati/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/Aminelouati/subscriptions","organizations_url":"https://api.github.com/users/Aminelouati/orgs","repos_url":"https://api.github.com/users/Aminelouati/repos","events_url":"https://api.github.com/users/Aminelouati/events{/privacy}","received_events_url":"https://api.github.com/users/Aminelouati/received_events","type":"User","site_admin":false},"repo":{"id":124109253,"node_id":"MDEwOlJlcG9zaXRvcnkxMjQxMDkyNTM=","name":"scheduling","full_name":"Aminelouati/scheduling","private":false,"owner":{"login":"Aminelouati","id":29118247,"node_id":"MDQ6VXNlcjI5MTE4MjQ3","avatar_url":"https://avatars1.githubusercontent.com/u/29118247?v=4","gravatar_id":"","url":"https://api.github.com/users/Aminelouati","html_url":"https://github.com/Aminelouati","followers_url":"https://api.github.com/users/Aminelouati/followers","following_url":"https://api.github.com/users/Aminelouati/following{/other_user}","gists_url":"https://api.github.com/users/Aminelouati/gists{/gist_id}","starred_url":"https://api.github.com/users/Aminelouati/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/Aminelouati/subscriptions","organizations_url":"https://api.github.com/users/Aminelouati/orgs","repos_url":"https://api.github.com/users/Aminelouati/repos","events_url":"https://api.github.com/users/Aminelouati/events{/privacy}","received_events_url":"https://api.github.com/users/Aminelouati/received_events","type":"User","site_admin":false},"html_url":"https://github.com/Aminelouati/scheduling","description":"Multi-platform Scheduling and Workflows Engine","fork":true,"url":"https://api.github.com/repos/Aminelouati/scheduling","forks_url":"https://api.github.com/repos/Aminelouati/scheduling/forks","keys_url":"https://api.github.com/repos/Aminelouati/scheduling/keys{/key_id}","collaborators_url":"https://api.github.com/repos/Aminelouati/scheduling/collaborators{/collaborator}","teams_url":"https://api.github.com/repos/Aminelouati/scheduling/teams","hooks_url":"https://api.github.com/repos/Aminelouati/scheduling/hooks","issue_events_url":"https://api.github.com/repos/Aminelouati/scheduling/issues/events{/number}","events_url":"https://api.github.com/repos/Aminelouati/scheduling/events","assignees_url":"https://api.github.com/repos/Aminelouati/scheduling/assignees{/user}","branches_url":"https://api.github.com/repos/Aminelouati/scheduling/branches{/branch}","tags_url":"https://api.github.com/repos/Aminelouati/scheduling/tags","blobs_url":"https://api.github.com/repos/Aminelouati/scheduling/git/blobs{/sha}","git_tags_url":"https://api.github.com/repos/Aminelouati/scheduling/git/tags{/sha}","git_refs_url":"https://api.github.com/repos/Aminelouati/scheduling/git/refs{/sha}","trees_url":"https://api.github.com/repos/Aminelouati/scheduling/git/trees{/sha}","statuses_url":"https://api.github.com/repos/Aminelouati/scheduling/statuses/{sha}","languages_url":"https://api.github.com/repos/Aminelouati/scheduling/languages","stargazers_url":"https://api.github.com/repos/Aminelouati/scheduling/stargazers","contributors_url":"https://api.github.com/repos/Aminelouati/scheduling/contributors","subscribers_url":"https://api.github.com/repos/Aminelouati/scheduling/subscribers","subscription_url":"https://api.github.com/repos/Aminelouati/scheduling/subscription","commits_url":"https://api.github.com/repos/Aminelouati/scheduling/commits{/sha}","git_commits_url":"https://api.github.com/repos/Aminelouati/scheduling/git/commits{/sha}","comments_url":"https://api.github.com/repos/Aminelouati/scheduling/comments{/number}","issue_comment_url":"https://api.github.com/repos/Aminelouati/scheduling/issues/comments{/number}","contents_url":"https://api.github.com/repos/Aminelouati/scheduling/contents/{+path}","compare_url":"https://api.github.com/repos/Aminelouati/scheduling/compare/{base}...{head}","merges_url":"https://api.github.com/repos/Aminelouati/scheduling/merges","archive_url":"https://api.github.com/repos/Aminelouati/scheduling/{archive_format}{/ref}","downloads_url":"https://api.github.com/repos/Aminelouati/scheduling/downloads","issues_url":"https://api.github.com/repos/Aminelouati/scheduling/issues{/number}","pulls_url":"https://api.github.com/repos/Aminelouati/scheduling/pulls{/number}","milestones_url":"https://api.github.com/repos/Aminelouati/scheduling/milestones{/number}","notifications_url":"https://api.github.com/repos/Aminelouati/scheduling/notifications{?since,all,participating}","labels_url":"https://api.github.com/repos/Aminelouati/scheduling/labels{/name}","releases_url":"https://api.github.com/repos/Aminelouati/scheduling/releases{/id}","deployments_url":"https://api.github.com/repos/Aminelouati/scheduling/deployments","created_at":"2018-03-06T16:51:28Z","updated_at":"2018-09-10T15:49:11Z","pushed_at":"2018-09-24T10:42:09Z","git_url":"git://github.com/Aminelouati/scheduling.git","ssh_url":"git@github.com:Aminelouati/scheduling.git","clone_url":"https://github.com/Aminelouati/scheduling.git","svn_url":"https://github.com/Aminelouati/scheduling","homepage":"http://www.activeeon.com/workflows-scheduling","size":74252,"stargazers_count":0,"watchers_count":0,"language":"Java","has_issues":false,"has_projects":true,"has_downloads":true,"has_wiki":true,"has_pages":false,"forks_count":0,"mirror_url":null,"archived":false,"open_issues_count":0,"license":{"key":"agpl-3.0","name":"GNU Affero General Public License v3.0","spdx_id":"AGPL-3.0","url":"https://api.github.com/licenses/agpl-3.0","node_id":"MDc6TGljZW5zZTE="},"forks":0,"open_issues":0,"watchers":0,"default_branch":"master"}},"base":{"label":"ow2-proactive:master","ref":"master","sha":"1bcf2aa8567a3bc487e9716b9aede5a911647268","user":{"login":"ow2-proactive","id":11553998,"node_id":"MDEyOk9yZ2FuaXphdGlvbjExNTUzOTk4","avatar_url":"https://avatars1.githubusercontent.com/u/11553998?v=4","gravatar_id":"","url":"https://api.github.com/users/ow2-proactive","html_url":"https://github.com/ow2-proactive","followers_url":"https://api.github.com/users/ow2-proactive/followers","following_url":"https://api.github.com/users/ow2-proactive/following{/other_user}","gists_url":"https://api.github.com/users/ow2-proactive/gists{/gist_id}","starred_url":"https://api.github.com/users/ow2-proactive/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/ow2-proactive/subscriptions","organizations_url":"https://api.github.com/users/ow2-proactive/orgs","repos_url":"https://api.github.com/users/ow2-proactive/repos","events_url":"https://api.github.com/users/ow2-proactive/events{/privacy}","received_events_url":"https://api.github.com/users/ow2-proactive/received_events","type":"Organization","site_admin":false},"repo":{"id":35725079,"node_id":"MDEwOlJlcG9zaXRvcnkzNTcyNTA3OQ==","name":"scheduling","full_name":"ow2-proactive/scheduling","private":false,"owner":{"login":"ow2-proactive","id":11553998,"node_id":"MDEyOk9yZ2FuaXphdGlvbjExNTUzOTk4","avatar_url":"https://avatars1.githubusercontent.com/u/11553998?v=4","gravatar_id":"","url":"https://api.github.com/users/ow2-proactive","html_url":"https://github.com/ow2-proactive","followers_url":"https://api.github.com/users/ow2-proactive/followers","following_url":"https://api.github.com/users/ow2-proactive/following{/other_user}","gists_url":"https://api.github.com/users/ow2-proactive/gists{/gist_id}","starred_url":"https://api.github.com/users/ow2-proactive/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/ow2-proactive/subscriptions","organizations_url":"https://api.github.com/users/ow2-proactive/orgs","repos_url":"https://api.github.com/users/ow2-proactive/repos","events_url":"https://api.github.com/users/ow2-proactive/events{/privacy}","received_events_url":"https://api.github.com/users/ow2-proactive/received_events","type":"Organization","site_admin":false},"html_url":"https://github.com/ow2-proactive/scheduling","description":"Multi-platform Scheduling and Workflows Engine","fork":false,"url":"https://api.github.com/repos/ow2-proactive/scheduling","forks_url":"https://api.github.com/repos/ow2-proactive/scheduling/forks","keys_url":"https://api.github.com/repos/ow2-proactive/scheduling/keys{/key_id}","collaborators_url":"https://api.github.com/repos/ow2-proactive/scheduling/collaborators{/collaborator}","teams_url":"https://api.github.com/repos/ow2-proactive/scheduling/teams","hooks_url":"https://api.github.com/repos/ow2-proactive/scheduling/hooks","issue_events_url":"https://api.github.com/repos/ow2-proactive/scheduling/issues/events{/number}","events_url":"https://api.github.com/repos/ow2-proactive/scheduling/events","assignees_url":"https://api.github.com/repos/ow2-proactive/scheduling/assignees{/user}","branches_url":"https://api.github.com/repos/ow2-proactive/scheduling/branches{/branch}","tags_url":"https://api.github.com/repos/ow2-proactive/scheduling/tags","blobs_url":"https://api.github.com/repos/ow2-proactive/scheduling/git/blobs{/sha}","git_tags_url":"https://api.github.com/repos/ow2-proactive/scheduling/git/tags{/sha}","git_refs_url":"https://api.github.com/repos/ow2-proactive/scheduling/git/refs{/sha}","trees_url":"https://api.github.com/repos/ow2-proactive/scheduling/git/trees{/sha}","statuses_url":"https://api.github.com/repos/ow2-proactive/scheduling/statuses/{sha}","languages_url":"https://api.github.com/repos/ow2-proactive/scheduling/languages","stargazers_url":"https://api.github.com/repos/ow2-proactive/scheduling/stargazers","contributors_url":"https://api.github.com/repos/ow2-proactive/scheduling/contributors","subscribers_url":"https://api.github.com/repos/ow2-proactive/scheduling/subscribers","subscription_url":"https://api.github.com/repos/ow2-proactive/scheduling/subscription","commits_url":"https://api.github.com/repos/ow2-proactive/scheduling/commits{/sha}","git_commits_url":"https://api.github.com/repos/ow2-proactive/scheduling/git/commits{/sha}","comments_url":"https://api.github.com/repos/ow2-proactive/scheduling/comments{/number}","issue_comment_url":"https://api.github.com/repos/ow2-proactive/scheduling/issues/comments{/number}","contents_url":"https://api.github.com/repos/ow2-proactive/scheduling/contents/{+path}","compare_url":"https://api.github.com/repos/ow2-proactive/scheduling/compare/{base}...{head}","merges_url":"https://api.github.com/repos/ow2-proactive/scheduling/merges","archive_url":"https://api.github.com/repos/ow2-proactive/scheduling/{archive_format}{/ref}","downloads_url":"https://api.github.com/repos/ow2-proactive/scheduling/downloads","issues_url":"https://api.github.com/repos/ow2-proactive/scheduling/issues{/number}","pulls_url":"https://api.github.com/repos/ow2-proactive/scheduling/pulls{/number}","milestones_url":"https://api.github.com/repos/ow2-proactive/scheduling/milestones{/number}","notifications_url":"https://api.github.com/repos/ow2-proactive/scheduling/notifications{?since,all,participating}","labels_url":"https://api.github.com/repos/ow2-proactive/scheduling/labels{/name}","releases_url":"https://api.github.com/repos/ow2-proactive/scheduling/releases{/id}","deployments_url":"https://api.github.com/repos/ow2-proactive/scheduling/deployments","created_at":"2015-05-16T13:38:55Z","updated_at":"2018-09-22T16:42:57Z","pushed_at":"2018-09-24T10:42:10Z","git_url":"git://github.com/ow2-proactive/scheduling.git","ssh_url":"git@github.com:ow2-proactive/scheduling.git","clone_url":"https://github.com/ow2-proactive/scheduling.git","svn_url":"https://github.com/ow2-proactive/scheduling","homepage":"http://www.activeeon.com/workflows-scheduling","size":74373,"stargazers_count":29,"watchers_count":29,"language":"Java","has_issues":true,"has_projects":true,"has_downloads":true,"has_wiki":true,"has_pages":false,"forks_count":41,"mirror_url":null,"archived":false,"open_issues_count":182,"license":{"key":"agpl-3.0","name":"GNU Affero General Public License v3.0","spdx_id":"AGPL-3.0","url":"https://api.github.com/licenses/agpl-3.0","node_id":"MDc6TGljZW5zZTE="},"forks":41,"open_issues":182,"watchers":29,"default_branch":"master"}},"_links":{"self":{"href":"https://api.github.com/repos/ow2-proactive/scheduling/pulls/3338"},"html":{"href":"https://github.com/ow2-proactive/scheduling/pull/3338"},"issue":{"href":"https://api.github.com/repos/ow2-proactive/scheduling/issues/3338"},"comments":{"href":"https://api.github.com/repos/ow2-proactive/scheduling/issues/3338/comments"},"review_comments":{"href":"https://api.github.com/repos/ow2-proactive/scheduling/pulls/3338/comments"},"review_comment":{"href":"https://api.github.com/repos/ow2-proactive/scheduling/pulls/comments{/number}"},"commits":{"href":"https://api.github.com/repos/ow2-proactive/scheduling/pulls/3338/commits"},"statuses":{"href":"https://api.github.com/repos/ow2-proactive/scheduling/statuses/6ba3071326a3d0d9461e466186f58eb049aee628"}},"author_association":"CONTRIBUTOR"}}
{"actor":{"display_login":"sonarqube-activeeon"}}