From 2101b03490edb3b9f18aa3e29fc57a513e0e6e3d Mon Sep 17 00:00:00 2001 From: Martin Donnelly Date: Fri, 27 May 2016 09:25:10 +0100 Subject: [PATCH] More work --- config.xml | 2 + gulpfile.js | 0 notes/notes.md | 3 + .../2.2.1/taskArtifacts/cache.properties.lock | Bin 17 -> 17 bytes .../2.2.1/taskArtifacts/fileHashes.bin | Bin 139477 -> 147035 bytes .../2.2.1/taskArtifacts/fileSnapshots.bin | Bin 4090595 -> 8174255 bytes .../2.2.1/taskArtifacts/taskArtifacts.bin | Bin 50699 -> 55150 bytes platforms/android/AndroidManifest.xml | 1 + platforms/android/android.json | 167 +- .../android/assets/www/cordova_plugins.js | 154 +- platforms/android/assets/www/css/app.css | 27 + .../android/assets/www/css/mui.custom.css | 2 +- platforms/android/assets/www/index.html | 30 +- .../js/device/CC2650/cc2650_accelerometer.js | 29 +- .../www/js/device/CC2650/cc2650_barometer.js | 50 +- .../www/js/device/CC2650/cc2650_luxometer.js | 101 +- platforms/android/assets/www/js/index.js | 509 ++- .../assets/www/js/standards/capability.js | 171 + platforms/android/assets/www/test.html | 20 +- .../android/platform_www/cordova_plugins.js | 154 +- platforms/android/res/xml/config.xml | 5 + .../ios/Sensortoy.xcodeproj/project.pbxproj | 18 + platforms/ios/Sensortoy/config.xml | 4 + platforms/ios/ios.json | 185 +- platforms/ios/platform_www/cordova_plugins.js | 176 +- platforms/ios/www/cordova_plugins.js | 176 +- platforms/ios/www/css/app.css | 27 + platforms/ios/www/index.html | 17 +- .../js/device/CC2650/cc2650_accelerometer.js | 5 + .../www/js/device/CC2650/cc2650_barometer.js | 38 +- platforms/ios/www/js/index.js | 356 +- platforms/ios/www/js/standards/capability.js | 171 + platforms/ios/www/test.html | 202 +- plugins/android.json | 3 + plugins/fetch.json | 8 + plugins/ios.json | 3 + www/css/app.css | 27 + www/css/mui.custom.css | 2 +- www/css/progress.css | 94 + www/css/ripple.css | 195 + www/fonts/Material_Icons-normal-400.woff | Bin 0 -> 58804 bytes www/fonts/Ubuntu-normal-300.woff | Bin 0 -> 42972 bytes www/fonts/Ubuntu-normal-400.woff | Bin 0 -> 38352 bytes www/fonts/Ubuntu-normal-500.woff | Bin 0 -> 34044 bytes www/fonts/Ubuntu-normal-700.woff | Bin 0 -> 33016 bytes www/fonts/Ubuntu_Condensed-normal-400.woff | Bin 0 -> 32468 bytes www/fonts/fonts.css | 41 + www/index.html | 27 +- www/js/device/CC2650/cc2650_accelerometer.js | 29 +- www/js/device/CC2650/cc2650_barometer.js | 47 +- www/js/device/CC2650/cc2650_humidity.js | 46 +- www/js/device/CC2650/cc2650_luxometer.js | 26 +- www/js/device/CC2650/cc2650_thermopile.js | 53 +- www/js/index.js | 328 +- www/js/mandecoder.js | 69 + www/js/standards/battery.js | 55 +- .../bluetooth_company_identifiers.js | 3232 +++++++++++++++++ www/js/standards/capability.js | 171 + www/libs/smoothie.js | 803 ++++ 59 files changed, 7460 insertions(+), 599 deletions(-) create mode 100644 gulpfile.js create mode 100644 www/css/progress.css create mode 100644 www/css/ripple.css create mode 100644 www/fonts/Material_Icons-normal-400.woff create mode 100644 www/fonts/Ubuntu-normal-300.woff create mode 100644 www/fonts/Ubuntu-normal-400.woff create mode 100644 www/fonts/Ubuntu-normal-500.woff create mode 100644 www/fonts/Ubuntu-normal-700.woff create mode 100644 www/fonts/Ubuntu_Condensed-normal-400.woff create mode 100644 www/fonts/fonts.css create mode 100644 www/js/mandecoder.js create mode 100644 www/js/standards/bluetooth_company_identifiers.js create mode 100644 www/libs/smoothie.js diff --git a/config.xml b/config.xml index 16cac18..ade9ca1 100644 --- a/config.xml +++ b/config.xml @@ -26,4 +26,6 @@ + + diff --git a/gulpfile.js b/gulpfile.js new file mode 100644 index 0000000..e69de29 diff --git a/notes/notes.md b/notes/notes.md index 154245a..f50ce14 100644 --- a/notes/notes.md +++ b/notes/notes.md @@ -18,3 +18,6 @@ Silicon Labs Sensor Puck google science journal + + +[https://cordova.apache.org/docs/en/latest/reference/cordova-plugin-file/](Cordova file plugin) diff --git a/platforms/android/.gradle/2.2.1/taskArtifacts/cache.properties.lock b/platforms/android/.gradle/2.2.1/taskArtifacts/cache.properties.lock index d54e870a810951836768a8f7b1b7cbd64116a878..29c55c860cc6a1e90fb1276a89176611a4fd343e 100644 GIT binary patch literal 17 WcmZQx&{6#8*tO}73?RT{@(2Jw`34OD literal 17 VcmZQx&{6#8*tO}73}A3;0suhm244UG diff --git a/platforms/android/.gradle/2.2.1/taskArtifacts/fileHashes.bin b/platforms/android/.gradle/2.2.1/taskArtifacts/fileHashes.bin index 3946df244653bf4008f4d46a8f56e5622db74422..d4ff90c1dabee212a316db9c63af5e3bbed4007d 100644 GIT binary patch delta 26669 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 E3$m<_82|tP delta 16827 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 RzXWNh=D#X0u*C1|{{jsg55)ig diff --git a/platforms/android/.gradle/2.2.1/taskArtifacts/fileSnapshots.bin b/platforms/android/.gradle/2.2.1/taskArtifacts/fileSnapshots.bin index bb3c5076d6829e7dfe5d17805bbee895417991c4..280f8437655ca42deb107d641fe807ac5559bed6 100644 GIT binary patch delta 108810 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 delta 7102 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 diff --git a/platforms/android/.gradle/2.2.1/taskArtifacts/taskArtifacts.bin b/platforms/android/.gradle/2.2.1/taskArtifacts/taskArtifacts.bin index e29395cd98fb7241ed551c64fd22b65353818281..3eaa6dd51ceb68b09a620f34c5f26cd9777d7ffc 100644 GIT binary patch delta 1069 zcmeC~VScxcd4eb-$3!tXuMQ&y1}1+7FsRW2vST3Z$|xZF0)$=A#=yWl55n$0%D}+F z1Yx&u0@<1%Huvcxsv8p*h)n(-@g9J)fK)RVHi*63^a5WQ{Ek4m=a_`ZUgq_@nl77GN z*i^2{DA1K2GkqH85}wp|>uN(eyf%XcohH0x&W=lPSatQ?arRqfZJWw98Ch=K+)%Vx zZox^$&8#i00s_t1g3t4vFs?fLCTtlwo%EwEs` zzp!FF_i~-qYyti7`GJ{0!HFy{F7B8;S+T)+^4)Tu$v>v?NO0&dFmUKF^G1B-t234N zZzx*6W8%?_$2%r7maA-@SJ}cOc&u4D!I7saYX7~NyWcNPRYgc`&a8aHsLYa+Qjl4~ zz+O>NkpX70K&f0Xj}0h1d11gh7LKC7`z9YOli2)fW-rs^#|s6;`5744`I!znC>=Zd zT7I=?rz6kj)=A&@PM#PpKlx~ZBIBjWg$-_#&lhsCs_8K zu=2XV%4rF_uRO9&DF1Mp+I>Q3;pX#OVps((hrON`pHp7l!8Uug^W_to5Yf_C>ttr! z3tZc?K=T!Ed`dV_G=WuRhT^P-GseI~bP9+MfiN@AvB;pC>GPi)>bxs8=ZbvK9-!Y8 zCdci2J$b|Oh{=r0*KZCuaDq`#HKG5yW%UcOa+Q1M?i8CG!=dc+&O!>>RtYg?Ooa27J+WWD1UKS)C^J)Z`He1$s zGN~w(h&%yl;m`$QRS;%s{n+^Q#zIrEcL&W%tG}+izj<;)lI&);mM6@cC0fK-lqV;? z;sx7M3ACXQgqij}63^G0_@s7K+nn3K_RrJX9N3}3wArzvol%6RoCBC+1b~>mgn_M~ zC^aRuV)DZ(ZMhN#j@;6ml1w1KxR9ZaftjI%fiopFsWja;KP7c?OqYy92?J|ZX>L+J qNSdvLfgh$`HzzecF}V^d%$=E+T$GxdnpcvT0~V?PWl{G0=am3Y>ZgkU delta 642 zcmaF2j=8&sd4eb->qId*wf>_F3@l6xV6gBt0|Wb82z%Ne1_rM8AhzlSM~RJ%bHyi4 zP@gO(v4W{GYV!$+X^c!AMw1hy%A{(v{zE~;z8l($d(*NZ2DETa{vajBRM0k=L)wMq z?R9A_kRcl8Ep1K1?1#DWk)~A2*J~iXwtfi^_>0cqDu@2|9ctmx5Ec@}! zXRFa<0ib9CtIEWa?4QmUGca(U0^&m;%&cv?Rr|@T7j2K^vR7`OnaYN4H_&;_=VIHO t3tMMyx4T+t&~0adMak5Nl=Zig+-}>qU%YvmJ>Cahi3$_Tq1`La0RV0eAISg! diff --git a/platforms/android/AndroidManifest.xml b/platforms/android/AndroidManifest.xml index ae8c96d..a0214dd 100644 --- a/platforms/android/AndroidManifest.xml +++ b/platforms/android/AndroidManifest.xml @@ -14,4 +14,5 @@ + diff --git a/platforms/android/android.json b/platforms/android/android.json index d9911be..0591744 100644 --- a/platforms/android/android.json +++ b/platforms/android/android.json @@ -11,6 +11,10 @@ { "xml": "", "count": 1 + }, + { + "xml": "", + "count": 1 } ], "/widget": [ @@ -36,6 +40,12 @@ "xml": "", "count": 1 } + ], + "/*": [ + { + "xml": "", + "count": 1 + } ] } } @@ -50,6 +60,9 @@ }, "cordova-plugin-ble-central": { "PACKAGE_NAME": "org.censis.sensortoy" + }, + "cordova-plugin-file": { + "PACKAGE_NAME": "org.censis.sensortoy" } }, "dependent_plugins": {}, @@ -60,11 +73,163 @@ "clobbers": [ "ble" ] + }, + { + "file": "plugins/cordova-plugin-file/www/DirectoryEntry.js", + "id": "cordova-plugin-file.DirectoryEntry", + "clobbers": [ + "window.DirectoryEntry" + ] + }, + { + "file": "plugins/cordova-plugin-file/www/DirectoryReader.js", + "id": "cordova-plugin-file.DirectoryReader", + "clobbers": [ + "window.DirectoryReader" + ] + }, + { + "file": "plugins/cordova-plugin-file/www/Entry.js", + "id": "cordova-plugin-file.Entry", + "clobbers": [ + "window.Entry" + ] + }, + { + "file": "plugins/cordova-plugin-file/www/File.js", + "id": "cordova-plugin-file.File", + "clobbers": [ + "window.File" + ] + }, + { + "file": "plugins/cordova-plugin-file/www/FileEntry.js", + "id": "cordova-plugin-file.FileEntry", + "clobbers": [ + "window.FileEntry" + ] + }, + { + "file": "plugins/cordova-plugin-file/www/FileError.js", + "id": "cordova-plugin-file.FileError", + "clobbers": [ + "window.FileError" + ] + }, + { + "file": "plugins/cordova-plugin-file/www/FileReader.js", + "id": "cordova-plugin-file.FileReader", + "clobbers": [ + "window.FileReader" + ] + }, + { + "file": "plugins/cordova-plugin-file/www/FileSystem.js", + "id": "cordova-plugin-file.FileSystem", + "clobbers": [ + "window.FileSystem" + ] + }, + { + "file": "plugins/cordova-plugin-file/www/FileUploadOptions.js", + "id": "cordova-plugin-file.FileUploadOptions", + "clobbers": [ + "window.FileUploadOptions" + ] + }, + { + "file": "plugins/cordova-plugin-file/www/FileUploadResult.js", + "id": "cordova-plugin-file.FileUploadResult", + "clobbers": [ + "window.FileUploadResult" + ] + }, + { + "file": "plugins/cordova-plugin-file/www/FileWriter.js", + "id": "cordova-plugin-file.FileWriter", + "clobbers": [ + "window.FileWriter" + ] + }, + { + "file": "plugins/cordova-plugin-file/www/Flags.js", + "id": "cordova-plugin-file.Flags", + "clobbers": [ + "window.Flags" + ] + }, + { + "file": "plugins/cordova-plugin-file/www/LocalFileSystem.js", + "id": "cordova-plugin-file.LocalFileSystem", + "clobbers": [ + "window.LocalFileSystem" + ], + "merges": [ + "window" + ] + }, + { + "file": "plugins/cordova-plugin-file/www/Metadata.js", + "id": "cordova-plugin-file.Metadata", + "clobbers": [ + "window.Metadata" + ] + }, + { + "file": "plugins/cordova-plugin-file/www/ProgressEvent.js", + "id": "cordova-plugin-file.ProgressEvent", + "clobbers": [ + "window.ProgressEvent" + ] + }, + { + "file": "plugins/cordova-plugin-file/www/fileSystems.js", + "id": "cordova-plugin-file.fileSystems" + }, + { + "file": "plugins/cordova-plugin-file/www/requestFileSystem.js", + "id": "cordova-plugin-file.requestFileSystem", + "clobbers": [ + "window.requestFileSystem" + ] + }, + { + "file": "plugins/cordova-plugin-file/www/resolveLocalFileSystemURI.js", + "id": "cordova-plugin-file.resolveLocalFileSystemURI", + "merges": [ + "window" + ] + }, + { + "file": "plugins/cordova-plugin-file/www/browser/isChrome.js", + "id": "cordova-plugin-file.isChrome", + "runs": true + }, + { + "file": "plugins/cordova-plugin-file/www/android/FileSystem.js", + "id": "cordova-plugin-file.androidFileSystem", + "merges": [ + "FileSystem" + ] + }, + { + "file": "plugins/cordova-plugin-file/www/fileSystems-roots.js", + "id": "cordova-plugin-file.fileSystems-roots", + "runs": true + }, + { + "file": "plugins/cordova-plugin-file/www/fileSystemPaths.js", + "id": "cordova-plugin-file.fileSystemPaths", + "merges": [ + "cordova" + ], + "runs": true } ], "plugin_metadata": { "cordova-plugin-whitelist": "1.2.2", "cordova-plugin-compat": "1.0.0", - "cordova-plugin-ble-central": "1.1.0" + "cordova-plugin-ble-central": "1.1.0", + "cordova-plugin-file": "4.2.0" } } \ No newline at end of file diff --git a/platforms/android/assets/www/cordova_plugins.js b/platforms/android/assets/www/cordova_plugins.js index 19691c0..dc8b27b 100644 --- a/platforms/android/assets/www/cordova_plugins.js +++ b/platforms/android/assets/www/cordova_plugins.js @@ -6,6 +6,157 @@ module.exports = [ "clobbers": [ "ble" ] + }, + { + "file": "plugins/cordova-plugin-file/www/DirectoryEntry.js", + "id": "cordova-plugin-file.DirectoryEntry", + "clobbers": [ + "window.DirectoryEntry" + ] + }, + { + "file": "plugins/cordova-plugin-file/www/DirectoryReader.js", + "id": "cordova-plugin-file.DirectoryReader", + "clobbers": [ + "window.DirectoryReader" + ] + }, + { + "file": "plugins/cordova-plugin-file/www/Entry.js", + "id": "cordova-plugin-file.Entry", + "clobbers": [ + "window.Entry" + ] + }, + { + "file": "plugins/cordova-plugin-file/www/File.js", + "id": "cordova-plugin-file.File", + "clobbers": [ + "window.File" + ] + }, + { + "file": "plugins/cordova-plugin-file/www/FileEntry.js", + "id": "cordova-plugin-file.FileEntry", + "clobbers": [ + "window.FileEntry" + ] + }, + { + "file": "plugins/cordova-plugin-file/www/FileError.js", + "id": "cordova-plugin-file.FileError", + "clobbers": [ + "window.FileError" + ] + }, + { + "file": "plugins/cordova-plugin-file/www/FileReader.js", + "id": "cordova-plugin-file.FileReader", + "clobbers": [ + "window.FileReader" + ] + }, + { + "file": "plugins/cordova-plugin-file/www/FileSystem.js", + "id": "cordova-plugin-file.FileSystem", + "clobbers": [ + "window.FileSystem" + ] + }, + { + "file": "plugins/cordova-plugin-file/www/FileUploadOptions.js", + "id": "cordova-plugin-file.FileUploadOptions", + "clobbers": [ + "window.FileUploadOptions" + ] + }, + { + "file": "plugins/cordova-plugin-file/www/FileUploadResult.js", + "id": "cordova-plugin-file.FileUploadResult", + "clobbers": [ + "window.FileUploadResult" + ] + }, + { + "file": "plugins/cordova-plugin-file/www/FileWriter.js", + "id": "cordova-plugin-file.FileWriter", + "clobbers": [ + "window.FileWriter" + ] + }, + { + "file": "plugins/cordova-plugin-file/www/Flags.js", + "id": "cordova-plugin-file.Flags", + "clobbers": [ + "window.Flags" + ] + }, + { + "file": "plugins/cordova-plugin-file/www/LocalFileSystem.js", + "id": "cordova-plugin-file.LocalFileSystem", + "clobbers": [ + "window.LocalFileSystem" + ], + "merges": [ + "window" + ] + }, + { + "file": "plugins/cordova-plugin-file/www/Metadata.js", + "id": "cordova-plugin-file.Metadata", + "clobbers": [ + "window.Metadata" + ] + }, + { + "file": "plugins/cordova-plugin-file/www/ProgressEvent.js", + "id": "cordova-plugin-file.ProgressEvent", + "clobbers": [ + "window.ProgressEvent" + ] + }, + { + "file": "plugins/cordova-plugin-file/www/fileSystems.js", + "id": "cordova-plugin-file.fileSystems" + }, + { + "file": "plugins/cordova-plugin-file/www/requestFileSystem.js", + "id": "cordova-plugin-file.requestFileSystem", + "clobbers": [ + "window.requestFileSystem" + ] + }, + { + "file": "plugins/cordova-plugin-file/www/resolveLocalFileSystemURI.js", + "id": "cordova-plugin-file.resolveLocalFileSystemURI", + "merges": [ + "window" + ] + }, + { + "file": "plugins/cordova-plugin-file/www/browser/isChrome.js", + "id": "cordova-plugin-file.isChrome", + "runs": true + }, + { + "file": "plugins/cordova-plugin-file/www/android/FileSystem.js", + "id": "cordova-plugin-file.androidFileSystem", + "merges": [ + "FileSystem" + ] + }, + { + "file": "plugins/cordova-plugin-file/www/fileSystems-roots.js", + "id": "cordova-plugin-file.fileSystems-roots", + "runs": true + }, + { + "file": "plugins/cordova-plugin-file/www/fileSystemPaths.js", + "id": "cordova-plugin-file.fileSystemPaths", + "merges": [ + "cordova" + ], + "runs": true } ]; module.exports.metadata = @@ -13,7 +164,8 @@ module.exports.metadata = { "cordova-plugin-whitelist": "1.2.2", "cordova-plugin-compat": "1.0.0", - "cordova-plugin-ble-central": "1.1.0" + "cordova-plugin-ble-central": "1.1.0", + "cordova-plugin-file": "4.2.0" }; // BOTTOM OF METADATA }); \ No newline at end of file diff --git a/platforms/android/assets/www/css/app.css b/platforms/android/assets/www/css/app.css index 35061bc..190097b 100644 --- a/platforms/android/assets/www/css/app.css +++ b/platforms/android/assets/www/css/app.css @@ -278,3 +278,30 @@ projector: cast -webkit-line-clamp: 1; -webkit-box-orient: vertical; } + +.pulser { + display: block; + margin-top:10%; + border-radius: 100px; + width: 30px; + height: 30px; + border: 10px solid #C5F4EB; + -webkit-animation: pulse 0.75s ease-in infinite; + -moz-animation: pulse 0.75s ease-in infinite; + animation: pulse 0.75s ease-in infinite; +} +@-webkit-keyframes pulse { + 0% { -webkit-transform: scale(0); } + 85% { opacity: 1; } + 100% { -webkit-transform: scale(1); -webkit-filter: blur(5px); opacity: 0; } +} +@-moz-keyframes pulse { + 0% { -moz-transform: scale(0); } + 85% { opacity: 1; } + 100% { -moz-transform: scale(1); -moz-filter: blur(5px); opacity: 0; } +} +@keyframes pulse { + 0% { transform: scale(0); } + 85% { opacity: 1; } + 100% { transform: scale(1); filter: blur(5px); opacity: 0; } +} diff --git a/platforms/android/assets/www/css/mui.custom.css b/platforms/android/assets/www/css/mui.custom.css index cfe1de1..79597a4 100644 --- a/platforms/android/assets/www/css/mui.custom.css +++ b/platforms/android/assets/www/css/mui.custom.css @@ -1331,7 +1331,7 @@ th { text-transform: uppercase; font-weight: 500; font-size: 14px; - color: rgba(0, 0, 0, 0.87); + color: rgba(255, 255, 255, 0.87); cursor: default; height: 48px; line-height: 48px; diff --git a/platforms/android/assets/www/index.html b/platforms/android/assets/www/index.html index e3c90a7..058c17c 100644 --- a/platforms/android/assets/www/index.html +++ b/platforms/android/assets/www/index.html @@ -41,16 +41,36 @@ rel="stylesheet"> - + + + + Sensor Toy +
+ +
+
- +
+
+ + +
+ +
+ +
+
+
+ @@ -74,17 +94,21 @@ + + + - + + diff --git a/platforms/android/assets/www/js/device/CC2650/cc2650_accelerometer.js b/platforms/android/assets/www/js/device/CC2650/cc2650_accelerometer.js index 65d2ca2..8a0648a 100644 --- a/platforms/android/assets/www/js/device/CC2650/cc2650_accelerometer.js +++ b/platforms/android/assets/www/js/device/CC2650/cc2650_accelerometer.js @@ -37,7 +37,7 @@ var CC2650_ACCEL = function(deviceId) { }; this.onAccelerometerData = function(data) { - console.log(data); + // Console.log(data); var message; var a = new Int16Array(data); @@ -68,19 +68,19 @@ var CC2650_ACCEL = function(deviceId) { this.state = message; - this.$result[this.frames.gyroID + '-x'].text(this.sensorMpu9250GyroConvert(a[0]).toFixed(5)); - this.$result[this.frames.gyroID + '-y'].text(this.sensorMpu9250GyroConvert(a[1]).toFixed(5)); - this.$result[this.frames.gyroID + '-z'].text(this.sensorMpu9250GyroConvert(a[2]).toFixed(5)); + this.$result[this.frames.gyroID + '-x'].text(this.sensorMpu9250GyroConvert(a[0]).toFixed(5)); + this.$result[this.frames.gyroID + '-y'].text(this.sensorMpu9250GyroConvert(a[1]).toFixed(5)); + this.$result[this.frames.gyroID + '-z'].text(this.sensorMpu9250GyroConvert(a[2]).toFixed(5)); - this.$result[this.frames.accelID + '-x'].text(this.sensorMpu9250AccConvert(a[3]).toFixed(5)); - this.$result[this.frames.accelID + '-y'].text(this.sensorMpu9250AccConvert(a[4]).toFixed(5)); - this.$result[this.frames.accelID + '-z'].text(this.sensorMpu9250AccConvert(a[5]).toFixed(5)); + this.$result[this.frames.accelID + '-x'].text(this.sensorMpu9250AccConvert(a[3]).toFixed(5)); + this.$result[this.frames.accelID + '-y'].text(this.sensorMpu9250AccConvert(a[4]).toFixed(5)); + this.$result[this.frames.accelID + '-z'].text(this.sensorMpu9250AccConvert(a[5]).toFixed(5)); - this.$result[this.frames.magID + '-x'].text(a[3]); - this.$result[this.frames.magID + '-y'].text(a[4]); - this.$result[this.frames.magID + '-z'].text(a[5]); + this.$result[this.frames.magID + '-x'].text(a[3]); + this.$result[this.frames.magID + '-y'].text(a[4]); + this.$result[this.frames.magID + '-z'].text(a[5]); - console.log(this.state); + // Console.log(this.state); }; this.startService = function() { @@ -93,8 +93,6 @@ var CC2650_ACCEL = function(deviceId) { ble.startNotification(this.deviceID, this.serviceDef.service, this.serviceDef.data, this.onAccelerometerData.bind(this), this.onError); - - // Turn accelerometer on var configData = new Uint16Array(1); // Turn on gyro, accel, and mag, 2G range, Disable wake on motion @@ -115,6 +113,11 @@ var CC2650_ACCEL = function(deviceId) { }; + this.animateGraph = function() { + // Nothing to animate yet + + return -1; + }; this.insertFrame = function(mode) { diff --git a/platforms/android/assets/www/js/device/CC2650/cc2650_barometer.js b/platforms/android/assets/www/js/device/CC2650/cc2650_barometer.js index 6123dde..dc02554 100644 --- a/platforms/android/assets/www/js/device/CC2650/cc2650_barometer.js +++ b/platforms/android/assets/www/js/device/CC2650/cc2650_barometer.js @@ -22,11 +22,9 @@ var CC2650_BAR = function(deviceId) { period: 'F000AA43-0451-4000-B000-000000000000' }; - + this.data = {temp: [], pressure: []}; this.$result = {temp: null, pressure: null}; - - this.startService = function() { 'use strict'; if (this.deviceID !== null) { @@ -43,7 +41,6 @@ var CC2650_BAR = function(deviceId) { ble.write(this.deviceID, this.serviceDef.service, this.serviceDef.configuration, barometerConfig.buffer, function() { console.log('Started barometer.'); },this.onError); - } }; @@ -56,30 +53,47 @@ var CC2650_BAR = function(deviceId) { this.onBarometerData = function(data) { var pStr; var tStr; - console.log(data); + // Console.log(data); var message; var a = new Uint8Array(data); //0-2 Temp //3-5 Pressure - tStr = this.sensorBarometerConvert(a[0] | (a[1] << 8) | (a[2] << 16)) + '°C'; - pStr = this.sensorBarometerConvert(a[3] | (a[4] << 8) | (a[5] << 16)) + 'hPa'; + var temp, pressure; + temp = this.sensorBarometerConvert(a[0] | (a[1] << 8) | (a[2] << 16)); + pressure = this.sensorBarometerConvert(a[3] | (a[4] << 8) | (a[5] << 16)); + tStr = temp + '°C'; + pStr = pressure + 'hPa'; message = 'Temperature
' + tStr + 'Pressure
' + pStr ; + // This.data.temp = this.storeData(parseInt(temp), this.data.temp); + // this.data.pressure = this.storeData(parseInt(pressure), this.data.pressure); + + this.data.temp = this.storeData(temp, this.data.temp); + this.data.pressure = this.storeData(pressure, this.data.pressure); + + this.$result.temp.text(tStr); this.$result.pressure.text(pStr); this.state = message; - console.log('Barometer:', this.state); + // Console.log('Barometer:', this.state); }; + this.animateGraph = function() { + this.simpleGraph(this.data.temp, 'temp'); + this.simpleGraph(this.data.pressure, 'pressure'); + }; + + this.insertFrame = function() { var self = this; - console.log('Overloading...'); + var blankChart; + // Call the parent displayForm first... this.superClass_.insertFrame.call(self); @@ -95,6 +109,24 @@ var CC2650_BAR = function(deviceId) { $('
', { class: 'mui-col-xs-3 mui--text-white', id: pressure}).appendTo(row); this.$id.append(row); + + var tabBody = $('
'); + newTR = $(''); - newTR.append($(''); + var newTR = $(''); - newTR.append($('
').text(device.id)); + newTR.append($('').text(device.id)); - if (device.hasOwnProperty('name')) { - newTR.append($('').text(device.name)); - } else { - newTR.append($('').text('*** Unknown')); - } + if (device.hasOwnProperty('advertising')) { - newTR.append($('').text(device.rssi)); + advertBuffer = app.arrayBufferToIntArray(device.advertising); + /*var hexBuffer = advertBuffer.map(function(i) { + return ('00' + i.toString(16)).slice(-2) + ','; + });*/ - $('#tbody').append(newTR); + hexBuffer = app.makeHexBuffer(advertBuffer); - $('#output').append(JSON.stringify(device) + '
'); + parsed = app.parseAdvertisingData(advertBuffer); - }.bind(this), function(e) { - 'use strict'; - console.error(e); - }); + //Console.log(parsed); + + if (parsed.hasOwnProperty('9')) { + + /*var name = parsed['9'].map(function(i) { + + return String.fromCharCode(i); + });*/ + + var name = app.makeChars(parsed['9']); + + _device.name = name.join(''); + console.log('Name: ', name.join('')); + + } + + if (parsed.hasOwnProperty('255')) { + + otherData = app.handle255(parsed['255']); + console.log(otherData); + _device.otherData = otherData; + } + _device.advertBuffer = advertBuffer; + _device.hexBuffer = hexBuffer; + _device.parsed = parsed; + } + + if (typeof otherData !== 'undefined' && otherData !== null) { + if (otherData.hasOwnProperty('msg')) { + msgText = ' - ' + otherData.msg; + } + } + + if (device.hasOwnProperty('name')) { + newTR.append($('
').text(device.name + msgText)); + } else { + newTR.append($('').text('*** Unknown' + msgText)); + } + + newTR.append($('').text(device.rssi)); + + + if ($('tr#' + newId).length > 0) { + $('tr#' + newId).replaceWith(newTR); + } else { + $('#tbody').append(newTR); + } + + + //$('#output').append(JSON.stringify(device) + '
'); + + app.log[newId] = _device; + + console.log(JSON.stringify(_device)); + + }.bind(this), function(e) { + 'use strict'; + console.error(e); + }); + + var _t = [5000,60000,200][mode]; setTimeout(ble.stopScan, - 5000, - function() { console.log('Scan complete'); }, - function() { console.log('stopScan failed'); } - ); + _t, + function() { console.log('Scan complete'); + + if (mode === 1) { + app.saveLog(); + $('#ripple').hide(); + } + + if (mode === 2) { + if (app.stop == false) { + setTimeout(function() { + app.doScan(2); + }.bind(this), 200); + } else { + app.saveLog(); + $('#ripple').hide(); + } + + } + }, + function() { console.log('stopScan failed'); + $('#ripple').hide(); + }); }, + writeFile: function(fileEntry, dataObj) { + // Create a FileWriter object for our FileEntry (log.txt). + fileEntry.createWriter(function(fileWriter) { + + fileWriter.onwriteend = function() { + console.log('Successful file write...'); + // ReadFile(fileEntry); + }; + + fileWriter.onerror = function(e) { + console.error('Failed file write: ' + e.toString()); + }; + + // If data object is not passed in, + // create a new Blob instead. + if (!dataObj) { + dataObj = new Blob(['some file data'], { type: 'text/plain' }); + } + + fileWriter.write(dataObj); + }); + }, + saveLog: function() { + 'use strict'; + var dt = new Date().toISOString().replace(/:|-/g,'').replace(/(\.\w+)/g,''); + var payload = JSON.stringify(app.log); + var filename = 'sensortoy-' + dt + '.json'; + + // Var dataObj = new Blob(payload, { type: 'text/plain' }); + window.requestFileSystem(LocalFileSystem.PERSISTENT, 0, function(fs) { + + console.log('file system open: ' + fs.name); + fs.root.getFile(filename, { create: true, exclusive: false }, function(fileEntry) { + + console.log('fileEntry is file?' + fileEntry.isFile.toString()); + // FileEntry.name == 'someFile.txt' + // fileEntry.fullPath == '/someFile.txt' + console.log('Path: ', fileEntry.fullPath); + app.writeFile(fileEntry, payload); + + app.log = []; + + }, app.onError); + + }, app.onError); + }, + forceStop: function() { + 'use strict'; + app.stop = true; + $('#scan').show(); + $('#stop').hide(); + }, + // Bind Event Listeners // // Bind any events that are required on startup. Common events are: // 'load', 'deviceready', 'offline', and 'online'. bindEvents: function() { - var self = this; - document.addEventListener('deviceready', this.onDeviceReady, false); - $('#scan').on('click', function() { - 'use strict'; - this.doScan(); - }.bind(this)); + var self = this; + document.addEventListener('deviceready', this.onDeviceReady, false); + $('#scan').on('click', function() { + 'use strict'; + this.stop = false; + this.doScan(2); + $('#scan').hide(); + $('#stop').show(); + }.bind(this)); + $('#stop').on('click', function() { + 'use strict'; + app.forceStop(); + }.bind(this)); - $('#tbody').on('click','tr', function() { - 'use strict'; - var tID = $(this).context.id; + $('#longScan').on('click', function() { + 'use strict'; + this.doScan(1); + }.bind(this)); - var id = self.list[tID]; + $('#tbody').on('click', 'tr', function() { + 'use strict'; + var tID = $(this).context.id; - console.log(tID, id); + var id = self.list[tID]; - self.connect(id); - }); + console.log(tID, id); + app.forceStop(); + self.connect(id); + }); - }, - // Deviceready Event Handler + }, // Deviceready Event Handler // // The scope of 'this' is the event. In order to call the 'receivedEvent' // function, we must explicitly call 'app.receivedEvent(...);' onDeviceReady: function() { - - }, serviceDiscovery: function(services) { 'use strict'; console.log(services); + }, sensorMpu9250GyroConvert: function(data) { + return data / (65536 / 500); }, - sensorMpu9250GyroConvert: function(data) { - return data / (65536 / 500); - }, sensorMpu9250AccConvert: function(data) { - // Change /2 to match accel range...i.e. 16 g would be /16 - return data / (32768 / 2); + // Change /2 to match accel range...i.e. 16 g would be /16 + return data / (32768 / 2); + }, + + doAnimate: function() { + 'use strict'; + // Console.log('Animate..'); + for (var t = 0; t < app.activeServices.length;t++) { + app.activeServices[t].animateGraph(); } - ,connect: function(deviceId) { + window.requestAnimFrame(app.doAnimate.bind(this)); + } - $('#results').slideUp(); - console.log('Connect to ', deviceId); + , connect: function(deviceId) { - var onConnect = function(a) { - var services = []; + $('#results').slideUp(); + console.log('Connect to ', deviceId); - 'use strict'; + var onConnect = function(a) { + var services = []; - console.log('A:', a); + 'use strict'; - services = a.services; + console.log('A:', a); - for (var t = 0; t < services.length;t++) { + services = a.services; - var ident = services[t].toUpperCase(); + for (var t = 0; t < services.length; t++) { - switch (ident) { - case '180F': - var batteryStat = new BATTERY(deviceId); - batteryStat.startService(); - batteryStat.readBatteryState(); - app.activeServices.push(batteryStat); + var ident = services[t].toUpperCase(); - break; - case 'FFE0': - var buttonState = new BUTTON(deviceId); - buttonState.startService(); - app.activeServices.push(buttonState); - break; + switch (ident) { + case '180F': + var batteryStat = new BATTERY(deviceId); + batteryStat.startService(); + // batteryStat.readBatteryState(); + app.activeServices.push(batteryStat); - case 'F000AA80-0451-4000-B000-000000000000': - var cc2650_accel = new CC2650_ACCEL(deviceId); - cc2650_accel.startService(); - app.activeServices.push(cc2650_accel); - break; + break; + case 'FFE0': + var buttonState = new BUTTON(deviceId); + buttonState.startService(); + app.activeServices.push(buttonState); + break; - case 'F000AA40-0451-4000-B000-000000000000': - var cc2650_bar = new CC2650_BAR(deviceId); - cc2650_bar.startService(); - app.activeServices.push(cc2650_bar); - break; + case 'F000AA80-0451-4000-B000-000000000000': + var cc2650_accel = new CC2650_ACCEL(deviceId); + cc2650_accel.startService(); + app.activeServices.push(cc2650_accel); + break; - case 'F000AA70-0451-4000-B000-000000000000': - var cc2650_lux = new CC2650_LUX(deviceId); - cc2650_lux.startService(); - app.activeServices.push(cc2650_lux); - break; + case 'F000AA40-0451-4000-B000-000000000000': + var cc2650_bar = new CC2650_BAR(deviceId); + cc2650_bar.startService(); + app.activeServices.push(cc2650_bar); + break; - default: - console.log('Unknown service: ', ident); - } - } + case 'F000AA70-0451-4000-B000-000000000000': + var cc2650_lux = new CC2650_LUX(deviceId); + cc2650_lux.startService(); + app.activeServices.push(cc2650_lux); + break; + + case 'F000AA00-0451-4000-B000-000000000000': + var cc2650_tmp = new CC2650_TMP(deviceId); + cc2650_tmp.startService(); + app.activeServices.push(cc2650_tmp); + break; - }; + case 'F000AA20-0451-4000-B000-000000000000': + var cc2650_hum = new CC2650_HUM(deviceId); + cc2650_hum.startService(); + app.activeServices.push(cc2650_hum); + break; - ble.connect(deviceId, onConnect, function(e) { - 'use strict'; - console.error(e); - }); + default: + console.error('Unknown service: ', ident); + } + } - }, - onError: function(reason) { - console.error('ERROR: ' + reason); // Real apps should use notification.alert - }, - updateGyro: function(g) { + // Starting animation.. + window.requestAnimFrame(app.doAnimate.bind(this)); + }; + + ble.connect(deviceId, onConnect, function(e) { + 'use strict'; + console.error(e); + }); + + }, onError: function(reason) { + console.error('ERROR: ' + reason); // Real apps should use notification.alert + }, updateGyro: function(g) { 'use strict'; } }; + +window.requestAnimFrame = (function() { + return window.requestAnimationFrame || + window.webkitRequestAnimationFrame || + window.mozRequestAnimationFrame || + function(callback) { + window.setTimeout(callback, 1000 / 60); + }; +})(); + + + app.initialize(); diff --git a/platforms/android/assets/www/js/standards/capability.js b/platforms/android/assets/www/js/standards/capability.js index a1914d7..49147fd 100644 --- a/platforms/android/assets/www/js/standards/capability.js +++ b/platforms/android/assets/www/js/standards/capability.js @@ -18,6 +18,10 @@ var CAPABILITY = function(p) { this.deviceID = null; + this.data = []; + this.ctx = null; + this.first = false; + }; CAPABILITY.prototype.setInternalID = function() { @@ -64,7 +68,174 @@ CAPABILITY.prototype.onError = function(e) { console.error(e); }; +CAPABILITY.prototype.storeData = function(data, alt) { + if (!this.first) { + this.first = true; + return []; + } + var target = alt || this.data; + + if (target.length === 99) { + target = target.slice(1); + } + + target.push(data); + if (alt) { + return target; + } else { + this.data = target; + } + + +}; + +CAPABILITY.prototype.startGraph = function(id) { + + var c; + c = id[0].getContext('2d'); + this.ctx = c; + + this.ctx.fillStyle = '#ffffff'; + this.ctx.fillRect(0,0,300,150); +}; + +CAPABILITY.prototype.generateBlankGraph = function(subID) { + + var _subID = subID || ''; + var xmlns = 'http://www.w3.org/2000/svg'; + + var svgID = this.frameID + _subID + '-svg'; + var text1ID = this.frameID + _subID + '-txt1'; + var lineID = this.frameID + _subID + '-line'; + + var svg = document.createElementNS(xmlns,'svg'); + + svg.setAttributeNS(xmlns,'id',svgID); + svg.setAttributeNS(xmlns,'width',300); + svg.setAttributeNS(xmlns,'height',150); + svg.setAttributeNS(xmlns,'fill', 'blue'); + + var line = document.createElementNS(xmlns,'line'); + + line.setAttributeNS(null,'x1','46'); + line.setAttributeNS(null,'y1','12'); + line.setAttributeNS(null,'x2','280'); + line.setAttributeNS(null,'y2', '12'); + line.setAttributeNS(null,'style','stroke:#bad649;stroke-width:2;'); + + svg.appendChild(line); + + line = document.createElementNS(xmlns,'line'); + + line.setAttributeNS(null,'x1','46'); + line.setAttributeNS(null,'y1','136'); + line.setAttributeNS(null,'x2','280'); + line.setAttributeNS(null,'y2', '136'); + line.setAttributeNS(null,'style','stroke:#bad649;stroke-width:2;'); + + svg.appendChild(line); + + var text = document.createElementNS(xmlns,'text'); + + text.setAttributeNS(null,'id',text1ID); + text.setAttributeNS(null,'x','36'); + text.setAttributeNS(null,'y','15'); + text.setAttributeNS(null,'text-anchor', 'end'); + text.setAttributeNS(null,'style','font-family:"Ubuntu Condensed",sans-serif;font-size:12;fill: #bad649;text-align:right;'); + text.textContent = '000'; + + svg.appendChild(text); + + text = document.createElementNS(xmlns,'text'); + + text.setAttributeNS(null,'id','text2'); + text.setAttributeNS(null,'x','36'); + text.setAttributeNS(null,'y','140'); + text.setAttributeNS(null,'text-anchor', 'end'); + text.setAttributeNS(null,'style','font-family:"Ubuntu Condensed",sans-serif;font-size:12;fill: #bad649;text-align:right;'); + text.textContent = '0'; + + svg.appendChild(text); + + var polyline = document.createElementNS(xmlns,'polyline'); + + polyline.setAttributeNS(null,'id',lineID); + polyline.setAttributeNS(null,'fill','none'); + polyline.setAttributeNS(null,'stroke','#e5f7fd'); + //#e5f7fd + // old #B5C7FF + polyline.setAttributeNS(null,'text-anchor', 'end'); + polyline.setAttributeNS(null,'stroke-width','2'); + + svg.appendChild(polyline); + + return svg; + +}; + +CAPABILITY.prototype.animateGraph = function() { + //This.simpleGraph(this.data); +}; + + +CAPABILITY.prototype.simpleGraph = function(data, subID) { + + var _subID; + var _data; + var text1ID; + var lineID; + + _data = data || this.data; + + _subID = subID || ''; + + lineID = [this.frameID , _subID , '-line'].join(''); + text1ID = [this.frameID , _subID , '-txt1'].join(''); + + if (_data.length > 0) { + var ceiling = _data.reduce(function(p, v) { + return (p > v ? p : v); + }); + + /* Var floor = _data.reduce(function(p, v) { + return (p < v ? p : v); + }); + */ + + var calcArray = []; + + var ceilingLimit = Math.floor(ceiling / 10) * 10; + if (ceilingLimit < ceiling) { + ceilingLimit = Math.floor((ceiling + (ceiling * 0.25)) / 10) * 10; + } + + if (ceilingLimit < 30) { + ceilingLimit = 30; + } + + var scale = 124 / ceilingLimit; + // Var xstep = (280 - 46) / 100; + var xstep = 2.34; + var startX = 46 + (100 - _data.length) * xstep; + + for (var x = 0;x < _data.length;x++) { + + calcArray.push((startX + (x * xstep)).toFixed(2) + ',' + (136 - ((_data[x]) * scale)).toFixed(2)); + + } + + var elm = document.getElementById(lineID); + + elm.setAttribute('points',calcArray.join(' ')); + + elm = document.getElementById(text1ID); + + elm.textContent = ceilingLimit; + + } + +}; diff --git a/platforms/android/assets/www/test.html b/platforms/android/assets/www/test.html index c332c56..dff6050 100644 --- a/platforms/android/assets/www/test.html +++ b/platforms/android/assets/www/test.html @@ -1,19 +1,31 @@ + - + + + diff --git a/platforms/ios/www/js/device/CC2650/cc2650_accelerometer.js b/platforms/ios/www/js/device/CC2650/cc2650_accelerometer.js index 65d2ca2..996e6ef 100644 --- a/platforms/ios/www/js/device/CC2650/cc2650_accelerometer.js +++ b/platforms/ios/www/js/device/CC2650/cc2650_accelerometer.js @@ -115,6 +115,11 @@ var CC2650_ACCEL = function(deviceId) { }; + this.animateGraph = function() { + // nothing to animate yet + + return -1; + }; this.insertFrame = function(mode) { diff --git a/platforms/ios/www/js/device/CC2650/cc2650_barometer.js b/platforms/ios/www/js/device/CC2650/cc2650_barometer.js index 814ef83..16dae7d 100644 --- a/platforms/ios/www/js/device/CC2650/cc2650_barometer.js +++ b/platforms/ios/www/js/device/CC2650/cc2650_barometer.js @@ -22,16 +22,14 @@ var CC2650_BAR = function(deviceId) { period: 'F000AA43-0451-4000-B000-000000000000' }; - + this.data = {temp: [], pressure: []}; this.$result = {temp: null, pressure: null}; - - this.startService = function() { 'use strict'; if (this.deviceID !== null) { - console.log('Starting CC2650 Accelerometer Service on ', this.deviceID); + console.log('Starting CC2650 Barometer Service on ', this.deviceID); console.log(this.serviceDef); this.insertFrame(); @@ -43,7 +41,6 @@ var CC2650_BAR = function(deviceId) { ble.write(this.deviceID, this.serviceDef.service, this.serviceDef.configuration, barometerConfig.buffer, function() { console.log('Started barometer.'); },this.onError); - } }; @@ -62,12 +59,22 @@ var CC2650_BAR = function(deviceId) { //0-2 Temp //3-5 Pressure - tStr = this.sensorBarometerConvert(a[0] | (a[1] << 8) | (a[2] << 16)) + '°C'; - pStr = this.sensorBarometerConvert(a[3] | (a[4] << 8) | (a[5] << 16)) + 'hPa'; + var temp, pressure; + temp = this.sensorBarometerConvert(a[0] | (a[1] << 8) | (a[2] << 16)); + pressure = this.sensorBarometerConvert(a[3] | (a[4] << 8) | (a[5] << 16)); + tStr = temp + '°C'; + pStr = pressure + 'hPa'; message = 'Temperature
' + tStr + 'Pressure
' + pStr ; +// this.data.temp = this.storeData(parseInt(temp), this.data.temp); +// this.data.pressure = this.storeData(parseInt(pressure), this.data.pressure); + + this.data.temp = this.storeData(temp, this.data.temp); + this.data.pressure = this.storeData(pressure, this.data.pressure); + + this.$result.temp.text(tStr); this.$result.pressure.text(pStr); @@ -76,9 +83,16 @@ var CC2650_BAR = function(deviceId) { console.log('Barometer:', this.state); }; + this.animateGraph = function() { + this.simpleGraph(this.data.temp, 'temp'); + this.simpleGraph(this.data.pressure, 'pressure'); + }; + + this.insertFrame = function() { var self = this; + var blankChart; console.log('Overloading...'); // Call the parent displayForm first... this.superClass_.insertFrame.call(self); @@ -95,6 +109,16 @@ var CC2650_BAR = function(deviceId) { $('
', { class: 'mui-col-xs-3 mui--text-white', id: pressure}).appendTo(row); this.$id.append(row); + + blankChart = this.generateBlankGraph('temp'); + + this.$id.append(blankChart); + + blankChart = this.generateBlankGraph('pressure'); + + this.$id.append(blankChart); + + this.$result.temp = $('#' + temp); this.$result.pressure = $('#' + pressure); diff --git a/platforms/ios/www/js/index.js b/platforms/ios/www/js/index.js index 9e68dba..7901dd6 100644 --- a/platforms/ios/www/js/index.js +++ b/platforms/ios/www/js/index.js @@ -21,198 +21,306 @@ var app = { activeServices: [], - serviceList: { - 1800: 'Generic Access', - 1801: 'Generic Attribute', - '180a': 'Device Information', - FFE0: 'Button', - 'F000AA00-0451-4000-B000-000000000000': 'Temperature', - 'F000AA20-0451-4000-B000-000000000000': 'Humidity', - 'F000AA80-0451-4000-B000-000000000000': 'Accelerometer', - 'F000AA40-0451-4000-B000-000000000000': 'Barometer' - - }, list: {}, - button: { - service: 'FFE0', - data: 'FFE1', // Bit 2: side key, Bit 1- right key, Bit 0 –left key - }, - accelerometer: { - service: 'F000AA80-0451-4000-B000-000000000000', - data: 'F000AA81-0451-4000-B000-000000000000', // Read/notify 3 bytes X : Y : Z - notification: 'F0002902-0451-4000-B000-000000000000', - configuration: 'F000AA82-0451-4000-B000-000000000000', // Read/write 1 byte - period: 'F000AA83-0451-4000-B000-000000000000' // Read/write 1 byte Period = [Input*10]ms - }, - barometer: { - service: 'F000AA40-0451-4000-B000-000000000000', - data: 'F000AA41-0451-4000-B000-000000000000', - notification: 'F0002902-0451-4000-B000-000000000000', - configuration: 'F000AA42-0451-4000-B000-000000000000', - period: 'F000AA43-0451-4000-B000-000000000000' - }, + manufactureDecoder: new MANUFACTUREDECODER(), // Application Constructor initialize: function() { - this.bindEvents(); + this.bindEvents(); + }, + + arrayBufferToIntArray: function(buffer) { + var result; + + if (buffer) { + var typedArray = new Uint8Array(buffer); + result = []; + for (var i = 0; i < typedArray.length; i++) { + result[i] = typedArray[i]; + } + } + + return result; }, + + parseAdvertisingData: function(bytes) { + var length, type, data, i = 0, advertisementData = {}; + + while (length !== 0) { + + length = bytes[i] & 0xFF; + i++; + + type = bytes[i] & 0xFF; + i++; + + data = bytes.slice(i, i + length - 1); // Length includes type byte, but not length byte + i += length - 2; // Move to end of data + i++; + + advertisementData[type] = data; + } + + return advertisementData; + }, + handle255: function(buffer) { + 'use strict'; + + var bin = buffer; + + console.log('Block255', bin); + var manSpec = bin.map(function(i) { + + return i.toString(16) + ' '; + }); + + console.log('manSpec: ', manSpec); + var manID = ('0000' + ((bin[1] << 8) | bin[0]).toString(16)).slice(-4); + + console.log('ManID:', manID); + + switch (manID) { + case '004c': + return app.manufactureDecoder.decodeIbeacon(bin); + break; + case '1235': + return app.manufactureDecoder.decodeSiliconLabsSensorPuck(bin); + break; + default: + console.log('Unknown manID: ', manID); + } + return {} + }, doScan: function() { 'use strict'; + $('#ripple').show(); $('#tbody').empty(); + var otherData = null; + var msgText = ''; ble.startScan([], function(device) { - console.log(JSON.stringify(device)); + otherData = null; + msgText = ''; + console.log(JSON.stringify(device)); - var newId = device.id.replace(/:/g, ''); - console.log(newId); + var newId = device.id.replace(/:/g, ''); + console.log(newId); - this.list[newId] = device.id; + this.list[newId] = device.id; - var newTR = $('
').text(device.id)); + newTR.append($('').text(device.id)); - if (device.hasOwnProperty('name')) { - newTR.append($('').text(device.name)); - } else { - newTR.append($('').text('*** Unknown')); - } + if (device.hasOwnProperty('advertising')) { - newTR.append($('').text(device.rssi)); + var advertBuffer = app.arrayBufferToIntArray(device.advertising); - $('#tbody').append(newTR); + var parsed = app.parseAdvertisingData(advertBuffer); - $('#output').append(JSON.stringify(device) + '
'); + //console.log(parsed); - }.bind(this), function(e) { - 'use strict'; - console.error(e); + if (parsed.hasOwnProperty('9')) { + + var name = parsed['9'].map(function(i) { + + return String.fromCharCode(i); }); + console.log('Name: ', name.join('')); + + } + + if (parsed.hasOwnProperty('255')) { + + otherData = app.handle255(parsed['255']); + console.log(otherData); + + } + } + + if (typeof otherData !== 'undefined' && otherData !== null) + { + if (otherData.hasOwnProperty('msg')) { + msgText = ' - ' + otherData.msg; + } + } + + if (device.hasOwnProperty('name')) { + newTR.append($('
').text(device.name + msgText)); + } else { + newTR.append($('').text('*** Unknown' + msgText)); + } + + newTR.append($('').text(device.rssi)); + + $('#tbody').append(newTR); + + $('#output').append(JSON.stringify(device) + '
'); + + }.bind(this), function(e) { + 'use strict'; + console.error(e); + }); setTimeout(ble.stopScan, - 5000, - function() { console.log('Scan complete'); }, - function() { console.log('stopScan failed'); } - ); + 5000, + function() { console.log('Scan complete'); + $('#ripple').hide(); + }, + function() { console.log('stopScan failed'); + $('#ripple').hide(); + }); - }, - // Bind Event Listeners + }, // Bind Event Listeners // // Bind any events that are required on startup. Common events are: // 'load', 'deviceready', 'offline', and 'online'. bindEvents: function() { - var self = this; - document.addEventListener('deviceready', this.onDeviceReady, false); - $('#scan').on('click', function() { - 'use strict'; - this.doScan(); - }.bind(this)); + var self = this; + document.addEventListener('deviceready', this.onDeviceReady, false); + $('#scan').on('click', function() { + 'use strict'; + this.doScan(); + }.bind(this)); + $('#tbody').on('click', 'tr', function() { + 'use strict'; + var tID = $(this).context.id; + var id = self.list[tID]; - $('#tbody').on('click','tr', function() { - 'use strict'; - var tID = $(this).context.id; + console.log(tID, id); - var id = self.list[tID]; + self.connect(id); + }); - console.log(tID, id); - - self.connect(id); - }); - - - }, - // Deviceready Event Handler + }, // Deviceready Event Handler // // The scope of 'this' is the event. In order to call the 'receivedEvent' // function, we must explicitly call 'app.receivedEvent(...);' onDeviceReady: function() { - - }, serviceDiscovery: function(services) { 'use strict'; console.log(services); + }, sensorMpu9250GyroConvert: function(data) { + return data / (65536 / 500); }, - sensorMpu9250GyroConvert: function(data) { - return data / (65536 / 500); - }, sensorMpu9250AccConvert: function(data) { - // Change /2 to match accel range...i.e. 16 g would be /16 - return data / (32768 / 2); + // Change /2 to match accel range...i.e. 16 g would be /16 + return data / (32768 / 2); + }, + + doAnimate: function() { + 'use strict'; + console.log('Animate..'); + for (var t = 0; t < app.activeServices.length;t++) { + app.activeServices[t].animateGraph(); } - ,connect: function(deviceId) { + window.requestAnimFrame(app.doAnimate.bind(this)); + } - $('#results').slideUp(); - console.log('Connect to ', deviceId); + , connect: function(deviceId) { - var onConnect = function(a) { - var services = []; + $('#results').slideUp(); + console.log('Connect to ', deviceId); - 'use strict'; + var onConnect = function(a) { + var services = []; - console.log('A:', a); + 'use strict'; - services = a.services; + console.log('A:', a); - for (var t = 0; t < services.length;t++) { + services = a.services; - var ident = services[t].toUpperCase(); + for (var t = 0; t < services.length; t++) { - switch (ident) { - case '180F': - var batteryStat = new BATTERY(deviceId); - batteryStat.startService(); - batteryStat.readBatteryState(); - app.activeServices.push(batteryStat); + var ident = services[t].toUpperCase(); - break; - case 'FFE0': - var buttonState = new BUTTON(deviceId); - buttonState.startService(); - app.activeServices.push(buttonState); - break; + switch (ident) { + case '180F': + var batteryStat = new BATTERY(deviceId); + batteryStat.startService(); + batteryStat.readBatteryState(); + app.activeServices.push(batteryStat); - case 'F000AA80-0451-4000-B000-000000000000': - var cc2650_accel = new CC2650_ACCEL(deviceId); - cc2650_accel.startService(); - app.activeServices.push(cc2650_accel); - break; + break; + case 'FFE0': + var buttonState = new BUTTON(deviceId); + buttonState.startService(); + app.activeServices.push(buttonState); + break; - case 'F000AA40-0451-4000-B000-000000000000': - var cc2650_bar = new CC2650_BAR(deviceId); - cc2650_bar.startService(); - app.activeServices.push(cc2650_bar); - break; + case 'F000AA80-0451-4000-B000-000000000000': + var cc2650_accel = new CC2650_ACCEL(deviceId); + cc2650_accel.startService(); + app.activeServices.push(cc2650_accel); + break; - default: - console.log('Unknown service: ', ident); - } - } + case 'F000AA40-0451-4000-B000-000000000000': + var cc2650_bar = new CC2650_BAR(deviceId); + cc2650_bar.startService(); + app.activeServices.push(cc2650_bar); + break; + + case 'F000AA70-0451-4000-B000-000000000000': + var cc2650_lux = new CC2650_LUX(deviceId); + cc2650_lux.startService(); + app.activeServices.push(cc2650_lux); + break; + + case 'F000AA00-0451-4000-B000-000000000000': + var cc2650_tmp = new CC2650_TMP(deviceId); + cc2650_tmp.startService(); + app.activeServices.push(cc2650_tmp); + break; - }; + case 'F000AA20-0451-4000-B000-000000000000': + var cc2650_hum = new CC2650_HUM(deviceId); + cc2650_hum.startService(); + app.activeServices.push(cc2650_hum); + break; - ble.connect(deviceId, onConnect, function(e) { - 'use strict'; - console.error(e); - }); + default: + console.log('Unknown service: ', ident); + } + } - }, - onError: function(reason) { - console.error('ERROR: ' + reason); // Real apps should use notification.alert - }, - updateGyro: function(g) { + // Starting animation.. + window.requestAnimFrame(app.doAnimate.bind(this)); + }; + + ble.connect(deviceId, onConnect, function(e) { + 'use strict'; + console.error(e); + }); + + }, onError: function(reason) { + console.error('ERROR: ' + reason); // Real apps should use notification.alert + }, updateGyro: function(g) { 'use strict'; } }; + +window.requestAnimFrame = (function() { + return window.requestAnimationFrame || + window.webkitRequestAnimationFrame || + window.mozRequestAnimationFrame || + function(callback) { + window.setTimeout(callback, 1000 / 60); + }; +})(); + + + app.initialize(); diff --git a/platforms/ios/www/js/standards/capability.js b/platforms/ios/www/js/standards/capability.js index a1914d7..66a83e0 100644 --- a/platforms/ios/www/js/standards/capability.js +++ b/platforms/ios/www/js/standards/capability.js @@ -18,6 +18,10 @@ var CAPABILITY = function(p) { this.deviceID = null; + this.data = []; + this.ctx = null; + this.first = false; + }; CAPABILITY.prototype.setInternalID = function() { @@ -64,7 +68,174 @@ CAPABILITY.prototype.onError = function(e) { console.error(e); }; +CAPABILITY.prototype.storeData = function(data, alt) { + if (!this.first) { + this.first = true; + return []; + } + var target = alt || this.data; + + if (target.length === 99) { + target = target.slice(1); + } + + target.push(data); + if (alt) { + return target; + } else { + this.data = target; + } + + +}; + +CAPABILITY.prototype.startGraph = function(id) { + + var c; + c = id[0].getContext('2d'); + this.ctx = c; + + this.ctx.fillStyle = '#ffffff'; + this.ctx.fillRect(0,0,300,150); +}; + +CAPABILITY.prototype.generateBlankGraph = function(subID) { + + var _subID = subID || ''; + var xmlns = 'http://www.w3.org/2000/svg'; + + var svgID = this.frameID + _subID + '-svg'; + var text1ID = this.frameID + _subID + '-txt1'; + var lineID = this.frameID + _subID + '-line'; + + var svg = document.createElementNS(xmlns,'svg'); + + svg.setAttributeNS(xmlns,'id',svgID); + svg.setAttributeNS(xmlns,'width',300); + svg.setAttributeNS(xmlns,'height',150); + svg.setAttributeNS(xmlns,'fill', 'blue'); + + var line = document.createElementNS(xmlns,'line'); + + line.setAttributeNS(null,'x1','46'); + line.setAttributeNS(null,'y1','12'); + line.setAttributeNS(null,'x2','280'); + line.setAttributeNS(null,'y2', '12'); + line.setAttributeNS(null,'style','stroke:#bad649;stroke-width:2;'); + + svg.appendChild(line); + + line = document.createElementNS(xmlns,'line'); + + line.setAttributeNS(null,'x1','46'); + line.setAttributeNS(null,'y1','136'); + line.setAttributeNS(null,'x2','280'); + line.setAttributeNS(null,'y2', '136'); + line.setAttributeNS(null,'style','stroke:#bad649;stroke-width:2;'); + + svg.appendChild(line); + + var text = document.createElementNS(xmlns,'text'); + + text.setAttributeNS(null,'id',text1ID); + text.setAttributeNS(null,'x','36'); + text.setAttributeNS(null,'y','15'); + text.setAttributeNS(null,'text-anchor', 'end'); + text.setAttributeNS(null,'style','font-family:sans-serif;font-size:12;fill: #bad649;text-align:right;'); + text.textContent = '000'; + + svg.appendChild(text); + + text = document.createElementNS(xmlns,'text'); + + text.setAttributeNS(null,'id','text2'); + text.setAttributeNS(null,'x','36'); + text.setAttributeNS(null,'y','140'); + text.setAttributeNS(null,'text-anchor', 'end'); + text.setAttributeNS(null,'style','font-family:sans-serif;font-size:12;fill: #bad649;text-align:right;'); + text.textContent = '0'; + + svg.appendChild(text); + + var polyline = document.createElementNS(xmlns,'polyline'); + + polyline.setAttributeNS(null,'id',lineID); + polyline.setAttributeNS(null,'fill','none'); + polyline.setAttributeNS(null,'stroke','#e5f7fd'); + //#e5f7fd + // old #B5C7FF + polyline.setAttributeNS(null,'text-anchor', 'end'); + polyline.setAttributeNS(null,'stroke-width','2'); + + svg.appendChild(polyline); + + return svg; + +}; + +CAPABILITY.prototype.animateGraph = function() { + //this.simpleGraph(this.data); +}; + + +CAPABILITY.prototype.simpleGraph = function(data, subID) { + + var text1ID; + var lineID; + + var _data = data || this.data; + + + var _subID = subID || ''; + + lineID = this.frameID + _subID + '-line'; + text1ID = this.frameID + _subID + '-txt1'; + + console.log('Drawing: ', subID); + if (_data.length > 0) { + var ceiling = _data.reduce(function(p, v) { + return (p > v ? p : v); + }); + + var floor = _data.reduce(function(p, v) { + return (p < v ? p : v); + }); + + + var calcArray = []; + + var ceilingLimit = Math.floor(ceiling / 10) * 10; + if (ceilingLimit < ceiling) { + ceilingLimit = Math.floor((ceiling + (ceiling * 0.25)) / 10) * 10; + } + + if (ceilingLimit < 30) { + ceilingLimit = 30; + } + + var scale = 124 / ceilingLimit; + var xstep = (300 - 46) / 100; + var startX = 46 + (100 - _data.length) * xstep; + + for (var x = 0;x < _data.length;x++) { + + calcArray.push((startX + (x * 2.54)).toFixed(2) + ',' + (136 - ((_data[x]) * scale)).toFixed(2)); + + } + + var elm = document.getElementById(lineID); + + elm.setAttribute('points',calcArray.join(' ')); + + elm = document.getElementById(text1ID); + + elm.textContent = ceilingLimit; + + } + + +}; diff --git a/platforms/ios/www/test.html b/platforms/ios/www/test.html index 618da50..dff6050 100644 --- a/platforms/ios/www/test.html +++ b/platforms/ios/www/test.html @@ -1,168 +1,34 @@ - - - - - - - - - - - - - - - Sensor Toy - - - - -
-
- -
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
-
-
-
-
Gyroscope - B0:B4:48:BE:17:87
-
-
-
X
-
Y
-
Z
-
-
-
-0.19073 -
-
-0.15259 -
-
-0.07629 -
-
-
-
-
-
Accelerometer - B0:B4:48:BE:17:87
-
-
-
X
-
Y
-
Z
-
-
-
-0.00073 -
-
0.00153 -
-
-0.25513 -
-
-
-
-
-
Magnetometer - B0:B4:48:BE:17:87
-
-
-
X
-
Y
-
Z
-
-
-
-12 -
-
25 -
-
-4180 -
-
-
-
-
-
Button - B0:B4:48:BE:17:87
-
-
-
Status:
-
-
-
-
- - - - - - - - - - + + +a[0] | (a[1] << 8) diff --git a/plugins/android.json b/plugins/android.json index eadc370..8f83f6e 100644 --- a/plugins/android.json +++ b/plugins/android.json @@ -12,6 +12,9 @@ }, "cordova-plugin-ble-central": { "PACKAGE_NAME": "org.censis.sensortoy" + }, + "cordova-plugin-file": { + "PACKAGE_NAME": "org.censis.sensortoy" } }, "dependent_plugins": { diff --git a/plugins/fetch.json b/plugins/fetch.json index 799c50b..d7cae6e 100644 --- a/plugins/fetch.json +++ b/plugins/fetch.json @@ -22,5 +22,13 @@ }, "is_top_level": false, "variables": {} + }, + "cordova-plugin-file": { + "source": { + "type": "registry", + "id": "cordova-plugin-file" + }, + "is_top_level": true, + "variables": {} } } \ No newline at end of file diff --git a/plugins/ios.json b/plugins/ios.json index eadc370..8f83f6e 100644 --- a/plugins/ios.json +++ b/plugins/ios.json @@ -12,6 +12,9 @@ }, "cordova-plugin-ble-central": { "PACKAGE_NAME": "org.censis.sensortoy" + }, + "cordova-plugin-file": { + "PACKAGE_NAME": "org.censis.sensortoy" } }, "dependent_plugins": { diff --git a/www/css/app.css b/www/css/app.css index 35061bc..190097b 100644 --- a/www/css/app.css +++ b/www/css/app.css @@ -278,3 +278,30 @@ projector: cast -webkit-line-clamp: 1; -webkit-box-orient: vertical; } + +.pulser { + display: block; + margin-top:10%; + border-radius: 100px; + width: 30px; + height: 30px; + border: 10px solid #C5F4EB; + -webkit-animation: pulse 0.75s ease-in infinite; + -moz-animation: pulse 0.75s ease-in infinite; + animation: pulse 0.75s ease-in infinite; +} +@-webkit-keyframes pulse { + 0% { -webkit-transform: scale(0); } + 85% { opacity: 1; } + 100% { -webkit-transform: scale(1); -webkit-filter: blur(5px); opacity: 0; } +} +@-moz-keyframes pulse { + 0% { -moz-transform: scale(0); } + 85% { opacity: 1; } + 100% { -moz-transform: scale(1); -moz-filter: blur(5px); opacity: 0; } +} +@keyframes pulse { + 0% { transform: scale(0); } + 85% { opacity: 1; } + 100% { transform: scale(1); filter: blur(5px); opacity: 0; } +} diff --git a/www/css/mui.custom.css b/www/css/mui.custom.css index cfe1de1..79597a4 100644 --- a/www/css/mui.custom.css +++ b/www/css/mui.custom.css @@ -1331,7 +1331,7 @@ th { text-transform: uppercase; font-weight: 500; font-size: 14px; - color: rgba(0, 0, 0, 0.87); + color: rgba(255, 255, 255, 0.87); cursor: default; height: 48px; line-height: 48px; diff --git a/www/css/progress.css b/www/css/progress.css new file mode 100644 index 0000000..c2b6981 --- /dev/null +++ b/www/css/progress.css @@ -0,0 +1,94 @@ +/* Progress Bar */ +.progress { + position: relative; + height: 4px; + display: block; + width: 100%; + background-color: #acece6; + border-radius: 2px; + background-clip: padding-box; + /* margin: 0.5rem 0 1rem 0; */ + overflow: hidden; } + +.progress .determinate { + position: absolute; + background-color: inherit; + top: 0; + bottom: 0; + background-color: #26a69a; + transition: width .3s linear; } + +.progress .indeterminate { + background-color: #26a69a; } + +.progress .indeterminate:before { + content: ''; + position: absolute; + background-color: inherit; + top: 0; + left: 0; + bottom: 0; + will-change: left, right; + -webkit-animation: indeterminate 2.1s cubic-bezier(0.65, 0.815, 0.735, 0.395) infinite; + animation: indeterminate 2.1s cubic-bezier(0.65, 0.815, 0.735, 0.395) infinite; } + +.progress .indeterminate:after { + content: ''; + position: absolute; + background-color: inherit; + top: 0; + left: 0; + bottom: 0; + will-change: left, right; + -webkit-animation: indeterminate-short 2.1s cubic-bezier(0.165, 0.84, 0.44, 1) infinite; + animation: indeterminate-short 2.1s cubic-bezier(0.165, 0.84, 0.44, 1) infinite; + -webkit-animation-delay: 1.15s; + animation-delay: 1.15s; } + +@-webkit-keyframes indeterminate { + 0% { + left: -35%; + right: 100%; } + 60% { + left: 100%; + right: -90%; } + 100% { + left: 100%; + right: -90%; } + } + +@keyframes indeterminate { + 0% { + left: -35%; + right: 100%; } + 60% { + left: 100%; + right: -90%; } + 100% { + left: 100%; + right: -90%; } + } + +@-webkit-keyframes indeterminate-short { + 0% { + left: -200%; + right: 100%; } + 60% { + left: 107%; + right: -8%; } + 100% { + left: 107%; + right: -8%; } + } + +@keyframes indeterminate-short { + 0% { + left: -200%; + right: 100%; } + 60% { + left: 107%; + right: -8%; } + 100% { + left: 107%; + right: -8%; } + } diff --git a/www/css/ripple.css b/www/css/ripple.css new file mode 100644 index 0000000..b470db6 --- /dev/null +++ b/www/css/ripple.css @@ -0,0 +1,195 @@ + +@-webkit-keyframes uil-ripple { + 0% { + width: 0; + height: 0; + opacity: 0; + margin: 0 0 0 0; + } + 33% { + width: 44%; + height: 44%; + margin: -22% 0 0 -22%; + opacity: 1; + } + 100% { + width: 88%; + height: 88%; + margin: -44% 0 0 -44%; + opacity: 0; + } +} +@-webkit-keyframes uil-ripple { + 0% { + width: 0; + height: 0; + opacity: 0; + margin: 0 0 0 0; + } + 33% { + width: 44%; + height: 44%; + margin: -22% 0 0 -22%; + opacity: 1; + } + 100% { + width: 88%; + height: 88%; + margin: -44% 0 0 -44%; + opacity: 0; + } +} +@-moz-keyframes uil-ripple { + 0% { + width: 0; + height: 0; + opacity: 0; + margin: 0 0 0 0; + } + 33% { + width: 44%; + height: 44%; + margin: -22% 0 0 -22%; + opacity: 1; + } + 100% { + width: 88%; + height: 88%; + margin: -44% 0 0 -44%; + opacity: 0; + } +} +@-ms-keyframes uil-ripple { + 0% { + width: 0; + height: 0; + opacity: 0; + margin: 0 0 0 0; + } + 33% { + width: 44%; + height: 44%; + margin: -22% 0 0 -22%; + opacity: 1; + } + 100% { + width: 88%; + height: 88%; + margin: -44% 0 0 -44%; + opacity: 0; + } +} +@-moz-keyframes uil-ripple { + 0% { + width: 0; + height: 0; + opacity: 0; + margin: 0 0 0 0; + } + 33% { + width: 44%; + height: 44%; + margin: -22% 0 0 -22%; + opacity: 1; + } + 100% { + width: 88%; + height: 88%; + margin: -44% 0 0 -44%; + opacity: 0; + } +} +@-webkit-keyframes uil-ripple { + 0% { + width: 0; + height: 0; + opacity: 0; + margin: 0 0 0 0; + } + 33% { + width: 44%; + height: 44%; + margin: -22% 0 0 -22%; + opacity: 1; + } + 100% { + width: 88%; + height: 88%; + margin: -44% 0 0 -44%; + opacity: 0; + } +} +@-o-keyframes uil-ripple { + 0% { + width: 0; + height: 0; + opacity: 0; + margin: 0 0 0 0; + } + 33% { + width: 44%; + height: 44%; + margin: -22% 0 0 -22%; + opacity: 1; + } + 100% { + width: 88%; + height: 88%; + margin: -44% 0 0 -44%; + opacity: 0; + } +} +@keyframes uil-ripple { + 0% { + width: 0; + height: 0; + opacity: 0; + margin: 0 0 0 0; + } + 33% { + width: 44%; + height: 44%; + margin: -22% 0 0 -22%; + opacity: 1; + } + 100% { + width: 88%; + height: 88%; + margin: -44% 0 0 -44%; + opacity: 0; + } +} +.uil-ripple-css { + background: none; + position: relative; + width: 200px; + height: 200px; +} +.uil-ripple-css div { + position: absolute; + top: 50%; + left: 50%; + margin: 0; + width: 0; + height: 0; + opacity: 0; + border-radius: 50%; + border-width: 12px; + border-style: solid; + -ms-animation: uil-ripple 2s ease-out infinite; + -moz-animation: uil-ripple 2s ease-out infinite; + -webkit-animation: uil-ripple 2s ease-out infinite; + -o-animation: uil-ripple 2s ease-out infinite; + animation: uil-ripple 2s ease-out infinite; +} +.uil-ripple-css div:nth-of-type(1) { + border-color: #afafb7; +} +.uil-ripple-css div:nth-of-type(2) { + border-color: #5cffd6; + -ms-animation-delay: 1s; + -moz-animation-delay: 1s; + -webkit-animation-delay: 1s; + -o-animation-delay: 1s; + animation-delay: 1s; +} diff --git a/www/fonts/Material_Icons-normal-400.woff b/www/fonts/Material_Icons-normal-400.woff new file mode 100644 index 0000000000000000000000000000000000000000..c6b66107808ce4dbda4f276031a5f3715cc745e1 GIT binary patch literal 58804 zcmYg$18k?y_jT=VZQHint+uvpw_6)q+qP}nwr$(i=il!yd6RdNGn0FA=FU7%Mwz*; za$;gYz(7Cgs1XR^rvU!y{jvYY{Kx+PNnAu!>_?#f!;$=e6bubWNnBn|>4)?BvFU!m zzKeO2DXygQ`-iIp0;1#s0^&&b7z@W++Nj|S|2KmryqGjROT(f#?cq5cB^00e4g?QZ(R$pZmZQ2+tE zWpB8^uA7?}7y|*VyZvZ>+5%#Ste_q<{~>?4pS}R0{eTn<7zE7R#_311J_rN^^5YY7 z-2Ty=)Y{JIN4Ev{W7qy*cni+w(Z;~-r`^NOpL&G<0gM-D&(^@kM zHPHXl7{(eg8t6|-(2g1H>gyW-`2zrb%#lNBDrNF@;BY@(=)#Bi_v6?NI8qff@namL zyTDl0CgG{rd+V{}YopobVXfKbr})6*{mFe!c(^R;b+WQqSzbDZrA5O2w9u00pf!!h zUsRIo(o){vjR=A@qNV5|vsS*U=fj{j-3ypVchmW%khQy%U31hc9b`8?r|J1TSI^`; z6xA{8JYBVP`wqoazug)1@LjojesQVq$C|iksj9kJ6qTsrBbv`KNW_TDQ^=G_QKRt+ ztCKa>hM8l^O{Q61(h#h-d{(|! zYz-0WQdS`^J#7cQx4zb@j$Ir^+A21Mud@h$@#B2*suQnLu2OK4wUWCLx{+MMpM>oE z0$|c(*dkw}Wh3gMZzJ)e`0QHwbOVY3ReJq3M=f_BuSTC--`Kt(zWqJN0_W$~*r(;L zQ!8eFK=CD<`rH;;>D)R1;ZYFWOf_^@56*H1D{VC&pEz&h3%XG)oKxYvmx; ze$6CZ(SAAjlaR>vONfy#dI9k^o8>ZH}_LWStl78sjD$I z4_K2Zs$PNM7dAUn^P5?eLNF5W4h;K-S}glK7|U}7(`=N@a1#W7=iVmUD5BRx_-M8k zcu0^a*D0ejG+U0i8*kN3amYeyDKxM(I2L08=tC~r8$h0?2xV1ozogW5(+YEH>EC#t zfmih{_<1Mq08ao@d9-0x4*84sK$7;w#3|V&b9LdxHox3*%`C^aH7n#cZA#{s3(hi3 z9uxjm4o%Xed;w0Ix9h5SM7?Cy=n-1YLEx_XQM6;=$&}Q%QkaGG1S!9v%A)ItU0Nhrr^gT0)POPr(sZCb*Ws5g zKEwHr^r1;+sd5_dO}HRs<({=2U)>2AOSAqO>2%ZBGolH~-#A@Q7J=m_6C`GPu@sjFB$d+or3gK4+s zT;)!-&l%z+&P#YXR`?LxU1;b$%;zTA;i3(1Q|KDiHLYWe zZ#UcC4vaWvoRA`nf>rJrn@R?2)Gpb_f(b*;fNdO0>}s_n;IPIqnG4W4lznzMVTZX) zxX?*&qnfIwSf9Z|<{i07a^E(?{C3&ZYMiF&*jzJm8X@rR`#@w2wbm-lX^ zk|`3&A8?S=ZYag%${P z@i^g;%R!5UK$-xop-LYz0qWj(vB}B}KDKfO<-dyH&WG@SyQsGShfP%p?thAvH{O7; zX-)&rECwxpV#Ye))t{-7n4~r5Shhy~#iy)!PR{P!&y1m65YELQtH%+;hwL)W$`-Yh zZjbo9ED0``$-mFocH2$_UBj?>-YUh2TQBVH{=~VGI6F^Gauhny0ojI7tNTuL3rpJ( zS`U{Y?B*r2B#_6n`nKsPd%Z8L@Ft_ZB^{QGU9%+09vGBJKn^H|y+H3FBIc6A^~CTR z4x76CR+^3Zw%ob(A&GVVu0W*2Gl_Gz$Zhq!#qPp!_q_B z!e&GBLs{*8-e&CC4UqLa_h0pc_9yg9^=I^p_pfw53H#&$+5u&NhM(p8nB$J;)%z3a z8`bw;&-l*n&3%kle<_T6QR~Esq zs;XUV_m|a-vh!1l>4f((7--AfWlkgxx<+p^7_wuq8 zy5nP%z-bN7sLi2YhR@0?Vy|ftvkN6}26imjqAqNde|VrFY1WXP4HI9P`JTwSP_7Ff zkd=uZ^>wFaoSw1&rOOqLx5mR8S;zcQ$yTTK^cxKd)$Xbom!RTR&N|lT`*6mKOMxlZ zw$AW!w!F?MRg+>v&orDVMt-a`f;fA*FInUdt!rh8)uly!EQ4YWN{Qb_c54cic=e)g zlP)c05-+bOdzOzBEevfXNbWuI!^y)i6JbeHd{DmIQP#WbnZiW~y^LRj<0fY<{J36I zX^+$=Bg{LlDi``4(#k)1n zeq5P*pxVz9uSu++LoHif*IflIo2nvQ21;LkCGFE%i;@CIaE{}d8G*gF$iGlJIQXq? zq<5E6Weo)o{=2j>lki4t>By4|GSXFRvKwlxf^BXDf!C!MBV*3fr=`xtp9X`?QI-2YP-58t`C8-eaiTr559)uO<>Wx>6`7m;y~{4R!Tx5cr(!-+usXI0T!qX(FhFb} zm!HpiY5ipqE{xFci!nJ?mhC~IzY6L)-IBMO0D+#AQrx*t5cSs_gK%mg>7Gi^ zlHT>tEABXt1#Bqx%yTSn{tycvX@vT%HiFQ%QK4bYhYH!M@Ot{ate84Cf09E1?csEw zT}q0bw1!!W<+G0$(Ql;kiKB@(D1L13cJXGv8fMi7L#gzh;>7f+xnMqyj6Yf{831Xl zmT3&7;i{WxRHSLn95Om{^9`!`P-_|sAreO#P2{Efc+|2jEkT+&d?$Rq-+Fh1fOxgN ztyj42fE`9rmWiJkY~aFDlA19IyS%#iJxg!OQR}&uaH;Z4^r4!V^b!C*S5r`w51+4d z2)~zk+J4%7+IHFnCxN?|lNP6u_-1gNa;zz-KlJfem^Ec_-MpiM`jUqzDcgdDz@;8( z6}E}m+!cDMb6MHa+iKLKB(+W1LLw<%9j2&F)|@=KOOBLbpa)zPBXRq=p! z8Y?6p^h9*JSU#6|ow+}Livw2k#mc68WD?ia3qy9uA(Tcx#a>FgyDZyQCkt1Cj7Pzq6JC6Y%dBHLjI`Ml2r7b1cFq|42vi&C5;(RDZJNstrLCl zfnM)KVr+o3B`w*(mHRna5YOwQ<*-Y22+6zRL{H?sD^Dnr$$ApZVo+UrSNx={DG>Z} zR8Vsn%VAuH;Y^-?L?90Rx|h-%GI0_rHmRxaEA}9_y1*I72h=k7l#Y)zjsM;=>rCvG z;!P}PO+C&LRQx8SqP(~I8xwzwKm3mI8n^@7z#aw~~ZYL-mF}YccO@_2X!%k>|!IL|k&vd5Z6i(pz1ZLBj!>6m6e9@*-mOh}aHuse^Xy{hCOJ6{UQKgnDco14$^);?Gz=Yff48 zLmazalSqIfCw570`FzX{&YaT={{m)03w_D5VeSyk$dZ4McFFH#584c*kM0R1pxPbc;i^;I#@e=LN;rvzX~oI7QaC zEV+s$v{rUpq_m3mrKskc^djl=Tijp(SuF=FuSCM8!HYWV2|NxN?&8?uu4=!qit3#?^7u9~5hrF4>Eks^hi^e6*fI&()VS zTnQI5bn)C1F!!E8pbln-wxfJ;AB1|NC5i@b-ac)gAHC3-f%GaiB(AU0?;xeUCc?IpLY=TPqD9JA}h-4(Q|1#Ba`HoL#P)dn%%HCL=u zA$2U=X4OQm+5Vye3i{ z8(q|{2&ZE~++`>>hM<0LM69i6-6-FHT7J)}p1!$YUDe>+BQ`A!Jgb-ZmTVgzs)6O0 z5X?);O{h_=2TJaBpVed=^X{C?RPZq??hxTGYoo5`l0A%Pj-E~SDbHh*4!7^X5K8WE zfZcInWcZ{4ioC~G+p)J!EESF3-KgJrwLm5Ic--tC-{zglAJMvLVnxf5(uqo3PzbwjRI#F z!cB*Er!F$e8RAUge?}>UCZ0$kxG+o-z2RHpkO}1s_ozX%ZaaB~@7DgC`U7Ldu63(m zRos*~x&S9q^#CN68 zQRmf?+g+VCzpx7lw)ENlhAll2xrZ3X*6~kR_-H}p1d__uVfK$B@K7zQPjxHsPQ)9A`5_88{saev)QsYSMsq0Z@B$>ARu6{| ztD9Vq*yj(TFW$R#4`IP2`3`m@^*tT%yqKEO^vVuxq4fjYoiF7@SCqD#hTS86V&9)I z*jJwyt>{34;y*W+D&}L|Yy1{_{Lm{Jk5+4UGUg22|LF60PN_UX!X`5BdB2$e*?=jU zTkcNq8<87>lX=r5ARkk(r55qWUrwbI{T<|F&zgN&hdPf)Xnsq3JQKGV30F|^STdzi zf;sq(kV7)czAXwps&1JH!rEncN;4 zWyy2nFaDbej$;)BHfgLZqPh}Et&00bM4MFupG4+rF=w9j*&%)@q`Yh67>Wp}{EXu{ zJqy0|km=lvQ>^zuDc;eD*OO1zwIFymNPfSVgN9e;?teG?;+M+Q7i+gy(!#!X6!EKA zi`5+pOAl1_1wHhQN|(~qL0`IGf}M)6-?N$DG2!7dmdE_N?y0I~=LWQWGzuBrV8r1I zaBY)v3cx-Fi&i9n@cq9oKI!+8Wi`H^a4waFj>=c8<8L>Po%zofna>KFjDy&v3iR{e z!NXm0qa3EQERUonTdp}8fm-Z-l25c22%|j?_?M{RP}~~@h2V>_C4ck;Q%Hr;Hk-)I zdAP%D3tBkiyuUgw&wT20TJB&!lg^kPCSQ6iE~$GrIg=lERQ$0dSp1jnZE1NtJtk4b zHW(s{8Ch6ZbW^!}x;q*1-V{>P5+06%($cs%^t{>l7SeUz`0vX*O7hy<+jnc&t3+7L zjk+eo07u_I}2YIix)!<3UH=wAN;OZDC`pP{W}u>Cf;PxkwKDUyHXcy4_@vD>Ke~z6sU#v&<2BnbmXM5U&`cM(PLL zE#o`&E61XTblJydqe7;Jx)23LEa}l%_UN{~u;gazrtNF;C=a(#-AqQN zXblZqQ=dz`Cfx<-Rf1acb52xSLJUl9NV?%GCtYu>-N`oxD-MZTq%9)0snh?%vHUgeIVlXB3sa6dZcW zN0!F7A!I~rY#82aG;{q66rg_7EsI9_OJ#inxm49?K8cK5=YwqfX4fj0b4iyNN?%r$pXoDE1z_Ii27dW@}WvixT z$b2)FB~~;)r%JEaVa_zMs>qxTVKcfAHL*>N%qj?-OzGxT3RrA3(S^#J#fv&;lT~F` zEFNtH%^FL$wL#Ibj1Oj5>AtcqozN88{$9>QW$pk6qq?dMD5h~A0X3cqfnnj7QeA!T zMq(5@%D=8CDx%>PvS_-%P}}A_4X$G*2nUMBl(2mc7CFE81ti%|>IGxozoE#DgTb%k#{hx3?t=DfogM$iu< z+r@7*B}M^OnlziKxno1e2={TX-$YFoSm{C=3wciHIx;P@D31`{14J#aE4)c&x5=G6 z1d}6oSiC6=CxHEnS9aasGuwWZB5~=^#4^s)2&jB)` zQsi;}Dz*C#n8hZANj!X^(Co>mC6{Es^d*$7qqB_)W_$ibO_SkSB%n`ogR%63>j!CC<`)4 z_P0|j`y@s=->?Jfa2W?+lOsy6(~Xl3rbdprTqBblF{!Sj1x%X3$FtW?xKjmhP8f8# zYNsUc!P$aJS6Xw1N*&vZ?zE1gS@<{e^J51^IwB9UBN#XbN3`<==F*!5TS+7GH}jI_ zxKmZjO;fdRsL0OoS}ctUC1R2I`45QWXQ~7Syjn{O$)cq+$Wtl>h3(Ak8pD_vC;w^+ zZE43w(9>a(!)<@>MyI_ROqxM4Ki~z6e4ZkKp;Rq<<-e2~uLvWd-4 z{QA^k3kn{N$qFU-4(n~R0+T7lzk!rT8q0TPKW9#35LzpnI|XBis%OE7lD}oXwRub3 zROtFtLk*HsRvNMX3_0wp)OX>)5T$s>v0T7zOEGLHmx zbS$_`!MGo7xt}=Vm?pq9;rr(6AslzL7EzC6gW*Asj=Fr(f|)_>reu%kiHyb65_frb zA9_=0p1{F(7v8SvO6rX2;_Es<4Y^BviGIn_dnkGBc`A8l`K0^e`x^LC`fU47LP9@a z2M__uprY>L05WBQ1(>xjtx;BGrlqY8G%SM)QW3d59~ktu(d2ZET>(7>4^3UyD&!=R zM)lZq*@H@RH9m?X2xXpTad68IZfNg?L45A)>8HuT{UkKGE6>*+grG~&;AgZII>0hC zK^>-_`sog4ouWhaJHz>V+%}7mNiD`n;E*oDpix>n>v}XVRv|Rk)BY+DTC*Az-`KG zH0v$--mbYPS4v&wX)*vF&4x_mS~amrqpCHp%o{O_EwdHdgAm2}%UQ{|O{dc*ogkK5 z?riB2HvMU%yl(EwO$Z|gNF!E%naZD?%3HAiHCyBfVURv$&AF|eOw{jebfx(#yhHXI z>jm~(aQRa8U#{4H24{Rvfz~1u&`bq*uy4wvp41O;T4S zX-CiIrv#%+7D)00)GA$<@~ep>0Cak6VCW95+IEh96>cE4ZYPu8q?ZuYvRpT;vRMpa zlzG{1;MF6kH8A)uzV|=UfE)vXtvQ!(cjJM)d=`8Cn!PdJs=gAzSm#ez;MHJyd62Jj zt`7bvDIA_c%5Rg1s=!MB%1rMzCYX9DU43iQ7QjooD?)Bcu+!d{^a^n(Cy&%qVjRiK zj4$(M?`|NLJ0F z)jV4Fp=}YN{L}W9dOrhek%4^9k#hB!?OhKQnMx2KLX-zz6WsY^!4Tp#sc@`yc!k5e zLPT(bQWfGADbTMmFSaZJ2Tl)D^za3S$s4DyWy##rwB7@{Kw5m>i!Z z-|St&x8^IdoeV&|I8dJ)fh{)nu{ur#oziwpaG&-P7H-6x%GEjJY)`e#2YL$q27zAzydFswH zu<7wUO!08Uh#VWJ5Va`V8`*-TvJqg)rciwJ#F<1cBfrHo(kJ z;EE)8KvL6SKMT;A5JTm2HfYvLj|wHU1? zEMHN(zT_0@ZL6SNib0P7{X2EuQUz7$Dvi6&p;OO|h-^20AOCA_rSUH|fQfD%zh>BT3C$VR^Xp3|ST35pavKYR9$NHZ~^*ih0QKE)w}k6M|^jq zZ6`ae8}*y}(Qu!EmroaC0lRAgY>nxaH`vb@NrSVIqO+nYDae#*ny;ou^|LOAGG0~P zV&0NY&$rh5&U?KHghV}RUj=9yqa-qFE0yMITy?H02aBWjap9yC>KyPQ{kYwfKA65p z{R{n_-PPU9-TU2}KEA$$KC3ovBb8?F}_!Qw( zbvC@%n8UCd_FntL>ljU8tzM@ligV(QHlWI}__3nNWrK5PTlTeyEJJa=feB|^*^j<{ zZV^FO)9ig>5Xv#;W6(qxF*E1Zl}qk^0C>S@hwy+0)lo~(fW)JrC_O)n2?e+kd%@ua zdTg4N>rjT%9Z&rDF>|ISeMjDuJORexU7=AW^&vC7# z(oN~n=_pZGi065ZX1+QBP@ma?kDd0-j4!>d^4OtJ(bl*K;kv!TD!Pc_QC}mrWeB{9 ziEYt7$RYY-5z8_2Xw)>jYSizVoBcdhydT0261b&+p^K?h zvA9lJrqo7pe%2vUN|xQ3XyyXCxcR0YmisQUC}rcX%Q`;enVY=Fn{tpW>YR_umv{eC zO71k14YK`9Wkqwg%Sz~-g}?mZrrzORwY0sWF%>P3Mu*hQd~}`g+B2C2u{=`|UiY}t z_aPaI#XDxWnZYiuOvXsNd3u@r89K?BEZpw$wk$KI_b9GVtsS>dglCwCFg3JgaxbmD zcnW6~^Iwxdx#|vjBBnqIFDK$nl($;DXv(;Du)@Ut_h|^!Wk(OYob=P>6_T_ufgv3j zb8@GJaTQD$^TRuoc6jmO#`Nz9%V%fM#?r`e;S17p06leo#MH&k6h7?5+OY9lm zYchWqa}7Rq|48n&IP5&i%`X8G$K}8pFM}?2vHYlW&+wzK_IN!N6}jrej)macqrlNk zww+Ubw|al7InfY&*59@O|1V>fabs>Yjj%1|)OxE4yU zL%RHH@WZRC7MA6te*6JQa#jKMg{k9XeaGxHJAB5PRJ&3Mf#M@`2pcKLc`7HS zuPprBlT%P~TZatanFV)ryD86yI4>Bz-joNg?y#G^kyk9Apq)HCCi8|euz#t8c}r?I zF8Qf%jC@niOY4(e-2%TKEoI%MOl9_29{rY(e~GVsNm|@O zjiW=xg%f8i4KXBozd50mc<0RKM<;W^kcIgBuN`_T)GN2pdv5Be{JR>}vS}{qutnd>vJ&MwEiK@7j zy&d;@32PgYSbg+KsZu9K83!tslW|;;Q;tWX=E$+3Ds`co8(9d9na+d1duNupg26xs zl|_4fvf1Pu?%e&`U%{ve)PR3e_n-eYDv?2SF8WK!cp7qu-`lbAb4e@$0mul9Z5x)B z3va})wlx2DN+0(s>c)ZsCC#xuP$>!rfEHj(>=&1;!1?Y5QR&&ixlv%jMs38{Bp@HGX0(&D08J`REta%&Nz9!r|S)o9oLP3kPBwQ_!XB z{ORQ;l5i@H-?9l?GoLYt!cMup0rD=eGC--?#5x<-3y1%>D$#2OSz z1d>?z<_{9h%EaW@zB&X&kDJQ=y5M@Q3~d;4|7vz9C|gkCnQ?BqpnP~KaO^gKd^}M5 z=o)vaTt^hf4+=#*l=Mz%-LCN$*lrom-Ne5mi3>#@E1D0%XL_?aK>RIbPq^5L`G*BEC)UAQge372Wob-)zxS@F8p{)$^>g_ zTA+c;l3AIr$f!X`-oR%%lAGBxBC(H`-KOIld6Bc4OaafyYr=+vOOIv4YPUR0>87Gx zD`H9v)ylgU(sV%4L3r~XQFKdzcbEQ(}MRTDv~#$2FwqvQ1KoQfx=6Rw`JA+ zhy!CD!M-p>^HNM_QjOwbRz}Q-O0cdu2uoNt5hKmBocN&FFb`j?S(j`xhe<(XbL2RCX|rVE5YCynw^)!zN>6g@Hu{T~ZkRn1s@P!XyEZ`I6*P|BD?o z(l;>F&+P3T@9jMuNFDC&-ThV6!~BQ2k&%&+sg{|g7pMR+R^LDn1Rf3o0ATr-CN0nQ zryd4w9Vk#4;>!(qa8@{z)D<)2uBBoHQ*O3ga|2h-`X}Hb(`ch@s2Rs$g{w4J4- z?wOvXzq=Hud6B$2e!H5Vay6BT$fR(!)O=YX z;?^FyK((1mcoh2*>sg5xyKcH(xR$b=%etU<=4j1!EmONcc8C4)`S$s?*89p5GGb&p zg)$3n3DzQ};3lOO&&a2X(~6QAUraS!u#{!wNSm45SKsHix8b$fV3HsvPT;x+r^e-~ z7;tKoU9?y)E;;>p&q8n7$KU54j@vmLjo56e_8{r9>x2=%zCgHT`JU)Lxq(g(7~2c1 zC8HH%o2xB-+=;8;nG#g8E6y;QlsHCz2-3jTvhQj2(b9@1rHOxucg>oUEm+uHOw?Rn|c zIIr@InJIWD>4P2HhPivEth{F~q%t(m~`jAPA1x?l%=Z8_NJ zbVxDflRlU0Mqp%g7-&j2meUl-(AbaehN+>pzRvNlgZ%?yQivPY>nk`|P@t&D&>$IU zQK5k3xW|41xoCMRtW!JDi*hlpn%$#^Dw+YV23n9MUj6pu_k&oSQ|r@mzx9UrI8 zIRaiPG2E7h-zE2@ya= z{42qasXsu({z)WJ2yl57PK?TcX30x~X1hy(nMfs};r?bzKtG{oqrPbOx&OfTy!^o5c-A_d3VBxVTa8nGCZ&e{H?64m{>6N;JdVrAG;|{cym=949JL)DEn= zy0UFJ!wwea@SvM?2$kkw5|B2PNShh49-eMQ6{Xi`R;g$xNRK;`7E6{UM|Q^BvVR;& z@z{=c^n6c#yqY$vF+Qo6!-@{L86p$a@L24`j2@XkQ|I-XyCiquQn!#+GjA`*JGIh& zxdAX?g^`k!!P3xRsFJsKD@WJXUC>xx?tB!J2>rPce3y}xqfl9`UM^8EbNXAA<{hs( z)r=~Ea^zI3*ZGeUWLSmklD| zdi#lnvD_Wl-Ew;lesQ`~A+A;}P5a62$LLw2%cWY9Eyfd)WKaA7SsBLVrobjwWr2ye!k;K*nV}Fzfbp zE1_*rrk`9XbB((-wqBSAm(1V~^gqenX+tvSjH!&mGLEu_t+QFv8kxXotsjqzuIFK>H$ z7neH~8k(Sm5&&f!Te&57cWk05`uzCPNXBs737*X0F+y;`IM~wKm7tcdtdDp$Iaq~ZcUxksgz0xHi#5V$R~86!2b4Ou6=zM z=yzr6t7T*Bsev^EWMo!|K@+G zrB-%O+WyFaau_~REor0K8)DnOh6_}(_4UF`Kwa^e$OA6z6f+io5U1-W9kA`Rk?9-z6Qny z1s!FwL?oU)XN^14TX*5Ub^WXxO{a5%34y%(%`48DNr-p-$W;; z`(ijgjo7d^w0ZGiY~tP903DzC<>wG1>$Xi#WCvhhVHKF%Fp-EOm6>PF_*x6EqC}QE zOk6B%fV}B^*wrXwZ#_>zuM$2%DKRyZBcCDQ_KMcYlFZ!6@SND>Iw@3MI<~NvFY9#o z@qW6Ue;SbTW$Vd49DA8a`BhUr^WtOrU9$@Q^nRvBh;N|~WBWG^t64ee2%*w!MAW%X z^l5wfJ1LG^6N~H5uZ2vxk|=~F$Tja*(^NGv-u1AKauRT(-nk61@B(TYjA&sw#2Za(tp3?0-3SNovE#nw!GqurW3F!FmjAuK4xJ?Rm&wRIS2`BGD~v z>?$Qc29L2>AH3&5*?Nu}^1y2zl(W@k;EU9tLgua+5&B-pQClUrx%p*`%~AqVz5ekb zV~wWpN+S1KH|N+L`81iRCLu0>I;7aoF2h5{mB(jJ zx5-FJLykgA3hgxit0zt~YA0lEqGIv@j2qpeMh$h}=*2HAjOp@l$%Mg{XTf-i1f@*n zjFIQTvKAEz{*G-2m)qFwG!2tv4W`K+IP%!(u<~Rk|CJT*?B{pE$XJ1{F-R5!?xzsDzu!LPjEQ)-zPT5?!j;&v*5G9Fhj?3TX2H2N4 z`X1WeK{G!L>z{z_84>?pCEyA}>L&>k=etJOmnBu8M6df$IA_{)8{le1cBdOH{yG%5 zLmudL{8eo*{EEg59ae7~oJR!?Dp7gZ?D~RbGCF#=`8b{ZG|i6R6`l@wB0Znlm5beD!BXEDC(+N`O^ zS`W6@88YY-p6G~MUR$?3*OEDQ;lXN~=maA`$i=Vd3&tg71{X(rEI~sH_iT z@1WI>oW8kc3}#{*dq}I|^JXN@URgs4^Kr1bTKj+?f)Tjgg~S)Hrn9P-TLhUyPMuA@ z5DWRnC=z|4YU#UfUJcuuy1igZhIVITFVwdr(lF{1(=9?ckqa}-nO$r+9oFjx9&GR8 zIFbYBsxr&^4(N%LW_N2kpKn?Cr3!YaRGc-t_||CLw5d8#G{o(!+2wK(_wld;e#XJL za^(1xhBJl3k^V(hz(?1h{ZHIUW5KP@e91;;Ss9i%KcI>E3tMYoY+Sznk+6Jd=>E5= zyU&DGy?&5qqW9{_JG_-bL3xFc5pAqMyj#3GA18`B-O?7!b~t zucGHi4uqXur#E&ETTBa|ZqG@cai52d8t2ya#<5m|pvDyJT;eT>v$EBmDVa{O)=VUu4YYlwhvqH59V?w32}iPa$@ z7lQkOIj8k%SwE~GbQptC$z8?t-Enh1lUy%cLwJoMVq#>Ztmg0PI6|NaMjy1z9k_8k zC}<&}R8)|E`hSEzJcR5Nr;2>QH5k_P(w zBf$lO2t8+nLloo_&Jx0#9Pq6C7J<{MFyxKb>k8gnIOKv}GneLx$|SNQ8{8Hb`AB2i zmNRG?H?1h=q$n78$swf7RfY(P?DvvG9kDhYPiwST{=%Shm7XEM!-f`Uw^4ug|_((?yB&XOnus5GF zkL|+C423mhq~Bvkg^~6{K%*Kg0D+e=h-C>wG0;Dv)(8p`?fr*Vp}17u*FVWv0C87U zXXGeT@pF?BanBHs2%lym1SJ>^gc-ndi8zArC@t6@+ne|{&BXJq>Iad0K=n@%+fRbr zC}9#GMf-3S7+6v~fQX3OHVI(FQ2RoYGTbHT3&G&V{{T{?rz2F+VOh28I|IAjRe_3Q zNr4izhnd^HCfO|joAs^J<10a47Y?+)R>6OOuWRGDO z{wuiyw<5s#${-zldHu~O5_D^8hq>UcX9fjPT04Qq-z^o<2Y_aGFII!j8(3CSjkQyM zh9>;DRS?Hbtp&iMZjz`LY2}xL;X4cF+yzOHihfiQwLb6C0tARuxK~ ze@}DD&4!mPk!dBds?2@%S$ew~RQ3*=;5xBjS)n$J8B#y(NivaOOi(D!iIJq|Gba?C z)H%*EmPV4$j>M1dOC>npO!IW*2Xq|j>Br~HC9K)~#dU9#mB=-k4dvS`>fO7UwIb=* zMy_UaskkiL5lGLNmOCj(pnq1;S*fq|sLq~PW4(4Q;dIrqiW=60MH_W|(A6E2tMQD2 z=-!xg*v#Fu724LbdBvLnMmEArE=;SONO&V)v)x=hcWPa;cfuQ4=m@^P$+Qt9LC2Xt zg|j6R)mKSi9ZOy-zg}!#f@>Gw=A@pzbhV{9nIM=V2U847FI{mJgU?a6G^%mJ(4|a&;B2J zh+2`^tq#QR?y_c~s@rDCoE)6#M>o8GJFhiEWXULoG*^9IrGiy;_wF8A3=a0-hZEZB zCp{fpD?4GMo$0W2H!K|7)qML}OeIyr+VRN(zM(`bCT4f67EDhbH+s@JSn*=NiJGVO zjNrK4I>mRtn1?LaCD(SCp!aeGG&Wm1+&WimIKH;x|K5!?2$AMztukY++ z6%yijtW(Yv-}4jouL|&n8pqN0ANPp#&x#YVeBog+3x+2_uVRUcf#&}~n?fgRvOTC= zvJpihTlZcQea?xG@KvB>AaESgf`Q#%(-INZcAIf%)5m9t#^aG?@SYez86Mo)-r{`O z*3pj33yMSj)-=-k3a?8Z$o;ICG_t z%4G}1qVB*J>9PD0DE~m|6{~-j#jPo+FxKKXE>li6zNn=gtG=h3aA@h+T6)>b<`+ND z&IX;CQU_fCU2sG|UCE3M@=FgSWt2_^tBk#!V2;HBA00aM7oE<^!X@pvk{P|%bGV(b z{NA~FQIVLb-|D3|erQl}UGl8a?K<%E=?=09=2ne5E|_~OLE--8>LCXZv-qQ8}}KXns|!|lg_mEYEC%hjw}KF8>#ZghqqipsjkZ*Fr&6Mz zmA0n0GM6ae6el8{*kVf&HEVCXI5ou_1|QXK(5=IKx3$6*UYGRD-O_d-i}@w~7nO!k z+?s=5yV)ROr_6$66j4ut6nQws4R*wN%1dKDnCD%wv^OR(G7jC$-uI;lV#VHOPofZoZ|n z=Q;Z?YF%8svui@D*qmUdHrgS=1Ou!wW30zv4SDPtibX`lE%c!*gZa%u2Bhal&wKnC zZ|hh77zzZ)y+FHUtS(58tuD~dNgdZaPY91KKFIf1YpHcuhD5wDAS`~%s_HMt%bXq1 z^Xivg^o<#kdH74NXXec#VXCrp#ocZ%AaZPZL)whGkjaC(gUZ(W`${a&2a+gXesmtO zr+a+WfP2?_jj#;L(#s-scqb}X-v04gM{yNju%EG(WU>6x|1a}E6}Iwy=H_31?aOBa z1lgXl!(4j>#yC;MUp-ZbclEK~?&mBBmaa3E87xwDWU5*2w+jqgd`9zehn5R(L2c}U zWbPLAMRT!bWB$2lX9QWKV$QP$^~7Tm6YaWt{R70Hmcbq(LEEt<)Zl(z@kCp!v}nZx z4bmZN5=JInFfy_Wg;|pO&B=`d6P~}E9qEgklZi*EZSsL&jc4uf2HCU|v5K*N8#;$P zZkZE(##ZD!QjZ|u`Cgpv?w; zu(*3{&JsN414FCI>>Q=e{2T(koULqc^Ocs_Vqco$W5!m5(_uQTlFCcj@R(SnV^PAR z->Jw$gpd4NgFGKcan?u&Lkn+$du|M4e&Q(At307mjPd$DJ zN`k~~C=tB!=0V=luGIZO zP+e&79l9f7EgaU!RHBb}X|;9NH0Iu!j`uiAHb+*rCW za)Uq4y6!&|JvuPi)g`Nk_n(V*h2VyJ`wvZCSeib3s&^n1=U+r8+Z7pgfBlwHCxdzP zIC#$2$eyU<$qVsuy|<6DVqI}OS-r3nKXYVnzn^EY^le8s);7)xqnkL`+G87&#L<=s zZBlAWsoHwFEknufhoZ$;P_}$2<}L*B6}s@{QTZ_l-^OCCfQ&Bg9EA4ZphwO+gg%J>s0gX5e2k9FEST!Tf-fiGL#C&l9O3wX4m+5T~Ehn z_g;J|o>1t=4-we-AFfsuwRV#P*Jl$Ko_9+13=C8w08;ZOuJ4A7ohqy)Eo- zaV@O8zK;EvR(xzzScR7w`+myb9J%c_BR)|k+09$SHiHN2e?KLm(XUK%dlISX6c_ed zZ4oC@+o&)^X1~lV8ZaZlgk%((d!P!fq-JMR6-*W8*a}Wc{9xOWTaZ?!HxHU+9hoB* zY7M)JPJgw{^syvWpaq+f%;mu&*8JkJwj;A4UW-)rpqzujiQT`X>r3O;md3}IbT)Oz zp+hr`Ycq!q-Ela&60MEXMOuFVP94U}$X(9xR%5aa$}QZopt9|sJf0M{CJMb1sip9b z|CwIAwfleu;_JM2piU&zo>H-xnF4Y4l;p7Jfeo^Wm6-6o$fOz5M5&6bq9Gm4&Wx%O zW^}z?*HM#NREi}9)+G?p*^ITJvyyK3BOkIa!J4dItlVU22(5$z_LptzWBe-@b|}p& zfk@!y&OU$FmCnAt&h+HS&ul6YQxd+uK3}4*YZ-2WRc``}3PYc1FB_l76;`)eY(yH~ zzSX)zWGYag&0Lo0LL+8+FsStR9~d1C4Gk5Mk6>3LLW}+-WiAj34;;vp)1mn3L9BzN zW{t)foO(sZlBfZ6tuGQ;8U zaO6qV|iATA0D{8fSL}n!j^a^^>_dp1@_;L!T2asq?Is z)b`KK?ayXUYO>4e7~8vlPCqd}jfx;yUp@i80{_^V_-2A75{=(-$qbs0$~-Q%3xqrH zHi86e_NAbuc&je#W-Yx6_ znJJ~xeX3r(T5L!~6lzlXubeqE+55)bkLw^Mu44t&{hZ>6LaKj4lwlIRR0{JzZlFz! zoo*q^pkZTvFsoq}P8drnLo>sPH?ogKcQ>AbJbIGsmqQN^mmIR=GV}YxeT)9usBbv_ z*NvN_yLIRb0bjClE$n+Zae9KW2L?c*s!O75gybm&?!6%!v6mhJiAaUr06QQfsaW=K zA7vk8i~IIn+y^5LYFLhx z%NL)j5iRrer!K}5wK&4k|uuFQ7d zko0w|Pg%KyrmJSl-ev=i;a6{$&NeMt1DjK{d3-CSH;{#`mB=-+uWhr>jc(&jrLK!Ws`vdl`Ad2W1)ZzTzvz}1YeWhcI8Cr1k*eD%XJQQ z_A;rrlT|{ESFh;$dwso)f24Qr?DdWKd^juGbZi&bJdwT*rmce764insII18{0<0Lqyp5`}7VLTRn|p%)2~OERrt_QwpZsJ%+Q$AH+6-CN_H^sY;pgDMzY{LHoujtJ!gl(E#A9*BZ|JWnK0hNMg4w|h7x1Xy(8wO`d)pCs} za$2pCU6X;bI-4Ko+;|Dk=%jZMct|f z|0{YT6na_^{XE8GqcST4iH1Hsv$MUy)GQpZnsQZN4t*v(5)P02Ev@~He^x5?b$Ql) zrs-p3$^Fv!{?r!zJMk#Fc_@y`D%!gCVRAn+Tb@-n$q6kX!-Q=ZFh-j`x-Kdt0|NsA zN$8>IAw_Z-Ap3zQaTioM#eN}sCJVg7tfyiA_cQ3sZX(Y@r;AN`m4c>H{N@%i#|_1?0fJ*?iEKG6I=RPK=~<9=%~Uqnbd$w z4YN|((6owP*LB{u43ZyrSRP$aO`s3RJ$lvqs0O#!wF)c4CBX(+VrXFmQb`GNv zR%s2(zt?(uuXLDNeZhnLbruwe#6c4;hAue#7?p1xi_I@gx?t7?>52!AmYjw8Y=({Y z47y^8&RV+D8;u82gM(cjx3{A=6rJ9sjXCpko~7jA=$-;&Zn>v(aM9mA(3P6)>hJ4i z{x12UbjF+MmOK7s#OIC1;<3@}h<~6zG_t2KoIkvjjV6zEdcjb|eO&1cI=iMvdPjz% zAvWl8ZvKj4t{KYFxF6W6pRAYAL5Lbk9p~0sy^bD1OyZ^w7Tw{rZ3M^%fm6=h-Vi$o zY-RX5Bh49Qp0=z!zO*!6Dn+x|XlZq=(SS|KI>pK`k&FSAIc93wG;HwjdnoJt9;U>A zj;PYR_mB;7iiSWSjiCv!=T6p6O)o9n)IbLM38)`Rj{U*9w}9n>Ud>8iO#2&|6ClBoXr z2m5dMaHYbG-nZTSh6|O7O_kAo__p?)vaG_IDb@p^pcI}$UKE}cXFhv2Rzg-;11i`) zW%H1P)*12x<$OO{&R+(?;1++VuP?+Ba0tJ)RES>{Q`zi4T7QB_muj);+6rZFwN>f@#{sHgLEvJZfaGyWa1TOm~ihplXSho z{mx+hngq92$q|j2Z~<*Q;8s}3${(-maCr@qB54BWJKQ*Krqg-1&Wr}UHcU`@r6%n> zx++jygZm>iOtU$-I{Ca!w0|d`5ppsbv8gZ}!edMtJ#%Yt{O-iv1znLW|B@B_ERR)fv>-aVjJ{!F;L!(Ko%pTe<5yUyam`=}af18i!w-wvZV$})37X-^jBV#3 zvWWcI>Xvbm=_Qy;%l2pqr^V578yZlR$=$YaeHw6oCvVCE3HUHjfM53Y*%V-(FXi*K zXtWyH2&Kpu4d^OAzmtEQSmNDnnq(n&hrL>5D1J1)L zqHU6u`K2u9-W8Y>l_WaGW16nb8Nm@=Ls>vz;5BI=0A-#U<`Oj0hG`76t&?&>86Q^? z@}xh!3br65A0x)w@QXGvGWQ%K9T75y(D1O!aRQKR=`AAx)W{l2F;uOSH5$rdDcaAQ8?J5oIu3pv3v2pWU^*Ji4$j+6B(eyMAVk z{=V|2vl<`_XsEl?U({dJY)x2|mz%~vG~!Y7EtdfQa*PMTKUkp9eFSpSu*c9n>c$mabrT{Alyxbkw1%~8< z0_uuF9+m>^TF%!-l%0t_0YVgQ?XBhNp`QfKnY}mK_*C@q(}{$lBobHh+L>rsQ-1PP zcOcL$q%2{*1XM9ytN*Bf^tV+?aSc+dGNY2e(oCy-1(Uf#cDWTu38csEe!%TK5)N?W z2Yjc`@Av&Eu2Q8s_~PiOBJ(wV9>s_3sL!ua8@5w*OJN*UQs~LEO^O>hi-{=~Uwrt* zSKE?fc4{PN->zJzgcMk{?eYJ^=Y={V%hqwIqb>U1cJ;5A_)ISh`icI*{*GX9xW9Mw z4k5Gu(W~Il4__k!SJl4$+sDS3)>Z%~X<{EID^WMmL|HJ)0N)sdo8T-k&<=Y?NB7=x z%j3!&$obx({Kv7g%zJk1mRlZsiJy5%a@+o#bL>wGS&aAXmBx+RZR->aYv4z;oEtvFsYMS!+{@C!7qho*G z_|4eN%`f4}j>CHSvHh`>B$S=kK~zd^Uk|D!aFz?mX|cfQ=pLc;za3A86{R%O*}1iT z?wWmkF05VDN;BbsaF{%$d)fbB|D#1gfaVk?4`5;y)bHoP%n1&1azSM?V~4fFW4(u- zJ96Z%qet)J>o11G)mlw^6F))gpFed<5>tk~xM*p@N1$|D4u3{Il8IHcrf0gC1uK$U zsI6Hsh!uhig^e=Rtm@h9RFFbYe z{9|6jd*i~=1$LkJvGdc}ch?Q`8Rx1I9Y{AOXY zE+BIV(1zfAE#^^hW3F<`9)jn|ZvJxo!qV(FqUa4fQQ#?i((L^BxVtaWbzvzMO~li1 z`uQ)9%|d(K9Yw#`w1=0YFmacb9ZE!FOBcEleeQq1W%~Yq32}b1TR6$$WI#h8+#%Rz zVZnK+2wW_Y;!H0UvCRUC)EZlB@B_gj$boVb#=v@)t?3L=IlR(5`)87C(d;)}$bxv1 zeVV=eGCTBG<1wbPS6^i}7Ks_6dUIYon*Js$}tm4rL7qu;8;Ro z|JBBtsMF#mPT=t}?F(Zs4Ev@*Rahr&s44QCl1D&@@sq|iD@{uh=@oEXaa#i%v7JQB z+6IUy%1@$*fmoB`RWv>_VL-zj?P>`K!$9O6K)wS1k7qZo(lxruOx)F;!dn97>0L#p z(|JoS_^0eon?5DP;AC+{at?OqV~^chJ@sf6{@9;B2HQtZRc~$lS+y#;1T2gpLJuG* z2{t5olNMXC#!Y0YSsN4jH*>wAUOx_;Ao|A5D*Dw3=J$Fi)Y;qnJR(l{zzhN8oqQLi zA~cxO3N_iH?L}0Y*3mJ< z?0lvp+Bp}ScI(d$;}pqj*;`q$ zM1QSLD4CnQN&=)c-=@O{I3bhcVto>Bw>wV&L|1aarA!WLE{1ix%JuW2KC-cqiG)WS zdO8Z0lx-tff%$bB#u_DYbRsJ-yo&MxOKu1^714(Qwq|2p)4;0gdt|LB;upDTOk^xc z1FYHjTNb9hgN?tX8G|fEh})ptl7%dovERcUh-!^@{qi&H%4gY&jrT_NUw-zU#```i zjLj~nVJ8mD(m%tHJkRnl96KQuo%EGxXGVS=va_%x&&E8^*ldh}kFj|RtYe&3&VN*-HkCCZp>S#nY#pDxs6S;xRWLt6mh zFRV)%9w3iyluB1|U87y7)qA82jdSBo^rVzHe^E8T9=EiDq{-3*Hq0n0;eI0$9gRi| z@XQ&^42HSDLqUyre|Ue-U|9HR&>l_;-1#{0orJs}EM)3F=Bq<9qK!N$W|*`^GFu zHdSeYuody$Na4Z@VH>=<@uYnYPf=lP>h` zoA+_!{MwT@?Y?s`t)8Ada@So)rcRMn>rFSM7X9h)44Tz(n^)kDy2AJbmq{qhWE&(8 z#rd0$A-raYRS~Q#6hG~=l>`{J<&MlkeIx+=6E<+b%x}&dK0L!Z(PZyctch1%!FqWW z4Y(Trh-WdsXC#BIuo`-B24YUd#vz2!IY)|ld~qV(a7a#JZTxF!DB&L)Hj=ty%C#7e z8h2?4Bbj1Tj=4yjsUDvK^`7-iPRd$xLhT*tQ}+*z$&*vw@u7)O|B&R~MqkqO#>-k; zCwPsrib=K|rjCjOrkLiM{bR+3DM|iqQfl}6DoBekXC9O!BCS4DZ3}iwfQ)79*lB(F0<{Rf*lM>t?E7I0 zZ*KBBLWLUI0hstwu*MHwgf;mi*qSzzs)>$Rvl8f8lXlm+_D$**-(!b&pz_lf7o^l! zz5pHyEg9d^X_YxZM^tVoP_?R6t3U=&QGj29HI=!-OK8Gn_+i-?T{Er1*6otQ-*;E% zc1u-xJyMM;zj3vZL7{kC3X_ZzBh5|K1d3U5M1wZ|%I2+h7DzJz___A_|^=}?@9Z2wf)Hz+MI z9lO*cx@Ogod7YFLOhs5IrOgYgiBrsV((+q=wl=1zke2ONR&!KX)NUIy~l zs2OOpugnckF@5%!jUrejyBa^0E`=`H*{n+Hl|t5J`jf*Gy}3QRJ!~%eSkjpL0IL{h z#z*$J+>KYFkDYqr10eMfX5t=>ZbEah%?`{LK+(Y+h*I2RsF3ATb43T=2&J>}wcok- z-JP9RI=g+H4|jIHF&Bqvx@&3>`Bz`YH*wFI&Pc}s2v)N# zNdky}7a;sQv?TeRdvbtyJgq)GFnxuJEIqTUQ8x^uC`q37FHD+y$sS45cDpH12Lxq* zz18-LrTPZ-caxe;t+*D__3tFb0B%(o8n=*Q6}C`irk&(#5++$J>v|L4lMrmk>z+&3 z3aNT^&#@_7SkFm#y3t%$eFKje{xj{6S8xjt$;kiun`E`TX(;$lFAP zfVO_(1pMG#@)B?d>_wiM?aL+h%#k*K=8&}|Z+2^Wmc)hPk5wQe{N?GG1wawnKlnyk zTikA~$?YnTYj*Q{$W1I&;22tSOdc08=lZIV%^Dd$vcHC=D9slvg@WVoGmKEF7Al20 zL!D&BX-S&n0!Iu@5)Ol?CqfB-9*W(gOPr;_&;jTJ-<5X}L-+YkQ+f?+Ua)hIK`01LUQfge(G z(o8(eadht&u@xr)4N zm4Ydt?{x_oUjWR6G)Tf`r%^}}9&llE8Uzys=IoRP&Oj9n4D0MP1dnf&s8Jg8BHs&J zlAeBPbvZx2G!86T5p;{yxUR>m)jaPhMZ2dkC53Y6B(@S}R#sOluSqWeKB`eJ8@h@1 zI&FP5x*2gxl;nwCY*Nekxl$^vuV1~&bWv9K9eFhqY{Pb5&4k*}?$z7`Z4hdiqs9={ zXH#-HH_w!ZAFfnQOKurP5E;mzsWy<@ZT2%mX#YKe0$ESS!Y2q>+jfj|mOioA{m0!O zrY`&rTK_+Sh0P0N$>i-qFaOV?rHyU5MsoEiN32OA&ys7aWb*C+dYk+tujxw5O+(Sw zLgg~(D$Px`4Z~!)EdATr5!-EsFwLZboCLADP<|X7UOvIJl@oQbl&`LsD|vo^>;HX> z6w#-BGxkSa#QUfUFdzS?w)cc9Tp{arLZ&DD1r#`z!4S?QPN#nLs%ft4G={?X!wkaW z$G!&(d@%HxmnbSr3%RHUtzbct5ET{m`okIgN-$UjIdY*54_TN46()~t0`5zBq!2hD z+w1qy3X9p z-@iBDamu|zvyV=MJYJOJGAHX+(}0*aIMzZ|)9A1zeTWuoNu*2dj{+PQ)e}Ux-b_-mGajTbt~miP+?1Y$9$NFmM^Gt6ZD&3ahic z6t%zTa5m+E#r8o~bMv^c7g3Ts(!JDu43-h`faO6klz=~LBW=mF8)>)`*lo`?)Mwti=QQI?&I0I>0R*WUhpcL0bJyzjw5(3Rc zGtfrt;H8D=z=T6{Ebbag-?U2|%)2z_!Cep2B=VN-`MqjSv^O}qt5?%JspvweJK3$^ z5k>qEd;$saF<_On%(N@U6=o4a*34eFtg%UsQ^?cE&$t;ePP|-0j$Ado7dqkl!;LZy znya9>Etku+jR?Dk42L5Pa|2-Nu3Zz~oX_i`r{U)Dn0p7-gi+ZJYjIT=oblV6G;gIX zYhn8StvM=~vu3cSU!{I%=2h(4FQY8~#g{rdK8qdv)%f^${FPT`zGy20bOqE3==mv37cs3QAkez78=;T3FpjoDJ=|Ki&k9KSo!Bf{Q4RAa2teoCjzWRG& z4~)lHe_JUl?}@!}Ja%GJQH3-;TNY}mlmLzLu{3_E-*5Z_8r|sM$}bPB?TZLLm|F&qOj^Gl#n4;p1X$ab2@T*YJ>BeOlCT3fo6#koZe`DKWyS3&_*4TP!@L>;&!W+RlhOB&kh@!Xz1 zp{EQCi6cc7ua1zppV<5E57Dt2@?WU#ucG_{awi?e9VOv}yxHP^3w^Dd9A)^K)EPYR7 zGTJ_l8&a6t3@E&1@_ubw+|7OJ#mgCh&jC}$q7likjR#L(jby4i2ItfP3Hs`3o{~Z- z4Q)h#)~X0sN0R zj;@L^dGIv-NY;Io-zA(h1p7LY(EK7Z*-aFA23Q?A`(d!1HsK6yB#Mys0z1xLz&p}p znaz&FmDnAhpf%p{S?OJ@$lgWXhy}dkv-I$f)0*=5EaXw7>siW!9{nt>h1fk_^8QkJ zCbh;_PT~zGnWEi*J2y1rJv~R7F5*Kc$_S%;sQD%gYx9lbYJ7kYzjqNe@RDL6FIQ0UXzrbKZ$ccM#Rz^@E$noz~GDll!Yg;|D{@1&`v51|9b5u;<0?MLb*89 zTdQnkLQr6_Yu6eZSU3Wnpq1nh$`}^kHorOXRQvm4B+7bYL)R7IjYa9FZCilIUClAR zDG9~Y?Lo>G(cwa4znr&VSj+3=0u=U>l++*Id{EVjW@UZdY`Ed2AyH0NJgUc?0Jb~#F$>wZ@fLtV(mQ1KOaUmsER8} zx5yP8p9JHptH`#o)llO5?Hxi|y%ePXXD|{eGzv+~PCc8WVTWhH$S#p`0reZW6tfM? z#brzubob5toKXC+(XpAandveA#NMR| z%Txupc(VP5Rk8TAUxB;2M@IY;6OtVp+nO&Ut@5Npo6C|+7ogYZ8e8n@wKHYD##ehQ zn8Pzpwfl;d#T!POXs{bZYao}cLRx4z2t)b&Ji0n6Osc){+_^W_7SDMr&^k-zP45o| z-+z-?`CQ<>gTHj(aY>S!vVCzbPYdzNge_?(0yZgDAdZ#>axx?d5=J0iv-`=O-=TYQeX0<3gx9Iy*6zMm+16u?WTG(Ml0QWNT4<2JH`yAJ zRYOkYj*hSHSJssMxMF#7hMfG5bB{kh`|;Vw9~Y5%2dubzS(y~_dCO9m3~5=pNKpez zfdK?T3slSdFJ0PSE*_E-2zkv4LSX8p`&f5KhPc60Ls<)@dYoY=BBlO8nghE9{vBLW?(*y|C zZf_lKf>rmI==X^^eJIa-H#6pIRRgtYp%jYqr{)l9Nnt+r@T4I0T-L|lRhjeQ%Nl%+PB zD5V(T-qNzHs@oxnk6yeuic7^t5XbG`jq=mXXvYly&M~b_OB3JA?^9Zcs49~xMdq4M zBXWhmm(`4okr_a&@JKy&O>B#ve?fYkbg%S)B-vIY>MX`|%g?pfliNCPU(dplgMHfq z-#(Vx@3Xe;==^LLY3lA!XJ^+vV%-~Xq6?NhtOIllo>_*Y6R^y~vcJE(n=Zh5gZ7rX z@D}lNr7)2qo;Gonpu5ML#|Ew{otP*ka0gwNq#k<|;dMot_%WEbc1ioCi=NyFW!-%dLVX z&oVPPE8`O`RVabuK3Y?H7eb*DrgcUCCMC*il6vn!N~rPAXy`!q-cHZmPp4ssmhuur zq++i~Zp(W+Np0#z>5_DZv?{$xdK_Bn)6%=8ACg`~-b)D%=R?i*1kIlh9l~ZUV1v=x|^g&1L z63`vsWJ;>f&wVA7R6Is|bY}yz|Z5 zO-B5&Wy+X$r5otn=V|}%LZK7QuT&E{ zNN1Jpo~d1Y>Zyyvu>~W8j!Y4WCdVN7 z^sk8s8b|~BdiR~&*X#R@fB*Oy|7O@B_I%aNF=CqZnuU6FAXY9 znadi!;yR_AT0E(I_V-Rt9!%W-qKo~6YvCTxkKp0|bl{cnwES%9nd! zC@gzF)uq7kX~#3uZd(IL`A0>GU?8V%v3IkX)2|ZutDD(FElKX7)ab(K=t6~azDyH2 z!{5Lwqr`Vhtm2S31_$Y<72-ki`KHE6&WrjX+rAIU{|W?g!kn%eV2NVj-jjrI4!lPF zRSe_ws&0Krbc^6$vC5+e{SA3@+PQnB1ku^nn}!NIWRB*`P<+fI{M6>0uR^9~gt9lc zWZEcdl5Bm~jZN~AT$_eN*rLbGCgdetSr~S#Y8e3GrnI&e@soBqM82cIYM|#tZS#*Q zjT(s@K!Hg1y-Gyz5#TrsDf|NIE#M2Xjkh4%3ZCZ7Q6cPq;F*eb+Qa=H<2WdEnicV^ zuG2xii1$=D5Q;~nAW7<>Nx7}4YwCAU8XkwrOW9uAra*NbU5fJkxt)q7azb7{0ta#y zbG5CZq^@!Ps%9{$wC{5wcg0L%ud2n>(^30e*e?n7ZPOHUEzU9{a+t!lz()~sV5L3m z0qpfO>rT-6g0NpX{ouawbWeX@f6tlAmzgAxsr>hPI`h+a9UWf^baw@PJ^hF;%E!mw zB3XsPty$7AsHlW;g<2>a&pz-|V?V`C_x2tfi^V>7_piiaV+UdUD#O|T$xr^u-JheA z9zmwq4Kl5ms1sNH=-Vd;KrbN(L5KrfT}A6|U0=lmTj^ahnW8spCPrFq*gZ=6exQ^K zk$HHUS>RyW+M_3kkyJB;?xYGiFo%GqSDegZOy2Cj5^rC=&_VR{vje`;wiM!xn) zAs$7B1-22{1*k9au>%#eA+y$^nl@-&*SX;}*&hh1f<}#|eX2>5;s%gadm0@C3ORQU z+ni?HXnJ2Epe5Vp!wrSkMQ%Oi`!V^ufq zlGkbIrIKmZkZYB%PB9Rsp?tza>gM9f9x5QWpjSiIJ5))yxlTp(c6A1op03G(p5FdY ze}7O``+V-64p!!w{RS1gySJ~myQgblWT3|l!1Ho2H4q89`;h2x^WuKL%m#XT`bPVDdIs3& zsNdspxjY{K=&prcm%o2>m;BIDWN>^j-skps+zGNlQj0s2Qdfie22{|GP=qRB@S+tcs&XcNwMvooE&Sewz-$jga ztXDS|rpODjp~F>O8|c^j!&+%;sY-T%gc1!Pb^_#1r>jdvzqGFiaejI{9fHL(D5b`$^a_8?P)D%Uv zqIiMaJM!BUM1#sHZkvCt3T_+M>n9$eK4g--?~)Gi8p#T^Vr}e-`A+KxYKS@w^lRRG zu2WA0wh-pMCjqv(_TKfXY^U!j=>BY`n}7(fTV6wlLQ-d^X1;wn(UJ_zhOxDUVH5%Y z_V288Jg#(swAguo&&aoeIJHmeDim0?OD!Tat-7|EOYNhXNGGY> zcg&A-i-`I*oVcY!{F$AYaKR={m9))%0&<9KroXMP!0wT;ygqy6I^F_PU5Ce0xvd@p zHc#omy-sO}$G`-B6`0^HO%Ozp7U1Q|iRIgw7&@R>Wbn>RUtVr+WW}PyY~3=&+X*Cr zwazlV*3itA;XM?M-3*_VoNaT>^=FzLCYj3hT6u>wE{(IVvaed!4q?)8=s*P&kpD+6 zw}2u?8P++l2C@M-5oIh}0H+P`8-bmWnuX(hNcNzM-D9!z)V}+sM&h}BZyNOIp0T^> zdw;<*7#s84Kxfz~e!%Zc$8!5_j^Twgoi1l4mU17Z_EV%}-U7Gf-bDAkSGW)9#u>@a zevf^f&~KXDzl_>1uwh++;E&UmsJQjzfp!9d7yq4MJs>HgTT zVRU#MsiC2i!`opP!!d{KaXLM+qwPwSvkpDoM<^v8oGBSf@8v}X#a0$Ulj8`_Ue#wLFvHW_;-5Bg%7 zLvW&~W#JSv71Mkh9KtX5oAfE%+FRk^PSboJoC3E#OH%X4#J7+aD9b^<1VB+p=H#3+ zpJMmUh7|+@?;Shbr~@xsG1#rAG?XjWUXyA>!&}-8x5YUD+&V#|qdy)iCtqGK{T@3V zy?BGM%Jf|?Pp(xU6u?dIsGTkgSoZKy13beDFbY=kW;;9eCq9 zTHNyUlGJIBk+#jcg@3~_&d6gvNA?=De^|WarUG{O?eH8RR`~Zo= zA0X-MBJFc@!3JKoe{?y_s&up`Oly*(FVdMWifiF2v*3Y?9Cn@|HoVy=BFCT=SiPU#S$oJ^n}ROHsY?88F3S z#nNk1TxTZ$HaM=IDDf5CeZp5VaVeEp9G+l(jrl0rZJp5Lr4m~EeMXOKr4zKG)?>>G zw)i~=8Ub3IJM3>Ex2q-m(}cA+Cm{r^Nk1lS-D`tqhJF^4V(fQ7_Z>uJEaJ;UjC62z z3&m!gg<*n-%WMG-!3fRb&tx1v@^`TLftQXY5<2|6SN_SH80`)uR&?DvunaU}AQ2c~ zuiV-A9rdN-iTm<-Xq;Cni9q*QqC-(u)cXS6iYia&oEouh%(@AwOK-CiBXk72SZ>(n zs04Hj_aK#uMCl2G%EAnNnQ~7+F~QpA*RYdy z4C|o-!(AFv_U(#mQ&IF$-WwgB9gF1;l@8<=bR7ozz{OZ}xXUMrmLRPeklTQ;x?tOA zThETdBgmPwdgL%Kiw{QSELGk z*Dgt=a&ayQKa;TkkBlc>pmEn2e3jD=K6v`}{6+Xg`^J~HiGRuIk=#~m zY}8yAO;OE&(?lCkkdU6AqbF{zgj9ZOC748MflOtsl{n-EJ%;#l-4t^WwHX1ViYX6x zTMQhrb1sC*$t_8>_Pk6Datos*V4M7ivJ>8l+qG<8LwZTCi1njacdnhFG$OPVdI6H6 zZP!YW7zKfoiL0VeM~aSZWT3wUt6vr~+N1{!h;b~M9-2GpLSYcQ*scw|2+F*cKGf0l zu#FO}?N3=o@Z2CCGlG4XOt#h##-wA_>crC0#Ng=YATGEsII$njn3*z@LVGVQWkz>r zpMxa>`wG)URl2SVp78_Zu_xxD=Canp%%Yug2ptQ_YtTT6qdhJYQDoT$n`8-OBc(Mh zgUw?_C}SsqP-u{=`%jozF;3IWqje*C*)5!&p?XL8(&mOd$<^aMz9U zd2N-z#7l;i9eJLb>^L(C!Ct0-RL8k<>K(Kp&r_2X`5ghgAzMe6(mR+*n}65#3AVR@ zKmoY7r2v>D#-{jYlLU}(y(uDm?^c@u(N18Kg@A~$pwehJ3(Y+>ObQ~f+V+!L2sA`Q zPASxye#_@`xK@6B#pSSf22b63@%*`)E}m!Ap2n~DI8rG`58F-K!oa|P9T*T0($FSJ zD&(N=rl3~cu)xbAeiVV#im;&aUH*qmPR{HHLVax-gtM|_U}x3-HrLcv~# zXL!nyncL?G4MVE%CYaBE`p~TbPk+BBaI3xZ5AQDZ_LgwPs(sGDfu|1yoPG9Av}f0w zcJ<)udquH{vDaLD)+#_k*{o7fw~YHHlg=5FMt;81(jS-KaIWz8)kLDY$>ZwZ)W+@m zZ&f4<+$8eB5twhLxy(A(l0T~iDV(xsPT87{X6Lik-nR3Ru59q)RFqeNeM;o}d-D07 z{&Ju@pHR93z!NtM*ac_f6yHS>DPtR(b6ee(!d^X1}Cz!!)Yz`VWg(6MR{*Us^;iNqn{@+Co`->#{n)}n z;p~i_h$ffDb$xv4(xtPF|90xsspp@6fxT(rBMS=y@$PZ`$?@^Smu^1%D{x`Y^Uptz zb#_6zK%Rm<(5oU8sh7-y^JH2Kc{oXMn-zq#K>J>}uy1nj-pSiOKFu+Z#U+_q%n^4-5^&(vz=?L?<$kXA$!JgzXhap1vdz zmbr8|g+gGEws=~WQF-=yOl9y*F*QCi{Q=$Wj}KnB9gBcP`HUKyOo#BC=T~BCEPeEK z=P7%gigG||*JkX%pQ&M2R!mFfcIWEhtZ&i2EbM+!Fqv z+|&1C-j2bpRcGYG9o}eH<4b)#^4!hO{A}d^C2RGc=u67`oe?JCMc8Tlteoh3iX^c1 zh}J>2<6K4zeZH_AU1lsVoA4_O16kJ0zP!9VKM%{MIPZk8XQOnqrwyQC?RY9ofrL+- zFrnHZI8z;I6b4AMcG@ROjccW4IxFG&{~o5NTf~7U2^__BRpbH^GX<8Du^GTR9fB{F z{q=ACGSJ-`=vB00-t`jgP9b@vXhTjEWtm7oo9zYws`0YU3qY-Nvu3oz@t^ zO}4PfHj#ClJh7U&w2AZ>J^A{RnM)?exqgd7Vs9rr!J>2vd<)w$hAdQY)}GID0~PWm zOAjl-m^&9z@n1lu%;yNVa?(lWD}+f2oFpWbE}&7S%mSUV+UZpttZ&@waXoQ!*Rx(@TMNt(b3iK?U6n3rhx^&do<*SSC!p;gTa3OssZ0ewE^|Sl-||t z*Cr$3M2902>2zw-{=SUHlB(0?bTa3b7wzrEH-$Vr-M#^O)1ccK>(kQx;F1;ecAiVB z?k>=|bxZ`@Bggn`sgn*w=5ve?uTby+gV7&_p*U$;;R(_|r?B&}&n&tk{#n4);56sgfEV4M>v0a?Hp+yaiX(GH~S$ZrQP zyq!G}ou6Geb2+j2>yYbuET$#m!3#^H!-?tL2lGYcw};1;F0xYNUD5f(gQs^-FWwY8 z{$F(cWGtRPuzNZVS1$zP2@SOrA{J7&)K4V?q%E3OS%%IU`msR``& zF^A&=mwnE+CSpq;a5&!kR;TasQtSjwM=t7jbx&W&@Vi4xuD)8R&tt&!v=r=X{46_% zlM;Ja-~o92FRv6QWNWSjS2;Gh05$>|G=H*=3MR9t8wScCinPNthMI2EBnUH@J#^SY zct=q(w<(^tWhtmavgEA|TiB?_}scGQrT(6_Sv`LW)blB8kVTcBb zs7uE6P?u~BEhP^tVX@=Q;JzxH&%(k`uv075inZbfY)h*}g$^*(JQ~09ztvI+PnApb zSEhKBZDp||6p;V8fiB|}CN;_?tC(vQ__LzYvVSG5RSY??f)&L$odXR7{5&n(Q57aT z05$#7(L?$nP+u}{c08R(WE{%5nWJ~zb@W`WFOnEeG}gld7}oe|?d@;x(C1+6HJ*9q znVwUpz6aQoXsMHA8|+njzh<8g}0l^QZPjCJj| zGO^54Lz&o@^mqDqr_i-3wcCGh4V04m_MOkhvZPa{{Qf89Cwy5udLgE7_X;!^mEl~# z)+xhMfc=w@&D*pSmWP#LEJ9IYbndG01nfKnS>^ZbW2;;pp+5>mV#{y?ocyY;KL)pK ziseUIByQicv-^6roS)z7yDn9$iI=x?To=$4Fn!J!rrT04BZE25y85EgKBV8GeHC-X zcm)pD`=Ur5_C=*0Asy-q6d5%^a`6eUF_;I`-X&^fz<2V(25gNj%3ztLW5&wF{HaG~ zVF{q1EN^vDqkbr#U12)DNXd$l5M_%R{54<*0B$;}lR|er+D9NTHy@t7r;e5yI{x)V zG2{&PW;5CcD;-}zUqi6C-nJ;ps2%5Tkd?-P51f;Bfkt#cj|G&ozcQ8F3J>PAmH-E< zC*`>vK8#+1#(G#P6eCK9g5OO#Gf7GA77p&qY7(>(+WI{>T4H0^D$c^4{qv{D?-j=*8#Ut-zVu}}dC!iwv ztg&vQAe-qJAT$htLK}7{QGudHJed(_1#{eAA%}>Q4qI%OQ#P{&All95xkkZZi98rs zn+veN|u<`okfJZL;`z5`Qo=+&`oZHa3><#t&}bJp`m-gzp_(&W|lNUfVqi z;$5mKoox`(ke{R!gc=N)3II1*sxLtdv)7qxim$&sIyeML^3m2&bgOvG6HmYa7^6!hGNOcrXad-HVIS$l_w8x~;^S z;XSZKB2l`J=`9hofqw#rOJx|Qn8WDFSx{*Oqx9yFqX03%qPurTaVhiU$5qYNAk}J2 zXVECXL8FVX)aM*kz3md_-#>k5fSZJ7L+VADYj+jBbLj5udh7>deZeLzBPc zvraKsBLfbpGa&+x1k8F8L)GA7V}X$LAlO7nrcB|Dd7kxJ?4^@2ENS4Ap9}zxO~>o- zS^vAz^Uy;*3JdxpmgM%&2o;5+irA_Yfb^v(yte9^=_gJA(3n>Gk3Bs#&?nbC9^AYF zabh5fxnvK(8LU zw6t_-@8K!!u+O*08w&J}CC2wn_*FUvYU@ca^{sZdm(5OevR5frob1bHl^AI-urY69|QHoe8$2c@?WP6G+KrQ|+ZmtIfQV z&AkHZKwzp)T>CT1Raekp62DZN@#}Yhk9Wd`T$G=gn%X6jf7!ywk5W*q@N4 z*f4qz1W-`SvLI)%5!z@FR-wTFtLT9r&D*erJ>msJ@H0)b@zqgT0TRJ54Imp7d6dnh z(<|xp41?KwVysvko6xk$(d;eRQD!3gUt{A3f^x^59IfWg4mtP(+|EiFA6N9jXcRh} zTl``q6By%EkzGq!Vc*u?sTcx=WKzs5@1>7aEcerP;wLTwh}UZppysze(;Ms^HZh!g zC9WsBx)OT)l^o38HCy-A5&oDLNBS79f@N$b@MMBlP<+wOZ!Aoj;bU)lyaY!J$fJ=<>cN zqLoUN&xHGko9)FpfnsM6Kr9T>m`>L1fujJNIKuuz^vr54^<&Gi2}ttrC02Q)c-xtg^LOM`zy=I0q02LbQ>`a5|YMVWg zHY7f}6=ffIa$2Xza)X4Vggll{vZA7d^dfp{>UCqSv}Q1kNo5XH98wG=WPrrG#6kv9 zebgIZuZL_I3Q09YEhURGHfPf5p=!#qXF3|McD!LOlj!R+O!zL2fxh*=0S8)fUdu!R zy90q^dW0QnJkh5peVe3%WWNvei)7jO$#VrOwu#l{IJqrb$Rt*1ZrIJJumhLi-k^tt z5JocoEAew&Yy-mVJSYS{OT6I90Czc%fJ^)NB!CfjvShld{P& zSiZzMd3=Kh4V;928XuleneO9YRjZ4=>MMl(_#&e&1!#LK*y}&!f*3SC6Cu(JTHi+I zC>XYFC(EfxsxTRm>tqOMLLvaPluR}C5ZnN?Q9lx7dpdm1lfLjr0?hqS$a=VkZqT`j zGe-wu4`|&TZuj${l+z8|NoQyNrAD2u2)&#mTV4nCkC{dAGAXSJkg{+LzYUQI{+`V; zZd(g)=`ym?grLu`T3RzgMElrWz*^#{LL8_qN9#&|*dA>UJsO@pQY0>(bqO$T1$(^4 zvAglb$HGTvsg~l_m-1sf=Px0XB_RyCvlb|!apv*^XU{%xnHA|B9$db5^5nHv^((RNFOX)NerhuR}umyXG>cV3>urb{k9M=z28%!AvAVmIpTfi*|RC z%qgR`sJZ%PEAOnZ&-my<3wHCL7FzcB7Fm9#eyx6aTpex zMaaU-KoO-;WD3w#r7C=1lbQBx#=k+ht(_|}5rr_Rp@gPL2pLtK-iY|(?PUT2g_wOWKaDxr_d+@3Lp7B)3;7_`bI{v?_aI^I#3bm>R^#ur>8pI zK02;n#fzgO-5tVsP4PrpEk0u*uV!Xdr;~%v7(^5g|IH1xT8(=1OVsBL&=<1e|0SBi z&XepISzZSEYs)xN#Xr$aKrfepa@Yj8;1XyEXurfez(;Zk<92~Y7TcnY{Ni{Y*4M5@ zGT_x)%tRQ-{%dshqpPbhi-F1jA$=VnU){~t*{@oNyRu3|Xa+^>pfd+r7WsOW?Tx=b z_Wt+Be&6R0$4^dn#KXqNFNMQbS*LY=zzD}XCU1y``=Xb^N5U29-x$ftwol{Qo3WMz zp#V+W)uM^)!G_irF#4N_UNQ2oYkZvc*s_6xjR^}ypt(Yw@RRu$X!|?GGLAR6Y=AUb zw4~vZfbWv`h5_a~;=l7|{@Zcjx^DTC*}Z0X`v^kqII!l$GZ%kodU$wx_+}dk7UzX( zU?`m)3jFo(bTT>p`gSx}kt!xj-7LtixnN0_(Il?`tPC^EZ+3YfHQ(f!V{Brab+H4qBlueq5}6=<2BObn2NVP*W8R7*XnR6gYStUa$K{oS+QAjs-uV;q zDCF2b=fw-O8#HOi9?qVCB2Wi{dlkLcm|fxQ+)orXcTs4?z+1uiz}bno1gIt`q`67)S(N{&r0 zr*egPm||qPDa4og_r9X9ohg>BVJCzdYgIP+f<%*#Q$lt6p?^8Rc@YqMn+Fq-_fWqG=3fRqPb z0HeDz$z+D27uOYql@z71hMH9q{$OCnuYdLhb0S~~@@ zNQRX?Fi>n0VP%uzbkE<9gv0cMmS%6(M+S|N!R`)VxCTcI{-Yx}i)QUe#rfYwv*bI& zxcCp>quHwXJueWEy1b+pIIaAqep4C38Ec_ti%KzYkvbhv~X&A@00yTtrY7EpY#G?Gx8)MCg zZuf~LsZR#N;lRh~tM~g4wUtEZOBg9UNIZ;^q7X(YgxMsoU|1J&6o-h_%$cS5-rqB4 z_Qsb^3;Q+kjIa-1NubCebv8Fov@%*CG$Zm@NGPnhU(3(0YLmnH;Yl*$ixnEBHHi8< zJmaX<95cfe_!GEMv_2!xchHdL?9spQ9rL5rqF&U0oA}MeofuNHQhsrnc+#nF$B>eS zh~}d%Zl@gxs-gfUp**s0_gXn1swhy@Hrgb^+$CEi(@+Egnv) z10#t&iNt`Kbm^0g(xk4x^o#X+C((S*5kvRM_aoi%ellTsmT1{LkD_H=JF88D zba^nJuMjEojw1YB-7H?#brLW~NBTUQX5lWvrVw&Ro55T&YiNZe$s&C_!d9^I`mL1r z%R>vwoy+-~M{Jyh0iG4rUUan$|h&9#KC%7I!4z&k@rkmt}Xv<=dmu zRJ)8jLqcwOlZ-n6mc}HkQqcJLiN%TZq(0s~adc>=H`o>KkS}YQ+i6^^=JQwbSFYsq zmgxJV<3>Rn8W;{bC+|Ai$7SD*&!+S9nZ%_8Z0xuXb!N~^M)DFH504h2Ynyz5eP+?2 z&}CNZ@Ff)Z_jPP&dDz!ruWU{yrkMddE6d9(puPk01&!*~gt!rvb=WV9@(u@K z;}uf2TQ$a?b8>UP(i*quqg3jUiXl13KB`hKLvL&^hZP_$%OosA<6oKU5mv=gXpf39 zl?l}_ODb+vh6%4}eOSKXhM4{P7?t2Z31^sL$A&&m_>a#?ZYm4Q7HWSPdrf*I_LF?` zz3}m}BTy6Go=r&;VZ|zsJQA~i>=EH$b4)@;k1z?7i?JeY=#DCbve|b)@u5I)(F%Vk zx$Jy}=sIN2$ZZL;xE^xgF4I?$pjxf10=hD*tQzaas&*C5mEh!#=>TpBjdYZnLTgrp z2enmWOq_21B%>9E@TL&~fUtxRWCJH0I-8mxUx&;IS9b(Ic2MC(I5Ip{%Fn zjEtPfN5`IA(<+iZHhcAOW)3BD+JWxzo?8}=+;!KHqx>{*i&L3}V_;te?fS!z+8rc6 zqLzYf#96?PPmS%+p`V~Ndk<|IzeyX3o-^RN8h66{f`2CLA$6pfPv zs#$325Z3YQ`WJ7A)nJE7>o>$Umw?_DfMg1+Di(pcU>vgIYCcEpri1*sQasWp3Mo6N zwId%EqdmC$5sJb|cZ(4x(Jt=Kn|J@E9o@4gRhZ7oI36)23qu+Z4`n!Chw}!WC(n|4 zxdLZhR_wFCu(0#9TjLZJc*J<@;b0mAz0wLs$O=TOK1AzJ?rp5^o#>xQ97@deH~xlc zDAF*5kSZ4@z^7|@V!}Vu*Ei#D{7JEhE~k>aNsl{VKR|ZbsOR;=bRZ+u&xaN;=L(^j z_*_;-?Vij6qoaFnx#e-?4jfndNexM#sgb)a>t&8YqoJuUv~f15X&T4n_$9FMg*I-KL1Mm* zr$!oCqO2Us236`p^UVq5$ld9$PrnJ4T}PT;qDOX3e?48r)!qMr2J-Dvv`pj!WKA#F zr9U%r_mMpl_wAYZhmpJcDZvj;>^XAxNaJ@${sDKG$&+;1(u41peGREpnSNdMsZE2C z4GI6&kWITT-j1*-(}*EDX(8LFfYKuV)&w@!ZT8gC;qRyDlGK({_WC(F`2?oo zWVT&?Kd;Ws!7qfrZF6nZ;j;acTteQmMd`q7;=bOy(zJDzNn0~l*6T0_ZI^3B*EeYf zqM~MCn>gri^%sr}4IL}^_mwxrSwA}MIe5@BeKh^+n`5~<1Pknbl4}X}esW8Y^^Yz2 z8_2I-6eVwMi0CS6FGjZa0~hRcvsq|z>{-G0`zB7H=Ba8vAL@DYn|p$YDuGBefT^8G)f!ONq;$9nhd>76-?H=ebn-5XS@ z)VC`Uhfm(A5a5EbL&hsWW0l+OQ^zHVp<;?Gi1}8&Uhd4ufa+7buyp3KvTXsF6v^lS zNpb<8VV1WqNUIF|`|pM_T=)C?uUn!Ig<{Gj%%Y5|_;_Oba#cH#z3XhXjZQRYcum@& zjD%Kskb1`u@tBrQHIqe_Z5Vkuk8PMbpGb52dmN|Ow>+La7@!Ug`6gdK=}UxR9~@}! zW5bPaCCud&Q>pwYKNab5_Z;Z$J<#j!9pKO0^}@25fIF^=9I+L@1e3pBJ)o68gJCDM z?duQdtX6q=`*&qs6_l2@#dr<3EM(eYi~I(cR$3bnDgpuS#H4Ht_MOVtri3VSOubNZ_+yGre>HIk6!jWZKGt47N{z}_ zYbB)@i&#FXO^;zmdhH=kT9nX`{7^-r028#m=@hiy!?@7Vc<*xF+JGX!D3*-7kIat6 zqsja-)0?|+9?G{@+DjCyPfC&frEDjdl{v5ydWsVTq9S`hW-Nr;$*Q?rB+;9h`uixr zG|mnTcsqUyj!ZavkEb&p4&e=lr?q%&Xbw)tq5$7G+v6E`x_^qF;a44=M6X+PNB*G5U*eZeAZUYZ9)T6o1%0HEh|a&YA2V; z0yPir_9X7&t`jK*w|VP;(M&zz^zUCsz5VL#&uI^y1~e>E9kFYWQ^gY2mta4mhaY>nb&L_S8j;0~b$5{JO70hxq17ymNd? zi77XUG{}Ap97XQw3+=!CvvLnUaPg_mdGN6B=mwK8V`%D7&(Cf<|6tqJC`Lk==3_X~ z@9|_Zp!<|9Kch78cu>YFT5rMfR<>rYnQX1GQA^D-Kc0i-vZjL|!^}xEUzFM3vX8aW zqvS$z!7ZcPS6T+XJrw%%bS~tF4{MqNSO+e$_TJv+$<=p4GU{BMrJ;ZX|$d5GG+Ljo4ob zKga%7?)05L4#3amaK=76TPZYwDRd~+VcJ(*`^{ztWxa&eE|ZVdC-T#V477` zh0f*R`{f+?Sz*V+E*maEYzEto||3@-FbC%j|b*0*T}%WK~FH%(<29K zD+yyreM>Oma{8j_&Png^g`%Fze)&skoCSiZLAkRlHAu5I5V>rfv_~3^wsz+r)hy{| zm7FY8!@MQeV%7Na{gKR2fCc(u{#}u!g%h8%Dt3xwTsOv-Gm$3(Lw(7>z|_=fh1Z6{ z#b1&j1K_j#=w@5G!mwv&t16~w_;<}8-fB_BmNjjKelJEuiz+fjvH1}zzRM8Fp4{7* zqUSg(TC1SrvMFMRymX|uSnNH*^iol`t<7y?!TvD62z}G`f~0&RIE&}qJB1D}LMCGL za57z2iq&;7eO>1{{O?61r!*_urYB&j1+CsLlPI^v8M9Jf1cZu_KBkp4R*v>vSvHL2 zD}7Ozfr*|JEbO8yeWYW8)4MxLrT<>Y0tbd-ZWR2d8eoT|a%gg;T}#wfbhO#w;v2kEm@JGuAYsSVjdG z-kF`xe!c}>rGUD&%1sOEx*pADkF+8^>1bOjL{VRBqPUOZo2bBe z3`cP)Bnl=+wz6@{;7oeGtJjwp(6cjLhhc19{E^e)y^l<=K-ZjeptnEle!#h5IQM$e zU7bsP16nq?C!AZH>e=NTn=m^Yf5&=);r_19fA$K#exwtW0ty5?ZRyLiybh2Er3xUK z9w-5Vt8U>0L zmEghIhIEiTTq6zwP4Q>WHn_tq3EjCsJrOD^I0PFuPO@Ec$htNJ}qxsy%drn39I{DE4@*mvItH07mIrri^msZ$1dG- zbT7OA_~NnLV3p-vR3(H-pbf&qzR5{n$~Q6T8xCh8W$gw~QwITJ zX|2N-P-7vO_LmfO*&mTdM&vMxV3PhYK7vcwpM*J7uY|hqK*I8lZoFMlee{!j zs|)!YpXe#H1ra1C?II~C#{#f@VH6RQoGK~vHc>FOw#w3TrywmoV(czew% zt%xyycjh9@p*`sZ<9(E_4j@W_j!qa^zD};`8>t~(ABub8s;&Xtr+y{&`7(**PStyRC)+^Lhj+y6z}u5I## zT+|eN?(66KCzS2*4%yZr+xvFRwu#L7iWDH}0{JOG8?#**p%uskECt2 z04bpqsp^WNug;$6>P2>K@lveT4peG2C{3)`gbq10J%^3-Hq$N-#+N)>ag zP#7~q+h$|sQlpZGNtcp^0Xv6AlD$y!w z4qMni5-yg6_te}+V&~nB-#O~m-RFTO=>N)U`|D;)xtMY9bF&xjH6)>K5w&i_!l#ze zfls~8x67|CF0L*<-TnpHR3>vglUdy1L+%_Qv>@jLSvx|gTo59JW>tz1S`L*;p)wc? zu7*k+%>)ivjc*%uJXbdO9cy&A;MdS?V|1ZNEfu0%LIt$yRC8SZo7oosPa5Cnm~a9A znVf6xJ+c`Lu(EGl26hmpjrHc9(FP3oZ$1vo&HQY9;xX`cSZaAY+FV1X?O5gNS1K9r zVNgz9HWc)*2Z^=xA-bHuY}azMUzL_O4HRWO9$}_Nh**1p=>+x0N zj5<6jBNC4=#Zg(C5Kl&lk};o?=OH@31@^DrEc;ODWZn;K$ip)W*hNb~%cA5q_JoVP)GJa_0y-th^;UP6dq4K(NI09k9|>OKL&Rw_9a@ zvMnbRRP}F}Se%adK~$%ifXE$t)*rdYZNbOAXZm2i6zBl9tiuNqK;yD_V2f$ z;{?vzBl(b1QP4O7Bw7lZQf=t9jZy{vSk0_{;6C%FbLUED&q`$5Jx;TIhI$s1k#iSK zh%<8T<&<$&2K5uPWiv98o=vk42ExR&1g-+EGwcimuR0t*)c=WeIFe3BI$an2aN2*N z(;dOi)qkf_p2Pj`M0JelVzH==>j{pY;N$%*0MoM?G$x4w1>wcCx2aTZU7 z?+B;5Bf{*x%8htw4Kul>B`=8c_cWZheYeic=tqvmGeN9}lS$lj{D-2}t@) zZ4~6AsyZ>j7qup4+8*IS#3bTliU>-C(l2hzQK`k@Ol^lK4@8Me?IV*Lu#lJ#D1tN} z8WR&Cc&7gYT>5W|GdsUc8lNCvfK4d{$Z>%4xCU>lDAg@kfK*I+XX>FJ-m~Y2A4dWW0oQ>aa<>x2F^7?2xR7$xyh-~0M#i2 zf|Y0#-q+gV=t%*jh25mIODaway6~H?G|CK^JZP+y4G@AEFm=HkTfDjod(zdbw(UXP zLUBm9tb$~+hH3+aR&1XVc8tcOd|k0kq_79naEF@%9bE&9sa600h2XW@>`~&-XD#By zwx`cxMnc~+nFJoCHKH2-m}kN>tSAb&ls-fRrO+?8>qUhOq}`08W!Le~yfnowp1R0B zL`nP*^`?6c4`$Ls*C@ApYVzy2YO^3NXYk91yLmec1DWTHlXoxjBKB}h8?Yc{Hcrs*9wD9`pNl~C$fgzlsD9}|7p z;@|&}-k6X{w?;TCklzB1#BNx)uj}C#F9W3TE5*LM58e^IgB^?B5#^x54FD8=@Wau| zvynaKo#ztg&Lz($Bq1LW)mESbJ#BfSEv*a-Q|N`pgiKilGJ6GcHTYX>2pOM*>=KYI zeiq8{=I8*B8D}mBk{uV=FZ9NG8!vuE%LAzK<0l*c6>gt;@br;_KNt@T zO+v{ob|iuio*o}f3=A$^5Nm~`7`*mrt}BGvzkyZze{r8`9t!me)$w|}{=c+}mtGPo z<1Nkl_mE_~?r;$;9RW&mRyx_Tivfe&Bve8M)Q3b*&WErm+FoySBf`FF*%w&H_7T+b>8%>St65lx< zTuz~Np4B!h_KM`Iu*$|8UuC6D5jTypj=%38N8=W4Rc+(}Q5)L711d`nc|8@h379Ci z0ykTk-6SWpgxmrbVLCSk7xNAb3ScYwM_TeJ2|1sg?=)I-vbJVi$M zHkA(cm*tM_U$zD=D`kU8JH6%B91GNj=C7Zl1R^A3hp&vG8tUIRKN_b}Hnn{H?CRCn zdkV4Vw$H9ojlH`N+abet3ps`?C+X~n5zUflOD544*v_%{M(;jSEasPcAA}`N2khpt z*&}xwrJ}K%kHrox=abR6bw(1Ri+iLnj}i+rY+)N z^whSYi8ci#V%4n?iQo%ah&r7X7m>A$6e0Fb1#Uu?p=ubcNL+_~H{{vNZLtag@uBsy z^_N!$i%&Z@Arci@;{`}3Lki8zK^fM>oWgi#VHnR9U_IY-B$1(6>FC=x;m~!* z#2)|RkwyO=>!5ca6`O)7aVnM?=w%XD9B4gWMOWk=eJBO0jvg5fygg72so12`IT=gg zXw2Zdce4%l_fp8R|M6tA9x$lQAkM)&(o8b@YngdxdV4=VayFLe3*KhjlDU|O`FqQ* zfQ+Ym{jtQw%q_+({XL1;*%2Xj7`3SYLiLmIL`LV1w3-Uqp?U!Gq0Pcl5e|%&MP|a< z=0%(x2gmS82IM4@P^m%Sn_a93RQEOrMB727Cyyjk_B{`Q_w{;yfH;M5|1I0Fcx*4$LTN`GZ+2Q-3h@OXj{Yb)`5LP>m&+Aq8xS*V$|*H@PKc3iWkBDN!8eiJ6?c77Hdzi~5$Bl=I(O>;A5uQLW&9l$JaFNz2F)eM?S+Rzt5aiTDy$)pbQ_)R;sSBicth z$SQ&26=s{$kJ>b6Ceq~LhmEy00Q)H1Ynrn#`T7% zGW;snbY+v*O{k21KBm6e<)&6HixL}EN^F+cU=#5tx%YYiM>}f16+2}er8m&p?l1iA z?-pX^a!ZT@(~gFLO&kBe1#JPYY^G1SUoh}A?NQa))Y+doJ4)UDm0)*wu=~qDbM|Lg zk^27rZahQM814l#MP;=m)wUXgo3(KKHPNIfhb#6nnvW*J{<8qAbk-kE3?!2Sa99Fk zRJ3DLjeP}SlN=a&qmew#tjI>4Aqd6R zcbV4UG#84vFP%wwd`B$t)A?S!(o1W4>s=&WAl%qVC)d+hNbw$-N%8#jV(8%P?o4L) z?7_Lchj$H5PaY}^%^aGTI5d;JacN0%G}9O$s&vW8u`T3O1~*DD=1|pu?f##gblAEe z$Mod9q9?+-chswg6S^`#Iqg`PJs4V?&d1}2_s&ta59#B3CPN8rFcccp5~0aGL zIy5s>I5asu7+qSrF^h$fzUTe}HVz}mNp1PCO8hE!^)0BaAttAC3CORV>qp_7w+pBwTT-ZzJe);wBdxvOmIz93qr_=K%=s@b;G+Os@ zP8jh>$m(QHT9EcY{uY*i+YT1uMpbRrLK<+x8443fL7rqD%wlf78Mqr!`N8l)!byT+ z@6a)H=OPmPx=DeTxjPqQ>IQi{ zUH|jc+68{Wb!9^yKhaasPCNJ-6a89Fm z=`ljDS0UJ%^oUaM4q|J64t71R7~CB3dKIumK64G+=LE~Vc$o&a>%A|Zwq zah1q%`8=KZRXX#ULAh9pqr8z-|G30-CD1{XtMmY9R9Lj)b*vSUX6$ zu)g3R#PCf)g$;K{qsgvh^nIGfRw<)4iC=W9+}thbLN>){^Ti4U`?pDi?i4Oq8oxSe z83u_4fz)Vtv}jHKQW$$=j!B8-zMFTW;ASB>q!;^PP< zw^VYTKhuneT%)gy7P2bI5$dZ(y>6_QiV)7IYGPfQ@Qx<8^&_bPJ!B`_8jNzY?9p3q?G6!)-L(*V$2;E9Pn8S#+0VE*1(O9Ay0%A)0IJKn zh35f4W&Q7)Nl2Y`?OImWVJSv$DCt(6Z<;DPUl@t=j>qjx$a$^!M%yZ-eBjMV@~HWPZiHS zipQVi+R4G#pfdhKaAEYEGOobytz+Zk>!TyVg|&s?$fyQq24g=D=f?5SY}XljrKp8C zf_M^v{FX>93}%uq$G&`WRksOJ)azGH!nwwJr6Q{RJdi3}V`b5ruZ2UBriErXK1EL7tbWAjS1{ zCJFgrF(^-76zIJ|&Rx{9IKOZ`i~F|Rm$sVS3%TptTi)~h#gV5^8sHWsWN9R4IgzQV zjvWD)+2y`?NbT)|SdgK3@6Dgw4uAO<`T%>qudf$xyqWp717nsLFM~rO4tgt_M5y&l zK>3C7Ph+NtR1MB_q9?9H>fv)%HXyh$Y{S2j-$G~;2iy2ZjZQO7)Z_O`_nT8-$4P(kYYThWg5|C zg~XBtKKF8YAq$nkb{6)Eu;30HqTm&Nu&dxolzDV>+tqYIB;VUbFHK(Yp4d|F!kLAI z(Mb3mtxx$pQCLsLmco(I1-RV%KSUe7avU#zU*s&d-k$v3rdm>eBn4Zab-o3z9s+_~ zutBu(kjRDe>co-`6r8>^an-gz+#vreTv<+?6W*g!7=>c$sCR;g0@QU;K24+DR_#M! z2gD9R?@-(f*kLNDZ%~-T^|@`R9h4{hv4%r}JP%4Y2uROrh|4QwIS7+v9)JMwFjFYZ z!Elqu9aOWyA#{I5C7*nJ1esbc+D{x;&c4_$4*O1H8<#4B6PCxUyWY!OtT#hcU zbI|1)baZq%;LzFclpWr++YWepSoNPAO?06RTl%=Y*Kd>2DhvM9CeT~ut?tz8rU{(W zznKl9lgIWV`ZpxS1q>7=D6+{-#bggq5(S+o33h zF~}t)`4}W$7l?sLHPdKE=a{~gKqzVzW4;}P;nryaoUq@AbDZ5M%g(2`EJ0;#enW#l z<=IDH177!GR-|65+}!wews=YOE2OWvy_VChq_$``S#fO})n<`%kX`T{ze!^mQk4Mq z3IMc-{S;u8m6hVk!pDnzLqPL)Hok#t)+5#!m4);?EhGf4?7^};c?fu)L$LzzK852N z`@!88G3v<0-LZ+IOTY~s9lrqtx8G-kdS{!*fraL{h1=~~>AO55GK%HPyP}5xtf0;M z%ucPFygLaA-8Pg_Nr}UK`JqE~chrj@m<3;aa0oAMfYMySsCy-*W6Ll=a$AGzdaV@! zrp_bG66S(mEwuhYHPrl1)9B9^BeDG-OOVWj7M-n$ml`GE;G4FJm~0v>d4i9qp@g)b zG@_tq$$D@~rVQJ|g=`_wEQfrxU>Reu>Ki6fhSzJPCfwAXuptq@&VlpbO@*7W_To^CDY-NcFH*Rj4oAgbIZatfBny76mxO2X>?ZFSCT( z6?1yh-9C@Qy~o2meI02y<8mk1&X+PR8&=W-MgB499&mZ)+>YK(ch=(>mE~TCC+Beu zxOcknd*aYviP+KbB>ujn8{k-&skX+So3o8jKZRlF59DH_Q%h*Ugc|w{N{H2<`H#k; z)clLZGyABFKzAby>*Eg0$8Bprw?`KYAdh3yb$drg_X^m8hQ6-r+V72?Ve*;Ln{Rm> za0MSlT)~E<(;uXb6Pf9dL>=o+=q4#^fjNeEn z7bY7W1uIDg{AN%xsyKK6&5%{MnUfI>BJ)5Zk+*-Zw$0CmiN=h1;g0=V=WDY2zQVrF zUVuH+%W>pXLWq^Ec>cJ}a#YzT9(pKw>#YyKz+TlOx89n3=ppvP3ok@3Uw)Tn{k`k* z<>(79aJpjHLMk7WMyVYrDT~#2D_n#M0LFY!$Osod^7-d=`1CsH6k~=FJDz~i>&;JI zz>rEB+j#zVoat}>!6W?Qk?s-1X&d?Z3rom=F9}G?orFPwHkOCs%eAoJoeF&{%2{pg zDhzL-J2HjV-J5P_Wpf~)!`qt}L#zrP80L;f(bV+7Kou@&fq|li*SbL$pd{o=mwMR+ zlz)Qe^ftcfXsm16MDL|bazdedaF6Y?Zj%1LUVbrR0$Ej1@8gTg0THvUxDiz?1pm5X ztQm@>IyW@D`(y|n%q z8BV_L^Upv3`RCtHXR7@@06>H*?n+T3JLIQm{|_(Y?QHRRy#J$g;j8q}Q?!;mn`r6~ z^z6Z%><0rt2q;<9q^YTP3VTD>i+PsM=S{t|4XNGOn4br>3I0BV*z0YmZ=>GBM&^YT3369t;$K+U8( z55^W=T!zOD=LI_oz2O97@h>Qc?d)a+EX7hhCLn#l=Z*py&hE|wwH#s&w1 zp>Up(%SO`VX<9O;Jf+&Cyql@Im85-+Nms5E^)f0V`Uh6S{UC;G)L3xclr+-O!!2qq3$`$r1!(X&Oek-w2)x1pt`*aG;2uD|8g+Lh8rKpX^Q^n$ zo?ATw9!_$+@3sMYB!%1Cpjo~z5Rd=5!`0z?cSpy+i@1$)8|ol$G3o0>_-jKl1E#oK z=70!7FeHYo2K`LF({2vn1pRn|Qx(`tY}|FMWsE}+$OYK%#9p~ScItx{$BW@d2PWPy z`Uch!d*uzW(?9?4tA>FlVK9!1zG)%?t)p2>1843V8@un!z@>}C6`1!P?pV3qd-&dY z7AKD2dllP=zl&9T|02JA{+&o94-s|orxsJ49tmJ?0X0!7M08+jR8WNaJlfRci_3M?kFG;=e- zaL_cFY0^8emwDth9(PSc^^?}vDAo|6N~CK!=FwLAwN|Z*vt7AfMEJkWessNdO4gU} zqlnalFvDfZo?;HDqrD_gu*Td1EHZiQTgD*)YjN@~?X+zxR6Ga8Xll_|Su?TK=#j>U z2!{j)VvtPMNxW<7pkc5~E~sHu;TrbD1~fI?z9zvI27n^S1j+D%%=O^eHB!P!{|@4P z5)DQ94|2SDs*)h;r1FG92P=Yq%CSlbHOt-aRy&ku;60ghf9DWl1#v@@?)Ru2-SQn_ zzhlhny&9pkEezrTN?S%k)K&;{v>Jl8a|3if+u+I7TIn~m64QBFV)FkAoD*@Au)>W> zwr;I5&(Bk#d6BbQa`bpGOZI9{f5)m{c6PA`I(&|qj^G(wy;nTT^g#CuJstP?<<6ct z+1C+udLIlHX}#&fPI_62cVc17C%Jx>7FMC})G%B6*$oX@LOfft+J&GiGa#`|wxc z{-WfexgrVw42HlOGq{>lOp$1L8>WgC&6%f*X6(bo*E6%ZEBzb#3W%6)_2l`-8#v-((VPVS7hoi*L6GaJLsx-B-%2(w>XWr8R9j+TYg+yrqB-YZM~NsI{;PP7e00xBZK=k+=wtjtK@n!|2IUD2FX`{@WbZdpouGH5H5Dw9#k?-euUey{(_8OeOaw{Kh>NP0byjN^k*_IT8t@6l&Z zn}gwkPyb3VFqxe^{no*OnI-Q&gqm~Z2GsF=zN8})@pwNNZ9E-y&-L_QJhn9M8!vb# zdoLba)RqFl@qPcF*Aa=F-r#0C3ho=5l{wVp7GsK1u}E8{nN&s8oH?)m?QMF)=L|}nfHh5rUrlfO?6#wy&%a5bP5lA(U=EsN)uaqV0F!>8@z*k$AXMtQ zW=mE$h5*qDS#I#`xlUAYCPjDej>2+uyRhJu#b{)4F%mrk!T7-Mo9W?}?M+y)EG24; zBuM@Eo+$fXa@f{zp=}IJ|Ln-Dp#=wmKqzUwn@vv5*;I6wswR6wJy?d+zlf^2KP1T+ zai=@a6k=>MS~kxVPFuT&R3u3;S`dag&yKo2Ch3X}zgxG_`7s@@=;iHHe?orTTc1Y# z(2n^4Rot^(7KT#VHhCHifqr2Iq)#$sn-?qCeb&-^Sg)zr$8f}@m#^qLdZX)!D=Ue_ zRalCNgq{FxtD@us-AZ>rHxmg6QHe{JZlV}hut?y#mN0SfwulW9Pjl*@a$#j2EVfZI z47O?j(ZNc_`UWYN;Lxa|kR0229@2b;)h!tdC>8T@2mC@I+2hH&vC-@2o*a$`SH~6~ z?Cy5DLfwrYVpkihzpW-Z-{_qk{8U#h=2E-6ea?f_50oc zCHPfOclVR$9vqfu;@axPvG>2JyYVO{$@WD;u4E|I>ATUJ82sU`=VGqEq%=*bh)qiB zqL@QmP@2P*UC2>qH_6fq$o{gnyt1-fNBSN}`)@u%F+R%@v|RXB9TrYR$^wd@*_aF& zbAl%YMigZg7|#+b01Z)6tLWy5-p=c|f*(j{OY#Ng9dzq3#C= z+s$&7@3&ML&;}9Qg@ghuf9TNdhYr0F3kVDT)RfgkI{b5CA0fN-S?ZJrHN zTRj`pVQBa{`Ys&wCU2wMq~2`E(a(jsG_U!g| zhXei7nrBRn29!bB)9L7h`dNZ*+*w*;+~F9cXVR%{>h0!CmVOM#XbAyJss}d zNB0}DOZO!w_ag|Ke_+7Br!`!j1G1&pZ7=8^A4xG z%i##5c6a@_Ga4J6n>uu8sfUs((dlZMWI?$JGueFK(Dd)VZj#v?@k&p)>3(Qm+VX;0%T zdm_3RO}v}%7deI=w{^CorOQI#+POfp%d)+bFo{m~mmsRRLA;GoG^uO;w?qN8x`jmd z%*?-BSUNR6gMD^p{M1t8^NIrdJJ_$K+kl2-+kUMY5v&eNmH`_blYsqgoa3;q13O5M zwt#aF2c60ltjNXWs9`BqZAL(xJZxI;wf*_vTt1lJuhdXPYBB{SbQMy=)XK!m(h8{M zrEGR7V}KR~8ApUeCQIi2frfeYDlobb9GO-)mfkH%>|^l8gM{si!Zi;!gCV*%r#78E z)n-4C`Nv>C80cgDzV~&b^sAFO*>TWU`a#mA!xX83$?zvTg02UBy?B}Rehn3%rek(+ zZWKtXeDn;e+J!HT)M%cN!fCj$qV`ai1mq>qB9RRX1$^MuMt9l4!TZO(yR+j<)9JuK zCZZ(gwGfj%ApcpIHK4A_{s=*on`v+#1fRiiAl@RGfiDjXb~C3Zp4G;V1781X#Q#Se zzuaN*?<9REeFc6VnFqUOAVvr0Hdt*?gdYRfVw_566V>|qu?vMz*4srCR0y7>xUoT+ zT5{82ASl-0@2W}@E z7SPwv-Y*}UK69UZZTgtJA1=SuTe`pG-H$-*-ZmWpQW$my+oT`u{vq#ur$>E*r|}2MO-a1D!0C%iLD(mHvyLA3 zU|o&IGO)f@{^sg8L85^MbtKHT|13aiA^OpGO2nvqvay>Fi^~GiyXk>SPUZP+Ep>9g{sFoYT;*jAl4!UigEd0p~WF`a<)z z#YEfIV{O@+9Nn&Nr;l|w-OjG8e16b1cwWwSIfMRCXR@ zBCA_^E{hJQ(JW+_mlX{|gZkAf1pL1N!Md*EC-J`(51S}X*F^7BX2+bhwjLXG*G}`N zmX=cEW#{Y-<5okh8gQpD;W0Ok{O+d|$)FfrWYq|6>}hi>s>`1*h>j>n!z} zrqfpmha-|xN+hcV?I(?JoO#NJxQQf9S#ZiDt2tY_>r}z&i~-;ALAg7!&>!myu)t98 zWN_%|#930wugvSq3E)8zA7qm(97y&J2A_xoPtN$epJrv!$~V3>eS64rftzcl&x495+rmLqR1LQv%(N zh$EaF$>m1UQ@?`Esj6JXjTtDi5LnrVLZR%)uD)G?Mcw!R1pGZiUa#6W)zy2X%a!y6 z<669%g_)W=mYe=j5D7s@DFdj05NwFDl-SqU*9b|5@F$vRep%ZrMb2f>FvZ*Y0MIhEl?n_-2zHys-pM(VY?nJaW9Gr}gj{}f-+Lu4sa`iJo z=ruD~93It|#uG!S&5$)z10MM1etO#&r0*oBcxc@mdiY4@uU-tfDLW*js8k3Q#?bBhkl;Y!&Bv0l6nY(n}&t$V^y8 zaR#yIEgYZa69nY*w#kXug!MZwV*32Dbzw3#Ir$kI-A6!RB_BG;#+C=cxrN1=LG(uE zr-AeNuGv#CDxaF|I`zAZf2fGwBNHSmf?z3a6r!?~PX~EvJN7^!R$Yyq+{Au+V%2i& za(-0g=jF*6TG@{lxg;vw;NMTS$CQF}JcVZAHcc>08boKfn3~8!)8W{i`d#tE+Tr+J`kk@EH?^N&%J!GU6VOBKcm|f=lFH*buv{z3 zXI2Pig}o-N+5xTjniLI2xulG8u<_z43gnq67MX6&1Ics+79EWNORthm>m#Mo^VSZi z1CWTqr3M-Z2H*WX@ZH}mWnqtdvcQY;lE8Q+^IAojEceMPz&OorT{(DgWjLA$hxTaN z9_46YPm-TW4m8iOHy^s~(D1;Z64Lf)%2Izm*>>EVsegm}88Vom0qji%3ug~*=D=lg zUWGlZ{fB1Xu{8bWna5{lJW67A@4kKP$Q@@FemMSIoE@4?D4rR(^ycZMcfh6p1lPQt zg`bN*ACm+P0BSh&%{mV1z)d{|IH&?$mKV$;QR6|AL&?O5fknNjo23f(s{k#drcul} z)PTSSNw}IqUdu)J%Jz&aSTz@*h6QX)+-8KWcz%mL)j1((`YB<}e@qeJ#tl066$`Qy89rNhRr5meO8 zgcel?IKdnCOff{fp4wyYEDxmRseSvVo3YQvCStMpL_8Kh`Pq}P*ruZ| zz#g56!4aGjkI0fii18KXBk?A2mMzn=?JRY!$D2)=sa#n{NaixO@UVfd*maw>z}oBO zan=+eN<_|Y$8lq2b8-*J{0*I(*R!`D_*KV1A4TExrJ31yirOw(d-GbTNj*}GaG*44 zQaT`=Kz>e^ArvHfedWk?iXYm?0qnrSQfRYnhHR2iP^=#BdQcTgF8X zMX%F+IF!f-2A*{>ueZC~yV4`eJ@%sG#$I07@roo!A$i<~5XIPRvbCf-%kC?=8m6nX z&jlkAe7m(qiCyZxegFR3yE|q4R`Ty@9G_d^7XRcKHX+SWtUX|^i0e^?Nz$6L4VY7f zkiD1ZDjaA#1z6GrCX?K%yl>z9kfsg!Luy|#HV#mJdt&Lt%t)V_$dY?loH-K7S-TI2;YC=X!RJjE|4x5~@G;dEol%(MBbD)!@FpWh!Ne+vB3NoHfgo z5{tUIfV2rItzu%;l;S!RD`}VVR;zq!-;ib(5pA!43>Zoc235O|`JUaW>FJSKC?33w zHWd3c1OLS688ixcWHfCFxo44=1m&ZQCo&lZ8p4F;J$SJ3w}&n#la~*@?xa7gC?{XX za_aD~`nrP$?>&&q9k}u7sK@Q}MxQ3Bl7#&TwqZUu1fY^F5T{(0C2SQ7^OGUdMi+aeLGNIzgH1gpoDrou9L4iI2t! zjLze{O=7mDf}&Z3$O0C_NKQFq6_6%yiyN@(mDLc*68JVxo_EPmAya^P7>3R)bW$Lt zptY(oct&NfF&1_>dSyq4qeq?cyMhi!urusZTS;FBAxm+>#av;I4ru4fJ$ay#zH?r}R7&b_xo zVZ))Gpxf0Y5B4x8$Q09nPvPzLx*h+28ruYp0C)joU}RumU}O%S&KUeFp5Nvx11A#$ z2wZmiYz3ul85sWmV`5-p0dhGQz|sIVe+q^G0C)joU}RumVgLd-2^2vE%m4uQ01N;C z0C)kdlsA?ZI}nAxndJG0)j1@1PvgBuAubi(d(Z+VRmKYbloYoBQZ_N`!PNOq;WPTS zk*T^>x+V2IECZP5w_Xzyg~~*w(&9Oky-tt00ELMWt+zN9vqkI1U})nUof%dB4HOy) zN-#F2Y)|psDQh4+%@AlTQ0d`Sjnd-Vjnj>OAbN3eokFKL2Su;bMgSb?$x3nsuTf8> z9_w=!YTBfSddZQPCAxYq5fcq4B!c5lg3tWtXtEv%{y+IEEFM8{KQ|Mozrc(MXj%-` zMYWsi^=OTVtin_la`lxaE=ML8!tM~M8^q&9clA~l)O(~xgSWhkh(oK6SMET})_z2; zGB#|fQ=mcD)vYF@yNX?7582KO%`nB+Dfsy}&WcI0QAG({-_$K$` z`i7p|QSIaQ8>juJbp5Nl&+3Iui(NVk_H&^_XE5|^EOLn#pU~*$yTE%EW7dpCo_0a_ zhmM}*j%Ph;vyMX6JT)6MN<7u`wMkt@g=G|HiYi>Ar@|8l zbB9+PSGxiky%?ig>z0qub4s|glHm|r8G2u1;k&0ZD5T!(EQC5@} z6-8xHD>M;pbX>Y2gPcLGCl8YM$gh-)N)=_QvR%2QQfdmdu-Z|b zqMp){Xl1m1+C*)Qc1XLbebN)^+4ZLSBK^J5)EH%KHO`r|S=8)jE;Fx~?<~{GVl}W1 z*|J^6o@k%6-#D6+(W&eVcGfyiT-hz;j&hH9`MlQNQtyKI+t1~f_q+Ss{8RqtzzXsN z?Spy2@!(--gbl;l;jZvb_%#xvDC!q2k8a0AoH8yLmy4Um!{gcU&iGCOK0&WP1i=G< z+W-Inz}dD}BetDi?asDs+qP}nwr$(Cb!Qo8S!Ow6d0;JQHLRVj%dHP>g>8zhmTjEv zknN@2Zco^|*yr1i*`GObI{c1Sj=7E#&MZ#U+0Z${xyE_NRmK%^jc^@teRXT@k?vjY z2ky6?Y#zU7tY@|7lUMN0^xgw<13n-Pv7+kzj=-C$uH)2@fY}aLNUQFbQD$#AH))(Dz+5Yi`T?Il1&Ori=@rc z5$THbMEWTgl3UAz<$3Z+`JIwa(Us=PCgrm7TlK0n)amLYt$>DWZM1RPS-qq#>W%e@ z`cD0!k=+1|pfSz3YUVc?vys`&oS5Os*i~tUZ;WrQZ@cfJKa1b%kNW%j*ZQvniU-1h zk%0rjyun~_V(?I?P>2h)2u%u|4ZRB&4Rhg|;a=f+;fvwV5lh5~G>!C&OpI)ZJd6B^ zqS0t{V)Q~RPb?i<7`qiO6|Wax6MvTQC#ELeB}*hLCnqJ3B(JA(r&^>=rt_!KbTnNz zy}WXs%Kr(12SB%>004lqZQHhOySDA*)ke(Owr$(CZQK9OGU>RWsz4!_B{(E_B~%I1 z!ac%|qC%qnB3`sabXQzJ+(Il9PZjSJzm?RKC?#3RJjrg!M`;0RMX6evkuH>8krkG8 zlgVX>Y_IH{e7HOI z&1}sc%@=KVtwl>|-|8mlg1U9OZ~B4ytp2zmpP{XxmqBBo3@?rCj6UNbQ+`uBlgqT& zbi(w;T*BPbtS~P%-#7oUG_*{%9J0K(4z{w^OV;1Ex;BF?W7}){Yj0{FVt3kS+4tLj zI_fw^J3@{Pj(5(^POFo3o^jrD6?e6Fsa&M%pzEpYhg;@m-Migy-TyotJUS2Qx#2DD zm3kL?@B5niG`@gu3sei51X&;$BB2@3TIdq=82SPihU>!Z;Qp`y#^J^AY4{VU4myKz zzyQL41Ixf(a0NU7ul+6kdOz*o?tc(y7!U`h1$m0ckp=y!2`6_0002cY}>YN+vZ_*y*kXcYqq^T&dauK+jjrnJ3vKX zEU*aJ3p@tPf`dRE{0tR;M1lA3ki=o(2>_1)~pM%Rp1)?vpgh&vN$?Rl9vL6{EY4RxffoehRqBQC{^`EXo z52Mpe17Q)$&#A86UM2HJ3K zp0-Lms(sXZ>4JXIC~kBz<{7Ju(D-VWHV2!_Oy7KD6|h=aBds--WF51<#XBUjCu%1q zCN?K-B`YMSCRZeb9aX{XIjo z0J_Xe>Hq-%00ZIxumBhU000000ssI20RRC2002M$E&u=k0C)j>&$D74U=#-6r*`-H zTWfQw?KWJ(-!`ux7n$qG7MyU(a(rIklv&3dIerH7h}scX&5PPm7mY>jnEzHp?f8M4 z6E0g7wUcgH^G;3OKvO|ZUR(0W0}nlwd{R@BQdy+TG%96i(f34^;S~8lt zGM3%*!-9593Koj% w_br9EOCGuxn~fP`n1(P*7u8(==$tl70C)joU}gY=|IG|W3|IgFC`19c07`Fh3;+NC literal 0 HcmV?d00001 diff --git a/www/fonts/Ubuntu-normal-300.woff b/www/fonts/Ubuntu-normal-300.woff new file mode 100644 index 0000000000000000000000000000000000000000..eeff903cbc005899e8a81999c4f4cf6a906266b7 GIT binary patch literal 42972 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

hh(t*t;XuX9rxjyZnpyx2xVn{u%AowF-_4tbD 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 Lhywt+VtSeYvhmoO literal 0 HcmV?d00001 diff --git a/www/fonts/Ubuntu-normal-400.woff b/www/fonts/Ubuntu-normal-400.woff new file mode 100644 index 0000000000000000000000000000000000000000..f8c1d67545ecb153c0737370e2b061f775736c09 GIT binary patch literal 38352 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 N>Z(|Fpfuo%003aJ-=_co literal 0 HcmV?d00001 diff --git a/www/fonts/Ubuntu-normal-500.woff b/www/fonts/Ubuntu-normal-500.woff new file mode 100644 index 0000000000000000000000000000000000000000..1166e73cde98cbc078d34d37fa5628a736c4f597 GIT binary patch literal 34044 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%0AaS+3Ebpb$ztw=U2_$FYjMxZ5|MpyJCqyy)D z(SojmN4)dy(XL^cV{Zmm%NL77X#u_B8+LavAcXtUi(uX(l;k0bWEOJZWRh(JIWi%6 zC)^=kR^Y3r-4131o1F)Pp`oD}DMu~!(}<_XNiC43{IT`ldUx-e%J=h~evje;-QIWS z(fdz$_}4zj`52?GeG^t4jeMMZm_BIW4SkM$*4S6qsX$~BC7Ff@s=G@P);Qhmbx0(l z6Y$YpzI6G#@zv*QAA>JfaXfLG)&fo_Q!{Gp)nsI3q>}M_l7WB}^Lse2*Tc;_f;k}@ zOV@nUoXhJK1v}@_G{w#%l4}`cn`8fn@Fb6xc?gq1wk6Iro6i7hv_Hl@at)~Q?_e0) zK^k-A{9J6}cDWXbuzQ6mQj!q6=ny+^K51dH9BFv zjEEtX%tgY`)YeXUp7t=0pT}C;EX{byru{u39Ws!@3$f zSn27hR(pCXjPy*`qtW_wPtOe2Gd;bdqrLUf(alY?Z7~=mk|oE{jtC{_7jPbx>I3kE za^zKtx<;0~^LzOIKLSqC1?&AC*84xz_WqM}(|BJuKL4We{z*chHa|V>kNg~wknjFq!yS*gqF$Hh5OnqXuaVNn4b^(xO}? z&yk-sue;fBCtAeq*L_=y`WShEe89La&G#Fmx$CZbx<&ag^x^$P`&|x}r`H;Qt_;*1 zP%~c?K2hxLC7kt{+eruMB7J}%o^!$YWi1#|Kh%wzP{4Q>mXWDSnoJeaV6vJM)3TTb zTPDE%xYM#b?M|l$`s2HM>Rf21p3O~z5jKqsk@lv&Vx3`{zmfZN4fehmK&*Sw$Q9TM z0LW^EzlH^HgoOudMw+(3fZ9OooF*jDK)Y<6Q-Z0n9pl-bX~6_##v5a)fD(jNB9u=A zkDEwAi8$zjaaoD8Z|VjA)bl_0hxeG^LHGRO&pkioFX$0id4*`#KN|o--;L;cM2p2x z9ymg{_gMHzPd0WNiLTDD9}CnoyuySgML3(wCfnxhF4+z*Ns8J1o z;6D#(NG@6Cr(JGlciD_*1?Wg+BSNiQHXj$Nf9P#73_@n&nCL%e2XoNNVJkHtlg3BW z9|ZWc*8c#aa?&e5P%HA=9(?&Q{ilsrF^7ik+!$9XkYo90zg}1>{1e^#Hp9ij#^clT z`??I2pt^w)v<=Y^%PLBye_Og7Dj6jPV^f_?S8bmjP%j6wJ|T@+ipM5iBP0a z=|HlS;g{5Nz%|)D85!=(&BnPgFtb-@ zL+-PnR6g#Y4r!jOkjDu}219OG{yw(+;^pPbpmLbXhzYKN_S(yrYOlQbvGX?=ZkDZ$ zf_UaJj}QR)Z-DI?+@N^I8DNZ=6AqkhxSvO39Pqpq7N?8v(bBOo&|>B)wa@B}4N zMhZ{Uq(T+N9*Io{1$Sr1G_#wEn3ehkK6}*13r$Qn#C^QnY;N(BE4?Q_Ycj)>u2L*4ptq=GsANqQ@!DQ&-%2 zjs|vz@x*HuXT956>yWdGUAjEaItoZkwxB*kzGSU+r9$2y?Yi!|ztW;yCFjiXVWfL2 z%D1&BkC7Lf>s;TsLD_p9<>?mX!{kG)b?$1zR~P|m4yaj2-Wp6wrpe9po8T+v$=!eG z65Gs%Jk~L@ZWN5<(3qvGc-$`D&TI}NOVMX%F5c###O>j1PKOs#48b*l==Z2=S_kUT z+1j;mJgPcX^!=k>g8u5%Q%^Pj=uf7fdgt_0Pffq`sp+Q(;oy!w4j3O-P@^Ul@;$&~ zGiTZeDo~P<(rv&p@laGe*8bCDp?~_OzkeKoUFrw(+h(@sx)DjFc6)x??DlNW)z2hpv^<8GBlKMXVdHb99c66a zhBz;g$lSnu/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 Tf4>+%ETj(~)h+YMY+~jBGK(Zd literal 0 HcmV?d00001 diff --git a/www/fonts/Ubuntu-normal-700.woff b/www/fonts/Ubuntu-normal-700.woff new file mode 100644 index 0000000000000000000000000000000000000000..a387b46124b24d4439d727bf2b1d06e9e9b7e8ad GIT binary patch literal 33016 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

6483jermR8D6iopra z5#2<@9K5-a;!sz$mJluyOXnQN< zCM9{||7ftJ!ITDr8U(044v|Jdv}_#-0^(%Ll4;VsrhfQ75i0%P$KU&abjeday?)Ie z<@P^lF;7LxnS|z8!X`$El;V+6CaId?_7&V`$LwMcfo2*KCijNd~I^y@9X z=+N0(fIQuol&3Q%N;B8NH6z2f_M1#dBz699RbxhoGefDXNB2yi0km1le?Bg z0?KO1Keu^>&s4fr?3$6K)nYIe zryTYyEU=^DG(B1Yt_1*rzP=TJ?hh^en*0Lx(ft9M6Ig@*`s~jGqz*RUkgP_P18_s> z85ajg+=Qi%d6=Ex<`7)~6~=W-!jh@Ikch;RO%v*c88yhl*1h{>o~DR_Jf==EJnN z8E)1FA}*>9>}W*-@D}p3=FzwtJs!o+`=HWRx3ood>&>mB{cQ2kXf0YwM4YGRR)D>3 zR(tlsyMgU562KYyEd|&IZ2vx1>j0q&zrYB78#D+!V*!H4?{>)Av@u@n=D~=XESY90 zsW#VmwceQu23g{Vvu5!=6!B)9!6swWvgYh?8Y{2-fAEJyWZ+dfYNPRiMR#bvj>6NX0}T zVT3)BkFSayiD29a$#k21tGA{Em5>=|tXa#0arm!BYssB-;c*w9v~$GohDYEvcAym9 z`zeqU+%6;>(6&-#?XT5Z0<}gpb=u?oyI6C<_@`KV0pM6fhnyrPbiz`Ygb&y6ytR(= zbv!hRdq;78=(Zs;-*;OdIn<4NyBP~7pG7_!$&y!D_)-gxCZ9->r%d#i51OPAy*Q#i zu9DLVzEr_I+^rl*`B%bRsid!(D@amdx_?feg3T*ex>L)xrLnR#j>B7nvcD}TRCU@M zi)XZ&oa*>mho6rpm~RUfwJUM3M(Lzg#Zky#zbyd7kl9EbVKuvBHkN z($~q$TC6MP5qbr_guDx~u%kZkkcEdV9HxIUe9*+hCeHhCUPOp&NJpbdj??m8)S_0YK8zJ#-z~N2iHD~` zs~_uG(`)$UNso7Q$s<4@2{+>7WSyO9c(gwGWC4#C@D(|Hg@sQh@pzJ6Mo@(DML@Qv?PpO8idFZrjh=fA|?I2hPijJ!VI&igU{3|1)BeiU)obDePjj-)>S2UHtxaiX2j8MV8#I6r>X-t`c0XTsCSFOOz8K8C^nJ@CzslvcUNj!ig~6 zQ0ZdU-I<0+S0e?e_SdhmWD&ZfcJ`typuA12AE>dV2QQ?!p`kO-ov~60??!XHyyLdp=m#ryt+?*3Ym0MpGnvfH++1<(Td!NO3rO2+Lx6N$;aoR@ zAV{Jh@Bqlh2Kwim8fzvRb!f6M3!Q-Aqj>lEd%tr2Uc4LZT#_g7Mdb4^1~c&X`h0l` z_YPvdxVlKRBD#xsOBPqh@wkptb~2`E`&I97;XW63PGfF47V5~Y=T{#{t;{T~9mwYu zCADGc0SF)9`R;C*<<>7*UkYYcnk(g=-dnm${@^W&+-@$@GYhiUhVH{p9W@KOLHDvg zc-YCm!HXDTZH(+o-P?=x0$R@SAqq%g;~n!IboM6oM6^6?6-SM5pf8cBsAe`8?o5YE z2_qHlUY0MciUx*8b5&n78;($=u$e$C7YcMKMk*jGV%Wg`fwiH~Kp``b(}K!!kDAMd zsIS~3CyLc{Z7LiZDrIRVbwF8R7ITqgM3d!MVW48>V<9>;E!Q(<*y9r2!6mFLf@B|d zkh8XWSpHcEQ;(CX1Si9Ou1;5+6y&`CY_z2#e)+jGWm>Ln0oz*J_H-j$`$%I=_OUQ+ z`vSl*6$EmBBfowezE*$mZR1!P$CHD2d=O7o@pu(Wow&X5E&O~Ox5RNz40ADz#Bi^UT{=c}{89wBN3ayc0|7kj!-HNdcrh>H-2&dkVToXO z_h<-~_je>c^`5@&@-Lzo^#@0WMwc#RG0QaZ&b@@GA~jY>ZHwp5P<6OVDRk`d|IgUB zh0B`trY+z=?(f~OcVuMWhTh%{`$k6gZs=W=9^2U0H#e3}kInVM{nQY4Kzx?rPPF#=uL2mgjbf11;d5xv7$E!`DenDR4E1s|%E~JyR!C2*(92!gxuh!CK!_ZCY zK2jvLfQh;)`T3ZNGP=ht_ANALKX#%%T;J($^wHnRUxMw-*P$SFn3w7LD z$1P)D7$ftem>tFNDDE4=t|2ssklQx+r9skB#hd$(+|iBsF3fk}9Ywq;i=_lv?g%W;m%1ai!=U$>j!8EP3fTH(%@oY~2A8repTO}!Vj$K7nX)K+FZ<**Y)WrIE)1DUu< z*ctEL|67Fp9l=hebA{d)dT1#phQpfha?vkFlbuD3{I9L`RAoj#iT4P?-D@(uFJJBn z<0ixtvCcy3rT@=o!ne8@JF9UH$^ane#3clH`% z?l_i{t&p<}7pXq|+^@&His`=l+kQQvnDJQ9pH`B3U%WC#=8RH4tpxI+Xa0raXBvhWEzs<``~{?TL|9G5nYt3kLNl7AzUo zo2*RBvKQ7#A^c+qE#*ie!5zs~!eK!u^;p7DQ8dbMtkiK=C~z!n+_@<0cDP~gIGQwe zj`2%aJ!oBNQ`xF5ccXYI{hbBz_s25brV*DyL2oP)NU27+$BdWaJ~L#d)O26EyA%qf z@cLBLN{qU_A-^8+%7gwuAeISQovPAr>7}$59g{tPa6Os8WHT@M5$-h{v2&6+f^B)p z&ITj4YrNFZqYS4cjfV$ zthL!mIYw^5zkC-zt-N^G4f{p;FR$i02?2yb_)mBjUc=hi(^S}xs`^nkJ+f(Y`(*iD zEg9lM+w6F7VI}+ngdj@U2$?4ZyidSe1l%LwCIKIFzs~(WH+R&H8{OBqZ*p@Q&xXW^ z$2Z9X7xhLWF_Vi#OjRkMb7GllA9kQZdsL8ULW)|TKs2hHhsCSyYJ-(clr@@E?=z3?JhT zU0%5W+X`Y)*Sd0M*|Hh7Oyo1^LOzqp6KVIZomXAGW5?AimM&efeAzM}%qNC#YuG9; zsQ2F^;eH+uaQASJa@>AE;&QneHC{d-Jt`6D0DlkvD9`a6pxaB0dm{0Um#o_IlU2_# zDQCx7#-8*{TmG_qyVoq%a-OwJl!XN_0mw;O0tI;ZPXI;uKAN_6^$+pM^WOl8dKk4k zV0>Tz8rUZmVR;*SAHIfSh4+&vgEC}+B2SZ#()Dr0LFO7qeX4QPCC*WSfJq~#t4Y*W z2HIX9d`iWKR6L|&Ng9!eEX5@90QVI06;f%S=#8%pVJOte1cN#|dn=K`tzEWEkTVNx zIGSiL7_c>Pe|o{f*V~h^sXovc7HhVoAuYZ3w)M5=RSLSc+3F57g@RJqC6#hzhzSLS zBH2MI6x5q4b(8gtM!B%yXw`79B?WMyiF4U!X(gw#CANTea`T*=|92bhQ3#ZUR-qb=Kwvl>W z?2crKLFSGj}b^h9{S)j_1FV>+?L0^xd(DjpVdUtm@azP}g+|{isfoe8e-Qq~)sCpovvxWR~BqL9rdc%kIIkGwX zo_XWRNjakzdwM=@i|71%C>##a1qgitc_(daVTi%C^?sAM+_GDDuVcwYysZ1RRRDY- z;PZtOd~nK7rc6J5YPvEh6W%Rq4RsT0i&bq$lS*3yQbVW}|EZm5`!V`@(*w<`y$}V; z2iOJUp05Nm%GTuchAo|VjUD@WwtGv*+uzr{y}b3A559fc4)^>XZ`l0IPOvpiR@$03 zRm$QXdb}6!?ZumVaiD}xSa_3l#3Fm+_<}gDi=#w0^nE&+((y?b9&s@)`exT27a=s! z>O*w8Hb+q9?715qsJJRbBu$H^)0O^?iD(Tpt?J`zJ!Pr}Q2$Km+@&v#@vG(I zZ6C$T7tbl&mmkb}@c9IFve2Mzpwigi^2&SGtR%1``I@j0DRCsmoDeb7yh~V4L`0^vkGt)fp31p zEX8nb=o1v}oOuWDvZ3zAnJWPB8}3vKIlu5v4J5b)8|iY83%>_IA9qs=d6*rO^<4y! zHz<^VI>X?NzKejrp>m`_4(_bayeNkUvpAMznh#?Ud{G$RY|9)S^WiBkF7e_i5$_Xm zSj0Em(#4?(PazRYtDHfNNFxG0VRBA^N zDVulfbh{p*&3_Eh8)DimOemsOnsU*sIR&v<__!2~V3*2Fu9X{0bgx3>&;SlYh?do3nz zf!)Ezrpj&aJ!{otNm%I7L3(1*V`lG^$~nQ z1fvsDMniQ~AgxXMRnbaLql+n9G0DgAbB-X(1!jg8zR-V^naD%C9Lu|9!}~mXEKl!8 zY$~!)g82DjOOnOrGyMiX$BD2EUQxe+=7PDFhL+}*awlu}P#%Z#_)zW@Ir4;tt2KNw zh~Z#9I1uDqK^EcH^#N;6?U<{G{EFd=B!i;hkN69@NH}0-vZd}V+cp+PJHq6a%Idfh zR(*m;qv02QO@FT58~3esxzt!z3#ZJ8k{!xeT`8kCm#y?I|LZek%?o$x#UWZJ9G*4j zAq8NxavoML2dDS@XqoU<(H=-2AA6Q@VO=T)7=b z{-K3CFy`R=L*>R7x8u&XaEB?*?n(XK;}pn|p&52ir=GX)3oZQjC_Ys8QG9RN#&bP0 z<$ea{DE8N6o|rHMYv2lax_*nNeSe{)ym$e3PU?4j)x@21{Dc84Ais|OH zYu%y1*03Q@ZgXQl*SD1k@QzoV{EUXYsFZ_0+= zPn$~1%cfCK4;GtjW_0MkU+Y{R>Rv|~zkh5`-6)Rg*7A;Ay%J*-c&h_#4t&rY>5G+u zib4``Mue|m*ro{+)5@)~xxuaM4NVJZTF0`I&5kF8lo&yNO7@-4`{d->Zbp)i6{(nB zgG=1Iu+rwA55V8l^HO#=OK$NT^E~O{HhcC^VR8{~5|4;vPP|qmZxWssNJL_`c#hiQ z67P>j)5RhTbDJCG~KZ zqpIUZe>LIa$tCu;SQxOBO9<@L;3k5?Uu1&&Gk#C+#J1XET05=N4oBQ>dy`H(UFWn@ zMp?*b)yOQ-a!xzF6nkROX;)S*V*|4c*up^zH^1D$xw3g1mubh5vn|}=6^-`i&J9u^ zr}fM*aQip|&)DDp9p_yC6`YarpP0psFpH#RaWA9TU$$XS&=nhzlDx|XHtlVm;{J<+ z7H_zf$|%WrTsS2VLBJHcAQ3h7aMl%%E9p5`rDM)gQ0Xab(^94tHBdLe z0u438vJ8!jC;0MKNd_mgok`)SXK2jddHHD@>s25A!nw}{7iVK(%fxB5;{r4ASkzx1 z;`)os=4s6N-@ZMY50)ot-7C5y@xGPCoTccq(e<(1(o$;oMqbJ3dn$$gGC5tEdi(D2 z8)tj6%XbVf-#wo6F0JKGe+2#(G{6hYv9 z%v-p#E!<&>dw#o|gEH*Kqxff=;~s-@J>(*)=NlYykw`qDMLC}UH*rw;D~sJberc+e zbMEUkN720fjyHj}ZCmC1pOc0`i4#V$xyIS4PlPQi9I>qP&o(yLIdm*Mhi@mH5QQA{ zz$5i7d%F&Hk-y2{duUEp$o8~+JXWP8pCcoGur&ZJ*Vf6l@U{iEEdO|^# z|F@zmQ>_Gpj8$AIt7`r$>f*od0 z=+7N2<*%pkhYX_?FDy9hNV_&|b86mv=ljZQz(X+&(G&VVf( zv~crt4vy2KHZIbRBWGKrku z1SA}fHfMS4!*Tq#I~wQomu#79|z9cDK!zZevk@htW!H#0MOt>p`X+;d1-kDR;%qi4Eb1 zmMnp-89{X-h;Lz`sXRe=SO<2tC)rG+n+q(q!s631i%(0zNx`5mZi~L49iOHf;N^po zKg>bp9Mdg2^IRi7tvycwV6eDr!16G1E8Fz3O@XmY z**p6tiF60Yc&Ka#$A~qIS{ORwNt;K$34aF!D0{)RyW+8OQhl9f8k%O98vc5S(xk$b^+QY6vGuwolgpP+PS)$rbyN{;m1Pyy z*SlrLRJ~pPuuOcm9xl4>Rb@etNYMXH>F*>W1-$Y>3Du)6fj*yq8I-4 znWtj-Pz()L4JN4%ccn3BkXMB8Q0T!BSsS`CbbW|B9l*nZhXUkTKR)O??IS*mrYgNm z#N#4v5??6ZB66!me8z>Rh;99ogv||Qx3;tu_ZoNR^E<>&M>1)c?oi_$oJ%Vo0f-(+ z@fCiYe-Hmj{%`r8^8#PZAJMebkxwb8^u<-K!zK3|i`K1j>+Ks}QiulCcsLZ_5obz( z;h;gbT9tsmk~a!*|5(>Zr@xZ!8X5U7Gvf`U19~j-!${hvBtyYi7yzM+0v^TLOY=!u z_x6}&y>_$35FWk{;Mf}E04G8Lrff#T6jte)WBc((bbk;ckb#+cZz+IsAQm9jCesXU z&~i-AY*&0CUs-&a3k%IFAw2wTv+OvTURe>& z*`>y_GIVg<>b5fdTddk^FK)+=a-!W^mtly0dL`Td2kWCtmM>p9zI|->#P#brzdsz7 zq<$ zdd9YUhS&(J4-RD&#BMnll)a3c@2rnxMrOLZuNcW>My}}Yo*BuUKh^l88VW?T7_X{) zOry5rrc8zF{to^O}nfMuLUle9#qjW7LIHxE;w9YzHFg zdvzj(_J#l%}+lHfge`T@H z@y*h%o}^>&ugT51UIQu}`HJqCnVFd}V`gTiGIz|(%*+hmOHKx#{`B56vn3T-F-qEZ zIz<%wtCfMc|BU?QdD=aHc%C-PV>q95Fo0^bSw4(!%FoHuLHU#N7v@>M&Pj?vjdMnD zc|f}dhX=G-fN{ZaK#f6LK&u1X6wC?epx~tBOEU}VoB+Xuht^i3hJ8}t?9Vu;QV2t`PLhY0`2g}HEI$iiHLTbjTU8!gQj5}N?l)&RL& z^3tE>TJ26Wbawaqm;2P2?w@YD-Nk(Ocb86av8ju!i#hHmE=_h1a>=g6{q`PqvU)M_ zvyIE`Cv9rC@w<&vY;0;{j{S*Ewmr$FtXx|CY2w zVjGDua=N7D635H?Bw12Qa%9RI@9pWap{lpY`^sa&8};aG4@Y}3(Q!D%w!B#ml>&?|#3V-Peuo9m^dp+T3_gDv`(T^DFe+8~)_=90n zwkxAY8Rq;u46Mhb58rn@)vvZtd#EGS9j0^5jv1f|7vLHmh&#d7g{ zG)1JP$O*~_WJQWN(dbw77t#HMEeWH9C4{>Psd@?P3cG5Aih&^dH*_?3^{r>RNSzCC zg-D0Xq~k1{0p}FBH^@n__jVSyw>I)dy01y6Ra9E3Hb7a#WlSR*D2 z#n@!Lr$;Q|>?p%3X}thpE)ZyV0c_6)lH)oIMNyad0zk^)$Jzhx zW*I|5Qs>)kTM1B|+wJ!M{QMqI-L|bkw6@m3Hsf1$jHD=1Y7j%F1&UD*G@_9pTRq-_ zGXR7D)V2-TT5KC;v5s2pMvF$yuU2a`zrct9R|>A$O!A7>j912WpC1F)OQ)rAtAR{D z$NnlO%}`DJ$vPdg+Izd5%R8GwRh(Y4m$&Qxm2*`PKI*A0?63e-!aXM9{ zE{BhJd|%XfbLxoa_uBU6w0q}k-2e7%U9!Rr;KD+0)eelJ$!;_=LSf447YOx^a;oJ= zCmWj7IM8}IPqAhoa?K=A&mZs4Ot?y|${CfyGhHRG`})x31fZ=3#?asQ=f5$XP^w1* zq=s)!?h#Ha5(XGr122O!Zt{sEzTM$$@&sGZu0v35~o9ig1!poPKZq@xk^7=uv_ zuQ1CaWz2lldENJs&Tj!coHcO2```QP|I_InAa%}N)iLi8k#;$~XOA9o#vV37i}emV z0As}AjOA2qgYLw>#5~0C>~I=`G{6WD`rzE--Pu>}IrBvwdUIa*n7uo_)xhK7|6hOo z%5rv(1X*+Z;?yH^(wrSm?|nMc&X|0YUX=a8IP30%}=5uPftOD;+GeV;T_!a)C9~*U zOwE|dqE1aP9B2LRlh1#u(J9^53PfVQjO+yo{F(dLIwvvl+ zDTsz!ab8rkt7f9e*9+qTpqk}i+!LB3<(-ScKA&h@8!(Aaf6sN=OF-AhWTQK))uuI@ zLs#ys1TBilALHPUOHAl`EkAws#V^e}NrtV>J2lpky&y*CwY4(5bC5PW#!{CSo#$F! zof4fjI`=v|bJd|LkIpO8`PoTFqJMPa&itRwHXS998)FH!bXT68o4h*fqqDkyb#`~V zm0v#l=Fjm4z_!+7V9r)4j(j1Cm7k8$)>g;Lo_pQ4zKv3serv5Vb2X_=Tg|N##WTFM zCMvzGrD*)UqJ1iSLo6nC6}|vh$3-sEe1YW3EPX*?ZI{bM$8>Fh-MUS6TU_hCPG_x- zTn%bnLzNm!Uhoz zEpP&Wk3R+w7=1&48Oln>a{h`Aq)H{TrtL`;UsfDdj6@>%W5i7Ann;CfSu0|UjlAhW zpb8md3vM;S>ini_IeJ6_M8O3h2AB;g>nDHiG#V%IaeMlvAF%n%K{Pn8Ibhiu?y3qm zbk;_B3C7pli0nJn84gyDN&=~|K@CVMp^*w7uac5d;z&~5VeY-sBI zss>c^Cbtr*jF}M9D1&PmlPM*tZw4h%jlAy)=q!>-!A(yARY)pXfK-S}j^pwW=!l}|+t5%!3 zmi1_~)|62L0f6J@l&WB*WG_@fB^j9>P7F-Zm)m;^zJYI0h6=LyM38m1(AFVoB_ZrZ`LP$dBy>92 zzr6kQ&w%Z0RkoW*7*m!sgxWhoa08bReRekHR!6fN#%_$-rf~4imi0h#>%m*@yQZ{W3fd!tEUPLo0*}c%O$mN^zs# z4`aXdVO*FSyQgK%>)^vCzfLg-E`pVzH+_(O!pG@3^?k3jN`7|UaE{el_g?bXZR?z} zSIIAg2gJR+$QbBFiXeo{Q!9mu=kr+)H&1=R(6X#WST`u<9BvLKAd33b7oktc_nuPu zN(d2Nt<$vGeEb-H`Q6`sogdm3x_!FLOv;e3ETlWeaO1ws%eWuXvKMjb-yM$AafxZ& zd>n@)L8i{+(T!P;6X%J)nM(A|OmQEg2LP-Rz8d(*SO~WJVBl>F2|+Y(&5+nzqmqs5;qBYEZoYXx4oIN=;aH^OiiT;EZ>}yQj>c&$(m0_wM$XNnlrlY@w%c|6{$u#{ z&;R?md!SVH=jq*!8 zyWP##WkwQRF4tnZp3r8yoo?QT2?3h7b1}_Zl$Q+PsxpDA*T>`O^v6HVKmYxI-sU+O z000000RR910MvV6-$g@T4?Oh%83X750002VuZcJS0002d!v!<{kN-UdF$2v2000R9 z0ssI20001Z0b^ifU|?SI-Wa29W@G0d0~qxL83Hgy-zD zZQHhOyNQ!3>{G^0y3{FSR_S8fwwlNR^J+ zh9Ks-t2ngFC)WImM7aZRIRP6vfCve~EIl*Tp8dmRne|tS5h{m}Bsb6|bNSsj$Pr{o zHrmblIok0VRrqW@mfc)`L905-JD$rG6W?ay8oBR7tW=>!mfDDHJ+FFgW)5RqvO0&X zQUCTCQb{;*HGQ@riLu`54BxnnvzFEc##Pbm^C&PE4CK^A-LqCo0RD2%#KcpCqSZ8gO zKm-gEr1SNeTEMx3HDljk(@F-|_Y7R^8WCV~4NZe>RJ~3B001EXApju&AplnZX#n2= zegZoK3IiwuaRavmCInFgcm#_CtOU^oM+Jce>IP*7^aoN0(g*+uwFyWGR0(GZl?k^A zZx+uNCl`qq#~3~sgc!CM`x#dme;MZ*FB+Q~@f%4S zd>j58I2?Q(wjS;uRUi2vGa!5*lOW$AEFs?_1|kw7A|gm4cp~Q`4kI-qK_g8gb|Z=- zo+IBR5G2wh(j^BaYbC}eMJBT**C(AP)hLxI6DeRRcqxo3W-56q#47hIS}Wcw{wzZ* zcr2DI@GToHX)UoW$1U6~@-AR5cP@-Bqb|5E(Jy^3+Aw%9k1(V#yD-%->@fi`7BMd| zq%pZM&@tsP{4x)?q0Gv{@t3R0piq%5Q?SN&ICSLLiBo6JUAT1R+KpRx?mc+)StwcTE7$F^-v%yaDIoL#%@w#VLBrCN<7eM+Uv zl_y({M>1vUS0*D?`{lj|N_;fxp_iWdBEj!iZICdzt;|Ea!|cSZJM=cHRg~`?K-46Y}Ok+x^z2Y!jvbDIqJBRPB`Ve)6P2MobxWa z;F8P6U2)A-*WGkOz8`M8<&L{1O)JzJYYi)ob+JA+n2C+CNqKBm5nEzwY>Vx&BX+Kg z#kI63pS?6M)4;&d07|>CW$NYRC+F}~r55EEmlmWJW#$+0q~(_u!8p9BnduoNFdj&o zk&&S(b6R{F5N85$4r^LGkOd}lK=Q5zZf;=O&CLZwyBQc5002Nxi#Y&z0dkO8-?YDp zX?^4V#`BHLWqF$NB}FOn@kRMXOzVpnclPkGDQkvPLrq5zUaXxPp>OkCmai&{3j2{!s474 z@nin}{T-&-OrAE^oaei3-sHJT4AADShpBl*0VQj@yL-uoi4!J9*iCOr60?^cA=#35 ONMdn!w=oXyBW|T@1i)ng literal 0 HcmV?d00001 diff --git a/www/fonts/fonts.css b/www/fonts/fonts.css new file mode 100644 index 0000000..1bd87c9 --- /dev/null +++ b/www/fonts/fonts.css @@ -0,0 +1,41 @@ +@font-face { + font-family: 'Material Icons'; + font-style: normal; + font-weight: 400; + src: url(Material_Icons-normal-400.woff) format('woff'); +} + +@font-face { + font-family: 'Ubuntu'; + font-style: normal; + font-weight: 300; + src: url(Ubuntu-normal-300.woff) format('woff'); +} + +@font-face { + font-family: 'Ubuntu'; + font-style: normal; + font-weight: 400; + src: url(Ubuntu-normal-400.woff) format('woff'); +} + +@font-face { + font-family: 'Ubuntu'; + font-style: normal; + font-weight: 500; + src: url(Ubuntu-normal-500.woff) format('woff'); +} + +@font-face { + font-family: 'Ubuntu'; + font-style: normal; + font-weight: 700; + src: url(Ubuntu-normal-700.woff) format('woff'); +} + +@font-face { + font-family: 'Ubuntu Condensed'; + font-style: normal; + font-weight: 400; + src: url(Ubuntu_Condensed-normal-400.woff) format('woff'); +} \ No newline at end of file diff --git a/www/index.html b/www/index.html index 7d82767..058c17c 100644 --- a/www/index.html +++ b/www/index.html @@ -41,16 +41,36 @@ rel="stylesheet"> - + + + + Sensor Toy +

+ +
+
- +
+
+ + +
+ +
+ +
+
+
+ @@ -74,12 +94,15 @@ + + + diff --git a/www/js/device/CC2650/cc2650_accelerometer.js b/www/js/device/CC2650/cc2650_accelerometer.js index 65d2ca2..8a0648a 100644 --- a/www/js/device/CC2650/cc2650_accelerometer.js +++ b/www/js/device/CC2650/cc2650_accelerometer.js @@ -37,7 +37,7 @@ var CC2650_ACCEL = function(deviceId) { }; this.onAccelerometerData = function(data) { - console.log(data); + // Console.log(data); var message; var a = new Int16Array(data); @@ -68,19 +68,19 @@ var CC2650_ACCEL = function(deviceId) { this.state = message; - this.$result[this.frames.gyroID + '-x'].text(this.sensorMpu9250GyroConvert(a[0]).toFixed(5)); - this.$result[this.frames.gyroID + '-y'].text(this.sensorMpu9250GyroConvert(a[1]).toFixed(5)); - this.$result[this.frames.gyroID + '-z'].text(this.sensorMpu9250GyroConvert(a[2]).toFixed(5)); + this.$result[this.frames.gyroID + '-x'].text(this.sensorMpu9250GyroConvert(a[0]).toFixed(5)); + this.$result[this.frames.gyroID + '-y'].text(this.sensorMpu9250GyroConvert(a[1]).toFixed(5)); + this.$result[this.frames.gyroID + '-z'].text(this.sensorMpu9250GyroConvert(a[2]).toFixed(5)); - this.$result[this.frames.accelID + '-x'].text(this.sensorMpu9250AccConvert(a[3]).toFixed(5)); - this.$result[this.frames.accelID + '-y'].text(this.sensorMpu9250AccConvert(a[4]).toFixed(5)); - this.$result[this.frames.accelID + '-z'].text(this.sensorMpu9250AccConvert(a[5]).toFixed(5)); + this.$result[this.frames.accelID + '-x'].text(this.sensorMpu9250AccConvert(a[3]).toFixed(5)); + this.$result[this.frames.accelID + '-y'].text(this.sensorMpu9250AccConvert(a[4]).toFixed(5)); + this.$result[this.frames.accelID + '-z'].text(this.sensorMpu9250AccConvert(a[5]).toFixed(5)); - this.$result[this.frames.magID + '-x'].text(a[3]); - this.$result[this.frames.magID + '-y'].text(a[4]); - this.$result[this.frames.magID + '-z'].text(a[5]); + this.$result[this.frames.magID + '-x'].text(a[3]); + this.$result[this.frames.magID + '-y'].text(a[4]); + this.$result[this.frames.magID + '-z'].text(a[5]); - console.log(this.state); + // Console.log(this.state); }; this.startService = function() { @@ -93,8 +93,6 @@ var CC2650_ACCEL = function(deviceId) { ble.startNotification(this.deviceID, this.serviceDef.service, this.serviceDef.data, this.onAccelerometerData.bind(this), this.onError); - - // Turn accelerometer on var configData = new Uint16Array(1); // Turn on gyro, accel, and mag, 2G range, Disable wake on motion @@ -115,6 +113,11 @@ var CC2650_ACCEL = function(deviceId) { }; + this.animateGraph = function() { + // Nothing to animate yet + + return -1; + }; this.insertFrame = function(mode) { diff --git a/www/js/device/CC2650/cc2650_barometer.js b/www/js/device/CC2650/cc2650_barometer.js index 097c92a..dc02554 100644 --- a/www/js/device/CC2650/cc2650_barometer.js +++ b/www/js/device/CC2650/cc2650_barometer.js @@ -22,7 +22,7 @@ var CC2650_BAR = function(deviceId) { period: 'F000AA43-0451-4000-B000-000000000000' }; - + this.data = {temp: [], pressure: []}; this.$result = {temp: null, pressure: null}; this.startService = function() { @@ -53,30 +53,47 @@ var CC2650_BAR = function(deviceId) { this.onBarometerData = function(data) { var pStr; var tStr; - console.log(data); + // Console.log(data); var message; var a = new Uint8Array(data); //0-2 Temp //3-5 Pressure - tStr = this.sensorBarometerConvert(a[0] | (a[1] << 8) | (a[2] << 16)) + '°C'; - pStr = this.sensorBarometerConvert(a[3] | (a[4] << 8) | (a[5] << 16)) + 'hPa'; + var temp, pressure; + temp = this.sensorBarometerConvert(a[0] | (a[1] << 8) | (a[2] << 16)); + pressure = this.sensorBarometerConvert(a[3] | (a[4] << 8) | (a[5] << 16)); + tStr = temp + '°C'; + pStr = pressure + 'hPa'; message = 'Temperature
' + tStr + 'Pressure
' + pStr ; + // This.data.temp = this.storeData(parseInt(temp), this.data.temp); + // this.data.pressure = this.storeData(parseInt(pressure), this.data.pressure); + + this.data.temp = this.storeData(temp, this.data.temp); + this.data.pressure = this.storeData(pressure, this.data.pressure); + + this.$result.temp.text(tStr); this.$result.pressure.text(pStr); this.state = message; - console.log('Barometer:', this.state); + // Console.log('Barometer:', this.state); }; + this.animateGraph = function() { + this.simpleGraph(this.data.temp, 'temp'); + this.simpleGraph(this.data.pressure, 'pressure'); + }; + + this.insertFrame = function() { var self = this; - console.log('Overloading...'); + var blankChart; + // Call the parent displayForm first... this.superClass_.insertFrame.call(self); @@ -92,6 +109,24 @@ var CC2650_BAR = function(deviceId) { $('
', { class: 'mui-col-xs-3 mui--text-white', id: pressure}).appendTo(row); this.$id.append(row); + + var tabBody = $('
'); + newTR = $(''); newTR.append($('
').text(device.id)); - if (device.hasOwnProperty('name')) { - newTR.append($('').text(device.name)); + if (device.hasOwnProperty('advertising')) { + + advertBuffer = app.arrayBufferToIntArray(device.advertising); + + hexBuffer = app.makeHexBuffer(advertBuffer); + + parsed = app.parseAdvertisingData(advertBuffer); + + //Console.log(parsed); + + if (parsed.hasOwnProperty('9')) { + + var name = app.makeChars(parsed['9']); + + _device.name = name.join(''); + console.log('Name: ', name.join('')); + + } + + if (parsed.hasOwnProperty('255')) { + + otherData = app.handle255(parsed['255']); + console.log(otherData); + _device.otherData = otherData; + } + _device.advertBuffer = advertBuffer; + _device.hexBuffer = hexBuffer; + _device.parsed = parsed; } - else { - newTR.append($('').text('*** Unknown')); + + if (typeof otherData !== 'undefined' && otherData !== null) { + if (otherData.hasOwnProperty('msg')) { + msgText = ' - ' + otherData.msg; + } + } + + if (device.hasOwnProperty('name')) { + newTR.append($('').text(device.name + msgText)); + } else { + newTR.append($('').text('*** Unknown' + msgText)); } newTR.append($('').text(device.rssi)); - $('#tbody').append(newTR); - $('#output').append(JSON.stringify(device) + '
'); + if ($('tr#' + newId).length > 0) { + $('tr#' + newId).replaceWith(newTR); + } else { + $('#tbody').append(newTR); + } + + + //$('#output').append(JSON.stringify(device) + '
'); + + app.log[newId] = _device; + + console.log(JSON.stringify(_device)); }.bind(this), function(e) { 'use strict'; console.error(e); }); - setTimeout(ble.stopScan, - 5000, - function() { console.log('Scan complete'); }, - function() { console.log('stopScan failed'); }); + var _t = [5000,60000,200][mode]; - }, // Bind Event Listeners + + setTimeout(ble.stopScan, + _t, + function() { console.log('Scan complete'); + + if (mode === 1) { + app.saveLog(); + $('#ripple').hide(); + } + + if (mode === 2) { + if (!app.stop) { + setTimeout(function() { + app.doScan(2); + }.bind(this), 200); + } else { + app.saveLog(); + $('#ripple').hide(); + } + + } + }, + function() { console.log('stopScan failed'); + $('#ripple').hide(); + }); + + }, + writeFile: function(fileEntry, dataObj) { + // Create a FileWriter object for our FileEntry (log.txt). + fileEntry.createWriter(function(fileWriter) { + + fileWriter.onwriteend = function() { + console.log('Successful file write...'); + // ReadFile(fileEntry); + }; + + fileWriter.onerror = function(e) { + console.error('Failed file write: ' + e.toString()); + }; + + // If data object is not passed in, + // create a new Blob instead. + if (!dataObj) { + dataObj = new Blob(['some file data'], { type: 'text/plain' }); + } + + fileWriter.write(dataObj); + }); + }, + saveLog: function() { + 'use strict'; + var dt = new Date().toISOString().replace(/:|-/g,'').replace(/(\.\w+)/g,''); + var payload = JSON.stringify(app.log); + var filename = 'sensortoy-' + dt + '.json'; + + // Var dataObj = new Blob(payload, { type: 'text/plain' }); + window.requestFileSystem(LocalFileSystem.PERSISTENT, 0, function(fs) { + + console.log('file system open: ' + fs.name); + fs.root.getFile(filename, { create: true, exclusive: false }, function(fileEntry) { + + console.log('fileEntry is file?' + fileEntry.isFile.toString()); + // FileEntry.name == 'someFile.txt' + // fileEntry.fullPath == '/someFile.txt' + console.log('Path: ', fileEntry.fullPath); + app.writeFile(fileEntry, payload); + + app.log = []; + + }, app.onError); + + }, app.onError); + }, + forceStop: function() { + 'use strict'; + app.stop = true; + $('#scan').show(); + $('#stop').hide(); + }, + + // Bind Event Listeners // // Bind any events that are required on startup. Common events are: // 'load', 'deviceready', 'offline', and 'online'. @@ -75,7 +312,21 @@ var app = { document.addEventListener('deviceready', this.onDeviceReady, false); $('#scan').on('click', function() { 'use strict'; - this.doScan(); + this.stop = false; + this.doScan(2); + $('#scan').hide(); + $('#stop').show(); + }.bind(this)); + + $('#stop').on('click', function() { + 'use strict'; + app.forceStop(); + + }.bind(this)); + + $('#longScan').on('click', function() { + 'use strict'; + this.doScan(1); }.bind(this)); $('#tbody').on('click', 'tr', function() { @@ -86,6 +337,7 @@ var app = { console.log(tID, id); + app.forceStop(); self.connect(id); }); @@ -107,6 +359,16 @@ var app = { sensorMpu9250AccConvert: function(data) { // Change /2 to match accel range...i.e. 16 g would be /16 return data / (32768 / 2); + }, + + doAnimate: function() { + 'use strict'; + // Console.log('Animate..'); + for (var t = 0; t < app.activeServices.length;t++) { + app.activeServices[t].animateGraph(); + } + + window.requestAnimFrame(app.doAnimate.bind(this)); } , connect: function(deviceId) { @@ -131,50 +393,54 @@ var app = { case '180F': var batteryStat = new BATTERY(deviceId); batteryStat.startService(); - batteryStat.readBatteryState(); + // batteryStat.readBatteryState(); app.activeServices.push(batteryStat); - break; + break; case 'FFE0': var buttonState = new BUTTON(deviceId); buttonState.startService(); app.activeServices.push(buttonState); - break; + break; case 'F000AA80-0451-4000-B000-000000000000': var cc2650_accel = new CC2650_ACCEL(deviceId); cc2650_accel.startService(); app.activeServices.push(cc2650_accel); - break; + break; case 'F000AA40-0451-4000-B000-000000000000': var cc2650_bar = new CC2650_BAR(deviceId); cc2650_bar.startService(); app.activeServices.push(cc2650_bar); - break; + break; case 'F000AA70-0451-4000-B000-000000000000': var cc2650_lux = new CC2650_LUX(deviceId); cc2650_lux.startService(); app.activeServices.push(cc2650_lux); - break; + break; case 'F000AA00-0451-4000-B000-000000000000': var cc2650_tmp = new CC2650_TMP(deviceId); cc2650_tmp.startService(); app.activeServices.push(cc2650_tmp); - break; + break; + + case 'F000AA20-0451-4000-B000-000000000000': var cc2650_hum = new CC2650_HUM(deviceId); cc2650_hum.startService(); app.activeServices.push(cc2650_hum); - break; + break; default: - console.log('Unknown service: ', ident); + console.error('Unknown service: ', ident); } } + // Starting animation.. + window.requestAnimFrame(app.doAnimate.bind(this)); }; ble.connect(deviceId, onConnect, function(e) { @@ -190,4 +456,16 @@ var app = { } }; + +window.requestAnimFrame = (function() { + return window.requestAnimationFrame || + window.webkitRequestAnimationFrame || + window.mozRequestAnimationFrame || + function(callback) { + window.setTimeout(callback, 1000 / 60); + }; +})(); + + + app.initialize(); diff --git a/www/js/mandecoder.js b/www/js/mandecoder.js new file mode 100644 index 0000000..1530a32 --- /dev/null +++ b/www/js/mandecoder.js @@ -0,0 +1,69 @@ +/** + * + * User: Martin Donnelly + * Date: 2016-05-24 + * Time: 14:21 + * + */ +var MANUFACTUREDECODER = function() { + 'use strict'; + + this.getManID = function(data) { + return ('0000' + ((data[1] << 8) | data[0]).toString(16)).slice(-4).toUpperCase(); + }, + this.decodeIbeacon = function(data) { + + // Not decoding anything yet. + // https://support.kontakt.io/hc/en-gb/articles/201492492-iBeacon-advertising-packet-structure + var bin = data; + var obj = { msg: '(iBeacon)'}; + // obj.manID = ('0000' + ((bin[1] << 8) | bin[0]).toString(16)).slice(-4); + obj.manID = this.getManID(bin); + var uuid = []; + uuid.push(bin[4].toString(16) + bin[5].toString(16) + bin[6].toString(16) + bin[7].toString(16)) ; + + uuid.push(bin[8].toString(16) + bin[9].toString(16)) ; + uuid.push(bin[10].toString(16) + bin[11].toString(16)) ; + uuid.push(bin[12].toString(16) + bin[13].toString(16)) ; + + uuid.push(bin[14].toString(16) + bin[15].toString(16) + bin[16].toString(16) + bin[17].toString(16) + bin[18].toString(16) + bin[19].toString(16)) ; + + obj.uuid = uuid.join('-'); + + + return obj; + }; + this.decodeSiliconLabsSensorPuck = function(data) { + var bin = data; + var obj = {}; + //obj.manID = ('0000' + ((bin[1] << 8) | bin[0]).toString(16)).slice(-4); + obj.manID = this.getManID(bin); + obj.a = (bin[3] << 8) | bin[2]; + obj.b = (bin[5] << 8) | bin[4]; + obj.humidity = (bin[7] << 8) | bin[6]; + obj.temp = (bin[9] << 8) | bin[8]; + obj.c = (bin[11] << 8) | bin[10]; + obj.d = (bin[13] << 8) | bin[12]; + + obj.msg = 'Humidity: ' + (obj.humidity / 10) + ', temp: ' + (obj.temp / 10); + + return obj; + }; + + + this.decodeSansible = function(data) { + var bin = data; + var obj = {}; + // obj.manID = ('0000' + ((bin[1] << 8) | bin[0]).toString(16)).slice(-4); + obj.manID = this.getManID(bin); + + obj.p1 = ((bin[2] << 16) | bin[3] << 8 | bin[4]) + obj.p2 = ((bin[5] << 16) | bin[6] << 8 | bin[7]) + + obj.msg = 'Left: ' + (obj.p1 / 100) + ' hPa, Right: ' + (obj.p2 / 100) + ' hPa'; + return obj; + + }; + + +}; diff --git a/www/js/standards/battery.js b/www/js/standards/battery.js index 8a17160..0b8ad9a 100644 --- a/www/js/standards/battery.js +++ b/www/js/standards/battery.js @@ -13,39 +13,48 @@ var BATTERY = function() { this.name = 'Battery'; this.capabilityID = '180F'; this.serviceDef = { - service: '180F', - level: '2A19' - }; + service: '180F', level: '2A19' + }; this.onBatteryLevelChange = function(data) { - console.log(data); - var a = new Uint8Array(data); - this.state = a[0]; - console.log('onBatteryLevelChange', this.state); - }; + console.log(data); + var a = new Uint8Array(data); + this.state = a[0]; + console.log('onBatteryLevelChange', this.state); + }; this.readBatteryState = function() { - console.log('readBatteryState'); - ble.read(this.deviceID, this.serviceDef.service, this.serviceDef.level, this.onReadBatteryLevel.bind(this), this.onError); - }; + console.log('readBatteryState'); + ble.read(this.deviceID, + this.serviceDef.service, + this.serviceDef.level, + this.onReadBatteryLevel.bind(this), + this.onError); + }; this.onReadBatteryLevel = function(data) { - console.log(data); - var a = new Uint8Array(data); - this.state = a[0]; - console.log('onReadBatteryLevel', this.state); - }; + console.log(data); + var a = new Uint8Array(data); + this.state = a[0]; + console.log('onReadBatteryLevel', this.state); + }; this.startService = function() { - 'use strict'; - if (this.deviceID !== null) { - console.log('Starting Battery Service'); - ble.startNotification(this.deviceID, this.serviceDef.service, this.serviceDef.level, this.onBatteryLevelChange.bind(this), this.onError); - } + 'use strict'; + if (this.deviceID !== null) { + console.log('Starting Battery Service on ', this.deviceID); + console.log(this.serviceDef); - this.insertFrame(); - }; + this.insertFrame(); + + ble.startNotification(this.deviceID, + this.serviceDef.service, + this.serviceDef.level, + this.onBatteryLevelChange.bind(this), + this.onError); + } + }; }; diff --git a/www/js/standards/bluetooth_company_identifiers.js b/www/js/standards/bluetooth_company_identifiers.js new file mode 100644 index 0000000..72fc3f2 --- /dev/null +++ b/www/js/standards/bluetooth_company_identifiers.js @@ -0,0 +1,3232 @@ +/** + * + * User: Martin Donnelly + * Date: 2016-05-26 + * Time: 11:47 + * + */ +var bt_company_ids = { + find: function(id) { + var _id = id; + var item = this.entries.filter(function(obj) { + return obj.hexadecimal === _id; + }); + return item; + }, + entries: [ + { + decimal: '65535', + hexadecimal: '0xFFFF', + name: 'reserved' + }, + { + decimal: '0', + hexadecimal: '0x0000', + name: 'Ericsson Technology Licensing' + }, + { + decimal: '1', + hexadecimal: '0x0001', + name: 'Nokia Mobile Phones' + }, + { + decimal: '2', + hexadecimal: '0x0002', + name: 'Intel Corp.' + }, + { + decimal: '3', + hexadecimal: '0x0003', + name: 'IBM Corp.' + }, + { + decimal: '4', + hexadecimal: '0x0004', + name: 'Toshiba Corp.' + }, + { + decimal: '5', + hexadecimal: '0x0005', + name: '3Com' + }, + { + decimal: '6', + hexadecimal: '0x0006', + name: 'Microsoft' + }, + { + decimal: '7', + hexadecimal: '0x0007', + name: 'Lucent' + }, + { + decimal: '8', + hexadecimal: '0x0008', + name: 'Motorola' + }, + { + decimal: '9', + hexadecimal: '0x0009', + name: 'Infineon Technologies AG' + }, + { + decimal: '10', + hexadecimal: '0x000A', + name: 'Cambridge Silicon Radio' + }, + { + decimal: '11', + hexadecimal: '0x000B', + name: 'Silicon Wave' + }, + { + decimal: '12', + hexadecimal: '0x000C', + name: 'Digianswer A/S' + }, + { + decimal: '13', + hexadecimal: '0x000D', + name: 'Texas Instruments Inc.' + }, + { + decimal: '14', + hexadecimal: '0x000E', + name: 'Ceva, Inc. (formerly Parthus Technologies, Inc.)' + }, + { + decimal: '15', + hexadecimal: '0x000F', + name: 'Broadcom Corporation' + }, + { + decimal: '16', + hexadecimal: '0x0010', + name: 'Mitel Semiconductor' + }, + { + decimal: '17', + hexadecimal: '0x0011', + name: 'Widcomm, Inc' + }, + { + decimal: '18', + hexadecimal: '0x0012', + name: 'Zeevo, Inc.' + }, + { + decimal: '19', + hexadecimal: '0x0013', + name: 'Atmel Corporation' + }, + { + decimal: '20', + hexadecimal: '0x0014', + name: 'Mitsubishi Electric Corporation' + }, + { + decimal: '21', + hexadecimal: '0x0015', + name: 'RTX Telecom A/S' + }, + { + decimal: '22', + hexadecimal: '0x0016', + name: 'KC Technology Inc.' + }, + { + decimal: '23', + hexadecimal: '0x0017', + name: 'NewLogic' + }, + { + decimal: '24', + hexadecimal: '0x0018', + name: 'Transilica, Inc.' + }, + { + decimal: '25', + hexadecimal: '0x0019', + name: 'Rohde & Schwarz GmbH & Co. KG' + }, + { + decimal: '26', + hexadecimal: '0x001A', + name: 'TTPCom Limited' + }, + { + decimal: '27', + hexadecimal: '0x001B', + name: 'Signia Technologies, Inc.' + }, + { + decimal: '28', + hexadecimal: '0x001C', + name: 'Conexant Systems Inc.' + }, + { + decimal: '29', + hexadecimal: '0x001D', + name: 'Qualcomm' + }, + { + decimal: '30', + hexadecimal: '0x001E', + name: 'Inventel' + }, + { + decimal: '31', + hexadecimal: '0x001F', + name: 'AVM Berlin' + }, + { + decimal: '32', + hexadecimal: '0x0020', + name: 'BandSpeed, Inc.' + }, + { + decimal: '33', + hexadecimal: '0x0021', + name: 'Mansella Ltd' + }, + { + decimal: '34', + hexadecimal: '0x0022', + name: 'NEC Corporation' + }, + { + decimal: '35', + hexadecimal: '0x0023', + name: 'WavePlus Technology Co., Ltd.' + }, + { + decimal: '36', + hexadecimal: '0x0024', + name: 'Alcatel' + }, + { + decimal: '37', + hexadecimal: '0x0025', + name: 'NXP Semiconductors (formerly Philips Semiconductors)' + }, + { + decimal: '38', + hexadecimal: '0x0026', + name: 'C Technologies' + }, + { + decimal: '39', + hexadecimal: '0x0027', + name: 'Open Interface' + }, + { + decimal: '40', + hexadecimal: '0x0028', + name: 'R F Micro Devices' + }, + { + decimal: '41', + hexadecimal: '0x0029', + name: 'Hitachi Ltd' + }, + { + decimal: '42', + hexadecimal: '0x002A', + name: 'Symbol Technologies, Inc.' + }, + { + decimal: '43', + hexadecimal: '0x002B', + name: 'Tenovis' + }, + { + decimal: '44', + hexadecimal: '0x002C', + name: 'Macronix International Co. Ltd.' + }, + { + decimal: '45', + hexadecimal: '0x002D', + name: 'GCT Semiconductor' + }, + { + decimal: '46', + hexadecimal: '0x002E', + name: 'Norwood Systems' + }, + { + decimal: '47', + hexadecimal: '0x002F', + name: 'MewTel Technology Inc.' + }, + { + decimal: '48', + hexadecimal: '0x0030', + name: 'ST Microelectronics' + }, + { + decimal: '49', + hexadecimal: '0x0031', + name: 'Synopsis' + }, + { + decimal: '50', + hexadecimal: '0x0032', + name: 'Red-M (Communications) Ltd' + }, + { + decimal: '51', + hexadecimal: '0x0033', + name: 'Commil Ltd' + }, + { + decimal: '52', + hexadecimal: '0x0034', + name: 'Computer Access Technology Corporation (CATC)' + }, + { + decimal: '53', + hexadecimal: '0x0035', + name: 'Eclipse (HQ Espana) S.L.' + }, + { + decimal: '54', + hexadecimal: '0x0036', + name: 'Renesas Technology Corp.' + }, + { + decimal: '55', + hexadecimal: '0x0037', + name: 'Mobilian Corporation' + }, + { + decimal: '56', + hexadecimal: '0x0038', + name: 'Terax' + }, + { + decimal: '57', + hexadecimal: '0x0039', + name: 'Integrated System Solution Corp.' + }, + { + decimal: '58', + hexadecimal: '0x003A', + name: 'Matsushita Electric Industrial Co., Ltd.' + }, + { + decimal: '59', + hexadecimal: '0x003B', + name: 'Gennum Corporation' + }, + { + decimal: '60', + hexadecimal: '0x003C', + name: 'Research In Motion' + }, + { + decimal: '61', + hexadecimal: '0x003D', + name: 'IPextreme, Inc.' + }, + { + decimal: '62', + hexadecimal: '0x003E', + name: 'Systems and Chips, Inc.' + }, + { + decimal: '63', + hexadecimal: '0x003F', + name: 'Bluetooth SIG, Inc.' + }, + { + decimal: '64', + hexadecimal: '0x0040', + name: 'Seiko Epson Corporation' + }, + { + decimal: '65', + hexadecimal: '0x0041', + name: 'Integrated Silicon Solution Taiwan, Inc.' + }, + { + decimal: '66', + hexadecimal: '0x0042', + name: 'CONWISE Technology Corporation Ltd' + }, + { + decimal: '67', + hexadecimal: '0x0043', + name: 'PARROT SA' + }, + { + decimal: '68', + hexadecimal: '0x0044', + name: 'Socket Mobile' + }, + { + decimal: '69', + hexadecimal: '0x0045', + name: 'Atheros Communications, Inc.' + }, + { + decimal: '70', + hexadecimal: '0x0046', + name: 'MediaTek, Inc.' + }, + { + decimal: '71', + hexadecimal: '0x0047', + name: 'Bluegiga' + }, + { + decimal: '72', + hexadecimal: '0x0048', + name: 'Marvell Technology Group Ltd.' + }, + { + decimal: '73', + hexadecimal: '0x0049', + name: '3DSP Corporation' + }, + { + decimal: '74', + hexadecimal: '0x004A', + name: 'Accel Semiconductor Ltd.' + }, + { + decimal: '75', + hexadecimal: '0x004B', + name: 'Continental Automotive Systems' + }, + { + decimal: '76', + hexadecimal: '0x004C', + name: 'Apple, Inc.' + }, + { + decimal: '77', + hexadecimal: '0x004D', + name: 'Staccato Communications, Inc.' + }, + { + decimal: '78', + hexadecimal: '0x004E', + name: 'Avago Technologies' + }, + { + decimal: '79', + hexadecimal: '0x004F', + name: 'APT Licensing Ltd.' + }, + { + decimal: '80', + hexadecimal: '0x0050', + name: 'SiRF Technology' + }, + { + decimal: '81', + hexadecimal: '0x0051', + name: 'Tzero Technologies, Inc.' + }, + { + decimal: '82', + hexadecimal: '0x0052', + name: 'J&M Corporation' + }, + { + decimal: '83', + hexadecimal: '0x0053', + name: 'Free2move AB' + }, + { + decimal: '84', + hexadecimal: '0x0054', + name: '3DiJoy Corporation' + }, + { + decimal: '85', + hexadecimal: '0x0055', + name: 'Plantronics, Inc.' + }, + { + decimal: '86', + hexadecimal: '0x0056', + name: 'Sony Ericsson Mobile Communications' + }, + { + decimal: '87', + hexadecimal: '0x0057', + name: 'Harman International Industries, Inc.' + }, + { + decimal: '88', + hexadecimal: '0x0058', + name: 'Vizio, Inc.' + }, + { + decimal: '89', + hexadecimal: '0x0059', + name: 'Nordic Semiconductor ASA' + }, + { + decimal: '90', + hexadecimal: '0x005A', + name: 'EM Microelectronic-Marin SA' + }, + { + decimal: '91', + hexadecimal: '0x005B', + name: 'Ralink Technology Corporation' + }, + { + decimal: '92', + hexadecimal: '0x005C', + name: 'Belkin International, Inc.' + }, + { + decimal: '93', + hexadecimal: '0x005D', + name: 'Realtek Semiconductor Corporation' + }, + { + decimal: '94', + hexadecimal: '0x005E', + name: 'Stonestreet One, LLC' + }, + { + decimal: '95', + hexadecimal: '0x005F', + name: 'Wicentric, Inc.' + }, + { + decimal: '96', + hexadecimal: '0x0060', + name: 'RivieraWaves S.A.S' + }, + { + decimal: '97', + hexadecimal: '0x0061', + name: 'RDA Microelectronics' + }, + { + decimal: '98', + hexadecimal: '0x0062', + name: 'Gibson Guitars' + }, + { + decimal: '99', + hexadecimal: '0x0063', + name: 'MiCommand Inc.' + }, + { + decimal: '100', + hexadecimal: '0x0064', + name: 'Band XI International, LLC' + }, + { + decimal: '101', + hexadecimal: '0x0065', + name: 'Hewlett-Packard Company' + }, + { + decimal: '102', + hexadecimal: '0x0066', + name: '9Solutions Oy' + }, + { + decimal: '103', + hexadecimal: '0x0067', + name: 'GN Netcom A/S' + }, + { + decimal: '104', + hexadecimal: '0x0068', + name: 'General Motors' + }, + { + decimal: '105', + hexadecimal: '0x0069', + name: 'A&D Engineering, Inc.' + }, + { + decimal: '106', + hexadecimal: '0x006A', + name: 'MindTree Ltd.' + }, + { + decimal: '107', + hexadecimal: '0x006B', + name: 'Polar Electro OY' + }, + { + decimal: '108', + hexadecimal: '0x006C', + name: 'Beautiful Enterprise Co., Ltd.' + }, + { + decimal: '109', + hexadecimal: '0x006D', + name: 'BriarTek, Inc.' + }, + { + decimal: '110', + hexadecimal: '0x006E', + name: 'Summit Data Communications, Inc.' + }, + { + decimal: '111', + hexadecimal: '0x006F', + name: 'Sound ID' + }, + { + decimal: '112', + hexadecimal: '0x0070', + name: 'Monster, LLC' + }, + { + decimal: '113', + hexadecimal: '0x0071', + name: 'connectBlue AB' + }, + { + decimal: '114', + hexadecimal: '0x0072', + name: 'ShangHai Super Smart Electronics Co. Ltd.' + }, + { + decimal: '115', + hexadecimal: '0x0073', + name: 'Group Sense Ltd.' + }, + { + decimal: '116', + hexadecimal: '0x0074', + name: 'Zomm, LLC' + }, + { + decimal: '117', + hexadecimal: '0x0075', + name: 'Samsung Electronics Co. Ltd.' + }, + { + decimal: '118', + hexadecimal: '0x0076', + name: 'Creative Technology Ltd.' + }, + { + decimal: '119', + hexadecimal: '0x0077', + name: 'Laird Technologies' + }, + { + decimal: '120', + hexadecimal: '0x0078', + name: 'Nike, Inc.' + }, + { + decimal: '121', + hexadecimal: '0x0079', + name: 'lesswire AG' + }, + { + decimal: '122', + hexadecimal: '0x007A', + name: 'MStar Semiconductor, Inc.' + }, + { + decimal: '123', + hexadecimal: '0x007B', + name: 'Hanlynn Technologies' + }, + { + decimal: '124', + hexadecimal: '0x007C', + name: 'A & R Cambridge' + }, + { + decimal: '125', + hexadecimal: '0x007D', + name: 'Seers Technology Co. Ltd' + }, + { + decimal: '126', + hexadecimal: '0x007E', + name: 'Sports Tracking Technologies Ltd.' + }, + { + decimal: '127', + hexadecimal: '0x007F', + name: 'Autonet Mobile' + }, + { + decimal: '128', + hexadecimal: '0x0080', + name: 'DeLorme Publishing Company, Inc.' + }, + { + decimal: '129', + hexadecimal: '0x0081', + name: 'WuXi Vimicro' + }, + { + decimal: '130', + hexadecimal: '0x0082', + name: 'Sennheiser Communications A/S' + }, + { + decimal: '131', + hexadecimal: '0x0083', + name: 'TimeKeeping Systems, Inc.' + }, + { + decimal: '132', + hexadecimal: '0x0084', + name: 'Ludus Helsinki Ltd.' + }, + { + decimal: '133', + hexadecimal: '0x0085', + name: 'BlueRadios, Inc.' + }, + { + decimal: '134', + hexadecimal: '0x0086', + name: 'equinox AG' + }, + { + decimal: '135', + hexadecimal: '0x0087', + name: 'Garmin International, Inc.' + }, + { + decimal: '136', + hexadecimal: '0x0088', + name: 'Ecotest' + }, + { + decimal: '137', + hexadecimal: '0x0089', + name: 'GN ReSound A/S' + }, + { + decimal: '138', + hexadecimal: '0x008A', + name: 'Jawbone' + }, + { + decimal: '139', + hexadecimal: '0x008B', + name: 'Topcorn Positioning Systems, LLC' + }, + { + decimal: '140', + hexadecimal: '0x008C', + name: 'Gimbal Inc. (formerly Qualcomm Labs, Inc. and Qualcomm Retail Solutions, Inc.)' + }, + { + decimal: '141', + hexadecimal: '0x008D', + name: 'Zscan Software' + }, + { + decimal: '142', + hexadecimal: '0x008E', + name: 'Quintic Corp.' + }, + { + decimal: '143', + hexadecimal: '0x008F', + name: 'Stollman E+V GmbH' + }, + { + decimal: '144', + hexadecimal: '0x0090', + name: 'Funai Electric Co., Ltd.' + }, + { + decimal: '145', + hexadecimal: '0x0091', + name: 'Advanced PANMOBIL Systems GmbH & Co. KG' + }, + { + decimal: '146', + hexadecimal: '0x0092', + name: 'ThinkOptics, Inc.' + }, + { + decimal: '147', + hexadecimal: '0x0093', + name: 'Universal Electronics, Inc.' + }, + { + decimal: '148', + hexadecimal: '0x0094', + name: 'Airoha Technology Corp.' + }, + { + decimal: '149', + hexadecimal: '0x0095', + name: 'NEC Lighting, Ltd.' + }, + { + decimal: '150', + hexadecimal: '0x0096', + name: 'ODM Technology, Inc.' + }, + { + decimal: '151', + hexadecimal: '0x0097', + name: 'ConnecteDevice Ltd.' + }, + { + decimal: '152', + hexadecimal: '0x0098', + name: 'zer01.tv GmbH' + }, + { + decimal: '153', + hexadecimal: '0x0099', + name: 'i.Tech Dynamic Global Distribution Ltd.' + }, + { + decimal: '154', + hexadecimal: '0x009A', + name: 'Alpwise' + }, + { + decimal: '155', + hexadecimal: '0x009B', + name: 'Jiangsu Toppower Automotive Electronics Co., Ltd.' + }, + { + decimal: '156', + hexadecimal: '0x009C', + name: 'Colorfy, Inc.' + }, + { + decimal: '157', + hexadecimal: '0x009D', + name: 'Geoforce Inc.' + }, + { + decimal: '158', + hexadecimal: '0x009E', + name: 'Bose Corporation' + }, + { + decimal: '159', + hexadecimal: '0x009F', + name: 'Suunto Oy' + }, + { + decimal: '160', + hexadecimal: '0x00A0', + name: 'Kensington Computer Products Group' + }, + { + decimal: '161', + hexadecimal: '0x00A1', + name: 'SR-Medizinelektronik' + }, + { + decimal: '162', + hexadecimal: '0x00A2', + name: 'Vertu Corporation Limited' + }, + { + decimal: '163', + hexadecimal: '0x00A3', + name: 'Meta Watch Ltd.' + }, + { + decimal: '164', + hexadecimal: '0x00A4', + name: 'LINAK A/S' + }, + { + decimal: '165', + hexadecimal: '0x00A5', + name: 'OTL Dynamics LLC' + }, + { + decimal: '166', + hexadecimal: '0x00A6', + name: 'Panda Ocean Inc.' + }, + { + decimal: '167', + hexadecimal: '0x00A7', + name: 'Visteon Corporation' + }, + { + decimal: '168', + hexadecimal: '0x00A8', + name: 'ARP Devices Limited' + }, + { + decimal: '169', + hexadecimal: '0x00A9', + name: 'Magneti Marelli S.p.A' + }, + { + decimal: '170', + hexadecimal: '0x00AA', + name: 'CAEN RFID srl' + }, + { + decimal: '171', + hexadecimal: '0x00AB', + name: 'Ingenieur-Systemgruppe Zahn GmbH' + }, + { + decimal: '172', + hexadecimal: '0x00AC', + name: 'Green Throttle Games' + }, + { + decimal: '173', + hexadecimal: '0x00AD', + name: 'Peter Systemtechnik GmbH' + }, + { + decimal: '174', + hexadecimal: '0x00AE', + name: 'Omegawave Oy' + }, + { + decimal: '175', + hexadecimal: '0x00AF', + name: 'Cinetix' + }, + { + decimal: '176', + hexadecimal: '0x00B0', + name: 'Passif Semiconductor Corp' + }, + { + decimal: '177', + hexadecimal: '0x00B1', + name: 'Saris Cycling Group, Inc' + }, + { + decimal: '178', + hexadecimal: '0x00B2', + name: 'Bekey A/S' + }, + { + decimal: '179', + hexadecimal: '0x00B3', + name: 'Clarinox Technologies Pty. Ltd.' + }, + { + decimal: '180', + hexadecimal: '0x00B4', + name: 'BDE Technology Co., Ltd.' + }, + { + decimal: '181', + hexadecimal: '0x00B5', + name: 'Swirl Networks' + }, + { + decimal: '182', + hexadecimal: '0x00B6', + name: 'Meso international' + }, + { + decimal: '183', + hexadecimal: '0x00B7', + name: 'TreLab Ltd' + }, + { + decimal: '184', + hexadecimal: '0x00B8', + name: 'Qualcomm Innovation Center, Inc. (QuIC)' + }, + { + decimal: '185', + hexadecimal: '0x00B9', + name: 'Johnson Controls, Inc.' + }, + { + decimal: '186', + hexadecimal: '0x00BA', + name: 'Starkey Laboratories Inc.' + }, + { + decimal: '187', + hexadecimal: '0x00BB', + name: 'S-Power Electronics Limited' + }, + { + decimal: '188', + hexadecimal: '0x00BC', + name: 'Ace Sensor Inc' + }, + { + decimal: '189', + hexadecimal: '0x00BD', + name: 'Aplix Corporation' + }, + { + decimal: '190', + hexadecimal: '0x00BE', + name: 'AAMP of America' + }, + { + decimal: '191', + hexadecimal: '0x00BF', + name: 'Stalmart Technology Limited' + }, + { + decimal: '192', + hexadecimal: '0x00C0', + name: 'AMICCOM Electronics Corporation' + }, + { + decimal: '193', + hexadecimal: '0x00C1', + name: 'Shenzhen Excelsecu Data Technology Co.,Ltd' + }, + { + decimal: '194', + hexadecimal: '0x00C2', + name: 'Geneq Inc.' + }, + { + decimal: '195', + hexadecimal: '0x00C3', + name: 'adidas AG' + }, + { + decimal: '196', + hexadecimal: '0x00C4', + name: 'LG Electronics' + }, + { + decimal: '197', + hexadecimal: '0x00C5', + name: 'Onset Computer Corporation' + }, + { + decimal: '198', + hexadecimal: '0x00C6', + name: 'Selfly BV' + }, + { + decimal: '199', + hexadecimal: '0x00C7', + name: 'Quuppa Oy.' + }, + { + decimal: '200', + hexadecimal: '0x00C8', + name: 'GeLo Inc' + }, + { + decimal: '201', + hexadecimal: '0x00C9', + name: 'Evluma' + }, + { + decimal: '202', + hexadecimal: '0x00CA', + name: 'MC10' + }, + { + decimal: '203', + hexadecimal: '0x00CB', + name: 'Binauric SE' + }, + { + decimal: '204', + hexadecimal: '0x00CC', + name: 'Beats Electronics' + }, + { + decimal: '205', + hexadecimal: '0x00CD', + name: 'Microchip Technology Inc.' + }, + { + decimal: '206', + hexadecimal: '0x00CE', + name: 'Elgato Systems GmbH' + }, + { + decimal: '207', + hexadecimal: '0x00CF', + name: 'ARCHOS SA' + }, + { + decimal: '208', + hexadecimal: '0x00D0', + name: 'Dexcom, Inc.' + }, + { + decimal: '209', + hexadecimal: '0x00D1', + name: 'Polar Electro Europe B.V.' + }, + { + decimal: '210', + hexadecimal: '0x00D2', + name: 'Dialog Semiconductor B.V.' + }, + { + decimal: '211', + hexadecimal: '0x00D3', + name: 'Taixingbang Technology (HK) Co,. LTD.' + }, + { + decimal: '212', + hexadecimal: '0x00D4', + name: 'Kawantech' + }, + { + decimal: '213', + hexadecimal: '0x00D5', + name: 'Austco Communication Systems' + }, + { + decimal: '214', + hexadecimal: '0x00D6', + name: 'Timex Group USA, Inc.' + }, + { + decimal: '215', + hexadecimal: '0x00D7', + name: 'Qualcomm Technologies, Inc.' + }, + { + decimal: '216', + hexadecimal: '0x00D8', + name: 'Qualcomm Connected Experiences, Inc.' + }, + { + decimal: '217', + hexadecimal: '0x00D9', + name: 'Voyetra Turtle Beach' + }, + { + decimal: '218', + hexadecimal: '0x00DA', + name: 'txtr GmbH' + }, + { + decimal: '219', + hexadecimal: '0x00DB', + name: 'Biosentronics' + }, + { + decimal: '220', + hexadecimal: '0x00DC', + name: 'Procter & Gamble' + }, + { + decimal: '221', + hexadecimal: '0x00DD', + name: 'Hosiden Corporation' + }, + { + decimal: '222', + hexadecimal: '0x00DE', + name: 'Muzik LLC' + }, + { + decimal: '223', + hexadecimal: '0x00DF', + name: 'Misfit Wearables Corp' + }, + { + decimal: '224', + hexadecimal: '0x00E0', + name: 'Google' + }, + { + decimal: '225', + hexadecimal: '0x00E1', + name: 'Danlers Ltd' + }, + { + decimal: '226', + hexadecimal: '0x00E2', + name: 'Semilink Inc' + }, + { + decimal: '227', + hexadecimal: '0x00E3', + name: 'inMusic Brands, Inc' + }, + { + decimal: '228', + hexadecimal: '0x00E4', + name: 'L.S. Research Inc.' + }, + { + decimal: '229', + hexadecimal: '0x00E5', + name: 'Eden Software Consultants Ltd.' + }, + { + decimal: '230', + hexadecimal: '0x00E6', + name: 'Freshtemp' + }, + { + decimal: '231', + hexadecimal: '0x00E7', + name: 'KS Technologies' + }, + { + decimal: '232', + hexadecimal: '0x00E8', + name: 'ACTS Technologies' + }, + { + decimal: '233', + hexadecimal: '0x00E9', + name: 'Vtrack Systems' + }, + { + decimal: '234', + hexadecimal: '0x00EA', + name: 'Nielsen-Kellerman Company' + }, + { + decimal: '235', + hexadecimal: '0x00EB', + name: 'Server Technology, Inc.' + }, + { + decimal: '236', + hexadecimal: '0x00EC', + name: 'BioResearch Associates' + }, + { + decimal: '237', + hexadecimal: '0x00ED', + name: 'Jolly Logic, LLC' + }, + { + decimal: '238', + hexadecimal: '0x00EE', + name: 'Above Average Outcomes, Inc.' + }, + { + decimal: '239', + hexadecimal: '0x00EF', + name: 'Bitsplitters GmbH' + }, + { + decimal: '240', + hexadecimal: '0x00F0', + name: 'PayPal, Inc.' + }, + { + decimal: '241', + hexadecimal: '0x00F1', + name: 'Witron Technology Limited' + }, + { + decimal: '242', + hexadecimal: '0x00F2', + name: 'Aether Things Inc. (formerly Morse Project Inc.)' + }, + { + decimal: '243', + hexadecimal: '0x00F3', + name: 'Kent Displays Inc.' + }, + { + decimal: '244', + hexadecimal: '0x00F4', + name: 'Nautilus Inc.' + }, + { + decimal: '245', + hexadecimal: '0x00F5', + name: 'Smartifier Oy' + }, + { + decimal: '246', + hexadecimal: '0x00F6', + name: 'Elcometer Limited' + }, + { + decimal: '247', + hexadecimal: '0x00F7', + name: 'VSN Technologies Inc.' + }, + { + decimal: '248', + hexadecimal: '0x00F8', + name: 'AceUni Corp., Ltd.' + }, + { + decimal: '249', + hexadecimal: '0x00F9', + name: 'StickNFind' + }, + { + decimal: '250', + hexadecimal: '0x00FA', + name: 'Crystal Code AB' + }, + { + decimal: '251', + hexadecimal: '0x00FB', + name: 'KOUKAAM a.s.' + }, + { + decimal: '252', + hexadecimal: '0x00FC', + name: 'Delphi Corporation' + }, + { + decimal: '253', + hexadecimal: '0x00FD', + name: 'ValenceTech Limited' + }, + { + decimal: '254', + hexadecimal: '0x00FE', + name: 'Reserved' + }, + { + decimal: '255', + hexadecimal: '0x00FF', + name: 'Typo Products, LLC' + }, + { + decimal: '256', + hexadecimal: '0x0100', + name: 'TomTom International BV' + }, + { + decimal: '257', + hexadecimal: '0x0101', + name: 'Fugoo, Inc' + }, + { + decimal: '258', + hexadecimal: '0x0102', + name: 'Keiser Corporation' + }, + { + decimal: '259', + hexadecimal: '0x0103', + name: 'Bang & Olufsen A/S' + }, + { + decimal: '260', + hexadecimal: '0x0104', + name: 'PLUS Locations Systems Pty Ltd' + }, + { + decimal: '261', + hexadecimal: '0x0105', + name: 'Ubiquitous Computing Technology Corporation' + }, + { + decimal: '262', + hexadecimal: '0x0106', + name: 'Innovative Yachtter Solutions' + }, + { + decimal: '263', + hexadecimal: '0x0107', + name: 'William Demant Holding A/S' + }, + { + decimal: '264', + hexadecimal: '0x0108', + name: 'Chicony Electronics Co., Ltd.' + }, + { + decimal: '265', + hexadecimal: '0x0109', + name: 'Atus BV' + }, + { + decimal: '266', + hexadecimal: '0x010A', + name: 'Codegate Ltd.' + }, + { + decimal: '267', + hexadecimal: '0x010B', + name: 'ERi, Inc.' + }, + { + decimal: '268', + hexadecimal: '0x010C', + name: 'Transducers Direct, LLC' + }, + { + decimal: '269', + hexadecimal: '0x010D', + name: 'Fujitsu Ten Limited' + }, + { + decimal: '270', + hexadecimal: '0x010E', + name: 'Audi AG' + }, + { + decimal: '271', + hexadecimal: '0x010F', + name: 'HiSilicon Technologies Co., Ltd.' + }, + { + decimal: '272', + hexadecimal: '0x0110', + name: 'Nippon Seiki Co., Ltd.' + }, + { + decimal: '273', + hexadecimal: '0x0111', + name: 'Steelseries ApS' + }, + { + decimal: '274', + hexadecimal: '0x0112', + name: 'vyzybl Inc.' + }, + { + decimal: '275', + hexadecimal: '0x0113', + name: 'Openbrain Technologies, Co., Ltd.' + }, + { + decimal: '276', + hexadecimal: '0x0114', + name: 'Xensr' + }, + { + decimal: '277', + hexadecimal: '0x0115', + name: 'e.solutions' + }, + { + decimal: '278', + hexadecimal: '0x0116', + name: '1OAK Technologies' + }, + { + decimal: '279', + hexadecimal: '0x0117', + name: 'Wimoto Technologies Inc' + }, + { + decimal: '280', + hexadecimal: '0x0118', + name: 'Radius Networks, Inc.' + }, + { + decimal: '281', + hexadecimal: '0x0119', + name: 'Wize Technology Co., Ltd.' + }, + { + decimal: '282', + hexadecimal: '0x011A', + name: 'Qualcomm Labs, Inc.' + }, + { + decimal: '283', + hexadecimal: '0x011B', + name: 'Aruba Networks' + }, + { + decimal: '284', + hexadecimal: '0x011C', + name: 'Baidu' + }, + { + decimal: '285', + hexadecimal: '0x011D', + name: 'Arendi AG' + }, + { + decimal: '286', + hexadecimal: '0x011E', + name: 'Skoda Auto a.s.' + }, + { + decimal: '287', + hexadecimal: '0x011F', + name: 'Volkswagon AG' + }, + { + decimal: '288', + hexadecimal: '0x0120', + name: 'Porsche AG' + }, + { + decimal: '289', + hexadecimal: '0x0121', + name: 'Sino Wealth Electronic Ltd.' + }, + { + decimal: '290', + hexadecimal: '0x0122', + name: 'AirTurn, Inc.' + }, + { + decimal: '291', + hexadecimal: '0x0123', + name: 'Kinsa, Inc.' + }, + { + decimal: '292', + hexadecimal: '0x0124', + name: 'HID Global' + }, + { + decimal: '293', + hexadecimal: '0x0125', + name: 'SEAT es' + }, + { + decimal: '294', + hexadecimal: '0x0126', + name: 'Promethean Ltd.' + }, + { + decimal: '295', + hexadecimal: '0x0127', + name: 'Salutica Allied Solutions' + }, + { + decimal: '296', + hexadecimal: '0x0128', + name: 'GPSI Group Pty Ltd' + }, + { + decimal: '297', + hexadecimal: '0x0129', + name: 'Nimble Devices Oy' + }, + { + decimal: '298', + hexadecimal: '0x012A', + name: 'Changzhou Yongse Infotech Co., Ltd' + }, + { + decimal: '299', + hexadecimal: '0x012B', + name: 'SportIQ' + }, + { + decimal: '300', + hexadecimal: '0x012C', + name: 'TEMEC Instruments B.V.' + }, + { + decimal: '301', + hexadecimal: '0x012D', + name: 'Sony Corporation' + }, + { + decimal: '302', + hexadecimal: '0x012E', + name: 'ASSA ABLOY' + }, + { + decimal: '303', + hexadecimal: '0x012F', + name: 'Clarion Co., Ltd.' + }, + { + decimal: '304', + hexadecimal: '0x0130', + name: 'Warehouse Innovations' + }, + { + decimal: '305', + hexadecimal: '0x0131', + name: 'Cypress Semiconductor Corporation' + }, + { + decimal: '306', + hexadecimal: '0x0132', + name: 'MADS Inc' + }, + { + decimal: '307', + hexadecimal: '0x0133', + name: 'Blue Maestro Limited' + }, + { + decimal: '308', + hexadecimal: '0x0134', + name: 'Resolution Products, Inc.' + }, + { + decimal: '309', + hexadecimal: '0x0135', + name: 'Airewear LLC' + }, + { + decimal: '310', + hexadecimal: '0x0136', + name: 'ETC sp. z.o.o.' + }, + { + decimal: '311', + hexadecimal: '0x0137', + name: 'Prestigio Plaza Ltd.' + }, + { + decimal: '312', + hexadecimal: '0x0138', + name: 'NTEO Inc.' + }, + { + decimal: '313', + hexadecimal: '0x0139', + name: 'Focus Systems Corporation' + }, + { + decimal: '314', + hexadecimal: '0x013A', + name: 'Tencent Holdings Limited' + }, + { + decimal: '315', + hexadecimal: '0x013B', + name: 'Allegion' + }, + { + decimal: '316', + hexadecimal: '0x013C', + name: 'Murata Manufacuring Co., Ltd.' + }, + { + decimal: '318', + hexadecimal: '0x013E', + name: 'Nod, Inc.' + }, + { + decimal: '319', + hexadecimal: '0x013F', + name: 'B&B Manufacturing Company' + }, + { + decimal: '320', + hexadecimal: '0x0140', + name: 'Alpine Electronics (China) Co., Ltd' + }, + { + decimal: '321', + hexadecimal: '0x0141', + name: 'FedEx Services' + }, + { + decimal: '322', + hexadecimal: '0x0142', + name: 'Grape Systems Inc.' + }, + { + decimal: '323', + hexadecimal: '0x0143', + name: 'Bkon Connect' + }, + { + decimal: '324', + hexadecimal: '0x0144', + name: 'Lintech GmbH' + }, + { + decimal: '325', + hexadecimal: '0x0145', + name: 'Novatel Wireless' + }, + { + decimal: '326', + hexadecimal: '0x0146', + name: 'Ciright' + }, + { + decimal: '327', + hexadecimal: '0x0147', + name: 'Mighty Cast, Inc.' + }, + { + decimal: '328', + hexadecimal: '0x0148', + name: 'Ambimat Electronics' + }, + { + decimal: '329', + hexadecimal: '0x0149', + name: 'Perytons Ltd.' + }, + { + decimal: '330', + hexadecimal: '0x014A', + name: 'Tivoli Audio, LLC' + }, + { + decimal: '331', + hexadecimal: '0x014B', + name: 'Master Lock' + }, + { + decimal: '332', + hexadecimal: '0x014C', + name: 'Mesh-Net Ltd' + }, + { + decimal: '333', + hexadecimal: '0x014D', + name: 'Huizhou Desay SV Automotive CO., LTD.' + }, + { + decimal: '334', + hexadecimal: '0x014E', + name: 'Tangerine, Inc.' + }, + { + decimal: '335', + hexadecimal: '0x014F', + name: 'B&W Group Ltd.' + }, + { + decimal: '336', + hexadecimal: '0x0150', + name: 'Pioneer Corporation' + }, + { + decimal: '337', + hexadecimal: '0x0151', + name: 'OnBeep' + }, + { + decimal: '338', + hexadecimal: '0x0152', + name: 'Vernier Software & Technology' + }, + { + decimal: '339', + hexadecimal: '0x0153', + name: 'ROL Ergo' + }, + { + decimal: '340', + hexadecimal: '0x0154', + name: 'Pebble Technology' + }, + { + decimal: '341', + hexadecimal: '0x0155', + name: 'NETATMO' + }, + { + decimal: '342', + hexadecimal: '0x0156', + name: 'Accumulate AB' + }, + { + decimal: '343', + hexadecimal: '0x0157', + name: 'Anhui Huami Information Technology Co., Ltd.' + }, + { + decimal: '344', + hexadecimal: '0x0158', + name: 'Inmite s.r.o.' + }, + { + decimal: '345', + hexadecimal: '0x0159', + name: 'ChefSteps, Inc.' + }, + { + decimal: '346', + hexadecimal: '0x015A', + name: 'micas AG' + }, + { + decimal: '347', + hexadecimal: '0x015B', + name: 'Biomedical Research Ltd.' + }, + { + decimal: '348', + hexadecimal: '0x015C', + name: 'Pitius Tec S.L.' + }, + { + decimal: '349', + hexadecimal: '0x015D', + name: 'Estimote, Inc.' + }, + { + decimal: '350', + hexadecimal: '0x015E', + name: 'Unikey Technologies, Inc.' + }, + { + decimal: '351', + hexadecimal: '0x015F', + name: 'Timer Cap Co.' + }, + { + decimal: '352', + hexadecimal: '0x0160', + name: 'AwoX' + }, + { + decimal: '353', + hexadecimal: '0x0161', + name: 'yikes' + }, + { + decimal: '354', + hexadecimal: '0x0162', + name: 'MADSGlobal NZ Ltd.' + }, + { + decimal: '355', + hexadecimal: '0x0163', + name: 'PCH International' + }, + { + decimal: '356', + hexadecimal: '0x0164', + name: 'Qingdao Yeelink Information Technology Co., Ltd.' + }, + { + decimal: '357', + hexadecimal: '0x0165', + name: 'Milwaukee Tool (formerly Milwaukee Electric Tools)' + }, + { + decimal: '358', + hexadecimal: '0x0166', + name: 'MISHIK Pte Ltd' + }, + { + decimal: '359', + hexadecimal: '0x0167', + name: 'Bayer HealthCare' + }, + { + decimal: '360', + hexadecimal: '0x0168', + name: 'Spicebox LLC' + }, + { + decimal: '361', + hexadecimal: '0x0169', + name: 'emberlight' + }, + { + decimal: '362', + hexadecimal: '0x016A', + name: 'Cooper-Atkins Corporation' + }, + { + decimal: '363', + hexadecimal: '0x016B', + name: 'Qblinks' + }, + { + decimal: '364', + hexadecimal: '0x016C', + name: 'MYSPHERA' + }, + { + decimal: '365', + hexadecimal: '​0x016D', + name: 'LifeScan Inc' + }, + { + decimal: '366', + hexadecimal: '​0x016E', + name: 'Volantic AB' + }, + { + decimal: '367', + hexadecimal: '0x016F', + name: 'Podo Labs, Inc' + }, + { + decimal: '368', + hexadecimal: '0x0170', + name: 'Roche Diabetes Care AG' + }, + { + decimal: '368', + hexadecimal: '0x0170', + name: 'Roche Diabetes Care AG' + }, + { + decimal: '369', + hexadecimal: '0x0171', + name: 'Amazon Fulfillment Service' + }, + { + decimal: '370', + hexadecimal: '0x0172', + name: 'Connovate Technology Private Limited' + }, + { + decimal: '371', + hexadecimal: '0x0173', + name: 'Kocomojo, LLC' + }, + { + decimal: '372', + hexadecimal: '0x0174', + name: 'Everykey LLC' + }, + { + decimal: '373', + hexadecimal: '0x0175', + name: 'Dynamic Controls' + }, + { + decimal: '374', + hexadecimal: '0x0176', + name: 'SentriLock' + }, + { + decimal: '375', + hexadecimal: '0x0177', + name: 'I-SYST inc.' + }, + { + decimal: '376', + hexadecimal: '0x0178', + name: 'CASIO COMPUTER CO., LTD.' + }, + { + decimal: '377', + hexadecimal: '0x0179', + name: 'LAPIS Semiconductor Co., Ltd.' + }, + { + decimal: '378', + hexadecimal: '0x017A', + name: 'Telemonitor, Inc.' + }, + { + decimal: '379', + hexadecimal: '0x017B', + name: 'taskit GmbH' + }, + { + decimal: '380', + hexadecimal: '0x017C', + name: 'Daimler AG' + }, + { + decimal: '381', + hexadecimal: '0x017D', + name: 'BatAndCat' + }, + { + decimal: '382', + hexadecimal: '0x017E', + name: 'BluDotz Ltd' + }, + { + decimal: '383', + hexadecimal: '0x017F', + name: 'XTel ApS' + }, + { + decimal: '384', + hexadecimal: '0x0180', + name: 'Gigaset Communications GmbH' + }, + { + decimal: '385', + hexadecimal: '0x0181', + name: 'Gecko Health Innovations, Inc.' + }, + { + decimal: '386', + hexadecimal: '0x0182', + name: 'HOP Ubiquitous' + }, + { + decimal: '387', + hexadecimal: '0x0183', + name: '### EMPTY ###' + }, + { + decimal: '388', + hexadecimal: '0x0184', + name: 'Nectar' + }, + { + decimal: '389', + hexadecimal: '0x0185', + name: 'bel\'apps LLC' + }, + { + decimal: '390', + hexadecimal: '0x0186', + name: 'CORE Lighting Ltd' + }, + { + decimal: '391', + hexadecimal: '0x0187', + name: 'Seraphim Sense Ltd' + }, + { + decimal: '392', + hexadecimal: '0x0188', + name: 'Unico RBC' + }, + { + decimal: '393', + hexadecimal: '0x0189', + name: 'Physical Enterprises Inc.' + }, + { + decimal: '394', + hexadecimal: '0x018A', + name: 'Able Trend Technology Limited' + }, + { + decimal: '395', + hexadecimal: '0x018B', + name: 'Konica Minolta, Inc.' + }, + { + decimal: '396', + hexadecimal: '0x018C', + name: 'Wilo SE' + }, + { + decimal: '397', + hexadecimal: '0x018D', + name: 'Extron Design Services' + }, + { + decimal: '398', + hexadecimal: '0x018E', + name: 'Fitbit, Inc.' + }, + { + decimal: '399', + hexadecimal: '0x018F', + name: 'Fireflies Systems' + }, + { + decimal: '400', + hexadecimal: '0x0190', + name: 'Intelletto Technologies Inc' + }, + { + decimal: '401', + hexadecimal: '0x0191', + name: 'FDK CORPORATION' + }, + { + decimal: '402', + hexadecimal: '0x0192', + name: 'Cloudleaf, Inc' + }, + { + decimal: '403', + hexadecimal: '0x0193', + name: 'Maveric Automation LLC' + }, + { + decimal: '404', + hexadecimal: '0x0194', + name: 'Acoustic Stream Corporation' + }, + { + decimal: '405', + hexadecimal: '0x0195', + name: 'Zuli' + }, + { + decimal: '406', + hexadecimal: '0x0196', + name: 'Paxton Access Ltd' + }, + { + decimal: '407', + hexadecimal: '0x0197', + name: 'WiSilica Inc' + }, + { + decimal: '408', + hexadecimal: '0x0198', + name: 'Vengit Limited' + }, + { + decimal: '409', + hexadecimal: '0x0199', + name: 'SALTO SYSTEMS S.L.' + }, + { + decimal: '410', + hexadecimal: '0x019A', + name: 'T-Engine Forum' + }, + { + decimal: '411', + hexadecimal: '0x019B', + name: 'CUBETECH s.r.o.' + }, + { + decimal: '412', + hexadecimal: '0x019C', + name: 'Cokiya Incorporated' + }, + { + decimal: '413', + hexadecimal: '0x019D', + name: 'CVS Health' + }, + { + decimal: '414', + hexadecimal: '0x019E', + name: 'Ceruus' + }, + { + decimal: '415', + hexadecimal: '0x019F', + name: 'Strainstall Ltd' + }, + { + decimal: '416', + hexadecimal: '0x01A0', + name: 'Channel Enterprises (HK) Ltd.' + }, + { + decimal: '417', + hexadecimal: '0x01A1', + name: 'FIAMM' + }, + { + decimal: '418', + hexadecimal: '0x01A2', + name: 'GIGALANE.CO.,LTD' + }, + { + decimal: '419', + hexadecimal: '0x01A3', + name: 'EROAD' + }, + { + decimal: '420', + hexadecimal: '0x01A4', + name: 'Mine Safety Appliances' + }, + { + decimal: '421', + hexadecimal: '0x01A5', + name: 'Icon Health and Fitness' + }, + { + decimal: '422', + hexadecimal: '0x01A6', + name: 'Asandoo GmbH' + }, + { + decimal: '423', + hexadecimal: '0x01A7', + name: 'ENERGOUS CORPORATION' + }, + { + decimal: '424', + hexadecimal: '0x01A8', + name: 'Taobao' + }, + { + decimal: '425', + hexadecimal: '0x01A9', + name: 'Canon Inc.' + }, + { + decimal: '426', + hexadecimal: '0x01AA', + name: 'Geophysical Technology Inc.' + }, + { + decimal: '427', + hexadecimal: '0x01AB', + name: 'Facebook, Inc.' + }, + { + decimal: '428', + hexadecimal: '0x01AC', + name: 'Nipro Diagnostics, Inc.' + }, + { + decimal: '429', + hexadecimal: '0x01AD', + name: 'FlightSafety International' + }, + { + decimal: '430', + hexadecimal: '0x01AE', + name: 'Earlens Corporation' + }, + { + decimal: '431', + hexadecimal: '0x01AF', + name: 'Sunrise Micro Devices, Inc.' + }, + { + decimal: '432', + hexadecimal: '0x01B0', + name: 'Star Micronics Co., Ltd.' + }, + { + decimal: '433', + hexadecimal: '0x01B1', + name: 'Netizens Sp. z o.o.' + }, + { + decimal: '434', + hexadecimal: '0x01B2', + name: 'Nymi Inc.' + }, + { + decimal: '435', + hexadecimal: '​0x01B3', + name: 'Nytec, Inc.' + }, + { + decimal: '436', + hexadecimal: '​0x01B4', + name: 'Trineo Sp. z o.o.' + }, + { + decimal: '437', + hexadecimal: '​0x01B5', + name: 'Nest Labs Inc.' + }, + { + decimal: '438', + hexadecimal: '​0x01B6', + name: 'LM Technologies Ltd' + }, + { + decimal: '439', + hexadecimal: '​0x01B7', + name: 'General Electric Company' + }, + { + decimal: '440', + hexadecimal: '​0x01B8', + name: 'i+D3 S.L.' + }, + { + decimal: '441', + hexadecimal: '​0x01B9', + name: 'HANA Micron' + }, + { + decimal: '442', + hexadecimal: '​0x01BA', + name: 'Stages Cycling LLC' + }, + { + decimal: '443', + hexadecimal: '​0x01BB', + name: 'Cochlear Bone Anchored Solutions AB' + }, + { + decimal: '444', + hexadecimal: '​0x01BC', + name: 'SenionLab AB' + }, + { + decimal: '445', + hexadecimal: '​0x01BD', + name: 'Syszone Co., Ltd' + }, + { + decimal: '446', + hexadecimal: '​0x01BE', + name: 'Pulsate Mobile Ltd.' + }, + { + decimal: '447', + hexadecimal: '​0x01BF', + name: 'Hong Kong HunterSun Electronic Limited' + }, + { + decimal: '448', + hexadecimal: '​​0x01C0', + name: 'pironex GmbH' + }, + { + decimal: '449', + hexadecimal: '​​0x01C1', + name: 'BRADATECH Corp.' + }, + { + decimal: '450', + hexadecimal: '​​0x01C2', + name: 'Transenergooil AG' + }, + { + decimal: '451', + hexadecimal: '​​0x01C3', + name: 'Bunch' + }, + { + decimal: '452', + hexadecimal: '​​0x01C4', + name: 'DME Microelectronics' + }, + { + decimal: '453', + hexadecimal: '​​0x01C5', + name: 'Bitcraze AB' + }, + { + decimal: '454', + hexadecimal: '​​0x01C6', + name: 'HASWARE Inc.' + }, + { + decimal: '455', + hexadecimal: '​​0x01C7', + name: 'Abiogenix Inc.' + }, + { + decimal: '456', + hexadecimal: '​​0x01C8', + name: 'Poly-Control ApS' + }, + { + decimal: '457', + hexadecimal: '​​0x01C9', + name: 'Avi-on' + }, + { + decimal: '458', + hexadecimal: '​​0x01CA', + name: 'Laerdal Medical AS' + }, + { + decimal: '459', + hexadecimal: '​​0x01CB', + name: 'Fetch My Pet' + }, + { + decimal: '460', + hexadecimal: '​​0x01CC', + name: 'Sam Labs Ltd.' + }, + { + decimal: '461', + hexadecimal: '​​0x01CD', + name: 'Chengdu Synwing Technology Ltd' + }, + { + decimal: '462', + hexadecimal: '​​0x01CE', + name: 'HOUWA SYSTEM DESIGN, k.k.' + }, + { + decimal: '463', + hexadecimal: '​​0x01CF', + name: 'BSH' + }, + { + decimal: '464', + hexadecimal: '​​0x01D0', + name: 'Primus Inter Pares Ltd' + }, + { + decimal: '465', + hexadecimal: '​​0x01D1', + name: 'August' + }, + { + decimal: '466', + hexadecimal: '​​0x01D2', + name: 'Gill Electronics' + }, + { + decimal: '467', + hexadecimal: '​​0x01D3', + name: 'Sky Wave Design' + }, + { + decimal: '468', + hexadecimal: '​​0x01D4', + name: 'Newlab S.r.l.' + }, + { + decimal: '469', + hexadecimal: '​​0x01D5', + name: 'ELAD srl' + }, + { + decimal: '470', + hexadecimal: '​​0x01D6', + name: 'G-wearables inc.' + }, + { + decimal: '471', + hexadecimal: '​​0x01D7', + name: 'Squadrone Systems Inc.' + }, + { + decimal: '472', + hexadecimal: '​​0x01D8', + name: 'Code Corporation' + }, + { + decimal: '473', + hexadecimal: '​​0x01D9', + name: 'Savant Systems LLC' + }, + { + decimal: '474', + hexadecimal: '​​0x01DA', + name: '​Logitech International SA' + }, + { + decimal: '475', + hexadecimal: '​​0x01DB', + name: '​Innblue Consulting' + }, + { + decimal: '476', + hexadecimal: '​​0x01DC', + name: 'iParking Ltd.' + }, + { + decimal: '477', + hexadecimal: '​​0x01DD', + name: '​Koninklijke Philips Electronics N.V.' + }, + { + decimal: '478', + hexadecimal: '​​0x01DE', + name: '​Minelab Electronics Pty Limited' + }, + { + decimal: '479', + hexadecimal: '​​0x01DF', + name: '​​Bison Group Ltd.' + }, + { + decimal: '480', + hexadecimal: '​​0x01E0', + name: '​​​Widex A/S' + }, + { + decimal: '481', + hexadecimal: '​​0x01E1', + name: '​Jolla Ltd' + }, + { + decimal: '482', + hexadecimal: '​​0x01E2', + name: '​​Lectronix, Inc.' + }, + { + decimal: '483', + hexadecimal: '​​0x01E3', + name: '​​Caterpillar Inc' + }, + { + decimal: '484', + hexadecimal: '​​0x01E4', + name: '​​Freedom Innovations' + }, + { + decimal: '485', + hexadecimal: '​​0x01E5', + name: '​​Dynamic Devices Ltd' + }, + { + decimal: '486', + hexadecimal: '​​0x01E6', + name: '​​Technology Solutions (UK) Ltd' + }, + { + decimal: '487', + hexadecimal: '​​0x01E7', + name: '​​IPS Group Inc.' + }, + { + decimal: '488', + hexadecimal: '​​0x01E8', + name: '​STIR' + }, + { + decimal: '489', + hexadecimal: '0x01E9', + name: '​Sano, Inc' + }, + { + decimal: '490', + hexadecimal: '0x01EA', + name: '​Advanced Application Design, Inc.​' + }, + { + decimal: '491', + hexadecimal: '0x01EB', + name: '​AutoMap LLC​​' + }, + { + decimal: '492', + hexadecimal: '0x01EC', + name: '​​Spreadtrum Communications Shanghai Ltd' + }, + { + decimal: '​493', + hexadecimal: '0x01ED', + name: '​​CuteCircuit LTD' + }, + { + decimal: '​494', + hexadecimal: '0x01EE', + name: '​​​Valeo Service' + }, + { + decimal: '​495', + hexadecimal: '0x01EF', + name: '​​​Fullpower Technologies, Inc.' + }, + { + decimal: '​496', + hexadecimal: '0x01F0', + name: 'KloudNation' + }, + { + decimal: '​497', + hexadecimal: '0x01F1', + name: '​Zebra Technologies Corporation' + }, + { + decimal: '​498', + hexadecimal: '0x01F2', + name: 'Itron, Inc.' + }, + { + decimal: '​499', + hexadecimal: '0x01F3', + name: 'The University of Tokyo' + }, + { + decimal: '​500', + hexadecimal: '0x01F4', + name: '​UTC Fire and Security' + }, + { + decimal: '​501', + hexadecimal: '0x01F5', + name: 'Cool Webthings Limited' + }, + { + decimal: '​502', + hexadecimal: '0x01F6', + name: 'DJO Global' + }, + { + decimal: '​503', + hexadecimal: '0x01F7', + name: '​Gelliner Limited' + }, + { + decimal: '​504', + hexadecimal: '0x01F8', + name: '​Anyka (Guangzhou) Microelectronics Technology Co, LTD' + }, + { + decimal: '​505', + hexadecimal: '0x01F9', + name: '​Medtronic, Inc.' + }, + { + decimal: '​506', + hexadecimal: '0x01FA', + name: '​Gozio, Inc.' + }, + { + decimal: '​507', + hexadecimal: '0x01FB', + name: '​Form Lifting, LLC' + }, + { + decimal: '​508', + hexadecimal: '0x01FC', + name: 'Wahoo Fitness, LLC' + }, + { + decimal: '​509', + hexadecimal: '0x01FD', + name: 'Kontakt Micro-Location Sp. z o.o.' + }, + { + decimal: '​510', + hexadecimal: '0x01FE', + name: 'Radio System Corporation' + }, + { + decimal: '​511', + hexadecimal: '0x01FF', + name: 'Freescale Semiconductor, Inc.' + }, + { + decimal: '​512', + hexadecimal: '0x0200', + name: 'Verifone Systems PTe Ltd. Taiwan Branch' + }, + { + decimal: '​513', + hexadecimal: '0x0201', + name: '​AR Timing' + }, + { + decimal: '​514', + hexadecimal: '0x0202', + name: '​​Rigado LLC' + }, + { + decimal: '​515', + hexadecimal: '0x0203', + name: '​​Kemppi Oy' + }, + { + decimal: '​516', + hexadecimal: '0x0204', + name: '​​Tapcentive Inc.' + }, + { + decimal: '​517', + hexadecimal: '0x0205', + name: '​​Smartbotics Inc.' + }, + { + decimal: '​518', + hexadecimal: '0x0206', + name: 'Otter Products, LLC​' + }, + { + decimal: '​519', + hexadecimal: '0x0207', + name: 'STEMP Inc.' + }, + { + decimal: '​520', + hexadecimal: '0x0208', + name: '​LumiGeek LLC' + }, + { + decimal: '​521', + hexadecimal: '0x0209', + name: '​InvisionHeart Inc.' + }, + { + decimal: '​522', + hexadecimal: '0x02​0A', + name: '​Macnica Inc.' + }, + { + decimal: '​523', + hexadecimal: '0x020B​', + name: 'Jaguar Land Rover Limited' + }, + { + decimal: '​524', + hexadecimal: '0x020C​', + name: '​CoroWare Technologies, Inc' + }, + { + decimal: '​525', + hexadecimal: '0x020D​', + name: '​Simplo Technology Co., LTD' + }, + { + decimal: '​526', + hexadecimal: '0x020E​', + name: 'Omron Healthcare Co., LTD' + }, + { + decimal: '​527', + hexadecimal: '0x020F​', + name: 'Comodule GMBH' + }, + { + decimal: '​528', + hexadecimal: '0x0210​', + name: 'ikeGPS' + }, + { + decimal: '​529', + hexadecimal: '0x0211​', + name: 'Telink Semiconductor Co. Ltd' + }, + { + decimal: '​530', + hexadecimal: '0x0212​', + name: '​Interplan Co., Ltd' + }, + { + decimal: '​531', + hexadecimal: '0x0213​', + name: '​Wyler AG' + }, + { + decimal: '​532', + hexadecimal: '0x0214​', + name: 'IK Multimedia Production srl' + }, + { + decimal: '​533', + hexadecimal: '0x0215​', + name: '​Lukoton Experience Oy' + }, + { + decimal: '​534', + hexadecimal: '0x0216​', + name: 'MTI Ltd' + }, + { + decimal: '​535', + hexadecimal: '0x0217​', + name: 'Tech4home, Lda' + }, + { + decimal: '​536', + hexadecimal: '0x0218', + name: '​Hiotech AB' + }, + { + decimal: '​537', + hexadecimal: '0x0219', + name: '​DOTT Limited' + }, + { + decimal: '​538', + hexadecimal: '0x021A', + name: '​Blue Speck Labs, LLC' + }, + { + decimal: '​539', + hexadecimal: '0x021B', + name: '​Cisco Systems Inc' + }, + { + decimal: '​540', + hexadecimal: '0x021C', + name: '​Mobicomm Inc' + }, + { + decimal: '​541', + hexadecimal: '0x021D', + name: '​​Edamic' + }, + { + decimal: '​542', + hexadecimal: '0x021E', + name: '​​Goodnet Ltd' + }, + { + decimal: '​543', + hexadecimal: '0x021F', + name: '​​Luster Leaf Products Inc' + }, + { + decimal: '​544', + hexadecimal: '0x0220', + name: '​​Manus Machina BV' + }, + { + decimal: '​545', + hexadecimal: '0x0221', + name: '​​Mobiquity Networks Inc' + }, + { + decimal: '​546', + hexadecimal: '0x0222', + name: '​​Praxis Dynamics' + }, + { + decimal: '​547', + hexadecimal: '0x0223', + name: '​​Philip Morris Products S.A.' + }, + { + decimal: '​548', + hexadecimal: '0x0224', + name: '​​Comarch SA' + }, + { + decimal: '​549', + hexadecimal: '0x0225', + name: 'Nestlé Nespresso S.A.' + }, + { + decimal: '​550', + hexadecimal: '0x0226', + name: '​Merlinia A/S' + }, + { + decimal: '​551', + hexadecimal: '0x0227', + name: '​LifeBEAM Technologies' + }, + { + decimal: '​552', + hexadecimal: '0x0228', + name: '​Twocanoes Labs, LLC' + }, + { + decimal: '​553', + hexadecimal: '0x0229', + name: '​​Muoverti Limited' + }, + { + decimal: '​554', + hexadecimal: '0X022A', + name: 'Stamer Musikanlagen GMBH' + }, + { + decimal: '​555', + hexadecimal: '0x022B', + name: 'Tesla Motors' + }, + { + decimal: '​556', + hexadecimal: '0x022C', + name: 'Pharynks Corporation' + }, + { + decimal: '​557', + hexadecimal: '0x022D', + name: 'Lupine' + }, + { + decimal: '​558', + hexadecimal: '0x022E', + name: 'Siemens AG' + }, + { + decimal: '​559', + hexadecimal: '0x022F', + name: 'Huami (Shanghai) Culture Communication CO., LTD' + }, + { + decimal: '​560', + hexadecimal: '0x0230', + name: 'Foster Electric Company, Ltd' + }, + { + decimal: '​561', + hexadecimal: '0x0231', + name: 'ETA SA' + }, + { + decimal: '​562', + hexadecimal: '0x0232', + name: 'x-Senso Solutions Kft' + }, + { + decimal: '​563', + hexadecimal: '0x0233', + name: 'Shenzhen SuLong Communication Ltd' + }, + { + decimal: '​564', + hexadecimal: '0x0234', + name: 'FengFan (BeiJing) Technology Co, Ltd' + }, + { + decimal: '​565', + hexadecimal: '0x0235', + name: 'Qrio Inc' + }, + { + decimal: '​566', + hexadecimal: '0x0236', + name: 'Pitpatpet Ltd' + }, + { + decimal: '​567', + hexadecimal: '0x0237', + name: 'MSHeli s.r.l.' + }, + { + decimal: '​568', + hexadecimal: '0x0238', + name: 'Trakm8 Ltd' + }, + { + decimal: '​569', + hexadecimal: '0x0239', + name: '​JIN CO, Ltd' + }, + { + decimal: '​570', + hexadecimal: '0x023A', + name: '​Alatech Technology' + }, + { + decimal: '​571', + hexadecimal: '0x023B', + name: 'Beijing CarePulse Electronic Technology Co, Ltd' + }, + { + decimal: '​572', + hexadecimal: '0x023C', + name: 'Awarepoint' + }, + { + decimal: '​573', + hexadecimal: '0x023D', + name: '​ViCentra B.V.' + }, + { + decimal: '​574', + hexadecimal: '0x023E', + name: '​Raven Industries' + }, + { + decimal: '​575', + hexadecimal: '0x023F', + name: '​WaveWare Technologies' + }, + { + decimal: '​576', + hexadecimal: '0x0240', + name: 'Argenox Technologies' + }, + { + decimal: '​577', + hexadecimal: '0x0241', + name: 'Bragi GmbH' + }, + { + decimal: '​578', + hexadecimal: '0x0242', + name: '16Lab Inc' + }, + { + decimal: '​579', + hexadecimal: '0x0243', + name: 'Masimo Corp' + }, + { + decimal: '​580', + hexadecimal: '0x0244', + name: 'Iotera Inc.' + }, + { + decimal: '​581', + hexadecimal: '0x0245', + name: 'Endress+Hauser' + }, + { + decimal: '​582', + hexadecimal: '0x0246', + name: '​ACKme Networks, Inc.' + }, + { + decimal: '​583', + hexadecimal: '0x0247', + name: '​FiftyThree Inc.' + }, + { + decimal: '​584', + hexadecimal: '0x0248', + name: '​Parker Hannifin Corp​' + }, + { + decimal: '​585', + hexadecimal: '0x0249', + name: '​Transcranial Ltd' + }, + { + decimal: '​586', + hexadecimal: '0x024A', + name: '​​Uwatec AG' + }, + { + decimal: '​587', + hexadecimal: '0x024B', + name: '​​Orlan LLC' + }, + { + decimal: '​588', + hexadecimal: '0x024C', + name: '​Blue Clover Devices' + }, + { + decimal: '​589', + hexadecimal: '0x024D', + name: '​M-Way Solutions GmbH' + }, + { + decimal: '​590', + hexadecimal: '0x024E', + name: '​Microtronics Engineering GmbH' + }, + { + decimal: '​591', + hexadecimal: '0x024F', + name: 'Schneider Schreibgeräte GmbH' + }, + { + decimal: '​592', + hexadecimal: '0x0250', + name: '​Sapphire Circuits LLC' + }, + { + decimal: '​593', + hexadecimal: '0x0251', + name: '​​Lumo Bodytech Inc.' + }, + { + decimal: '​594', + hexadecimal: '0x0252', + name: '​​UKC Technosolution' + }, + { + decimal: '​595', + hexadecimal: '0x0253', + name: 'Xicato Inc.' + }, + { + decimal: '​596', + hexadecimal: '0x0254', + name: 'Playbrush' + }, + { + decimal: '​597', + hexadecimal: '0x0255', + name: '​Dai Nippon Printing Co., Ltd.' + }, + { + decimal: '​598', + hexadecimal: '0x0256', + name: '​​G24 Power Limited' + }, + { + decimal: '​599', + hexadecimal: '0x0257', + name: '​​AdBabble Local Commerce Inc.' + }, + { + decimal: '​600', + hexadecimal: '0x0258', + name: 'Devialet SA' + }, + { + decimal: '​601', + hexadecimal: '​0x0259', + name: '​ALTYOR' + }, + { + decimal: '​602', + hexadecimal: '​0x025A', + name: '​University of Applied Sciences Valais/Haute Ecole Valaisanne' + }, + { + decimal: '​603', + hexadecimal: '​0x025B', + name: '​Five Interactive, LLC dba Zendo' + }, + { + decimal: '​604', + hexadecimal: '​0x025C', + name: '​NetEase (Hangzhou) Network co.Ltd.' + }, + { + decimal: '​605', + hexadecimal: '​0x025D', + name: '​Lexmark International Inc.' + }, + { + decimal: '​606', + hexadecimal: '​0x025E', + name: '​Fluke Corporation' + }, + { + decimal: '607​', + hexadecimal: '​0x025F', + name: 'Yardarm Technologies​' + }, + { + decimal: '​608', + hexadecimal: '​0x0260', + name: '​SensaRx' + }, + { + decimal: '​609', + hexadecimal: '​0x0261', + name: '​SECVRE GmbH' + }, + { + decimal: '610​', + hexadecimal: '​0x0262', + name: '​Glacial Ridge Technologies' + }, + { + decimal: '​611', + hexadecimal: '​0x0263', + name: '​Identiv, Inc.' + }, + { + decimal: '612​', + hexadecimal: '0x0264​', + name: 'DDS, Inc.' + }, + { + decimal: '​613', + hexadecimal: '​0x0265', + name: '​SMK Corporation' + }, + { + decimal: '​614', + hexadecimal: '​0x0266', + name: '​Schawbel Technologies LLC' + }, + { + decimal: '​615', + hexadecimal: '​0x0267', + name: '​XMI Systems SA' + }, + { + decimal: '​616', + hexadecimal: '​0x0268', + name: '​Cerevo' + }, + { + decimal: '​617', + hexadecimal: '​0x0269', + name: '​​Torrox GmbH & Co KG' + }, + { + decimal: '​618', + hexadecimal: '​0x026A', + name: '​​Gemalto' + }, + { + decimal: '​619', + hexadecimal: '​0x026B', + name: '​DEKA Research & Development Corp.​' + }, + { + decimal: '​620', + hexadecimal: '​0x026C', + name: '​Domster Tadeusz Szydlowski' + }, + { + decimal: '​621', + hexadecimal: '​0x026D', + name: '​Technogym SPA​' + }, + { + decimal: '​622', + hexadecimal: '​0x026E', + name: '​FLEURBAEY BVBA' + }, + { + decimal: '​623', + hexadecimal: '​0x026F', + name: '​Aptcode Solutions​' + }, + { + decimal: '​624', + hexadecimal: '​0x0270', + name: '​LSI ADL Technology​' + }, + { + decimal: '​625', + hexadecimal: '​0x0271', + name: '​Animas Corp' + }, + { + decimal: '​626', + hexadecimal: '​0x0272', + name: '​Alps Electric Co., Ltd.' + }, + { + decimal: '​627', + hexadecimal: '​0x0273', + name: '​OCEASOFT' + }, + { + decimal: '​628', + hexadecimal: '​0x0274', + name: '​Motsai Research' + }, + { + decimal: '​629', + hexadecimal: '​0x0275', + name: '​Geotab' + }, + { + decimal: '​630', + hexadecimal: '​0x0276', + name: '​E.G.O. Elektro-Gerätebau GmbH' + }, + { + decimal: '​631', + hexadecimal: '​0x0277', + name: '​​bewhere inc' + }, + { + decimal: '​632', + hexadecimal: '0x0278​', + name: '​Johnson Outdoors Inc' + }, + { + decimal: '​633', + hexadecimal: '​0x0279', + name: '​steute Schaltgerate GmbH & Co. KG' + }, + { + decimal: '​634', + hexadecimal: '​0x027A', + name: '​Ekomini in​c.​' + }, + { + decimal: '​635', + hexadecimal: '0x027B​', + name: '​​DEFA AS' + }, + { + decimal: '​636', + hexadecimal: '0x027C​', + name: 'Aseptika Ltd​' + }, + { + decimal: '​637', + hexadecimal: '​0x027D', + name: '​HUAWEI Technologies Co., Ltd. ( 华为技术有限公司 )​' + }, + { + decimal: '​638', + hexadecimal: '0x027E​', + name: '​HabitAware, LLC' + }, + { + decimal: '​639', + hexadecimal: '​0x027F', + name: '​ruwido austria gmbh​' + }, + { + decimal: '​640', + hexadecimal: '​0x0280', + name: '​ITEC corporation' + }, + { + decimal: '​641', + hexadecimal: '​0x0281', + name: '​StoneL​' + } +]}; diff --git a/www/js/standards/capability.js b/www/js/standards/capability.js index a1914d7..49147fd 100644 --- a/www/js/standards/capability.js +++ b/www/js/standards/capability.js @@ -18,6 +18,10 @@ var CAPABILITY = function(p) { this.deviceID = null; + this.data = []; + this.ctx = null; + this.first = false; + }; CAPABILITY.prototype.setInternalID = function() { @@ -64,7 +68,174 @@ CAPABILITY.prototype.onError = function(e) { console.error(e); }; +CAPABILITY.prototype.storeData = function(data, alt) { + if (!this.first) { + this.first = true; + return []; + } + var target = alt || this.data; + + if (target.length === 99) { + target = target.slice(1); + } + + target.push(data); + if (alt) { + return target; + } else { + this.data = target; + } + + +}; + +CAPABILITY.prototype.startGraph = function(id) { + + var c; + c = id[0].getContext('2d'); + this.ctx = c; + + this.ctx.fillStyle = '#ffffff'; + this.ctx.fillRect(0,0,300,150); +}; + +CAPABILITY.prototype.generateBlankGraph = function(subID) { + + var _subID = subID || ''; + var xmlns = 'http://www.w3.org/2000/svg'; + + var svgID = this.frameID + _subID + '-svg'; + var text1ID = this.frameID + _subID + '-txt1'; + var lineID = this.frameID + _subID + '-line'; + + var svg = document.createElementNS(xmlns,'svg'); + + svg.setAttributeNS(xmlns,'id',svgID); + svg.setAttributeNS(xmlns,'width',300); + svg.setAttributeNS(xmlns,'height',150); + svg.setAttributeNS(xmlns,'fill', 'blue'); + + var line = document.createElementNS(xmlns,'line'); + + line.setAttributeNS(null,'x1','46'); + line.setAttributeNS(null,'y1','12'); + line.setAttributeNS(null,'x2','280'); + line.setAttributeNS(null,'y2', '12'); + line.setAttributeNS(null,'style','stroke:#bad649;stroke-width:2;'); + + svg.appendChild(line); + + line = document.createElementNS(xmlns,'line'); + + line.setAttributeNS(null,'x1','46'); + line.setAttributeNS(null,'y1','136'); + line.setAttributeNS(null,'x2','280'); + line.setAttributeNS(null,'y2', '136'); + line.setAttributeNS(null,'style','stroke:#bad649;stroke-width:2;'); + + svg.appendChild(line); + + var text = document.createElementNS(xmlns,'text'); + + text.setAttributeNS(null,'id',text1ID); + text.setAttributeNS(null,'x','36'); + text.setAttributeNS(null,'y','15'); + text.setAttributeNS(null,'text-anchor', 'end'); + text.setAttributeNS(null,'style','font-family:"Ubuntu Condensed",sans-serif;font-size:12;fill: #bad649;text-align:right;'); + text.textContent = '000'; + + svg.appendChild(text); + + text = document.createElementNS(xmlns,'text'); + + text.setAttributeNS(null,'id','text2'); + text.setAttributeNS(null,'x','36'); + text.setAttributeNS(null,'y','140'); + text.setAttributeNS(null,'text-anchor', 'end'); + text.setAttributeNS(null,'style','font-family:"Ubuntu Condensed",sans-serif;font-size:12;fill: #bad649;text-align:right;'); + text.textContent = '0'; + + svg.appendChild(text); + + var polyline = document.createElementNS(xmlns,'polyline'); + + polyline.setAttributeNS(null,'id',lineID); + polyline.setAttributeNS(null,'fill','none'); + polyline.setAttributeNS(null,'stroke','#e5f7fd'); + //#e5f7fd + // old #B5C7FF + polyline.setAttributeNS(null,'text-anchor', 'end'); + polyline.setAttributeNS(null,'stroke-width','2'); + + svg.appendChild(polyline); + + return svg; + +}; + +CAPABILITY.prototype.animateGraph = function() { + //This.simpleGraph(this.data); +}; + + +CAPABILITY.prototype.simpleGraph = function(data, subID) { + + var _subID; + var _data; + var text1ID; + var lineID; + + _data = data || this.data; + + _subID = subID || ''; + + lineID = [this.frameID , _subID , '-line'].join(''); + text1ID = [this.frameID , _subID , '-txt1'].join(''); + + if (_data.length > 0) { + var ceiling = _data.reduce(function(p, v) { + return (p > v ? p : v); + }); + + /* Var floor = _data.reduce(function(p, v) { + return (p < v ? p : v); + }); + */ + + var calcArray = []; + + var ceilingLimit = Math.floor(ceiling / 10) * 10; + if (ceilingLimit < ceiling) { + ceilingLimit = Math.floor((ceiling + (ceiling * 0.25)) / 10) * 10; + } + + if (ceilingLimit < 30) { + ceilingLimit = 30; + } + + var scale = 124 / ceilingLimit; + // Var xstep = (280 - 46) / 100; + var xstep = 2.34; + var startX = 46 + (100 - _data.length) * xstep; + + for (var x = 0;x < _data.length;x++) { + + calcArray.push((startX + (x * xstep)).toFixed(2) + ',' + (136 - ((_data[x]) * scale)).toFixed(2)); + + } + + var elm = document.getElementById(lineID); + + elm.setAttribute('points',calcArray.join(' ')); + + elm = document.getElementById(text1ID); + + elm.textContent = ceilingLimit; + + } + +}; diff --git a/www/libs/smoothie.js b/www/libs/smoothie.js new file mode 100644 index 0000000..f50e4ed --- /dev/null +++ b/www/libs/smoothie.js @@ -0,0 +1,803 @@ +// MIT License: +// +// Copyright (c) 2010-2013, Joe Walnes +// 2013-2014, Drew Noakes +// +// Permission is hereby granted, free of charge, to any person obtaining a copy +// of this software and associated documentation files (the "Software"), to deal +// in the Software without restriction, including without limitation the rights +// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +// copies of the Software, and to permit persons to whom the Software is +// furnished to do so, subject to the following conditions: +// +// The above copyright notice and this permission notice shall be included in +// all copies or substantial portions of the Software. +// +// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +// THE SOFTWARE. + +/** + * Smoothie Charts - http://smoothiecharts.org/ + * (c) 2010-2013, Joe Walnes + * 2013-2014, Drew Noakes + * + * v1.0: Main charting library, by Joe Walnes + * v1.1: Auto scaling of axis, by Neil Dunn + * v1.2: fps (frames per second) option, by Mathias Petterson + * v1.3: Fix for divide by zero, by Paul Nikitochkin + * v1.4: Set minimum, top-scale padding, remove timeseries, add optional timer to reset bounds, by Kelley Reynolds + * v1.5: Set default frames per second to 50... smoother. + * .start(), .stop() methods for conserving CPU, by Dmitry Vyal + * options.interpolation = 'bezier' or 'line', by Dmitry Vyal + * options.maxValue to fix scale, by Dmitry Vyal + * v1.6: minValue/maxValue will always get converted to floats, by Przemek Matylla + * v1.7: options.grid.fillStyle may be a transparent color, by Dmitry A. Shashkin + * Smooth rescaling, by Kostas Michalopoulos + * v1.8: Set max length to customize number of live points in the dataset with options.maxDataSetLength, by Krishna Narni + * v1.9: Display timestamps along the bottom, by Nick and Stev-io + * (https://groups.google.com/forum/?fromgroups#!topic/smoothie-charts/-Ywse8FCpKI%5B1-25%5D) + * Refactored by Krishna Narni, to support timestamp formatting function + * v1.10: Switch to requestAnimationFrame, removed the now obsoleted options.fps, by Gergely Imreh + * v1.11: options.grid.sharpLines option added, by @drewnoakes + * Addressed warning seen in Firefox when seriesOption.fillStyle undefined, by @drewnoakes + * v1.12: Support for horizontalLines added, by @drewnoakes + * Support for yRangeFunction callback added, by @drewnoakes + * v1.13: Fixed typo (#32), by @alnikitich + * v1.14: Timer cleared when last TimeSeries removed (#23), by @davidgaleano + * Fixed diagonal line on chart at start/end of data stream, by @drewnoakes + * v1.15: Support for npm package (#18), by @dominictarr + * Fixed broken removeTimeSeries function (#24) by @davidgaleano + * Minor performance and tidying, by @drewnoakes + * v1.16: Bug fix introduced in v1.14 relating to timer creation/clearance (#23), by @drewnoakes + * TimeSeries.append now deals with out-of-order timestamps, and can merge duplicates, by @zacwitte (#12) + * Documentation and some local variable renaming for clarity, by @drewnoakes + * v1.17: Allow control over font size (#10), by @drewnoakes + * Timestamp text won't overlap, by @drewnoakes + * v1.18: Allow control of max/min label precision, by @drewnoakes + * Added 'borderVisible' chart option, by @drewnoakes + * Allow drawing series with fill but no stroke (line), by @drewnoakes + * v1.19: Avoid unnecessary repaints, and fixed flicker in old browsers having multiple charts in document (#40), by @asbai + * v1.20: Add SmoothieChart.getTimeSeriesOptions and SmoothieChart.bringToFront functions, by @drewnoakes + * v1.21: Add 'step' interpolation mode, by @drewnoakes + * v1.22: Add support for different pixel ratios. Also add optional y limit formatters, by @copacetic + * v1.23: Fix bug introduced in v1.22 (#44), by @drewnoakes + * v1.24: Fix bug introduced in v1.23, re-adding parseFloat to y-axis formatter defaults, by @siggy_sf + * v1.25: Fix bug seen when adding a data point to TimeSeries which is older than the current data, by @Nking92 + * Draw time labels on top of series, by @comolosabia + * Add TimeSeries.clear function, by @drewnoakes + * v1.26: Add support for resizing on high device pixel ratio screens, by @copacetic + * v1.27: Fix bug introduced in v1.26 for non whole number devicePixelRatio values, by @zmbush + * v1.28: Add 'minValueScale' option, by @megawac + */ + +;(function(exports) { + + var Util = { + extend: function() { + arguments[0] = arguments[0] || {}; + for (var i = 1; i < arguments.length; i++) + { + for (var key in arguments[i]) + { + if (arguments[i].hasOwnProperty(key)) + { + if (typeof(arguments[i][key]) === 'object') { + if (arguments[i][key] instanceof Array) { + arguments[0][key] = arguments[i][key]; + } else { + arguments[0][key] = Util.extend(arguments[0][key], arguments[i][key]); + } + } else { + arguments[0][key] = arguments[i][key]; + } + } + } + } + return arguments[0]; + } + }; + + /** + * Initialises a new TimeSeries with optional data options. + * + * Options are of the form (defaults shown): + * + *
+   * {
+   *   resetBounds: true,        // enables/disables automatic scaling of the y-axis
+   *   resetBoundsInterval: 3000 // the period between scaling calculations, in millis
+   * }
+   * 
+ * + * Presentation options for TimeSeries are specified as an argument to SmoothieChart.addTimeSeries. + * + * @constructor + */ + function TimeSeries(options) { + this.options = Util.extend({}, TimeSeries.defaultOptions, options); + this.clear(); + } + + TimeSeries.defaultOptions = { + resetBoundsInterval: 3000, + resetBounds: true + }; + + /** + * Clears all data and state from this TimeSeries object. + */ + TimeSeries.prototype.clear = function() { + this.data = []; + this.maxValue = Number.NaN; // The maximum value ever seen in this TimeSeries. + this.minValue = Number.NaN; // The minimum value ever seen in this TimeSeries. + }; + + /** + * Recalculate the min/max values for this TimeSeries object. + * + * This causes the graph to scale itself in the y-axis. + */ + TimeSeries.prototype.resetBounds = function() { + if (this.data.length) { + // Walk through all data points, finding the min/max value + this.maxValue = this.data[0][1]; + this.minValue = this.data[0][1]; + for (var i = 1; i < this.data.length; i++) { + var value = this.data[i][1]; + if (value > this.maxValue) { + this.maxValue = value; + } + if (value < this.minValue) { + this.minValue = value; + } + } + } else { + // No data exists, so set min/max to NaN + this.maxValue = Number.NaN; + this.minValue = Number.NaN; + } + }; + + /** + * Adds a new data point to the TimeSeries, preserving chronological order. + * + * @param timestamp the position, in time, of this data point + * @param value the value of this data point + * @param sumRepeatedTimeStampValues if timestamp has an exact match in the series, this flag controls + * whether it is replaced, or the values summed (defaults to false.) + */ + TimeSeries.prototype.append = function(timestamp, value, sumRepeatedTimeStampValues) { + // Rewind until we hit an older timestamp + var i = this.data.length - 1; + while (i >= 0 && this.data[i][0] > timestamp) { + i--; + } + + if (i === -1) { + // This new item is the oldest data + this.data.splice(0, 0, [timestamp, value]); + } else if (this.data.length > 0 && this.data[i][0] === timestamp) { + // Update existing values in the array + if (sumRepeatedTimeStampValues) { + // Sum this value into the existing 'bucket' + this.data[i][1] += value; + value = this.data[i][1]; + } else { + // Replace the previous value + this.data[i][1] = value; + } + } else if (i < this.data.length - 1) { + // Splice into the correct position to keep timestamps in order + this.data.splice(i + 1, 0, [timestamp, value]); + } else { + // Add to the end of the array + this.data.push([timestamp, value]); + } + + this.maxValue = isNaN(this.maxValue) ? value : Math.max(this.maxValue, value); + this.minValue = isNaN(this.minValue) ? value : Math.min(this.minValue, value); + }; + + TimeSeries.prototype.dropOldData = function(oldestValidTime, maxDataSetLength) { + // We must always keep one expired data point as we need this to draw the + // line that comes into the chart from the left, but any points prior to that can be removed. + var removeCount = 0; + while (this.data.length - removeCount >= maxDataSetLength && this.data[removeCount + 1][0] < oldestValidTime) { + removeCount++; + } + if (removeCount !== 0) { + this.data.splice(0, removeCount); + } + }; + + /** + * Initialises a new SmoothieChart. + * + * Options are optional, and should be of the form below. Just specify the values you + * need and the rest will be given sensible defaults as shown: + * + *
+   * {
+   *   minValue: undefined,                      // specify to clamp the lower y-axis to a given value
+   *   maxValue: undefined,                      // specify to clamp the upper y-axis to a given value
+   *   maxValueScale: 1,                         // allows proportional padding to be added above the chart. for 10% padding, specify 1.1.
+   *   minValueScale: 1,                         // allows proportional padding to be added below the chart. for 10% padding, specify 1.1.
+   *   yRangeFunction: undefined,                // function({min: , max: }) { return {min: , max: }; }
+   *   scaleSmoothing: 0.125,                    // controls the rate at which y-value zoom animation occurs
+   *   millisPerPixel: 20,                       // sets the speed at which the chart pans by
+   *   enableDpiScaling: true,                   // support rendering at different DPI depending on the device
+   *   yMinFormatter: function(min, precision) { // callback function that formats the min y value label
+   *     return parseFloat(min).toFixed(precision);
+   *   },
+   *   yMaxFormatter: function(max, precision) { // callback function that formats the max y value label
+   *     return parseFloat(max).toFixed(precision);
+   *   },
+   *   maxDataSetLength: 2,
+   *   interpolation: 'bezier'                   // one of 'bezier', 'linear', or 'step'
+   *   timestampFormatter: null,                 // optional function to format time stamps for bottom of chart
+   *                                             // you may use SmoothieChart.timeFormatter, or your own: function(date) { return ''; }
+   *   scrollBackwards: false,                   // reverse the scroll direction of the chart
+   *   horizontalLines: [],                      // [ { value: 0, color: '#ffffff', lineWidth: 1 } ]
+   *   grid:
+   *   {
+   *     fillStyle: '#000000',                   // the background colour of the chart
+   *     lineWidth: 1,                           // the pixel width of grid lines
+   *     strokeStyle: '#777777',                 // colour of grid lines
+   *     millisPerLine: 1000,                    // distance between vertical grid lines
+   *     sharpLines: false,                      // controls whether grid lines are 1px sharp, or softened
+   *     verticalSections: 2,                    // number of vertical sections marked out by horizontal grid lines
+   *     borderVisible: true                     // whether the grid lines trace the border of the chart or not
+   *   },
+   *   labels
+   *   {
+   *     disabled: false,                        // enables/disables labels showing the min/max values
+   *     fillStyle: '#ffffff',                   // colour for text of labels,
+   *     fontSize: 15,
+   *     fontFamily: 'sans-serif',
+   *     precision: 2
+   *   }
+   * }
+   * 
+ * + * @constructor + */ + function SmoothieChart(options) { + this.options = Util.extend({}, SmoothieChart.defaultChartOptions, options); + this.seriesSet = []; + this.currentValueRange = 1; + this.currentVisMinValue = 0; + this.lastRenderTimeMillis = 0; + } + + SmoothieChart.defaultChartOptions = { + millisPerPixel: 20, + enableDpiScaling: true, + yMinFormatter: function(min, precision) { + return parseFloat(min).toFixed(precision); + }, + yMaxFormatter: function(max, precision) { + return parseFloat(max).toFixed(precision); + }, + maxValueScale: 1, + minValueScale: 1, + interpolation: 'bezier', + scaleSmoothing: 0.125, + maxDataSetLength: 2, + scrollBackwards: false, + grid: { + fillStyle: '#000000', + strokeStyle: '#777777', + lineWidth: 1, + sharpLines: false, + millisPerLine: 1000, + verticalSections: 2, + borderVisible: true + }, + labels: { + fillStyle: '#ffffff', + disabled: false, + fontSize: 10, + fontFamily: 'monospace', + precision: 2 + }, + horizontalLines: [] + }; + + // Based on http://inspirit.github.com/jsfeat/js/compatibility.js + SmoothieChart.AnimateCompatibility = (function() { + var requestAnimationFrame = function(callback, element) { + var requestAnimationFrame = + window.requestAnimationFrame || + window.webkitRequestAnimationFrame || + window.mozRequestAnimationFrame || + window.oRequestAnimationFrame || + window.msRequestAnimationFrame || + function(callback) { + return window.setTimeout(function() { + callback(new Date().getTime()); + }, 16); + }; + return requestAnimationFrame.call(window, callback, element); + }, + cancelAnimationFrame = function(id) { + var cancelAnimationFrame = + window.cancelAnimationFrame || + function(id) { + clearTimeout(id); + }; + return cancelAnimationFrame.call(window, id); + }; + + return { + requestAnimationFrame: requestAnimationFrame, + cancelAnimationFrame: cancelAnimationFrame + }; + })(); + + SmoothieChart.defaultSeriesPresentationOptions = { + lineWidth: 1, + strokeStyle: '#ffffff' + }; + + /** + * Adds a TimeSeries to this chart, with optional presentation options. + * + * Presentation options should be of the form (defaults shown): + * + *
+   * {
+   *   lineWidth: 1,
+   *   strokeStyle: '#ffffff',
+   *   fillStyle: undefined
+   * }
+   * 
+ */ + SmoothieChart.prototype.addTimeSeries = function(timeSeries, options) { + this.seriesSet.push({timeSeries: timeSeries, options: Util.extend({}, SmoothieChart.defaultSeriesPresentationOptions, options)}); + if (timeSeries.options.resetBounds && timeSeries.options.resetBoundsInterval > 0) { + timeSeries.resetBoundsTimerId = setInterval( + function() { + timeSeries.resetBounds(); + }, + timeSeries.options.resetBoundsInterval + ); + } + }; + + /** + * Removes the specified TimeSeries from the chart. + */ + SmoothieChart.prototype.removeTimeSeries = function(timeSeries) { + // Find the correct timeseries to remove, and remove it + var numSeries = this.seriesSet.length; + for (var i = 0; i < numSeries; i++) { + if (this.seriesSet[i].timeSeries === timeSeries) { + this.seriesSet.splice(i, 1); + break; + } + } + // If a timer was operating for that timeseries, remove it + if (timeSeries.resetBoundsTimerId) { + // Stop resetting the bounds, if we were + clearInterval(timeSeries.resetBoundsTimerId); + } + }; + + /** + * Gets render options for the specified TimeSeries. + * + * As you may use a single TimeSeries in multiple charts with different formatting in each usage, + * these settings are stored in the chart. + */ + SmoothieChart.prototype.getTimeSeriesOptions = function(timeSeries) { + // Find the correct timeseries to remove, and remove it + var numSeries = this.seriesSet.length; + for (var i = 0; i < numSeries; i++) { + if (this.seriesSet[i].timeSeries === timeSeries) { + return this.seriesSet[i].options; + } + } + }; + + /** + * Brings the specified TimeSeries to the top of the chart. It will be rendered last. + */ + SmoothieChart.prototype.bringToFront = function(timeSeries) { + // Find the correct timeseries to remove, and remove it + var numSeries = this.seriesSet.length; + for (var i = 0; i < numSeries; i++) { + if (this.seriesSet[i].timeSeries === timeSeries) { + var set = this.seriesSet.splice(i, 1); + this.seriesSet.push(set[0]); + break; + } + } + }; + + /** + * Instructs the SmoothieChart to start rendering to the provided canvas, with specified delay. + * + * @param canvas the target canvas element + * @param delayMillis an amount of time to wait before a data point is shown. This can prevent the end of the series + * from appearing on screen, with new values flashing into view, at the expense of some latency. + */ + SmoothieChart.prototype.streamTo = function(canvas, delayMillis) { + this.canvas = canvas; + this.delay = delayMillis; + this.start(); + }; + + /** + * Make sure the canvas has the optimal resolution for the device's pixel ratio. + */ + SmoothieChart.prototype.resize = function() { + // TODO this function doesn't handle the value of enableDpiScaling changing during execution + if (!this.options.enableDpiScaling || !window || window.devicePixelRatio === 1) + return; + + var dpr = window.devicePixelRatio; + var width = parseInt(this.canvas.getAttribute('width')); + var height = parseInt(this.canvas.getAttribute('height')); + + if (!this.originalWidth || (Math.floor(this.originalWidth * dpr) !== width)) { + this.originalWidth = width; + this.canvas.setAttribute('width', (Math.floor(width * dpr)).toString()); + this.canvas.style.width = width + 'px'; + this.canvas.getContext('2d').scale(dpr, dpr); + } + + if (!this.originalHeight || (Math.floor(this.originalHeight * dpr) !== height)) { + this.originalHeight = height; + this.canvas.setAttribute('height', (Math.floor(height * dpr)).toString()); + this.canvas.style.height = height + 'px'; + this.canvas.getContext('2d').scale(dpr, dpr); + } + }; + + /** + * Starts the animation of this chart. + */ + SmoothieChart.prototype.start = function() { + if (this.frame) { + // We're already running, so just return + return; + } + + // Renders a frame, and queues the next frame for later rendering + var animate = function() { + this.frame = SmoothieChart.AnimateCompatibility.requestAnimationFrame(function() { + this.render(); + animate(); + }.bind(this)); + }.bind(this); + + animate(); + }; + + /** + * Stops the animation of this chart. + */ + SmoothieChart.prototype.stop = function() { + if (this.frame) { + SmoothieChart.AnimateCompatibility.cancelAnimationFrame(this.frame); + delete this.frame; + } + }; + + SmoothieChart.prototype.updateValueRange = function() { + // Calculate the current scale of the chart, from all time series. + var chartOptions = this.options, + chartMaxValue = Number.NaN, + chartMinValue = Number.NaN; + + for (var d = 0; d < this.seriesSet.length; d++) { + // TODO(ndunn): We could calculate / track these values as they stream in. + var timeSeries = this.seriesSet[d].timeSeries; + if (!isNaN(timeSeries.maxValue)) { + chartMaxValue = !isNaN(chartMaxValue) ? Math.max(chartMaxValue, timeSeries.maxValue) : timeSeries.maxValue; + } + + if (!isNaN(timeSeries.minValue)) { + chartMinValue = !isNaN(chartMinValue) ? Math.min(chartMinValue, timeSeries.minValue) : timeSeries.minValue; + } + } + + // Scale the chartMaxValue to add padding at the top if required + if (chartOptions.maxValue != null) { + chartMaxValue = chartOptions.maxValue; + } else { + chartMaxValue *= chartOptions.maxValueScale; + } + + // Set the minimum if we've specified one + if (chartOptions.minValue != null) { + chartMinValue = chartOptions.minValue; + } else { + chartMinValue -= Math.abs(chartMinValue * chartOptions.minValueScale - chartMinValue); + } + + // If a custom range function is set, call it + if (this.options.yRangeFunction) { + var range = this.options.yRangeFunction({min: chartMinValue, max: chartMaxValue}); + chartMinValue = range.min; + chartMaxValue = range.max; + } + + if (!isNaN(chartMaxValue) && !isNaN(chartMinValue)) { + var targetValueRange = chartMaxValue - chartMinValue; + var valueRangeDiff = (targetValueRange - this.currentValueRange); + var minValueDiff = (chartMinValue - this.currentVisMinValue); + this.isAnimatingScale = Math.abs(valueRangeDiff) > 0.1 || Math.abs(minValueDiff) > 0.1; + this.currentValueRange += chartOptions.scaleSmoothing * valueRangeDiff; + this.currentVisMinValue += chartOptions.scaleSmoothing * minValueDiff; + } + + this.valueRange = { min: chartMinValue, max: chartMaxValue }; + }; + + SmoothieChart.prototype.render = function(canvas, time) { + var nowMillis = new Date().getTime(); + + if (!this.isAnimatingScale) { + // We're not animating. We can use the last render time and the scroll speed to work out whether + // we actually need to paint anything yet. If not, we can return immediately. + + // Render at least every 1/6th of a second. The canvas may be resized, which there is + // no reliable way to detect. + var maxIdleMillis = Math.min(1000/6, this.options.millisPerPixel); + + if (nowMillis - this.lastRenderTimeMillis < maxIdleMillis) { + return; + } + } + + this.resize(); + + this.lastRenderTimeMillis = nowMillis; + + canvas = canvas || this.canvas; + time = time || nowMillis - (this.delay || 0); + + // Round time down to pixel granularity, so motion appears smoother. + time -= time % this.options.millisPerPixel; + + var context = canvas.getContext('2d'), + chartOptions = this.options, + dimensions = { top: 0, left: 0, width: canvas.clientWidth, height: canvas.clientHeight }, + // Calculate the threshold time for the oldest data points. + oldestValidTime = time - (dimensions.width * chartOptions.millisPerPixel), + valueToYPixel = function(value) { + var offset = value - this.currentVisMinValue; + return this.currentValueRange === 0 + ? dimensions.height + : dimensions.height - (Math.round((offset / this.currentValueRange) * dimensions.height)); + }.bind(this), + timeToXPixel = function(t) { + if(chartOptions.scrollBackwards) { + return Math.round((time - t) / chartOptions.millisPerPixel); + } + return Math.round(dimensions.width - ((time - t) / chartOptions.millisPerPixel)); + }; + + this.updateValueRange(); + + context.font = chartOptions.labels.fontSize + 'px ' + chartOptions.labels.fontFamily; + + // Save the state of the canvas context, any transformations applied in this method + // will get removed from the stack at the end of this method when .restore() is called. + context.save(); + + // Move the origin. + context.translate(dimensions.left, dimensions.top); + + // Create a clipped rectangle - anything we draw will be constrained to this rectangle. + // This prevents the occasional pixels from curves near the edges overrunning and creating + // screen cheese (that phrase should need no explanation). + context.beginPath(); + context.rect(0, 0, dimensions.width, dimensions.height); + context.clip(); + + // Clear the working area. + context.save(); + context.fillStyle = chartOptions.grid.fillStyle; + context.clearRect(0, 0, dimensions.width, dimensions.height); + context.fillRect(0, 0, dimensions.width, dimensions.height); + context.restore(); + + // Grid lines... + context.save(); + context.lineWidth = chartOptions.grid.lineWidth; + context.strokeStyle = chartOptions.grid.strokeStyle; + // Vertical (time) dividers. + if (chartOptions.grid.millisPerLine > 0) { + context.beginPath(); + for (var t = time - (time % chartOptions.grid.millisPerLine); + t >= oldestValidTime; + t -= chartOptions.grid.millisPerLine) { + var gx = timeToXPixel(t); + if (chartOptions.grid.sharpLines) { + gx -= 0.5; + } + context.moveTo(gx, 0); + context.lineTo(gx, dimensions.height); + } + context.stroke(); + context.closePath(); + } + + // Horizontal (value) dividers. + for (var v = 1; v < chartOptions.grid.verticalSections; v++) { + var gy = Math.round(v * dimensions.height / chartOptions.grid.verticalSections); + if (chartOptions.grid.sharpLines) { + gy -= 0.5; + } + context.beginPath(); + context.moveTo(0, gy); + context.lineTo(dimensions.width, gy); + context.stroke(); + context.closePath(); + } + // Bounding rectangle. + if (chartOptions.grid.borderVisible) { + context.beginPath(); + context.strokeRect(0, 0, dimensions.width, dimensions.height); + context.closePath(); + } + context.restore(); + + // Draw any horizontal lines... + if (chartOptions.horizontalLines && chartOptions.horizontalLines.length) { + for (var hl = 0; hl < chartOptions.horizontalLines.length; hl++) { + var line = chartOptions.horizontalLines[hl], + hly = Math.round(valueToYPixel(line.value)) - 0.5; + context.strokeStyle = line.color || '#ffffff'; + context.lineWidth = line.lineWidth || 1; + context.beginPath(); + context.moveTo(0, hly); + context.lineTo(dimensions.width, hly); + context.stroke(); + context.closePath(); + } + } + + // For each data set... + for (var d = 0; d < this.seriesSet.length; d++) { + context.save(); + var timeSeries = this.seriesSet[d].timeSeries, + dataSet = timeSeries.data, + seriesOptions = this.seriesSet[d].options; + + // Delete old data that's moved off the left of the chart. + timeSeries.dropOldData(oldestValidTime, chartOptions.maxDataSetLength); + + // Set style for this dataSet. + context.lineWidth = seriesOptions.lineWidth; + context.strokeStyle = seriesOptions.strokeStyle; + // Draw the line... + context.beginPath(); + // Retain lastX, lastY for calculating the control points of bezier curves. + var firstX = 0, lastX = 0, lastY = 0; + for (var i = 0; i < dataSet.length && dataSet.length !== 1; i++) { + var x = timeToXPixel(dataSet[i][0]), + y = valueToYPixel(dataSet[i][1]); + + if (i === 0) { + firstX = x; + context.moveTo(x, y); + } else { + switch (chartOptions.interpolation) { + case "linear": + case "line": { + context.lineTo(x,y); + break; + } + case "bezier": + default: { + // Great explanation of Bezier curves: http://en.wikipedia.org/wiki/Bezier_curve#Quadratic_curves + // + // Assuming A was the last point in the line plotted and B is the new point, + // we draw a curve with control points P and Q as below. + // + // A---P + // | + // | + // | + // Q---B + // + // Importantly, A and P are at the same y coordinate, as are B and Q. This is + // so adjacent curves appear to flow as one. + // + context.bezierCurveTo( // startPoint (A) is implicit from last iteration of loop + Math.round((lastX + x) / 2), lastY, // controlPoint1 (P) + Math.round((lastX + x)) / 2, y, // controlPoint2 (Q) + x, y); // endPoint (B) + break; + } + case "step": { + context.lineTo(x,lastY); + context.lineTo(x,y); + break; + } + } + } + + lastX = x; lastY = y; + } + + if (dataSet.length > 1) { + if (seriesOptions.fillStyle) { + // Close up the fill region. + context.lineTo(dimensions.width + seriesOptions.lineWidth + 1, lastY); + context.lineTo(dimensions.width + seriesOptions.lineWidth + 1, dimensions.height + seriesOptions.lineWidth + 1); + context.lineTo(firstX, dimensions.height + seriesOptions.lineWidth); + context.fillStyle = seriesOptions.fillStyle; + context.fill(); + } + + if (seriesOptions.strokeStyle && seriesOptions.strokeStyle !== 'none') { + context.stroke(); + } + context.closePath(); + } + context.restore(); + } + + // Draw the axis values on the chart. + if (!chartOptions.labels.disabled && !isNaN(this.valueRange.min) && !isNaN(this.valueRange.max)) { + var maxValueString = chartOptions.yMaxFormatter(this.valueRange.max, chartOptions.labels.precision), + minValueString = chartOptions.yMinFormatter(this.valueRange.min, chartOptions.labels.precision), + labelPos = chartOptions.scrollBackwards ? 0 : dimensions.width - context.measureText(maxValueString).width - 2; + context.fillStyle = chartOptions.labels.fillStyle; + context.fillText(maxValueString, labelPos, chartOptions.labels.fontSize); + context.fillText(minValueString, labelPos, dimensions.height - 2); + } + + // Display timestamps along x-axis at the bottom of the chart. + if (chartOptions.timestampFormatter && chartOptions.grid.millisPerLine > 0) { + var textUntilX = chartOptions.scrollBackwards + ? context.measureText(minValueString).width + : dimensions.width - context.measureText(minValueString).width + 4; + for (var t = time - (time % chartOptions.grid.millisPerLine); + t >= oldestValidTime; + t -= chartOptions.grid.millisPerLine) { + var gx = timeToXPixel(t); + // Only draw the timestamp if it won't overlap with the previously drawn one. + if ((!chartOptions.scrollBackwards && gx < textUntilX) || (chartOptions.scrollBackwards && gx > textUntilX)) { + // Formats the timestamp based on user specified formatting function + // SmoothieChart.timeFormatter function above is one such formatting option + var tx = new Date(t), + ts = chartOptions.timestampFormatter(tx), + tsWidth = context.measureText(ts).width; + + textUntilX = chartOptions.scrollBackwards + ? gx + tsWidth + 2 + : gx - tsWidth - 2; + + context.fillStyle = chartOptions.labels.fillStyle; + if(chartOptions.scrollBackwards) { + context.fillText(ts, gx, dimensions.height - 2); + } else { + context.fillText(ts, gx - tsWidth, dimensions.height - 2); + } + } + } + } + + context.restore(); // See .save() above. + }; + + // Sample timestamp formatting function + SmoothieChart.timeFormatter = function(date) { + function pad2(number) { return (number < 10 ? '0' : '') + number } + return pad2(date.getHours()) + ':' + pad2(date.getMinutes()) + ':' + pad2(date.getSeconds()); + }; + + exports.TimeSeries = TimeSeries; + exports.SmoothieChart = SmoothieChart; + +})(typeof exports === 'undefined' ? this : exports);