NetHackTutorial.ipynb 99.8 KB
Newer Older
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
{
 "cells": [
  {
   "cell_type": "markdown",
   "id": "71dbce49",
   "metadata": {},
   "source": [
    "# A Brief Intro to NetHack & the NLE"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "f036704c",
   "metadata": {},
   "source": [
    "> *Welcome, adventurer! You have been heralded from birth as the instrument of the gods. You are destined to recover the Amulet of Yendor for your deity or die in the attempt. Your hour of destiny has come. For the sake of us all: Go bravely!*\n",
    "\n",
    "\n",
    "This notebook provides a brief overview of the game of NetHack, a glance at the NetHack Learning Environment (NLE) and finally lays down the gauntlet for the NetHack Chellenge!"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "fdc6fcd4",
   "metadata": {},
   "source": [
    "# What is NetHack? \n",
    "\n",
    "NetHack is a [roguelike](https://en.wikipedia.org/wiki/Roguelike#:~:text=Roguelike%20(or%20rogue%2Dlike),death%20of%20the%20player%20character.) computer game, which was first introduced in the late 1980s. At the beginning of the game your hero is placed into a dungeon, with the goal to descend to the bottom of over 50 procedurally generated levels to retrieve the Amulet of Yendor. Once obtained, your hero must subsequently escape the dungeon, unlocking five extremely challenging final levels, before offering the Amulet to your in-game deity. \n",
    "\n",
    "A key component of NetHack is that it is *visually* simple, with observations solely making use of ascii characters, yet it is complex in almost every other way! \n",
    "\n",
    "There are several reasons why it is particularly challengng: \n",
    "\n",
    "1) The game is randomized, with everything from the layout of maps to the impact of actions based on the roll of a dice.  \n",
    "\n",
    "2) Unlike modern games, it is impossible to save, instead when you die you begin from scatch. Given the randomness (see above) this makes it especially \"unforgiving\" (as described on the wiki). Indeed, deaths are so common there is even an acronym - YASD, which stands for Yet Another Stupid Death. \n",
    "\n",
    "3) It is incredibly complex, with hundreds of different characters to observe and many more potential sequences of actions.\n",
    "\n",
    "Thus, unlike other games played by AI agents, NetHack is not solvable by the average human in just a few hours of gameplay. Instead - expert players often take many years to solve it - assuming they are even able to!\n",
    "\n",
    "NetHack has been actively developed for decades, and NLE makes use of version 3.6.6, originally released in March 2020."
   ]
  },
  {
   "cell_type": "markdown",
   "id": "a652ab9f",
   "metadata": {},
   "source": [
    "## Playing the Game"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "45fd15f0",
   "metadata": {},
   "source": [
    "### Choosing your hero\n",
    "\n",
    "At the start of the game, players are usually asked to choose their *character*'s starting role, race, gender and religious alignment. From the [NetHack Wiki](https://nethackwiki.com/wiki/Player):\n",
    "\n",
    "> The player character can be any one of the following roles: archeologist, barbarian, cave[wo]man, healer, knight, monk, priest[ess], ranger, rogue, samurai, tourist, valkyrie, or wizard. They each have varying difficulties, strengths, weaknesses, quests and starting items. \n",
    ">\n",
    "> The player can also choose from the five races: human, elf, dwarf, gnome, or orc, and the three alignments: lawful, neutral or chaotic. The available races and alignments are dependent on the role one picks.\n",
    "\n",
    "\n",
    "Each different starting combination will alter the game experience, and thus impact the difficulty of the game and the most suitable strategy. For example, wizards start with magic and magical items, while rangers begin with a bow and arrow; elves are generally intelligent whereas dwarves will be strong! \n",
    "\n",
    "It's worth noting these different starting characters can really affect the performance of agents learning to play the game. In the original NLE paper, agents on the Score task (most similar to the NetHack Challenge) averaged 738 for monk, 538 for valkyrie, 314 for wizard - but only 11 for tourist! For the purposes of the NetHack Challenge, the character is randomized during evaluation for the competition, so it is likely wise to consider agents that can perform well across a variety of hero configurations."
   ]
  },
  {
   "cell_type": "markdown",
   "id": "1e8bc401",
   "metadata": {},
   "source": [
    "### Complex Observations\n",
    "\n",
    "One of the many challenges of NetHack is the richness of the observation space, with fully-formed dungeon, message line and stats bar all rendered as ascii text!  Every character (and color) in the dungeon has a symbolic meaning - whether its a [Monster](https://nethackwiki.com/wiki/Monster#Canonical_list_of_monsters), [Item](https://nethackwiki.com/wiki/Item), or just a part of the [Dungeon](https://nethackwiki.com/wiki/Dungeon_feature) itself.\n",
    "\n",
    "![Dungeon](./example_annotated.png)\n",
    "\n",
    "\n",
    "#### Dungeon\n",
    "\n",
    "The dungeon is the main part of the screen the character navigates.  The most frequently seen symbols are:\n",
    "* `@` : You\n",
    "* `.` : Dungeon Floor\n",
    "* `<` and `>` : Stairs up and down\n",
    "* `|` and `-` : Walls\n",
    "* `+` : Doors\n",
    "\n",
    "While it is also common to see Fountains: `{`, Traps: `^`, Altars: `_` and Hallways: `#`.\n",
    "\n",
    "#### Items\n",
    "NetHack has a [vast number of items](https://nethackwiki.com/wiki/Item) for in-game use, and many objects can be picked up and included in inventory. Once included, the agent can choose to use them in a number of different ways - often with some imaginative consequences: you can `apply` a towel to a weapon to clean off grease, but you can `wear` it too (it will wrap around your head)!\n",
    "\n",
    "Heros will need to use items as best as possible to navigate the dungeons, not least in finding fresh food to eat (unless they can find a [different way](https://nethackwiki.com/wiki/Prayer) to stave off hunger)...\n",
    "\n"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "143f1ca8",
   "metadata": {},
   "source": [
    "#### Monsters!\n",
    "\n",
    "A key component of the difficulty of NetHack (and the cause of many heroic deaths) is the presence of [monsters](https://nethackwiki.com/wiki/Monster#Canonical_list_of_monsters). Throughout the game the hero will encounter many of the hundreds of different types of monsters, ranging from simple jackals which can be trivially defeated to other, more challenging obstacles that typically require significant thought to overcome. \n",
    "\n",
    "For instance, if you walk into a Floating Eye (blue `e`) you will become paralyzed and probably die - this is common for even experienced players who lose concentration! To kill one, the hero can: make use of ranged weapons; blind themselves to avoid looking it at it; become invisible so as not to be seen by it; wear a ring of free action (preventing paralysis); or possess a source reflection (thus reflecting the gaze). Got all that? \n",
    "\n",
    "What makes this a little tricker is that many of the most challenging monsters may be seen infrequently, potentially only being encountered once across multiple games. Thus, while it is possible to memorize a strategy for a handful or even dozens of monsters, it only takes one to slip through the cracks of memory before it is back to the beginning of the game. "
   ]
  },
  {
   "cell_type": "markdown",
   "id": "b449cc83",
   "metadata": {},
   "source": [
    "#### Taking Actions\n",
    "\n",
    "In order to make the vast array of complex skills possible to achieve, NetHack has a large action space (referred to as `commands`). The game of NetHack takes inputs directly corresponding to keys on the keyboard, including modifiers such as ctrl, shift and meta. The [full list of commands](https://nethackwiki.com/wiki/Commands_(by_key)) is extensive, including both actions, and meta-commands such as help, or viewing the inventory.\n",
    "\n",
    "For the NetHack Challenge we provide an action space that is as close to full set of commands as possible - blocking only a few commands like modifying option settings. This should provide a significant challenge to all AI agents, while also offering them the potential to fully master the game. We note that it may be worthwhile to constrain this with some inductive bias, possibly even considering a curriculum of [increasing action space](http://proceedings.mlr.press/v119/farquhar20a.html). "
   ]
  },
  {
   "cell_type": "markdown",
   "id": "85bfc579",
   "metadata": {},
   "source": [
    "#### Structure of the NetHack world\n",
    "\n",
    "The collective name for all levels of the game is the \"Mazes of Menace\". Your heor starts on the inital Dungeons of Doom, which is above the underworld Gehennom and below the five Planes which form the final stages of the game.\n",
    "\n",
    "The Dungeons also contain various branches, the locations of which are often randomized. For example, the Gnomish Mines will always be generated between dungeon levels 2-4. There is also a Sokoban branch, located between levels 2-9. In order to reach the Amulet (and win the game), adventurers must complete the Quest, another branch, the location of which varies depending on the role. \n",
    "\n",
    "This is just a brief foray into the details of the game, for more detail on the Mazes of Menace see the [nethackwiki page](https://nethackwiki.com/wiki/Mazes_of_Menace). "
   ]
  },
  {
   "cell_type": "markdown",
   "id": "bc29bf70",
   "metadata": {},
   "source": [
    "# What is the NetHack Learning Environment (NLE)\n",
    "\n",
    "The NLE is the OpenAI Gym environment which provides researchers with the ability to train agents on the game of NetHack, presented at NeurIPS 2020.\n",
    "\n",
    "### `NetHackChallenge-v0`\n",
    "\n",
    "The NLE contains different NetHack based tasks for agent training, but a new environment has been created especially for the competition: 'NetHackChallenge-v0'. The new environment is based on the 'NetHackScore-v0' task used in the NeurIPS paper, but contains some key modifications to bring out the full experience of NetHack. These are:\n",
    "* The action space of the environment is greatly expanded to allow all keys on the keyboard\n",
    "* Menus, yes/no questions, cursor-movement, and text-input modalities are enabled.\n",
    "* A random character (represented as '@' ) instead of a single default (eg 'mon-hum-neu-mal')\n",
    "\n",
    "This makes the game particularly challenging, while also providing additional opportunity for savvy agents!\n",
    "\n",
    "NLE is loaded as a gym environment, with all the typical functions that reinforcement learning (RL) researchers will be familiar with. For those using a symbolic approach, this means we typically follow the following few steps:\n",
    "\n",
    "```python\n",
    "obs = env.reset() # produces the first observation\n",
    "done = False # initialize this so we know when episode ends\n",
    "total_reward = 0 # total reward\n",
    "while not done:\n",
Eric Hambro's avatar
Eric Hambro committed
168
    "    action = agent.act(obs) # agent processes observation and computes an action\n",
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
    "    obs, reward, done, info = env.step(action) # updates the new observation and provides the reward/done\n",
    "    total_reward += reward # keep track of cumulative reward\n",
    "```\n",
    "\n",
    "When the episode is over (very likely YASD) the total_reward will be the score of the agent, used for training RL agents, and to get an idea of the current performance for symbolic ones. \n",
    "\n",
    "## Code Examples"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 1,
   "id": "5a513468",
   "metadata": {},
   "outputs": [],
   "source": [
    "import nle\n",
    "import gym"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 2,
   "id": "3d422c13",
   "metadata": {
    "scrolled": false
   },
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "\n",
      "\u001b[0;37mI\u001b[0;37mt\u001b[0;37m'\u001b[0;37ms\u001b[0;30m \u001b[0;37ma\u001b[0;30m \u001b[0;37mw\u001b[0;37ma\u001b[0;37ml\u001b[0;37ml\u001b[0;37m.\u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \n",
      "\u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \n",
      "\u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \n",
      "\u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \n",
      "\u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \n",
      "\u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \n",
      "\u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \n",
      "\u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \n",
      "\u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \n",
      "\u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \n",
      "\u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \n",
      "\u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \n",
      "\u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \n",
      "\u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;37m-\u001b[0;37m-\u001b[0;37m.\u001b[0;37m-\u001b[0;37m-\u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \n",
      "\u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;37m|\u001b[0;37m.\u001b[0;37m.\u001b[0;37m.\u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \n",
      "\u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;37m|\u001b[0;37m.\u001b[1;37md\u001b[0;37m.\u001b[0;37m|\u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \n",
      "\u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;37m|\u001b[0;37m.\u001b[1;37mF\u001b[1;37m@\u001b[0;37m|\u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \n",
      "\u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;37m|\u001b[0;37m.\u001b[0;37m.\u001b[0;37m.\u001b[0;37m|\u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \n",
      "\u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;37m|\u001b[0;37m.\u001b[1;33m$\u001b[0;37m.\u001b[0;37m|\u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \n",
      "\u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;37m-\u001b[0;37m-\u001b[0;37m-\u001b[0;37m-\u001b[0;37m-\u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \n",
      "\u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \n",
      "\u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \n",
      "\u001b[0;37mA\u001b[0;37mg\u001b[0;37me\u001b[0;37mn\u001b[0;37mt\u001b[0;30m \u001b[0;37mt\u001b[0;37mh\u001b[0;37me\u001b[0;30m \u001b[0;37mR\u001b[0;37mh\u001b[0;37mi\u001b[0;37mz\u001b[0;37mo\u001b[0;37mt\u001b[0;37mo\u001b[0;37mm\u001b[0;37mi\u001b[0;37ms\u001b[0;37mt\u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;37mS\u001b[0;37mt\u001b[0;37m:\u001b[0;37m9\u001b[0;30m \u001b[0;37mD\u001b[0;37mx\u001b[0;37m:\u001b[0;37m8\u001b[0;30m \u001b[0;37mC\u001b[0;37mo\u001b[0;37m:\u001b[0;37m1\u001b[0;37m6\u001b[0;30m \u001b[0;37mI\u001b[0;37mn\u001b[0;37m:\u001b[0;37m1\u001b[0;37m1\u001b[0;30m \u001b[0;37mW\u001b[0;37mi\u001b[0;37m:\u001b[0;37m1\u001b[0;37m4\u001b[0;30m \u001b[0;37mC\u001b[0;37mh\u001b[0;37m:\u001b[0;37m1\u001b[0;37m7\u001b[0;30m \u001b[0;37mN\u001b[0;37me\u001b[0;37mu\u001b[0;37mt\u001b[0;37mr\u001b[0;37ma\u001b[0;37ml\u001b[0;30m \u001b[0;37mS\u001b[0;37m:\u001b[0;37m0\u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \n",
      "\u001b[0;37mD\u001b[0;37ml\u001b[0;37mv\u001b[0;37ml\u001b[0;37m:\u001b[0;37m1\u001b[0;30m \u001b[0;37m$\u001b[0;37m:\u001b[0;37m1\u001b[0;37m4\u001b[0;37m2\u001b[0;37m3\u001b[0;30m \u001b[0;37mH\u001b[0;37mP\u001b[0;37m:\u001b[0;37m1\u001b[0;37m2\u001b[0;37m(\u001b[0;37m1\u001b[0;37m2\u001b[0;37m)\u001b[0;30m \u001b[0;37mP\u001b[0;37mw\u001b[0;37m:\u001b[0;37m5\u001b[0;37m(\u001b[0;37m5\u001b[0;37m)\u001b[0;30m \u001b[0;37mA\u001b[0;37mC\u001b[0;37m:\u001b[0;37m8\u001b[0;30m \u001b[0;37mX\u001b[0;37mp\u001b[0;37m:\u001b[0;37m1\u001b[0;37m/\u001b[0;37m0\u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0m\n"
     ]
    }
   ],
   "source": [
    "env = gym.make(\"NetHackChallenge-v0\", savedir=None)  # (Don't save a recording of the episode)\n",
    "env.reset()  # each reset generates a new dungeon\n",
    "env.step(1)  # move agent '@' north\n",
233
234
    "\n",
    "## WARNING: WILL NOT RENDER ON GITLAB (run locally)\n",
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
385
386
387
388
389
390
391
392
393
394
395
396
397
398
399
400
401
402
403
404
405
406
407
408
409
410
411
412
413
414
415
416
417
418
419
420
421
422
423
424
425
426
427
428
429
430
431
432
433
434
435
436
437
438
439
440
441
442
443
444
445
446
447
448
449
450
451
452
453
454
455
456
457
458
459
460
461
462
463
464
465
466
467
468
469
470
471
472
473
474
475
476
477
478
479
480
481
482
483
484
485
486
487
488
489
490
491
492
493
494
495
496
497
498
499
500
501
502
503
504
505
506
507
508
509
510
511
512
513
514
515
516
517
518
519
520
521
522
523
524
525
526
527
528
529
530
531
    "env.render()\n"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "a7fbc173",
   "metadata": {},
   "source": [
    "The NLE observation contains multiple objects, many of which we receive as keys in the observation dictionary. Let's take a look."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 3,
   "id": "d8cbc4fd",
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "dict_keys(['glyphs', 'chars', 'colors', 'specials', 'blstats', 'message', 'inv_glyphs', 'inv_strs', 'inv_letters', 'inv_oclasses', 'tty_chars', 'tty_colors', 'tty_cursor'])"
      ]
     },
     "execution_count": 3,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "obs = env.reset()\n",
    "obs.keys()"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "68223810",
   "metadata": {},
   "source": [
    "#### Observing the Dungeon\n",
    "\n",
    "The elements **`glyphs`**, **`chars`**, **`colors`**, and **`specials`** are tensors representing the (batched) 2D symbolic observation of the dungeon. Our agents primarily use the first three.\n",
    "\n",
    "* **`glyphs`** - are the single integers representing the specific object at a square in the dungeon (eg a hell-hound)\n",
    "* **`chars`** - are the characters used to render the glyphs on the screen (eg `d`)\n",
    "* **`colors`** - are the colors used to render the glyphs on the screen (eg red)\n",
    "* **`specials`** - are any special modifications to render the glyphs on the screen (eg its invisible!)\n"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 4,
   "id": "7c8649d5",
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "\n",
      "glyphs:\n",
      "\n",
      "Shape: (21, 79)\n",
      "\n",
      "[[0 0 0 ... 0 0 0]\n",
      " [0 0 0 ... 0 0 0]\n",
      " [0 0 0 ... 0 0 0]\n",
      " ...\n",
      " [0 0 0 ... 0 0 0]\n",
      " [0 0 0 ... 0 0 0]\n",
      " [0 0 0 ... 0 0 0]]\n",
      "\n",
      "chars:\n",
      "\n",
      "Shape: (21, 79)\n",
      "\n",
      "[[32 32 32 ... 32 32 32]\n",
      " [32 32 32 ... 32 32 32]\n",
      " [32 32 32 ... 32 32 32]\n",
      " ...\n",
      " [32 32 32 ... 32 32 32]\n",
      " [32 32 32 ... 32 32 32]\n",
      " [32 32 32 ... 32 32 32]]\n",
      "\n",
      "colors:\n",
      "\n",
      "Shape: (21, 79)\n",
      "\n",
      "[[0 0 0 ... 0 0 0]\n",
      " [0 0 0 ... 0 0 0]\n",
      " [0 0 0 ... 0 0 0]\n",
      " ...\n",
      " [0 0 0 ... 0 0 0]\n",
      " [0 0 0 ... 0 0 0]\n",
      " [0 0 0 ... 0 0 0]]\n"
     ]
    }
   ],
   "source": [
    "for key in ['glyphs', 'chars', 'colors']:\n",
    "    print(\"\\n{}:\\n\".format(key))\n",
    "    print(\"Shape: {}\\n\".format(obs[key].shape))\n",
    "    print(obs[key])"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "ab199a8b",
   "metadata": {},
   "source": [
    "#### BLStats and Message\n",
    "\n",
    "Along the top of the screen is a topline message that the game uses to communicate with you. Paying close attention to what the game can often result in the difference between life and death!  The encoding of this message is presented in the observation **`message`**\n",
    "\n",
    "Also of interest are the stats along the bottom line of the screen. These are extract in  **`blstats`** and contain a lot of useful infomation visible below.\n"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 23,
   "id": "36b8f0b0",
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "\n",
      "\u001b[0;37mH\u001b[0;37me\u001b[0;37ml\u001b[0;37ml\u001b[0;37mo\u001b[0;30m \u001b[0;37mA\u001b[0;37mg\u001b[0;37me\u001b[0;37mn\u001b[0;37mt\u001b[0;37m,\u001b[0;30m \u001b[0;37mw\u001b[0;37me\u001b[0;37ml\u001b[0;37mc\u001b[0;37mo\u001b[0;37mm\u001b[0;37me\u001b[0;30m \u001b[0;37mt\u001b[0;37mo\u001b[0;30m \u001b[0;37mN\u001b[0;37me\u001b[0;37mt\u001b[0;37mH\u001b[0;37ma\u001b[0;37mc\u001b[0;37mk\u001b[0;37m!\u001b[0;30m \u001b[0;30m \u001b[0;37mY\u001b[0;37mo\u001b[0;37mu\u001b[0;30m \u001b[0;37ma\u001b[0;37mr\u001b[0;37me\u001b[0;30m \u001b[0;37ma\u001b[0;30m \u001b[0;37mc\u001b[0;37mh\u001b[0;37ma\u001b[0;37mo\u001b[0;37mt\u001b[0;37mi\u001b[0;37mc\u001b[0;30m \u001b[0;37mh\u001b[0;37mu\u001b[0;37mm\u001b[0;37ma\u001b[0;37mn\u001b[0;30m \u001b[0;37mP\u001b[0;37mr\u001b[0;37mi\u001b[0;37me\u001b[0;37ms\u001b[0;37mt\u001b[0;37m.\u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \n",
      "\u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \n",
      "\u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \n",
      "\u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \n",
      "\u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \n",
      "\u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \n",
      "\u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \n",
      "\u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \n",
      "\u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \n",
      "\u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \n",
      "\u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \n",
      "\u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \n",
      "\u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \n",
      "\u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;37m-\u001b[0;37m.\u001b[0;37m-\u001b[0;37m.\u001b[0;37m-\u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \n",
      "\u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;37m|\u001b[0;37m.\u001b[0;37m.\u001b[0;37m.\u001b[0;33m+\u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \n",
      "\u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;37m|\u001b[1;32mF\u001b[0;37m.\u001b[0;37m.\u001b[0;37m|\u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \n",
      "\u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;37m|\u001b[0;37m.\u001b[1;37m@\u001b[0;37m.\u001b[0;37m.\u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \n",
      "\u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;37m|\u001b[1;37mf\u001b[0;37m.\u001b[0;37m.\u001b[0;37m|\u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \n",
      "\u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;37m-\u001b[0;37m-\u001b[0;37m-\u001b[0;37m-\u001b[0;37m-\u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \n",
      "\u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \n",
      "\u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \n",
      "\u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \n",
      "\u001b[0;37mA\u001b[0;37mg\u001b[0;37me\u001b[0;37mn\u001b[0;37mt\u001b[0;30m \u001b[0;37mt\u001b[0;37mh\u001b[0;37me\u001b[0;30m \u001b[0;37mA\u001b[0;37ms\u001b[0;37mp\u001b[0;37mi\u001b[0;37mr\u001b[0;37ma\u001b[0;37mn\u001b[0;37mt\u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;37mS\u001b[0;37mt\u001b[0;37m:\u001b[0;37m1\u001b[0;37m2\u001b[0;30m \u001b[0;37mD\u001b[0;37mx\u001b[0;37m:\u001b[0;37m8\u001b[0;30m \u001b[0;37mC\u001b[0;37mo\u001b[0;37m:\u001b[0;37m1\u001b[0;37m4\u001b[0;30m \u001b[0;37mI\u001b[0;37mn\u001b[0;37m:\u001b[0;37m1\u001b[0;37m3\u001b[0;30m \u001b[0;37mW\u001b[0;37mi\u001b[0;37m:\u001b[0;37m1\u001b[0;37m8\u001b[0;30m \u001b[0;37mC\u001b[0;37mh\u001b[0;37m:\u001b[0;37m1\u001b[0;37m0\u001b[0;30m \u001b[0;37mC\u001b[0;37mh\u001b[0;37ma\u001b[0;37mo\u001b[0;37mt\u001b[0;37mi\u001b[0;37mc\u001b[0;30m \u001b[0;37mS\u001b[0;37m:\u001b[0;37m0\u001b[0;30m \u001b[0;30m \u001b[0;30m \n",
      "\u001b[0;37mD\u001b[0;37ml\u001b[0;37mv\u001b[0;37ml\u001b[0;37m:\u001b[0;37m1\u001b[0;30m \u001b[0;37m$\u001b[0;37m:\u001b[0;37m0\u001b[0;30m \u001b[0;37mH\u001b[0;37mP\u001b[0;37m:\u001b[0;37m1\u001b[0;37m4\u001b[0;37m(\u001b[0;37m1\u001b[0;37m4\u001b[0;37m)\u001b[0;30m \u001b[0;37mP\u001b[0;37mw\u001b[0;37m:\u001b[0;37m8\u001b[0;37m(\u001b[0;37m8\u001b[0;37m)\u001b[0;30m \u001b[0;37mA\u001b[0;37mC\u001b[0;37m:\u001b[0;37m7\u001b[0;30m \u001b[0;37mX\u001b[0;37mp\u001b[0;37m:\u001b[0;37m1\u001b[0;37m/\u001b[0;37m0\u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0m\n",
      "\n",
      "MESSAGE\n",
      "Hello Agent, welcome to NetHack!  You are a chaotic human Priest.\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\n",
      "\n",
      "BL STATS\n",
      "hero col: 47 hero_row: 15 strength_pct: 12 strength: 12 dexterity: 8 constitution: 14 intelligence: 13 wisdom: 18 charisma: 10 score: 0 hitpoints: 14 max_hitpoints: 14 depth: 1 gold: 0 energy: 8 max_energy: 8 armor_class: 7 monster_level: 0 experience_level: 1 experience_points: 0 time: 1 hunger_state: 1 carrying_capacity: 0 dungeon_number: 0 level_number: 1\n"
     ]
    }
   ],
   "source": [
    "bl_meaning = [\n",
    "    'hero col', 'hero_row', 'strength_pct', 'strength', 'dexterity', 'constitution', \n",
    "    'intelligence', 'wisdom', 'charisma', 'score', 'hitpoints', 'max_hitpoints', 'depth', \n",
    "    'gold', 'energy', 'max_energy', 'armor_class', 'monster_level', 'experience_level', \n",
    "    'experience_points', 'time', 'hunger_state', 'carrying_capacity', 'dungeon_number', 'level_number'\n",
    "]\n",
    "env.render()\n",
    "obs['blstats']\n",
    "\n",
    "print()\n",
    "print('MESSAGE')\n",
    "print(bytes(obs['message']).decode('ascii'))\n",
    "\n",
    "print()\n",
    "print('BL STATS')\n",
    "print(' '.join([\"%s: %d\" % (m,s) for m, s in zip(bl_meaning, obs['blstats'])]))\n"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "c7464df6",
   "metadata": {},
   "source": [
    "#### Inventory\n",
    "\n",
    "After this we have a series of entries to signify what's in the inventory.\n",
    "\n",
    "* **inv_glyphs** - The glyphs corresponding to the items in each slot in the inventory\n",
    "* **inv_letters** - The letter assigned to the slot in the inventory\n",
    "* **inv_strs** - The textual description of each item in the inventory\n",
    "* **inv_oclasses** - The object class of the item in the inventory (potion, scroll etc...)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 20,
   "id": "f3116c76",
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "In slot (a) - glyph: 1962, (class 2) - \"a blessed +1 mace (weapon in hand)\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\"\n",
      "In slot (b) - glyph: 2028, (class 3) - \"a blessed +0 robe (being worn)\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\"\n",
      "In slot (c) - glyph: 2035, (class 3) - \"a +0 small shield (being worn)\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\"\n",
      "In slot (d) - glyph: 2203, (class 8) - \"4 potions of holy water\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\"\n",
      "In slot (e) - glyph: 2165, (class 7) - \"a clove of garlic\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\"\n",
      "In slot (f) - glyph: 2164, (class 7) - \"a sprig of wolfsbane\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\"\n",
      "In slot (g) - glyph: 2253, (class 10) - \"a spellbook of detect monsters\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\"\n",
      "In slot (h) - glyph: 2275, (class 10) - \"a spellbook of remove curse\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\"\n"
     ]
    }
   ],
   "source": [
    "for let, glyph, strs, oclass in zip(\n",
    "    obs['inv_letters'], obs['inv_glyphs'], obs['inv_strs'], obs['inv_oclasses']):\n",
    "    \n",
    "    l = chr(let)\n",
    "    desc = bytes(strs).decode('utf-8')\n",
    "    if let:\n",
    "        print('In slot (%s) - glyph: %d, (class %d) - \"%s\"' % (l, glyph, oclass, desc))"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "ccc71153",
   "metadata": {},
   "source": [
    "#### Terminal Rendering\n",
    "\n",
    "Finally NLE provides you with the raw outputs of the terminal screen, should you decide you want to learn from this. This allows you to render menus and popups that might not otherwise be shown on the dungeon. \n",
    "\n",
    "The observations are simple:\n",
    "* **`tty_chars`** the characters at each point on the screen\n",
    "* **`tty_colors`** the colors at each point on the screen\n",
    "* **`tty_cursor`** the location of the cursor on the screen (note!:its not always on the hero!) \n",
    "\n",
    "These first two are whats rendered when you call `env.render()` in human mode, and the cursor is pretty self explanatory."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 25,
   "id": "fdd30978",
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "[16 47]\n",
      "\n",
      "\u001b[0;37mH\u001b[0;37me\u001b[0;37ml\u001b[0;37ml\u001b[0;37mo\u001b[0;30m \u001b[0;37mA\u001b[0;37mg\u001b[0;37me\u001b[0;37mn\u001b[0;37mt\u001b[0;37m,\u001b[0;30m \u001b[0;37mw\u001b[0;37me\u001b[0;37ml\u001b[0;37mc\u001b[0;37mo\u001b[0;37mm\u001b[0;37me\u001b[0;30m \u001b[0;37mt\u001b[0;37mo\u001b[0;30m \u001b[0;37mN\u001b[0;37me\u001b[0;37mt\u001b[0;37mH\u001b[0;37ma\u001b[0;37mc\u001b[0;37mk\u001b[0;37m!\u001b[0;30m \u001b[0;30m \u001b[0;37mY\u001b[0;37mo\u001b[0;37mu\u001b[0;30m \u001b[0;37ma\u001b[0;37mr\u001b[0;37me\u001b[0;30m \u001b[0;37ma\u001b[0;30m \u001b[0;37mc\u001b[0;37mh\u001b[0;37ma\u001b[0;37mo\u001b[0;37mt\u001b[0;37mi\u001b[0;37mc\u001b[0;30m \u001b[0;37mh\u001b[0;37mu\u001b[0;37mm\u001b[0;37ma\u001b[0;37mn\u001b[0;30m \u001b[0;37mP\u001b[0;37mr\u001b[0;37mi\u001b[0;37me\u001b[0;37ms\u001b[0;37mt\u001b[0;37m.\u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \n",
      "\u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \n",
      "\u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \n",
      "\u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \n",
      "\u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \n",
      "\u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \n",
      "\u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \n",
      "\u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \n",
      "\u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \n",
      "\u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \n",
      "\u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \n",
      "\u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \n",
      "\u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \n",
      "\u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;37m-\u001b[0;37m.\u001b[0;37m-\u001b[0;37m.\u001b[0;37m-\u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \n",
      "\u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;37m|\u001b[0;37m.\u001b[0;37m.\u001b[0;37m.\u001b[0;33m+\u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \n",
      "\u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;37m|\u001b[1;32mF\u001b[0;37m.\u001b[0;37m.\u001b[0;37m|\u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \n",
      "\u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;37m|\u001b[0;37m.\u001b[1;37m@\u001b[0;37m.\u001b[0;37m.\u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \n",
      "\u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;37m|\u001b[1;37mf\u001b[0;37m.\u001b[0;37m.\u001b[0;37m|\u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \n",
      "\u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;37m-\u001b[0;37m-\u001b[0;37m-\u001b[0;37m-\u001b[0;37m-\u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \n",
      "\u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \n",
      "\u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \n",
      "\u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \n",
      "\u001b[0;37mA\u001b[0;37mg\u001b[0;37me\u001b[0;37mn\u001b[0;37mt\u001b[0;30m \u001b[0;37mt\u001b[0;37mh\u001b[0;37me\u001b[0;30m \u001b[0;37mA\u001b[0;37ms\u001b[0;37mp\u001b[0;37mi\u001b[0;37mr\u001b[0;37ma\u001b[0;37mn\u001b[0;37mt\u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;37mS\u001b[0;37mt\u001b[0;37m:\u001b[0;37m1\u001b[0;37m2\u001b[0;30m \u001b[0;37mD\u001b[0;37mx\u001b[0;37m:\u001b[0;37m8\u001b[0;30m \u001b[0;37mC\u001b[0;37mo\u001b[0;37m:\u001b[0;37m1\u001b[0;37m4\u001b[0;30m \u001b[0;37mI\u001b[0;37mn\u001b[0;37m:\u001b[0;37m1\u001b[0;37m3\u001b[0;30m \u001b[0;37mW\u001b[0;37mi\u001b[0;37m:\u001b[0;37m1\u001b[0;37m8\u001b[0;30m \u001b[0;37mC\u001b[0;37mh\u001b[0;37m:\u001b[0;37m1\u001b[0;37m0\u001b[0;30m \u001b[0;37mC\u001b[0;37mh\u001b[0;37ma\u001b[0;37mo\u001b[0;37mt\u001b[0;37mi\u001b[0;37mc\u001b[0;30m \u001b[0;37mS\u001b[0;37m:\u001b[0;37m0\u001b[0;30m \u001b[0;30m \u001b[0;30m \n",
      "\u001b[0;37mD\u001b[0;37ml\u001b[0;37mv\u001b[0;37ml\u001b[0;37m:\u001b[0;37m1\u001b[0;30m \u001b[0;37m$\u001b[0;37m:\u001b[0;37m0\u001b[0;30m \u001b[0;37mH\u001b[0;37mP\u001b[0;37m:\u001b[0;37m1\u001b[0;37m4\u001b[0;37m(\u001b[0;37m1\u001b[0;37m4\u001b[0;37m)\u001b[0;30m \u001b[0;37mP\u001b[0;37mw\u001b[0;37m:\u001b[0;37m8\u001b[0;37m(\u001b[0;37m8\u001b[0;37m)\u001b[0;30m \u001b[0;37mA\u001b[0;37mC\u001b[0;37m:\u001b[0;37m7\u001b[0;30m \u001b[0;37mX\u001b[0;37mp\u001b[0;37m:\u001b[0;37m1\u001b[0;37m/\u001b[0;37m0\u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0;30m \u001b[0m\n"
     ]
    }
   ],
   "source": [
    "print(obs['tty_cursor'])\n",
    "env.render()"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "250d9f6a",
   "metadata": {},
   "source": [
    "# Next Steps?\n",
    "\n",
    "Included in the starter kit is a [Torchbeast](https://arxiv.org/abs/1910.03552) implementation of [IMPALA](https://arxiv.org/abs/1802.01561), a large scale distributed RL algorithm, adapted for NLE. A similar model was used in the original NLE paper to produce non-trivial learning curves for environments such as NetHackScore-v0.  \n",
    "\n",
    "In the original NLE paper, the agent architecture was as follows:\n",
    "\n",
532
    "![Model](./model.png)\n",
533
534
535
536
    "\n",
    "\n",
    "As can be seen, the model utilized both an agent centric view and a global view, which are both processed with convolutional neural network (CNN) layers. In addition, the blstats are processed with an MLP. Finally, the embeddings are passed into an LSTM to deal with partial observability. \n",
    "\n",
Eric Hambro's avatar
Eric Hambro committed
537
    "The baseline is almost identical except with one key difference - we haven't added an CNN encoder for the `message` observation. This architecture may provide a promising starting point for development, but the sky is the limit for new ideas!  Check out the [README.md](./nethack_baselines/torchbeast/README.md) to get started!"
538
539
540
541
542
543
544
545
546
547
548
549
550
551
552
553
554
555
556
557
558
559
560
561
562
563
564
565
566
567
568
569
570
571
572
573
574
575
576
577
578
579
580
581
582
   ]
  },
  {
   "cell_type": "markdown",
   "id": "af86ddfe",
   "metadata": {},
   "source": [
    "And if you want to learn more about NetHack, checkout:\n",
    "\n",
    "* [NetHackWiki](https://nethackwiki.com/wiki/Main_Page)\n",
    "* [the Beginner's Guide](https://nethackwiki.com/wiki/Why_do_I_keep_dying%3F)\n",
    "* [MIT course on NetHack](https://rec.games.roguelike.nethack.narkive.com/n31QHcTe/nethack-class-at-mit-follow-along-virtually) (yes seriously!)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "id": "1a9e9fd8",
   "metadata": {},
   "outputs": [],
   "source": []
  }
 ],
 "metadata": {
  "kernelspec": {
   "display_name": "Python 3",
   "language": "python",
   "name": "python3"
  },
  "language_info": {
   "codemirror_mode": {
    "name": "ipython",
    "version": 3
   },
   "file_extension": ".py",
   "mimetype": "text/x-python",
   "name": "python",
   "nbconvert_exporter": "python",
   "pygments_lexer": "ipython3",
   "version": "3.7.10"
  }
 },
 "nbformat": 4,
 "nbformat_minor": 5
}