{"id":1213,"date":"2017-11-09T13:52:34","date_gmt":"2017-11-09T13:52:34","guid":{"rendered":"http:\/\/ofalcao.pt\/blog\/?p=1213"},"modified":"2017-11-14T06:29:49","modified_gmt":"2017-11-14T06:29:49","slug":"decoding-old-lego-infrared-protocol","status":"publish","type":"post","link":"https:\/\/ofalcao.pt\/blog\/2017\/decoding-old-lego-infrared-protocol","title":{"rendered":"Decoding old LEGO infrared protocol"},"content":{"rendered":"<div class=\"seriesmeta\">This post is part 1 of 2 of \u00a0<a href=\"https:\/\/ofalcao.pt\/blog\/series\/lego-ir-sniffing\" class=\"series-322\" title=\"LEGO IR sniffing\">LEGO IR sniffing<\/a><\/div><p>This started most as a curious thing and now I realize it went crazy. But I learned a lot so perhaps other may benefit of it.<\/p>\n<p>On my quest to control all LEGO MINDSTORMS models ever sold from a single &#8220;gateway&#8221; I started a few weeks ago my work with the <a href=\"https:\/\/en.wikipedia.org\/wiki\/Lego_Spybotics\">Spybotics<\/a>:<\/p>\n<p><img decoding=\"async\" src=\"https:\/\/upload.wikimedia.org\/wikipedia\/commons\/thumb\/e\/ea\/Lego_spybot_device.jpg\/220px-Lego_spybot_device.jpg\" \/><\/p>\n<p>This little fellow has 2 motors and a touch sensor inside, can talk IR and also reacts to VLL. So it&#8217;s kind of a <a href=\"https:\/\/en.wikipedia.org\/wiki\/Lego_Mindstorms#Micro_Scout\">Micro Scout<\/a> on steroids. And, with a little of good will, we can call it the ancestor of the LEGO BOOST, among the <a href=\"https:\/\/en.wikipedia.org\/wiki\/Lego_Mindstorms#Cybermaster\">Cybermaster<\/a>.<\/p>\n<p>The Spybotics was programmed with a serial-to-optical cable. I still don&#8217;t have one so I tried to program it with a RCX USB IR Tower using NQC (there are some reports that the USB version of the IR Tower can &#8220;speak&#8221; at 38 and 76 kHz and the later is needed for the Spybotics). But no success yet.<\/p>\n<p>The Spybotics also reacts to a IR Remote Control:<\/p>\n<p><img data-recalc-dims=\"1\" decoding=\"async\" src=\"https:\/\/i0.wp.com\/img.brickowl.com\/files\/image_cache\/large\/lego-transparent-green-spybotics-remote-control-28-902853-100.jpg?w=840&#038;ssl=1\" \/><\/p>\n<p>The protocol allows 3 different channels and it&#8217;s also possible to send commands to all 3 channels simultaneouslys so I decided to get more information about the protocol.<\/p>\n<p>Turns out that this IR protocol was implemented by LEGO a few years before the Power Functions IR protocol but it never gained momentum and it was quickly abandoned. But a few interesting systems used this protocol:<\/p>\n<ul>\n<li>the <a href=\"http:\/\/lego.wikia.com\/wiki\/8539_Manas\">8539 Bionicle Technic Manas<\/a><\/li>\n<li>the <a href=\"https:\/\/brickset.com\/sets\/4589-1\/RC-Nitro-Flash\">4589 RC Nitro Flash<\/a><\/li>\n<li>the <a href=\"http:\/\/lego.wikia.com\/wiki\/7897_Passenger_Train\">7897 9V RC Train<\/a><\/li>\n<li>&#8230; and the <a href=\"https:\/\/brickset.com\/sets\/2949-1\/Remote-Control-Dozer\">2949 DUPLO Remote Control Dozer<\/a><\/li>\n<\/ul>\n<p>The last one surprised me as I have two of these, after a very lucky finding 4 years ago on our summer holidays &#8211; our kids love them and we use them at our LUG events with great success among young visitors:<\/p>\n<p><img data-recalc-dims=\"1\" decoding=\"async\" src=\"https:\/\/i0.wp.com\/images.brickset.com\/sets\/images\/2949-1.jpg?w=840&#038;ssl=1\" \/><\/p>\n<p>So I picked up my Manas, Spybotics and DUPLO commands&#8230; and yes, they are interchangeable!<\/p>\n<p>It would be great if I could control my kids DUPLO Dozer from the computer, side-by-side with the Spybotics and the Manas.<\/p>\n<p>So let&#8217;s find more details about this pre-Power Functions IR protocol.<\/p>\n<p>The best I could find were references to a Rob Doucette document where he gathered info collected from several Lugnet posts (mainly contributed by John Barnes). One of those references is <a href=\"http:\/\/www.philohome.com\/nitroflash\/rc_nitro_rcx.htm\">Philo&#8217;s site<\/a>, where he shows how he used is RCX to control the RC Nitro Flash).<\/p>\n<p>Unfortunatelly the original document location no longer exists:<\/p>\n<p style=\"text-align: center;\">&#8220;http:\/\/www.doucettenet.com\/lego\/manas.pdf&#8221;<\/p>\n<p>but thanks to the <a href=\"https:\/\/archive.org\/web\/\">Internet Archive Wayback Machine<\/a> I managed to retrieve the document from <a href=\"https:\/\/web.archive.org\/web\/20080510121133\/http:\/\/www.doucettenet.com\/lego\/manas.pdf\">a May 2008 snapshot<\/a>.<\/p>\n<p>The low level details are resumed in 2 sentences:<\/p>\n<blockquote><p>&#8220;The transmitters transmit short messages of two bytes encoded as 8 bit + odd parity. The transmissions use 76kHz modulated IR at a baud rate of 4800, 25% duty cycle.&#8221;<\/p><\/blockquote>\n<p>Each message contains 4 nibbles (4-bit digits):<\/p>\n<p style=\"text-align: center;\"><strong>Channel + Orange + Yellow + Checkdigit<\/strong><\/p>\n<p><strong>Channel<\/strong> can be 4\/5\/6\/7 (meaning all, #1, #2 or #3)<\/p>\n<p><strong>Orange<\/strong> and <strong>Yellow<\/strong> can be 0\/7\/8\/F (no button, forward button, reverse button and stop or immediate off)<\/p>\n<p>And C<strong>heckdigit<\/strong> = 10h &#8211; (Channel + Orange + Yellow) AND Fh<\/p>\n<p>The space between each message is different according to the channel used (simillar to PF IR protocol):<\/p>\n<p style=\"padding-left: 30px;\">Ch. 1 &#8211; 19.6 Hz<br \/>\nCh. 2 &#8211; 14.8 Hz<br \/>\nCh. 3 &#8211; 11.6 Hz<br \/>\n\u2018All\u2019 &#8211; 19.6 Hz<\/p>\n<p>The document also has a NQC program demonstrating how to use the RCX to control 3 Manas units (each on its channel)<\/p>\n<p>I tried to replicate the commands with an Arduino and an IR LED but all my attempts failed miserably. After getting tired of it, I decided to analyze the signal, but since I don&#8217;t own a scope or a logic analyzer I had to use the only tools I have: an Arduino, a Raspberry Pi, a laptop and Google.<\/p>\n<p>So to &#8220;sniff&#8221; the IR signal I used an Arduino Uno with a <a href=\"https:\/\/www.vishay.com\/docs\/82459\/tsop48.pdf\">TSOP4856<\/a> as an IR decoder and a IR LED for testing my signals back. The setup is pretty much the same as <a href=\"https:\/\/learn.adafruit.com\/using-an-infrared-library\/hardware-needed\">this Adafruit lession<\/a>:<\/p>\n<p><img loading=\"lazy\" decoding=\"async\" class=\"alignnone size-large\" src=\"https:\/\/lh3.googleusercontent.com\/jZtBr2VyXmLKlGeWUoxmnjH9wEnYCLPz8xIFVuuRtrzKRWSm_YMswk1dwcT8lbz9BP2oTLGh1cje54u8ZDUxVkCh3Mo_O58dIABCYNE6FN4SKQeztBWWDJYF6Mb-Eh-YCM6d5HCe0bO6FLG_qv_wD0WrDuUqKcUKgbQYSNoWPTaphnj3hDJs0S2TD3SIf_YXhzVbO4zV48A1pwJx3W0Aqj1951tsBIsWW01b5ZP_OQU0aTOb5Ff7WFi1EHJQBQnkwTxwd815reuZbRFsklcJe8DT1hGHIHJnG5zS0ffzt--dR_QQvbu1hy5sAWN_ALP-ojNY1ImuQJ_bUAGWPZUeW6cblkFtCa9SEZ86Zri8L1KIiDc4WnfR65TQQmAOLpYMmh5XowCLRWdBL-tQeLXMo6SFUO1QN9gaAeoQnOmPofG00Wc1PImXTi65dqo_XrhGnkIkaatFKFTNw5tmKCgfu79L6JgFNOJXGzLs_cpl4pWLt3gQoufNTZIDgPRU75150U08GRkQL4JqQHkH54-Ri69_T1D6AiGqcuuSvlRZ9hVSKTK83aS5KLlmo65Sb1zTzDmNTvwZDsVUqsZYe1wpxwyN8Dm-Ma-_UBKVGHqOJg=w1479-h830-no\" width=\"1479\" height=\"830\" \/><\/p>\n<p>The TSOP signal is connected to Arduino pin 2 and the IR LEDs are connected to Arduino pin 3 (that&#8217;s right, two LED&#8217;s in serial, no resistors&#8230; might use a transistor later).<\/p>\n<p>The TSOP module has a filter better suited for 56 kHz carrier &#8211; not quite the 76 kHz I wanted but it was the higher carrier I could found &#8211; just for the record, an IR photodiode and a 1M resistor also works, both devices can detect the 76 kHz signal at short distances.<\/p>\n<p>So I installed cyborg5&#8217;s <a href=\"https:\/\/github.com\/cyborg5\/IRLib2\">IRLib2<\/a> Arduino library on my laptop and tried the <a href=\"https:\/\/github.com\/cyborg5\/IRLib2\/blob\/master\/IRLib2\/examples\/rawRecv\/rawRecv.ino\">rawRecv<\/a> sketch available on the <a href=\"https:\/\/github.com\/cyborg5\/IRLib2\/tree\/master\/IRLib2\/examples\">examples<\/a> folder. Pressing the Yellow Forward button on the Manas command I got this:<\/p>\n<pre>Ready to receive IR signals\r\nDo a cut-and-paste of the following lines into the \r\ndesignated location in rawSend.ino\r\n\r\n#define RAW_DATA_LEN 12\r\nuint16_t rawData[RAW_DATA_LEN]={\r\n 1082, 206, 154, 238, 178, 590, 594, 238, \r\n 178, 658, 178, 1000};<\/pre>\n<p>So I passed those last lines into the <a href=\"https:\/\/github.com\/cyborg5\/IRLib2\/blob\/master\/IRLib2\/examples\/rawSend\/rawSend.ino\">rawSend<\/a> sketch and changed the carrier frequency to 76:<\/p>\n<pre>mySender.send(rawData,RAW_DATA_LEN,76);<\/pre>\n<p>&#8230; and each time I sent a key to the Arduino serial terminal my Manas yellow motor rotated forward.<\/p>\n<p>Wow!<\/p>\n<p>I tried to find some meaning to those values but I was totally lost. Tried to use another skech (Analyze) but the results made no sense&#8230; I captured all keys combinations and they worked but I wanted to know the meaning.<\/p>\n<p>So I used the same TSOP4856 on my Raspberry Pi and installed LIRC, so I can use &#8220;mode2&#8221; command to record a signal. Recent stretch-based versions of Raspbian have some quirks but following <a href=\"https:\/\/gist.github.com\/prasanthj\/c15a5298eb682bde34961c322c95378b\">this method<\/a> I had success.<\/p>\n<pre>$ mode2 -d \/dev\/lirc0<\/pre>\n<pre>space 16777215\r\npulse 1085\r\nspace 179\r\npulse 239\r\nspace 174\r\npulse 239\r\nspace 534\r\npulse 651\r\nspace 175\r\npulse 190\r\nspace 644\r\npulse 190\r\nspace 46681\r\npulse 1090\r\nspace 156\r\npulse 260\r\nspace 183\r\npulse 235\r\nspace 526\r\npulse 658\r\nspace 173\r\npulse 241\r\nspace 576\r\npulse 259\r\nspace 1518\r\npulse 69\r\nspace 45041\r\npulse 1090\r\nspace 156\r\npulse 211\r\nspace 225\r\npulse 190\r\nspace 579\r\npulse 607\r\nspace 226\r\npulse 189\r\nspace 643\r\npulse 195\r\nspace 46689\r\npulse 1090\r\nspace 176\r\npulse 242\r\nspace 175\r\npulse 241\r\nspace 495\r\npulse 676\r\nspace 175\r\npulse 242\r\nspace 572\r\npulse 274\r\nspace 46589\r\npulse 1041\r\nspace 210\r\npulse 204\r\nspace 210\r\npulse 207\r\nspace 578\r\npulse 607\r\nspace 207\r\npulse 224\r\nspace 610\r\npulse 220\r\nspace 46642\r\npulse 1041\r\nspace 214\r\npulse 200\r\nspace 227\r\npulse 190\r\nspace 566\r\npulse 604\r\nspace 230\r\npulse 187\r\nspace 661\r\npulse 172\r\nspace 46683\r\npulse 1038\r\nspace 211\r\npulse 206\r\nspace 210\r\npulse 206\r\nspace 561\r\npulse 207\r\nspace 417\r\npulse 207\r\nspace 210\r\npulse 1042\r\nspace 46445\r\npulse 1038\r\nspace 209\r\npulse 217\r\nspace 201\r\npulse 204\r\nspace 584\r\npulse 173\r\nspace 434\r\npulse 190\r\nspace 227\r\npulse 1027\r\nspace 921\r\npulse 159\r\nspace 45364\r\npulse 1038\r\nspace 213\r\npulse 201\r\nspace 230\r\npulse 187\r\nspace 578\r\npulse 190\r\nspace 437\r\npulse 187\r\nspace 230\r\npulse 1021<\/pre>\n<p>I installed <a href=\"https:\/\/github.com\/bengtmartensson\/harctoolboxbundle\/releases\/tag\/Version-1.4.1\">IrScrutinizer <\/a>on my laptop, imported the above result (&#8220;Import signal&#8221;) and got a nice signal in the &#8220;Scrutinize signal&#8221; pane:<\/p>\n<p><a href=\"https:\/\/i0.wp.com\/ofalcao.pt\/blog\/wp-content\/uploads\/2017\/11\/IrScrutnizer01.png\"><img data-recalc-dims=\"1\" loading=\"lazy\" decoding=\"async\" class=\"aligncenter size-full wp-image-1216\" src=\"https:\/\/i0.wp.com\/ofalcao.pt\/blog\/wp-content\/uploads\/2017\/11\/IrScrutnizer01.png?resize=840%2C552\" alt=\"\" width=\"840\" height=\"552\" \/><\/a>A zoom of the first block from the left shows a clear sign:<\/p>\n<p><a href=\"https:\/\/i0.wp.com\/ofalcao.pt\/blog\/wp-content\/uploads\/2017\/11\/IrScrutnizer02.png\"><img data-recalc-dims=\"1\" loading=\"lazy\" decoding=\"async\" class=\"aligncenter size-full wp-image-1217\" src=\"https:\/\/i0.wp.com\/ofalcao.pt\/blog\/wp-content\/uploads\/2017\/11\/IrScrutnizer02.png?resize=735%2C262\" alt=\"\" width=\"735\" height=\"262\" \/><\/a>But how does this relates to &#8220;50 74&#8221; that, according to the protocol definition, is the 2-byte representation for &#8220;Yellow Forward on Channel #1&#8221;?<\/p>\n<p>Well, after a few head aches, I got it.<\/p>\n<p>First, I realize that I made a stupid beginner error: like many serial codes, the bits are sent in revere order (least significant bit of each byte first, more significant bit last).<\/p>\n<p>Then I understood the rawRecv format: each value represents the time duration of a continuous mark or space before it &#8220;toggles&#8221;.<\/p>\n<p>I also got confused with the bits representation (that 25% duty cycle still confuses me). But if I assume a single bit duration to be near 208\u00a0\u00b5s (for a 4800 bit per second rate), &#8216;zero&#8217; as the start bit and &#8216;one&#8217; as the stop bit\u00a0 I can translate this:<\/p>\n<pre>uint16_t rawData[12]={\r\n 1082, 206, 154, 238, 178, 590, 594, 238, \r\n 178, 658, 178, 1000};\r\n\r\n5 zeros (1082) = start bit + 0000\r\n1 one (206)\r\n1 zero (154)\r\n1 one (238)\r\n1 zero (178)\r\n3 ones (590) = odd parity bit + stop bit + pause\r\n3 zeros (594) = start bit + 00\r\n1 one (238)\r\n1 zero (178)\r\n3 ones (658)\r\n1 zero (178)\r\n2 or more ones (1000) that must include odd parity bit, stop bit and pause<\/pre>\n<p>The last value (1000 \u00b5s) is an arbitrary value used by the sketch author to end the signal.<\/p>\n<p>So&#8230;<\/p>\n<p style=\"text-align: center;\"><strong>00000101011100010111011<\/strong><\/p>\n<p style=\"text-align: center;\">start=0 | 0000 1010 | odd=1 | stop=1<\/p>\n<p style=\"text-align: center;\">pause=1<\/p>\n<p style=\"text-align: center;\">start=0 | 0010 1110 | odd=1 | stop=1<\/p>\n<p>The odd parity bits are correct, that&#8217;s a good start.<\/p>\n<p>Reverting the order of the data bits, we have:<\/p>\n<p style=\"text-align: center;\">0101 = <strong>5<\/strong> | 0000 = <strong>0<\/strong> | 0111 = <strong>7<\/strong> | 0100 = <strong>4<\/strong>\u00a0 =&gt; <strong>5074<\/strong><\/p>\n<p>Yeah!<\/p>\n<p>So the precision isn&#8217;t pretty (I got bits with just 154 \u00b5s and others with 238 \u00b5s when they all should be 208 \u00b5s long) but that doesn&#8217;t really matter &#8211; I can now recreate all signals with theory-perfect values and test if it works.<\/p>\n<p>So I wrote <a href=\"https:\/\/github.com\/JorgePe\/ir-spybotics\/blob\/master\/ir_generate.py\">a python script<\/a> to generate <a href=\"https:\/\/github.com\/JorgePe\/ir-spybotics\/blob\/master\/all_commands.txt\">all combinations<\/a> for all channels and also a <a href=\"https:\/\/github.com\/JorgePe\/ir-spybotics\/blob\/master\/RemoteControl.ino\">RemoteControl<\/a> sketch &#8211;\u00a0 just an extended &#8216;rawSend&#8217; sketch that sends different signals according to the keys received from the serial port.<\/p>\n<p>This is a sample of the output of my python script:<\/p>\n<pre>Command: Ch1_OrangeNop_YellowFwd\r\n Msg: 00000101011100010111011\r\n Size: 12\r\n Signal: 1040, 208, 208, 208, 208, 624, 624, 208, 208, 624, 208, 624<\/pre>\n<p>And it works!<\/p>\n<div class=\"jetpack-video-wrapper\"><iframe loading=\"lazy\" title=\"Old LEGO IR protocol with Arduino\" width=\"840\" height=\"473\" src=\"https:\/\/www.youtube.com\/embed\/mgHzTfV4VFE?feature=oembed\" frameborder=\"0\" allow=\"accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture; web-share\" referrerpolicy=\"strict-origin-when-cross-origin\" allowfullscreen><\/iframe><\/div>\n<p>The serial port can be used directly so we can use our keyboard (in linux, just use screen to connect to the Arduino serial port, i.e. &#8216;screen \/dev\/ttyACM0&#8242;) or we can write our own programs to automate it.<\/p>\n<p>And yes, we can connect the Arduino to our MINDSTORMS EV3 and use ev3dev to control our old LEGO IR devices \ud83d\ude42<\/p>\n<p>Even better: we can use the same approach to generate a LIRC configuration file so we don&#8217;t even need an Arduino &#8211; any IR transmitter supported by LIRC will work&#8230; including <a href=\"http:\/\/ofalcao.pt\/blog\/series\/using-a-ftdi-adapter-as-an-ir\">my FTDI IR emitter<\/a>. That means we can use the same emitter to control all LEGO IR devices,\u00a0 Power Functions and pre-Power Functions:<\/p>\n<div class=\"jetpack-video-wrapper\"><iframe loading=\"lazy\" title=\"LEGO Universal IR Controller\" width=\"840\" height=\"630\" src=\"https:\/\/www.youtube.com\/embed\/BDV_RNjPbCg?feature=oembed\" frameborder=\"0\" allow=\"accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture; web-share\" referrerpolicy=\"strict-origin-when-cross-origin\" allowfullscreen><\/iframe><\/div>\n<p>(Power Functions LIRC configuration file based on excellent work of <a href=\"https:\/\/github.com\/iConor\/lego-lirc\">Conor Cary<\/a> and <a href=\"https:\/\/github.com\/dspinellis\/lego-lirc\">Diomidis Spinellis<\/a>)<\/p>\n<p>I created a <a href=\"https:\/\/github.com\/JorgePe\/ir-spybotics\">github project<\/a> for this, you can get the LIRC configuration (or just the generator there).<\/p>\n<p>&nbsp;<\/p>\n","protected":false},"excerpt":{"rendered":"<div class=\"seriesmeta\">This post is part 1  of 2 of \u00a0<a href=\"https:\/\/ofalcao.pt\/blog\/series\/lego-ir-sniffing\" class=\"series-322\" title=\"LEGO IR sniffing\">LEGO IR sniffing<\/a><\/div><p>This started most as a curious thing and now I realize it went crazy. But I learned a lot so perhaps other may benefit of it. On my quest to control all LEGO MINDSTORMS models ever sold from a single &#8220;gateway&#8221; I started a few weeks ago my work with the Spybotics: This little fellow &hellip; <a href=\"https:\/\/ofalcao.pt\/blog\/2017\/decoding-old-lego-infrared-protocol\" class=\"more-link\">Continuar a ler<span class=\"screen-reader-text\"> &#8220;Decoding old LEGO infrared protocol&#8221;<\/span><\/a><\/p>\n","protected":false},"author":1,"featured_media":0,"comment_status":"closed","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"_jetpack_memberships_contains_paid_content":false,"footnotes":"","jetpack_publicize_message":"","jetpack_publicize_feature_enabled":true,"jetpack_social_post_already_shared":true,"jetpack_social_options":{"image_generator_settings":{"template":"highway","enabled":false},"version":2}},"categories":[1],"tags":[320,174,318,321,319],"series":[322],"class_list":["post-1213","post","type-post","status-publish","format-standard","hentry","category-sem-categoria","tag-duplo-dozer","tag-ir","tag-manas","tag-rc-train","tag-spybotics","series-lego-ir-sniffing"],"jetpack_publicize_connections":[],"jetpack_featured_media_url":"","jetpack_sharing_enabled":true,"jetpack_shortlink":"https:\/\/wp.me\/p2Mhyv-jz","_links":{"self":[{"href":"https:\/\/ofalcao.pt\/blog\/wp-json\/wp\/v2\/posts\/1213","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/ofalcao.pt\/blog\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/ofalcao.pt\/blog\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/ofalcao.pt\/blog\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/ofalcao.pt\/blog\/wp-json\/wp\/v2\/comments?post=1213"}],"version-history":[{"count":0,"href":"https:\/\/ofalcao.pt\/blog\/wp-json\/wp\/v2\/posts\/1213\/revisions"}],"wp:attachment":[{"href":"https:\/\/ofalcao.pt\/blog\/wp-json\/wp\/v2\/media?parent=1213"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/ofalcao.pt\/blog\/wp-json\/wp\/v2\/categories?post=1213"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/ofalcao.pt\/blog\/wp-json\/wp\/v2\/tags?post=1213"},{"taxonomy":"series","embeddable":true,"href":"https:\/\/ofalcao.pt\/blog\/wp-json\/wp\/v2\/series?post=1213"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}