{"action":"created","comment":{"url":"https://api.github.com/repos/aspnet/Docs/pulls/comments/38722677","id":38722677,"diff_hunk":"@@ -1,8 +1,384 @@\n-.. include:: /../common/stub-topic.txt\n-\n-|stub-icon| Authoring Tag Helpers\n+Authoring Tag Helpers\n ===========================================\n \n-.. include:: /../common/stub-notice.txt\n+By `Rick Anderson`_\n+\n+    - `Getting started with Tag Helpers`_ \n+    - `Starting the email Tag Helper`_\n+    - `A working email Tag Helper`_\n+    - `The bold Tag Helper`_\n+    - `Web site information Tag Helper`_\n+    - `Condition Tag Helper`_\n+    - `Avoiding Tag Helper conflicts`_\n+    - `Inspecting and retrieving child content`_\n+    - `Wrap up and next steps`_\n+    - `Additional Resources`_\n+\n+You can browse the source code for the sample app used in this document on `GitHub <https://github.com/aspnet/Docs/tree/master/mvc/views/tag-helpers/authoring/sample>`__. \n+\n+Getting started with Tag Helpers\n+------------------------------------\n+\n+This tutorial provides an introduction to programming Tag Helpers. :doc:`intro` describes the benefits that Tag Helpers provide.\n+\n+A tag helper is any class that implements the `ITagHelper <https://github.com/aspnet/Razor/blob/dev/src/Microsoft.AspNet.Razor.Runtime/TagHelpers/ITagHelper.cs>`__ interface. However, when you author a tag helper, you generally derive from `TagHelper <https://github.com/aspnet/Razor/blob/dev/src/Microsoft.AspNet.Razor.Runtime/TagHelpers/TagHelper.cs>`__, doing so gives you access to the ``Process`` method. We will introduce the ``TagHelper`` methods and properties as we use them in this tutorial. \n+\n+#. Create a new ASP.NET MVC 6 project called **AuthoringTagHelpers**. You won't need authentication for this project.\n+#. Create a folder to hold the Tag Helpers called *TagHelpers*. The *TagHelpers* folder is *not* required, but it is a reasonable convention. Now let's get started writing some simple tag helpers.\n+\n+Starting the email Tag Helper\n+--------------------------------\n+\n+In this section we will write a tag helper that updates an email tag. For example:\n+\n+``<email>Support</email>``\n+\n+The server will use our email tag helper to convert that markup into the following:\n+\n+.. code-block:: HTML\n+\n+\t<a href=\"mailto:Support@example.com\">Support@example.com</a>\n+\n+That is, an anchor tag that makes this an email link. You might want to do this if you are writing a blog engine and need it to send email for marketing, support, and other contacts, all to the same domain.\n+\n+#. Add the following ``EmailTagHelper`` class to the *TagHelpers* folder.\n+\n+.. literalinclude:: authoring/sample/TagHlp/src/AuthoringTagHelpers/TagHelpers/z1EmailTagHelperCopy.cs\n+   :language: c#\n+   \n+Notes: \n+\n+- ASP.NET MVC 6 uses a naming convention that targets elements of the root class name (minus the *TagHelper* portion of the class name). In this example, the root name of **Email**\\TagHelper is *email*, so the ``<email>`` tag will be targeted. This naming convention should work for most tag helpers and later on I'll show how to override it.\n+\n+- The ``EmailTagHelper`` class derives from `TagHelper <https://github.com/aspnet/Razor/tree/dev/src/Microsoft.AspNet.Razor.Runtime/TagHelpers>`__. The ``TagHelper`` class provides the rich methods and properties we will examine in this tutorial.\n+- The override ``Process`` method controls what the tag helper does when executed.  The ``TagHelper`` class also provides an asynchronous version (``ProcessAsync``) with the same parameters.  \n+- The context parameter to ``Process`` (and ``ProcessAsync``) contains information associated with the execution of the current HTML tag. We will use the context parameter to get the content of our target element.\n+- The output parameter to ``Process`` (and ``ProcessAsync``) contains a stateful HTML element representative of the original source used to generate an HTML tag and content.\n+- Our class name has a suffix of **TagHelper**, which is required.\n+\n+.. The ``TargetElement`` attribute identifies \"email\" as the element to target for processing. If you don't specify a ``TargetElement`` attribute, ASP.NET MVC 6 uses a naming convention that targets elements of the root class name (minus the *TagHelper* portion of the class name). You could comment out this attribute (because the class is named **Email**\\TagHelper), and it would target email tags. Using the attribute does make the intention explicit (that is, we are targeting **<email>** tags).\n+\n+2. To make the ``EmailTagHelper`` class available to all our Razor views, we will add the ``addTagHelper`` directive to the *Views/_ViewImports.cshtml* file:  \n+\n+.. literalinclude:: authoring/sample/TagHlp/src/AuthoringTagHelpers/Views/_ViewImports.cshtml\n+   :language: aspx-cs\n+   :lines: 1-3\n+   :emphasize-lines: 3\n+\n+To add a tag helper to a view, you first add the fully qualified name (``AuthoringTagHelpers.TagHelpers.EmailTagHelper``), and then the DLL name (*AuthoringTagHelpers*). You typically add tag helpers to the *Views/_ViewImports.cshtml* file as we've done here, but it's more common to use wildcard syntax to bring in all tag helpers with one line, as the following shows:\n+\n+.. literalinclude:: authoring/sample/TagHlp/src/AuthoringTagHelpers/Views/_ViewImportsCopy.cshtml\n+   :language: aspx-cs\n+   :lines: 2-4\n+   :emphasize-lines: 2,3\n+\n+When you use the wildcard syntax, you don't need to use the fully qualified name. Also, note that the second line brings in the `ASP.NET 5 MVC 6 tag helpers <https://github.com/aspnet/Mvc/tree/dev/src/Microsoft.AspNet.Mvc.TagHelpers>`__ using the wild card syntax (those helpers are discussed in :doc:`intro`.) It's the ``@addTagHelper`` command that makes the tag helper available to the Razor view.\n+   \n+3. Update the markup in the *Views/Home/Contact.cshtml* file with these changes:\n+\n+.. literalinclude::  authoring/sample/TagHlp/src/AuthoringTagHelpers/Views/Home/Contact.cshtml\n+   :language: aspx-cs\n+   :emphasize-lines: 15-16\n+   :lines: 1-17\n+   \n+4. Run the app and use your favorite browser to view the HTML source so you can verify that the email tag is replaced with anchor markup (``<a>Support</a>``). Support is rendered as a link, but it doesn't have an ``href`` attribute to make it functional. We'll fix that in the next section.\n+\n+Note: Like `HTML tags and attributes <http://www.w3.org/TR/html-markup/documents.html#case-insensitivity>`__, tags, class names and attributes in Razor, and C# are not case-sensitive.\n+\n+A working email Tag Helper\n+----------------------------------\n+In this section, we will update the ``EmailTagHelper`` so that it will create a valid anchor tag for email. We'll update our tag helper to take information from a Razor view (in the form of a ``mail-to`` attribute) and use that in generating the anchor.\n+\n+Update the ``EmailTagHelper`` class with the following:\n+\n+.. literalinclude:: authoring/sample/TagHlp/src/AuthoringTagHelpers/TagHelpers/EmailTagHelperMailTo.cs\n+   :lines: 5-24\n+   :dedent: 3 \n+\n+Notes:\n+\n+- The ASP.NET 5 runtime translates C# Pascal-cased classes and property names for tag helpers into `lower kebab case <http://stackoverflow.com/questions/11273282/whats-the-name-for-dash-separated-case/12273101#12273101>`__. Therefore, to use the ``MailTo`` attribute, you'll use ``<email mail-to=\"value\"/>``.\n+- The following line shows how to set attributes:\n+\n+.. literalinclude:: authoring/sample/TagHlp/src/AuthoringTagHelpers/TagHelpers/EmailTagHelperMailTo.cs\n+   :lines: 7-24\n+   :dedent: 3\n+   :emphasize-lines: 15 \n+\n+3. Update the markup in the *Views/Home/Contact.cshtml* file with these changes:\n+\n+.. literalinclude::  authoring/sample/TagHlp/src/AuthoringTagHelpers/Views/Home/ContactCopy.cshtml\n+   :language: aspx-cs\n+   :emphasize-lines: 15-16 \n+   :lines: 1-17\n+ \n+4. Run the app and verify that it generates the correct links.\n+\n+**Note:** If you were to write the email tag self-closing (``<email mail-to=\"Rick\" />``), the final output would also be self-closing. To write this as void structured tag helper you must decorate the class with the following attribute:","path":"mvc/views/tag-helpers/authoring.rst","position":121,"original_position":121,"commit_id":"9b51b32abe418d9d93fdc6b0436fc622d966339f","original_commit_id":"9b51b32abe418d9d93fdc6b0436fc622d966339f","user":{"login":"NTaylorMullen","id":2008729,"avatar_url":"https://avatars.githubusercontent.com/u/2008729?v=3","gravatar_id":"","url":"https://api.github.com/users/NTaylorMullen","html_url":"https://github.com/NTaylorMullen","followers_url":"https://api.github.com/users/NTaylorMullen/followers","following_url":"https://api.github.com/users/NTaylorMullen/following{/other_user}","gists_url":"https://api.github.com/users/NTaylorMullen/gists{/gist_id}","starred_url":"https://api.github.com/users/NTaylorMullen/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/NTaylorMullen/subscriptions","organizations_url":"https://api.github.com/users/NTaylorMullen/orgs","repos_url":"https://api.github.com/users/NTaylorMullen/repos","events_url":"https://api.github.com/users/NTaylorMullen/events{/privacy}","received_events_url":"https://api.github.com/users/NTaylorMullen/received_events","type":"User","site_admin":false},"body":"> To write this as void structured tag helper  \r\n\r\n=>  \r\n\r\n> To enable the ability to write this as void structured tag helper (`<email mail-to=\"Rick\">`)","created_at":"2015-09-04T05:30:44Z","updated_at":"2015-09-04T05:30:44Z","html_url":"https://github.com/aspnet/Docs/pull/419#discussion_r38722677","pull_request_url":"https://api.github.com/repos/aspnet/Docs/pulls/419","_links":{"self":{"href":"https://api.github.com/repos/aspnet/Docs/pulls/comments/38722677"},"html":{"href":"https://github.com/aspnet/Docs/pull/419#discussion_r38722677"},"pull_request":{"href":"https://api.github.com/repos/aspnet/Docs/pulls/419"}}},"pull_request":{"url":"https://api.github.com/repos/aspnet/Docs/pulls/419","id":44040191,"html_url":"https://github.com/aspnet/Docs/pull/419","diff_url":"https://github.com/aspnet/Docs/pull/419.diff","patch_url":"https://github.com/aspnet/Docs/pull/419.patch","issue_url":"https://api.github.com/repos/aspnet/Docs/issues/419","number":419,"state":"open","locked":false,"title":"new TH authoring article","user":{"login":"Rick-Anderson","id":3605364,"avatar_url":"https://avatars.githubusercontent.com/u/3605364?v=3","gravatar_id":"","url":"https://api.github.com/users/Rick-Anderson","html_url":"https://github.com/Rick-Anderson","followers_url":"https://api.github.com/users/Rick-Anderson/followers","following_url":"https://api.github.com/users/Rick-Anderson/following{/other_user}","gists_url":"https://api.github.com/users/Rick-Anderson/gists{/gist_id}","starred_url":"https://api.github.com/users/Rick-Anderson/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/Rick-Anderson/subscriptions","organizations_url":"https://api.github.com/users/Rick-Anderson/orgs","repos_url":"https://api.github.com/users/Rick-Anderson/repos","events_url":"https://api.github.com/users/Rick-Anderson/events{/privacy}","received_events_url":"https://api.github.com/users/Rick-Anderson/received_events","type":"User","site_admin":false},"body":"","created_at":"2015-09-02T20:46:13Z","updated_at":"2015-09-04T05:30:44Z","closed_at":null,"merged_at":null,"merge_commit_sha":"8d8a92c8f5f47f333711c33077bd3c5b63859b6e","assignee":null,"milestone":null,"commits_url":"https://api.github.com/repos/aspnet/Docs/pulls/419/commits","review_comments_url":"https://api.github.com/repos/aspnet/Docs/pulls/419/comments","review_comment_url":"https://api.github.com/repos/aspnet/Docs/pulls/comments{/number}","comments_url":"https://api.github.com/repos/aspnet/Docs/issues/419/comments","statuses_url":"https://api.github.com/repos/aspnet/Docs/statuses/9b51b32abe418d9d93fdc6b0436fc622d966339f","head":{"label":"aspnet:riande-TH","ref":"riande-TH","sha":"9b51b32abe418d9d93fdc6b0436fc622d966339f","user":{"login":"aspnet","id":6476660,"avatar_url":"https://avatars.githubusercontent.com/u/6476660?v=3","gravatar_id":"","url":"https://api.github.com/users/aspnet","html_url":"https://github.com/aspnet","followers_url":"https://api.github.com/users/aspnet/followers","following_url":"https://api.github.com/users/aspnet/following{/other_user}","gists_url":"https://api.github.com/users/aspnet/gists{/gist_id}","starred_url":"https://api.github.com/users/aspnet/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/aspnet/subscriptions","organizations_url":"https://api.github.com/users/aspnet/orgs","repos_url":"https://api.github.com/users/aspnet/repos","events_url":"https://api.github.com/users/aspnet/events{/privacy}","received_events_url":"https://api.github.com/users/aspnet/received_events","type":"Organization","site_admin":false},"repo":{"id":28239455,"name":"Docs","full_name":"aspnet/Docs","owner":{"login":"aspnet","id":6476660,"avatar_url":"https://avatars.githubusercontent.com/u/6476660?v=3","gravatar_id":"","url":"https://api.github.com/users/aspnet","html_url":"https://github.com/aspnet","followers_url":"https://api.github.com/users/aspnet/followers","following_url":"https://api.github.com/users/aspnet/following{/other_user}","gists_url":"https://api.github.com/users/aspnet/gists{/gist_id}","starred_url":"https://api.github.com/users/aspnet/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/aspnet/subscriptions","organizations_url":"https://api.github.com/users/aspnet/orgs","repos_url":"https://api.github.com/users/aspnet/repos","events_url":"https://api.github.com/users/aspnet/events{/privacy}","received_events_url":"https://api.github.com/users/aspnet/received_events","type":"Organization","site_admin":false},"private":false,"html_url":"https://github.com/aspnet/Docs","description":"Documentation for ASP.NET 5","fork":false,"url":"https://api.github.com/repos/aspnet/Docs","forks_url":"https://api.github.com/repos/aspnet/Docs/forks","keys_url":"https://api.github.com/repos/aspnet/Docs/keys{/key_id}","collaborators_url":"https://api.github.com/repos/aspnet/Docs/collaborators{/collaborator}","teams_url":"https://api.github.com/repos/aspnet/Docs/teams","hooks_url":"https://api.github.com/repos/aspnet/Docs/hooks","issue_events_url":"https://api.github.com/repos/aspnet/Docs/issues/events{/number}","events_url":"https://api.github.com/repos/aspnet/Docs/events","assignees_url":"https://api.github.com/repos/aspnet/Docs/assignees{/user}","branches_url":"https://api.github.com/repos/aspnet/Docs/branches{/branch}","tags_url":"https://api.github.com/repos/aspnet/Docs/tags","blobs_url":"https://api.github.com/repos/aspnet/Docs/git/blobs{/sha}","git_tags_url":"https://api.github.com/repos/aspnet/Docs/git/tags{/sha}","git_refs_url":"https://api.github.com/repos/aspnet/Docs/git/refs{/sha}","trees_url":"https://api.github.com/repos/aspnet/Docs/git/trees{/sha}","statuses_url":"https://api.github.com/repos/aspnet/Docs/statuses/{sha}","languages_url":"https://api.github.com/repos/aspnet/Docs/languages","stargazers_url":"https://api.github.com/repos/aspnet/Docs/stargazers","contributors_url":"https://api.github.com/repos/aspnet/Docs/contributors","subscribers_url":"https://api.github.com/repos/aspnet/Docs/subscribers","subscription_url":"https://api.github.com/repos/aspnet/Docs/subscription","commits_url":"https://api.github.com/repos/aspnet/Docs/commits{/sha}","git_commits_url":"https://api.github.com/repos/aspnet/Docs/git/commits{/sha}","comments_url":"https://api.github.com/repos/aspnet/Docs/comments{/number}","issue_comment_url":"https://api.github.com/repos/aspnet/Docs/issues/comments{/number}","contents_url":"https://api.github.com/repos/aspnet/Docs/contents/{+path}","compare_url":"https://api.github.com/repos/aspnet/Docs/compare/{base}...{head}","merges_url":"https://api.github.com/repos/aspnet/Docs/merges","archive_url":"https://api.github.com/repos/aspnet/Docs/{archive_format}{/ref}","downloads_url":"https://api.github.com/repos/aspnet/Docs/downloads","issues_url":"https://api.github.com/repos/aspnet/Docs/issues{/number}","pulls_url":"https://api.github.com/repos/aspnet/Docs/pulls{/number}","milestones_url":"https://api.github.com/repos/aspnet/Docs/milestones{/number}","notifications_url":"https://api.github.com/repos/aspnet/Docs/notifications{?since,all,participating}","labels_url":"https://api.github.com/repos/aspnet/Docs/labels{/name}","releases_url":"https://api.github.com/repos/aspnet/Docs/releases{/id}","created_at":"2014-12-19T17:38:02Z","updated_at":"2015-09-03T21:00:29Z","pushed_at":"2015-09-04T03:44:04Z","git_url":"git://github.com/aspnet/Docs.git","ssh_url":"git@github.com:aspnet/Docs.git","clone_url":"https://github.com/aspnet/Docs.git","svn_url":"https://github.com/aspnet/Docs","homepage":null,"size":27277,"stargazers_count":175,"watchers_count":175,"language":"C#","has_issues":true,"has_downloads":true,"has_wiki":true,"has_pages":false,"forks_count":181,"mirror_url":null,"open_issues_count":163,"forks":181,"open_issues":163,"watchers":175,"default_branch":"master"}},"base":{"label":"aspnet:1.0.0-beta7","ref":"1.0.0-beta7","sha":"e9d74015b6bdfbe823823bb7607549febd2822e2","user":{"login":"aspnet","id":6476660,"avatar_url":"https://avatars.githubusercontent.com/u/6476660?v=3","gravatar_id":"","url":"https://api.github.com/users/aspnet","html_url":"https://github.com/aspnet","followers_url":"https://api.github.com/users/aspnet/followers","following_url":"https://api.github.com/users/aspnet/following{/other_user}","gists_url":"https://api.github.com/users/aspnet/gists{/gist_id}","starred_url":"https://api.github.com/users/aspnet/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/aspnet/subscriptions","organizations_url":"https://api.github.com/users/aspnet/orgs","repos_url":"https://api.github.com/users/aspnet/repos","events_url":"https://api.github.com/users/aspnet/events{/privacy}","received_events_url":"https://api.github.com/users/aspnet/received_events","type":"Organization","site_admin":false},"repo":{"id":28239455,"name":"Docs","full_name":"aspnet/Docs","owner":{"login":"aspnet","id":6476660,"avatar_url":"https://avatars.githubusercontent.com/u/6476660?v=3","gravatar_id":"","url":"https://api.github.com/users/aspnet","html_url":"https://github.com/aspnet","followers_url":"https://api.github.com/users/aspnet/followers","following_url":"https://api.github.com/users/aspnet/following{/other_user}","gists_url":"https://api.github.com/users/aspnet/gists{/gist_id}","starred_url":"https://api.github.com/users/aspnet/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/aspnet/subscriptions","organizations_url":"https://api.github.com/users/aspnet/orgs","repos_url":"https://api.github.com/users/aspnet/repos","events_url":"https://api.github.com/users/aspnet/events{/privacy}","received_events_url":"https://api.github.com/users/aspnet/received_events","type":"Organization","site_admin":false},"private":false,"html_url":"https://github.com/aspnet/Docs","description":"Documentation for ASP.NET 5","fork":false,"url":"https://api.github.com/repos/aspnet/Docs","forks_url":"https://api.github.com/repos/aspnet/Docs/forks","keys_url":"https://api.github.com/repos/aspnet/Docs/keys{/key_id}","collaborators_url":"https://api.github.com/repos/aspnet/Docs/collaborators{/collaborator}","teams_url":"https://api.github.com/repos/aspnet/Docs/teams","hooks_url":"https://api.github.com/repos/aspnet/Docs/hooks","issue_events_url":"https://api.github.com/repos/aspnet/Docs/issues/events{/number}","events_url":"https://api.github.com/repos/aspnet/Docs/events","assignees_url":"https://api.github.com/repos/aspnet/Docs/assignees{/user}","branches_url":"https://api.github.com/repos/aspnet/Docs/branches{/branch}","tags_url":"https://api.github.com/repos/aspnet/Docs/tags","blobs_url":"https://api.github.com/repos/aspnet/Docs/git/blobs{/sha}","git_tags_url":"https://api.github.com/repos/aspnet/Docs/git/tags{/sha}","git_refs_url":"https://api.github.com/repos/aspnet/Docs/git/refs{/sha}","trees_url":"https://api.github.com/repos/aspnet/Docs/git/trees{/sha}","statuses_url":"https://api.github.com/repos/aspnet/Docs/statuses/{sha}","languages_url":"https://api.github.com/repos/aspnet/Docs/languages","stargazers_url":"https://api.github.com/repos/aspnet/Docs/stargazers","contributors_url":"https://api.github.com/repos/aspnet/Docs/contributors","subscribers_url":"https://api.github.com/repos/aspnet/Docs/subscribers","subscription_url":"https://api.github.com/repos/aspnet/Docs/subscription","commits_url":"https://api.github.com/repos/aspnet/Docs/commits{/sha}","git_commits_url":"https://api.github.com/repos/aspnet/Docs/git/commits{/sha}","comments_url":"https://api.github.com/repos/aspnet/Docs/comments{/number}","issue_comment_url":"https://api.github.com/repos/aspnet/Docs/issues/comments{/number}","contents_url":"https://api.github.com/repos/aspnet/Docs/contents/{+path}","compare_url":"https://api.github.com/repos/aspnet/Docs/compare/{base}...{head}","merges_url":"https://api.github.com/repos/aspnet/Docs/merges","archive_url":"https://api.github.com/repos/aspnet/Docs/{archive_format}{/ref}","downloads_url":"https://api.github.com/repos/aspnet/Docs/downloads","issues_url":"https://api.github.com/repos/aspnet/Docs/issues{/number}","pulls_url":"https://api.github.com/repos/aspnet/Docs/pulls{/number}","milestones_url":"https://api.github.com/repos/aspnet/Docs/milestones{/number}","notifications_url":"https://api.github.com/repos/aspnet/Docs/notifications{?since,all,participating}","labels_url":"https://api.github.com/repos/aspnet/Docs/labels{/name}","releases_url":"https://api.github.com/repos/aspnet/Docs/releases{/id}","created_at":"2014-12-19T17:38:02Z","updated_at":"2015-09-03T21:00:29Z","pushed_at":"2015-09-04T03:44:04Z","git_url":"git://github.com/aspnet/Docs.git","ssh_url":"git@github.com:aspnet/Docs.git","clone_url":"https://github.com/aspnet/Docs.git","svn_url":"https://github.com/aspnet/Docs","homepage":null,"size":27277,"stargazers_count":175,"watchers_count":175,"language":"C#","has_issues":true,"has_downloads":true,"has_wiki":true,"has_pages":false,"forks_count":181,"mirror_url":null,"open_issues_count":163,"forks":181,"open_issues":163,"watchers":175,"default_branch":"master"}},"_links":{"self":{"href":"https://api.github.com/repos/aspnet/Docs/pulls/419"},"html":{"href":"https://github.com/aspnet/Docs/pull/419"},"issue":{"href":"https://api.github.com/repos/aspnet/Docs/issues/419"},"comments":{"href":"https://api.github.com/repos/aspnet/Docs/issues/419/comments"},"review_comments":{"href":"https://api.github.com/repos/aspnet/Docs/pulls/419/comments"},"review_comment":{"href":"https://api.github.com/repos/aspnet/Docs/pulls/comments{/number}"},"commits":{"href":"https://api.github.com/repos/aspnet/Docs/pulls/419/commits"},"statuses":{"href":"https://api.github.com/repos/aspnet/Docs/statuses/9b51b32abe418d9d93fdc6b0436fc622d966339f"}}}}