{"id":4121,"date":"2014-05-02T10:03:50","date_gmt":"2014-05-02T01:03:50","guid":{"rendered":"http:\/\/www.vincentina.net\/?p=4121"},"modified":"2025-02-25T21:29:45","modified_gmt":"2025-02-25T12:29:45","slug":"tcpecho%e3%82%b5%e3%83%bc%e3%83%90%e3%83%bc%e3%81%8b%e3%82%89%e8%b6%85%e7%b0%a1%e6%98%93tcpweb%e3%82%b5%e3%83%bc%e3%83%90%e3%83%bc%e3%82%92%e4%bd%9c%e3%81%a3%e3%81%a6%e3%81%bf%e3%81%9f%e3%80%82","status":"publish","type":"post","link":"https:\/\/www.vincentina.net\/?p=4121","title":{"rendered":"TCPEcho\u30b5\u30fc\u30d0\u30fc\u304b\u3089\u8d85\u7c21\u6613TCPweb\u30b5\u30fc\u30d0\u30fc\u3092\u4f5c\u3063\u3066\u307f\u305f\u3002"},"content":{"rendered":"<p>\n\u3084\u3063\u3068\u5ff5\u9858\u306e<span style=\"font-size: 14pt;\">\u30a6\u30a7\u30d6\u30b5\u30fc\u30d0\u30fc<\/span>\u304c\u3067\u304d\u305f\uff01\u3068\u8a00\u3063\u3066\u3082\u3001\u81ea\u5206\u306e\u5b9f\u529b\u3067\u3067\u304d\u305f\u3082\u306e\u3067\u306f\u306a\u304f\u3066\u3001\u30d9\u30fc\u30b9\u306fTCP\/IP Sockets in C\u306eTCPEchoServer\u306e\u30b3\u30fc\u30c9\u306b\u52a0\u3048\u3066\u3001<a href=\"http:\/\/ruffnex.oc.to\/kenji\/\" target=\"_blank\" rel=\"noopener noreferrer\">KENJI&#8217;S HOMEPAGE<\/a>\u306e\u30da\u30fc\u30b8\u3092\u304b\u306a\u308a\u53c2\u8003\u306b\u3055\u305b\u3066\u9802\u3044\u3066\u3001\u6700\u4f4e\u9650\u3053\u308c\u3067\u52d5\u304f\u3060\u308d\u3046\u3068\u3044\u3046\u3088\u3046\u306b\u3001\u30d1\u30ba\u30eb\u306e\u3088\u3046\u306b\u3064\u304e\u306f\u304e\u3057\u3066\u4f5c\u3063\u305f\u3082\u306e\u3067\u3059\u304c\u30fb\u30fb\u30fb\u30011\u884c1\u884c\u3057\u3063\u304b\u308a\u3084\u3063\u305f\u306e\u3067\u6e80\u8db3\u611f\u306f\u305d\u308c\u306a\u308a\u3067\u3059\u3002\n<\/p>\n<p>\n\u554f\u984c\u70b9\u306f\u3081\u3061\u3083\u304f\u3061\u3083\u3042\u308a\u3001Fork\u3057\u3066\u306a\u3044\u3001\u30a8\u30e9\u30fc\u30c1\u30a7\u30c3\u30af\u304c\u3042\u307e\u3044\u3068\u3044\u3063\u305f\u611f\u3058\u3067\u3042\u307e\u3042\u307e\u3067\u3059\u3002<br \/>\n\u3068\u306b\u304b\u304f\u30ea\u30af\u30a8\u30b9\u30c8\u3055\u308c\u305f\u30da\u30fc\u30b8\u3092\u8fd4\u3059\u3068\u3044\u3046\u8d85\u7c21\u5358\u306a\u3082\u306e\u3067\u3059\u3002\n<\/p>\n<p>\u3067\u3082\u3001<span style=\"font-size: 18pt;\">\u3046\u308c\u3057\uff5e\u3000(\u2267\u2207\u2266)<\/span><\/p>\n<p>\u5b9f\u884c\u7d50\u679c\u3000\uff08\u3053\u306e\u753b\u50cf\u3058\u3083\u3088\u304f\u308f\u304b\u3089\u3093\u3060\u308d\u3046\u3051\u3069\uff09<\/p>\n<p><a href=\"http:\/\/www.vincentina.net\/wp-content\/uploads\/2014\/05\/web.jpg\"><img loading=\"lazy\" decoding=\"async\" src=\"http:\/\/www.vincentina.net\/wp-content\/uploads\/2014\/05\/web-300x147.jpg\" alt=\"web\" width=\"300\" height=\"147\" class=\"alignnone size-medium wp-image-4122\" srcset=\"https:\/\/www.vincentina.net\/wp-content\/uploads\/2014\/05\/web-300x147.jpg 300w, https:\/\/www.vincentina.net\/wp-content\/uploads\/2014\/05\/web.jpg 447w\" sizes=\"auto, (max-width: 300px) 85vw, 300px\" \/><\/a><\/p>\n<p>\u7aef\u672b\u5074\uff08Fork\u3057\u3066\u306a\u3044\u306e\u306d\u30fb\u30fb\u30fb\uff09<\/p>\n<pre>[root@vm01 ~\/webServer]# .\/webServer 80\r\nHandling client 192.168.24.53\r\nGET \/index.html HTTP\/1.1\r\nGET \/index.html HTTP\/1.1\r\n[root@vm01 ~\/webServer]#<\/pre>\n<p>\u3084\u305f\u3089\u3068GET\u304c\u51fa\u3066\u307e\u3059\u304c\u3001\u3053\u308c\u306fDEBUG\u306e\u30ea\u30bf\u30fc\u30f3\u304c\u8868\u793a\u3055\u308c\u3066\u307e\u3059\u3002<\/p>\n<p>\u305d\u30fc\u3059<\/p>\n<pre class=\"brush: cpp; title: ; notranslate\" title=\"\">\r\n#include &lt;stdio.h&gt;        \/\/printf, fprintf, perror\r\n#include &lt;sys\/socket.h&gt;   \/\/socket, bind, connect, recv, send\r\n#include &lt;arpa\/inet.h&gt;    \/\/sockaddr_in, inet_ntoa\r\n#include &lt;stdlib.h&gt;       \/\/atoi, exit\r\n#include &lt;string.h&gt;       \/\/memset\r\n#include &lt;unistd.h&gt;       \/\/close\r\n#include &lt;netinet\/in.h&gt;   \/\/IPPROTO_TCP, INADDR_ANY\r\n#include &lt;sys\/stat.h&gt;\r\n\r\ntypedef struct {\r\n        char method&#x5B;16];\r\n        char path&#x5B;128];\r\n        char version&#x5B;16];\r\n} HEAD_DATA;\r\n\r\n#define DEBUG\r\n#define MAXPENDING 5\r\n\r\nvoid DieWithError(char *errorMessage)   \/\/\u30a8\u30e9\u30fc\u51e6\u7406\u95a2\u6570\r\n{\r\n        perror(errorMessage);\r\n        exit(1);\r\n}\r\n\r\nvoid CutCrLf( char *str )\r\n{\r\n        char *p;\r\n\r\n        if     ((p = strchr(str, &#039;\\r&#039;)) != NULL) *p = &#039;&#92;&#48;&#039;;\r\n        else if((p = strchr(str, &#039;\\n&#039;)) != NULL) *p = &#039;&#92;&#48;&#039;;\r\n}\r\n\r\nint CutChar( char *data, char *str, char c )\r\n{\r\n   unsigned int i;\r\n\r\n   for(i=0; data&#x5B;i] != c; i++)\r\n          str&#x5B;i] = data&#x5B;i];\r\n\r\n   str&#x5B;i] = &#039;&#92;&#48;&#039;;\r\n\r\n   return i;\r\n}\r\n\r\nvoid GetHtml( FILE *sock_fp, HEAD_DATA *data )\r\n{\r\n        FILE *fp;\r\n        char *buf;\r\n        struct stat st;\r\n\r\n        if(stat(data-&gt;path + 1, &amp;st) &lt; 0){\r\n                fprintf(stderr, &quot;404error\\n&quot;);\r\n                exit(1);\r\n        }\r\n\r\n    if((buf = (char *)calloc(st.st_size, sizeof(char))) == NULL){\r\n          fprintf(stderr, &quot;calloc\\n&quot;);\r\n          exit(1);\r\n    }\r\n\r\n        fprintf(sock_fp, &quot;%s 200 OK\\r\\n&quot;, data-&gt;version);\r\n        fprintf(sock_fp, &quot;Server:sample\\r\\n&quot;);\r\n        fprintf(sock_fp, &quot;Content-Type:text\/html\\r\\n&quot;);\r\n        fprintf(sock_fp, &quot;Content-Length:%d\\r\\n&quot;, (int)st.st_size);\r\n        fprintf(sock_fp, &quot;\\r\\n&quot;);\r\n\r\n        if((fp = fopen(data-&gt;path + 1, &quot;r&quot;)) == NULL){\r\n                fprintf(stderr, &quot;fopen\\n&quot;);\r\n                exit(1);\r\n        }\r\n\r\n    fread(buf, 1, st.st_size, fp);\r\n    fwrite(buf, 1, st.st_size, sock_fp);\r\n\r\n    free(buf);\r\n        fclose(fp);\r\n\r\n        exit(0);\r\n}\r\n\r\nvoid HandleTCPClient(int clntSocket)\r\n{\r\n        FILE *sock_fp;\r\n        char *data&#x5B;64], buf&#x5B;2048];\r\n        HEAD_DATA headData;\r\n\r\n        if((sock_fp = fdopen(clntSocket, &quot;r+&quot;)) == NULL){\r\n                fprintf(stderr, &quot;fdpoen\\n&quot;);\r\n                exit(1);\r\n        }\r\n\r\n        unsigned int len;\r\n        unsigned int i, k;\r\n\r\n        for(i = 0; i &lt; 64; i++){\r\n\r\n                fgets(buf, sizeof(buf), sock_fp),  (void)CutCrLf(buf);\r\n\r\n                if((len = strlen(buf)) == 0) break;\r\n\r\n                if((data&#x5B;i] = (char *)calloc(len + 1, sizeof(char))) == NULL){\r\n                        fprintf(stderr, &quot;calloc\\n&quot;);\r\n                        exit(1);\r\n                }\r\n                strcpy(data&#x5B;i], buf);\r\n        }\r\n        k = i;\r\n\r\n#ifdef DEBUG\r\n                printf(&quot;%s\\n&quot;, data&#x5B;0]);\r\n#endif\r\n\r\n        len =  CutChar( data&#x5B;0]      , headData.method,     &#039; &#039;  ), len++;\r\n        len += CutChar( data&#x5B;0] + len, headData.path,       &#039; &#039;  ), len++;\r\n        len += CutChar( data&#x5B;0] + len, headData.version,    &#039;&#92;&#48;&#039; ), len++;\r\n\r\n#ifdef DEBUG\r\n                printf(&quot;%s %s %s\\n&quot;, headData.method, headData.path, headData.version);\r\n#endif\r\n\r\n        if(strstr(&quot;headData.version&quot; , &quot;1.0&quot;) != NULL || strstr(&quot;headData.version&quot; , &quot;1.1&quot;) != NULL){\r\n                fprintf(stderr, &quot;request error\\n&quot;);\r\n                exit(1);\r\n        }\r\n\r\n        GetHtml(sock_fp, &amp;headData);\r\n        for(i=0; i &lt; k; i++){\r\n                printf(&quot;%s&quot;, data&#x5B;i]);\r\n                free(data&#x5B;i]);\r\n        }\r\n\r\n        close(clntSocket); \/\/\u30af\u30e9\u30a4\u30a2\u30f3\u30c8\u30bd\u30b1\u30c3\u30c8\u3092\u30af\u30ed\u30fc\u30ba\r\n}\r\n\r\nint main(int argc, char *argv&#x5B;])\r\n{\r\n        int servSock;           \/\/\u30b5\u30fc\u30d0\u306e\u30bd\u30b1\u30c3\u30c8\u30c7\u30a3\u30b9\u30af\u30ea\u30d7\u30bf\r\n        int clntSock;           \/\/\u30af\u30e9\u30a4\u30a2\u30f3\u30c8\u306e\u30bd\u30b1\u30c3\u30c8\u30c7\u30a3\u30b9\u30af\u30ea\u30d7\u30bf\r\n        struct sockaddr_in echoServAddr;        \/\/\u30ed\u30fc\u30ab\u30eb\u30a2\u30c9\u30ec\u30b9\r\n        struct sockaddr_in echoClntAddr;        \/\/\u30af\u30e9\u30a4\u30a2\u30f3\u30c8\u30a2\u30c9\u30ec\u30b9\r\n        unsigned short echoServPort;            \/\/\u30b5\u30fc\u30d0\u30dd\u30fc\u30c8\r\n        unsigned int clntLen;                   \/\/\u30af\u30e9\u30a4\u30a2\u30f3\u30c8\u306e\u30a2\u30c9\u30ec\u30b9\u69cb\u9020\u4f53\u306e\u9577\u3055\r\n\r\n        if(argc != 2)   \/\/\u5f15\u6570\u306e\u6570\u3092\u30c1\u30a7\u30c3\u30af\r\n        {\r\n                fprintf(stderr, &quot;Usage: %s &lt;Server Port&gt;\\n&quot;, argv&#x5B;0]);\r\n                exit(1);\r\n        }\r\n\r\n        echoServPort = atoi(argv&#x5B;1]);   \/\/\u30ed\u30fc\u30ab\u30eb\u30dd\u30fc\u30c8\r\n\r\n        \/\/\u7740\u4fe1\u7528\u306e\u30bd\u30b1\u30c3\u30c8\u3092\u4f5c\u6210\r\n        if((servSock = socket(PF_INET, SOCK_STREAM, IPPROTO_TCP)) &lt; 0)\r\n                DieWithError(&quot;socket() failed&quot;);\r\n\r\n        \/\/\u30ed\u30fc\u30ab\u30eb\u306e\u30a2\u30c9\u30ec\u30b9\u306e\u69cb\u9020\u4f53\u3092\u4f5c\u6210\r\n        memset(&amp;echoServAddr, 0, sizeof(echoServAddr)); \/\/\u69cb\u9020\u4f53\u3092\uff10\u3067\u57cb\u3081\u308b\r\n        echoServAddr.sin_family = AF_INET;             \/\/\u30a2\u30c9\u30ec\u30b9\u3075\u3041\u3044\u307f\u308a\r\n        echoServAddr.sin_addr.s_addr = htonl(INADDR_ANY); \/\/\u30ef\u30a4\u30eb\u30c9\u30ab\u30fc\u30c9\u3092\u4f7f\u7528\r\n        echoServAddr.sin_port = htons(echoServPort);            \/\/\u30ed\u30fc\u30ab\u30eb\u30dd\u30fc\u30c8\r\n\r\n        \/\/\u30ed\u30fc\u30ab\u30eb\u30a2\u30c9\u30ec\u30b9\u3078\u30d0\u30a4\u30f3\u30c9\r\n        if(bind(servSock, (struct sockaddr *)&amp;echoServAddr, sizeof(echoServAddr)) &lt; 0)\r\n                DieWithError(&quot;bind() fialed&quot;);\r\n\r\n        \/\/\u63a5\u7d9a\u3092\u8981\u6c42\u4e2d\u3068\u3044\u3046\u30de\u30fc\u30af\u3092\u30bd\u30b1\u30c3\u30c8\u306b\u3064\u3051\u308b\r\n        if(listen(servSock, MAXPENDING) &lt; 0)\r\n                DieWithError(&quot;listen() failed&quot;);\r\n\r\n        for(;;) \/\/\u7e70\u308a\u8fd4\u3057\u5b9f\u884c\r\n        {\r\n                \/\/\u5165\u51fa\u529b\u30d1\u30e9\u30e1\u30fc\u30bf\u306e\u30b5\u30a4\u30ba\u3092\u305b\u3063\u3068\r\n                clntLen = sizeof(echoClntAddr);\r\n\r\n                \/\/\u30af\u30e9\u30a4\u30a2\u30f3\u30c8\u304b\u3089\u306e\u63a5\u7d9a\u8981\u6c42\u3092\u5f85\u6a5f\r\n                if((clntSock = accept(servSock, (struct sockaddr *)&amp;echoClntAddr,&amp;clntLen)) &lt; 0)\r\n                        DieWithError(&quot;accept() failed&quot;);\r\n\r\n                \/\/clntsock\u306f\u30af\u30e9\u30a4\u30a2\u30f3\u30c8\u3078\u63a5\u7d9a\u6e08\u307f\r\n\r\n                printf(&quot;Handling client %s\\n&quot;, inet_ntoa(echoClntAddr.sin_addr));\r\n\r\n                HandleTCPClient(clntSock);\r\n\r\n        }\r\n        \/\/\u3053\u306e\u90e8\u5206\u306b\u306f\u5230\u9054\u3057\u306a\u3044\r\n}\r\n<\/pre>\n<p>CutCrLf\u95a2\u6570\u3001CutChar\u95a2\u6570\u3001GetHtml\u95a2\u6570\u306fKENJI\u3055\u3093\u306e\u30aa\u30ea\u30b8\u30ca\u30eb\u3067\u591a\u5c11\u305f\u3051\u3051\u3093\u304c\u6539\u5909\u3057\u305f\u3068\u3053\u308d\uff08\u7c21\u7565\u306b\u30fb\u30fb\uff09\u304c\u3042\u308a\u307e\u3059\u3002HandleTCPClient\u95a2\u6570\u306fTCP\/IP Socket in C\u3068KENJI\u3055\u3093\u306e\u30aa\u30ea\u30b8\u30ca\u30eb\u3068\u305f\u3051\u3051\u3093\u306eMIX\u3067\u3001\u3042\u3068\u306f\u3060\u3044\u305f\u3044TCP\/IP Socket in C\u304c\u30d9\u30fc\u30b9\u3067\u3059\u3002<\/p>\n<p>\n\u4eca\u56de\u53c2\u8003\u306b\u3055\u305b\u3066\u9802\u3044\u305fKENJI\u3055\u3093\u306e\u30a6\u30a7\u30d6\u30b5\u30a4\u30c8\u3067\u3059\u304c\u3001\u30d7\u30ed\u30b0\u30e9\u30de\u306e\u30c6\u30af\u30cb\u30c3\u30af\u3089\u3057\u304d\u3082\u306e\u304c\u3068\u3053\u308d\u3069\u3053\u308d\u3067\u898b\u3089\u308c\u3066\u3001\u975e\u5e38\u306b\u9762\u767d\u304b\u3063\u305f\u3067\u3059\u3002<br \/>\nKENJI\u3055\u3093\u306f\u6280\u8853\u7684\u306a\u89b3\u70b9\u304b\u3089\u3001\u30a6\u30a3\u30eb\u30b9\u3084\u30a8\u30af\u30b9\u30d7\u30ed\u30a4\u30c9\u306e\u30b3\u30fc\u30c9\u3082\u8ffd\u53ca\u3059\u308b\u3068\u3044\u3046\u30b9\u30bf\u30f3\u30b9\u3067\u3001\u30b5\u30a4\u30c8\u3092\u3044\u308d\u3044\u308d\u8aad\u307f\u6f01\u308a\u306a\u304c\u3089\u3044\u308d\u3044\u308d\u3068\u5f71\u97ff\u3092\u53d7\u3051\u305f\u3068\u3053\u308d\u304c\u3042\u308a\u3093\u3059\u3002<br \/>\n\u305f\u3051\u3051\u3093\u306f\uff08\u4e00\u5fdc\uff09\u30a4\u30f3\u30bf\u30fc\u30cd\u30c3\u30c8\u5229\u7528\u8005\u306eIT\u30ea\u30c6\u30e9\u30b7\u30fc\u3092\u5411\u4e0a\u3057\u3088\u3046\u3068\u3044\u3046\u76ee\u7684\u3092\u3082\u3063\u305f2\u6b21\u5143\u30ad\u30e3\u30e9\u306a\u3093\u3067\u3001\u591a\u5c11\u77db\u76fe\u3057\u305f\u5185\u5bb9\u306b\u306a\u308a\u307e\u3059\u304c\u3001\u4eca\u5f8c\u306f\u305d\u3046\u3044\u3063\u305f\u3053\u3068\u3082\u53d6\u308a\u5165\u308c\u3066\u3044\u304d\u305f\u3044\u306a\u3041\u3068\u601d\u3044\u307e\u3059\u3002<br \/>\n\u6700\u8fd1\u305d\u3046\u3044\u3046\u3053\u3068\u306b\u3057\u3088\u3046\u3068\u304a\u3082\u3044\u307e\u3057\u305f\u3002<\/p>\n<p>TCP\/IP Socket in C\u306e\u65b9\u306f5\u7ae0\u306b\u5165\u3063\u3066UDPEcho\u306b\u5165\u308a\u307e\u3057\u305f\u3002\u307e\u3060\u307e\u3060\u3053\u308c\u304b\u3089\u3067\u3059\u3002<\/p>\n<p>&nbsp;<\/p>\n<div class='wp_social_bookmarking_light'>        <div class=\"wsbl_twitter\"><a href=\"https:\/\/twitter.com\/share\" class=\"twitter-share-button\" data-url=\"https:\/\/www.vincentina.net\/?p=4121\" data-text=\"TCPEcho\u30b5\u30fc\u30d0\u30fc\u304b\u3089\u8d85\u7c21\u6613TCPweb\u30b5\u30fc\u30d0\u30fc\u3092\u4f5c\u3063\u3066\u307f\u305f\u3002\" data-via=\"TakekenTw\" data-lang=\"ja\">Tweet<\/a><\/div><\/div>\n<br class='wp_social_bookmarking_light_clear' \/>\n","protected":false},"excerpt":{"rendered":"<p>\u3084\u3063\u3068\u5ff5\u9858\u306e\u30a6\u30a7\u30d6\u30b5\u30fc\u30d0\u30fc\u304c\u3067\u304d\u305f\uff01\u3068\u8a00\u3063\u3066\u3082\u3001\u81ea\u5206\u306e\u5b9f\u529b\u3067\u3067\u304d\u305f\u3082\u306e\u3067\u306f\u306a\u304f\u3066\u3001\u30d9\u30fc\u30b9\u306fTCP\/IP Sockets in C\u306eTCPEchoServer\u306e\u30b3\u30fc\u30c9\u306b\u52a0\u3048\u3066\u3001KENJI&#8217;S HOMEPAGE\u306e &hellip; <a href=\"https:\/\/www.vincentina.net\/?p=4121\" class=\"more-link\"><span class=\"screen-reader-text\">&#8220;TCPEcho\u30b5\u30fc\u30d0\u30fc\u304b\u3089\u8d85\u7c21\u6613TCPweb\u30b5\u30fc\u30d0\u30fc\u3092\u4f5c\u3063\u3066\u307f\u305f\u3002&#8221; \u306e<\/span>\u7d9a\u304d\u3092\u8aad\u3080<\/a><\/p>\n","protected":false},"author":1,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[106],"tags":[],"class_list":["post-4121","post","type-post","status-publish","format-standard","hentry","category-programming"],"_links":{"self":[{"href":"https:\/\/www.vincentina.net\/index.php?rest_route=\/wp\/v2\/posts\/4121","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/www.vincentina.net\/index.php?rest_route=\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/www.vincentina.net\/index.php?rest_route=\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/www.vincentina.net\/index.php?rest_route=\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/www.vincentina.net\/index.php?rest_route=%2Fwp%2Fv2%2Fcomments&post=4121"}],"version-history":[{"count":2,"href":"https:\/\/www.vincentina.net\/index.php?rest_route=\/wp\/v2\/posts\/4121\/revisions"}],"predecessor-version":[{"id":8105,"href":"https:\/\/www.vincentina.net\/index.php?rest_route=\/wp\/v2\/posts\/4121\/revisions\/8105"}],"wp:attachment":[{"href":"https:\/\/www.vincentina.net\/index.php?rest_route=%2Fwp%2Fv2%2Fmedia&parent=4121"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/www.vincentina.net\/index.php?rest_route=%2Fwp%2Fv2%2Fcategories&post=4121"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.vincentina.net\/index.php?rest_route=%2Fwp%2Fv2%2Ftags&post=4121"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}