replace the uuid package with our own implementation

Replace the uuid package with our own implementation. This reduces the
compiled JS size by 376k.
diff --git a/lib/src/usage_impl.dart b/lib/src/usage_impl.dart
index 1cbaf89..3e2e0f3 100644
--- a/lib/src/usage_impl.dart
+++ b/lib/src/usage_impl.dart
@@ -7,8 +7,7 @@
 import 'dart:async';
 import 'dart:math' as math;
 
-import 'package:uuid/uuid.dart';
-
+import 'uuid.dart';
 import '../usage.dart';
 
 final int _MAX_EXCEPTION_LENGTH = 100;
@@ -154,7 +153,7 @@
 
   void _initClientId() {
     if (_clientId == null) {
-      properties['clientId'] = new Uuid().v4();
+      properties['clientId'] = new Uuid().generateV4();
     }
   }
 
diff --git a/lib/src/uuid.dart b/lib/src/uuid.dart
new file mode 100644
index 0000000..91b9bbb
--- /dev/null
+++ b/lib/src/uuid.dart
@@ -0,0 +1,46 @@
+// Copyright (c) 2014, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+/// A UUID generator library.
+library usage.uuid;
+
+import 'dart:math' show Random;
+
+/**
+ * A UUID generator. This will generate unique IDs in the format:
+ *
+ *     f47ac10b-58cc-4372-a567-0e02b2c3d479
+ *
+ * The generated uuids are 128 bit numbers encoded in a specific string format.
+ *
+ * For more information, see
+ * http://en.wikipedia.org/wiki/Universally_unique_identifier.
+ */
+class Uuid {
+  Random _random = new Random();
+
+  /**
+   * Generate a version 4 (random) uuid. This is a uuid scheme that only uses
+   * random numbers as the source of the generated uuid.
+   */
+  String generateV4() {
+    // Generate xxxxxxxx-xxxx-4xxx-yxxx-xxxxxxxxxxxx / 8-4-4-4-12.
+    int special = 8 + _random.nextInt(4);
+
+    return
+        '${_bitsDigits(16, 4)}${_bitsDigits(16, 4)}-'
+        '${_bitsDigits(16, 4)}-'
+        '4${_bitsDigits(12, 3)}-'
+        '${_printDigits(special,  1)}${_bitsDigits(12, 3)}-'
+        '${_bitsDigits(16, 4)}${_bitsDigits(16, 4)}${_bitsDigits(16, 4)}';
+  }
+
+  String _bitsDigits(int bitCount, int digitCount) =>
+      _printDigits(_generateBits(bitCount), digitCount);
+
+  int _generateBits(int bitCount) => _random.nextInt(1 << bitCount);
+
+  String _printDigits(int value, int count) =>
+      value.toRadixString(16).padLeft(count, '0');
+}
diff --git a/pubspec.yaml b/pubspec.yaml
index 8ed1242..2c5cc30 100644
--- a/pubspec.yaml
+++ b/pubspec.yaml
@@ -8,9 +8,6 @@
 homepage: https://github.com/dart-lang/usage
 author: Dart Team <misc@dartlang.org>
 
-dependencies:
-  uuid: '>=0.4.0 <0.5.0'
-
 dev_dependencies:
   browser: any
   grinder: any
diff --git a/test/all.dart b/test/all.dart
index 9d4dd3c..393640a 100644
--- a/test/all.dart
+++ b/test/all.dart
@@ -8,10 +8,12 @@
 import 'usage_test.dart' as usage_test;
 import 'usage_impl_test.dart' as usage_impl_test;
 import 'usage_impl_io_test.dart' as usage_impl_io_test;
+import 'uuid_test.dart' as uuid_test;
 
 void main() {
   hit_types_test.defineTests();
   usage_test.defineTests();
   usage_impl_test.defineTests();
   usage_impl_io_test.defineTests();
+  uuid_test.defineTests();
 }
diff --git a/test/uuid_test.dart b/test/uuid_test.dart
new file mode 100644
index 0000000..cdde2b6
--- /dev/null
+++ b/test/uuid_test.dart
@@ -0,0 +1,71 @@
+// Copyright (c) 2014, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+library usage.uuid_test;
+
+import 'package:unittest/unittest.dart';
+import 'package:usage/src/uuid.dart';
+
+void defineTests() {
+  group('uuid', () {
+    // xxxxxxxx-xxxx-4xxx-yxxx-xxxxxxxxxxxx
+    test('simple', () {
+      Uuid uuid = new Uuid();
+      String result = uuid.generateV4();
+      expect(result.length, 36);
+      expect(result[8], '-');
+      expect(result[13], '-');
+      expect(result[18], '-');
+      expect(result[23], '-');
+    });
+
+    test('can parse', () {
+      Uuid uuid = new Uuid();
+      String result = uuid.generateV4();
+      expect(int.parse(result.substring(0, 8), radix: 16), isNotNull);
+      expect(int.parse(result.substring(9, 13), radix: 16), isNotNull);
+      expect(int.parse(result.substring(14, 18), radix: 16), isNotNull);
+      expect(int.parse(result.substring(19, 23), radix: 16), isNotNull);
+      expect(int.parse(result.substring(24, 36), radix: 16), isNotNull);
+    });
+
+    test('special bits', () {
+      Uuid uuid = new Uuid();
+      String result = uuid.generateV4();
+      expect(result[14], '4');
+      expect(result[19].toLowerCase(), isIn('89ab'));
+
+      result = uuid.generateV4();
+      expect(result[19].toLowerCase(), isIn('89ab'));
+
+      result = uuid.generateV4();
+      expect(result[19].toLowerCase(), isIn('89ab'));
+    });
+
+    test('is pretty random', () {
+      Set set = new Set();
+
+      Uuid uuid = new Uuid();
+      for (int i = 0; i < 64; i++) {
+        String val = uuid.generateV4();
+        expect(set, isNot(contains(val)));
+        set.add(val);
+      }
+
+      uuid = new Uuid();
+      for (int i = 0; i < 64; i++) {
+        String val = uuid.generateV4();
+        expect(set, isNot(contains(val)));
+        set.add(val);
+      }
+
+      uuid = new Uuid();
+      for (int i = 0; i < 64; i++) {
+        String val = uuid.generateV4();
+        expect(set, isNot(contains(val)));
+        set.add(val);
+      }
+    });
+  });
+}
diff --git a/test/web_test.dart b/test/web_test.dart
index 4388760..cb73c31 100644
--- a/test/web_test.dart
+++ b/test/web_test.dart
@@ -13,6 +13,7 @@
 import 'hit_types_test.dart' as hit_types_test;
 import 'usage_test.dart' as usage_test;
 import 'usage_impl_test.dart' as usage_impl_test;
+import 'uuid_test.dart' as uuid_test;
 
 // TODO: get the tests running in content_shell
 
@@ -24,6 +25,7 @@
   hit_types_test.defineTests();
   usage_test.defineTests();
   usage_impl_test.defineTests();
+  uuid_test.defineTests();
 
   // Define some web specfic tests.
   defineWebTests();