Compare commits

...

167 Commits

Author SHA1 Message Date
4ad229cb37 0.0.37 2017-12-06 22:35:03 -08:00
170ee33848 bump pxt-core to 2.3.37, 2017-12-06 22:34:52 -08:00
162e437527 using icons on drop downs 2017-12-06 22:34:11 -08:00
ab13cb9047 adding a few more icons 2017-12-06 21:40:00 -08:00
80454f55c7 0.0.36 2017-12-06 16:31:06 -08:00
30e576345b more icon updates 2017-12-06 16:29:21 -08:00
dfc4c83718 resizing svg to sqaures
updates some icons
2017-12-06 16:22:31 -08:00
e25d273765 LEGO resources 2017-12-06 15:57:40 -08:00
903e98ca22 Merge pull request #70 from Microsoft/nodefaultinfrared
removing infrared from default ev3 configuration
2017-12-05 11:15:17 -08:00
8a64085288 enable language/high contrast 2017-12-05 10:53:26 -08:00
22ab1cba8d removing infrared from default ev3 configuration 2017-12-05 10:49:48 -08:00
1865ced312 Merge pull request #67 from Microsoft/note_default
Default piano note should be 1046
2017-11-30 15:41:55 -08:00
b940befe85 Default piano note should be 1046 2017-11-30 12:44:22 -08:00
c6bae5e17b missed files 2017-11-30 11:28:20 -08:00
83e4898eab Merge pull request #66 from Microsoft/gyroproject
moving gyro into separate project
2017-11-30 10:47:13 -08:00
7bdb9683c9 fixing naming 2017-11-30 10:37:59 -08:00
3c675892aa moving gyro into separate project 2017-11-30 10:34:34 -08:00
3d29c5e323 0.0.35 2017-11-30 10:16:04 -08:00
15d59269d4 bump pxt-core to 2.3.31, 2017-11-30 10:15:54 -08:00
73b5e7dc3f Merge pull request #65 from Microsoft/ultrasonicsensor
Ultrasonic/IR sensor refactoring work
2017-11-30 10:14:30 -08:00
a92edcffee adding waitUntil to buttons 2017-11-30 10:05:00 -08:00
305a650125 using threshold detector 2017-11-30 09:59:28 -08:00
34a5aeb7d2 moving IR as well 2017-11-30 09:53:43 -08:00
32f524ddd8 fixing build 2017-11-30 09:48:43 -08:00
b690c1634b updated distance detection 2017-11-30 09:41:34 -08:00
8089841892 wait until 2017-11-30 09:39:24 -08:00
3d8c697586 moving into separate project 2017-11-30 09:38:04 -08:00
e365e3d1be Merge pull request #64 from Microsoft/color-sensor
Color sensor refactoring
2017-11-30 08:55:50 -08:00
4ed41adb6a avoid conflicts of event values 2017-11-30 08:31:31 -08:00
39b7f99741 update mode selection 2017-11-30 08:20:00 -08:00
ad17191ae2 collapse reflected/ambient blocks 2017-11-29 22:47:17 -08:00
4a8633f506 updated descriptions 2017-11-29 22:11:59 -08:00
3690f409b0 docs skeleton 2017-11-29 22:09:12 -08:00
97663d2b83 updated naming 2017-11-29 21:57:05 -08:00
4d2b7ced71 moving color sensor to separate project 2017-11-29 21:41:00 -08:00
5676103052 Merge pull request #63 from Microsoft/speedispower
use speed when setting power
2017-11-29 21:22:32 -08:00
cb8c14fbb1 Allow waitForEvent on main thread; fixes #60
also use target_panic() instead of assert
2017-11-29 19:54:17 -03:00
815d438d86 use speed when setting power 2017-11-29 00:04:54 -08:00
da8de1e31e Merge pull request #56 from Microsoft/note 2017-11-28 17:00:57 -08:00
b028916025 Increment pxt-core and pxt-common-packages dependencies 2017-11-28 16:48:16 -08:00
b9be74bad8 Merge pull request #59 from Microsoft/touch
adding touch button examples
2017-11-28 16:35:48 -08:00
7e502b1749 adding bare docs 2017-11-28 16:24:22 -08:00
f22edac84d moving touch stuff into separate projects 2017-11-28 16:11:15 -08:00
ef2807a84e Fill in real min and max 2017-11-28 16:04:25 -08:00
580b40876c fixing bumped 2017-11-28 16:02:04 -08:00
b57ae5d588 implement wasPressed 2017-11-28 15:33:43 -08:00
71479d0caa adding touch button examples 2017-11-28 15:23:54 -08:00
7e39cdde9d Add a todo 2017-11-27 17:21:32 -08:00
85ca6b3698 Support for new data structure 2017-11-27 14:12:04 -08:00
2c89848fda More 2017-11-21 17:11:11 -08:00
ed1c187514 Initial work 2017-11-21 11:35:53 -08:00
52816e6de7 Merge pull request #51 from Microsoft/debugging
Add debug function
2017-11-20 10:54:44 -08:00
60ac3a9d00 0.0.34 2017-11-18 07:37:59 -08:00
d2c7a5ace0 support for wait/when 2017-11-18 07:37:46 -08:00
79fcd1c01e 0.0.33 2017-11-18 07:34:50 -08:00
2d48725c63 bump pxt-core to 2.3.28, bump pxt-common-packages to 0.14.3, 2017-11-18 07:34:40 -08:00
802c3db0ba 0.0.32 2017-11-17 14:12:32 -08:00
4a7e8c5fa8 adding block for sounds 2017-11-16 23:28:44 -08:00
0ebffd8549 0.0.31 2017-11-16 22:55:51 -08:00
988a2b638b add icon 2017-11-16 22:52:29 -08:00
fb743dea74 Merge pull request #50 from Microsoft/icons
Icons in blocks
2017-11-16 22:48:35 -08:00
e400637ba1 Merge branch 'master' into icons 2017-11-16 22:47:40 -08:00
b2768b1099 added showimage 2017-11-16 22:46:51 -08:00
3a5885b28e 0.0.30 2017-11-16 22:25:36 -08:00
b602b52f7d bump pxt-core to 2.3.27, 2017-11-16 22:25:26 -08:00
90afb60cc4 bump pxt-core to 2.3.26, bump pxt-common-packages to 0.14.2, 2017-11-16 22:04:29 -08:00
c936c16c33 more icons 2017-11-16 22:03:43 -08:00
ead69e3c6e Add debug function 2017-11-16 16:28:10 -08:00
d100026d5c more icons 2017-11-16 13:05:50 -08:00
41c2899feb more icons 2017-11-16 13:03:15 -08:00
9437873427 more images 2017-11-16 12:58:37 -08:00
dab281a9cb including a few icons in block names 2017-11-16 12:41:47 -08:00
f27fb4d93c 0.0.29 2017-11-09 10:29:24 -08:00
11fb82eba9 Merge pull request #49 from Microsoft/updatepxt
Update pxt
2017-11-09 19:28:55 +01:00
170e6b700b updating to latest pxt 2017-11-09 10:24:12 -08:00
387ad763f8 bump pxt-core to 2.3.19, bump pxt-common-packages to 0.12.17, 2017-11-09 10:14:47 -08:00
0e61f162bb Fix style to match latest changes in master. 2017-10-31 11:27:18 -07:00
400f01a6be fixing duplicate block id 2017-10-31 09:42:53 -07:00
afcbe69c44 0.0.28 2017-10-31 09:04:27 -07:00
9165fe09fc bump pxt-core to 2.3.6, 2017-10-31 09:04:20 -07:00
08f36fbb94 Merge pull request #30 from Microsoft/jres
Import images and sounds from ev3 EDU
2017-10-31 16:48:24 +01:00
afca2aa4d1 Merge pull request #45 from Microsoft/motorsrename
API tinkering
2017-10-31 16:43:27 +01:00
3c6c766412 removing lego resources 2017-10-30 21:54:23 -07:00
329a1e15ea simplified IR API 2017-10-30 21:39:50 -07:00
16a025f3a0 simplified motor API 2017-10-30 21:29:18 -07:00
26b975b5f2 images 2017-10-30 14:51:14 -07:00
79b9bce904 Merge branch 'master' into jres 2017-10-30 13:29:45 -07:00
d3d9fa6ca0 Merge branch 'master' into jres 2017-10-30 13:29:16 -07:00
8f5c930f76 Update UI to latest. 2017-10-30 13:21:03 -07:00
a082807455 Fix locking in waitForEvent() and sample playing 2017-10-30 19:18:01 +00:00
3469f51b7b Don't need to use freshcoat branch of pxt (#31) 2017-10-30 19:06:49 +00:00
e8e31e6aa7 Fix brick.print() 2017-10-30 19:03:45 +00:00
2df90152fe Remove debug output 2017-10-30 18:56:03 +00:00
e25590539e Add sample-playing code 2017-10-30 18:55:23 +00:00
a7795302fc Make it compile with master 2017-10-30 18:54:53 +00:00
480d89ba8e Added swift stuff 2017-10-30 11:46:06 -07:00
9487d324fd added link to gitlab 2017-10-30 11:45:02 -07:00
bfc95e075e Merge branch 'master' into jres 2017-10-30 18:48:18 +01:00
7d4ba9b2b2 0.0.27 2017-10-30 10:47:03 -07:00
71b83040e6 bump pxt-core to 2.3.5, bump pxt-common-packages to 0.12.4, 2017-10-30 10:46:56 -07:00
1976534da0 Merge pull request #28 from Microsoft/sensorscat
Aligning categories with LabView/RobotC
2017-10-30 18:46:27 +01:00
ebbbe6e86c Add sounds (only simulator for now) 2017-10-30 17:25:58 +00:00
c4a9b4a381 updated brick color 2017-10-30 09:58:00 -07:00
c7d36a5e82 moving motors up 2017-10-30 09:55:36 -07:00
c8c45be057 fixing brick groups 2017-10-30 09:51:18 -07:00
a8a7267851 Add LEGO EDU images 2017-10-30 15:34:47 +00:00
9cdb4081fd Add PNG decompressor in SIM 2017-10-30 14:42:08 +00:00
dcb398d3d5 Rename Icon to Image 2017-10-30 13:28:01 +00:00
f6e350cf9f Add separate type for Icons (same repr as buffer) 2017-10-30 13:04:12 +00:00
c085094394 Add screen::unpackPNG() 2017-10-30 12:45:37 +00:00
7c2ea7c406 fixing more groups 2017-10-28 09:20:34 -07:00
84b98a2788 brick namespace 2017-10-28 09:13:02 -07:00
4e99cd3ef1 0.0.26 2017-10-27 19:23:01 +01:00
57647318c4 Sensor fixes 2017-10-27 19:18:56 +01:00
2720698864 Fix infinite loop 2017-10-27 19:18:47 +01:00
dfe2fe3cff brick refactoring 2017-10-27 11:05:04 -07:00
18fefa2a44 output -> motors 2017-10-27 11:01:11 -07:00
c0bab4877a Merge branch 'master' of github.com:Microsoft/pxt-ev3 2017-10-27 15:17:24 +01:00
d2a1d10ada Add converter from RGF to PNG 2017-10-27 15:17:21 +01:00
bcb68d937d Merge branch 'master' of https://github.com/microsoft/pxt-ev3 2017-10-27 02:52:47 -07:00
05a8395028 stop all motors 2017-10-27 02:52:42 -07:00
3a1601a419 Add rsf2wav.js 2017-10-27 10:42:33 +01:00
712c2178d2 simplify motor API 2017-10-27 01:47:25 -07:00
12cdad72c8 added puppet 2017-10-27 00:13:51 -07:00
95076f8f24 differentiate large/medium motors 2017-10-27 00:09:00 -07:00
6391620373 added 2 more activities 2017-10-26 23:58:34 -07:00
86212e2153 added sound of color 2017-10-26 23:46:55 -07:00
98e430f3c1 added example of converted lesson 2017-10-26 22:19:16 -07:00
5c7e856e7b removed incorrect buy link 2017-10-26 21:57:48 -07:00
a47988913e 0.0.25 2017-10-26 21:27:51 -07:00
ea72dba6c7 Merge pull request #17 from Microsoft/irevents
Ultrasonic + IR events + Remote events
2017-10-27 06:25:02 +02:00
215e846a54 refactored remote button 2017-10-26 21:10:37 -07:00
21b34cb459 simplified events 2017-10-26 20:57:18 -07:00
282134f5dc refactoring IR 2017-10-26 20:51:13 -07:00
6b44352839 event for ultrasonic module 2017-10-26 20:38:17 -07:00
9a883d5672 Merge branch 'master' into irevents 2017-10-26 20:21:06 -07:00
59ce4338d3 renaming IR events 2017-10-26 20:20:24 -07:00
90560050b8 Merge pull request #16 from Microsoft/fonts
Mounting events on various sensors
2017-10-27 05:19:36 +02:00
2c72173bfe Use the _query() infrastructure for polling 2017-10-25 13:34:05 +02:00
1a5992408b added event for color changes 2017-10-24 23:10:27 -07:00
0e1a3b7e6b adding setpixel 2017-10-24 22:05:24 -07:00
ea6bfa03bd touched -> pressed 2017-10-24 21:55:37 -07:00
20d584db2b 0.0.24 2017-10-24 21:18:16 -07:00
0e4e0d8899 0.0.23 2017-10-24 21:09:56 -07:00
a18a690417 Merge pull request #12 from Microsoft/motors
Converting motors to fixed instances
2017-10-25 06:09:27 +02:00
c9d57c5e8d enabling banner 2017-10-24 21:08:02 -07:00
7e9d42a571 reset motors on start 2017-10-24 20:28:31 -07:00
1b51320edb pausing while running motor 2017-10-24 20:20:07 -07:00
4f44238237 use fixed instances for motors 2017-10-24 20:16:33 -07:00
c8ffa0ded7 fixed test 2017-10-24 18:49:15 -07:00
6b07d5f716 0.0.22 2017-10-24 18:48:30 -07:00
8784e23b60 fixed build link 2017-10-24 17:01:36 -07:00
4b8409fbc0 0.0.21 2017-10-24 16:56:52 -07:00
3237978cba Merge pull request #4 from Microsoft/blockupdate
Blocks update
2017-10-24 16:56:32 -07:00
33c8902050 aligning groups with hardware name components 2017-10-24 16:52:13 -07:00
fa6c81cf80 buttons -> brick buttons 2017-10-24 16:25:03 -07:00
46175fc7db separating touch sensor stuff 2017-10-24 15:58:47 -07:00
e6ef86101f more renaming 2017-10-24 15:37:48 -07:00
c4d3d7634e fixed naming of sonar 2017-10-24 15:35:42 -07:00
b0380fbef8 more annotations 2017-10-24 15:33:28 -07:00
c85c68ab68 fixing color / gyro 2017-10-24 15:22:07 -07:00
334d5aca9a on/off field editors on motors 2017-10-24 15:03:21 -07:00
1330a0fb82 fixed gyro def 2017-10-24 14:54:36 -07:00
005447ce44 4 times more sensors\! 2017-10-24 19:58:52 +01:00
60d5271de2 Merge branch 'master' into blockupdate 2017-10-24 10:02:27 -07:00
5d5d78ced0 compiled strings 2017-10-24 09:47:30 -07:00
fe46461c4c adding a few more blocks 2017-10-24 05:30:05 -07:00
140 changed files with 8494 additions and 893 deletions

1
.gitignore vendored
View File

@ -31,3 +31,4 @@ videos/**
lib/
.vscode/
bin
scripts/out.*

View File

@ -1,9 +1,11 @@
# LEGO Mindstorms EV3 target for PXT
[![Build Status](https://ci2.dot.net/buildStatus/icon?job=Private/pxt_project_pink/master/pxt-ev3_Push)](https://ci2.dot.net/job/Private/job/pxt_project_pink/job/master/job/pxt-ev3_Push/)
[![Build Status](https://ci2.dot.net/buildStatus/icon?job=Private/pxt_project_rainbow/master/pxt-ev3_Push)](https://ci2.dot.net/job/Private/job/pxt_project_rainbow/job/master/job/pxt-ev3_Push/)
This repo contains the editor target hosted at https://d541eec2-1e96-4b7b-a223-da9d01d0337a.pxt.io/
Issue tracker: https://src.education.lego.com/groups/ev3-makecode
## Local Dev setup
These instructions assume familiarity with dev tools and languages.
@ -14,7 +16,7 @@ These instructions assume familiarity with dev tools and languages.
In a common folder,
* clone https://github.com/Microsoft/pxt to ``pxt`` folder (currently, build against `freshcoat` branch)
* clone https://github.com/Microsoft/pxt to ``pxt`` folder
* clone https://github.com/Microsoft/pxt-common-packages to ``pxt-common-packages`` folder
* clone https://github.com/Microsoft/pxt-ev3 to ``pxt-ev3`` folder
* go to ``pxt`` and run

View File

@ -4,5 +4,12 @@ Here are some fun programs for your @boardname@!
## Fun stuff
Coming soon.
```codecard
[
{
"name": "Happy unhappy",
"description": "Keep your brick entertained and happy",
"url":"/examples/happy-unhappy",
"cardType": "example"
}]
```

View File

@ -0,0 +1,12 @@
# Happy unhappy
Use a touch sensor to make the brick happy.
```blocks
sensors.touchSensor1.onEvent(TouchSensorEvent.Pressed, function () {
brick.showImage(images.expressionsBigSmile)
})
sensors.touchSensor1.onEvent(TouchSensorEvent.Released, function () {
brick.showImage(images.expressionsSick)
})
```

47
docs/maker.md Normal file
View File

@ -0,0 +1,47 @@
# Maker Activites
These six activities require the LEGO® MINDSTORMS® Education EV3 Core Set (45544). Supporting materials for teachers and middle school students are provided, offering everything teachers and students need to explore their inner makers as they follow the design process to solve open-ended, themed challenges...
* [Download Curriculum Materials](https://education.lego.com/en-us/downloads/mindstorms-ev3)
## Activites
```codecard
[
{
"name": "Sound Machine",
"description": "Create instruments with your EV3 Brick!",
"url":"/maker/sound-machine",
"cardType": "example",
"imageUrl": "/static/maker/sound-machine.png"
},
{
"name": "Sound Of Color",
"description": "Play different sounds based on the color",
"url":"/maker/sound-of-color",
"cardType": "example",
"imageUrl": "/static/maker/sound-of-color.png"
},
{
"name": "Security Gadget",
"description": "Raise the alarm when your brick is lifted!",
"url":"/maker/security-gadget",
"cardType": "example",
"imageUrl": "/static/maker/security-gadget.png"
},
{
"name": "Intruder Detector",
"description": "Raise the alarm when an intruder sneaks in",
"url":"/maker/intruder-detector",
"cardType": "example",
"imageUrl": "/static/maker/intruder-detector.png"
},
{
"name": "Puppet",
"description": "Build an automated puppet",
"url":"/maker/puppet",
"cardType": "example",
"imageUrl": "/static/maker/puppet.png"
}
]
```

View File

@ -0,0 +1,11 @@
# Intruder Detector
This program will activate an alarm when an object moves in front of the Ultrasonic Sensor.
TODO support for event when value changes
```blocks
input.ultrasonic4.onObjectNear(function () {
music.playSoundUntilDone(music.sounds(Sounds.PowerUp))
})
```

17
docs/maker/puppet.md Normal file
View File

@ -0,0 +1,17 @@
# Puppet
Use this program with the Programmable Brick and Large Motor.
```blocks
loops.forever(function () {
output.largeMotorA.setPower(30)
output.largeMotorA.on(true)
loops.pause(100)
output.largeMotorA.on(false)
music.playSoundUntilDone(music.sounds(Sounds.PowerUp))
output.largeMotorA.setPower(-30)
output.largeMotorA.on(true)
loops.pause(100)
output.largeMotorA.on(false)
})
```

View File

@ -0,0 +1,9 @@
# Security Gadget
This program will activate an alarm when an object is lifted from the Touch Sensor.
```blocks
input.touchSensor1.onEvent(TouchSensorEvent.Released, function () {
music.playSoundUntilDone(music.sounds(Sounds.PowerUp))
})
```

View File

@ -0,0 +1,12 @@
# Sound Machine
This example program combined with the small model will make a beat and rhythm on any surface when the program is run.
```blocks
loops.forever(function () {
output.motorA.on(50)
loops.pause(200)
output.motorA.on(100)
loops.pause(200)
})
```

View File

@ -0,0 +1,15 @@
# Sound Of Color
This program will play different sounds when the wheel is rotated. The sound is determined by which color is placed in front of the color Sensor.
```blocks
input.color3.onColorDetected(ColorSensorColor.Blue, function () {
music.playTone(Note.G4, music.beat(BeatFraction.Half))
})
input.color3.onColorDetected(ColorSensorColor.Red, function () {
music.playTone(Note.C5, music.beat(BeatFraction.Half))
})
input.color3.onColorDetected(ColorSensorColor.Green, function () {
music.playTone(Note.D5, music.beat(BeatFraction.Half))
})
```

View File

@ -1,3 +1,8 @@
# Reference
TODO
## See Also
[touch sensor](/reference/sensors/touch-sensor),
[color sensor](/reference/sensors/color-sensor)

BIN
docs/static/hero.png vendored Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 40 KiB

BIN
docs/static/maker/intruder-detector.png vendored Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 96 KiB

BIN
docs/static/maker/puppet.png vendored Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 377 KiB

BIN
docs/static/maker/security-gadget.png vendored Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 38 KiB

BIN
docs/static/maker/sound-machine.png vendored Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 141 KiB

BIN
docs/static/maker/sound-of-color.png vendored Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 159 KiB

View File

@ -9,6 +9,13 @@ eval("if (typeof process === 'object' && process + '' === '[object process]') px
namespace pxt.editor {
import UF2 = pxtc.UF2;
export let ev3: Ev3Wrapper
export function debug() {
return initAsync()
.then(w => w.downloadFileAsync("/tmp/dmesg.txt", v => console.log(pxt.Util.uint8ArrayToString(v))))
}
// this comes from aux/pxt.lms
const rbfTemplate = `
4c45474f580000006d000100000000001c000000000000000e000000821b038405018130813e8053
@ -19,6 +26,7 @@ namespace pxt.editor {
return pxt.HF2.mkPacketIOAsync()
.then(h => {
let w = new Ev3Wrapper(h)
ev3 = w
return w.reconnectAsync(true)
.then(() => w)
})

View File

@ -252,6 +252,13 @@ namespace pxt.editor {
return loop()
}
downloadFileAsync(path: string, cb: (d: Uint8Array) => void) {
return this.lock.enqueue("file", () =>
this.streamFileOnceAsync(path, cb))
}
private initAsync() {
return Promise.resolve()
}

View File

@ -0,0 +1,73 @@
# Functions for measuring in Swift Playgrounds "EV3 Animal Rescue" (Miranda)
## Sensors
* Ultrasonic (cm, inches)
* Gyro (angle, rate)
* Reset Gyro
* Touch (count, on/off)
* Light (color, reflection, ambience)
* IR (proximity, seek)
## Motor Sensors
* Motor (degrees, rotations, power)
#### Wait for
All sensor methods have a `waitFor` version that waits for the sensor value to be >= or <=. We don't use '=' equality because it is non-sensical for floating point data.
All sensors also have a `waitForIncrease`, `waitForDecrease` version.
------------------------
# Output Functions
* Move tank ( for seconds, for degrees, for rotations, indefinitely )
* Stop Move (stops 2 motors)
* Motor off
* Motor on (for seconds, for degrees, for rotations, indefinitely)
* Reset motor (resets all counters related to the motor)
# Brick Functions
* Brick light on (color + mode: flashing, on, or pulsating)
* Brick light off
* Play sound (wait for completion, play once, play repeating)
- Parameters:
- file: Takes an input conforming to enum `SoundFile`. One of the following:
- `.hello`
- `.goodbye`
- `.fanfare`
- `.errorAlarm`
- `.start`
- `.stop`
- `.object`
- `.ouch`
- `.blip`
- `.arm`
- `.snap`
- `.laser`
* Play sound frequency (for seconds, can either wait for completion or continue while playing)
* Play sound note (in range `C4-D#9`) (for seconds, can either wait for completion or continue while playing)
* Stopsound (stops all sounds playing)
* Wait for seconds
* Display text
* Display text at `(x,y)` with color`(black, white)`, font`(bold, normal, large)` with option to clear screen
* Display line from `(x1,y1)` to `(x2,y2)` with color `(black, white)` option to clear screen
* Display rectangle at `(x,y)` with `(width, height)`, with fill or no fill, with color `(black, white)`, option to clear screen
* Display image at `(x,y)`, option to clear screen.
takes an input conforming to enum `ImageName`. One of the following:
- `.neutral`
- `.pinchRight`
- `.awake`
- `.hurt`
- `.accept`
- `.decline`
- `.questionMark`
- `.warning`
- `.stop`
- `.pirate`
- `.boom`
- `.ev3Icon`

1370
legoresources/RobotAPI.swift Normal file

File diff suppressed because it is too large Load Diff

BIN
legoresources/SVGassets/.DS_Store vendored Normal file

Binary file not shown.

View File

@ -0,0 +1,246 @@
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<svg
xmlns:dc="http://purl.org/dc/elements/1.1/"
xmlns:cc="http://creativecommons.org/ns#"
xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
xmlns:svg="http://www.w3.org/2000/svg"
xmlns="http://www.w3.org/2000/svg"
xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
viewBox="1925.358 6183.438 36.101 36.101003"
version="1.1"
id="svg41"
sodipodi:docname="Color Sensor.svg"
inkscape:export-filename="C:\gh\pxt-ev3\libs\core\jres\icons\colorSensor-icon.png"
inkscape:export-xdpi="319.10471"
inkscape:export-ydpi="319.10471"
width="36.101002"
height="36.101002"
inkscape:version="0.92.1 r15371">
<metadata
id="metadata45">
<rdf:RDF>
<cc:Work
rdf:about="">
<dc:format>image/svg+xml</dc:format>
<dc:type
rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
<dc:title></dc:title>
</cc:Work>
</rdf:RDF>
</metadata>
<sodipodi:namedview
pagecolor="#ffffff"
bordercolor="#666666"
borderopacity="1"
objecttolerance="10"
gridtolerance="10"
guidetolerance="10"
inkscape:pageopacity="0"
inkscape:pageshadow="2"
inkscape:window-width="1920"
inkscape:window-height="1137"
id="namedview43"
showgrid="false"
inkscape:zoom="7.072009"
inkscape:cx="18.050501"
inkscape:cy="16.685499"
inkscape:window-x="-8"
inkscape:window-y="-8"
inkscape:window-maximized="1"
inkscape:current-layer="svg41" />
<defs
id="defs22">
<style
id="style2">
.cls-1 {
fill: #a8a9a8;
}
.cls-2 {
clip-path: url(#clip-path);
}
.cls-3 {
fill: url(#linear-gradient);
}
.cls-4 {
fill: #b72b1c;
}
.cls-5 {
fill: #f2f2f2;
}
.cls-6 {
filter: url(#Path_1);
}
</style>
<clipPath
id="clip-path">
<path
id="Union_5"
data-name="Union 5"
class="cls-1"
d="m 3.907,33.37 c -1.069,0 -1.935,-0.617 -1.935,-1.377 V 27.606 H 0.758 A 0.758,0.758 0 0 1 0,26.848 V 7.129 A 0.758,0.758 0 0 1 0.758,6.371 H 1.972 V 1.377 C 1.972,0.617 2.838,0 3.907,0 h 28.287 c 1.069,0 1.935,0.617 1.935,1.377 v 4.994 h 1.213 a 0.758,0.758 0 0 1 0.759,0.758 v 19.719 a 0.758,0.758 0 0 1 -0.759,0.758 h -1.213 v 4.387 c 0,0.761 -0.867,1.377 -1.935,1.377 z"
inkscape:connector-curvature="0"
style="fill:#a8a9a8" />
</clipPath>
<linearGradient
id="linear-gradient"
x1="16.378942"
y1="29.514856"
x2="16.378942"
y2="34.98542"
gradientUnits="userSpaceOnUse"
gradientTransform="scale(0.98165674,1.018686)">
<stop
offset="0"
stop-color="#a8a9a8"
id="stop6" />
<stop
offset="1"
stop-color="#545554"
id="stop8" />
</linearGradient>
<filter
id="Path_1"
x="1918.33"
y="6177.438"
width="50.157001"
height="51.370998"
filterUnits="userSpaceOnUse">
<feOffset
dy="3"
input="SourceAlpha"
id="feOffset11" />
<feGaussianBlur
stdDeviation="3"
result="blur"
id="feGaussianBlur13" />
<feFlood
flood-opacity="0.502"
id="feFlood15" />
<feComposite
operator="in"
in2="blur"
id="feComposite17"
result="result1" />
<feComposite
in="SourceGraphic"
in2="result1"
id="feComposite19" />
</filter>
</defs>
<g
id="Color_Sensor"
data-name="Color Sensor"
transform="translate(1346,5555.3645)">
<g
id="Mask_Group_5"
data-name="Mask Group 5"
class="cls-2"
transform="translate(579.358,629.439)"
clip-path="url(#clip-path)">
<g
id="Group_4"
data-name="Group 4">
<g
id="Group_2"
data-name="Group 2">
<path
id="Path_28"
data-name="Path 28"
class="cls-1"
d="M 0.758,0 H 35.342 A 0.758,0.758 0 0 1 36.1,0.758 v 19.719 a 0.758,0.758 0 0 1 -0.758,0.758 H 0.758 A 0.758,0.758 0 0 1 0,20.477 V 0.758 A 0.758,0.758 0 0 1 0.758,0 Z"
transform="translate(0,6.371)"
inkscape:connector-curvature="0"
style="fill:#a8a9a8" />
<g
class="cls-6"
transform="translate(-1925.36,-6183.44)"
id="g26"
style="filter:url(#Path_1)">
<path
id="Path_1-2"
data-name="Path 1"
class="cls-3"
d="m 1.935,0 h 28.287 c 1.069,0 1.935,0.617 1.935,1.377 v 30.616 c 0,0.761 -0.866,1.377 -1.935,1.377 H 1.935 C 0.866,33.371 0,32.754 0,31.993 V 1.377 C 0,0.617 0.866,0 1.935,0 Z"
transform="translate(1927.33,6183.44)"
inkscape:connector-curvature="0"
style="fill:url(#linear-gradient)" />
</g>
<rect
id="Rectangle_2"
data-name="Rectangle 2"
width="0.75800002"
height="6.0669999"
transform="translate(34.584,9.404)"
x="0"
y="0" />
<rect
id="Rectangle_5"
data-name="Rectangle 5"
width="0.75800002"
height="6.0669999"
transform="translate(0.91,9.404)"
x="0"
y="0" />
<rect
id="Rectangle_3"
data-name="Rectangle 3"
width="0.75800002"
height="6.0669999"
transform="translate(34.584,18.05)"
x="0"
y="0" />
<rect
id="Rectangle_4"
data-name="Rectangle 4"
width="0.75800002"
height="6.0669999"
transform="translate(0.91,18.05)"
x="0"
y="0" />
</g>
<path
id="Union_1"
data-name="Union 1"
class="cls-4"
d="m 2.579,17.747 a 7,7 0 0 1 0.16,-1.494 9.556,9.556 0 1 1 13.634,0 6.978,6.978 0 1 1 -13.794,1.494 z"
transform="translate(8.494,4.096)"
inkscape:connector-curvature="0"
style="fill:#b72b1c" />
<path
id="Union_2"
data-name="Union 2"
d="M 2.67,16.308 A 5.374,5.374 0 0 1 3.042,14.337 8.039,8.039 0 1 1 13.064,14.315 5.388,5.388 0 1 1 2.67,16.308 Z"
transform="translate(10.011,5.534)"
inkscape:connector-curvature="0" />
<g
id="Group_3"
data-name="Group 3"
transform="translate(14.41,10.163)">
<circle
id="Ellipse_5"
data-name="Ellipse 5"
class="cls-5"
cx="3.6400001"
cy="3.6400001"
r="3.6400001"
style="fill:#f2f2f2" />
<circle
id="Ellipse_6"
data-name="Ellipse 6"
class="cls-5"
cx="1.972"
cy="1.972"
transform="translate(1.669,9.556)"
r="1.972"
style="fill:#f2f2f2" />
</g>
</g>
</g>
</g>
</svg>

After

Width:  |  Height:  |  Size: 7.2 KiB

View File

@ -0,0 +1,146 @@
<svg xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" viewBox="1549 6115.496 110.729 170.038">
<defs>
<style>
.cls-1 {
fill: url(#linear-gradient);
}
.cls-2 {
fill: #f2f2f2;
}
.cls-3 {
fill: url(#linear-gradient-2);
}
.cls-4 {
fill: #3c3c3c;
}
.cls-5 {
fill: #a0b5a6;
}
.cls-6 {
fill: url(#linear-gradient-3);
}
.cls-7 {
fill: #6a6a6a;
}
.cls-8 {
fill: url(#linear-gradient-4);
}
.cls-9 {
fill: #a8a9a8;
}
.cls-10 {
fill: #9a9a9a;
}
.cls-11 {
fill: url(#linear-gradient-5);
}
.cls-12 {
fill: gray;
}
.cls-13 {
fill: #fff;
}
.cls-14 {
clip-path: url(#clip-path);
}
.cls-15 {
fill: #ffed00;
}
.cls-16 {
fill: #b72b1c;
}
.cls-17 {
fill: #1d1d1b;
}
</style>
<linearGradient id="linear-gradient" x1="0.5" y1="0.942" x2="0.5" y2="1.018" gradientUnits="objectBoundingBox">
<stop offset="0" stop-color="#f2f2f2"/>
<stop offset="1" stop-color="#797979"/>
</linearGradient>
<linearGradient id="linear-gradient-2" x1="0.5" y1="0.924" x2="0.5" y2="0.948" gradientUnits="objectBoundingBox">
<stop offset="0" stop-color="#a8a9a8"/>
<stop offset="1" stop-color="gray"/>
</linearGradient>
<linearGradient id="linear-gradient-3" x1="0.5" y1="0.807" x2="0.5" y2="1" gradientUnits="objectBoundingBox">
<stop offset="0" stop-color="#a8a9a8"/>
<stop offset="1" stop-color="#545554"/>
</linearGradient>
<linearGradient id="linear-gradient-4" x1="0.5" y1="0.948" x2="0.5" y2="0.059" gradientUnits="objectBoundingBox">
<stop offset="0" stop-color="#6a6a6a"/>
<stop offset="0.522" stop-color="#8ce300"/>
<stop offset="1" stop-color="#6a6a6a"/>
</linearGradient>
<linearGradient id="linear-gradient-5" x1="0.5" y1="0.363" x2="0.5" gradientUnits="objectBoundingBox">
<stop offset="0" stop-color="#747474"/>
<stop offset="1" stop-color="#3c3c3c"/>
</linearGradient>
<clipPath id="clip-path">
<rect id="Rectangle_32" data-name="Rectangle 32" width="12.383" height="12.383"/>
</clipPath>
</defs>
<g id="EV3" transform="translate(1346 5554)">
<g id="brick" transform="translate(203 561.496)">
<path id="Path_19" data-name="Path 19" class="cls-1" d="M1.972,0H108.758a1.972,1.972,0,0,1,1.972,1.972V104.965a1.972,1.972,0,0,1-1.972,1.972H1.972A1.972,1.972,0,0,1,0,104.965V1.972A1.972,1.972,0,0,1,1.972,0Z" transform="translate(0 31.702)"/>
<path id="Path_20" data-name="Path 20" class="cls-2" d="M1.972,0H96.319a1.972,1.972,0,0,1,1.972,1.972V40.5a1.972,1.972,0,0,1-1.972,1.972H1.972A1.972,1.972,0,0,1,0,40.5V1.972A1.972,1.972,0,0,1,1.972,0Z" transform="translate(6.219 127.566)"/>
<path id="Path_18" data-name="Path 18" class="cls-3" d="M1.972,0H98.14a1.972,1.972,0,0,1,1.972,1.972V77.207a1.972,1.972,0,0,1-1.972,1.972H1.972A1.972,1.972,0,0,1,0,77.207V1.972A1.972,1.972,0,0,1,1.972,0Z" transform="translate(5.309)"/>
<path id="Path_17" data-name="Path 17" class="cls-4" d="M3.792,0H78.269a3.792,3.792,0,0,1,3.792,3.792V45.657a3.792,3.792,0,0,1-3.792,3.792H3.792A3.792,3.792,0,0,1,0,45.657V3.792A3.792,3.792,0,0,1,3.792,0Z" transform="translate(14.41 10.466)"/>
<path id="Path_16" data-name="Path 16" class="cls-5" d="M2.73,0H65.983a2.73,2.73,0,0,1,2.73,2.73V43.078a2.73,2.73,0,0,1-2.73,2.73H2.73A2.73,2.73,0,0,1,0,43.078V2.73A2.73,2.73,0,0,1,2.73,0Z" transform="translate(21.236 12.438)"/>
<path id="Path_21" data-name="Path 21" class="cls-6" d="M0,0H98.291V21.387a1.972,1.972,0,0,1-1.972,1.972H1.972A1.972,1.972,0,0,1,0,21.387Z" transform="translate(6.219 146.679)"/>
</g>
<g id="buttons" transform="translate(216.197 621.259)">
<path id="Union_4" data-name="Union 4" class="cls-7" d="M25.938,48.842c-5.585-5.391-14.259-14.258-14.259-14.258V32.764H8.267a8.266,8.266,0,1,1,0-16.533h3.413V14.41L25.786,0H39.893C46.282,6.511,54,14.107,54,14.107v2.124h3.261a8.266,8.266,0,0,1,0,16.533H54v1.821c-7.514,7.729-13.955,14.258-13.955,14.258Z" transform="translate(9.556 25.331)"/>
<path id="light" class="cls-8" d="M25.938,48.842c-5.585-5.391-14.259-14.258-14.259-14.258V32.764H8.267a8.266,8.266,0,1,1,0-16.533h3.413V14.41L25.787,0H39.893C46.282,6.511,54,14.107,54,14.107v2.124h3.261a8.266,8.266,0,0,1,0,16.533H54v1.821c-7.514,7.729-13.955,14.258-13.955,14.258Z" transform="translate(9.556 25.331)"/>
<path id="Rectangle_23" data-name="Rectangle 23" class="cls-9" d="M6.143,0h10.39a0,0,0,0,1,0,0V12.286a0,0,0,0,1,0,0H6.143A6.143,6.143,0,0,1,0,6.143v0A6.143,6.143,0,0,1,6.143,0Z" transform="translate(11.528 43.533)"/>
<path id="Rectangle_24" data-name="Rectangle 24" class="cls-9" d="M6.143,0h10.39a0,0,0,0,1,0,0V12.286a0,0,0,0,1,0,0H6.143A6.143,6.143,0,0,1,0,6.143v0A6.143,6.143,0,0,1,6.143,0Z" transform="translate(72.96 55.82) rotate(180)"/>
<path id="Path_42" data-name="Path 42" class="cls-4" d="M.455,0H12.438a.455.455,0,0,1,.455.455V11.831a.455.455,0,0,1-.455.455H.455A.455.455,0,0,1,0,11.831V.455A.455.455,0,0,1,.455,0Z" transform="translate(35.797 43.533)"/>
<path id="Path_15" data-name="Path 15" class="cls-9" d="M-98.892-1598.849l12.741-.152,9.556,9.859-3.944,3.944v7.129h-3.64v-4.1a3.058,3.058,0,0,0-3.034-3.034c-2.961-.047-11.073,0-11.073,0a2.468,2.468,0,0,0-2.579,2.578v4.551h-3.64v-7.129l-3.944-3.944Z" transform="translate(134.841 1626.455)"/>
<path id="Path_16-2" data-name="Path 16" class="cls-9" d="M9.624.095,22.286,0l9.582,9.851-4,3.907v7.17h-3.6V16.815a3.065,3.065,0,0,0-3.026-3.058c-2.961-.047-11.011,0-11.011,0a2.6,2.6,0,0,0-2.65,2.65v4.521H3.907v-7.17L0,9.851Z" transform="translate(58.26 71.876) rotate(180)"/>
<rect id="Rectangle_26" data-name="Rectangle 26" class="cls-4" width="3.034" height="13.803" transform="translate(40.803)"/>
<rect id="Rectangle_10" data-name="Rectangle 10" class="cls-10" width="3.034" height="6.067" transform="translate(40.803 13.197)"/>
<rect id="Rectangle_12" data-name="Rectangle 12" class="cls-11" width="3.034" height="6.219" transform="translate(40.803 13.197)"/>
<rect id="Rectangle_11" data-name="Rectangle 11" class="cls-12" width="3.034" height="5.916" transform="translate(40.803 19.416)"/>
<path id="Path_15-2" data-name="Path 15" class="cls-9" d="M0,0H23.663V5.714c-2.618,2.638-5.976,5.965-5.976,5.965H1.972A1.972,1.972,0,0,1,0,9.708Z" transform="translate(0 19.416)"/>
</g>
<g id="LEGO_logo" data-name="LEGO logo" transform="translate(289.475 711.071)">
<rect id="Rectangle_31" data-name="Rectangle 31" class="cls-13" width="12.208" height="12.208" transform="translate(0.087 0.087)"/>
<g id="Group_15" data-name="Group 15">
<g id="Group_10" data-name="Group 10" class="cls-14">
<path id="Path_18-2" data-name="Path 18" class="cls-15" d="M.4,12.608H12.608V.4H.4ZM11.8,5.467a5.136,5.136,0,0,1-.24,1.179c-.437,1.267-.917,2.075-2.075,2.075a1.131,1.131,0,0,1-1.157-.7l-.044-.153L8.2,7.978A1.873,1.873,0,0,1,6.733,8.7a1.287,1.287,0,0,1-1.026-.437l-.066-.087-.066.066a1.589,1.589,0,0,1-1.157.415,1.317,1.317,0,0,1-.961-.371L3.37,8.262,3.3,8.327A1.556,1.556,0,0,1,2.191,8.7a.878.878,0,0,1-.961-.9A8.05,8.05,0,0,1,2.322,4.7a1.027,1.027,0,0,1,.917-.524.8.8,0,0,1,.568.175c.109.109.109.2.131.415l.022.284.153-.24a1.611,1.611,0,0,1,1.529-.655,1.05,1.05,0,0,1,.9.371l.044.087.066-.066a1.808,1.808,0,0,1,1.2-.393,1.52,1.52,0,0,1,1.114.371.762.762,0,0,1,.131.2l.066.109.087-.109a1.6,1.6,0,0,1,1.31-.568,1.258,1.258,0,0,1,.983.349,1.352,1.352,0,0,1,.262.961" transform="translate(-0.313 -0.313)"/>
</g>
<g id="Group_11" data-name="Group 11" class="cls-14">
<path id="Path_19-2" data-name="Path 19" class="cls-16" d="M.4,12.608H12.608V.4H.4ZM12.149,5.947a6.83,6.83,0,0,1-.524,1.594,2.28,2.28,0,0,1-2.1,1.551,1.694,1.694,0,0,1-1.354-.546,2.194,2.194,0,0,1-1.485.546A1.764,1.764,0,0,1,5.6,8.742a2.182,2.182,0,0,1-1.223.349,1.781,1.781,0,0,1-1.026-.306,2.2,2.2,0,0,1-1.179.306A1.285,1.285,0,0,1,.815,7.847,8.327,8.327,0,0,1,1.994,4.506a1.407,1.407,0,0,1,1.245-.743c.59,0,.786.175.9.371A2.259,2.259,0,0,1,5.6,3.741a1.5,1.5,0,0,1,1,.328,2.393,2.393,0,0,1,1.2-.306,1.731,1.731,0,0,1,1.354.459,2.039,2.039,0,0,1,1.332-.437,1.566,1.566,0,0,1,1.376.611,1.8,1.8,0,0,1,.284,1.551" transform="translate(-0.313 -0.313)"/>
</g>
<g id="Group_12" data-name="Group 12" class="cls-14">
<path id="Path_20-2" data-name="Path 20" class="cls-17" d="M0,12.383H12.383V0H0Zm12.208-.175H.175V.175H12.208Z"/>
</g>
<g id="Group_13" data-name="Group 13" class="cls-14">
<path id="Path_21-2" data-name="Path 21" class="cls-17" d="M52.962,15.984V15.9h.066c.044,0,.066.022.066.044s-.022.044-.066.044Zm.2.175-.044-.066q-.033-.066-.066-.066h0a.094.094,0,0,0,.087-.087.08.08,0,0,0-.087-.087H52.9v.306h.066v-.131h.022c.022,0,.044,0,.044.022.022.022.022.044.044.066l.022.044Zm-.153-.393a.24.24,0,1,1-.24.24.258.258,0,0,1,.24-.24m0-.066a.306.306,0,1,0,.306.306.312.312,0,0,0-.306-.306" transform="translate(-41.191 -12.271)"/>
</g>
<g id="Group_14" data-name="Group 14" class="cls-14">
<path id="Path_22" data-name="Path 22" class="cls-17" d="M13.189,17.122a1.713,1.713,0,0,0-1.376.611.557.557,0,0,0-.153-.218A1.442,1.442,0,0,0,10.5,17.1a1.858,1.858,0,0,0-1.245.415A1.089,1.089,0,0,0,8.3,17.1a1.68,1.68,0,0,0-1.594.7.539.539,0,0,0-.153-.459.883.883,0,0,0-.633-.2,1.1,1.1,0,0,0-.983.568A8.8,8.8,0,0,0,3.8,20.878a.966.966,0,0,0,1.048.961,1.516,1.516,0,0,0,1.179-.393,1.316,1.316,0,0,0,1,.393,1.582,1.582,0,0,0,1.223-.459,1.378,1.378,0,0,0,1.092.459,1.913,1.913,0,0,0,1.529-.764,1.2,1.2,0,0,0,1.245.743c1.2,0,1.725-.83,2.162-2.118a4.449,4.449,0,0,0,.262-1.2,1.207,1.207,0,0,0-1.354-1.376M5.218,20.4c.611-.109.786.109.764.328-.066.611-.633.764-1.114.743a.626.626,0,0,1-.7-.59,8.208,8.208,0,0,1,1.07-2.97.709.709,0,0,1,.677-.393c.306,0,.371.153.371.328A14.253,14.253,0,0,1,5.218,20.4m2.009-.568c-.044.109-.109.349-.175.59a2.42,2.42,0,0,1,.611-.087c.306,0,.48.131.48.371,0,.59-.655.764-1.114.764a.845.845,0,0,1-.939-.83,6.135,6.135,0,0,1,.677-2.271,1.372,1.372,0,0,1,1.529-.9c.306,0,.677.131.677.437,0,.415-.349.568-.677.59a3.851,3.851,0,0,1-.5,0,3.871,3.871,0,0,0-.24.48c.633-.087.9.044.786.415-.153.5-.59.524-1.114.437m3.123-1.551a.472.472,0,0,0-.371.218,6.165,6.165,0,0,0-.633,1.725c-.044.284.087.349.218.349.218,0,.459-.24.546-.611,0,0-.415,0-.306-.371s.328-.437.677-.459c.7-.022.633.48.568.764a1.8,1.8,0,0,1-1.7,1.594.89.89,0,0,1-.983-.961,4.914,4.914,0,0,1,.393-1.551c.371-.874.764-1.485,1.769-1.485.59,0,1.07.218,1,.764a.658.658,0,0,1-.633.677c-.109,0-.524,0-.393-.415.022-.131.044-.24-.153-.24m3.756.743a7.171,7.171,0,0,1-.59,1.616,1.409,1.409,0,0,1-1.376.852c-.437,0-.939-.175-.939-.852A5.286,5.286,0,0,1,11.595,19c.306-.83.633-1.507,1.66-1.485,1.157,0,.939,1.048.852,1.507m-.852-.524a9.808,9.808,0,0,1-.633,1.856.328.328,0,0,1-.306.218c-.131,0-.175-.087-.2-.2a7.657,7.657,0,0,1,.7-1.944c.087-.131.175-.153.262-.131.175,0,.175.109.175.2" transform="translate(-2.969 -13.366)"/>
</g>
</g>
</g>
<g id="EV3_logo" data-name="EV3 logo" transform="translate(215.286 714.697)">
<path id="Path_12" data-name="Path 12" class="cls-2" d="M72.066,1.849a.183.183,0,0,1,.191.164h0v.847A.153.153,0,0,1,72.094,3H70.071a.366.366,0,0,0-.383.328V4.473a.346.346,0,0,0,.383.3h2.023c.191,0,.164.137.164.137v.82c0,.082-.055.137-.164.137H68.677a.187.187,0,0,1-.191-.191V5.621a.391.391,0,0,0-.383-.383H66.983a.391.391,0,0,0-.383.383v1.64a.366.366,0,0,0,.383.328h6.751a.346.346,0,0,0,.383-.3V.4a.346.346,0,0,0-.383-.3H67.01a.346.346,0,0,0-.383.3V2.068a.387.387,0,0,0,.355.383H68.1a.362.362,0,0,0,.355-.355V2.041a.173.173,0,0,1,.191-.191h3.417Z" transform="translate(-48.397 -0.073)"/>
<path id="Path_13" data-name="Path 13" class="cls-2" d="M39.03,0H37.445c-.246,0-.328.164-.437.383L35.067,4.756a.23.23,0,0,1-.191.109.206.206,0,0,1-.191-.137L32.744.383C32.635.164,32.525,0,32.279,0H30.667c-.355,0-.41.191-.3.41l3.2,6.724c.164.328.273.383.574.383h1.421a.546.546,0,0,0,.574-.383L39.358.41c.109-.219.027-.41-.328-.41" transform="translate(-22.029)"/>
<path id="Path_14" data-name="Path 14" class="cls-2" d="M7.106,2.97a.346.346,0,0,1,.383.3V4.446a.346.346,0,0,1-.383.3H2.05c-.109,0-.191.055-.191.137h0V5.7h0c0,.082.082.137.191.137H7.106a.346.346,0,0,1,.383.3V7.288a.336.336,0,0,1-.355.3H.383A.346.346,0,0,1,0,7.288V.4A.346.346,0,0,1,.383.1H7.134a.319.319,0,0,1,.355.3V1.549a.319.319,0,0,1-.355.3H2.077c-.109,0-.219.027-.219.137v.847c0,.082.082.137.191.137Z" transform="translate(0 -0.073)"/>
</g>
</g>
</svg>

After

Width:  |  Height:  |  Size: 12 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 4.9 KiB

View File

@ -0,0 +1,650 @@
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<svg
xmlns:dc="http://purl.org/dc/elements/1.1/"
xmlns:cc="http://creativecommons.org/ns#"
xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
xmlns:svg="http://www.w3.org/2000/svg"
xmlns="http://www.w3.org/2000/svg"
xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
viewBox="2135.306 6140.141 153.634 153.634"
version="1.1"
id="svg7024"
sodipodi:docname="Large Motor.svg"
width="153.634"
height="153.634"
inkscape:version="0.92.1 r15371"
inkscape:export-filename="C:\gh\pxt-ev3\libs\core\jres\icons\motorLarge-icon.png"
inkscape:export-xdpi="74.983398"
inkscape:export-ydpi="74.983398">
<metadata
id="metadata7028">
<rdf:RDF>
<cc:Work
rdf:about="">
<dc:format>image/svg+xml</dc:format>
<dc:type
rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
<dc:title></dc:title>
</cc:Work>
</rdf:RDF>
</metadata>
<sodipodi:namedview
pagecolor="#ffffff"
bordercolor="#666666"
borderopacity="1"
objecttolerance="10"
gridtolerance="10"
guidetolerance="10"
inkscape:pageopacity="0"
inkscape:pageshadow="2"
inkscape:window-width="1600"
inkscape:window-height="837"
id="namedview7026"
showgrid="false"
inkscape:zoom="1.5361183"
inkscape:cx="39.260502"
inkscape:cy="76.817001"
inkscape:window-x="-8"
inkscape:window-y="-8"
inkscape:window-maximized="1"
inkscape:current-layer="svg7024" />
<defs
id="defs6971">
<style
id="style6897">
.cls-1 {
fill: #a8a9a8;
}
.cls-2 {
clip-path: url(#clip-path);
}
.cls-3 {
fill: #fff;
}
.cls-4 {
clip-path: url(#clip-path-2);
}
.cls-5 {
fill: #f2f2f2;
}
.cls-6 {
clip-path: url(#clip-path-3);
}
.cls-7 {
fill: #6a6a6a;
}
.cls-8 {
fill: #9a9a9a;
}
.cls-9 {
fill: #b72b1c;
}
.cls-10 {
fill: #3c3c3c;
}
.cls-11 {
fill: #242424;
}
.cls-12 {
filter: url(#rød);
}
.cls-13 {
filter: url(#Path_4);
}
.cls-14 {
filter: url(#Path_1-2);
}
.cls-15 {
filter: url(#Path_2);
}
.cls-16 {
filter: url(#Path_1);
}
.cls-17 {
filter: url(#Path_34);
}
</style>
<clipPath
id="clip-path">
<path
id="Union_6"
data-name="Union 6"
class="cls-1"
d="M 0,136.571 A 17.07,17.07 0 0 1 14.122,119.759 L 13.757,119.371 13.747,83.6 c 0,-0.419 0.142,-0.4 0.392,-0.673 L 25.043,72.4 V 62.372 l -0.75,-0.775 V 60.8 H 17.5 a 4,4 0 0 1 -4,-4 V 30.978 a 4,4 0 0 1 4,-4 h 6.793 V 18.8 a 5.784,5.784 0 0 1 5.784,-5.784 h 6.508 V 5.446 A 4,4 0 0 1 39.477,1.6 v -1 A 0.607,0.607 0 0 1 40.084,0 h 26.262 a 0.607,0.607 0 0 1 0.607,0.607 v 1.282 a 4,4 0 0 1 2.169,3.557 v 7.569 h 3.615 A 5.784,5.784 0 0 1 78.521,18.8 V 48.44 C 68.153,62.5 60.394,72.305 60.394,72.305 H 59.8 c 0,0 -7.092,-0.053 -13.682,-0.1 l 0.034,11.8 h 6.882 a 4,4 0 0 1 4,4 v 25.826 a 4,4 0 0 1 -4,4 h -6.785 l 0.034,11.775 c 0,0.838 -0.155,0.838 -0.462,1.137 l -10.415,10.099 -0.212,0.191 A 1.518,1.518 0 0 1 33.6,140.8 17.067,17.067 0 0 1 0,136.571 Z"
inkscape:connector-curvature="0"
style="fill:#a8a9a8" />
</clipPath>
<filter
id="Path_34"
x="2168.8911"
y="6138.5869"
width="38.536999"
height="21.907"
filterUnits="userSpaceOnUse">
<feOffset
input="SourceAlpha"
id="feOffset6901" />
<feGaussianBlur
stdDeviation="1"
result="blur"
id="feGaussianBlur6903" />
<feFlood
flood-opacity="0.502"
id="feFlood6905" />
<feComposite
operator="in"
in2="blur"
id="feComposite6907"
result="result1" />
<feComposite
in="SourceGraphic"
in2="result1"
id="feComposite6909" />
</filter>
<filter
id="Path_1"
x="2146.053"
y="6207.1338"
width="38.536999"
height="77.177002"
filterUnits="userSpaceOnUse">
<feOffset
input="SourceAlpha"
id="feOffset6912" />
<feGaussianBlur
stdDeviation="1"
result="blur-2"
id="feGaussianBlur6914" />
<feFlood
flood-opacity="0.502"
id="feFlood6916" />
<feComposite
operator="in"
in2="blur-2"
id="feComposite6918"
result="result1" />
<feComposite
in="SourceGraphic"
in2="result1"
id="feComposite6920" />
</filter>
<filter
id="Path_2"
x="2157.3491"
y="6198.8062"
width="27.028999"
height="28.403"
filterUnits="userSpaceOnUse">
<feOffset
input="SourceAlpha"
id="feOffset6923" />
<feGaussianBlur
stdDeviation="1"
result="blur-3"
id="feGaussianBlur6925" />
<feFlood
flood-opacity="0.502"
id="feFlood6927" />
<feComposite
operator="in"
in2="blur-3"
id="feComposite6929"
result="result1" />
<feComposite
in="SourceGraphic"
in2="result1"
id="feComposite6931" />
</filter>
<filter
id="Path_1-2"
x="2156.6001"
y="6150.1548"
width="60.229"
height="65.290001"
filterUnits="userSpaceOnUse">
<feOffset
input="SourceAlpha"
id="feOffset6934" />
<feGaussianBlur
stdDeviation="1"
result="blur-4"
id="feGaussianBlur6936" />
<feFlood
flood-opacity="0.502"
id="feFlood6938" />
<feComposite
operator="in"
in2="blur-4"
id="feComposite6940"
result="result1" />
<feComposite
in="SourceGraphic"
in2="result1"
id="feComposite6942" />
</filter>
<clipPath
id="clip-path-2">
<path
id="Path_9"
data-name="Path 9"
class="cls-1"
d="m 5.784,0 h 42.66 a 5.784,5.784 0 0 1 5.784,5.784 v 29.64 C 43.86,49.487 36.1,59.29 36.1,59.29 h -0.595 c 0,0 -19.462,-0.147 -23.864,-0.147 A 2.28,2.28 0 0 1 9.263,58.158 L 0,48.582 V 5.784 A 5.784,5.784 0 0 1 5.784,0 Z"
inkscape:connector-curvature="0"
style="fill:#a8a9a8" />
</clipPath>
<filter
id="Path_4"
x="2162.384"
y="6155.2168"
width="48.66"
height="54.444"
filterUnits="userSpaceOnUse">
<feOffset
input="SourceAlpha"
id="feOffset6947" />
<feGaussianBlur
stdDeviation="1"
result="blur-5"
id="feGaussianBlur6949" />
<feFlood
flood-opacity="0.502"
id="feFlood6951" />
<feComposite
operator="in"
in2="blur-5"
id="feComposite6953"
result="result1" />
<feComposite
in="SourceGraphic"
in2="result1"
id="feComposite6955" />
</filter>
<clipPath
id="clip-path-3">
<path
id="Path_10"
data-name="Path 10"
class="cls-1"
d="M 5.784,0 H 36.875 A 5.784,5.784 0 0 1 42.66,5.784 V 28.032 C 34.013,39.3 27.1,48.444 27.1,48.444 H 5.784 A 5.784,5.784 0 0 1 0,42.66 V 5.784 A 5.784,5.784 0 0 1 5.784,0 Z"
inkscape:connector-curvature="0"
style="fill:#a8a9a8" />
</clipPath>
<filter
id="rød"
x="2132.3059"
y="6256.646"
width="40.129002"
height="40.129002"
filterUnits="userSpaceOnUse">
<feOffset
input="SourceAlpha"
id="feOffset6960" />
<feGaussianBlur
stdDeviation="1"
result="blur-6"
id="feGaussianBlur6962" />
<feFlood
flood-opacity="0.502"
id="feFlood6964" />
<feComposite
operator="in"
in2="blur-6"
id="feComposite6966"
result="result1" />
<feComposite
in="SourceGraphic"
in2="result1"
id="feComposite6968" />
</filter>
</defs>
<g
id="Large_Motor"
data-name="Large Motor"
transform="translate(1383.553,5554.0014)">
<g
id="Mask_Group_6"
data-name="Mask Group 6"
class="cls-2"
transform="translate(789.306,586.141)"
clip-path="url(#clip-path)">
<g
id="Large_motor-2"
data-name="Large motor"
transform="translate(-1.623)">
<path
id="Path_45"
data-name="Path 45"
class="cls-1"
d="m 5.461,0 h 5.612 a 5.461,5.461 0 0 1 5.461,5.461 v 22.9 a 5.461,5.461 0 0 1 -5.461,5.461 H 5.461 A 5.461,5.461 0 0 1 0,28.365 V 5.461 A 5.461,5.461 0 0 1 5.461,0 Z"
transform="translate(42.123,84.012)"
inkscape:connector-curvature="0"
style="fill:#a8a9a8" />
<circle
id="Ellipse_2"
data-name="Ellipse 2"
class="cls-3"
cx="3.7920001"
cy="3.7920001"
transform="translate(49.555,85.528)"
r="3.7920001"
style="fill:#ffffff" />
<circle
id="Ellipse_1"
data-name="Ellipse 1"
class="cls-3"
cx="3.7920001"
cy="3.7920001"
transform="translate(49.555,108.736)"
r="3.7920001"
style="fill:#ffffff" />
<path
id="Path_36"
data-name="Path 36"
class="cls-1"
d="m 0.607,0 h 26.262 a 0.607,0.607 0 0 1 0.607,0.607 V 5.9 A 0.607,0.607 0 0 1 26.869,6.507 H 0.607 A 0.607,0.607 0 0 1 0,5.9 V 0.607 A 0.607,0.607 0 0 1 0.607,0 Z"
transform="translate(41.1)"
inkscape:connector-curvature="0"
style="fill:#a8a9a8" />
<g
class="cls-17"
transform="translate(-2133.68,-6140.14)"
id="g6978"
style="filter:url(#Path_34)">
<path
id="Path_34-2"
data-name="Path 34"
class="cls-1"
d="M 0.607,0 H 31.93 a 0.607,0.607 0 0 1 0.607,0.607 V 15.3 A 0.607,0.607 0 0 1 31.93,15.907 H 0.607 A 0.607,0.607 0 0 1 0,15.3 V 0.607 A 0.607,0.607 0 0 1 0.607,0 Z"
transform="translate(2171.89,6141.59)"
inkscape:connector-curvature="0"
style="fill:#a8a9a8" />
</g>
<path
id="Path_2-2"
data-name="Path 2"
class="cls-3"
d="m 5610.158,939.234 a 4.151,4.151 0 0 1 -2.342,0.705 5.131,5.131 0 0 1 -2.988,-0.705 c -1.257,-0.931 -1.229,0.1 -1.229,0.1 v 1.8 c 0,0.45 0.553,0.846 1.229,0.459 0.676,-0.387 1,-0.581 1,-0.581 0,0 0.361,-0.184 0.361,0.335 v 2.62 c 0,0 0.021,0.786 -0.73,0.768 -0.751,-0.018 -1.38,0 -1.38,0 0,0 -0.293,0.248 -0.293,1.385 0,1.137 0.293,1.322 0.293,1.322 h 1.38 c 0,0 0.73,-0.024 0.73,0.649 v 1.3 c 0,0 0.227,0.359 1.169,0.306 a 3.6,3.6 0 0 0 1.4,-0.306 v -1.3 a 0.67,0.67 0 0 1 0.66,-0.649 c 0.631,-0.01 1.257,0 1.257,0 0,0 0.252,-0.191 0.287,-1.322 0.035,-1.131 -0.287,-1.385 -0.287,-1.385 h -1.257 c 0,0 -0.805,-0.052 -0.817,-0.768 -0.012,-0.716 0,-2.62 0,-2.62 0,0 -0.047,-0.515 0.332,-0.335 0.379,0.18 1.215,0.581 1.215,0.581 0,0 0.83,0.407 0.814,-0.459 -0.016,-0.866 0,-1.8 0,-1.8 0,0 -0.072,-0.534 -0.804,-0.1 z"
transform="translate(-5553.893,-845.301)"
inkscape:connector-curvature="0"
style="fill:#ffffff" />
<path
id="Path_3"
data-name="Path 3"
class="cls-3"
d="m 5601.9,1015.336 a 0.83,0.83 0 0 1 1.2,-0.594 6.516,6.516 0 0 0 2.85,0.772 5.05,5.05 0 0 0 2.768,-0.772 c 0.829,-0.4 1.067,0.594 1.067,0.594 v 1.76 a 0.71,0.71 0 0 1 -1.067,0.561 5.791,5.791 0 0 0 -2.768,-0.837 7.06,7.06 0 0 0 -2.85,0.837 c 0,0 -1.178,0.239 -1.2,-0.561 -0.022,-0.8 0,-1.76 0,-1.76 z"
transform="translate(-5552.485,-909.604)"
inkscape:connector-curvature="0"
style="fill:#ffffff" />
<g
class="cls-16"
transform="translate(-2133.68,-6140.14)"
id="g6983"
style="filter:url(#Path_1)">
<path
id="Path_1-3"
data-name="Path 1"
class="cls-1"
d="M 0.016,8.513 13.42,-4.416 31.991,-3.746 32.162,55.2 c 0,0.838 -0.155,0.838 -0.462,1.137 l -10.416,10.096 -0.212,0.19 c -0.584,0.4 -1.987,-0.115 -1.987,-0.952 L -0.364,44.961 -0.375,9.187 c 0,-0.419 0.142,-0.402 0.391,-0.674 z"
transform="translate(2149.43,6214.55)"
inkscape:connector-curvature="0"
style="fill:#a8a9a8" />
</g>
<g
class="cls-15"
transform="translate(-2133.68,-6140.14)"
id="g6986"
style="filter:url(#Path_2)">
<path
id="Path_2-3"
data-name="Path 2"
class="cls-1"
d="m 1484.037,521.285 v 17.253 c 0,0 0.019,0.845 0.3,1.121 0.281,0.276 3.516,3.626 3.516,3.626 a 1.566,1.566 0 0 0 1.157,0.4 c 0.758,-0.025 11.627,0 11.627,0 l 4.429,-4.7 v -7.963 l -10.662,-0.567 z"
transform="translate(676.31,5680.52)"
inkscape:connector-curvature="0"
style="fill:#a8a9a8" />
</g>
<g
id="Group_4"
data-name="Group 4"
transform="translate(15.123,26.978)">
<path
id="Path_44"
data-name="Path 44"
class="cls-1"
d="m 5.461,0 h 5.612 a 5.461,5.461 0 0 1 5.461,5.461 v 22.9 a 5.461,5.461 0 0 1 -5.461,5.461 H 5.461 A 5.461,5.461 0 0 1 0,28.365 V 5.461 A 5.461,5.461 0 0 1 5.461,0 Z"
inkscape:connector-curvature="0"
style="fill:#a8a9a8" />
<circle
id="Ellipse_3"
data-name="Ellipse 3"
class="cls-3"
cx="3.7920001"
cy="3.7920001"
transform="translate(1.062,1.517)"
r="3.7920001"
style="fill:#ffffff" />
<circle
id="Ellipse_4"
data-name="Ellipse 4"
class="cls-3"
cx="3.7920001"
cy="3.7920001"
transform="translate(1.062,24.725)"
r="3.7920001"
style="fill:#ffffff" />
<path
id="Path_5"
data-name="Path 5"
class="cls-3"
d="m 5610.158,939.234 a 4.151,4.151 0 0 1 -2.342,0.705 5.131,5.131 0 0 1 -2.988,-0.705 c -1.257,-0.931 -1.229,0.1 -1.229,0.1 v 1.8 c 0,0.45 0.553,0.846 1.229,0.459 0.676,-0.387 1,-0.581 1,-0.581 0,0 0.361,-0.184 0.361,0.335 v 2.62 c 0,0 0.021,0.786 -0.73,0.768 -0.751,-0.018 -1.38,0 -1.38,0 0,0 -0.293,0.248 -0.293,1.385 0,1.137 0.293,1.322 0.293,1.322 h 1.38 c 0,0 0.73,-0.024 0.73,0.649 v 1.3 c 0,0 0.227,0.359 1.169,0.306 a 3.6,3.6 0 0 0 1.4,-0.306 v -1.3 a 0.67,0.67 0 0 1 0.66,-0.649 c 0.631,-0.01 1.257,0 1.257,0 0,0 0.252,-0.191 0.287,-1.322 0.035,-1.131 -0.287,-1.385 -0.287,-1.385 h -1.257 c 0,0 -0.805,-0.052 -0.817,-0.768 -0.012,-0.716 0,-2.62 0,-2.62 0,0 -0.047,-0.515 0.332,-0.335 0.379,0.18 1.215,0.581 1.215,0.581 0,0 0.83,0.407 0.814,-0.459 -0.016,-0.866 0,-1.8 0,-1.8 0,0 -0.072,-0.534 -0.804,-0.1 z"
transform="translate(-5602.386,-929.312)"
inkscape:connector-curvature="0"
style="fill:#ffffff" />
<path
id="Path_6"
data-name="Path 6"
class="cls-3"
d="m 5601.9,1015.336 a 0.83,0.83 0 0 1 1.2,-0.594 6.516,6.516 0 0 0 2.85,0.772 5.05,5.05 0 0 0 2.768,-0.772 c 0.829,-0.4 1.067,0.594 1.067,0.594 v 1.76 a 0.71,0.71 0 0 1 -1.067,0.561 5.791,5.791 0 0 0 -2.768,-0.837 7.06,7.06 0 0 0 -2.85,0.837 c 0,0 -1.178,0.239 -1.2,-0.561 -0.022,-0.8 0,-1.76 0,-1.76 z"
transform="translate(-5600.979,-993.616)"
inkscape:connector-curvature="0"
style="fill:#ffffff" />
</g>
<g
class="cls-14"
transform="translate(-2133.68,-6140.14)"
id="g6995"
style="filter:url(#Path_1-2)">
<path
id="Path_1-4"
data-name="Path 1"
class="cls-1"
d="m 5.784,0 h 42.66 a 5.784,5.784 0 0 1 5.784,5.784 v 29.64 C 43.86,49.487 36.1,59.29 36.1,59.29 h -0.595 c 0,0 -19.462,-0.147 -23.864,-0.147 A 2.28,2.28 0 0 1 9.263,58.158 L 0,48.582 V 5.784 A 5.784,5.784 0 0 1 5.784,0 Z"
transform="translate(2159.6,6153.16)"
inkscape:connector-curvature="0"
style="fill:#a8a9a8" />
</g>
<g
id="hvid"
transform="translate(25.916,13.015)">
<g
id="Mask_Group_1"
data-name="Mask Group 1"
class="cls-4"
clip-path="url(#clip-path-2)">
<path
id="hvid-2"
data-name="hvid"
class="cls-5"
d="m 1498.578,449.051 7.155,7.37 23.789,31.08 v 14.857 l 13.063,-16.131 v -31.221 l -0.993,-7.691 z"
transform="translate(-1487.315,-449.455)"
inkscape:connector-curvature="0"
style="fill:#f2f2f2" />
</g>
</g>
<g
class="cls-13"
transform="translate(-2133.68,-6140.14)"
id="g7001"
style="filter:url(#Path_4)">
<path
id="Path_4-2"
data-name="Path 4"
class="cls-1"
d="M 5.784,0 H 36.875 A 5.784,5.784 0 0 1 42.66,5.784 V 28.032 C 34.013,39.3 27.1,48.444 27.1,48.444 H 5.784 A 5.784,5.784 0 0 1 0,42.66 V 5.784 A 5.784,5.784 0 0 1 5.784,0 Z"
transform="translate(2165.38,6158.22)"
inkscape:connector-curvature="0"
style="fill:#a8a9a8" />
</g>
<g
id="Group_3"
data-name="Group 3"
transform="translate(31.7,18.38)">
<g
id="Mask_Group_2"
data-name="Mask Group 2"
class="cls-6"
clip-path="url(#clip-path-3)">
<path
id="Union_1"
data-name="Union 1"
class="cls-7"
d="M 14.461,28.56 V 1.085 a 1.085,1.085 0 1 1 2.169,0 V 28.56 a 1.085,1.085 0 1 1 -2.169,0 z m -3.615,0 V 1.085 a 1.085,1.085 0 1 1 2.169,0 V 28.56 a 1.085,1.085 0 1 1 -2.169,0 z m -3.615,0 V 1.085 a 1.085,1.085 0 1 1 2.169,0 V 28.56 a 1.085,1.085 0 1 1 -2.169,0 z m -3.615,0 V 1.085 a 1.085,1.085 0 1 1 2.169,0 V 28.56 a 1.085,1.085 0 1 1 -2.169,0 z M 0,28.56 V 1.085 a 1.085,1.085 0 1 1 2.169,0 V 28.56 A 1.085,1.085 0 1 1 0,28.56 Z"
transform="translate(15.907,-5.365)"
inkscape:connector-curvature="0"
style="fill:#6a6a6a" />
</g>
</g>
<circle
id="Ellipse_1-2"
data-name="Ellipse 1"
class="cls-8"
cx="2.2449999"
cy="2.2449999"
transform="translate(29.076,16.175)"
r="2.2449999"
style="fill:#9a9a9a" />
<circle
id="Ellipse_2-2"
data-name="Ellipse 2"
class="cls-8"
cx="2.2449999"
cy="2.2449999"
transform="translate(57.744,66.686)"
r="2.2449999"
style="fill:#9a9a9a" />
<g
class="cls-12"
transform="translate(-2133.68,-6140.14)"
id="g7009">
<circle
id="rød-2"
data-name="rød"
class="cls-9"
cx="17.063999"
cy="17.063999"
transform="translate(2135.31,6259.65)"
r="17.063999"
style="fill:#b72b1c" />
</g>
<g
id="Group_2"
data-name="Group 2"
transform="matrix(0.966,0.259,-0.259,0.966,7.93,117.883)">
<circle
id="Ellipse_4-2"
data-name="Ellipse 4"
class="cls-10"
cx="3.7920001"
cy="3.7920001"
transform="translate(11.528)"
r="3.7920001"
style="fill:#3c3c3c" />
<circle
id="Ellipse_7"
data-name="Ellipse 7"
class="cls-10"
cx="3.7920001"
cy="3.7920001"
transform="translate(23.056,11.528)"
r="3.7920001"
style="fill:#3c3c3c" />
<circle
id="Ellipse_5"
data-name="Ellipse 5"
class="cls-10"
cx="3.7920001"
cy="3.7920001"
transform="translate(11.528,23.056)"
r="3.7920001"
style="fill:#3c3c3c" />
<circle
id="Ellipse_6"
data-name="Ellipse 6"
class="cls-10"
cx="3.7920001"
cy="3.7920001"
transform="translate(0,11.528)"
r="3.7920001"
style="fill:#3c3c3c" />
<path
id="Path_4-3"
data-name="Path 4"
class="cls-11"
d="m 2.4,1.566 c 0,0 0.021,0.786 -0.73,0.768 -0.751,-0.018 -1.38,0 -1.38,0 0,0 -0.29,0.248 -0.29,1.385 0,1.137 0.294,1.322 0.294,1.322 h 1.38 c 0,0 0.73,-0.024 0.73,0.649 0,0.673 0,1.3 0,1.3 0,0 0.227,0.359 1.17,0.306 a 3.594,3.594 0 0 0 1.4,-0.306 v -1.3 a 0.67,0.67 0 0 1 0.66,-0.649 c 0.631,-0.01 1.257,0 1.257,0 0,0 0.253,-0.191 0.287,-1.322 C 7.212,2.588 6.891,2.333 6.891,2.333 H 5.638 c 0,0 -0.806,-0.052 -0.818,-0.768 A 12.478,12.478 0 0 1 4.884,0.305 2.9,2.9 0 0 0 2.529,0.213 C 2.45,0.819 2.4,1.566 2.4,1.566 Z"
transform="rotate(-90,15.2715,3.5915)"
inkscape:connector-curvature="0"
style="fill:#242424" />
<path
id="Path_5-2"
data-name="Path 5"
class="cls-10"
d="M 0.455,0.155 2.016,0 3.64,0.155 A 0.455,0.455 0 0 1 4.1,0.61 V 2.734 A 0.455,0.455 0 0 1 3.645,3.189 L 2.094,2.979 0.46,3.189 A 0.455,0.455 0 0 1 0,2.734 V 0.61 A 0.455,0.455 0 0 1 0.455,0.155 Z"
transform="translate(13.241,8.084)"
inkscape:connector-curvature="0"
style="fill:#3c3c3c" />
<path
id="Path_7"
data-name="Path 7"
class="cls-10"
d="M 0.455,0.155 2.016,0 3.64,0.155 A 0.455,0.455 0 0 1 4.1,0.61 V 2.734 A 0.455,0.455 0 0 1 3.645,3.189 L 2.094,2.979 0.46,3.189 A 0.455,0.455 0 0 1 0,2.734 V 0.61 A 0.455,0.455 0 0 1 0.455,0.155 Z"
transform="rotate(-90,12.71,4.628)"
inkscape:connector-curvature="0"
style="fill:#3c3c3c" />
<path
id="Path_6-2"
data-name="Path 6"
class="cls-10"
d="M 0.455,0.155 2.016,0 3.64,0.155 A 0.455,0.455 0 0 1 4.1,0.61 V 2.734 A 0.455,0.455 0 0 1 3.645,3.189 L 2.094,2.979 0.46,3.189 A 0.455,0.455 0 0 1 0,2.734 V 0.61 A 0.455,0.455 0 0 1 0.455,0.155 Z"
transform="rotate(180,8.668,11.2485)"
inkscape:connector-curvature="0"
style="fill:#3c3c3c" />
<path
id="Path_8"
data-name="Path 8"
class="cls-10"
d="M 0.455,0.155 2.016,0 3.64,0.155 A 0.455,0.455 0 0 1 4.1,0.61 V 2.734 A 0.455,0.455 0 0 1 3.645,3.189 L 2.094,2.979 0.46,3.189 A 0.455,0.455 0 0 1 0,2.734 V 0.61 A 0.455,0.455 0 0 1 0.455,0.155 Z"
transform="rotate(90,4.6265,17.8685)"
inkscape:connector-curvature="0"
style="fill:#3c3c3c" />
</g>
</g>
</g>
</g>
</svg>

After

Width:  |  Height:  |  Size: 23 KiB

View File

@ -0,0 +1,220 @@
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<svg
xmlns:dc="http://purl.org/dc/elements/1.1/"
xmlns:cc="http://creativecommons.org/ns#"
xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
xmlns:svg="http://www.w3.org/2000/svg"
xmlns="http://www.w3.org/2000/svg"
xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
viewBox="1719.858 6177.276 47.14 47.14"
version="1.1"
id="svg7610"
sodipodi:docname="Medium Motor.svg"
inkscape:export-filename="C:\gh\pxt-ev3\libs\core\jres\icons\motorMedium-icon.png"
inkscape:export-xdpi="244.37845"
inkscape:export-ydpi="244.37845"
inkscape:version="0.92.1 r15371">
<metadata
id="metadata7614">
<rdf:RDF>
<cc:Work
rdf:about="">
<dc:format>image/svg+xml</dc:format>
<dc:type
rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
<dc:title></dc:title>
</cc:Work>
</rdf:RDF>
</metadata>
<sodipodi:namedview
pagecolor="#ffffff"
bordercolor="#666666"
borderopacity="1"
objecttolerance="10"
gridtolerance="10"
guidetolerance="10"
inkscape:pageopacity="0"
inkscape:pageshadow="2"
inkscape:window-width="1920"
inkscape:window-height="1137"
id="namedview7612"
showgrid="false"
inkscape:zoom="5.0063641"
inkscape:cx="23.57"
inkscape:cy="23.57"
inkscape:window-x="-8"
inkscape:window-y="-8"
inkscape:window-maximized="1"
inkscape:current-layer="svg7610" />
<defs
id="defs7591">
<style
id="style7573">
.cls-1 {
fill: url(#linear-gradient);
}
.cls-2 {
fill: #a8a9a8;
}
.cls-3 {
fill: #3c3c3c;
}
.cls-4 {
fill: #b72b1c;
stroke: #8b1104;
stroke-width: 0.25px;
}
.cls-5 {
stroke: none;
}
.cls-6 {
fill: none;
}
.cls-7 {
filter: url(#Union_1);
}
</style>
<linearGradient
id="linear-gradient"
x1="0.5"
y1="0.919"
x2="0.5"
y2="1.077"
gradientUnits="objectBoundingBox">
<stop
offset="0"
stop-color="#a8a9a8"
id="stop7575" />
<stop
offset="1"
stop-color="#545554"
id="stop7577" />
</linearGradient>
<filter
id="Union_1"
x="1719.858"
y="6177.276"
width="47.14"
height="47.14"
filterUnits="userSpaceOnUse">
<feOffset
input="SourceAlpha"
id="feOffset7580" />
<feGaussianBlur
stdDeviation="0.5"
result="blur"
id="feGaussianBlur7582" />
<feFlood
flood-opacity="0.322"
id="feFlood7584" />
<feComposite
operator="in"
in2="blur"
id="feComposite7586"
result="result1" />
<feComposite
in="SourceGraphic"
in2="result1"
id="feComposite7588" />
</filter>
</defs>
<g
id="Medium_Motor"
data-name="Medium Motor"
transform="translate(1346 5554)">
<g
id="Group_4"
data-name="Group 4"
transform="translate(375.358 624.776)">
<path
id="Path_1"
data-name="Path 1"
class="cls-1"
d="M3.281-.287h39a2.357,2.357,0,0,1,2.57,1.972V42.033c0,1-1.1,1.82-2.57,1.82h-39c-1.473,0-2.57-.815-2.57-1.82V1.685A2.357,2.357,0,0,1,3.281-.287Z"
transform="translate(-0.711 0.287)" />
</g>
<g
id="Group_7"
data-name="Group 7"
transform="translate(419.498 624.776) rotate(90)">
<g
class="cls-7"
transform="matrix(0, -1, 1, 0, -6178.78, 1765.5)"
id="g7596">
<path
id="Union_1-2"
data-name="Union 1"
class="cls-2"
d="M21.236,44.14a6.219,6.219,0,0,1-6.219-6.219v-8.8h-8.8A6.219,6.219,0,0,1,0,22.9V21.236a6.219,6.219,0,0,1,6.219-6.219h8.8v-8.8A6.219,6.219,0,0,1,21.236,0H22.9a6.219,6.219,0,0,1,6.219,6.219v8.8h8.8a6.219,6.219,0,0,1,6.219,6.219V22.9a6.219,6.219,0,0,1-6.219,6.219h-8.8v8.8A6.219,6.219,0,0,1,22.9,44.14Z"
transform="translate(1765.5 6178.78) rotate(90)" />
</g>
<ellipse
id="Ellipse_1"
data-name="Ellipse 1"
class="cls-3"
cx="4.854"
cy="4.854"
rx="4.854"
ry="4.854"
transform="translate(17.292 1.517)" />
<ellipse
id="Ellipse_2"
data-name="Ellipse 2"
class="cls-3"
cx="4.854"
cy="4.854"
rx="4.854"
ry="4.854"
transform="translate(17.292 32.915)" />
<ellipse
id="Ellipse_1-2"
data-name="Ellipse 1"
class="cls-3"
cx="4.854"
cy="4.854"
rx="4.854"
ry="4.854"
transform="translate(1.517 26.848) rotate(-90)" />
<ellipse
id="Ellipse_2-2"
data-name="Ellipse 2"
class="cls-3"
cx="4.854"
cy="4.854"
rx="4.854"
ry="4.854"
transform="translate(32.915 26.848) rotate(-90)" />
</g>
<g
id="Ellipse_4"
data-name="Ellipse 4"
class="cls-4"
transform="translate(390.903 640.17)">
<ellipse
class="cls-5"
cx="6.752"
cy="6.752"
rx="6.752"
ry="6.752"
id="ellipse7603" />
<ellipse
class="cls-6"
cx="6.752"
cy="6.752"
rx="6.627"
ry="6.627"
id="ellipse7605" />
</g>
<path
id="Hole"
d="M5606.437,962.413s-.054,1.021-.769,1.029-1.461,0-1.461,0a2.363,2.363,0,0,0-.455,1.691c0,1.266.357,1.6.357,1.6h1.628a.645.645,0,0,1,.7.7V969.1a3.882,3.882,0,0,0,1.766.287,6.459,6.459,0,0,0,1.676-.287v-1.667a.73.73,0,0,1,.734-.7,10.674,10.674,0,0,0,1.444-.14s.4-.374.434-1.632-.353-1.644-.353-1.644h-1.693a.641.641,0,0,1-.762-.678,11.41,11.41,0,0,1,0-1.643,4.815,4.815,0,0,0-3.246,0C5606.42,961.694,5606.437,962.413,5606.437,962.413Z"
transform="translate(-5210.486 -318.186)" />
</g>
</svg>

After

Width:  |  Height:  |  Size: 6.0 KiB

View File

@ -0,0 +1,347 @@
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<svg
xmlns:dc="http://purl.org/dc/elements/1.1/"
xmlns:cc="http://creativecommons.org/ns#"
xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
xmlns:svg="http://www.w3.org/2000/svg"
xmlns="http://www.w3.org/2000/svg"
xmlns:xlink="http://www.w3.org/1999/xlink"
xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
viewBox="1827.391 6183.664 36.101 36.101003"
version="1.1"
id="svg4572"
sodipodi:docname="Touch sensor.svg"
width="36.101002"
height="36.101002"
inkscape:version="0.92.1 r15371"
inkscape:export-filename="C:\gh\pxt-ev3\libs\core\jres\icons\touchSensor-icon.png"
inkscape:export-xdpi="319.10471"
inkscape:export-ydpi="319.10471">
<metadata
id="metadata4576">
<rdf:RDF>
<cc:Work
rdf:about="">
<dc:format>image/svg+xml</dc:format>
<dc:type
rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
<dc:title></dc:title>
</cc:Work>
</rdf:RDF>
</metadata>
<sodipodi:namedview
pagecolor="#ffffff"
bordercolor="#666666"
borderopacity="1"
objecttolerance="10"
gridtolerance="10"
guidetolerance="10"
inkscape:pageopacity="0"
inkscape:pageshadow="2"
inkscape:window-width="1600"
inkscape:window-height="837"
id="namedview4574"
showgrid="false"
inkscape:zoom="7.0722208"
inkscape:cx="18.050501"
inkscape:cy="16.684999"
inkscape:window-x="-8"
inkscape:window-y="-8"
inkscape:window-maximized="1"
inkscape:current-layer="svg4572" />
<defs
id="defs4547">
<style
id="style4522">
.cls-1 {
fill: #a8a9a8;
}
.cls-2 {
clip-path: url(#clip-path);
}
.cls-3 {
fill: url(#linear-gradient);
}
.cls-4 {
fill: url(#linear-gradient-2);
}
.cls-5 {
fill: #b72b1c;
stroke: #8b1104;
stroke-width: 0.25px;
}
.cls-6 {
stroke: none;
}
.cls-7 {
fill: none;
}
.cls-8 {
filter: url(#Path_1);
}
</style>
<clipPath
id="clip-path">
<path
id="Union_3"
data-name="Union 3"
class="cls-1"
d="m 3.944,33.37 c -1.069,0 -1.972,-0.6 -1.972,-1.365 v -4.4 H 1 a 1,1 0 0 1 -1,-1 V 7.371 a 1,1 0 0 1 1,-1 H 1.972 V 1.365 C 1.972,0.6 2.875,0 3.944,0 h 10.769 v 1.365 h 6.371 V 0 h 11.073 c 1.069,0 1.972,0.6 1.972,1.365 V 6.371 H 35.1 a 1,1 0 0 1 1,1 v 19.236 a 1,1 0 0 1 -1,1 H 34.128 V 32 c 0,0.761 -0.9,1.365 -1.972,1.365 z"
inkscape:connector-curvature="0"
style="fill:#a8a9a8" />
</clipPath>
<linearGradient
id="linear-gradient"
x1="16.378942"
y1="29.809677"
x2="16.378942"
y2="34.264748"
gradientUnits="userSpaceOnUse"
gradientTransform="scale(0.98165674,1.018686)">
<stop
offset="0"
stop-color="#a8a9a8"
id="stop4526" />
<stop
offset="1"
stop-color="#545554"
id="stop4528" />
</linearGradient>
<filter
id="Path_1"
x="1826.363"
y="6180.6641"
width="38.157001"
height="39.370998"
filterUnits="userSpaceOnUse">
<feOffset
input="SourceAlpha"
id="feOffset4531" />
<feGaussianBlur
stdDeviation="1"
result="blur"
id="feGaussianBlur4533" />
<feFlood
flood-opacity="0.502"
id="feFlood4535" />
<feComposite
operator="in"
in2="blur"
id="feComposite4537"
result="result1" />
<feComposite
in="SourceGraphic"
in2="result1"
id="feComposite4539" />
</filter>
<linearGradient
id="linear-gradient-2"
x1="0.949"
y1="0.5"
x2="0.056000002"
y2="0.5"
gradientUnits="objectBoundingBox">
<stop
offset="0"
stop-color="#b72b1c"
id="stop4542" />
<stop
offset="1"
stop-color="#8b1104"
id="stop4544" />
</linearGradient>
<linearGradient
inkscape:collect="always"
xlink:href="#linear-gradient-2"
id="linearGradient5121"
gradientUnits="userSpaceOnUse"
x1="7.315846"
y1="3.8545027"
x2="0.43170431"
y2="3.8545027"
gradientTransform="scale(1.2395892,0.80671886)" />
<linearGradient
inkscape:collect="always"
xlink:href="#linear-gradient-2"
id="linearGradient5123"
gradientUnits="userSpaceOnUse"
x1="7.315846"
y1="3.8545027"
x2="0.43170431"
y2="3.8545027"
gradientTransform="scale(1.2395892,0.80671886)" />
<linearGradient
inkscape:collect="always"
xlink:href="#linear-gradient-2"
id="linearGradient5125"
gradientUnits="userSpaceOnUse"
x1="7.315846"
y1="3.8545027"
x2="0.43170431"
y2="3.8545027"
gradientTransform="scale(1.2395892,0.80671886)" />
<linearGradient
inkscape:collect="always"
xlink:href="#linear-gradient-2"
id="linearGradient5127"
gradientUnits="userSpaceOnUse"
x1="7.315846"
y1="3.8545027"
x2="0.43170431"
y2="3.8545027"
gradientTransform="scale(1.2395892,0.80671886)" />
</defs>
<g
id="Touch_sensor"
data-name="Touch sensor"
transform="translate(1346,5555.3655)">
<g
id="Group_8"
data-name="Group 8"
transform="translate(481.391,629.664)">
<g
id="Mask_Group_3"
data-name="Mask Group 3"
class="cls-2"
clip-path="url(#clip-path)">
<g
id="Group_2"
data-name="Group 2">
<path
id="Path_27"
data-name="Path 27"
class="cls-1"
d="M 0.758,0 H 35.342 A 0.758,0.758 0 0 1 36.1,0.758 v 19.719 a 0.758,0.758 0 0 1 -0.758,0.758 H 0.758 A 0.758,0.758 0 0 1 0,20.477 V 0.758 A 0.758,0.758 0 0 1 0.758,0 Z"
transform="translate(0,6.371)"
inkscape:connector-curvature="0"
style="fill:#a8a9a8" />
<g
class="cls-8"
transform="translate(-1827.39,-6183.66)"
id="g4551"
style="filter:url(#Path_1)">
<path
id="Path_1-2"
data-name="Path 1"
class="cls-3"
d="m 1.972,0 h 10.77 v 1.365 h 6.371 V 0 h 11.072 c 1.069,0 1.972,0.6 1.972,1.365 v 30.64 c 0,0.761 -0.9,1.365 -1.972,1.365 H 1.972 C 0.9,33.371 0,32.766 0,32.005 V 1.365 C 0,0.6 0.9,0 1.972,0 Z"
transform="translate(1829.36,6183.66)"
inkscape:connector-curvature="0"
style="fill:url(#linear-gradient)" />
</g>
<rect
id="Rectangle_2"
data-name="Rectangle 2"
width="0.75800002"
height="6.0669999"
transform="translate(34.584,9.404)"
x="0"
y="0" />
<rect
id="Rectangle_5"
data-name="Rectangle 5"
width="0.75800002"
height="6.0669999"
transform="translate(0.91,9.404)"
x="0"
y="0" />
<rect
id="Rectangle_3"
data-name="Rectangle 3"
width="0.75800002"
height="6.0669999"
transform="translate(34.584,18.05)"
x="0"
y="0" />
<rect
id="Rectangle_4"
data-name="Rectangle 4"
width="0.75800002"
height="6.0669999"
transform="translate(0.91,18.05)"
x="0"
y="0" />
</g>
</g>
</g>
<g
id="Group_5"
data-name="Group 5"
transform="translate(485.942,633.835)">
<rect
id="Rectangle_6"
data-name="Rectangle 6"
class="cls-4"
width="9.5559998"
height="6.2189999"
transform="translate(0,10.542)"
x="0"
y="0"
style="fill:url(#linearGradient5121)" />
<rect
id="Rectangle_9"
data-name="Rectangle 9"
class="cls-4"
width="9.5559998"
height="6.2189999"
transform="rotate(90,8.3045,8.3045)"
x="0"
y="0"
style="fill:url(#linearGradient5123)" />
<rect
id="Rectangle_7"
data-name="Rectangle 7"
class="cls-4"
width="9.5559998"
height="6.2189999"
transform="rotate(180,13.5,8.3805)"
x="0"
y="0"
style="fill:url(#linearGradient5125)" />
<rect
id="Rectangle_8"
data-name="Rectangle 8"
class="cls-4"
width="9.5559998"
height="6.2189999"
transform="rotate(-90,18.695,8.305)"
x="0"
y="0"
style="fill:url(#linearGradient5127)" />
<g
id="Ellipse_1"
data-name="Ellipse 1"
class="cls-5"
transform="translate(7.433,7.508)"
style="fill:#b72b1c;stroke:#8b1104;stroke-width:0.25px">
<circle
class="cls-6"
cx="6.0669999"
cy="6.0669999"
id="ellipse4564"
r="6.0669999"
style="stroke:none" />
<circle
class="cls-7"
cx="6.0669999"
cy="6.0669999"
id="ellipse4566"
r="5.9419999"
style="fill:none" />
</g>
<path
id="Hole"
d="m 5606.165,962.241 c 0,0 -0.048,0.917 -0.69,0.925 -0.642,0.008 -1.312,0 -1.312,0 a 2.123,2.123 0 0 0 -0.409,1.52 c 0,1.138 0.321,1.442 0.321,1.442 h 1.463 a 0.58,0.58 0 0 1 0.628,0.628 v 1.5 a 3.487,3.487 0 0 0 1.586,0.258 5.8,5.8 0 0 0 1.507,-0.258 v -1.5 a 0.655,0.655 0 0 1 0.66,-0.628 9.594,9.594 0 0 0 1.3,-0.126 c 0,0 0.356,-0.336 0.39,-1.467 0.034,-1.131 -0.317,-1.477 -0.317,-1.477 h -1.522 a 0.576,0.576 0 0 1 -0.685,-0.609 10.168,10.168 0 0 1 0,-1.476 4.326,4.326 0 0 0 -2.917,0 c -0.019,0.627 0,1.268 0,1.268 z"
transform="translate(-5594.196,-951.087)"
inkscape:connector-curvature="0" />
</g>
</g>
</svg>

After

Width:  |  Height:  |  Size: 10 KiB

View File

@ -0,0 +1,138 @@
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<!-- Created with Inkscape (http://www.inkscape.org/) -->
<svg
xmlns:dc="http://purl.org/dc/elements/1.1/"
xmlns:cc="http://creativecommons.org/ns#"
xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
xmlns:svg="http://www.w3.org/2000/svg"
xmlns="http://www.w3.org/2000/svg"
xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
width="256.68237mm"
height="256.68237mm"
viewBox="0 0 256.68237 256.68237"
version="1.1"
id="svg8853"
inkscape:version="0.92.1 r15371"
sodipodi:docname="brickbuttons.svg"
inkscape:export-filename="C:\gh\pxt-ev3\libs\core\jres\icons\brickButtons-icon.png"
inkscape:export-xdpi="11.874598"
inkscape:export-ydpi="11.874598">
<defs
id="defs8847">
<linearGradient
id="linear-gradient-4"
x1="28.287067"
y1="53.631462"
x2="28.287067"
y2="3.3378232"
gradientUnits="userSpaceOnUse"
gradientTransform="matrix(4.5371664,0,0,3.3819467,4.7045157,7.0563355)">
<stop
offset="0"
stop-color="#6a6a6a"
id="stop8176" />
<stop
offset="0.522"
stop-color="#8ce300"
id="stop8178" />
<stop
offset="1"
stop-color="#6a6a6a"
id="stop8180" />
</linearGradient>
</defs>
<sodipodi:namedview
id="base"
pagecolor="#ffffff"
bordercolor="#666666"
borderopacity="1.0"
inkscape:pageopacity="0.0"
inkscape:pageshadow="2"
inkscape:zoom="0.35"
inkscape:cx="-82.030812"
inkscape:cy="187.27864"
inkscape:document-units="mm"
inkscape:current-layer="layer1"
showgrid="false"
fit-margin-top="0"
fit-margin-left="0"
fit-margin-right="0"
fit-margin-bottom="0"
inkscape:window-width="1600"
inkscape:window-height="837"
inkscape:window-x="-8"
inkscape:window-y="-8"
inkscape:window-maximized="1" />
<metadata
id="metadata8850">
<rdf:RDF>
<cc:Work
rdf:about="">
<dc:format>image/svg+xml</dc:format>
<dc:type
rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
<dc:title></dc:title>
</cc:Work>
</rdf:RDF>
</metadata>
<g
inkscape:label="Layer 1"
inkscape:groupmode="layer"
id="layer1"
transform="translate(-4.695057,58.29823)">
<g
id="g9431"
transform="translate(3.9780427e-6,-32.677281)">
<path
style="fill:#6a6a6a;stroke-width:3.91719985"
inkscape:connector-curvature="0"
d="M 106.30882,198.38022 C 84.431262,177.26258 50.453467,142.52878 50.453467,142.52878 v -7.12931 H 37.087971 a 32.381533,32.381533 0 1 1 0,-64.763062 H 50.457376 V 63.503186 L 105.71341,7.0563355 h 55.25994 c 25.02699,25.5048885 55.25994,55.2599395 55.25994,55.2599395 v 8.320133 h 12.77398 a 32.381533,32.381533 0 0 1 0,64.763062 h -12.77398 v 7.13323 c -29.43384,30.27603 -54.66454,55.85144 -54.66454,55.85144 z"
class="cls-7"
data-name="Union 4"
id="Union_4" />
<path
inkscape:connector-curvature="0"
style="fill:url(#linear-gradient-4);stroke-width:3.91719985"
d="M 106.30882,198.38022 C 84.431262,177.26258 50.453467,142.52878 50.453467,142.52878 v -7.12931 H 37.087971 a 32.381533,32.381533 0 1 1 0,-64.763062 H 50.457376 V 63.503186 L 105.71731,7.0563355 h 55.25604 c 25.02699,25.5048885 55.25994,55.2599395 55.25994,55.2599395 v 8.320133 h 12.77398 a 32.381533,32.381533 0 0 1 0,64.763062 h -12.77398 v 7.13323 c -29.43384,30.27603 -54.66454,55.85144 -54.66454,55.85144 z"
class="cls-8"
id="light" />
<path
style="fill:#a8a9a8;stroke-width:3.91719985"
inkscape:connector-curvature="0"
d="m 36.492567,78.357208 h 40.69971 V 126.48393 H 36.492567 A 24.063359,24.063359 0 0 1 12.429199,102.42057 v 0 A 24.063359,24.063359 0 0 1 36.492567,78.357208 Z"
class="cls-9"
data-name="Rectangle 23"
id="Rectangle_23" />
<path
style="fill:#a8a9a8;stroke-width:3.91719985"
inkscape:connector-curvature="0"
d="M 229.00727,126.48784 H 188.30756 V 78.361126 h 40.69971 a 24.063359,24.063359 0 0 1 24.06335,24.063354 v 0 a 24.063359,24.063359 0 0 1 -24.06335,24.06336 z"
class="cls-9"
data-name="Rectangle 24"
id="Rectangle_24" />
<path
style="fill:#3c3c3c;stroke-width:3.91719985"
inkscape:connector-curvature="0"
d="m 109.27806,78.357208 h 46.9398 a 1.782326,1.782326 0 0 1 1.78233,1.782326 V 124.7016 a 1.782326,1.782326 0 0 1 -1.78233,1.78233 h -46.9398 a 1.782326,1.782326 0 0 1 -1.78233,-1.78233 V 80.139534 a 1.782326,1.782326 0 0 1 1.78233,-1.782326 z"
class="cls-4"
data-name="Path 42"
id="Path_42" />
<path
style="fill:#a8a9a8;stroke-width:3.91719985"
inkscape:connector-curvature="0"
d="m 108.09114,15.967966 49.90905,-0.59542 37.43276,38.619675 -15.44943,15.449437 V 97.367379 H 165.7249 V 81.306861 A 11.978797,11.978797 0 0 0 153.84012,69.422075 c -11.59883,-0.184102 -43.37516,0 -43.37516,0 A 9.6676495,9.6676495 0 0 0 100.36251,79.520618 V 97.347793 H 86.103905 V 69.422075 L 70.654464,53.97264 Z"
class="cls-9"
data-name="Path 15"
id="Path_15" />
<path
style="fill:#a8a9a8;stroke-width:3.91719985"
inkscape:connector-curvature="0"
d="M 157.78865,189.01028 108.18908,189.38233 70.654464,150.794 86.323259,135.4895 v -28.08625 h 14.101921 v 16.11144 a 12.006218,12.006218 0 0 0 11.85346,11.9788 c 11.59882,0.1841 43.13227,0 43.13227,0 a 10.18472,10.18472 0 0 0 10.38059,-10.38058 v -17.70966 h 14.39179 v 28.08632 l 15.3045,15.3045 z"
class="cls-9"
data-name="Path 16"
id="Path_16-2" />
</g>
</g>
</svg>

After

Width:  |  Height:  |  Size: 5.8 KiB

View File

@ -0,0 +1,308 @@
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<svg
xmlns:dc="http://purl.org/dc/elements/1.1/"
xmlns:cc="http://creativecommons.org/ns#"
xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
xmlns:svg="http://www.w3.org/2000/svg"
xmlns="http://www.w3.org/2000/svg"
xmlns:xlink="http://www.w3.org/1999/xlink"
xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
viewBox="2030.391 6170.607 60.976999 60.977"
version="1.1"
id="svg5788"
sodipodi:docname="gyro.svg"
width="60.977001"
height="60.977001"
inkscape:export-filename="C:\gh\pxt-ev3\libs\core\jres\icons\gyroSensor-icon.png"
inkscape:export-xdpi="188.92369"
inkscape:export-ydpi="188.92369"
inkscape:version="0.92.1 r15371">
<metadata
id="metadata5792">
<rdf:RDF>
<cc:Work
rdf:about="">
<dc:format>image/svg+xml</dc:format>
<dc:type
rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
<dc:title></dc:title>
</cc:Work>
</rdf:RDF>
</metadata>
<sodipodi:namedview
pagecolor="#ffffff"
bordercolor="#666666"
borderopacity="1"
objecttolerance="10"
gridtolerance="10"
guidetolerance="10"
inkscape:pageopacity="0"
inkscape:pageshadow="2"
inkscape:window-width="1920"
inkscape:window-height="1137"
id="namedview5790"
showgrid="false"
inkscape:zoom="3.8703117"
inkscape:cx="17.974501"
inkscape:cy="30.488501"
inkscape:window-x="-8"
inkscape:window-y="-8"
inkscape:window-maximized="1"
inkscape:current-layer="svg5788" />
<defs
id="defs5764">
<style
id="style5739">
.cls-1 {
fill: #a8a9a8;
}
.cls-2 {
clip-path: url(#clip-path);
}
.cls-3, .cls-9 {
fill: #9a9a9a;
}
.cls-4 {
fill: #f2f2f2;
}
.cls-5 {
opacity: 0.6;
fill: url(#linear-gradient);
}
.cls-6 {
fill: url(#linear-gradient-2);
}
.cls-7 {
fill: #b72b1c;
}
.cls-8, .cls-9 {
stroke: none;
}
.cls-10 {
filter: url(#Path_12);
}
</style>
<clipPath
id="clip-path">
<path
id="Union_7"
data-name="Union 7"
class="cls-1"
d="M 9.708,60.977 A 9.336,9.336 0 0 1 7.725,60.522 H 3.489 A 1.972,1.972 0 0 1 1.517,58.55 V 54 H 0.758 A 0.758,0.758 0 0 1 0,53.241 V 6.978 A 0.758,0.758 0 0 1 0.758,6.219 H 1.517 V 1.972 A 1.972,1.972 0 0 1 3.489,0 h 12.654 v 0.607 h 3.42 V 0 h 12.746 a 1.972,1.972 0 0 1 1.972,1.972 v 4.247 h 0.91 a 0.759,0.759 0 0 1 0.759,0.759 v 46.263 a 0.758,0.758 0 0 1 -0.759,0.758 h -0.91 v 4.551 a 1.972,1.972 0 0 1 -1.972,1.972 h -4.141 c -0.17,0.3 -1.911,0.455 -2.229,0.455 z"
inkscape:connector-curvature="0"
style="fill:#a8a9a8" />
</clipPath>
<filter
id="Path_12"
x="2030.408"
y="6169.1069"
width="35.764"
height="50.779999"
filterUnits="userSpaceOnUse">
<feOffset
input="SourceAlpha"
id="feOffset5743" />
<feGaussianBlur
stdDeviation="0.5"
result="blur"
id="feGaussianBlur5745" />
<feFlood
flood-opacity="0.502"
id="feFlood5747" />
<feComposite
operator="in"
in2="blur"
id="feComposite5749"
result="result1" />
<feComposite
in="SourceGraphic"
in2="result1"
id="feComposite5751" />
</filter>
<linearGradient
id="linear-gradient"
x1="6.4034481"
x2="6.4034481"
y2="12.806896"
gradientUnits="userSpaceOnUse"
gradientTransform="scale(2.5583092,0.39088316)"
y1="0">
<stop
offset="0"
stop-color="#fff"
stop-opacity="0"
id="stop5754" />
<stop
offset="1"
stop-color="#404040"
id="stop5756" />
</linearGradient>
<linearGradient
id="linear-gradient-2"
x1="0.5"
x2="0.5"
y2="1"
gradientUnits="objectBoundingBox">
<stop
offset="0"
stop-color="#fff"
id="stop5759" />
<stop
offset="1"
stop-color="gray"
id="stop5761" />
</linearGradient>
<linearGradient
inkscape:collect="always"
xlink:href="#linear-gradient-2"
id="linearGradient6337"
gradientUnits="userSpaceOnUse"
x1="-0.54480195"
x2="-0.54480195"
y2="6.8587804"
gradientTransform="scale(3.1897429,0.31350489)"
y1="0.39872125" />
<linearGradient
inkscape:collect="always"
xlink:href="#linear-gradient-2"
id="linearGradient6339"
gradientUnits="userSpaceOnUse"
x1="-0.57290149"
x2="-0.57290149"
y2="6.9009762"
gradientTransform="scale(3.0330478,0.32970136)"
y1="3.2110665e-006" />
</defs>
<g
id="gyro"
transform="translate(1358.514,5554.0004)">
<g
id="Group_16"
data-name="Group 16"
transform="translate(684.391,616.607)">
<g
id="Mask_Group_7"
data-name="Mask Group 7"
class="cls-2"
clip-path="url(#clip-path)">
<g
id="Group_9"
data-name="Group 9">
<path
id="Path_29"
data-name="Path 29"
class="cls-1"
d="m 0.758,0 h 34.433 a 0.758,0.758 0 0 1 0.758,0.758 V 47.022 A 0.758,0.758 0 0 1 35.191,47.78 H 0.758 A 0.758,0.758 0 0 1 0,47.022 V 0.758 A 0.758,0.758 0 0 1 0.758,0 Z"
transform="translate(0,6.219)"
inkscape:connector-curvature="0"
style="fill:#a8a9a8" />
<rect
id="Rectangle_11"
data-name="Rectangle 11"
class="cls-3"
width="5.7639999"
height="15.775"
transform="translate(15.017,0.607)"
x="0"
y="0"
style="fill:#9a9a9a" />
<g
class="cls-10"
transform="translate(-2030.39,-6170.61)"
id="g5769"
style="filter:url(#Path_12)">
<path
id="Path_12-2"
data-name="Path 12"
class="cls-1"
d="m 1.972,0 h 12.655 v 16.015 l 3.42,-0.251 V 0 h 12.745 a 1.972,1.972 0 0 1 1.972,1.972 v 43.837 a 1.972,1.972 0 0 1 -1.972,1.972 H 1.972 A 1.972,1.972 0 0 1 0,45.809 V 1.972 A 1.972,1.972 0 0 1 1.972,0 Z"
transform="translate(2031.91,6170.61)"
inkscape:connector-curvature="0"
style="fill:#a8a9a8" />
</g>
<g
id="hvid"
transform="translate(1.517,29.578)">
<g
id="hvid-2"
data-name="hvid">
<path
id="Path_57"
data-name="Path 57"
class="cls-4"
d="M 1.213,0 H 31.55 a 1.213,1.213 0 0 1 1.213,1.213 v 27.759 a 1.972,1.972 0 0 1 -1.972,1.972 H 1.972 A 1.972,1.972 0 0 1 0,28.972 V 1.213 A 1.213,1.213 0 0 1 1.213,0 Z"
inkscape:connector-curvature="0"
style="fill:#f2f2f2" />
<path
id="Path_59"
data-name="Path 59"
class="cls-5"
d="M 0,0 H 32.764 V 3.034 A 1.972,1.972 0 0 1 30.792,5.006 H 1.972 A 1.972,1.972 0 0 1 0,3.034 Z"
transform="translate(0,25.938)"
inkscape:connector-curvature="0"
style="opacity:0.6;fill:url(#linear-gradient)" />
</g>
<g
id="Path_1"
data-name="Path 1"
class="cls-6"
transform="translate(17.936,29.123)"
style="fill:url(#linearGradient6339)">
<path
class="cls-8"
d="M 6.4848423,2.1502612 H -9.7453671 c -0.1358308,0 -0.6785509,-0.09074 -1.2538699,-0.2385202 -0.648927,-0.1666809 -0.94169,-0.3052633 -1.041505,-0.3812874 l 1.249305,-1.03739253 c 0.303109,-0.25294002 0.75468,-0.36806001 1.0460699,-0.36806001 H 6.4848423 c 0.2201104,0 0.3956304,0.15657998 0.5988703,0.33788 0.052504,0.0468377 0.106761,0.0952419 0.1628327,0.14147469 L 8.5651855,1.7936107 C 8.487011,1.8440639 8.2630816,1.9419193 7.6369224,2.0377111 7.1470423,2.1126511 6.6342626,2.1502612 6.4848423,2.1502612 Z"
id="path5774"
inkscape:connector-curvature="0"
style="fill:url(#linearGradient6337);stroke:none" />
<path
class="cls-9"
d="m 6.4848423,2.0252612 c 0.3687601,0 1.4223461,-0.1225882 1.8561678,-0.2655033 L 7.1648941,0.69904226 C 7.1077342,0.65182292 7.0532455,0.6032095 7.0005026,0.55616105 6.8163424,0.39188105 6.6573024,0.25000107 6.4848423,0.25000107 H -9.7453671 c -0.2695699,0 -0.6867699,0.10602999 -0.9662209,0.33921999 l -1.113573,0.92468484 c 0.473236,0.2207455 1.776214,0.5113553 2.0797939,0.5113553 H 6.4848423 m 0,0.25 H -9.7453671 c -0.3350909,0 -2.4577609,-0.4373601 -2.4577609,-0.7724501 l 1.33183,-1.10592004 c 0.31863,-0.26589 0.79084,-0.396890001307 1.1259309,-0.396890001307 H 6.4848423 c 0.3350902,0 0.5700002,0.284719991307 0.8433003,0.509620021307 L 8.7278528,1.771991 c 0,0.3350902 -1.9079203,0.5032702 -2.2430105,0.5032702 z"
id="path5776"
inkscape:connector-curvature="0"
style="fill:#9a9a9a;stroke:none" />
</g>
</g>
<g
id="red_things"
data-name="red things"
transform="translate(4.551,8.494)">
<circle
id="red_dot"
data-name="red dot"
class="cls-7"
cx="3.0339999"
cy="3.0339999"
transform="translate(10.315,5.916)"
r="3.0339999"
style="fill:#b72b1c" />
<path
id="red_arrow_1"
data-name="red arrow 1"
class="cls-7"
d="m 3122.963,-1932.135 c 0,0 -3.9,-5.13 -0.759,-10.77 0.232,0.143 0.682,0.347 0.91,0.455 0.645,0.367 0.74,-0.309 0.607,-0.758 -0.3,-0.948 -1.214,-3.792 -1.214,-3.792 l -3.792,1.062 a 1.446,1.446 0 0 0 -0.455,0.152 c -0.2,0.125 -0.369,0.4 0,0.607 l 1.062,0.607 c 0,0 -4.526,6.652 1.062,14.258 1.598,-1.14 2.579,-1.821 2.579,-1.821 z"
transform="translate(-3117.592,1947)"
inkscape:connector-curvature="0"
style="fill:#b72b1c" />
<path
id="red_arrow_2"
data-name="red arrow 2"
class="cls-7"
d="m 3118.4,-1932.135 c 0,0 3.9,-5.13 0.758,-10.77 -0.231,0.143 -0.681,0.347 -0.91,0.455 -0.645,0.367 -0.741,-0.309 -0.607,-0.758 0.3,-0.948 1.213,-3.792 1.213,-3.792 l 3.792,1.062 a 1.446,1.446 0 0 1 0.455,0.152 c 0.2,0.125 0.368,0.4 0,0.607 l -1.062,0.607 c 0,0 4.526,6.652 -1.062,14.258 -1.594,-1.14 -2.577,-1.821 -2.577,-1.821 z"
transform="translate(-3097.107,1947)"
inkscape:connector-curvature="0"
style="fill:#b72b1c" />
</g>
</g>
</g>
</g>
</g>
</svg>

After

Width:  |  Height:  |  Size: 11 KiB

View File

@ -0,0 +1,89 @@
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<svg
xmlns:dc="http://purl.org/dc/elements/1.1/"
xmlns:cc="http://creativecommons.org/ns#"
xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
xmlns:svg="http://www.w3.org/2000/svg"
xmlns="http://www.w3.org/2000/svg"
xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
viewBox="1447.52 6142.536 58.928002 58.928"
version="1.1"
id="svg6348"
sodipodi:docname="icn_port.svg"
width="58.928001"
height="58.928001"
inkscape:export-filename="C:\gh\pxt-ev3\libs\core\jres\icons\portB.png"
inkscape:export-xdpi="156.39424"
inkscape:export-ydpi="156.39424"
inkscape:version="0.92.1 r15371">
<metadata
id="metadata6352">
<rdf:RDF>
<cc:Work
rdf:about="">
<dc:format>image/svg+xml</dc:format>
<dc:type
rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
<dc:title></dc:title>
</cc:Work>
</rdf:RDF>
</metadata>
<sodipodi:namedview
pagecolor="#ffffff"
bordercolor="#666666"
borderopacity="1"
objecttolerance="10"
gridtolerance="10"
guidetolerance="10"
inkscape:pageopacity="0"
inkscape:pageshadow="2"
inkscape:window-width="1600"
inkscape:window-height="837"
id="namedview6350"
showgrid="false"
inkscape:zoom="4.0048872"
inkscape:cx="24.98"
inkscape:cy="29.464001"
inkscape:window-x="-8"
inkscape:window-y="-8"
inkscape:window-maximized="1"
inkscape:current-layer="svg6348" />
<defs
id="defs6343">
<style
id="style6341">
.cls-1 {
fill: #eaeaea;
}
.cls-2 {
fill: #a8a9a8;
}
</style>
</defs>
<path
style="fill:#eaeaea;stroke-width:1.08854139"
inkscape:connector-curvature="0"
d="m 1447.5095,6142.536 h 59.1987 v 58.928 h -59.1987 z"
class="cls-1"
data-name="Path 8"
id="Path_8" />
<path
style="fill:#a8a9a8"
inkscape:connector-curvature="0"
d="M 1457.257,6189.022 V 6161.2 h 17.114 v -6.912 h 4.716 v -9.159 h 12.923 v 8.814 h 5.064 v 35.08 h -8.033 v 7.43 h -2.62 v -7.51 h -1.985 v 7.507 h -2.206 v -7.507 h -2.16 v 7.507 h -2.1 v -7.507 h -1.852 v 7.507 h -2.1 v -7.507 h -1.819 v 7.507 h -2.464 v -7.507 h -1.678 v 7.507 h -2.518 v -7.457 z"
class="cls-2"
data-name="Path 9"
id="Path_9" />
<text
xml:space="preserve"
style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:40px;line-height:1.25;font-family:consolas;-inkscape-font-specification:consolas;letter-spacing:0px;word-spacing:0px;fill:#000000;fill-opacity:1;stroke:none"
x="1475.2291"
y="6185.2339"
id="text10060"><tspan
sodipodi:role="line"
id="tspan10058"
x="1475.2291"
y="6185.2339">B</tspan></text>
</svg>

After

Width:  |  Height:  |  Size: 2.9 KiB

View File

@ -0,0 +1,166 @@
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<!-- Created with Inkscape (http://www.inkscape.org/) -->
<svg
xmlns:dc="http://purl.org/dc/elements/1.1/"
xmlns:cc="http://creativecommons.org/ns#"
xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
xmlns:svg="http://www.w3.org/2000/svg"
xmlns="http://www.w3.org/2000/svg"
xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
width="26.48797mm"
height="26.48797mm"
viewBox="0 0 26.48797 26.487971"
version="1.1"
id="svg9467"
inkscape:version="0.92.1 r15371"
sodipodi:docname="screen.svg">
<defs
id="defs9461">
<linearGradient
id="linear-gradient-5"
x1="2.1718912"
y1="1.576793"
x2="2.1718912"
gradientUnits="userSpaceOnUse"
gradientTransform="matrix(0.18480341,0,0,0.37880435,268.75789,80.522339)"
y2="0">
<stop
offset="0"
stop-color="#747474"
id="stop8183" />
<stop
offset="1"
stop-color="#3c3c3c"
id="stop8185" />
</linearGradient>
<linearGradient
id="linear-gradient-2"
x1="44.516197"
y1="82.265938"
x2="44.516197"
y2="84.402718"
gradientUnits="userSpaceOnUse"
gradientTransform="matrix(0.2975093,0,0,0.23530135,255.87506,61.218339)">
<stop
offset="0"
stop-color="#a8a9a8"
id="stop8166" />
<stop
offset="1"
stop-color="gray"
id="stop8168" />
</linearGradient>
</defs>
<sodipodi:namedview
id="base"
pagecolor="#ffffff"
bordercolor="#666666"
borderopacity="1.0"
inkscape:pageopacity="0.0"
inkscape:pageshadow="2"
inkscape:zoom="2.8"
inkscape:cx="1.3096574"
inkscape:cy="-1.004129"
inkscape:document-units="mm"
inkscape:current-layer="layer1"
showgrid="false"
fit-margin-top="0"
fit-margin-left="0"
fit-margin-right="0"
fit-margin-bottom="0"
inkscape:window-width="1920"
inkscape:window-height="1137"
inkscape:window-x="-8"
inkscape:window-y="-8"
inkscape:window-maximized="1" />
<metadata
id="metadata9464">
<rdf:RDF>
<cc:Work
rdf:about="">
<dc:format>image/svg+xml</dc:format>
<dc:type
rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
<dc:title></dc:title>
</cc:Work>
</rdf:RDF>
</metadata>
<g
inkscape:label="Layer 1"
inkscape:groupmode="layer"
id="layer1"
transform="translate(-255.87506,-58.769882)">
<g
id="g10052"
transform="translate(1.7608642e-7,-1.2242278)"
inkscape:export-xdpi="96"
inkscape:export-ydpi="96">
<path
inkscape:connector-curvature="0"
style="fill:url(#linear-gradient-2);stroke-width:0.26458332"
d="m 256.39682,61.218339 h 25.44445 a 0.52175833,0.52175833 0 0 1 0.52176,0.521759 v 19.905926 a 0.52175833,0.52175833 0 0 1 -0.52176,0.521759 h -25.44445 a 0.52175833,0.52175833 0 0 1 -0.52176,-0.521759 V 61.740098 a 0.52175833,0.52175833 0 0 1 0.52176,-0.521759 z"
class="cls-3"
data-name="Path 18"
id="Path_18" />
<path
style="fill:#3c3c3c;stroke-width:0.26458332"
inkscape:connector-curvature="0"
d="m 259.28634,63.987468 h 19.70537 a 1.0033,1.0033 0 0 1 1.0033,1.0033 v 11.076781 a 1.0033,1.0033 0 0 1 -1.0033,1.0033 h -19.70537 a 1.0033,1.0033 0 0 1 -1.0033,-1.0033 V 64.990768 a 1.0033,1.0033 0 0 1 1.0033,-1.0033 z"
class="cls-4"
data-name="Path 17"
id="Path_17" />
<path
style="fill:#a0b5a6;stroke-width:0.26458332"
inkscape:connector-curvature="0"
d="m 260.8114,64.509227 h 16.73569 a 0.7223125,0.7223125 0 0 1 0.72231,0.722312 v 10.675408 a 0.7223125,0.7223125 0 0 1 -0.72231,0.722313 H 260.8114 a 0.7223125,0.7223125 0 0 1 -0.72232,-0.722313 V 65.231539 a 0.7223125,0.7223125 0 0 1 0.72232,-0.722312 z"
class="cls-5"
data-name="Path 16"
id="Path_16" />
<rect
style="fill:#3c3c3c;stroke-width:0.26458332"
y="77.030579"
x="268.7579"
height="3.6520438"
width="0.80274582"
class="cls-4"
data-name="Rectangle 26"
id="Rectangle_26" />
<rect
style="fill:#9a9a9a;stroke-width:0.26458332"
y="80.522354"
x="268.7579"
height="1.6052271"
width="0.80274582"
class="cls-10"
data-name="Rectangle 10"
id="Rectangle_10" />
<rect
y="80.522354"
x="268.7579"
style="fill:url(#linear-gradient-5);stroke-width:0.26458332"
height="1.6454437"
width="0.80274582"
class="cls-11"
data-name="Rectangle 12"
id="Rectangle_12" />
<rect
style="fill:#808080;stroke-width:0.26458332"
y="82.167732"
x="268.7579"
height="1.565275"
width="0.80274582"
class="cls-12"
data-name="Rectangle 11"
id="Rectangle_11" />
<path
style="fill:#a8a9a8;stroke-width:0.26458332"
inkscape:connector-curvature="0"
d="m 257.9621,82.167783 h 6.26083 v 1.511829 c -0.69268,0.697971 -1.58115,1.578239 -1.58115,1.578239 h -4.15792 a 0.52175833,0.52175833 0 0 1 -0.52176,-0.521493 z"
class="cls-9"
data-name="Path 15"
id="Path_15-2" />
</g>
</g>
</svg>

After

Width:  |  Height:  |  Size: 5.4 KiB

View File

@ -0,0 +1,12 @@
<svg xmlns="http://www.w3.org/2000/svg" viewBox="-2186 6829.289 63 68.355">
<defs>
<style>
.cls-1 {
fill: #fff;
}
</style>
</defs>
<g id="trash" transform="translate(49 672)">
<path id="Subtraction_2" data-name="Subtraction 2" class="cls-1" d="M-.5-603.645H-34a9.01,9.01,0,0,1-9-9v-42h-4a2,2,0,0,1-2-2v-2a2,2,0,0,1,2-2h12.82l3.919-7.542a5.256,5.256,0,0,1,1.332-1.9,7.7,7.7,0,0,1,5.481-1.9H-10.78s.083-.005.226-.005a8.02,8.02,0,0,1,2.9.565,5.812,5.812,0,0,1,3.3,3.249c1.682,4.051,3.219,7.508,3.235,7.542H12a2,2,0,0,1,2,2v2a2,2,0,0,1-2,2H8.5v42A9.01,9.01,0,0,1-.5-603.645Zm-7-46a1.5,1.5,0,0,0-1.5,1.5v32a1.5,1.5,0,0,0,1.5,1.5h3a1.5,1.5,0,0,0,1.5-1.5v-32a1.5,1.5,0,0,0-1.5-1.5Zm-11.5,0a1.5,1.5,0,0,0-1.5,1.5v32a1.5,1.5,0,0,0,1.5,1.5h3a1.5,1.5,0,0,0,1.5-1.5v-32a1.5,1.5,0,0,0-1.5-1.5Zm-11.5,0a1.5,1.5,0,0,0-1.5,1.5v32a1.5,1.5,0,0,0,1.5,1.5h3a1.5,1.5,0,0,0,1.5-1.5v-32a1.5,1.5,0,0,0-1.5-1.5Zm5.845-16.571-3.245,5.571H-7.517l-2.437-5.571Z" transform="translate(-2186 6829.29)"/>
</g>
</svg>

After

Width:  |  Height:  |  Size: 1.0 KiB

View File

@ -0,0 +1,535 @@
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<svg
xmlns:dc="http://purl.org/dc/elements/1.1/"
xmlns:cc="http://creativecommons.org/ns#"
xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
xmlns:svg="http://www.w3.org/2000/svg"
xmlns="http://www.w3.org/2000/svg"
xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
viewBox="2330.575 6196.231 83.275 83.274999"
version="1.1"
id="svg5190"
sodipodi:docname="ultra sonic.svg"
width="83.275002"
height="83.275002"
inkscape:version="0.92.1 r15371"
inkscape:export-filename="C:\gh\pxt-ev3\libs\core\jres\icons\ultrasonicSensor-icon.png"
inkscape:export-xdpi="138.33684"
inkscape:export-ydpi="138.33684">
<metadata
id="metadata5194">
<rdf:RDF>
<cc:Work
rdf:about="">
<dc:format>image/svg+xml</dc:format>
<dc:type
rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
<dc:title></dc:title>
</cc:Work>
</rdf:RDF>
</metadata>
<sodipodi:namedview
pagecolor="#ffffff"
bordercolor="#666666"
borderopacity="1"
objecttolerance="10"
gridtolerance="10"
guidetolerance="10"
inkscape:pageopacity="0"
inkscape:pageshadow="2"
inkscape:window-width="1920"
inkscape:window-height="1137"
id="namedview5192"
showgrid="false"
inkscape:zoom="3.4103872"
inkscape:cx="41.637501"
inkscape:cy="17.443501"
inkscape:window-x="-8"
inkscape:window-y="-8"
inkscape:window-maximized="1"
inkscape:current-layer="svg5190" />
<defs
id="defs5133">
<style
id="style5129">
.cls-1 {
fill: #f2f2f2;
}
.cls-2 {
fill: #292929;
}
.cls-3 {
stroke: rgba(242,242,242,0.5);
stroke-width: 0.25px;
}
.cls-4 {
fill: #931f1f;
}
.cls-5 {
fill: #9d761f;
}
.cls-6 {
clip-path: url(#clip-path);
}
.cls-7 {
stroke: none;
}
.cls-8 {
fill: none;
}
</style>
<clipPath
id="clip-path">
<circle
id="guld"
class="cls-1"
cx="6.9770002"
cy="6.9770002"
r="6.9770002"
style="fill:#f2f2f2" />
</clipPath>
</defs>
<g
id="ultra_sonic"
data-name="ultra sonic"
transform="translate(1222,5578.1935)">
<rect
id="Rectangle_1"
data-name="Rectangle 1"
class="cls-2"
width="43.382"
height="31.247"
transform="translate(1131.024,643.596)"
x="0"
y="0"
style="fill:#292929" />
<rect
id="Rectangle_2"
data-name="Rectangle 2"
width="25.330999"
height="17.594999"
transform="translate(1138.609,650.573)"
x="0"
y="0" />
<g
id="eye1"
transform="translate(1108.575,642.231)">
<g
id="sort"
class="cls-3"
style="stroke-width:0.25px">
<circle
class="cls-7"
cx="17.444"
cy="17.444"
id="ellipse5137"
r="17.444"
style="stroke:none" />
<circle
class="cls-8"
cx="17.444"
cy="17.444"
id="ellipse5139"
r="17.319"
style="fill:none" />
</g>
<circle
id="rød"
class="cls-4"
cx="10.77"
cy="10.77"
transform="translate(6.674,6.674)"
r="10.77"
style="fill:#931f1f" />
<circle
id="guld-3"
data-name="guld"
class="cls-5"
cx="8.0389996"
cy="8.0389996"
transform="translate(9.404,9.404)"
r="8.0389996"
style="fill:#9d761f" />
<circle
id="guld-4"
data-name="guld"
class="cls-1"
cx="6.9770002"
cy="6.9770002"
transform="translate(10.466,10.466)"
r="6.9770002"
style="fill:#f2f2f2" />
<g
id="Group_5"
data-name="Group 5"
transform="translate(10.466,10.466)">
<g
id="Mask_Group_8"
data-name="Mask Group 8"
class="cls-6"
clip-path="url(#clip-path)">
<g
id="Group_17"
data-name="Group 17"
transform="rotate(-30,2.4159415,14.94335)">
<rect
id="Rectangle_84"
data-name="Rectangle 84"
class="cls-5"
width="0.60699999"
height="22.791"
transform="translate(2.048)"
x="0"
y="0"
style="fill:#9d761f" />
<rect
id="Rectangle_91"
data-name="Rectangle 91"
class="cls-5"
width="0.60699999"
height="22.507"
transform="rotate(-90,10.049,10.049)"
x="0"
y="0"
style="fill:#9d761f" />
<rect
id="Rectangle_85"
data-name="Rectangle 85"
class="cls-5"
width="0.60699999"
height="22.791"
transform="translate(4.93)"
x="0"
y="0"
style="fill:#9d761f" />
<rect
id="Rectangle_97"
data-name="Rectangle 97"
class="cls-5"
width="0.60699999"
height="22.507"
transform="rotate(-90,8.608,8.608)"
x="0"
y="0"
style="fill:#9d761f" />
<rect
id="Rectangle_86"
data-name="Rectangle 86"
class="cls-5"
width="0.60699999"
height="22.791"
transform="translate(7.812)"
x="0"
y="0"
style="fill:#9d761f" />
<rect
id="Rectangle_96"
data-name="Rectangle 96"
class="cls-5"
width="0.60699999"
height="22.507"
transform="rotate(-90,7.167,7.167)"
x="0"
y="0"
style="fill:#9d761f" />
<rect
id="Rectangle_87"
data-name="Rectangle 87"
class="cls-5"
width="0.60699999"
height="22.791"
transform="translate(10.694)"
x="0"
y="0"
style="fill:#9d761f" />
<rect
id="Rectangle_95"
data-name="Rectangle 95"
class="cls-5"
width="0.60699999"
height="22.507"
transform="rotate(-90,5.726,5.726)"
x="0"
y="0"
style="fill:#9d761f" />
<rect
id="Rectangle_88"
data-name="Rectangle 88"
class="cls-5"
width="0.60699999"
height="22.791"
transform="translate(13.576)"
x="0"
y="0"
style="fill:#9d761f" />
<rect
id="Rectangle_94"
data-name="Rectangle 94"
class="cls-5"
width="0.60699999"
height="22.507"
transform="rotate(-90,4.285,4.285)"
x="0"
y="0"
style="fill:#9d761f" />
<rect
id="Rectangle_89"
data-name="Rectangle 89"
class="cls-5"
width="0.60699999"
height="22.791"
transform="translate(16.458)"
x="0"
y="0"
style="fill:#9d761f" />
<rect
id="Rectangle_93"
data-name="Rectangle 93"
class="cls-5"
width="0.60699999"
height="22.507"
transform="rotate(-90,2.844,2.844)"
x="0"
y="0"
style="fill:#9d761f" />
<rect
id="Rectangle_90"
data-name="Rectangle 90"
class="cls-5"
width="0.60699999"
height="22.791"
transform="translate(19.34)"
x="0"
y="0"
style="fill:#9d761f" />
<rect
id="Rectangle_92"
data-name="Rectangle 92"
class="cls-5"
width="0.60699999"
height="22.507"
transform="rotate(-90,1.403,1.403)"
x="0"
y="0"
style="fill:#9d761f" />
</g>
</g>
</g>
</g>
<g
id="eye2"
transform="translate(1156.962,642.231)">
<g
id="sort-2"
data-name="sort"
class="cls-3"
style="stroke-width:0.25px">
<circle
class="cls-7"
cx="17.444"
cy="17.444"
id="ellipse5163"
r="17.444"
style="stroke:none" />
<circle
class="cls-8"
cx="17.444"
cy="17.444"
id="ellipse5165"
r="17.319"
style="fill:none" />
</g>
<circle
id="rød-2"
data-name="rød"
class="cls-4"
cx="10.77"
cy="10.77"
transform="translate(6.674,6.674)"
r="10.77"
style="fill:#931f1f" />
<circle
id="guld-5"
data-name="guld"
class="cls-5"
cx="8.0389996"
cy="8.0389996"
transform="translate(9.404,9.404)"
r="8.0389996"
style="fill:#9d761f" />
<circle
id="guld-6"
data-name="guld"
class="cls-1"
cx="6.9770002"
cy="6.9770002"
transform="translate(10.466,10.466)"
r="6.9770002"
style="fill:#f2f2f2" />
<g
id="Group_18"
data-name="Group 18"
transform="translate(10.466,10.466)">
<g
id="Mask_Group_8-2"
data-name="Mask Group 8"
class="cls-6"
clip-path="url(#clip-path)">
<g
id="Group_17-2"
data-name="Group 17"
transform="rotate(-30,2.4159415,14.94335)">
<rect
id="Rectangle_84-2"
data-name="Rectangle 84"
class="cls-5"
width="0.60699999"
height="22.791"
transform="translate(2.048)"
x="0"
y="0"
style="fill:#9d761f" />
<rect
id="Rectangle_91-2"
data-name="Rectangle 91"
class="cls-5"
width="0.60699999"
height="22.507"
transform="rotate(-90,10.049,10.049)"
x="0"
y="0"
style="fill:#9d761f" />
<rect
id="Rectangle_85-2"
data-name="Rectangle 85"
class="cls-5"
width="0.60699999"
height="22.791"
transform="translate(4.93)"
x="0"
y="0"
style="fill:#9d761f" />
<rect
id="Rectangle_97-2"
data-name="Rectangle 97"
class="cls-5"
width="0.60699999"
height="22.507"
transform="rotate(-90,8.608,8.608)"
x="0"
y="0"
style="fill:#9d761f" />
<rect
id="Rectangle_86-2"
data-name="Rectangle 86"
class="cls-5"
width="0.60699999"
height="22.791"
transform="translate(7.812)"
x="0"
y="0"
style="fill:#9d761f" />
<rect
id="Rectangle_96-2"
data-name="Rectangle 96"
class="cls-5"
width="0.60699999"
height="22.507"
transform="rotate(-90,7.167,7.167)"
x="0"
y="0"
style="fill:#9d761f" />
<rect
id="Rectangle_87-2"
data-name="Rectangle 87"
class="cls-5"
width="0.60699999"
height="22.791"
transform="translate(10.694)"
x="0"
y="0"
style="fill:#9d761f" />
<rect
id="Rectangle_95-2"
data-name="Rectangle 95"
class="cls-5"
width="0.60699999"
height="22.507"
transform="rotate(-90,5.726,5.726)"
x="0"
y="0"
style="fill:#9d761f" />
<rect
id="Rectangle_88-2"
data-name="Rectangle 88"
class="cls-5"
width="0.60699999"
height="22.791"
transform="translate(13.576)"
x="0"
y="0"
style="fill:#9d761f" />
<rect
id="Rectangle_94-2"
data-name="Rectangle 94"
class="cls-5"
width="0.60699999"
height="22.507"
transform="rotate(-90,4.285,4.285)"
x="0"
y="0"
style="fill:#9d761f" />
<rect
id="Rectangle_89-2"
data-name="Rectangle 89"
class="cls-5"
width="0.60699999"
height="22.791"
transform="translate(16.458)"
x="0"
y="0"
style="fill:#9d761f" />
<rect
id="Rectangle_93-2"
data-name="Rectangle 93"
class="cls-5"
width="0.60699999"
height="22.507"
transform="rotate(-90,2.844,2.844)"
x="0"
y="0"
style="fill:#9d761f" />
<rect
id="Rectangle_90-2"
data-name="Rectangle 90"
class="cls-5"
width="0.60699999"
height="22.791"
transform="translate(19.34)"
x="0"
y="0"
style="fill:#9d761f" />
<rect
id="Rectangle_92-2"
data-name="Rectangle 92"
class="cls-5"
width="0.60699999"
height="22.507"
transform="rotate(-90,1.403,1.403)"
x="0"
y="0"
style="fill:#9d761f" />
</g>
</g>
</g>
</g>
</g>
</svg>

After

Width:  |  Height:  |  Size: 15 KiB

View File

@ -144,6 +144,12 @@
"loops.pause|param|ms": "how long to pause for, eg: 100, 200, 500, 1000, 2000",
"loops.timePicker": "Get the time field editor",
"loops.timePicker|param|ms": "time duration in milliseconds, eg: 500, 1000",
"loops.waitUntil": "Busy wait for a condition to be true",
"loops.waitUntil|param|condition": "condition to test for",
"loops.waitUntil|param|timeOut": "if positive, maximum duration to wait for in milliseconds",
"loops.when": "Runs code when the condition becomes true",
"loops.when|param|condition": "condition to test",
"loops.when|param|handler": "code to run",
"parseInt": "Convert a string to an integer.",
"serial": "Reading and writing data over a serial connection.",
"serial.writeBuffer": "Send a buffer across the serial connection.",
@ -151,6 +157,6 @@
"serial.writeNumber": "Write a number to the serial port.",
"serial.writeString": "Write some text to the serial port.",
"serial.writeValue": "Write a name:value pair as a line of text to the serial port.",
"serial.writeValue|param|name": "name of the value stream, eg: x",
"serial.writeValue|param|name": "name of the value stream, eg: \"x\"",
"serial.writeValue|param|value": "to write"
}

View File

@ -30,7 +30,7 @@
"control.waitMicros|block": "wait (µs)%micros",
"control|block": "control",
"loops.forever|block": "forever",
"loops.pause|block": "pause %ms=timePicker|ms",
"loops.pause|block": "pause %pause=timePicker|ms",
"loops.timePicker|block": "%ms",
"loops|block": "loops",
"parseInt|block": "parse to integer %text",

View File

@ -17,7 +17,8 @@
"control.cpp",
"control.ts",
"serial.cpp",
"serial.ts"
"serial.ts",
"loops.ts"
],
"testFiles": [
"test.ts"

10
libs/base/shims.d.ts vendored
View File

@ -79,7 +79,7 @@ declare namespace loops {
* @param ms how long to pause for, eg: 100, 200, 500, 1000, 2000
*/
//% help=loops/pause weight=99
//% async block="pause %ms=timePicker|ms"
//% async block="pause %pause=timePicker|ms"
//% blockId=device_pause shim=loops::pause
function pause(ms: int32): void;
}
@ -99,8 +99,8 @@ declare namespace control {
*/
//% weight=20 blockGap=8 blockId="control_on_event" block="on event|from %src|with value %value"
//% blockExternalInputs=1
//% help="control/on-event" shim=control::onEvent
function onEvent(src: int32, value: int32, handler: () => void): void;
//% help="control/on-event" flags.defl=16 shim=control::onEvent
function onEvent(src: int32, value: int32, handler: () => void, flags?: int32): void;
/**
* Reset the device.
@ -144,14 +144,14 @@ declare namespace serial {
* Write some text to the serial port.
*/
//% help=serial/write-string
//% weight=87
//% weight=87 blockHidden=true
//% blockId=serial_writestring block="serial|write string %text" shim=serial::writeString
function writeString(text: string): void;
/**
* Send a buffer across the serial connection.
*/
//% help=serial/write-buffer weight=6
//% help=serial/write-buffer weight=6 blockHidden=true
//% blockId=serial_writebuffer block="serial|write buffer %buffer" shim=serial::writeBuffer
function writeBuffer(buffer: Buffer): void;
}

View File

@ -0,0 +1,3 @@
# Color sensor
The library to interact with the Touch Sensor.

View File

@ -0,0 +1,12 @@
{
"sensors.ColorSensor": "The color sensor is a digital sensor that can detect the color or intensity\nof light that enters the small window on the face of the sensor.",
"sensors.ColorSensor.color": "Get the current color from the color sensor.",
"sensors.ColorSensor.colorMode": "Gets the current color mode",
"sensors.ColorSensor.light": "Measures the ambient or reflected light value from 0 (darkest) to 100 (brightest).",
"sensors.ColorSensor.onColorDetected": "Registers code to run when the given color is detected.",
"sensors.ColorSensor.onColorDetected|param|color": "the color to detect, eg: ColorSensorColor.Blue",
"sensors.ColorSensor.onColorDetected|param|handler": "the code to run when detected",
"sensors.ColorSensor.onLightChanged": "Registers code to run when the ambient light changes.",
"sensors.ColorSensor.onLightChanged|param|condition": "the light condition",
"sensors.ColorSensor.onLightChanged|param|handler": "the code to run when detected"
}

View File

@ -0,0 +1,27 @@
{
"ColorSensorColor.Black|block": "black",
"ColorSensorColor.Blue|block": "blue",
"ColorSensorColor.Brown|block": "brown",
"ColorSensorColor.Green|block": "green",
"ColorSensorColor.None|block": "none",
"ColorSensorColor.Red|block": "red",
"ColorSensorColor.White|block": "white",
"ColorSensorColor.Yellow|block": "yellow",
"ColorSensorMode.AmbientLightIntensity|block": "ambient light intensity",
"ColorSensorMode.Color|block": "color",
"ColorSensorMode.ReflectedLightIntensity|block": "reflected light intensity",
"LightCondition.Dark|block": "dark",
"LightIntensityMode.Ambient|block": "ambient light",
"LightIntensityMode.Reflected|block": "reflected light",
"sensors.ColorSensor.color|block": "`icons.colorSensor` %sensor| color",
"sensors.ColorSensor.light|block": "`icons.colorSensor` %sensor|%mode",
"sensors.ColorSensor.onColorDetected|block": "on `icons.colorSensor` %sensor|detected color %color",
"sensors.ColorSensor.onLightChanged|block": "on `icons.colorSensor` %sensor|%mode|%condition",
"sensors.color1|block": "1",
"sensors.color2|block": "2",
"sensors.color3|block": "3",
"sensors.color4|block": "4",
"sensors|block": "sensors",
"{id:category}Sensors": "Sensors",
"{id:group}Color Sensor": "Color Sensor"
}

193
libs/color-sensor/color.ts Normal file
View File

@ -0,0 +1,193 @@
const enum ColorSensorMode {
None = -1,
//% block="reflected light intensity"
ReflectedLightIntensity = 0,
//% block="ambient light intensity"
AmbientLightIntensity = 1,
//% block="color"
Color = 2,
RefRaw = 3,
RgbRaw = 4,
ColorCal = 5,
}
enum LightIntensityMode {
//% block="reflected light"
Reflected = ColorSensorMode.ReflectedLightIntensity,
//% block="ambient light"
Ambient = ColorSensorMode.AmbientLightIntensity
}
const enum ColorSensorColor {
//% block="none"
None,
//% block="black"
Black,
//% block="blue"
Blue,
//% block="green"
Green,
//% block="yellow"
Yellow,
//% block="red"
Red,
//% block="white"
White,
//% block="brown"
Brown,
}
enum LightCondition {
//% block="dark"
Dark = sensors.internal.ThresholdState.Low,
//$ block="bright"
Bright = sensors.internal.ThresholdState.High
}
namespace sensors {
/**
* The color sensor is a digital sensor that can detect the color or intensity
* of light that enters the small window on the face of the sensor.
*/
//% fixedInstances
export class ColorSensor extends internal.UartSensor {
thresholdDetector: sensors.internal.ThresholdDetector;
constructor(port: number) {
super(port)
this.thresholdDetector = new sensors.internal.ThresholdDetector(this.id());
}
_colorEventValue(value: number) {
return 0xff00 | value;
}
_deviceType() {
return DAL.DEVICE_TYPE_COLOR
}
setMode(m: ColorSensorMode) {
this._setMode(m)
}
/**
* Gets the current color mode
*/
colorMode() {
return <ColorSensorMode>this.mode;
}
_query() {
if (this.mode == ColorSensorMode.Color)
return this.getNumber(NumberFormat.UInt8LE, 0)
return 0
}
_update(prev: number, curr: number) {
if (this.mode == ColorSensorMode.Color)
control.raiseEvent(this._id, this._colorEventValue(curr));
else
this.thresholdDetector.setLevel(curr);
}
/**
* Registers code to run when the given color is detected.
* @param color the color to detect, eg: ColorSensorColor.Blue
* @param handler the code to run when detected
*/
//% help=sensors/color-sensor/on-color-detected
//% block="on `icons.colorSensor` %sensor|detected color %color"
//% blockId=colorOnColorDetected
//% parts="colorsensor"
//% sensor.fieldEditor="imagedropdown"
//% sensor.fieldOptions.columns=4
//% blockNamespace=sensors
//% weight=100 blockGap=8
//% group="Color Sensor"
onColorDetected(color: ColorSensorColor, handler: () => void) {
const v = this._colorEventValue(<number>color);
control.onEvent(this._id, v, handler);
this.setMode(ColorSensorMode.Color)
if (this.color() == color)
control.raiseEvent(this._id, v);
}
/**
* Get the current color from the color sensor.
* @param sensor the color sensor to query the request
*/
//% help=sensors/color-sensor/color
//% block="`icons.colorSensor` %sensor| color"
//% blockId=colorGetColor
//% parts="colorsensor"
//% sensor.fieldEditor="imagedropdown"
//% sensor.fieldOptions.columns=4
//% blockNamespace=sensors
//% weight=99
//% group="Color Sensor"
color(): ColorSensorColor {
this.setMode(ColorSensorMode.Color)
return this.getNumber(NumberFormat.UInt8LE, 0)
}
/**
* Registers code to run when the ambient light changes.
* @param condition the light condition
* @param handler the code to run when detected
*/
//% help=sensors/color-sensor/on-light-changed
//% block="on `icons.colorSensor` %sensor|%mode|%condition"
//% blockId=colorOnLightChanged
//% parts="colorsensor"
//% sensor.fieldEditor="imagedropdown"
//% sensor.fieldOptions.columns=4
//% blockNamespace=sensors
//% weight=89 blockGap=8
//% group="Color Sensor"
onLightChanged(mode: LightIntensityMode, condition: LightCondition, handler: () => void) {
control.onEvent(this._id, <number>condition, handler);
this.setMode(<ColorSensorMode><number>mode)
}
/**
* Measures the ambient or reflected light value from 0 (darkest) to 100 (brightest).
* @param sensor the color sensor port
*/
//% help=sensors/color-sensor/light
//% block="`icons.colorSensor` %sensor|%mode"
//% blockId=colorLight
//% parts="colorsensor"
//% sensor.fieldEditor="imagedropdown"
//% sensor.fieldOptions.columns=4
//% blockNamespace=sensors
//% weight=88
//% group="Color Sensor"
light(mode: LightIntensityMode) {
this.setMode(<ColorSensorMode><number>mode)
return this.getNumber(NumberFormat.UInt8LE, 0)
}
//%
ambientLight() {
return this.light(LightIntensityMode.Ambient);
}
//%
reflectedLight() {
return this.light(LightIntensityMode.Reflected);
}
}
//% whenUsed block="1" weight=95 fixedInstance jres=icons.port1
export const color1: ColorSensor = new ColorSensor(1)
//% whenUsed block="3" weight=90 fixedInstance jres=icons.port3
export const color3: ColorSensor = new ColorSensor(3)
//% whenUsed block="2" weight=90 fixedInstance jres=icons.port2
export const color2: ColorSensor = new ColorSensor(2)
//% whenUsed block="4" weight=90 fixedInstance jres=icons.port4
export const color4: ColorSensor = new ColorSensor(4)
}

View File

@ -0,0 +1,16 @@
# Color Sensor
```cards
sensors.color1.onColorDetected(ColorSensorColor.Blue, function () {
})
sensors.color1.color();
sensors.color1.ambientLight();
sensors.color1.reflectedLight();
```
## See Also
[on color detected](/reference/sensors/color-sensor/on-color-detected),
[color](/reference/sensors/color-sensor/color),
[ambient light](/reference/sensors/color-sensor/ambient-light),
[reflected light](/reference/sensors/color-sensor/reflected-light),

View File

@ -0,0 +1,11 @@
# Ambient Light
```blocks
loops.forever(function () {
if (sensors.color1.ambientLight() > 20) {
brick.setStatusLight(LightsPattern.Green)
} else {
brick.setStatusLight(LightsPattern.Orange)
}
})
```

View File

@ -0,0 +1,11 @@
# color
```blocks
loops.forever(function () {
if (sensors.color1.color() == ColorSensorColor.Green) {
brick.setStatusLight(LightsPattern.Green)
} else {
brick.setStatusLight(LightsPattern.Orange)
}
})
```

View File

@ -0,0 +1,16 @@
# On Color Detected
```sig
sensors.color1.onColorDetected(ColorSensorColor.Blue, function () { })
```
# Parameters
## Examples
```blocks
sensors.color1.onColorDetected(ColorSensorColor.Blue, function () {
brick.showImage(images.expressionsSick)
})
```

View File

@ -0,0 +1,11 @@
# Reflected Light
```blocks
loops.forever(function () {
if (sensors.color1.reflectedLight() > 20) {
brick.setStatusLight(LightsPattern.Green)
} else {
brick.setStatusLight(LightsPattern.Orange)
}
})
```

View File

@ -0,0 +1,15 @@
{
"name": "color-sensor",
"description": "Color Sensor support",
"files": [
"README.md",
"color.ts"
],
"testFiles": [
"test.ts"
],
"public": true,
"dependencies": {
"core": "file:../core"
}
}

View File

View File

@ -20,7 +20,7 @@ DEPS = $(PXT_HEADERS) package.json Makefile Makefile.inc
all: $(EXE)
$(EXE): $(PXT_OBJS)
$(LD) -o $(EXE) $(LDFLAGS) -Wl,-Map,$(EXE:.elf=.map) $(PXT_OBJS) $(LIBSTDCPP) -lm -lpthread $(NPM_LIBS)
$(LD) -o $(EXE) $(LDFLAGS) -Wl,-Map,$(EXE:.elf=.map) $(PXT_OBJS) $(LIBSTDCPP) -lm -lpthread -lz $(NPM_LIBS)
cp $(EXE) $(EXE:.elf=.full)
$(PREF)strip $(EXE)
node -p 'require("fs").readFileSync("$(EXE)").toString("hex")' > $(HEX)

View File

@ -1,6 +1,11 @@
{
"ButtonEvent": "User interaction on buttons",
"Draw": "Drawing modes",
"Image.buffer": "Returns the underlaying Buffer object.",
"Image.doubled": "Double size of an image.",
"Image.draw": "Draw an image on the screen.",
"Image.height": "Returns the height of an image.",
"Image.width": "Returns the width of an image.",
"LightsPattern": "Patterns for lights under the buttons.",
"MMap.getNumber": "Read a number in specified format from the buffer.",
"MMap.ioctl": "Perform ioctl(2) on the underlaying file",
@ -9,6 +14,34 @@
"MMap.setNumber": "Write a number in specified format in the buffer.",
"MMap.slice": "Read a range of bytes into a buffer.",
"MMap.write": "Perform write(2) on the underlaying file",
"brick.Button": "Generic button class, for device buttons and sensors.",
"brick.Button.isPressed": "Check if button is currently pressed or not.",
"brick.Button.onEvent": "Do something when a button or sensor is clicked, up or down.",
"brick.Button.onEvent|param|body": "code to run when the event is raised",
"brick.Button.waitUntil": "Waits until the event is raised",
"brick.Button.waitUntil|param|ev": "the event to wait for",
"brick.Button.wasPressed": "See if the button was pressed again since the last time you checked.",
"brick._imagePicker": "An image",
"brick._imagePicker|param|image": "the image",
"brick.buttonDown": "Down button on the EV3 Brick.",
"brick.buttonEnter": "Enter button on the EV3 Brick.",
"brick.buttonLeft": "Left button on the EV3 Brick.",
"brick.buttonRight": "Right button on the EV3 Brick.",
"brick.buttonUp": "Up button on the EV3 Brick.",
"brick.lightPattern": "Pattern block.",
"brick.lightPattern|param|pattern": "the lights pattern to use. eg: LightsPattern.Green",
"brick.print": "Show text on the screen.",
"brick.print|param|text": "the text to print on the screen, eg: \"Hello world\"",
"brick.print|param|x": "the starting position's x coordinate, eg: 0",
"brick.print|param|y": "the starting position's x coordinate, eg: 0",
"brick.setPixel": "Sets a pixel on or off",
"brick.setPixel|param|on": "a value indicating if the pixel should be on or off",
"brick.setPixel|param|x": "the starting position's x coordinate, eg: 0",
"brick.setPixel|param|y": "the starting position's x coordinate, eg: 0",
"brick.setStatusLight": "Set lights.",
"brick.setStatusLight|param|pattern": "the lights pattern to use.",
"brick.showImage": "Shows an image on screen",
"brick.showImage|param|image": "image to draw",
"control": "Program controls and events.",
"control.allocateNotifyEvent": "Allocates the next user notification event",
"control.deviceFirmwareVersion": "Determine the version of system software currently running.",
@ -17,54 +50,26 @@
"control.raiseEvent": "Announce that an event happened to registered handlers.",
"control.raiseEvent|param|src": "ID of the Component that generated the event",
"control.raiseEvent|param|value": "Component specific code indicating the cause of the event.",
"input": "Respond to and read data from buttons and sensors.",
"input.Button": "Generic button class, for device buttons and sensors.",
"input.Button.isPressed": "Check if button is currently pressed or not.",
"input.Button.onEvent": "Do something when a button or sensor is clicked, double clicked, etc...",
"input.Button.onEvent|param|body": "code to run when the event is raised",
"input.Button.wasPressed": "See if the button was pressed again since the last time you checked.",
"input.ColorSensor.getAmbientLight": "Get current ambient light value from the color sensor.",
"input.ColorSensor.getColor": "Get the current color from the color sensor.",
"input.ColorSensor.getReflectedLight": "Get current reflected light value from the color sensor.",
"input.UltraSonicSensor.getDistance": "Get distance in mm",
"input.buttonDown": "Down button.",
"input.buttonEnter": "Enter button.",
"input.buttonLeft": "Left button.",
"input.buttonRight": "Right button.",
"input.buttonUp": "Up button.",
"input.remoteBottomLeft": "Remote bottom-left button.",
"input.remoteBottomRight": "Remote bottom-right button.",
"input.remoteCenter": "Remote beacon (center) button.",
"input.remoteTopLeft": "Remote top-left button.",
"input.remoteTopRight": "Remote top-right button.",
"motors.Motor.clearCount": "Clears the motor count",
"motors.Motor.count": "Gets motor step count.",
"motors.Motor.move": "Moves the motor by a number of degrees",
"motors.Motor.move|param|angle": "the degrees to rotate, eg: 360",
"motors.Motor.move|param|power": "the power from ``100`` full forward to ``-100`` full backward, eg: 50",
"motors.Motor.power": "Sets the motor power level from ``-100`` to ``100``.",
"motors.Motor.power|param|power": "the power from ``100`` full forward to ``-100`` full backward, eg: 50",
"motors.Motor.reset": "Resets the motor.",
"motors.Motor.setBrake": "Sets the automatic brake on or off when the motor is off",
"motors.Motor.setBrake|param|brake": "a value indicating if the motor should break when off",
"motors.Motor.setReversed": "Reverses the motor polarity",
"motors.Motor.speed": "Gets motor actual speed.",
"motors.Motor.stop": "Stops the motor",
"motors.Motor.tachoCount": "Gets motor tacho count.",
"motors.stopAllMotors": "Stops all motors",
"output.createBuffer": "Create a new zero-initialized buffer.",
"output.createBuffer|param|size": "number of bytes in the buffer",
"output.getCurrentSpeed": "Get motor speed.",
"output.getCurrentSpeed|param|out": "the output connection that the motor is connected to",
"output.getPattern": "Pattern block.",
"output.getPattern|param|pattern": "the lights pattern to use. eg: LightsPattern.Green",
"output.setLights": "Set lights.",
"output.setLights|param|pattern": "the lights pattern to use.",
"output.setPower": "Set motor power.",
"output.setPower|param|out": "the output connection that the motor is connected to",
"output.setPower|param|power": "the desired power to use. eg: 100",
"output.setSpeed": "Set motor speed.",
"output.setSpeed|param|out": "the output connection that the motor is connected to",
"output.setSpeed|param|speed": "the desired speed to use. eg: 100",
"output.switchMotor": "Switch the motor on or off.",
"output.switchMotor|param|on": "1 to turn the motor on, 0 to turn it off",
"output.switchMotor|param|out": "the output connection that the motor is connected to",
"output.turn": "Turn a motor on for a specified number of milliseconds.",
"output.turn|param|ms": "the number of milliseconds to turn the motor on, eg: 500",
"output.turn|param|out": "the output connection that the motor is connected to",
"output.turn|param|useBrake": "whether or not to use the brake, defaults to false",
"screen.clear": "Clear screen and reset font to normal.",
"screen.doubleIcon": "Double size of an icon.",
"screen.drawIcon": "Draw an icon on the screen.",
"screen.drawText": "Show text on the screen.",
"screen.drawText|param|text": "the text to print on the screen, eg: \"Hello world\"",
"screen.drawText|param|x": "the starting position's x coordinate, eg: 0",
"screen.drawText|param|y": "the starting position's x coordinate, eg: 0",
"screen.imageOf": "Makes an image bound to a buffer.",
"screen.unpackPNG": "Decompresses a 1-bit gray scale PNG image to image format.",
"serial": "Reading and writing data over a serial connection.",
"serial.writeDmesg": "Send DMESG debug buffer over serial."
}

View File

@ -1,7 +1,6 @@
{
"ButtonEvent.Click|block": "click",
"ButtonEvent.Down|block": "down",
"ButtonEvent.LongClick|block": "long click",
"ButtonEvent.Up|block": "up",
"LightsPattern.GreenFlash|block": "Flashing Green",
"LightsPattern.GreenPulse|block": "Pulsing Green",
@ -13,45 +12,61 @@
"LightsPattern.RedFlash|block": "Flashing Red",
"LightsPattern.RedPulse|block": "Pulsing Red",
"LightsPattern.Red|block": "Red",
"Output.ALL|block": "All",
"Output.A|block": "A",
"Output.B|block": "B",
"Output.C|block": "C",
"Output.D|block": "D",
"brick.Button.isPressed|block": "`icons.brickButtons` %button|is pressed",
"brick.Button.onEvent|block": "on `icons.brickButtons` %button|%event",
"brick.Button.waitUntil|block": "wait until `icons.brickButtons` %button|%event",
"brick.Button.wasPressed|block": "`icons.brickButtons` %button|was pressed",
"brick._imagePicker|block": "%image",
"brick.buttonDown|block": "down",
"brick.buttonEnter|block": "enter",
"brick.buttonLeft|block": "left",
"brick.buttonRight|block": "right",
"brick.buttonUp|block": "up",
"brick.lightPattern|block": "%pattern",
"brick.print|block": "`icons.brickDisplay` print %text| at x: %x| y: %y",
"brick.setPixel|block": "`icons.brickDisplay` set pixel %on| at x: %x| y: %y",
"brick.setStatusLight|block": "set `icons.brickButtons` to %pattern=led_pattern",
"brick.showImage|block": "`icons.brickDisplay` show image %image=scren_image_picker",
"brick|block": "brick",
"control.raiseEvent|block": "raise event|from %src|with value %value",
"control|block": "control",
"input.Button.isPressed|block": "%button|is pressed",
"input.Button.onEvent|block": "on %button|%event",
"input.Button.wasPressed|block": "%button|was pressed",
"input.ColorSensor.getAmbientLight|block": "%color| ambient light",
"input.ColorSensor.getColor|block": "%color| color",
"input.ColorSensor.getReflectedLight|block": "%color| reflected light",
"input.buttonDown|block": "button down",
"input.buttonEnter|block": "button enter",
"input.buttonLeft|block": "button left",
"input.buttonRight|block": "button right",
"input.buttonUp|block": "button up",
"input.color|block": "color sensor",
"input.remoteBottomLeft|block": "remote bottom-left",
"input.remoteBottomRight|block": "remote bottom-right",
"input.remoteCenter|block": "remote center",
"input.remoteTopLeft|block": "remote top-left",
"input.remoteTopRight|block": "remote top-right",
"input.touchSensor|block": "touch sensor",
"input|block": "input",
"output.getCurrentSpeed|block": "motor %out|speed",
"output.getPattern|block": "%pattern",
"output.setLights|block": "set status light %pattern=led_pattern",
"output.setPower|block": "set motor %out| power to %power",
"output.setSpeed|block": "set motor %out| speed to %speed",
"output.switchMotor|block": "turn motor %out|%on",
"output.turn|block": "turn motor %out| on for %ms|milliseconds",
"motors.Motor.count|block": "`icons.motorLarge` %motor|count",
"motors.Motor.move|block": "move `icons.motorLarge` %motor|by %angle|degrees at %power|%",
"motors.Motor.power|block": "power `icons.motorLarge` %motor|to %power|%",
"motors.Motor.setBrake|block": "set `icons.motorLarge` %motor|brake %brake",
"motors.Motor.setReversed|block": "set `icons.motorLarge` %motor|reversed %reversed",
"motors.Motor.speed|block": "`icons.motorLarge` %motor|speed",
"motors.Motor.stop|block": "stop `icons.motorLarge` %motor",
"motors.Motor.tachoCount|block": "`icons.motorLarge` %motor|tacho count",
"motors.largeMotorA|block": "large A",
"motors.largeMotorB|block": "large B",
"motors.largeMotorC|block": "large C",
"motors.largeMotorD|block": "large D",
"motors.mediumMotorA|block": "medium A",
"motors.mediumMotorB|block": "medium B",
"motors.mediumMotorC|block": "medium C",
"motors.mediumMotorD|block": "medium D",
"motors.stopAllMotors|block": "stop all `icons.motorLarge`",
"motors|block": "motors",
"output|block": "output",
"screen.drawText|block": "print %text| at x: %x| y: %y",
"screen|block": "screen",
"serial|block": "serial",
"{id:category}Brick": "Brick",
"{id:category}Control": "Control",
"{id:category}Input": "Input",
"{id:category}Image": "Image",
"{id:category}Images": "Images",
"{id:category}MMap": "MMap",
"{id:category}Motors": "Motors",
"{id:category}Output": "Output",
"{id:category}Screen": "Screen",
"{id:category}Serial": "Serial",
"{id:group}Lights": "Lights",
"{id:group}Buttons": "Buttons",
"{id:group}Light": "Light",
"{id:group}Motors": "Motors",
"{id:group}Screen": "Screen"
}

View File

@ -4,34 +4,34 @@
*/
const enum LightsPattern {
//% block=Off enumval=0
//% blockIdentity=output.getPattern
//% blockIdentity=brick.lightPattern
Off = 0,
//% block=Green enumval=1
//% blockIdentity=output.getPattern
//% blockIdentity=brick.lightPattern
Green = 1,
//% block=Red enumval=2
//% blockIdentity=output.getPattern
//% blockIdentity=brick.lightPattern
Red = 2,
//% block=Orange enumval=3
//% blockIdentity=output.getPattern
//% blockIdentity=brick.lightPattern
Orange = 3,
//% block="Flashing Green" enumval=4
//% blockIdentity=output.getPattern
//% blockIdentity=brick.lightPattern
GreenFlash = 4,
//% block="Flashing Red" enumval=5
//% blockIdentity=output.getPattern
//% blockIdentity=brick.lightPattern
RedFlash = 5,
//% block="Flashing Orange" enumval=6
//% blockIdentity=output.getPattern
//% blockIdentity=brick.lightPattern
OrangeFlash = 6,
//% block="Pulsing Green" enumval=7
//% blockIdentity=output.getPattern
//% blockIdentity=brick.lightPattern
GreenPulse = 7,
//% block="Pulsing Red" enumval=8
//% blockIdentity=output.getPattern
//% blockIdentity=brick.lightPattern
RedPulse = 8,
//% block="Pulsing Orange" enumval=9
//% blockIdentity=output.getPattern
//% blockIdentity=brick.lightPattern
OrangePulse = 9,
}
@ -41,15 +41,13 @@ const enum LightsPattern {
const enum ButtonEvent {
//% block="click"
Click = 1,
//% block="long click"
LongClick = 2,
//% block="up"
Up = 3,
//% block="down"
Down = 4,
}
namespace input {
namespace brick {
/**
* Generic button class, for device buttons and sensors.
*/
@ -67,16 +65,18 @@ namespace input {
}
//% hidden
update(curr: boolean) {
_update(curr: boolean) {
if (this._isPressed == curr) return
this._isPressed = curr
if (curr) {
this._wasPressed = true;
this.downTime = control.millis()
control.raiseEvent(this._id, ButtonEvent.Down)
} else {
control.raiseEvent(this._id, ButtonEvent.Up)
let delta = control.millis() - this.downTime
control.raiseEvent(this._id, delta > 500 ? ButtonEvent.LongClick : ButtonEvent.Click)
const delta = control.millis() - this.downTime;
if (delta < 500)
control.raiseEvent(this._id, ButtonEvent.Click)
}
}
@ -85,14 +85,12 @@ namespace input {
* @param button the button to query the request
*/
//% help=input/button/is-pressed
//% block="%button|is pressed"
//% block="`icons.brickButtons` %button|is pressed"
//% blockId=buttonIsPressed
//% parts="buttonpair"
//% blockNamespace=input
//% button.fieldEditor="gridpicker"
//% button.fieldOptions.width=220
//% button.fieldOptions.columns=3
//% parts="brick"
//% blockNamespace=brick
//% weight=81 blockGap=8
//% group="Buttons"
isPressed() {
return this._isPressed
}
@ -102,14 +100,12 @@ namespace input {
* @param button the button to query the request
*/
//% help=input/button/was-pressed
//% block="%button|was pressed"
//% block="`icons.brickButtons` %button|was pressed"
//% blockId=buttonWasPressed
//% parts="buttonpair"
//% blockNamespace=input
//% button.fieldEditor="gridpicker"
//% button.fieldOptions.width=220
//% button.fieldOptions.columns=3
//% parts="brick"
//% blockNamespace=brick
//% weight=80 blockGap=8
//% group="Buttons"
wasPressed() {
const r = this._wasPressed
this._wasPressed = false
@ -117,26 +113,38 @@ namespace input {
}
/**
* Do something when a button or sensor is clicked, double clicked, etc...
* Do something when a button or sensor is clicked, up or down.
* @param button the button that needs to be clicked or used
* @param event the kind of button gesture that needs to be detected
* @param body code to run when the event is raised
*/
//% help=input/button/on-event
//% blockId=buttonEvent block="on %button|%event"
//% parts="buttonpair"
//% blockNamespace=input
//% button.fieldEditor="gridpicker"
//% button.fieldOptions.width=220
//% button.fieldOptions.columns=3
//% weight=99
//% blockId=buttonEvent block="on `icons.brickButtons` %button|%event"
//% parts="brick"
//% blockNamespace=brick
//% weight=99 blockGap=8
//% group="Buttons"
onEvent(ev: ButtonEvent, body: () => void) {
control.onEvent(this._id, ev, body)
}
/**
* Waits until the event is raised
* @param ev the event to wait for
*/
//% help=input/button/wait-until
//% blockId=buttonWaitUntil block="wait until `icons.brickButtons` %button|%event"
//% parts="brick"
//% blockNamespace=brick
//% weight=98 blockGap=8
//% group="Buttons"
waitUntil(ev: ButtonEvent) {
control.waitForEvent(this._id, ev);
}
}
}
namespace input {
namespace brick {
let btnsMM: MMap
let buttons: DevButton[]
@ -162,11 +170,11 @@ namespace input {
btnsMM = control.mmap("/dev/lms_ui", DAL.NUM_BUTTONS, 0)
if (!btnsMM) control.fail("no buttons?")
buttons = []
input.internal.unsafePollForChanges(50, readButtons, (prev, curr) => {
sensors.internal.unsafePollForChanges(50, readButtons, (prev, curr) => {
if (curr & DAL.BUTTON_ID_ESCAPE)
control.reset()
for (let b of buttons)
b.update(!!(curr & b.mask))
b._update(!!(curr & b.mask))
})
control.dmesg("runtime started, " + control.deviceFirmwareVersion())
}
@ -183,35 +191,36 @@ namespace input {
initBtns() // always ON as it handles ESCAPE button
/**
* Left button.
* Enter button on the EV3 Brick.
*/
//% whenUsed block="button left" weight=95 fixedInstance
//% whenUsed block="enter" weight=95 fixedInstance
export const buttonEnter: Button = new DevButton(DAL.BUTTON_ID_ENTER)
/**
* Left button on the EV3 Brick.
*/
//% whenUsed block="left" weight=95 fixedInstance
export const buttonLeft: Button = new DevButton(DAL.BUTTON_ID_LEFT)
/**
* Right button.
* Right button on the EV3 Brick.
*/
//% whenUsed block="button right" weight=94 fixedInstance
//% whenUsed block="right" weight=94 fixedInstance
export const buttonRight: Button = new DevButton(DAL.BUTTON_ID_RIGHT)
/**
* Up button.
* Up button on the EV3 Brick.
*/
//% whenUsed block="button up" weight=95 fixedInstance
//% whenUsed block="up" weight=95 fixedInstance
export const buttonUp: Button = new DevButton(DAL.BUTTON_ID_UP)
/**
* Down button.
* Down button on the EV3 Brick.
*/
//% whenUsed block="button down" weight=95 fixedInstance
//% whenUsed block="down" weight=95 fixedInstance
export const buttonDown: Button = new DevButton(DAL.BUTTON_ID_DOWN)
/**
* Enter button.
*/
//% whenUsed block="button enter" weight=95 fixedInstance
export const buttonEnter: Button = new DevButton(DAL.BUTTON_ID_ENTER)
}
@ -221,7 +230,7 @@ namespace control {
*/
export function deviceFirmwareVersion(): string {
let buf = output.createBuffer(6)
input.internal.getBtnsMM().read(buf)
brick.internal.getBtnsMM().read(buf)
let r = ""
for (let i = 0; i < buf.length; ++i) {
let c = buf[i]
@ -232,22 +241,22 @@ namespace control {
}
}
namespace output {
namespace brick {
let currPattern: LightsPattern
/**
* Set lights.
* @param pattern the lights pattern to use.
*/
//% blockId=setLights block="set status light %pattern=led_pattern"
//% weight=100 group="Lights"
export function setLights(pattern: number): void {
//% blockId=setLights block="set `icons.brickButtons` to %pattern=led_pattern"
//% weight=100 group="Light"
export function setStatusLight(pattern: number): void {
if (currPattern === pattern)
return
currPattern = pattern
let cmd = output.createBuffer(2)
cmd[0] = pattern + 48
input.internal.getBtnsMM().write(cmd)
brick.internal.getBtnsMM().write(cmd)
}
@ -256,9 +265,9 @@ namespace output {
* @param pattern the lights pattern to use. eg: LightsPattern.Green
*/
//% blockId=led_pattern block="%pattern"
//% shim=TD_ID colorSecondary="#6e9a36"
//% shim=TD_ID colorSecondary="#6e9a36" group="Light"
//% blockHidden=true useEnumVal=1 pattern.fieldOptions.decompileLiterals=1
export function getPattern(pattern: LightsPattern): number {
export function lightPattern(pattern: LightsPattern): number {
return pattern;
}
}

View File

@ -1,86 +0,0 @@
const enum ColorSensorMode {
None = -1,
Reflect = 0,
Ambient = 1,
Color = 2,
RefRaw = 3,
RgbRaw = 4,
ColorCal = 5,
}
const enum ColorSensorColor {
None,
Black,
Blue,
Green,
Yellow,
Red,
White,
Brown,
}
namespace input {
//% fixedInstances
export class ColorSensor extends internal.UartSensor {
constructor() {
super()
}
_deviceType() {
return DAL.DEVICE_TYPE_COLOR
}
setMode(m: ColorSensorMode) {
this._setMode(m)
}
/**
* Get current ambient light value from the color sensor.
* @param color the color sensor to query the request
*/
//% help=input/color/ambient-light
//% block="%color| ambient light"
//% blockId=colorGetAmbient
//% parts="colorsensor"
//% blockNamespace=input
//% weight=65 blockGap=8
getAmbientLight() {
this.setMode(ColorSensorMode.Ambient)
return this.getNumber(NumberFormat.UInt8LE, 0)
}
/**
* Get current reflected light value from the color sensor.
* @param color the color sensor to query the request
*/
//% help=input/color/refelected-light
//% block="%color| reflected light"
//% blockId=colorGetReflected
//% parts="colorsensor"
//% blockNamespace=input
//% weight=64 blockGap=8
getReflectedLight(): number {
this.setMode(ColorSensorMode.Reflect)
return this.getNumber(NumberFormat.UInt8LE, 0)
}
/**
* Get the current color from the color sensor.
* @param color the color sensor to query the request
*/
//% help=input/color/color
//% block="%color| color"
//% blockId=colorGetColor
//% parts="colorsensor"
//% blockNamespace=input
//% weight=66 blockGap=8
getColor(): ColorSensorColor {
this.setMode(ColorSensorMode.Color)
return this.getNumber(NumberFormat.UInt8LE, 0)
}
}
//% whenUsed block="color sensor" weight=95 fixedInstance
export const color: ColorSensor = new ColorSensor()
}

View File

@ -10,7 +10,7 @@ namespace control {
this._id = id
}
getId() {
id() {
return this._id;
}
}

View File

@ -1,34 +0,0 @@
const enum GyroSensorMode {
None = -1,
Angle = 0,
Rate = 1,
}
namespace input {
export class GyroSensor extends internal.UartSensor {
constructor() {
super()
}
_deviceType() {
return DAL.DEVICE_TYPE_GYRO
}
setMode(m: GyroSensorMode) {
this._setMode(m)
}
getAngle() {
this.setMode(GyroSensorMode.Angle)
return this.getNumber(NumberFormat.Int16LE, 0)
}
getRate() {
this.setMode(GyroSensorMode.Rate)
return this.getNumber(NumberFormat.Int16LE, 0)
}
}
//% whenUsed
export const gyro: GyroSensor = new GyroSensor()
}

54
libs/core/icons.jres Normal file

File diff suppressed because one or more lines are too long

136
libs/core/images.jres Normal file
View File

@ -0,0 +1,136 @@
{
"*": {
"namespace": "images",
"dataEncoding": "base64",
"mimeType": "image/png"
},
"expressionsBigSmile": "iVBORw0KGgoAAAANSUhEUgAAALIAAACAAQAAAACHQw5jAAAAt0lEQVR42u3UsQ0DIQwFUEcUlIzAKIwG2YxRGIGSApmcuVy4AwqkSxEppvjFEwIJG0OZLg/s7Ox/50G0PLuDlidHAHPk2TOAPnLJZSAXsXPUSOebbLhe7L/oUJfpHXfXvefd1X1X7+julZRJ3/VSJ0A0y/6sc8Muu/9E57TVjR7oysfoNDFQjJ7ofeToZEmNjtvZQU/qDrY4M3EnE9iJ+61cs/6JAGLmuVX32m+tq64eBf879i/5C1nd6IT3Lpx4AAAAAElFTkSuQmCC",
"expressionsHeartLarge": "iVBORw0KGgoAAAANSUhEUgAAALIAAACAAQAAAACHQw5jAAAB/UlEQVR42u3WPW7cMBAF4BEEmI1hXSCwrpAyRWDlSCndicEWuZZ8Ex6BpQqBDsUfzXtcOQsHcapso+UHLeftaJekvJ6+Fvm77sd8DT27LWMvM/oqZWzFoC8iaaIgIuhxOOzXLb6Z1OPwvs/Tlxuyx+lHW+b7bNRdvMtPeb75h3q8TbYxl52duo3jJ5Pmk9HPh8s+vuSyZp2q7x8X85LqSLdPmH1PLb3LdeRpqL5PKxLn3evIo6nukz9PqY4MPfvXMdURc6nu0vhT8f6leionD0OqL51jNybXl8Nt/nz17zP7JdeX5+p52FX/MpHHgvl6XzwU/5bry8PILsXvim/CLzOce/9O74qvrf88d3mvm//+Ed4+Rxn+jYfWxz/z19anG24bn2/40jivD/o7v+W++R/d8vXqcf3et6s2w/pJbYP1ltoD6zO1AdZzaoOu//x1db/gmLq/cMzioY0J+xTFrG6bmLDfUczqrolZ3XP3cT+l+NVDE/PYl5uYul9zzMMXjnm445h6HuCYh68c8/CNuqweOL6eQzi++kIx1R3FVPcUU32lmOobxVQPFBPOSxQT3EKX0ReMD+4xJviKMcE3jAkeMCae6zAmuoWY6AvERHfaZXIP8dE3iIkeICadPyEmudWY5G+9d925+/7cV3Pu23DuYXzj/Dx93Dn8yn8BfHcW3cEFXEQAAAAASUVORK5CYII=",
"expressionsHeartSmall": "iVBORw0KGgoAAAANSUhEUgAAALIAAACAAQAAAACHQw5jAAABXUlEQVR42u3WMW7DIBgF4Gd5YKvVC5QzRN1r5Sy9RiRbykF6FTJ17BU4AiMDsgtWZN6PbSVRutUMlvMR4QcxP8G42gx23/0B99ONaUrv0cYrUDoQvxow9ZIH1OdxdFMvu4e6jKMFlHQH5dInHKUbVL6LD4eTHuXUxofDL/xND9FPnfAoL02MiY+2dKV8vGrhaYT6HOOj0exphGry+qt0XGzq/WFPI+OYHN8Lh1m4w9w+H/R3dpv9sOGv97jJjv/gtA7VM06/S/2M++zqHg/Zmw3X5Xt+bYt9ccO7ct/xctL+Fcszu5XTpTogpkV1Q0yL6oyIOfsgY3K94pjZjYiZ3YqY2Z2IyfWTY2YPImb2QcSk+txzTHLDMcktxyR3HJPcc0zykF8SeV5wfPaeYrIbisluKSa7o5jsgWKyDxRTnGsUU3g/r7L0rXtbr7tX6x6adR/0xvnb7v83dv8j/wXoD/U2XjE34wAAAABJRU5ErkJggg==",
"expressionsMouth1open": "iVBORw0KGgoAAAANSUhEUgAAALIAAACAAQAAAACHQw5jAAACQklEQVR42u3WvW7TUBQH8L+xFC+AH4DBPAIL6sBgNp6g0IlkR2LuUtmoQ0bew+nQsRuOPPAEqKurbGHgRlXEFXHv4Vxfxx/XNgIJhCrlSlHkn/7+kO1zfECDK8V98c0Qr1IIp8+5yw4EXVWAcSBqcYzG632U2Wq8u9i/yz57O3ZzxPaKyPhctTWQtRMVtRJ1POQfm/oDV6HlH7te/I5Hxum/++2Q35buWx7+Td8M+Uq78st7a9wvn0Pphe1++X5S4XVd+pRpl7Z72mUoXhGJyDxf0plz8tiDPOM3e//cXc4sFXsBZ8n1sXeuhjyHz/cT7ozoQWC8eBrRUiBMsYsnl4GY7P2Zp9wrvEuxpbsTwDfXR/KU3+YpXaf4kSQXwAvPuHgPPE6SBeePj9/E7vYDn++cz3+d44ylzCekkjRQiMPCST7Rep/XawY4KReQ2aryvK74fKI8tl5NfhrjbArc2fmEaL0gSux8d7XynXXIH/L/KL+j3h4L+qrr8ZGdfo2jFAoTO3+BJ7quXTt/outahks7fxnp/hDlX6z8jOa6z4hv7UtakLqp+s8p/Cb8Fm6mfUNyBrfJc2FmVX/j0iWqypK4WL3KHUpzZ12mBfJIVK48HXpONKVtzLuaflj2Vf52BuC+E3An0N+e2j35EMgxcYuOc+vlb+NL/XmcNx7o9hyHPAHEIX3W2y1Pdd/No57f6P4tqOcr/S8PPuL7mSZqe3eeqd0ei0oXQ/NSNj5f/XIeG57fhue9kflwbJ6873PyiP8E/XjE+2xX1DsAAAAASUVORK5CYII=",
"expressionsMouth1shut": "iVBORw0KGgoAAAANSUhEUgAAALIAAACAAQAAAACHQw5jAAACG0lEQVR42u3WMW7bMBQG4F8lYC5tdAT1CN2DQt1yAiEZgqK9gbcGHUoVGTz2CpkzxBmzWYaGnsBzWXj0IiNIQ8QKXx5FW7ZsuWiBBl1EQDb1gRJp8vHRoNaSofPOn8PnbTzNUAS7rAU7EDXVAt4BtcEp1l4/Y/3d2puF/d7sslyw+zduFkXeB3ZTI1M7UVkrUcNjvtjsX7iNt/xb08s/ceWd/rvftvlt5eGWx//S520+dW7Dam69h9U6VF5ue1jFJ5Wy6Sak3LnZduncxMURUaH8+pJrc06SPdI5R/Zq3QW3GVv2EsGY98fKeTdojZD3EYQmehF5L18rGl/jMMNdKvtR0Vv5G2nFCT5leCB7A4R+fGTOgN6QZtyeHk+Bt9J78R54dUz3GRY4GKZi9pX7O+f+Zxqfr9z7f0EmREkWWaRxGUwUTU4RuXGKSy4aCDL4+o0bp4nHkyRJuD/Z5/65mvSV+71KuzbDFF9GwIOrX9DAzVvxgx4T7mNSXcdEH5fzeYaDy7pcQeTO52Q+QCR1OQHy5XrxUEbkW4/omgew9IAyHdxVrQtoVSzdSuJkcEh2SIsUwXJ9qzjhXBBBGP6AcHupdmleAho9UTacQ4n3+ju33Qdrj1y4pTFntDSm7+5+wzMXR1rt+E8XjwXt+NR9m873+CpHq01v5ufat9N85UVb/s/3nxe/PV/az6P282vPebfvfOz+P3T+DP4EGY4rBjL+iVYAAAAASUVORK5CYII=",
"expressionsMouth2open": "iVBORw0KGgoAAAANSUhEUgAAALIAAACAAQAAAACHQw5jAAAEj0lEQVR42uXWz2sjZRgH8CnBBkrT8VKQsOkchXpRJAhVnEgPuQhboW+SQmFXCgrxklIiKOjMbm0ClTZ/gJQs7sHum6HbImJlYUkI20Fx24MMKHhIGtxCBJlsWZyu4/v4vPMjZKaJeFPwufU7n74zTOZ9n0eAoVUX/q18bFjcEoRhF3iMJQVTJvRLGYhVYbCksLWEIRWtC7khF6IbKWFXCa3I71ZShRzec2YwfRZv9YzjQez1/0eRWphPqcKyAixqgqWAKcMFgNTEPJYSNBlYxISnCjyWwAQmrUvAJlRhUQZ7zFTOZTjDXGFSFPOE4+2Uqfwug16Fx4o9I0pgx1Uhg/n1gvJLFbYq8EixryQwn04JVAKr8KL8WxU2T+BYtp57VQR7Dj3mPwrywwokrkJFttRiBaxkSqhJcKEJ0ncnENfhM9lUuxUw86pAROhlJqWdNEuuQFLqdQzMCXrMazNivMNmb7MXqp37FPOu68nXYnLNLq6xYlUnpAJtA30FevTX8dkDO39gd6slir5B0ZehQ0ipuGQZb1lGdYv7Jq5PdTiltJ7XLPrNBa1McH+T+zT3143MqpE7J8cJ7st9f4vSl6h2So8/5H6c+xU4I2TVyEbIok7eNLiPcX8bjii9R2slqk3Rbyl6Fud+DTYIuUbIA5JJkHmCnk1zfwD4zFiM0jl6zL09x/0S905ln5CPuLeT3O96vl8VK899ru+9qpiEew22Q97scr+obIV823C8MhHyDcp9Ro6F/LqzPpXjIX/T8VlpOuSjjq9JQV8TpxxPxJCfirm+EvKTcdefhPxk0n0ePeSFvOvfSQZ4FiPHfz4bfH6h6/pC0GfGDNfvh3yEun4h5CPe+ochP+755ZCPeV4L+TnPZ0K+6Pla0Ne6nidPyKXiflg5nvwv/NMRfmeE3x7h10f4G32fNQa9avh+Lx949LzvlwPrq/7vSw8DvuR/D6QQ8KWE71sBX972fT3gyxv+9/NJwOtHvp8sDvp00/dXAh+c3va/z9cCH2i65+0X7fWgN739lfs44Octb/19FtjATdvbvwUW2PDzzNvvbd/fp3e5Z3Oun3d91lghiwb/M+H6JvddquXbVMPjvAkTri/j+U2+IrliylhEOg9b7vlThk1ai+O2/z6vbXNf8s4rBLhpV5LHSewA6JuuF9HvjdOzeGVOw3ejQ9M9PyX0uOdPdqo7OXw3aWg4fk/ChnH4fq36aXXzjtVF33Y8NuwH1xbWiPRQeriE7yYNLfd8luHo3v4fNVmXH92x3+vq4J7nyzI0V1sXGflM7iyxV5JpsJz1d2U4bTX+1JRT5fwAZrALe/1CgU59zP4Zm/7FDyDE0Bcdj7kaYbs4JFhfgjqugz3r+fNIhP2EI4fdgRvraWBOPzrESSMaZR+ABexdaDR0cPvdAoApRmENc3geGq0TcPvjPuZSFF7meRTa5lXAHwB9AXNZhC94LkLbEj1/C3NFhDLPq9CzMS9x/zbmIPlz0SrDfIP7NuaDc5Tv37g8d/H+frd+eU6LMHXkXDdqDvybuXH4nDn2j8dV58J/bN7+C/XpdkrjO2oQAAAAAElFTkSuQmCC",
"expressionsMouth2shut": "iVBORw0KGgoAAAANSUhEUgAAALIAAACAAQAAAACHQw5jAAAD20lEQVR42u2V72sjRRjHpwS7UJqsbwoSTAZ8I8Q3lSMo9cXkKDRvhDshk6ZQuJOAQnzTEiJ4qLt37aVQaecPkLIH98LeZPFaRDw5OBLqJSg2fSELCr5IGmwhgmxaxM257uPMbu9IeznxrdLvy898dn7PswiGporO+Tn/L/KRYbiF0LAGiUXwaeqhJ9EGsI4Gg8+6DhoSpYpyQxqUmym0qZ3pUY5W1lFOjBkfpM+LoZ7zfVB7T77RcEvwiI7mNfAUGxwNbAJ9ALwjeDiFTAJeyIZHGhxhsMHDSxi8MR1lCLgjtnZM4FBwzcOK4DHfd1O29geBhgFHmhtXMbhRHWUFv7qg/WLAGoMDzX0xJvhECnEMzsIk+c2A1T1oEueFN1Rwp4Qv+I+I7DKIXQJGHL3EwEmmUAVD30T4uz2INuBTYuuPGNgFHVEVetlxvJH2knlI4l5nQ3AqfMErcTXa8RK3vVeMzoN1wbuBT79Sk0W3VPRKRoMuMWhbwmfQ47+OJrbdwrbbNcr8OoMaF/4KdCxaLs051luOZaxRncGO6J83oFPg1YLp8K/7nI1xwW9IPw37lF61sotW7pg2Y9JfCfz9Ar/F+avc3OfNa7zMYFT6eTigdNGaDdFMg74phmIQlv5t+KbA7/NKmZsR/i3nK8yLSr8Iy5ReofQhzcboNKWCT0h/G5YLXMTjfIo3OW8wd0r6c7Bcon5mf6cfUZpmblL6m7Cc4ANpMKcg/RwsJ+lA0sym0jdh/Yxvd6Wf0dZP+dOsbfm+FokO+jusxqWfJZGJ0/6S3z8n8RP/Ab/r+zd8fxbHfX/WytOMJX3F9ytY+l1uFtrcvCZ8NeL7VMVhSr+kuVLKysSEHwkHPsOrvBLlW4nvC+a68Mfjgb+H12g2TPPJZlKcAJ0evxD4aeF/PsoPo2zKbIv1onwwn3fIGp1P0r0NYyPXs2gaXQzm/xKp83vvV4xPjNU7TpfXUTtY7yR5eOVykeJdvDvnUDoz0gr2Z5LU72/9WSENcnDHfa9bD53s5yTZWWz1s+SQdOa815IzISfY/9fJfqv2l6nta8fbEI/WleC85j8kneqI+7N4dP0fAIVnVKfkn6/gesjbFI/U+QL00TpxE/75fkyOQyHvJ/Hk3Q5cX5rRPP8+3NPIkaJ4H4AD3rtQqzUguG+XAWxVgaLg8DLUWnsQ3M8twbECFyRXoG1fAhiT/oLgRIXPJFeh7agn/i3BNRVWJDeg5wpelv7bggN+XJcWPcFvSr8t+GAde+xffLruyfd1t/p0nQx5+jPr6rPq8D/U7eF1fuRf/y78hvP/7Dn/H/G/AcCdgHhcio2gAAAAAElFTkSuQmCC",
"expressionsSad": "iVBORw0KGgoAAAANSUhEUgAAALIAAACAAQAAAACHQw5jAAAAkElEQVR42u3TzQ2AIAwG0I9w8MgIjuJosoErMQojeORg1BSD4c8oJzUphwYeCTSlYKsOA3Z29tfc9RQXlbvtKM4ydy2S5a3DTzTGZ77CCzB8w1vzb67PVZ2v3oX7lj1zI6q+ns2cugFEzQGEbo7dkavSLZSDLF1L2iudznDnBZGPIaR+/JfSJ58Uvzs7+498B3cE819ZIE/TAAAAAElFTkSuQmCC",
"expressionsSick": "iVBORw0KGgoAAAANSUhEUgAAALIAAACAAQAAAACHQw5jAAAApklEQVR42u3TsRHDIAwF0O+joPQIbBKNZkZjFI9AScFBkJucET7bcZEUouDgFSCEhDocAerq6j/z5HjOc++r5Tma3v202546toXHcs0LNgHoP/xu/Lfzc5Tno3/RulV/5p6GXjAPPaHVZiHhkTsgO+GBeyhJ99QuiNJRg6mrOL+YdkP1S+/Z1owXRJzcKcAk3fHGCucXxc+Td3nLoHE+ofWjrv6NvwHAjOwKGeyV+gAAAABJRU5ErkJggg==",
"expressionsSmile": "iVBORw0KGgoAAAANSUhEUgAAALIAAACAAQAAAACHQw5jAAAAkklEQVR42u3TvQ2AIBAF4EcsLBnBURwNNnAlRmEESwqD8pOYAGeUSk2O4gJfQeB4YCeHATs7+2vuplg3WbsdY12H2rUolreONNFQz9wjCTB/w3vP392fqz5fvQvnlr3wJaWl9Zw31XjOOeEhao5wHaJp0e5vIR2G1h3CkMT5oyvCDSCo+/rzM1Z9MILfnZ39V34A6BLzXyhnhjoAAAAASUVORK5CYII=",
"expressionsSwearing": "iVBORw0KGgoAAAANSUhEUgAAALIAAACAAQAAAACHQw5jAAAEtklEQVR42r3WQW/cRBQA4HGN5B4Q7rEHlLlx5hikKMM/oagSV1S4pNKS2apIERKq/0BgfwiHTBQUH4Buf0DReuWqPq6ND3G0s/N4783MepvsFVZq4/3stWfee34zAvZ+jPjP3dHf5Y7deP+Tjl/r0fs1e0XHf+/40LO3RG933DbsRuHx/GbLZ7dz9ssL/NJsvc36gr2jb10TXajG3+eWvrl8eznMvW8+mFClwaz2zDfD8cyjj4Ok+20WwYdkHDteso5eTca5UhxiPKdCRe9gqpvoQsyi162Qq+BOiDyEFxpzjMeO3QqR0W0l/lemcIbCPnhv6SGvJJQokrwVIiWnWZwrqGFl1Y4L8sdPdA9N9IQmZsgPK4W+4ftXIr+k2eH93RdO9ninXW9xPO45zOrR5TL6CcxKKproTnFY3ImWJVUI+wN56XyE3ORAFlAl3vPiytHMQLpToaTDabLLs5eOZmBzp6YO55p7Vya1HIkcFFhVBW/V23Q4o5nlIDEzg5DBf03bOUUihxwH6YIPcpZznaOXcIX5C57L/Cr4JQ3soQx5+TQ7a8klxhBnfZDHPGZ55d1itJ3Koh9LrD9ynjQ+xddJcq6msHXM/rbeqOTcWEbeN3+B2OewwhTvc6y4R/u8FXkXvLBp9DUIPutw7DYx/CuOW8Wlw461x6P19ZNB9Er4Iua4hdclehadg+DdCF+U7PoyXA/sYusvtz7NKz7h3T/XYm8Rn9MPlJ9XaALoRnwpeKTsJngSPQ/xl3c8C+7jhZHxfpgG16PT55Nkv6fBB2oW3GO8J3e85PCMTp9b362EePChd767IU7vuuWWIJ7gudErbnnYQsQjCpwRjpPI75SiwhAP8Z82wnLeHMVE8gPIsT+0igsDY1hJHtFHFFAjOr8mYIzYrfiYAmpEDS0XkvKNCXhmmRFNNYCP0cA+jW4mmts49lRKEIcoNaL88TQ4XpvyiESCfn1wrGHtjumh0vgpixdGvP6OHABbq1P46Db49VPvC2raVkJNPkVPj9h900Y33uv8CLPSBJ9BWXlfuiNweuVzU8yguMZhCoyPPQRQC5+DfAayMGKCPkye488v6Ba9UxKUpBFhnB9zahf4yN5p6Y4VJZPyQjyR6J07VXaiekMOLwD+oOaOjjgMun5H8aGr33AQ4NZa3bWQXVM8fdoxdAUM9gT6pcvmoy/I7eQZ1Ffu2/k0D75YsZ+mUBZOF34dwc9vN+TUwMoSBxv7hltj4OZAUC+dVt57rMBN9G5wJyq+p+A3ERoX8KH95yS+17jWOY3NTtPStWy/D471ejPI4F3dPo19SbFjFjA7fdk1O/sW77SgFru+qvwihe+Y7Oqd66fYOtzXeFCorh3dUTNy9MCDrW/Yqa/iufdHuk28W8dt0Ht1yOse+wl5or0/2/bbzWdcxBfYHy7gfTf6K37P0b9R0NSjO/avwL7DIDXR3Q/R6d0er3eJ3fXx/sq79E7rIWxW6HOrg/+O8+LWaKkeGlyTvf/MueCGit5jJXg/j/tBl7Gvgv+y3R2lHLeb4OMO7CfyKqM4qF2fkTf8Mt/z2xW7vrsvXRe8Nbq3X13TfkUk93zgdpLt3/caud83//9+e7//C0qd0Owbh6PaAAAAAElFTkSuQmCC",
"expressionsTalking": "iVBORw0KGgoAAAANSUhEUgAAALIAAACAAQAAAACHQw5jAAACDklEQVR42r3Wzc3kIAwGYEesxJESKIXSyGgby3ZCCRw5IGb5S7DBiRTp05fjowkwxPgFvuxzwK855EetfhQHO3uoDNvs0B9F3Z++Ud8BTJtEY499gAQgsLvz/dCX1L2N0kAPj/3t+oIc7vtsbQXD8S75vrA6vBye6sqqx2vWOpA43ZPNdnC6E9hj+QfVd0W+SRm1Ohk+m2oep2/pZfMgqMetuZPUEzQ/9FQMeUHFdzMXiam+lJDTxdM2u1fFo5w9S/agZk+iuNdLdW7FnVl8r27Xai5+rFXubPadcZP9s7ovLlYP+t6TXD2qe49q9STvPWjm+IoHN4z/fe+e88+DW8b//aC/XM9P7cPb/X/7fd/Wz219bkw964c6vzsvB3O+7MN5vDu/d+c9rP2helz+WJBPfeauL619bG/97ZgX1PuhnyZOvX+GaYLSZ1sfphM4efZtOsHe+/b3ELQNGzYvwpULdAK3jTzCE9Rw6vkl8DAa5Z1FcWRRPo6BWrJeecrm5pmuI3G7+/OGcAZ09zO/c55LkvsHQL8VGOKxDBTWe0KOaYN+PjxB+dhXQI8Ez+W4A6z3mai/41aAPGhcYNhxQaLxDS5s7PggDHcWHxzsu+X8IHWNPG6sf0j8I/eSdUHiHzkpurHPf4C9NybYWEdXr+neqFj39DBd7oC/r9KzhOpE8T7fpeBqRaxH+8v38P/FUimZWI/+PwAAAABJRU5ErkJggg==",
"expressionsWink": "iVBORw0KGgoAAAANSUhEUgAAALIAAACAAQAAAACHQw5jAAAAqElEQVR42u3TsQ3DIBAF0B9RUGYERvFokMplVmIDr8AILlNYJEARKbl/kd0kUnRXwSsQ+nxwp5Nhbm7+Y9/O3FfH/bnd6QnxzYvjnsYCmF69AoH5dtR9oV5DnZir9//sR/PRctbexXr7HV8UnxW/KJ4VL1HpwyT8OjwIH80p0kczIfvTaSWe2kHp5IUXtPGz8Fv3sAiv3VmeGXDM21eNNP/krIfm5n/hD5hN/hkkU+lAAAAAAElFTkSuQmCC",
"expressionsZzz": "iVBORw0KGgoAAAANSUhEUgAAALIAAACAAQAAAACHQw5jAAACK0lEQVR42sXWPXLVMBAH8NV7zLhhxsNQpHRBQZuOUiXnYCg4Q5pIVJQ5Ategi6m4hjtad7gQUvQt7Xo1QxryquT3/Oz/rtaWwbGfFV7Q54HDPHCYOLfgPyOHkYvnufg6OP7nwD8P/N0/u/kvfj33eR14/IJzt9Glyb4DWct2/MK5v4DkXAMoztn1jR0VnBsaP/txmqzkp/jZT/FbfyTneuBAy0pu+XkO8fuydpn9QGUZKL6jsmLm6FtflhZ2aetey9rgXhTv44dbYan3Y4vfOYofRmmp8yaQz8lR/M5RfN3Og1al87U/f3BZvQWiXirQ6c/msrRnRX5bXGlwnb/O/uh/0ftF2pTQAXGTKrWx+Ooi+HXqXVeHX6GLE3IV/P3JL8WP2CzOl96h+D50iZ4PKuffmscvOA8TpyzcppVS3b5gwn/xkhrQfmFcvqT3v2Qf2cKPQFhBPA2l0HfEdR7KV8TDigS/YI+dN2loeo8dZn2OQ0z9GPqSXSGPHXuGx06ynp4JIW7vcTDzI7D3uF4GwJ39Y3qaIA8d++LMTPf30JkPdN9/SH5DXUvefQoD3X3ffBq4GPingb8ZueVcw1v2fcYO3K1X3vn90Z+H3R99E9j90S8ruz/6W4XdH90m+PexFvMR11tiHhL3p8Rc0fG2xgR0vKkxsR81JvWS84fCXi58KPxeIR5y4cSh+B/i37N/I54L2CYyD8Wv/LpsZP734orcF6lf7vcLv28/AaqW51qc+IlYAAAAAElFTkSuQmCC",
"eyesAngry": "iVBORw0KGgoAAAANSUhEUgAAALIAAACAAQAAAACHQw5jAAACX0lEQVR42u3Wv27UMBwH8K8bRAakhhEJUF6BCRhQI96kb8BtIDHETLxORwakXsXAyAtUOksMbJCJC7qrw++fnYNgBpYy9Ja6n7P9dezWv2D642eNG79u34M+Tn8P3G7UpY1OHNaH3cM62VCgZ4/artgHbbfs1sfl6Xks+UjDuKcsQ0b5mn2QdpRvfSuzVexBEifPC5Ivp71jX+sKA3WN9hRg99JnGmjYvlL3Pbu2R/badoHdxrKNje1GR25jI3ur7YE8JqefQ/KW3ObkcUNnWX/xvWVNbyivtzU0/+C2humC3Jrxxq/f64K7gqMveFvweuGjuFt4YL9rAQfu2R9YwOwR8lwWMPuovna/eVAfNGB2fyRuT5A94lj3TQOyjzhR14DsAbbPGpDdV+YakJxWn85FApKP6JJLQPKAfI4SkNxX2SXAnKafz50DzGn6uT8HmNP02XeBAsxp+uxbTwHqEXdm/woKUB/xcPZLvlbVA45nf8d3srrH2z77GZ6iFY9wH2Zf4Rlq8RHu83n2U7yCEw+oLg799BGes3tULntcw9/jP7tAteAWNgeO++Ij3/6/Om9RCEsf2P3Rwvn/JuD2wifxx0vn9eP7odP68US82tEO2vobc75XG/V0366Al+Ldjh549jPghd7DV+S9ON/ztP/f9J6/WqPu8/1/CbdRj3Je4hWfb3VudWTF58t1hPttfdNb3XmP11p3+Dl34STVqY3bWp2iuraffqS69mX6ZHWN62D7MdXBMXZWB7luhi7XTZfqZqnOlupyqY6X6n7pPaH0XlF8Dym9t9y81/2H/hNF0RpVT4pRTAAAAABJRU5ErkJggg==",
"eyesAwake": "iVBORw0KGgoAAAANSUhEUgAAALIAAACAAQAAAACHQw5jAAACCUlEQVR42u3WvU7cQBAH8L9lCVNA7gGOxC+Qgo7iohyPkkdIB50dIdHyCHmFK6nAVClpr4jESbQITMNZwngzMzvjPT4WRIREFLiG4efd9dq741m4B38V3v21vQX9Ev//jOOBd4kxFoe2YS+hjbQrULB3Pk7Zax/n7Nom6YfnvuQNdeOWMg3pVWbstcSdXC1zGS1ln8kdXckTkouuTdgrP8MZNe30KcBeShtXU7c29V4W7D5u2DN9C+zal60Z6NsYk2vfjj33cU3emdPf2jwn1zG5Xz3Wez3ird7L/aD7FTqHwV+4zsEdkWvYvUXHfa/Es7veQFy3eHCoJ7d9Zu73vrkAz0cSITilyVfxhi4Ep9TIdP4VZ4g6Z489l8Tq0saed0J9vdOYadH7d85TcQqyw34cTreEXYIT85tKE9Kn44X5dZmsmH/G8lbvSHcb79kUaxvmc6S/ikrc7ePTyPwK2U7BuUg5OcGXYfAlmrR/rgnWez/DcnKo/g2bq8Gx4Hh1v5KXbvPH8Cmf02KY7wOj8D6xZOs7BTbC+8cH89/A1sJ6fTQ/X1gvWt+R+Xxhfd025ubXVdgP7iC9ML+p87B/jt3Pfh8Wbcivy7bo9+3eaXD59tl+zv+T78YLfYef+/2P1ZFY3YnWqVhdi9XBWN2M1dlYXY7V8Vjdj50TYueK6Dkkdm55P9f9g/4H3XgcZrwl+lgAAAAASUVORK5CYII=",
"eyesBlackEye": "iVBORw0KGgoAAAANSUhEUgAAALIAAACAAQAAAACHQw5jAAAB50lEQVR42u3WMU/CQBQH8Hc2UkKinZhQuzO5MWACfgMH2P0WjK0xcfUrMJpOjmzUya/gQGITV6OdgITSeu/u2rsebWyCRmK4geGXR++4Pu5/kBQOH/a+Sx4AHdamIwPZ8Ig5OLqH3G3dA+6W7r6Bn67JPBJzodjsaQZz/uUeW47DZifMXfHMJImJWC16zOfCJ0cGd9ehLtaMpZEppkdfQtvzvDEubGmJ5faoh2RIxwCnXNri56EHDQ+HSxcUpm5T95tYP+zbWMd9ie62Wf3Y0p2VD6+oB47YVos6sHLvwdSc8PqB5vEBr/fobw3Etsboh7x+qHtJfZTWE80bov5my/qmqL/83/XYE8wBsoZDv38r9NiJCn0d2k6Rr3xzWuQLIK/c7WTtw2mSPDH/APhMfeWS49RnUB9lDsZd6i9w0kl9AcazI3wCZ93U52Depv4IFy3pNUP6eebvUCdT4dfQP5IOisOf+5yeGnL90PrOF4pPALpyP6Em9xM6Re9rBjAqcvm+yt5vtX6Q/ZPvT9lvWj9n/VnWz7/9//qh82er87DCeVt6PivneaXzX80LNUeUfMnljppHak4p+ZXLNTXv1BxU8jGXm0qe5nNWyd9cLit5ncvxCrlfdk8ou1eU3UNK7y37e92O+BcKz5DpA7xJVAAAAABJRU5ErkJggg==",
"eyesBottomLeft": "iVBORw0KGgoAAAANSUhEUgAAALIAAACAAQAAAACHQw5jAAABtUlEQVR42u3WsU7DMBAG4N8KUjfCjiCPAQMir9I3oBtIDDETr8PIgNRUDIy8AFIjMbBBJhrUEOOzz04Gjkos7ZAuvX7xJa5z8hnm10+J0bftLexH+d8Vxal3FyN3Dh5DrsGDOBUoyDsfJ+S1jzNyHqPi7SnXemPTaKSbhsvSE/LaxZ27qjN3t4S8ck80mibkLppWkZd+hpUd2vG/ALl2Y0xt09rEuy7IfdyQT3gVyDmXrEl5NXLrnNuRZz6urXfB7XcdPLPO96S8Oudn/eEtP8vc2OcVPIf0H85zMAvrHHajj777XuW9q4FnT9GbLo/emq/ob+Y5+ro6j75Uq+grnRbBH3Ad/R3JPPgMR9FfoJbsXYX96Pc4+GD/LnFbBL/D6UVwrR6jz3B2yb7W6nUefIqrk+BIFgOfDlwFPy6hD9k/sYdl7+gdW3c7f/Tzh5pv8hnQr497F2E90a8nkqJffwzWf1Jsel/S+xXqIeX6cfuqrx+/33K9Off1xvuwr0/nvj7J7T7v69nv82rT/i/1EanviH1K6mtSH5T6ptRnpb4s9XGp70vnBOlcIZ5DpHPLeK7bQf8By0loyHh24uwAAAAASUVORK5CYII=",
"eyesBottomRight": "iVBORw0KGgoAAAANSUhEUgAAALIAAACAAQAAAACHQw5jAAABt0lEQVR42u3WsU7DMBAG4N8KUjfCjlAeAwZEXqVvQDeQkFoz8TqMDKi0YmDkBRCNxMAGmWhRg8OdfbYz1FRiKUjt0usXX+I6J5/RrvxMsPVNewP6KPe74jh3bmOU1iFj2DVkkKQCI3bj4oy9dnHBLmNUuD3nki8ojUfaadgs3WOvbWzsVV3Yu2XslX1iq3lC9mLbKPaJm2FFQ438C7BrO6atKa3JnOsRu4sX7D1ZBXbJZVvksholueQa9sLFNbnxTt+194Jc7sl5dSnP+sEbeVZ7Sc8byRzyX7jMoZ2SS2i2vvV/4VUZXXW8eAi+MGXwpv0M/to+Bl9WJ8Fnah58rvOR91tcBH9Ddud9gIPgT1AzcVNhN/gN9t7Fvya4Gnq/xtGpd63ugw9wfCa+1Opl7L2P80PvyKYd73dceTcT6H3xD+zgOTqiY+NO80ecP9R4nQ+AuD7IxnE9EdcT2TCuPzrr3xuue1+p97uqHnKpH7+vUv2E/ZbrzTvVW9yHqT69U32yu32e6jns8+rH/T/VR1J9J9mnUn0t1QdTfTPVZ1N9OdXHU30/dU5InSuS55DUuWV7rvuD/g1mT2jIOjnq9AAAAABJRU5ErkJggg==",
"eyesCrazy1": "iVBORw0KGgoAAAANSUhEUgAAALIAAACAAQAAAACHQw5jAAABwUlEQVR42u3WsU7DMBAG4D+K1HShfYACeQW2DkUqj8JblM1BSKw8Aq/QsRMNEyMrAxKRWBENS1OpqYPPvqIEnZGCkOjQLHW/+GLXvuaMSrxS7P2/vYS5Avc9o3bfuW1jbB3chzwBd+JQQJFr1w7Jc9eOyblP8PV4ijW+MmHU007DRiUReW7b2t5NYvu0kDyzI1YJTcjerMqAPHUzzExXzb8C5IntU+UmrAydJ4rctVfkEa8COceSrfq8GmPjHKvJY9fOjeutm89867FxfibF5WMe6wcveazq0oyneA79X3hcuSndG+cu2vlHqUR/rG5FvwsXol+gkFxnGEm+SXEk+ToJeqIjvJa8QPigBF8iupK9E0r+hm4wFx075UvzJ1ItvAAiJa4nOvL6o9dmv77tr0l2MR9uXsX80aoU822Tx0rKz3UazbWQzwWCF3Z3sb8DC8mf0Z1I/oTDoeQzHI8kn+J0IPuJ6Oc4O5AdO+VTYNDGZ8BIXk8M5fXHpM1++fa3lg8Nr+VPw2v51vBafjZ9m89/9B5u+/731RFf3fHWKV9d89VBX9301VlfXfbVcV/d950TfOcK7znEd27Zn+t20D8BnntiOLdBg8cAAAAASUVORK5CYII=",
"eyesCrazy2": "iVBORw0KGgoAAAANSUhEUgAAALIAAACAAQAAAACHQw5jAAABxElEQVR42u3WMU7DMBQG4D+K1HSBHqBArsDWoUjhKNyibA5CYuUIXKFjJxomRlYGJCKxIhqWplJTGz/bLUl5BhUh0aFd6n7xs137Kc9Q7CfDzv/bK+hPYH/n1O5YN20kxuH6kKdwnVwoIMilbYfkhW3H5K5PsBqeYrXPdBj1NMswUWlEXpi2NE/T2IwWkudmRpXSgsxDVQXkmV1hrrtK9y9Anpo+qtBhVWg9FeS2PSOP3C6Qu1iyWcftRqLdxUry2LYL7XLp+rtYeqzdjUlxReLm+sYrN5e60PMJt4bOL9ytQd1pt4tRkvPrF9alqFhfFLHgfJ5FY85LBM+cvwETzp/QHnD+iIMe5yMc9Tkf4qTL+zHrZzjd4x1b5UOgu4mPgD6/n+jx+4/BD+dlU/3r+b5Xgs2HB3XD5s9tOGHz7Rwll58yR5/L50WGw5rTWMbnabDPOsIrzkuE94LxKaJL3lsh569oB2PWsVU+1S9nsYGXQCTY/USL33+w++87r7XzXflaPnx6I39q3si3mjfys+aNfF75H72HN33/++qIr+5465SvrvnqoK9u+uqsry776riv7vvuCb57hfce4ru37O51W+gf2n5iOAicusQAAAAASUVORK5CYII=",
"eyesDisappointed": "iVBORw0KGgoAAAANSUhEUgAAALIAAACAAQAAAACHQw5jAAACl0lEQVR42u3WvW7UQBAH8DGLblOccpSRCPErUEERhHkUHoEKqGIjJCokHoFXoKQipqKkpUDCEj1Zqlg6x2b+83H2GQ6JKhR3xZ39u/2Ytcc7puGPn5r2ft3eEX8yPW9wvFKXYyrEydrAK7JG1pWohPd6HOBJj3O4tck2w6Mve8vd0EnDyPm7ivAUdOASItOwsDc4bEOFgOhJRKMMXgNSbHiEPmtleoJXGKBZJe7WhU6mr0q4TJi38Njr9HBtUXQ8Mv8n0zcFu45Y9vB8kOkTew/n7vhNvFAsIOXsFhn6pcKidkd46imad7JCPnvB85XSYuhW5uitLgvYOGZTlwWIyxXk6D6yS8QcnjtOzNHEXTqbY0h3mcwcIbhLcOYI2T1NPYzeLMd5X2ej1/lb9/6MRq/ChftV4pjdiS7d1zVnpDknz6n7JbLNnJPnjvsPZJt5S9mh+1ei6J4ovHL/QkfBvaHwqTR/T8eZe03xpfs7ekDuFS3C6Hc5Z9SJDrJz88f0iAp1PDAT5wWod3Nfqbdzj+rp5rYfBPVmue3LTL2eO6lX9/jpHeOn23QmTk9nXj2EnxBf8zheHzqtT+DH2ZpoMV5Put8cwo/CuqLp9X+WFvBb8areul8X7Q04L7uZ3t/sGxM8H55P8yGe9+rF8GGaP3k5qJfD52HMt7LjPBMfhp/dmJ9vvnNewpGn03xGHsODbZnmss3B4+/e+nM6881zOvN+79fvfr90Xx3v1z967/mg+7zmQ/4Xt7yyOqJ5lXvdYde6o154nULtkjqlVbvwuqbmOSl1rSotV1EH1aUO1hqE1k112tRZrRNaBa3OyibPe67UZQlI67LUcd5DZUJpo3V8V93f9Z6w671i53vIrveW/Xvdf+i/ANCjCZtu1XwRAAAAAElFTkSuQmCC",
"eyesDizzy": "iVBORw0KGgoAAAANSUhEUgAAALIAAACAAQAAAACHQw5jAAACP0lEQVR42u3WvY7cIBAAYCwXdMsLnOw8xhar+FXyCFuelNOZjaVsmTeKbF2R18BvQOnCgswwM+AiJEoUKT+6bY77FuxZGBhU/OZnVq/+p31X8Gnof4dtQ57aakiuuA+6VdyJhyo1ogdqt+ie2j0692ny43Es+AbDsGcKI42yGt2ndkjf2j49rUV36Y3RYkDpy7g36DNF6KBr4F+h0G3qEz0M21tyO6JTe0PXPAvoPBZtMzwbAziPDeg9tT14EIe/XrwH52fiOD/wu77jO78r3uB9I8dgfsE5hriAczP8Y74d/NPBXfFgDm6LbwcPqrg7OC03+TwWp2Ulvx3i8QNkMHvrm+zuCbM8edAz7BBxj1lObjD72RfXQ8Im37vGa/Fphgwj3y4GEon9PmFI5I8DhMSutYPVT+6vz2YWN8Z24n5rnPjJKKPZITY/kodTp/Sd3K1OPYo/PPTtC/m6LP4yiJ+HRfxl2h+Kv1+z3z8f/N26in88dX3xa3F9+rG/Kf7h4BdVfC7edcqJr+4kDvPQSJwwD53ECfP2RX6X9/tTdt3GSfw6bDIP8X6L7STr0vvzkNfxrLWsY2uvY173PP97p/L8R7ept0byxLZ5vdxzGkV55cxS8jBug+RhjFPOW4MnALnFA0ryv8GdwfnfQy/ZLyrnJ57QOT/htNTiO57m4r7kf1Ql/2mDseMGC//D+fObzuGfPf9rdaRWd6p1qlbXanWwVjdrdbZWl2t1vFb3a/eE2r2ieg+p3Vte73V/oX8Fk+c0j6ggguQAAAAASUVORK5CYII=",
"eyesDown": "iVBORw0KGgoAAAANSUhEUgAAALIAAACAAQAAAACHQw5jAAAB1ElEQVR42u3WsU7CQBgH8H/ThLJIHwC1r+DGgAk+im+BW8+YuPoIvoIjk+Dk6MpAYhNXI3UBEkrrfd99X+vgkeiCQ1k4fty1R+/j/ofqx9cMrR/aC9hX4D5n1I6dcxsjdkgfcgPpJEOBlLx07ZA8d+2EXPoE9eVprPWNHUY9eRo8ykTkObdL/tYkfLWQPOM7VoYmxF9WRUA+czPMbNdSfgXIDfepcjusCJ2blNy1N+SRPAVyGUu2ieVpjKzL2JI8ce3ceqlu33P1xLpck8blI7nXHi/kXtW1vV8qc4j/4DKH6sm6NMvWW2/9187/bXH6b6t/Fmntd2+Nv1T36mVaNP4YLtV3eZLWfoW1+nYWTdXLDEP1NYJX9d0MJ+ofwFJ9a4Ke+gLdce0Ib9XnOB6orxE+p+ITnA7VV4hu1B9w3m+8EzZ+Vvs7usFU/BIXR43jm+PgvrJp1Mwf/f0e2+eDKJV9dQK7FrLfboGO7rdzYFC7QU99AYzZ7T7v1svt87xesv+79XXO68seunqQHOF6oByhflQ/kjtcP5Q7lFNUb5JTXG+cU8bVp+Ya1Sfnms1BvrbkINUz56AvN30568tlX477ct93TvCdK7znEN+5pT3X/UP/Ag/3YjiGSiORAAAAAElFTkSuQmCC",
"eyesEvil": "iVBORw0KGgoAAAANSUhEUgAAALIAAACAAQAAAACHQw5jAAACf0lEQVR42u3WP27VMBwH8J+xVHcpOUAL4QjdOjyklJv0CGztFnMCjtArMDIVcwFYGZCwxIqoWfoi1Y35/bHjNJAODMDwnlTV7/Ns5xvHyS+QfvtxsPN/7RHwo+S7p3Yjzm3o2CH3IbeQO+WhAD35KG1NHqTdkuc+apqexqIPOIx6cgweZQ154PbIv9qWZ9Pknj1ZCsQ/pqDInUT32HXMTSC3csoBg0adT7Yntzx4IDcy5Sm5cnyqZEMjJ+07dB04xEguLR3QRy29RpxbekQTWnSTj0beSYKBPaeb3LfksUkS9BUKJ3NdbNgl6OS2zy5BJ8clJm9zjPfoOdgoPpi547fsErQ4LlR2CVocFza7BC2OKYpz0OL4pbjvZo6TFueg2Wn9inPQ7NSe+uvqYdb/g6ruj6pfQXXX1jwXtG+yW/NuOl9Puzw7qC/F7xztcnHcxdfFby2Y4gPsn0/Ou188wNFJ8S08UsU9PN0UvwEDxR08P6y+h0HFLRxP/g32Mag4wOlBdbql2Olmu+dGfFi6Fg9LV+J+4QrE3bOF257dns38Bqc/a8lH9QbgcO4vG/Ko577FmBeGfDBvATaz9dyLmjw0nwBOZuv/eFTkvv0McD67Xk+SJXf999n1wuu7Se4FusVj1euL+2GbPF4a/Lt1dT+kK31NDxd65NyF2f75mC7TQI63UB/rfvsR+xTJcbu8/lqd97aSZxPt+eL37/eFl/tl53/Xm1+vS/wDH0326TlPdeMB1znDVEfoP9Wd7FPdoXFUp/Kxap1KXKdsnrPWteS43vXLOohEdbNb1s3EddM3yzob1UN1ea2Or9X9tfeEtfeK1feQtfeW3Xvdf+g/AbKCHZJ1IQy5AAAAAElFTkSuQmCC",
"eyesHurt": "iVBORw0KGgoAAAANSUhEUgAAALIAAACAAQAAAACHQw5jAAACWklEQVR42u3Wv27UQBAG8G8xwl2cFvHHjwEFuhNvcm+QdEFCwps3oqSIFFNR0lIgzhV0ZCtiFMdmvp1Zm/jiFDQgcdfc+ne7O3u7dzOL4dZXjb3/be8gL6fPDduFemxjHR3Wh+5hnWwoUNF7bWf0oO2Sbn3cOD3HircyjD3jMuIon9NDbPfxU1/G2TJ6EyMOnguKHw6do9e6wka69vYtQPexzxBkWJep+4qu7Zae2y7QbSytLWw31uI2tqeX2g7ifXJ5D8lLcZuT48LaYt3hncUaTiVeZWso/sBtDcN7cWv2e/9/3PH3uusdvdj1QM92vaZj1xF9PfdOvZh7wEtxn829dly/BfjNkdNbDTB5h5Lea4DJA6q4Dxpgcll9dA0wOXJ1DTC6TK+uAUaX6W2fY4DRuTnqMcDoMr15DJC8w8PkXxkgecAq+ZYJM3mNIsU9AyaXrHpufsyMbC6Z1W1t/Q2zqrlk38ML9euaGdlc2s+PzL1jylaXjPziRP3KOzlkdSbuV8/Mkcni1AM22EzufKZeo4Z/pP4D9+VJHQ8k8OjAJ6zoj/H0pn/BAf0Qb2761t+jw/Uzl58dPZ97q17OvVevhg0wrh/ufPB0OdroMa+qN/Q8bvqJuedRtJaH3wJH6tfiVczDzPPvgAvN87L/eTXm/888r+hyXgdWF+T5u0xqdeQYT7SOsN+lLyqrO2d4rXWH//OrZpXq1NZdWp2SutYNP1Nd+zZ8tLrGOlh+SHWw7ddWB1k3JWGkuulS3Vyqs0t1eamOL9X9pXvC0r1i8R6ydG/Z3+v+Qf8FVocQ2WNhih8AAAAASUVORK5CYII=",
"eyesKnockedOut": "iVBORw0KGgoAAAANSUhEUgAAALIAAACAAQAAAACHQw5jAAABBUlEQVR42u2WMQ6DMAxFjRgYOUKOkqOR3ozehCNkZEBJ/W3TLnWlVlVLq7BgXvwTk8HfVO8+MzX+bb4RP51+L4hH5RJTFE6WA57IkkxKNIEXjXvwrHEAt5zuuj20zFeWIVPKEFUawLPERVZTkN168EVOrAkFyWLdOvBZK1w4tdhfEHiSnJpZtvXK0wSu8Qo+2C2AmxZsHe02InPTFvCgcWZeds7vvPPA3PaELkc76wHf7Kx64vMmq2F8gVsN9czcwvLvfLjxNTZ+DF60DQiXRhA+w9v9H5b/Qj95Ux9+tv97PuL5jutTnq95Puj5puezni97Pu75vjcneHOFO4d4c0ub6w7IL0FMhO6cZXtmAAAAAElFTkSuQmCC",
"eyesLove": "iVBORw0KGgoAAAANSUhEUgAAALIAAACAAQAAAACHQw5jAAAB+klEQVR42u3WPU7DMBQH8BeMmgXUgaliKFsP0IExx2EEiQPEnIAj9CrhBByBHMGjB8vB//eeGw+4EhVSK9QudX/1V2L7PdP042egi5/aA6VPI79HlJfiXKaOnbQO3JJW0qZEPTxK2cCdlNdwrdPsu0fb5D41Q02eBreyLdxxOfK/ds29GfjII04WE+I/p9DAB5nhmKpGfQqCW64zudQsGHHbw6Xs4a2+Bbi2hfmlvo0uubaN8LWUXfKYPX277Ovk2ifauU7HOuBBx5re0ni9zmF5hOscpo/kWoz/29OSp8UXJyy++tBOaeuxR+o8ZbevMW099mB2jnp1WgXaiHv6HJtOPNKNp624o6eh2YkHWrzQSnykraXP7OaBbrOviJ7FPbb8tfiA8qbwReGP4nx4rnp2Pmt3hZvC7wunws1pnZ+Liudqj3ONS/o+ETYOe5Two+uF8JPXF33m9UVIy/uBQ5HsB36UvK847Om+wlDqjkOduMVQ6ug0788BQ6kHjnriI4ZSjxwlxR2iZN7naKvuMYXsFtFWPGAK2UdEZz0XGCq7Q3xUt2Z2T/M5Sodk76GZHWE2O8c4dcS4/XlsZ/dd4e+zh77wr9njucaTP4rDv43/tTxSyzvVPFXLa7U8WMubtTxby8u1PF7L+7V7Qu1eUb2H1O4tl3vdGfo3+S3L7VKZWUcAAAAASUVORK5CYII=",
"eyesMiddleLeft": "iVBORw0KGgoAAAANSUhEUgAAALIAAACAAQAAAACHQw5jAAABpUlEQVR42u3WvU7DMBAH8L8VpG6EHUEeAwZEXqVvQDeQGGImXoeRAampGBh5AaRGYmCDTDSowcbnnJ0OHBUfUhmSpddffLbruDnDfnqVGHzT3sJdqvteUZx27mPk3sFtyDW4EacCBbnp4oS87uKMnNuo2D3lOm9cGrX00/BZekRe+9j4uzrzvSXklR/RapqQv2lbRV52M6xcU8O/AuTat7G1S2uTznVB3sUN+YhXgZxzyZqUVyN3zrmGPOvi2rkJ7j7r4Jlz7pPy6pzH+sJbHsteuPEKnkP6A+c52JlzDs3gv/Eq712teHYXvTF59Na+RX+y99GX1XH0uVpEX+i0CH6D8+jPSKbBJ9iL/gA1ZzcVtqNfY+eF/b3EZRH8CocnwbW6jT7B0Sn7UqvHafAxzg6CI5mt+HjFVfD9EnqX/RVbmPeO3rFxd/NHP3+o6TqfAP36+GcR1hP9eiIp+vXHyvqPinXPS3q+0n6Q9o+036T9Ke7n4f+e/t17+Lvvf6mOSHVHrFNSXZPqoFQ3pTor1WWpjkt1XzonSOcK8RwinVuGc90/9A8jSWjIB4EzpQAAAABJRU5ErkJggg==",
"eyesMiddleRight": "iVBORw0KGgoAAAANSUhEUgAAALIAAACAAQAAAACHQw5jAAABpklEQVR42u3WvU7DMBAH8L8VpG6EHaE8BgyIvErfgG4gITVm4nUYGVBJxcDICyAaiYENMtGgBgefc3YycFR8SDAkS6+/+GzXcXNG8+GVY/C/9hr2Uu33guK4dRcjdQ5uQ67BjTgVyMhNG0fkZRsn5NxGhe4p13pl06ilm4bL0iPy0sXG3dWJ6y0iL9yIjaYJuZtNrcjzdoaFbWr4V4BcuzZNadPqqHWdkbdxRT7iVSDnXLIq5tVIrXOuIU/auLRuvNvP0ntinfukvDLlsT7xmsdqTu14Gc8h/obzHJq5dQ7N4D/0Iu1c9Ty5CV6ZNHjdvAZ/bG6Dr4qD4Au1DL7Uceb9EifBnxBdeZ9gJ/gd1ILdFNgMfoGtZ/a3HGdT7+fYO/Su1XXwCfaP2FdaPcy8j3G86x3RvOfjnivvJofeZn/BBu47R+f4c7fzRzd/qNk6nwDd+iCadeuJbj0RTbv1R2/9R9N1z0t6vtJ+kPaPtN+k/Snu5+H//lvv4a++/6U6ItUdsU5JdU2qg1LdlOqsVJelOi7VfemcIJ0rxHOIdG4ZznX/0N8BvkBoyHDCksQAAAAASUVORK5CYII=",
"eyesNeutral": "iVBORw0KGgoAAAANSUhEUgAAALIAAACAAQAAAACHQw5jAAABrElEQVR42u3WvU7DMBAH8H8UqekCfYACeQW2DkUqj8JblC1BSKw8Aq/AyETDxMjKgEQkVkTD0lRq6uBz7uIOHBUfUhmapddffLFruzmj/vTKsPVNewV7Bc33nOJe4y7GyDm4DXkKbsSpQEJumjgkL5o4Juc2Qft4yrU+t2nU0g3DZaUReeFi4+6msXtaSJ67HuuUBuRu1lVAnjUjzG1Tw78C5KlrUxc2rQobTxPyJp6TRzwL5JxLNu/xbIysc64hj5u4sG7E7WchHlvnZ1JeMeK+vvCK+6rPbH8Jj6H3A+cx1HfWOTRb/5W7NWanNRZ/r5LWL1+8P9RX4iapvN+GU/FlESetn6IUX2TRRNzkGIqXCJ7Flxn2xd+AqfgiDXbFn9Adt47wQvwRewPxEuF9wn6Dg6H4DNG5+DWO+t47offD1l/RDSbsJzje8Y4Vx8Z9Zt9Kfvzor/MSiPz8YOjnEx0/nxj4+cfK/GO8br209dX2g7p/tP2m7U9tP2//73/3Hv7u+1+rI1rdUeuUVte0OqjVTa3OanVZq+Na3dfOCdq5Qj2HaOeW7bnuH/oHa6JiOJLpgNsAAAAASUVORK5CYII=",
"eyesNuclear": "iVBORw0KGgoAAAANSUhEUgAAALIAAACAAQAAAACHQw5jAAACgklEQVR42u3WsW7bMBAA0BMMVEthrR6M6hu6OUv5Mf2BBlk6FCGLDF2K+geK5lfUJd7iX5ChwasMLzRA8HrHO9pLGaNB0GSIYSTUEynS5B0pwL9+Onj15/YA9KnkuudyI57KYJKD1mF3oJW0KYBlj1KesI9Sbtm1TnV8PLcl99SMa6ZhpFauZh9TOaa7rk1Pm7D3qUd0PKB0E0PF3skIe6oa9VcAu0t1cKRmYSLuLLuUPXuts8Cubdl8o7NhyLVtZG+lPJLH7PR/zN6S6zO53Wi0rwc8aF/4lfqzOobmEa5jwN/kWoz/ydP8qvN8Z+84etQBTl7xBIuHujfZ6XuTfbSxyT5aFnH6e5N9QzNo1b8hXaqvqCejTr357Evk6+R0H4NVn1scluLhEvGHEY8LeshK3NOj6lY8fDLYDeK7jhZ0qU4h6K7E987Gai3uKXLhUnxwJlQr8UNHfiG+BRNgK75zdYSZ+B20Hj6K79nn4vfsV+IDTAK8tcm/QzPCe/Et+1T8J/vF4/wO6l/wxiSfwbvPMBO/h3oKtfgC5vTNPq1PvphnX6c4ETccJ+Gcc85kp9w7OjYnDyY7LfstLWzyFqNFr78rhar8rlsuH8459Xt06ld94HEG8SWPc6frgr7CIOuyxr7Gva4juxdfsQ+67rzpHXTdeevTdffsO40Tdo2TQNum3WtcoatQ4ypY8hyH7BqHkXYnk+OW807jFlsHbY7za4Brk/OCPOfFB4AvOS9WPdXJeeSqYx5twuSUd2OzOZenpbwu7QPFfaO0zzzJPvZE+/C/7v+lc6R07hTPqdK5VjoHS+dm6Zwtnculc7x07pfeE0rvFcX3kNJ7y+t73Qv0PwhMG/HSVEiBAAAAAElFTkSuQmCC",
"eyesPinchLeft": "iVBORw0KGgoAAAANSUhEUgAAALIAAACAAQAAAACHQw5jAAABe0lEQVR42u3WvU7DMBAH8H8UpG7kARDkMdjIq/QN6MbAEPNGjAxIhImRF0BqNjbIRIMabO7ss8PAgUAVBZEuvf7is6/5OsO9+2kw+bZ9AH2y8LvluAjuY1TeIWPYDWSQpAI1uw1xzt6FuGSXMVmannPJe0rjkb4Mn2Vm7J2PrT9qSj9bzt76FZ3hgvxBN2TsTaiwpaFW/gXYjR/jOkob8uCmZg9xzz6Ts8AuuWx9IWejIpdcy16GuCO30em7i16Sy5yc11Wy1gc+yFrujNarpYbiGy41uGtyCe3k/9eB9OC1Mf4JP2gw35N6npBjKfWQm9F33jpGx8a9nAOH4msq9+ozXwAn0Q3y5OfAsfgLeR39AniM3mCW/A7ZUty22E3X68HPGa7XAvvJV6aoo1/iNPm6PUrXd5mtkg/uOfm9ux3vh/ImeW+rbd8Pf+V52dB7+Kvvf62PaH1H7VNaX9P6oNY3tT6r9WWtj2t9X9snaPsKdR+i7Vumfd0v9FdjPP/LItpYaQAAAABJRU5ErkJggg==",
"eyesPinchMiddle": "iVBORw0KGgoAAAANSUhEUgAAALIAAACAAQAAAACHQw5jAAABhklEQVR42u3WMU7DMBQG4D+K1LBAD4BQrsDGwFCOwi1gszkBR+AKjEw0nICVAYlIrBU1C63U1MbPfs9kwCBQRUE0S1+/+NmvaZJnuHePBhtft3fwRxG/txQPo4cYo+DgMeQaPIhTAUVuY1ySmxjX5DymSNNTrve5T6ORoYyQpStyE2Ibzuo6zFaSt2FFp6mgcNJ1BXkTK2z9UMu/AuQ6jHHGp3VldK3IYzwnr/gqkHMu2XzIV2PknXMteR1j492K+08jXnvnOSnPjHitD7zjtdyZX09xDcNvONfgbrxzaDf+fx1ID14r8U947SYYFGOu5xj721LnBFs9P+o5eo6V+4t/Kyn2S2D3M58BlfgVcCi+AAZyne+Ag+QaO+L3wIn4ssGe+BMwFbetn5N9huIh/Y+nmIkvmmqc/Lqcii9NrZLfugtxq7q3++G5U+l+OH9c+/3wN56XFb2Hv/r+z/WRXN/J9qlcX8v1wVzfzPXZXF/O9fFc38/tE3L7iuw+JLdv2ezrfqG/Ar/2+7GXAFZTAAAAAElFTkSuQmCC",
"eyesPinchRight": "iVBORw0KGgoAAAANSUhEUgAAALIAAACAAQAAAACHQw5jAAABf0lEQVR42u3WO07EMBAG4D8K0nbkAAjlGHTkKnsDtqNAIuYEXIWSAkE4ARdAEImCDlKxQRtsZuyxQ8GAQCsWxKbZyRdPPJvXGO7drcHaV+0DaMvCfstxEdzHqLxDxrAbyCBJBWp2G+KcvQtxyS5jsnR6ziXvKY1H+jJ8lpmwdz62/qgp/dly9tbP6AwX5A+6IWNvQoUtDbXyL8Bu/BjXUdqQBzc1e4h79olcBXbJZesLuRoVueRa9jLEHbmNTr9d9JJczsl5XSVzfeCDzOWOaL5aaii+4VKDuySX0K79/zqQXrw2xj/h/B42mG5JPU/IcTO6GX3jrWN0LN3dFNgRX1DF55/5DNiPbpAnPwH2xF/ID6OfAo/RG0ySXyO7FbctNtP9ekB+Ee/XDNvJ56aoo5/hIPmi3U339zabJx/cc/J7dzU+D8d3yXtbrfp5+BPvy5K+w1/9/mt9ROs7ap/S+prWB7W+qfVZrS9rfVzr+9o6QVtXqOsQbd2yXtf9Qn8F3gkAZhfTUgYAAAAASUVORK5CYII=",
"eyesSleeping": "iVBORw0KGgoAAAANSUhEUgAAALIAAACAAQAAAACHQw5jAAAA/UlEQVR42u2WPQ7DIAyFHWXImCNwlBwt9GbpTTgCYwYE9bOdTnWl/ijtAEtePmxwkMIztYdjo85/zQvxGPQ9Qc/KRdMinCwGPJIFWSrRCl5Vj+BZdQC3mOG+PHKZ75yGSClDsuIEnkVXmY1BVhvBk+zYIgqSyVYG8E0rTBxa7SsIPEpMy5xWRuVxBVe9g092CuCWC7bPdhoLc8ut4EF1Zl4Pzs988MDc1kReXmyvJ7zYXu3C+61Ww/wGtxralbnJ2nnnZ3Oi+w+fDn0G7+ff+Sf8S/fwq/e/5yOe77g+5fma54Oeb3o+6/my5+Oe73t9gtdXuH2I17f0vu4P+Q3tn6K1k3T0owAAAABJRU5ErkJggg==",
"eyesTear": "iVBORw0KGgoAAAANSUhEUgAAALIAAACAAQAAAACHQw5jAAABsElEQVR42u3WzUrDQBAH8H9YML1oHsCPHHwBbx4qxJuvIfgQesuK4PN49Nb01FfwIBjxKhoQ2kDjrjv7kXjIFALFemgunf6yk51s2sxC9x4Ftr5pb2COyH0vKU6c2xiZdfgx5BJ+kE8FcnLlYkFeuTgl92Oi9vKUa7w2aTTSlmGzZExe2VjZszK1VxPkpZ1RSyrIntRNRF64CkszVPm7ALm0Y3Rl0hrhXObkLq7JY78K5D6XrE78amTGfa4iT11cGVfBzWcVPDXur0l5VebnWuGNn0vfmvlyX0NiHGgXrgzxX7i5lxsstJ4a13pZxBOtnKsS4+ALRC/BvwscBv8APoMvZbQX/Bmj69Yh7oM/4eA0+AJilnt/xNE4+BzxXfAHnO13viM6P2n9HaNo4v0S57ud45dj4z43/5aufvj6N/jc7eHqcb/tQb5Yk38x/rYmf2V8OtALxiXneb8j63WFtNcbxmuR9DtmvV7hgvErxo8ZF2vxGvEgb5AMWjfTOVY+R+49PNCHvv+5PsL1HbZPcX2N64Nc3+T6LNeXuT7O9X1un8DtK9h9CLdv2e7r/qH/AE7U1rlxChGvAAAAAElFTkSuQmCC",
"eyesTiredLeft": "iVBORw0KGgoAAAANSUhEUgAAALIAAACAAQAAAACHQw5jAAABiElEQVR42u3WP07DMBQG8M8yUjZyAAQ5Bltzld6AbiBVKOZGjAxITSfGXgCp3tggEw1qZONnPzsMGCQGClK69PUX/3nN4M+wn35aTH5oH+A+IvzWVJfBfY3aO3gMuQIP4qlAQ25CLcm7UFfkPEak5Wmu895No5G+DT9LFeSdr41/qiq/miTXfkerqCH/0A6CvA0dajfU8L8AufJjbOemDTK4ashD3ZMX/BbIeS5ZX/LbqJ3zXENehbpzbqK77y565ZzXpHldzXt94QPvZW/cfg33UP7AuQe7ds6lmXzyyf+HA+mg1LH+Da/muDrnfvaQ61Xsc475BxfRz1qoE/ZXHGE7OkbHwd31j7F/iNU3Xi6ASz5XlwpyFc/bW+CC/dp5E/0OeIneomA3xSPEls/5mcZxOv+f/Zrh/F/gNLrcqbKJOXKPJeeIlXs9S7mzFTvOHSsG+5Zy6sluYk4pWz2kXOtNHXNNNboec1CkHMzlZi5nc7mcy/Fc7ufuCbl7RfYekru3TPe6P+jvVlI6sc0WsN0AAAAASUVORK5CYII=",
"eyesTiredMiddle": "iVBORw0KGgoAAAANSUhEUgAAALIAAACAAQAAAACHQw5jAAABjElEQVR42u3WMU7DMBQG4D+K1LBADlChXIGNgaEchVvAZnMCjsAVGJloOEFXBiQisSIalrZSU5v37PdSBgwSAwUpWfryxc9xM/g3/KdXjcF37R3oyuJ9w3UZPdSYBIeMYbeQQdIKGHYX65y9jXXFLmOyfnruJV9RG48MywhdtmBvQ+3CU1uF2XL2JrzRW15QeOi7jL2OK2xoqJN/AXYbxviW2ro8ujXssV6xF/IV2KWXbVXK15iQS69jr2Ldkjt1+m3VK3KZk/vaibzrC+/kXf6S3mdkDeUPXNbg78mldIMPPvj/cKDfKButf8Mrv8AoN7KeGxyNdZ0v2Mum4mc43d86Pjh27gtKne36Mf7Ol0ChfgucRC/9GhjpvvoAHOt+u7Y4UH8EztU3NQ7VX4F5cNrnXUNzyj6/RPbU7/8XWKqv62Iane7v8rnmyKatTMgRHjfz15o7znQxdzin3jrT59TVs+SUjVmkucaZFHItlYOp3EzlbCqXUzmeyv3UOSF1rkieQ1LnluFc9wf9HedzO02a43rNAAAAAElFTkSuQmCC",
"eyesTiredRight": "iVBORw0KGgoAAAANSUhEUgAAALIAAACAAQAAAACHQw5jAAABjUlEQVR42u3WsU7DMBAG4N8KUjfyAAjlMdjIq/QN6AYSiJg3YmSoSjp15AUQ9cYGmWhQg43vfE4YcAcGClK69PrFl1wz+Dfct58ao+/bO/iPCr8N1XlwrlGyQ9aQa8giaQUqchvqjLwJdUEua1R/e+r13vo2WsljcJeekDdcW76qC75bRm74iU7TQHzRdYq8DhMav9TKvwC55jWu8W1dFlxX5KFuySfyFsill6zN5W2U3qXXkhehbrzb6P67iV54l3tSX1PKs3Z4J89yN/55lcyQ/8BlBrf0LqUdffTR/4cD/UZpYv0bTvNMcXEi82yRLReDT7+4im5r6CPxNxzgaXAMjr27nx/D/FCLXU776gw4l311q5HNo98CZ+If3q+i3wGv0WtMyHmff4Rayz5vDQ77/f8F2X3c/2c4Zqcc2ej8OubIHJeUI5w7W3Pa585abSh3OKc6997n1LN74JziXCtWfa61tuRc4xw05ZCDKuRgKjdTOZvK5VSOp3I/dU5InSuS55DUuWU81/1B/wSObTqxus+kUQAAAABJRU5ErkJggg==",
"eyesToxic": "iVBORw0KGgoAAAANSUhEUgAAALIAAACAAQAAAACHQw5jAAACF0lEQVR42u3WPW4cIRQA4EeINEUikS6dSYrIpXMASxzBR8g1No0HKwfYI+xRvJYLl77CRKnSIaUZSxjyHjx+ipCVo0ixFW+z7LcwPBjgAfGXnz08+792D/gR+fdCZZU9lcEkB65DboErcVOAmTzksiR3uazJuY6oj6e26Cs2o5opjNTKTuQulUP61+r0NEm+pB6jpYDSn9EL8n2OcMGqgUcB5DbViQ6beZndzuS5vJJPPAvk3JZsVTwbBp3bBnKdyw49FMdvV1yj8zOpnTPc12/cc1/xAvubOQb1B84xxCt0Lob/1NO7Yad3U9zRumG3svle7IoHeN3cwllxDy/mzk+ai+YAb4uvAJfFQ9oV2R3tiuavOv90qL5Puyj7QrvokKvpovrmtLneXlX3553fNg+HPejtdY3Tn7dxqeMv1T+fduP92MYlrG7ztpnqvEncz/W9bHR9L3Jf38tl8/vedwuYb9l9xCnR7Fs8KIrPeIwUl/cf4k32VX8/CSZ7AHOMLZI7cWcWxf4Gz6f37NYEUfwIgvjK7ianVI1Tb3+UOMHPu7oOu/Vp2/rc3UIZlw8bqP5SLrLE+U7DEceJQ/S4ULKDWqCMC1dA83mtblPP+fkT9cx+TT1lDxTd3Dx2vha/6dx0/rTPjb90Dj/0/B/lkVHeGeapUV4b5cFR3hzl2VFeHuXxUd4f3RNG94rhPWR0b3m+1z1C/wlHT0r16qhmxgAAAABJRU5ErkJggg==",
"eyesUp": "iVBORw0KGgoAAAANSUhEUgAAALIAAACAAQAAAACHQw5jAAAB5ElEQVR42u3WPU7DMBQH8H8UibBAD1AgV2BjACkchVuUzUFIrByBKzAy0TIxsjIgUYkVQVjaSg15vC+3DA0IFhjipe4vfrYrv+YZtLKN0Plfew1uiX0fS79nrn0U6vAx4iV8kIcCQbyxfipeWT8X9zHJYnqJZZ9xmIzUbWhUmYlX2m/0aZnrbKn4WFekUjakD6lOxEe2wzEPbfxXQLwM1PBUFYfV8snPyyBO9FYHmolnROdPvLw4x97RhRo/a0LNcxbsHHudvlIjntN7lQeq2GXuY0xtjZzmo2zIn+wZNWPsk8RVBU2RPHKc+vsI29FfgFf1ukfzMtkkOuH1Aj1gfUB1zxzpWfR7bO1FnyK9De5X2Nk3z2mC7DTQDTvRJQ761ERfS5e+u/BnrCdD9yMcbiwdnxx/7hPOquX+0f/Op0AW/Qp8Fu5zYI3c74G9hZfYjP4ADKLbeZnrebnb+Zrr+bprPrhrPkSX/HHX/Iku+eau+RZd8tNd8zO65Fp0yefo2tz1z9N5553/zHv+xd6r2upfuNQJbfae1+bv/9We+h68RmnBy63uqFvdMS+sTulaVqes9hVW13ROr2taVoPVQY31Oqg1NHxRN9vqbFtdbqvjbXW/7Z7Qdq9ovYe03Vu6e90/9A9mtWI4APcpSAAAAABJRU5ErkJggg==",
"eyesWinking": "iVBORw0KGgoAAAANSUhEUgAAALIAAACAAQAAAACHQw5jAAABYUlEQVR42u3WMU7EMBAF0G9Z2lBtToByEIpci85eIXENbgKhouQKOQASpiGRCDYee5YCzSAFEFAkzc6+eGyv480YSbwGbP7XviBfpn4fKW6rlxh9cXAbcg9uxKmAI481tuShxh05tzHv3VNu9jmnUcsyjZLlG/JQ4lju+q70ZsnHMmLyNKFyMy2GfKgzHHPTyL8C5L60SSGnLba6d+Q1nskbXgVyziWbW16NPjvnRvKuxiF7PHr+DEfvsnOflBd6HusTX3isdMjjOZ5D+wXnOaTb7BzGzb/l5RkL/rQ40e/TlejX9lH0c0ySxxFnkr8OOJX8xZu96LCXkk+wd07wZzQXsu+s5A84MTeigx18/bZ/nD+sW+ET0DhxPbGT1x/7Nc9Le77aflD3j7bftP2p7eft//5z7+G173+tjmh1R61TWl3T6qBWN7U6q9VlrY5rdV87J2jnCvUcop1btnPdP/Q36EeCwIlHlo8AAAAASUVORK5CYII=",
"informationAccept": "iVBORw0KGgoAAAANSUhEUgAAALIAAACAAQAAAACHQw5jAAACY0lEQVR42r3WTWrbQBTA8adOibsIcZcuGJQjuHTTRYh6lEIvEMgBNLtkEUJP0FxlTIKzKe0VRF3IVm43ExBy51vz3hvTVeuFMT+E9H8zEhbsix8F/8rXB1we8GVT9vO66GNzVfThcl103fVF36mzpuS/1Uld8q0UVyV/hOq+5LcAFyVfAixa7uN7gKO64BcAYsZ9MA733HVnfMV9p4wvW+ZbafyE+xPYD/eNc37+G8sV94V1wdyOC8DnsuMCzJkPH63z9dF2LGiY76TPp74N+dQ3IZ/6t5BP/SbkU1+EfOLjKuQT92Px+3BQIZ+4liGfuBtXcN/GTOKbmEn8a8wkfh0zib+OmdjH05iJ3Y1bcXe7KLg/y5iPfZfysf9I+dgfUj7265SP/XPKx75K+cjduIL78CHlI3e7OOf+POUj/zXlI/855SN/mPKT34VxK+y6DrsosEubdzrlB9fiuxl3Wv3osnk042b53rXonsx3lu9dnoPxPst3roWCT8Hz/xd1BnC533dZvvO1uW3e2Z9TvnN74FtzlSwz+Zv9Ps90bi+48GM1udvwY+9t7oPzIc9M/rLVeaZze4ajts8z/ToYedF02SrH9TFHOp8zrxqV53s3VNUyz/duT3GH8r3blC8of/JjlB/20dgrlO/dLQHK9z4Gnx/wmr4/BG+oSwCcH1wB4HzkFfMOAOcH72l+vM9pfvCB5iNvmI80Pz5fND89dyQ/d1FwRfKjdyQ/ek8yc28Lrklm9IFkRh9JZuaz4nsjyUwu0SpPrnB+5m3ROyi/r/ZV2bU44LOyD/Oyj/X/et/+i/8B3hwL9ySzr9cAAAAASUVORK5CYII=",
"informationBackward": "iVBORw0KGgoAAAANSUhEUgAAALIAAACAAQAAAACHQw5jAAABFElEQVR42u3WPwrCMBQG8Bcj/gGhg4tbBAdn8QB1c/QQHqS5gUfwKNYT9AqCg6tjh9LaphGbl/eGgg5CAl1+lML3pcMHFXlS+LprAIgJrxkU4co+2Jf1++ceDsGDBw8e/P/9CeZokK7fWt+BID2uruR3AO6u529/uF5YFhnt8uR6+XaFclkfxci19YT2Gfa09QXuzQbeYLeBt4wfsdsi9tht4Ax7G1icGFfe/RofxJ7rbg0dN4GHjE/8/8cUMfXdBJ77bgKvGF/7boo4+G4CRz12DjC7qCkiITxlvAlc0S4or4uQlOeM14HHjEeUl524zj7kXH9qQJ6QnjJ+A3qXPgXjkvac8WJMexkxe1j19MtPd7jrL3T4N1ugBC5lAAAAAElFTkSuQmCC",
"informationDecline": "iVBORw0KGgoAAAANSUhEUgAAALIAAACAAQAAAACHQw5jAAAChUlEQVR42rWWQY6bQBBFizgS3oGl7InGByFZ+VigrNjNlYjkgyDnAng1LQUxaXdVdfNraM0sMr3x8PTH/g1d/0Ovu2uk/8v/KnhBflf+B/mk/Dfyayd8QP6rFf6tA140/Lk+tVu+0jPz5Wez5QtdmLv+ecsdncWvCITPdGJ+E4HwiY7iVwTCR/rK/gYRCO/pC/urRSCciDewfhcB85WIN7D8EAHzxfML2xcBc+f5me2LgPnsL09sXwTMJ395ZPsiYD76y+BvUAFz/2vsr1YBc38V/Hn7Igj8YT/48/Zlh4EvgV/YPm8gcBf4me3zBjb6E9snqvD7j2yfqAE/D39D+KMF/w9/deAd7Nf/f7BPhPfH/16wTwXeT6KS7R/w/nvA9kt8Xv4Lkv3N8/Ur2U/nIews2k/n57GS/XTe0sLzGVeB5zmuA57/uEqcl7gqnK+4YL5eE4d5lA1E+5GPaD/lA9qPfEb7kTu0H/mC9iNf0X7KN7SfeA/2Ex/BfuIT2E98BvuJO7Cf+AL2E1/B/iafwf77PPc9ud/N+cztK3cfcvdtyNznev+5yOi+eY48um+fu+v3z8k9c65umXN4zZzbIXPO6/25iPbNHEX7Zu5cvz+n98xc3zI5cM3kxrDh25ypyQy25BjbH22OSXBONvckOGebkxKcjkyuSnAuZHJYgnMlk9ua+2RyXoOzx16IuT9ij8Tcn7B3Yu6nDWx6qtThMD1VqcD0VKMC01OtCkxPdSowPaUC01OFCkxPHVRgeqpUgempSgWmpxoVmJ5qVWB6qlOB6SmdH9NThcaH6amDxo3pqVLjyfRUpXFmekrfG21PaUDantL30v5j77G5997ce/KnvZ//A/4SazfzAqDCAAAAAElFTkSuQmCC",
"informationForward": "iVBORw0KGgoAAAANSUhEUgAAALIAAACAAQAAAACHQw5jAAABLUlEQVR42u3WMWrDMBgF4BcMngLtqE7uEWpygOQoBQ89hj1mKKRjtl7FQ6jHXCE0F4ibxYNRa8mWFEsvQ4YsxRo/hOA9fiHhl64Sd/Ccu1ze5m3Cvdlwryvu5yP344L7V8r9XXDfznPqIqYuX+Il9dcoYd6uZhvmTYE987pAxfwMZMy/gZT5DnhivgYE8y3girjwR8AFdi6fgYh4u+o8IV4CrgjnXQ1wgZ3XHeMt9B/lWegH5WnoO+Ui9LXyeegf2vPAFbsirEvtNrB1VUMX+DNwvd8WYb3Rbouwfuo9u+IL3w+9p76XvQvfi95NYN9j34FREcbl4KYI4+3gJrDv5goYb4xXYz8Zz8Y+xMVDzR2zK+dEwTyrzWzOJ5988skn//eOG1y/hPld/+GX/gcqVSYNBdilYwAAAABJRU5ErkJggg==",
"informationLeft": "iVBORw0KGgoAAAANSUhEUgAAALIAAACAAQAAAACHQw5jAAABAUlEQVR42u3WMWoDMRAF0CEu7NKQJoUxvkOaFLlbBGlcGO+VhHWEXECq3ArSTCFG3saS1/xfbBHS7JQPIX0hhpFUWF4WX/xP/Uo8EP/Gbq/Yyzt2/cWeiIcf7AM+1/bYyyd2zdhTxB4c9kGg2w57+cCuGXvy2IPDfhboYxzZyr26j3Fk0/yruUaRdXvR7slJr5fuQbCfsNsb9nLArh57kkk1vxA/Yrct9iLY1WHPZL0n7mauZ/urzMtfmZN7PQdqnokrcSNemTvikXgmrsSN+DTQQ3+NgVao7yLxTLwQN+KVuSceiWfihbgRr464Jx6JK/FC3Fbz5hSda9flP7D4v/kNWMQjUDSyRnEAAAAASUVORK5CYII=",
"informationNoGo": "iVBORw0KGgoAAAANSUhEUgAAALIAAACAAQAAAACHQw5jAAACvElEQVR42rXWMW7cMBAF0KHXiIoszE2XAAboLrWR1gjducwhfIHcQALcuNsj+CpCYMClryDnBEqnQlhlSM6QHJLukq12H1bSJ0VyBrbmZ4R/75Nq+gLQtXyAG+hrx7+buat9AlCbqh3wo2db+upcrbr02TnYh9In791b6YN3WHrpp8BwY6Sv5FpLX8i7F+kTuXqTPpLDT+kujnYPueyFu7/6qy5s7i6m9qk+mtzdHay/7NMx98VNso919ZL7TO9wgdv73DG+Cc8ZrnMfw+23TcHnwkPeX7DPfYBd8Gc47zOPS+cRPtjkJz8q9znAzggPjz1dgXpKjsMN07XegjoKp9eD8/qafGH/g/N0l3wGWoC/0e9zj/EBviWfUnyA64Yf0L8kH2lYGH8fJk46xr8ME8duOP53OE8+0DRg/D5MqHSMv8FZcp6eZxzfcGYrf8TxDSp3jt9tY+0YX+d+Isf4Bt0kVxzf4unxVLqLL30X4+OcR1/JXXz0Y+kuPvpr6S4++o/kXYyPa6B0H7/hPn7uS3AfH3/cJdcxPl78tXAfv+E+fsN9/NpD/NpD/NpD/NpD/NpDfBp85iG+9C7Gpx/ZvB34SNHCKX7lFF/6LsbH9yid4ldO8XP364rio8v1SfFxz0qn+NIhxqe9GffFSiclitgvCx9Z0vuZ994gfYJYCWy+r0c+msJ10ePJmjtm45OV9ib7BZ+sq/Q9xxfuq5elyqEK72ufQ5nKjszkigviTpzDHH8MeeO5zScoHY3JNU+PFnWB4m/0JbnlYRlRd2J8sKJOxfjQt+oafynrIEhPdZPGXdVZGndVl2ncVR2Pq66o+2DafQLYdl8BfbsPgXbfwq+t7HPS65F9Eeh2HwWm3XdB3+zT+LFlX8erpegD42OLvpFnoegz0+1lX5o1sqKPhVYf+27f+16f/H/687+bJlUxAa4nQgAAAABJRU5ErkJggg==",
"informationQuestionMark": "iVBORw0KGgoAAAANSUhEUgAAALIAAACAAQAAAACHQw5jAAABoUlEQVR42s3WQW7DIBAF0KGuyiZKLhCJZa/QrjhOt80Fam7QI/Qq3mXZKyDlAl6ysNwaiAIzzFSx1EjJIlKeLPLBwwD8sJ8B/t8BLOcjAHDuFjetTwAq6NbjMHZo3S+ux77xODx8mMYjg9lRn5PrI/UpuTpRD8nhQH3M/kLdZ9/3xIfsW0vcZdeGeGboPrHPZ1dH7DG+illPrZv4Jwfs8dE+hnptXKXvF+zLdHUabd/4LqXdsO5g0yP3uRYcPDZu088n1j31IcaP/mA5HxnPsTrWA3UXlyG6WuVT6935NVzr+i8P1EuVrvJRcC/4eVkbd4ID77Pg06V1YA+Cj5CXm/oSv+N8ENwBaM4hVy/1uXQy5DG+ZTxcpou96pTI/WVa2Et87CU+9hIfeRUfeRUfeRUfed3oa6/iU+84H0p85K7Ep27486gcSMR7wYVzTXE+V/GJ65W+43yqpnWl23vym983bu1e8+6UcP957/n3uxfWbcv6cuYY3tWXcL/6XuPLtnsT/FlwfU8+CvtF8iDsl7ByH81SnVft5Ko6kerqJvX8C9BZnroLD70HAAAAAElFTkSuQmCC",
"informationRight": "iVBORw0KGgoAAAANSUhEUgAAALIAAACAAQAAAACHQw5jAAABD0lEQVR42u3WMa4CIRSF4cvDxFdJa2HCFrCzm8INuQPsLHVJJhauY/I28KKNVhrBqwbOKSjshvIrmD8MAyM3OPYy+ODf9ivxf+aRuMd+dsSP2E898UB8FrFPPHbrsJsjdumJB+IaVLoGla5BpWtQ6RpUeSA+jW/fy3P8iAYlX6uPRIOSb3Wei4jZvH0nH6MnHsD8j5GDas9Bteeg2nNQ7TkIeCCegoCnIOApCHgKAi5/xAPxRcS+Is8l81vSMyb9k65tfVZkPQ9t78uS9z7q2vbPnOy3JfENduPB9/LKKc89kd+I3dywW+KOuCfeEcfns+ZUbok74p54JE7uC0N8TNy13Tv0nmq8B4f/hMG/7HcdRCwW5RggbgAAAABJRU5ErkJggg==",
"informationStop1": "iVBORw0KGgoAAAANSUhEUgAAALIAAACAAQAAAACHQw5jAAACf0lEQVR42q3WvWocMRAH8BEqtotSurp9BncJOdDDuMgrXGGsLVIG+5UEgbjLMyy4DxvSbIhYZfT9cRpwQq45+BW7/5FWowE7/Gn4Vwf/k70fwefeTaCn3ncQ7u+59y085673Nfht7zokuel9Uf7vs+o8/n+VrR/Mv4C9zK0brv17fzy1vk+L98tz65sIOc93ra+n4Kfb1vU5uLhpfbkEn2IBySGuD48FRI/xSwHRU/xcQPQUPxcQPcXPBURP8XMB0VP8XED0FD8XED3FzwUEz/FzAcFL/FRA8BI/FRC8xE8FBC/xUwHBS/xUQPASPxUQvMRPBXiv4qcCvNfxYwHe6/ixAO91fCzgY/ZT7afi59rfFH/3t86ML2nvfbIc44oDz/tWu7Bf0GeLbmqf7Qu6tIu0R+3S/kRX/rTWruxvdNwg9MfaBfqvQ2wS5m+VH3xnhpkJXdRu2MYM3/kuYap9B42+MeffGwd8ygpGAq/dEH5411eunAsN993zlQ7+0OWRW/Ym/2zGLmx29djsyxK9XU9u16GD3ZI3+wJyT97sIwiTvNl34MmX9rtihAPl93Hden+I6z901vtb535/W7+49w589+6+k8Y/HC4/Jtpaf49nGP2Y1+45+NHikXG3T+vKu7ry2e0LuHPRurD4fYI7R0t37nBFYTK9gz+hsL7yXFP9geonRP+h+hXV36h+SPVPst9S/Znq51T/p+4L6n6h7iPq/qrvu09qfD8CcZ8y4v7lxH09je/3TYzngXUezw9ajueNRY3nEyDmGUbMP5yYl6bxfBXjX81j6zye37Qcz3uLGs+HQMyTjJg/+fW8Gtbner4N6/PaeZian//bfN75HwXO6JISlEzrAAAAAElFTkSuQmCC",
"informationStop2": "iVBORw0KGgoAAAANSUhEUgAAALIAAACAAQAAAACHQw5jAAACbklEQVR42q3WsW7fIBAH4ENUZankNUNVP0P2KH6YDH2LmCiVulTKKzE1r2EpD1C6ebCgBxwYMCdVbbyQ/yfZ+Z0xcOCHl4F/dYjX0rtLPvd+JHrpfYcpDK+92/Sch9635Le9m5Tkpne9xuHH2jmNP5fWnUjj29z6IdP4+6X1XdH42rqd6L6H1jd6rrtt3eQXedM6xS8FZC/TQAWQ5/ilAPIcvxRAnuOXAshz/FIAeY5fCiAv8XMB5CV+LoC8+rpSAcnP+LmA5Gf8XEDyM34uIPkZPxeQ/IyfC0hexacCklfxqYDkzeKIBUSv41MB0ev4VED0Oj4VEL2Oj3d/LT7X7k5f3stdTHqo3nc4AJQV+Huq3cId+gb4W9a+wWd0A6sBUbuBT+ga8A+oXcMHdNw20B9rt+gfhZ2M3+4rF4dy0skd3dYu3eTkoQ5l/F678ljaMbngXxr3+JTZS+OP2iXjIvpycR0cX+tz93y9JH/q8pipeJN/k2O3UFw/NvOykrfvE3fboXucPvJmXrxR2Zt59FZmb+YdP2nytf2uHOOe82d6b70/0fsfuuv9V/A4v61/D/934Cp6+E4avxMhPyaaWr8HCC62uXsOfrS4ZPAY7FxH1xffwrz4sC5atxCWXlhHa7fu8I36Xfbu084x/+d65/YTZv/h9ituf+P2Q27/ZPdbbn/m9nNu/+fOC+584c4j7vyqC/i2js9HYM5TwZy/kjmv1fh8pzsv/cA2j/sHs4z7Db2O+xNg+hnB9D+S6ZfUuL/K9/X92DaP+zezjPs9vY77Q2D6ScH0n/Lar8ZLXfvbeE1/2w9z/fO79eed/wEyMn3kewrZowAAAABJRU5ErkJggg==",
"informationThumbsDown": "iVBORw0KGgoAAAANSUhEUgAAALIAAACAAQAAAACHQw5jAAAA+UlEQVR42u3W0Q2CMBAG4CM8aEzMjcAoTOE87Ty6REdhhD7yQKhSUCm939AIwRjujS+XtPyUA3JiGdr9h90QlZJrokJyIuIUfyBb6ioP/Hy5sPFOgZ+uN9a9q0k/DVVM+kUf9TPo52/6j5R9dhXmMOrPgWeJTsjVRu6WcIa5LXa/5Ua+cs7yOSlgnplb8znOd66A18CdsP9uzjgdv1/+RBng/cKHaO7ZeJ74OWnjueSrfo+3wJs4f1/tc/Oxszi3R8M4cA3cAK+AW7BunejNEOZcb1+xTb5Tcj7proG/r0Kvkl2JboHX0MtVvVnIW+AO3Bd0o/b/sf/yO03ytM7x6NfjAAAAAElFTkSuQmCC",
"informationThumbsUp": "iVBORw0KGgoAAAANSUhEUgAAALIAAACAAQAAAACHQw5jAAAA9klEQVR42u3WQQqDMBAF0C8uLIWSI3gUT+F5kvO0l8hRPIJLF6I1KnTa/AEDiosasvExxOQTRjHS4XH5Ce4td6T5gIp6v5N3hzs/V6t4o/qY5F5xl3HHPj4gp96jSPIOJslbxRuU1L3iTnFwH8DfOznNp8dnIend5DnxFmFY6R7TTVu8lO7CczN7IR1hi372PHIXuwlz5vUIqz/q2nSLQ/r9+TIN8ake4PXUD6j/2v8NGURqsWv1P+tLtzt5dZKn7pPmYNQ8sZfbkzzxnmieU7dqbuYkLze6cYj7UnAvYpPeihi++gz5YokbtcmdaM1Rn7z+x/7I37QxtM54FQn1AAAAAElFTkSuQmCC",
"informationWarning": "iVBORw0KGgoAAAANSUhEUgAAALIAAACAAQAAAACHQw5jAAACT0lEQVR42rXWPYrjMBTAcSkJ4wkMmJB2wUWKnGErlylzne3sqbbMEXIVHUVH8HYqhLV6evrW8yyBHRcJ/GKD/c8DP2bIQ7Bv8IF23dGu9ht+pn05vuby8JqL3UT6vBtp57Qz9qRdkr4yeSedL6RrvlwpV3t12fAz5UunTxt+pFz26+EVF4NJQTOfrY+Uj+aTcmZ9oHwy4tn6Cn6n3N4q4Rr82rriNsVlw8+tL3aa1YnwLg+aXHZyr98J78WfFDS56OdfawyafB7mHylo4R+Gt85G9jbFoJlP1mPQ6DYn203i0bqxHoNG1+jX2m026zFo7efabU7rMWjhbFLH2mUHHoMm78Fj0OiiNzMz62Gq3E6n9Ri0dl67nU7wELT2+Vk6TCd4CNr4vXSYTnB5K10Fv1TO0UPQ4DCd4CFo48fSbU7nIWjjh9JtTuchaHCbzQh7TyFo47x0mw3dB23cT6h3yOb9QbufUO+Q0/std8WD+wn9h0M2I+HDB239mDtkQ/dBWz/kDjnRfVDvc3IMGnwIbgpnyfmQO5ykenfpM7nLZjSe+ajd/9P35Dp/q96Sq9wvmfPsrZ35kvsp82xDUJnjEym3V6j3zLt0FQZFdzmN/GliUHSX04gPE4N6dwXmNxODojPvUwzqfcQ9wfln9LXw+ZEcAb9cUOe69Ftwn9O7C1p6Curc5wwzeYqOOSVPQZ1jzvCzC4qOixt2xsl1Lrp8BdQQ1DnmjC9cCPels6HYJSHoV+5zpoXhga5Zdfze8NuGd//X19r70KHy8Zv28Nz/AgHnbGIis7BaAAAAAElFTkSuQmCC",
"legoColorSensor": "iVBORw0KGgoAAAANSUhEUgAAALIAAACAAQAAAACHQw5jAAABAElEQVR42u3WQQqDMBAF0BEX2dULtOQaXRQ8V6E06Ql6JY/iEbLMQmKdVCw1f0DRUhADgryFmD/jRGrhqmhVb2hYxSI3w5Ofm3OXY7dkxl6bmBFn8xi7J1LIa6IMedWFjNx2boBzUcrUA7tOvemLOHbPrqa7Y89Tr9mz5V5R7jiI1IsGuw7ILV0MB5f6WfBrrHDq5k9etjTDpRzk3HDOa9VR6pO5/dZQVqO+DaQ86vOW91siP9ywH+/YTwG7nunS+whuu32h7912OZgZ80GaJ5JLc8nFMk53ae6FOJa+Pc7VOMbAvH3fp+7V9s6dlc5lXrq/dt9994/3/0WL/Tf/5y+oIIpSoJDd5QAAAABJRU5ErkJggg==",
"legoEv3icon": "iVBORw0KGgoAAAANSUhEUgAAALIAAACAAQAAAACHQw5jAAABgElEQVR42t3WMXLEIAwFUHlcuPQRfBQfDbqkyCRX8lE4AiUF42SNEEh4f5FuE5fPuzMIjPTp++lz0Kt6oMcz3f24nO7ui7ubF6Z99JN9Gz2zr6Mn9mX0yD6PHtin0Xn5RKP76m7wylKA+Cm+Wc/iq/UkvliP4rP1ID5Zl+UTWffNnfHGtYDqZ/dNe+6+ak/dF+2x+6w9dJ+09+UTaffKnXLFXAD7qX3rntt+xVoAe2r7m2oB7LGdR66/YA/ap+6HdurujbvmZHwXP61v4tn6Kp6sL+LR+iweisdr6bmeQPGj+PWWD1rcF7/eulxPoDgf99vjD3uuJ6D8i577J/CPX/o7cH9zP7gz9Xa3fc+rtvQ/HNWL9gft56s5+j7R94y+f3Rf0P1C9xHdX3TfYX9A/QT1H9SvUH9D/RD1T9RvYX9G/Rz1fzQv0HxB8wjNLzTv4HxE8xTNXzSv0XxHeQDlB5Q3YD5BeQblH5SXUL5CeQzlN5T3YD5EeRLlz7+Snwf/AbPOUrbIcZsfAAAAAElFTkSuQmCC",
"legoEv3": "iVBORw0KGgoAAAANSUhEUgAAALIAAACAAQAAAACHQw5jAAAAuUlEQVR42u3UsQ0DIQwFUFsUlIzAKDcajMYojEBJccIxJCflgEhOkVQ+CQk/mm+DDmj7JVBXV1f/hwMAVktUXOLtcXnjAoohyjbyzou8IldO7ifvol8cd47jMBAc8aC88xRmZ+xHJPbozzGUfM9z+Zyfm+qtNbFn20cn92KylTtSxeSmnKOvly/9nhD93mHrrb+QzZyH3+9l5OEkgdZ7/+xxLLkn/M6zmZyeOYvt9dv71/+Durr6L/0BgN5AjLS7ff8AAAAASUVORK5CYII=",
"legoGyroSensor": "iVBORw0KGgoAAAANSUhEUgAAALIAAACAAQAAAACHQw5jAAABVUlEQVR42u3WsU7DMBAG4GyMnZiZ6Uv0ETIQizEPwUqxmBmYPHdgKPWSF0BKBVv27Axk6USJkKBqa3K50IrfjtSWVBUoliJHn36dEvuc1jPOMfYa9bm3Gp1fuVxVvt3YYyO38j9Q/3nt15bz2Nzr6rh9QPNSon+EpR+hP0ZUZ3mPfuyTL0QPvBuV763RU5/mRYB1kiHVmWn09Jz808rrIc0zLcHVGc3vAl3fUJ3XbgwuLshzBc95pXml9QA84NVPQ8zzOieO/ENHmgzyl0X+7c6YSfTT+8KYjC4f8iNjEu3Op4E7r4t3cOWVkAfJb/X8lB3ZeVrPabHFmWP958Unxlp/wfuoQuxP9/7K77zVz3F5Y/WP4vNi9xufL6s/a/u/Oi/oWVUffdIrb07RX7g/n9Cn7Dl6XuM7fH8O4Dt9h/+jN/S7TOOkulpvvfW102Fpwvfz//wLrcogjkDLtBMAAAAASUVORK5CYII=",
"legoIrBeacon": "iVBORw0KGgoAAAANSUhEUgAAALIAAACAAQAAAACHQw5jAAABVElEQVR42u3WsWqDQBzHcY8M6XaP4Ft07ZjZZ+hU0Gdop2YoJY9RHIXgLLS0Q+kQuiS4XBUzx05XEP/1ck53P4tS3bwl4YP5Yu7PxTgEV+KM7Imj13/9Tb9I01/05RezD/Ou/RxrLp0uVIWZLpatM9OLOA3ig+k5HRtOb6g0PW84iGzXHduHdr5UZ2f7SXWubZeqs7a9umw+sLG9Vvvg2k7Kr4DrNZnXnKgC9yMXRKel7WVElD3b/n2o3RzsT+5X/APNaytXr2hee/n0jubl/6w6OmvcqTju1C7uEOEOEe4QTdkRzbuE9feu+Q7tTP29xusIhjuC4U7h4U4WDusIhjplVHjHT/C7sctCdC7kovDQ+ap5FqLzSFR4+FxnIfb5+r+vF8x2wbVXzHa1TKdN67c9/a59zvb1R/U4SoOt6fdnjvemP5w59efOtJ2hc+zyqf6f/wIbEfAds1E0cwAAAABJRU5ErkJggg==",
"legoIrSensor": "iVBORw0KGgoAAAANSUhEUgAAALIAAACAAQAAAACHQw5jAAACSElEQVR42u2WS04bQRCGCzOGkTczSLHEzmOx8yU8PKRsEwnvc4QcAMmDBcK7XAGxQj5Fi+QgQC7g7Lyw3KlXPxBtHkrYuTZuf65+VHXXXwabNAMb/jqHJzZ0/P4p33KcvnRHYrVMIL6EsbWdmdgPa5tC+LxoAC7VvwQ42xZuvuPcI/WvALYb4efoDn1xP6X1v42Jr3Zo3xJ9cY9b8tnvEV/uE8/Rtz0afaXxTkF8UdE4GzRQweCGA9glPjc0bnUhb0H3hCP7SfxBguwQ70z5S5/4nUR/yf4lj0viF8KP2J/3gnyMPBfehyyDTzWPs6GBlUylADpyfDxED7lMpQC6cnw8BPKl8myAEd8oLwwsZEkMANNzoldzhbxRH7qBqfLPBubK+Qb0DHBs4I+7VlpP94IDAw+OV/obB2Pg0fEevgC35p6BO0hYaeBXiufr+UWS1zBN8ez/8TzJMYQUbxGnBF97RI9XOFr71BfLyPvT58yvMIv5lveXma2X9v1Yvi4PH53/dff+3vez7h0+pvhe9M5j60d1EdtBVEc2UsbjqO54v1B3vk75fKFOfV1T/Wahrr0OUL1Pgg543SA5PASvG05nKnqA143XGadLh+T/pQ66pAmakP9tFXRMda/NclsG3VOdFEHPg06qrkoDyIKuqg4P2H8SdFh1O8qS6LbovFOexuu89IU6qJPrC9xHruxvaxeWsuj6CPedQviqF/qOFbVibiH0Kb69ofIm6mvkNFZuoj4oJvx5P93wDX8Lv1ft+Fe++b+a4n8BxZLiTc0fV/wAAAAASUVORK5CYII=",
"legoLego": "iVBORw0KGgoAAAANSUhEUgAAALIAAACAAQAAAACHQw5jAAACCElEQVR42u3WMaobMRAA0JFlLBfmy+UWH8tH2DJFiH6Xa+wRcoCAZFz4EoFcI6VMin+FlAq5gEp9EJqM/BMyWlz+dCuWXfbtIlajmWEB744Ab+gZuqEWX3zxucsLcxHARLD0sl9/ZK6LRDoyYOn83YMGfYCDDLrzIAcQCeQDiDObX3gR6SGIH3Rm3yMbtpEAJuYrAK88+QQwMt/ICJiAbm0amO90Ephle1S2zLcmKSwas8C6Yz6YpLGYtrTO95Y8Wyxka+ajiwaza1N1fnTRYsLnYl46nzBYDCiLiZ0/YXBBkNver+idF1VlGzo/oUcvi8quc3FGQJBFJudnLhBUFpGcrUvIVwegK3OpKgVG35zHYaWqRNTpIHrftHQgd6cq6nbmldZ6rbKyfVnrrMh/4vcqC/OdIS/Niyp77rRd2V7nvqVteUmvnlk+DDbqBDa456zzce4uWPLEfG9Dc28v5Czf9i6Y5u6STXz656PzVBXkOpkYuH8xv1qMdbLRc8eWJlcKqbsyPyJ+xeIo1IinO97S6gydm+aZfNX7LT0pSnXDfGwzk0eK6pq7qwqTwUAVvONuqVaCRi8wDcz3Ot7yCrwLI/Phb8sIrSLZfjUUAJup1THLB4BInQR2I1U+cwnyGzxG+PQIivclET9oSO9lVP5z16/+fCcIjHf62LT088UXf3P/n//nvwGyQo0HQOyH8QAAAABJRU5ErkJggg==",
"legoLargeMotor": "iVBORw0KGgoAAAANSUhEUgAAALIAAACAAQAAAACHQw5jAAACiUlEQVR42u3WT2sTQRQA8EmC5qBtLh4Eafcj5FpBm/0o+QCFFrwUikx6qgchHsQKCv0I4ifIQsE9SY/qKRu2NpfiZik1u8nujjPzJrPzr+hFUOiDkuSX8mZn5r3XIuKMAN36v+oFwk7PUM/pOfnLjlh0HM/Dom07f/zYdv4udazLIrvBC2z5jK1b9QxHjTl7hz3dK9RI2LvR0PBezn0cGo7Bk1j3gfB5qjsSvsx03xReahsI0LbwSrvN2vUNcI8Q8owNKK5tQMmjbUBxuoGCHaCZZ5nDjWLDy5zfGZy3kqfKSdzJ8Kln+0V7/+DwxMhD/bzVf4R+7zLPH7rMc9O6087+wakjz7QaXRNX/kaw7sr/nX1tOfQBQi0jz8obVn4iK97lrGBczm7A5cRT6416BOt6Q7U+qcMrSUK1nmufx6L+z3RfpsI/6F5moo92da/oBljfISN/RWcI71PDM3pCvK8ND0iEVU+FHw2e9BQvY/H9Jj7rcJ+Dh+DF4734iPuSf74agmfT/k7MvYAB54GnY7/7rJ4/9NiFj/zuR8ULDB5jv/utnm/0BfyC+N3Leh7SJgL/RPq7l/X8RGJukc9kL/np8/kvYikcgxNyTH8WuHjO/QXCURPa+FUbbTVxtc39Hbsy8JMF+VJh4vEHOO7Mqg3w908nyTomwxH78KY9K9bA325MftzFJByzD69bwdYdkX9tsNPEBA7a9pQP5AeWw4HYvw8T0V4XRozynC97E3If8wKHzZfgoeieAVv3IT2HFngku43GPXpuC/CZ6E7zPLWQ528Evy+Hy/s14orWw1eHy/oxIl/VmxGyPo2Q9WyErH8zVv1i/W0X/WXGTPSjtQD07+3/af+T/wJN3ebtyLaNLQAAAABJRU5ErkJggg==",
"legoMindstorms": "iVBORw0KGgoAAAANSUhEUgAAALIAAACAAQAAAACHQw5jAAAAkklEQVR42u3SsQnDMBAF0O9KpRYI0SIZ7ApDBBnAKwm8iLKB1aUQXCSTmMgRIeD2X/mK/+/goN0JoNPpdPpfno46IALrhwUnmOgCRgwRaD3Yvnuz+fkiotOUUu0wtzmPku4lv3E7f/kCl/RxXf0z5+2aj7mqW3ura9552bP1eldxb3Y5Lw+279Ftzv+k0+n0n/4ExFPChY04blkAAAAASUVORK5CYII=",
"legoMediumMotor": "iVBORw0KGgoAAAANSUhEUgAAALIAAACAAQAAAACHQw5jAAABl0lEQVR42u3WvUoDQRAH8DmOJJVcY2Eh3msEFFP6AAbBxmewtBBzdnY+hG0a32BFMaWvcBAk2F1Ms8Fjx9kE9DbOPxg/SIocZBN+hGM/ZmeGWH0M/chz+niiqptPp+94zw+xTWW0s+5STjQvO5OvL25d0td8aOOh5qMiGmvez8lqPjB0rnpGe5r3xDuKPxHtLMUz2l/IDV2onpNTvYh0t7HuLtFdjn5lvCSSIHQyhi4XIC0bLOEf+uXkcvjhLHAfyZdFS6K3WfVHEU5OfPxvVf1BJuJ2367l51Vwj1zC5dHGAZepqfqdjdl26zdcNPLAi4jH7doh53Hg9zLHYbd+yyYqAjfUGbVrx5xR6Bm1Xm38Igs+DdYl3s+oKR6uV7ZnQLQtG9ec9WeiTc3/5P9gPmj+cL1gf9B+ov1H54XOF8UDih8Ybyg+UTyv2r2blx9QPkH5B+UrlN8WzZNLyueovqB6hOoXqneoPqJ6iuovqteovmv9wLz+wVuqvAd5Ov2sfe3/7mYag6z1w5r7vtqXgGymr/593/4ORMuwad9vYW4AAAAASUVORK5CYII=",
"legoSoundSensor": "iVBORw0KGgoAAAANSUhEUgAAALIAAACAAQAAAACHQw5jAAABSUlEQVR42t2WsUrDUBSGk3bImAcQmqGbu6sZ+gBxCR0dfA0hg4Ojj2DBoXIdfAPplsGXqM0LFFwEq9dgEsTT/3PRoPZAQvj4uJx7DrnnBl7GIuibtzH8Lm8/KuDLIAIeEE/1+utE8ZW7i6WfTy+07861n5fgl+BPwK/APwH/6l/718FY+lMv67C61bzKevYpH8p/V/tF/pGpQxuDualbdw5kmg9U/es/+sX6zrmb/fpl/byOg/ohfw6+zb/z7X4739ZnN/xZ3YKx8DNzRHf+5RZv/OOefcqH8v+qPhX4E/BL8EvwP8+LvPCNb+aLm4WNb+fRMvTvE83Mr49IgXvNt+Zpouf7UHP/DD7w1z1Y5x54BfxR84jyoX0VwFPgyQ/x+I9xynNEPNX8EPgp8E2h+/ikuV/DvfQB+JnmmwjusTHwVPPwl+7bwN8AruTZQAWFR1QAAAAASUVORK5CYII=",
"legoTempSensor": "iVBORw0KGgoAAAANSUhEUgAAALIAAACAAQAAAACHQw5jAAABrElEQVR42s3WsUoDMRwG8JwdDgS5BxDM7u5q8AGEDh446nsIERw6+grtJtci9Q2E23QSVBxb+wIFl4LVmNM77p/4fTioaIZQPn6kyeV/lygH26X67bxune/m9Y8ZyScqJbliucHjzzXKH4vzDPo872FflMQfEn9BfJf4M4v9vsV+ZLDfM8Rr4jPiT4nvEV8SXxI/IP6G+DHxDxb7kcX+1mBfaOzvff0mwA+rwgb+7tjnFozvH+iyeSGk3/VdlL/7K98xj8avvAXzId5h31Vr0PfVKvQHga/bSuyb70A8fus/z8fv00s8/6IohptF1cL15r5tVd0XvvnD2De59HK/pJf7K3xQD9LL+pHjy3oTPqhP4YN6Fj6of+GD90X4qcN+QHxJfEl8j/iM+Ix4Tbwh3mAffj9bP7bYh9/n1g8c9jvEh+dFbl3t09D3kw8fn0eTxL0vaKHReari865tDudJfG5qfL53cO6eiSf56zoZ55rkM5I/4Txl82HrsiQ3JNc/lGf/LGfz3GC5wfk2yY9IvrR4Hxc4d3NyL52S/ATny5TcYzOSG5wnf3TfJvkb6gg75melAHsAAAAASUVORK5CYII=",
"legoTouchSensor": "iVBORw0KGgoAAAANSUhEUgAAALIAAACAAQAAAACHQw5jAAABB0lEQVR42mP4jxUcYKCq+B8GOOCnSLweSDQw2APJforFIYB4cVLNn/8fu/is1djFp4YSrf4BQn0jhjhEfeOoehLVi4bKYxP/p/2rH5v4nxh2d2ziPx4wPMYm/rH5hyE28cdy7yWwiR8rlz1Tjy5ewcDAs4ZtGQMDO4a4yBXWVAzxyv//X65h2/T//3M08dDQyBDW4NDQdDTxVatW/mH/tGrVcgz1wQ0MltjUb2pg0MSqnoFBEpv6zUBxUtTjNB+He3C5H7t/cYQPrvDEFf644gtP/OJKD7jSD670hit94krPo/md9PKWLupx1Re0rNeoVC+DgDwUj4qPio+KI8RBmYUa4rRpnwMAklG4kKcHXLEAAAAASUVORK5CYII=",
"legoUsSensor": "iVBORw0KGgoAAAANSUhEUgAAALIAAACAAQAAAACHQw5jAAADpUlEQVR42u2WPWgcRxTHR6g4YpwsBFRIGLZKs1ViCCRBubG7FCJyohtJnVGhRlVsCKg4bk841oKRc9WBioAxMpJvJHDSpTB47SU6UH/9bpZrVO0ZDGsx2cn/zdz6JOTDhZpAdMXevN+9fTPzPo/p935Cdsk/zNmZDy95fJZPlJyxcy8QV8yPJ0vD2YRuOpZn+H63fci1mrQ89LEFH3Iy3rR8A8vctbio0Dl84mZpHuXveIArVzddfW+4rV8wv3CI5zzHkV9aHuMyFV0hnuHBeGZ5RJfBEzzRjIdO7hseKAYxIR7hvGpS2YM6uEzmkAkd5G7T3SjMQQs3brBGJffBnXjdexz7DnHFN2IZbCgessJ92Re1dR6Y4/uVtvghLlxwfu+BlL+5XcOLTzwpf/LBFXeEEPNOZK6lvoUwy52Q5Y1rUsqdICGe5Hch/OoG4OprqIgoo4hMZn2sl5xuyDJFKjK1fHCE9X4rCtkgXyX9lZzsdJM2CUEasiQ7kk1P/m4cEUSeZFJGScjSQa/G/xJfKeKtrrilp2rpIGRRIjv6RG7XyUHOptzTx3IlC1k3FQtaibkGcfehmNcD8UUOHnnPtPYOqoZflS+0wmYhCw7Fba3bi1WX3DktfF2I5fwGax1CRR/tcuJ8RuItb1uB3xew0PvRJV6dqoGL7+rgWxInPN63/HoHXB4Qf0gqbxYs/3IBQm8O3Nkik6/3XQRMVa/vQzg6qDPmfmT0hdMCr39m9GtV8BkyedJpGb62B+F4l/i0wPKtsHx1CUJ/8b+of8Xct2Pv5Zn7PgF3Sv8YP5T+YeRP6x/rz6F/yJ8Ike6X/qTN2uTP1i8mXtLyT028nhI/NPFatHGcNvFaRhyDQ/kIIdq1cZ9B8Aq5jbh3I6SMFnM2Tz7Gy/+Izyl/Um8HKXPQoHx2t2RLv5Z/5JSHbYHrLteJO5tiSfcF5WGKlOev5J/DvPWe6iuS8jbJeuLGFEzaPBeCiRrl+SBfo3op64LWHaqLTP2MCqmlpnFEgx6EBaqjXH1DKtGAeJodQ9ijukOdkkpZp3cgfE91irpGiT8r63oW+s+prtEHUIPX3vUB7GX6APrG31KO+sYD2TF9g/qMuDnqM4momD4zti+N62Pj+t64Pjmur47rw+P6tu3z5QwZ9Xk7F04PneapOXJq6JRzhOYOxFRrxICN5o5R9oe8OZpTxrge8vDUXNOMnGk5rPKzc3PIz83TS37JL8Jjm4EX5v/v/7H/Ajl+8VgNmvuRAAAAAElFTkSuQmCC",
"objectsBomb": "iVBORw0KGgoAAAANSUhEUgAAALIAAACAAQAAAACHQw5jAAAB8UlEQVR42uXWPU7DMBQHcFcZOnpkQcpFkHwUrsGAcBADY4/QozSoQ8ceAVcZOpIIhgCJH7bTunn2M6kQEgMdKvWnNHp+/vuDAfkp2Z/6S8IXCecA15Q/gs4TLiivvnMde2O9FZG3AMZl5J3UEprYtTTveQLKpSk27pswzmlHIzj6UkNH+baztcb+os3YCN9r2FP+2sM24QvKP3vc6MGfoe87GfvWeEt4AUGZBy/Ns3vC1QWdH50lcvUmErndVrTvFcvInLeMCTr/bZZYF0XCa0G7nsfusvNA5MR+7WoZ5vNQa+jrhC9AOhfY32xsTaGh76S2i0ixHHl/b+ZR2h/YW24Kcs6RKwH94IyNvVkNrozPx27yBitbj//DsQ+N9xx5BUs3Z+xmTju/R74x2XWeKZwT6+79wy5x9IVdLs7v8siVq4ePPbdboh0v44/j/cF5YT1b4/ndAFhms93YV8b14A32CjrnrMW5qtywrEvab0OvB78SyJthWIxdJtzNwNjLCefI34c2RP7hfR6ur4SzCc/Oc/1Tn/0zP7M/8Nt+bh6mnAdeTngeuJpwEe7/Ey4DbxN+WO8MaJ9F58upnfj+lvLCtw176duDXfk2YK99+dg7Xz527csJ7pmFPxiwq2j/P3VOUvfV4+tD9yfbH9+fz/cvYG0fIZhr9gsAAAAASUVORK5CYII=",
"objectsBoom": "iVBORw0KGgoAAAANSUhEUgAAALIAAACAAQAAAACHQw5jAAAEWUlEQVR42rWWzW7bRhCAV5ECx74wEEKgNwroAin4BDmVUp3AYi6xUfGcQ1+jACXbgZNcrLLorUDspEDdfYnIboMAufQRSjcFcgwNX2h4wenM7orcleRbK9i09Wk0fzs/y2Dla8b+a/7nDfw9PT4v89+dLzX8lB4Hy/w5PdaW+c8pQHV/me8jl1sreARQbi7zrwOA4nKZryPPf1ziVezhux+WeYq+H1w4vKJfvgewO3A5uah47OpBkxLOoQpKl6NJGffSsjN1+Z7iQc6nqBGKmj8P4BIqxkBGjvxsDU55xlg2dPnpDfxjTpmfofnoEq4bng/ZrZhP13kWnMMnh3djnuGPdwmHDb8AFtSnHzS85FMtHjMoI5tnhveiGYV2iFwir+tMsg5YPK6/wO6q+jJ6Gt67a8VV6/mLfFtll2ebi9xEtrWgpyK/MdZPNke5YQelMUsHFi+I9zV/ZXN6fJWC/NKkZ55PsnhvnU93MNOLPGzx3SOXj+nh9+HZaK1yOLkeHrEN0eI2Z8T9EfOTAY8aLlv074bA16/S4WT3pwRfD6cWLxV/SfL7Ns9V2yr5J7YeKp4sVvpfWHZzzX2SjxvOGKMSANT/WryStf8zLc5R/lHysMlDaXgoxEux33Cp1VT3kuR28tTKzzlJMyY2xGP0p+Hq1FkraW0/SuxzrDydnQftD+IQrPPdRbu3kySCd+iPVT907N8IEcEH9GdgcYzxSstvQp42+cRSm5L8mTjWrW3mBgWm5Xf41OqXNn4WihT+FifaO8MnWG7JCGs8GXXjtls/oUAHhOjGzKpDtOUn6ECSBFB4TT1jp4e/YQGEGMCwXXOJ3P8W//oYcMyimnvozwSd2hBvdL40rzrZ0O+ngAXXxxBb9fxEHoqgwALFUh3XejCwyh957/DAIr0EDMdpFYo3eMInGGHa8HPKzw7WDzZM35rPObl+gvLHZgHNOeYnGaH8dmbnh7hQ8r9kscmnVCM2lVp+q55jJY5rKPC8dqmej01Dzti14duM6nnAs/q8cGKgnvH3IfWXnh9zu0U37mTUACMdVsNxnFDDHBF/2/AUR8czihdkWjZ5K6h0ySGG9UMtY/MJhnuHZykEVn5AVcORWk6RlQesuMG2j+7jaljgw/GtF9ysDMNVbq+C8ik4c54KUe0LKmCX0x6Jl/hB0aZViM1VetYegc6YoUV0iY/Zms0Z68z5/YZXX6wxj/Rc4xT5ruGyZ2bZdNiqrHMvUafi2dDDPWz4W8Unes17emEQD1QD53pfBGrbK65Fcr0vInuf0o4o1blKhx/Wu0ef+nx/kZBcwcHsHZZK/eazxdEuW+cL95MrgG7cY62eGTtzfk3GZ9Fp6dwfFN/PWFoM8aomFzl25R19v5tzutG8l5ilB84eVBGc9QOzmeZcr74zHATwh8316P1Ik/Afi+uMQT6Zb0r3XlrsWRvd4hdUIHKFvLeal4G5si3yaPV9+CYu09W8+n/v4Qv8X0gYw3qRwhztAAAAAElFTkSuQmCC",
"objectsFire": "iVBORw0KGgoAAAANSUhEUgAAALIAAACAAQAAAACHQw5jAAAEaElEQVR42q3WPWvkRhgH8Ecr7+miInJhQarTlUZVCAQuYLJb3OFy11jCZfIR3ARSBDRxOjcHAdcWXLF742K/QCBqTMg2qbZXjrhxE53DgXzImjzPvEizaztVFrMSP/9XmpdnRgLx4KeA/9+bx3z0sLfBI+7d8zvpzj2/ld/G285r+W2u2WTGK+WZ8rp3KaAbWq17a7wcdT6SHm16Gdle9E5dbSDY9MJ9xKlL9QMOax4ZZ3SojJedAx3KzgPt7X96Ybzy1px17mpvpMM9r8mb3h3b697B9uohd6g5vWeP+Mi4S83s+gWR5QDdfPXurXvQe9t7YbzpnAW2t+gNOQUsF8bV1LDO8efYZ2p2oAawrxPpjG7d2t5gn2Ekm9T0Xgd1DQP4GqhEq96boKphCHvSWe+tVx5jXrrsiFl3PxXHmH8BuDQa2/9kx+DDZ+S6wcrv4HPYgm09b7236D4Co9EEM1/kL2AHsAty3npv8NoxwMCRzXRE708pv+Xo+SzgVjtQ3ldO61QtdWpcYvIe3aTOjGP+qaN3A3Raun/r/DbWRaSdjq91fhc90+7RTqXzU7fbf2o8bTydn1uOt6qlp+t5vH8pnQPktmeidFXemXqW46p3VX6Q2x5pV/nKtJ9GyZF5RnnmKm+w9pn0dDwce62sUOkODlVj8npT6X2s8lXvgIX6AzwHnvu5V0C07tuQTsOxy4xjeWWAlRlDPPdzF9QmavwZhDI/6BwvguX9Kfh5PI/zAU2u07sHwyRMwilWUFZZ7sCAx5znMGBy00THFlABDlP8UF7Q4u8c85zyvtOoOsE/6Y7Kh44cCeWM/kH5OfhuRT1DL7Wnocy7BfUAvdIeDygf40gor7WHX6VpAgl6Jr0x+V9izHNP773khcxHYZo4yRPjrXb//JTzAX8CP+oHAsPVPcb85DJNh8mW42ovgxJnC+LFO85PsIiMt6MSptj+yYeUWrTjmQfLXQm72N/FDXUZ/M6bCmt/mE5uN/J1BTj2fFHL/G7Q+feAY5PuNzSkMLWd8rNW5ueR8WpP5o9ayjvT3p9RPp4J+hXkI8txaMIjEcp87wH4fM5ngq5/YuU9hsmzfXGG+eE469xlPn97uhCnWEMnrHcohunBaiJWSZq+svLwrc8vlguxnMf81M7j6BxeYl522PYBf3P9WiwvsAdreSc9uvpGrA7v52fvzsVyhnnYyH+IxGp/Mw98dvOrWC7W8nKxH70fiasJTZjlzyGefczE9flGfgfz+JZ0NdrI+yye4WvddUYl2nlDi/EIT/4Sa/kGm+/P8OT3di3f0uKi/G9t+iqxHRfXGzz5o+U/W3lB+UP52Ei/tPK4hDm/kI8B/sUchOVpciAfS8l3U8sLrJ9PZH5+Y+dLCJOX8v3x4Grq9F5h/RzT7T7OrnPLscPpHvn7YC3fYofP1fvgde5a76XMSSd0/Edcjm0vcb7URr7MPctrUP0VYjW2vYX4rfJTFtjvySxM1MnZOLK9iLl6ueVM7av/ArwbP0k4AOccAAAAAElFTkSuQmCC",
"objectsFlowers": "iVBORw0KGgoAAAANSUhEUgAAALIAAACAAQAAAACHQw5jAAAFKUlEQVR42rXWT2hcRRgA8O9l0p3ELjuvtwTXfSuKeChlwUuEZV9KQTyoZ4/NxV5EGjyYwpI3azDpqSsI2pMVEb0KHj1klpQkB+32qCDlrSn0UtwJoXTSvr7xm5n33u4mm4MH9xCyv2Vn5vsz31vQU18C/jc/OMPFGQ7hVE/P8ASCM5xNdXWGS2CH0zwGJsLpjjuf8h0BFdzhlIOA8hRPrdNTroBPdYk+9x88tn56XzHp25Oex/Wimzv3OPiwlnnCJj0OTjoYJ5xZ/0qNe71BgVrfmHCoVzLvTPjy1QUgpxxuLscN62koEpaGue/3hPMkQE8K//1AXHXO4oTlKwEMP+PC7pvQuM1UkMXlJ8EGWE+JbDOZ+4JkmwAmrtSTzSDO1uflZS8FsHkA1QriKMsn5ZAARAKONW+3ApHnmQCsgYf5VJFo1oKeC6ATU4D6dVNHGcS1WtBR1uE6M4tHxolE37AbJ7C0jr5n6iY9xSoBFYHtnloNfdu4gia9FTDObJdQPLy7L3hvaLfF7K2SQPDwC57xFNhGv1UD1z3QArhoz6k52Rk2l0jmJYBrNi6tvMNhG4/snHEY8CwPN4ZrLm/oa8KTy66+Inx6w+UHHSRVYOoiA8z9UU/nrlPnMUSsN2SK5P64DeAZp8NqOxKZk6ePm5lDuvJWCtTGBfTHj2vW8f/q8rYElzcIPnrsHHcp85BTdxuhtXv3vHWTRv4tuLpzeLE55vBldp3w8LPmCrj+TC4Ho4tXNm77B7C+o4s3z8H1myDPIBzNh0UOZtSAOblYApLPgQuYIpNPrNfRE+xXmh3IMw0UmvNHPf1IuC9gANhY62D7QX/xz6pyLq1HQ9s/+txuQ8csSzQ2XGT7h6Xzu0uhDk64itILu9UgHyc43ZxjuN5mmRVeK1y9ulmh+VgyDZS5vFxipPCo8JiUqJeHC7pwjs5z9wpPPUKJiLIhTwtPZmbQ8/seoLs5r2ZKlMSjTPPMZblEPOzP4QmPq+jYiz/lFfO2nS9VzpsJtFVc4TtufVWe7yQRo3nlaZDloTzPU124ZCzLQ3Uew9raep7FpruFd5C3jvKT5t5cRN/bGuTed562F/d0Z2erl/te9vxKXu7r3kF356TrX/F0B10bQOqezM6f6yO52u927WnG/EjLtbf7FVN88/5wzKuL/So1BcC3x2Neqd5bCkyBI7uW8wOtyK0H10PzPhzzR1p79/4S+OmYH1qPP/lzB9tK1NGTyNbL+CAJn3fRP603ck/6GKBgt1vrRPmi/V2kU+sDgokS8Ox9SZM5DlfR7XNcblh/nfEoOdcE3MB5+ppJuI4veTopzbzr48bOfesP32QYbe0HH6Nzz8f9EBuAr2I11NxLospyf4iuiKpGWvmeb35udK3/jZ/H7ME6UOnv3zeBOR+E+L3wm18EUfXv+XLhyZ1Qx9HsH5omt680jPedfxDqXnrxt2iYzr7jG99zXjG5eu9uiC3/ho/x5n7J5HZuN8CqNOo3C09L+K+c22M6foV2qK2TrcvX6L25HZxDHsyQkd9F/9zf2TBeJrbert/Qwb/SwyvU/3nccY+yf3mgzW8EYhsod11trDzRDBp2nmWutGKqsYJ55zZtI8eHw+qKKY5vB/Kx82Mdh2rFuPTtKC0c79fgmvGG6UNcwHk6g6saSD5cm3BzCjtRNmftWHF+aDx1T6qK9cj6kflt6TwJxl157mLh3wmXhesJf+i5ZOSeZr5PpvrT+yO/M+aPsOf1i3EPnQt3ObNZgq9Q/AsPqgGNrWWh1wAAAABJRU5ErkJggg==",
"objectsForest": "iVBORw0KGgoAAAANSUhEUgAAALIAAACAAQAAAACHQw5jAAAEt0lEQVR42r2W0WscRRzHZ1nJRozZQh9MMWYsgtYXvZAHo8ZMpWAf/RcSheZFJDUPTej1ZsshVyH2kDwYoe09+OCrvhez8SQnNOYUXyqU3l63cCKlN0cKmfMmO/5mZncvJHugYLynu8/ezO/7+87v95tFMvPjo/+D7/1L3vqPeHjMfHMAvzqAo2weIZrJBSIDOM7k+76bHdd3srk3iNcG6L80QP8gndl6OMqOGyArk/sIZXKEjgRWXADH2ToP8vYAXjvAR+L96SGe6FfLqrKX5mX3uXiPdNK8Ev0umcmfKTRj7qHk4EfIGPDTh/NqXCNjhTPRS4ZHSV6izi6uy3b0ej9fZTRfrj35pS0fP3ebas6AK0E8t3VpvS6fOvEH1hzkaKNFTizd+FW8kfvpiuZgsxYanXqyUlm7scTvc829mMvWSe/KRrkrGoYrrBNwnhlZnLr5iH5xgEMCYqoYTb74+w7JGe6PIItBAvxyb4XkOjvjy93EN0tWpLzXe2tydmWtMdyQJc2ZCVu7Mz0/Q+vSKks78VMfyGcnw2keSrt8ykn8VL61vmrJ0+yuU6w/X0781IUogsLQJPaK7bXUT3WQb4uPIhdjz+7+pjk3/kT4liumyMRrNr9AEj/VshdKlrgo83VbXMCJnxB49J2SN/Yt3/+8KOpu6qcrh14u+U+v85VrRUgy9dORxQecWBXx9Xo1muz7Zsnrn8jwakM63Spb7HPIePzncFP+sCerFlNcyUfYJ53t7ZovS0vQzUJxgSYgbOQ2H65uz8mteenN6zrhSOh8w+C2mKNiSVq8ozizma6T2uQ+Zxi4LQLFAzcwPrwJqTv7Ujh/nlN+BsQzPrwKVsG6wKkR5UNVGh/EQ1WSqvlLFcUrApnC/VFZRQOEy1uLZ2OfIXD0sSpX2JSIRc2ZyTfKU7AKwzdeOHE28RNZD+YIRBoHabzNUz+R3ayXIdIIROpukcQfyLjzZRV2HFadoDk3HPde8ZHDht1olu4onYHhUn7IQAoiEzE3YbEcWuCWGnXX80QqbqJKaUcSXEX0U0Hlhq9M9rVvpVsUK37n+wWlHYrc19t3V/Oa/0U2FWfIMbxzfRmq16M9oblErq+PvVMPNO/utrrp3ACfm3tWRXHRgoGS1DnwludU1P7R+zPvpnUO+sXlnYbibTx+Lp0bUJ9sYYcqHuKbrXRuQKGw8/epuppCLB/TtJ5tGZTWKKylVcKG8YG6DUvfqbU0JP4Y1nUY+1le1pI/INY95b85XhA6cVdvOVZ4ti77/kOnlsxSPl5T3LNhMfYsuV+Kl+bPAwdl6t8c0W5NbQPPhCok7pq+9ijfg4UO/Coo3tGC1NzjZiD4o0TKA30tu8LMLVopp3NSDZqe0M/Djbrbn5NYzy3dT5WYe7F8tSEsC91vcL9/7fR+C0enSNy/OSMo0E93V6ebpn8tZgL75p55NIt0n0K1msBePM6W5oxvmM1pJV58PTR3tW+IsrxWnlxvTaJ9syRT1pEouWaaWNcnlALlanQkPFTcB4WMwh62SPie4mpP4GCSSK+xjfg9genfHPXfa/4JZ9ncCTJ5BHcByh/lAsE5TNMjPKm6QzyuUpyh5+j7z3HzY3wP/xtx7CF4mzMsBwAAAABJRU5ErkJggg==",
"objectsLightOff": "iVBORw0KGgoAAAANSUhEUgAAALIAAACAAQAAAACHQw5jAAABkUlEQVR42u2Wu0oDQRSGRyQE0qTaevv1IVaxsI2Yg6VPYSnxQhDS5BmCTTgWvoGYgI+QPklptQqBRcKsM7Fw2PMfyIAgQqb8+Jjbf87OmgqOF7PjO/43vGxifm16iFtjUsTLRreJ+DzjG8QnRIeI3zKPe5LbBlE3lXydMXNb8pLcaALOT8x3kr9TRXQk+fzRMo8kn5yviDqST930PJa8fzFzB+gJPnjm4MA/PLly++/mgrc+nc+SJ5f+wGmd2+zN+5InK+wfYH9NM++3Bf/2h1v7WazPik9Rvk1IuR9W7gf7VYuV+yclL8Xvb3xQD4zr4dX7qN4Y19vC+6eSL70/QvXvxrHkhfcflP46Qf3lxj3o0zCuev8OQb8n2N8Elio+4JsAcsCTIK6QDxS/H8RV89H3ygcG/WkQV83vVBH+Iog35Msg3m38jyDekLuCOEO80P3jGL9Q/NIY+I6sFa69R+p7Z0weM49btw391ELf5hXeT179zrqKb9NCWbfIY/zodWPvf76HebEf939i2//wv+sL31hb+2Un18IAAAAASUVORK5CYII=",
"objectsLightOn": "iVBORw0KGgoAAAANSUhEUgAAALIAAACAAQAAAACHQw5jAAABpUlEQVR42u3WMW7DIBQAUKoMHjkCR+FoTidGjpCjNJEHj71CIl8AqwuDxW/AQMB8JKOk7dIoSpQXzP8fyHcIoI8z+UVn//4qZ+Flyp0GH3IXYQKR+xCc5n7zbFjuyvvCc9d9/h48jFOb/O28unvEifXe8ziSPuYVXYAhhMU6og+g6dKB3PoE1x7esfW8AFwxF4/sUzf3jBZWuquMlu7mEIjbWofSZzjGXUz9Zg72y8IHm4wqfbSBdenSFrv0pU+4M5uj4aWPuHOZHtHopuqnijPUl96RLJ3/sH84X8jh4WfC/Irtdr9iSL1tvgq2L40uoXIeKj6uh3e3T+uh3u0zAHr+a65j8H3uSpL73VR+184ZbPqh4d5p0feYu0YUfXL1oeirJ+e3og9Ll6sq+vbqvmUlff7TuW+8yX1hdGvkG7p3+2l1X4B3e7V3kXnv9mSOd47gEH3a9tUp2fbUv9xzv8/JcXjGVdKGU9eEdJgvhFDM3f2o5f8PIbxlnmpcZtDxhgOeD4fXxK2MN0xV4ireMr45buv6X99wVwfcdYe7oX/0//kZ/wYyt6dnLKXVqAAAAABJRU5ErkJggg==",
"objectsLightning": "iVBORw0KGgoAAAANSUhEUgAAALIAAACAAQAAAACHQw5jAAABm0lEQVR42s3WMU7DMBQGYKeuGpAqooqFAckDJ2Ark4/AITp0ZmRybtAj9CqpGDJyhUhcIGOGKCGuO9h5/4/oBJmiT0ml917+V6sRXpX6cx+Uv4zw/uwWeDG95ODzYy+98z+zHbG/SG+9vxHfEa+lNxNnn8QP2LWRXk2eW+wr4OXka0d8xP4A3Jf1TPyJ+F76ELdn7gfpfozZkbjBvrDS/XhXDvuS+A34Pv14N8TvgTdxe2aeE38F7sdbEDfELfDyB3fA/VhG7BlxlNPh4g65ljm9PC9yGraAeicuctoF/8Ke1di1yGMb3GCXuQt+J3LXnP2R+Fb0s1I4d8F3xGW+ShWvmbkfsWuZr7Tcma9FjsIYZY6Cb4ijvPiO7onXyJtonaSeGewLlIvpdumww1xMnbslviGuocfrIfUC+RCvgdTtNd7HayB1+H/dxWsgcU08h97GZf3Cm7jcxC1xBz09kUSeYS/1dZ6UG3tB3EAfkrJid9B7NV7nGfZOE8+xtwVxQ9xib5g77BU5T56IfxCviR+IH4lb4u6fnLe/AYeBsM+fqRuCAAAAAElFTkSuQmCC",
"objectsNight": "iVBORw0KGgoAAAANSUhEUgAAALIAAACAAQAAAACHQw5jAAACL0lEQVR42tWWO27kMAyGqVEQuxistjSwA9hHmDLABus9io+QMlWsImUOkyPoKAb2Ai5dGKNYsqiX6UGmWCBR4bG+oUXqJ0UI4PuOWvrXdjTPcp10HWKhtVp+TnbCZIW813paftY5h6PDXGs9+DUPcBeW0cHt3fKP86r1jFRFfDEfAy+BheWVw2wIvIiWF5fAF7cX68/YzIE7t/eWT4H3q9vWyMLHwN2ukGOczIVTQ8pNmBL5IeiAYf5CtZxuLkw/UGcRqRPnpc65y2O7JmUz+kjNjA8U1/tcEZhd4ZLgPOJlxvG9inic3VPKvWyPgHlO+R/zOEIus7CC/IBc5sJyt5uIcytIr3L5mTVtJXIvf8g/wdsd/nuHw3b9fxIaCIdo8pUj4Snicdq7lFebvFzn8GV47Xio9SrWh73BOa4K5Pwenin7w8HbQ8bhU1z49Td8XuMhOeRntciPNVHnn+F8n2vYOadww/mFDX/Y6Q+V7zPKdDs/yrj/cCrxw7XEY1vOEmDKnxQauKSF5ooWrlC0QGKghch574SoR3JjPNdPrBur8/7tAhX5QXCBFhud1kC5z8M5OFZ2H3LtJk+pY/sVU8uHwYFxbL0sorJLtDPzxPmc3hN83U3pvUJv7F24yF93eDbmF5qPNc1V8b9uTkzexrm6jQuXcCHjNLpMmZOlUjkxI+cuk9+ZNA38Bd//llKbaI5+m4YlJYf2545PFK8UbS9kyk8PXqn3mP8sv+sd+gPiXI5c60PqyAAAAABJRU5ErkJggg==",
"objectsPirate": "iVBORw0KGgoAAAANSUhEUgAAALIAAACAAQAAAACHQw5jAAACYUlEQVR42s3WvW4cIRAA4CErhcYSbYpIvELKdJsoL+QyxSmsdYVfa08u8hp0aSmJhJbAwMHws5VjyZbOp/tuj99hGPDTvx3+v5tl6geAnPkGAGr08Dj5QXUbnY9uoi+j79FhdOQva+/YLVxk7w79l+gdhwOS967R+a33NByme9/Q4VHN/WvvieHz2vqR/UG27rJ/FHP/0LnNvvC5s+fWTXa4nvjLif9oXd/9+4mz1/l+d3j3fgnhs4/OwtZLM7oIL3WMLsNaxHAZ3bCZr94uMex6V95x+vmd+LDvZ76ibxPH+Q6e14f1cSu8/haO2dI797tWbvTFg5G2dwvMMrsYmJyvxdUMR88puhjPOz9qpqT5gcd/65h/hK8JkeYx6WtipXlPhmgQb+LP6HGcrbOSyJo8fEDjC/WcEMN0D1Zd5S/i467zLa9Odd+4PXFD2hHUy3gcRs0TbOh7cVxjf33Sj9GhtGPw4rrezM8VP9xd4834O3m6JYuHjbqZi8KAWbPvKY+8mDqq6tL/+Zvztyy+3xNkePxTcQ32vgbh3VZnPkdm+B1vXKeQioN0pd9wsHLIxgm6Mn6HCSb2HI9Zdc/TxRAtRUF7Ly8YMZP7Xfl5ncBn9QbM6w2cgpi4G+uHLajEJW7rhDDzsNuGFCI5HmRoRB0pQA2vLvbYxI5D1SROHrAJ3Cy1MxI/6UbD0mIDEj+pS12uEuKy3PKt1+qiceHpE7VfVcuLOn6oeY04yUeWeuyO7ELdX1MXXqcm767ILojqzJPycS2uiRvwU7evcHPillS8jvghqmNamtXPy1vV4Y3/A9znMVqMtuZiAAAAAElFTkSuQmCC",
"objectsSnow": "iVBORw0KGgoAAAANSUhEUgAAALIAAACAAQAAAACHQw5jAAAE/0lEQVR42o2WwWskRRTGX1shNYE2FdlLDos94+59I+shsCHNopCjR48mrLi3NSEgOUSn1yzqYWHBs5D9Jzx5sIcFRwi4B6/L2u0Ec5KpYVamYzrVvvequnqSibhDMpn5pbrq1Vffe6+guvKVwmvx9w6v5o9ieh/O8EV1JTf/wc+PJ/Snf5mXxydXz7ND/Pfh2SWuIcD3o2d95uUlPv70+SVejmieVw9uMX/85OK65gO7bhr5B37t0n8PusQnWdzl4P2+Dnj8uKhYlVP8/Zo+lQ95/Pjxc+a61s18YsfPCc9/IJ31A0X8WvuawG8Tfe4WH9/n+MXqrsRvuS66lh8d/Ua8d/M7CjTbzhx3uiU3lyg6vZTUuxi+JB622z2vDb/6fxFfBcgpahB+fE5cJ4ATHxqQ1eE0H3x1HdeNqiSqnIDDtIvcyAC5qjAcVbuH+EAK4mNddmvO82RJSDzT2vM6nh3ksJKqC9zGr2Ap8fyl26+spAIAxceSO9+yPoEKQagWcr11YLlYQT1xDsAfDKDoSMtZf+RpdJHzeWUqzHYVCVKCcjzE8y1EuPIsJEUNPeT9UAByq3TN2T8ZhEsHQPOgOFXX+g0nTCyP8NG0ojfrTwN6HuZBS4MhkOjEXwwrIwrcb1ASzysT1T43MkMOX0pEnrOfEuLou+g0H5i4ySPYBFp2EmV5r7zjuQk0wLasRuqXrWS/43kps8WgEKhH0oH9oOGoWbJI/FGntSea+UvkQlRa/gzLRcPN28TxVIJ+speJqfmRKzwHOElPU+h6HhQqMKICuJGOEoiJd1l1jB/nhW2Ra9Fw3m9bVbJALnXNjWJ9YjxayLPI5vsXyIUmXhLvJJZPbtP0xTzMQSExbTqUIMhPPyTZIIQD2KTExRfzf27xOfM5osBrOIK5iTnryA8IegbijPk5zeP9068gLpj//RFlNfptTH5L90GlPk7yZxKTP5t1eb/ez7S/oOHe/wbjj2qu6nyRsQlIh5+szsrnlyxRN1XGU5zzEfZI58Ryg3Kpp1p/rOhceiOw+lclCqUGusTn6BxH9TnyeFsf6NyL+txHLV9PtOzDau0TDb7+oH86y3vOb5ryquB6xX6rfWgEP0QfsydJJ9m/y9x0QuIrVA/HKt1Ky9s2X0S44etndJ5PXF6UMhRUbzUZpsmjP9blokwrrGOV4zYf31lXSqaHXM8rzkfL32gvLwDmds1Tx5P4YSvGHnPKxm7yPYl7zM/qzIxt3fh2LWjJpif5OlOGIpTi0Pewui7puSCcb9qkr2ODdNTa3uvOcFSmlZqmd9Z10ujloDdpmm0+dOu+gmB+MHt/KO9jUpzMcnMvgbV+04M9f1dD8c0sp8rW9CjXpWe5VWSGuy5N87+lQfsW77o08RspLPt4XJem+O8BzG14brs08c9bAfj9ui6N/M9iFdLjmrsujTzXO63U6+y6NPEc9V+quevSyL/ncyRGJ++6NPnhehBy62TuunTtk6Tmtks3nIIe46/t0sShvYA+rMfbLs3+XH9zQRGfnGGHsF3a+pz8TBeaHHdtu7TNI/Q/n9SPG5Xr0i6PFu3V4U48HT/l1/veydyl3b0uDz9jnl3Qx9YHem2Sniu7fnwRNBnR6G/rA68bTZ+XrSccJ1ZY7tKOn9l7w4j21fjB1ivW/3zaP1Ocnaaa+7C7f4wu+LPhPP7F8Gpezt6rz9y18vXv5//P/wU3cEY41pvMeQAAAABJRU5ErkJggg==",
"objectsTarget": "iVBORw0KGgoAAAANSUhEUgAAALIAAACAAQAAAACHQw5jAAADzElEQVR42q2Wv0/bQBTHL7WCBwSeKiSq1p3pkC6oQ0XMn8BQR50i5i6wgTAlDqjtv8EcGBgz1JGl/gNZIjEgc90iVGEPEY6a4Pa98/nu7MTAgKfk4+/dO797v8i/uY9P5O/Eeh5Otbk8IkSfxwk8rVk+Rm7Mch95ZZYTsvBebiT4lGh/LUrMIo+I1asdiRMJ7lcm17HnV4rcNbzQCcakwBPyMYi98IhYeT4l9yCPPdfM80hDuRNQPc/pEpOH+1qe+2+YPP5ZyXN3h8mda5LnJJV7odtSeaKl8iCmlsqnOpc7fVPl40Uu94aGyqPXXB6MdJXTemb3QFO5v5PZ9SoqdzO5E7gqbwt5uKlyTcjj05bkiSbkTvphnFcR9mr4JlL4dJnJP7CrNCUfG6i8ZVe5byh8BZWRzm5A4RFTErKHr3WFb7AYIQbupnDaBPk2IRpupCkc3eO+eMtuTeE+/if1OsFjtRU+wUi4eefjNSi8DfJL3R7sLmeO4xy/f7XTOddhI1/yE4zAddtuoF+p5C9w+U2nc4YLaUtwjJ62Dc8mLpQco+e4A88pLNwVPNFheRX1W7DwwhIcr2UB9RfgqL7kcOzbJdR/hjgaSg7XMlpF/bkJfhV8Crl4+BL1n+CC9k3BIWq7a6jv4C/JwV2X66hvQJpdSQ7JNfyC8jM4wR/JwVpkswccN5IcrO2mevjyQ8lfwVcOmP4HXJDgY7DbBzF49BvYNQQHu3RgN+BIx2BXcghYCrvDJ5w4wZ3klhf+HtjNDdv+BbVGcB/8TNY6F+BS0owvKoKDn8m6vVW1G2TH6Uu+EHuZfs+LKnJ/J8j2nwSJtAuJss3PA5ktOXzvaXr+E54YD34v+jlK/fN9xs/cnzN+5v4v+rmb6hdVP5feL9zqMI0H/CU5xlUaPyYvBDzewFoabxhXMg7BWi+NT0j87uPxDH4O0/hv8gLE8wXSIc0XLCtKfkEepfmFdULhkEc+y8es8D2cv21MQ5bvuFDhsLyL9QG7jMJ9WH6F9QS7jFpnWHmD+oP1qf14vaJYCCnUN6xXWqFOYj2cVydjwsqbWifHrNtFrCmNjMfr85RtfMd26yr1nBWg8IA1pb7aFzTRRjy1X7DCx9/Q1hP6kSv7Ua5/+U2xUa7f0Vom7+X6Y7SSya/0p/TfaTWzG5n5/p7Z3bby88AkO2YrPz985RuRp80b1Ejll1pxnuHe1IvzTzqeFOefhFjsKovzUtl8BfNYEN+Hs/MYzG8H9WR2foN5L6nNmffK5sPSebJs/iybV0vn27J5+Nnm7bJ5Psf/A67d6k1IisxZAAAAAElFTkSuQmCC",
"progressBar0": "iVBORw0KGgoAAAANSUhEUgAAALIAAACAAQAAAACHQw5jAAAAiUlEQVR42u3UoQ2AQAwF0KKQWNzNwATHSjgkNwFho0tOgGAIEgSaYCBpDhjg11+glU80TftTumF5UldXT9G5CBfyM3cH9LGEvq/lJvhssU8Guht66EHwu+rhnLGBnsfWwD0w29/mYSFQmSeP/NUOek0Fas9EBnlU/4pLd5dyIuVKyqH+bXX15P0BRBCejozMPEMAAAAASUVORK5CYII=",
"progressBar1": "iVBORw0KGgoAAAANSUhEUgAAALIAAACAAQAAAACHQw5jAAAA7klEQVR42u3UMQrCMBTG8YhIwcVJ6JYr6NYtbp0LehC3bk0vYPECLi7iKQJZHDyE0sFV6FKhJCqVqu33dsG88cef9kEfZRaOYs6dO/9BV2Vf34DLuJ8WwFeB9ZFvHn4BboKRfxRdrwLPP/Cul4lO11nXrzbXyM82t1PgutBmCVxOPBOD98qAV5X423s4MTA9xRTyh0roMzbc15N9Pr5ibLyoh3+6YU0vWv7q5wnudxb3kcX9luhDos+InhO9wP33+u/+e/13H1ncb4k+JPqM6DnRC9y31m/61vpPH4D1n9+duhPqrqg7dP9t585/3u93SkjFUCzChQAAAABJRU5ErkJggg==",
"progressBar2": "iVBORw0KGgoAAAANSUhEUgAAALIAAACAAQAAAACHQw5jAAAA5klEQVR42u3UsQqCUBTG8dMQQotT4OYzuDkIt81ZqAdxc0ufQHoGF+kpBAcbeojAoTlaCi7edDA1v7ML3TP++KOX60FScArSrl37Aj32zPKN3DWSJ/D0VVnQH7V1R89p/SqAh7V1secunTo5pXNvnLpkXDnAPbdqQuAUGU0E3ptIU0rxt/twIzCrggrkrcbQd7Q5j6a/fkm0PYymv/6Gpr0YfNzvj7jPFe4DhfuM6X2mT5neZnqB++/xf/pc4T5QuM+Y3mf6lOltphe4H44/7Yfjd74Gx+++O7cn3F5xe6j/29q1L94/+ZwRM/Tj2IYAAAAASUVORK5CYII=",
"progressBar3": "iVBORw0KGgoAAAANSUhEUgAAALIAAACAAQAAAACHQw5jAAAA5klEQVR42u3UsQqCUBTG8RMRQktTcLf7DG1ut61ZqAdpcyunRukZXKKnEO5QQw8ROLQaLgbiSYUW/c4udE/bjz900IPEcFJy7tz5CJ38qf1gjwrglc8KesjqBbwMF+phgJeeuuuh52yjczz0N2cWedb8VsBtYes98Fvu1SH431Opq8r87T08CcwkpRR5o0foa5pf+9M804pouevN9sBc07C/cOeDPmDcJ0K/EfpY6LXQG9y366O+XR/1AeM+EfqN0MdCr4Xe4L5bH/Td+qAPGPfJz2dg/fa9S3ci3ZV0h+677dz56P0LdFTgaNorlhkAAAAASUVORK5CYII=",
"progressBar4": "iVBORw0KGgoAAAANSUhEUgAAALIAAACAAQAAAACHQw5jAAAAo0lEQVR42mP4jxUcYBgVHxUfFR984vIH/vAf/okh/k++oYK98TOG+A/5norjEtjE5QwfSzzHYj5I/Iw9dvET8ljFGyf2YxU/jEP8vyEWcaA7/xViiP9gBvrrX4U8pjgwHP78sR+x6eEBAxbAeIDhADZxoGgDVnEHBq5VWMAKBgbRUCwghAG7+lWj6oeaelYc6nGlE1zpClc6HC23R8VHxQe9OACi8J4xH2oOzQAAAABJRU5ErkJggg==",
"progressDial0": "iVBORw0KGgoAAAANSUhEUgAAALIAAACAAQAAAACHQw5jAAACXElEQVR42u3Wv27TQBzA8Z8bKR5Q604whMZPwMBSVULB4jlYIhhgyCXNgpBA2BAhXoNH6IAu3WorA2vHqFeplpiDzBJ5cByc+2Pf/XxIMIAYakWK81H89SVxfAdb6xbDrf9zD+xe+n/X9w4Dm8d7h2DxAir32h7vHFpeAjz2AXzsOXjf7xXgYo9hQ3sT7aXcAY+yAS0gML2Ad4ys2STyTM8cRmj1SDumpx5n9tYxPRpwJnMIdS9hLTos9nUvOpJJ5umeu5Lp0tU9PZLMxo7u8SvVmUe6R4qrE4eaOyvFJA0aL9yaae41nh80nZFb+4+sR5oDOrVn6aBh5nyrfbhumEQL5flDjWkyU17oefbcVV56VD/Aq8fZ1fnaV76Z6Z3XQX3ehd45e1H7M71z+bUef6h3pvU4U53JxXvlsf5xq19AeWIwSZUbwyQ0C5UbzE6Vd83OeSC8dM3O0pe+b3ZG0ou+2dl9odx7Jl9JzwdmZ+JKPzY7c+nZG7PDZtIRE+VrNJ6F8BQxeyJ9hTqJ8AQxTaXjzlD4Ao/nTPgMdy5D7h9w51T4J9w5F/4Rd5bCu7jzMuDutjrC93HnWvgB7oy4l3dw54vPvd0Rji8HNhbewx0q/AjzlfC79k7R7njc2x3hx7gzEf4Id+bCH+AO+0WH/GZnY++M+/ZOffM2OtXNOGl3bqp5DaatzjarGE5Weme7pdXTbrsv/yA3/PqMOtsIhD+V1yGElYMzFAx9mf8MAfcL+f6+nDVS7lVH9UM5+fGO3N25Zd7fjf/Evh6IpnaPE7vn7p+tN27Xe/+R/wQBUibT3x/mZwAAAABJRU5ErkJggg==",
"progressDial1": "iVBORw0KGgoAAAANSUhEUgAAALIAAACAAQAAAACHQw5jAAACw0lEQVR42u3Wv27TQBwH8J9rqR5QcScY2sZPwNClQiqpxXOwVHSAIU7KEkWC4oMIsfAQPAJI6JKhCEcZOtIxyqFgqQNTkLtElnAd7Pvnn9NbGEAMjTr4Ps19ffe7OzuwNH4iuPF/7r7Zc+/v+tqmb/JobRMMnkHh7nWPSodrngMceADeqqfg/rybgbPqEVzRrQ5qygtwKWvSDPy6Z/CSBQvWIW7dE4sFtPiL7brHLmf2wqo7aXIOBhBiz2EhcljkYc9syUHiYk8dyXTiYI93JLO2hT3qqpwBwU4UFzcOkVtzxUHsV545mmnqVp7ernJajvbLZCuoOtjak7hZMbMutB8uKg7IWHm6i5iO+sozHM+OHOW5S3EHV49zHfM3T/lVH+f0fH3fMc758ET7Y5xzfqbHH+KcZ3qcMebgyyvl0eIX/k+kfMQ+4w6x8n4wwzdOQuX0B845Vr7OjnDO0BeeO8FHnDPxpG/QyRx1aEnPGqzVXSko96L8+4in0tMmne6gnI4jfY918AoMpCfPg0FtBfrSi8sRnoDyYpfEeDxj4aUlJ6jDQ+nFpHoN1GEkvMw+dVFOLL24nKGdzg6Fj8tjZeMdIbxfzgWdGHoecn9dtki3tjClvy1bEarcUPgbPgZUuYlwXrNjdMSe+tz5M2Bo1xa49A2+uy2004XzhDagBeae3+ItqHI+edx5DoMDfGJKF6UkVeXawsVpjFDlhIsZHVaVmwq/I4pYVU7kyFM9gQXacKWLnBbsow1X+p5oga5cR7j43hR05QbC74kvgX6GMpwzILaeAM5hERhzghhOTDk0gYYxp6dvXM85BcuYM4NdY04b7s9xznKpXi3bsnLf+f4kqvBk+5HchxAWDpZ60DbkxXvwucthkIbcuzF3Il9xy3cPQvny4zn68zUzv/fPUrNfXJo9Hpk9df7s98bN773/yH8D54AvVfwldP8AAAAASUVORK5CYII=",
"progressDial2": "iVBORw0KGgoAAAANSUhEUgAAALIAAACAAQAAAACHQw5jAAACjUlEQVR42u3WsW7TQBjA8XMs4qGk7lSGqPUTMLB0QcHiOVgqGOiQS2CpkEDYECEWBkZGXgApQ3WpBBKOMnSkY9SLwFLnIHeJPLgO9n3fOXcXd2CgYmhUWddffH9fL64csqx9ReTGr939es+9f+uNLb/Oo8YWqfGMFO6ue1Q6WfOckAceIZ7pKXF/38mIY3pELlm7r/yKA+Iy3mEZ8XXPyGtOF7wfuronFqes+Ilt3WNXMH9l6R52WNmhIxKonpPC2NdiQuSpntll5EsxJ3FVTx3IUzZ1VI93GHZ6lurRoeyMQtVDLjs8ChS35uWpZYfG/sozR5wqLpK6K083RWS7PHadyi+SdskjcWR25UncWXW4dV75/mLVoeFEenqPK53xQHoGgJ0njvTcZUqHudU6m2pn5km/HKidF3513YmA/q6YNnxa+WMIb4jj6Um1/kDAWUtMe16tM4Z8D3bp+xvp0ULt8Ej6mKsdGksfaB2WBNKZ1nkmval3jn3w3NE7Uw+9pXe66Bn8/eynfN9Fx+3vyuugp/Dp0iO8Tt9B34PzZrfg/RF68lLv8AE61TtU+kLvsAl4zI3OQ/S50RmDj5nRidHNzj74BKd/k50huNz+qY2D00D4W5x+0ODVB1P6e5x+bMsB+DuzMwVvmp0DX7iz1gFvmZ0Z+KbZ6QrPN8zOkSd8vQO+a3Z64G2zw8B35LZYODgD35bbYmkdeVvRoUWrG6709Q74ntnpg983OyPwu2aHX9Gh19uJr+jsk/pOROZqZ7nE6RHBf5Bf4v4MbZwekke4MBIUTuQyPjZw8Jn4wrHzqXmICxMe4iNu+eF2gA8/0aleP7L65/5JWu/nF/Uej+s9df7u+8bN973/yP8AnFAiX5+Wj+sAAAAASUVORK5CYII=",
"progressDial3": "iVBORw0KGgoAAAANSUhEUgAAALIAAACAAQAAAACHQw5jAAACtElEQVR42u3Wv2/TQBQH8OdGqgdo3akMUfBfwMDCUgWL/6SiAwxxEpaqEhU2RIiN/gcVf0IG5IQJR5HIBh2rXAQndQY5S+TBdcjdvfM9u14YQAyNqurykf31u58OrGs/Mdz6P3ev3nP37/rWnlfn8dYe1HgGG3dueiwcbngO8NgFcKuegvPrXgZ21WO4jpo98hUb4ESsHWXglT2DV8xfsV7olD2xmB9t/nij7NyRzE6tsodtyf4IAuo5rFQOi13qWQPZTxzqqY0cXdrUeQuZdS3q8bHOGYXUQ82bBwfErZ+afe4Zz+yCo9Qxnu6anI5d+DJp+uaGRuEJbxtm1lXhhyvDfjjVnj4kHE0G2jMaz45s7bkT0Rucos5tygtX+/WA5px4xXOnNGf4rPCnNOdiVtQf0JwXRZ2csv/5tfaYdnfEYu0TVrqBay+V2V0lgXZ69SfW117q7tIfe8pzuzRs0aWLvkNzvrAOenaflnkmB1R6afhb0Rw9pbPb3Wc9G/0RyRkf+CP05CXJSTb/B+g0XiwN7XTYxFhNlXNaphirJ+hmMUffxQqeKJ+Q+I5YwRydlin6eKh8SssUG22onA4/F328CKS/oYtZ9LGv/B0pE0RtY+VvSZmW3NvKyTSeyvPguSedTONQtsfKyTRy2V4oJ5s0llPakZ7fIWXKKf3oSt8hZbZxxwg3y2EB8lzpKjfL4QRUQ3nLlKnOlbnyfVNmIzI5ZFnF23oHCy9yeqBO17lys6xAXdJTfmDKVI8aKX9gysRLKjkJYKOSE+MpXc0J8SVQyelCozZnDHiMVnI47NbmHEGzNmeG3cWc9RpzvgLe+UOuz1C/Q94DbrQ+BBsHC3POdXc/gCcdc87hWBfmyRx8RZ7dDfDlJ3OKz7es/r0/S+v9alnvfFLvqf1nvzduf+/9R/4b6couiYOY0EIAAAAASUVORK5CYII=",
"progressDial4": "iVBORw0KGgoAAAANSUhEUgAAALIAAACAAQAAAACHQw5jAAACWUlEQVR42u3Wv27TQBzA8Z8bKTeg1p1giFo/AQNLFxQs3qSiAwy5JCwICYQNEWLrIyAeoQNysuEoQzfUMepVwlLnIrNYHhwb5/7Ydz8fEgwghp4yJB8pX//iWLqDyrpiuPV/7r7dS+/v+s6+b/N4Zx8sXkDtbtfjrUPHS4BHHoCHPQf3+70CCPYYNtFgon2Ub8CN2DAqwDe9gDeMZmwSuqanDqNR/Up6picuZ/baMT0ccqZzCHQvIRMdFnu6Fz3JNHV1z4nkaE10Tw4ks7Gje/xCdeah7qHi+sKB5s6NYpr4rRek4Sh3W8/32s6INP4jHdD2C73G02TYMnOuGz/OWqbhSnn+QONoOVNe6Hl2QpSXbqR/wW3m7Ot85SnfzPTOS7+57krvnD1t/IneuThv5g/0zvNmzkRn+uWt8lj/ufU/oHxpME2UG2PSKA2UG8ymyvtmZ+ELL4nZWXvSd83OSHpxaHa2N5T7wORL6fnQ7EyI9COzM5eevjI7bCYdMVWeoXlWwhPE7LH0G9RZCl8ijhLpuHMsfIXnORM+w52LgPs73JkK/4A7C+HvcWctvI87z3zupNMRvos7V8L3cGfEvbyDO5897t2OcPw4sLHwAe5Ewg8wXwq/a+8U3Y7LvdsRfoQ7E+EPcWcu/D7usF906G92NvbO+NDeWRB7J6mfS1vnJASnsnTOoV5BqTpVJTtft17veNk3/nyGag85BbGCKQS1gyM7H6U7n8DnLjvKg4R7KLe46lT2q5R3msWvG3T3/XpOx3YeuA7t54TtfbB5Tv7svHF73vuP/Ce0kyhgevPCZQAAAABJRU5ErkJggg==",
"progressDots0": "iVBORw0KGgoAAAANSUhEUgAAALIAAACAAQAAAACHQw5jAAAAoElEQVR42mP4jxUcYBgVHxUfFR8VH1DxP+woBFz88Q8UAi4+/789MgEXr2G/j0zAxP99/vkeiYCL/z3/rxyJgIv/3v9/NxIBF/9e//8uEgEX//b//1skAi7+DoQQBFz8LUgLgiAofhvopHoEQZQ4gzSMoEycFHtJ9Reu8MEVnrjCH1d84YpfXOkBV/rBmd5wpU9c6Xk0v4+Kj4qPitNfHACn+Bo8YhiGeAAAAABJRU5ErkJggg==",
"progressDots1": "iVBORw0KGgoAAAANSUhEUgAAALIAAACAAQAAAACHQw5jAAAAwElEQVR42u3TQQqCUBDG8S+CXNUFopO06FhtAruJB2mRN2gbRLRoWxYEz8J8kzU2KDSUBLUZF3/hh6DvvRH08ophbm5u/le/BrWIb8+1iEc0qkZ8Emyqebo/tg7kT5cy4nmMMeULX0Y8m2JI2ZxmHPEUGFAa0poj7oAuOaI9RzwBepQUd474Dujcn3Oct74E2uGq+C7OR45+QY98503e23Rd2v5o+6ntv3Ze2vlq86DNjzpv2nxq82z/u7m5+e/9Btpp4iJQL2EkAAAAAElFTkSuQmCC",
"progressDots2": "iVBORw0KGgoAAAANSUhEUgAAALIAAACAAQAAAACHQw5jAAAAxElEQVR42u3TQQqCUBAG4D+CXNU6iE7SomO5CewmHaRF3qBtENGibWoQaGG+SRsaFBpKgtqMyPDzweM9542gl08Ic3Nz87/6zWsU8cOlUcQXNK0X8Zm3r5enu/M1IXfqJJzEi7XzqQjhcxLPV7SkfI4JJ/EsoB1lwJiTeEoUUQr0OYnH1RsDA07iUbXkCPQ4vfVteaRgA3SDR/rIMSwdo6+9zb5tv0vrj9ZPrf/afWn3q82DNj/qvGnzqc2z/e/m5ua/9zvyr+IiXMvuKQAAAABJRU5ErkJggg==",
"progressDots3": "iVBORw0KGgoAAAANSUhEUgAAALIAAACAAQAAAACHQw5jAAAAvElEQVR42mP4jxUcYBgVHxUfFR8VH1DxP+woBFz88Q8UAi4+/789MgEXr2G/j0zAxP99/vkeSnxgfI8Q/3v+XzmUOMBQjhD/vf//bijRwGCNEP9e//8ulGBgkEWIf/v//y2UYGDgRYi/AyEIwcDAhxB/C9ICJt4wMLARFr8NdFI9mLjBwMBcT5Q4gzSIkKBYnBR7SfUXrvDBFZ64wh9XfOGKX1zpAVf6wZnecKVPXOl5NL+Pio+Kj4rTXxwACwTiIq5kKFcAAAAASUVORK5CYII=",
"progressHourglass0": "iVBORw0KGgoAAAANSUhEUgAAALIAAACAAQAAAACHQw5jAAAB8UlEQVR42t2WsU4CQRRFMRZWZHsavoKab7AgWpgQYkdFaeV08B3GxkAi2FmYDHGifAEfsKGzWgqTDVn2uW8X2WHenQSjRONUm7M3s/fNzrszFYJjWvldHlc242SXR5/8eH9+xA8LoFceXvfwL3zX559mm/fuOkw3+n25b57/yl9a+Th3+eswH3ff1c88+udCP3H5otCfCl7oH1weFvqOy5eFfuHyaJ7rjcvjLstHA5cnDZafBS5Pa6y/r4u+q7L+oil4n/WPSnDD+p7s35D1oeR5AUZyLmBr3+JcwNa+xbmArX07N6qWfZv3Lfs2N5Z9m4eWfZtnBRjE425p3+ZJo7Rv87RW2t/JvWppf4f3S/s73PRwfoY3mC8vPfzWM08HczPBfHCFfQZPsK60fg3XIWlquG6xUnCdI9Lwv4Sk4H80pCPEB6RitE8C0gnYV2mdVAr2YabVBPZtNrcisM8zL5pAX2TeFYE+MqyPJB+wPpZ9GrA+EX3N1hWlIgdYqYlEbvDMikjkDDvRRCKXlpTrRY6FhT4UOVnol4hrwPmDbdouhH1epCN8jqxbmL8NMZ+3FOLpcDhGfJ3lFeKrLN8Q5zxEnPNTA85525Z8xfqx5O95/ktenC/xvued93w87L3lJ+973ntd08ODA973/ti9WvAPeLUJTL11Ut0AAAAASUVORK5CYII=",
"progressHourglass1": "iVBORw0KGgoAAAANSUhEUgAAALIAAACAAQAAAACHQw5jAAAB00lEQVR42u2WsWrDMBCGUzp0Ct6z+Cky+ylEOhRC6ZYpY6Zqi5+jdCkKNB0zFBQQbZ8gD2CydXKGgAmO1XPiIMv6BSkktJRqiMyX39JZuvu5loZj3vpZnrWqcWXz9MAvj+cX5cMS6LmHhx7+jX198euP6v/mOcwr/bHct84/Py1X1T03eZUfq2N5Yk2Gr6zXDE+t7Q3P+G6KmzyPdlPQ5EVofq26C/S2f3irzuNCTA671LnaMsZTt36TTyFk4vJ0wVhfuTwbCDGJXZ53GesFLi86QjyHwDfajN1EgI+FmHHAFWND5D+JEAni9AEK8Wxgwq/zvGvCr/OiY8K3fK9twrf42IRvcTXE/pk8YL668/BHzzq3mKsXzOMRjjN4hd9VhPfwHPJIwnPLOIfnnGoJ7yXRHN6j0jJFPNY8Q3kSaJmDvKIS4gXIQ9JKDfKW1uYa5DnFIjWoC4qda1BHqtSDuotLPajTQBcS1DWFTvXu+gApN1PgG7Tyugd8hiIRAvgS+Rj5g+tjiS7IH1zfW+o1+QPyT0H+4PLSfmoGZHx7Q3oxdf18UeqZy8VuuHwnZ6Mmf9/rZ03+ttdfe/RPf01/5r7llP2et6+LPDw4Y7/3y/pqh38B9mUeE1Ss9HoAAAAASUVORK5CYII=",
"progressHourglass2": "iVBORw0KGgoAAAANSUhEUgAAALIAAACAAQAAAACHQw5jAAABqElEQVR42u2VsU7DMBCG3alb/QQoPAIj6kBeAledQH2IbkgpUxhQty4s7Gml9g1AyjN0b9ZOHTtYDT5foTn/RgKEYEmkRs6nz7XvbJ9VHX1eVctb/tf8XqDsg4tOk/TH/LLJp1/gSmmGVqme4B3mm5CrjAeV/LnepJ53ajsV3CbUOOiQ135gmwLPqbHPgJfU2NXAK2pUyHfUKJHvKYAcuaVPjfyQ8C/k3k0jPOcxgJc8J+AVxwB8xzEDd3+ex7ibjI7xQ0LTl3xGb+1DFvzphQLwKZL+LQXgUyr9JQVQAZ8ZCqBEv6AAuhHfDWB1xF9y9iW/mBnzvp0FfyqoA/PHEz93vsmQK+cXxZE/NDj55iYB7v0Fz3MS+sMucO+vyrg/quL+Mc/gu3UxEX+u7VUR8Qdu3V1awV+kda+Yoz90+8plCfyVW3nqFvojt/JrY65Dn/b5NuLTuRijP6dz1Ed/QOfuDP0FffbQH/pzjf7K1wH0R75urMHnOrMFn+vSOPSXvBn6oX93rHvSb9bJJm/WVSX4qQ5LfqrbKv31e+S7/LN7rb33W/7P/A2qqP8PNx6qQwAAAABJRU5ErkJggg==",
"progressTimer0": "iVBORw0KGgoAAAANSUhEUgAAALIAAACAAQAAAACHQw5jAAACJUlEQVR42rXWO27cMBAA0BFUqJRvwCukdKdruTBA2jmIr6JUuQaNAHbLII0ECBzzI4kzIpmVkM02KzxwqeEsORzA4meE265AFh1gKLkFEEUXtuwD3sdr8ze66NjoYvz4osvr/f0LT/u0Pf/kbiQagBbxO3cXigJwiW64j2JxDL0F7q+99t4sD5J51/lpAJ4eB+q2f3WTuKkengX1RYw+GBeS7alPgw5/LjTYUTdyDAFqWBewukYVxk0gf1B/t3EvuK93Nn5xS/1wU6mejTdPzrzrjs0/fXNRfs5uQMviWaCPHh7Iev1rva/v3/PjV+UdYeCOq488b361Ph7UPG/t5obnzUf3Iben5P3mC89n8pblR2xuG+bD5sh8lFs8qKgr4pI62bHUm+TxcPzdbZvciNu+Lj6l5Jb3yRfiE/WOeDroaE+4od4SH0gpPOGaenPCJfGXf/DnPdFaEB+pK+p/9mneqC/Ex//hezyTOONYmedeLit5qOStlue7/Y8X98/V/Vnb51fPS+3c1c7p1fN+tZ5crVfVuqdSyWZ1ciSe1eEZszoc6vaMWd0OdX7GrM5PybvsHpkxu0fCrwPxeye8LbgW2b02f2b3GqphdZCHfiP6sd/QffTl0J+YNrppD/1PE+PRHXd/73tXPffUJxz6q72vOPjehxzcxL6lPfoU+5zu6Db2RSLr62IfJTOPfVfeB8Y+rdAfKjIN9dgHFvrJ2vPVvp35F2dRFhdh12CjAAAAAElFTkSuQmCC",
"progressTimer1": "iVBORw0KGgoAAAANSUhEUgAAALIAAACAAQAAAACHQw5jAAACuUlEQVR42rXWPW7bMBQHcAoaNCo34BU6dtMpBLdL3bkn8GCUTHqMDNnpwRcoanXqCbwzKGCvLLxIgCCWH5L4nkjDLtp6CfHDPzRJWXyP6OSnIbedE5Z0QqqUD4TQpNMh7ZX+N35t/kwmXWcyuX79KNP7/fVT3+3tNP6BXTGtCMm1/oLdLIUTYg46w97Q3jApB4L9qZTWs/6BIS8KOw0hm7cV9KF8MpOYqR62FHpPG7sYs6ShhN5W0j1ckukCumKNW6Ak4wZGl5q7XEvYd+ivg/st7M2fV5TvzVZP2VHzEuXVxkx/ysRBFmj+9o1Z5bk7rlSO1tOT0rrYuQHYr/3a8/tjPRC0X213ZfLiQCrs2s1frxt8bna3Zj1iL/G55c6P9Urhc7OrOzEhdi1aZ1s6P9Z1j8/T+SchhJsxnA+d8p8z5NU4vzggb9i4nnrNoXM2rl/s3XB2v2uTXzXQx1+fye/8y4G8th/oQz7FxU7RyF0e+rh5mxfuSLC7/AZ6GfJfgfv/9fltAZyG/LfYXf4DcAXzOfAq5Nexu/weuIT5LHKfh85CfvUYuY2bayiZZ8i3+ZSXFHjj3eY/Ug79Ms//DL2/zPO/NJG75/vcJPPrK/kDzs/reUdj948Iur7MN+rL/3AGnEfn5t9AHp2z9/i5jGXjL7wCnt12BT2/w0MBHN9N9F54L+7wMnhfRO+pDmP0Xocr8IYPefDEfRL5dF+Fs7rhHFRqtrwn/ZWN7skGeHQPd+Cr4L3dzZUD3/PdXDlwXejAkcA60s0jXHcc4brjvs25pFFd684WcL3j1eiELfoN78t+Q5be+0V/onLvKl/0P5lfjyyw27pvnZfYxzo9levQX819xcLnPmThyvct+dJb3+cUSx98X0Sjvs73USxy33fFfaDv0xL9IQfTQPd9YKKfvDb+074d+W/1dr0hXblJ3QAAAABJRU5ErkJggg==",
"progressTimer2": "iVBORw0KGgoAAAANSUhEUgAAALIAAACAAQAAAACHQw5jAAAC3klEQVR42q2WsW7bMBCGKQioRmXPwFfo2E1PIahZ6s59Ag9GKaePkaE7PXjtUMTq1CfwzqCAvbLIIgOCWPIoW3cihTppvUT58Pt8dyLvfmain4b9nddMRDljRYz3jPEo532cF+b/8Ln4iYpyk6ho/mat4vX+/mWu5u35+SflWhjNWGrMF8ptKjVjttEJ5Q3vLGZ5zyi/z5XjSXcjCM8yF4ax5bsC8z6/t0FsqJsVx7zjjUvGptTnmLeFgpfLEpNhrkUDCSo2FDBwZWrQtUz8wPyph7OwtX+eiL6zpR6SvalzotdLG/6QyJ3KSPz2rc3yeNpXOiX5dCx3XG7gAdXrfvZ4ty97Ruo1riqrlztWUG4gfrloaN9ctTYfuVW0bynwfVlp2jeX3UFIuWlJnm0OfF+WHe0n8E9SSog49oef9Z8TwoshvtwR3oghn3JRY16LIX+5hccL91VbfdVgPpw+q9/4y0F46T6Y9+lZLjeaBxz0mA/FO72EllAO+iXm+aj/jrj/rtevMsT5qH8MOeg/IK6xPkW8GPWLkIN+i7jC+iTgXo+5GPXVOuBObsdQVC8IX6VnveKIN547/UdeY/58if+Aefd8if+1CTi834cmql/M6HdUf8nnPQ+503+7xdzMxDcz8Ud9OaM3RC9QvXXQN+jnbR302ffzX96XQOdhHT8/1RXn56XnU+Pzn77+vrT4PmbBPfX3MX/9fUfzRF4zT4a5JGfmlftCRbife71rD5l7MBzbzOnJnARR+wbmZzCHT+Zy3cncPrn4j0kw5+16se1Jg70AeroXYHtAfLpH4L64fDZ078CecvlXigd77XSw14XuNVPbf09HezyZmPgNr5/6DZV7fTfxJzoF/VanE/+TQD4LlVHu9r7N3+59yv2ers7revRXzlf0zldM+MWHTLj2viWd8tb7nGzKe++LeODrvI8SAfe+K/SB3qdF/GGNwmDufWDET849v9S3E/4HKuJgRipvQikAAAAASUVORK5CYII=",
"progressTimer3": "iVBORw0KGgoAAAANSUhEUgAAALIAAACAAQAAAACHQw5jAAADJUlEQVR42q2WvW7bMBCAKQioRmXPwFfo2KXVUwiqlzhz1y4e3FBJHyNDdnrQmgBBrE59Au8MCtiAJxWGATVQyPJHou4kGW2BckiED18ud/w9oiZHSf7Mc8ImOSHJFJeE0ElO5TRP1P/hp+IHYpKrQEzmr67FdL0/f6i/5nX3/R3ziqmKkFCpr5jrVHJC9EQHmJe00ZjEkmB+EwvDg+aMIR5FJgwhi3cJ5DK+0UF0qLMlhbyhpUlGpyRjyOtE2MUlgYogr1hpExSkLaDlQuXWqwn7BvmztHuh0L+ekd/oUrfBRuUx8quFDr8N+FpEKH79Vme5+7XJqhDl05DYcL6yH6Be8293s00qCapXmaq0z9ckwVzZ+Om8xPNmqtX58ELgeQst36RZhefNZLdlnK9qlGcdW75J0wbPp+WfOOc2Yj8/tPOvAsSTNj5fI16yNp90nkOeszZ/XthPz13V2s9KyNvdp/2VOxyIp2ZALsNO56uKjrj1IW+LNz63U4K59ReQx73/CLj7W+cvI8Bp7z+NufUvAK+gHwKe9P58zK1fAC6gH4y48yFnvZ9dj7jR9TU06TPEl2HnCwp46bjxL2kO+cHHv4W8Ofj4d+WI2/W9LSf9+Ql/jX2fz0eKOW/H/Tnk6pC2A8dXh87H8Y+fOz894SvkMx+f3cF5WPh8xHmO5rnzLyleFx9/sF4+PuJX3I8C8vc+/TSD++QD8AO4D3sf7U/oQ057/yKE56L38XkBPuRx7z9G8JxuvL9E53rvfXzeex+edxn2Pr5Pjt6HXAUvnT64r17NzJhFyBDPpdk65keB7r38i9makfHRPVmaBbt/Y+9PfA9rdab8ce/vba0+mPhPAb7ndcEzOz0hfhf2rY/fhTo6tvHxO9KELy6fFX53pCnY5J+JwXunN+jDVteM3zWVJ5t0ttPbk7BBv7G3/rDfEPHR+s2gP6lCafyiCgf9T6BMPnMRYa7f/b3OX7/7mOt3+nWusu657vsr01dI01cMuO9DBrxyfUs45LXrc6Ihl64voqO+zvVRbMRd3zXuA12fNtEf5iAM5K4PnOgnT33/a9+O+G9KZg5hxzWVdwAAAABJRU5ErkJggg==",
"progressTimer4": "iVBORw0KGgoAAAANSUhEUgAAALIAAACAAQAAAACHQw5jAAADGUlEQVR42q2WsW7bMBCGSQioRmXPwFfo2KXVUxCKl6pTA3Tt4sENlfQxMnSnB68JUMTq1CfwzqBAAnhSERhQAoXsUbKkO1lGk7QabOHDj8PP0/HumBt9cvZ3njE1yhmLx7hlTIxyYcd57P4P3xefm1HuuBn1707N+Hl//3JP5mX7/pPyQrmCscC5r5SDlYwxSDSnPBcVYBZZRvlZZDzn1YEiPAx9GMamb2LMbXQGQSDUwUxgXoncmwFLNsK8jE39cRl3IeaFymuDhm0PsOXGZbWuZOoH5teWCevcAv6uib5iavORr1wWEX0x5U7fcL00IYlfvg4e5fH9KikC4qdi0YO+vddzeCHnZWIjjycraRk5r2Ox9nq9ZDHlTvr4Ms1p3rjV3o9eGJo3sCPBv0wKmrfwAfRK63lJfJbRBvRqJWVF8xmtQf9Ja10FJD9itdWfcMLBfh1fLwnPlWz8yDTDPDvRjX+9yBTmYF8qB/okx5yDfe0c/Myby9FysL99MLeB19fPvBCY93rMq3Dd6nUZYb7q9FPMo06uvyNeRr1+FiIuev0V4Z1cvke8wPoA8bjXp5i/6/ULxA3Wc8SxHvMvvT45RVy5Vg5tiPBWrgifBa3eCMTzWdDqP4gM87su/jnm1V0X/1tOePd9z/NRfbpHv6T6zs+RoLzVXxxi7vbEd3vibz53+dyjd0Sv0HlxHqZ9Pg8zkuc+n//yvU5QPWD+FtXDE+rnufVZ4PoPXn5fSnwfQ3xP0X2MXn7fbdDrn9JPmn7V1CftV76/pf4jJIRn1peO/1mQvpf5C3kUej3pk7n/YBev6v5J+zBIJ6677n3fBumlj3/FaZ+HA0/q9AR0Lqy3ejoXynCzjU/nSOUbrvczp3PH+gN7/4kZzDso0MsbODOday6LV3JyC+XJ1GDfWNf64b5hYIB5fTXYT4rAev2iCAb7D3feT2pCymHur8E/zH3KYU4/pi5px3W/X/m9wvq9YsC7PWTAi2ZvCYa8bPaccMhtsxeJnb2u2aPUDm/2rt09sNnTRvbDDIXBvNkDR/bJfe/P3dsJ/wMGWMEfZruZ5wAAAABJRU5ErkJggg==",
"progressWaterLevel0": "iVBORw0KGgoAAAANSUhEUgAAALIAAACAAQAAAACHQw5jAAAAz0lEQVR42u2NMQ7CMBAE11jCDSJtCgRfoKTLV3gJBCHR8iVX8AzMCzBdJILDLhIdBSXFnbSXu/HExvC1IowbN27cuHHjxo0b/4k/9b2pbZmHhot4p+nMlIbtru0onqXtmX7BlsSDeJLmmK7SxbSKFz9RKzVR1mUHWr0T99T6mlq8ko9pddhGFB+ozri2awpB27KJ6PyOr03CULBshvcWV1VE8nyqnTr+vaqG5Lih9hFw2WcELFrM0QM5JEyhahgeASTARkPEpyZqa2b0Gf6rXmaqYCuI4ImXAAAAAElFTkSuQmCC",
"progressWaterLevel1": "iVBORw0KGgoAAAANSUhEUgAAALIAAACAAQAAAACHQw5jAAAAzklEQVR42u2NMQ7CMBRDHSKRBdG1A4IrMLL1KpwEipBYuVImOAbhBIStEiXFRmJjYWP4lvz7/eImGL4qwrhx48aNGzf+A3/qe9PY0g8tF/FO25kuDcdd6SieVdvT/YIjiQfxpJqju0oXs1W8+Im1UhNlXXZgq3finrW+Zi1eycdsddhGFB9YnTG2axaC0rKJ6PyOr03CULBshneKqyoieT7VTh3/XlVDckyofQRc9hkBixZz9EAOCVNIDc0jgATYaIn4aKKxpkefxWQy/YtegRuKvotww9gAAAAASUVORK5CYII=",
"progressWaterLevel2": "iVBORw0KGgoAAAANSUhEUgAAALIAAACAAQAAAACHQw5jAAAAzUlEQVR42u2NMQ7CMBRDHSKRBdG1A4IrMLL1KpwEipBYuVImOAbhBIStEiXFRmJjhO1b8u/3i5tg+KoI48aNG/87f+p709jSDy0X8U7bmS4Nx13pKJ5V29P9giOJB/GkmqO7ShezVbz4ibVSE2VddmCrd+Ketb5mLV7Jx2x12EYUH1idMbZrFoLSsono/I6vTcJQsGyGd4qrKiJ5PtVOHf9eVUNyTKh9BFz2GQGLFnP0QA4JU0gNzSOABNhoifhoorGmR5/FZDKZTKbf6wUwPOKl8QPByAAAAABJRU5ErkJggg==",
"progressWaterLevel3": "iVBORw0KGgoAAAANSUhEUgAAALIAAACAAQAAAACHQw5jAAABP0lEQVR42u2VMWrEMBBFRxGsGrNqXYT4CltuFV9lj5EqVlhImyPkKoKFbJcrrHKCKJ2XKFb+BGxsGBdbBRJ/mGHm+VtjJGNT/srQO6cG8cnFKXvKLVdHRFcjfXD3xDyybY9IFVJgbpgHtilEa5E8XJ1m/gJbVwJFXuwRrqSYa9hSCZt/A1/B1VLjqdMG1mu0bgeD4W5Te2r1A6YVJne0qfNP57fWU9AY5dYKd29tDgodldoTqagjGaoc3VAiiibQmlg1ApeIQIjuufDUq+C0Q1z1xaJFi/60iluZ28aJ3Jy9yPU5iFxlmesZvsry+kUz8/z/5qTuZKyizM2F3IYZfnDyuR7kc61fL+P4qYmq0mCZ+tuhfHZjPvhV8iKnMVejuZNXrjnK3O77aeo03hEzNGqyUcbNnJdfPjqLFv2+vgH+JtBJ4nz/SAAAAABJRU5ErkJggg==",
"systemAccept1": "iVBORw0KGgoAAAANSUhEUgAAABgAAAAQAQAAAAAkX4I4AAAAQElEQVR42mM4wMDMsP//X4b6//+AWI6h/p8dQ/2fOob6H/8YKj/+Y6h4/I+hxvkfQx07UJ4fiOf/A6sF6QHqBQDsYh9jNdETHwAAAABJRU5ErkJggg==",
"systemAccept2": "iVBORw0KGgoAAAANSUhEUgAAABgAAAAQAQAAAAAkX4I4AAAAQUlEQVR42mM4wMDMsP//X4YEBjYGB4ZHDA6MhxgcmJsYHNiZGNz4mBjcZZgYnPcwMTj+YGJw+ADECUxgtSA9QL0A+IIPxwiZFtwAAAAASUVORK5CYII=",
"systemAlert": "iVBORw0KGgoAAAANSUhEUgAAABgAAAAVAQAAAAB0khOLAAAARUlEQVR42iXD0QmAIAAE0IvWCtqmMbLG8MtVhAZwjBvALyE85XzwoE/QO8f5WPsd0K+An6c3Jq8sThIUUVg9qfmDDRn7AD/WMAQEJ+pCAAAAAElFTkSuQmCC",
"systemBox": "iVBORw0KGgoAAAANSUhEUgAAABgAAAAQAQAAAAAkX4I4AAAAGklEQVR42mM4wMDMsP//X4b6//9IwiA9QL0AlQYkzY8nCoAAAAAASUVORK5CYII=",
"systemBusy0": "iVBORw0KGgoAAAANSUhEUgAAABMAAAAPAQAAAAAuP8mBAAAAMElEQVR42mPY/38Bg/x/BgbnHw4Msd8dGKLeA+k4IL0XSGdB6TioOFAepA6kHqgPAJCPFdTsOCPGAAAAAElFTkSuQmCC",
"systemBusy1": "iVBORw0KGgoAAAANSUhEUgAAAA8AAAATAQAAAABnuWoHAAAAOUlEQVR42mNoYGKw/8EAJO9/A6GrYQyv1jF8jWP4tY/hbx3D730M3+4xvH/HcO8bw90yhlvbGGDqAdjhGYsKgwC5AAAAAElFTkSuQmCC",
"systemDecline1": "iVBORw0KGgoAAAANSUhEUgAAABgAAAAQAQAAAAAkX4I4AAAANUlEQVR42mM4wMDMsP//X4b6//8Y6urtGOrt6hjq5/xjqD8JxI+hGMQGiQHlwGqAakF6gHoBybUeX0RcSJEAAAAASUVORK5CYII=",
"systemDecline2": "iVBORw0KGgoAAAANSUhEUgAAABgAAAAQAQAAAAAkX4I4AAAANUlEQVR42mM4wMDMsP//X4YEBjYGx4ZDDA4HmxgckpkYHMyAWAaKQWyQGFAOpAakFqQHqBcAGz4QyzSHE/gAAAAASUVORK5CYII=",
"systemDotEmpty": "iVBORw0KGgoAAAANSUhEUgAAAB8AAAAfAQAAAAA31SuUAAAAYklEQVR42oWOMQ5AQBRE5yZ7FEfSKTmC25CQuILehkahkc12IvgjRqHUTPX/ew+MzsByNlhxGq7ochz90mFL9gmBFjCSGTxZoSUb1OTwTkquP/Md61cU8USWQzZ5VaCWp+oGeLZn9EklJaAAAAAASUVORK5CYII=",
"systemDotFull": "iVBORw0KGgoAAAANSUhEUgAAAB8AAAAfAQAAAAA31SuUAAAAX0lEQVR42mP4/0H+H8P//sf/GP7V//nH8PeDfB3D7wPs+xi+MzDeY3jHAER3GBjKGG4wMJgx7GBgsGLYwMAgBSESGBh4CBAIxWC9YFPA5oFNBtsBtg1sL9gFYLeAXAUAPIwyHWLMTS8AAAAASUVORK5CYII=",
"systemEv3small": "iVBORw0KGgoAAAANSUhEUgAAACsAAAANAQAAAAAY06pGAAAAPUlEQVR42mNg4LFvYwACFEr+n32fPYiS5/8P5PLLyz8AUXwQqs8eSMn/b7H/D6IO1NmDBA/UgbTzP/gHpwBcwBWO2QYBDwAAAABJRU5ErkJggg==",
"systemPlay": "iVBORw0KGgoAAAANSUhEUgAAABAAAAAQAQAAAAA3iMLMAAAAMElEQVR42mP4Y8/wsZ/h+XOG858Z5v5k2POXwcaGoUYOhIAMIBcoCJQCKgAq+2MPAAFKFVmziLfGAAAAAElFTkSuQmCC",
"systemSlider0": "iVBORw0KGgoAAAANSUhEUgAAAAwAAAAbAQAAAABg3VNpAAAAEklEQVR42mM4YMBwfwPV0AEDAHmKKNims3dJAAAAAElFTkSuQmCC",
"systemSlider1": "iVBORw0KGgoAAAANSUhEUgAAAAwAAAAbAQAAAABg3VNpAAAAGklEQVR42mM4YMBwfwNFCAKuGjCc2sBwwAAAT7olG9TpXdAAAAAASUVORK5CYII=",
"systemSlider2": "iVBORw0KGgoAAAANSUhEUgAAAAwAAAAbAQAAAABg3VNpAAAAG0lEQVR42mM4YMBwfwM5CAJObWC4aoAgDxgAACpUJGftPg+WAAAAAElFTkSuQmCC",
"systemSlider3": "iVBORw0KGgoAAAANSUhEUgAAAAwAAAAbAQAAAABg3VNpAAAAG0lEQVR42mM4YMBwfwMJCAKuGjCc2oCFPGAAAPSIIz417p4OAAAAAElFTkSuQmCC",
"systemSlider4": "iVBORw0KGgoAAAANSUhEUgAAAAwAAAAbAQAAAABg3VNpAAAAG0lEQVR42mM4YMBwfwNhBAGnNjBcNcBHHjAAAMJ6IooqNLP/AAAAAElFTkSuQmCC",
"systemSlider5": "iVBORw0KGgoAAAANSUhEUgAAAAwAAAAbAQAAAABg3VNpAAAAG0lEQVR42mM4YMBwfwNOBAFXDRhObSCKPGAAAHfbIWHuFKlNAAAAAElFTkSuQmCC",
"systemSlider6": "iVBORw0KGgoAAAANSUhEUgAAAAwAAAAbAQAAAABg3VNpAAAAG0lEQVR42mM4YMBwfwM6goBTGxiuGpBGHjAAADklIK1PooVQAAAAAElFTkSuQmCC",
"systemSlider7": "iVBORw0KGgoAAAANSUhEUgAAAAwAAAAbAQAAAABg3VNpAAAAG0lEQVR42mM4YMBwfwMUQcBVA4ZTG8gkDxgAANmVH4SOiUHMAAAAAElFTkSuQmCC",
"systemSlider8": "iVBORw0KGgoAAAANSUhEUgAAAAwAAAAbAQAAAABg3VNpAAAAFElEQVR42mM4YMBwagPDVSqRBwwASoohT92wVBIAAAAASUVORK5CYII="
}

260
libs/core/images.ts Normal file
View File

@ -0,0 +1,260 @@
namespace images {
//% fixedInstance jres
export const expressionsBigSmile = screen.unpackPNG(hex``);
//% fixedInstance jres
export const expressionsHeartLarge = screen.unpackPNG(hex``);
//% fixedInstance jres
export const expressionsHeartSmall = screen.unpackPNG(hex``);
//% fixedInstance jres
export const expressionsMouth1open = screen.unpackPNG(hex``);
//% fixedInstance jres
export const expressionsMouth1shut = screen.unpackPNG(hex``);
//% fixedInstance jres
export const expressionsMouth2open = screen.unpackPNG(hex``);
//% fixedInstance jres
export const expressionsMouth2shut = screen.unpackPNG(hex``);
//% fixedInstance jres
export const expressionsSad = screen.unpackPNG(hex``);
//% fixedInstance jres
export const expressionsSick = screen.unpackPNG(hex``);
//% fixedInstance jres
export const expressionsSmile = screen.unpackPNG(hex``);
//% fixedInstance jres
export const expressionsSwearing = screen.unpackPNG(hex``);
//% fixedInstance jres
export const expressionsTalking = screen.unpackPNG(hex``);
//% fixedInstance jres
export const expressionsWink = screen.unpackPNG(hex``);
//% fixedInstance jres
export const expressionsZzz = screen.unpackPNG(hex``);
//% fixedInstance jres
export const eyesAngry = screen.unpackPNG(hex``);
//% fixedInstance jres
export const eyesAwake = screen.unpackPNG(hex``);
//% fixedInstance jres
export const eyesBlackEye = screen.unpackPNG(hex``);
//% fixedInstance jres
export const eyesBottomLeft = screen.unpackPNG(hex``);
//% fixedInstance jres
export const eyesBottomRight = screen.unpackPNG(hex``);
//% fixedInstance jres
export const eyesCrazy1 = screen.unpackPNG(hex``);
//% fixedInstance jres
export const eyesCrazy2 = screen.unpackPNG(hex``);
//% fixedInstance jres
export const eyesDisappointed = screen.unpackPNG(hex``);
//% fixedInstance jres
export const eyesDizzy = screen.unpackPNG(hex``);
//% fixedInstance jres
export const eyesDown = screen.unpackPNG(hex``);
//% fixedInstance jres
export const eyesEvil = screen.unpackPNG(hex``);
//% fixedInstance jres
export const eyesHurt = screen.unpackPNG(hex``);
//% fixedInstance jres
export const eyesKnockedOut = screen.unpackPNG(hex``);
//% fixedInstance jres
export const eyesLove = screen.unpackPNG(hex``);
//% fixedInstance jres
export const eyesMiddleLeft = screen.unpackPNG(hex``);
//% fixedInstance jres
export const eyesMiddleRight = screen.unpackPNG(hex``);
//% fixedInstance jres
export const eyesNeutral = screen.unpackPNG(hex``);
//% fixedInstance jres
export const eyesNuclear = screen.unpackPNG(hex``);
//% fixedInstance jres
export const eyesPinchLeft = screen.unpackPNG(hex``);
//% fixedInstance jres
export const eyesPinchMiddle = screen.unpackPNG(hex``);
//% fixedInstance jres
export const eyesPinchRight = screen.unpackPNG(hex``);
//% fixedInstance jres
export const eyesSleeping = screen.unpackPNG(hex``);
//% fixedInstance jres
export const eyesTear = screen.unpackPNG(hex``);
//% fixedInstance jres
export const eyesTiredLeft = screen.unpackPNG(hex``);
//% fixedInstance jres
export const eyesTiredMiddle = screen.unpackPNG(hex``);
//% fixedInstance jres
export const eyesTiredRight = screen.unpackPNG(hex``);
//% fixedInstance jres
export const eyesToxic = screen.unpackPNG(hex``);
//% fixedInstance jres
export const eyesUp = screen.unpackPNG(hex``);
//% fixedInstance jres
export const eyesWinking = screen.unpackPNG(hex``);
//% fixedInstance jres
export const informationAccept = screen.unpackPNG(hex``);
//% fixedInstance jres
export const informationBackward = screen.unpackPNG(hex``);
//% fixedInstance jres
export const informationDecline = screen.unpackPNG(hex``);
//% fixedInstance jres
export const informationForward = screen.unpackPNG(hex``);
//% fixedInstance jres
export const informationLeft = screen.unpackPNG(hex``);
//% fixedInstance jres
export const informationNoGo = screen.unpackPNG(hex``);
//% fixedInstance jres
export const informationQuestionMark = screen.unpackPNG(hex``);
//% fixedInstance jres
export const informationRight = screen.unpackPNG(hex``);
//% fixedInstance jres
export const informationStop1 = screen.unpackPNG(hex``);
//% fixedInstance jres
export const informationStop2 = screen.unpackPNG(hex``);
//% fixedInstance jres
export const informationThumbsDown = screen.unpackPNG(hex``);
//% fixedInstance jres
export const informationThumbsUp = screen.unpackPNG(hex``);
//% fixedInstance jres
export const informationWarning = screen.unpackPNG(hex``);
//% fixedInstance jres
export const legoColorSensor = screen.unpackPNG(hex``);
//% fixedInstance jres
export const legoEv3icon = screen.unpackPNG(hex``);
//% fixedInstance jres
export const legoEv3 = screen.unpackPNG(hex``);
//% fixedInstance jres
export const legoGyroSensor = screen.unpackPNG(hex``);
//% fixedInstance jres
export const legoIrBeacon = screen.unpackPNG(hex``);
//% fixedInstance jres
export const legoIrSensor = screen.unpackPNG(hex``);
//% fixedInstance jres
export const legoLego = screen.unpackPNG(hex``);
//% fixedInstance jres
export const legoLargeMotor = screen.unpackPNG(hex``);
//% fixedInstance jres
export const legoMindstorms = screen.unpackPNG(hex``);
//% fixedInstance jres
export const legoMediumMotor = screen.unpackPNG(hex``);
//% fixedInstance jres
export const legoSoundSensor = screen.unpackPNG(hex``);
//% fixedInstance jres
export const legoTempSensor = screen.unpackPNG(hex``);
//% fixedInstance jres
export const legoTouchSensor = screen.unpackPNG(hex``);
//% fixedInstance jres
export const legoUsSensor = screen.unpackPNG(hex``);
//% fixedInstance jres
export const objectsBomb = screen.unpackPNG(hex``);
//% fixedInstance jres
export const objectsBoom = screen.unpackPNG(hex``);
//% fixedInstance jres
export const objectsFire = screen.unpackPNG(hex``);
//% fixedInstance jres
export const objectsFlowers = screen.unpackPNG(hex``);
//% fixedInstance jres
export const objectsForest = screen.unpackPNG(hex``);
//% fixedInstance jres
export const objectsLightOff = screen.unpackPNG(hex``);
//% fixedInstance jres
export const objectsLightOn = screen.unpackPNG(hex``);
//% fixedInstance jres
export const objectsLightning = screen.unpackPNG(hex``);
//% fixedInstance jres
export const objectsNight = screen.unpackPNG(hex``);
//% fixedInstance jres
export const objectsPirate = screen.unpackPNG(hex``);
//% fixedInstance jres
export const objectsSnow = screen.unpackPNG(hex``);
//% fixedInstance jres
export const objectsTarget = screen.unpackPNG(hex``);
//% fixedInstance jres
export const progressBar0 = screen.unpackPNG(hex``);
//% fixedInstance jres
export const progressBar1 = screen.unpackPNG(hex``);
//% fixedInstance jres
export const progressBar2 = screen.unpackPNG(hex``);
//% fixedInstance jres
export const progressBar3 = screen.unpackPNG(hex``);
//% fixedInstance jres
export const progressBar4 = screen.unpackPNG(hex``);
//% fixedInstance jres
export const progressDial0 = screen.unpackPNG(hex``);
//% fixedInstance jres
export const progressDial1 = screen.unpackPNG(hex``);
//% fixedInstance jres
export const progressDial2 = screen.unpackPNG(hex``);
//% fixedInstance jres
export const progressDial3 = screen.unpackPNG(hex``);
//% fixedInstance jres
export const progressDial4 = screen.unpackPNG(hex``);
//% fixedInstance jres
export const progressDots0 = screen.unpackPNG(hex``);
//% fixedInstance jres
export const progressDots1 = screen.unpackPNG(hex``);
//% fixedInstance jres
export const progressDots2 = screen.unpackPNG(hex``);
//% fixedInstance jres
export const progressDots3 = screen.unpackPNG(hex``);
//% fixedInstance jres
export const progressHourglass0 = screen.unpackPNG(hex``);
//% fixedInstance jres
export const progressHourglass1 = screen.unpackPNG(hex``);
//% fixedInstance jres
export const progressHourglass2 = screen.unpackPNG(hex``);
//% fixedInstance jres
export const progressTimer0 = screen.unpackPNG(hex``);
//% fixedInstance jres
export const progressTimer1 = screen.unpackPNG(hex``);
//% fixedInstance jres
export const progressTimer2 = screen.unpackPNG(hex``);
//% fixedInstance jres
export const progressTimer3 = screen.unpackPNG(hex``);
//% fixedInstance jres
export const progressTimer4 = screen.unpackPNG(hex``);
//% fixedInstance jres
export const progressWaterLevel0 = screen.unpackPNG(hex``);
//% fixedInstance jres
export const progressWaterLevel1 = screen.unpackPNG(hex``);
//% fixedInstance jres
export const progressWaterLevel2 = screen.unpackPNG(hex``);
//% fixedInstance jres
export const progressWaterLevel3 = screen.unpackPNG(hex``);
//% fixedInstance jres
export const systemAccept1 = screen.unpackPNG(hex``);
//% fixedInstance jres
export const systemAccept2 = screen.unpackPNG(hex``);
//% fixedInstance jres
export const systemAlert = screen.unpackPNG(hex``);
//% fixedInstance jres
export const systemBox = screen.unpackPNG(hex``);
//% fixedInstance jres
export const systemBusy0 = screen.unpackPNG(hex``);
//% fixedInstance jres
export const systemBusy1 = screen.unpackPNG(hex``);
//% fixedInstance jres
export const systemDecline1 = screen.unpackPNG(hex``);
//% fixedInstance jres
export const systemDecline2 = screen.unpackPNG(hex``);
//% fixedInstance jres
export const systemDotEmpty = screen.unpackPNG(hex``);
//% fixedInstance jres
export const systemDotFull = screen.unpackPNG(hex``);
//% fixedInstance jres
export const systemEv3small = screen.unpackPNG(hex``);
//% fixedInstance jres
export const systemPlay = screen.unpackPNG(hex``);
//% fixedInstance jres
export const systemSlider0 = screen.unpackPNG(hex``);
//% fixedInstance jres
export const systemSlider1 = screen.unpackPNG(hex``);
//% fixedInstance jres
export const systemSlider2 = screen.unpackPNG(hex``);
//% fixedInstance jres
export const systemSlider3 = screen.unpackPNG(hex``);
//% fixedInstance jres
export const systemSlider4 = screen.unpackPNG(hex``);
//% fixedInstance jres
export const systemSlider5 = screen.unpackPNG(hex``);
//% fixedInstance jres
export const systemSlider6 = screen.unpackPNG(hex``);
//% fixedInstance jres
export const systemSlider7 = screen.unpackPNG(hex``);
//% fixedInstance jres
export const systemSlider8 = screen.unpackPNG(hex``);
}

View File

@ -1,4 +1,4 @@
namespace input.internal {
namespace sensors.internal {
//% shim=pxt::unsafePollForChanges
export function unsafePollForChanges(
periodMs: number,
@ -27,30 +27,27 @@ namespace input.internal {
let analogMM: MMap
let uartMM: MMap
let devcon: Buffer
let sensors: SensorInfo[]
let autoSensors: Sensor[]
let sensorInfos: SensorInfo[]
class SensorInfo {
port: number
sensor: Sensor
sensors: Sensor[]
connType: number
devType: number
manual: boolean
constructor(p: number) {
this.port = p
this.connType = DAL.CONN_NONE
this.devType = DAL.DEVICE_TYPE_NONE
this.sensor = null
this.manual = false
this.sensors = []
}
}
function init() {
if (sensors) return
sensors = []
for (let i = 0; i < DAL.NUM_INPUTS; ++i) sensors.push(new SensorInfo(i))
autoSensors = []
if (sensorInfos) return
sensorInfos = []
for (let i = 0; i < DAL.NUM_INPUTS; ++i) sensorInfos.push(new SensorInfo(i))
devcon = output.createBuffer(DevConOff.Size)
analogMM = control.mmap("/dev/lms_analog", AnalogOff.Size, 0)
@ -64,7 +61,7 @@ namespace input.internal {
loops.pause(500)
})
for (let info_ of sensors) {
for (let info_ of sensorInfos) {
let info = info_
unsafePollForChanges(50, () => {
if (info.sensor) return info.sensor._query()
@ -90,7 +87,7 @@ namespace input.internal {
let conns = analogMM.slice(AnalogOff.InConn, DAL.NUM_INPUTS)
let numChanged = 0
for (let info of sensors) {
for (let info of sensorInfos) {
let newConn = conns[info.port]
if (newConn == info.connType)
continue
@ -117,77 +114,44 @@ namespace input.internal {
if (numChanged == 0)
return
let autos = sensors.filter(s => !s.manual)
// first free up disconnected sensors
for (let info of autos) {
if (info.sensor && info.devType == DAL.DEVICE_TYPE_NONE)
info.sensor._setPort(0)
}
for (let info of autos) {
if (!info.sensor && info.devType != DAL.DEVICE_TYPE_NONE) {
let found = false
for (let s of autoSensors) {
if (s.getPort() == 0 && s._deviceType() == info.devType) {
s._setPort(info.port + 1)
found = true
break
}
for (let si of sensorInfos) {
if (si.sensor && si.sensor._deviceType() != si.devType) {
si.sensor = null
}
if (si.devType != DAL.DEVICE_TYPE_NONE) {
// TODO figure out compiler problem when '|| null' is added here!
si.sensor = si.sensors.filter(s => s._deviceType() == si.devType)[0]
if (si.sensor == null) {
control.dmesg(`sensor not found for type=${si.devType} at ${si.port}`)
} else {
control.dmesg(`sensor connected type=${si.devType} at ${si.port}`)
si.sensor._activated()
}
if (!found)
control.dmesg(`sensor not found for type=${info.devType} at ${info.port}`)
}
}
}
export class Sensor extends control.Component {
protected port: number
protected _port: number // this is 0-based
constructor() {
constructor(port_: number) {
super()
if (!(1 <= port_ && port_ <= DAL.NUM_INPUTS))
control.panic(120)
this._port = port_ - 1
init()
this.port = -1
let tp = this._deviceType()
if (autoSensors.filter(s => s._deviceType() == tp).length == 0) {
autoSensors.push(this)
}
sensorInfos[this._port].sensors.push(this)
}
// 0 - disable, 1-4 port number
_setPort(port: number, manual = false) {
port = Math.clamp(0, 4, port | 0) - 1;
if (port == this.port) return
this.port = port
control.dmesg(`sensor set port ${port} on devtype=${this._deviceType()}`)
for (let i = 0; i < sensors.length; ++i) {
if (i != this.port && sensors[i].sensor == this) {
sensors[i].sensor = null
sensors[i].manual = false
}
}
if (this.port >= 0) {
let prev = sensors[this.port].sensor
if (prev && prev != this)
prev._setPort(0)
sensors[this.port].sensor = this
sensors[this.port].manual = manual
}
this._portUpdated()
_activated() { }
// 1-based
port() {
return this._port + 1
}
protected _portUpdated() { }
setPort(port: number) {
this._setPort(port, true)
}
getPort() {
return this.port + 1
}
isManual() {
return this.port >= 0 && sensors[this.port].manual
isActive() {
return sensorInfos[this._port].sensor == this
}
_query() {
@ -203,57 +167,127 @@ namespace input.internal {
}
export class AnalogSensor extends Sensor {
constructor() {
super()
constructor(port: number) {
super(port)
}
_readPin6() {
if (this.port < 0) return 0
return analogMM.getNumber(NumberFormat.Int16LE, AnalogOff.InPin6 + 2 * this.port)
if (!this.isActive()) return 0
return analogMM.getNumber(NumberFormat.Int16LE, AnalogOff.InPin6 + 2 * this._port)
}
}
export enum ThresholdState {
Normal = 1,
High = 2,
Low = 3,
}
export class ThresholdDetector {
public id: number;
private min: number;
private max: number;
private lowThreshold: number;
private highThreshold: number;
private level: number;
private state: ThresholdState;
constructor(id: number, min = 0, max = 100, lowThreshold = 20, highThreshold = 80) {
this.id = id;
this.min = min;
this.max = max;
this.lowThreshold = lowThreshold;
this.highThreshold = highThreshold;
this.level = Math.ceil((max - min) / 2);
this.state = ThresholdState.Normal;
}
public setLevel(level: number) {
this.level = this.clampValue(level);
if (this.level >= this.highThreshold) {
this.setState(ThresholdState.High);
}
else if (this.level <= this.lowThreshold) {
this.setState(ThresholdState.Low);
}
else {
this.setState(ThresholdState.Normal);
}
}
public setLowThreshold(value: number) {
this.lowThreshold = this.clampValue(value);
this.highThreshold = Math.max(this.lowThreshold + 1, this.highThreshold);
}
public setHighThreshold(value: number) {
this.highThreshold = this.clampValue(value);
this.lowThreshold = Math.min(this.highThreshold - 1, this.lowThreshold);
}
private clampValue(value: number) {
if (value < this.min) {
return this.min;
}
else if (value > this.max) {
return this.max;
}
return value;
}
private setState(state: ThresholdState) {
if (this.state == state) return;
this.state = state;
switch (state) {
case ThresholdState.High:
control.raiseEvent(this.id, ThresholdState.High);
break;
case ThresholdState.Low:
control.raiseEvent(this.id, ThresholdState.Low);
break;
case ThresholdState.Normal:
break;
}
}
}
export class UartSensor extends Sensor {
protected mode: number
protected realmode: number
protected mode: number // the mode user asked for
protected realmode: number // the mode the hardware is in
constructor() {
super()
constructor(port: number) {
super(port)
this.mode = 0
this.realmode = -1
}
protected _portUpdated() {
this.realmode = -1
if (this.port >= 0) {
if (this.isManual()) {
uartReset(this.port)
} else {
this.realmode = 0
}
this._setMode(this.mode)
}
_activated() {
this.realmode = 0
// uartReset(this.port) // TODO is it ever needed?
this._setMode(this.mode)
}
protected _setMode(m: number) {
//control.dmesg(`_setMode p=${this.port} m: ${this.realmode} -> ${m}`)
let v = m | 0
this.mode = v
if (this.port < 0) return
if (!this.isActive()) return
if (this.realmode != this.mode) {
this.realmode = v
setUartMode(this.port, v)
setUartMode(this._port, v)
}
}
getBytes(): Buffer {
return getUartBytes(this.port)
return getUartBytes(this.isActive() ? this._port : -1)
}
getNumber(fmt: NumberFormat, off: number) {
return getUartNumber(fmt, off, this.port)
if (!this.isActive())
return 0
return getUartNumber(fmt, off, this._port)
}
}

View File

@ -1,143 +0,0 @@
const enum IrSensorMode {
None = -1,
Proximity = 0,
Seek = 1,
RemoteControl = 2,
}
const enum IrRemoteChannel {
Ch0 = 0, // top
Ch1 = 1,
Ch2 = 2,
Ch3 = 3,
}
const enum IrRemoteButton {
None = 0x00,
CenterBeacon = 0x01,
TopLeft = 0x02,
BottomLeft = 0x04,
TopRight = 0x08,
BottomRight = 0x10,
}
namespace input {
function mapButton(v: number) {
switch (v) {
case 0: return IrRemoteButton.None
case 1: return IrRemoteButton.TopLeft
case 2: return IrRemoteButton.BottomLeft
case 3: return IrRemoteButton.TopRight
case 4: return IrRemoteButton.TopRight | IrRemoteButton.BottomRight
case 5: return IrRemoteButton.TopLeft | IrRemoteButton.TopRight
case 6: return IrRemoteButton.TopLeft | IrRemoteButton.BottomRight
case 7: return IrRemoteButton.BottomLeft | IrRemoteButton.TopRight
case 8: return IrRemoteButton.BottomLeft | IrRemoteButton.BottomRight
case 9: return IrRemoteButton.CenterBeacon
case 10: return IrRemoteButton.BottomLeft | IrRemoteButton.TopLeft
case 11: return IrRemoteButton.TopRight | IrRemoteButton.BottomRight
default: return IrRemoteButton.None
}
}
export class IrSensor extends internal.UartSensor {
private channel: IrRemoteChannel
private buttons: Button[];
constructor() {
super()
this.channel = IrRemoteChannel.Ch0
this.buttons = []
// otherwise button events won't work
this.mode = IrSensorMode.RemoteControl
for (let i = 0; i < 5; ++i) {
this.buttons.push(new Button())
}
}
button(id: IrRemoteButton) {
let num = -1
while (id) {
id >>= 1;
num++;
}
num = Math.clamp(0, this.buttons.length - 1, num)
return this.buttons[num]
}
_query() {
if (this.mode == IrSensorMode.RemoteControl)
return mapButton(this.getNumber(NumberFormat.UInt8LE, this.channel))
return 0
}
_update(prev: number, curr: number) {
for (let i = 0; i < this.buttons.length; ++i) {
let v = !!(curr & (1 << i))
this.buttons[i].update(v)
}
}
_deviceType() {
return DAL.DEVICE_TYPE_IR
}
setRemoteChannel(c: IrRemoteChannel) {
c = Math.clamp(0, 3, c | 0)
this.channel = c
this.setMode(IrSensorMode.RemoteControl)
}
setMode(m: IrSensorMode) {
this._setMode(m)
}
getDistance() {
this.setMode(IrSensorMode.Proximity)
return this.getNumber(NumberFormat.UInt8LE, 0)
}
getRemoteCommand() {
this.setMode(IrSensorMode.RemoteControl)
return this.getNumber(NumberFormat.UInt8LE, this.channel)
}
getDirectionAndDistance() {
this.setMode(IrSensorMode.Seek)
return this.getNumber(NumberFormat.UInt16LE, this.channel * 2)
}
}
//% whenUsed
export const ir: IrSensor = new IrSensor()
/**
* Remote top-left button.
*/
//% whenUsed block="remote top-left" weight=95 fixedInstance
export const remoteTopLeft = ir.button(IrRemoteButton.TopLeft)
/**
* Remote top-right button.
*/
//% whenUsed block="remote top-right" weight=95 fixedInstance
export const remoteTopRight = ir.button(IrRemoteButton.TopRight)
/**
* Remote bottom-left button.
*/
//% whenUsed block="remote bottom-left" weight=95 fixedInstance
export const remoteBottomLeft = ir.button(IrRemoteButton.BottomLeft)
/**
* Remote bottom-right button.
*/
//% whenUsed block="remote bottom-right" weight=95 fixedInstance
export const remoteBottomRight = ir.button(IrRemoteButton.BottomRight)
/**
* Remote beacon (center) button.
*/
//% whenUsed block="remote center" weight=95 fixedInstance
export const remoteCenter = ir.button(IrRemoteButton.CenterBeacon)
}

Binary file not shown.

After

Width:  |  Height:  |  Size: 5.2 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.1 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 5.1 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 2.7 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 4.9 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 4.9 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 6.1 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.2 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.8 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.9 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.5 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.7 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.7 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.8 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.6 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 3.6 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 5.6 KiB

View File

@ -6,7 +6,6 @@
#include <time.h>
#include <cstdarg>
#include <pthread.h>
#include <assert.h>
#include <unistd.h>
#include <dirent.h>
#include <signal.h>
@ -15,6 +14,8 @@
#include <errno.h>
#include <fcntl.h>
#define THREAD_DBG(...)
void *operator new(size_t size) {
return malloc(size);
}
@ -229,6 +230,8 @@ static void runAct(Thread *thr) {
disposeThread(thr);
}
static void mainThread(Thread *) {}
void setupThread(Action a, TValue arg = 0, void (*runner)(Thread *) = NULL, TValue d0 = 0,
TValue d1 = 0) {
if (runner == NULL)
@ -242,8 +245,13 @@ void setupThread(Action a, TValue arg = 0, void (*runner)(Thread *) = NULL, TVal
thr->data0 = incr(d0);
thr->data1 = incr(d1);
pthread_cond_init(&thr->waitCond, NULL);
pthread_create(&thr->pid, NULL, (void *(*)(void *))runner, thr);
pthread_detach(thr->pid);
if (runner == mainThread) {
thr->pid = pthread_self();
} else {
pthread_create(&thr->pid, NULL, (void *(*)(void *))runner, thr);
THREAD_DBG("setup thread: %p (pid %p)", thr, thr->pid);
pthread_detach(thr->pid);
}
}
void runInBackground(Action a) {
@ -263,21 +271,26 @@ void runForever(Action a) {
}
void waitForEvent(int source, int value) {
THREAD_DBG("waitForEv: %d %d", source, value);
auto self = pthread_self();
for (auto t = allThreads; t; t = t->next) {
THREAD_DBG("t: %p", t);
if (t->pid == self) {
pthread_mutex_lock(&eventMutex);
t->waitSource = source;
t->waitValue = value;
stopUser();
// spourious wake ups may occur they say
while (t->waitSource) {
pthread_cond_wait(&t->waitCond, &eventMutex);
}
pthread_mutex_unlock(&eventMutex);
startUser();
return;
}
}
assert(0);
DMESG("current thread not registered!");
target_panic(901);
}
static void dispatchEvent(Event &e) {
@ -340,7 +353,8 @@ void raiseEvent(int id, int event) {
auto e = mkEvent(id, event);
pthread_mutex_lock(&eventMutex);
if (eventTail == NULL) {
assert(eventHead == NULL);
if (eventHead != NULL)
target_panic(902);
eventHead = eventTail = e;
} else {
eventTail->next = e;
@ -350,7 +364,8 @@ void raiseEvent(int id, int event) {
pthread_mutex_unlock(&eventMutex);
}
void registerWithDal(int id, int event, Action a) {
void registerWithDal(int id, int event, Action a, int flags) {
// TODO support flags
setBinding(id, event, a);
}
@ -464,6 +479,7 @@ void initRuntime() {
pthread_t disp;
pthread_create(&disp, NULL, evtDispatcher, NULL);
pthread_detach(disp);
setupThread(0, 0, mainThread);
target_init();
screen_init();
startUser();
@ -505,4 +521,4 @@ void dmesg(const char *format, ...) {
fflush(dmesgFile);
fdatasync(fileno(dmesgFile));
}
}
} // namespace pxt

View File

@ -1,4 +1,9 @@
//% weight=100
namespace brick {
}
//% color="#B4009E" weight=98 icon="\uf192"
namespace input {
//% groups='["Ultrasonic Sensor", "Touch Sensor", "Color Sensor", "Infrared Sensor", "Remote Infrared Beacon", "Gyro Sensor"]'
namespace sensors {
}

View File

@ -1,8 +1,13 @@
enum Output {
//% block="A"
A = 0x01,
//% block="B"
B = 0x02,
//% block="C"
C = 0x04,
//% block="D"
D = 0x08,
//% block="All"
ALL = 0x0f
}
@ -12,10 +17,9 @@ enum OutputType {
MiniTacho = 8,
}
namespace output {
namespace motors {
let pwmMM: MMap
let motorMM: MMap
let currentSpeed: number[] = []
const enum MotorDataOff {
TachoCounts = 0, // int32
@ -31,13 +35,7 @@ namespace output {
if (!pwmMM) control.fail("no PWM file")
motorMM = control.mmap("/dev/lms_motor", MotorDataOff.Size * DAL.NUM_OUTPUTS, 0)
stop(Output.ALL)
currentSpeed[Output.A] = -1;
currentSpeed[Output.B] = -1;
currentSpeed[Output.C] = -1;
currentSpeed[Output.D] = -1;
currentSpeed[Output.ALL] = -1;
resetMotors()
let buf = output.createBuffer(1)
buf[0] = DAL.opProgramStart
@ -55,88 +53,197 @@ namespace output {
}
function mkCmd(out: Output, cmd: number, addSize: number) {
let b = createBuffer(2 + addSize)
const b = output.createBuffer(2 + addSize)
b.setNumber(NumberFormat.UInt8LE, 0, cmd)
b.setNumber(NumberFormat.UInt8LE, 1, out)
return b
}
/**
* Turn a motor on for a specified number of milliseconds.
* @param out the output connection that the motor is connected to
* @param ms the number of milliseconds to turn the motor on, eg: 500
* @param useBrake whether or not to use the brake, defaults to false
*/
//% blockId=output_turn block="turn motor %out| on for %ms|milliseconds"
//% weight=100 group="Motors"
export function turn(out: Output, ms: number, useBrake = false) {
// TODO: use current power / speed configuration
output.step(out, {
speed: 100,
step1: 0,
step2: ms,
step3: 0,
useSteps: false,
useBrake: useBrake
})
function resetMotors() {
reset(Output.ALL)
}
/**
* Switch the motor on or off.
* @param out the output connection that the motor is connected to
* @param on 1 to turn the motor on, 0 to turn it off
* Stops all motors
*/
//% blockId=output_switch block="turn motor %out|%on"
//% weight=90 group="Motors"
//% on.fieldEditor="toggle"
export function switchMotor(out: Output, on: number, useBrake = false) {
if (on == 0) {
output.stop(out, useBrake);
} else {
output.start(out);
//% blockId=motorStopAll block="stop all `icons.motorLarge`"
//% weight=10 group="Motors" blockGap=8
export function stopAllMotors() {
const b = mkCmd(Output.ALL, DAL.opOutputStop, 0)
writePWM(b)
}
//% fixedInstances
export class Motor extends control.Component {
private port: Output;
private large: boolean;
private brake: boolean;
constructor(port: Output, large: boolean) {
super();
this.port = port;
this.large = large;
this.brake = false;
}
}
/**
* Turn motor off.
* @param out the output connection that the motor is connected to
*/
//% blockId=output_stop block="turn motor %out|off"
//% weight=90 group="Motors"
//% deprecated=1
export function stop(out: Output, useBrake = false) {
let b = mkCmd(out, DAL.opOutputStop, 1)
b.setNumber(NumberFormat.UInt8LE, 2, useBrake ? 1 : 0)
writePWM(b)
}
/**
* Sets the motor power level from ``-100`` to ``100``.
* @param motor the output connection that the motor is connected to
* @param power the power from ``100`` full forward to ``-100`` full backward, eg: 50
*/
//% blockId=motorSetPower block="power `icons.motorLarge` %motor|to %power|%"
//% weight=99 group="Motors" blockGap=8
//% power.min=-100 power.max=100
power(power: number) {
power = Math.clamp(-100, 100, power >> 0);
/**
* Turn motor on.
* @param out the output connection that the motor is connected to
*/
//% blockId=output_start block="turn motor %out|on"
//% weight=95 group="Motors"
//% deprecated=1
export function start(out: Output) {
if (currentSpeed[out] == -1) setSpeed(out, 50)
let b = mkCmd(out, DAL.opOutputStart, 0)
writePWM(b)
}
export function reset(out: Output) {
let b = mkCmd(out, DAL.opOutputReset, 0)
writePWM(b)
}
export function clearCount(out: Output) {
let b = mkCmd(out, DAL.opOutputClearCount, 0)
writePWM(b)
for (let i = 0; i < DAL.NUM_OUTPUTS; ++i) {
if (out & (1 << i)) {
motorMM.setNumber(NumberFormat.Int32LE, i * MotorDataOff.Size + MotorDataOff.TachoSensor, 0)
// per LEGO: call it power, use speed
const b = mkCmd(this.port, DAL.opOutputSpeed, 1)
b.setNumber(NumberFormat.Int8LE, 2, power)
writePWM(b)
if (power) {
const b = mkCmd(this.port, DAL.opOutputStart, 0)
writePWM(b);
} else {
this.stop();
}
}
/**
* Moves the motor by a number of degrees
* @param degrees the angle to turn the motor
* @param angle the degrees to rotate, eg: 360
* @param power the power from ``100`` full forward to ``-100`` full backward, eg: 50
*/
//% blockId=motorMove block="move `icons.motorLarge` %motor|by %angle|degrees at %power|%"
//% weight=98 group="Motors" blockGap=8
//% power.min=-100 power.max=100
move(angle: number, power: number) {
angle = angle >> 0;
power = Math.clamp(-100, 100, power >> 0);
step(this.port, {
speed: power,
step1: 0,
step2: angle,
step3: 0,
useSteps: true,
useBrake: this.brake
})
}
/**
* Stops the motor
*/
//% blockId=motorStop block="stop `icons.motorLarge` %motor"
//% weight=97 group="Motors"
stop() {
const b = mkCmd(this.port, DAL.opOutputStop, 1)
b.setNumber(NumberFormat.UInt8LE, 2, this.brake ? 1 : 0)
writePWM(b);
}
/**
* Sets the automatic brake on or off when the motor is off
* @param brake a value indicating if the motor should break when off
*/
//% blockId=outputMotorSetBrakeMode block="set `icons.motorLarge` %motor|brake %brake"
//% brake.fieldEditor=toggleonoff
//% weight=60 group="Motors" blockGap=8
setBrake(brake: boolean) {
this.brake = brake;
}
/**
* Reverses the motor polarity
*/
//% blockId=motorSetReversed block="set `icons.motorLarge` %motor|reversed %reversed"
//% reversed.fieldEditor=toggleonoff
//% weight=59 group="Motors"
setReversed(reversed: boolean) {
const b = mkCmd(this.port, DAL.opOutputPolarity, 1)
b.setNumber(NumberFormat.Int8LE, 2, reversed ? -1 : 1);
writePWM(b)
}
/**
* Gets motor actual speed.
* @param motor the port which connects to the motor
*/
//% blockId=motorSpeed block="`icons.motorLarge` %motor|speed"
//% weight=72 group="Motors" blockGap=8
speed(): number {
return getMotorData(this.port).actualSpeed;
}
/**
* Gets motor step count.
* @param motor the port which connects to the motor
*/
//% blockId=motorCount block="`icons.motorLarge` %motor|count"
//% weight=71 group="Motors" blockGap=8
count(): number {
return getMotorData(this.port).count;
}
/**
* Gets motor tacho count.
* @param motor the port which connects to the motor
*/
//% blockId=motorTachoCount block="`icons.motorLarge` %motor|tacho count"
//% weight=70 group="Motors"
tachoCount(): number {
return getMotorData(this.port).tachoCount;
}
/**
* Clears the motor count
*/
clearCount() {
const b = mkCmd(this.port, DAL.opOutputClearCount, 0)
writePWM(b)
for (let i = 0; i < DAL.NUM_OUTPUTS; ++i) {
if (this.port & (1 << i)) {
motorMM.setNumber(NumberFormat.Int32LE, i * MotorDataOff.Size + MotorDataOff.TachoSensor, 0)
}
}
}
/**
* Resets the motor.
*/
reset() {
reset(this.port);
}
}
//% whenUsed fixedInstance block="large A"
export const largeMotorA = new Motor(Output.A, true);
//% whenUsed fixedInstance block="large B"
export const largeMotorB = new Motor(Output.B, true);
//% whenUsed fixedInstance block="large C"
export const largeMotorC = new Motor(Output.C, true);
//% whenUsed fixedInstance block="large D"
export const largeMotorD = new Motor(Output.D, true);
//% whenUsed fixedInstance block="medium A"
export const mediumMotorA = new Motor(Output.A, false);
//% whenUsed fixedInstance block="medium B"
export const mediumMotorB = new Motor(Output.B, false);
//% whenUsed fixedInstance block="medium C"
export const mediumMotorC = new Motor(Output.C, false);
//% whenUsed fixedInstance block="medium D"
export const mediumMotorD = new Motor(Output.D, false);
function reset(out: Output) {
let b = mkCmd(out, DAL.opOutputReset, 0)
writePWM(b)
}
function outOffset(out: Output) {
@ -147,14 +254,14 @@ namespace output {
return 0
}
export interface MotorData {
interface MotorData {
actualSpeed: number; // -100..+100
tachoCount: number;
count: number;
}
// only a single output at a time
export function getMotorData(out: Output): MotorData {
function getMotorData(out: Output): MotorData {
let buf = motorMM.slice(outOffset(out), MotorDataOff.Size)
return {
actualSpeed: buf.getNumber(NumberFormat.Int8LE, MotorDataOff.Speed),
@ -163,52 +270,7 @@ namespace output {
}
}
/**
* Get motor speed.
* @param out the output connection that the motor is connected to
*/
//% blockId=output_getCurrentSpeed block="motor %out|speed"
//% weight=70 group="Motors"
export function getCurrentSpeed(out: Output) {
return getMotorData(out).actualSpeed;
}
/**
* Set motor speed.
* @param out the output connection that the motor is connected to
* @param speed the desired speed to use. eg: 100
*/
//% blockId=output_setSpeed block="set motor %out| speed to %speed"
//% weight=81 group="Motors"
//% speed.min=-100 speed.max=100
export function setSpeed(out: Output, speed: number) {
currentSpeed[out] = speed;
let b = mkCmd(out, DAL.opOutputSpeed, 1)
b.setNumber(NumberFormat.Int8LE, 2, Math.clamp(-100, 100, speed))
writePWM(b)
}
/**
* Set motor power.
* @param out the output connection that the motor is connected to
* @param power the desired power to use. eg: 100
*/
//% blockId=output_setPower block="set motor %out| power to %power"
//% weight=80 group="Motors"
//% power.min=-100 power.max=100
export function setPower(out: Output, power: number) {
let b = mkCmd(out, DAL.opOutputPower, 1)
b.setNumber(NumberFormat.Int8LE, 2, Math.clamp(-100, 100, power))
writePWM(b)
}
export function setPolarity(out: Output, polarity: number) {
let b = mkCmd(out, DAL.opOutputPolarity, 1)
b.setNumber(NumberFormat.Int8LE, 2, Math.clamp(-1, 1, polarity))
writePWM(b)
}
export interface StepOptions {
interface StepOptions {
power?: number;
speed?: number; // either speed or power has to be present
step1: number;
@ -218,7 +280,7 @@ namespace output {
useBrake?: boolean;
}
export function step(out: Output, opts: StepOptions) {
function step(out: Output, opts: StepOptions) {
let op = opts.useSteps ? DAL.opOutputStepSpeed : DAL.opOutputTimeSpeed
let speed = opts.speed
if (speed == null) {

130
libs/core/png.cpp Normal file
View File

@ -0,0 +1,130 @@
#include "pxt.h"
#include "ev3const.h"
#include <zlib.h>
#include <stdlib.h>
struct PNGHeader {
uint8_t pngHeader[8];
uint32_t lenIHDR;
uint8_t IHDR[4];
uint32_t width;
uint32_t height;
uint8_t bitDepth;
uint8_t colorType;
uint8_t compressionMethod;
uint8_t filterMethod;
uint8_t interlaceMethod;
uint32_t hdCRC;
uint32_t lenIDAT;
uint8_t IDAT[4];
} __attribute__((packed));
namespace screen {
static uint32_t swap(uint32_t num) {
return ((num >> 24) & 0xff) | ((num << 8) & 0xff0000) | ((num >> 8) & 0xff00) |
((num << 24) & 0xff000000);
}
static uint8_t revbits(uint8_t v) {
v = (v & 0xf0) >> 4 | (v & 0x0f) << 4;
v = (v & 0xcc) >> 2 | (v & 0x33) << 2;
v = (v & 0xaa) >> 1 | (v & 0x55) << 1;
return v;
}
/** Decompresses a 1-bit gray scale PNG image to image format. */
//%
Image unpackPNG(Buffer png) {
if (!png) {
DMESG("PNG: Missing image");
return NULL;
}
if (png->length < sizeof(PNGHeader) + 4) {
DMESG("PNG: File too small");
return NULL;
}
if (memcmp(png->data, "\x89PNG\r\n\x1A\n", 8) != 0) {
DMESG("PNG: Invalid header");
return NULL;
}
struct PNGHeader hd;
memcpy(&hd, png->data, sizeof(hd));
if (memcmp(hd.IHDR, "IHDR", 4) != 0) {
DMESG("PNG: missing IHDR");
return NULL;
}
hd.lenIHDR = swap(hd.lenIHDR);
hd.width = swap(hd.width);
hd.height = swap(hd.height);
hd.lenIDAT = swap(hd.lenIDAT);
if (hd.lenIHDR != 13) {
DMESG("PNG: bad IHDR len");
return NULL;
}
if (hd.bitDepth != 1 || hd.colorType != 0 || hd.compressionMethod != 0 ||
hd.filterMethod != 0 || hd.interlaceMethod != 0) {
DMESG("PNG: not 1-bit grayscale");
return NULL;
}
if (memcmp(hd.IDAT, "IDAT", 4) != 0) {
DMESG("PNG: missing IDAT");
return NULL;
}
if (hd.lenIDAT + sizeof(hd) >= png->length) {
DMESG("PNG: buffer too short");
return NULL;
}
if (hd.width > 300 || hd.height > 300) {
DMESG("PNG: too big");
return NULL;
}
uint32_t byteW = (hd.width + 7) >> 3;
uint32_t expSize = (byteW + 1) * hd.height;
unsigned long sz = expSize;
uint8_t *tmp = (uint8_t *)malloc(sz);
int code = uncompress(tmp, &sz, png->data + sizeof(hd), hd.lenIDAT);
if (code != 0) {
DMESG("PNG: zlib failed: %d", code);
free(tmp);
return NULL;
}
if (sz != expSize) {
DMESG("PNG: invalid compressed size");
free(tmp);
return NULL;
}
Buffer res = mkBuffer(NULL, 2 + byteW * hd.height);
res->data[0] = 0xf0;
res->data[1] = hd.width;
uint8_t *dst = res->data + 2;
uint8_t *src = tmp;
uint8_t lastMask = (1 << (hd.width & 7)) - 1;
if (lastMask == 0)
lastMask = 0xff;
for (uint32_t i = 0; i < hd.height; ++i) {
if (*src++ != 0) {
DMESG("PNG: unsupported filter");
free(tmp);
decrRC(res);
return NULL;
}
for (uint32_t j = 0; j < byteW; ++j) {
*dst = ~revbits(*src++);
if (j == byteW - 1) {
*dst &= lastMask;
}
dst++;
}
}
free(tmp);
return res;
}
}

View File

@ -7,6 +7,8 @@ namespace pxt {
void raiseEvent(int id, int event);
int allocateNotifyEvent();
void sleep_core_us(uint64_t us);
void startUser();
void stopUser();
class Button;
typedef Button *Button_;
@ -27,6 +29,10 @@ class MMap : public RefObject {
extern volatile bool paniced;
// Buffer, Sound, and Image share representation.
typedef Buffer Image;
typedef Buffer Sound;
}
#define DEVICE_EVT_ANY 0

View File

@ -11,20 +11,19 @@
"mmap.cpp",
"control.cpp",
"buttons.ts",
"png.cpp",
"screen.cpp",
"screen.ts",
"output.cpp",
"output.ts",
"core.ts",
"input.ts",
"ir.ts",
"color.ts",
"gyro.ts",
"ultrasonic.ts",
"touch.ts",
"shims.d.ts",
"enums.d.ts",
"dal.d.ts",
"images.ts",
"images.jres",
"icons.jres",
"ns.ts"
],
"testFiles": [

View File

@ -130,82 +130,6 @@ void _blitLine(int xw, int y, Buffer buf, Draw mode) {
blitLineCore(XX(xw), y, YY(xw), buf->data, mode);
}
static uint8_t ones[] = {
0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
};
bool isValidIcon(Buffer buf) {
return buf->length >= 3 && buf->data[0] == 0xf0;
}
static const uint8_t bitdouble[] = {
0x00, 0x03, 0x0c, 0x0f, 0x30, 0x33, 0x3c, 0x3f, 0xc0, 0xc3, 0xcc, 0xcf, 0xf0, 0xf3, 0xfc, 0xff,
};
/** Double size of an icon. */
//%
Buffer doubleIcon(Buffer buf) {
if (!isValidIcon(buf))
return NULL;
int w = buf->data[1];
if (w > 126)
return NULL;
int bw = PIX2BYTES(w);
int h = (buf->length - 2) / bw;
int bw2 = PIX2BYTES(w * 2);
Buffer out = mkBuffer(NULL, 2 + bw2 * h * 2);
out->data[0] = 0xf0;
out->data[1] = w * 2;
uint8_t *src = buf->data + 2;
uint8_t *dst = out->data + 2;
for (int i = 0; i < h; ++i) {
for (int jj = 0; jj < 2; ++jj) {
auto p = src;
for (int j = 0; j < bw; ++j) {
*dst++ = bitdouble[*p & 0xf];
*dst++ = bitdouble[*p >> 4];
p++;
}
}
src += bw;
}
return out;
}
/** Draw an icon on the screen. */
//%
void drawIcon(int x, int y, Buffer buf, Draw mode) {
if (!isValidIcon(buf))
return;
if (mode & (Draw::Double | Draw::Quad)) {
buf = doubleIcon(buf);
if (mode & Draw::Quad) {
auto pbuf = buf;
buf = doubleIcon(buf);
decrRC(pbuf);
}
}
int pixwidth = buf->data[1];
int ptr = 2;
int bytewidth = PIX2BYTES(pixwidth);
pixwidth = min(pixwidth, LCD_WIDTH);
while (ptr + bytewidth <= buf->length) {
if (mode & (Draw::Clear | Draw::Xor | Draw::Transparent)) {
// no erase of background
} else {
blitLineCore(x, y, pixwidth, ones, Draw::Clear);
}
blitLineCore(x, y, pixwidth, &buf->data[ptr], mode);
y++;
ptr += bytewidth;
}
if (mode & Draw::Double)
decrRC(buf);
}
/** Clear screen and reset font to normal. */
//%
void clear() {
@ -256,7 +180,7 @@ void init() {
mappedFrameBuffer = (uint8_t *)mmap(NULL, FB_SIZE, PROT_READ | PROT_WRITE, MAP_SHARED, fd, 0);
DMESG("map %p", mappedFrameBuffer);
if (mappedFrameBuffer == MAP_FAILED) {
target_panic(111);
target_panic(903);
}
clear();
@ -309,11 +233,23 @@ extern "C" void drawPanic(int code) {
updateLCD();
int fd = open("/dev/lms_ui", O_RDWR);
uint8_t cmd[] = { 48 + 5, 0 };
uint8_t cmd[] = {48 + 5, 0};
write(fd, cmd, 2);
close(fd);
}
bool isValidImage(Buffer buf) {
return buf != NULL && buf->length >= 3 && buf->data[0] == 0xf0;
}
/** Makes an image bound to a buffer. */
//%
Image imageOf(Buffer buf) {
if (!isValidImage(buf))
return NULL;
incrRC(buf);
return buf;
}
}
namespace pxt {
@ -321,3 +257,105 @@ void screen_init() {
screen::init();
}
}
//% fixedInstances
namespace ImageMethods {
using namespace screen;
static const uint8_t bitdouble[] = {
0x00, 0x03, 0x0c, 0x0f, 0x30, 0x33, 0x3c, 0x3f, 0xc0, 0xc3, 0xcc, 0xcf, 0xf0, 0xf3, 0xfc, 0xff,
};
static uint8_t ones[] = {
0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
};
/** Returns the underlaying Buffer object. */
//% property
Buffer buffer(Image ic) {
incrRC(ic);
return ic;
}
/** Returns the width of an image. */
//% property
int width(Image ic) {
if (!isValidImage(ic))
return 0;
return ic->data[1];
}
/** Returns the height of an image. */
//% property
int height(Image ic) {
if (!isValidImage(ic))
return 0;
int bw = PIX2BYTES(ic->data[1]);
return (ic->length - 2) / bw;
}
/** Double size of an image. */
//%
Image doubled(Image buf) {
if (!isValidImage(buf))
return NULL;
int w = buf->data[1];
if (w > 126)
return NULL;
int bw = PIX2BYTES(w);
int h = (buf->length - 2) / bw;
int bw2 = PIX2BYTES(w * 2);
Buffer out = mkBuffer(NULL, 2 + bw2 * h * 2);
out->data[0] = 0xf0;
out->data[1] = w * 2;
uint8_t *src = buf->data + 2;
uint8_t *dst = out->data + 2;
for (int i = 0; i < h; ++i) {
for (int jj = 0; jj < 2; ++jj) {
auto p = src;
for (int j = 0; j < bw; ++j) {
*dst++ = bitdouble[*p & 0xf];
*dst++ = bitdouble[*p >> 4];
p++;
}
}
src += bw;
}
return out;
}
/** Draw an image on the screen. */
//%
void draw(Image buf, int x, int y, Draw mode) {
if (!isValidImage(buf))
return;
if (mode & (Draw::Double | Draw::Quad)) {
buf = doubled(buf);
if (mode & Draw::Quad) {
auto pbuf = buf;
buf = doubled(buf);
decrRC(pbuf);
}
}
int pixwidth = buf->data[1];
int ptr = 2;
int bytewidth = PIX2BYTES(pixwidth);
pixwidth = min(pixwidth, LCD_WIDTH);
while (ptr + bytewidth <= buf->length) {
if (mode & (Draw::Clear | Draw::Xor | Draw::Transparent)) {
// no erase of background
} else {
blitLineCore(x, y, pixwidth, ones, Draw::Clear);
}
blitLineCore(x, y, pixwidth, &buf->data[ptr], mode);
y++;
ptr += bytewidth;
}
if (mode & (Draw::Double | Draw::Quad))
decrRC(buf);
}
}

View File

@ -1,4 +1,4 @@
namespace screen {
namespace brick {
//% shim=screen::_setPixel
function _setPixel(p0: uint32, p1: uint32, mode: Draw): void { }
@ -27,7 +27,7 @@ namespace screen {
currFont = f
}
export const heart = hex`f007 367f7f3e1c08`
export const heart = screen.imageOf(hex`f007 367f7f3e1c08`)
export function defaultFont(): Font {
return {
@ -78,13 +78,21 @@ namespace screen {
}
}
export function setPixel(x: number, y: number, mode = Draw.Normal) {
/**
* Sets a pixel on or off
* @param on a value indicating if the pixel should be on or off
* @param x the starting position's x coordinate, eg: 0
* @param y the starting position's x coordinate, eg: 0
*/
//% blockId=screen_setpixel block="`icons.brickDisplay` set pixel %on| at x: %x| y: %y"
//% weight=98 group="Screen"
//% x.min=0 x.max=178 y.min=0 y.max=128 on.fieldEditor=toggleonoff
export function setPixel(on: boolean, x: number, y: number) {
x |= 0
y |= 0
if (0 <= x && x < DAL.LCD_WIDTH && 0 <= y && y < DAL.LCD_HEIGHT)
_setPixel(x, y, mode)
_setPixel(x, y, on ? Draw.Normal : Draw.Clear)
}
/**
* Show text on the screen.
@ -92,10 +100,10 @@ namespace screen {
* @param x the starting position's x coordinate, eg: 0
* @param y the starting position's x coordinate, eg: 0
*/
//% blockId=screen_drawText block="print %text| at x: %x| y: %y"
//% weight=99 group="Screen" blockNamespace=output inlineInputMode="inline"
//% blockId=screen_print block="`icons.brickDisplay` print %text| at x: %x| y: %y"
//% weight=99 group="Screen" inlineInputMode="inline" blockGap=8
//% x.min=0 x.max=178 y.min=0 y.max=128
export function drawText(text: string, x: number, y: number, mode = Draw.Normal) {
export function print(text: string, x: number, y: number, mode = Draw.Normal) {
x |= 0
y |= 0
if (!currFont) currFont = defaultFont()
@ -103,10 +111,11 @@ namespace screen {
let cp = 0
let byteWidth = (currFont.charWidth + 7) >> 3
let charSize = byteWidth * currFont.charHeight
let iconBuf = output.createBuffer(2 + charSize)
let imgBuf = output.createBuffer(2 + charSize)
let double = (mode & Draw.Quad) ? 4 : (mode & Draw.Double) ? 2 : 1
iconBuf[0] = 0xf0
iconBuf[1] = currFont.charWidth
imgBuf[0] = 0xf0
imgBuf[1] = currFont.charWidth
let img = screen.imageOf(imgBuf)
while (cp < text.length) {
let ch = text.charCodeAt(cp++)
if (ch == 10) {
@ -115,15 +124,42 @@ namespace screen {
}
if (ch < 32) continue
let idx = (ch - currFont.firstChar) * charSize
if (idx < 0 || idx + iconBuf.length - 1 > currFont.data.length)
iconBuf.fill(0, 2)
if (idx < 0 || idx + imgBuf.length - 1 > currFont.data.length)
imgBuf.fill(0, 2)
else
iconBuf.write(2, currFont.data.slice(idx, charSize))
drawIcon(x, y, iconBuf, mode)
imgBuf.write(2, currFont.data.slice(idx, charSize))
img.draw(x, y, mode)
x += double * currFont.charWidth
}
}
/**
* Shows an image on screen
* @param image image to draw
*/
//% blockId=screen_show_image block="`icons.brickDisplay` show image %image=scren_image_picker"
//% weight=95 group="Screen" blockGap=8
export function showImage(image: Image, delay: number = 400) {
if (!image) return;
image.draw(0, 0, Draw.Normal);
delay = Math.max(0, delay);
if (delay > 0)
loops.pause(delay);
}
/**
* An image
* @param image the image
*/
//% blockId=scren_image_picker block="%image" shim=TD_ID
//% image.fieldEditor="imagedropdown"
//% image.fieldOptions.columns=6
//% image.fieldOptions.hasSearchBar=true
//% group="Screen" weight=0 blockHidden=1
export function _imagePicker(image: Image): Image {
return image;
}
export function drawRect(x: number, y: number, w: number, h: number, mode = Draw.Normal) {
x |= 0;
y |= 0;

41
libs/core/shims.d.ts vendored
View File

@ -72,17 +72,44 @@ declare namespace serial {
}
declare namespace screen {
/** Double size of an icon. */
//% shim=screen::doubleIcon
function doubleIcon(buf: Buffer): Buffer;
/** Draw an icon on the screen. */
//% shim=screen::drawIcon
function drawIcon(x: int32, y: int32, buf: Buffer, mode: Draw): void;
/** Decompresses a 1-bit gray scale PNG image to image format. */
//% shim=screen::unpackPNG
function unpackPNG(png: Buffer): Image;
}
declare namespace screen {
/** Clear screen and reset font to normal. */
//% shim=screen::clear
function clear(): void;
/** Makes an image bound to a buffer. */
//% shim=screen::imageOf
function imageOf(buf: Buffer): Image;
}
//% fixedInstances
declare interface Image {
/** Returns the underlaying Buffer object. */
//% property shim=ImageMethods::buffer
buffer: Buffer;
/** Returns the width of an image. */
//% property shim=ImageMethods::width
width: int32;
/** Returns the height of an image. */
//% property shim=ImageMethods::height
height: int32;
/** Double size of an image. */
//% shim=ImageMethods::doubled
doubled(): Image;
/** Draw an image on the screen. */
//% shim=ImageMethods::draw
draw(x: int32, y: int32, mode: Draw): void;
}
declare namespace output {

View File

@ -1,48 +1,48 @@
screen.clear()
screen.drawText("PXT!", 10, 30, Draw.Quad)
screen.print("PXT!", 10, 30, Draw.Quad)
screen.drawRect(40, 40, 20, 10, Draw.Fill)
output.setLights(LightsPattern.Orange)
motors.setStatusLight(LightsPattern.Orange)
screen.drawIcon(100, 50, screen.doubleIcon(screen.heart), Draw.Double | Draw.Transparent)
screen.heart.doubled().draw(100, 50, Draw.Double | Draw.Transparent)
input.buttonEnter.onEvent(ButtonEvent.Click, () => {
sensors.buttonEnter.onEvent(ButtonEvent.Click, () => {
screen.clear()
})
input.buttonLeft.onEvent(ButtonEvent.Click, () => {
sensors.buttonLeft.onEvent(ButtonEvent.Click, () => {
screen.drawRect(10, 70, 20, 10, Draw.Fill)
output.setLights(LightsPattern.Red)
motors.setStatusLight(LightsPattern.Red)
screen.setFont(screen.microbitFont())
})
input.buttonRight.onEvent(ButtonEvent.Click, () => {
screen.drawText("Right!", 10, 60)
sensors.buttonRight.onEvent(ButtonEvent.Click, () => {
screen.print("Right!", 10, 60)
})
input.buttonDown.onEvent(ButtonEvent.Click, () => {
screen.drawText("Down! ", 10, 60)
sensors.buttonDown.onEvent(ButtonEvent.Click, () => {
screen.print("Down! ", 10, 60)
})
input.buttonUp.onEvent(ButtonEvent.Click, () => {
screen.drawText("Up! ", 10, 60)
sensors.buttonUp.onEvent(ButtonEvent.Click, () => {
screen.print("Up! ", 10, 60)
})
let num = 0
input.touchSensor.onEvent(ButtonEvent.Click, () => {
screen.drawText("Click! " + num, 10, 60)
sensors.touchSensor1.onEvent(TouchSensorEvent.Bumped, () => {
screen.print("Click! " + num, 10, 60)
num++
})
input.remoteTopLeft.onEvent(ButtonEvent.Click, () => {
screen.drawText("TOPLEFT " + num, 10, 60)
sensors.remoteButtonTopLeft.onEvent(ButtonEvent.Click, () => {
screen.print("TOPLEFT " + num, 10, 60)
num++
})
input.remoteTopRight.onEvent(ButtonEvent.Down, () => {
screen.drawText("TOPRIGH " + num, 10, 60)
sensors.remoteButtonTopRight.onEvent(ButtonEvent.Down, () => {
screen.print("TOPRIGH " + num, 10, 60)
num++
})
@ -54,7 +54,7 @@ loops.forever(() => {
/*
loops.forever(() => {
let v = input.color.getColor()
screen.drawText(10, 60, v + " ")
screen.print(10, 60, v + " ")
loops.pause(200)
})
*/
*/

View File

@ -1,30 +0,0 @@
namespace input {
//% fixedInstances
export class TouchSensor extends internal.AnalogSensor {
button: Button;
constructor() {
super()
this.button = new Button()
}
_query() {
return this._readPin6() > 2500 ? 1 : 0
}
_update(prev: number, curr: number) {
this.button.update(curr > 0)
}
_deviceType() {
return DAL.DEVICE_TYPE_TOUCH
}
}
//% whenUsed
export const touchSensorImpl: TouchSensor = new TouchSensor()
//% whenUsed block="touch sensor" weight=95 fixedInstance
export const touchSensor: Button = touchSensorImpl.button
}

View File

@ -1,22 +0,0 @@
namespace input {
export class UltraSonicSensor extends internal.UartSensor {
constructor() {
super()
}
_deviceType() {
return DAL.DEVICE_TYPE_ULTRASONIC
}
/** Get distance in mm */
getDistance() {
// it supposedly also has an inch mode, but we stick to mm
this._setMode(0)
return this.getNumber(NumberFormat.UInt16LE, 0) & 0x0fff
}
}
//% whenUsed
export const ultrasonic: UltraSonicSensor = new UltraSonicSensor()
}

View File

@ -1,11 +1,16 @@
//% color="#D42878"
namespace input {
//% color="#00A5C8" weight=100
//% groups='["Light", "Buttons", "Screen"]'
namespace brick {
}
//% color="#D42878" weight=95
namespace sensors {
}
//% color="#8AC044" weight=90 icon="\uf185"
//% groups='["Lights", "Screen", "Motors"]'
namespace output {
namespace motors {
}
//% color="#DF5014" weight=80

View File

@ -8,7 +8,11 @@
"dependencies": {
"base": "file:../base",
"core": "file:../core",
"music": "file:../music"
"music": "file:../music",
"color-sensor": "file:../color-sensor",
"touch-sensor": "file:../touch-sensor",
"ultrasonic-sensor": "file:../ultrasonic-sensor",
"gyro-sensor": "file:../gyro-sensor"
},
"public": true
}

View File

@ -0,0 +1,3 @@
# Gyro Sensor
The library to interact with the Gyro Sensor.

View File

@ -0,0 +1,4 @@
{
"sensors.GyroSensor.angle": "Get the current angle from the gyroscope.",
"sensors.GyroSensor.rate": "Get the current rotation rate from the gyroscope."
}

View File

@ -0,0 +1,10 @@
{
"sensors.GyroSensor.angle|block": "`icons.gyroSensor` %sensor|angle",
"sensors.GyroSensor.rate|block": "`icons.gyroSensor` %sensor|rotation rate",
"sensors.gyro1|block": "1",
"sensors.gyro2|block": "2",
"sensors.gyro3|block": "3",
"sensors.gyro4|block": "4",
"{id:category}Sensors": "Sensors",
"{id:group}Gyro Sensor": "Gyro Sensor"
}

70
libs/gyro-sensor/gyro.ts Normal file
View File

@ -0,0 +1,70 @@
const enum GyroSensorMode {
None = -1,
Angle = 0,
Rate = 1,
}
namespace sensors {
//% fixedInstances
export class GyroSensor extends internal.UartSensor {
constructor(port: number) {
super(port)
}
_deviceType() {
return DAL.DEVICE_TYPE_GYRO
}
setMode(m: GyroSensorMode) {
this._setMode(m)
}
/**
* Get the current angle from the gyroscope.
* @param sensor the gyroscope to query the request
*/
//% help=input/gyro/angle
//% block="`icons.gyroSensor` %sensor|angle"
//% blockId=gyroGetAngle
//% parts="gyroscope"
//% sensor.fieldEditor="imagedropdown"
//% sensor.fieldOptions.columns=4
//% blockNamespace=sensors
//% weight=65 blockGap=8
//% group="Gyro Sensor"
angle(): number {
this.setMode(GyroSensorMode.Angle)
return this.getNumber(NumberFormat.Int16LE, 0)
}
/**
* Get the current rotation rate from the gyroscope.
* @param sensor the gyroscope to query the request
*/
//% help=input/gyro/rate
//% block="`icons.gyroSensor` %sensor|rotation rate"
//% blockId=gyroGetRate
//% parts="gyroscope"
//% sensor.fieldEditor="imagedropdown"
//% sensor.fieldOptions.columns=4
//% blockNamespace=sensors
//% weight=65 blockGap=8
//% group="Gyro Sensor"
rate(): number {
this.setMode(GyroSensorMode.Rate)
return this.getNumber(NumberFormat.Int16LE, 0)
}
}
//% fixedInstance whenUsed block="1" jres=icons.port1
export const gyro1: GyroSensor = new GyroSensor(1)
//% fixedInstance whenUsed block="2" weight=95 jres=icons.port2
export const gyro2: GyroSensor = new GyroSensor(2)
//% fixedInstance whenUsed block="3" jres=icons.port3
export const gyro3: GyroSensor = new GyroSensor(3)
//% fixedInstance whenUsed block="4" jres=icons.port4
export const gyro4: GyroSensor = new GyroSensor(4)
}

15
libs/gyro-sensor/pxt.json Normal file
View File

@ -0,0 +1,15 @@
{
"name": "gyro-sensor",
"description": "Gyro Sensor support",
"files": [
"README.md",
"gyro.ts"
],
"testFiles": [
"test.ts"
],
"public": true,
"dependencies": {
"core": "file:../core"
}
}

0
libs/gyro-sensor/test.ts Normal file
View File

View File

@ -0,0 +1,3 @@
# Infrared sensor
The library to interact with the Infrared Sensor.

Some files were not shown because too many files have changed in this diff Show More